From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48975) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W5z6v-0001z1-LU for qemu-devel@nongnu.org; Wed, 22 Jan 2014 09:48:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1W5z6t-0006rq-EZ for qemu-devel@nongnu.org; Wed, 22 Jan 2014 09:48:57 -0500 Received: from mail-qc0-x235.google.com ([2607:f8b0:400d:c01::235]:65521) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1W5z6t-0006ra-4n for qemu-devel@nongnu.org; Wed, 22 Jan 2014 09:48:55 -0500 Received: by mail-qc0-f181.google.com with SMTP id e9so583287qcy.12 for ; Wed, 22 Jan 2014 06:48:52 -0800 (PST) MIME-Version: 1.0 Date: Wed, 22 Jan 2014 08:48:51 -0600 Message-ID: From: Xin Tong Content-Type: multipart/mixed; boundary=001a11c13b5239262a04f09039d9 Subject: [Qemu-devel] [PATCH] cpu: implementing victim TLB for QEMU system emulated TLB List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: QEMU Developers , afaerber@suse.de, aliguori@amazon.com --001a11c13b5239262a04f09039d9 Content-Type: text/plain; charset=ISO-8859-1 This patch adds a victim TLB to the QEMU system mode TLB. QEMU system mode page table walks are expensive. Taken by running QEMU qemu-system-x86_64 system mode on Intel PIN , a TLB miss and walking a 4-level page tables in guest Linux OS takes ~450 X86 instructions on average. QEMU system mode TLB is implemented using a directly-mapped hashtable. This structure suffers from conflict misses. Increasing the associativity of the TLB may not be the solution to conflict misses as all the ways may have to be walked in serial. A victim TLB is a TLB used to hold translations evicted from the primary TLB upon replacement. The victim TLB lies between the main TLB and its refill path. Victim TLB is of greater associativity (fully associative in this patch). It takes longer to lookup the victim TLB, but its likely better than a full page table walk. The memory translation path is changed as follows : Before Victim TLB: 1. Inline TLB lookup 2. Exit code cache on TLB miss. 3. Check for unaligned, IO accesses 4. TLB refill. 5. Do the memory access. 6. Return to code cache. After Victim TLB: 1. Inline TLB lookup 2. Exit code cache on TLB miss. 3. Check for unaligned, IO accesses 4. Victim TLB lookup. 5. If victim TLB misses, TLB refill 6. Do the memory access. 7. Return to code cache The advantage is that victim TLB can offer more associativity to a directly mapped TLB and thus potentially fewer page table walks while still keeping the time taken to flush within reasonable limits. However, placing a victim TLB before the refill path increase TLB refill path as the victim TLB is consulted before the TLB refill. The performance results demonstrate that the pros outweigh the cons. Attached are some performance results taken on SPECINT2006 train dataset and a Intel(R) Xeon(R) CPU E5620 @ 2.40GHz Linux machine. In summary, victim TLB improves the performance of qemu-system-x86_64 by 11% on average on SPECINT2006 and with highest improvement of in 254% in 464.h264ref. And victim TLB does not result in any performance degradation in any of the measured benchmarks. Furthermore, the implemented victim TLB is architecture independent and is expected to benefit other architectures in QEMU as well. Although there are measurement fluctuations, the performance improvement are very significant and by no means in the range of noises. Signed-off-by: Xin Tong --- cputlb.c | 47 ++++++++++++++++++++++++-- include/exec/cpu-defs.h | 15 ++++++--- include/exec/exec-all.h | 2 ++ include/exec/softmmu_template.h | 69 ++++++++++++++++++++++++++++++++++++--- 4 files changed, 122 insertions(+), 11 deletions(-) diff --git a/cputlb.c b/cputlb.c index b533f3f..bb83c07 100644 --- a/cputlb.c +++ b/cputlb.c @@ -34,6 +34,19 @@ /* statistics */ int tlb_flush_count; +#define TLB_XOR_SWAP(X, Y) do {*X = *X ^ *Y; *Y = *X ^ *Y; *X = *X ^ *Y;}while(0); + +/* used by victim tlb. swap the 2 given TLB entries as well as their corresponding IOTLB */ +void swap_tlb(CPUTLBEntry *te, CPUTLBEntry *se, hwaddr *iote, hwaddr *iose) +{ + /* tlb and iotlb swap */ + TLB_XOR_SWAP(iote, iose); + TLB_XOR_SWAP(&te->addend, &se->addend); + TLB_XOR_SWAP(&te->addr_code, &se->addr_code); + TLB_XOR_SWAP(&te->addr_read, &se->addr_read); + TLB_XOR_SWAP(&te->addr_write, &se->addr_write); +} + /* NOTE: * If flush_global is true (the usual case), flush all tlb entries. * If flush_global is false, flush (at least) all tlb entries not @@ -58,6 +71,7 @@ void tlb_flush(CPUArchState *env, int flush_global) cpu->current_tb = NULL; memset(env->tlb_table, -1, sizeof(env->tlb_table)); + memset(env->tlb_v_table, -1, sizeof(env->tlb_v_table)); memset(env->tb_jmp_cache, 0, sizeof(env->tb_jmp_cache)); env->tlb_flush_addr = -1; @@ -106,6 +120,14 @@ void tlb_flush_page(CPUArchState *env, target_ulong addr) tlb_flush_entry(&env->tlb_table[mmu_idx][i], addr); } + /* check whether there are entries that need to be flushed in the vtlb */ + for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) { + unsigned int k; + for (k = 0;k < CPU_VTLB_SIZE; k++) { + tlb_flush_entry(&env->tlb_v_table[mmu_idx][k], addr); + } + } + tb_flush_jmp_cache(env, addr); } @@ -165,11 +187,15 @@ void cpu_tlb_reset_dirty_all(ram_addr_t start1, ram_addr_t length) env = cpu->env_ptr; for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) { unsigned int i; - for (i = 0; i < CPU_TLB_SIZE; i++) { tlb_reset_dirty_range(&env->tlb_table[mmu_idx][i], start1, length); } + + for (i = 0; i < CPU_VTLB_SIZE; i++) { + tlb_reset_dirty_range(&env->tlb_v_table[mmu_idx][i], + start1, length); + } } } } @@ -193,6 +219,13 @@ void tlb_set_dirty(CPUArchState *env, target_ulong vaddr) for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) { tlb_set_dirty1(&env->tlb_table[mmu_idx][i], vaddr); } + + for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) { + unsigned int k; + for (k = 0; k < CPU_VTLB_SIZE; k++) { + tlb_set_dirty1(&env->tlb_v_table[mmu_idx][k], vaddr); + } + } } /* Our TLB does not support large pages, so remember the area covered by @@ -264,8 +297,18 @@ void tlb_set_page(CPUArchState *env, target_ulong vaddr, prot, &address); index = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); - env->iotlb[mmu_idx][index] = iotlb - vaddr; te = &env->tlb_table[mmu_idx][index]; + + /* do not discard the translation in te, evict it into a random victim tlb */ + unsigned vidx = rand() % CPU_VTLB_SIZE; + env->tlb_v_table[mmu_idx][vidx].addr_read = te->addr_read; + env->tlb_v_table[mmu_idx][vidx].addr_write = te->addr_write; + env->tlb_v_table[mmu_idx][vidx].addr_code = te->addr_code; + env->tlb_v_table[mmu_idx][vidx].addend = te->addend; + env->iotlb_v[mmu_idx][vidx] = env->iotlb[mmu_idx][index]; + + /* refill the tlb */ + env->iotlb[mmu_idx][index] = iotlb - vaddr; te->addend = addend - vaddr; if (prot & PAGE_READ) { te->addr_read = address; diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h index 01cd8c7..771f39c 100644 --- a/include/exec/cpu-defs.h +++ b/include/exec/cpu-defs.h @@ -72,8 +72,10 @@ typedef uint64_t target_ulong; #define TB_JMP_PAGE_MASK (TB_JMP_CACHE_SIZE - TB_JMP_PAGE_SIZE) #if !defined(CONFIG_USER_ONLY) -#define CPU_TLB_BITS 8 -#define CPU_TLB_SIZE (1 << CPU_TLB_BITS) +#define CPU_TLB_BITS 8 +#define CPU_TLB_SIZE (1 << CPU_TLB_BITS) +/* use a fully associative victim tlb */ +#define CPU_VTLB_SIZE 8 #if HOST_LONG_BITS == 32 && TARGET_LONG_BITS == 32 #define CPU_TLB_ENTRY_BITS 4 @@ -103,12 +105,15 @@ typedef struct CPUTLBEntry { QEMU_BUILD_BUG_ON(sizeof(CPUTLBEntry) != (1 << CPU_TLB_ENTRY_BITS)); +/* The meaning of the MMU modes is defined in the target code. */ #define CPU_COMMON_TLB \ /* The meaning of the MMU modes is defined in the target code. */ \ - CPUTLBEntry tlb_table[NB_MMU_MODES][CPU_TLB_SIZE]; \ - hwaddr iotlb[NB_MMU_MODES][CPU_TLB_SIZE]; \ + CPUTLBEntry tlb_table[NB_MMU_MODES][CPU_TLB_SIZE]; \ + CPUTLBEntry tlb_v_table[NB_MMU_MODES][CPU_VTLB_SIZE]; \ + hwaddr iotlb[NB_MMU_MODES][CPU_TLB_SIZE]; \ + hwaddr iotlb_v[NB_MMU_MODES][CPU_VTLB_SIZE]; \ target_ulong tlb_flush_addr; \ - target_ulong tlb_flush_mask; + target_ulong tlb_flush_mask; \ #else diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index ea90b64..74eb674 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -102,6 +102,8 @@ void tlb_set_page(CPUArchState *env, target_ulong vaddr, hwaddr paddr, int prot, int mmu_idx, target_ulong size); void tb_invalidate_phys_addr(hwaddr addr); +/* swap the 2 given tlb entries as well as their iotlb */ +void swap_tlb(CPUTLBEntry *te, CPUTLBEntry *se, hwaddr *iote, hwaddr *iose); #else static inline void tlb_flush_page(CPUArchState *env, target_ulong addr) { diff --git a/include/exec/softmmu_template.h b/include/exec/softmmu_template.h index c6a5440..d63f694 100644 --- a/include/exec/softmmu_template.h +++ b/include/exec/softmmu_template.h @@ -153,7 +153,23 @@ WORD_TYPE helper_le_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx, do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); } #endif - tlb_fill(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); + /* we are about to do a page table walk. our last hope is the victim tlb. + * try to refill from the victim tlb before walking the page table. */ + int vidx, vhit = false; + for(vidx = 0;vidx < CPU_VTLB_SIZE; ++vidx) { + if (env->tlb_v_table[mmu_idx][vidx].ADDR_READ == (addr & TARGET_PAGE_MASK)) { + /* found entry in victim tlb */ + swap_tlb(&env->tlb_table[mmu_idx][index], + &env->tlb_v_table[mmu_idx][vidx], + &env->iotlb[mmu_idx][index], + &env->iotlb_v[mmu_idx][vidx]); + vhit = true; + break; + } + } + + /* missed in victim tlb */ + if (!vhit) tlb_fill(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); tlb_addr = env->tlb_table[mmu_idx][index].ADDR_READ; } @@ -235,7 +251,22 @@ WORD_TYPE helper_be_ld_name(CPUArchState *env, target_ulong addr, int mmu_idx, do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); } #endif - tlb_fill(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); + /* we are about to do a page table walk. our last hope is the victim tlb. + * try to refill from the victim tlb before walking the page table. */ + int vidx, vhit = false; + for(vidx = 0;vidx < CPU_VTLB_SIZE; ++vidx) { + if (env->tlb_v_table[mmu_idx][vidx].ADDR_READ == (addr & TARGET_PAGE_MASK)) { + /* found entry in victim tlb */ + swap_tlb(&env->tlb_table[mmu_idx][index], + &env->tlb_v_table[mmu_idx][vidx], + &env->iotlb[mmu_idx][index], + &env->iotlb_v[mmu_idx][vidx]); + vhit = true; + break; + } + } + + if (!vhit) tlb_fill(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); tlb_addr = env->tlb_table[mmu_idx][index].ADDR_READ; } @@ -354,7 +385,22 @@ void helper_le_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val, do_unaligned_access(env, addr, 1, mmu_idx, retaddr); } #endif - tlb_fill(env, addr, 1, mmu_idx, retaddr); + /* we are about to do a page table walk. our last hope is the victim tlb. + * try to refill from the victim tlb before walking the page table. */ + int vidx, vhit = false; + for(vidx = 0;vidx < CPU_VTLB_SIZE; ++vidx) { + if (env->tlb_v_table[mmu_idx][vidx].addr_write == (addr & TARGET_PAGE_MASK)) { + /* found entry in victim tlb */ + swap_tlb(&env->tlb_table[mmu_idx][index], + &env->tlb_v_table[mmu_idx][vidx], + &env->iotlb[mmu_idx][index], + &env->iotlb_v[mmu_idx][vidx]); + vhit = true; + break; + } + } + + if (!vhit) tlb_fill(env, addr, 1, mmu_idx, retaddr); tlb_addr = env->tlb_table[mmu_idx][index].addr_write; } @@ -430,7 +476,22 @@ void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val, do_unaligned_access(env, addr, 1, mmu_idx, retaddr); } #endif - tlb_fill(env, addr, 1, mmu_idx, retaddr); + /* we are about to do a page table walk. our last hope is the victim tlb. + * try to refill from the victim tlb before walking the page table. */ + int vidx, vhit = false; + for(vidx = 0;vidx < CPU_VTLB_SIZE; ++vidx) { + if (env->tlb_v_table[mmu_idx][vidx].addr_write == (addr & TARGET_PAGE_MASK)) { + /* found entry in victim tlb */ + swap_tlb(&env->tlb_table[mmu_idx][index], + &env->tlb_v_table[mmu_idx][vidx], + &env->iotlb[mmu_idx][index], + &env->iotlb_v[mmu_idx][vidx]); + vhit = true; + break; + } + } + + if (!vhit) tlb_fill(env, addr, 1, mmu_idx, retaddr); tlb_addr = env->tlb_table[mmu_idx][index].addr_write; } -- 1.7.9.5 --001a11c13b5239262a04f09039d9 Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; name="vtlb.xlsx" Content-Disposition: attachment; filename="vtlb.xlsx" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hqqpayri0 UEsDBBQABgAIAAAAIQD9h5Z5owEAANAGAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACs ld9OwyAUxu9NfIeGW9OyeWGMWbeLqZe6xPkACGdrMwqEw/69vae0M8bMdbrelLZwvt/HAQ6jya7S yQY8ltbkbJgNWAJGWlWaZc7e58/pPUswCKOEtgZytgdkk/H11Wi+d4AJRRvMWRGCe+AcZQGVwMw6 MNSzsL4SgT79kjshV2IJ/HYwuOPSmgAmpKHWYOPRIyzEWofkaUe/GyceNLJk2gysWTkTzulSikBO +caoH5S0JWQUGcdgUTq8IRuMHyXUPb8D2rhXSo0vFSQz4cOLqMgG32m+tX71Ye0qOy1yxKVdLEoJ ysp1RRnI0HkQCguAUOkstlklSnPwfYIfByOPzbBnI/X8onCHj0DrDTw+L7cQZTqAGPYasO+0R9Eu ciE8qLfg6WT0buC7docP5cW2tsDbl8vz3gp1cCV5DMhj0xuT9nwUPI8dF/8cdoVpc84a9Rh35vSs th7/wZAxsN5IXSCh5bSgI97zJpYH3VN8qjszbx0to/XwdwOHEltHp46EwIcSvorssWL1RaTqffGM ob4fFKgjbB7vo/EnAAAA//8DAFBLAwQUAAYACAAAACEAtVUwI/QAAABMAgAACwAIAl9yZWxzLy5y ZWxzIKIEAiigAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAKySTU/DMAyG70j8h8j31d2QEEJLd0FIuyFUfoBJ3A+1jaMkG92/JxwQVBqDA0d/ vX78ytvdPI3qyCH24jSsixIUOyO2d62Gl/pxdQcqJnKWRnGs4cQRdtX11faZR0p5KHa9jyqruKih S8nfI0bT8USxEM8uVxoJE6UchhY9mYFaxk1Z3mL4rgHVQlPtrYawtzeg6pPPm3/XlqbpDT+IOUzs 0pkVyHNiZ9mufMhsIfX5GlVTaDlpsGKecjoieV9kbMDzRJu/E/18LU6cyFIiNBL4Ms9HxyWg9X9a tDTxy515xDcJw6vI8MmCix+o3gEAAP//AwBQSwMEFAAGAAgAAAAhAJIHlOwEAQAAPwMAABoACAF4 bC9fcmVscy93b3JrYm9vay54bWwucmVscyCiBAEooAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAKySy2rEMAxF94X+g9G+cTJ9UIZxZtFSmG2bfoBwlDhMYgdbfeTva1I6ycCQbrIxSML3Hom7 2393rfgkHxpnFWRJCoKsdmVjawXvxcvNI4jAaEtsnSUFAwXY59dXu1dqkeOnYJo+iKhigwLD3G+l DNpQhyFxPdk4qZzvkGPpa9mjPmJNcpOmD9LPNSA/0xSHUoE/lLcgiqGPzv9ru6pqND07/dGR5QsW MvDQxgVEgb4mVvBbJ5ER5GX7zZr2HM9Ck/tYyvHNlhiyNRm+nD8GQ8QTx6kV5DhZhLlfE0Zjq58M NnaCObWWLnK3aigMeirf2MfMz7Mxb//ByLPY5z8AAAD//wMAUEsDBBQABgAIAAAAIQC2nkp4MgIA AIcEAAAPAAAAeGwvd29ya2Jvb2sueG1srFTLbtswELwX6D8QvNt6WEocwVIQP4oGKIogdZKLLzS1 sghTpEpStY2i/96VVLVufUnRXsQluRruzCw5uz1WknwBY4VWKQ3GPiWguM6F2qX0af1uNKXEOqZy JrWClJ7A0tvs7ZvZQZv9Vus9QQBlU1o6VyeeZ3kJFbNjXYPCnUKbijmcmp1nawMstyWAq6QX+v6V VzGhaI+QmNdg6KIQHJaaNxUo14MYkMxh+bYUtR3QKv4auIqZfVOPuK5qhNgKKdypA6Wk4sn9TmnD thJpH4N4QMbwAroS3GirCzdGKK8v8oJv4HtB0FPOZoWQ8NzLTlhdf2RVe4qkRDLrVrlwkKf0Cqf6 AL8tmKaeN0LibhBFoU+97KcVD4bkULBGujWaMMBjYjwJw7DNRFJ30oFRzMFCK4ca/lD/X/XqsBel RnfII3xuhAFsila2bIZfxhO2tQ/MlaQxMqWLZPNkkf7m6LTabZZg907XmzON2aWBf6Ey4y1dD/n2 NfXxn9yzWdvBzwIO9peK7ZQcX4TK9SGleB9OZ/GhW34RuStTGk6nPu73a+9B7EqHYofRJO4OP8Pu mh7P6EaiOrM/tRchwNvVjvetn5SYRGBg7vOgQxh+40xyNLcdusQ4jIMuA47ug3XZDEfUVaT0axD5 d9f+TTTyV5N4FE1vwtE0moSjRbQMV/H1armax9/+byujvcnwGrRVlsy4tWF8j2/IIxRzZrG1e0JY JzoxVO0Nf2XfAQAA//8DAFBLAwQUAAYACAAAACEAHiFMNkkBAACIAgAAFAAAAHhsL3NoYXJlZFN0 cmluZ3MueG1sbJLdS8MwFMXfBf+HkFcx/VxXpe1AURB8EJy+p+ldG9fcdEk6Nv964xfC4tvN+d1z OZBTrQ5qJHswVmqsacJiSgCF7iT2NX1Z31+WlFjHseOjRqjpESxdNednlbWOeC/amg7OTddRZMUA ilumJ0BPNtoo7vzT9JGdDPDODgBOjVEax0WkuERKhJ7R1TRLKZlR7ma4/RaSJW0qK5vKNXkcswnM 2PpcQxW5poo+wS9MWPsupzQEGeuFCOT0iimxCeR8wXrdqm0AFgUblAITgpLZN8A+AEXKRtnuZo5u ViHN2ZAWuYEwwzJhWiG4aQpcy4xx/wthijJjBz5yFP9kXz/e1OmiOD32I1+Ud+jM8VUKJ5XXTte4 LwXvIXBLBWTNt4CWSCTPIDR29nTrCYwAdN5P/PjVBBRAHtRk9B6UR3+OyDep+QAAAP//AwBQSwME FAAGAAgAAAAhAIuCbliTBgAAjhoAABMAAAB4bC90aGVtZS90aGVtZTEueG1s7FnPixs3FL4X+j8M c3f8a2ZsL/EGe2xn2+wmIeuk5Ki1ZY+ympEZybsxIVCSY6FQmpZeCr31UNoGEugl/Wu2TWlTyL/Q J83YI63lbppuIC1ZwzKj+fT06b0335M0Fy/djalzhFNOWNJ2qxcqroOTERuTZNp2bw4HpabrcIGS MaIswW13gbl7afv99y6iLRHhGDvQP+FbqO1GQsy2ymU+gmbEL7AZTuDZhKUxEnCbTsvjFB2D3ZiW a5VKUI4RSVwnQTGYvTaZkBF2htKku7003qdwmwguG0Y03ZemsdFDYceHVYngCx7S1DlCtO3COGN2 PMR3hetQxAU8aLsV9eeWty+W0VbeiYoNfbV+A/WX98s7jA9rasx0erAa1PN8L+is7CsAFeu4fqMf 9IOVPQVAoxHMNOOi2/S7rW7Pz7EaKLu02O41evWqgdfs19c4d3z5M/AKlNn31vCDQQheNPAKlOF9 i08atdAz8AqU4YM1fKPS6XkNA69AESXJ4Rq64gf1cDnbFWTC6I4V3vK9QaOWGy9QkA2r7JJDTFgi NuVajO6wdAAACaRIkMQRixmeoBFkcYgoOUiJs0umESTeDCWMQ3OlVhlU6vBf/jx1pTyCtjDSekte wISvNUk+Dh+lZCba7odg1dUgL599//LZE+fls8cnD56ePPjp5OHDkwc/ZraMjjsomeodX3z72Z9f f+z88eSbF4++sOO5jv/1h09++flzOxAmW3jh+ZePf3v6+PlXn/7+3SMLvJOiAx0+JDHmzlV87Nxg McxNecFkjg/Sf9ZjGCFi9EAR2LaY7ovIAF5dIGrDdbHpvFspCIwNeHl+x+C6H6VzQSwjX4liA7jH GO2y1OqAK3IszcPDeTK1D57OddwNhI5sY4coMULbn89AWYnNZBhhg+Z1ihKBpjjBwpHP2CHGltnd JsTw6x4ZpYyziXBuE6eLiNUlQ3JgJFLRaYfEEJeFjSCE2vDN3i2ny6ht1j18ZCLhhUDUQn6IqeHG y2guUGwzOUQx1R2+i0RkI7m/SEc6rs8FRHqKKXP6Y8y5rc+1FOarBf0KiIs97Ht0EZvIVJBDm81d xJiO7LHDMELxzMqZJJGO/YAfQooi5zoTNvgeM98QeQ9xQMnGcN8i2Aj32UJwE3RVp1QkiHwyTy2x vIyZ+T4u6ARhpTIg+4aaxyQ5U9pPibr/TtSzqnRa1Dspsb5aO6ekfBPuPyjgPTRPrmN4Z9YL2Dv9 fqff7v9evze9y+ev2oVQg4YXq3W1do83Lt0nhNJ9saB4l6vVO4fyNB5Ao9pWqL3lais3i+Ay3ygY uGmKVB8nZeIjIqL9CM1giV9VG9Epz01PuTNjHFb+qlltifEp22r/MI/32DjbsVarcneaiQdHomiv +Kt22G2IDB00il3Yyrza107VbnlJQPb9JyS0wUwSdQuJxrIRovB3JNTMzoVFy8KiKc0vQ7WM4soV QG0VFVg/ObDqaru+l50EwKYKUTyWccoOBZbRlcE510hvcibVMwAWE8sMKCLdklw3Tk/OLku1V4i0 QUJLN5OEloYRGuM8O/Wjk/OMdasIqUFPumL5NhQ0Gs03EWspIqe0gSa6UtDEOW67Qd2H07ERmrXd Cez84TKeQe5wue5FdArHZyORZi/86yjLLOWih3iUOVyJTqYGMRE4dSiJ266c/iobaKI0RHGr1kAQ 3lpyLZCVt40cBN0MMp5M8EjoYddapKezW1D4TCusT1X31wfLnmwO4d6PxsfOAZ2nNxCkmN+oSgeO CYcDoGrmzTGBE82VkBX5d6ow5bKrHymqHMraEZ1FKK8ouphncCWiKzrqbuUD7S6fMzh03YUHU1lg /3XVPbtUS89polnUTENVZNW0i+mbK/Iaq6KIGqwy6VbbBl5oXWupdZCo1ipxRtV9hYKgUSsGM6hJ xusyLDU7bzWpneOCQPNEsMFvqxph9cTrVn7odzprZYFYritV4qtPH/rXCXZwB8SjB+fAcyq4CiV8 e0gRLPqyk+RMNuAVuSvyNSJcOfOUtN17Fb/jhTU/LFWafr/k1b1Kqel36qWO79erfb9a6XVr96Gw iCiu+tlnlwGcR9FF/vFFta99gImXR24XRiwuM/WBpayIqw8w1drmDzAOAdG5F9QGrXqrG5Ra9c6g 5PW6zVIrDLqlXhA2eoNe6Ddbg/uuc6TAXqceekG/WQqqYVjygoqk32yVGl6t1vEanWbf69zPlzEw 80w+cl+AexWv7b8AAAD//wMAUEsDBBQABgAIAAAAIQAVr6o8vQAAACsBAAAjAAAAeGwvd29ya3No ZWV0cy9fcmVscy9zaGVldDEueG1sLnJlbHOEj80KwjAQhO+C7xD2btJ6EJGmXkTwKvUBlmT7g20S svGnb28ugoLgbWeX/Wam2j+nUdwp8uCdhlIWIMgZbwfXabg0x9UWBCd0FkfvSMNMDPt6uajONGLK T9wPgUWmONbQpxR2SrHpaUKWPpDLl9bHCVOWsVMBzRU7Uuui2Kj4yYD6iylOVkM82RJEM4fs/J/t 23YwdPDmNpFLPyyUjfjIzTISY0dJg5TvHb+HUubIoOpKfVWsXwAAAP//AwBQSwMEFAAGAAgAAAAh AA5E9N+8AAAAJQEAACMAAAB4bC9kcmF3aW5ncy9fcmVscy9kcmF3aW5nMS54bWwucmVsc4SPzQrC MBCE74LvEPZu0noQkaa9iNCr1AdY0u0PtknIRrFvb6AXBcHTsDvsNztF9Zon8aTAo7MacpmBIGtc O9pew6257I4gOKJtcXKWNCzEUJXbTXGlCWM64mH0LBLFsoYhRn9Sis1AM7J0nmxyOhdmjGkMvfJo 7tiT2mfZQYVPBpRfTFG3GkLd5iCaxafk/2zXdaOhszOPmWz8EaHMgCEmIIaeogYp1w2vksv0LKiy UF/lyjcAAAD//wMAUEsDBBQABgAIAAAAIQCAG9yB0gAAAI8BAAAfAAAAeGwvY2hhcnRzL19yZWxz L2NoYXJ0MS54bWwucmVsc6yQwUrEMBCG74LvEOZu0+xBRDbdgyDsVdcHCOm0DZtkwkwQ+/amF7GL R48zw/99P3M8faWoPpElULZguh4UZk9jyLOFj8vrwxMoqS6PLlJGCysKnIb7u+MbRldbSJZQRDVK FgtLreVZa/ELJicdFcztMhEnV9vIsy7OX92M+tD3j5p/M2DYMdV5tMDn8QDqspZmvmGn4JmEptp5 SpqmKfiNasyeqv3iuL5QJH6va8RGczxjteC3nZiuFQT9t9v8h/tGK1uLH6vevXH4BgAA//8DAFBL AwQUAAYACAAAACEA3iPy04UCAACxBQAADQAAAHhsL3N0eWxlcy54bWykVFtvmzAUfp+0/2D5nRpo yJIIqJYLUqVumtRO2qsDJrHqC7JNl2zaf+8xkISq0zatL/icw/F3vnNzenOQAj0xY7lWGY6uQoyY KnXF1S7DXx+KYIaRdVRVVGjFMnxkFt/k79+l1h0Fu98z5hBAKJvhvXPNghBb7pmk9ko3TMGfWhtJ HahmR2xjGK2svyQFicNwSiTlCvcIC1n+C4ik5rFtglLLhjq+5YK7Y4eFkSwXtzulDd0KoHqIJrQ8 YXfKK3jJS6Otrt0VwBFd17xkr1nOyZwAUp7WWjmLSt0qB7UCaB9h8aj0d1X4X97Ye+Wp/YGeqABL hEmellpogxxUBoh1FkUl6z1WVPCt4d6tppKLY2+OvaEr5uAnOaTmjcTzGA4Ll7gQZ1axJwCGPIXq OGZUAQoa5IdjA+EVNLKH6fz+4r0z9BjFyegC6QLm6VabCgbnUo+TKU8Fqx0QNXy396fTDXy32jmo cp5WnO60osKn0oOcBUinZELc++H6Vr/APtRItbKQ7rbKMIypL8JJhEQGscfrFY8/Ruux3wyLDvVL fEAc0X5B+hwe+X5n+LPfBgGTM0CgbcuF4+o3hAGzOlxKEPoOOD/ZXXHOUaASFatpK9zD+WeGL/In VvFWxmevL/xJuw4iwxf5zncqmvoY7ODuLIwXnKg1PMM/N8sP8/WmiINZuJwFk2uWBPNkuQ6SyWq5 XhfzMA5Xv0aL9oY1656DPIXFWlgBy2iGZIcU7y+2DI+Unn43o0B7zH0eT8OPSRQGxXUYBZMpnQWz 6XUSFEkUr6eT5SYpkhH35P+4RyGJov4t8+STheOSCa5OvTp1aGyFJoH6hyTIqRPk8tbmzwAAAP// AwBQSwMEFAAGAAgAAAAhAHeoghe9BAAADQ8AABgAAAB4bC93b3Jrc2hlZXRzL3NoZWV0MS54bWyU V1tvq0YQfq/U/4B4alVhWBb2Ytk+Or7fiNqenr4TvLbRMcYFkpz8+w5g42ViS3GkJDDffjM7MzvD Tu/Lz+RgvKosj9Nj3yQdxzTUMUo38XHXN7//M7WEaeRFeNyEh/So+ua7ys0vg19/6b2l2Y98r1Rh gIZj3jf3RXHq2nYe7VUS5p30pI6AbNMsCQt4zXZ2fspUuKlIycF2HYfZSRgfzVpDN/uMjnS7jSM1 TqOXRB2LWkmmDmEB+8/38Sm/aEuiz6hLwuzHy8mK0uQEKp7jQ1y8V0pNI4m6i90xzcLnA/j9k3hh dNFdvXxQn8RRlubptuiAOrve6EefpS1t0DTobWLwoAy7kalt3/xKuk/StAe9Kj7/xuot156NInz+ pg4qKtQG0mQaRXpaq20xUodDyaWmUSbkOU1/lNQFLHLARl5RShthVMSvql7+FwUF+X+V2fIZjNqN Vf35soNplcQ/M2OjtuHLofg7fZureLcvYCs+BKWMTXfzPlZ5BEkB0x3Xb1wZh0U46GXpmwEJLg2f wvK4kC7x7lEHvahc/LX0s2/m4MjrgPg9+xU2F8EvKGs0uo9oHMLqRqPTKKysjXSMtLGxjrltbKJj tI1NdcxrYzMduzpX7WWuY6zNW+gYb2NLHRNtbKVjso2tW76jwAQtEEXmqQVeXWzlCE7nA1mH1des o2APaX0YpIuiMjoDTKAwj2vA5Wjjk1ouXRSmaS33BEexnZ0VUQzMzwzJkenFhYFOxfJiwkfAqgZ8 MI7yUwPUpygeQQ0wwVE8nkpgO/j2PfhtSLsB/d0mQN2WlUQJEx3Crj93KgvK84Gswepr1pBfQ6/O GsdJGJ0Bn6ICGNeA6yFNk1r+If3TWu4RH53s2dmCcFCA5meGYIixOJsmuLZqOWUuqo/VWZNkKDnr M4NgIKgBRn3k9lMJnLPmdQNPy5orHLfjCNr83MkaeyhrsPqatWuEWtXLH+qwsPpuh9Ux3GF1DHdY HcMdVsdwh9Ux3GF1DHdYHcOnQMdwh9Ux3GFbvuMO2wJxh22BdzpseUv7/HcVVt/vsKKuVfRxvCkd 35RObkqnN6Wzm9L5TenipnR5U7q6KV3flAY3pU+l9FyKohsIrRSvCWrViXwoB7D6fr+UlW3yB/Ru awhdYAinvurdcEEXjsc541RSnxGOjtmoYY6oNQLmSGcKj0vhSMmZ6+G2N26YY2qNgTm+MolDqXv9 g+4/DXFCrQkQJ5pJxyW+T7jrEcolRSd72jCn1JoCc6qZ9LjrEua7zIePnoO7esOcUWsGzNmV6Xpg FL6HlHhMuBTV6Lxhzqk1B+Zc261LiCM5hxAL18E3jEXDXFBrAcyFxmSCMem7XEgmpY9sLhvmklpL YC613fqewyTzOIP/1MMdpWGuqLUC5kqzKX0GXzUpBfUho+jC0BDX1FoDca1n0+M+8wkRkrhcogYX NMyAWuUXKNBMch+iw8FH7knx4eNVM6srh+wGUq+YDnEgGdwXgkJCiXZTqkuonj/qUeEU7lQQZrv4 mBsHmHHKeQJ6YFYPHNUzTD+VFIaP57Qo0uTytocBU8Ho4HTgFrlN0+LyAjPOJgvfYKw1sm4M41G2 2NSTTzPIDv4HAAD//wMAUEsDBBQABgAIAAAAIQCvcGJ5mQEAAPcDAAAYAAAAeGwvZHJhd2luZ3Mv ZHJhd2luZzEueG1snFNdT+swDH1Huv8hyvul7fi6qtZOV0wgXoAH+AFWmq6RmqRywlb+PU6abgPx MO0lco7jY/vYWa5G3bOtRKesqXhxmXMmjbCNMpuKv789/P3HmfNgGuitkRX/lI6v6j8Xy7HBcufW yIjAuJKuFe+8H8osc6KTGtylHaQhb2tRg6crbrIGYUfUus8WeX6buQElNK6T0q8nD098cAabBmV4 HSvzO3sv+/6/EZ3FCWrR6skStq/zZRY6CGYMIOOlbWuqKl/c7H0Bim60u7q4mvBgz2B4UFzf3V7d 7X0xJpIfMnp7yFwc6E9OfUR/Wuo54QZh6JR4QNCSaRBoK54kMtvHI+drUkk8b1+RqabiC84MRVX8 vgP0rOBZKvf5RyDhsd3fCccWSXYobduyseK0X5/hpCAo5eiZmEAxo5FqDkrlh7fJXIMH9oHqjPUQ oQ9qXpTRSosmzmZKBCftPXWvhFxb8aGl8dPyo+zB07dznRocZ1gG1fGpiUpn3zomhff3pPbxZNNg ekXcQaB5Ij9+QZQ2/Nn6CwAA//8DAFBLAwQUAAYACAAAACEAHBSnqP0AAABuAwAAFQAAAHhsL2No YXJ0cy9jb2xvcnMxLnhtbKSTQW7CMBBFrxL5AHESIK0iwqbrigUnGE1sYsn2INulcHucUGhDIRLB O/vrv/l/JC/RV0ia3CYctUgORtv44GvWhrCrOPfYCgM+NQodeZIhRTKcpFQoeOPgW9ktL7K84NiC Cz2F/WDgH4V2wsYRkpyB4FNy2wvD6EjJSm5AWZYYEdqa4RG1YIlqapZnbLWEqk8jPrRL9qBrBojC hpzxh1oxos1GtPmIthjRyk6LK92DUxAU2ZtrF1R/mU9qzg3KLJ7Ow/+ahohbz/vF06PWUp5RcX3T UU+Mv0Yejp9PGL+Y4Hm73372CuqJ9tfIw/aPmnTk3++1OgEAAP//AwBQSwMEFAAGAAgAAAAhANUt GDGcBAAAwiUAABQAAAB4bC9jaGFydHMvc3R5bGUxLnhtbOxabW/iOBD+K5F/QAP0aClqKnVbrXQS va32VrrPJnHAu46ds81S+utv7LwQk4SXLdDC7Tc8CbbnmfEz45nchmoYTrHUf+sFI95LwjgIVICm WqdD31fhlCRYXSQ0lEKJWF+EIvFFHNOQ+JHEc8onfq/T7fnLWVA+Da7NIlLCYYlYyARrdSHkpJgj YTBL58pPMOXIo1GAYFJ0dwvbwy9UfaOaETti/CuJ4YWXAHWQb0UxZawmJHFMQl1/V/ClMKFcSFgE D62a5IFJ7ydmAdIvZm08ZLPkSUSZ7Krf6dgVrfhLHGfiy0LsV2a5u/Vh43G2lt1jROKvz9JTrwHq mnm8H0Ry+A1KGy3M666eIdZkIuTiHrQ/ZcVV+iwtlNybB+im3+sjL8RpgGKGNfxMUrC14hPkYTYB REKdW0QwGn0Gy25pnm6zeQYt5gFjVReQYsYjYwcwLs/MkW0c7FIx3U2z5Wq2smfhXhLsJSKCw4QZ E/O/hFHny08iJY0IqGtlI8pJIcv8/Wgenvtd1U0LazngrByO8aRrXXYFQnYOBm47m6VBs8OMNR7h MQHfBP94N0a6bnb53s6M1OLWkaNmOXownjvTx9M9+rFvNt7GzZlucXNLSGvYqWm7pU3c4FFacCV4 OEdrd04CpxyLaAHxRgpt4qSn0vAzlUqPsNLPWEJk7iIPmEgb6omBiIB4GU2RNxXydVVm3oNQDk+Q N5eGu9W/MywJ8tifHNjt8qp/fYU8bQfdQW8wQJ6sPhlXn2AewlQZ0XvZ4EHDOLOxSu9nGohS5+SU 6ZExcqMHGuGzoHw7f8xTCmWSnTLaY1ixCMJ5LmGd+80pxCrBmijv7rccXT5udZ4+0P7zHZcamEBW 18FK2uG23FlP4uzJA7D2bgGY001IeoP+dZGRSB5lyeCaw51OwW2awl9rBuEYvQSphO0JS0gF9wfc BsAP6t81dG26t4kvWyCt0Z4DZAW2FShHeAHRyVOLZCwglQ+pDBlQlaKvJED9/MpQ/ucfKkkscXKC rlvJpY/guS5QBr9veHzad7KCCbhNzIGsTfJ/vrcU12aRmPNPuIF4DnWnNmnRL9449pAAtl9WNtHT HmoB69M5y2sVa0RSpM3B9JDljjWmOfShKEsobnJcFlzWJcd4uD7wVrGEi7eQR/V54zvvCOyOJatt ayLGYR0s4QIhjsgkG1B16Nyc7lLQmFIsNz+BugyDLPYJf/9A6pxoSDJOUge0lJjK63GrJ+94Dpvr NDdvLE06CJd4TulI/K+ix45VsF1IzsWS4IjI34E5QPsIzGwFTTIhPDqTBk9LOZUtdUyZ0CfXHjB8 U2zcWqoYXD6eVJujqkdexFJEUqJOvdW2uVG1omc2/E1p+6G0FTT1ObWs/zCNz7FtJVQa16atYGVj rIjJnPOevDlhS/W1BGo3T/dV5Cz6/oevDndvOn1Q3Par31RjS6H38ojVNPtmQC3Uo9B5FdntN1vo HMBK+D5Ax3Fv30C0hMgGXWfpqVSpWhuGZUnxV0pNb/muofG+uwQUPnWZkfMPeq6ac+hef5iL546l imzvhiKWH1vd/QcAAP//AwBQSwMEFAAGAAgAAAAhAOOG4XXICAAAsiQAABQAAAB4bC9jaGFydHMv Y2hhcnQxLnhtbOxa227bSBJ9X2D/gUP4bWCKpHgVIg9sZT0I1kmM2MksFvvSJFtSj5vdnGbLlvP1 W30hdbFoOwlmE8zaDzLZrL5VVVfVOeSrX9Y1dW6xaAlnUzfwfNfBrOQVYYup+/H6/DhznVYiViHK GZ6697h1fzn5+99elZNyiYS8alCJHRiEtZNy6i6lbCajUVsucY1ajzeYwbM5FzWScCsWo0qgOxi8 pqPQ95ORHsS1A6CvGKBGhHX9xXP68/mclPg1L1c1ZtKsQmCKJGigXZKmdU9gcxWSOMj9yLlFdOr6 7kg1UsQWpgGz449XplHwFatwNeOCgRq35OtyckolFgyGmnEmYTa7z/pZmqqRuFk1xyWvG1hcQSiR 93q5sEAYe7bksA/nA/5jRQRup24ZRJ0i4PKBKmpSCt7yufRgxJHRQmcNNWw6ykahtQdsNogmrbyn 2Gwo8EO121E/r17COaK0QOWN0s2WcC+6ea467itD9dLmVxdoJfk1kRS/xhRLXNlpjYobyuWpwMjY 4J6vpDZHgcRM+aBqhuvXRJheJaem3wJs04Cz2Wa6asEcuDIPb5G4n3HKd2wG+8BCjUeq9Y7puaiw Hd46g1ybbYsPeK6u5idXS4xl8NPR6VH2aqQatFrEDMFpUNeNnIGvyN2tSQemUh6mJG5Pri/OpmGc qP63oG/VSf9rZTcOtMGNnhQu7SqaS1g1moCjyHNCqdOIVk5dugC/m2MpCYyOJvPFjGoxfTwx3Jil yHWgjbslUQyIFotO1EqMNpOqKShTvy2npFLr0DcqFmwmQ2UJB6EbZUsSRjK98XyOS3nRKiOrzeq9 gUUYhCn5Zv4OL+A43FrHtMYokfaCTjHb1jg7SidH747SZ5hkbN1tzyaR73sNFrSAyLjctYyyjzFg YA0Y+YFXfCZNOCQY9oJjb1GWQ2LjTizMvbqcD4lFnVgUewte1DdDgnEnGCfesq6xGBJMesHMa3/H bDEkmHaCSehRUvyxQkyu6iHprJeOvGWYRAIP7invRNPA4zXDsmkGtd6dmygdewgS1eC2gt5A2dhb Iwjl5SPaCjorIXA6tMDPPo/WESFrqPPMVvWD6HB2lCl/3IQIEOpDhMmUM17hk18x5BNEtdvq/Klb H4SRAZ8NnvLTQYFu54MCnWcOCnQ+OSjQ+eKgQOeDgwKd7w0KdO42KNA52bCiOtcaluhcalhiQJkQ 1jZWNzddQNeeo8KeyUP76UgHznKylY5sy2PpKH9G7Dsc+mw6+jn7B5Pi/hMpJamh7dnH4dH0dFd9 bF4TtHhJTi/JyVQ/0Uty+t7JKVfJaRMw/pzk5PmZH6Vpko7zcZwEqZ5vU+8+rKoAmGZZlOaZn+dp EkbJYI8+4nqBPx6Hm5+nCi2Ywg+DOA7SMArGaT5+Or95QZSGYZDEYRLH49AfXFSf8LwwgkmyNBkH UZKFY10FHNp4nwE9kA/8PE1BZVnoh3vQYKOqPiV6fpIlSR6HaZYneR4PztHnSC+MIz/JkyhN4P84 GuzRJ03Pz+Mkgz55No7BIk/WZwGYI0rjJA6CLA/CNNch76DJ+6zq+WkM+05hF2mUZ3E8OMu20UGt aZxlYzBJkEYPMtUz8251UdBWA7glv7vAC8yqf+L7HUjYwpNPCNiTLYZAtc2QfIfqXXyi2q+wONh+ iYWCRA/GOVsVBcVX5PP2UFAZ9EtboOY3Usml6RkGucnhHEpWihrTehymphWt31hQHSY+OEaWZQcf ZBCDNRrUmLrH11DXnmrAOzhOWyIKWFvpjAsCG9KMillFTdhbtLbDbglWGuzv7BytL7llUQqzQLDY eS2dTWk8dW1tDNQUX4HyLgi7wRXQV6ZDjX7n4pqUN2+BQTGDMyCv7EPChh9K6ASG71fA8Fpec9PR 4FA0YVwhW8CmCq86d1MXTlrsOiVqpu4caCS4rBtYTMsWroPoAmi1Ugpd4zyGixUI12Ou6re8oz9i 39cAF6Za1e/nc7OZrGsGyNxDecDKe8BbE1MKQz8BrOXakAcFr+4vhSM4MAfHEBDUH2i4Kc8JsAkX gK4ukQCKLnAVYSjfw8+cclAAphRoM9KadiCeuPjsOndCaaQFWCgwKAKgMwd+TqnC3swk3GuTwQJb eaXYJq3WRlMZZlEVnn+ARbWfQVSvp1BciUP072rqasMCQynIDbCTjF/pK9e5Ad4NugCv5ToFajG4 JjxXJf3j9MSGC9kxlqIHmSPvGzwHvnPq/lyzYyqVY6AJRnsPMDIPynbvQdlansXsSpvGMjcQX5R2 1V4VywhK7RhGxbBoIsTYCTgzoPHaU0tP6cPcnVn7DNvzozi1f2Nh/Vfd7VBPtKCn4J6WHAO7GI6z oOBoLe5oKuOAgFf42xWV5OKWwgHZOrEQkPrYAJHwYJDYrO95QaKcQMCwc3g6TClAtIkvj4cNS/7p KPCrIJUyvQnlVtd/hWMLCnm4QakIVBWADewSpFwqB3052EDhf6+DrQlXsXesTTyDEPt18QhCAoyo TCtPDCZ3AJQ7UEjoJMlK4KvUM/Vr5leyw4v49gi5vSLnTd0IKELU65W9dQxEuW9Xx2ZgE1R1wDT+ 35PkFPVvDkyJtFfO2eiwk9+V3vqGl0T6V0qkyi+6eHmgxPQBDv7nX/sVpn3d8D+sML/dAxNdyf1Y tVyu67I/v5Tbr6iTwxX1+HkV9Y9dBW4gna4QD1eB+tEZlncY2wqrMDdb0OkjIx0a9cyLOngZ2ZV2 B2HQFzipeqW5/TpXQ2v9Yldf9dBLF9fqlft3CNo/FuxRZYLz/w57wG1o7yrKgT6R9j2jNoVb4F+R tjkD+HTTnloIBBSJRe9AwLxWnI6CrcBF7CGY7jOCzrsfQ+qbd+C7EPELyYCtOuPrkLqhIB4Hzgb+ fznGbARh8kp9OcAWGjstMYIPIM45hy8oNE5s4K0o8CsLwlrtnF4KJIj6VMZLXQeAvf4PTAL8hwem u7obu8DkqFHMTT8WTLZqzBv/vckVwuw/NTr5LwAAAP//AwBQSwMEFAAGAAgAAAAhAN5BFtmKAQAA EQMAABAACAFkb2NQcm9wcy9hcHAueG1sIKIEASigAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAnJJBb9swDIXvA/YfDN0bOd06DIGsYkg39LBiAZJ2Z02mY6GyJIiskezXj7bR1Gl72o3ke3j6 REldHzpf9JDRxVCJ5aIUBQQbaxf2lbjf/bj4KgokE2rjY4BKHAHFtf74QW1yTJDJARYcEbASLVFa SYm2hc7gguXAShNzZ4jbvJexaZyFm2ifOggkL8vyi4QDQaihvkinQDElrnr639A62oEPH3bHxMBa fUvJO2uIb6nvnM0RY0PF94MFr+RcVEy3BfuUHR11qeS8VVtrPKw5WDfGIyj5MlC3YIalbYzLqFVP qx4sxVyg+8truxTFH4Mw4FSiN9mZQIw12KZmrH1Cyvp3zI/YAhAqyYZpOJZz77x2n/VyNHBxbhwC JhAWzhF3jjzgr2ZjMr1DvJwTjwwT74SzHfimM+d845X5pFfZ69glE44snKqfLjzifdrFG0PwvM7z odq2JkPNL3Ba92mgbnmT2Q8h69aEPdTPnrfC8PgP0w/Xy6tF+ankd53NlHz5y/ofAAAA//8DAFBL AwQUAAYACAAAACEAyA8QV0IBAABbAgAAEQAIAWRvY1Byb3BzL2NvcmUueG1sIKIEASigAAEAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjJJfS8MwFMXfBb9DyXubphtDQ9uByp4cCFYU30Jy1xWb PyTRbt/etN1qZT74mHvO/d1zL8nXB9lGX2Bdo1WBSJKiCBTXolF1gV6qTXyDIueZEqzVCgp0BIfW 5fVVzg3l2sKT1Qasb8BFgaQc5aZAe+8NxdjxPUjmkuBQQdxpK5kPT1tjw/gHqwFnabrCEjwTzDPc A2MzEdEJKfiENJ+2HQCCY2hBgvIOk4TgH68HK92fDYMyc8rGH03Y6RR3zhZ8FCf3wTWTseu6pFsM MUJ+gt+2j8/DqnGj+ltxQGUuOOUWmNe2PHit6hzPKv31Wub8Nhx614C4O55Nl0IgDcFHHIgoRKFj 8LPyurh/qDaozFKyjFMSZ6QiK5oRuiDv/dxf/X20sSBP0/9DzCqypMuMktsZ8Qwoc3zxHcpvAAAA //8DAFBLAwQUAAYACAAAACEAs0kR7c0AAACuAQAAEAAAAHhsL2NhbGNDaGFpbi54bWxk0N9qwjAU BvB7Ye8Qzv1M3UR0NC3o5pybvZoPENKjDeRPSYLMtzeDdsLZTSC/E758SVn/WMMuGKL2TsBsWgBD p3yr3VnA8Xv7uAQWk3StNN6hgCtGqKuHSamkUZtOasdygosCupT6F86j6tDKOPU9ujw5+WBlyttw 5rEPKNvYISZr+FNRLLjNAVCVigUBTb5K5w7AzO/KB96sBh7hlcIbhWYElnvdk7b03DuFHYUPCnsK nxS+KBworP/1nZMnNs934H8/Xd0AAAD//wMAUEsBAi0AFAAGAAgAAAAhAP2HlnmjAQAA0AYAABMA AAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAtVUwI/QA AABMAgAACwAAAAAAAAAAAAAAAADcAwAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAkgeU7AQB AAA/AwAAGgAAAAAAAAAAAAAAAAABBwAAeGwvX3JlbHMvd29ya2Jvb2sueG1sLnJlbHNQSwECLQAU AAYACAAAACEAtp5KeDICAACHBAAADwAAAAAAAAAAAAAAAABFCQAAeGwvd29ya2Jvb2sueG1sUEsB Ai0AFAAGAAgAAAAhAB4hTDZJAQAAiAIAABQAAAAAAAAAAAAAAAAApAsAAHhsL3NoYXJlZFN0cmlu Z3MueG1sUEsBAi0AFAAGAAgAAAAhAIuCbliTBgAAjhoAABMAAAAAAAAAAAAAAAAAHw0AAHhsL3Ro ZW1lL3RoZW1lMS54bWxQSwECLQAUAAYACAAAACEAFa+qPL0AAAArAQAAIwAAAAAAAAAAAAAAAADj EwAAeGwvd29ya3NoZWV0cy9fcmVscy9zaGVldDEueG1sLnJlbHNQSwECLQAUAAYACAAAACEADkT0 37wAAAAlAQAAIwAAAAAAAAAAAAAAAADhFAAAeGwvZHJhd2luZ3MvX3JlbHMvZHJhd2luZzEueG1s LnJlbHNQSwECLQAUAAYACAAAACEAgBvcgdIAAACPAQAAHwAAAAAAAAAAAAAAAADeFQAAeGwvY2hh cnRzL19yZWxzL2NoYXJ0MS54bWwucmVsc1BLAQItABQABgAIAAAAIQDeI/LThQIAALEFAAANAAAA AAAAAAAAAAAAAO0WAAB4bC9zdHlsZXMueG1sUEsBAi0AFAAGAAgAAAAhAHeoghe9BAAADQ8AABgA AAAAAAAAAAAAAAAAnRkAAHhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbFBLAQItABQABgAIAAAAIQCv cGJ5mQEAAPcDAAAYAAAAAAAAAAAAAAAAAJAeAAB4bC9kcmF3aW5ncy9kcmF3aW5nMS54bWxQSwEC LQAUAAYACAAAACEAHBSnqP0AAABuAwAAFQAAAAAAAAAAAAAAAABfIAAAeGwvY2hhcnRzL2NvbG9y czEueG1sUEsBAi0AFAAGAAgAAAAhANUtGDGcBAAAwiUAABQAAAAAAAAAAAAAAAAAjyEAAHhsL2No YXJ0cy9zdHlsZTEueG1sUEsBAi0AFAAGAAgAAAAhAOOG4XXICAAAsiQAABQAAAAAAAAAAAAAAAAA XSYAAHhsL2NoYXJ0cy9jaGFydDEueG1sUEsBAi0AFAAGAAgAAAAhAN5BFtmKAQAAEQMAABAAAAAA AAAAAAAAAAAAVy8AAGRvY1Byb3BzL2FwcC54bWxQSwECLQAUAAYACAAAACEAyA8QV0IBAABbAgAA EQAAAAAAAAAAAAAAAAAXMgAAZG9jUHJvcHMvY29yZS54bWxQSwECLQAUAAYACAAAACEAs0kR7c0A AACuAQAAEAAAAAAAAAAAAAAAAACQNAAAeGwvY2FsY0NoYWluLnhtbFBLBQYAAAAAEgASALoEAACL NQAAAAA= --001a11c13b5239262a04f09039d9--