From a939c500793ae7672defe5e3dc83220576a7b202 Mon Sep 17 00:00:00 2001 From: Christoph Muellner Date: Fri, 24 Feb 2023 10:25:34 -0300 Subject: [PATCH 01/22] target/riscv: implement Zicboz extension The RISC-V base cache management operation (CBO) ISA extension has been ratified. It defines three extensions: Cache-Block Management, Cache-Block Prefetch and Cache-Block Zero. More information about the spec can be found at [1]. Let's start by implementing the Cache-Block Zero extension, Zicboz. It uses the cbo.zero instruction that, as with all CBO instructions that will be added later, needs to be implemented in an overlap group with the LQ instruction due to overlapping patterns. cbo.zero throws a Illegal Instruction/Virtual Instruction exception depending on CSR state. This is also the case for the remaining cbo instructions we're going to add next, so create a check_zicbo_envcfg() that will be used by all Zicbo[mz] instructions. [1] https://github.com/riscv/riscv-CMOs/blob/master/specifications/cmobase-v1.0.1.pdf Reviewed-by: Richard Henderson Co-developed-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Daniel Henrique Barboza Reviewed-by: Weiwei Li Message-ID: <20230224132536.552293-3-dbarboza@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 4 ++ target/riscv/cpu.h | 2 + target/riscv/helper.h | 3 + target/riscv/insn32.decode | 10 ++- target/riscv/insn_trans/trans_rvzicbo.c.inc | 30 +++++++++ target/riscv/op_helper.c | 68 +++++++++++++++++++++ target/riscv/translate.c | 1 + 7 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 target/riscv/insn_trans/trans_rvzicbo.c.inc diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 5bc0005cc7..ab6c127859 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -75,6 +75,7 @@ struct isa_ext_data { static const struct isa_ext_data isa_edata_arr[] = { ISA_EXT_DATA_ENTRY(h, false, PRIV_VERSION_1_12_0, ext_h), ISA_EXT_DATA_ENTRY(v, false, PRIV_VERSION_1_10_0, ext_v), + ISA_EXT_DATA_ENTRY(zicboz, true, PRIV_VERSION_1_12_0, ext_icboz), ISA_EXT_DATA_ENTRY(zicond, true, PRIV_VERSION_1_12_0, ext_zicond), ISA_EXT_DATA_ENTRY(zicsr, true, PRIV_VERSION_1_10_0, ext_icsr), ISA_EXT_DATA_ENTRY(zifencei, true, PRIV_VERSION_1_10_0, ext_ifencei), @@ -1167,6 +1168,9 @@ static Property riscv_cpu_extensions[] = { DEFINE_PROP_BOOL("zhinx", RISCVCPU, cfg.ext_zhinx, false), DEFINE_PROP_BOOL("zhinxmin", RISCVCPU, cfg.ext_zhinxmin, false), + DEFINE_PROP_BOOL("zicboz", RISCVCPU, cfg.ext_icboz, true), + DEFINE_PROP_UINT16("cboz_blocksize", RISCVCPU, cfg.cboz_blocksize, 64), + DEFINE_PROP_BOOL("zmmul", RISCVCPU, cfg.ext_zmmul, false), /* Vendor-specific custom extensions */ diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 665b4c60b0..73c9832fb7 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -434,6 +434,7 @@ struct RISCVCPUConfig { bool ext_zkt; bool ext_ifencei; bool ext_icsr; + bool ext_icboz; bool ext_zicond; bool ext_zihintpause; bool ext_smstateen; @@ -486,6 +487,7 @@ struct RISCVCPUConfig { char *vext_spec; uint16_t vlen; uint16_t elen; + uint16_t cboz_blocksize; bool mmu; bool pmp; bool epmp; diff --git a/target/riscv/helper.h b/target/riscv/helper.h index 0497370afd..ce165821b8 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -97,6 +97,9 @@ DEF_HELPER_FLAGS_2(fcvt_h_l, TCG_CALL_NO_RWG, i64, env, tl) DEF_HELPER_FLAGS_2(fcvt_h_lu, TCG_CALL_NO_RWG, i64, env, tl) DEF_HELPER_FLAGS_2(fclass_h, TCG_CALL_NO_RWG_SE, tl, env, i64) +/* Cache-block operations */ +DEF_HELPER_2(cbo_zero, void, env, tl) + /* Special functions */ DEF_HELPER_2(csrr, tl, env, int) DEF_HELPER_3(csrw, void, env, int, tl) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index fb537e922e..a471adcea0 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -179,7 +179,15 @@ sraw 0100000 ..... ..... 101 ..... 0111011 @r # *** RV128I Base Instruction Set (in addition to RV64I) *** ldu ............ ..... 111 ..... 0000011 @i -lq ............ ..... 010 ..... 0001111 @i +{ + [ + # *** RV32 Zicboz Standard Extension *** + cbo_zero 0000000 00100 ..... 010 00000 0001111 @sfence_vm + ] + + # *** RVI128 lq *** + lq ............ ..... 010 ..... 0001111 @i +} sq ............ ..... 100 ..... 0100011 @s addid ............ ..... 000 ..... 1011011 @i sllid 000000 ...... ..... 001 ..... 1011011 @sh6 diff --git a/target/riscv/insn_trans/trans_rvzicbo.c.inc b/target/riscv/insn_trans/trans_rvzicbo.c.inc new file mode 100644 index 0000000000..feabc28342 --- /dev/null +++ b/target/riscv/insn_trans/trans_rvzicbo.c.inc @@ -0,0 +1,30 @@ +/* + * RISC-V translation routines for the RISC-V CBO Extension. + * + * Copyright (c) 2021 Philipp Tomsich, philipp.tomsich@vrull.eu + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2 or later, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#define REQUIRE_ZICBOZ(ctx) do { \ + if (!ctx->cfg_ptr->ext_icboz) { \ + return false; \ + } \ +} while (0) + +static bool trans_cbo_zero(DisasContext *ctx, arg_cbo_zero *a) +{ + REQUIRE_ZICBOZ(ctx); + gen_helper_cbo_zero(cpu_env, cpu_gpr[a->rs1]); + return true; +} diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index 9c0b91c88f..d0217b6a98 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -3,6 +3,7 @@ * * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu * Copyright (c) 2017-2018 SiFive, Inc. + * Copyright (c) 2022 VRULL GmbH * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -123,6 +124,73 @@ target_ulong helper_csrrw_i128(CPURISCVState *env, int csr, return int128_getlo(rv); } + +/* + * check_zicbo_envcfg + * + * Raise virtual exceptions and illegal instruction exceptions for + * Zicbo[mz] instructions based on the settings of [mhs]envcfg as + * specified in section 2.5.1 of the CMO specification. + */ +static void check_zicbo_envcfg(CPURISCVState *env, target_ulong envbits, + uintptr_t ra) +{ +#ifndef CONFIG_USER_ONLY + if ((env->priv < PRV_M) && !get_field(env->menvcfg, envbits)) { + riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, ra); + } + + if (riscv_cpu_virt_enabled(env) && + (((env->priv < PRV_H) && !get_field(env->henvcfg, envbits)) || + ((env->priv < PRV_S) && !get_field(env->senvcfg, envbits)))) { + riscv_raise_exception(env, RISCV_EXCP_VIRT_INSTRUCTION_FAULT, ra); + } + + if ((env->priv < PRV_S) && !get_field(env->senvcfg, envbits)) { + riscv_raise_exception(env, RISCV_EXCP_ILLEGAL_INST, ra); + } +#endif +} + +void helper_cbo_zero(CPURISCVState *env, target_ulong address) +{ + RISCVCPU *cpu = env_archcpu(env); + uint16_t cbozlen = cpu->cfg.cboz_blocksize; + int mmu_idx = cpu_mmu_index(env, false); + uintptr_t ra = GETPC(); + void *mem; + + check_zicbo_envcfg(env, MENVCFG_CBZE, ra); + + /* Mask off low-bits to align-down to the cache-block. */ + address &= ~(cbozlen - 1); + + /* + * cbo.zero requires MMU_DATA_STORE access. Do a probe_write() + * to raise any exceptions, including PMP. + */ + mem = probe_write(env, address, cbozlen, mmu_idx, ra); + + if (likely(mem)) { + memset(mem, 0, cbozlen); + } else { + /* + * This means that we're dealing with an I/O page. Section 4.2 + * of cmobase v1.0.1 says: + * + * "Cache-block zero instructions store zeros independently + * of whether data from the underlying memory locations are + * cacheable." + * + * Write zeros in address + cbozlen regardless of not being + * a RAM page. + */ + for (int i = 0; i < cbozlen; i++) { + cpu_stb_mmuidx_ra(env, address + i, 0, mmu_idx, ra); + } + } +} + #ifndef CONFIG_USER_ONLY target_ulong helper_sret(CPURISCVState *env) diff --git a/target/riscv/translate.c b/target/riscv/translate.c index a8d516ca3e..fa8bd79cef 100644 --- a/target/riscv/translate.c +++ b/target/riscv/translate.c @@ -1105,6 +1105,7 @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc) #include "insn_trans/trans_rvb.c.inc" #include "insn_trans/trans_rvzicond.c.inc" #include "insn_trans/trans_rvzawrs.c.inc" +#include "insn_trans/trans_rvzicbo.c.inc" #include "insn_trans/trans_rvzfh.c.inc" #include "insn_trans/trans_rvk.c.inc" #include "insn_trans/trans_privileged.c.inc" From e05da09b7cfd8dd08c55e77ab2106634f7b06ad9 Mon Sep 17 00:00:00 2001 From: Christoph Muellner Date: Fri, 24 Feb 2023 10:25:35 -0300 Subject: [PATCH 02/22] target/riscv: implement Zicbom extension Zicbom is the Cache-Block Management extension defined in the already ratified RISC-V Base Cache Management Operation (CBO) ISA extension [1]. The extension contains three instructions: cbo.clean, cbo.flush and cbo.inval. All of them must be implemented in the same group as LQ and cbo.zero due to overlapping patterns. All these instructions can throw a Illegal Instruction/Virtual Instruction exception, similar to the existing cbo.zero. The same check_zicbo_envcfg() is used to handle these exceptions. Aside from that, these instructions also need to handle page faults and guest page faults. This is done in a new check_zicbom_access() helper. As with Zicboz, the cache block size for Zicbom is also configurable. Note that the spec determines that Zicbo[mp] and Zicboz can have different cache sizes (Section 2.7 of [1]), so we also include a 'cbom_blocksize' to go along with the existing 'cboz_blocksize'. They are set to the same size, so unless users want to play around with the settings both sizes will be the same. [1] https://github.com/riscv/riscv-CMOs/blob/master/specifications/cmobase-v1.0.1.pdf Reviewed-by: Richard Henderson Reviewed-by: Weiwei Li Co-developed-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Daniel Henrique Barboza Message-ID: <20230224132536.552293-4-dbarboza@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 3 + target/riscv/cpu.h | 2 + target/riscv/helper.h | 2 + target/riscv/insn32.decode | 5 ++ target/riscv/insn_trans/trans_rvzicbo.c.inc | 27 +++++++++ target/riscv/op_helper.c | 67 +++++++++++++++++++++ 6 files changed, 106 insertions(+) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index ab6c127859..3e8f21a47d 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -75,6 +75,7 @@ struct isa_ext_data { static const struct isa_ext_data isa_edata_arr[] = { ISA_EXT_DATA_ENTRY(h, false, PRIV_VERSION_1_12_0, ext_h), ISA_EXT_DATA_ENTRY(v, false, PRIV_VERSION_1_10_0, ext_v), + ISA_EXT_DATA_ENTRY(zicbom, true, PRIV_VERSION_1_12_0, ext_icbom), ISA_EXT_DATA_ENTRY(zicboz, true, PRIV_VERSION_1_12_0, ext_icboz), ISA_EXT_DATA_ENTRY(zicond, true, PRIV_VERSION_1_12_0, ext_zicond), ISA_EXT_DATA_ENTRY(zicsr, true, PRIV_VERSION_1_10_0, ext_icsr), @@ -1168,6 +1169,8 @@ static Property riscv_cpu_extensions[] = { DEFINE_PROP_BOOL("zhinx", RISCVCPU, cfg.ext_zhinx, false), DEFINE_PROP_BOOL("zhinxmin", RISCVCPU, cfg.ext_zhinxmin, false), + DEFINE_PROP_BOOL("zicbom", RISCVCPU, cfg.ext_icbom, true), + DEFINE_PROP_UINT16("cbom_blocksize", RISCVCPU, cfg.cbom_blocksize, 64), DEFINE_PROP_BOOL("zicboz", RISCVCPU, cfg.ext_icboz, true), DEFINE_PROP_UINT16("cboz_blocksize", RISCVCPU, cfg.cboz_blocksize, 64), diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 73c9832fb7..b5b5425b99 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -434,6 +434,7 @@ struct RISCVCPUConfig { bool ext_zkt; bool ext_ifencei; bool ext_icsr; + bool ext_icbom; bool ext_icboz; bool ext_zicond; bool ext_zihintpause; @@ -487,6 +488,7 @@ struct RISCVCPUConfig { char *vext_spec; uint16_t vlen; uint16_t elen; + uint16_t cbom_blocksize; uint16_t cboz_blocksize; bool mmu; bool pmp; diff --git a/target/riscv/helper.h b/target/riscv/helper.h index ce165821b8..37b54e0991 100644 --- a/target/riscv/helper.h +++ b/target/riscv/helper.h @@ -98,6 +98,8 @@ DEF_HELPER_FLAGS_2(fcvt_h_lu, TCG_CALL_NO_RWG, i64, env, tl) DEF_HELPER_FLAGS_2(fclass_h, TCG_CALL_NO_RWG_SE, tl, env, i64) /* Cache-block operations */ +DEF_HELPER_2(cbo_clean_flush, void, env, tl) +DEF_HELPER_2(cbo_inval, void, env, tl) DEF_HELPER_2(cbo_zero, void, env, tl) /* Special functions */ diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index a471adcea0..282e41aa3e 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -181,6 +181,11 @@ sraw 0100000 ..... ..... 101 ..... 0111011 @r ldu ............ ..... 111 ..... 0000011 @i { [ + # *** RV32 Zicbom Standard Extension *** + cbo_clean 0000000 00001 ..... 010 00000 0001111 @sfence_vm + cbo_flush 0000000 00010 ..... 010 00000 0001111 @sfence_vm + cbo_inval 0000000 00000 ..... 010 00000 0001111 @sfence_vm + # *** RV32 Zicboz Standard Extension *** cbo_zero 0000000 00100 ..... 010 00000 0001111 @sfence_vm ] diff --git a/target/riscv/insn_trans/trans_rvzicbo.c.inc b/target/riscv/insn_trans/trans_rvzicbo.c.inc index feabc28342..7df9c30b58 100644 --- a/target/riscv/insn_trans/trans_rvzicbo.c.inc +++ b/target/riscv/insn_trans/trans_rvzicbo.c.inc @@ -16,12 +16,39 @@ * this program. If not, see . */ +#define REQUIRE_ZICBOM(ctx) do { \ + if (!ctx->cfg_ptr->ext_icbom) { \ + return false; \ + } \ +} while (0) + #define REQUIRE_ZICBOZ(ctx) do { \ if (!ctx->cfg_ptr->ext_icboz) { \ return false; \ } \ } while (0) +static bool trans_cbo_clean(DisasContext *ctx, arg_cbo_clean *a) +{ + REQUIRE_ZICBOM(ctx); + gen_helper_cbo_clean_flush(cpu_env, cpu_gpr[a->rs1]); + return true; +} + +static bool trans_cbo_flush(DisasContext *ctx, arg_cbo_flush *a) +{ + REQUIRE_ZICBOM(ctx); + gen_helper_cbo_clean_flush(cpu_env, cpu_gpr[a->rs1]); + return true; +} + +static bool trans_cbo_inval(DisasContext *ctx, arg_cbo_inval *a) +{ + REQUIRE_ZICBOM(ctx); + gen_helper_cbo_inval(cpu_env, cpu_gpr[a->rs1]); + return true; +} + static bool trans_cbo_zero(DisasContext *ctx, arg_cbo_zero *a) { REQUIRE_ZICBOZ(ctx); diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c index d0217b6a98..84ee018f7d 100644 --- a/target/riscv/op_helper.c +++ b/target/riscv/op_helper.c @@ -191,6 +191,73 @@ void helper_cbo_zero(CPURISCVState *env, target_ulong address) } } +/* + * check_zicbom_access + * + * Check access permissions (LOAD, STORE or FETCH as specified in + * section 2.5.2 of the CMO specification) for Zicbom, raising + * either store page-fault (non-virtualized) or store guest-page + * fault (virtualized). + */ +static void check_zicbom_access(CPURISCVState *env, + target_ulong address, + uintptr_t ra) +{ + RISCVCPU *cpu = env_archcpu(env); + int mmu_idx = cpu_mmu_index(env, false); + uint16_t cbomlen = cpu->cfg.cbom_blocksize; + void *phost; + int ret; + + /* Mask off low-bits to align-down to the cache-block. */ + address &= ~(cbomlen - 1); + + /* + * Section 2.5.2 of cmobase v1.0.1: + * + * "A cache-block management instruction is permitted to + * access the specified cache block whenever a load instruction + * or store instruction is permitted to access the corresponding + * physical addresses. If neither a load instruction nor store + * instruction is permitted to access the physical addresses, + * but an instruction fetch is permitted to access the physical + * addresses, whether a cache-block management instruction is + * permitted to access the cache block is UNSPECIFIED." + */ + ret = probe_access_flags(env, address, cbomlen, MMU_DATA_LOAD, + mmu_idx, true, &phost, ra); + if (ret != TLB_INVALID_MASK) { + /* Success: readable */ + return; + } + + /* + * Since not readable, must be writable. On failure, store + * fault/store guest amo fault will be raised by + * riscv_cpu_tlb_fill(). PMP exceptions will be caught + * there as well. + */ + probe_write(env, address, cbomlen, mmu_idx, ra); +} + +void helper_cbo_clean_flush(CPURISCVState *env, target_ulong address) +{ + uintptr_t ra = GETPC(); + check_zicbo_envcfg(env, MENVCFG_CBCFE, ra); + check_zicbom_access(env, address, ra); + + /* We don't emulate the cache-hierarchy, so we're done. */ +} + +void helper_cbo_inval(CPURISCVState *env, target_ulong address) +{ + uintptr_t ra = GETPC(); + check_zicbo_envcfg(env, MENVCFG_CBIE, ra); + check_zicbom_access(env, address, ra); + + /* We don't emulate the cache-hierarchy, so we're done. */ +} + #ifndef CONFIG_USER_ONLY target_ulong helper_sret(CPURISCVState *env) From 59cb29d6a5149871d1acb18fb465879b1af5f3b2 Mon Sep 17 00:00:00 2001 From: Christoph Muellner Date: Fri, 24 Feb 2023 10:25:36 -0300 Subject: [PATCH 03/22] target/riscv: add Zicbop cbo.prefetch{i, r, m} placeholder The cmo.prefetch instructions are nops for QEMU (no emulation of the memory hierarchy, no illegal instructions, no permission faults, no traps). Add a comment noting where they would be decoded in case cbo.prefetch instructions become relevant in the future. Co-developed-by: Philipp Tomsich Signed-off-by: Christoph Muellner Signed-off-by: Daniel Henrique Barboza Reviewed-by: Richard Henderson Reviewed-by: Weiwei Li Message-ID: <20230224132536.552293-5-dbarboza@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- target/riscv/insn32.decode | 1 + 1 file changed, 1 insertion(+) diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode index 282e41aa3e..73d5d1b045 100644 --- a/target/riscv/insn32.decode +++ b/target/riscv/insn32.decode @@ -134,6 +134,7 @@ addi ............ ..... 000 ..... 0010011 @i slti ............ ..... 010 ..... 0010011 @i sltiu ............ ..... 011 ..... 0010011 @i xori ............ ..... 100 ..... 0010011 @i +# cbo.prefetch_{i,r,m} instructions are ori with rd=x0 and not decoded. ori ............ ..... 110 ..... 0010011 @i andi ............ ..... 111 ..... 0010011 @i slli 00000. ...... ..... 001 ..... 0010011 @sh From 007698632814b4b4aeae1a9c176d932951e9c8cf Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Thu, 2 Mar 2023 06:14:06 -0300 Subject: [PATCH 04/22] hw/riscv/virt.c: add cbo[mz]-block-size fdt properties The cbom-block-size fdt property property is used to inform the OS about the blocksize in bytes for the Zicbom cache operations. Linux documents it in Documentation/devicetree/bindings/riscv/cpus.yaml as: riscv,cbom-block-size: $ref: /schemas/types.yaml#/definitions/uint32 description: The blocksize in bytes for the Zicbom cache operations. cboz-block-size has the same role but for the Zicboz extension, i.e. informs the size in bytes for Zicboz cache operations. Linux support for it is under review/approval in [1]. Patch 3 of that series describes cboz-block-size as: riscv,cboz-block-size: $ref: /schemas/types.yaml#/definitions/uint32 description: The blocksize in bytes for the Zicboz cache operations. [1] https://lore.kernel.org/all/20230224162631.405473-1-ajones@ventanamicro.com/ Cc: Andrew Jones Signed-off-by: Anup Patel Signed-off-by: Daniel Henrique Barboza Reviewed-by: Bin Meng Message-ID: <20230302091406.407824-2-dbarboza@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 4f8191860b..7f70fa11a1 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -249,6 +249,17 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, int socket, name = riscv_isa_string(cpu_ptr); qemu_fdt_setprop_string(ms->fdt, cpu_name, "riscv,isa", name); g_free(name); + + if (cpu_ptr->cfg.ext_icbom) { + qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cbom-block-size", + cpu_ptr->cfg.cbom_blocksize); + } + + if (cpu_ptr->cfg.ext_icboz) { + qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cboz-block-size", + cpu_ptr->cfg.cboz_blocksize); + } + qemu_fdt_setprop_string(ms->fdt, cpu_name, "compatible", "riscv"); qemu_fdt_setprop_string(ms->fdt, cpu_name, "status", "okay"); qemu_fdt_setprop_cell(ms->fdt, cpu_name, "reg", From 270629024df1f9f4e704ce8325f958858c5cbff7 Mon Sep 17 00:00:00 2001 From: Ivan Klokov Date: Fri, 17 Feb 2023 18:14:59 +0300 Subject: [PATCH 05/22] disas/riscv Fix ctzw disassemble Due to typo in opcode list, ctzw is disassembled as clzw instruction. Signed-off-by: Ivan Klokov Fixes: 02c1b569a15b ("disas/riscv: Add Zb[abcs] instructions") Reviewed-by: Weiwei Li Reviewed-by: Daniel Henrique Barboza Message-ID: <20230217151459.54649-1-ivan.klokov@syntacore.com> Signed-off-by: Palmer Dabbelt --- disas/riscv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/disas/riscv.c b/disas/riscv.c index ddda687c13..54455aaaa8 100644 --- a/disas/riscv.c +++ b/disas/riscv.c @@ -1645,7 +1645,7 @@ const rv_opcode_data opcode_data[] = { { "max", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 }, { "maxu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 }, { "clzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 }, - { "clzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 }, + { "ctzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 }, { "cpopw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 }, { "slli.uw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 }, { "add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 }, From f1bd6f8ef6a47de7c10c8d94f526cc10b7d25c4d Mon Sep 17 00:00:00 2001 From: Mayuresh Chitale Date: Fri, 3 Mar 2023 12:20:54 +0530 Subject: [PATCH 06/22] target/riscv: cpu: Implement get_arch_id callback Implement the callback for getting the architecture-dependent CPU ID ie mhartid. Signed-off-by: Mayuresh Chitale Signed-off-by: Anup Patel Reviewed-by: Daniel Henrique Barboza Message-ID: <20230303065055.915652-2-mchitale@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 3e8f21a47d..0ad8f94a42 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -1301,6 +1301,13 @@ static const char *riscv_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname) } #ifndef CONFIG_USER_ONLY +static int64_t riscv_get_arch_id(CPUState *cs) +{ + RISCVCPU *cpu = RISCV_CPU(cs); + + return cpu->env.mhartid; +} + #include "hw/core/sysemu-cpu-ops.h" static const struct SysemuCPUOps riscv_sysemu_ops = { @@ -1355,6 +1362,7 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data) cc->disas_set_info = riscv_cpu_disas_set_info; #ifndef CONFIG_USER_ONLY cc->sysemu_ops = &riscv_sysemu_ops; + cc->get_arch_id = riscv_get_arch_id; #endif cc->gdb_arch_name = riscv_gdb_arch_name; cc->gdb_get_dynamic_xml = riscv_gdb_get_dynamic_xml; From 64452a09c5e37853b4f0a777805831fb87fb2c23 Mon Sep 17 00:00:00 2001 From: Mayuresh Chitale Date: Fri, 3 Mar 2023 12:20:55 +0530 Subject: [PATCH 07/22] hw: intc: Use cpu_by_arch_id to fetch CPU state Qemu_get_cpu uses the logical CPU id assigned during init to fetch the CPU state. However APLIC, IMSIC and ACLINT contain registers and states which are specific to physical hart Ids. The hart Ids in any given system might be sparse and hence calls to qemu_get_cpu need to be replaced by cpu_by_arch_id which performs lookup based on the sparse physical hart IDs. Signed-off-by: Mayuresh Chitale Signed-off-by: Anup Patel Reviewed-by: Daniel Henrique Barboza Message-ID: <20230303065055.915652-3-mchitale@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/intc/riscv_aclint.c | 16 ++++++++-------- hw/intc/riscv_aplic.c | 4 ++-- hw/intc/riscv_imsic.c | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/hw/intc/riscv_aclint.c b/hw/intc/riscv_aclint.c index eee04643cb..b466a6abaf 100644 --- a/hw/intc/riscv_aclint.c +++ b/hw/intc/riscv_aclint.c @@ -130,7 +130,7 @@ static uint64_t riscv_aclint_mtimer_read(void *opaque, hwaddr addr, addr < (mtimer->timecmp_base + (mtimer->num_harts << 3))) { size_t hartid = mtimer->hartid_base + ((addr - mtimer->timecmp_base) >> 3); - CPUState *cpu = qemu_get_cpu(hartid); + CPUState *cpu = cpu_by_arch_id(hartid); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; if (!env) { qemu_log_mask(LOG_GUEST_ERROR, @@ -173,7 +173,7 @@ static void riscv_aclint_mtimer_write(void *opaque, hwaddr addr, addr < (mtimer->timecmp_base + (mtimer->num_harts << 3))) { size_t hartid = mtimer->hartid_base + ((addr - mtimer->timecmp_base) >> 3); - CPUState *cpu = qemu_get_cpu(hartid); + CPUState *cpu = cpu_by_arch_id(hartid); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; if (!env) { qemu_log_mask(LOG_GUEST_ERROR, @@ -231,7 +231,7 @@ static void riscv_aclint_mtimer_write(void *opaque, hwaddr addr, /* Check if timer interrupt is triggered for each hart. */ for (i = 0; i < mtimer->num_harts; i++) { - CPUState *cpu = qemu_get_cpu(mtimer->hartid_base + i); + CPUState *cpu = cpu_by_arch_id(mtimer->hartid_base + i); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; if (!env) { continue; @@ -292,7 +292,7 @@ static void riscv_aclint_mtimer_realize(DeviceState *dev, Error **errp) s->timecmp = g_new0(uint64_t, s->num_harts); /* Claim timer interrupt bits */ for (i = 0; i < s->num_harts; i++) { - RISCVCPU *cpu = RISCV_CPU(qemu_get_cpu(s->hartid_base + i)); + RISCVCPU *cpu = RISCV_CPU(cpu_by_arch_id(s->hartid_base + i)); if (riscv_cpu_claim_interrupts(cpu, MIP_MTIP) < 0) { error_report("MTIP already claimed"); exit(1); @@ -372,7 +372,7 @@ DeviceState *riscv_aclint_mtimer_create(hwaddr addr, hwaddr size, sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr); for (i = 0; i < num_harts; i++) { - CPUState *cpu = qemu_get_cpu(hartid_base + i); + CPUState *cpu = cpu_by_arch_id(hartid_base + i); RISCVCPU *rvcpu = RISCV_CPU(cpu); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; riscv_aclint_mtimer_callback *cb = @@ -407,7 +407,7 @@ static uint64_t riscv_aclint_swi_read(void *opaque, hwaddr addr, if (addr < (swi->num_harts << 2)) { size_t hartid = swi->hartid_base + (addr >> 2); - CPUState *cpu = qemu_get_cpu(hartid); + CPUState *cpu = cpu_by_arch_id(hartid); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; if (!env) { qemu_log_mask(LOG_GUEST_ERROR, @@ -430,7 +430,7 @@ static void riscv_aclint_swi_write(void *opaque, hwaddr addr, uint64_t value, if (addr < (swi->num_harts << 2)) { size_t hartid = swi->hartid_base + (addr >> 2); - CPUState *cpu = qemu_get_cpu(hartid); + CPUState *cpu = cpu_by_arch_id(hartid); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; if (!env) { qemu_log_mask(LOG_GUEST_ERROR, @@ -545,7 +545,7 @@ DeviceState *riscv_aclint_swi_create(hwaddr addr, uint32_t hartid_base, sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr); for (i = 0; i < num_harts; i++) { - CPUState *cpu = qemu_get_cpu(hartid_base + i); + CPUState *cpu = cpu_by_arch_id(hartid_base + i); RISCVCPU *rvcpu = RISCV_CPU(cpu); qdev_connect_gpio_out(dev, i, diff --git a/hw/intc/riscv_aplic.c b/hw/intc/riscv_aplic.c index cfd007e629..cd7efc4ad4 100644 --- a/hw/intc/riscv_aplic.c +++ b/hw/intc/riscv_aplic.c @@ -833,7 +833,7 @@ static void riscv_aplic_realize(DeviceState *dev, Error **errp) /* Claim the CPU interrupt to be triggered by this APLIC */ for (i = 0; i < aplic->num_harts; i++) { - RISCVCPU *cpu = RISCV_CPU(qemu_get_cpu(aplic->hartid_base + i)); + RISCVCPU *cpu = RISCV_CPU(cpu_by_arch_id(aplic->hartid_base + i)); if (riscv_cpu_claim_interrupts(cpu, (aplic->mmode) ? MIP_MEIP : MIP_SEIP) < 0) { error_report("%s already claimed", @@ -966,7 +966,7 @@ DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size, if (!msimode) { for (i = 0; i < num_harts; i++) { - CPUState *cpu = qemu_get_cpu(hartid_base + i); + CPUState *cpu = cpu_by_arch_id(hartid_base + i); qdev_connect_gpio_out_named(dev, NULL, i, qdev_get_gpio_in(DEVICE(cpu), diff --git a/hw/intc/riscv_imsic.c b/hw/intc/riscv_imsic.c index 4d4d5b50ca..fea3385b51 100644 --- a/hw/intc/riscv_imsic.c +++ b/hw/intc/riscv_imsic.c @@ -316,8 +316,8 @@ static const MemoryRegionOps riscv_imsic_ops = { static void riscv_imsic_realize(DeviceState *dev, Error **errp) { RISCVIMSICState *imsic = RISCV_IMSIC(dev); - RISCVCPU *rcpu = RISCV_CPU(qemu_get_cpu(imsic->hartid)); - CPUState *cpu = qemu_get_cpu(imsic->hartid); + RISCVCPU *rcpu = RISCV_CPU(cpu_by_arch_id(imsic->hartid)); + CPUState *cpu = cpu_by_arch_id(imsic->hartid); CPURISCVState *env = cpu ? cpu->env_ptr : NULL; imsic->num_eistate = imsic->num_pages * imsic->num_irqs; @@ -413,7 +413,7 @@ DeviceState *riscv_imsic_create(hwaddr addr, uint32_t hartid, bool mmode, uint32_t num_pages, uint32_t num_ids) { DeviceState *dev = qdev_new(TYPE_RISCV_IMSIC); - CPUState *cpu = qemu_get_cpu(hartid); + CPUState *cpu = cpu_by_arch_id(hartid); uint32_t i; assert(!(addr & (IMSIC_MMIO_PAGE_SZ - 1))); From 7bc1286b81d4e8380b3083beed1771c67ce87af3 Mon Sep 17 00:00:00 2001 From: Palmer Dabbelt Date: Fri, 3 Mar 2023 12:24:47 -0800 Subject: [PATCH 08/22] gitlab/opensbi: Move to docker:stable The OpenSBI build has been using docker:19.03.1, which appears to be old enough that v2 of the manifest is no longer supported. Something has started serving us those manifests, resulting in errors along the lines of $ docker build --cache-from $IMAGE_TAG --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $IMAGE_TAG .gitlab-ci.d/opensbi Step 1/7 : FROM ubuntu:18.04 18.04: Pulling from library/ubuntu mediaType in manifest should be 'application/vnd.docker.distribution.manifest.v2+json' not 'application/vnd.oci.image.manifest.v1+json' This moves to docker:stable, as was suggested by the template. It also adds the python3 package via apt, as OpenSBI requires that to build. Reviewed-by: Bin Meng Message-ID: <20230303202448.11911-2-palmer@rivosinc.com> Signed-off-by: Palmer Dabbelt --- .gitlab-ci.d/opensbi.yml | 4 ++-- .gitlab-ci.d/opensbi/Dockerfile | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.d/opensbi.yml b/.gitlab-ci.d/opensbi.yml index 04ed5a3ea1..9a651465d8 100644 --- a/.gitlab-ci.d/opensbi.yml +++ b/.gitlab-ci.d/opensbi.yml @@ -42,9 +42,9 @@ docker-opensbi: extends: .opensbi_job_rules stage: containers - image: docker:19.03.1 + image: docker:stable services: - - docker:19.03.1-dind + - docker:stable-dind variables: GIT_DEPTH: 3 IMAGE_TAG: $CI_REGISTRY_IMAGE:opensbi-cross-build diff --git a/.gitlab-ci.d/opensbi/Dockerfile b/.gitlab-ci.d/opensbi/Dockerfile index 4ba8a4de86..5ccf4151f4 100644 --- a/.gitlab-ci.d/opensbi/Dockerfile +++ b/.gitlab-ci.d/opensbi/Dockerfile @@ -15,6 +15,7 @@ RUN apt update \ ca-certificates \ git \ make \ + python3 \ wget \ && \ \ From 7c7173679fbe636ad16960b93c5985141d8fa233 Mon Sep 17 00:00:00 2001 From: Bin Meng Date: Fri, 3 Mar 2023 12:24:48 -0800 Subject: [PATCH 09/22] roms/opensbi: Upgrade from v1.1 to v1.2 Upgrade OpenSBI from v1.1 to v1.2 and the pre-built bios images. The v1.2 release includes the following commits: 994c8cf lib: sbi_timer: Added a conditional wait function which can timeout caa5eea lib: sbi: add check for ipi device for hsm start 0374ccf lib: sbi_hart: Shorten the code to set MPV bit 4e21cca lib: utils/serial: Update Shakti UART based on latest implementation 88b790f lib: sbi: Fix sbi_snprintf 1545afd lib: sbi: Fix counter index sanity check 83db3af lib: sbi: Add the bound check for events during config match 860a376 lib: sbi: Fix possible buffer overrun in counter validation 11c0008 lib: sbi: Fix fw_event_map initialization 8e86b23 lib: utils/fdt: Factor out common uart node code 7d28d3b lib: utils/serial: Initialize platform_uart_data to zero 7198e1d lib: serial: Clean up coding style in sifive-uart.c f272035 lib: utils/serial: Ensure baudrate is non-zero before using b9edf49 lib: sbi: Fix printf handling of long long 422f0e0 scripts: Add Kconfiglib v14.1.0 under scripts directory 662e631 Makefile: Add initial kconfig support for each platform de80e93 Makefile: Compile lib/utils sources separately for each platform 26bbff5 lib: utils/serial: Use kconfig for enabling/disabling drivers 2adc94b lib: utils/reset: Use kconfig for enabling/disabling drivers 3e76a60 lib: utils/sys: Use kconfig for enabling/disabling drivers 013dbb3 lib: utils/timer: Use kconfig for enabling/disabling drivers 76af9d4 lib: utils/ipi: Use kconfig for enabling/disabling drivers 0b1cf2f lib: utils/irqchip: Use kconfig for enabling/disabling drivers b126ce4 lib: utils/i2c: Use kconfig for enabling/disabling drivers 5616aa4 lib: utils/gpio: Use kconfig for enabling/disabling drivers 68d7b85 lib: utils/fdt: Use kconfig for enabling/disabling d514a8f platform: generic: Use kconfig for enabling/disabling overrides bc317a3 platform: generic: Use kconfig to set platform version and default name eccb9df platform: Remove redundant config.mk from all platforms 0723bab docs: Update documentation for kconfig support a6a8557 Makefile: Fix typo related to object.mk 9529e36 include: Add mstatus[h].GVA encodings 1fbe777 lib: sbi_trap: Save mstatus[h].GVA in trap->gva 1c4ce74 lib: sbi: Set gva when creating sbi_trap_info 5a0ca09 lib: sbi_trap: Set hypervisor CSRs for HS-mode a69eb6c lib: sbi_trap: Set hstatus.GVA when going to HS-mode 111afc1 lib: sbi_illegal_insn: Fix FENCE.TSO emulation infinite trap loop adf44b5 lib: sbi: Use the official extension name for AIA M-mode CSRs cbaa9b0 lib: utils: serial: Add Cadence UART driver 622cc5f include: Remove sideleg and sedeleg a90cf6b lib: sbi_pmu: Remove "event_idx" member from struct sbi_pmu_fw_event 1664d0e lib: sbi_pmu: Replace sbi_pmu_ctr_read() with sbi_pmu_ctr_fw_read() e238459 lib: sbi_pmu: Firmware counters are always 64 bits wide c9b388d lib: sbi_pmu: Simplify FW counters to reduce memory usage d10c1f4 lib: sbi_pmu: Add custom PMU device operations ee69f8e lib: sbi: Print platform PMU device at boot-time 5019fd1 include: sbi: Reduce includes in sbi_pmu.h d32b0a9 docs: pmu: fix Unmatched example typo 19664f6 docs: pmu: extend bindings example for Unmatched 37a0d83 lib: sbi_trap: Add helper to get GVA in sbi_trap_regs 46e744a lib: sbi_misaligned_ldst: Set GVA if not emulating 8ce486a lib: utils/fdt: Fix DT parsing in fdt_pmu_setup() 49372f2 lib: sbi: Fix sbi_strnlen wrong count decrement 7f09fba lib: utils/serial: add semihosting support 7105c18 docs/firmware: Update FW_JUMP documentation 3f3d401 docs: Fix some typos e54cb32 lib: sbi_pmu: move pmu irq information into pmu itself c316fa3 lib: sbi_hart: move hart_features struct to a public location 4f2acb5 lib: sbi_platform: expose hart_features to extension_init callback 2f63f24 platform: generic: add extensions_init handler and platform-override b6e520b platform: generic: allwinner: add support for c9xx pmu 98aa127 include: sbi: Fix typo in comment 11d14ae lib: sbi: Fix typo in comment 60b78fe include: sbi: Fix grammar in comment dcdaf30 lib: sbi: Add sbi_domain_root_add_memrange() API bd7ef41 platform: andes/ae350: Remove enabling cache from an350_final_init 9899b59 platform: andes/ae350: Use kconfig to set platform version and default name 88f58a3 platform: andes/ae350: Use fdt serial driver ef9f02e lib: utils/timer: Add Andes fdt timer support 8234fc1 lib: utils/reset: Add Andes fdt reset driver support 127a3f2 platform: andes/ae350: Use fdt irqchip driver 6f3258e platform: andes/ae350: Add fw_platform_init for platform initialization ce7c490 lib: utils/ipi: Add Andes fdt ipi driver support c8683c5 platform: andes/ae350: Add AE350 domain support d682a0a docs: andes-ae350.md: Update ae350 documentation for fdt driver support 0fee0bf Makefile: Add cscope support 51acd49 docs/firmware: update the document 9d54f43 Makefile: Add rules for carray sources in lib/sbi 56bed1a lib: sbi_ecall: Generate extensions list with carray 22f38ee lib: sbi_ecall: Add Kconfig option for each extension 85cf56c lib: utils/fdt: Remove redundant code 21ba418 lib: utils/fdt: Simplified code 8e9966c docs: fix some typos 7b29264 lib: utils/serial: Fix semihosting compile error using LLVM 14f5c4c lib: sbi_ecall: Split up sbi_ecall_replace 8e63716 firmware: payloads: Optimize usage of "ALIGN" 1b0d71b platform: generic/allwinner: Remove unused header files 9a740f5 platform: generic/allwinner: Remove ghostly type cast ba32021 Makefile: replace `echo` with `printf` for compatibility 49b0e35 Makefile: bugfix for handling platform paths 74e2029 lib: sbi: Simplified mmio match checking fc82e84 lib: sbi: Fix is_region_valid() f8eec91 lib: simplify fdt_parse_plmt_node() cc54184 lib: simplify fdt_parse_plicsw_node() e9bc7f1 lib: fix fdt_parse_plmt_node() 5daa0ef lib: fix fdt_parse_plicsw_node() 1f6866e lib: simplify fdt_translate_address() ad2ac29 lib: fix fdt_parse_aclint_node() cfbabb9 firmware: Minor optimization for relocate a36d455 platform: generic/andes: Enable generic platform support for AE350 6cd4b9b docs: platform: Update AE350 and generic platform documentation d3fcff7 docs: andes-ae350.md: fix watchdog nodename in dts example 4640d04 scripts/create-binary-archive.sh: remove andes/ae350 build directory e977512 lib: utils: Add fdt_fixup_node() helper function e1a0cb0 gitignore: add vim swap files ed8b8f5 platform: generic: Make use of fdt_match_node() 8b00be6 lib: fix is_region_valid() c2be214 lib: fix __fdt_parse_region() 7b08778 lib: fix irqchip_plic_update_hartid_table cb568b9 lib: sbi: Synchronize PMP settings with virtual memory system 506928a scripts: use env to invoke bash 64e8b9f lib: utils: serial: Add Renesas SCIF driver 0021b43 lib: utils: serial: Add FDT driver for Renesas SCIF 6840902 lib: utils/irqchip: Add compatible string for Andestech NCEPLIC100 8b1617d platform: generic: Add Renesas RZ/Five initial support 7a3354a docs: platform: Add documentation for Renesas RZ/Five SoC 34da663 lib: utils/irqchip: plic: Fix the off-by-one error in priority save/restore helpers 8509e46 lib: utils/irqchip: plic: Ensure no out-of-bound access in priority save/restore helpers 91c8a7d lib: utils/irqchip: plic: Fix the off-by-one error in plic_context_init() fabbc00 lib: utils/irqchip: plic: Fix the off-by-one error in context save/restore helpers 9a2eeb4 lib: utils/irqchip: plic: Ensure no out-of-bound access in context save/restore helpers a8ee82c lib: utils/ipi: mswi: add T-Head C9xx CLINT compatible ca7810a lib: utils/timer: mtimer: add a quirk for lacking mtime register b848d87 lib: utils/timer: mtimer: add T-Head C9xx CLINT compatible 391ec85 docs: pmu: fix binding example 0412460 docs: pmu: update a reference to a deprecated property name d5d12a9 docs: pmu: Update the pmu doc with removal of mcountinhbit restriction 6b5188c include: Bump-up version to 1.2 Signed-off-by: Bin Meng Reviewed-by: Alistair Francis Message-id: <20230207044003.3669059-1-bmeng@tinylab.org> Signed-off-by: Alistair Francis Message-ID: <20230303202448.11911-3-palmer@rivosinc.com> Signed-off-by: Palmer Dabbelt --- .../opensbi-riscv32-generic-fw_dynamic.bin | Bin 117704 -> 123072 bytes .../opensbi-riscv64-generic-fw_dynamic.bin | Bin 115344 -> 121800 bytes roms/opensbi | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pc-bios/opensbi-riscv32-generic-fw_dynamic.bin b/pc-bios/opensbi-riscv32-generic-fw_dynamic.bin index 81bab1adc97bbe9b376f3bfe4da98cdfcf3ade7a..6a8425885c7dd0263391637b665c83d04684c68a 100644 GIT binary patch delta 72144 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 z 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

PP;pYEKS&Ae79&Dg={v zV*$xCuX1O2FR+0J)Qd`v{J>^=RA%zSJ-$p&T_+ptRnc?%15)%}z<>p6NX!E^)01kg zFhkgWpK3kg{9eESR9^j=+_X1=E%o{P0Q=9A72Zg2L5?4Nf1&^4WPyE>?4KDKgqfM` zHXH1l$XIWX{|ZzhLed|oLSEOtsl%*Yt0VacD@*c8HU>ubR0U8q2bn2qblGewz_^+1 zfkST}qq{MifTL6EzSc;EpMOAVHk&VC*vz`YVUo+-USrk;4xplcvni>m@R)$sW2R-zr9!%Zbal+xR=w`7K49qLs z8Q%6yWH%0%U<~b7UibXpW6`gZOAoYh&*0!lp2nt-EW@lYneAX){mcU$2hJP--G23O z|Mc$+49&~kmH&!^j;E76%yHP~uwCoE*4q6OeHuM`y(W4KbGQ6T7GakW=5+Z9+K=~F zQjqiM{a*KpKAYRk9XI#bID)QA>|%cezKX-H{iFC}nK%CyrZajafB3=F#=*+<_}!0x zUadiGn_I0JciINkw_R%$X7y&6Xv?hZ&CsmZ%`ka}HbWQB!Bk^DNyfA}ULB17w`Tkm zWme~4Xjb=NU{>p3NM?S_2Rbv__-Z=S=I`lDpdGq_{hQgYGAE~B=Q-ANtgWcM(RqTC zjB}y5G22n5ZT%m`CiZV`FLyBhww>W%^JexB4grTZf8NgUST6qdAJAd!V9D>>!7ZtS z%~xM5E39E)}4J{;?l)ShnH*Ywe&oY1|8IHwd%0{CoeQ{vxw#%jV|8 z9E|cs%b8ZSbGm~T_<=@i9o;vZe`gS$s?H$H>dIu~GI_%hW7)dz47gQnW;>d|$Z0n{ zIpaIS=IzfW=O4=#QDWcxoSpGz|GMeM+qW|$A7SMPd_4KXv3d1IT{4FR-Bxw3>ryq> zJt*TC8m_GHied7#c81B{zVQpsY-a@BCVhzQVY6}OO>n=&IP)jNWbt+e5WUoWa*G#3 z@>6wY@#_qr>xaTYxA=f2uE3L4?yL-F4=-zFb@OX|Y1+z?`cu_YaD|{7=tO{A+tQo8 zEFUdqC@aijfQ;&F@&xSy_iA+l->5F=2D*MM(6;ibh-33{Pe$ewk&KhCwlOrHsAOb5 znmO6=gt__VmS+sf8Q&P@x+i~q&M>!Y;-QHw#%&>vd%^oYL9H@nwJraW53({%{%*?9 z`5rXv^wP9-^1~CNlaHK`VoaQT|Ac%ZXre9%e)~A+Y}{3yMxDurSh+yDjy@J^1WPzZt!W;E)2|Ka?vWG_~(=Ho{gnvY#!U_SPRf%*6ohDYp& z*sk_p>{nvH*?(?&@{i>llf}+x)-zn^*v|Gze{!3eV6y0S9%EJm$K)HFEX>DQn3|7@ zFfpGnVQN06!j!~*h}E~>IGvpl+OQ0XHiG{2L=rCbM!fu=avn21+AN zo}0kOUxBv27ly*z43cSdL6&2Ae2DYk`&si%YGtAQghX$tPIYg4#d_7u+;n)f+mw_N=a*rY+}D z&=gE^<1aRl%=-`X*RN_x_Ge{)nYe%EV}{b-AQO`%Q<;8lt=ZY{+8?u3xVEuZBDp;rf*d zs&BweVMe#LlkLwbbN63N_Gaa})auu|c607Ibw z^0V{SyrtinlG`~MK(}GpFP*G+K}KaV>jx$fH-5d~(a9{L43DRC{<*k6G&H$|lR zybG%5AA6erHRds8eD5%STjj@QcOC}6w#lpvEK#jfAFH*325Z6Ria);0{;xLl?DqE# z_S-;rDg=IIcIRPuEd2e4S}Q0kLC(JLIsrNM#i(^t%ev0@4)-UoYEx@F*Xq^EJK6i9 zd_8DQ#`_QcA6B&_yRtG(<~s71*K4Wgveq!L>-g^`bGd?I_U}aZWPVddNX)`I8=(6U z)u0`Y$H!RyT@ASlzYY)7(Fr;eb_!yC{#zX88(b&Rg2{@PbcNm;fSMhkW`^XUo8dBt z7+ohPU9#hlJbW`;<}jn{RnfffOdB~T|Ey$4?&M^;;V{=#xRr%* z@`oSFnoqtm2)7<#0L9!S_}!MEg&xUmT%ZY#zsd`KF)+Fw-9CBNRT(Dzvy*pRHF7yx zq1QQ?^T^-#4*n-swfVJ+9|Lzs%R!A&R%6Mdpk3mEpd*VLp0S7@1^Gv{?7c((F@##R z(#d+)+SK?LuWA8h^yK3#41)HLzpnhZs`Kjhzv0Q#zc4^DwiRQe%j8?vjF|f8PUgF= zz?00%#n8&BtN<3bx~?PQnxNOYsq?+V`i)v`(~p8eOErFS)pZZ4{57jOA(lUleDBb| z8YayeIr+|Yi~6uzpt-TE3!u3&(7hH(SJE!!oonFG>R#7n)VZzu{e%Bow0e`>SQ%Q~ zlMk0Om&PK_qX%6v2b%a&ikTGi$v3N&DHe2IpRx|iujDgaT#W9FUW~qtE|WPwFiqw; z@>`gv<#%$VJL_MO&FnK7nvZ|~|9G}}{r_62#}e-UU$v&SMS+gR`M9dp_9U~~k>8tn zr!gcStz}MbU&Z>WH3=;1-=x(G>W?L#T?HBu`2E=1{r6*sSN~3KH)fs5@ZN!c!)ErK zjFVer8I&8$8Ckh5g2IsfE7QmD$6{Zo+1!!RCq7CS_SCFyE?dFW{AH?6C%y!#U*g*cvs?Nz= zq72FLD;aoKymweXX|msK8K(2SlXGrc3LDhFUDYPce&jEtuzmj_|J&ppx8<1){=b=g z>$ZQrf&EiddHr{~2UoR(wZ1o)|Cm|x$X{VDQ3kb{$zN4i8$A^lv~nhYP+{H7I@3X| z^}T`o6VQo^%6eb^sI~5!lAJM<>G1^j|6u>@A;u6ug$siO+cm9Da2?ULt<$ROy+QnKnDefIg87606WyaAXRT_{nwgxT z$~bdDat9~NU&-YED$Fov?Y{+b*0MH`!}d*iTrl$=C>u|fyDOvon3e0_-*9DxUkpdL zKW5wAw;o<(rTwH%Zqh28Khm#ZUifb)p1ZQ)D`xhYALy8&c7mIt1q5N_JpngGD;H72(dx0!psaPl7IJ<@{M2t+@iEMbudIB}|?C+Ep#d z&a6zJ#4#UKTD66>gNmp3AJ$JczGotS6Eso!5`3#}a_|Qx5MP*6({pm&JvTAKm(y>7 zChuQ4gRa<}eua@?a!ZQyQ!35A9TX%rLM;({(b^k-^wG%^Z3D^ zU#y^}5BOvv$dEPUp62CdGR}M5lHYz~auifMG z%C6QXbNIc&hkVJ0YOPN-LDeo~L_nC;;9wJYHDA&hP$$9bhK=7fSWhACR0D(f8_-#V zJtm-KoqOGrpSlZAW^dp$=K94n{W)kjOWhb$i`mTzYJ0D6!D@2Q0|U;sOQ3ei`w#h( zyB|bJ&j)3`#|K&ey#Mfj!YXis;PX_~y}7Eza(__kdxipz$!-sw zK?7Tp+uOHIp72nl-T*v$;mFw309uF_bpurX!)`W;y9TNSvMzw?0rB6A48q*ro0`?R z6Kvg+^S_G;Pd8_n{tFbxT7tV~wX$#O3~K|8XelfFPIzx{fM2UCS%#IbdATRU%)?== zP1D0#-!n{*)#}Q9$gIwt&8NC`)oTT?VjJZsyCULRS4AZ<#kW4`!3Mg z3|jxj=sB6Y<+m`;2Xwt_xo;Sh7lb(`_b+GWV~?6XIZVD7iz%tE;h62%&P1T`&w&tL5T_!QINqX1`brU>QnKlUDr`>)?TdP z@Nu%Z1jDN7TpZ$GL6fRaCw8%~n(j2U$C+7`)nQYcTbnP2HS0RC>2&Qw*ZETw$$`f} zcO^S~g!sR`n~QzdX5}a9j5?jEwGoqBSwDb=$U7V+UkhjGVl!sn%3wBKS%IDLf=es= z9g7*da zyNkmPm`a{P z?%zTA?D%@fYV(`NXE=KvhlTM8?^btK*5r@NSy(+L-w0=z+`+*k{Ovnq@}K1_lUv!D zCiXVE$@WPuNbdQ{GEnmX zf4$t_=mzJ%T>j%F_V4m$e#S-Dck0@?F?~$#r}FEKf1vtT=tE5GTR5{WSMI$A-*e5 zwYqJd{*B?U_~vQP7&cGe&d{2=c`7U8X0{6sptBd5HCh>k*;^U^iVCx~a{ld$aR!Z^ zO+3x{PR3c0eY5)yhOhlIpFb9zT=r7M&(>b6OY{dp z?(F0g=5+ac#^F?(IU7U6%#$4s3t8S5JA$A+}!pRT$nc>V`Ffd4oW^Ehargt zvQ_~Sa50Wkn_JnFi@!7MYHvLbD*T0Klrk7iH|99u(3v6Qcx?Ki>6@lQ7D>n)5@dTU ze*B+=E-8U8F}4oTkGVBuicrR3&9rFU1wmJ+|JIA zw6N|D14Hu~9Y3Unb+;K9npbywBQ31E#lSGRYZa&XU(gw}Z&zb1tP^wWLCb2-uu=b^s-@H*_QplJr^j3+;w=H88-v;V=J!94CRMunprmVyA?Y%&P z!{kkG4eD1LzJHMaeO1>)72cD~YTOK-r$ij5Uk8nWvujB%NNzg90Xi6RBKzan&;IQ_ zb;oJ#Y0w~9)AUs>nft*_y9f4%S9OC1DOR;kW^?%tv5M_4s1@!1&h#K?>6Z8%P#cCv zwb4hIx8Y#x>1JIXhI_4Et<1}KLGu?0nycEv+CTzR4>d3EWte%sX?imEQpU)?VXd`F zre7zs6dbhOzN$rcyRz1j?;r!gZIgF@et~2J_kRsx+&_8EyBAupkcWjkXFDj|Tiuf% zOy}6t$>=_rt>rJH+k1fqcLw`Lz*#L@8*PCg=!*z@`>Pw{@M&t5`rMah}rZ z>~MImaQ>TC+o{%|*7pkQKTZDf(V)J8fmw$gw8HagyWplS(DjSkI;Xz|9r5fPeya@< zfofZ>wKgx|X0Yni>U#e`e_`cW(9qIC_hjksJd@cE@N91T!W7{+Swx26(Ui%d?F^H@ ze&wGm-p+W4RXB{D@oax$vvAor{w|hnQ*QPPi?=b{n{u-sYPKZXvvt>6gIebtdH-Pj z?8t*4gD1Kt%YSE^yy26!>5Hcdx7_!!vI(7W5`cFjBly3P_Y1hWZrLFzw&a%#BY!5}v}8zb=H%+*Ts3q0ZU%!5(dh&^{M)j`_fbST&aPHitGuKYtI&tsVqa)7_ z<=tzL5Pu6Q(tOpKb$A)(x-07(`H}ph-Ep#v4a4U49!KGs?hK4>lf``)AXBSc-FCC| zx>vO*YpMKvf8qXwRjtq_%S2&TPtZC3EOt}hE94*9%&yBgneE80#og>h%4^&Miy@(; z)_SW|tyNipi$Ph5i$Ph1i$Ph9i$PiM%8&OK=Dz}Mk?3p&EwYb2c=fPWXCtTy`>S)o zdjU}6?Om%{>%Feznd}bl89vlcKKCt*r+@3JUQpZhUF+j(lMTL0M6mhhwSI~PUo67a z@(Y|E+5a$!zXTPwn!>_t2Y4D?l~q`N+0FE7eXroZALPYJ?60OzX9MNiXWPQs!0ub8 zUOd%!Rd3*5Xn{9v@`~@e_0NB*fi?lWSIFND>JdEzU54}XZ@Bm}P#JnGAFLC!m*Rr` zRY6et`PJ*5eEhjuvwF+VInK$w>8i}?Ex#Z(Hme=^`D!{u=d&EJ&IQj)-d~u15u$Uh zd-9>@3Lu?~?sJ@zr=~N0RySfWnc`x>!uquEw^|~kDel9n?ftyjKKDp$l97w*^ z-MF*IQHV2ZW}_QKzgohrR%NxHC7_$6_fH1R(M~S~jhj7HQfpP#_*wG)!v77cdLR3+ z-dokGtike2tyNizZB}pj1>!w^|MSm#hJxT#?I14&fmOV`{{Djfu2t=7tv8Q@ zJdu3mHOCxhPX^8Pwz5xVW%+H)dYwU8;V;Acg!_wD^}gNt zHTLe#$rFC4aR1$0tnTm;lsaN3_y1B0xiJ5qR_9}H)@z`C)_aBtPLEkxufcqD!DHiY zSkykAoPHm)h~|d-N3hr&=j8TuMv#APx9;m*xDzBd$6HzD%P-5xoWJEW*keJhZb*Q) zvM{e=XLx^M|DdKSsr=n)0W$6JY1SXm%+(~!#_|`GL|Fbj zovirBz)bP6AM3Ykt>WMQ{}*O^mWHaG6QcbX>!<18{{Nrc#umxwrq&v0p*gwpk97Ug zx1bXE{qJN4R*t{n%35Fk6l*zr1a<7+ANUU{cfDCzCWDqktpJy<2kOtRYDsovWr5BE zF-;s7_d#{yaPi z==bkjLDOe{WZjbkzH=G6Z@&JV3AD5Ep&_8)BJN)}~R04+r^vjzu) z@H9~d0ljI$(>)lt*dRka>DH5b{!ght`t8_MWrZCKFmu^{Ld<=CC7F>`0A#PPdveTo zzCf^#R<$sCf_yc@Wr7FudKQK|4$Lc#FiZ~ZXP6w;&M-NyjX^lBgF*N*wCVEg8~@~g z|M-RL{_%tTE7`_4S)hY)vT#4+A=b%3{EU<9<=Yt#u}zLC`}|L2FvJ^~Wc^B5U_N%wDF)$R*vI{ZBO zf7Q(7VpHye-YXZpzwmx~GZSM0BEoA=iRlI&$sMtpjoQlJ2D4%DRzvtwA7} znNs?UY)=04T%k*ZebsbO8z8xlOKe|j zqYISv$+Gnx0uZ-~(fs#?9t(F=qiya!rZ-N`PjLhqo7OKlfe`~v@! z(vzSus^stwe5*Pb-5On+mvb;|>SJXCMKL%^r-9-MwBlm(vowZ>&7gJQcl$uAE%cfv za%_J3jp4EQ*+0Vax(xMIQ?>dS-5TAQ)%h6qb!_UN9MleuT2KRbau_?~A*RIU&CkQZ z%Q$ZK3r}xj5aher&&u|A#=pN+Q0{VcFEp9X}k-&DgwsD#PYZamIBm$_r*OC@->NgoMKSlUkk4OSl-CS9&o# z4q|F#fIZ*={*y)^RV{^TiX438f?{UW{;G_b+C;C;aQ%a3R9e2d*L z%-L|zcmLzxTRvRfo_v5+0JP4}3w(GrY(Tex!KgF!(5kM&v)fvBbxvku`76v0>WJxe z@fs()u<|ggv;1vVclmp>|Ll3t;?!ofBietj_TN1Y>Y6AkykxiqjqGK!E`fGuACUh9 zO83d3ADCnh$~aEvVqsLMzuTj%G!w2eZ8}8d{kLG15g(XDkIFd0mflQ8T6(kjC1mN% z=9iGAHy~PB#gdWH6?T;NrbwlzNl{GEpdC)atPKZ22YfUfY-#{?FF;dIYNsZ%9SQ#@ zJ`GfBq*c5>F#j3v!Bs7gkb2txUci5gR@?NYptcihKWN?Q`Sp@dArr=|uApgTh{~hA z?*-O_W+%ZapZ0)M>aU&N#Kvgo2`;_eI#;#4KOlc^Rc9oq{Qi6JI7DM>$9sW%(7YvB zj1yY%=pESLL zozaAef70}Q?2IM~PqjgI+3!kr1E~N_u0c#vD+RS1{-2mG#KGuS4;roj?cyj*7iMQy zXmm?81Px4ph9wX(+n;@91<6isV-rZkCjadh6I7mKDHeHbYg6N5Fhw52|(9>oPk^A2?U4x&|LFlz<-sM3$!MMS)Juiv%1Tl zoBb2dH>*T%TkB&Y&{OVxd z{RT;+&SVxgn^m33jI1_#UBYY*0*$U-t?wE3pA=?i`81iWNk=_UiH0EQ*{Ws+ds2l^j1tGj$m z4rBZ{Rs z$?Tpi!t9;`$_v;*dv_U>m#{NzWPd#K`9GLGHDQQ8{+p|M6OS@$yL?>hp8O%57j#?! zqpx72cdw75PxCTghRGtb44d1ROy?G2ROUW4J+%MFVdiDM4A-Vx3NdQ>LJF}oPKaUt z7eMRCTs|hh`NOigeFE;5i`ZF|m$0)aFJouvGoGsx>!z4`EjI| zo0T{DDoE_HRPXflLX3(Qoz2QxUp_D|<7EKV_=2pDd9VFqWq<7b{h#N4;Rp?e$)GHy z#qyESbuBncu_9$D@yD~oL0L-UCxdW=goCmQC*$6|GLC-J_X{&B*T+wJ?8f?KGE2)R zP$A;iy3$4zv{Uzj{&&%z&FU?mK&8>+PWDHv?#fy(8JN|Nd}>y2`K+u1VzYc!)&tQl zpOuwfGR3+lSAG{*D6XvVlc`yqba2DmDAJKIUV+(X8h3k=Olk<@Fmd<@NQgkNsJnK-}AE^;nYi38=@B z|KhO->l2WhA5USw!s@Q9_7b$-1L9r{5S!(*vKEMT0l6FG-h%H;3&oXnAnsLG_{n0q z8I%hcw}Qx~29Qi?=-J&MAC-o_-JE=YmCLeFDdvvaEw+20lVKVdHnl_^TGi=!5Y*NH zwK*8w^g7>v;BQU#U}ZzJIMyD9wmAM??caHN#(~M8kvMQouJ+&*xQ5_g3T{G#f|I%` z%bf#^uG3va8BOZ#7a|IHQSf{gwgNu+2&;l@;i5CkPPLsob>iGH%=Y%GmShH2IkT?h zUN)Is-N{_+GRL}-+c{+R^~g9RH?zx3=56^c%**n7vZWY9Ui+&ykVl+)-g`cn|2f%_ zRf<`y)b zQxa&1;=}u8yf2$okNiqb+sh;z*2N$Ux`kN0i%~e7i_wYgV!v=y7bB>JzWKR3BWM9^ za`R6%(9jMmry}>{@b8Sfrnj~~_Wt=T`OR#`R&M15vlusb&vs0HTgxirpuC`*ki&1#so>HzcYA4QEO@3d z`53Fn@o59K z0FRY{!X0!F04VrC>*C&T`2R(#$M0i_sHQLkn|* zf{zC@eXs4qFnRLf2MYBE-XB`k%F3zMntY6v<^6&6TUNCOf#&efvogK^px-O zLtY0!&AN3he?viS?emvF>)ckgGP;AVivvv|$gfHEVr5`-op}V*=tC_zKwT)cTMZ1L zf()`IhV5S5Ina8SMi=qj3=GWL+AWj0TK)*vbFut^j&&Vae`ZxnvO6o+XLW~2-^1z1e^CKJ&6}w)YO} z&&PgccJpLlc8_FecB^D)cF$yRVozd=>|4Yh+85g=%*Mua3N%NdU=VD#s$IMl)FE^Y zeteew+k1xf6F{?7%UY+mfd|?H#lcxZEeJFWe?cDRRQ^M&S{}!;ewpkiAU1uG1fxs6 zd(p1xAcI%6g2y@)CU_*fuyRcg1$CN^N_e%t-ypwyRco>rD~DI>`vv>IgO}NHfJV23 zxm*5B?*dP~6in|1O^7P|SL9Oo{-mhHM9@jeYcycQb11NN6zJC8<-am+!?zJU>)-)>=@PWeg z{Q~<>(`QLCDx`s;8x+;kTS1Oh)&6J=icsWE5JaX``=l{U2Gn&_I|b@IHo8KB=$Q_v z!}WgUs@7yDRt|873mkOM)YMwvZ}`7-dX5xhS^Y63Q1`2U!K&8B;jG`FeaOV72Fb!j zcb461yLalwxoelMT)TAZ!o72k&OAHy>cqQa42-K^vmxCsC)q_C;%grm<89+nM zjjqaSUw*t7*r49%s?`bVacU1bvP+bLDZ7Kxu-qQe(L+x8u^(OnW3N^3kWNq|fUdzLf%*rbu%)|1l)!T3Z^V%~E z8+np>c=?!@_b@#6WdA4IUHY9_^~ewAl|Bsb1N3J#x@vWUogvrgx(ebT6|eSdZID2! zU*_y>)?oP|%;)kG zBqAKz$sk<%m0wuAlTkQ~lhKLQvtKx}6FdlGoUYEO#1`1EtniLOnAwjZ`Iio*;GI$qb!I`c4p<6 z9M%Oc+z+u$hSrN$`$0A0bf4Hh0G))Q~V_0y1*c$@BtwMgz6hhwmq>e<1i2{iS7GjvHJjAe6 zvG)e@%ikBgUjkFfYhL-6+55}i$1>4>FSQA?32=b)8=5D6Wp@AacQU&G+hh6fziu88 zZvFDVzSaHl4&pHsv$Cq z`M>;muV4@l5&`YZ_G?|t57r;2`g5W?NYoc>0z}=07|p+v*&EnE;+7C`1Be09o!dcz z$VPmKl>G`4gBg(W_r1b~2+i%Hii{2{HV*Z(8NHID7BCcRB^V^PaWZ^XPe?GX`o%Eu zh;ft_qj0Gd!^Q1kt?wQF&j8=!9rNMWXY~XDkcy+z`&Ajm#h915aco#cpwbZWZP3@D}0}>uLePfu+9*~$k z=No8?z|5Zv$>N+0??3#T(Q|;&)o?|zn!`tE6up5)(ZTly{%0yfA;mjr?-gi}@V&$P z&y(3r8EV}h7k~ff)poA6*7c%k=H1V#^&fV|?gt4lx`x_jUj3}fup@T+dk6lHAmyd* zk88gF0?C%TM%sp6{j7RnXX17cpV2kaH1O_cRfY{q_rG`0e+N>X>;Aa(`wx(8uIo}$ z+q<7tH|$)w|Gk6%8<1?K`{T0j-$1gNt}9JdFMd{Cu+wz^`+A4`S0L$B_s8YmzksAu zT}@3jFMd{?u+wt?dx!oPAlXXy#}(f{fn+OPElnRYv3~lj`e5hZz3(0RpMm6KLGm9! z^0BUejUO|ye)z0fu=6KK{s~Av5+wf)Bp>Pe6D0rcvueW5+P&``>iZvo6oi5lya6c) zb*%*{c=K5`U}q)BfCnJ?K#=?^kbIzPB}o3&XH|!tdqMK|K=QsI`4=F0U)Q}L`4^v6 z4R-DX$=?CVdxGSjf#f}1cY@@feO6W2X}kA*y+i*kkOEhbf+rvauCBHq1y4S!3hcB5 z8E^w6UkH+a1d=awwFJpO`mB0j=ilA$9r~|<G{vJr)()A}u{@!QR2Rmwa*S~k@zXVcX3Q}+fq`=g*7Np?LXVnWkDnSNZ0LdGI zjJstb15)`JwB0x3`hDYybspz3N1QgG$7>VzGZAo&v@c}0-?C6K(Lt0hSO(r49% z9e;O%HvNF)WkK>6K=QJ#f6X2&UJ@jK4kRz>`V%C7?z3vbj`~`V zf}X@x8p=3EAo(32`ApYd zko=C%stY#ug5=kL}Pc)r5^_x4d^a zzXT*73X)$3k`Hw~36fv;Sv6o|{Yj95MIZ%%AO&kc3IbhyK?>G7stomR>{s;Sc?;X}p0jV%`e_Z)}9!Q0$>p_dh%&hb3 zKdWBYkpDq`&U=UcNgyTQd_D)H#L%_Y;4u^HoX@HUHspW!Kl8mq{sfQ;T~JXy3#3BV zwb0-(BkQcssv9=sf4D#Wy@P)rNQEY-te*i=q3OET;4uU1jL)hIHspWUKlQzXeh)~6 zDyXiQ=GAttzE#zAp}}K*)+wJ=Cv3?7Fn{uU2mUUQ5=HmNCEurj3{iBIHF(U&I_a}& z!-o71^%LJayl)4okOkFdlRzqDUEhC*Z+OhZI^nZw0m#Sw?;X~+g49U5KQ8<}0i;IK z_5BC_e~-CX`#!5CfIQUm-XXua9;8Ur{c-*G9*`nY*Y_XJ|9;HD+Vfd80OaDX_YV4v zAT@&Sk88hofz$}PzW>nw^D!H1*Jo7+kb^qj8~pzVQp4;1xcYksNDZ&+`w#x#AG5G_ zd{#98Ij9XJ%IW(4!~3s~Ia%92t15s(tR=agnUm%Hhj%kpwdQ~L-~8U7{ujs~M^F&A zfV4P*9Q5fi18d7?Rfe7UANDu4x<8)#v*EEcXT$psc{4%!>KopFST_m8I{*Lu2fj)9 zAN>ErI+o4LT{%Dvk5z4Jn`N6Pvj!v>wf1(ib|*J&V-aQxNc2jcdyIkAEqT^)2FBO# zKlsf+G$g@|3&^Ui4DnJ>M}4WydxiPnOROtHL48zKx5x92|4ID+{=>OR54TTWr_bol zejT*#pWSZyAALqe5J#B3-Fmu;0iz|9V?I5_fKg$(jUl5MQ~uHEC5DW9K{AuukE>3% zFk*D5Pv&720J$Etl$n7;!gp26x;DwfGM*m~_qZH=3top&Ucqqpb@K`q#>w9+7_L6Q z;~~uUfjv3t8y9O@a{Y0RiKjXoCO9Qa9py-Fy~1$ig7Oj;Cdm4twwqV3Kv>IeO}Qa? zely#5hAuY9rX+PKP}|F_etOH{iR_Q%zW-Zz_JqS`b_vF0wy$iP*|#!mXJcq!O-t@z zXMbOqzqo9fj1-r)S5*sHbsk4=4VpnoUy zV(5O@(jf*8&{nDDWzX~{x4SXSaPDyGaeh4aDasOm&_E8vU&nPsoRc44XJDEj;oZmn zH_VvrJA=rfiR^aMMNrN#gzBhg5N2PliL3<_NF87eJO~X(V1raXj;mTcTtVT`%Ep@Z z-k|@YRww7nIWCZ}IC>Bi7IKdvA>q}^e`Ug`T@Q9sI@=6q$>TSi zlO?t@-EdD9JDZ z3*J9i_Y-Eu^eLu{hMCtv=P{-KK^(3)^DRGv1LM^6$?f5xkN|G~g^&fw^`=j5H#dgJ z9shxlgE@FrJH*MXvp{N;Rla|F|Df;vbUiah38wgO(>=@>BSp(VgWYNC-%pVLAbS>c z3fe^XWZ~)C%ox?3^OrGjo&|MZKphv*MqI(8f5RV3eErAi`gXf#=v{Dk7&Q6?9_IoZ z#J1x7g!-4FFoOia2G!>-1D{_4Gv;sjW67`oSY5wv_Y8fy9W+Xc7$JomB?a0_n02Co zVNu{ z_GHebvdNyTGOg~(-SuCDI^C0}evuKr!Nn*X%E{wHGjGzT^pi!ld zeUq{sFt4(nvt&cXQquf)mz&Cl2vLF?i{a~p?PH-8gjbYk25U7QhgMO>}u z*}jYYFZ*8hKjKQ_-25tx(fFl0<3iWTY%G726+-?hE2;c#t#|Kq*)}zq?>k?od$Q1X z5#eAi#>qE0868VO0~EqxU5t~jcQS$(H~sj*pV=oI(Z#Tc<7K}Rv+&hU26H~f|Fv?P zpNlhsR_ehV>%?JPc8t-9b@TV*jG#N#|4M+Co1N@W;xaB1V|>I3a-eaR8{_7e=8R&> z3tSnM7nw4uP3K}yYP;7O)%u=cgW>cV3r5BI$y{8U%@r6y2MKLvQ*cav?arCZ{)+=N zyapP00(lw~NJ?y=!)^|-UF^TwpTxQOxjLh=!k0f2T|pjgb>BAivDo(y$+BE5!dE#N zg|9(|=|H|xVg;Gt#CEd(5$DDJ&Cksl=N#O*9}-*38lSalMYWb%YPBcxOl4Tr@;HR` z3FruB(Y>o$R&GBTGIKktyXfA>zs1IZ*YRxY66S1Uvg&&O z;9Sr2M^=m~!C`I7rW&_uGQNLst`js;2#QTmyiWf5mEVc=5G!odaPssn#>v;X7(M&X z_6vu0GETnQ1s*{JdC;?8iS2CvBDTQ(tNqGLUQUm+W|a2`n|Zf4s10QFvZ?PMnF?%k&y|Mj7td{>jtZ z7-IXC7rdN)-kLE^$d!%FXnJzeakk_K&)M`klHV?!?r6j4#e8Akhv|Jbj9QGQ(|6i1 z?quwpUTn*FhH>t62RlY><_mJWr{~!*sxirLnm)~r(IXNx&}h!izzlNPjKhfGM&@PQ z3|HY3aZ2oyuXQnOe(uhAvmc~V=9utxE=Ew09Abm0oO}y5Wfu;fd5W2CZqJy{Xghtm zJ!6RQg?ZbPx>|h-_df38`4rXq{({`X=^N}B#ipw`F#5?=8cCi66&SG7H70p6d4qDj zSL^!*`6tUKI50BGwOU|T13JCh{?hbyj*KoW??3!+nEu6)QOQXDvQ{VSNx#WZ(rG_oy|fwa`ZMEp$t* zfvlyOF0z0dmi(ZbMLs z`DZfMQHE=+#++`9li6Ud@@rjc1#*V(e#~UYta{|nRmcc9a?)G$n<1#}R%_VQ_ZRfO zuH6rs>%7zkvGJ}^>`!LZ7VbYF1%|BeFX(-qZs)=%!IXb%dV~w3jOhG3t6EtPf=eN2i zi+<%`^#&a<5Z0#Fdam_-!}__?rCb>uROA~}e}WdzfKI~#&89}Rfyd7;th?(4KA7eG z1-<*z>s%T2nARPezRs0Vi^>1c^jofsPE7AVPnUCJbmTp))tT(XDgsI;|64(4u!J%B zFPnbEjWL2pe_IwLKrgI2HeJJ=aYvB-$H!8t|Cu$9{CVuh`OB;A8OVtr_$NP>V0{w= zb@2HGTAh)9n?VU7v zkQ?+LPoLqz=*4t?=JY2Xj9pCgr%W&KWE5lSn>W3~lhMm${#M1K%~~yglc#I3f(Ewz znjvQyfKGylYJJ}j-y;iN|CjtcoH?xR5-5dFo6hFNXu@RQFx|$B(X1YH!W4r5Xp>X& z0am6}EyA2f{(*M}6x82a)e2g*06MMl@pblpuso;N3d(JewRLRQAZNxfNPtf8Sl5z# zn3YAZOACCI3v@=U;QvkVWFr%3FWTd4?EgT^iawK8zAQ$xj)WCV*zTKrNgJ&aLjo zQ$lQvbZ|Kw(0d}+(FjOaWZ1xG=10f z9u(t2j)7R=HWy^Yce1R&v;oq71UJ^|kAdb#wAv)xI2<)kPiA*zV03SF1v#nbu!tKg z`$YD~S=ax`IN7yMJ!Q_$$k^y6%q}j#nJTzI#%a~`$y3W1)`2(Y&H$fS4mws`#;ui& zjs5Y%Z~r))e4IeN0@k$m0`;?2wMagN^dXN*yx*Yr7Ssq;YZZZXjv$dey$sYKPm`R! z#D~$0>6z&CJ3fpjgp4`^kFDy|YkmJ=|2x)$p!3EiE6foCT^2X}f-fVR{%Ud1suA%j z1_oxWEMdsu{!>pg>u`aN^J-;Q<6&s!66AWn;rw*1wq>n;(^>r(tpy;7ltE(p7SIVA zOUkAP_%Vv5t>3^1UimpG1hn=Ov}<#+xFy5pc6G-tcJZyC9zkodar+kryQ!d6Kgw$6 zj4_9&mxFc+yZ@3oKAj!Jdd?+t8p3jyi8=lLL;Sgd zyX(T7oGPHxRo)+{yS81zpYesjwjf45#%T$R?2Ja+IT9EHnVAE8L$})`Gu~j)3pnua zKL|@4fzWRb|NHNB;NO3yBM=%Sw*abU!GY;c8I0x$y75-i3evH7@+Chg%MF1byjxh|lS3DUzM_(4ZeE z2h@WsR=V)-zs!Yy|HUr+`!8_e-+!(P|NgUF`1k+c`G5a^od5U#)A@h@-<<#V|JnI} z{~w(H_y5-UfB&zX|M&mg`G5aUod5U#(D{G=_niOtf7|(g|2Lff_kY#-fB%=9|M!31 z`G5asod5TK()oY?d(Qv+-**1r|AzDb{#Tv<_rK))zyEpX|JDD`IREc|()oY?W6uBk zA9nuV|A6!V{(GJO_uu9GzyEgU|NXZ(|L?!i`G5a)&j0(bcK+Xgh4cUZOP&AsU*!D1 z|9t2F{pUFU??2P|fB*lS`}hCbxqtsZocs6x)wzHFpPc*m|K7QO|8Jc8_y5wlfB(;% z`}hCYxqtr;ocs5G*SUZHx19U;f8DwIfB#pU`}cp*xqtuXocs5G+PQ!KC!G8Dzw6w; z|1IbK{jWRs?|;R)fB%cl{rjJD?%)5kbN~J)ocs4b>fFEoA?N=6_dECRzsEVG_#`zt z2SxmY(!c=W(fm(A;vqG$VNnmx{{s~FprU^?{zv0~AVXlZ{>M@%(6Kxi&Hn?L`v3hO zE&oBa(7@r*_8%P!8!XX0TKfxqtsv&i(r@ckbVR ziF5z{3!VG-pXc1a|7_>}{bxA$@Bgo}|NehD`|tm|v;Y3TIQ#GaqqG11-#Pp5|FyIK z{$Duz@BgW@|LXrAIs5PbzO(=S?>PJK|E9D5{;xUv@Bgf`|NbukDZKFSzsTNy|2ua7 z`_H%c-+zw1|Nb-W{rCURo`3(p?fLir!=8WtU+ww#|H+#!XAj_AP3L{*YBpW1q95mr-`o!Sc+t4 zJveTW1hDd>pwSSr=ih(7J^%iD?D_ZKY0tm^Hhcd4H{0{?zrmh=|F!n~`>(R+-+#G1 z|Ncwt`S)LF&%ggXd;a}r+w<=~!=8Wtf9?MF|I6-w|KIKY_y5K2fBzrt{`ddR?)rcK zukHT#|HAHn|4;4y_y5T5fB*OG{`Y^!?tlL`?f&6;?;QH~|JtE{|1TW+_y5$PfB%mh`uBg|p@08(9QyZv)1iO=*Btuy zf7zjb{}&wk_kY%*fB&Z(`uD%@(7*p3hyMLf$=-+>bL;wC; z9s2j*``>f$-~YCQ|Nb`|{P(}=;J^PR2mk%gJNWN^ z#=(F8lMep-A9L{E|FDDq{s$cV_uuQ_zyB@=|NXZ+`0u~P!GHga4*vVEbMW7PwS)iu zD;)gyU+Un${~`zf{pULfYX2Sl_n+zDzyE&@{QLjyz`y?=4*dK7>cGGMPY(S1fA7G* z|2Gc&`+w=czyD_r{QH0Gz`y?o4*dJS>%hPNTMqpDzwW@l|0@ps`@iVGzyEU%{QE!c zz`y?!4*dJyb>QFsmIMF(*B$uxzv95Z|3wG>{m(goHKd17{L>_X)%hPND)k5c{g*rN@4v)>fB%IJ{QJ*y;NO3?1ONUr9QgPD*ZzP1 zzwH0_|K0w7|6lC?_y5uUfB*07|M&me{(t{3?Em+F-~NC9kL>^V|JR{^|1H-4`@d%G zzyC(-|NYll|L?!r`hWiw*8lr2wf^6Kk@f%n^R55)pJV;M|4i%u{r|J>-~Vsx{{8>3 z?%)6VSL^=$f3oi1|9k8H{lBs9-~UVN{{26*?%)4o>;C;eu-}-~UDH{{5e`?%)4u>;Ccx_|#| z*8ThMWw!3$e}i@Z{%fuK_g`h*zyEUU{{5F&_wT>Zx_|$9*8Tg>w(j45hIRk`|62R+ z|ChD@{=ZxM@BfRn|NcK(`|tmqwg3KKTl??-g|+|wpISTpTpy#}bdf2HF7=zX{ri7r z+rR(sw*C7rvi;wGtL^{(Gi>|!zir#U|8utg`@e7dzyEF9|NURI{onr`+yDJPvi;xx zQ``UjPuuzLf7#A||2ua6`@dr6zyB6H|NZyb`R{+$u7CfVcK!R`v+LjgIlKP-U$X1p z{|meR{bvD<#`#R>;dQQK(8S%I5-IUmbDu z-+u-$u7@#DX@mk)afl{Nu^O;psN%?C6VT)>V0>v9D=Oy#FEt1JO&1a;@rf{LjuFI6na$t^Kp&`-|DFHX&4C@x9K zFD=n6NG!=u`o0+&;`jcFfdGKpUx;N zR+O5TTAWy{Q=FWcrdwp0XkeahU}8L7X*y#cvsFpS^!3vj4b>6WCYB@@=azz8g(6m- zQetFaF#Y~?#+Pat6tMc<0RqORy{{PSE{{KI$`~QEV?*IS!y8r)w)%E}Xv9ACB7j^yr-_Z5{ ze_Yr9|2AF!|4ViK|No=&|Nm>9|Nn34{QrMS=l}mDo&W!bbpHQu()s_tNaz3mUpoH( zztZvl|CWyb|EF~P|6kJa|9?ow|NkZ(|No10{Qv)@{r~?f?f?I8Y5)I!O8fu%|GS$1 z4|Njwf|NmRG{r@k~_W%En*8l%+wEq9UqxJv)s_y^)D_Z~mk7)h>-=g*Z ze~H%r|9`an|9_+9|Nk8=|Nob?|Nmdr^8bHK%m4p&E&u<|X#M|R07SR^Xa4`FdHSIR zjP}#{7BWW3733tAq~#ao#^;x%78PZtq{ipwr20jJ`24MyU25trh1|
Ur^z3T~z&i(OWbNtSq+R~sFe@FPv(c@uTt-}L-@2x)4>ULWBS?8ZQcN&uX zKHf~3%lJ{KYJbkJg8j7zW`EZ_vS5!u#)`_hHR*p^of8&yvOfx*Q*)4GSI9dp@sq8^ z=R@(XQCa z*zon=|NNe9j18a=oUnBVrT%RWB~@o zdT?fXaSATLPz6$eWWf<828M!@j18b{4RXLW1_p)%eTIf2s0Cjc85k5!Av^#|?mkHR zzkqByjW9oziGiU3E?>{a5Y52ApaU0RV^C*gVA!z<5dvmR3=B3%@)3*-40jGPHh>Bf zkb^#e_=g!A3cv*b8^aAI28IWR7#l$45lH?J0|SEzl71yd1_lEmW{CcJ2402^Mh1pB z1BM1ra}E@Qiy0UgJPa8ca-cqZ&cwjLqtDO~0_9(0WMFuM6auUu3z0(*R0y6$1i3vU z149jx0~RqdF!&sS$k&5hxRa5Ap#w<)D9`OV&e$LW^^puH4ID-INS}#;Awqjsn!ikdr6_7MYy`i2Kk4k!wqK-oNJ85>?e*`UPp z2FeD7$_FSL6r^9EY*2dm0cA6sW@z{WWrGv)If&yxLCykYgQAxM%&vz74G)+DiB|zA z8hBHuh#U_S^3s82%CWeM9P&S(_L&FUy+sKxoVGFeQl;LM+cmQSV z@YgdmJb`l3gc%xMK-nPr4H8=bYEX$0LxTvE?Pbi+AOU4t88I|eK-r+sY=E+#Y+-7+ zaR?H+Ao>mxTjDTd19LqC1H-=%h6V!=2h_+3WoYn#vd@GuG$cUTufiA_DxmC)aE68+ zC|e+cpy z;}E;__A)d`K-ppSdl?#Rpd6Nc3=IxYw#hz*h7>5OiUL&F3p zTjU@^!xkvJ;UGi94k&xkL57AOQ1+9<3=Myv?7Slk4IC#J8|p!=3xN}i4Lm0xuKRYF zp}_&lwmQbp-~we|IL6RW0A-6EV`wOWvez7AXlQ`4C!AnxXo0d{9bstbfU*~yU~K4t zvO(e-pzIwd80#ChKsn!zF*KZjvM-!qY&ZjDmmFtkU^oeJ+^pja4J=Uhn&S)&0#LTZ zNyY{dDEq>3h6WEPTjB&mgAbIgc7mZH0?JM}$=DDBX4f+?n4Dl}r~z{r7R2X36wqIG-JaHDEq@f#)dag_MAhE z4WL>Nq?hF|W5W|@(JOP9vEc=jZF0DtvEdDr<8zp?;RBSNa+tB<3zS`Rn6cppls)Az zW5XXPd(C0S1_o&9dE_u-1E^g9vh2e~h6YfJ2gJT}gt6fUwDc4?%GdzngT&t)VQhE+ z5(kz4UYi*jo`5)@rn4<$14toAk;+lV1_@}1rnHrzK?chHW6#(CYCM3{fQn!ns5q$D zb%3%#MXd{z4Jutdplncy>H}qiO40fNC3fo7pOCm9}wH>4GE{9<$u8`#)cHAM9nXTh72gXDvGfI)Bpt;)N+ck0fa&938xqvI-qKP z{bp$BfwJ%YVQ2s~UO{R=2^y3jL2Q{rj13?RVs}(9HY7mPkVCx_LqiIbv&Mm;Ap^=j zv@Z2ogKu2(1`<05iCuuiEXJVy{4AuK}~`85lsm+yLf4*jtd;JCN9Wkk|*H z>^aLB8je8OAahP2vCkl}LHQjN9VyEh8$LkAcPwXY_)-t$lq_d#_yJ{uB>q6zEz21j z7@%2k&2q*D7ASkha>fQw`2aHX$a2O8P!kNqezBafAqT4F$8yF7P!kL!F0g{J0o3dQ zu@zP@Hh@}MAa=dZ3dROd^9saqS;5!TwrX3Gl322lF~#Fkje*Z^uHfY>Q385VFWY zWF=$64rqN3aviAt2Z^_=WNZM{?I8A)m5dFbdK<)MSjE@?s;WWkoK=hspz;C4?pejy z0IHrr>^Z9#8?Hdhi7l%b8}2~a2UamQJb|*Wtg2^hcmd^@y<=zq6&4`Ppm?%@=4p-9 zj13M@HYl20plp!12b2wpCLbspBpv`|i>zjB0F^BuGj&!oHh{_v5IbcxV*{u{1GoRL zoMLR)0M+nIo3Y^tl+C5X*Z`6PY3NwT*l-6bK4TqY!xJcb#X81@H&FJTb&L(5nh~Tv z;WT4|4YW<*rNh|Z0%iZxVQc`&fz&9hXKe7vfJzvwXKW~dvR&3QHh>x)AVmr585=-V dEQr15G-Cq@gV;0HGd6&#Y7o0+6C-#$2LNqBr!n6 z{xmOQV%W?a>>$36kwKVG@0YSd9mDiPAoWQP#V<252s0;domi#JevXl0a-ZMkiA!v4 z!KO8RVs!?Y!_Q#A+~}}TTl^LygD}^s57Vod876mWi7P8`F$i)!_Ko^4&c(nW%*AC; zED&WN-Zfc{(TC}R$mASGS;6g$48rW~Kbp1KS($a*S;dJb%$!WjTAZw_TF$k4wZ3P# z5R_cy$~eb^)jhfOIUlcka`$tFnTOv`XiySn4Pbq5zz~Ak}N z=VtXzR;|uC&NB};O|Sf!EXK*B*2=uHh4H<>1eMB<=UUZT-v?YM2>mPQ`d(mzw)iPf zFrTVZR^nU5;ChwS4Xj|o0*}dh98wtzsj$skm}a1_W=$3 zqT7X84OrhBBm_*}z@b=w6eRPs_`O4d*W~Mw4qfciPcbq~?&2!mH>-I$7elM}=GoSa zo1d36ii1_U7Ai0J#Q=4G{(FZ5p3UlApjc(8PqUdP;dxr^m?;9=@zYq9Of+W8RA`dcTLeBe!3x(hm6ChxS zP{X@O8c~uM33fF{p=Y2x*YcH( z?;Spbybt(bqt*F7pukqE4d$1l18YG%L zi=B^)9g?(Q_YMYrlUY3(VTK5EvV48- z@WBTZxN5DZTHhxGNWdK6TJhc?z#AkJ29hy&APSRNTJhdtgC|G^qUVD=Oop}cy@P-U zC`~BTu7XC&(aQG@7wX+Wf(dZJ)~fdo6F`|PVF5y{`n^Md3rO9Aa+qeA-*CYWs$M>EH-xpc1QNPWUEVtsn1d4UtybZ1HUiXVc zg6YQ1P)*WPcTWxnm5tY?&vD*-U7fMDd*^Mh)~#xd`yB<9jxlhEA7^A>R!^5?JU>}n zm0|ieMuz5PZD%Jh;d8K9keFO)$_%O=?zm4p+%z3joGZwK$PZR(t*V-8t&++h**V@& z*@g|N?;9rQPnO}AW^O1boovOgtPHL$y!a-It1(=f-n^2XVN*+TFDHxebX5ju!rDK% zfnQbHz#x#HL4dJY-HW61_?+OGhrL>xrc1iM7jR&me1P8`R4F$vSKmIFO+cQxVT1W( z4FP+$h6%=r7a6ComtYjB2PP^Z1?MnTLZ~LBZ1K`rcrI?y45igW_NvnlC0F z6V&E94yqE|-!`6~Gx>kKs2bSDV+EL>UH$Up zbHdUPHv7fNAA}V_LDIae?c8Ju5fc^Pla+-^SJW=CUGuu&cP{8m*r})!amSL5q#a_A zSl2T1pi!sbyXg~b8Aa+R`M4%FHLU6cS7-tZoXyKSSx$8?Jl^WX=*8+i`KLO=^cY5l z$vry!;xUX2!aO?s$y2hJH?w*=8n?PIK5I*A>-2iu&iU`XLxOj*J1c|MtmFVK=En_L z|C6P;7`)mbDV&u@t@S;FK;_>3m%8swS=`U^Z|Z(>2vklE5S4U%#>6nW&26i&L^Q+Zb~eT%hn1J8 zGwL3i{(^~NatFtj$#P)~$L5*yGchFhKVfEG?7_gij)Nh&WHLi?wlZ__(<7XdSBa|e zH!nTGklY)}Jh_8|>GA9vlW&Xa*5__-Ue3YzcyjsQ=H(uYkLS1lZeHHO__)RWCs@^# z8{d8RKdwFb9n711<7?>l!qB< zfD%#ja`h$2RbP2nJy*3Pv#Ih%wXW+j>e|-%zCPeWb#nMhmSS}VqsiC5IR5QkHhpS) z7rV0FlRv`jNB-JPmvNr_?F-}P>(?1tyKkPBaW7}3Ib7$o{9UvMh5PG8tJ$nR6R`=7iZWteG>bs>Ei87pho=EF7{p1A%$7{ zlsV4H1y4C@!;^cTvk6~kXSD6!>y}(Ed7Y_P&EexA_JhsB)5RGki-|Gpnr_^Fj6sea zrdgPsed4a^cbpkr=Nts5q9baD*p7J}VBlzVU)7S#@|B4-Q<#-=1ISSgbsz_VSPyC$ zT{k%>xlD3l@&x5+M%T0ZOGBF)lAkVR+Rnzrkj!|MDY<{Li-Zv4+sWY)>h&irLCQf& zWeXRbS$68&u}eo91lrD>I&tmLtpjoQlJ2D4%DRzvZS&Nn3&S1dwy@Us1`H+5>b(rD9jkhiOTO|PO#dq`Ud_ZH%)Pqy zZ?vtCvf7tl)AxY#&6=8-E11=f{QB8ntm^P_@-%Sa0rfJN|y$sK$wYtwa#^@>BCd)9Z6=Y}JfgF&ft9p~Gzp{K* zbND!Ux){T@>66&sO$TY{V!t(gj`Om%bFD#bd99DX=Kh&{gPn2mj~@(=`^$en?(6t| z(-Nc(WS~|j#K;Bd5ECC~e*HClh7hAdy=9@&9lvXA_tb8A-3Yo8b}8yY+_|JPX{WMI zG%#%H)N1>z;_&fcIVgmcRkr+j+fP!+?gfRcZYFZbCf9Bk5$0<76V&?NKq0odUcHxL zRZnv9SCPrHL>QLMa?Ji3B3{YFAk5jBHu~ie8rr(>cyo8-WuF)lVE+-Sn zAmKI{29T>B1cSq<=W+JeACnEkzTV`DA8N^8j;n#KsbFFd=2+oS8w#`N-SjT@L(>%(wDKl@I;%3pc_RDc z*~|WIzP6RIwd?D(PN` z{F*#ngkjnA&229j=CO6LZ<`Kk4o+@Mv)ndac@aAU$nB4LI6om&?wZlXK92*Uip~7k z^lj5y-KHED+^?*~^5e6X!^h9+3?|A7Uw(nSlU(pas?|NY>5EjSd-CirYRsxEzZzYY zl~{hi52!B?W7cr_)#;ne&ME?ufCx|EYIO&RCtqDI0#07bxfztTuKY-DWET;hCB+an z>u31%n@kLoJ3IB2)xP{_^b+Pi@>{%?i9wiGS5JtmdATP;^0zMx%*#3%l3yKRO8z#T zp?P^HL-Ld9OxxL+7?S6H5n@(9^0T>qc_$OF0>T_A{%u{H*Lt?*1wOYSp)L zP447mdi?s=uV&37KYoTMH~-}Mti@o`yu6F?=kY!MbHX1UZ&p3>lUc3hr&?>%^v&s8 z8MM0fy3U@S+31WNzQ!)>$K(p?VAD3E% zTX~D#DD);vqE}u{S0x2$9H(|{EXeW`%v$pcE{bI zNPxx8ff`UGtm+ND+2}iWYx8nX#>Z2SziU=!`PsablfkKN^K^E`xBU-iPiAFcifUEX z`||6(fdltncdd@c50}6B8&m5exk8vtf&n7`-k^a~tK)IXnpd0Ixfr|HUrnFmT>p6D z^#33$A@S~z-K_5N6J#l?`{wKHjIG_t!OI!$-d9#*`I)-E(XG*y(Jim_{fF}}Yd5y0 zOzvda@DAE|NC<>9A|3H?(Y2>yLac;*wD?8o)4(vx$2($ zbUD-HdT~((;pt)wtEQVxhc*VlLwM?3yQX)zGrokhnT=dZLqT=+4QEDIR`wf*-)@H( zWaJ{gm63s2^(dPoD@gvc8iUF7?TieQ+tXQRxF?r9Wn*v27x=y z$(3K3T2m&supC%5vg8h z?9&*8r@J$lO`pX+y$sYGKK64XI~V)5>1NaahD|vkZt_&}n&bruNEzQ%EuF{r_}>YJ_G<$k zXhY(2`3qroQ-;ZGri?cZPdN^8?Bh4rzf6ZX@OkfkP|IBHlHWNonv0 z5BW=0wW_r;%~D>ll0ovI@`Bk6tt=BcA5RVWJ4sDq@(}}pdIkZhI0$vlx<7zq5eC;=RHLjbvsn z7N`SnGI};I=VV~zRBLN=HEwlhoOt-45@-~3BIn~T>i?l(=DEppl2=fxk{9db`)aJ5 z7gQL%?rvxFIy?ELnzNGZA-!pe3uc~9?mx=V?9R%-e4Lemm9>@iar^UsMlQy!&mATQ zsXNF`J=}Y6RU4zL4loFa z&jO8HYptEUL^FyhefcCU2^>nYmP|I#%2%BZ>KV7YfJSsd;}*p_3?_{(!dyrG1hp+| z^=obQdSBq+I{Ao}mRy5V<;_Odq}KNZ2MU^(pJbc(I;r*j1OLyx`v!{koSFR9z7e`jK7 zUe3OBQi90jGdiN|-I^0jZOiBEn%;33 zRB1zsE{Hs+Iu`%V#K5e+eAce%Cl15qj;I|1l^UQjL)3L$%li-duR+bbiLUP*45B2@ z77N@IDV}gebTT^wNAUu8gUR!Bc|q=JUamfM@+MtJ^I*=Wli3-ViWj(>fU-NnMMf^5 z^v10Ev=1RBc@*Tv$?eN~Cu`{$L(FOKnw+9%q88sS{)>r0m`kfoS!ET2 z&_KQKO>uSxP*3mTR(|tNl^93;n(_JVS&wC~_ij1*Iz2Ci{J7KpPINFXaJ2d?j zr~p1?)x466L90uc^T_X2GaFs~THgz72tL)y`?7h77sDm6H4D5!#(w=QYYMSufftDX z@wcQcRDHmy*36sR9MoK{ncE+>Dtur_{sA>7g_aMC$lkd1hTysC`e#*4c$NGV1(1;c2`Eb)*A;Q zGW$SIi<=x`Qtsad9^3o*{=)xHh>{Bw;g+uNAMF3~a=)VM`v>-4PVUzP@jt)ZZV2Lk zKDpfy#Q&7L-xI|DM4(saAddZ04n&4DUa@ zpT)eCli~e`{8?+av!ESBBR ztnSLutlr9@+dR2UogsM|n-r*-qIL>YZi32B27y&AbDM=(8(8!@C;t>@5Uw(3c+Vi9 zY!Q1fxt~*jS>2Q2uY2;-=R%*=6%s(a&DWnZw00-=unSC1G7o1Gc{O>rxugyv=#`+g zZ1eIK4v?{vzkmO(yyOeVdxioX$%Dx=I5{T&Ff$Zqy~QES&fajdU--K^!{qPZ|4JU7 z{G6R>vW>Y!8m86@DuvrIMGKT|Z+=#1NDyZK^Gspj7#SwFsi_IGemGF9?eKBBDX1n$wbyEoY7;jF#k#86dxeDH zu=Z1JQEd>}R$GXStJ-^o1A!37To6hYV6|ah?!wW$jD-WLvcC1H6-243=6eMNf94e} z3^yF6n}eF8$F(38D=4@y zuW(_W5dl%lt^!eeOc|zDRTrXmsoZ;o1V`o-N0?{CK-3;r1gouYYg2?NPSt`aek%Q5 zVSyd<3Ky0g(2!`C2Pl3yQOhO^Q~Oi}qBd3R zy@G-z^9mQ%9Uc%zuuIoN6d#jNIXfv;1VZQ-$Fh4|X8$V2Kst82w zQ`Ywi3pAKlw6NFzfW}=rFGR5$FHG@LL5N~i=JyH@RDZ-k-z`s9nH&GI3}|m`K<=-V=61C{8d&8`KzpA@>f~S7fkZHKc4jb*!v6nr|0fp1{#@6 zD9{EQ($@Akbo;Wlptf^hQ2~h2ZD~&`kwgt5A!^y4F5UnBL;rM8mVZ2%{lMPs?=Q@s zbaua5YyJBR@|$z7LX@dJ6Wkcoeh!|aQ~yJJ`}Ea&g$2U88{dD(pDemxt@Ztd`|Cxo zegyR`!P8TqM%$d=rs=TSk&zwBLR$dUyem+gcx%KcIch=NK*U1I85|i2N_}oCg z>2QC4z`+Y<5X^X(OoI+gW;(bDq&{)xV@6lVU_7XG@P2_n%49Bk4Fd)<2fhTg!&kPyFAxZAR_A1BJUz#I;_+rx zPX^G?P2o?FBU;=+k#HeVt@Ztb0~Ttn?+-MvgVbKVeaHXkZJ1h+BSGET$sYEy_22@$ z^@dmL`w0Rv$xf_7)4RcQ#VnxFmQ^j{U5pIOT3qanp2FNm{(!2+W-Ts;TWxTGI8P!@@t-K(TQF+l%hGng{+QiL3v(;&rK(>5PUDe8Y zQkd-nvv?^ZgOe~TYwY_6`zL_9ZQ|9848q*q(GySKac(>fs`Q(tE32$#QC8c{0x6r1 zo&y;%L2y-TvM(!}7ibAd@?-@EaoYnI^mrdOtGE0CH8hjo{APH6V1nA@=~@iurgI); zR&V*!%5~#7NbY@uLDH(0$Dyo$yjqntqFLWxSRgpL#6ewnIX7s{)r+6+ARfrf5!^q? zQI!1&6T{>dm+r|jj#~8(s>GjyJEtA*7c3}XUUr0g`co!`$*ruDSzX^RXefmQEGQb2 zBUyPI1=)@%9bw=Qf5rrws-FN+>pB6X)*&Bal4{HQ1r3=8)6Ll#*&)+(9!;(6!tBST zWDc8)GqAV139}z(5;<(H&cGy`%zpfW%;Dx`96aXCjBMN48QHe8{{K0--JJ=V`nwuM zg;|@KjoY^~I87J6#>Ob(EIgf!F|dCIXy9Y&@_)k2%uKEB$_k$uKC3g-C@=WI@L64; zMtKp44yaLH@`GWrf|CdrqbtY{plmWZ&q-Fj9n_mlzdOSjWaZ>GcZLY>8HX6%7qZVd z42nWw)~C+z13u(U-sH4Ss)1wKp;HGS4e+QNao3WrKq`#oizin(n`j(7JJDUQ$EYj$ z%W7LB_m8aJ|S>h|#WE&TWdQs2GEH1x=xv%_r>ecF< zTm*poTmnihYie`$1W1j{n2Ud;ITspS|zb z+B7|Nd#igg`&T9{=oGH%S4c^i+W%hQgU)331ZL$%kdGXg7dL)o5cG82KbhSCDy9Gx zE8IW%j;Aa;xZ$-^}82?2Jf-!cbzS+3Tm7kHGePQ5V+aP>kvzQ(3zwou!&g6kPm}|aL=>&ahA|81U~&Y0Zzj4iD7{RjPP zlb^OQZl03LxUy&Sml8%$k9uX#-_T_KUkt6To2RxiZf4)$ARMX5@K@CMr#fS6<7WP+ zs*HZE8%@Gmm$l9`VRQveyh~_-4D-J*`6&yMVJmwkhiWpM+zuKfEDgQ69W>OKoId%E zzXaFOlSW;k$F_AHJvRBDzl?z}=Li1DE$r6Dl9`O}Kj@z{u3X7r9GS@|T;9p}&|R%H znf*J{`w#1nbFp^1DKF4uoa_;xz{tNjGa#I4Qp}qA$=_N3Ej-`o&bVT7J3G_nwyzGt z-`V~t9+z+wWUaj}EXL00*wpAI`N*;Ppqp^ncYeu73)vK#h0DG(NIsg#CfF=oX3ik_ zsFRJenYA0#X5Te!+jJurNV&eQ?e8rfM`1PwCegmyaO3df47vTemtki5{wm$>SPx#* z0&>LC!;S8>VW`fq1Uus~`|*Fm?%)5zG*aT2+Aw4BYYe{qk69pQa>ESu{Z%@7XRMcQ z`PY6i_FC7Oj}Nigx`JkHzk+6MMHjJwW^F<2LeWVe_JObcou?-o#L1dhZQ~FQ4`W!> z&c!ZV%J#3eYuEJ7UdwmF-&y}T9^TBhm4R`EFe@w5=GJ8nATiV9Gn^-~*Iu7o7Z=4C zIr(OshIP?4uF2tH3|j47P!sH?clO#o0)@)K(|^N^5oWM1a{!61Jul-d$o{zf`oGCB zv09T8;%yk`PM#Yd!G0Vx2yxtg@}GE3_LHEh^Q6sWodn(bqY{p*+Bwg6o}J=2^OQ2f zaRv!TR(6Sla~%JQgC@?K8bD$*oLSjt9BzUyv@vQ;GzXRL;BpbXhy=8LA?gI%HPAAW zxMK_wt6GdYnO)f!%(~ZgCP!QlNM>RcYIJX9H)i|E!0g7xQ2Q(SY&xfKb-g-6vMe{> z~ju)D#yR# z$_sunFuO`JZ07Q0WaZ5KnH-tG9MyRfqN|OQ1EeePuyR8=Bf73y$;Yyse{Rj%6rfZO zUh?qCGs(-zdy{uq>m@JHqKC~~za1u5t20dAEzPi*yTEbsZ|?uB-IKeynZvp*Unj>0 zu+~b)wSiVYo-}; z?H~^}di~r!nY*5WxzUT!`{wpWugs5)+qZRPZg2F8-CtU$boAW4OLwl_x^?5(rFZ8T zIN6S?9rikS@7kj)uP!L-EcvF_y{pHm>saTeu5G=I$2HxPyWR*a=4bg8+Nb(%GCKpa zGXIxf!aqG3CUZaeoy^0@1fm_?89gVr|Nfuc{Dw!Eoq>6A|LgjH`?`~PIT?~!xfmvY z*JOD6d@}n5rp5ig|1o<0m1b6L`R><#sV%PUR;!`yE(a}_SuWoq)1t0LxkYb_R*RVy z!xsC^*J~=5r)OeQ1EZ&mgYca{j+42+{GQyN{zqBw%eS<)M{QxP?^@p{OvuyfO=}Bl zUDxuc?Op5p2j}aUe~*-tMSQF_vCNO8JpFQd^c`h&M3^x%&gpy&5)ed z&iGjF&9BEb(|%9>?#Zz6wxc`95059l`6A*V%r3x^-13YC%wl^y{n;mB_6GLF{jdM+ z>;5Zlx&QGEws*$n2N*WY1^b%s_C^~vl8Ov!BD*pemF7@3cWFid`-!O+U`m^rbq89kB{|4cra zB2!=d=ig*@1NLOTZ#=?mY`=xezVT0HZ(vG(a-2;ZQfW@$VzZhi;{>WSA%=M{w6aug zXFkTxu&?D^YfvkrVJnYtzX${KaS?`J?V8_{*|->*)wvjy8`v4P1*nBg3t@}==9%Vo z&CAVuo41+|oA0OCwAN`psfkSu^$?9L43pUn*d7af{{za0ZtaKKvf4mKE2};Et<3l3 z*J3`FUmxw5^^g3T$hm6HM6SsF%*!|#CbJ8$*&T3nZ**^T1F1GNhRA}OzwEj21*JOxsuzSbAe)3S?S5|%WyVy#3XDRE0s9HGo~fImCG~XFJ2>u6Bmx)}>67*&EoCTfVYPW^Z6k z?)u6E@h8ZSp=PZt5T{yh1sQI4K-0a^9VC-!)(Mrlx_dIa01G67?rsOEy1M^bd*FWL zAw)U0bD%Lq@uQ$d|I@4QKj>d%KFPu`{Um4@bmf)FIqACGV7a9i-+x$te)5uZrFw{D z=Q&VPS=D09xs}1FtJSOVz375uM^>if`@a}KGRh507+P5xPu~fic)V%)X7-s5j|Er# zQ*K~^P3u8t^+1EYv4u)kK#Kr{nOhi?^_Kh*I1+M1uT7Zs$lqCQjjj?WVooUQurMm? zi7+awrPTksY6e=@25QeDG#&wKRMy$@C*;Uv)|S5z&1hQx<-&DZ7P6gFI-_=qLBQ*T zIHdACxT?jg6YrW*6 znAp@{SqPd#W)M(2HMtqIAsXO0)SihxN?Z`if0Z(mKwLpUV==S#?&Tj>ofY6Wb zsLrh*o3J@5e?79JuKaT~@d8b{Z+LGYPzsq)k^`+}Wny4fW!(s>)FFbBN2ecW0?k#e zpL{CwhTVo@P(wEP&2pw>uCGj!+rRv0_1N6%&N!Kafyr2W1;b|c2M$mB?WQNc_`;C< z?FmEjldlZP&p@+*j|D~lPkxi7R1Y!N@#N(1Y7D~v#TaHD7S7janEc(1Vd-ld-xhn;NM<|6%)G*#;qm`>e;z+( z{lBn_(Y5tm@=*>ZBbUwP@{F6?pF0X~6=wkXL-Zx%%eiovg_X z>@v)&*ct3vOFe=*Yr~V-xMVhqsWVPyz4>4G*th>7j>&mDm`eL(UomSQWiVuYEX4Uw z{5WWaqP<1L*~gh#qn&}#)vi6c+l`r7>o~(?UP%T+_GBI|ro7It+htt6+7YgJngDUd zQ`Pq$_U|pN5AEF^;QUx@+aCe<$HHuXSzQlq2QATI^k(&)%;oYsnU#}|m1}c%I-?iVn_Jo$n^&+fFt2c7U|!D6(7eo>!B|X|QJD3||He9({&4JH z@|WWbk7aKBnd1UljP-c>@jrG45Uy7Zg}6Rd;r)mI8%slDw?3}A@oQPDp<7t%`vdwf z@3k6&_6r>7e_`l$tu?Oo{ekz-J@+RwYcYc?Q{6Az=E?{$!Id8zEA_3c0q;M=uPqJT zxR-fZCtIs~^7G?t%}YGlCc62xE^B2qUIm(sp1}SDB`SR&h8$IV|6%^h(ooi|2q&_7 zL*!cd-ha5iyfjo0NzT<1BF8H9{)7Co($J@ytu^ zd3yCvW#50;zo1#|Bx|!OCxah!2BB5%{fGGZ$Rero??2ejV^;NK1*OvW59YrDPgcHO z&NiJDH2<(vO_I7}^bv@$N;ISmx$y^`U#ce=~w0lG+Uk`EUV!t$f zj(d!pyYID4eEh8K{RjIQAPZn={QU#@f2&%OU#((z)SAq~%fQNear?7Y zR^HnE;;i7FH2?b#@>82tI$0ULrZ`+ZR_opBGu;ZbVnIt5>Ii;_wQuCbZ9z*ebNOyK z{0&b|zs<0D+8u^n(Y{RVKQq2 zQ!)cPbg25M)cX(jdqJwy83a#HW<9_J3D#E0_aEYW=D1AkPVQvq1BoZKzW-p~eXkYb z*jCAnEbl+qcTI6%<=XnMSz8$O(D)N-~ z{fGap&FYJPvV$tMK~|@-5BkC&8vb29DeQcRq)()c(VxSMdFZ z`Hi4DYWfsgMuEu-3WVxix!->{|8I^9$mz)k*qK0H7kv(zK6@<0{$XPG^z$o}qC>(#9gJxkf%f5`ta zb326R%J%+4|992>;--v_pbdpA??0^nrn?OU}9DViv!}%MNWr}s{*;u8-cY~(y zy(OB}Pje*CW0w$*1g&%8yw9xO$-1f)~5A+zr{^ zex58Y$M9)-7rWh5L$~(_>iyf8)w#{4M}cz0tLuNGS=k}W-a!kbl@(r_DX(JJVD-Az z>eu@IL;r8B9?hqqyfncf@?4|a4VR59qQ{$;w)_|75M$UpotqJ~g!OHID#E(x9y{^w7dRcG2|8V|5 zW(+9Vg0>8R`p=+E1Dm`j`6RU}fwzl1mOTEAdD)Twb6g&a7=8Puyo%-jvYxcojXZ{K z&syJai2vHWoQL7*?`Cywvk4A=#g!F)n>}V^`_SsfxxX|fb^GKMr6ww=_aOGAUVi`K z{kF;#(|3VZFL?cAUU`aP`c6=@v-9Vqven843fWpcns>F@C$o7nszFOy)e8{Kswdum zSifTOxiUq0aFSJdxvY)RjajoBG$?kYc{z)j_%0>}VXjvKlljWUnC9P}tX3{p|9*e- zG8QxOaL`z!`f6o8bJoe=rR`np`=%(bV$o<;?`CLpfjDTDxXtBe_0tTjUXwW)IBG68 zt8+8jTnDuik{LOfn6)`s-!G`Y04Z*-P2Vgwiy^r*m2rl1X#b4Ett^k{nEai-6*O?J zDh$~kqPk?MunnlKcge*G+VW-cW=)*DCrDk_6|_E)wI0;Cfi$L!T&BA-GAOTGUV{*u z9tN71UbbYiK(Hk{guP&LK(IYK*gNiXCQl32b827!Evfgr7IX!o+-=4jCuKF3Kgt>` zf0VUY{wV9P{883p`J=4D@+ZZyS(BATt24R#I>QY2rsJ#qQb*a^>Rax!JpZ5pq z8-DHw&2K2ztNmoU2-*P$o?-)qAG7LG!L_!WM_~h05HVHBxu&&Wp=`mGwz(f6>{R}p zrj)@SaY>7M*}I}d1(+Uo#h z0m1S)ph+tRj>*$i8Fo#d<80Om>XCm|SNO>2I_D6`VUwU6Og^g{d<60590G|zTA?8R zc6J6vWU==j?5`>-tYiSmp{T5PIhfwcj;xd=Os)0(hx=DVkIHz?JP%sD(=@$u`)73l z42wW>A3qrwU0e4nD{wNb-42@K0C_|05Zf^Zj!hlgT8dQ}Op4VR3_9JDJHN8&HVapn zGbF#?&am)ctLu9M2mNH1$uq(g>kSm_AIG!)`MDqByh`xmTF}aUQ2t?7Z~xiFZZ|z7 zOeTuQSs=`*{k?&L?Bj6OU$xtdK^v~aK@%$O-$Bdsc)~iI-zylDK8|4h;kX~PrKauN zvQwu{oIBPa@LAL0<3ji3cgvNmI=NUO0j=IWrUs5MpRo5E?jJ{pGP;7qnO)nM-aj~h5ncTK1OIafF_6ml3*H|_ zh(L719m)rCXn;T1p{i5ag&JMoFYw=wP!2KxqB!y-Na+Tj$@8LQ>%p!*{^0Lkh#c!# zkX(T$$e54MLB5?6aU(=oiRF*70?5Bleu1(u#IMgEKHLi4g}h<@6hz=3zXb~X4rh?w zMptFEBfs7&7{oBE9{J6zcI1~Yc%K$TzxoX>_Il82MP#KDB4J8rA}MXZifrh61%q&q zDoLa`Prr<;0%Glj5RfX6wVYdpSp^QR+*=tsb1$r@YjvM8|5|srr^#19`5v+eww}(VY#KFYoPlXr(vIvx) zCcXtZ5#%svT3QH_hgblT?}W?ygmHwuU%)>PBoEU)Ss+4|d4v9^$p#TR4l-e!?#UV7 znS8=n-Ah9sXKeomYMp@wW$ap&)sFmozd`>kv)Yk=j4wfTM`b8zv;;Iu1U7iX`Hz$3 zLe=%aA@$t5i)Gi8IS!y)173l2VE(PtkCmZoSA14y$Y56EWNudTWM)?HoLnC&!464o z>n6_&b(h&-{}VA^2pUxZX=qmCWM)?PoXi*|0ZE(7SMS{q%8SYhEPuf1P=)0WB>k|j zoVvYP9b`5qGgt;Ag{H6W+}^C-$qY4=8GD{RzQ}MtiYgUQO26{U7@W10VAiQGxVsm> zb?yr;PF@`ytYy@0%yx|l7FVmS&*xW94oh6*i( z_%+SfTNs$HEn(u@@i#@1WjCUdfwe02Qq9ir{~B0 zlV?@RGtQg5t5Vf)!}+NoQ~X+6*_Ee#VR(O`elDXcD49T-7@(vwv;X7v($KHl{aW8& zm_K{6K$WKKG?1Q+rF@KO%AKl7N3G{3P`v7uC72`h(O7oy<4V3O-d42kF(3DlXtKC!% zUrcd!7rUt*;DP{6y_4Nk5AfbiJyZ#HN4u#UUZs zOF*5QBQ|p!R!wJKd7L3xo|9oZXfO2S1JzvhToLUUAvTviIKOI-T#J9-TVF$V?#>`N*}6us z-t6z>a5aXlXQiD~aQwI;VbXX15-@SnX)?tRX{3gxxEOP=XX@OwWT3Zr(!pi!_~;eICLumYbQu$ato`#o|bwI16a~`&yXLV0*7h%ooN$xCR>~zoSNp5|@kk*qt;S0xR)+onEZBcE; zt&xoH-5;Evoz(h%f&AfCu2r*oJz80&x+gb$VFFnSvGDJ8R`+KVO9s0=2h*C?+>iMmdwK{F*8M&HG%d0f%8`-4^Do< zl2AN>#Q=O#&Vlt;CeN$$3c7y?q*b_;#bG-u!+}%N=eW1Bw06%t{QiLb!N>Bmz*91( zrq6KaZD#G3J^fkjfI+eP0Yi`;klN1X*6!qa?0nnV8J_$VukGK?&TwF|LA_VK{xQje z#Q_WwAosjK;D6Nf>}Pcb1IhHC{SOZ}x(l;22r#-%-^ReOZ`$)FwXTKik7qvrR~%r# z0CHQiN+;v{1N?_X&w{M6n+Xa;VNM05*6y{h_qa@EnIO>Fz4JAsnpwYJ@aT5-4-Avr z*&Xio6bo1y6i-kwV4QrgUb24up2tG0&l+7?w{B-=xO20galbHY0?YdY`ny#>25w)Q z0y1H8%M^k42l#jS-i+P8$AvRfm{U`!vm0c`#p^%!mxhLJ2W=Mix&i9hG%#p&PJKCj z2@^x}k|pm?O_|^TY6hYAa4ZjbwdPuX3P=hE_cuUM39{(@f%BU=PeQW!av{*{nzH)$ z3Bs%lOz#)mZw4h<(E9CFExuocSrrbR+zwJXx&3&bFvpRb@7A44XP5 zIAQ&G=87DM&dG0DrA&_ec|46R3uGNAaUra{iZEmvTgK-ZH>@8|T9E)7bn_tusX!FoVtK^9&1{$5U4LKr~@G+ySO~vS0@| zEGDyge4gQ9^LYLWH;A6e4jrJdh=xedV{`gEBf{qKtQAgB>8=hbNJ?`+bw?`9IyrECQNq}AXHCcvjLfenk-6@<*h!?r~n0`1=KVtj8dlorhKw(C)ita z*-Spq=m3SE2}IN6oK9%?8G&p=q@}4at$!ZRU^DnUV+JVv3?P~?-Ms*&dh$hxMU&Zd zKF?SI3O_A~o=IJx;FInGJ7XT3+UFTNK*6U5k)7<-1$M@CHWgH79EBMS3O=RJGfsel zPYI$4(-{|Fswc09STu!A?(>WrHjgK)kb~%%d=Ko7pIzW2J)ceD^NbfZk7uutfJkE+ z`2l7mC>+F49rqO>H;YZ=^Nb%hkEg8=!DSMIEj)8fW)qq)d2%;6Nl#@H_&kHd_VL6O z0uY^(_jH5Hg?Vf|AnQ;QfGEO{d2C#tXGqvSp0$Dts*$S)8i*Vqjfl8ZMQEDI#`bxJ zhVA32E7%~KFnw$QQ$0Dq2OL{d*qA=gu&{kRVFeRJ&*XVMpvc_W0}90C`D`_xXL#5q z&t6djk;XJK0A}Q$*H14~b1OZz-yhHdhs6=_iEs6J4+kUXC)3Dq4-VJ81c zp2(K;dBzIcqla7F!(1B-CWF659*XGGW~PgznpJ$w~OP;U-+LWGrZ?cs8 zkw0hOp;~ekrtQzsN1tch00lP(E-N0u)K0daA}Ms_&&qe7XS}dWp0$DnqGNK_6p&Bm zJ_A{Sni#&qwEk&)^?Ak*yX2`W7_PXqvRyfXuJ*Hr!3JnXntXl=DB3!oeV$>lA-Qt} zxUxerS2e)^s`k&!N3CvG4xpP>tjb^nQ!(+`6^G=I3k;oD)h&RVbiv{2qgJ=%%g2~{ z-L9}hjhtLCRiysNpO2?7Z4fvBv!V0Z6qm`*)EK5<_^Mcy;Ww%(H-;%kE;w|$C0{wl zf@$Uj5t!zRe}~#8cT5whXZiP-mzA$JtkxCMQwAvm zI|$TU7BJfZ>n*oFI@HFz0(1-o8$+=~gh8>I!H!}9NKg9ld^Q2c3gZek#=maKA{-1( zY>t!(*ux=OCIuIT_Wm0)*=6Y-d0wfzmvy2g1Axgop@z;8o)u{umKYENB%sX$94=9E$hHT9N>r%Xhq1*XFF0X*0$lX^s*xz zu&`k5IMV?cUjPl5XiV4u88A5lYJVQ;aE6)$k`tJ=!2&Khi|s(M#EcD(#ZDZU-~&>I z;w+GIwFL;HCQs&>DPeZx&*Q0Vdy2)DZD@6SEO2d42gpkxAF+0vLGh95285gEOpcl< zC3ED@cr1Bz8#pXL8rdeCQC6EgVJ0Z^KAy_91>NsQ5#~%|+f*!eY{O%r zWt(vM{Q|<~qtt*zevEi}oi8b&@o~%4eoaM-$$FnBe%>q@L zk7u*3C>DLX;juXDN>tZE6EQgAJ|LVod2-JzDNwqb!nUMX?AwON0?U>_+&OvIEO5G; z%eDa3No*V8u`!=*Uadhp=E0qWmdFJ*!pfY-GuY-}OLr0o71P;f6^n{)d@Rg5 z8|?aAcwi$tUtuFW-OXp4h935+2-yj2(~8B^Ha?bFHU;7*mOrd$>COP*nVFLh%$CSF z^5^kvwh6@&78@UnpO}CvjX5B+O=0Up4IdAL+%&eHVllUkt!|G6ul1lNyU7l7z^P|0 zTL-!i!Vo@~$JSOX8oKeZ)X_F@fM5-e1cdr&Y%S=fr6Odfvo#fqrEPpHysQZv9^Rm# zIkW&NK)8MaTLY@k%HVRzli2~`I9_*vdvsjN=%-^_M=#| zbz`yw>rdQHp8$7U@|4M4b3q9%c`DnNVzFr(lLeQ30lN~5BNreXGLP*8sw0;nnV42aK{|^ZD^Vx2on)MAKHxX2u{n(f+ zd*a#@A5cA>|AC+L`l_~CxBLhF3n%x?mxyBdmpq^C+rhGreJh_$7GqyuVc2U)2cJM^&3;Kdveb= zrisTu_X2?M)BVDr`x6%AZ)bf7;)5_q%z*X%0{v~1!xre&`)`&!S**@rIJx}$_hc4M zhRNyRLq-gX1-K20CrFyKx+gb(Vd^{*)_SS6m_flnnDqh6`vvdUr`{}{5Xn#+z`#-* z;J|Qpd+~%wf#LuLk>UUc5G`>KIzgw^&gk0e2HO0nxPX;4ne8aU=IP5A9=`@1sO8Am z#N5EZFqvbax9W!Y-=aq+PgP-nBMa`?&8I%>+7+SfKKZbH|Zr|k~%+A2HsYkCXIq^Hk`wjcQYjq1tYC#P>{=;r& zqf4u|cn=eUFi*}k!v&k$T^I#9lmCV@Z=N}uVe|J)##WZE*FoFn|6XQReE-ogm?#KC2-*4_O z4MnWhn%)kY;dMV}Hkm`rzX!?q#@`30K`>Zx%`;zNzim<^D?#9y{=YMnOC|qzF+YF#pHs;@|;cYH^d)!|6%^o$ukzq zCnlS7Yjx{&ZfY^>+Sk>2b`$8Djt%mcBacpW^J@dGOnbi}{*mKR;pwmldwy*f_@Mn{ zHcqzb-JnCBytgnf#BL zOmt6{`O0v|Ve*$HqSoL^&(wT~IZw0RZ>V4X{=@z?5ECHhjfr=HHkD>B040=FEsSn< zQ)jxqUl4zKvddEKda(YZSrGlLDepJPFMR(Yei`J5y`VE};1kGUyRKKYn00|pbc7^m z^<7i|23Wd!$S?>yH zrPx1Zr6=%y*82(my&&I!7L}N@8#LRpuWC=`dCCMcgLyeChh8hl1kj=5obJjBPyQ(@ zeL>dW3DeIn$zZ??I`{)LHyd>UG&k#Y1GMfm?9$|Q%f-T*wb&Viqg@%3d#>}WY7vh5 z${@_v0=)o0!FE-r?!(E~moSKb2b~$W-1}oUXho%P)h|ZS>Lt(`(9K!D7?QcT7{c04 zwMMnRZS?l|T`roTMFK!2!Fxl(Z z|INRCF+67E`c(-Q0WH^f%*FM?ar>pNt>BfWlTSg_@N<1zyFCh;xt=;gf_bUU`wjXZ z{zgvSA6vNS2;|U*wqrq)&#&OFzkj*cbMki+hUBT{%);M~uum5U9pUtx2jmaP^2}{W zr>KDzRWYk_atL#^{Jzxso}mD=CHD8Kme$vxgCQR`nEwT>gq_Ta*Jp2Qw}VuHN+o3u zoiD%MH^jdwoSeE+yMF(P$={_Jl3Uq@CV$sv5PogVaPfJkk1*GfUvtwt(d=Mt>xyzI%n&&5PRbklRGo$0+`^@8ciozJB> z*^?Wd%OrPQm*`|m?zt``nV#JDTuL&XlRdfrxk$4*567kY)+Eph-d__z@$pMp%jCDR z&XixudL_T#H{8EJcLlm5CW4*zc<%FW6TKRJ8GRew89kJBzWh+uWBDn}+48f|#kkdk z@ltE5TC+OKZ)Jv+46K}MU$?S6o;vGavJ5W==mg-&;n56}zaM8e7T?Y&@@Tqo_;yFo zN!2_YjIPh7D=Ylrm>$Q%C^7lWDxUfyzb>`TRRtNP)qV0kD8PB$JAEEcfBt5o&%>?F zYCIgx>PLQarYoym`IX%HoI#kKohiBXIYXm+@*HlaOCZnbfkJ!!MbG`h(cTOT-G!^W z`ICEoF)^#Q{G8s-z;J8&^QPq&mu_F^)#%IWtGIt3%jV}Lj8L8Rzuq_eKf7>$r`JJW zM&GY{g;`mC!8E166WtFA16JRwTfspIvP=zR+5JVJ`-@H_c}_WQkOEd;&&lUktBTKG1WGF>&x2FSQ)`BU z&pAQSF`0XfLVeqHj^4D%ZDmZ!-Pieq*~^)d+n)=urVF#1GbJ}X7uuONx!sK6Wxrv1 za>H{GPWI%k=OUWvpriv%3_{6m;6yU{x(FMqaA_<5L@$s(S51H3V`_fPZ^=4|=Z=+f-U$za?% zlOd>Wt`0~kE9cbbkfhM8&dtH-`e?ec!fy`5@>(^oX3W(Eek$ocx(Ec z;E7(KL(nDnPZk$tsGt13oj-8<m(=7T_*?OryGFzw_)f{gWr6*5bF9lKJt_bFzhw-3DeF2(d;e;6_8>V zW@KPiUMw_u-iB0mIYtI%y?5M`xi&^ZHL_05+Stazz`(#T`NKvjzG8I&6G8T30dW&h z8-B9FCIt~>0f^!3O_LKgnefRzoz4#Or+VEScShIARzFqUWf&Qn*Sz@zY6CZGwlh4u zJY5=eP*nFTMo_x_Bh1}!a5@)wyH5q=81vlI%qzJW{)RBCaWX7xz0~FhI=(q*vcP7g zdeDiykEbsG&b*w5ft6<>_v73*zgB`PlAt?r*FeX1g3b^MyA^e#fn$0#s3Cd!DDx_A zhQ02|PuwMiIUSgdIklLlSAy1-Wgao=7UnqeXEM9XA7S>EKa<&5{;;~O>Jnz|Wb~Un znZuJ&>cF`f?-K;rR<&@R1yww3lQ(Y`sh`>E9yb$oNSd<3PbOt0PNw$(8`M^{B>rSp z_hw*LWBCKBCqs`fOnWG{ne`gO)P7~PpA58ehQ;$t>pI#2yUfjMza=~P)EmHOOrr)^SywuwS zbQfBJ`>Gb%zc6k0rr+_O`Mi0#x5?b&AlUZ>8{ax3m{)Q#Ks<8%PBK4e zKLzsUl}S-d(Vx7Nd_W7!#HAS-n6=3!aOa1CUZ9&WM0X| z@Hg~P8z_mWwX$-(4@l4gofw^bhLsDnxPRtk#cfjY&lo_vxvD@8VMx*HG`$G&?#}y@ zSr;(BFYv$UdC-_m)e+RLc(0J)w5k(g>FEO?OBdcwKEcT*E(JQoENg$G7uZrwE(Xw! z9gwB(0~W|kp0!Py9lWPc(_`|UZE7J5UaL9-w?lmU(uH|B%(v<%AB%o}^LHz(Nhr+L z^7nnf1!l&V%xWzEnpKbdWmawZ`%nwk3rO^F}{Ek)%d?C#v{}jNT90QsRJ?vlP~PxVoFe%d}oIYlcL(>Upo}S-Umz&6nxvPe&ipsddt6NHJ5+LKJrzB z8HMV!00YLSARq75hRH+9PRO+q&(}>}u}hU5a>c}&$yavia)a5=S8yDjd2%w}ZexA$ zPTE%8_Y3Z~f_ih1Jp#yPv@e!%-pJlOot*)6^UdUWdlcotX1Fgv7UySB;8@t*c%H*q zk#(}c0g=f*2f6GZ2{e69$6b%~y{y&2d(qu$=+ACsy_S0{`FGt#zL{*=DaI zdnstx;pnuvjfVb1{a^=3f~$w?21B?tISD==Q!r z|NP`Fdkwk49!r&ezhM2l$shJgLju9QXR^>fO(?r_veQ0eYjA0>ycOccInIpk7ul5? zo&RV%3D zx~fI?;AHlOgUJkEnLufJRonEZphe6_nI|}lKLw2pEMllH0iWroU!jnB49CTbv7YX8WmzOKps9;KIqEA#k$AQ5hZ3L5jE9;@ZH10vm!j zkAiNvG2rxldaF$wT-LdLhsb>hnA~vGKnNzR_5~t*!Dn*AQQcsTUku4DTuhMge|qVC z!u%_``ysY>zZL(*z#z=kRjjywRj257h?=FB-zUUhl7vPA=TX=p5JoPbE*-P#(t^nb z$CTN>GB7Z!9?h8?bxbBgq3VPSqZ^}pquXTG2D|qO@(;mRq8TLAb$Eb8Aad^$=HCY& z2yXD8=KX{GCeSbmXai8AyW~N;)?D-H-x)wRjHZ9R4Ps4hKb|)E+%ZY%?+gr++uM^n zoJ()owH}4uKL9T-m6;t1geGeo*ApnZkL78dYn)na^fs z*v=)ua4=Uq2Q)0{!#k0O(RVsGsDb7ELzvr|{jbzt+2-ro49(ZL8JN|17!I*t?GIw# z{5_n}I6a+l^SAAc$_w5w9BfveaGODS;%^4fjlaxL_08%$3{LE!{g>Ep_8WiS&InTV z8lUu-P7+yzQhPQ|pV# zY^PN8o^1iCc`qQq0yQJ%0h{SbwN{uJ%Ql~CJ>vXcKme4be@~7$mB7Y2?R|oM`{Z-4 zrT7?KL8A!oFU;QuZtgxfCCQ%5#30Pf{A$zbiH!9Q`P)I_uymPxj+H6-1RDdRd#wVf zkO2*`ZZZd?mG!>=do22Nvgg@0?%5n1$@AD0l0}%6Cf_<6S3mba$AL2k z7+o7(AMOVY5HYK_zi)NleEm7oOt6ey>%P|7{UG_&{enJ?p1nST-jlgnehG8B{A4`N zxuRLMlR=R4ujJFaf9;|ni;u04><#Kp3i-I_7^ z>QA1@)6^LpT_;c1WH^{=%}Plmsu%*&7cpWyUS%vgLmLvFuum>XkY|BXYB zMQ{AGn+e)43>spad)}~KbnoPj|Nm9DZ|mUoY4z;%;q{)(b>!F7y|X$veL6i`eK@@* zbFuuMy7jLF*emV=&dh7r7z)L=btg^RG~M{ya)yAz2b({NJ)Tkw4xU}pU-m02{9v%$ z-^IQbd;kTcq1N*6{fGM(m{nUqZOeb~LT+;Og? zQ@=yc`Z015W^G`aTyoJ^x#l|qA$6ONTufl(+%-M<#dC(u+rLfLy__$!`8hkI68p{m zb<>lNvT`Ip-p(<3!{vGPn>u9<3A$-@t?SY?H#{rj7#gm;;3dQ4EA0%EzkK1JJguD( zbl2MlUsih~C=-B}r~ z9zNB|>K4>`(w3Do_2*I-kbhx^0f3Hx0u}IrCT`bSgIZl}b1(983Rj-|4?4y3;eJ84 zQ>{U*nYM*jMI4*my%?E2q8KM%ZDVNmsA6Px&6>=5)!fv$^BDu^c+(Onz?Idu{7XK_$~5`ADMRObVYVaxeoijDYFJ-r3qF&Ufm!tkJQ4~+ z@9qaR1wg~PkYfdcp!f8Fw%n}hH0n&g!phO;GMO86B5_=sUn{5gQZH7oM%!e*RK{fP zP}XENSLSAwmOmi5Wv!~VkHu2|Kjz^42bxX*9S-r6;qgWGf6Xc_lWnirTPmw<`2%v- zM3B4w9JFqAPnP`3(5!Og4`|5a@dcJ|uKPcRlp+!j+Y#{UA>PSTuPL%Y>(o8hlo%gQ zzJJY7Y5$DLoT3cIoR*GiGn30^GRQ7yWl2t)$)wf_n%H?CV83ay(RDkoUbJ zo4nwrc(CikP(1nBb_OFC zy~*r1l$q{dovd>s$pd`SkSOQBw_x{y8ghQeKp_sQGdFd<|KR^C*_D;A`S=lr=3`eF zn2&v7U_Sl?#n@BRlRq!#nSA4hWew1V16maV$z~=mrQD)?VcWD;XxP zNOtCAVLtA{*nBjEk@;u|WAm{T#w7MbtiJt=*gX3~`wzN3{`~9@#1=n`HVaFmZ!!xPgR;UbhROSGsTm&J54u<7eZcwek$)ez^ZZd>Fo)sh_QwZU zzFZB_-G4U3b^q0nQurb7jBc5e6>lqZ^IuN(X63rn>epJh+5fgWBimFn->-?0(KJ?qn}kwo9NZTt3)$C%a5OamSjs<~vhzJ12u$>-&KByCw_Vl~D){ZFG6u z#Q6^tiXZn+X8phflFUDndUZ03C`0M~$pLqjlJYksd$V$Y@*3#g%2uz*pu@?Jv#=~{ z4Fdb|ehX;yW>rhF7b{EhDR!2}Q^NnpfkW!7sbAZz*2KHa>PP-O_B8)%%wx*e z<;P}s9tOX*$*c@4QLR%SPe0(#D5dcDGW);3AxF2r570k7nVo?p@GG-B55r^O?>|0n zU)Az(`}BK3jN&{2>sPL7Q)@fd>eb3RS^u8AS=0#z39ZieAM`&#B6c#@k-xlNOFad> zm$in09msz_nbQ>%v44{pOqn0Erh+1N!gDdd$46QIT@ASkz9$!SOD@|r*j2?4Bl+Ls zGV=Tl>_)Ofjhy`Vp00?b5vW-MYRE9UG9J4bE_0}24I0n@g)$_JL8B=~U1n|D zy0kjib-w@5|9n-8)#leOehf6?rDibs)*~sQr+V)l_TNSbKhvGe_PCA7 zf63&&$5LF4E|9Ei#W;D>VX^CmxgtiaRglFZ7*(8{T-V8u9D=!uR9t0d^s==Toy zkHLcMsrcleCmvGs53cHjgy>SC_YV6Hz@(1~PTumw!U%MaQq+ySbD$wvzk9I0PXouQ zF1;?JPP6X!5AJVW)tl_b%Fybbd^nx?YwYBGw-oA?by$8i`Zl^W`b_5hz$DCb|a?vhCi14`t54$*6qfuGa24H z{6E}muYTnBWFA?DeN#Y|fR2H0WjVP0@%c5s(|QX*bDO^(-=F@u)qV5w=?rsw)MhF( za56Odnr{CXtGc~e_sH+bf1WDv{a>=GJ=v9&;cs|yEGNTct!Gm8zR`{Dpsc*FHLT6A zHTn1#CT8^`f0G$sGJ)2|ynk^2+p6}*L9G93!;?9mG8BeCmVWx{YPjouyY8dgKZd7n zheXvYhGZ9Y##`-)`~QYR&Km{gG0>0(quWAz$*0KejK@B#;5LUZ=xmG0=bwp-i<c0BP5!MU3nnl+F7eY*W<X2139|U4W#)dysq#&#~{IW z4RnGksEAbE1dPw4o#kt&aiJv7t3@v(12{(LnZJ@6x*h>va7Yp9DZ-`fK&3JTI)ki zNHyfh*wi4*YH$#IJno&KD@kX-t3|AD_+1MF-}{|*s)0c~1~e#i<^i)74`>SPsk`uG z_6AO4u3t>k!$Bj!>GwhPmEEkMw)YAJVUyL~8gR08gIXi+Kj=@6e;Xw|50qseA7uUW z{=@(NRp2Jb<5R4^-YYmnPQLQig0ELq_vWe=%l$#1HwswfK?HB=NdSsM}i{1Gp>0#XM!#0 zGGQ^{>E;aLS)jPg+G{ndmEEX2sBKltx-R7fKNH>?9MIP4OqK%OBIC^vGxKmzYtwX) zg9IeCIxF8YFXv2Xbx&saE-;zx$Zzp&pc*o*;2O9!*}rX7PckQ~0I1!|>z-WlU7)jB zS?|lQM&HR?Ex(1iKd`I%tn~)XT&lG)uk~S=uE)ZtSpVUFGkC7)94pKF59hyvf(10i zlwdzOte0W(w{QHD#d{fr!+9A&y&K`!UPe%VcJuS);BK+(LuU1s-;>4E8O}{h&V9|G zyui(ok3G4so!M{tOj%;AsQ#lhp_>79_+eePk^_BTvfft_K>;VXw1vJ0|5miqSZ z=vHA)gM+2pOCwW3i4vU1R<#y`j~4@_iFQ}e0y++KM$CK28>wU|2O>JRFqT*&VnzKsSvzP497LR%Lf^Ys0hvo4$4%RDE)8ZMCXM zE<47+fpGnC%grJmwHS3c(-__Vh6=N>eE`kkbT~{74`=9N-^_NDVcYbc!*^U**&ly- z{*TeU)vfjP;;c`M9Q+qSYYF9VO)mOe%??h(>?M=Ge2!ICnZAXAVRDO#lHr2)1^kPP z!w#5Ao^osg6^4%`%>KVuxIcGt$rnS2p7xB%Yrd#M*vnHV-}<5mVXG%kX8P(4$s6o( zpm3Yxy!QAEXWPTDpgrN;>dwlV{C_zUtB3Hn?~IdggfmQTWoMe$JGp~{r_oKePjW$W z*LDWu_Tvo3;x8Cl*>CneezE*t@dOUj;tgV^kDo371HP+t0=sE(fuLzC_}U3bX;T^s z8Aq&V;D|jK;5nI{p+=Zp>`(IB=N!!%t_&C5l3$2%%D5W0i#aAIf9HsBJvM!AU-G+W zY|I+0jFVfBGbCs1VB5^j&iGgSuUqn?Z*0P4--CBeO;;qcD3b<6n7EVOCbok9~>@V%!zkC!T)W-}qj} zd9(WuhOhlIpFb9x-1SYxPuE_nOYot>P*oGyRQ zIGk!TXJcrXd9uS{Ath^Q*&io={|CPX_80>PNVd^kz;SciR|Zf?-+YXX!Du=t*@zsDaBO9N{2032 z7<8$}F$RtZ$69vLX4d0e?2~7dG8j$Y+;PHzGg-#bm_v+l*7QTu=QxAr6=eBqp%QC`5#D9H9$K>I1rpTV11dnZj5fdlh^)mXG%W`Tf}i4H1X1Y5W0v% z%gN^}s1yWMvkxy%zsI8WnvKKJsX3uenX%kWU|0!B_~jI ziMf6Q)|rBISs5h6BS9-9ctLbc$SRiFcd)Q>2Un)!joRf`yDKTxxoE-K` zZSuNb^5*QULYto-WiV<_KEy7xtuwiwO+c8d<@=>}&{;f_+uROA3jVgkTAj*zEZ>xM zSiZd%aPXMS^4p-^`_B6Z{Qp;VFI15|%dE!DzaXL5v)UQY`NNzg9G{d=-Wg`3I z+0XvXJaxyZ^E7C%t7-bGmdyQet(-cAUnjE^9IV`a57eZ45Px!27pOtBs&z7(%Xf&i z&vt^^&-z~t&w|z#h~EJ?xW0SALsZE*GP&=s853LM=3{?-7$;x&FC()5j#g)f!+Qh$ z`C4tDq15*V{=O?(-s8g8q;*V?Sb z$*`+atNZ-}|1G%(C$k;k+1z%EiCM#yVX}w}!{+uD#>t@_43ocp)Mo4Q|=s4UgpC1{zCmP!J~Iv%-IR5YgY?slji#e=NC>dU}ThmzNt|rmqAwsWX$rSAnK!S0zoZ`LCtr|8iBAU+d!oTtD6`{QoJ;F3JEp8XS~* z-aAal1sNd7{rKdUUmN#N?_y+B4As!;eE*=oaaC)wCo2oYL2Xf>6dFHyRco?8D--CH zz5Gk7T9Q3knWnD-f1 z=F7JfKAp^V1UZ3HJRR@pZwXk zv0>QU-s31d)186QZL+uzgLo9EsmNt(H%qU3Rg1EY%Fp)~_D@~a3en&0EX?Z3D9pyd zVmI}@Li~M*=<~~`rcdTQ@@sK7dy(=Q_u_ZZM5^X+t5vO4S%Hf|nO}*EL0N^1L0OFp zbXMW}>F1akC50IZYFD+tYE^5!*Ofer-RV6;K`6YcePSvj1U%=7%G~YzKH6U6oZ>e%a0RYJIOT{|3lAkP`3sp-Jq!rcY;M zV3^#Nwj!(z?3i`x#S5*qdINt>KMpRZZKt1MVbraE@>2t}n)1DZ{S{C*FUhtEx$k(PY(liK#uL0#J+7h zB=*|W-$5*1@Vw;x1^H_b{d3)u&puZG>1TAG=&Nl6zd(ahpfft(U(jz| z)syVY$|cPCfgO?)Pm1z-P3C6#&FaIr!u=VjQ*mKENRc-yM_3z}&#=KS^=q?w%P$b` zasJOg?->f*R<*xt^8?F&y#D@z{oYmWYONQKgM5@6{A&6`Hb&K?{2r~|#~!Sg9*eF1 z0g9Q);o%OTsn*S6Zx|luy!nVC?q?=KopM^Ei_A8^q7)(`B5Q)mnZ+0`nM4 zEBjJVK$b( zpj5^3=j3#4PDTR@*~fmY->$WafBXMmnC(~?s(#Ql24EA8vVMY?pjO1_rq;UEKyms+ zPDbf^)je9B?=QUnm+ZjG@i$yq>&u^FEr*Yw?)m!z^%qvPBzv>6Oy+F)%eVquARqXD zaaBvQBP$DZ@`mAq6gUR-o(Y|Qtx>bV(76; ze?wQbyuYyjzgB0mCo9{kR){#;CD0JsgH#Cb*(FeC>b=8*6bOIWWhg({ueH(jeSv)6 zs!qX^jh?V60l(Hwo}lRhkSd4{w+-(d7!u*~^-u+WBY$rH8u@a2GBc}@Wuej?%=K3g z?P(_<&W!)6)tT(gsyCVQ$e&fM=b#mU+i_6JIR62(sfkqww1iaFJvrjLj-k8p_2*1$ z-5R}=)t>xG{`QRnl%AN?y%?si;bye2Z+_Uc`RP^0#Af5vqm07EpZO>M_`xq+@q<6M zH?&WQ`DX7T4kZrbv^0jzPemDxQ&}0`3+(R!8Q;of$o2T#uWv91r0oUy^!)|?r^yVg zN+1=o?#a>L6*jtVzPg=B*Iij{%b(yoWpsS2MUNviQFbGc*5@pbvCOqAPfr|}N z!MVSjUd6*WrGDABV^ftCb})dK$bc(sw+*LS-(T>*wyGtWlT`?0fvSH{_Hu*ju<7BBmMkjXRXg)?^sb)qe zw#mWFjKWjf8HI1KGj4vcfnoEbOAM3$|L5QQ>J@`58zxjoOn;Ai&Z2bNKM^ur{Gi2WICkf3kr>kERT=<{J=PUy#%B9 zbSFN>UyT0KZTT4`8P`t_=VvTn{5$;wKVw~eg8<|J_De^u9lCWO?q1TJv|Cv>@~$bX zJ^7W)%BlwHpsZ^#>P$Y*uCl7rtn2-S^-osyCOfeztpZ(VVc?*r)twx-K;<2nmteB0 zJK3F8WingKZ}DlMY}n=t8mxSOL4Qs%H>=WS_G-q>?dr^+;Uv!HzPota@>Un?s(&OvcJt)1}@2WaKS=4WD{ z$N;U}=mV|X*wi7&Z2asS!(;J1e}v`hbr`CqYV|QXGrBjc^D*pdoz*}2Qai)sPoMaO zr?)dszQ)dYi0NUoae6p-04=tE^7J+aLB802R_4bu{{5|*n%vLD*XY;iF5+m{*UBe+ zzl}k-{y+cZ>1~X{m)RJd_#ZZHe*PSs%dYlM7Heh@WWCz|c-F1I$@!AJ$?Y2T{F~dR zgO;c;c+LAXJ^AAg9%HuS4#wuk88)|yI;u^Z*}K_%8pElnn_7%Jw}U6Nm6fy@A)%0e zVpVUm3Ks*jrWeEGP}Voi>PLPx`tCfQ+{w)bs_3}58(lYdr873VGcV_2uxo2&ogCiI zF!}p;eqqse#>rvqjEC425}Qx$P^_4_@ zUhAe<)x@TTMt4R(+5L^~jBX#de~mr4KY5Bcay=2b|xrbo*r9hJ&&D zAOAk`;VF211ZXx$?G(6^0ZuQ+?B5@#|HgZ8RSQJl(ct$2@i(>FrcVV`cu#}WTHg!E zUzL0cDK}YNS>+R(8X!uS2EG^Ae+{PeXaGoQ{iW#~;^|XF8BG*i*+F*6pGtOPWdZf7kNks}#AXSq(C^=v{z8<| zFDdyfD<7nghqW*o7&f(3o?F$Kc~+Rc?x53c=bT`4Mc(QF+TtM0+Hmmeb`aUrkbIm~ z0MqTsoNRonI!lityZ)?EvLCYRe;!A;{^en)>!qR2Z|TQoi6gviD(2m1>V zO$vx;fp)57=zb8{)R26Vl?5`w z0LuKET13zBf)e|`$!skD7~S4~c>fBtJcwDHc? zNe^mHflNFLHFvs@1f!DP$wQO5j{Fgy1sZBNbwJQt*YjR0s8#*`f`8|#ZqTBfYi&Vo z_dva#1NE)blOz~(>rb)jV4vJ+;Mmle%)zF$swJ6~RckWWk>8-R7ht7A+7`Xe_XpO4 z>PZb|ts}oDx+i~d*Axb=gl2VRP}Xz#&FH$;V}>Iq>q12FD$&j;3@%<1n?b7%L5&RM zoBhJ#Z45X2lY7OLAA7p~g;}ud7Npqe|I#?!Q;N|*bkR=+nB1}J5IOx1)AvX+nh3+h zpIw27pMMS2vkak!4bo^mkpFzThZLiU3`~#Od59kV$H^R!iKXO_=`*Al?dzq#|ATE{ zV)4`fz?HD;GGTz`Ms>{#*n_lxoW#P&zu>-*{Si!6^piMY|Xlay=H! z`rEwxBqO8i(({msAvRCM)DYx4df_N3hlAyt%YQL!JbbCW)_pr0!~eg1^)nwOiZ5c{ z&c^WJZ{N&Eh2oPy>;oWnrFa)R=%%c{&9eQi?whASXGs3+&dAEHyyPXr)UA`nxfpHT zOZT_BD=+xT@Njc!XySHITJZ#v;56tESh(owv%_uImt8(}@!a`KXRn>Ub@JZvM@L^B z%)8$pxv3|ag{|IBt23FA)oxvF6lsRd?IqK>Wf_&ZpG^<# z|8baEt(W1_bW2%AP2VK&vax5dZP4qyO$r>0*J{I=Nk%;qkH9>FZ?~6@7&xG#He%SUw7~xiU1m zuJw>`>SR@9g9o%IB%ndzjNI6{*`M4fF8TNr>tEpr2?ymRJdAs{$~byWca&pPuJ`}( z*n{=kWR{jskfLs?iRwpCckBIi#lOw!EuWNE{9$<9$o`1cU3t|T24?jmpPJQMJ}a*Q zu~|MVuLIF8pOqKAVTyH6F8nUEP+WPzAEst?mM^d5F&8k+ImbMPB*7pbeXFXpxdD$D# z5+I0Y>Q{g`ET5HEfoK9TG>JARV6@M5&!T5J0C>sjy z1(8h+AeE(|l3PLkFAe>>JNY0h7jlgYY7IFaTh$qO5V@{>|3Lnw1E^~buWtLd9!Au) z3(wCu03O5z=aFZXkP7a62dMr7EzV62eZVxsdAflDqssI!1x6Ds`Bp@=#cPkV+B(N7 zH+_o&qhdW5tBhH9ayy&MuI^+Ob{V&>so_)bsv9{q`-}a_Eui)R%kM7Eymn=U-wetNPBXk}V+Aj8>g9a@ zp#Dm-C#YZB@*A{8g{Z)Jr)3^ER&vEIpSEx$n7 z8d5kc(*YOi8}5Hv)th(})ad7R2lco+n?ckZwRx5A^u3CV%Jt{>uWDuGRBKH>$jb8mK>x;7tx=$Hs|WVKCtvRZ_ZAMZ3s37} z6u!>Ic(H%-wJt_bzxirEXl=CQQ&2}CIpqyQa??*X&|u&~-pS$L8Fx)@ZGY_d^IP(p z*^I5+$_ld>H+Ro=OwO%km2psBP|nEc3g5v$JynTOv;O1O$rbc&*NXO|6Sexsyh{2pyzHc4UOFn9oIRcb_jB4&AJxwwz&iO50iaa8CJD2x`VC; z1kDHR-<9me%FuX%(G@ecktg;TB(&-~*FgsSmV-vEmz#nH{6NieP=aK1YhKCD09qCZ zstB7^A@}qhb(;K01YGwbGQ7N-UXUN>9UyK4VvfR<`?e)mH9sW(80L}|F3}N zRJ>YuK7Ri|{_LvuTWw+Bm34DZzu$2GaI@+W>p!b{K- zo?-t|kO!8v-fK$&tq@iSfH;1``qot~j{{hLfu^eJA&o@PQc_SuQLD4jWqK!QCdu=w z-~vrks5=hy?_1RZ>VrML&H`RN2w8v&Y8>L!|5NJtCsqz{w-r*#yisd?zrlXc=@!&$#UyQ+yz4U&b6 z?p(Xnc5m6OQ#a0CyL9E&g?r~7oq2ZZ)roh<7#LS|fd`hs=}es&l+Kt}vNM1NqZ?h7 z)xP|AFL1%M(REczSnGQM0~_XJUJT5~qZpcxRxvam&th<5PhyMg^97}x`o2}2!fb2~ z*IL6`-z$93Ue%lI%_=m#6%_BPB4MB-lP0d}O?G4zVbOXzpe+f#j-I(319K4lc1)_pG+$ zYttE+)mnZiYq0zfzS_+oT>6z?czQRZ6YJz_+>FBax*0veZ6M?Ha`4dMBgsbxy{s{h-ot^0iJzP>DF1 zljYaV{&Q`D?ohqI-?f6Q{qpO*fr?)T)UuR*w*e~o;{+<6} zgA)7EeiY3=5SkOBAIGvjSk=qBUs-9%576#ahy`swK#psOY*uyo@i>;J~?QkpCe;agX45=9Y#*2`|m-8H)ORCM2X}{*mhXZ7DnOH={7oyHcb4- zr&sAPN{52yS6{scwW^erelfh?V83Qn%VRH4lnS$fX9^T1q^xSm{0JIj5nl=_YguQ4 zmQTKC(EkA0ZKQSzw3vTe3#JHjL4JybN^N0L>uOJZ2 zc@|<+>V1e&ORv2*u%G_EpneWarKox3UuN$we;><4|Gm^E%qGAA(r;;=_?6lH%iqcD z0&I`vzyC_^;N%c){rO+H)&23K<$sVZV)^r4VSDyj z|Cc}S6*hQcDEF}aI?){@>I>4)3Q=d^uK0H{djlIt+!9HAgKOhkW@UJg-oUhdsve^S3v@>KB7?loq3KsT4ykcsx<<6x%sajlm$Ws%;bag45P?;g0VonU}e8FfVWANcOzJ zGC6b`gKYEU_V4>A|1@O~t`uiTzI>hOZ~5eQc86`#g*iTOCa3*i67OJO5a!5e>tY8j zk2+L8y{UaNdqBeD?r#E<*#i=jr+#B-b${IZldo9K;UgrDmac}x(bIblib_vUBy3t$z6+uu9LKLV*Jbbnm;{R>D%q3cRh#hahi4}evy-TvO; z|9y~(T=&Pd-#>Y^ovUxnbyWpTsebybz5%Rg=Jxjv`|pAjWx7AE{{8`EOs1=#>0?&b z51-W+fYtDBfA3I#8>A)`6aw!+YEoT~8b4-cefL>?0$9!8z3(0DZ-Ue$x<4-e{syEb z(Y4h2F(d1n&*}|eH81zpzjye54Wua6{c-8{S0F{Pu8G!<`B`6lRxbc6irxF(VgD77 znn?G@#ou3m)I_>YwSLUY`s}lM0$7db-uDjmmq2PlL4C_-AT^<`jnR zKC2sm)yQsr@38+gNR1~bgzkaVc)DISe9X#v@3XoBSPkda_YUK`_MQcvXW_YV6Hfz()nLg*Sujiu{E%g4N|S3avh0ITT*S#|)V z#uOAnS3qh^U0LfbA9J%_`mBBdtZ3)v_YU^^K#B}OL39D6$k5f$@G&Rrh0p2-z-n|i zzjye*8>B`T6hh}fYII$nnmuM`J@;9C16YmZ=JyW!cY@Stf z$Be8eKC3r?)nx8`@9=*UNR2EggpPsK$ht1Hd(6*z?;ZAU0I87#h0qa@ z8cA1CyT|pstcO0UCx8`o?tJf1zYe5G6cj{o{c7@>y?2;jKOdyX)ctYQ_e~&0rmnmuk6BnZeOA8!R@Audy+iz5kQzhx#}(fcop?M%Rg04R;9y77d`>gH&R`Ye&dk6VWkQ!c4 z2+aYh;dRZmc+61GI_I;x0a($)T_9mj*HDAUtgN#>t1Ey-Pi{(PZvt5XE=i|>RK>b3w0O+VI_0x^0k~Sq|4={u zy~F$lkg7;f2v6~B?*In1^-JXY~ZAGWn_R9rXW!l!by)`2>(*p{|Aok2zT< zd{z&Ds@gy4y~Fw6AXR~&5bOh~3Uqz{A^+cFR@T1H>JCtK_7mPa`2Pf{^96-a4@jM_ z>-!Jye?MldXYKi{ZU9xdzxTbv`EMYFo}fh11ybkIzVG_TBFt{J((I zxq{L_2S}YO$iQ!pIa%92s|!HY?eBQ+aQ-7mog>JBEg*G{AoIRFW@T;ptj@5LvEFme zf&35lZSNiY--8t9f?U`HQkV-e@Z)1f)~3(u8(;=DzjrwQ2Ba<%&GyJTt3cke&^o856B|3m+$_aE%0uH5(j!@ViJn<0A$ z)DAIlG%t7MXkOCFv8rut^V|ku_J9PV*52;cj^x&7EW)6c*1Ts7tnMMnv!63`zIgvZ zZZ@cu4Lb@M-1q{ohierRF9o&PU0=Odn7<69=4S{@6|4K>InV!m`~h+RNCqZ8oy&&N zo!y;@VRHNNN7Ey07!^SrVRrWi(;I9UEuow{(+}7%Dp-LACjG8~cP!liEd>LehLm)s zfnhV}R)*w4Q%=_GgIQXg!aOd2gt>nI|0~t%J#oe6@<_&|k0iNxP@M?Vo-T|Pya&iBu_C}Y`?WhxOh~ws_ z-?L$~VEVs)x`Zv`UXVK{x3lk`e#e&4p+5B>C~P5TKd)=!ab4AN^sI!h>+2H^o1ZUb znA?5!`30BBlKD87nGN{%V=Qp!`XXs*s>Z3z@I>~< z^Pd0P%+AJ`%=DFIbNf<;WUg;adyNI(_IR9dnQJWga*hL}!R(qMbMgI$bFX0IaiCtF zjOW7NrJ+anADU`vop|@@_Cr&RT6wK2ul@wD-_|24Yy9Ab34aA?M{JI9dOPeHqgK(`u0^dFnyEPH&4`}AoJjN0tr zLA7Ny(@!`s`dF`ORn|H3YdUyiALm|iSJ1L^*S(ARxBLK|BKlq+ej@06Kw&PHUyWYV zTR?kmmXsuOb22n9_nhwU$SBL`IX%~r(SjeWQFW{GA{NH?0`@)Aw>UCt*MluTzF~&5 zT<^*n>vVK;vcaC)9rx1?_kKH_<&= zV0wcyqxy7bXGRUtG|-GzTgv+h_U}Pk8jgVE#lZ5ONz0g64}!W%pwR%(eqhd%f5RV3 zd8L3@IAwb zGtZLFq@Bt-0m=Cd3`X4$!eB1o)@{|Zujf#wTUVfMGApY@ZRDz!WPVlAWH(kG zh`O|(SFK^Kb8WSnlNnXTlO5|>#ai8y+rIF0x+l;5A|fo#!|2#NS-giqv3YV>597^# z;j2B2ldtkH3SaAC5RTztRA##JM_Kp__^{7~?#c{H{w!wL@<*BR$e+cGQ~oYyYWd6R z-s!S!dNRXf9!~dU;l~2P(>NI&n}nx#GAK4pzS_w+IiibEID(5&IJAplvhht$#=w5% z264v44eX4{jmsGpH@Y(_H*IHF++@zEJo!0;aeE2_7kgaWEzkfW!vy_REt3u2icH_- z%E(^QpSR!Ng2FK(V?wrXizc{e?0_1XrD}R&)AugZjzL){z(rwcpi#-04 zEW^cu?#jUa$u~I}l^eD*EN(DoRG#>pp?5nZ2-$2wLC9*X)vS`tGnHXg%i|cE*g zX_Cnx=3^{O%*RET4zWLiA2Or7 z;OBHvPsTVAH#RoCj?Jvk7?K}8WlMg)oh3PU#q?HBMla?Eb=}i1c`|A->Q4Xb$+(lT zb^3NM#xsmdr?+@BYBN80cWwG6Z$>qy_+8U)c{6%M3Ws+wY-eL&26Gan=j3L4g{4OPRwfYq9ecZ+KDXR7TgLiwT2l+Cl$b}k7o&@DT$Uwc4 z*Ca0{Z%`KYYJJ~e|7!UaUq(i`NCWI@)LP#+#NU|y$&b;6Nz`Ea88Jo)n^UdAY)AeE zfn;uKb+VrHYkmJ<-E3yHBY!8exiYNk5@h>0t8f-*r;n=Hs+QQl!fjFvph3X*57w=n z-sjJ#!{q;K`W}BqP38&j8>YYTXOv^9w6T0SohyLRMUv4@@FlZO%O67?R0C)3XB@B^f2Bw+1jOF+b3oGksM6qm&e68#CLzpevyJ$@RK7b#Ck4)%E^E z{)_4N0vHwQLC3Lx{rO&5Wyv3{E=^EL_(z!gD8sGR&75J3liMsAc){-VYTawKswMO% zY+M;Ms(gqIG_K67dgRa5{>e9C$;ccW_@E)pu(o@xQB&VP$eXZrKj?JeYi$tw{u-@n z(f!J-+7k8$q{NW*{R6+gmC!Q?K?k;i&H{m*Po#ebeUj=FXcN$1@FJRq{f}3*vK|Bl zu3BrO8!uboEJL=N(=P`y+B5NAoh}l@s9<2fBRPPT>u>mD*{^>Ygn6m4nqAbihDZn_BC+*7ptm%ciFUF*>N!H>m#H&d$I%xy6eCbec$18~FI53-^9N zPF{I`A@0}o6G4o6O#dED{}IHf#l(MPx=Jvk6O;d!=^4R{j=Yz(I+LAPMLe{uR^tLKq`>-fz!py9Qbncj4Z{=|v%oJA&^2d@QBzg2`gY#Evbw+|#+5G_*5TM18*V`CCxkh+K8{_1wY>dL9U5vtET#QcahuEjr zgfd3)oS&i98T%6ChV?I}KMG~^V(OngT`!EWOKSgYR`9ArWA>R0$uFKWfm-HjQ{P|M zw{!ZXFh(zv{d*LTHfy!~O`fjB3YvbOHy?760qB?r(7gxslV!pBlb?q(hqYa5eShKJ z#_0j!j3!L+?bF-B8O@Ry1VE=vfwpKRpJ!!Q)gsJ!vqV%`(*YH?8#4;GYN~UGE7$oHK*GHrq@I;8nc5r&wZwEi(oVd zafI2~J*R((V9bPaoTjHlGFqxL$bSxMeJ{ZOC-E*~f)sqaMgyc(&wBg)fp<5iABkjC zWG@3X^p4${UKY)0#^iQ=`nqVw6C#^B1CMES>b1WAu>T$FLC|?hkeg~GOvS4i7?`!W zZ-Mq6idQi(Fl%*Pg&dAN^)#~%7XxUVn^}#Ap_NOJ>-~oH+qK$2L*UnA7_BwDF0fq# zoij0A1$0`%5j*CUEDWvg$?w$JVLKAnb-v%we_^^+ETgoiDyVh1)Y`cH3xnNM(0T-A zHFL(8!_&(_M}IEgEpvQ2JBan1OXf6$GNV4 zZTTk{VVRB7~7T=4#aUDx(kv5YSSrWG)raS-s|GE9| z|F_%!{(rdr@BgdY|NcL@{qO(1+yDOGxc%?{rQ84hpSk_-|FPTu{vWvg@Bgmb|Nd{e z{qO&}+yDNrxc%?{qTB!e&$<2Y|Fqlx{!h65?|;|rfB#!<|NCEe```bH+yDL--TwDK z=k~wf7I=N^>E8!j-W4H5AivDEk&}k9vbum<$!vS#UZ!<{r9{5@4v_G zfB&6s|NC!q``>@F+yDL>-2V4p>-N9@D!2drm%IJ%zr^i-|AlV<`_FUx-+#8-|Nb-F z{`ddat$+W&-1_(b-K~HBU)=il|Iw{~|L@%T_y5|hfB!Gs`uG3Tt$+WI-1_%_->rZD zcij5-f77jh|JU65_kY=~fBzTU`d9yd)~$d4r`-DYzwg$+{~fpf{cpPU?|;p$fB(yF z{rg{V>)-#ZTmSy2-1_%F?$*Em5x4&R54!d5zt63I|J`o=`|oh;-+!xH|NfiY`uAV& z*1!K6xBmTCy7lkB%&mX_#cuukFL3MMf392q{wheT0v*eP(fmJq(efWu3k@6|ZU51+u)z|| zqvbyd<$uY|fB*At{`;SC^WXoZoB#gD-2C@H?B>7!0XP5s_qzG-zst>k|Lt!6`)_gc z-+!Z<|NiUT{P$n&=D+_6H~;;Yy7}+F$jyKM`ELIE&vEnLf2N!N{{Ol0um1nH8~^@) zxbg4*s~i9RKe_Sm|GgXk{-3$=@BgJ6|Ne8_`S;)L#J~T$j{W=ZaN^&8s}ukJo1FOf zU+=`f{~9O${Z~5i@4w86fB(f!{QEC(;@^L+6aW6RocQI{e;oh!|I_h*|KA+{ z_y5`PfBzpG|M&ma@qhoX9RK(K-0^?^PaOaE|IqRJfB*L!|M!2}@qhm}9RK%!)$xD- zmmL51f8Ozb|7RTk_kYrHh~*#$&;-{Xqp<}9%&(`3uLxL*WM@4%Zjl7A@_V4s(02Ua z|AyoL{#PCU_rK)$zyEp1|NYN6{_lU%@qhngj{o}~cKqM}faCxEdmaDx-{ttf|8~d! z{kJ&&@4wOUfB$uk|NF0Y{NI0t9Q*hGa^<4!`b+PQ!K70&(pFLmzUf01+l{_~yt z_n+h3zyD0<{{8=R_TT?+XaD{GaQ5H-S7-nIe{%NU|9fZu{l9Vc-~UTz|NTF6_TT?w zXaD^_aQ5H-U1$IO-%@|}-~V-I|NUQa_TT?SXaD`5bN1i=X=nfapK$iy|E{zD{{0|8vg%`=569-~WWO|Ncjv z{r5lQ?7#nhXaD{8IQ#Fv)7gLjZO;DtZ+7f|AjOE z{+~MY@BfiA|Nieg^Y8zTGync?I`i-Unlu0YFFW(^|AI6B{?9t|@BfrD|Ni%#`S-u$ z%)kFlXa4=KIrHy-*_nU;3(oxepLOQn|CBTT{>Pp9_dnvyzyCpJ{{8nk^Y6dgnScKs z&Vbr~Xa4;+IrHzo-kE>@HO~C|uXN_$f0;A?{)?UY_g~=5zyDlk{{3e;^Y8z^)Bpbe zIQ{Scr_=xbzd8Ny|FhHo{y#YV@BgjS|NdV&{qO&|)BpaTIQ{Scq0|5V?>YVN|F+Zr z{%<(_@BgaP|NbvI{qO(0(^x}#2*p255@3{#LPXGH~a{Ax@ywm^wXPo}`Kk4+p z|1qck{ST`@{qKLk>3{#dPXGJwa{AwYyVL*vTb%y)-{|ze|2n7t{Z~8v@4v$7fB&UU z|NAd;`rm)P)BpZ+oc{Np>GZ$*T4S} zyZ-$T+V$_h&#r&}-FE%^@38CNf2&>p{+sOj_g`<k?ELrt+0K9eAME`1|JKfb|F7))_y63^ zfB#SH{P+LR&VT>+?ELqC+fIn(AP10$>%p!jQ4Nui)2lX7V0U8afcK-Xn zWaq#C^LGCGKV#>=|C4t9``@$k-~YCq|Nb}Z{P(|V=fD3YJOBO9+xhRmSH{kN|C4t9 z`yaFO-~X_k|NaMn1b6=X@3QmXf4iOk{#)$)_upvezyCTr|NU3n`R~8N&VT= zvh&}6zMcR6bL{;0pK0g6|9^H&|2L0OuU;dsG$%)sfdMq43L28bg$c={>$?LT;zJfk z76T3Q#vK2r3myjqDVl;sgU1QTI3Y}ay3RsIsqIP&8ADj6>&<6$s;|2C?|FUt%E&vtXDQ=6^^#=JCC-VNi3}x~xv3y_adC2fT0w3a zn4Mc(l30?Onm0Xk8RKoaMcn`YXK?@je~0`3|99N~|AY9ixc~o;;r{>s6!&z$<&0+f zMVZCPWjcw;IhlDSy15`jix?Oj7#J8C7#Q@EGxCd5^B9UtQu0enbPEzoGN$vdV3eKi zvVyT^`jr)o2Gey`GQLpL)BpcpN&o+U7ybYLqo6cM3>mxVPq$jdm^6LMD#nWG4yzeW zrcYSSC^5ZcHKWY-6{{IN7^e%YWi*)nVGX0gc89f$5lquJtY=iIx9j=;-=OFJf2p4T z|G#zr|9`3b|NnK}|NnP&|No!X{r|sH_y7NL-T(jp>iYlxTG#*oo4Wr0@9X;iKdbBi zf48px|CPG_|Nqzd|NpJd|Npmj{{KIz^Z)<6&j0_tI{*Jy>-_(psq_E;dmaD(@9Oyf ze_F@?|0Ny&{|9ya|8LOo|36>H|N8%j+W!wAt{+It|NlQ!KcK$<|Gyp-{C<7^|J(Kb z|F6;a|36FL|Njqq|Nr09`~Uxp-v9qgdjJ0q=>7j+r}zJVj^6+OpY;6yf1v08|2aMX z|5x<<{~rRP`~UwB=>Pv;qyPVZhW`KmZ}k2Dzp3y4|DL}8|I_;Z|CgBX|Nn>n|Nl?) z|NpQ(LYjC^`qJyV(c&*56w#z2=>I1M{v+{qbRQOpheqRyY!VoBf7E@r^lI zH-zsTJ$|Is?X=&=n<I?)1i>?t=8eK#pgqBUi)V{m+_-e)&87c zI#(QuKgK2AR(jU?=jA%(d(Cr#D;1yEFcWS1>gs#lUKbkG;_tlI5#Y1H!wGVya7r90ZSMgzW)24KVvCl11L2xEM#l|rHBi=85=+e(T|yd z0hED2sQ{M9K|XBQ$JhW$H6Fav+s-mNv2^TWYyhRrCDRkmFu>q7H1sT{F zPBAhtOxVoW0J0LqH)3F5u-Sm%$1*Z73u=koZ+h3=Aen{4z!chBF%(8$kIM zWZqT=28M(kaP#UJW-&4_Owwj(03}Qz21bU1ObiSaNDlhT#K6$99bo_{=3Z< zCAPo~WbkBQU}(`{XlP+zU;vqy0kROuyh#iU3_IZZ>)9ACFfcF}ASrmr$iPs6KPar{xLEztU)qx850A80+ItjiS~>ZLqiDELPur>1`i|$ zPh?_XC_qwQ%)r2)gT$Y}$iQ#`?qfCvT_y$w38?;hkPBs*7#MUAal&wpiGiU6$pBCR zBeM+=b|IqZ2@?auiPhi` zt!DrQ=`B!st;^7m1NEWEZb)7L$1{`-a)1n!4T^6CC>xYGRiJE8ylX(&37Z)kbf9cd zXc$1*ptv`IvIBP2Gd5U2IiOT&17$O8W^8bPvO#IX1O++@ydw43M0V0cC>{Ne+|^%8~_8HYjnHK-r*l zQvqdz5?KwD4T{bNC>s>lEl@TnS~{R?P$I4GfpS23cmk9S%D+>fY*50Q0cC>{k23vlx^2Q*`Nfx0m=sDrY#V5Jvb#-Y=p%3IZK9y8Yp{~1w%sv zl&xjO(9i;9%ULosbU@iImJAIupzJM{3=MOj>{*r!4GW;`PnHY~OQ7s2>lhkVK-tUg zF*K~%SP!u{;vPf82B^fR*9;9?pzKSp85(v#*;$qh4SS$$ku?kr2cYaPs~H-OK-q^Z z7#dDM+3zeE8kRr{@;`hG4Huwn9)5;~D^Rvmy)Z+=4JZdh-$7zCKn*g{V`yN3vbppb z8aSZrU%Ctp8BjJT1Ph?-Cqm2(Q#L_7rXk7PFayetkYH}u0A+*dEt?n{>OqMP#5n_% zXv$(}cmienWivGVfwI44Gc*Wnh8XIV$Iu`GWyj<(G-yEC4*3iXI#707K0|{Gl&zG{ z&=3P@)_zII-s1qLWYJOD0@yJLxac`h-EI4%nd$J_8b}Jh8!rnWD8?M z0hBGVfuW%V%I?|1*w6uGJ8WQRm;+@m*}~Yc0LtFCfuUgwm|f4nuxATn!wxWqf#KN( zhK4Ip_MI(^4L6`{zKskGZ=mciTNoQYK-n=H85%^kLL4fym9aqr%AT;1p}_~r-msCO zAppw0vyq{p1j^3Z#L!St59Q3;#LzGY$`;zp(69i?w%W|la0JSJwwa;f1e7hdg`wdM zlx?t;q2U9RJ#8yPgUB|BgSKsBXpn%iUu|P(2!XO=b}}?XK-u-5b}}@yKsgpW85%mE z>~lLA8m2(mOSUmK%z(1Fb}%%|fwH%3V{BLeWrM_zK-p)uF*cllvL$vgG~9u*pKN1n zcmQQj+r`izvYoLW+~(P{i=jbcJH*xJb}=-lK-oIm85=a9>`%KG8e*VqtKAF@2~f7j zZia>&D7$1kV?zOy9k!dHVFHxBU^`>O6exS&eTIe^Q1*uV^$ZOcpqvNW85^!Z+3OxM zG~9r)YaTK*DC~eZ?!z;N1`R0N!il+|0m=r^ElBJiQ1%)*#)dyo_62#y29BK&b0T&! zHt>Mhpz{BL9AiTdh{M3Z@Is%lVFHxxW5C!j1ML%N5>Avh6~WbM_?yo!xbo-V-sTosNw>tS+JU+0aR^+*fOBj5hMrI zGw5t#Y*2u37#^)*Xi$N&6^s}gKs6Ld11QgjK*d4%JOauFlGl&%6znV?jx0cC?yt`3w9N|XjrHYmY?YB!KUphVUI zO)DF=GdA=<*`Ra<;)B#2*v{Cn1uD+|ksFVG!G42V;W? zG~pb0!_Z&>W%qeAHh>x`AT=pF7#lzs#4gyu*pLBLv*sN`Lk^TZ;XOkGsObe#1Byll zXmQ?S!_dG2EB|F|7#cuv1yW=HYA8Y#CD}4GfcPNsj10zxDbV8i&jN;q8A$9oNbChr zw#h<V_8J7czF`A`)361Jy#tB82Z? zCS$`FC_CvPLjx#xfzN-K-r*R^ntQL;sH?hhM9~FpsWVc{AMO& z1E}N!u{Z2sY?uI5(m9pQnO+%V}k=!e8*hI1`jCv%v{C> XP$dIW^I|Sz1E}Z*vA--}1b1WsKUrn# diff --git a/pc-bios/opensbi-riscv64-generic-fw_dynamic.bin b/pc-bios/opensbi-riscv64-generic-fw_dynamic.bin index 5eb0a743260b47e07e674db3728d6ba4125847c0..80bdbf2170037541848cf96a6ff71bacea91baf7 100644 GIT binary patch delta 69855 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

Sz&{~uib_y5!7fB$)|{QJM)^1uIEF8}*~ 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 delta 64466 zcmX@Hoqa+p`vmR48H^0V954R1dgyCNFeZy|a7~}Y$S}F-&|h(81_oi~!@rd`Br!n5 znEp0zVq)0L9PA)IkC8!`kMEbVK^?>NMPT)n;)fYQ>J=x}D6_9)WSHEiXEt$}tpnJ! zN1s@oLFVu?7%(?Fyk}5w62HaBAk3BZVR{w|!{n~4Im!lH42oQjeWU)1b1^Uob9w0% z3q%=+XR%CHX7n|jz_FQ$mBE;mg<*3m3xhEmC&T78P6lIkE{4smObp`F85xAxm;Z0h zW@ly2ac31zVwt>`a;&^7&cAMXXebwESyZuTAZw_TF$k4wZ3O4h+tGrt_o$G zQ^4w;-1?l4*FCxWIm67u?jRH?aH!1;fC<$()=F&E}n~ zbJ81+v${4-_x#%Gs@D3x-~f-~N01o~+^T=UA_4(owqN&Tw08GCo}S9cFuC<eaO z<9mk&^~t~3r9Hu>q&B>FNKgXl688D?U;HS@iK_LRzqd1j^t^XSP%fU}ZBVT4@Nu#@ zJCpGB>x|QvGcq)9PhYcZdPnlP*7p-0uuP8QkYidPHMx#M+B3nR?6EZKgGNxO2naAd z7KO4I3=|*Bv)%)XGhE<$ED2>RFqAzOhOrm0K9*&@qt^O9p+IHwBMy!F2JR^Z6LNYo zghjcS7~L5szHgY2qSpF;LV^iM(FNbfBCIz+tN{7P@~qcDG7J_!w?o1+fJv*3^DHDZ zpB{mP=F`Ua4h13a8w}#XY7`i95Nehlf~Z;A_};-F=zYV7nAUo*FAS;>ic$|i6s0!4 zclhA{zF|Yu`+yH|Nb>t2@*s;o_`Yx05CKj*0T(0@YE<_?)TlPSci7UP468hc)o842uWt+WCAC=?B2tmgojY0$*9wt++VtL` zz^Pf4n^ioOu^yCDn%_GVIKF3ikh!WgnVVG&qO7&$y@P~G1U)7q-%BlbnecJlo;e*ZlhJwOXt;sAf(bl&24il^!U0Ge<3lylY zYE5Qhm4m8pd+$*H!Lren(e=H+1=Urp$^5J`5GmL8_YMITJqZwAYR7wr0`r~}2#>XE zWn-i2dxrqC_W>W&v^w7h6sSwHu`Z>PIiX(1`g6%-N{i4M9#s2uJgUa2ffLx zos1Bpo^}ayvV4B;ut66T&}yxxTHhyZU^@j>&D#CmK|lv269tknSRe(HNd=VOKq|&wTy~70+ zkSIecLjTjg_YMWh;%STw!fa|2AUS5~1hv-p^$7=J`56S5TiqcA!&3|89lsbDJ>MHl zh!UT}$iQslQ!ttP1H1TXaPecF+@i^t{6U+$S)GT0RrB#rb!dT-YWm*5AWC)P^iWVq z$ZC9cH-wdHq_`KtI%;?oDyC{^xp!47Bzo$f7QJ`)Ao;#wg9=1hs($2Vi2IJVLzK9N zy?3}EE(}f0jIOs@-!mvA-+~&D8us4dgJ`3xF4XW;?bgkc!$BqHt?6@;H(yt0Z0+87 z8&rWPSZ&wAF) zmdW?{+#yPzJ51K$mt!iBne4;w!Xh9MdUtZbW|7GPqAZiw@bfTD5S_e>-<|y^D8N-& zCvymRsvc)#nB1<;uxh&U26hIe6i3FU21h}q2W(FmI2zr=+ZY*`)!hC~E)!5^2eX&` zp1edrQU4?(!{pAFKbp62DqNaUtm*Jk*7ZHZhLq;*oeC3=&na&_F3rlx01AUf*Y^ei zER(+oSaKf+Wt8VajpyeSPgc+oQ3G4_gn>gT1(c4MO^j47HSl>@(6H?W0 z1?A?Wk9r1FIg{PY{SWSi)>HcFppNEPpZij*vEcJ19N0Kb_1cEDd3&Kb~wLtjN{|N)*o~hYOpk zgr1ZwT=ZhuleRaf9{BwU`Vsae>OTfG>)SiL9zRA-nT!^kkXr$LcRu{%+ZAopN zUXR;3|GjrOpq}i(%3#gq%9tFW#r(KG>u<6&7lT(DB#X34gA!jr&DQ;wy6;U{+|Tl_ zcRwurWhZNk=uS`4XB4R~)@CpP1$^`J_PfbNUwK$PSG6Sbsd7iP>UC}Ed>>#?l^ng2 zrC6Q8X!7+h&aff9+fy%GF3gw za?18=T~wKv*wiq){mTDB_s2Qk|IF^3^eGyP}(%g=1AlS4%rK%x_( zLie+#O0%+VxYVjT_r1b|$VSiF?O!8vw?B=H-5y)G=z-cFuOEJ2f_=H!iKi z0+7P;=-2lS4$QToTla%1I3{t%$&84~a90F-|%-S$MiQ!(=frhF#N* z+mA6QvG=h<^b51MZ{Ib2PCBFOoQF*ft?tQ;Uzr>QThk%s&g^#f4YqUND~Kf2FG^ra zVRQwR3yiK!4W*$?4U_Z4<(T$AnA|6>R9}A&BoC4;EmV5A?9aI`44iCFPyM*`;o6&9 zFYY~g^dRj|){nd|o2M>iP&V1}L-;x?)25bfos-!=FiSpe68-Bge4Uk9^6^3QL#)Er zTbU&vKQv#&Dt!GYv*hEC=95^3uRmp$eEieAi#7Q$E5l!N@w1E!!o0o9n^SukN+Xl& ze{Sa!=4$yd`MU^%R$EZ3vdx!o`&!-`C%_g3aHjGk(@^_}Hi+Je8ek@>C8c#)*v+CyR+P2u~AbST#*=8nb!J_dYfy zwoTI>O_MyVyv2-hvbZS2WRUFib<_IT>ld+Yo8GL^%kXGAtNV=8jGiDvgxh2p8Yc#| zzBf4F4s}M^R~G43UWU(V4j-Gu8YfMjF2=BJ`eZRyrp8H=*dZo#v0s}$$62lITU7<{DuFBIS;?|WwyI}YZuQyAve|MT)i~8I zs`YAhtMp84YKSac^x@KjwlB-xoO*HYN!XvLA8}ujKBT?LdeI53yI65pK z(IMT*&OmN-)K5Rc$S}F(NMG~Q7KY@n+r=hxvHT2ceQ)4k(fquHVO39Z^;eO};+#y4 zlZ9uCGuX{Om|Yq<-IJMNa%X3caFrB;5VtT-%g?{k(!D$kXlY-Z7n<~YT)NoLO$R0R zy)59w&H_*D_0rclK&gH6_j1N2aVD|G$&8b5r}*^NUDK6Uurn}vCd+X#^|&;N3b)BH zG)@FNSQp~p$2niWEh}Ivd6u#)lP&8}l~eViYNnb;IZnA=t!|mAiA@cg*=I9?98?=V z<8b|K_Pe06G5hs7eyFSBvvNd|B?L4cEKO0u!|afZc^~HU-s@Vjoi3DG4gReKi8+;{iTtQxw$^A-ELT@^i%C?1Eb$tw!dBmvoqA1iSGerurs;Msyz(C(?JDTa^W)z;qQ_RriYo+TD}R3i!m5Y7h<=Y z&c#0698@f`=j@t3!})J`GVgbjX7iTsW?e^LPyVjSkUWRoX!1`_hUAHyMz0FIN>-I{ zRldqxmBp3)tlF(+Sq)o#?X%pVR1@6!yqii z&crxLnv0zw`NMIQNIo>ZHcW8=t5$O5 zE`=G+6WJe2AOB|@?#js8U3xv)pGywp_{rj844a_(>}J%1T&t`wgJI)sP*Jhh{juEl zFNZ`xZa+Ao_weNDA`BqkE}L#N9a{8m2eqBlV|Ptg-onlR^4sH9&QG}1Esxp-E>|SC zD_gL90X6c9)fr5b4W4{sPUm4r{`S0HjMY84JAc5j$bZNtj1u(tnS00Y;ojEGB>*blcaDYC(~ppNrqFi zD#OKRGBXHst_)H(c=CnOdop*+kLk9|43m3%11E7Yr+YFae|y5foL1k-ko@!rQ*zmK z2IllmhUEO|4Cd@i49Rnz@G+ZrGB%sFd}TJ{WGwAZW`4#8vW!(*n3I#~al-3A%+@Sl zeugLW|K|9t#bDCBos0SA`91l2vJakbHf{MT-O9qyG+nFH^XP2$+y4vQlM}ylG`fbh zz7Jq1yZ z`0;uM*6!rX%NTs`D;pg761tz!4O9$qF}(l4fBoi8 zNMo$g)tc3n@x6kAZRyU^sDm3zqpt3T^r%1u?p62XSIe0g)tN+@#2F`o8Xlqylf}dt zR!uiUNwV%nyQX(|Grokh$CXk_LqU~({fu-*S622J&)-5jX-X;LTNxRcRa5mGRhdK? zCxR4xR%0-kz8%!bVb`7Eo?QBrjnzGw=_y-fq0$GoFKTZXB<46LSAJz`O_|-oa$x10 zOCpoYul~O{L74pmbMIlZR%M$lf8GZyFqLNi`oGz<<*#u0cV^86e?$I>2*NH+xzhE-GLud6dHF>Y4~?tS|~Hz3_U#_D1aqgMe1&XBCH!?*kS%wYn!? zTh7oV{!koLqyNQ|xA{wI;ef zWNCDL&!AxUc$Uil$rJP>WP%jb^C{$kHas$u~Kfgr`d~_)Y&CF2&v?ZZ)fwUD@ClL#Mm4 z$}a{;pgCnO%4Es{1zmkpgG{AXXXo)f`FqkQ9&VZr3LynyNF=)RNVA(V@~Un89T_4Zd_Rp^M@Ag&gjINKTZ2Nb0vbV-;1<^x#(#IEVhJJ}gN z>oAx!x(IW%{A7|0YFpOo*9xj2TD{&E98jJ-MN3PLL9y~?qib60`+@}l&C5GECcaK< zegB~U^|IFY59Uvwd`HWheJ7|E(fl}BPdixM6*Ml;`dr)?J^+zlQjIHfE~VNGmm0J({!c{}@^$v<>#&Fwj#PG)CdDqi4j0_*ia zECiK$%nZz?tk)0@lspR3Jh}b&mB~4}#vl(hZ&$xGd6}-BOFc9vtU9Y~v5G24VK&*Og6PG30I+W>q*?x*y?okfF`n*-uTD&~sxte|~a;UKA7m zsmXiv;+Xi4OqS6%V0wRGvY);#bNJ)elM@U?I203`8r~-ugiW5MFUO?6Yw|9Ac}f4r zuT=gcXL?X+`95KT-{epFR!r|VP1ZBeXY`mHXCTk%esy~oXx!gza+`q~)B9DE*BK}> z+E2b%*kek za$*x4Q~ye{Niu-CrjuD2IQ&}Q3kcLr&N9@L1xNDp$;O;t878x|{E}So{)7D2WuQ4E zhX(h_8w@Sk_b@XE^YHXd{$QvRvOrI(z0;l5HCgIAi!f))x9L8N43m4#w2H21HtAuw zH$|=Wy+eZCs&=o|#`o_(+<$cnG?C=sU<(qN`S|^Z{V${1uC=DMzE{}5cdj+4^}U0G z@#F#{lbCaFF1@(+gn_Z`&$2JmcY(T%U5(8yhvaI%zfuxsWGhU6#D znI6w%`>VNt)3vGL@ssC&CbzaS>9tN~W8e^GYh!vZFu{V+)ph@rhZ1R%+gq9JT4y|k z$?a=>FR;OE@+RYQ|1{75VH^AV3-KQiQ3{GsOV{@g;y=FJuju;z!Tk>>_iKXqA6{-Z z1o7XW-0leCzt7$83F5!=-5&_zznffPB4f4lDP&|tJy|CC<8hAk#G^d<9}iAXV`OMv zmi8Z1F(>C;=UN6Hv7F4-z^v%DY^vJS_XZydCSNd-aPglteI=;KmKj_a;-UH%6M&w&L-(QgbsMVS5!OAo}osmI#{qk>e z?PPfW;r$%ut(*++KjhC@yPY-tzv&07V8uWx6VT&B*DJc&&P)bvn$zw>k zoI$wCoZ&sg1#@5LlgaIzLd@o!pk&RQ{O-BXXLW@H5P$Ra=M1gg$*t@{&D&c9YQyEk zTRm&VfA$McuVlK}ue{}p0LZxa3=@nezcO=V60w@BYc45-h#yEj+te`mgQ*yYfwttq z`o5}jD_2%_H*qq$eZlBy#?wH)0Za>|OkzsP%F%x0d4+o019X>K@ zYqd`|1y=~+QElR;peo_1$$Nzdx?%07+M?PZaz{fUGOniY6&!RRA^JfeS&-F+d3%dM z^EMU%u*!Od$*rov5T#2k-YYE7WZuETI3s1cIjGUuZUwQt%?hlTVRCC~07UIm%l8To z)R=d$FwMw;sCBo7sCBc3sa@&|QLAeHUO_>Hc}EM&js%F>c1wubHp_aL;-_8^#i=Im z6%rJgceJqX$bcw5ZVpj=%p9gx)dQk-so{Ht1#-+gTG)0JK-99ELDaID!PKU@LexIh zd#~_7nt4YH`;H2TT6dG_W{mX=liS=(V2YPIK@_X%yjM_=WZu!jaRcUJBZ$FmMliKc z?ICJYHQy^Fh%xVI;k*HJumMEvF$0)dRa=PKrE2dL76>!%XyLj6b#OhqK14B_K1^|{ z6-4n<<@X8?1ekZUaNmHrSQnz!O&6wisX0Wgs^WVE1wQ5-Ej&M94%UXKZPSLSeQE+x zn=1ESA%UBDM+@(djOq2@cs{NPQG84jrdZVoqIjwFdxZrY%sW_^XOuvKja>txmQ4eu zHdP;@_Nl~sg$Jz6J6QN;)Iij_t3lMdsln7P)q$v06??Csz|6d(o`wGh)Zlg%h~hRC znBu3J5XGs&?-ddle$+tZ*_7e(>QH&5_W}iV?-LX_g;{t0H#S|sz{&dlL40%bb{2uj ztSvv(z&%K13zeVBHX%Qi4NQJ3o4EXb|Dk^AbZ&6wdiM3PIP0m&1{z|73AVhSp|T(AoRkWA88gpOU+OSu3c9pCAZPzwBe^_GN8BZRfzE z1yT^vW1lLKL^n7>MAJSm-T(dr{}fQpe>{=>z~1feFWm1x8@^wy_5FqW8*;Bgl(l_f z+!)k;4xX)B#UWm1{q?G^KW$w~X zUajvZG!!K}u?kJEW@KpI-QCr^ott4*3#iAyY_+Pt(Nmba##~;#&gp-k20&f{A$&jaekRNs72ZEL48%r<6zc5UaiU+(X8(;I4Dd$ zWv{Nkog1_!>&4G^5I>#VEC_CRgJOa~U^_cI!&&y?3Fb`zpD z^(IIyLmtsmUCUa`ny2IC#yO8QHe8GqP=G{r_`v zyE_vkiJ!RKC@Rd_%xv7goxy3k^ffj{5ohV?Y>a{ZGY(H=e>`>hKVfEOrdD@lh0hG1 z)fsA(H~e7utS(TayahxD)F|)x!7!O!feGZh;sAk~Vuk<#P!fjB`+%~BYb*CzP9 zG^ml*ygfZ_@-0VYZt#kYqp|M;E(A{IaN1JeAOV?rxby%v`2Zk*%jE88@@73W=~*W-0+p5(>nX+X7x#~_GE27$pZ4G z!P?2<&c^kvERW~U{*_$e$;bpA={z+{xq*uTGS=^wi9Fg58s%q%83#5ka62et&8fb6 ze^36L^1HYFTAQZ3Zf|u@X8+2h1#PT6)qs?0sjJ=#eBhkSo&a^G1K62@;-0SiC$k$s z1tD%1^eo&znZrek>G`V3CN9eC;5L=}oyl=7;=_}?U zZzI&UJ{DI6HKSV7-wQN2Z4UFOV%C?AQe}|l;AZ=E2#IruI=wFo1<`r6;l|;|8FKq`FAIyY*E2CrYIO7c=DWRB?c{z) z#~wriP{lkl2i5R`wZ>5hagN>-!J$ ze}D=nP-G!5DrkEGSys@%v8u(Wli8Jx!K`atXL8g9fn;`8p-t_qZq{sSj?Kr!8LYX# zF|@MR|NWKh=glcxrOuEn&&4NPEzXe4%+0{)y_-whaWXdpQ>)h56LS(;4<~nWaxpLG zWbi$%+_0QsPC_gDoCnRzIT`+%D=+xT!0al?VBM|7$jX`dGdaqEIjHmG8L+MvP7aVR z$HU4E<&5aMYAqkv%X0p)=JsY>mcRyHbg>A$>|#-NRI5`qXxW7|cb4Pia&-ofQx?8w z?T+fweViPcz+P(=*9Km^_`&|oV=1nG%&wdap?5)!Zq-`(=!urDP zajow^+f@vJEM2$cFDp;KTdrBjfF5U zT6LQBIkoR=Gipv|*%_FX`M>-Tu5@RZ%<|-KGB+m^h<0>i z^qk!O<$p5wIW}Q72Ij^6NB-?=N#@~XXgoH#T)m#*=; zJ=+&!<^v8OKUD4)X1lRexi8c+33D4T3G*;83-h-8NETM-W1m>XEJ9Rd$MF3Bl9s42H^}1hE|rx+-?77v$6dZ{{D@BseAI{=W>niOI<;~+~%+GkF+1P#ymwn?GW{+uLO3ppbHeHPo z)H8p>#b!25!pUqpQ#;5g;S3LkR+hx=%*WIjCby_FuzEa}OZ$FzJM%GihJ7vXKtpC9 z<{xR*ncOGBz3IL)|Nh-PQyD?#w(e(M#>p_5gMpdVeWe>j_WtFCoFMs$S|AlW>$ihkHks`JTQc8u zfyrzE>>xuyQVThg`L1(KW@}(ysFlopoo_N*1FN#hmG8+s*LjeQRJLIG4q8(3{)7Fw zX1kVe%oZ%)K{LJ}OH{WrKLa^HfQ`}ppqnESZ>3u=*!lI7IUte{*U6uPxNafXb-sI{ z+F4F+2Rn;HfaT);M)$_8;%cDA^RkNwU+>=lvJm9(t$Q1N9Jhj;3Njn!JVrza90oZP zB}kE<}iLJblX*I7Ve2C_Pt?K%@E)RGylGa-lA`w#nfx3Yk2o!l28!tir5$YM|c zLBinw&Q7SL2!ro#kU=1~U)|oQ6}TUBOisKN)UsA}e*Z!LEb~bghUuN4LB*AhlVehJ zxxsQz?cRS_e|ox&AEQEj1601#8q~K~)zW%env0FWx^pQ*tC!@8WJgw}vf*?@&v*+hg{*`%fZ-}?{pyFdeUs)izkM=W3xisl4roQTvdxu0??3F{2vYq1L;nttflirf zt&dVbZQ4kvU)0`APD(XZ2Zx}m+WQaw8=B2p{;IWsOnCp{{;E|ikdSXxdH=zG|ACQw1n>an@iopCY;1B_7fnO-+8n%9vcZm1#!)Lw3#M%{$l`jYS_bBy%2PX5P`x@c7@mKaU@? z{%>{v$G)&@^Yf2o+T zsTg!6uW-IUL*VwG-_Pz>N`Z8z3JaA!`aNa)s`l3F<>U()BK7M!lN;ETv^qgEB6h9s zKb)U3n*}|IyOWRRvrnuTs1+S7mZ#J)1mz zgXL zTolw*d0PGc!~fl-p;H65Pf33~{n(!=*^j4){bhAMxjmVORgBfU)n_tS%lBkXUV+)% z+ziG&tc=M&ck}LMuXSt^Z=5X5F3qrOy6|Li24SuaM!U(%CNAHFC5;(2x41G+&d5@& zFS@~${OuS+a>);dJNs;A~*g$-2eFFv46>5 zjx#)#z42#G2D2FtOu$U&~q(-NIVmADG|s zs5KF^!u-Jh?nJk1tx2u*?+?Ux2kxKD-odDB^5q+|Ma#G3FRPhB7PE3Q?iX%rWrP^m zngofb)|Kx+$geC7mEFs{jgzC*J^96Pw&pFJ>=WJmT9<(uzUNkfCWYs)KR}LM)nyP< zmX^N%V8669^yzM>ll?(s-Af>nPZQsNs9#(f`Vl6{Fu8T z#38H;K}JAiU31@mxIe!%)OYjbBiWku;D~cAe*YnUPP1AkTeB)BgI^m&<}LHr|7;+@R?fj#-{bhhcDpv1}AFU-}+!0J0)8oVYTdtHyX zG-zCiyBL)8#brQ?$$T;=Ur%x9W4|=LeonGlTU6`j>(d!pyYID4eEh8K{fGUNLFpf4 z4Qyud{e$@LAghvJ&0=`en#{t>z^Yrj|5+=mZt8wy_r{}A8WY?i}`BK$P@{fGa} z$O>Ik-+#E@)NIbl!Rnse{9J(7J-PEa-_yeoOHy;*fB4_ftlr51(lcEQ)b?8z+W8#9 zY72!~_cZJMhx~t&^X7}yGv$IRG~w@{g-Q)fw#Oj`9Zi1!!T&eNN9qiMrzf)>fcg~V z&htO#WK8US+{69>Nj&lW2mc?BS_QWwLZvnC{RjTBBUnKOeCFK_;i<;F|DgX#a6g21H2VDq|BsT} zLCp%U7oc@Ueoq)Av^t@c&_daR(_28}crFX4bAq-~oRm1#`u@ZJbAGK0S>AtG|CV`c z%m3Q1iwY)R%Cna5Wo8iO^_|(Q-Yb|qm0hgayq8g{v-P}qJ7`Jv@tKo#^6ePyCuipy zGVNbEd0xJ_Y#=D@CV!aDw0A!!X~L4FU+en^@`om0%FnaWzox9>$-Z{~sy1P^PDV&p zPz{5)UDf6N2mLEA_abCkLm)D&j_*J8Uz%J~pj*$+DkWYGnq2p;Z&vRXOrFjzHQf^I z6Dj8HoNTLFK|U2`O+BA1wOoQ(uRD9Md-BuclFjDaL32+}NClPjtsaxvzWv`kgM)F~ z3|426^v&X*8UBiIo1R>LjVJk=7-MqDH-_Z@KX_#F6WQN>W|9+*<71jEF30d`dLO%p z-PA<4_XqNqF{^iHPqzYP8!zF>c7-Z@=f7(8SUzpu!pSxx!T0dwf3&aWIs?Gthy zvK0PWd+Zvx_rU*At0(s6D%e;t4n&FbCRGZOxqE9?Budd$cEuGP(OdudGUWZhy@6;@M-g{_+JKlHEnT`;{0v|vCh zo_S{%R5T0NFGwc01Mbuy~8L7dyF2GPwb_x=O_!rc9qg=~M6 zeyDx%1Fv0*df@e;fkCT#T_;CkvuQWO^b$~FJ>s{ljnR$SlA9S6Jk85nvcW#|#k{;FTh{Gw=wvZ=CfNG(KK9LQ zzZh868C{jvJjr_h!GA~dvzBbg#P0DY$|~mUkag;P?E9uDZ(s>(Hs@w+beY}-@}$=$ zo8Qgm-HfbWlQ|hUZ2mW!b2G&}2DM0%nK+r4wK-YeFPQ%tQfM=3t6rPFS!@MH0+eX z^SR19moGzzLFSj(9!!4WZ^;gx1!KE2StG!n9Xyh{{QBg)0F8Rk7NAoP8U)(jEPDdl z1O(Bv?DCu>WfPWP$`&lYlx-!J;A7_4q z@Kkra|8W0NC{*s~y7wRcKa7RSJzeqsgZx8Bs41*F-+!=wkhy)Pd-CJ$^*o^IEUyRR z;@}knA0g8zlc%dP?3zBu*{pNd^rrUD>IxqjUFST4%$6`^g62y;s~da-@#j2Rl){wB z=n4`8@wc-xFd~b+{~&)w*45oW0gDA`rhC}X0v%GL-Krf1!1<9 zpL@kJ^^FF@@qQS;^qC5w}si(AMn2j8Hr=7e3l6shtmL+BM%T_jIJP2 zW>+@W_YdA5M;CwpApZzL45ae?0{=S*5r}T68+lmyKyEaM0lRS`yGWxe%lifW*C)q? zOEMcwh@4y%E?WzrupGW#Q!a|S$bP?I|4B$H1*K69 zuVt<87sM|_h`it6zm8G$u|Mmdjt3A?P}Zw&Y5*(UpuY|x2-0j(Wm2{#-=GL&=>5l! zBU%5XZbyjxUxiQ!nnLV+3!DE2r6v2Fph5}ad{kMTJdLdP3;4H!EyAxmxeyh*!~aXbG)}Qz29)ZXY#i|b#HM{iIhICi)Gi8IS!y)172cup#D?p$I8&9D?Y0; zWH6g?vNfA^vN4-;vd>~aIa%2Pl)R4oP&T;oOWEYfFVNIx^Y-W7ledLgO$E&E}l!AX`#F)?j39urhZi%l$BAU{zqRpgSbp{^?%))*W}eIeC6W zu$ED~G21mJSfs9M?|H1(syzKUgYvZN49ZK`8I)JBGc>xs-?0A7{264h$d_5Q;DX&{Rly<5E|KHoX{c9}iX|0$DY$|d+XJ@0OhYJGp<{v=M%kNYRv zmCG^R@0}c1t|g?u0i?yRwN+ht#utY77w-2=o>eYW|G!I^)!^V!@bqWkQPi%5UgzGE zlQ}`Q`nA5lFuxUKz{2y)*N!kWUsqx5N$_gj-F}=2G;XnP>iZ4rSAax8o^QU!!q}>Q zNc`YrG_n(R`c zQg6S4_vmLe0|Q96_Gz$J8)*IY`h%a<6rf_NArP_r1E9PBst!T97gmf+F9*%jJ-=-? zl_L<8-%!QVZ`n=d@Wd2TM4#On^>AG1&Hea^rN<)zstPkYV)kx{c1X9Ex9+r59_KNnV*Ir4(fGJqJ)zIXD0 zDs5><`0uov%8{y+VjQ}afwdFlkmOcYfyr#u%Jn=D)z7!C>jW*21}`UGaQ_Ra>N|P5 z(FHOT(&*LeA^w|zL6|$6eWLetUPgw=y}ricyr7|rv&PeT!0V%pde5`ECwGXj=Jh0Z zmN0g@XZ0kvK4D1fNuKzHV>fG*d(zu+|Tvz`EgS$X8-VnpPAzTT&c(2*bJcWVRtFa5 z)$B~~59Gf|=4Ta~nIg=Z!213`|7*#Elb^686i;9=0H4BhApaHTNsz8{)9*MZM|@x^ zzK|>c=hp{(V1jJ#VcyQg(CY3tJ;FKp+H?3OpxQ`jE^DL7ECxnZlF6Lh44@-ET2nYjjz=x7GcZ_~dqWevp5b8`$o@8~#fCX20Neh`RoZ zieI;G-;=_bDa@&<)Y%QP@8b2q?WLii+d-RYV!$l;xYZw6vX?(&M0P z!SVyWs#|!}tMz^Chxog&x)W4$LTY3E)0`(EwXFJfadk!pWz+B1gjpMy-Y=-13(6VF zJC`@CYH|Gv+9`2z`*d~in%^svIa+>CNLJp$!T_owlozltO%9kMHhD#z2sg_gVK$bZ zGY{npI7~iXC(F+A2gGKW{JKt(56ZTXe3&n=z>7?}OhbP}8Jjb|YCfSyQkp5;Th?IINRdRxsoXEYRrj*wh9JomSPJ6FtcYodO7*dJRyW z4l2bG5>TBD%D8kYAaph~$TI$%Jg-4K+=k@`x(xbv~ZX zR#q&r!uqlBiZX~EOn+@asGh)9f@;!Mgxn;yqGE|1){o^@6d;>4xvg20@#o|@%^(-f zWy>j+IAQ%*azzeA&E!+f(%e5EPh-mhnX7Cw`9rg4J&2!CEOEp7vCxVPh&oJHJwVtz zpDhKX8{xmF2)T)DDa8^mK;f8#%cKto)w9?VdXgu%w1|R3Gp<^mVI zsR+55Y<9&G88(kaSJ>e)sQ{sR5}Qp=vJQG7QHrdpDuu_p1c8U&tx{8Vu=-?u+xI* znS2lIieK%Juv06R*Z~SVHHa*xi3i{&KAz5|g6g)T2)UVTO2rZVnkDQt4Z5;trf3#^cX=$yQ#1LU^3Y*MJUJw@oB&n8hU@xtb@^a=@x9!z(C zK&YO*G&!sjl+JTHL2)&eO`uqU!}hV@3IT|k$+J2^ zrN%rq9+0`pHj@u@f=Z2fY+S_>61I<}R&YVoVY*7e7AdcCfOI2D4ON8POg6S+2@TuF zqAS>NnPh-aJ&BE_CwX#67bG;9iX|*;9}BEtg6N!F(j0SdebsH{{k zB=AB|9e5RC;smykVu>4|zzc%t!Sw0_xa!Fby&!vLv-uTEyZ{BBA4JdOb-f^0oa%)H zo>#HN4^ZHFL1ZyaWUzxJ^yK+$Zm4c!MaWHLb1RnMuuGO*;eyK~0fg#VY)(DNlT-Rc zg?}c`VRI;!kg!XZSm6NCIk~3~23pr>IrOC zs3w^rb+{nFe&lc%v6 zfXr34nLMFiv>wFQE0&0`OBPz82T_OVssx11^VzgOx)H@jDnf1|n^v(z1}HRfHlzy> zs%NpO^(0SLnE(k*m12nsP-v<^+%VZ^0wgq*P;F~P=%3D}P%O~_3QYxw9!z&nK&YO; zCWmU$RD|3lHko3H8KBUVLN;mgvk9Qk{4)U(nqtKgD?p(s22nFvYa%G+Ph%57HFqn* z+!<^_#S%O0l0{YsLG)m{@Bm!(1W-E&1{`re3!z2kNmHc?)Lb z$5WWH0taBSozJGEOn#=uFy#rRDu&;vs@xc+JUQdg>6UzD8w-l+$;T)2)&E?04lH?b z8`B)*uHN);gJQJ<2E`M?4M2xZwH}A;eQ7+sCx1?T=kccLk_Yo2*e`B%pK~DpLHwdl zx5rnueUaThCuQ>Uc7{1mPVNUekd1N56W{G1mKej7C$ih81oR|>rdeCnrd)tbwN8$j zqQJ!RXL8LHnR=E#>)IM!lSMdKm_$o^AIq|GHHrOotqm2HU}ZM`!N&MlfP?E0TaxHO z)6!nahv44!)nm+(55axytIwDvAO1A$VoN^E#_-p)RrSn;O>JP?kUHKD@O1EaHrpLg zV6eKvQ&hTuD?)k>+pS^=j}4C{R@~|dfHZDfReLTV^~F^K5UQuL-2fQ|H%cG^Avc}v zTCr&8hR4FJ*C8fNuA3^&`t$Jwwkwn8O%=EN`FIlBrDBPU4UgqkT!5$mXHOKn3J~Va zW;+M6OW9`fyQ$*RKOfIxJ5wxLy5X@H>)DVmk#91-Y(R zBEq0ppmjsBKm>UF;qhd)6Q8HHZg@O@>9G!|KUq~fE_8s$9EwFjqZJc26bnE`D<02b zJJON7sSRurNN&PZgxox~L&Xv^HawQvai}K%qzdE;DOipH8TDCp0Ydro$>*j?n*V$} zlWpJUsY^Gsx;>t9bzcY610W~Bb%LC%x&h(j32b{N%T1Rw{`q(!+pc2Kts5T8Zry?E zbrx`(gFO3L^}q(WXJ<~%nht7G&tlv1dFs&(kEbo&g3Hqv5H6j}wh81Ngr~0}-waSA zd!@Kg~sDK zZ1W%qjO7Qb2gujpK`Q|Xgo@d0bBaYpH$E0;oeOb$JuJ;32fV^Yc)(9)n}wbRRS~jN z*k*j5s=D#Jmay3PSbE1KL?VQz zB+*cV&#Ddxqh?G#GZT~sXR-Btp6a@>)$Q@rt9`iBU;x6&6WMwu%gmCL24&u^V$slz zkL9*@K*9nR6q5sHfwJE$wl;LHry|Um&DQdHYU;+v)0ej3@_GTny;InlP`zG?kekNV zP%Kfg@v+d321FcBelkm(`DgO{$^T|a8~;q6!1kwDv~^>$4C`-Hw<1T|1i0&xXH52) z4Qg}DWc&7c>eP+NQsUY*4Fc65AJ4_bi3GCwU6nr(%f}8Bd&KO$h+it@$7N zZ?0;a%=&>j{{jCJF#Uo5XOd`XZ~lk=ZxH_aFOwtYYO{74b?)k#+%Z>1tp6(OL(raI z5PrHJG_&x2f&Z1syXI=tufI6C{P%akqsfh2Oswv5;HeFEgJJ-!D%AGNv}JzKrS zr5G8QtyayQ?!(M5xksm1aRIAl^5+oN%`>$bjlX9y&TeO6Xk{tA4qM-IY5JVxpZA%! z@-Tqxj(oFsgRCCyRY$fXyJj|1kd=Y>F1*-=i6z@PUX) z9-ZzE+EBrsK6!z%*kpqRT!xnCgjpGw*0sEE=>HFrRNl8d$@DCvySN1CNN`+T-q{YC z&AH8}+UuSy`ITW#N^kw)8O4(4=ahGzZ<_vD)#0P~Qw9cM)}^-^Ro`!r-}(N-{liQ% zpMsB@^ZU~F1az)6?9jOej$NIs?#b!q+*;jwots+By7qN-p54^y1&ZA>ktZj*`L%(T z&%NJp|F$DI9f6nXu!GW(dNt$@fn*LXPPXaZ%nXyexdWKDax-wcwYqvueZL_7qBJ`z zgXQT~_hj+!ENZRq3-sqsUb9e%$8bUIO)&Qgqw6FwvB~cis@H>!OfT3qeNHkYqEy|y zrnVkl*TU=8==y#^{c%QB$(M7Vfac_xGSylkCyxCMIl5n~ZTeHt6zbB`5O1rVc)wx) zlD{E0_j|RzFIYbXwAux-&<7HhOC07TNV-jQ1tmTCLyW2u-IHa$GEAPZNXD%7IK+t7 zL+>}p&wu~n{z`~u(2OiDXnZ@MMNef!nVKT_EB643x!$r?W6IPFCLX zlHt_!Vs!_D8Lx}g9ZZ_ddKiSu)tP3zzj$s=)xqfquWH#$zBWouLK95#8-~VZ{notm2FNkC|kT_5OhOWTfYost>in9mCfco3=nJQ zo}W{F@q6n7P#*By4~@U|kPuwD?EMD&=EA7R?c3QI8Y-h6&;Rlbq;Bo@(x|}gxlxYW zE2Gwa0f{Vx$NkgQ;!hdC_k1jRzajts`w#YApviK!KMf4c+gJtGwQIFcW^MUn*V^f> zY;xs~vc;D_$~I3xt5^Rio3Q+QKOuh^XfqpV3)^<{W(LsIX zpw+GiT1xr{WLl>?syX!_gWfNM8N|>4m$BJePI{pu9={X)suhyVg#+mYL+%<`Ckd2W)lK`w8nOYjvI6 z4l+pi^soQM)xQ}YH*ozb1dAAF|7LjH$@OFJ{;=+~pw+cMguQ=5)bw$ETe>|Cnm<$P zr$Zw6>BRRN@}Ja3_3j4+&9X0`HJWXIF1=u2T-74zs@M6xVE&6<&&l6S7?P)(GYf-G z1uk#rpZ=Wzbn!zlsDOa1MMZcA;tgg~P61&qmLHc|-!nV_oi+SpRZHvZ$>pXDkNeDj zH=EaU3QT5g`33gnFR(9vDcekeFJ*o|A-}a2v@%QpRNyHaeEIQyf`3cle$bX>wWsI) zfHo?#z4dx{=?7@rGHlE8s!m4NP2KBS%zEAz*x#M}U78`ek6mc;cWnmY*VYUd-*@^5 zbG3Y%o6ea&xxW27JE*#!%x2Dz+<%>;H%++Bj3K%IxR_+xWL7hVzxuS>|X zCwD%VVom2|Pi}rLBMPEhp3Ce^?*;2m?msTU$(G!ATu3lIx#zi*U^*vQ9cOxS+jALC z_T-l5BF*MJ0+(8oKxy^cL{K{YrfkD+@?F_r$`56elArGz?tfc4nSX_7Qp>l;Q?GxU z=rx&_fr-&q*?{GnFel5mMi=8&6Gl)#I@p4a(N$(x$-v6F_I)c0s49PaDEz;0v^N9j zuwCKmZvJEmUJhf?t&B;tjYGFODjTe309nuI`fR$g!5@Li21z3I%W~LqAJy_EHZ?Gt z@(6%}1Z4PuWRT%n-50^J#OvPa^LXy_R}+0g_cojH2sE3w{NPPjHo5XGx$`-LFgrU_ za_e)3M)%~|+)Plv{dnIH|H5(qLignUUrf{685nL&f8O+*uXq3C@M?y?-H-d&-z@ZM z^kuB~RouUiW%KhAMuf)uPZsV6NwWHW-3!y|uC2O%B1nVp)2$#sKvjQx-|+vT?skw2 ztMAXP!qM6c!qwFbirjMCAQKpUbN6p zP;o}#(pLV>?5i2(BzJ;R7?ZNWm--)b(k2(y(jCAS@C zo7`5$l-zn3hWJ_+kF19f(x%0XZm@Tm~ExGMF z)5^3?w&a=DMcCMdOWXMudVxZ5)%530?Ci=0OMZwh5Cl7E?{?u(FLeglPDNHeR+y6K zEFdKdy@WYgel)r?yK*uZx6Wh;YJ1OcK%?25uW?}Yc}T=V03*nUD@Ebz@%c4 zdT^m-#tlj#zrZQv2U-f52TCDPpw$2CeM9}x(*4Y)+@MqkE*lnDgKW@hpZgwEHuSo2 z`aGU@{gt3k?B0o9t=nPA1g3lb!M*!ou5Q1ZA^YD z8%+77Y*O<3eM9}uuTZr=Z%-B%XE2)ly`3LneC<|{AWRHmc;;S63m4M3cz$*Agf)_r z_1DO-vx8f1m%#k&HF6NX`?<*z)|f)r?We$UPuD0x`02;MeD$?Zwe5!{`>chkJ-%fU}T@{vqpZh_&TVK%QsKnu+E5UQybJl>%j^qu9JXhbYC-h z!#ZOKd-;mVuhzA(fO{|n>!tXL)dfrh*^33lO+fvo$qUvih#(7q>V@X*$1hHPu-=4E z_9=w>{Op`;M%T$VzN@x+gy~mlWn~U^VX4WS(vfYAU~u z+tek@(ei6Dd&^H@c9vh0*;szEx@mO_GoNINn>?ALlS%5qy&3Nl3d~luaGnL#b!_#O z&obSzAa%D|>#`D1HaIoA)jeqDJy1Hd`N{M?K)`2JOW{xE?OhDaW-LEJdtE|LFHCzV zwwd)B!_}o7`k-PGe_SH%-~%CIg7IX_~SDL=2)b##veCC(~s1 z2G-5(Kbe@##JCtPO;=vW&Ln%RC!5h7dK*FT)U@avASQHe&c?#X;(yC>-z== z`&BKxe_@(0O}`U8^Lev*SH#@oAXx@oW^*nER(55BR}6ytLCyjVo-13NWKcHv$pktn zP1)op)71Uo6EaMyB0pXiw*W_GF*U@}j>P7?`bJ=Qf*jGrYVHN+8XGoG($rQ>Z**mKm3by|O5)J_5B1MLJKlL+g=exb3rBJ?zyA>bG+C6BrPr0$ z6|}{!)s@rr{RjCcjjngxQ4zrU7)`WG)w?m zx)0io)6_8e>lc2IV)+M?LpvE*UEhDGzaP6D*>}(7Ca>A23-X;X`*P{Y5B6EsgTr~L zFDMBqTYeXNzkq)=B4j|D8Pwi@c1klyOh{bUGMTOA@83|Z&i4)l?#V8!EOSy;9%eRc z`MavstF>wRsutOUli3>%CNq2mm2H1lwM{8BYOCU?K~U)91peRTk%qz_clQiP(0D2SqL z-&HM{Uxm4k{JPZ!Izh{;^}RrVJ?GJ&*7pVlBCaoQwTT~N0L7#?*l>Xfwv+P?oAZOk z*gPO&29}fa4ja~M{bES&_6L{ZW zu>a=>yARNv@u*#^*!vIre@%bRz|g$?_=LB&L9EH`>Juhc98q9u@0mR7hyv5o?#X+O zXh|(?2OT6UEm{gbrUX>-Aqq@MM$^esN9FmAkqXO#37V5Vjw*5+fQp}%fA0$lj3$>H zRRpCXX7lvBljj`Ol-EjjVFktczgFk~k*X#%McsIxaR1EYCr2$(F1={`18FuS{Yd+g z^&#(#FxQbEmtY~R3cBj;y?}r~v*wW>$q@#E$!x3w!Z$P-K*#G(zNzVu{D|E!nTLa~ z)?%_a2b1uPJ-U~tTZ zG)KBm3Gy`hK&z@5le?_g|H{_NHiv67G>36BFmLB(IK+OnUs~Lqar3wBjK=BVjGMnN zV^mgn!*H-kS>QK=vfyp--O1Q=-0V004!XFho}E!y;5CD?;BT-}egOuC_Y4k7%3D@5 zwDKI}HspEy(&i`3+iW7>8dP9Gt>8&Wqb_|)@r3dk@UDa!n5tz$5LFJ<%<4yetZGk= ze;|>}%PIkv7X-1&;gldp0zUG1Oz^(+5mF*YXQYn@D2`ya7_bWOg- z$$Yloi4COVV*etxtNox-Sa>=cllV6V24*w1_Q_$_8HL;1877CaIqjOps3y2TksVa_ zPB_eO&)~o~k-g{euJ*^`*Z;wsoW=@r@_PY>9H^H|iXJ2b$1i3V{f3{c~LukKm{|snK zeERc!g8cMJ#S%u3av@tx-(Rp_3u<>WFchmYFr+syFqkv5Ge|QVGZqUd*MJ7J#EqF5 zgqfM=Z=P^6gK_eMQ<}^U?=NiTIW5bmTDqKRRXe9UX!tz2{W*i9yD+N*Q*!Ee=+Qn( zDWGi#lReH@o7Q}1Afyg4MlW1m%8)F}E;o788GS~9$&b!xGX9**b5@fz<(gP>(qyZ% z?yQekg_9j7x1H5zeayz4oH%*cS$)o&7i`JTx3MLsPX2UOn>BwsQ*!QPrE_YmJLf0A zcs@DsoO!)*dOCx&L{(X8KuSB8E*DlcWh@!KE=u<-OS36oR-10 zo9zTc@*_5GW_MSHW{*$?X1`JfW{*?`Y4LW(*^@cXi!o+TRyeQE{O1|dBW%zY&w(paquu<-{k2k;H~4}AwqXnhL49&wX(VewZ8vg z|B_X+_Ulp?P?HICh}UE;9X?AzH^_k#_n%eX<<%6fJo#UFfhOa{{eo_%zz0#pKdrnd z;@Ir&#mMXt#W?wD8$+{46(h52*5uX;mIj8})|{^y8rAo@d9^XBC%^v2FxNf#$8+## zNiqvJgP^8Yn>AaQ|$=+b7Fhl$p$QF+!^WeBJ=8CR0{n`L(Lks5AK{D@UWt zWbT$<%Ua_=9kCDck0vj;|?IlGvNP~EC$|V)X`I9>@ z88ZF9I(g3}Ii~velkZ$|VC0`Hd)bm{|D(wfmo3CWv3#-rX8-JIt_*wUNw>2xG^!`3 ze4o7hvJrFEb%x3JF6%MMPv*T+s0KcGNR;#6TkwG@poW6q6Ufa8>pG1(-+$nLp6tUa zGud&f92ndLg$cD7IYliSn;lclfoB;V%bVm{8o)O=KgiTQ*HQ}ZzurrA?jL8+6` z7s;&MtOky=+gKSG)svIVuX7~7JjMmyXgNiz4P3nj+&>w6FqxZ^jkQ-Do1`KbDHu#W-0yuH)JyB zksrO@s@{UW$!A#DKv(d9)W%<5)f;04N5K_9Lpb{~&y6>;9`DrJ&X&c#e|M?fr-OmnWxOSK{m6ne5HV zb*U9}NU;6>%~P&xFfz?wGkM<)iF(jIuWe7fen6&)8aS9eTN#?Yr!q8qEoET#-U_I6mqy;)HZgcu|hIN5c8r5yxC$c2hd}m5-=VVZ8eIKCz zMtQ+X2GDt{PL+_;R-LjJWvjJ5Dgm9h8XDT@^0Hf*fZYr_mPfhk=<(Pc#rWDiq?~`BM)E5ru|5Ny}*`0^MuWd3b14~rv)W_5BIWtPR zKfcWV?{CP_?e7Ep|A3CQ^Zd%}&cpCn==+b4+gG(b++GPipI^D zoWC`jjg$TKV(0f^H7&xN! z&&_6MWk~LH2c@Ck$qnYrkDJr~{|!O)EzGZvkFxx`8gdmpfeM;DZF>TWE>KiK?BRci zVvhroMeC1~VbSEo+vXzmZJ^!;s2*f=WjuB>T;@;87_0UsbTWG zOJb7+?yxfl_#c=obw|qz6ex}Ee(hdukhBs%2b2jPrGR!sGi8A?A*1W#cFun{!$GI= zBFjy#yCcRJKY8k%sf_iLweQ+V2An^s)$Mq8Gxt=7ORclpxEa*I2YBs2IJxPru6#iL z(N&$6C&jmddNHiq-Upmt3M!AMP632dtkDl7r^Gcd$Mh zXnQqivJ@1wkbni!UZbZK!t)9 zxRJ;$TIpmG2$?zd$HZt(ZLLp@ju#7T_HCb|p}E05Y-&8dn5$5EvM>y4H1W>fP4$ z{z3dit=?oeR)$vhT7D$o?O~tX{^b9=>CDI38UC956@M(F{=e4d@wA@*uUg~UKy8Hlr>k0Z z&oZkW`H|MMn|&HX@{w@nMcJW-);Zg>YjXg zI>TR+&Fyo+2jVjN%5E==<=xJ#d*p}V*X6(wI{o>GW-osj^zZGN}#K^Vdaut zE2vCT)?@kQ8{Oy*%J2JH!`l2>laGI4Vpc!$JDKq%Q*!ecruPr--(S`KIEeLMZFn;0 zQ-;Fu$I?%KT@82LZ`XZv`^WIq?U2I$6+^O%I^(VO#QlH613}js@V@{Zm@%2{$Uks- z{&n)Y$0kztpF|%rs~-8A?8(X?&Gz+wqZ_#8{$c-z$$uW(h2_6n)spPR%EIV&3sl=Y z*ne?VOR^Iyi!k?*-<&I!wKBSSwZ4B4e*sc>__e-wklzDJYfRjf`%8L%muRSAd2Y-hYr^1-b|jVsLW1Ipg~W^~WcFcw#0} zzhO2PE5mF~QHJFEA&k5$-aGt1JK5@~4AcJ;lOvv5iR@nqvR9b>$RAii%Kv`yvZo46 z@+&8wcp6l1zYr?_8z$fXO!efdmax|M4)ybyHIMw3<`QLS^i-Rf{9J{xalx*ZR?XzU zD$JW%XF7l`7rQ@yHoGW;vfh_p#_eAilJj0NJ)RHo5m>4lhH%m~Q1E_Of7|pZ$SJE@v}Pt} zs4~u6kle}1^4Bu?Kf)pNr%JPlGAwIT);scR)0D>rGyf&CaxonZS62AN(C7xUb`kh& zaWin50%h#KQ2C?VAM0jjlE@u>D!p0?FQ~ za?moM8|vIY;>$n<%rhBCQpvv{dA3>g$REG9_aE%9Pwsl|5bD1r*@=}65{vI2?4J%v zM4&W1eIBq>#9xqo2~#OQbyW*!umO~i?l*v}^J@!hhZMH{ljUES zh)aSFSzCDlv}hnX_yZG&FU+ZVVRF_Bw|dWmpv!W_&oVGD+vXNGoAWY&W=pmn7e50U zFYu{p^Z^wepy6t9DbN{eS|{fEGF$R6{0(XJ0u5X*YrO?(per;)tZG@->erflkc9(u z=EBV5%w{b=nx;SIEB&kZ^6_l0Kh5e~46R>Yzno%YWF-3TgvaKn4jMlkHv^aJsz*4{UwNpIrVbRp$O|P_}z~ zmi5>B5B9yQz)g$C$5?;8S1@3kuAs&!Hkt3W7N0_)?!{Ftn%jd~-!ps=ob2}6TNE+| z%d~6y1?L`T=B?}w?-?!_OkVa{z22LdL72PyU$Z%PgROgV(sv2r>Fx~EEy3|tyK81E z`=&0xwpA^9UCIW(8{Qi*q-b>}ORx$wZ|`E5c^GufhF|M@h5|jU&SY6uK4x=n&{g$3 z-vuVK9r*!CcW##Aj4?*LfLdPh(@e+CTelFC(b0y7~EbP-leUW`Co)?89cYmLI~?*qDUFuQ7&A zPtLy0plo37nB3dWJUdL*A$f8+qsU>9`#5zM@;vtY`vo)ywyXp^1vcF=lu@*PcDSrV z%;BHgK?7>S?8nuiqh8Og+Wv+q8?ZA>Ieg{tLUu*=$5P+^J=_Yq|E_j>X=E-a<$#;! zt6GcI9X=wCPyxky`r}>GAyJZ03TtP<#uL%h*Ms9R{Q*paLK(USy^c+7AS;-}87G70 zXje_=V;46C9n;Nvw~Kw%bgQX7&djE)4o+?F86IF*hg-MmO^|LrWbF)e+@7D%V z@%Xda$H^TZjUhw%X-1O|eN5J!$-p4Y=~+8{3IoIB7ME(n1@8;iPyHNzz_j!H!Di_; zb_P%}_IR54|Mv>=nKV1&$KY*_5Gc7ISWv;Qvl&(D8>SjFc z8AGku=4sm)jK$a(TT?f)U2qU~`}TkHR8dA|bqiJ|VRlxgzoNpdtb!l=6c@&#Sr&pMuKlo#(|_LG8-cYph#nd_@k zy-e!dK;)B))DMdmIZZhLH$w;u_V6*3*{~I^?9v_qR zJdoKp7$K*zg3RX3mq`SfWn6rn@z?ZE)0h|RKOZ14Hv}ZREuYyFiN-xHKV)6?pZT(HAQS zEXV{cR`9^SSOL^bL0mo50Igh3YJujNY~7P{zq3uABF?aHN*@cPR9&t)dBYDCrVCn= zul-PBN?@7%>xWtZ=umdZk?ej?gC1V{bL+>wFONPvd-LiAgJd!XtI+1>M;VOTlMk~C znRO;Nun7rswS2wQK7ASk=;}p5@oAtI&@sVPoys;WU)~EO#7na#Kvc+ZI>P6vmQdMc~C;(}z><4jKNJ;}lx;tZfOezyHthxPbh~(t?zdmb$ZrNu01vsv+UyAf2k6kF$!%$0C%gPHV|w;+bIqRs#>sR3$%xF~rq$Vz@ZO+*wN@K= z2-jf!^2ulZ>D4E_Xb@=DWCtxyd1@|h)IFK|$S<=_NU*4#yw`TCbyv%(F3>U-X026U z-ap`< z@ZZ#*O_;qw(wOTN^!9d;{>I6|l|LC8-5`3F?Yz|*G~H@WSSx6QfwF}Tbj{ z^ykz}MtLi>O}ko@^;rIZW*#MvGOHi?JI8^udFT8&2Oz^Lpey2=8s>I29%}^Ovj`dL zXyEYsGWo$@F*mift2#j)*Y_9ff39i?1ownG+d+M$>jGp4NK=Zg>tEbNb<@-~s zSr@!F$ZwTq7iGBA7S?tPl(HQzR7|${XT{WiVsgblm8t6(rK4LxgAJ~kTAlAN*xz2& zn(WES0ttY&g`iF+{}=E*flQ!-0QG0DYDxBFWrA41wGcW+_Q3!3DriS^=3}N=oG-yW zi3|F(r>ihB2FV?psnz-Zf&Y`rx0Bh9{DPRxHVd?J_WcF>htsDpGAd}lp1yLy`v>_C zR<%d9CxN#S+#l5at5BOY@qV}{e}GJt6HJW$SuOG zos6I@Hg;3rE6jhqnO&E0GVhV^i~HH9zhq+Mtv}X!uT`y8*?^lt*@TLCLl{tPO0#7IpsjAL8$=>PZ%7)q@m+?U$LSi?T2p)o1=PQPz3# z?Y+YMN1*cS<@dkg@7l!MKm{yY6!kWNPTInK#b%NarYoTndSVdR$wTh~?s z()8p1`wQ~hlKEN9nAMMbpX;7{>$%zVFD#7NR$xWXazKidH#`?m)&T{#{MuxGRvnPi zUXW593CGFd?Vx*{`K86$87GIaGtQpQKK-L4qiB6{)lVIerdD_1nU)NGGle*_W;VJ( zyxNw2uT|OPrvT_C&-b4%*`&;tajvka`-JF z31{K3cJNg5Y|(Z`&~QA+e;0eD!`m4_U8bA8($m`*ZuT~+zQ0iaaaB*U4=c;#iK~A! ztF?S@Huq}zCVV~3fsfs8y0O?DhR3NlzlkJ+EW6kz^7#FM{in3L9|y61YgXrFXf|W{ zCawGhY3(h$ zrb8k(^*Q*c%M1F?l08^Cz_uNzU#_gSS^u;>Yg$fSgdMSYwdjB zta{|vdj))7Nk?svG*LwJNKb{8qMb`K@fD^85V<{XZZBAD?3VG5y>B|C8I)vV_@M zeyO#BW;fq|xZgaTg_F^&UO@J-2kWWMQ{}*Ok=7w&{`7dBo&a-}in8KFM2)Z`q z!}&j&+ml&Y`9KXiuMcd0)WApKH$YQ<>v>SopMP#uYqA3?$KP;er7wR#r(lDwf0gfV z)Lhk)>N;Ti_DnPp^CO;pa@^Y@o8ot#vZ1%OB8;%=;J9rMMXFB>t~bR$B5W z7km~hs2>4YnWE}9y?~3+q2BW-#LPB`2X0MC%kwh|UuI(jl^e6?@i9)0U}uz`+Ri8~#|N%I zjnkenf|q#|f9Bu(^eUq?s6_ekgWovyD0rcOaK#V)(7v0!v&EVjq^EZ<#P-e>2azB# zMzuy&#!%Jw0`^THx3+2-ay>r!>l@5B%YK0Z?fr%GTax)%l|U+F-IJrfD;ati-(Y9f zbywD7`JG(!od>cm#96mlm6>6>1vA6s4i4Svc|43#^&m%r3cAhDk3$^x?Hm8ieo#^8 zHtlA=%%KQJL)KPRVUXAB{_%qvjktB(><1MEGS8aTj{a{FpM0;40TfKq)7uz@@3Aq0 zf(8@}#_87?K|u#v@zPh%5ZVtKe!1B%^X%~i*6+#+n;A~QBdZOZ!_P0(>P%*16#;qA z*F8D#yGWq>=IhUy8a=0*fQKaIK+Q2`4NnGUt&8LKo$-jQ_3s?N+H%=90l#cIb zoc!q%e_;RYdwqB(ITo1cq=m$qzv>YB)Cocfdz6eQB~n;4|$ z^)nc!l`(*V3DoG`{4|vTw0;Gm<~U<$Uz6zUX&nqr;!NV9eT|cuL>nhEs@?33?R_tB z{$Z;o_%}JlL#xH0Hd8mGCK#$Z1x}jA=`$ZGYYeNGAQ!wnm*k_fYE}uQZ*75_Ar;jy&3$p|NpC$9ND(q&DX58K0&djXd@`JNE`R{YNE_P$KuMEmIN4_Pq za)}9xYBLy3ZFG@vY7(gzWP`O?K=~7t)In>5KzZ;icp(`iu|tyX-JZwd%l=H}Ir2li zhk-$uCub$tK?)mcwR)2y7YKlP1_>;yIzdg9XKhJsV37m!?^d1#4TUDheBj~Y-ORR> zkf}ODW1?W1Ow||nK9pPFw zBe__N+nD2o!=Wk42D2Eze!Xyh`l{Y$6E23wA*}BjeUp2*S(1CW*g&^5a&dQYZSG8G zJU6S+9duc&@HBR&iRPTd2mi(X$5SK!DsTAB(C9loPnl7oKCg9At!H9WL!-ye{f+Jy z_kWGOxnH~$G|J}M|31LKbMN-aybT9Wf|v1t7VxOOnapJeeVVSU(jls4(WXLswpA$03?r+usYwpMV*k3Yu*ZxPN$6r|HvcZ4d`7 z3ji0^2kvj1t{}=-BXU$$tMmPV{c~2eCcCk+fVOo1zdL<{D5E9g-RZAH8BG+Hih`}0 z0-B`+jf%j0wyYT33|cbXPK+@uB>4cV0Hihqtxy5Y&^K^wYAHRmsx$SVFni0N$!sit z7~S+b-+zc-pX|=c(`?T2=jUN&^Oiq}hlRP0{GRjR63l^Fr&|45-yevdHT|DBqlMg@ zCoq|3X%LzDQ$a;ba?}SV)|1l(WEpkp6&HL=pWM!_Fz3ZYcjY}S40Ap(x*|{1fhK;1 zSsM<1-3}s~8j??Ab8Rv&8{eu<(B5cN7w?~!?7+$ga`D6SAQxwzMs+cpa1_L0`#aGb zrlYxF`}bc=liS%j5Z*Wz3Q=9(0#+UTfkpG6gd?Nt^a624t@=4H&>ar*8h$T<+Do7# z;~g0v$$V@wt2&dpS!GbYXWx_T$SMQ!UUDzHq7=x7$(-y`sD5;FhdBEE zH}qI(bB4(1e*$|45i2r?Sb@c0nmt4<|68yrB6HrrWR_V&Wc*)D-yqItp)}_MOy-$6 zM5g~S*nHIB(w*}KJ-C#&urT2Ws_Es5jEeQ~kCWY58CJEbfmiw5zl%Ho3rZeG_k+l$ zhUCMnERZGqpiI4~h4qx|QDOF$zmwTm{(^>S`ClgcvobWBv;3WTn%TVNFXQPs4`8P| zfU+^jl(SH?3Xg&o<1c%1>Ve<%g%XV7dY#`Ua~=65UIiYv`6B48>v^vg)X{iFnFD>52pa7bfdpzU%pH_F!vLKk{ zX#$XPg@5<-T~dtZ(<7xAc|>_3V*cBbIann?PD&2>AOXs<8e+;ze!?Bj#syKgej`Y) z6ZbJT2><<>htqdUF`7-cm1g7?X=8?n>aR%VU=@IvHa$j~(Y;>!`#(l6&DSED%w{dW7*8p0_{E^SP6K|HJ~HYXJ7lpxVtTkarQMa2hbJpE03GCPiFtXEF8wpEcxi5xf6T6 za9BID9A>)y9VpI*Is z_l!Y$Q%^EGo0C>&G7GEIy1Y(dHU^PK*R~_rNEzgp<*zJV5jyzS~@P|Qp%Nuw!w7mk)Tp!TyYgRw<6jZ)qA8NTM&L~m8 z=MP+8+FFRd{!T&A+R3Ma;8|%{!f1O6kzL;ok?r+Le*H^kayt))a66BP@&a}SW+M{nB&o7+nmyV&ndc{aU^MR@@`hw>tJj%QOE-IbSo;po+kYfru&%WKG+%#zN# ztGijvmtpc0X@<@1CDSj;GOF`Fn;zP)yx=(pvsy31rRl74jQSx-ZD1#CsQ+#VT4M8* z*ZpzT_bv^0s}(+?I<E4=JLEb zt>t-hI?IbzSLF?FSdxBOv& z1mpetkJ(voFsmPV`uOv!8%#2ele6w=+Z{N+>9IHKi&db#3*d-P+W~5Y?7#JxkM&Zs z+7VEwS6;sa_5tRg@8tS>V)Y05*FJV+eFF1EeE(x9)<+WPwyx|U8ENGPj(?W6OEq~ZRzEIxthb?p?xFFvQBAXgOGNqvxcZ2*{ z8v1c_@_AN{DCD{p)a(g7w5rn)wb}E){(iDME6C74d%?{f)x&chOlCXs8`3IMTYU=D z=-Ci|3bYapv@$$7@&VHfXKqp)f22Rjkplw}N-TQi+dX9DWdJ7(!>z(Y$DU;mJB9q+8C6mm|EtA~HDI=4R z+{Z38nYZPKFfYrGy!KaZjF8o758}@zJF`kPo45Q(?q`=^HiO72Z#c!EZ19_b6{_n0 zspNWpRw1ymZg!#MHXcxQ_ybg~B(s6oEk8grC^8Ak3pg1jv$cE&<#zEjaJx7HT$pc& z-?FMV^K7$v%XeN-ZN<~s4jRm3bx#id&co>2=v5oT=qb#7A7m|F)_% z3N+65VE+5b;a!kU(R6l3X|XQG$zfcK(&1gutv#?FS);n-Q_$FR@{>0V$$h_BKqI;f zd1r@zXWTh|_H}VNhsSO|za_uzVryr7eDUsrO{UpA1h!>4B}Giuh~+`6kR zIpGb{u6F4jHiqQ1aK_nP>q?ym&R*T`>3_F`pdJi+LS)}pCDcyvE#1Q0R7 zsMWcyr5Jfx%XH9W^YbOUri0q)pynZ?8+bp|gZrz%wWle|pP8VYxPKZ?gYHr8bptIR zd*8@-5;WzAm~3Qr^JHLlk7Q_et7K?)&t#AmYh#oacVlOa> z(?MpeY6Xw%Dr|5_c46h39ts-DKl&Y1a;*Qhsx{e*mBXv`{eu77!Ry^PCUYM7Da_sS zb9xqdf-HS{HfWRMX-n}OaP46QT}=64{&CQJmRIY}$L}BP-@mH;7I+@lt99<__Z#G! zn^ljP{#?}q+TLh?cU5~_>%`;9tvn3P>McKKzJAZ}zaQj*Wv%zxl0Z#Mg#c!-;}^`| zH2t0iqe4BTF$r3n4r)+pbvC+8&jigSc*;pGc>m%5eW)W2=r^xw0gXsJzQ*zo(l2y^ z-cg0igq1QN6Yk%Jny^9sKNb_rGhGv#8X!i19MI?r3FBu{t6JV~`2TxVYqBFN2e|7B z&Z5sm)mq9DGA^`m(Zjf>ZBNzydj0hK8uT&j zZPd%8htK}J`tj~d1Lvx4lvLIZN@eYZkQ2c`L-&oY$~IrVycZB)ZggGM64&}(K!A(+ zm^TCS@o0wTqty(}$FmtgJJh7b>f0D2`+T8kXjP{)8=J$u*0|R93IP(UdXt@5Wu~Ws zQ-D(($j#?g^(K3=$~0SXvN3u$@8n`gZse3=^_nd5i*Yi$%eT2K$`)Tf3G=dio6N)V z-Ecwk&MwA>T*>{MV$IvR7@zh({mpFJ@|Af{7sLC2{)bxav)S3}85&*VKxc(~c`x8l zq16fEy%%t(pB&D^BplA;q-?R|i?Yp^Ps#>QzA)+}hiEY-&tg|dYQNP631m0>$*c@a zX|3-K=1+Uqn$`w(Ium%(fUnuSxS9P^7w_!@_kaA+IDokuGDwT7 zGrWR^#j^Wxt;!4jF}zoJ;K8a53H--XIbSsTu1nxcc~#<7xvG+@>Q$Ck_Nr{IoM$y| zwRx@e%W5+dn;Ia2sip=Feuad*RlSehS^unR1+7zp$UWl(1#N;es05hZ#>pUjtqnY% z26CqGb&%gW887yO#x_BV4MDqA+ZiTvvV6bUf38i?9b$%>;=9(kR%MMZ-`*=6umjB# zN!PcrFiZvo)7P*3poI&NU}|AJiwGiU2qBC)CW|m8!Rm1g>$O$AtlJ;K)5I|uSeoen zdUUt4$&xP!Z?wsRyuo1JY})eWaTx2pFjnoCdqH{E>jmuMZAgk|718Q^zafAAs`g}m zRwhuf@qR)7gHwg5Wv` zv^UWyORaTL3Fw%KX7iRmphYRdTwS7|wx_bnFNXIU{2#4qdF%yBE}(-dKojZ){;OIt zKZ1rnAj4;>50njlF}!E!KU)eO%~N~BAi?%!TMMiEWVSDV-zx}saXxK!|MFM4;S0l} z0;cKw`i#nItoPqf@ZTr+6ya!S%y2>Kw$}ge4fwB2kI-k7hb(G*&cVEsouS1&nTL}J zv}aS8>&x#|ot<8+?w~F9pgLnQf5`9m3L9)W&q9oHWrY}Z^!Iy%^Jm`|^xuG~eE%W- zQ{i7`?=Qa}OGp2`)F#X(zyUJh{fGM>3O_QtfB8L`U4ZSe?Dt>Eotzx%(yc%Lx4J)m zu>23QWh}qmD||3xeL0!!$!}M;WvyP*Wepf5>p|u$=KlhcG)7l`!ASM%M0b#=FGxcx zL|uWQ=FiFO4QwEBOC<3R`nvl;VvJBRkcAuc9t*R60*S&*NcsIHJ!^hW3q!p24y&?U#9bPh`8YORk_K$YZshyQDNRX@5X|6T3^(o^XA{=@yZ$!x4H zpVbdQ^?cm^-eLY~Ue%rM$-kC6fmB(7j-Ys*%*^WaS^dF=dWg}n+uu9bujEzT3UYu0 zNSP_f0WXsoSRFpAU)TUq<+%O5!~JEvsvF&tzbv-{sWJo|gYhhxm(}L8`T?k_mHXd2 z)Gy&xUF)9wak&jhl`iOzj3>!ltX7}ZH$YX1?tkwfzlgV9b)|dqzvUJnWty&_i>i~^ zSuH-RFMuku-2UES|9oE6rS8eUmz#l9se(@7xS!0zYW7)u0#w!0t?wP;=kls9bWi@V z+ytab(e?cY`@6}EtR|n;8=$IAZhi0Ye-^LmT=(R!%Z)&)WL@juf4F}unUB@rvw8tk zS>fLI4)bU5s?Kyz{)J6a^=f z*;y4ntABthtK9tFVShWX>P=7-$bnQvf}-GfG7GERXY~ZAs->IXJH)s0s$K;}fec7h zC@2b!CNr|id{z&Ds_NYQ-r;`}uj)lm6iBJHovUvR1f^Qg;G)E5bqA<2!`<&4<~Q)F zo&`mL1jsO7P!t?U=4KW9tZo2Rb$91`2mOD%swY8FAOce52}-p4k~vsKKC3H0RUO>< z-r@XjUe%+ZC=ddvas`Fp?qpV0q0j2|0#IeS8{a$R|KwFY=$`y@xd2F+BPhsrCNr@L zd{$?GstVlr-hux+uj*d+#r5oG^#xFqba%dY$p6G!ulf`eM_eF9sUQnC1)lt@J^`vo66C`Vys8gDK4b%_ zNd)J3meXZO8#c>k7H^)9F!U;(L#1%>EZ!=s-Ytl5le;-R1})YEv-TJN7Bh1*))A5ZxC@8h5M zAL{mklG)mQAcMeX+bmDL_*tC+>igbp??1$C+q!%DG)qQ3jek2q-A34E$#lUW#;jK8N(-ddz9GKayd z^;}yP=%!wU`o(^&?+xB>ocygwoA=Y4KdmXX`%kquxdbSl1u4TUMrU z;rG(eqx;3#LABWO!#kcpSkDjdc#*k%*3|bO_FqoCcyRx$scx7AX(x;b!dg#v#TiqoO%RH+6FJ8{Tplr@=Fy|SVWdve3!3B9cz#BfO!CCz$_DHVmMfCwk25KyfSP^N%R!w&c3ri%x53(t*>!}kwKKE2 zC(Au!5WddN3~Hul{+|5(JAbSCoO9Ff*)dAitAe)2EcKnP0$O>Y;{9G=f6x05|Gzh{ zY++2k#K|NMk@tQt@V^&S7lXDmGi8C=K9Ds&%qv+K{)W#v1DSr&Qc33IWSEmOC%N(T z`w#O!KbGeF*KFR!@bz~xJ14`8lvejg;xdm*w}WV~6K(3hD^%_WHO7$-ZGc#s>hfOT zf3vtI=p4G0j?HSE49ymu49pgsjE$a*u8>7(s`rk8R@axm=AJ}2?w{>RM6>;Fg|RMxR%WSRhWk0HCn z&Fv78$?O6Ghs5vpC~ug-0CkY{dx7?Yd4$WEO~rJcCy5F zrWxtUqQ{w7-Fse7cs}E>BlNr^P=fOjW^KLlUg7;&M3Wb^X$EG9yAd&l2(!9ge*fX! z%IUit7%el^nHiYP+4YnKU`N5sd<)tsGBtg6dw3{lp(3-nx(-4XB-fihyWQLvBA2d( zkb}8&RXfP7!mLZrg48G*e%E;a;oSV`F^-H9O!d#FmpL+~2^~B3e!~6-ibtDOkNlhH zo;>?23wU;F(tTEMCeXe2t%pH{A}BjCs~-8sdGc@gV~MZ-Kw_M(AW_fIqwrHhKpTI> z!@z@^``%BGziD`oSq*He#PkM7MqTE_WlYm2I5CRUgS4|kwV&M%nixFwAm~Tfm#7bM zZ<1bsPV4gf(;%>^3t|}CcCD^;-DcfZopwF%KiI!W=4X}o8@Z|_nZr~(*`JjMqH5XZ zd*Gv2?4N11Cv%yKCwsAqwYn$weBtSIPoDNgOj?YSQ96u`akf}zJ%e;u8-s8JC-cR= z$q}8*!l9i^lS4U~CWm)23P*A>E@oi)tt@=ym!ijHHkMz?3?jdk8JGN8%(&&3GSin| ziU_{BK~x*~a2W=H z>9?I3mFnNCb8co=a7=#P&N*9*lX3PnHpbcFouI`@4ANnpj92@mBRLtB8IJrC1Uq*z zgUWAZ!7sm9-OOe@7CHXqZ+PS6x8YeEBD$Lr+w5>~;yN$`J>-__{z1!ItG?X=dGECPCW>l*WYg;zem^G8} z{e!xllS8{1CSUJj0Bw%|<$39;UEu8z(&F8W!eQKuldo}s*X-Qt^zA>{Kl^GIqjYpP z_{1jAD2s7=IwNR!=Pda6mcah2{mLpY8I+ZNGBqDP!oYm|3Pba;FAUAcpD=*N(q>O> zWxUyY)w35g9(%X9NpyEtBxB>mpf+RHNXBJT-#?hQ0qm6T-}z_H>|zwY4zU_^-@@!$ zUEt9m&=Db!;UHzTpA6G4_%JHzG^z_afKzqHCGxxD2r>~eE=)oAr{2*@D^i3X& z22B6oPk-XUc#W}s`fg9g!y1r-4{kkZ`*Z3;+#k@92cSa`K*xg{b#3e1)%Cui|D#rS zveWcsUW{s7L9ND_KN;RX=zBQ*nir$Ccy~}+qpDZy`-b~%sRws+t2#3JCZFQwfyB(M zsk7TG8J11`I7@lME{2V2khQe-Pqn%mHIv0z#hSNqG0bk~29?(g=4=e$8fwBJP}qXJ zJ$rUHBQr?F^>#+%^m6dB?O1TkOupX95ZVulUx{PjS%!zHNp$iZ9;U{L zvwNi(o=tt%#^|XQZ|#>Tz-MdD$s$b@|TrOmi*G{R6N_P?(%Ckn-zmF&ryb6^^dbZ z&Vtzf2sFL-L4KYzI~RlI+sPO1sD&#l{bW$y(9O7YKeMU}=x_|FuMEQMEx#_cL5=+o zzfABYvrWq{LmrU2iTnSCKW6y)Z&k}mw1Wh!I=6L#CT&i&z5h@@-9La)iTQ!woarS2 zjB31EoqF9yUE8{Lb-w>_e){qNM#cJ|Ht<;!4fY2>u3pt`dyrYp<(Dw`QHEQs)?8+c zAougCeVkP|t5J9yenF)XY~oCL(QgL7 zwrj0XQ{O*0*WbDy?f~kG5pJH+VTse$dL8@gTCJB34x3fjO(XY z1~STu-`~8dl^0Zn{!wdfbmLVkoMou?{=@s}YXceW8S|&V4P;bgl5d+X5X2}ZCI6HW zbf}l?R}NNh&=C+}ZECIOTHhDUe>~kGh|!1f{q)`-MrodV-$0xHKoi4pKc;U9V$@^$ z_h9-H5Y4}Gx=1jiA7lUY$ji!$8opDp9f(5UX{o;Lk)Fry*&Gtj0VHI<(r_sWMbI$6)+Vw9HY zVch(xi*fU-RgAM|cQb5$RmBLoIcM3d0$rg^kktL1m{3@z{q_I*=kv#~M=vmf~l>S0E;zHi{aB@0>u@;mu? zICEIrrPlWs?k$5X|DFCQoKcQR|Lk<82u3qC1_@Bx8MGxX`2Z`^sup3+BY(X>6SD>N zp#1xHRqM(AM)m1&5sYFEK`%h3Wq@Wc{oW|6vHa2NNm%~hxvkA7EW2j>*NipB9@>;L|{UH|vr;rhS-R@eXiH@W`rzuxtK|5x1j_kYoifB)y)`1gO>jeq|q-1zsu>&CzT zEjRxCueZ`>%E5-+z@G|NhI}`1fDp z#=rkUH~#(Sx$*Bm+l_z!8E*Xh|Lgj{|6i{E`~U9xzyB|;|NH;w`oI5ouK)Xg?fSp} z7q0*Nf9m?b|3|L>`@iq{zyCX~|NFn``oI5cuK)YL?E1g|3$FkBKkNFx|5L92``>r{ zU;Y1%>;L{YUH|vL=K8% zwrl_XH(dMozv|k*|0UP{{m;1e@4v?NfB%)P|NAd<{ojAF>;L`>T>tl<>-xX{EZ6`2 z|99=*{~y=>{r`0B-~Tt){{4S;?ce_g*Z%##b?x8(E7$)0KX$h(e|6*E|0g&8{l9nP-~Sso{{6pnuK)XAbp7A|oa_Jor(OT|KjHen|54Zf{SUeR@4w&mfB!wM z|NHNB{ont38&I&{`1gOqjeq}F-T3!^$&G*i=iT`Cf5we}|0mt}_rK@HzyEDF{{3&b z@$Y}tjeq}3Zv6Y7cjMpxj2r*{C*An>Kjy~2|6w3KP|HCMAOY8dT}*-oDyy%D1lfQ& z0F?i!WqH7jfB(I1{QK{6BhhRf3E-g|Lyv}{~xaZ`~T|tzyD9J|NDRM`oI4-uK)Xg>H5F_ zXRiPIf9(3d{|B!B`@ie@zyDjV|NFlVRQ_N8_kYp#fB)xP|M!2|^?&~-T>tmK3zYY- z{rkV~+Q0uhuKoMJ>Ds^lYp(tKzwFw-{|m1D`#;L`>UH|u==lZ|@Y}fz&XSn|F|F3KR z{(rgl@Bh1N|Ng(Y_V53rYybY=x%Th>wQK+WU%2+~|EX*L{r>(2alp_ke0GkOMCN`yY4d z-+!&k|Ng67{`X(*^1uHQm;e12y8Q1y&*gvr*)IS4&v5zQ|6iB>{r__5-~V@){{4S( z>EHiHm;U{~bLrpzYnT50zi{c_|5KO#{XcT)-~WA={{7!^>EHiNm;U`AIF36zH~O)qO?G^*FgE6vH#WMH`P=->ZU4{_sT z1mw~6a$r%9ET#pK*M(cU1R?EC~$&;R~weg5~~=JUV*0iXZ1{+E3E_y5`FfB#>7`S+jc>%adZU;q8r`1;}rar%h~j1JRROkh;l&M}d31=I8slNmMYdzSzIU$p%Hf1l<5|En$k z|DR#`|Npm^{r|sZ+5i82%l`k*SoZ(F)3X2nWtRQ_|8432{}-12|G#SK|Noy>{QrMu z#sB}yR{a0pu;Ty!s1^VJo2>Z%pKrzg|1XyR|KGCm|Nn%Q|Nq;p{QqBK<^TUHR{sCr zvh@G|fTjQc&sqNe{~?fF3=Grrr!YG4q$VfkPTw$vF`5e^0t)!)TvHhp zI3fI`#Nz21QyH~|A>4x8QU(YsvmkSN&{Rg1>0MJ9J*Hou%IFQ%kx`sGU2z)Y6sUp4 zMa3o4w@hQyp8jkaV?5N}vedkk{G#bD(-}Rc&z{bxQx7q-C@nQF85E$Z3=9m~p!jBB zV31{CVBmzZL6imq1A{mN0|P&Z!@$5G!N9;E17*V~ZUzPhHYi7mfq{XSfq_91%I9NX zV31>AVBle3U{GdYU|?ooV9;cRN`feM1_lO@14I}Y7^E2(7&sUh7z9Cz7#J9oraw$% zl+P7rU|unnfCwZkkHls|VuP3p3=9lh3=9m4APxfqgBp~EQ9>Xq zh3mDTd@%+F2GEsGAQys+0OnL(tYP5@3Rh6LgW?Aio*)Gv ze=30(Pz(wOkV8RSkiS6T1Y(2Y5agkHyny@%*nbTeCO!# zBduLh_srg@kXl4sR_!AA0lJKhwF4ABC#+=ls&S;!ylC zF7dX~v(7&+*D2p?o)cWD_{4^}aDVLq$N5)R-|P0e(5M!F=e?HrNd^$u{w$GEjD5QD z0!Cd$P>KPGF@gvN1_l@nN;n`PHc*U-PhYTrQG=0j`pE^1*BKeNFI>o|&p3U@V#X8G zCoE%}F+F1`W5VP3}^cAZaKY;WZY%f^LD8ama#s>V z0|P?_)S(e*7EgkTb0C`!%IX)O50ab!Q531n-n)nYW{{xhUIdsJ}NYKLMVd7$z5c3(J$rW%L1f{pov>qK=VJWtcQh!$2>^tT!E&+Vm?HC1Df~`DE|eNhM9BD8sg&*XyS2D@gI}w zAqK)UctA@$2`CK{Ut$9>2qq5`56Fb*KY*q_;Q=Huo111g*e+C8ym;eK` zWP(`$6E{E;SIdAnC;?6U6I6Txn)tFzi25C9;`IVK5Qzh55=v0<7ii*4xe)aq(8S%K z;tJ5B8|Hy0P;&y%#3w-1*E2MrNgRV}Sb-+4mk+Uc1DbdYR2%l_;puiTWf=Dnx8>27{FQ6JY(8OWt1<=HQK-C+diCa8_6uq#v0y80r5+?2eRWAV*hqwPrpb`#H377`94G;@F z(8R5v;st2po1o$qXySLE;tNp4>lvyxLM&K;D#5S{Dt-Y?{Msgn`WtBC9-ATJ4A3qa z%mY1JAmSWo;s?Ou^$ZNKJ{(NL1*k#^C=C-o0Ocz{X_&aeY)BAmpos@S#SPHJ4?x8& zK;oeM2Q$b3JR-rskN}cEN_5Y*Lwt~dCO!iyz5q@9091Shns^aZ9Oe;_y&(G;9zYeI zfYKldP?7v(E5u@0h`_`dpgy>PLp{tqnEHrnNC?67!NfDFq4hs32w@TiPzyAmG)!D* z2gE@zd6+n?fPw`%OgsUqKLSd_#7m&&B+N!@|5rd=x&TeXEU1PRXyR+2;;=Y{S#SZW z?gW&Ei$m4J2b%Z>s5nd?O#Ke1`5MUTLGgbADq(>v!N9=q04nZ)CO!>nK?R!lp(hXr zb)boVkcEsl!v?ot4w^9+TK|I>p!^P#*a0HOF+fzPoPN{KqWY!LoF}|c|k1}KoieXgjk?~CVm3SH-OSG zbLybxK!GH1hp8Z52k(w)B`in)USYwuRsy6XJ9x0m4LYz zX3ztuxWEF44`JeJx)8nun)no`xB{AZ2vpnyP5hN1V*@z-1)xcUfg~6h7%I@jHyJ=I zZa@=102SYXCT?d8QGWnU+z%@LV*xb(!+hod&BqMTL1&nF3sjr~O&rD-z#$GByoQ;h z096O0;q89|sDuWThG}T>gZKa@4-@~<1QDOH2tvceVN*8?(8OU)ycKBTC#FH`{|#so zu-UC0XyUNBo&#v&u(_TSXyUMmi3@1rusNU`^=J~XAbWr&4lChapozn#?LMH1!{(BH zpozog2N)JZLJr>khfNxBKqX*73Y#<%Kof_}a7dtu!)7=X(8OW$f*Ppe^$f7FUjtML z2H4z<1)4Z)p3ebI95yNCfhG(gGcZJ;Nx){Y641n9vtb!%;;?G908Jb= z$y9+R4x8#}0EvU@e^^k%MkYEy5=iZT*wpC+G;!F>=?pY+*euxsG;!E8+zKRdkp1u} y(hW!wp!yFs>$L+-95(rM08Jd$hCG2L{y`H`i(WtzpRk8P7CcRM15E-p{|5lA(P}pU diff --git a/roms/opensbi b/roms/opensbi index 4489876e93..6b5188ca14 160000 --- a/roms/opensbi +++ b/roms/opensbi @@ -1 +1 @@ -Subproject commit 4489876e933d8ba0d8bc6c64bae71e295d45faac +Subproject commit 6b5188ca14e59ce7bf71afe4e7d3d557c3d31bf8 From c01756a76eaa3f315b449a2557a4d14d608eed9c Mon Sep 17 00:00:00 2001 From: Alexandre Ghiti Date: Fri, 3 Mar 2023 14:12:48 +0100 Subject: [PATCH 10/22] riscv: Pass Object to register_cpu_props instead of DeviceState One can extract the DeviceState pointer from the Object pointer, so pass the Object for future commits to access other fields of Object. No functional changes intended. Signed-off-by: Alexandre Ghiti Reviewed-by: Alistair Francis Reviewed-by: Frank Chang Reviewed-by: Andrew Jones Reviewed-by: Bin Meng Message-ID: <20230303131252.892893-2-alexghiti@rivosinc.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 0ad8f94a42..1c4d8aaa74 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -220,7 +220,7 @@ static const char * const riscv_intr_names[] = { "reserved" }; -static void register_cpu_props(DeviceState *dev); +static void register_cpu_props(Object *obj); const char *riscv_cpu_get_trap_name(target_ulong cause, bool async) { @@ -258,7 +258,7 @@ static void riscv_any_cpu_init(Object *obj) set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU); #endif set_priv_version(env, PRIV_VERSION_1_12_0); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); } #if defined(TARGET_RISCV64) @@ -267,7 +267,7 @@ static void rv64_base_cpu_init(Object *obj) CPURISCVState *env = &RISCV_CPU(obj)->env; /* We set this in the realise function */ set_misa(env, MXL_RV64, 0); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); } @@ -276,7 +276,7 @@ static void rv64_sifive_u_cpu_init(Object *obj) { CPURISCVState *env = &RISCV_CPU(obj)->env; set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); } @@ -286,7 +286,7 @@ static void rv64_sifive_e_cpu_init(Object *obj) RISCVCPU *cpu = RISCV_CPU(obj); set_misa(env, MXL_RV64, RVI | RVM | RVA | RVC | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; } @@ -331,7 +331,7 @@ static void rv128_base_cpu_init(Object *obj) CPURISCVState *env = &RISCV_CPU(obj)->env; /* We set this in the realise function */ set_misa(env, MXL_RV128, 0); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); } @@ -341,7 +341,7 @@ static void rv32_base_cpu_init(Object *obj) CPURISCVState *env = &RISCV_CPU(obj)->env; /* We set this in the realise function */ set_misa(env, MXL_RV32, 0); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); } @@ -350,7 +350,7 @@ static void rv32_sifive_u_cpu_init(Object *obj) { CPURISCVState *env = &RISCV_CPU(obj)->env; set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); } @@ -360,7 +360,7 @@ static void rv32_sifive_e_cpu_init(Object *obj) RISCVCPU *cpu = RISCV_CPU(obj); set_misa(env, MXL_RV32, RVI | RVM | RVA | RVC | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; } @@ -371,7 +371,7 @@ static void rv32_ibex_cpu_init(Object *obj) RISCVCPU *cpu = RISCV_CPU(obj); set_misa(env, MXL_RV32, RVI | RVM | RVC | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_11_0); cpu->cfg.mmu = false; cpu->cfg.epmp = true; @@ -383,7 +383,7 @@ static void rv32_imafcu_nommu_cpu_init(Object *obj) RISCVCPU *cpu = RISCV_CPU(obj); set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVC | RVU); - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; } @@ -398,7 +398,7 @@ static void riscv_host_cpu_init(Object *obj) #elif defined(TARGET_RISCV64) set_misa(env, MXL_RV64, 0); #endif - register_cpu_props(DEVICE(obj)); + register_cpu_props(obj); } #endif @@ -1210,11 +1210,12 @@ static Property riscv_cpu_extensions[] = { * properties and leave. env.misa_ext = 0 means that we want * all the default properties to be registered. */ -static void register_cpu_props(DeviceState *dev) +static void register_cpu_props(Object *obj) { - RISCVCPU *cpu = RISCV_CPU(OBJECT(dev)); + RISCVCPU *cpu = RISCV_CPU(obj); uint32_t misa_ext = cpu->env.misa_ext; Property *prop; + DeviceState *dev = DEVICE(obj); /* * If misa_ext is not zero, set cfg properties now to From bf1a6abec47b57b1e891db625cd93e45e0c5ecd5 Mon Sep 17 00:00:00 2001 From: Alexandre Ghiti Date: Fri, 3 Mar 2023 14:12:49 +0100 Subject: [PATCH 11/22] riscv: Change type of valid_vm_1_10_[32|64] to bool This array is actually used as a boolean so swap its current char type to a boolean and at the same time, change the type of validate_vm to bool since it returns valid_vm_1_10_[32|64]. Suggested-by: Andrew Jones Signed-off-by: Alexandre Ghiti Reviewed-by: Andrew Jones Reviewed-by: Alistair Francis Reviewed-by: Bin Meng Reviewed-by: Frank Chang Message-ID: <20230303131252.892893-3-alexghiti@rivosinc.com> Signed-off-by: Palmer Dabbelt --- target/riscv/csr.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 3106f96212..d93d481bd6 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -1141,16 +1141,16 @@ static const target_ulong hip_writable_mask = MIP_VSSIP; static const target_ulong hvip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP; static const target_ulong vsip_writable_mask = MIP_VSSIP; -static const char valid_vm_1_10_32[16] = { - [VM_1_10_MBARE] = 1, - [VM_1_10_SV32] = 1 +static const bool valid_vm_1_10_32[16] = { + [VM_1_10_MBARE] = true, + [VM_1_10_SV32] = true }; -static const char valid_vm_1_10_64[16] = { - [VM_1_10_MBARE] = 1, - [VM_1_10_SV39] = 1, - [VM_1_10_SV48] = 1, - [VM_1_10_SV57] = 1 +static const bool valid_vm_1_10_64[16] = { + [VM_1_10_MBARE] = true, + [VM_1_10_SV39] = true, + [VM_1_10_SV48] = true, + [VM_1_10_SV57] = true }; /* Machine Information Registers */ @@ -1230,7 +1230,7 @@ static RISCVException read_mstatus(CPURISCVState *env, int csrno, return RISCV_EXCP_NONE; } -static int validate_vm(CPURISCVState *env, target_ulong vm) +static bool validate_vm(CPURISCVState *env, target_ulong vm) { if (riscv_cpu_mxl(env) == MXL_RV32) { return valid_vm_1_10_32[vm & 0xf]; @@ -2669,7 +2669,8 @@ static RISCVException read_satp(CPURISCVState *env, int csrno, static RISCVException write_satp(CPURISCVState *env, int csrno, target_ulong val) { - target_ulong vm, mask; + target_ulong mask; + bool vm; if (!riscv_cpu_cfg(env)->mmu) { return RISCV_EXCP_NONE; From 6f23aaeb9be13d4a26b7f863533c316105481640 Mon Sep 17 00:00:00 2001 From: Alexandre Ghiti Date: Fri, 3 Mar 2023 14:12:50 +0100 Subject: [PATCH 12/22] riscv: Allow user to set the satp mode RISC-V specifies multiple sizes for addressable memory and Linux probes for the machine's support at startup via the satp CSR register (done in csr.c:validate_vm). As per the specification, sv64 must support sv57, which in turn must support sv48...etc. So we can restrict machine support by simply setting the "highest" supported mode and the bare mode is always supported. You can set the satp mode using the new properties "sv32", "sv39", "sv48", "sv57" and "sv64" as follows: -cpu rv64,sv57=on # Linux will boot using sv57 scheme -cpu rv64,sv39=on # Linux will boot using sv39 scheme -cpu rv64,sv57=off # Linux will boot using sv48 scheme -cpu rv64 # Linux will boot using sv57 scheme by default We take the highest level set by the user: -cpu rv64,sv48=on,sv57=on # Linux will boot using sv57 scheme We make sure that invalid configurations are rejected: -cpu rv64,sv39=off,sv48=on # sv39 must be supported if higher modes are # enabled We accept "redundant" configurations: -cpu rv64,sv48=on,sv57=off # Linux will boot using sv48 scheme And contradictory configurations: -cpu rv64,sv48=on,sv48=off # Linux will boot using sv39 scheme Co-Developed-by: Ludovic Henry Signed-off-by: Ludovic Henry Signed-off-by: Alexandre Ghiti Reviewed-by: Andrew Jones Reviewed-by: Bin Meng Acked-by: Alistair Francis Reviewed-by: Frank Chang Message-ID: <20230303131252.892893-4-alexghiti@rivosinc.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 214 +++++++++++++++++++++++++++++++++++++++++++++ target/riscv/cpu.h | 21 +++++ target/riscv/csr.c | 12 ++- 3 files changed, 240 insertions(+), 7 deletions(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 1c4d8aaa74..e1e8057836 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -28,6 +28,7 @@ #include "time_helper.h" #include "exec/exec-all.h" #include "qapi/error.h" +#include "qapi/visitor.h" #include "qemu/error-report.h" #include "hw/qdev-properties.h" #include "migration/vmstate.h" @@ -249,6 +250,82 @@ static void set_vext_version(CPURISCVState *env, int vext_ver) env->vext_ver = vext_ver; } +#ifndef CONFIG_USER_ONLY +static uint8_t satp_mode_from_str(const char *satp_mode_str) +{ + if (!strncmp(satp_mode_str, "mbare", 5)) { + return VM_1_10_MBARE; + } + + if (!strncmp(satp_mode_str, "sv32", 4)) { + return VM_1_10_SV32; + } + + if (!strncmp(satp_mode_str, "sv39", 4)) { + return VM_1_10_SV39; + } + + if (!strncmp(satp_mode_str, "sv48", 4)) { + return VM_1_10_SV48; + } + + if (!strncmp(satp_mode_str, "sv57", 4)) { + return VM_1_10_SV57; + } + + if (!strncmp(satp_mode_str, "sv64", 4)) { + return VM_1_10_SV64; + } + + g_assert_not_reached(); +} + +uint8_t satp_mode_max_from_map(uint32_t map) +{ + /* map here has at least one bit set, so no problem with clz */ + return 31 - __builtin_clz(map); +} + +const char *satp_mode_str(uint8_t satp_mode, bool is_32_bit) +{ + if (is_32_bit) { + switch (satp_mode) { + case VM_1_10_SV32: + return "sv32"; + case VM_1_10_MBARE: + return "none"; + } + } else { + switch (satp_mode) { + case VM_1_10_SV64: + return "sv64"; + case VM_1_10_SV57: + return "sv57"; + case VM_1_10_SV48: + return "sv48"; + case VM_1_10_SV39: + return "sv39"; + case VM_1_10_MBARE: + return "none"; + } + } + + g_assert_not_reached(); +} + +/* Sets the satp mode to the max supported */ +static void set_satp_mode_default_map(RISCVCPU *cpu) +{ + bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; + + if (riscv_feature(&cpu->env, RISCV_FEATURE_MMU)) { + cpu->cfg.satp_mode.map |= (1 << (rv32 ? VM_1_10_SV32 : VM_1_10_SV57)); + } else { + cpu->cfg.satp_mode.map |= (1 << VM_1_10_MBARE); + } +} +#endif + static void riscv_any_cpu_init(Object *obj) { CPURISCVState *env = &RISCV_CPU(obj)->env; @@ -918,6 +995,87 @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp) set_misa(env, env->misa_mxl, ext); } +#ifndef CONFIG_USER_ONLY +static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp) +{ + bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; + const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64; + uint8_t satp_mode_max; + + if (cpu->cfg.satp_mode.map == 0) { + if (cpu->cfg.satp_mode.init == 0) { + /* If unset by the user, we fallback to the default satp mode. */ + set_satp_mode_default_map(cpu); + } else { + /* + * Find the lowest level that was disabled and then enable the + * first valid level below which can be found in + * valid_vm_1_10_32/64. + */ + for (int i = 1; i < 16; ++i) { + if ((cpu->cfg.satp_mode.init & (1 << i)) && valid_vm[i]) { + for (int j = i - 1; j >= 0; --j) { + if (valid_vm[j]) { + cpu->cfg.satp_mode.map |= (1 << j); + break; + } + } + break; + } + } + } + } + + /* Make sure the configuration asked is supported by qemu */ + for (int i = 0; i < 16; ++i) { + if ((cpu->cfg.satp_mode.map & (1 << i)) && !valid_vm[i]) { + error_setg(errp, "satp_mode %s is not valid", + satp_mode_str(i, rv32)); + return; + } + } + + /* + * Make sure the user did not ask for an invalid configuration as per + * the specification. + */ + satp_mode_max = satp_mode_max_from_map(cpu->cfg.satp_mode.map); + + if (!rv32) { + for (int i = satp_mode_max - 1; i >= 0; --i) { + if (!(cpu->cfg.satp_mode.map & (1 << i)) && + (cpu->cfg.satp_mode.init & (1 << i)) && + valid_vm[i]) { + error_setg(errp, "cannot disable %s satp mode if %s " + "is enabled", satp_mode_str(i, false), + satp_mode_str(satp_mode_max, false)); + return; + } + } + } + + /* Finally expand the map so that all valid modes are set */ + for (int i = satp_mode_max - 1; i >= 0; --i) { + if (valid_vm[i]) { + cpu->cfg.satp_mode.map |= (1 << i); + } + } +} +#endif + +static void riscv_cpu_finalize_features(RISCVCPU *cpu, Error **errp) +{ +#ifndef CONFIG_USER_ONLY + Error *local_err = NULL; + + riscv_cpu_satp_mode_finalize(cpu, &local_err); + if (local_err != NULL) { + error_propagate(errp, local_err); + return; + } +#endif +} + static void riscv_cpu_realize(DeviceState *dev, Error **errp) { CPUState *cs = CPU(dev); @@ -1017,6 +1175,12 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp) } #endif + riscv_cpu_finalize_features(cpu, &local_err); + if (local_err != NULL) { + error_propagate(errp, local_err); + return; + } + riscv_cpu_register_gdb_regs_for_features(cs); qemu_init_vcpu(cs); @@ -1026,6 +1190,52 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp) } #ifndef CONFIG_USER_ONLY +static void cpu_riscv_get_satp(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + RISCVSATPMap *satp_map = opaque; + uint8_t satp = satp_mode_from_str(name); + bool value; + + value = satp_map->map & (1 << satp); + + visit_type_bool(v, name, &value, errp); +} + +static void cpu_riscv_set_satp(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + RISCVSATPMap *satp_map = opaque; + uint8_t satp = satp_mode_from_str(name); + bool value; + + if (!visit_type_bool(v, name, &value, errp)) { + return; + } + + satp_map->map = deposit32(satp_map->map, satp, 1, value); + satp_map->init |= 1 << satp; +} + +static void riscv_add_satp_mode_properties(Object *obj) +{ + RISCVCPU *cpu = RISCV_CPU(obj); + + if (cpu->env.misa_mxl == MXL_RV32) { + object_property_add(obj, "sv32", "bool", cpu_riscv_get_satp, + cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); + } else { + object_property_add(obj, "sv39", "bool", cpu_riscv_get_satp, + cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); + object_property_add(obj, "sv48", "bool", cpu_riscv_get_satp, + cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); + object_property_add(obj, "sv57", "bool", cpu_riscv_get_satp, + cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); + object_property_add(obj, "sv64", "bool", cpu_riscv_get_satp, + cpu_riscv_set_satp, NULL, &cpu->cfg.satp_mode); + } +} + static void riscv_cpu_set_irq(void *opaque, int irq, int level) { RISCVCPU *cpu = RISCV_CPU(opaque); @@ -1246,6 +1456,10 @@ static void register_cpu_props(Object *obj) for (prop = riscv_cpu_extensions; prop && prop->name; prop++) { qdev_property_add_static(dev, prop); } + +#ifndef CONFIG_USER_ONLY + riscv_add_satp_mode_properties(obj); +#endif } static Property riscv_cpu_properties[] = { diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index b5b5425b99..67ac665ff0 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -27,6 +27,7 @@ #include "qom/object.h" #include "qemu/int128.h" #include "cpu_bits.h" +#include "qapi/qapi-types-common.h" #define TCG_GUEST_DEFAULT_MO 0 @@ -401,6 +402,17 @@ struct RISCVCPUClass { ResettablePhases parent_phases; }; +/* + * map is a 16-bit bitmap: the most significant set bit in map is the maximum + * satp mode that is supported. + * + * init is a 16-bit bitmap used to make sure the user selected a correct + * configuration as per the specification. + */ +typedef struct { + uint16_t map, init; +} RISCVSATPMap; + struct RISCVCPUConfig { bool ext_i; bool ext_e; @@ -497,6 +509,10 @@ struct RISCVCPUConfig { bool misa_w; bool short_isa_string; + +#ifndef CONFIG_USER_ONLY + RISCVSATPMap satp_mode; +#endif }; typedef struct RISCVCPUConfig RISCVCPUConfig; @@ -798,9 +814,14 @@ enum riscv_pmu_event_idx { /* CSR function table */ extern riscv_csr_operations csr_ops[CSR_TABLE_SIZE]; +extern const bool valid_vm_1_10_32[], valid_vm_1_10_64[]; + void riscv_get_csr_ops(int csrno, riscv_csr_operations *ops); void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops); void riscv_cpu_register_gdb_regs_for_features(CPUState *cs); +uint8_t satp_mode_max_from_map(uint32_t map); +const char *satp_mode_str(uint8_t satp_mode, bool is_32_bit); + #endif /* RISCV_CPU_H */ diff --git a/target/riscv/csr.c b/target/riscv/csr.c index d93d481bd6..ab566639e5 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -1141,12 +1141,12 @@ static const target_ulong hip_writable_mask = MIP_VSSIP; static const target_ulong hvip_writable_mask = MIP_VSSIP | MIP_VSTIP | MIP_VSEIP; static const target_ulong vsip_writable_mask = MIP_VSSIP; -static const bool valid_vm_1_10_32[16] = { +const bool valid_vm_1_10_32[16] = { [VM_1_10_MBARE] = true, [VM_1_10_SV32] = true }; -static const bool valid_vm_1_10_64[16] = { +const bool valid_vm_1_10_64[16] = { [VM_1_10_MBARE] = true, [VM_1_10_SV39] = true, [VM_1_10_SV48] = true, @@ -1232,11 +1232,9 @@ static RISCVException read_mstatus(CPURISCVState *env, int csrno, static bool validate_vm(CPURISCVState *env, target_ulong vm) { - if (riscv_cpu_mxl(env) == MXL_RV32) { - return valid_vm_1_10_32[vm & 0xf]; - } else { - return valid_vm_1_10_64[vm & 0xf]; - } + RISCVCPU *cpu = RISCV_CPU(env_cpu(env)); + + return (vm & 0xf) <= satp_mode_max_from_map(cpu->cfg.satp_mode.map); } static RISCVException write_mstatus(CPURISCVState *env, int csrno, From 6df3747a2745534c86db8e8f2ffdb1b8a66e5e84 Mon Sep 17 00:00:00 2001 From: Alexandre Ghiti Date: Fri, 3 Mar 2023 14:12:51 +0100 Subject: [PATCH 13/22] riscv: Introduce satp mode hw capabilities Currently, the max satp mode is set with the only constraint that it must be implemented in QEMU, i.e. set in valid_vm_1_10_[32|64]. But we actually need to add another level of constraint: what the hw is actually capable of, because currently, a linux booting on a sifive-u54 boots in sv57 mode which is incompatible with the cpu's sv39 max capability. So add a new bitmap to RISCVSATPMap which contains this capability and initialize it in every XXX_cpu_init. Finally: - valid_vm_1_10_[32|64] constrains which satp mode the CPU can use - the CPU hw capabilities constrains what the user may select - the user's selection then constrains what's available to the guest OS. Signed-off-by: Alexandre Ghiti Reviewed-by: Andrew Jones Reviewed-by: Bin Meng Reviewed-by: Frank Chang Reviewed-by: Alistair Francis Message-ID: <20230303131252.892893-5-alexghiti@rivosinc.com> Signed-off-by: Palmer Dabbelt --- target/riscv/cpu.c | 93 ++++++++++++++++++++++++++++++++++------------ target/riscv/cpu.h | 8 +++- 2 files changed, 75 insertions(+), 26 deletions(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index e1e8057836..1e97473af2 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -313,17 +313,24 @@ const char *satp_mode_str(uint8_t satp_mode, bool is_32_bit) g_assert_not_reached(); } -/* Sets the satp mode to the max supported */ -static void set_satp_mode_default_map(RISCVCPU *cpu) +static void set_satp_mode_max_supported(RISCVCPU *cpu, + uint8_t satp_mode) { bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; + const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64; - if (riscv_feature(&cpu->env, RISCV_FEATURE_MMU)) { - cpu->cfg.satp_mode.map |= (1 << (rv32 ? VM_1_10_SV32 : VM_1_10_SV57)); - } else { - cpu->cfg.satp_mode.map |= (1 << VM_1_10_MBARE); + for (int i = 0; i <= satp_mode; ++i) { + if (valid_vm[i]) { + cpu->cfg.satp_mode.supported |= (1 << i); + } } } + +/* Set the satp mode to the max supported */ +static void set_satp_mode_default_map(RISCVCPU *cpu) +{ + cpu->cfg.satp_mode.map = cpu->cfg.satp_mode.supported; +} #endif static void riscv_any_cpu_init(Object *obj) @@ -334,6 +341,13 @@ static void riscv_any_cpu_init(Object *obj) #elif defined(TARGET_RISCV64) set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU); #endif + +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), + riscv_cpu_mxl(&RISCV_CPU(obj)->env) == MXL_RV32 ? + VM_1_10_SV32 : VM_1_10_SV57); +#endif + set_priv_version(env, PRIV_VERSION_1_12_0); register_cpu_props(obj); } @@ -347,6 +361,9 @@ static void rv64_base_cpu_init(Object *obj) register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57); +#endif } static void rv64_sifive_u_cpu_init(Object *obj) @@ -355,6 +372,9 @@ static void rv64_sifive_u_cpu_init(Object *obj) set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU); register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV39); +#endif } static void rv64_sifive_e_cpu_init(Object *obj) @@ -366,6 +386,9 @@ static void rv64_sifive_e_cpu_init(Object *obj) register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(cpu, VM_1_10_MBARE); +#endif } static void rv64_thead_c906_cpu_init(Object *obj) @@ -395,6 +418,9 @@ static void rv64_thead_c906_cpu_init(Object *obj) cpu->cfg.ext_xtheadsync = true; cpu->cfg.mvendorid = THEAD_VENDOR_ID; +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(cpu, VM_1_10_SV39); +#endif } static void rv128_base_cpu_init(Object *obj) @@ -411,6 +437,9 @@ static void rv128_base_cpu_init(Object *obj) register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV57); +#endif } #else static void rv32_base_cpu_init(Object *obj) @@ -421,6 +450,9 @@ static void rv32_base_cpu_init(Object *obj) register_cpu_props(obj); /* Set latest version of privileged specification */ set_priv_version(env, PRIV_VERSION_1_12_0); +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32); +#endif } static void rv32_sifive_u_cpu_init(Object *obj) @@ -429,6 +461,9 @@ static void rv32_sifive_u_cpu_init(Object *obj) set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU); register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32); +#endif } static void rv32_sifive_e_cpu_init(Object *obj) @@ -440,6 +475,9 @@ static void rv32_sifive_e_cpu_init(Object *obj) register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(cpu, VM_1_10_MBARE); +#endif } static void rv32_ibex_cpu_init(Object *obj) @@ -451,6 +489,9 @@ static void rv32_ibex_cpu_init(Object *obj) register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_11_0); cpu->cfg.mmu = false; +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(cpu, VM_1_10_MBARE); +#endif cpu->cfg.epmp = true; } @@ -463,6 +504,9 @@ static void rv32_imafcu_nommu_cpu_init(Object *obj) register_cpu_props(obj); set_priv_version(env, PRIV_VERSION_1_10_0); cpu->cfg.mmu = false; +#ifndef CONFIG_USER_ONLY + set_satp_mode_max_supported(cpu, VM_1_10_MBARE); +#endif } #endif @@ -999,8 +1043,9 @@ static void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp) static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp) { bool rv32 = riscv_cpu_mxl(&cpu->env) == MXL_RV32; - const bool *valid_vm = rv32 ? valid_vm_1_10_32 : valid_vm_1_10_64; - uint8_t satp_mode_max; + uint8_t satp_mode_map_max; + uint8_t satp_mode_supported_max = + satp_mode_max_from_map(cpu->cfg.satp_mode.supported); if (cpu->cfg.satp_mode.map == 0) { if (cpu->cfg.satp_mode.init == 0) { @@ -1013,9 +1058,10 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp) * valid_vm_1_10_32/64. */ for (int i = 1; i < 16; ++i) { - if ((cpu->cfg.satp_mode.init & (1 << i)) && valid_vm[i]) { + if ((cpu->cfg.satp_mode.init & (1 << i)) && + (cpu->cfg.satp_mode.supported & (1 << i))) { for (int j = i - 1; j >= 0; --j) { - if (valid_vm[j]) { + if (cpu->cfg.satp_mode.supported & (1 << j)) { cpu->cfg.satp_mode.map |= (1 << j); break; } @@ -1026,37 +1072,36 @@ static void riscv_cpu_satp_mode_finalize(RISCVCPU *cpu, Error **errp) } } - /* Make sure the configuration asked is supported by qemu */ - for (int i = 0; i < 16; ++i) { - if ((cpu->cfg.satp_mode.map & (1 << i)) && !valid_vm[i]) { - error_setg(errp, "satp_mode %s is not valid", - satp_mode_str(i, rv32)); - return; - } + satp_mode_map_max = satp_mode_max_from_map(cpu->cfg.satp_mode.map); + + /* Make sure the user asked for a supported configuration (HW and qemu) */ + if (satp_mode_map_max > satp_mode_supported_max) { + error_setg(errp, "satp_mode %s is higher than hw max capability %s", + satp_mode_str(satp_mode_map_max, rv32), + satp_mode_str(satp_mode_supported_max, rv32)); + return; } /* * Make sure the user did not ask for an invalid configuration as per * the specification. */ - satp_mode_max = satp_mode_max_from_map(cpu->cfg.satp_mode.map); - if (!rv32) { - for (int i = satp_mode_max - 1; i >= 0; --i) { + for (int i = satp_mode_map_max - 1; i >= 0; --i) { if (!(cpu->cfg.satp_mode.map & (1 << i)) && (cpu->cfg.satp_mode.init & (1 << i)) && - valid_vm[i]) { + (cpu->cfg.satp_mode.supported & (1 << i))) { error_setg(errp, "cannot disable %s satp mode if %s " "is enabled", satp_mode_str(i, false), - satp_mode_str(satp_mode_max, false)); + satp_mode_str(satp_mode_map_max, false)); return; } } } /* Finally expand the map so that all valid modes are set */ - for (int i = satp_mode_max - 1; i >= 0; --i) { - if (valid_vm[i]) { + for (int i = satp_mode_map_max - 1; i >= 0; --i) { + if (cpu->cfg.satp_mode.supported & (1 << i)) { cpu->cfg.satp_mode.map |= (1 << i); } } diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h index 67ac665ff0..638e47c75a 100644 --- a/target/riscv/cpu.h +++ b/target/riscv/cpu.h @@ -404,13 +404,17 @@ struct RISCVCPUClass { /* * map is a 16-bit bitmap: the most significant set bit in map is the maximum - * satp mode that is supported. + * satp mode that is supported. It may be chosen by the user and must respect + * what qemu implements (valid_1_10_32/64) and what the hw is capable of + * (supported bitmap below). * * init is a 16-bit bitmap used to make sure the user selected a correct * configuration as per the specification. + * + * supported is a 16-bit bitmap used to reflect the hw capabilities. */ typedef struct { - uint16_t map, init; + uint16_t map, init, supported; } RISCVSATPMap; struct RISCVCPUConfig { From ed9eb206942e31abbc593a4bfe8bb97f5fb5d551 Mon Sep 17 00:00:00 2001 From: Alexandre Ghiti Date: Fri, 3 Mar 2023 14:12:52 +0100 Subject: [PATCH 14/22] riscv: Correctly set the device-tree entry 'mmu-type' The 'mmu-type' should reflect what the hardware is capable of so use the new satp_mode field in RISCVCPUConfig to do that. Signed-off-by: Alexandre Ghiti Reviewed-by: Andrew Jones Reviewed-by: Alistair Francis Reviewed-by: Bin Meng Reviewed-by: Frank Chang Message-ID: <20230303131252.892893-6-alexghiti@rivosinc.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 7f70fa11a1..26eb81d036 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -228,8 +228,9 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, int socket, int cpu; uint32_t cpu_phandle; MachineState *ms = MACHINE(s); - char *name, *cpu_name, *core_name, *intc_name; + char *name, *cpu_name, *core_name, *intc_name, *sv_name; bool is_32_bit = riscv_is_32bit(&s->soc[0]); + uint8_t satp_mode_max; for (cpu = s->soc[socket].num_harts - 1; cpu >= 0; cpu--) { RISCVCPU *cpu_ptr = &s->soc[socket].harts[cpu]; @@ -239,13 +240,15 @@ static void create_fdt_socket_cpus(RISCVVirtState *s, int socket, cpu_name = g_strdup_printf("/cpus/cpu@%d", s->soc[socket].hartid_base + cpu); qemu_fdt_add_subnode(ms->fdt, cpu_name); - if (cpu_ptr->cfg.mmu) { - qemu_fdt_setprop_string(ms->fdt, cpu_name, "mmu-type", - (is_32_bit) ? "riscv,sv32" : "riscv,sv48"); - } else { - qemu_fdt_setprop_string(ms->fdt, cpu_name, "mmu-type", - "riscv,none"); - } + + satp_mode_max = satp_mode_max_from_map( + s->soc[socket].harts[cpu].cfg.satp_mode.map); + sv_name = g_strdup_printf("riscv,%s", + satp_mode_str(satp_mode_max, is_32_bit)); + qemu_fdt_setprop_string(ms->fdt, cpu_name, "mmu-type", sv_name); + g_free(sv_name); + + name = riscv_isa_string(cpu_ptr); qemu_fdt_setprop_string(ms->fdt, cpu_name, "riscv,isa", name); g_free(name); From 90477a652b6389aca542f663e4832e8bfb8a7356 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 2 Mar 2023 14:42:05 +0530 Subject: [PATCH 15/22] hw/riscv/virt: Add OEM_ID and OEM_TABLE_ID fields ACPI needs OEM_ID and OEM_TABLE_ID for the machine. Add these fields in the RISCVVirtState structure and initialize with default values. Signed-off-by: Sunil V L Reviewed-by: Bin Meng Acked-by: Alistair Francis Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-2-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 5 +++++ include/hw/riscv/virt.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 26eb81d036..5a059489b5 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -49,6 +49,7 @@ #include "hw/pci/pci.h" #include "hw/pci-host/gpex.h" #include "hw/display/ramfb.h" +#include "hw/acpi/aml-build.h" /* * The virt machine physical address space used by some of the devices @@ -1528,6 +1529,10 @@ static void virt_machine_init(MachineState *machine) static void virt_machine_instance_init(Object *obj) { + RISCVVirtState *s = RISCV_VIRT_MACHINE(obj); + + s->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6); + s->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8); } static char *virt_get_aia_guests(Object *obj, Error **errp) diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index b3d26135c0..6c7885bf89 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -56,6 +56,8 @@ struct RISCVVirtState { bool have_aclint; RISCVVirtAIAType aia_type; int aia_guests; + char *oem_id; + char *oem_table_id; }; enum { From 168b8c29cedb9c1639fabbd96410ed8488af5cf9 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 2 Mar 2023 14:42:06 +0530 Subject: [PATCH 16/22] hw/riscv/virt: Add a switch to disable ACPI ACPI will be enabled by default. Add a switch to turn off for testing and debug purposes. Signed-off-by: Sunil V L Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-3-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 29 +++++++++++++++++++++++++++++ include/hw/riscv/virt.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 5a059489b5..90579a4c0e 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -50,6 +50,7 @@ #include "hw/pci-host/gpex.h" #include "hw/display/ramfb.h" #include "hw/acpi/aml-build.h" +#include "qapi/qapi-visit-common.h" /* * The virt machine physical address space used by some of the devices @@ -1533,6 +1534,7 @@ static void virt_machine_instance_init(Object *obj) s->oem_id = g_strndup(ACPI_BUILD_APPNAME6, 6); s->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8); + s->acpi = ON_OFF_AUTO_AUTO; } static char *virt_get_aia_guests(Object *obj, Error **errp) @@ -1607,6 +1609,28 @@ static void virt_set_aclint(Object *obj, bool value, Error **errp) s->have_aclint = value; } +bool virt_is_acpi_enabled(RISCVVirtState *s) +{ + return s->acpi != ON_OFF_AUTO_OFF; +} + +static void virt_get_acpi(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + RISCVVirtState *s = RISCV_VIRT_MACHINE(obj); + OnOffAuto acpi = s->acpi; + + visit_type_OnOffAuto(v, name, &acpi, errp); +} + +static void virt_set_acpi(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + RISCVVirtState *s = RISCV_VIRT_MACHINE(obj); + + visit_type_OnOffAuto(v, name, &s->acpi, errp); +} + static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine, DeviceState *dev) { @@ -1678,6 +1702,11 @@ static void virt_machine_class_init(ObjectClass *oc, void *data) sprintf(str, "Set number of guest MMIO pages for AIA IMSIC. Valid value " "should be between 0 and %d.", VIRT_IRQCHIP_MAX_GUESTS); object_class_property_set_description(oc, "aia-guests", str); + object_class_property_add(oc, "acpi", "OnOffAuto", + virt_get_acpi, virt_set_acpi, + NULL, NULL); + object_class_property_set_description(oc, "acpi", + "Enable ACPI"); } static const TypeInfo virt_machine_typeinfo = { diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 6c7885bf89..62efebaa32 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -58,6 +58,7 @@ struct RISCVVirtState { int aia_guests; char *oem_id; char *oem_table_id; + OnOffAuto acpi; }; enum { @@ -123,4 +124,5 @@ enum { #define FDT_APLIC_INT_MAP_WIDTH (FDT_PCI_ADDR_CELLS + FDT_PCI_INT_CELLS + \ 1 + FDT_APLIC_INT_CELLS) +bool virt_is_acpi_enabled(RISCVVirtState *s); #endif From 71302ff3bc9fbcceeb3ad7e6bb724ea942b5bba1 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 2 Mar 2023 14:42:07 +0530 Subject: [PATCH 17/22] hw/riscv/virt: Add memmap pointer to RiscVVirtState memmap needs to be exported outside of virt.c so that modules like acpi can use it. Hence, add a pointer field in RiscVVirtState structure and initialize it with the memorymap. Signed-off-by: Sunil V L Reviewed-by: Bin Meng Acked-by: Alistair Francis Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-4-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 2 ++ include/hw/riscv/virt.h | 1 + 2 files changed, 3 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 90579a4c0e..aed303e1e6 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1458,6 +1458,8 @@ static void virt_machine_init(MachineState *machine) ROUND_UP(virt_high_pcie_memmap.base, virt_high_pcie_memmap.size); } + s->memmap = virt_memmap; + /* register system main memory (actual RAM) */ memory_region_add_subregion(system_memory, memmap[VIRT_DRAM].base, machine->ram); diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 62efebaa32..379501edcc 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -59,6 +59,7 @@ struct RISCVVirtState { char *oem_id; char *oem_table_id; OnOffAuto acpi; + const MemMapEntry *memmap; }; enum { From 7da2fb240f9750d9a6fd2dac1397ec18b512a1b5 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 2 Mar 2023 14:42:08 +0530 Subject: [PATCH 18/22] hw/riscv/virt: Enable basic ACPI infrastructure Add basic ACPI infrastructure for RISC-V with below tables. 1) DSDT with below basic objects - CPUs - fw_cfg 2) FADT revision 6 with HW_REDUCED flag 3) XSDT 4) RSDP Add this functionality in a new file virt-acpi-build.c and enable building this infrastructure. Signed-off-by: Sunil V L Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-5-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/Kconfig | 1 + hw/riscv/meson.build | 1 + hw/riscv/virt-acpi-build.c | 304 +++++++++++++++++++++++++++++++++++++ include/hw/riscv/virt.h | 1 + 4 files changed, 307 insertions(+) create mode 100644 hw/riscv/virt-acpi-build.c diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index 4550b3b938..6528ebfa3a 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -44,6 +44,7 @@ config RISCV_VIRT select VIRTIO_MMIO select FW_CFG_DMA select PLATFORM_BUS + select ACPI config SHAKTI_C bool diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index ab6cae57ea..2f7ee81be3 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -9,5 +9,6 @@ riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c')) riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u.c')) riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('spike.c')) riscv_ss.add(when: 'CONFIG_MICROCHIP_PFSOC', if_true: files('microchip_pfsoc.c')) +riscv_ss.add(when: 'CONFIG_ACPI', if_true: files('virt-acpi-build.c')) hw_arch += {'riscv': riscv_ss} diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c new file mode 100644 index 0000000000..d6947fdc74 --- /dev/null +++ b/hw/riscv/virt-acpi-build.c @@ -0,0 +1,304 @@ +/* + * Support for generating ACPI tables and passing them to Guests + * + * RISC-V virt ACPI generation + * + * Copyright (C) 2008-2010 Kevin O'Connor + * Copyright (C) 2006 Fabrice Bellard + * Copyright (C) 2013 Red Hat Inc + * Copyright (c) 2015 HUAWEI TECHNOLOGIES CO.,LTD. + * Copyright (C) 2021-2023 Ventana Micro Systems Inc + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License along + * with this program; if not, see . + */ + +#include "qemu/osdep.h" +#include "hw/acpi/acpi-defs.h" +#include "hw/acpi/acpi.h" +#include "hw/acpi/aml-build.h" +#include "hw/acpi/utils.h" +#include "qapi/error.h" +#include "sysemu/reset.h" +#include "migration/vmstate.h" +#include "hw/riscv/virt.h" + +#define ACPI_BUILD_TABLE_SIZE 0x20000 + +typedef struct AcpiBuildState { + /* Copy of table in RAM (for patching) */ + MemoryRegion *table_mr; + MemoryRegion *rsdp_mr; + MemoryRegion *linker_mr; + /* Is table patched? */ + bool patched; +} AcpiBuildState; + +static void acpi_align_size(GArray *blob, unsigned align) +{ + /* + * Align size to multiple of given size. This reduces the chance + * we need to change size in the future (breaking cross version migration). + */ + g_array_set_size(blob, ROUND_UP(acpi_data_len(blob), align)); +} + +static void riscv_acpi_madt_add_rintc(uint32_t uid, + const CPUArchIdList *arch_ids, + GArray *entry) +{ + uint64_t hart_id = arch_ids->cpus[uid].arch_id; + + build_append_int_noprefix(entry, 0x18, 1); /* Type */ + build_append_int_noprefix(entry, 20, 1); /* Length */ + build_append_int_noprefix(entry, 1, 1); /* Version */ + build_append_int_noprefix(entry, 0, 1); /* Reserved */ + build_append_int_noprefix(entry, 0x1, 4); /* Flags */ + build_append_int_noprefix(entry, hart_id, 8); /* Hart ID */ + build_append_int_noprefix(entry, uid, 4); /* ACPI Processor UID */ +} + +static void acpi_dsdt_add_cpus(Aml *scope, RISCVVirtState *s) +{ + MachineClass *mc = MACHINE_GET_CLASS(s); + MachineState *ms = MACHINE(s); + const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); + + for (int i = 0; i < arch_ids->len; i++) { + Aml *dev; + GArray *madt_buf = g_array_new(0, 1, 1); + + dev = aml_device("C%.03X", i); + aml_append(dev, aml_name_decl("_HID", aml_string("ACPI0007"))); + aml_append(dev, aml_name_decl("_UID", + aml_int(arch_ids->cpus[i].arch_id))); + + /* build _MAT object */ + riscv_acpi_madt_add_rintc(i, arch_ids, madt_buf); + aml_append(dev, aml_name_decl("_MAT", + aml_buffer(madt_buf->len, + (uint8_t *)madt_buf->data))); + g_array_free(madt_buf, true); + + aml_append(scope, dev); + } +} + +static void acpi_dsdt_add_fw_cfg(Aml *scope, const MemMapEntry *fw_cfg_memmap) +{ + Aml *dev = aml_device("FWCF"); + aml_append(dev, aml_name_decl("_HID", aml_string("QEMU0002"))); + + /* device present, functioning, decoding, not shown in UI */ + aml_append(dev, aml_name_decl("_STA", aml_int(0xB))); + aml_append(dev, aml_name_decl("_CCA", aml_int(1))); + + Aml *crs = aml_resource_template(); + aml_append(crs, aml_memory32_fixed(fw_cfg_memmap->base, + fw_cfg_memmap->size, AML_READ_WRITE)); + aml_append(dev, aml_name_decl("_CRS", crs)); + aml_append(scope, dev); +} + +/* FADT */ +static void build_fadt_rev6(GArray *table_data, + BIOSLinker *linker, + RISCVVirtState *s, + unsigned dsdt_tbl_offset) +{ + AcpiFadtData fadt = { + .rev = 6, + .minor_ver = 5, + .flags = 1 << ACPI_FADT_F_HW_REDUCED_ACPI, + .xdsdt_tbl_offset = &dsdt_tbl_offset, + }; + + build_fadt(table_data, linker, &fadt, s->oem_id, s->oem_table_id); +} + +/* DSDT */ +static void build_dsdt(GArray *table_data, + BIOSLinker *linker, + RISCVVirtState *s) +{ + Aml *scope, *dsdt; + const MemMapEntry *memmap = s->memmap; + AcpiTable table = { .sig = "DSDT", .rev = 2, .oem_id = s->oem_id, + .oem_table_id = s->oem_table_id }; + + + acpi_table_begin(&table, table_data); + dsdt = init_aml_allocator(); + + /* + * When booting the VM with UEFI, UEFI takes ownership of the RTC hardware. + * While UEFI can use libfdt to disable the RTC device node in the DTB that + * it passes to the OS, it cannot modify AML. Therefore, we won't generate + * the RTC ACPI device at all when using UEFI. + */ + scope = aml_scope("\\_SB"); + acpi_dsdt_add_cpus(scope, s); + + acpi_dsdt_add_fw_cfg(scope, &memmap[VIRT_FW_CFG]); + + aml_append(dsdt, scope); + + /* copy AML table into ACPI tables blob and patch header there */ + g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len); + + acpi_table_end(linker, &table); + free_aml_allocator(); +} + +static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) +{ + GArray *table_offsets; + unsigned dsdt, xsdt; + GArray *tables_blob = tables->table_data; + + table_offsets = g_array_new(false, true, + sizeof(uint32_t)); + + bios_linker_loader_alloc(tables->linker, + ACPI_BUILD_TABLE_FILE, tables_blob, + 64, false); + + /* DSDT is pointed to by FADT */ + dsdt = tables_blob->len; + build_dsdt(tables_blob, tables->linker, s); + + /* FADT and others pointed to by XSDT */ + acpi_add_table(table_offsets, tables_blob); + build_fadt_rev6(tables_blob, tables->linker, s, dsdt); + + /* XSDT is pointed to by RSDP */ + xsdt = tables_blob->len; + build_xsdt(tables_blob, tables->linker, table_offsets, s->oem_id, + s->oem_table_id); + + /* RSDP is in FSEG memory, so allocate it separately */ + { + AcpiRsdpData rsdp_data = { + .revision = 2, + .oem_id = s->oem_id, + .xsdt_tbl_offset = &xsdt, + .rsdt_tbl_offset = NULL, + }; + build_rsdp(tables->rsdp, tables->linker, &rsdp_data); + } + + /* + * The align size is 128, warn if 64k is not enough therefore + * the align size could be resized. + */ + if (tables_blob->len > ACPI_BUILD_TABLE_SIZE / 2) { + warn_report("ACPI table size %u exceeds %d bytes," + " migration may not work", + tables_blob->len, ACPI_BUILD_TABLE_SIZE / 2); + error_printf("Try removing some objects."); + } + + acpi_align_size(tables_blob, ACPI_BUILD_TABLE_SIZE); + + /* Clean up memory that's no longer used */ + g_array_free(table_offsets, true); +} + +static void acpi_ram_update(MemoryRegion *mr, GArray *data) +{ + uint32_t size = acpi_data_len(data); + + /* + * Make sure RAM size is correct - in case it got changed + * e.g. by migration + */ + memory_region_ram_resize(mr, size, &error_abort); + + memcpy(memory_region_get_ram_ptr(mr), data->data, size); + memory_region_set_dirty(mr, 0, size); +} + +static void virt_acpi_build_update(void *build_opaque) +{ + AcpiBuildState *build_state = build_opaque; + AcpiBuildTables tables; + + /* No state to update or already patched? Nothing to do. */ + if (!build_state || build_state->patched) { + return; + } + + build_state->patched = true; + + acpi_build_tables_init(&tables); + + virt_acpi_build(RISCV_VIRT_MACHINE(qdev_get_machine()), &tables); + + acpi_ram_update(build_state->table_mr, tables.table_data); + acpi_ram_update(build_state->rsdp_mr, tables.rsdp); + acpi_ram_update(build_state->linker_mr, tables.linker->cmd_blob); + + acpi_build_tables_cleanup(&tables, true); +} + +static void virt_acpi_build_reset(void *build_opaque) +{ + AcpiBuildState *build_state = build_opaque; + build_state->patched = false; +} + +static const VMStateDescription vmstate_virt_acpi_build = { + .name = "virt_acpi_build", + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_BOOL(patched, AcpiBuildState), + VMSTATE_END_OF_LIST() + }, +}; + +void virt_acpi_setup(RISCVVirtState *s) +{ + AcpiBuildTables tables; + AcpiBuildState *build_state; + + build_state = g_malloc0(sizeof *build_state); + + acpi_build_tables_init(&tables); + virt_acpi_build(s, &tables); + + /* Now expose it all to Guest */ + build_state->table_mr = acpi_add_rom_blob(virt_acpi_build_update, + build_state, tables.table_data, + ACPI_BUILD_TABLE_FILE); + assert(build_state->table_mr != NULL); + + build_state->linker_mr = acpi_add_rom_blob(virt_acpi_build_update, + build_state, + tables.linker->cmd_blob, + ACPI_BUILD_LOADER_FILE); + + build_state->rsdp_mr = acpi_add_rom_blob(virt_acpi_build_update, + build_state, tables.rsdp, + ACPI_BUILD_RSDP_FILE); + + qemu_register_reset(virt_acpi_build_reset, build_state); + virt_acpi_build_reset(build_state); + vmstate_register(NULL, 0, &vmstate_virt_acpi_build, build_state); + + /* + * Clean up tables but don't free the memory: we track it + * in build_state. + */ + acpi_build_tables_cleanup(&tables, false); +} diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 379501edcc..e5c474b26e 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -126,4 +126,5 @@ enum { 1 + FDT_APLIC_INT_CELLS) bool virt_is_acpi_enabled(RISCVVirtState *s); +void virt_acpi_setup(RISCVVirtState *vms); #endif From 6cc40ea2117fd81cc14fcb22e2b7a9f77b5a8dae Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 2 Mar 2023 14:42:09 +0530 Subject: [PATCH 19/22] hw/riscv/virt: virt-acpi-build.c: Add RINTC in MADT Add Multiple APIC Description Table (MADT) with the RINTC structure for each cpu. Signed-off-by: Sunil V L Acked-by: Alistair Francis Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-6-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt-acpi-build.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c index d6947fdc74..026d1eaf88 100644 --- a/hw/riscv/virt-acpi-build.c +++ b/hw/riscv/virt-acpi-build.c @@ -32,6 +32,7 @@ #include "sysemu/reset.h" #include "migration/vmstate.h" #include "hw/riscv/virt.h" +#include "hw/riscv/numa.h" #define ACPI_BUILD_TABLE_SIZE 0x20000 @@ -160,6 +161,36 @@ static void build_dsdt(GArray *table_data, free_aml_allocator(); } +/* + * ACPI spec, Revision 6.5+ + * 5.2.12 Multiple APIC Description Table (MADT) + * REF: https://github.com/riscv-non-isa/riscv-acpi/issues/15 + * https://drive.google.com/file/d/1R6k4MshhN3WTT-hwqAquu5nX6xSEqK2l/view + */ +static void build_madt(GArray *table_data, + BIOSLinker *linker, + RISCVVirtState *s) +{ + MachineClass *mc = MACHINE_GET_CLASS(s); + MachineState *ms = MACHINE(s); + const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); + + AcpiTable table = { .sig = "APIC", .rev = 6, .oem_id = s->oem_id, + .oem_table_id = s->oem_table_id }; + + acpi_table_begin(&table, table_data); + /* Local Interrupt Controller Address */ + build_append_int_noprefix(table_data, 0, 4); + build_append_int_noprefix(table_data, 0, 4); /* MADT Flags */ + + /* RISC-V Local INTC structures per HART */ + for (int i = 0; i < arch_ids->len; i++) { + riscv_acpi_madt_add_rintc(i, arch_ids, table_data); + } + + acpi_table_end(linker, &table); +} + static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) { GArray *table_offsets; @@ -181,6 +212,9 @@ static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) acpi_add_table(table_offsets, tables_blob); build_fadt_rev6(tables_blob, tables->linker, s, dsdt); + acpi_add_table(table_offsets, tables_blob); + build_madt(tables_blob, tables->linker, s); + /* XSDT is pointed to by RSDP */ xsdt = tables_blob->len; build_xsdt(tables_blob, tables->linker, table_offsets, s->oem_id, From ebfd392893701a8cde9c1b6017009a03c90ab34b Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 2 Mar 2023 14:42:10 +0530 Subject: [PATCH 20/22] hw/riscv/virt: virt-acpi-build.c: Add RHCT Table RISC-V ACPI platforms need to provide RISC-V Hart Capabilities Table (RHCT). Add this to the ACPI tables. Signed-off-by: Sunil V L Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-7-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt-acpi-build.c | 78 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/hw/riscv/virt-acpi-build.c b/hw/riscv/virt-acpi-build.c index 026d1eaf88..82da0a238c 100644 --- a/hw/riscv/virt-acpi-build.c +++ b/hw/riscv/virt-acpi-build.c @@ -33,6 +33,7 @@ #include "migration/vmstate.h" #include "hw/riscv/virt.h" #include "hw/riscv/numa.h" +#include "hw/intc/riscv_aclint.h" #define ACPI_BUILD_TABLE_SIZE 0x20000 @@ -111,6 +112,80 @@ static void acpi_dsdt_add_fw_cfg(Aml *scope, const MemMapEntry *fw_cfg_memmap) aml_append(scope, dev); } +/* RHCT Node[N] starts at offset 56 */ +#define RHCT_NODE_ARRAY_OFFSET 56 + +/* + * ACPI spec, Revision 6.5+ + * 5.2.36 RISC-V Hart Capabilities Table (RHCT) + * REF: https://github.com/riscv-non-isa/riscv-acpi/issues/16 + * https://drive.google.com/file/d/1nP3nFiH4jkPMp6COOxP6123DCZKR-tia/view + */ +static void build_rhct(GArray *table_data, + BIOSLinker *linker, + RISCVVirtState *s) +{ + MachineClass *mc = MACHINE_GET_CLASS(s); + MachineState *ms = MACHINE(s); + const CPUArchIdList *arch_ids = mc->possible_cpu_arch_ids(ms); + size_t len, aligned_len; + uint32_t isa_offset, num_rhct_nodes; + RISCVCPU *cpu; + char *isa; + + AcpiTable table = { .sig = "RHCT", .rev = 1, .oem_id = s->oem_id, + .oem_table_id = s->oem_table_id }; + + acpi_table_begin(&table, table_data); + + build_append_int_noprefix(table_data, 0x0, 4); /* Reserved */ + + /* Time Base Frequency */ + build_append_int_noprefix(table_data, + RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, 8); + + /* ISA + N hart info */ + num_rhct_nodes = 1 + ms->smp.cpus; + + /* Number of RHCT nodes*/ + build_append_int_noprefix(table_data, num_rhct_nodes, 4); + + /* Offset to the RHCT node array */ + build_append_int_noprefix(table_data, RHCT_NODE_ARRAY_OFFSET, 4); + + /* ISA String Node */ + isa_offset = table_data->len - table.table_offset; + build_append_int_noprefix(table_data, 0, 2); /* Type 0 */ + + cpu = &s->soc[0].harts[0]; + isa = riscv_isa_string(cpu); + len = 8 + strlen(isa) + 1; + aligned_len = (len % 2) ? (len + 1) : len; + + build_append_int_noprefix(table_data, aligned_len, 2); /* Length */ + build_append_int_noprefix(table_data, 0x1, 2); /* Revision */ + + /* ISA string length including NUL */ + build_append_int_noprefix(table_data, strlen(isa) + 1, 2); + g_array_append_vals(table_data, isa, strlen(isa) + 1); /* ISA string */ + + if (aligned_len != len) { + build_append_int_noprefix(table_data, 0x0, 1); /* Optional Padding */ + } + + /* Hart Info Node */ + for (int i = 0; i < arch_ids->len; i++) { + build_append_int_noprefix(table_data, 0xFFFF, 2); /* Type */ + build_append_int_noprefix(table_data, 16, 2); /* Length */ + build_append_int_noprefix(table_data, 0x1, 2); /* Revision */ + build_append_int_noprefix(table_data, 1, 2); /* Number of offsets */ + build_append_int_noprefix(table_data, i, 4); /* ACPI Processor UID */ + build_append_int_noprefix(table_data, isa_offset, 4); /* Offsets[0] */ + } + + acpi_table_end(linker, &table); +} + /* FADT */ static void build_fadt_rev6(GArray *table_data, BIOSLinker *linker, @@ -215,6 +290,9 @@ static void virt_acpi_build(RISCVVirtState *s, AcpiBuildTables *tables) acpi_add_table(table_offsets, tables_blob); build_madt(tables_blob, tables->linker, s); + acpi_add_table(table_offsets, tables_blob); + build_rhct(tables_blob, tables->linker, s); + /* XSDT is pointed to by RSDP */ xsdt = tables_blob->len; build_xsdt(tables_blob, tables->linker, table_offsets, s->oem_id, From f709360f0ac364967deb2ed36142c05dfbb4e535 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 2 Mar 2023 14:42:11 +0530 Subject: [PATCH 21/22] hw/riscv/virt.c: Initialize the ACPI tables Initialize the ACPI tables if the acpi option is not disabled. Signed-off-by: Sunil V L Reviewed-by: Bin Meng Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-8-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- hw/riscv/virt.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index aed303e1e6..4e3efbee16 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1323,6 +1323,10 @@ static void virt_machine_done(Notifier *notifier, void *data) if (kvm_enabled()) { riscv_setup_direct_kernel(kernel_entry, fdt_load_addr); } + + if (virt_is_acpi_enabled(s)) { + virt_acpi_setup(s); + } } static void virt_machine_init(MachineState *machine) From 47fc340010335bc2549bc1f07e5fd85d86a2b9f9 Mon Sep 17 00:00:00 2001 From: Sunil V L Date: Thu, 2 Mar 2023 14:42:12 +0530 Subject: [PATCH 22/22] MAINTAINERS: Add entry for RISC-V ACPI RISC-V ACPI related functionality for virt machine is added in virt-acpi-build.c. Add the maintainer entry after moving the ARM ACPI entry under the main ACPI entry. Signed-off-by: Sunil V L Reviewed-by: Bin Meng Acked-by: Alistair Francis Reviewed-by: Andrew Jones Message-ID: <20230302091212.999767-9-sunilvl@ventanamicro.com> Signed-off-by: Palmer Dabbelt --- MAINTAINERS | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index 011fd85a09..26bf14b57b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -999,12 +999,6 @@ S: Maintained F: hw/ssi/xlnx-versal-ospi.c F: include/hw/ssi/xlnx-versal-ospi.h -ARM ACPI Subsystem -M: Shannon Zhao -L: qemu-arm@nongnu.org -S: Maintained -F: hw/arm/virt-acpi-build.c - STM32F100 M: Alexandre Iooss L: qemu-arm@nongnu.org @@ -1892,6 +1886,18 @@ F: docs/specs/acpi_nvdimm.rst F: docs/specs/acpi_pci_hotplug.rst F: docs/specs/acpi_hw_reduced_hotplug.rst +ARM ACPI Subsystem +M: Shannon Zhao +L: qemu-arm@nongnu.org +S: Maintained +F: hw/arm/virt-acpi-build.c + +RISC-V ACPI Subsystem +M: Sunil V L +L: qemu-riscv@nongnu.org +S: Maintained +F: hw/riscv/virt-acpi-build.c + ACPI/VIOT M: Jean-Philippe Brucker S: Supported