From 7a5342e7ccf2deb5553951024d57ec1327c926dd Mon Sep 17 00:00:00 2001 From: Halil Pasic Date: Wed, 16 May 2018 15:27:57 +0200 Subject: [PATCH 01/12] virtio-ccw: clean up notify Coverity recently started complaining about virtio_ccw_notify(). Turns out, there is a couple of things that can be cleaned up. Let's clean! Reported-by: Peter Maydell Fixes: CID 1390619 Signed-off-by: Halil Pasic Message-Id: <20180516132757.68558-1-pasic@linux.ibm.com> Signed-off-by: Cornelia Huck --- hw/s390x/virtio-ccw.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c index 0a9bec484b..b92a85d0b0 100644 --- a/hw/s390x/virtio-ccw.c +++ b/hw/s390x/virtio-ccw.c @@ -1001,10 +1001,15 @@ static void virtio_ccw_notify(DeviceState *d, uint16_t vector) SubchDev *sch = ccw_dev->sch; uint64_t indicators; - /* queue indicators + secondary indicators */ - if (vector >= VIRTIO_QUEUE_MAX + 64) { + if (vector == VIRTIO_NO_VECTOR) { return; } + /* + * vector < VIRTIO_QUEUE_MAX: notification for a virtqueue + * vector == VIRTIO_QUEUE_MAX: configuration change notification + * bits beyond that are unused and should never be notified for + */ + assert(vector <= VIRTIO_QUEUE_MAX); if (vector < VIRTIO_QUEUE_MAX) { if (!dev->indicators) { @@ -1027,6 +1032,7 @@ static void virtio_ccw_notify(DeviceState *d, uint16_t vector) css_adapter_interrupt(CSS_IO_ADAPTER_VIRTIO, dev->thinint_isc); } } else { + assert(vector < NR_CLASSIC_INDICATOR_BITS); indicators = address_space_ldq(&address_space_memory, dev->indicators->addr, MEMTXATTRS_UNSPECIFIED, @@ -1040,12 +1046,11 @@ static void virtio_ccw_notify(DeviceState *d, uint16_t vector) if (!dev->indicators2) { return; } - vector = 0; indicators = address_space_ldq(&address_space_memory, dev->indicators2->addr, MEMTXATTRS_UNSPECIFIED, NULL); - indicators |= 1ULL << vector; + indicators |= 1ULL; address_space_stq(&address_space_memory, dev->indicators2->addr, indicators, MEMTXATTRS_UNSPECIFIED, NULL); css_conditional_io_interrupt(sch); From 9a51c9ee6ca6610e4ab89945e6c75eda3a265ceb Mon Sep 17 00:00:00 2001 From: Halil Pasic Date: Thu, 24 May 2018 19:58:27 +0200 Subject: [PATCH 02/12] vfio-ccw: add force unlimited prefetch property There is at least one guest (OS) such that although it does not rely on the guarantees provided by ORB 1 word 9 bit (aka unlimited prefetch, aka P bit) not being set, it fails to tell this to the machine. Usually this ain't a big deal, as the original purpose of the P bit is to allow for performance optimizations. vfio-ccw however can not provide the guarantees required if the bit is not set. It is not possible to implement support for the P bit not set without transitioning to lower level protocols for vfio-ccw. So let's give the user the opportunity to force setting the P bit, if the user knows this is safe. For self modifying channel programs forcing the P bit is not safe. If the P bit is forced for a self modifying channel program things are expected to break in strange ways. Let's also avoid warning multiple about P bit not set in the ORB in case P bit is not told to be forced, and designate the affected vfio-ccw device. Signed-off-by: Halil Pasic Suggested-by: Dong Jia Shi Acked-by: Jason J. Herne Tested-by: Jason J. Herne Message-Id: <20180524175828.3143-2-pasic@linux.ibm.com> Signed-off-by: Cornelia Huck --- hw/s390x/css.c | 3 +-- hw/vfio/ccw.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/hw/s390x/css.c b/hw/s390x/css.c index 56c3fa8c89..39ae5bbf7e 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -1204,8 +1204,7 @@ static IOInstEnding sch_handle_start_func_passthrough(SubchDev *sch) * Only support prefetch enable mode. * Only support 64bit addressing idal. */ - if (!(orb->ctrl0 & ORB_CTRL0_MASK_PFCH) || - !(orb->ctrl0 & ORB_CTRL0_MASK_C64)) { + if (!(orb->ctrl0 & ORB_CTRL0_MASK_C64)) { warn_report("vfio-ccw requires PFCH and C64 flags set"); sch_gen_unit_exception(sch); css_inject_io_interrupt(sch); diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c index 76e4e8c652..351b305e1a 100644 --- a/hw/vfio/ccw.c +++ b/hw/vfio/ccw.c @@ -33,8 +33,30 @@ typedef struct VFIOCCWDevice { uint64_t io_region_offset; struct ccw_io_region *io_region; EventNotifier io_notifier; + bool force_orb_pfch; + bool warned_orb_pfch; } VFIOCCWDevice; +static inline void warn_once(bool *warned, const char *fmt, ...) +{ + va_list ap; + + if (!warned || *warned) { + return; + } + *warned = true; + va_start(ap, fmt); + warn_vreport(fmt, ap); + va_end(ap); +} + +static inline void warn_once_pfch(VFIOCCWDevice *vcdev, SubchDev *sch, + const char *msg) +{ + warn_once(&vcdev->warned_orb_pfch, "vfio-ccw (devno %x.%x.%04x): %s", + sch->cssid, sch->ssid, sch->devno, msg); +} + static void vfio_ccw_compute_needs_reset(VFIODevice *vdev) { vdev->needs_reset = false; @@ -55,6 +77,18 @@ static IOInstEnding vfio_ccw_handle_request(SubchDev *sch) struct ccw_io_region *region = vcdev->io_region; int ret; + if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH)) { + if (!(vcdev->force_orb_pfch)) { + warn_once_pfch(vcdev, sch, "requires PFCH flag set"); + sch_gen_unit_exception(sch); + css_inject_io_interrupt(sch); + return IOINST_CC_EXPECTED; + } else { + sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH; + warn_once_pfch(vcdev, sch, "PFCH flag forced"); + } + } + QEMU_BUILD_BUG_ON(sizeof(region->orb_area) != sizeof(ORB)); QEMU_BUILD_BUG_ON(sizeof(region->scsw_area) != sizeof(SCSW)); QEMU_BUILD_BUG_ON(sizeof(region->irb_area) != sizeof(IRB)); @@ -430,6 +464,7 @@ static void vfio_ccw_unrealize(DeviceState *dev, Error **errp) static Property vfio_ccw_properties[] = { DEFINE_PROP_STRING("sysfsdev", VFIOCCWDevice, vdev.sysfsdev), + DEFINE_PROP_BOOL("force-orb-pfch", VFIOCCWDevice, force_orb_pfch, false), DEFINE_PROP_END_OF_LIST(), }; From ea2dd691e21f2ca4896d3a88835b52f78012801d Mon Sep 17 00:00:00 2001 From: Halil Pasic Date: Thu, 24 May 2018 19:58:28 +0200 Subject: [PATCH 03/12] vfio-ccw: remove orb.c64 (64 bit data addresses) check The vfio-ccw module does the check too, and there is actually no technical obstacle for supporting fmt 1 idaws. Let us be ready for the beautiful day when fmt 1 idaws become supported by the vfio-ccw kernel module. QEMU does not have to do a thing for that, except not insisting on this check. Signed-off-by: Halil Pasic Acked-by: Jason J. Herne Tested-by: Jason J. Herne Message-Id: <20180524175828.3143-3-pasic@linux.ibm.com> Signed-off-by: Cornelia Huck --- hw/s390x/css.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/hw/s390x/css.c b/hw/s390x/css.c index 39ae5bbf7e..5424ea4562 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -1199,17 +1199,6 @@ static IOInstEnding sch_handle_start_func_passthrough(SubchDev *sch) assert(orb != NULL); p->intparm = orb->intparm; } - - /* - * Only support prefetch enable mode. - * Only support 64bit addressing idal. - */ - if (!(orb->ctrl0 & ORB_CTRL0_MASK_C64)) { - warn_report("vfio-ccw requires PFCH and C64 flags set"); - sch_gen_unit_exception(sch); - css_inject_io_interrupt(sch); - return IOINST_CC_EXPECTED; - } return s390_ccw_cmd_request(sch); } From acd7ef837d8987ad4ef2ab8f8e8c0f13ab413dd5 Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Tue, 12 Jun 2018 14:59:33 +0200 Subject: [PATCH 04/12] s390x/ipl: Try to detect Linux vs non Linux for initial IPL PSW Right now the IPL device always starts from address 0x10000 (the usual Linux entry point). To run other guests (e.g. test programs) it is useful to use the IPL PSW from address 0. We can use the Linux magic at 0x10008 to decide. Signed-off-by: Christian Borntraeger Message-Id: <20180612125933.262679-1-borntraeger@de.ibm.com> Reviewed-by: David Hildenbrand Reviewed-by: Thomas Huth Signed-off-by: Cornelia Huck --- hw/s390x/ipl.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 04245b5258..0d67349004 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -29,6 +29,7 @@ #include "exec/exec-all.h" #define KERN_IMAGE_START 0x010000UL +#define LINUX_MAGIC_ADDR 0x010008UL #define KERN_PARM_AREA 0x010480UL #define INITRD_START 0x800000UL #define INITRD_PARM_START 0x010408UL @@ -105,7 +106,9 @@ static uint64_t bios_translate_addr(void *opaque, uint64_t srcaddr) static void s390_ipl_realize(DeviceState *dev, Error **errp) { S390IPLState *ipl = S390_IPL(dev); - uint64_t pentry = KERN_IMAGE_START; + uint32_t *ipl_psw; + uint64_t pentry; + char *magic; int kernel_size; Error *err = NULL; @@ -157,10 +160,24 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp) NULL, 1, EM_S390, 0, 0); if (kernel_size < 0) { kernel_size = load_image_targphys(ipl->kernel, 0, ram_size); - } - if (kernel_size < 0) { - error_setg(&err, "could not load kernel '%s'", ipl->kernel); - goto error; + if (kernel_size < 0) { + error_setg(&err, "could not load kernel '%s'", ipl->kernel); + goto error; + } + /* if this is Linux use KERN_IMAGE_START */ + magic = rom_ptr(LINUX_MAGIC_ADDR); + if (magic && !memcmp(magic, "S390EP", 6)) { + pentry = KERN_IMAGE_START; + } else { + /* if not Linux load the address of the (short) IPL PSW */ + ipl_psw = rom_ptr(4); + if (ipl_psw) { + pentry = be32_to_cpu(*ipl_psw) & 0x7fffffffUL; + } else { + error_setg(&err, "Could not get IPL PSW"); + goto error; + } + } } /* * Is it a Linux kernel (starting at 0x10000)? If yes, we fill in the From 23ad956bff98d949057156ea3f68a9763c2dda0e Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Wed, 13 Jun 2018 10:18:19 +0200 Subject: [PATCH 05/12] s390x/cpumodels: add z14 Model ZR1 Introduce the new z14 Model ZR1 cpu model. Mostly identical to z14, only the cpu type differs (3906 vs. 3907) Signed-off-by: Christian Borntraeger Message-Id: <20180613081819.147178-1-borntraeger@de.ibm.com> Reviewed-by: David Hildenbrand Signed-off-by: Cornelia Huck --- target/s390x/cpu_models.c | 1 + 1 file changed, 1 insertion(+) diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c index e10035aaa8..cfdbccf46d 100644 --- a/target/s390x/cpu_models.c +++ b/target/s390x/cpu_models.c @@ -79,6 +79,7 @@ static S390CPUDef s390_cpu_defs[] = { CPUDEF_INIT(0x2964, 13, 2, 47, 0x08000000U, "z13.2", "IBM z13 GA2"), CPUDEF_INIT(0x2965, 13, 2, 47, 0x08000000U, "z13s", "IBM z13s GA1"), CPUDEF_INIT(0x3906, 14, 1, 47, 0x08000000U, "z14", "IBM z14 GA1"), + CPUDEF_INIT(0x3907, 14, 1, 47, 0x08000000U, "z14ZR1", "IBM z14 Model ZR1 GA1"), }; #define QEMU_MAX_CPU_TYPE 0x2827 From a0e11b617b9ef41cefe8739dff4d6a7b01ca967f Mon Sep 17 00:00:00 2001 From: Collin Walling Date: Tue, 29 May 2018 00:40:09 -0400 Subject: [PATCH 06/12] pc-bios/s390-ccw: define loadparm length Loadparm is defined by the s390 architecture to be 8 bytes in length. Let's define this size in the s390-ccw bios. Suggested-by: Laszlo Ersek Signed-off-by: Collin Walling Reviewed-by: Laszlo Ersek Reviewed-by: Thomas Huth Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/iplb.h | 4 +++- pc-bios/s390-ccw/main.c | 8 ++++---- pc-bios/s390-ccw/sclp.c | 2 +- pc-bios/s390-ccw/sclp.h | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h index ded20c834e..772d5c57c9 100644 --- a/pc-bios/s390-ccw/iplb.h +++ b/pc-bios/s390-ccw/iplb.h @@ -12,6 +12,8 @@ #ifndef IPLB_H #define IPLB_H +#define LOADPARM_LEN 8 + struct IplBlockCcw { uint8_t reserved0[85]; uint8_t ssid; @@ -61,7 +63,7 @@ struct IplParameterBlock { uint8_t pbt; uint8_t flags; uint16_t reserved01; - uint8_t loadparm[8]; + uint8_t loadparm[LOADPARM_LEN]; union { IplBlockCcw ccw; IplBlockFcp fcp; diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 26f9adf84a..544851d672 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -15,7 +15,7 @@ char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); static SubChannelId blk_schid = { .one = 1 }; IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); -static char loadparm_str[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static char loadparm_str[LOADPARM_LEN + 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; QemuIplParameters qipl; #define LOADPARM_PROMPT "PROMPT " @@ -80,13 +80,13 @@ static bool find_dev(Schib *schib, int dev_no) static void menu_setup(void) { - if (memcmp(loadparm_str, LOADPARM_PROMPT, 8) == 0) { + if (memcmp(loadparm_str, LOADPARM_PROMPT, LOADPARM_LEN) == 0) { menu_set_parms(QIPL_FLAG_BM_OPTS_CMD, 0); return; } /* If loadparm was set to any other value, then do not enable menu */ - if (memcmp(loadparm_str, LOADPARM_EMPTY, 8) != 0) { + if (memcmp(loadparm_str, LOADPARM_EMPTY, LOADPARM_LEN) != 0) { return; } @@ -117,7 +117,7 @@ static void virtio_setup(void) enable_mss_facility(); sclp_get_loadparm_ascii(loadparm_str); - memcpy(ldp + 10, loadparm_str, 8); + memcpy(ldp + 10, loadparm_str, LOADPARM_LEN); sclp_print(ldp); memcpy(&qipl, early_qipl, sizeof(QemuIplParameters)); diff --git a/pc-bios/s390-ccw/sclp.c b/pc-bios/s390-ccw/sclp.c index 3836cb4716..c0223fab0b 100644 --- a/pc-bios/s390-ccw/sclp.c +++ b/pc-bios/s390-ccw/sclp.c @@ -114,7 +114,7 @@ void sclp_get_loadparm_ascii(char *loadparm) memset((char *)_sccb, 0, sizeof(ReadInfo)); sccb->h.length = sizeof(ReadInfo); if (!sclp_service_call(SCLP_CMDW_READ_SCP_INFO, sccb)) { - ebcdic_to_ascii((char *) sccb->loadparm, loadparm, 8); + ebcdic_to_ascii((char *) sccb->loadparm, loadparm, LOADPARM_LEN); } } diff --git a/pc-bios/s390-ccw/sclp.h b/pc-bios/s390-ccw/sclp.h index 0dd987ff5d..8450161ba7 100644 --- a/pc-bios/s390-ccw/sclp.h +++ b/pc-bios/s390-ccw/sclp.h @@ -56,7 +56,7 @@ typedef struct ReadInfo { uint16_t rnmax; uint8_t rnsize; uint8_t reserved[13]; - uint8_t loadparm[8]; + uint8_t loadparm[LOADPARM_LEN]; } __attribute__((packed)) ReadInfo; typedef struct SCCB { From 4248981d5190eaf2b0ab74d8c287b6070ffc300a Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 5 Jun 2018 12:41:49 +0200 Subject: [PATCH 07/12] roms: Update SLOF submodule to current status We need the latest version of SLOF's libnet for adding pxelinux.cfg support in the s390-ccw bios, too. Signed-off-by: Thomas Huth --- roms/SLOF | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/roms/SLOF b/roms/SLOF index fa981320a1..2317427ce7 160000 --- a/roms/SLOF +++ b/roms/SLOF @@ -1 +1 @@ -Subproject commit fa981320a1e0968d6fc1b8de319723ff8212b337 +Subproject commit 2317427ce76006723f7ae103a6998ab41dd79c68 From 134f0b3d7ca5fbbd17f21fea87066967ce1d6de5 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Fri, 18 May 2018 11:31:27 +0200 Subject: [PATCH 08/12] pc-bios/s390-ccw/net: Update code for the latest changes in SLOF The ip_version information now has to be stored in the filename_ip_t structure, and there is now a common function called tftp_get_error_info() which can be used to get the error string for a TFTP error code. We can also get rid of some superfluous "(char *)" casts now. Acked-by: Christian Borntraeger Tested-by: Viktor Mihajlovski Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/netboot.mak | 2 +- pc-bios/s390-ccw/netmain.c | 86 +++++++----------------------------- 2 files changed, 18 insertions(+), 70 deletions(-) diff --git a/pc-bios/s390-ccw/netboot.mak b/pc-bios/s390-ccw/netboot.mak index 4f64128c6c..a73be367e6 100644 --- a/pc-bios/s390-ccw/netboot.mak +++ b/pc-bios/s390-ccw/netboot.mak @@ -34,7 +34,7 @@ STDLIB_OBJS = atoi.o atol.o strtoul.o strtol.o rand.o malloc.o free.o %.o : $(SLOF_DIR)/lib/libc/stdlib/%.c $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,"CC","$(TARGET_DIR)$@") -STDIO_OBJS = sprintf.o vfprintf.o vsnprintf.o vsprintf.o fprintf.o \ +STDIO_OBJS = sprintf.o snprintf.o vfprintf.o vsnprintf.o vsprintf.o fprintf.o \ printf.o putc.o puts.o putchar.o stdchnls.o fileno.o %.o : $(SLOF_DIR)/lib/libc/stdio/%.c $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,"CC","$(TARGET_DIR)$@") diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c index 600024155b..d007fb7a86 100644 --- a/pc-bios/s390-ccw/netmain.c +++ b/pc-bios/s390-ccw/netmain.c @@ -47,7 +47,6 @@ IplParameterBlock iplb __attribute__((aligned(PAGE_SIZE))); static char cfgbuf[2048]; static SubChannelId net_schid = { .one = 1 }; -static int ip_version = 4; static uint64_t dest_timer; static uint64_t get_timer_ms(void) @@ -100,10 +99,10 @@ static int dhcp(struct filename_ip *fn_ip, int retries) printf("\nGiving up after %d DHCP requests\n", retries); return -1; } - ip_version = 4; + fn_ip->ip_version = 4; rc = dhcpv4(NULL, fn_ip); if (rc == -1) { - ip_version = 6; + fn_ip->ip_version = 6; set_ipv6_address(fn_ip->fd, 0); rc = dhcpv6(NULL, fn_ip); if (rc == 0) { @@ -137,8 +136,7 @@ static int tftp_load(filename_ip_t *fnip, void *buffer, int len) tftp_err_t tftp_err; int rc; - rc = tftp(fnip, buffer, len, DEFAULT_TFTP_RETRIES, &tftp_err, 1, 1428, - ip_version); + rc = tftp(fnip, buffer, len, DEFAULT_TFTP_RETRIES, &tftp_err); if (rc < 0) { /* Make sure that error messages are put into a new line */ @@ -149,61 +147,11 @@ static int tftp_load(filename_ip_t *fnip, void *buffer, int len) printf(" TFTP: Received %s (%d KBytes)\n", fnip->filename, rc / 1024); } else if (rc > 0) { printf(" TFTP: Received %s (%d Bytes)\n", fnip->filename, rc); - } else if (rc == -1) { - puts("unknown TFTP error"); - } else if (rc == -2) { - printf("TFTP buffer of %d bytes is too small for %s\n", - len, fnip->filename); - } else if (rc == -3) { - printf("file not found: %s\n", fnip->filename); - } else if (rc == -4) { - puts("TFTP access violation"); - } else if (rc == -5) { - puts("illegal TFTP operation"); - } else if (rc == -6) { - puts("unknown TFTP transfer ID"); - } else if (rc == -7) { - puts("no such TFTP user"); - } else if (rc == -8) { - puts("TFTP blocksize negotiation failed"); - } else if (rc == -9) { - puts("file exceeds maximum TFTP transfer size"); - } else if (rc <= -10 && rc >= -15) { - const char *icmp_err_str; - switch (rc) { - case -ICMP_NET_UNREACHABLE - 10: - icmp_err_str = "net unreachable"; - break; - case -ICMP_HOST_UNREACHABLE - 10: - icmp_err_str = "host unreachable"; - break; - case -ICMP_PROTOCOL_UNREACHABLE - 10: - icmp_err_str = "protocol unreachable"; - break; - case -ICMP_PORT_UNREACHABLE - 10: - icmp_err_str = "port unreachable"; - break; - case -ICMP_FRAGMENTATION_NEEDED - 10: - icmp_err_str = "fragmentation needed and DF set"; - break; - case -ICMP_SOURCE_ROUTE_FAILED - 10: - icmp_err_str = "source route failed"; - break; - default: - icmp_err_str = " UNKNOWN"; - break; - } - printf("ICMP ERROR \"%s\"\n", icmp_err_str); - } else if (rc == -40) { - printf("TFTP error occurred after %d bad packets received", - tftp_err.bad_tftp_packets); - } else if (rc == -41) { - printf("TFTP error occurred after missing %d responses", - tftp_err.no_packets); - } else if (rc == -42) { - printf("TFTP error missing block %d, expected block was %d", - tftp_err.blocks_missed, - tftp_err.blocks_received); + } else { + const char *errstr = NULL; + int ecode; + tftp_get_error_info(fnip, &tftp_err, rc, &errstr, &ecode); + printf("TFTP error: %s\n", errstr ? errstr : "unknown error"); } return rc; @@ -231,7 +179,7 @@ static int net_init(filename_ip_t *fn_ip) rc = dhcp(fn_ip, DEFAULT_BOOT_RETRIES); if (rc >= 0) { - if (ip_version == 4) { + if (fn_ip->ip_version == 4) { set_ipv4_address(fn_ip->own_ip); } } else { @@ -239,11 +187,11 @@ static int net_init(filename_ip_t *fn_ip) return -101; } - if (ip_version == 4) { + if (fn_ip->ip_version == 4) { printf(" Using IPv4 address: %d.%d.%d.%d\n", (fn_ip->own_ip >> 24) & 0xFF, (fn_ip->own_ip >> 16) & 0xFF, (fn_ip->own_ip >> 8) & 0xFF, fn_ip->own_ip & 0xFF); - } else if (ip_version == 6) { + } else if (fn_ip->ip_version == 6) { char ip6_str[40]; ipv6_to_str(fn_ip->own_ip6.addr, ip6_str); printf(" Using IPv6 address: %s\n", ip6_str); @@ -261,17 +209,17 @@ static int net_init(filename_ip_t *fn_ip) } printf(" Using TFTP server: "); - if (ip_version == 4) { + if (fn_ip->ip_version == 4) { printf("%d.%d.%d.%d\n", (fn_ip->server_ip >> 24) & 0xFF, (fn_ip->server_ip >> 16) & 0xFF, (fn_ip->server_ip >> 8) & 0xFF, fn_ip->server_ip & 0xFF); - } else if (ip_version == 6) { + } else if (fn_ip->ip_version == 6) { char ip6_str[40]; ipv6_to_str(fn_ip->server_ip6.addr, ip6_str); printf("%s\n", ip6_str); } - if (strlen((char *)fn_ip->filename) > 0) { + if (strlen(fn_ip->filename) > 0) { printf(" Bootfile name: '%s'\n", fn_ip->filename); } @@ -280,7 +228,7 @@ static int net_init(filename_ip_t *fn_ip) static void net_release(filename_ip_t *fn_ip) { - if (ip_version == 4) { + if (fn_ip->ip_version == 4) { dhcp_send_release(fn_ip->fd); } } @@ -322,7 +270,7 @@ static int handle_ins_cfg(filename_ip_t *fn_ip, char *cfg, int cfgsize) return -1; } *ptr = 0; - strncpy((char *)fn_ip->filename, insbuf, sizeof(fn_ip->filename)); + strncpy(fn_ip->filename, insbuf, sizeof(fn_ip->filename)); destaddr = (char *)atol(ptr + 1); rc = tftp_load(fn_ip, destaddr, (long)_start - (long)destaddr); if (rc <= 0) { @@ -455,7 +403,7 @@ void main(void) panic("Network initialization failed. Halting.\n"); } - fnlen = strlen((char *)fn_ip.filename); + fnlen = strlen(fn_ip.filename); if (fnlen > 0 && fn_ip.filename[fnlen - 1] != '/') { rc = net_try_direct_tftp_load(&fn_ip); } From ec623990b34ab0e271141356af96d67a0c4e980d Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 22 May 2018 11:37:29 +0200 Subject: [PATCH 09/12] pc-bios/s390-ccw/net: Add support for pxelinux-style config files Since it is quite cumbersome to manually create a combined kernel with initrd image for network booting, we now support loading via pxelinux configuration files, too. In these files, the kernel, initrd and command line parameters can be specified seperately, and the firmware then takes care of glueing everything together in memory after the files have been downloaded. See this URL for details about the config file layout: https://www.syslinux.org/wiki/index.php?title=PXELINUX The user can either specify a config file directly as bootfile via DHCP (but in this case, the file has to start either with "default" or a "#" comment so we can distinguish it from binary kernels), or a folder (i.e. the bootfile name must end with "/") where the firmware should look for the typical pxelinux.cfg file names, e.g. based on MAC or IP address. We also support the pxelinux.cfg DHCP options 209 and 210 from RFC 5071. Acked-by: Christian Borntraeger Tested-by: Viktor Mihajlovski Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/netboot.mak | 7 +-- pc-bios/s390-ccw/netmain.c | 86 +++++++++++++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 4 deletions(-) diff --git a/pc-bios/s390-ccw/netboot.mak b/pc-bios/s390-ccw/netboot.mak index a73be367e6..8af0cfd2da 100644 --- a/pc-bios/s390-ccw/netboot.mak +++ b/pc-bios/s390-ccw/netboot.mak @@ -25,8 +25,9 @@ CTYPE_OBJS = isdigit.o isxdigit.o toupper.o %.o : $(SLOF_DIR)/lib/libc/ctype/%.c $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,"CC","$(TARGET_DIR)$@") -STRING_OBJS = strcat.o strchr.o strcmp.o strcpy.o strlen.o strncmp.o strncpy.o \ - strstr.o memset.o memcpy.o memmove.o memcmp.o +STRING_OBJS = strcat.o strchr.o strrchr.o strcpy.o strlen.o strncpy.o \ + strcmp.o strncmp.o strcasecmp.o strncasecmp.o strstr.o \ + memset.o memcpy.o memmove.o memcmp.o %.o : $(SLOF_DIR)/lib/libc/string/%.c $(call quiet-command,$(CC) $(LIBC_CFLAGS) -c -o $@ $<,"CC","$(TARGET_DIR)$@") @@ -50,7 +51,7 @@ libc.a: $(LIBCOBJS) # libnet files: LIBNETOBJS := args.o dhcp.o dns.o icmpv6.o ipv6.o tcp.o udp.o bootp.o \ - dhcpv6.o ethernet.o ipv4.o ndp.o tftp.o + dhcpv6.o ethernet.o ipv4.o ndp.o tftp.o pxelinux.o LIBNETCFLAGS := $(QEMU_CFLAGS) -DDHCPARCH=0x1F $(LIBC_INC) $(LIBNET_INC) %.o : $(SLOF_DIR)/lib/libnet/%.c diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c index d007fb7a86..c059546480 100644 --- a/pc-bios/s390-ccw/netmain.c +++ b/pc-bios/s390-ccw/netmain.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "s390-ccw.h" #include "virtio.h" @@ -41,12 +42,14 @@ extern char _start[]; #define KERNEL_ADDR ((void *)0L) #define KERNEL_MAX_SIZE ((long)_start) +#define ARCH_COMMAND_LINE_SIZE 896 /* Taken from Linux kernel */ char stack[PAGE_SIZE * 8] __attribute__((aligned(PAGE_SIZE))); IplParameterBlock iplb __attribute__((aligned(PAGE_SIZE))); static char cfgbuf[2048]; static SubChannelId net_schid = { .one = 1 }; +static uint8_t mac[6]; static uint64_t dest_timer; static uint64_t get_timer_ms(void) @@ -159,7 +162,6 @@ static int tftp_load(filename_ip_t *fnip, void *buffer, int len) static int net_init(filename_ip_t *fn_ip) { - uint8_t mac[6]; int rc; memset(fn_ip, 0, sizeof(filename_ip_t)); @@ -233,6 +235,66 @@ static void net_release(filename_ip_t *fn_ip) } } +/** + * Load a kernel with initrd (i.e. with the information that we've got from + * a pxelinux.cfg config file) + */ +static int load_kernel_with_initrd(filename_ip_t *fn_ip, + struct pl_cfg_entry *entry) +{ + int rc; + + printf("Loading pxelinux.cfg entry '%s'\n", entry->label); + + if (!entry->kernel) { + printf("Kernel entry is missing!\n"); + return -1; + } + + strncpy(fn_ip->filename, entry->kernel, sizeof(fn_ip->filename)); + rc = tftp_load(fn_ip, KERNEL_ADDR, KERNEL_MAX_SIZE); + if (rc < 0) { + return rc; + } + + if (entry->initrd) { + uint64_t iaddr = (rc + 0xfff) & ~0xfffUL; + + strncpy(fn_ip->filename, entry->initrd, sizeof(fn_ip->filename)); + rc = tftp_load(fn_ip, (void *)iaddr, KERNEL_MAX_SIZE - iaddr); + if (rc < 0) { + return rc; + } + /* Patch location and size: */ + *(uint64_t *)0x10408 = iaddr; + *(uint64_t *)0x10410 = rc; + rc += iaddr; + } + + if (entry->append) { + strncpy((char *)0x10480, entry->append, ARCH_COMMAND_LINE_SIZE); + } + + return rc; +} + +#define MAX_PXELINUX_ENTRIES 16 + +static int net_try_pxelinux_cfg(filename_ip_t *fn_ip) +{ + struct pl_cfg_entry entries[MAX_PXELINUX_ENTRIES]; + int num_ent, def_ent = 0; + + num_ent = pxelinux_load_parse_cfg(fn_ip, mac, NULL, DEFAULT_TFTP_RETRIES, + cfgbuf, sizeof(cfgbuf), + entries, MAX_PXELINUX_ENTRIES, &def_ent); + if (num_ent > 0) { + return load_kernel_with_initrd(fn_ip, &entries[def_ent]); + } + + return -1; +} + /** * Load via information from a .INS file (which can be found on CD-ROMs * for example) @@ -302,6 +364,25 @@ static int net_try_direct_tftp_load(filename_ip_t *fn_ip) if (!strncmp("* ", cfgbuf, 2)) { return handle_ins_cfg(fn_ip, cfgbuf, rc); } + /* + * pxelinux.cfg support via bootfile name is just here for developers' + * convenience (it eases testing with the built-in DHCP server of QEMU + * that does not support RFC 5071). The official way to configure a + * pxelinux.cfg file name is to use DHCP options 209 and 210 instead. + * So only use the pxelinux.cfg parser here for files that start with + * a magic comment string. + */ + if (!strncasecmp("# pxelinux", cfgbuf, 10)) { + struct pl_cfg_entry entries[MAX_PXELINUX_ENTRIES]; + int num_ent, def_ent = 0; + + num_ent = pxelinux_parse_cfg(cfgbuf, sizeof(cfgbuf), entries, + MAX_PXELINUX_ENTRIES, &def_ent); + if (num_ent <= 0) { + return -1; + } + return load_kernel_with_initrd(fn_ip, &entries[def_ent]); + } } /* Move kernel to right location */ @@ -407,6 +488,9 @@ void main(void) if (fnlen > 0 && fn_ip.filename[fnlen - 1] != '/') { rc = net_try_direct_tftp_load(&fn_ip); } + if (rc <= 0) { + rc = net_try_pxelinux_cfg(&fn_ip); + } net_release(&fn_ip); From 0d8261b506933c245b79ca6a57422dc81d8989c1 Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Tue, 22 May 2018 11:53:51 +0200 Subject: [PATCH 10/12] pc-bios/s390-ccw/net: Try to load pxelinux.cfg file accoring to the UUID With the STSI instruction, we can get the UUID of the current VM instance, so we can support loading pxelinux config files via UUID in the file name, too. Acked-by: Christian Borntraeger Tested-by: Viktor Mihajlovski Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/netmain.c | 56 +++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c index c059546480..0392131c27 100644 --- a/pc-bios/s390-ccw/netmain.c +++ b/pc-bios/s390-ccw/netmain.c @@ -44,6 +44,9 @@ extern char _start[]; #define KERNEL_MAX_SIZE ((long)_start) #define ARCH_COMMAND_LINE_SIZE 896 /* Taken from Linux kernel */ +/* STSI 3.2.2 offset of first vmdb + offset of uuid inside vmdb */ +#define STSI322_VMDB_UUID_OFFSET ((8 + 12) * 4) + char stack[PAGE_SIZE * 8] __attribute__((aligned(PAGE_SIZE))); IplParameterBlock iplb __attribute__((aligned(PAGE_SIZE))); static char cfgbuf[2048]; @@ -235,6 +238,56 @@ static void net_release(filename_ip_t *fn_ip) } } +/** + * Retrieve the Universally Unique Identifier of the VM. + * @return UUID string, or NULL in case of errors + */ +static const char *get_uuid(void) +{ + register int r0 asm("0"); + register int r1 asm("1"); + uint8_t *mem, *buf, uuid[16]; + int i, cc, chk = 0; + static char uuid_str[37]; + + mem = malloc(2 * PAGE_SIZE); + if (!mem) { + puts("Out of memory ... can not get UUID."); + return NULL; + } + buf = (uint8_t *)(((uint64_t)mem + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)); + memset(buf, 0, PAGE_SIZE); + + /* Get SYSIB 3.2.2 */ + r0 = (3 << 28) | 2; + r1 = 2; + asm volatile(" stsi 0(%[addr])\n" + " ipm %[cc]\n" + " srl %[cc],28\n" + : [cc] "=d" (cc) + : "d" (r0), "d" (r1), [addr] "a" (buf) + : "cc", "memory"); + if (cc) { + return NULL; + } + + for (i = 0; i < 16; i++) { + uuid[i] = buf[STSI322_VMDB_UUID_OFFSET + i]; + chk |= uuid[i]; + } + free(mem); + if (!chk) { + return NULL; + } + + sprintf(uuid_str, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-" + "%02x%02x%02x%02x%02x%02x", uuid[0], uuid[1], uuid[2], uuid[3], + uuid[4], uuid[5], uuid[6], uuid[7], uuid[8], uuid[9], uuid[10], + uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); + + return uuid_str; +} + /** * Load a kernel with initrd (i.e. with the information that we've got from * a pxelinux.cfg config file) @@ -285,7 +338,8 @@ static int net_try_pxelinux_cfg(filename_ip_t *fn_ip) struct pl_cfg_entry entries[MAX_PXELINUX_ENTRIES]; int num_ent, def_ent = 0; - num_ent = pxelinux_load_parse_cfg(fn_ip, mac, NULL, DEFAULT_TFTP_RETRIES, + num_ent = pxelinux_load_parse_cfg(fn_ip, mac, get_uuid(), + DEFAULT_TFTP_RETRIES, cfgbuf, sizeof(cfgbuf), entries, MAX_PXELINUX_ENTRIES, &def_ent); if (num_ent > 0) { From 63c93fac18546ef9468c7b522bad0ae43f9f58ba Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Thu, 14 Jun 2018 10:38:22 +0200 Subject: [PATCH 11/12] pc-bios/s390-ccw: Optimize the s390-netboot.img for size The -O2 optimization flag is passed via CFLAGS to the firmware Makefile, but in netbook.mak, we've got some rules that only use QEMU_CFLAGS for compiling the libc and libnet from SLOF, so these files get compiled without optimization so far. Use CFLAGS here, too, to create faster and smaller code. We can additionally save some more bytes in the firmware images by compi- ling the code with -fno-asynchronous-unwind-tables. This will omit some ELF sections (used for stack unwinding for example) from the image that we do not need in the firmware. Acked-by: Christian Borntraeger Signed-off-by: Thomas Huth --- pc-bios/s390-ccw/Makefile | 1 + pc-bios/s390-ccw/netboot.mak | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 439e3cc9c9..1eb316b02f 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -15,6 +15,7 @@ OBJECTS = start.o main.o bootmap.o jump2ipl.o sclp.o menu.o \ QEMU_CFLAGS := $(filter -W%, $(QEMU_CFLAGS)) QEMU_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -msoft-float QEMU_CFLAGS += -march=z900 -fPIE -fno-strict-aliasing +QEMU_CFLAGS += -fno-asynchronous-unwind-tables QEMU_CFLAGS += $(call cc-option, $(QEMU_CFLAGS), -fno-stack-protector) LDFLAGS += -Wl,-pie -nostdlib diff --git a/pc-bios/s390-ccw/netboot.mak b/pc-bios/s390-ccw/netboot.mak index 8af0cfd2da..14e96b2aa6 100644 --- a/pc-bios/s390-ccw/netboot.mak +++ b/pc-bios/s390-ccw/netboot.mak @@ -19,7 +19,7 @@ s390-netboot.img: s390-netboot.elf # libc files: -LIBC_CFLAGS := $(QEMU_CFLAGS) $(LIBC_INC) $(LIBNET_INC) +LIBC_CFLAGS := $(QEMU_CFLAGS) $(CFLAGS) $(LIBC_INC) $(LIBNET_INC) CTYPE_OBJS = isdigit.o isxdigit.o toupper.o %.o : $(SLOF_DIR)/lib/libc/ctype/%.c @@ -52,7 +52,7 @@ libc.a: $(LIBCOBJS) LIBNETOBJS := args.o dhcp.o dns.o icmpv6.o ipv6.o tcp.o udp.o bootp.o \ dhcpv6.o ethernet.o ipv4.o ndp.o tftp.o pxelinux.o -LIBNETCFLAGS := $(QEMU_CFLAGS) -DDHCPARCH=0x1F $(LIBC_INC) $(LIBNET_INC) +LIBNETCFLAGS := $(QEMU_CFLAGS) $(CFLAGS) -DDHCPARCH=0x1F $(LIBC_INC) $(LIBNET_INC) %.o : $(SLOF_DIR)/lib/libnet/%.c $(call quiet-command,$(CC) $(LIBNETCFLAGS) -c -o $@ $<,"CC","$(TARGET_DIR)$@") From 4046826d46618ef7eb11df41fe8878669ce6991c Mon Sep 17 00:00:00 2001 From: Thomas Huth Date: Mon, 18 Jun 2018 15:24:44 +0200 Subject: [PATCH 12/12] pc-bios/s390-ccw: Update the s390-netboot.img binary This binary now contains the support for pxelinux.cfg-style network booting. Signed-off-by: Thomas Huth --- pc-bios/s390-netboot.img | Bin 87872 -> 54944 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/s390-netboot.img b/pc-bios/s390-netboot.img index ef561efd2e222e03138705e9cf30d9e125a7970e..2c6886efb8320ff711589119ffbf077e68ec8784 100644 GIT binary patch literal 54944 zcmeFadwi7Dwg0~-8Ipj2lMrAM5GEmVzYO6HR%Ze#Xw^ZX25oEfSTEJ1sm5wst5MSy z?JY#H+Mc!%!9lz<;HBWDf8 z_aZ+1EZvdj{~h!U?eUXyPglbCLOx+XyuDDsrF8_4y(F^^Q+%sQKedO=CcKt7IKJZCbZc(}$^LWq?t5-nE|57jHBjR#T zql@~MqswA}b*|u`r>pVP^Uv_vO@CfWT5*v6e|8_73b z&p&J0g=f#6IrY+ur%tzA!6@fbc1sp>ZN#XTbG{vi7!X?NndHHK3`8D{SbXGZhn4G zkRIbXt55l-f^@Za)c*9=Ai1E0mrx%#0iU{yl- z;i9w8IKR=IdEtd;Ty*i-U%2#)3olf;i!W>P%bnjiTSc3`;LdNn@T{N>;rH7d9)ACt zpSN~M&-F7%_vt};4vz!qLHdpWXfEC8LHf=E(gS*so;@IaZJXgidX8QJ9G@P=&0Qr2 zl)tvwzLFk2ApIKuTXFNY1IxF#PUVn3-Y*f1XG>n5g5-Zc{!M{@Q{dke_%{XqO@V(? z;NKMZHwFGpfqzp#6zIM<8+SFG_ywQ&@ATfi&7FV78GNxb=G>{Jdhd6Y{ttMsGw$5E zJJS`;r6;(ejN@zgx`M)z^k^4Kx43!fTb%1`ckaAm%(hJ>C_r8|J-VKH>V9 zD;-vrB5h09O-j%6Ji#0^sH{5O-I(1n(@b`4Cga)s$Py*JhN@~f@wgx){%XM3M- z?+LvR?#x8g{_29rz;sjLYnfQ&KV9qMc;upGv95ug39z_e-E8OTBMGOrg@xKrxb&8S z<}KxJM)KjT;UZ`Qp9YT>?}>CpXne9X>oSpDC9WntRJdP%5Wr4~O#`=MjMt@i~arZO%m6!>%Kay>CHI(UR@9Uwr`gN;d zo$@_enW(pM^EUO{-JFT323SXcX5|Iv`iP4TDEl&wrJa%a{@C^^c7(=DNAc^2{9XQkF!shU3duLb#D`qt2S$y<%? z6IANxUu`J>WWgdLC>ym3d%RyU0zO7pGOmxiucs$^ z9uUfsRlCkxJuT+I?$XYPbLT8e#&(U*H1HZu&m(=w4wqci;3&ID&<2Lfs)2QFbPY5* zEj`s0rynmkcX_Oo;_vz+sh!O$@$kZ1ikW+Qn`p>tBPU2toOYKM+FlG?|oSGY*BVONbHEcl7_X$V|h zW0KemfMS4Qar6{SI#~sG_v_aoW(LcQ;;?j2>>LoX{ zx^-zA#fgUf)Oyzyrf$KeueZBR)h@C!;zpL0YFxpklFuYK(rxLFEX{+f6Ooi_t*eW; zVQbSP&>eHUJ(Mx}AO9Mdw1mEqiR`{EFEz26mcG-{zia7POaGqUcYoh<_b7Ll<9`B)L%Mfg z!~cfe*Sc2G{pfS0AD4HCBFA5k1_~Yh`6ROGYbcHcECHaYl8Z)YohwFYm)WBElXSdW2irpatSM!v~qP;ZedXFCswYOa#7k|ke(2V zC#$o*gkG)`!=}wjjZXJ`_^+VU;(V#IbEWE^u~GvmwVSlXl5fe0Qje+HUfAV!Us;b1 zKmyC*jmO;~g1vmS@(ZTxfB$i^g){HrFg&U=p-2Xmn#Q}u*%uj-3^0P1w{X)s=W}ki&NI!;8EwZ;zT$a;Q{X5VZBgI|4g`{1c zOt*(<@%H-mT_d5z2cpd>bB#6^@O@T#J@Y`1Hy>Dae2m*pdDZf#k^g6-WwCufh3~K1 z_o#h8KIp~Q4CZ!AOH$?;eP8+=eGi?W_mlr>@5kEv33?y!n_~Vtv#xAmhf>de8fupv zJ#5P%^r*nifQ}XE1)kTvkf`lIQWk+*8L9nW_98Cgl95uEKGxf-x~_OpoKfuAd&A4* zL|i8-+)dcDDdM_amZ{|Cf^3n!O|zWROeBP~+WXjT#i5R%Ms$CTn?B6dDDD-WM6N^4 z0L}ds9`v1b%g=OW&-3lA)RJ_)8>u!fNYp2~Tp|^5sTdYby$h$}kqF-hY>K%gIyJU3 z=0;l0aA%L_dF!D|3eKIJo*O_Iort5K=ejV@0X$uOEaiYQkoSb30jUZ|@s)9E2*x*s zb#Za`PqT{yeEO&NdJQ)Bh22feS_9KH?u();G`$$zWKxiMAdZbAJ5Y4}Vg{Or(_67R zT3oVjV{CBxbaeU_7ur(dHl~Z+;miz!D@UXsaz%+q%ppq!iH=xFTV-qj?}yY!x=O&T zERWfr!E7EdC!nJuE(~@%UAVXhxhMeQZJG8i%mDBjN|_M>E^58W`(=8u8&sE!4JM~@ zAy~q(Thuz=SNj-{vNb)y^A3W&8T*BD)}OCY<{r^Se7oAgGc7ZNG^i=nXmjAS0O}0)_R(HU^q~LYp#L2!JKV_h zLtbwuH0b^L@{TTtz8h|oW~@*8v_YDKE-A?*A${w@MJZR8Yfy*(;!% zdiXi;bT6NgZO^tR-ie;Xn!z4mcBb03TMAuica=NJ4N!ZT z?5->5e{Xuc>8w5exCnQkM}13N`m7%6zkEn`eRe(EdVh3)Jc3O#JJggo@u1UqS9hAK%iY9jJlZ${dBOxdzX=O9Owxm85 zLnFi4--*_O;~40KjCcQR7xJ2;&wjmd;_F~r2*pp%#A3|inRsfhE6*Uscw9C8TqedF z_D>gm_jN*dHN79`>!I$u#E0pnAxF#6Oh+v0!kKo6KP(gJC~&LN{Tan?L91c-ei7Ei z1}%26qC}`8oQcGcIBJBk6CZYAHz>1!!K%r`mEz}i&ro`5VWcE_bl>!K$M$-DUSeTn zAhZpW3p9G0>|UfgiSqbhUq`7VUk8mwCBN*7A$xfD5Ra)&?x@LwE> z6(|RZDX{)AzCPbDruCcpW!uf33N!XGjlId^A9H&4#CiEr5oi|n%R;k(%oogL0Kj7gtI&2OR;uizPWckx-p zr>?t2{m3+T;47|ZL{b;IacZgT9OzoRy|~M@$LP;+quxP~fhXIcj<$fYrOLISiN>e} zgS6Ir9bCtyzv@CztBA3TwU@XOgxwzPP=ax zJpA^OOgzC@)u$2z)4wzO?f&HJ3CVB++)Qg|do;W|6g(d_ofekns!uU%Er$1Bb&+Aq z$eT#}%lRZtk2S3dbsUNY$JRg^PpFTz<4Jnnhn=O>zV5mq=0<}_*2i12*}XMe@9Xsw zszmWKz9<}0v5v{oWM_O0s}j8#@ipN%&%EF>E<#JcsW`+L7o=B&O!hzgg}gO4V0)-z zdRK|nJsSEC%8k6=KCSH$rF{LUx%knlt^v`qbdC3S%{a);TsO%659}@j0pzI5x#qkM z#FF-YZ~UK+>wNk*U_7@ioV^!%Y(f`Jw%*?iJ}seFeO}(UC>7}#pT6Er2J;z7rXtOM zlpn8o-)QuC^anZ{Z@z$ff8>cggnrAD_)lnr^!umR%Wmtp3kycvyxi)~bJfYj#<;;a zLNo{+M*3airetgOK8<5tWA^9h*876;WjvSAZa=G2ZFSB-bKmDiEsNatUnxFYM!V7! zDM5|W18VfQ8mFc2Vvd7H(^r9UllPmgqv_S-p&_EU=DaU|1FHh5MW;7pf0k^_Zib(( zManiy<777`BH1UR(-lXe=aRoz_Hnl=S&5Z~t%Vl;^PER7r&@4^PR8%86BocA7JGH}!M6AHl z!)O+?BVLC}S-MK55|I)Iwt#grjCn@59l(4=dn;SB1-Q2y6ECAsgGpW zW?JEz5?|Y9*FvepiU`zM>sl7avv-I>iFo#LK0lL%kf0xYHfCDo!$SAY0DdjcV}Ktv z_$L6r#XD1+aQsh|ve&Gi<6pD)(~LtJ#3A7waH*nB1-{KO)$MVcCIF}YDo5WM(r3XxA(Q$9=@FxQ73mWKJ1qtDNAR@Vh5t%dM5F`8V5z(GBx;%E8g>a7 z4hYkE7O2$=ckr!%Z$+EVaB*y(d<=+4N2G??^W!YFyp6Wk^p)Aq(yg?($$In_P-Ce` z)qjz)&9uJp*@vrF#h(8uV{vpc{(PLgN$9Gg^eY-~=RWmrdP2WFdP_WtwYrIN(l-nE zOiVB7w}LU*EKw)C+7QFH!~vw)8kuNT=a;4Q5GHQx0y-Fdb8Q=TNb^T0`x^# zHt6KU+6Z>4$}WbJeG3zgR*x1erWet1N~4`>c}KwveYJ1Ph)PTT2p(V42p{`$(3+MV7aV@ z)5kKu(A(8soV5=(u&p32E4I))oC&U<)?_FbS`ghb+*u@MNqXBM)F9@8&GSsE%ax>{ zqc*E>(K7J{k-J62Ah$WMYH4@B&CSnQF7tZgu^SJ{^(Nl z0lZ|M=s546>!$iT(`(NFR~*sBf95(xXNtj#7#+B*Qn_54e81lMowr+-tVnN$4}6Y0 zi#}eeS^M;>(knf0-Muap9kC8RsgE&Ei`R|A!Kq5=y=>FW2Kir!l?nXm6QN9t8=OAT zRx$>x3N`ct(=y@_Ayx)<*tp1(Y7R#C;%t{jM)>XRXA<+aQ7TO|ACJWQbJ^us(j}Ql zLy=omF`SgwfDvMh{~+v)Y+Z%CMDy~xVW`Dj_q6^rkJ0cd8{DSoILY;aJcRb>@octO ze1=LLjTW$&#M?%ve7xvb@rm!nnw;eQyhF`Dy&rGvwoW8^-V(4r&b;Y?NS*9PFr!WI z!DrbcuIL+wI(EC&nkwj4Hf+A$C$_O4`iKCk>8b#7dP3n&dDh+UWE=f?K(u@JV*UTu z>GbqN^{Tj-Hr%q-zjF{Vuwt1wu*PlOVqfPQsSz{}>nh~y#-iAed?TEFRShFIF z8@%2TYtYdfh+1p)=mA!xWfQ!>=eXqbR+s*YYfoNoD^Se3&dvLfoH?0T2dl0sW16^< z+7px2aFR;AZ5n8pAZ8LOm#k`a$#@64p4`{{ma(46sVu9DG|S@W{WNHm;*&}I3y$i( zx+kx-KO*PCa4jF{DS0KUx1NMfgeQp+(5vWl*2z6l1no0~x%m;zEJKsX`zZQam8ot} zsoL~3O0~Fq($n?y-Z5HLQC9P1wO^{TjCwWRU(zd)h5~mh<;T$CSE1q+nMkAHgqFd* zq?h5H5wXN~S6srZ8>3D$TB=L@lD+{fu1_!W-WYyMB#61n>s*N+d|=6~XLP7P3o7iNsmmN~s)s#pnDuU{q6Xld%+&O$Bb#7hP^UcT=ife|pG)cI8}!K^ z*|Et)q<~%?PH*Sf$T3dJtB--(L|0JB48U6y{)*Bw(X2F6+73l3uYp6qi?yq$@E6P) z2)k2(GnS9pc)gp*dGmmAt&sjEUvX1eJgl-pabn}?C1G3Lm@CabN&2sT7BHDp(O2)v zt|}M`7GXT4wac4{NIdQoy$vmBN}pdaEd7CYNI)#?61$r&-gLuxQm0diG znEjq<3$+&YZLxkshqah$Z!1yjnbQ3&L*ZXiZyWXB;VG_pjOX*fNehNB7Mtb!?)C`e7BQwMDbC?ubtKbR0N(-jN?WdV_-z(>Sxk#%kez zVhw2YY9pd)72{E8IPV`1MZ)Iha1lp<&s}iSZ9$riHfiJ7uLERp%IsG%5xqkbS66i- zK8L>T=Yrm|{}1rS_JP;Y7hc;(;T@rteEGAvHlV)d(f#W;N53Hr^OdLZ5OS>F%O${p|Llh}QWBD<|f!#wQL^65<9UA0+W#Ew7j%T$Tt`9M=#E0_gxfrHe|{G1 z+v~QOrH9hj2>mX_?hMVJ59fTZZ6W3FEF6}c=-Uu8F0y$A>!2glofK`8F?u$?)nSp% zbptgPvo`y7Lvkay_jnJr)d@zyei)zrKft*802nvz_a_#;VKm&kcQIVM3EOtDbmhF$ z@RZyA_yHK4t1+C1eu|9bb68tZMDefC+@py5YK0;uJj&YmUW38jp3qF7F2cuID0rp+FiiSeZV9=I z@x*b`C{vng=#no$sfw=whxiSBiGwA6mvcj_u(!s`)9KkMT_kBh9`gRM%FNL^hk3|J8@4J6`jPJ=KD%uO~`c6FILIW6*c0YIoD+39eS50t;^z`4EHe&{*cg&#AC)Dfb**#$K0ckSilQe0~8cEne zeNd|*cu*SqPCUJ}!fkd>a;4ewL`Csae@P!(T*UNjkN03QPV7sRKU2BWZ=t4k>d1dH zj+wn3elt$$*Oso5t;_yV+L`mT^{&ag5ua-xwd#3($a9%5Pkkf_edHRF-CP#5ylg*{*lSb56FDeATmqu89@`(BjUwcV_)Yk_i;MJ#-a7YX$(-WhY4quXugEqoUm z)7cIkO0k(p+g=z8w<|T8Y>d4vsX2KAaK?d~jnItqWf{9v`aG|^@_glBQJll`cs{d@ z!x!1;v&z3)v(!E8zI)cS%JK@`u2GryDqfysMzNR{_fMV$l-q&q^kbjmIXtmRT|}0F zXfylQHcr1{o`R>*fAF?HyY*kB(cVGOzz}fo(c;>$DEZs@AHsmpL@+ zawwC~2*sDF-B}m6xkw_@Ay~{<7gBDL}>ETguD8B)V0f?{BKM*;jI-&HxWe({U=YX zUpLb5T}Nqv9 zv_`x1P%<3Wpzus6<>QL z($C7tJ2ZFuXVRfBQQ!8F&RS~n56-1m8aEWccRjuD`}7KU7^=bF<(X#VT%>r`%w%)( zW{7M&5|}|gj;-WX1=>$W0pQY{G$1Q zc;{Is{sw{~4|yJcub<5{ExocN#s;$B%fV#Egf@ta{WC8IJ-t_^mlSPQ%klNJ_akbV z6wi1MjG7IjWroo^l444HPTyvJk$tb5HCuKvIy1lEQ#0Us(@gF7t#PeKhGw4Z&-mF7 zpw4Hkw@+)$4*E!nCwjf?B2W~fpLwyLgMND{IZKw#jQh2d)R%XQ8rgb2>voN%hZ-BD zhb+!E&KKVu$qJ1L!=)l^(DjSnq>T+CRtM+^z(c7CgZ!G zQ(o;qMT03DDEj~yKkj@E8O8fk!TWgfihT-Ljo&BZiOIR~obrI^RofMe=Z%5AXm%en zx;yH&^sVrOzmA|W)9iLBpZoo28GFZ=2e2NaH}Jtj>P(lrxkjlve_o*M0%C{riMrON zk8-_m=OWT3@tLF5)XF5*&LZ_<+RwY$$M2eLhsFT;Dfj{|`K3lEOnU3bwDqRP`crdvb-$+^uB6PX+BT^=!b=)G`S39MDpEb;2g^3jQ12+m5 zu`T@t_Rn5VUWBM|2_Ho)?L5Tfy?7}7{5VniUSzSweIM-Nq>g8&k#EPm;wmb&dL5cO zvGRHJ`3d5qxi!gKW$8i#_I#Gj)QVX;8ge`fnTcU1keFw3Lhg^Ap!DpDyN3xenyR5WRtN$h-8guJmPXSNz!beYQXIhnjt^C>iFL5l+(V!l>+Rp#D4r?tvmHw2ivrM^FrK4rhN$lPk>zsD*46Q}`6-GyB1*Wp<(J>Y) zySRI!^G9Hg&qLO8t)H>NMDMTHIL)e7)S~Wq^sp!tQ<>Qo{hhSb%9mN$Gl-U#*v{lL zIvc1}Y~{r9!!oV`$>(i)da#?y$VJNJcMVE5G>GG;`}vmFr>xj8WH+Gfr z{dn}vB+)H-dCaGQ&tX>chmhRO^VndY`+{YMBq3Uk7+ao~Y&((Pj3;t<#Xm7S?C(HGX{FQiqCK zsRYzgnXt9Nj!5Q`8uYW#u-$x2?1wfVUDHl}$F`H}Cltfn{k z(*8Q|$MhEJgl1Lc+ddoGK9)YmyBl2H5yxYB818fK_N@-@M8kfCXnI7&eomd7%5!Q{ z?>$!LSZow&Kh2#HYlW3G^xzMG6!OREK)S2N1zDAubJ-`2jo=w9X*RQmCd(cQfpsXb zl1w+uva@lMmy$kpf1L4%!!$>355-)Utl>6jcku4SAWo?Lxa+3vaphGjVqN$&-anW% z*;mQ#!7ZF&Sx@xt;a0bGNUI_m5yof&>EZMS?Tu|^e`@mK7*h!2k=vOwft>}R+P`b0 z_Kg*-fVneREqzR!H1m(@GnTw&vMpO@v@){ZeQF8l0|Llekq4@m27BpuAL?U*x_2*7 zH&N&1?V*kW)=;zu6n?7}|A%JAMb`<>%OhdWw4xZR@I3G-Sy35SJ8^* zZT%lu++)$B9`D6qp3AR`&wt%)Hh&M-6j5{Do=kg$c^JBEV5AOV?5i^E?X+VlEw)~4 z`yY(LqU|(|slSd2M$C|bR0Vsy0!jKvdd^PLd^!Ke(76L#5@vnZK!f{z>zKE;WIP@f z&DEl)lWc5ce-+wv6a5-YpGO!?II|L(9>fXYmU-6^CnyQ(Se#(u@5MRp558Vv)wsy~ zZ>>6Y!+Z0Y5vQ&8vK>4vQa6ts3IQ!tCYniQwVsk9Ee37+Lz|_+w-)zl%KB8|TqZlM zg4o26&l-odxHm~zV-&7sq;CV>tLj64&0nYSsato{H?@~2G}|H){onNc5OR*URGW_{ z+PNL{|6s|(>|vG1=d9xXk4G=zeH*|X3dsJBJ%iS3y)7$H<)GB|GND> zAboZ&eZtGBj&qpZJ@1_x>_6w*{GILZdLrKmI=bIqXu>4l}$5PW_YzQInMKRVHGQslYDkYzOuitp8`J zg&YkgbOto2q109BE9_(w6c(*>RBoG*-N5IrWGs6(-s~gP<>Zgskc)my_&jwvXCZG7 z*mHc$`eOCr(|K$rGHY#>4EyC1kr?>(K1eJiroK*=95RyLBmQhdsxU7xI>=j`E2=>6 zl03aflRCDoUqeM(sG(Bj%C!12ps)PRwQ~@ZI}1^9 z$eYbak>_KR=lWbU_6lj!y5ZT|m6M-gfjRM1&d;%@%X_G95`Ibg-4pEc zK%Uv1@vti}+?%|$QSHJ!2TBcq`eA7USIBm?`Z&W~=m(ZLBc^jGVCU8Gpxe9h|A z;asbC1kWYO8LWbtZJ@n_)w@1=#!jV^@mBU4X#U?{HhjFluEP%Za9tu+)aJ#C*Nti* z7H*@wEx=T}D+0dhGWi`}7~qZMLT7Sw`v{#I_b;0#?c4_K)&e8Na}%WsIZLuW`Fd7% zGP`0a`$y*7LS*9}`Sw%+XBl=&2?CA8F@i{_1cGLYuPt{9qZtL8O-h05>8 zx{AWaU3Yo6+($;*RpE$+|*HMy)i z&Vw=MYB#m)eE+@gdKvipGtw;hTzfD22b^lD<4zPU_G9LscLDQy(l=2zA*xIq9@Mox zFi^!($HghLKr|8zqn_={>9^B*okZWX8@*~&CJ7C!jP~zL@wpue(pOQ?KmViocJ})= z>IIyiY;mkjV!iD#p43XO*Dl-s@El$fo&hiHI+qOkWO$8zbKOXSt-8l!1|VQ4%jRHNp^%^ z-{9ViWO6d6J8!?uUS<9C<59QgdvsRNqgDAHwSpz*9?(=*WI9^4w&tJ0yhlCZqy6AE z*O1Q+SoHg5S^xB~o|fIB4}JdXj6umCSnq1q9pM#N-rigu<^F!t)vRjx+!u!jYpled zgh#$qXcqgAl}BobnGUKNWjGZVl>fC)KWpFo>IPQPua+t4rX~ zDdzKR4*Z^nupNS(Pn5m{9+ICoUlBjSsJ?~NGG?^lc1ur__ZH`iJ$Xx33m*udIV5_E ze>F!!)dYI&YG1F>-Zkl8aEnQkw`9yWJgcEj%n{|}n*SrZF%_8#CFR}DlN*^=X zMwnd{&4&Ux;zJeu9AxTfhh{}||??6gyEoQU1Hu7>$xOf8kBDxL@bDR;P|S z&7{d=@=LuCox~_#LGSxv^!rGIYr>+eO!nOY^7lE%I({2 zw48b}0=gY$(diU@dp>#CPrcRiO@A#01Fb^2nO7!XCvF_*94 zz+(npG6(A$a`*>$w|I9PfURQ2KDNWtKW8Tb>-aecGmkL{N0Gjr^dFNxf_SLzebH?^ zRdu!P4y>Cja_;vX4M3Y?!8*L!b%cd8`S{gtC}&;@*ufyJtP`G7tXE~oOM&WCr%WHn ziu;tcFF5(W%ru%+vA-U^U1|ByWX4|@u`cu?7D|<@Im2OwVI6xDjDHdMpZRkSGh}x* zQ1TS)z!Ib+$;{4Kl3)+!a#F^mM-@L0j+~wY*CrR=9*VoJ!Msgkm32=tmMW>7N$+jN z^F4HiKR# z?!kCC7y8u4m6JU(qj7mWrCSGz6$MHu`d?Vw3k7OKwX&~^LXyBlBIXjQSb?lIe1Iae zFKs`8v{!oX`;ryxt$zPNBdsypslkP64`ZY|WPJ(SF~m*T74tJ{$YVd5vDNxERs^Y> z(khT9#M3FL2F5GC{l$#-%eF(ZJK%;;Z6!5i1-_B9&8puAH`W=lZ}J?#^DjILdF~9- z|E6|BKct?m_EPuld|jP`Eurjgo&`L6Si5ND`7Ym!c<$lz0q?_k>h^{x&t9Gj65I*| z-kOJHEfRJ2y!YPBB;I4@=)U;fPT#ueYmZ^$gr=K5JA82+UV^YXd?9ZZ7eD++-U|E? zI?!&fUB`SJn*Kv(T~u$TLpzv)c|0`z;vhBNr5VegmwoP?)Y*!s^jGE$WCsdPRgY54 zcKWt+xc>k35%s{RbLiI5t&%#~`C98|X2{)_0iRX-mV2@7NBZk;kgyu>O~sHjgCaw( z?6-sZmNt7lzu%&DbyFHWp@O( zq{)-LqU>RCsPuQG`@5&zC}`BVm^O78qEg}HN?UW8E2y;pWnomM^(}eYMbOqpdAIc2{j%l~nPC6b*~|&H z`!D`gXrtRsicB+}Y7(6LmcWmUxlsH(&Tr)7a?{WEr9AKuka8=t!rImz5ABE##o2{` z{IBpa$YgAul|?^;vo>S#j>Ax@+G-vl?LNKEa1j2>rMc11aC>|z7TiEZV@oWSZ+f=H zUCnoK>6rm{=KSW|Srwya-kT0mt*s)pl{iZrXZVg5pLx$JZ`vN=J#BX$k5bF~MLIfT z2GV|qmHA6j=c9vpsLBab?v&wlr}~{VcE?CM zinZ3WzfR}=I{ixik9F?I)nVt2BCem%j_GZU1o!^@=`npnADMrQ2G`2zHa-vVnW-61 z{fBdk(pL9G?Yt4w)gPalYX_xVN<*%?mhArAUpPtM)=};$T>eOxHo}* z<@HQl>lxglNL*AtitYhwLR*ycJd2pD?&qp0{Os1zoTF@UkDI=0DR`D0F&%hNw_v$o z4<=fh2PE5@?FK?%3?QxkfY|p;_AkHBUTej^6@g_(WEbcB#h0`--Ou4|$nY|DlMPs1 zn(EJvs=MnuQjzp8q&Gw6g>Jtyx}ZK5Va1&Icv<=MiXr6OCkk$FU(rE&OToG5@zC}k z`DgI!(ci;Il$WvFF00k|?cV_JF6L>K`8s7fxeZifS8TBeHLHkVsZMoJr)tF}t5cgEfG>ew zqiiGR)V{!TETsw^w^KM)66}2t{g)RKA~#Y|j>Npe+ZU}B#YwKhlGi%UToa6Sz;&M{;_rNyQh}cVTF05u-#?LB#K81`8T2+MBiW zKIH2PYR#nY8+a#v4WelG7~;Y3GXKNfV?JR#lc@xB46_;}-V3kb8(jPI zR0p*8=~jdsg;K5S_R+hr&G4e(P~p1oCF{{u>Rayi%KI2A`uu>&tT^#lX_EW!y{R=o z+;N|7H5gnu&h|x7He=(F`7GQ+Y>DsJG0xl)NZqm4N_y*2>-NBL{|qdXhFn~DS4@_K zV7{=6J)D6w_1d2L7hY5P1HU5%_O9Y()|2F^go*G|6%L2Mv`36?kbNJp1%D~zo%*^ZNti_S5)? zTR)b@J>H4*ADwKqMp(~>NwVr&r6-yPrdpd>WByP#%{iz;N%k7aJ1EB%d`+B~izA4S zM!w`jt8b=eb9SfyjkVD~H}_whXpYu*0IdQWA(8zdljj2S|(za<@*JpP~sO|HSg1T6w zUmZ8wFatQeW2kN|9LDIo1uM;dKxaZ@Pd3PicPw{spZ0|hwXs6LZ?Dav&+j`h|M}hd z{M%Lk`M>qa7yi2Kj5toTN>oa%R6{I68qtBi z_ROT`gLs7eCdJAwB`y&Gvv%vlcY^aAtLkHo5j&Y12|Sa5mVZ@{-;cZ|_f6rkxV3Qr zlq^p~8fDoWo1D?8I|?|X1qZW74BkE7R`^q9yB}*0_k_l@p+2Ui${Cq`u4eWX-p9kPQ*3#x0P+#^E$h#)$7$}eKolSi<=t@qV?-O zgCs{9b*jzZc|L)sR`~9<2+~p8Lygg{VL%(hTV)p(g&Re${eBj#h@qLAoKDMVjjf*k zK>t*V)E+lx-PD*nEf$a9fiOni1>~{+d}AaZm$|qD?njFJ^8l?bG&w^n;Z{XMN(IUC z2KA}K&U)1;?%D1d`?vN-^ZjFcVe7y~qB-7MD`Kq?o_~&(v%^%kt(N+pXR@lbJbk>! z?Gnya{+H3pDCBi%7p}@4htH@zQj>4DJ(NA(*?vt%Y9cYBxA9ubk$$`k_8X_+FIn(& zq$MZc;FmPm7X{pRM<#AQXRML4p{ylZRLZ>K~O8)MI3|!uV6p=kI%oH4GG{ z>|eV-d3jbk)OHJ0RvWZ=AvnEZSet8*T|PWHBWoOJ@~GV>C$opPU`q_!j@>6dw|yM< zrR%YqhYC_uG0KVJLY}kL3(@EO_e2F!-lw-!@YdmZ9vo^s*yNQHDZ4TmYm8UUf_g*Q zu@{_Fc=s~u^iz&X_<5DH{9Md~$9($szU%A9{r<sb^c`JYyo7`9HV-3;Hb{G2X`W3Nu@$i@Ydqzw;THIH77La<5dbDS@Z=JC_M{&_2 zjdjIlS-I{!zlE)bHVlSmPZCG`_A=>!-!|I38OK@}LrxuiC{ueI&+cAomT)q#gpXbk zru`Q8M5eXNF&Fq=K(f2sN-YXXC4*8MIl-)XNEYcO%tPn%Jcd(|@&d}u3(&i~fO0rV zG3+w@8@vE0=jEhHzN;^FQ1BH=llA2QiTh|7>svqdZDT>EHO6psPY{ki1vK~9H$nyM zV|;@F-M0pqwAFS=xSG-5bKXdkNTn#_0V;EA_RuqE;;b*2Cc5 z5ONt!&&BGGV{cg8uyqvWYjw&*V}jL(&CeXFRyL&CTgQ^C6@2C7Z>Na8tQ1amL3r0yi+ob;xpwT zf7)wgJQ6*pzTzAEw0__%BTs9GMWW(8^bagg6)o>MOPJ6`=$FA4J=80#-J}2laox}Hs+9KK8Se0Mj7Ruh)R+8n!LiPd1R{LO zNxh#`XL_WF;Y^3|6)X0dgn@z0y#M`kW~pA_Dfn)kglk;*QFT{CT4y#}Y+Z3m&_)o+p)4^`Yc(I+QM$;lmSGId|Ye~oULnA75B~oAC<^I?4%hMCg89RSRRmJIGrm?eiVa^f7G$zBE{4=?BD>BB9j|`S))M*Xc7ij%b8) zF`ZxDS|4xaMuS4}{U+l(ez_z%M7|uk|LxlkedQSVH;E$8?DOSUH~cv_^b*nMnb#G& zz%Gz=dIC>b)st9fb9OrrBTnrV)Ek&yQvAGRZnx|%n-vn+nTd`r-I~1^SZ>B!(l^hr z+fUpM9@w=0d+{zsZ=dM`=1jqO`$cPeHLy?4G^n)UcX#>%WY5~tX=Km)yH3SywX#?H zkgVJ-l!;L<>fZ)nYXpLSGw|VWthGk!-7aa*`#&^t_*GB^Pm@{A;&KM-l5PF6io`7O zsZ#z|YwhIyR0$mtP-Uz6x3|D`9kewk*_GX3r-{R?r6fervai!0&3rblWnbp)654Qw zA6fZj?vWjAWiBA~T5CC8d4;8%1^!2ix|NrZHxcgA-ex=RqrU9=qBKMz(q6({%utF` zmI=y@Xa6s;BU-KFn^tRdW4_)eDz*H^gK(Rc+|;i4sgK)u-n817t7B_-%c?@XIopHV7?}Yed(6UHHO!Z>nW=_&0*3;g;^R_hr!tH|(~ z{ZV|Zy{`gOBRM7d1N*Lbjkv3sUwI3^RaI@N=aMQcL%*I3K7v2T(oeVDLgC6bpTE23 zIk-VM7?-Pj#eUv+Z=d$l9>C{a@Z0a;^LlV}GxndzU&Agn*C7kB2?;-4v!g7&r@J%p zX4z-0yt8wODB>mh|2x~^_DYv;%PwZuX(HC@7IV*Dv@U(5X^C|_r8TO!IY{fHNAO*D zC7vz`dipMZBxUh&X@*OmMjV$XW3LD$8YE|>Tj_h!^#!^I#Xn6o(cT71TP3JtSm|7g zG^=!v){z4n-^ULx=Mem{O3!1>R1u9|7}PH*&ZS5VXM{qQa-r&`8rY?FAP$XSd?7xx zi&p8xS77~@xX@y}(8_}7ES&+X&>8jwCstVR37xMPgW?rKhw^Q+LFe8a@0%Lar)P3U z!Am{`h{ZUpxsm|pc+%qy1KcWXU9C{u&xkyjY;G99%|bulQsutQ>SlGiC-fTWc3M(g zacJ%w+!@JO%ueE1>eGSMv5Xlelw28eR(~zC7Th+*)+Zw~a`M+1XI1=tK~>!{-ILMe z{Z=Kb|Dlw~DA7Av-K^Dg(=0=#t5;9`F%g4;-0sDxw_*AnDqu`xAFk|T&B1WXK2Df0 zWAu1s_!>G9>1w{_-_4pSI@-o?S93o=pseD~?%nC|8L=d7CN{o_S+Wk2Maofyp}tf}xDA&1(33sLMUPs2@?R?=30XCjR`*X})f-^-C5^?CZ*09d zhS$-1({k1z(>1-Vi4<-1c)#{}SF%Hlr^obON#(+1ykQ_|#7EHnr;ExySNQxbtoO2S zS-9XA^;DLfMvOSc$6Dv?G{doq9vxCq1x_o7kvT=;dhJ~5lRw&e5?t5RTV$ob1Fr7{ zxQ+9Sx`X(4ariZj5pVVDIL?6n)BcwjbD$Uy|T}WSkqvgKa-R4X_#$$G z{sdHtn`AxF%PcV0KRHRHXT3ZK-HE4&xUHwF=3k5sXi4P8=7T3*NWe$J_KC+k8~FbQ zF)`QK&f9ak+ripHc(J31FB??UH+0}6qn7Zn-H0L~V zXDWqWP~#HzI69*hS6~03`cgqd`8xU(!{~yKj1bGRoO~zm+Wq z_xOXW55^t{Pa9tV5n9rtIIFJ2<{4X8quBxPn^+2SyngXWsTRd~|17mL((cx+lr`Py z!ds7m1Dd!i&~8)|BD;*d(w=Sg4Aa(+**;uBwEYS;XyQq80ChW|$1F?<#X%0R`v zZHMS+o#H4~+MuI28FdzYdPsTj;OSOU>*Lx-TeSN04#j6K403JH*+A`zR_;q!SDK}# zCaXK(U4B=tCzz>!PkDa7)J?P0w@6(>`FmK;)rz-b6P3vsUE1?Hgr1hxCA*4QBi@|* zwNch1*J~}(aH*yA0)JF_)9+mnpYyyOQ{e}3;zgutpR(;ae(M?D#wFwJwnuQFV&!JR z4_Qb%W7#`KWP>&1oiN&y0M`=;ZdPezP{h0`wZ^1bn$?l zVX7ER+D~(7qaLstM4UZ&mp-IdbC9C)_I*fCQlcea;;np%zvfFkND19;;KTT9zQjxU z66+`-f6p)RK)%GU@+EGf#L|3;@8(O$>htl?&hW&6`aeco!uAb65ZpT6%(E9NzR&YR zp1&kuOs%=3Mo?L7DJ+`#iap7%3ChgO!`zT?Mb{b{);?*;l=XWEUzt}_dW8s=g;z1Szc>C zubI3dL0+rneLtUf33i?dqFw3Z)CfIBeB8S!PrC)w;$}=JExMK_8)9s}gaGAM`x%1+l@8l$5NsX#u}&b| zl83;WLVTz}PvZokI5c` zE*;jtUiL}Hhvn;BMIC;TfXMm4pta>zbCk8leF7eo32Htq8XU$w0=+N!`kOeB8?E0P zO29eG(RUq4%9>#R#re{2doS`&TwrU}a2v){lZXY1cH8VyL-~n(<|R|P+w0luv`pS_ zc0F}k{9gba^#gxy5oW{w4&UqaWZd{ZD;4=eH7M@v}l7cBQTAIQv2yfzo%m!+6xt5^YDfqx z*SdZcKVav~)!@t=(%05dFM#@EN@H*E_7#Kta39DI8|3lb=Qw`P7z$&>WFCYzqAAu; z(2p`8O`;Yl*1sKAtC;fGMX6S3`$L=e&Zmt{*2Z`Gv~j(at}eS3`kfx6tA|%v-@a<) zuk2I)OMS|igbr;7?l-O6*?r1=&fp$paQ*e+u$5t*5t^Myo!9f6(O+rB_gjCOykO1O zO52DH)%`xpjiZc$q9u}O7F+i)(I!11>)ZMznT^wSnm)7n?y%8)Fe(>D-Wo7!@qYR- z_4Zi3s*lOZT26Uic{yx5auTBll9R};7WM~5h$Yu3zQbzY<39C~=t${enTc0XhMT1ll$d}tZ!oG| zMYG`XDf z&)4{L9-GH)f3bAH5A(5?jHT=^L$E4X+ z*RRzln$abs$hV9%_p^88R5Q%T)?6Edt3RQQ0oKM30%{g^MXQ#9q2e=c#Gi7ti?)7z z?S0*pC_@Xa^)6?;WVNKsf{jRflTszWvvRs@)4H+_#rsw=&MEB-;1{cJF&a#woSm%t zaI#-tkg$RchR+#jwrP332)jE)wW8d8nuoF?5YjI?gNvO;%-z)CCR;Cd2>S_jZ`GU zsHsJNv<#Qu5kF&xE1u11l6Lv)bz|FYwKh-TJjd;`@$Y>)eF3x3x4dpzn~essUrf%= z4wKPpgW$7L%?y1~TU?2DS+S*P0-C4S=8f6jU;HQs`_~jRVO`Z`kRb=vRW1EanC2a# zHnjUs?0_+)W6D`oXfJMx4NyKWMg8*!>5i zEXhqsTA7)h{eGhEow?KX^EJ7xFt_6Oj)0o)=kCG?q$|GPHd2c4D}Egb<}M6_92S=i z_H)QZx-b%c_#`_IDyw%5oehxunR`|TjH?37I zQSGqpAE}#QyDKa9VG_tVCxJ`xPZ*({MM2 zc>@{hold#k4nM#02_C`t@)d^bc87!^c5>!DrQO;UD}_*KeKySJs`MzU>oe zH|+r08MOr4`morisrUw(&a11)K4>ZOO3qNJfC3@t}#Y_*~Pq4aVav`P6lEf@tW_}vSe zP2kVL$%bsZX1~{e0R*F#-hu1Xa|M$Lss5+VoF8ofu$(M zJKi+-x3K#9qsdo7+yCbIO`h5XnBOV*ULzxHd!@QBehekCqh5P=396PEz|7J!sWH>`5!oJW?eku zbUTlgJvZPu(p>AhIo{S`W9niNEb9)fkBsoLI)mCV*Uq4(@OwMyZ@c_nyBn+r-LIX@ zP1qTX3j6UQqK|qW{t4XC37>S*K2mI6Tk-b7#*#)(NQR~mFUBUYo#=&}_rGMsCOcy~ z%HqhH@j}d!F95Ls$oZS0!k2z*J$^Nc-h>|JHhk(all!|bwI1M8lyl3XZa`Q3Hmq|r z@AzaXHkfb4KkV%$z0)jpf0Xg^`<}1}&r%<4BowbzjPX6RQ71GG_A6PxtJ?}%E4EI% znY+8(4~379OMt-vj$sz549~q-jE8|O>HZ%*(GAl)2mv|Azy zJFM*!luk>v`Bv^%`k(YWQzoBz=tpD4ZM>St-h0s-Pkfs@4wqMf>;#`aJdj|ny4sCS!`#Ra{aT6(P z1hM;g@`p)dYgNN+Qd@n)F6_I1ZX4zA(|Fr2tR9Bkl#wDIsmfBDcspn>ob~|@%lfuo zSt;v5-1VpvD;3juV{bUOcg&QnYTpO$w=T`9)agBJW#Q%9r?TIMDGt^kO!$C3*nFC| zO8xG0bitMZ*uFE}h-DpJSUeD(lC)rD^vX zei*j5^$nS?m!HU>wMI8GuJT8#c`o89ttJYG(ize zkS_NAVbItW9MqfX!|~qr<6UsU9B*H)jHrtL(3L$8-&AxxJU2=}OIU=n)oxdj|2esW z{T$%dqm?|hZ8@iqHkurM`I8oB9x!@K=<_0I!&!}m)L0hh7nG{3weW~BvX!9#(t~?T z&VlKamsheg3TJqK_VMg~RCE%aL$?RiA;J)YYUW9tYCDo!i70yIx?gm0`XqYGvw~A1 z>?31@`1M%r>nhZaq0G=2eXyG2g8po#=6%$dls=uB$GU+&#@22gV}3`s$@>?5jpv}{ zAvJlgtDnLcUUPoE{rx2UchOn=e<|qQwxD16`{RcGr}*0M6D@4wb7QoMzKSE_tDR`c zDn*ZOTIkT|D@Mp|QPHX-_rwL|68u(^`mI>+jf!Im1Ib9}7o@Dou(Ip_CRgaeiiv2D z*A_-P+`@RPw3vKtxWBy0zl{RU^~#5gsIorr>lX0w|564xTKE4S;q1SstK7ejEVnA@ zbNnfO|MUI+jP)D-1ABf?-PV%F9?-9o$!YU{Y0~<6T*U-C7YX}Q9z%mt6j6? zGMr9(e-N(a)<3JMJ)N8SKstN`YXhQ4bP`zaz;6-PvSJJWSh~LZIiyO?xv4|+QtdpH)$>QFH?vgI zt)4~KWoRGG+Cd%kg7-Jg3pVZ(M@;HlNAuK>&3JlU%VS^*CAVCU9xjxglB8Px-O)16 zZT*pm>sC91$(V1s75SvrkW#A$Z;($UL?)H{VLn4f#6UQy*~5-4=zYVa-wZd*~M0ADXs}(Ysufro?&CrR5=RJde@S z-C+41zgu?*bKBdb4I*u)M%}2&FIbTlhq~XO^#SRnwl>}> z0P1JZmVx-_Y}&hlPsK90fW4k-zk39^0~Dcx3nJo%Oh0MnsP5+$Cse0PyspZAkA}Ji zfX#Nk{nWnohZ+-tcJBPdb{2Whk*AqB%G?~>Y{+f>I{&xs(WSNrL>9VsJ^UEhTXV3z zzXY(KCg&%Cbo7NW4_{(NR`PoC>MQ8Ee$iUg=<&WDd_OdRdl{4=!mZve3>)6hiOE~2B6r1pd!_8QKI8brN5=7{|G(qN_)P)hHf|u2_SbD!mqU#Kr0E7c z?gD}K{m}#c6av~yIfg+{J$Uc*zS9W z?%(ReDM3l=`+BT?>ldS^Ia+t^vPL1TYG@O?-y_Wz-gPJY}d|MGw2fn-i^l&<#^22aD=UJ$DZ4dXTJbX z%u~ZNk#UA6i^=vqoX0a!Ia9yF#Y|clUAQvgqQp2#)}88Qhb`+~NM8p+L)}r#kk>&4 z$`yb)H+)K-4y5va+&@ZX;VP_!X>v?VV<##M^5Gb*Tezv(=)sjx5(y_Cj<}l+QiGvCa7Gv8yrdFFUV87q0!0L>vK2A5?vdd-m<73^2(^5Wj~>wr=xlXR6VhSOV$&; zf3~_E<7E~e)9j}8f3p@d7`1CncJ9w8<~E*rU}uTS1x6?48Y%SAt4O`OXA&~X zDbQc+X9B0?{6lyP6_N_dX|+WECRSC>y|C0jSd0ORsBPb5x#I6NSGA8$C%ne*n%DDt zcG3A{#5aSYt)K{}fyBm4`#C|D=={6rMW&2AeMK2?c{cT72H00X#e1M4rs>q*G*;v5 z{CIlzAK`t+i#RKRmSHFSee`l2%{fRv@P)6d2tluwy~AgZw#HUs%@wCEXbla&7${Mr zMLr}(-)ZEha|FbtP_H9nhPk109pr;&b_Y=YW$>;WWz(+OAA-t$^zvq$HfjY<8`%)- z!-EfLe4C!1;N6!os^Rx9cy7(5g>&!X%MPfMFwwdTqW&{-`meD^Usm#llUm&~E9rX? zkneV^W;-aIzSvj+d<1YDa0lQ?zz)DN;5NVjfnh_A2`Rm;8zcpTx)_-aWEXQVtl zuiudENp=ew%Qh{ak`aYiGuY6D@2A}-@{qA_LcW`NIzh=Zut|KT1Th2P=5Nz1x~Fw! zC1NkrnjGneI&+S1Dr1gQ_wURL+UJ9pgyFM3y+dO3!BY$KyIbYxCayKjtb#5~l2yQZ zQWM@px{u~Ib>9QTFGJOR_xu|;*SP^-4fr~^rp^I>3w*`79Ptf!DEI;e`fU=k%0uWe z%<8a423rXV-V-f2TXPj}&R@#nY#R17Z!mvf=YHLQSq=R*_?q)Abro`XJj|lhhcTmdy2P=*`n#7b6WSJM>atgehacNhWh8wgPZ3547;Y}3BL(X zXwAhWPGrAk-X1~#Zx1E;`(vQ%D(f2Ut-S73jaF zlh03IP49)Jc>Xf{Mqba@g!<4Q8JUgIiW-MnRQtK*;oRrAH|trluitV&4^gQ`F0w95 zwuk6n`8{fhqF%M+4sB?xX~V#6+t3Kh^!t!Q;vsXAR#&H*x}kfp@Ar!$GlP}Bp1b#oVNmIWE9O&epe;HD_2A;+x z`dSU0?jjp@?Vctu4gA3hWDM_fD9z^{BOkeCUINg%XTbF*h>z)AuMiJuwddsdiI_-_ zP1ESe`*|O|Mg5?7Nc^LC+=sx=cr7nK+NoQ{ZO+JK3~#~1hoydi|M+`U4#^p4kZKk} zyrFRiJxMajIziT`=LzTp=t;wJ5q+o&JMwr_?q$`Yo(nYEa9`@Wnqp)LS>q{&%2KuB zTa%<|Y)44b^caYeC6)N$bD-)BZhm9)`lB1qV6GF}eCD2)pkuR$Pl4jys#eTu_acV& z@zaQX2%1R0Ye#wmuAaqMqwv%SNK~BvyiO%spTT*HX2$M zmEAJ;w#lRPVo}ZjIZ4NE->>j27x$~y+s}~BlI~W^{LOc%EXC`K-FWk2kT{Gu-l6*F zvH4Uj33OiKFyWAP&ujHf?5ovsM~%ITC$qn!dW^J$^nQwYNZQZm6R9^LFSDP!hBtFC zcVP>jmJ+A!x{(7Z>tUzw&d8a&Q9_b!_4V0@&$d4gyH8e4aRDt3~1@V92 zl$NQ_A}|SwG{58q?vaP3#>Ix~nhQ&C>*gEC`Rhv3VM}1QlXbcUkBT~2*-J*^XIo&? z>mbjK^c^pS!#1NO%X&S#4!$w}ZlI#;Y%6947{7IC*Khtu^}b7-^k*&Zex47K2bNa* zA^fGaKhge*^7m=YiGDHbj{ZGT$#;R5pVt1pc-8p!*B+nVfHcteam%>~!?X4`K~+~8 zmPV};@UEL<%4C0z_X!zyVyX#Q>dCh|d6}i`tE3Gd(D_f=E9?PJcm@1Inei=!kCZE* zxsFD<_|I}Z{ASgKX9-{XaM3qQfED`+^b*Ll!a?)@bu_Pnbg%jH4QMdU4B$B+ophA< z+h}JK>9H@R__JhyC%j-688c{ob`~##=JFf6| zqu1f-D8*kOj}CNxkcChDrynFmeFJ`fMU3OLFkJ?6VD*P$l;dLv#zY-%6@NpFiRFn; zc*&~#k8RoZ%MV52=9Y)IKALFnh$6PP4u1OaDD-^l!S1%7e;{EEf8p?vqsNYCpXf7qC;A7TeCp)W&!}*+ zvunrBUArIIvsZ;xU-18x__8`*na%%n=Iy`S`L0P@5dQ3*t_G6?IH{gvbGLM4EZ!_d zcE1nDo?CE+E53yc z?n2ChZG{!z4&;y%234g5C}pX%MKwJ6#DYpPmP@2iAxLxFf>&MdnD2zP3_{c#$k3A` zUJweQTGZ|$k7||7d!UQUQO%a&h%Jw%Gt$cEL2_USMA??hh*l8|w@`S=E_wchEO@^3 z?VRn5+H$B;DA;}=0^7}}WZt(NS33S_lwvtWJ6~0QO7_*{0gavvN+=xK-7I^vM^Gqw z%?)I8T%6dkH@QD+cr~dXpcRcK&O|Yc)lX{Jq@lqR^3oT-Gmdf0$EI!A!# zWfk|7>y5e6_I=M6aVdqA{RjH95xsfY8ptiJd3m^JBD908kc*`-31*VWWE{=Fs z-f@RzdE72KZe=`?D-2894bhoxtw9?~JZ$@}UDR<-AWKdVAP0Klm>rIJ{wX=+5${6_ z66y{^E#d-QHrW4kcK=`|^OUs5%XSVjERK0bjH{Sl@G5S;T3Q^}2_38GykJY9aRo{~ z(6#}pxmqO9h-BAzYN>y5U3hIC6-D zM|y5?Vk>xu$t3EriGgUJ;fo@0G}S5zpn8edv895yVKcmSx~U zW9|G_=;UqX7g^@TcfOV$G-{yl2<3`urZ}?CTpLp6ug6UriDbIw#I48G6OCc9dv>aT zY9F38-tvE=RwG=G+mz9!aQVL}&p?Wd5#p^$dWT42t>K;I#L1dUG4GnMUB=Tf%_)LX9|9!w!YV;Q3@6`48D$TSfY6nHXxO$$C z%+&i$S8!YJpVR4U@iq0)s`56&_{U5=s{FvbAPJC6jU}qS+OovVl*dO~pme?k^m1OY22GIbRU1?At>F@M zO&M6%w)1e!EEhw>0nizWz^nK$c)nMGPofABW)z-<(OM^4eG;}w}6;S`JZuvJuo;Bl|92UtTv=v!_8$4K_>L(jm^spLjf zjtb0*ri|Q45-+Y>=2|@%O|9l9k~1*a%dlfIu6FK?74w$dPUV>5R_xwn%^FIA=+0S zvjXJSx(8*YC#9EPdsD*?6#R?d(BbzKeEr_q_}A-In9G2@VR+Zv-11k|WQyw`+XXy+ z*7aQcp~`phs)koI{I-JMc$4zrUcPE6r;de&ygpzod99+djg%c`U<9%U z575>_IObGVr5K8$HDnis8We>f55q^VS>-akYVz7jB@%z*S5!Igb{@XOe)3#X(J)U# zRlylI9!L>ppxNN`!`CNAlEo_sefHOsr$TtF&w1Nd-Wg2{YCKk@Bs4(s5bcBsQJvl) z`uzziu{x5Sm;gpn7#eC)HLcqijSU!iO^W7ZC%YU={=^fO}qYfV2WjcVGu|Bo= zIr*4`zfJ1Wrq!!CzNJucbBxd$Z0E{l$B0+5JHnAlIMM-M*e-UQwo8=`I3q#Fi6h4k zbQGN-x?$)#=G(BH`6*i+l8^=0&8jfT87>mh=pwnhYKj^p_h*phWDw*M5~bgV8-2%P z`U*fnGp#|kef}Uk7boW^Lz$8_-W{l6OxJdXM}}ZA?~J?v*UG~g4xPXzJG{7Lq661L z|DhXkFXGl3_`inSKIA7zYK`4$zNoyG;+!2cwC zQggkC@T$dnXp(;le?kvGTUaY5ZO3W3O8HJq8GaC9~NO7uwfz6vvn|LMcW>H(T=&iC`j z%CZm%T*{p}ks|{W6VDl|6O~Kxbm?rwQ?7JjF;!v0p*y-7epOsVAR9$2N{=;}^n;m9 zN^UuLY+$S0nb?!qCA*THyOO)RcE~M#aPALbcE|DUU3<2|RR~7l)`ixPNQCxyC=w3V zEc~)az-hD-!)_%pRB?*=b|)`5G-3rKB9WhPgNc%Yp)V4?U9>0?Pae&IImIeDIb`xs zsEQj30+GnUIfai<)sp}FBk8c|C$=*Ulcq504!Zu>*a;P6Q(zv&8a$c&nkRL8RH}jO z4@4QN@F|Y`4YQ17@*koEuvkOUqQcRC^3lw-9rozIbim{IiD|;9`_|J$G1h=qbL literal 87872 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