From 8e37adbfeb3c5518fa886f12570ff9b13b53c592 Mon Sep 17 00:00:00 2001 From: Jorge Guzman Date: Wed, 29 Jul 2026 22:51:01 -0300 Subject: [PATCH 1/5] include/nuttx/input: add modifier keycodes to the keyboard codec enum kbd_keycode_e had no way to name a modifier key, so a driver that can tell that Ctrl, Shift, Alt or GUI was pressed had nothing to report it as, and an application had no way to bind an action to one or to know that one is being held. Append the eight modifiers to the end of the enumeration, which leaves the value of every existing keycode unchanged. Signed-off-by: Jorge Guzman --- include/nuttx/input/kbd_codec.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/include/nuttx/input/kbd_codec.h b/include/nuttx/input/kbd_codec.h index 951e1ee472a..10bc1005d09 100644 --- a/include/nuttx/input/kbd_codec.h +++ b/include/nuttx/input/kbd_codec.h @@ -166,7 +166,24 @@ enum kbd_keycode_e KEYCODE_F21, /* Function key 21 */ KEYCODE_F22, /* Function key 22 */ KEYCODE_F23, /* Function key 23 */ - KEYCODE_F24 /* Function key 24 */ + KEYCODE_F24, /* Function key 24 */ + + /* Modifier keys. Drivers that are able to track modifier state (a USB + * HID keyboard, for example) may report these as key press and key + * release events in their own right. That allows an application to bind + * an action to a modifier, or to know that a modifier is being held down, + * which cannot be expressed by folding the modifier into the character + * that it produces. + */ + + KEYCODE_LCTRL, /* Left Ctrl */ + KEYCODE_RCTRL, /* Right Ctrl */ + KEYCODE_LSHIFT, /* Left Shift */ + KEYCODE_RSHIFT, /* Right Shift */ + KEYCODE_LALT, /* Left Alt */ + KEYCODE_RALT, /* Right Alt */ + KEYCODE_LGUI, /* Left GUI (Windows/Command) */ + KEYCODE_RGUI /* Right GUI (Windows/Command) */ }; #define FIRST_KEYCODE KEYCODE_FWDDEL From 4bcd105610fb45900a9815ab3900f38bfef2a07d Mon Sep 17 00:00:00 2001 From: Jorge Guzman Date: Wed, 29 Jul 2026 22:51:12 -0300 Subject: [PATCH 2/5] drivers/usbhost: report HID keyboard through the keyboard upper half The HID keyboard driver registers /dev/kbd[n] as a byte stream and only ever reports key presses: there is no way for it to say that a key was released. That is enough to type with, but not for an application that has to know how long a key is held down, such as a game, where a movement key would never stop being pressed. Add CONFIG_HIDKBD_KBDUPPER, which registers the device through the keyboard upper-half driver instead, so that reads return struct keyboard_event_s. Presses and releases are derived by comparing each HID report against the previous one, which is the only way to tell them apart given that the specification gives no significance to the order of the keycodes in a report. Modifiers are reported as keys of their own, so an application can see that Ctrl is down and which key it is held with. The two interfaces are mutually exclusive because they share the device name, so the byte stream is not built in this mode. Signed-off-by: Jorge Guzman --- drivers/usbhost/Kconfig | 29 +++ drivers/usbhost/usbhost_hidkbd.c | 335 +++++++++++++++++++++++++++++-- 2 files changed, 345 insertions(+), 19 deletions(-) diff --git a/drivers/usbhost/Kconfig b/drivers/usbhost/Kconfig index 90b68044e86..26ac25b8370 100644 --- a/drivers/usbhost/Kconfig +++ b/drivers/usbhost/Kconfig @@ -399,6 +399,35 @@ config HIDKBD_ENCODED keys, etc. If this not defined, only 7-bit print-able and control ASCII characters will be provided to the user. +config HIDKBD_KBDUPPER + bool "Register as a keyboard upper-half device" + default n + depends on !HIDKBD_RAWSCANCODES + select INPUT + select INPUT_KEYBOARD + ---help--- + Register /dev/kbd[n] through the keyboard upper-half driver rather + than as a raw character device. Applications then read + struct keyboard_event_s samples instead of a byte stream, which + reports key release events in addition to key press events, and + reports modifiers (Ctrl, Shift, Alt, GUI) as keys of their own. + + This is what an application needs when it must know how long a key + is held down, such as a game. Note that the byte stream interface + is not available at the same time, so this breaks applications that + expect to read characters from /dev/kbd[n]. + +if HIDKBD_KBDUPPER + +config HIDKBD_KBDUPPER_BUFNUMBER + int "Keyboard upper-half buffer size" + default 8 + ---help--- + The number of keyboard events buffered by the upper-half driver + for each opened instance. + +endif # HIDKBD_KBDUPPER + config HIDKBD_ALLSCANCODES bool "Use All Scancodes" default n diff --git a/drivers/usbhost/usbhost_hidkbd.c b/drivers/usbhost/usbhost_hidkbd.c index a52625257b5..c82b411814e 100644 --- a/drivers/usbhost/usbhost_hidkbd.c +++ b/drivers/usbhost/usbhost_hidkbd.c @@ -56,11 +56,16 @@ #include #include -#ifdef CONFIG_HIDKBD_ENCODED +#if defined(CONFIG_HIDKBD_ENCODED) || defined(CONFIG_HIDKBD_KBDUPPER) # include # include #endif +#ifdef CONFIG_HIDKBD_KBDUPPER +# include +# include +#endif + /* Don't compile if prerequisites are not met */ #if defined(CONFIG_USBHOST) && !defined(CONFIG_USBHOST_INT_DISABLE) @@ -133,6 +138,19 @@ #ifdef CONFIG_HIDKBD_RAWSCANCODES # undef CONFIG_HIDKBD_ENCODED +# undef CONFIG_HIDKBD_KBDUPPER +#endif + +/* The table that maps scancodes to special key encodings is shared by the + * encoded byte stream and by the keyboard upper-half interface. + */ + +#if defined(CONFIG_HIDKBD_ENCODED) || defined(CONFIG_HIDKBD_KBDUPPER) +# define HAVE_KBD_ENCODING 1 +#endif + +#ifndef CONFIG_HIDKBD_KBDUPPER_BUFNUMBER +# define CONFIG_HIDKBD_KBDUPPER_BUFNUMBER 8 #endif /* Driver support ***********************************************************/ @@ -238,8 +256,12 @@ struct usbhost_state_s struct work_s rwork; /* For interrupt transfer work */ int16_t nbytes; /* # of bytes actually transferred */ #endif -#ifndef CONFIG_HIDKBD_NODEBOUNCE - uint8_t lastkey[6]; /* For debouncing */ +#if !defined(CONFIG_HIDKBD_NODEBOUNCE) || defined(CONFIG_HIDKBD_KBDUPPER) + uint8_t lastkey[6]; /* Keys down in the previous report */ +#endif +#ifdef CONFIG_HIDKBD_KBDUPPER + struct keyboard_lowerhalf_s lower; /* Keyboard upper-half interface */ + uint8_t lastmod; /* Modifiers held in previous report */ #endif }; @@ -272,8 +294,10 @@ static inline void usbhost_mkdevname(FAR struct usbhost_state_s *priv, /* Keyboard polling thread */ static void usbhost_destroy(FAR void *arg); +#ifndef CONFIG_HIDKBD_KBDUPPER static void usbhost_putbuffer(FAR struct usbhost_state_s *priv, uint8_t keycode); +#endif #ifdef CONFIG_HIDKBD_ENCODED static void usbhost_putstream(FAR struct lib_outstream_s *self, int ch); #endif @@ -335,8 +359,17 @@ static int usbhost_connect(FAR struct usbhost_class_s *usbclass, FAR const uint8_t *configdesc, int desclen); static int usbhost_disconnected(FAR struct usbhost_class_s *usbclass); -/* Driver methods. We export the keyboard as a standard character driver */ +/* Driver methods. We export the keyboard either as a standard character + * driver or through the keyboard upper-half driver. + */ +static int usbhost_open_priv(FAR struct usbhost_state_s *priv); +static int usbhost_close_priv(FAR struct usbhost_state_s *priv); + +#ifdef CONFIG_HIDKBD_KBDUPPER +static int usbhost_kbdupper_open(FAR struct keyboard_lowerhalf_s *lower); +static int usbhost_kbdupper_close(FAR struct keyboard_lowerhalf_s *lower); +#else static int usbhost_open(FAR struct file *filep); static int usbhost_close(FAR struct file *filep); static ssize_t usbhost_read(FAR struct file *filep, @@ -345,6 +378,7 @@ static ssize_t usbhost_write(FAR struct file *filep, FAR const char *buffer, size_t len); static int usbhost_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); +#endif /**************************************************************************** * Private Data @@ -374,6 +408,7 @@ static struct usbhost_registry_s g_hidkbd = &g_hidkbd_id /* id[] */ }; +#ifndef CONFIG_HIDKBD_KBDUPPER static const struct file_operations g_hidkbd_fops = { usbhost_open, /* open */ @@ -386,6 +421,24 @@ static const struct file_operations g_hidkbd_fops = NULL, /* truncate */ usbhost_poll /* poll */ }; +#endif + +#ifdef CONFIG_HIDKBD_KBDUPPER + +/* Maps the bits of the HID report modifier byte onto keycodes, so that a + * modifier can be reported as a key in its own right. Indexed by bit + * number: the modifier byte is defined by the HID specification to hold + * LCtrl, LShift, LAlt, LGUI, RCtrl, RShift, RAlt and RGUI, in that order. + */ + +#define USBHID_NMODIFIERS 8 + +static const uint8_t g_modkeycode[USBHID_NMODIFIERS] = +{ + KEYCODE_LCTRL, KEYCODE_LSHIFT, KEYCODE_LALT, KEYCODE_LGUI, + KEYCODE_RCTRL, KEYCODE_RSHIFT, KEYCODE_RALT, KEYCODE_RGUI +}; +#endif /* This is a bitmap that is used to allocate device names /dev/kbda-z. */ @@ -403,7 +456,7 @@ static bool g_caps_lock = false; */ #ifndef CONFIG_HIDKBD_RAWSCANCODES -#ifdef CONFIG_HIDKBD_ENCODED +#ifdef HAVE_KBD_ENCODING /* The first and last scancode values with encode-able values */ @@ -800,7 +853,11 @@ static void usbhost_destroy(FAR void *arg) uinfo("Unregister driver\n"); usbhost_mkdevname(priv, devname); +#ifdef CONFIG_HIDKBD_KBDUPPER + keyboard_unregister(&priv->lower, devname); +#else unregister_driver(devname); +#endif /* Release the device name used by this connection */ @@ -860,6 +917,7 @@ static void usbhost_destroy(FAR void *arg) * ****************************************************************************/ +#ifndef CONFIG_HIDKBD_KBDUPPER static void usbhost_putbuffer(FAR struct usbhost_state_s *priv, uint8_t keycode) { @@ -899,6 +957,7 @@ static void usbhost_putbuffer(FAR struct usbhost_state_s *priv, priv->headndx = head; } +#endif /* CONFIG_HIDKBD_KBDUPPER */ /**************************************************************************** * Name: usbhost_putstream @@ -1076,6 +1135,161 @@ static inline void usbhost_toggle_capslock(void) spin_unlock_irqrestore(&g_lock, flags); } +/**************************************************************************** + * Name: usbhost_kbdupper_keycode + * + * Description: + * Map a HID scancode onto the keycode space used by the keyboard + * upper-half driver: 7-bit ASCII for printable keys, and the values of + * enum kbd_keycode_e for everything else. + * + * Input Parameters: + * scancode - Scan code to be mapped. + * modifier - Ctrl, Alt, Shift, GUI modifier bits + * + * Returned Value: + * The keycode, or zero if the scancode has no representation. + * + ****************************************************************************/ + +#ifdef CONFIG_HIDKBD_KBDUPPER +static uint32_t usbhost_kbdupper_keycode(uint8_t scancode, uint8_t modifier) +{ + /* Check for a special key first. Otherwise a key such as ENTER would be + * reported as the control character that it also maps to. + */ + + if (scancode >= FIRST_ENCODING && scancode <= LAST_ENCODING) + { + uint8_t encoded = encoding[scancode - FIRST_ENCODING]; + + if (encoded != 0) + { + return encoded; + } + } + + /* Otherwise fall back to the printable ASCII mapping. Note that Ctrl is + * deliberately not folded into a control character here: modifiers are + * reported as keys of their own, so the application still knows that Ctrl + * is down and can see which key it is being held with. + */ + + return usbhost_mapscancode(scancode, modifier); +} + +/**************************************************************************** + * Name: usbhost_kbdupper_report + * + * Description: + * Turn a HID keyboard report into key press and key release events and + * hand them to the keyboard upper-half driver. + * + * The HID specification gives no significance to the order of the + * keycodes in the report array, so the only way to know what changed is + * to compare the report against the previous one. + * + * Input Parameters: + * priv - Driver internal state + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void usbhost_kbdupper_report(FAR struct usbhost_state_s *priv) +{ + FAR struct usbhid_kbdreport_s *rpt = + (FAR struct usbhid_kbdreport_s *)priv->tbuffer; + uint32_t keycode; + uint8_t changed; + int i; + int j; + + /* Report the modifiers whose state changed since the last report */ + + changed = rpt->modifier ^ priv->lastmod; + for (i = 0; changed != 0 && i < USBHID_NMODIFIERS; i++) + { + if ((changed & (1 << i)) != 0) + { + keyboard_event(&priv->lower, g_modkeycode[i], + (rpt->modifier & (1 << i)) != 0 ? + KEYBOARD_PRESS : KEYBOARD_RELEASE); + } + } + + /* Report the keys that were released: down in the last report, but not + * in this one. + */ + + for (i = 0; i < 6; i++) + { + if (priv->lastkey[i] == USBHID_KBDUSE_NONE) + { + continue; + } + + for (j = 0; j < 6; j++) + { + if (rpt->key[j] == priv->lastkey[i]) + { + break; + } + } + + if (j >= 6) + { + keycode = usbhost_kbdupper_keycode(priv->lastkey[i], + rpt->modifier); + if (keycode != 0) + { + keyboard_event(&priv->lower, keycode, KEYBOARD_RELEASE); + } + } + } + + /* Report the keys that were pressed: down in this report, but not in the + * last one. + */ + + for (i = 0; i < 6; i++) + { + if (rpt->key[i] == USBHID_KBDUSE_NONE) + { + continue; + } + + for (j = 0; j < 6; j++) + { + if (priv->lastkey[j] == rpt->key[i]) + { + break; + } + } + + if (j >= 6) + { + if (rpt->key[i] == USBHID_KBDUSE_CAPSLOCK) + { + usbhost_toggle_capslock(); + } + + keycode = usbhost_kbdupper_keycode(rpt->key[i], rpt->modifier); + if (keycode != 0) + { + keyboard_event(&priv->lower, keycode, KEYBOARD_PRESS); + } + } + } + + /* Remember this report so that the next one can be compared against it */ + + memcpy(priv->lastkey, rpt->key, sizeof(priv->lastkey)); + priv->lastmod = rpt->modifier; +} +#endif /* CONFIG_HIDKBD_KBDUPPER */ + /**************************************************************************** * Name: usbhost_extract_keys * @@ -1095,6 +1309,14 @@ static inline void usbhost_toggle_capslock(void) static int usbhost_extract_keys(FAR struct usbhost_state_s *priv) { +#ifdef CONFIG_HIDKBD_KBDUPPER + /* The upper-half driver does its own buffering and poll notification, so + * there is nothing else to do here. + */ + + usbhost_kbdupper_report(priv); + return OK; +#else struct usbhid_kbdreport_s *rpt = (struct usbhid_kbdreport_s *)priv->tbuffer; uint8_t keycode; @@ -1234,6 +1456,7 @@ static int usbhost_extract_keys(FAR struct usbhost_state_s *priv) nxmutex_unlock(&priv->lock); return 0; +#endif /* CONFIG_HIDKBD_KBDUPPER */ } /**************************************************************************** @@ -1991,7 +2214,20 @@ static inline int usbhost_devinit(FAR struct usbhost_state_s *priv) uinfo("Register driver\n"); usbhost_mkdevname(priv, devname); +#ifdef CONFIG_HIDKBD_KBDUPPER + /* Do not set lower.priv here: keyboard_register() claims that field for + * the upper half. We recover our own state with container_of(). + */ + + priv->lower.open = usbhost_kbdupper_open; + priv->lower.close = usbhost_kbdupper_close; + priv->lower.write = NULL; + + ret = keyboard_register(&priv->lower, devname, + CONFIG_HIDKBD_KBDUPPER_BUFNUMBER); +#else ret = register_driver(devname, &g_hidkbd_fops, 0600, priv); +#endif /* We now have to be concerned about asynchronous modification of crefs * because the driver has been registered. @@ -2468,23 +2704,21 @@ static int usbhost_disconnected(FAR struct usbhost_class_s *usbclass) } /**************************************************************************** - * Name: usbhost_open + * Name: usbhost_open_priv * * Description: - * Standard character driver open method. + * Take a reference on the driver instance. This is the common part of + * opening the device, shared by the character driver and the keyboard + * upper-half interfaces. * ****************************************************************************/ -static int usbhost_open(FAR struct file *filep) +static int usbhost_open_priv(FAR struct usbhost_state_s *priv) { - FAR struct inode *inode; - FAR struct usbhost_state_s *priv; irqstate_t flags; int ret; uinfo("Entry\n"); - inode = filep->f_inode; - priv = inode->i_private; /* Make sure that we have exclusive access to the private data structure */ @@ -2526,23 +2760,22 @@ static int usbhost_open(FAR struct file *filep) } /**************************************************************************** - * Name: usbhost_close + * Name: usbhost_close_priv * * Description: - * Standard character driver close method. + * Drop a reference on the driver instance, destroying it if this was the + * last reference to a disconnected device. This is the common part of + * closing the device, shared by the character driver and the keyboard + * upper-half interfaces. * ****************************************************************************/ -static int usbhost_close(FAR struct file *filep) +static int usbhost_close_priv(FAR struct usbhost_state_s *priv) { - FAR struct inode *inode; - FAR struct usbhost_state_s *priv; irqstate_t flags; int ret; uinfo("Entry\n"); - inode = filep->f_inode; - priv = inode->i_private; /* Decrement the reference count on the driver */ @@ -2621,6 +2854,68 @@ static int usbhost_close(FAR struct file *filep) return OK; } +#ifdef CONFIG_HIDKBD_KBDUPPER + +/**************************************************************************** + * Name: usbhost_kbdupper_open + * + * Description: + * Keyboard upper-half open method. + * + ****************************************************************************/ + +static int usbhost_kbdupper_open(FAR struct keyboard_lowerhalf_s *lower) +{ + /* Note that lower->priv cannot be used to find our state: it belongs to + * the upper half, which overwrites it in keyboard_register(). + */ + + return usbhost_open_priv(container_of(lower, struct usbhost_state_s, + lower)); +} + +/**************************************************************************** + * Name: usbhost_kbdupper_close + * + * Description: + * Keyboard upper-half close method. + * + ****************************************************************************/ + +static int usbhost_kbdupper_close(FAR struct keyboard_lowerhalf_s *lower) +{ + return usbhost_close_priv(container_of(lower, struct usbhost_state_s, + lower)); +} + +#else /* CONFIG_HIDKBD_KBDUPPER */ + +/**************************************************************************** + * Name: usbhost_open + * + * Description: + * Standard character driver open method. + * + ****************************************************************************/ + +static int usbhost_open(FAR struct file *filep) +{ + return usbhost_open_priv(filep->f_inode->i_private); +} + +/**************************************************************************** + * Name: usbhost_close + * + * Description: + * Standard character driver close method. + * + ****************************************************************************/ + +static int usbhost_close(FAR struct file *filep) +{ + return usbhost_close_priv(filep->f_inode->i_private); +} + /**************************************************************************** * Name: usbhost_read * @@ -2851,6 +3146,8 @@ errout: return ret; } +#endif /* CONFIG_HIDKBD_KBDUPPER */ + /**************************************************************************** * Public Functions ****************************************************************************/ From 5ef00dc71762cb6f697c8cee9fb07c792416f42f Mon Sep 17 00:00:00 2001 From: Jorge Guzman Date: Wed, 29 Jul 2026 22:51:27 -0300 Subject: [PATCH 3/5] arch/arm/src/stm32h7: fix LTDC format specifier for the CLUT index chromakey is a uint32_t, so printing it with %d warns. The line is only compiled when CONFIG_STM32_FB_CMAP is enabled, which is why it has gone unnoticed. Signed-off-by: Jorge Guzman --- arch/arm/src/stm32h7/stm32_ltdc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arch/arm/src/stm32h7/stm32_ltdc.c b/arch/arm/src/stm32h7/stm32_ltdc.c index c946c889300..4eeccc47035 100644 --- a/arch/arm/src/stm32h7/stm32_ltdc.c +++ b/arch/arm/src/stm32h7/stm32_ltdc.c @@ -30,6 +30,7 @@ #include +#include #include #include #include @@ -2712,7 +2713,8 @@ static int stm32_setchromakey(struct fb_vtable_s *vtable, # ifdef CONFIG_STM32_FB_CMAP if (oinfo->chromakey >= g_vtable.cmap.len) { - lcderr("ERROR: Clut index %d is out of range\n", oinfo->chromakey); + lcderr("ERROR: Clut index %" PRIu32 " is out of range\n", + oinfo->chromakey); ret = -EINVAL; } else From 8b4c12d22daa05c3fff80eb599b712873304c0b8 Mon Sep 17 00:00:00 2001 From: Jorge Guzman Date: Wed, 29 Jul 2026 23:18:30 -0300 Subject: [PATCH 4/5] boards/arm/stm32h7/linum-stm32h753bi: add an nxdoom configuration Runs NXDoom on the board's LCD, played with a USB HID keyboard and reading the game data from the microSD card, so it exercises the LTDC framebuffer, the OTG FS host and the SDMMC peripheral at once. Three settings are needed that are not obvious: CONFIG_FAT_FORCE_INDIRECT, because the FAT layer otherwise reads whole sectors straight into the caller's buffer and the SDMMC IDMA cannot reach the caller's buffer when it lives in external SDRAM. The failure appears part way through startup, once the internal RAM has filled and allocations start coming from SDRAM. CONFIG_HIDKBD_NOGETREPORT, because the keyboard answers GET_REPORT on the control pipe with an empty report and only delivers key data on its interrupt endpoint. Without it the keyboard enumerates, reports no error, and no key is ever seen. CONFIG_STM32_LTDC_L1_L8 with the frame buffer colour map, because DOOM is natively palettised: letting the display convert the palette while it scans out removes the conversion from the blit and halves the amount of data written per frame. Signed-off-by: Jorge Guzman --- .../boards/linum-stm32h753bi/index.rst | 151 ++++++++++++++++++ .../linum-stm32h753bi-nxdoom.jpg | Bin 0 -> 111676 bytes .../configs/nxdoom/defconfig | 105 ++++++++++++ 3 files changed, 256 insertions(+) create mode 100644 Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/linum-stm32h753bi-nxdoom.jpg create mode 100644 boards/arm/stm32h7/linum-stm32h753bi/configs/nxdoom/defconfig diff --git a/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst b/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst index 3e2c85d0d9c..c105b3855cc 100644 --- a/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst +++ b/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst @@ -1087,6 +1087,157 @@ that the USB host and the SDMMC peripheral coexist:: nsh> mount -t vfat /dev/mmcsd0 /data nsh> ls /data +nxdoom +------ + +**Purpose:** runs ``NXDoom``, the NuttX port of Chocolate DOOM, on the board's +LCD, played with a USB HID keyboard and reading the game data from the microSD +card. It brings together the LTDC framebuffer, the OTG FS USB host and the +SDMMC peripheral, and uses the external SDRAM for the game's zone memory. + +.. figure:: linum-stm32h753bi-nxdoom.jpg + :figwidth: 60% + :align: center + :alt: DOOM running on the LINUM-STM32H753BI LCD + + DOOM running on the board's 1024x600 LCD + +DOOM renders to a 320x200 8-bit paletted buffer. This configuration stretches +that over the whole 1024x600 panel (``CONFIG_GAMES_NXDOOM_FILLSCREEN``) and +runs the LTDC layer in L8 (``CONFIG_STM32_LTDC_L1_L8`` with +``CONFIG_GAMES_NXDOOM_FB_CMAP``), so the palette indices are written to the +framebuffer unconverted and the display applies the palette from its colour +map as it scans out. That keeps the conversion off the CPU and +halves the amount of data written per frame. + +Two further options matter on this board, both because the framebuffer and the +heap are in external SDRAM: ``CONFIG_GAMES_NXDOOM_ROWSTAGE`` builds each row +in internal RAM so the SDRAM only sees burst copies, and +``CONFIG_GAMES_NXDOOM_STATIC_SCRNBUF`` keeps the buffer DOOM renders into out +of the SDRAM altogether. Between them they are worth 2.7 times the frame rate. + +The game needs about 4 MiB of contiguous memory for its zone. That comes from +the SDRAM region, which is 6 MiB when the LTDC is enabled (the last 2 MiB of +the 8 MiB SDRAM is reserved for the framebuffer). + +**Requirements:** + +* A microSD card, formatted as FAT, holding a DOOM IWAD. The shareware + ``doom1.wad`` and ``freedoom1.wad`` both work, as do the commercial IWADs. +* A USB HID keyboard on the OTG FS service connector. + +**Build and flash:** + +.. code-block:: console + + $ ./tools/configure.sh linum-stm32h753bi:nxdoom + $ make -j + +Flash the resulting ``nuttx.bin`` to the board. + +**How to test:** copy the IWAD to the SD card, plug the card and the keyboard, +reset the board and check that all three devices came up:: + + nsh> ls /dev + /dev: + console + fb0 + kbda + mmcsd0 + null + rtc0 + ttyS0 + zero + +Mount the card and start the game. ``nxdoom`` looks for the IWAD in the +current directory, so either ``cd`` to the mount point first or point it at the +file with ``-iwad``:: + + nsh> mount -t vfat /dev/mmcsd0 /mnt + nsh> nxdoom -iwad /mnt/doom1.wad + NXDoom v0.0.0 + z_init: Init zone memory allocation daemon. + zone memory: Using native C allocator. + Using /mnt/ for configuration and saves + v_init: allocate screens. + m_load_defaults: Load system defaults. + saving config in /mnt/default.cfg + W_Init: Init WADfiles. + adding /mnt/doom1.wad + ========================================================================= + DOOM Shareware + ========================================================================= + NXDoom is free software, covered by the GNU General Public + License. There is NO warranty; not even for MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. You are welcome to change and distribute + copies under certain conditions. See the source for more information. + ========================================================================= + i_init: Setting up machine state. + m_init: Init miscellaneous info. + r_init: Init DOOM refresh daemon - [...................] + p_init: Init Playloop state. + d_check_net_game: Checking network game status. + startskill 2 deathmatch: 0 startmap: 1 startepisode: 1 + player 1 of 1 (1 nodes) + Emulating the behavior of the 'Doom 1.9' executable. + hu_init: Setting up heads up display. + st_init: Init status bar. + +**Copying the IWAD with zmodem:** the configuration also enables the ``rz`` and +``sz`` commands, so the IWAD can be copied over the serial console instead of +moving the SD card to a card reader. ``CONFIG_SYSTEM_ZMODEM_MOUNTPOINT`` is +set to ``/mnt``, so a received file lands on the SD card:: + + nsh> mount -t vfat /dev/mmcsd0 /mnt + nsh> rz + +and, from the host, with the console closed in any terminal program:: + + $ sz -b --zmodem -w 1024 doom1.wad < /dev/ttyACM0 > /dev/ttyACM0 + +Note that USART1 has no RTS/CTS on this board, so there is no hardware flow +control to throttle the sender. ``CONFIG_USART1_RXBUFSIZE`` is raised to 4096 +to compensate, and the ``-w`` window above makes the host wait for +acknowledgements. Even so this runs at roughly 10 KiB/s, so a 4 MiB IWAD takes +about seven minutes; a card reader is much faster if one is available. + +The game runs on the LCD and is played from the USB keyboard: arrow keys to +move, Ctrl to fire, Shift to run, Alt to strafe, Space to open doors and Esc +for the menu. Configuration and saved games are written to ``/mnt``, so the +card must be mounted read/write. + +.. note:: + The keyboard is registered through the keyboard upper-half driver + (``CONFIG_HIDKBD_KBDUPPER``) rather than as a byte stream. That is what + makes key *release* events available, without which a movement key would + never stop being held down. Note that the byte-stream interface is not + available in this mode, so ``/dev/kbda`` cannot be read as characters while + this configuration is in use. + +.. note:: + ``CONFIG_HIDKBD_NOGETREPORT`` (and the ``CONFIG_USBHOST_ASYNCH`` it needs) + is required. By default the HID keyboard driver asks the keyboard for its + input report over the control pipe with GET_REPORT. Many keyboards accept + that request but always answer with an empty report, and only ever deliver + key data on their interrupt IN endpoint. The symptom is a keyboard that + enumerates as ``/dev/kbda`` and reports no error at all, while no key is + ever seen. With this option the driver reads the interrupt endpoint + instead. + +.. note:: + ``CONFIG_FAT_FORCE_INDIRECT`` is required. Without it the FAT layer reads + whole sectors straight into the caller's buffer, and the SDMMC IDMA cannot + reach the caller's buffer when it lives in external SDRAM. DOOM reads its + lumps into ``malloc()``\ ed memory, and once the internal SRAM regions fill + up those allocations come from SDRAM, so the failure appears part way + through startup rather than immediately:: + + r_init: Init DOOM refresh daemon - [ ]w_read_lump: only read 0 of 5192 on lump 1070 + + Forcing indirect transfers routes every read through the DMA-capable + sector buffer that ``CONFIG_FAT_DMAMEMORY`` allocates, at the cost of one + extra copy per sector. + tone ---- diff --git a/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/linum-stm32h753bi-nxdoom.jpg b/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/linum-stm32h753bi-nxdoom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5145a8ec81b9e4fb146c1dd90181b215275893c7 GIT binary patch literal 111676 zcmb5VWn5Iv`#5}H=}x6XIwd8SrMo*sK|o5nJ6u4J?(SMjloC)Dc5 zub=Z`clL92%yrG2nSJ>Eums>K$|}eL2nfJ`&%-Pr1t5Xo58~q|5)u+J3I+-aGBOGl z8agTl4i+vB4i+{xF8&ijTs&fYY-~a@LgJ?+q@<*{1mu+DB$Q7`NJ$=SJMMH;! zU*iD?aJ3PTk&sc*k&w}lu@L}75E3#z3IQ!QDxrjiDbX{hIAS`Upb@kulA79ipXqtE z-Z;nS7qma+lX3}8_|h@T!2d#8$L#$wqky?9wC0e6Nl?bZZRIE=aSSei;*lQ${Q2jv zzw(igK`5wbaHs@6fQSJ193na*2o(td8IFYj7mtrjOF+o2K_r1f{ESD_)G2R-H;zs+ z2=xh{^XK+MdZ{1wE@%djKW&kV@Tmn7_AAkTy0(D~#fWl3LnqBdI$}NK|Rm5f< zpTk%}%c`SohC^Uf_qCjVsqx<4`YT^NS{Kc%Z-N`Yw8{LBoEvW3C<$}aG96sff87e; zC&ugBk5GuEpx&FQU00reimDKUE!5;fB^-G(6X)n3S{*XVe}>L+{e=CwZ-n$6kU zSp~D}dqs!g2FP@4*W%CT!yanW0r0^~kT~;^h9Q{hVDFOYkMQ@D#ba&ch#hau2Oz37 zLM*uHzW@HkJ?qNYAi)_eRY}48T`S^Q(X0N0E0#s^`Bw7>fINVxKy7|VQSF5MvizI! z^9#wJ8m{$5UuK$uTF*!Xgj}-I>{Q-r1~{|}dtC5?e}8ISEAh8~6=3!NaOXt49%!E0 zeZ9eZq{Z`x%w&aSi{2Bpe7?@?_9Wo}uxz-mzQ-tG>|cRXTc&wF07-ri0KMAA`ljGH z0mpLx5ps$Qg*=kI-q>3U*a_GW zIFj4gTm4H93#!<5UmuUAK5e~X%(7M(*KFMgk?ef{cyIiXe|@{uTRfKbcUXWt>e>p| zbrud9e*k_ttQ6){v7`&;$1R=)lULC=wm0-ZwppCnTLjK;G1I&b;YLQ0xgUFLJOHVS zKdCcPa(@3MD+;X+jAo&y_EaNlLYPc`ohldh<#KWMkYe^f9R)V_HsP9)!!2_^xuL#_ zy44<@sO_#~hgD4yMG2l8v^py;^sfduv|Tj>U_1ah<6*b+-|oBb%>s!0?f<7}3fX9w zJEaPj>g`FxrPj~|bfPY$>wYmvcq#zn=3d@mV0LKtKR>K*oG5a^^mgvA3vU8bYIvsn`hpcT!y5aM9jx*QXb2N*8Da9PisiP(2h=M_BX0T z%bUGh&3m|@H-Eie8ztdDNBaQKWL))%^WZ!H`+0`bw+?%kIBts_t(#|T)EN!`yc_dB z!*pK{D&pdt+`u40c9#!8_}%y|L(ZcIT=wsg9{>o<2=2AjyP?}Ie-@nVZ#cD&-q1BI z-77S6c>tQ~e-0+?;@C#xf(Z}Z1ITauK|hSWe!_EzLFB~y=xgcVMI;)~nF2Vme&_rD0;EuKS;8jf@~UfD&vlWUHu1^4_3p)qBYfZk%4 zJo@`c00IxHqUG>YhiM3WMpKI$f6nz=Cz-c}2~C_vPS6qYm0TI*wkZ&els5WD=3riZ0WS% zZ!94KpQu0oof0q8-0JNieXCa`cXSRrtY#2z|Ejvn#r;;`fK!b4F+_^+5aHi%{>^NM zSO2D9Q^Ykzz&E*}GH}!Tj(o@g-Na-o`Q6l#KTm51ykrSD{A17b-wcOWq)!d%_hZxp z%$50ccPo$shMif5sQW*MRF4F$0uGS>)cIcyS*}!deEAS_k?cFN=W1@E+Idm3)Blg4 zq4U0o?!@~La`ss23QqhFZkQh9Kig6)8lHByhHl+jQ0fsvm;;UqaS{ z7V2&C6GbdY)na-|S!D~;&8N0+ZUK)4je&X#vtc&}p1F^~_=n!~e3F_gYUC2!%E!St zyAsfJiyBjTc$c$QaEI`SV|S|okNf%GV%=pBQ%^v(8);9?cccapHJT_z8=Eb%wEXhrg+w@~`jJQxr4_b@8OYw*H3eEaY!b%aMHf0KEO%)ci1A z?lR!Y>U1{?b*S!^?08cXK4w~V`ShdnAzMZ{yNjz1D+yb+DSro5;As`^W@M_8y!poj z`-dmBnvK{Ocy4^6|;t1th_)!O>_KYsa~|M=DIovE<9dqcgm7n|WKf-UqO15@sY?{t^* z*WEIm=K+sJBzWw7pVeD!KQ*c58-D~F9iQi|YZZ6+j{ne9{-K$4E@|3{nf|i`qCfH1 ziFKzk-GA9g)Xt&a;y&^NN6%&!VmX~jj=*h!r&@)r`|E(-m)ESV*NLc8r)UtX3Qunl%u)S}&4bblzk7l6MVLYx{#P3Lr?r<-|;PIGQ+zR*sAqK}t zMtT$7{k0YO&tD`7Kl1;OVhY$kXK&uB+-gsgY^8(h;}ZX42G77pfuYwg{u9VFQr9~C z0DSOgHCvdCEWqg!pqn5Pfmg(TX+RJ89|H5WaLr#GmA(qDF33xLtV#UO2Gp3pfumO& znaKIeiUk{4{{aYjG{Y>`C9yqrcm28c@cv^dKl6EhbtgY$QhxvOR_aJ$m*0S{Y5UIf z5~h(Euc|)RAiBwXrh)@ss*$ypPs1CgbUJI?1Au!gLG@EJU>U9_i>g+=2Qf}`HtqWk3@D&W6yfrK8Eo6Zx9I1h{!+MZAiCRYkE;d;4x&%JSATa9PG5?YS zv~#bpE&sy?_sc?7vGT_SAHr(MG@1W^z>fc6!q-IqumdA6(w!KUUhk?Hc#Ke^Vbf%| z{bIv(`+YxbXdU$MkE}H<#h5~(PDhkGs20CF!;1D&c`HSBTkXiG#&G}Kuf$k~ojm|f zDzFCOC;Ks+R)$KPl`LbP@%+}TZcnrX?ux0W?tWrQU?!_(rlwWuZtqW}`?!fH6{am0 zP*IhC(~(m#t&waDLD;P8C5w30D%^_(t;diZTA05F_G4y_Z?2?UmGH-0MXK%Xq zRfBAUcBxB_uIJsG^{K|Ss*kWD_Kaf%{V(eNEX13Q#_yQ7QqWPQOA(~xf`1p6#Ct)V zsvEm=F+m9W`$-c|`VF#^U+tT<(N#SqJJTT%;&HVW{-Pmme0;@Dpdcf;g0_5&d#dB{ zRCIlxKD)5UrGH_w@ka_pyszeShF2>(g>x}l4w8HYP!dTYrN}B&7s76xs{1Fi86A^8 zo|2%~LQE_?;vIU97*<<_2uX3}Wc}3I2sL;lgNOs&u`1z>m;xT%+6W&`^*=mAKbDj|2lUq`N-@$VUQBSv(*Hryw z*=h%jOIP$9ay-V}{V}HVrw_nb@7+p_73?nm^#P+PMV?Oj2^}1AKcaIZ-MYZiGNyB* z4F4`+;ogdNy$Rz4hu!Gt?eRPSUQBg5F?Vm_R3=ySYB^%dePL!y^*Z+x&oAQkCUPHu z?*n)1AF0CehhTF;>bn-#lFg6`QwwVrSg%ws};~N`6q3y1(#`|GIj&FLhCP zt-HFceO8qoL#Vex*ZcnXMN3lS<%Hl}JGJ6ms||#v4nx{Ay%o=yy6x)79i1UYIG4}jd$1G!CP zy;G;sTBcQ7U&+JqW;g)8VUr^h%Yi`-3n1PfB}LsFK8SKq{m2=sgA8|{u!v=s-bX;v zG+?Di6D_o!hJN81eyI&t#lC$GV@cG*H5&yyP7?w-+MYXb4d75IznpV--;vX~Rya)C zknrfNIV_~;cjC3Z#N?Bl?@VLy4}j!idZgqlv4$U1Pg33}Z8rwwISjBl3=L8OHxUt% zPUCFPxkVJ!da66!ic-Qv%)VvT^H3jf1%rtV?1!hsvSz7P^mS(K6na%T(NSG8dMLz$a%^YTNFrB{zLXlt}PxOy;UT7eCyB;03vzMbU*MbHwNSs0(1K;X4w8g@n zwm$%)h8veJG!c6z)<4i&Z)^OTrK`?FP{l&BWPkwAh29S{au;N4Ri`Y)L~!wvhdMub z+7MDLi(yKNj*xrqreD8o-?M;j7=uJm2vU>Y8u}I|lw*z9-ikO_m&;~_!;_2xm>j2` z2P+t$vY;QzW6N=y(jnOOpiyvG^7Ena(fvdZWY~!ls$2(z3X-x?^=B4z-}2FSh4Gn~ zLd4Ju${b1M-z<|TLh;EXX<4>1g0;k%*EtDr2#@yHK~h}MqGwiS7l^Uh1ZHSpJa&w+ zr7t)L`WX}ELugnip7QC&9nL6F$7KObMjk>ukRx=LzQYP>CzDJam5s(qRve`0OkhES zk9H`}yOJ%=l|2?ssJV(Bc-BJH#XabcP%{FYT!d$@>MT{3j1?0>~(J|1M88zaH`7Vn~s6x!z<#}+dXetfpE~1|-prNu9 zHKMP*4K!7?bzHACTjt|MO&rGkm_JQz@h0jkCi7OZIFDQe9^7USE?DhCSv z9q}OTXm9$CJ}tC$fFB&*tQPMg(SiD&&ATFsF0t!WF|a+UkYOnPhamdEPCg%)R8ZC# zN^7FdgC{GhNh{AK=qe{Du9Qt6F)U5b!li{3E%_4awiWatFp`J{I8zkWG%2E>K~`8w zL7(+g2cbqdf+z`A(ZsRa`h2_-!yP37jg|CB_9zNdfDuKQUX_AMGn42LgqMQOgBOda zF~X>xiX+S0A!>x_jfCt71E0YoaFt%;`| zTg{Kwj;8#EXoxtD>wSD6KCL433rIZ$0g0X+j*liDiA3L{j6~zbcv(U~=&K1Fs;H_Q ziKA&US#X^(BWS&ZhOh^YjXV#A$e;&8ap_01Q@vQ|5ot-7m62FV@}1;^>C~YNaZ7m6 z)O8wSTE)oX*w8$9e$qGGLN;VPF)Tk?(M>>%sYE$Hfh z;2U`WOahP#ioYo&J%92h#8IXFMAflh)6}kj*?KEZ1fb<2Y!{==25WKm^*_Zyiy+)m zG71I7X1!}e3Wn}*3_8v-WXL%ECX9Iieo)>L1*jMDy?y}HnI3=*_$#U}1=noakWQ^@ zQrlY{htkw_K^)%1aAzlIKbH0ePC1pTt}IP>4Jx6)3h}e62cQt%yG}BzPH%e__mJhj zKLFbt0k@k0#8DMKrIVw6+hnHGl!RYCM~6G>2NHW{l+t zDm3XJ6EbiwoCz}56_|inf;IWg=b_l>fsqW7fH-$zspN+?=M*$_XHhM2G=*$+A@uMF zC<6$J#udnw6&Q&`fDZz-v&iEC(67hhBs+mbj(EaFAm~?d3{g$I=x{k^1OUDFJG!hQ z@RGp+y^&cB5G?GI^pqFXLYP)o%GN{zKru+UYelkLfm9S89bCbh z=F9Nv$7m|TtkHw5u#_~1gO`qwCaW1sV8VzlSD}*6IZGP z4bSc2Gf9N570GMjg>xmLArvx}WQTu6Ba`waVCb{n3PMm;Re+`*K9d?j&6lP{#EU^{ zQ>ItMQ%9ul(4NaxmW&fYZ(+tul_kg{p_1;9UQ3lldZr9_h%&uWd>lJK57sQc%(cRU zGQ^rBP_bydhmPWP4(dcxUs%E8PV9*QYI2GxrFt=~c{0bdO8d;YOHI(|V_tIG zaiE|iFZ2ic?#>g@%#s?GT!y_Lb%jA4gm#6OJNIj7&4ezx;5@sX57RdFP@ zIq-em!EpeP-=hpK2O#rc z#`dj>Qc9De6Xd!*9d8w>O#)2Fo3))~*?Qxt^ z&@%y3eomf1%4S-=Tt|XcI%dGETI-vZA(xlxsW^@#DhN#+Q4OgekqXfYg~;TJLEMpo z5fT2qOy0%aXSMkgU=iPnLkHHN%cSzF9e5~f>yeHG!KoujSs0qBWAR$CTuMuEpfY9D zOZs&-S?4V1Fvh4iUS|4&RxBb>xT0z)0Ajh3CEzb4S_9_Hpq>n1MQPyuPgaeUM6BXK zdyJRV^tVWiD58uNQ1ikWQFRbrA|gR9N(n8z_ox%>iGzfTzyvr132{&Wmk1VUDoB9@ zl&Wwt<@0tk10LGrjq-s=A*2$_2!wLlYbG=Z@R9^9B8{(w!$m&@2)75ti@nDIZ7{gH*%~&~C-CY{dcSq67u) z06%HROGhnvTHqNT6re?uz%PZ{3-6XTfYu0KkpdL>paeCA0~62?;H4E0l-jWx$x%Qk z?b*$S;@)GhyXtQJf5{{#q_}`C5A6pfWb~PAWeyercH*es@bpnyo-h3)f1g@D zE_6VCgc0TiU$$WkT@{(_-0$$a=6I#E^uqdw$n)PPepOkgC;&L|Bk9q5+GvzA=_R@3 zU*?J+Fa_IK8SsFzHPFPKqR`KLI9g5sVXW1H?#OL7*vKTUAYrPO2(ZC zLygcTkgSP=?lMMWXnO7hnW&9+I9lzbW-nysAxh@Kg9O4Q!og5=jswgG)p4GP=J1(c zB_br^IVZhA%`T@AgXLlsDrylTT$0Ee;x{vkA2Jf`p-Cb!%W7Iq(2A8JXe^}@T+(=A z6|fMx3~9%P;lR|ShrM=E#9)E&f>gK+Jd@PS0~j?6pzq57gmpoz#1G;KfCc|^7J@c( zs3ir%Afc~1BR`s?BoS7js{M=N>{0}TK1m+UxV2y|$3SxE2YETLRvQ9(v?zm+icp_8 zH-ZR-t1=i5k+9Fk*~Sx)m(->M_|X-mO$_i7(-bx75aQq~Fxst1G-+D2HuS{sIeO-{ z$JH27AXi3WsW^I~#WQ$arUlTsl4!RA@lo^PT^tYOs}m2|Fu02?&-NPmjUC<5KjBhKLd2*JZ#DaWQ?-`7|K=7fxyU7< z6bjSVee@PeaK?Zx`QjOt>{EB|Jz(D4FSLgjylgCo1yI#dh%KCm? zrw5>!W!;0Chk+i{_mVBsFXhkE6#ja}UokklCGc)I@K*SDIb^5L%lPL&jB~uuR*JRW z+jE_Yex)>%N*d1#3)|l5$?^!5m@j%D_$&3rV4mif461cG+i&sZX3gLUb{cXH53pF# zVleged1)l}x#CE6TF7Fsm(nkx&->b=OIK_LyEodkmRpLy0(w1`J~vC*a2aai0R)o(8ARiy6cEFsFH*9 zY~C-cCD3e2HIfKPF1i&jb%u>9kL`>v7O*+pcHS#;CI;z*xhOEoK3T4x+iLN1MJBO61Vs~#L( z7*CEBeaTnwdne4$E8wfvI=742TwBIUJvhFEdjI$Va4b$Y=+=KF#=#=|j#&SKd!5z* zoLKFD2ydqWuptkE(wriB_U>(5;EM5pGlry~fwCGTUv4hl z%ztb@;ShaEFfJT@g^3z5!J5+0U%mq_f@TRi&|=FnpYz3Eh8JgO8uBa>m4LjCk+51$ z-Cu^piGuGomQ)H?I+f*yGUkiF0{8)VB0`Pyo{?uPJ|iRr2TbO#(EL)k_BH}J?t|(Y zoQ?d9+BDK#4?-$@>sIY;ve}Q!iTeTaELr^RXaX_>m1!RGECJ_E>zKL6f~0Mo)wqNb zw5u6DH0;x1}DQE#k3}vFV zui{wkvKY<;J=m+F<(RT0i-9_$vg>agPV6p`^Ga@hm3Vwp$Kgq0O4q4xBF#+zj)P-G zsLGibjOFNbf<%c72>CwmM3M+ zbobA`Yc46zU4_Vv&jyIFz4xVOqyF0kZhnP}OFjV!gy9m6)6(WGpd&Cm!=s(YOHV36 zO$2rm%@gOKxq*Sa?e~YBJ5O8qu!%)(=&HY0c4jG#I(ld81(`rzjtaG7{!Z63tY4hg z2~MlLm<3`kl5}@oa{pe}%bT#ti>hsmS2l61+nbP-O_sllq(s+HH*#p0RbtI``XIPQ zu^Ez{J?&9K`D@=^PVOhm2WcA7D=>g9~znQ7syv3<0D5rG_?)E8Xk5Iom! zdct&jUkF5lmgS~1USv1>aF@<1#J?bnC3q)2p_8v)%we928ms%_OEKDc!bOPHFCJ;G z^JY3aWLaJ5f#|p@ayb%YzV3Pqi~ahRY5a;X_uZu!{t}DHFS@b4Gv|;zQeBalFXOX0 zYRovCTQI&@2^Ak#oEVzsvQ_r{J*t;^;T-(~_3I*KA88U-R4EXQ1Xyimc={&4Ccp1N zmYZHFv~#g18e)iC{xzsGYO11VM}Q7Wzpp&PEH;vPkrMaGE?^YTBaJ35mM8&c8Nv9q zdZ}`j7@L8C(~{20svT6q#<8%BL==;?ZxS9wZ~0S>JwC#!*hZ-6+_BH&tGpV(WME~l zTwo{jGHhWxIG?sTV;>fcmO7u|(LiNjj6tV%svb=3t&3x*We26n@S>%C%FLR*^Wj1w znqm=|^tFF%kM$CHK;=dSPU~p9LweS4-aQU1rtYQ2iH&?4UG%ayl)GWr``zfUT7?cV zjdC;K5G#aFQ+2~7V2JKHi=>(nimv7bts8hYc@qaUa_ z%M{;jjC?Aw*P49Ex<$$6m!FZsCsMA^#wy!1OaHm)t(sE&85!sIk(*O`P!mJTB* zGeF)_kagRp>RR@r&v`fssO{uPVJq?C^Z33xxXn-+gFf-UbiU(2m_=dT)(D{wgfJTOI@~mTb2d(sD8<6^cUTa;qCH5}7)sF4I z`_rY@aFWQ|B!Bk3qbz+rZ>NT~T!V^e>@fcn`C^$#B=B%y)iTT5)SeAgWG5RMq zFSIr~-jBEyxqljeX0Yz7{$o>iMx)J=-i^`|LE8w+Y5ZNV5S^{jV6WnJc3PfRR#Rqt z=XOKfajT+h(@3Lh#Q_89bDv_~WAIDzcOVBB)I0dwDf+G#Azu>aH8VXu%no1am_^f? zmclq)jZYVOd{m^DUAoq5GNb=F6KP&M;eDB8mZ;BzE`)J_33<`WRVMB?0*0z zs8Xt)l%-xMAk$zU?RPIF4_MdEucV!73=dG?PQREGU>6)x_Imz88$&qUda0;UhhXbt z(RFw9-t_iV_7ie&$Fj+QU%df2i@Pyhp*!UPPJx(G)=)v>1dFhf${jWsW8v6?TW@M~ zDS$pkVX{*}f)I8eQRvCBKw&*Syh%kB!8*dBnlnW(yy;(zI(5hTNxc(|MrQnhbU#EwY&ID@KuP261ojV zY5(jX5#)I9RBYn8EI+F@18bCX{1ER0Ky|qJj0=} zr1$xDYQ$ME8uxp(aeUhDU0_}F8sA~y6#ltd^Ms4)@R{q3>Y&5%XfMA};eI||;N+(5 zhxvqr9`*S`z4`KH_G?Y=MiYJ=zA+^V9Cj<0YE|GB6>)6@KXX^Ysv8yAuHQ4Nus;I2 z7q0uQLBed@@$)K_;8R1zvNuOobsqjCB_AQ@+7@;xis&~71(jH)Z5Melhp+tnI<~Rt z?+1JvYvpSBJob1!>F$;955&3+pHwwGvw@)@h@-^)=jFLfLG__oo zD_S2ummPVb*vwFtj0oPQ4`z2AiVrEt9gFYk!iHF}&yl0RTk>3lGVn#br!E-m9rJtLg=K@I==$p-3o55+x9An}YMGHi*_o)J`uah1 zrrbEEAIZe3t=&#peC3d*v-KOw{wUeF&l)3S*UiM~tZ$DNgtKXQk7lRDFfn&$WUD^# zh!CfYEDSw`G&-qhcr@8O?Y9m+a5Pu;Xq4@pBU{07iH;z^X#VpC7My(K>`){9a*0tC zf5KtAi2<|Rb1I45GH=z7VXTe~v(d=#^=4R==8i|PwaW7+@}CVTmj^^G?|0HZN?ND8 z^Uk;qWPM-inO7rO9U^)8TxN&E?A^rq((F$eZ8uIUU!CXAtw;x*E;tYD-Hc~v?A=a0 zVtAHtQDSJGrk=*{56PF45fn7PIHi{1&&U!kE^-P;ElwtoarWfXsWMPeO|EHqwpZa* z@D_Jp)3yE%+emp+rtqC_WTYnVp#p5zX<|&;Ab3g020HfQLPqomBN$Un=ugNA#)X!P zy$Id(a2~46TciAWxwj+mZA~(m*n+1yep$A&yVt6{=oBjOrZ0-l(pHV8C8^9oX?U=| z@QY5*FS}WCqj6ZqUgCI9n{0QaX#q?_kI=`wV!4r&3OZ85{e_a&lEXui#V~UZAusj7 zN5N2x>KF0#kd?Xn)_PfNJr{SK)$5Y{BItzZJFDeyrCr}n#uG~FyO~?ID+v|!d+0`z zQ&N_I8533KLKeO!AMILa7)RW5oicp{hkE6$r#gMc{dO%rVI`2~EcZ1}Xtk?o8e}cB zU}%04Tgy`lcVl+FrmhKR4pBO_%gbnNFCo=P*xDZ``5Iy6YEfF7Q@4A|mRwPqo1Ysh zNV_N+M*fDh`=^#w6}RRNtBnmzoDdR=J56$=%3l&)c;)HY8@f8}4_%;CE3m_{jF~Vs z^LTrWHEQ=ZtakqhJfhniwGk14x5`U_-sPOX!!OM^&$gY<6U*iEIcY>Mn>!)lU1;&{ zMNLZe4?dN=QJhw7wd)H0>!&qkAo8+W23UntmrueaOv%FWo!=j`q%R_+-Lzux^LU?e zUA@tfS}r`pZS%n;F#bS_V?S3wP4tjuL-rp@L$X&0ru*`%1LFPD$C zA~94)>+gHm)+6Hc8tQ$Nrsw&8@OPeu5^O4XW!a9Y`}ebfYO;ULx^oZZ?Y%Smiag** z{Zm=$H~hMx3m3TQ$yCEH{>6xT8#cN!n0{9miJTfwMY?}KbDiwAeZesI+JOWg1IcGG9Jt;Bk*=T6fWUtkr&R0|T+1>dMzXN(6=cDW?qI$_(Q;)tYYK5{%%Q2D<6@kNMov!)lE! zRqIDi9?!MevpC=AM%H6m;Esmc7K4mm##lRS@Fw9cW8xB8mx4x=S1WH>{!QkBf1e0B zu}X26?C968OO0RpgYFqNhWc=o^j%|YRwhcU3}j??NZ#)2uZTO%C-gG4J=f5h%WIgo zp4Q-%dK=4!b&S9^NS#Cx+dCU=8Y_zF3ZlD@|8A+PnV_u5$s>n<$4*mtM{iQTsV<2Z zh(yaQN`r*n%fl51a3b193p4a6gB1aBA!PmObMixsufj1ApBt{~Z;9_93l>VPZh$xf z2>$-lj*d$*BQR5w5v18rg}(eucS$6XhMwi4B!O0}9GWqy@fqhN6aH@oQQsrSgiB-+pTm7$-Gc-Qg;wg!)HP<;)4VjO|YCz?u62hIy_ws_;5PlEy zNt-y518~wO+wabL5xLZT21DDpE8iEV>t0r$>zGA~xLXIdUnZ#@%nOc3E1^WUzKF;= zFYB1>84Khc6ve1%5nNB8w-jRyQ+pe2G&k|d(nCzp^LR+c1XkLlp)N;{P0;Woz9xOw zrM=Pj0OtC=OP;#HPGoLW6b*Bre!Gt0L_Q)<&acQXTyVJsyL`W`5PUt8!QLxJXs-V)qPmH_9Jg1P~X>(67allyk$ zU!I@3D9H^a`K{qNr!bMs$t@&&F8EDg`zx1cU`73mF<}` z6eT;#S^3lyb1$ehyBv99?YVs(MEqTOBzCw)YkP5jFI?3JBl<)Sl^Kum8F@NfNoI{jV zFd+Euypzd&4(HUIdZCHUrWiHFg8M}A*xBh&a%}6I8VAQiL_{H@g+M>(Kpck#7k-^f zO01?vTXx4sFnnoEg`Ddkh^8vDTi$C<+t^nvT4h=gtg*90WfiOp>#b~7@a@J^U6OsV z7IdrCRkSCD7D`+0e(%BG&2jg~dsTyjgRaC@sXhledC}d%g2cmDf(q$WZK75L7q{_~ z2FypR?48{?`kJj55`l*|m2MVzwhn`kLHor{z0lhF`;zXmFYS(T+1oDFq7jRBKV#lf zoD8KYO^o}Xh*@Z=$j!`J7fjoh$0pxZ<1F7yg539Hi#^5_EGnF=NX^paJr0ZsLaVZ> z!Nr;`V@}dZA`;vxkzQ0V@A{ZGq7dG+iI;U3)ndYx{Cq+CgQK0vw*)hs>DguLl;D|e z1_nMyL60g^ildN`9Fda9Fu{Zv&ZSRX*dxy#$53+CcY zQqAO>{ADfm0#Tf*{8Tnbm3PbCdviNd_$)KBLb zxt3}+tg(|kizTaYwfN~)tL#qGj2%YODB-Fi7Vf=AKMWgV!W)o_tSY9Pk zOx>Ap!RI{zySlmkmQHL}=jJAYpZdd?j>cnDm?sV;8MY0O7crwPVe_l%LFLd0!z>-S zIgNC$42tX#G)f#nWdF1=3$$rXl>qoThP1!lvS3r{QEb`}n?f+%3wAR4-e6Cs^jw zs~HyOUa3C@gqc(3CYPUvyju&e>qKThXjZM{FFYN-6Da;|RTlD{EIBSA(JbYRJ-wq- z&TO2!(;;i~d&#>t2&qU-!cCH4bt<`z{I-1LJMKuoPXwR7mus|e1Xz?hV7>Toa`CmS zsQpy6N!RB`T~J7d9MWpi`2!%eU%t3aWcyOIw{rUMKxJ#Vda7)sK9qL0ep53&QR#|P zfpJbyQ+eOFd9*?}J1y}VQRwB|T2M@+g-LZc`(ixr9~+kDZDdLX{A>>dwy#>>3&xb5 zTBr{o(Gc=^QJ3!v`SSE(UmH_D0CZxT<;F}~S@HqrpU*}2cVfXwbymqN(2#h)LDL*u2uZrL~Pv=1lD}-w5{$$G!}lUIHogap_`@BS+_%q zdUcFqEb4#n#t&U}Yj3fvxMqz&QNGn$B87Rgwv-Sm&CF|oim#I2iZtET2r+STiHA9tXb4Dqox>;@%pmiG3m6oUZ6=q4!@Wlu2)3~0? z*Tu|5`<;33%w;>~P$F}viD3#TS1cFtWYaUdUhD0u6SFpE4RQ{2-y@#vnvwTd4LaRS z8ra##Z>p)OQH>C;IKi(FQwQIXJISc_ZhpeOp-y!jkkOi;rP%v*m+WZlV^^a&e(rgq zBa*+rGfQt;!O0`aeQA&S6Y|XaYp{n%#FHvj3B++|MRjfK6<@VM-}q|KkLlI*m3 z1HyX2qi!+yA64YI-DITM-S|ZZ*=IB3c{9DsD}7k7E9S_Rd!)L*Kk*+5>`o7hMq{ei z5*k>Yp^(z6ERxMZc~;#-&2;wd&v??0Nh6==(ZnQF&DoN;whs%FwFpa1*i*HnwJm?l zwFl!B0^_P?V}-g|8w<8&WMPHjmF?%D4*>Cawn~*Hk6=25QPz5H_V=eboEjH^GqpF1ulj>yE+PWEb0xDoNADEpa!V5f$!_YkMB&eTGKs|0#p)Z)kErnhF? z8PPuz+iPh?oJv3Adyl(67qH%N`0DwD_M&F6ovVdSMqSB>mJDdSi01$YhhvkN_vV?GyN2a?JTJ zik`Ti+!xz16$<8KB8&&^-t4*Rm+sIN7Tdmw*ORArk=^U=6x!}cEZsW~C_omi^>him zp3m~9D32>{=o&py0A-E8(p0(ceOeT32UGS|R zLp5^KQAFCYkx7s{qo{Q+7~1bSr(6D*Db1v3VyNii-tOBXkdwUZ52^p~?IZyN zK~7I*^$=KW(73XM^UNt{;f#uZX*{UvBRlrlm?4{6y+eP=!)|c(kj+1#p4G^&vKn0F z3k~k2j9lGlvbC~;zc*-sZVqPU1do4x5ef|5CMXF6as)#>F6e9fRL;m<{4K;B`Y`Bp zFpY7WN!FAibB>r|`Xs-}u2{pMQXkr^+b?hWe2A2XjtdVyPbL;6_)oyqlDS2Y^`~3H(WDHglPShzIM^ zoY;QAM>&&zF0R*`qJTwBJ5}%40E-S?J=VmERML?|5`~daP5J>q>Ks9oWK3KO;p;?X zqZ10xnZ~HEs03t(MT3XO?lv@=E~LAgplcJKpS~9rB^2*)<_ZOIg`O$;s<*F3=8J@% z3Rw3HA`*<9Z7+pPXL7mQ`IVQtB_|broqgkD@@_CvXqA)>GXo)n|1GwM>9|7|uhFxx zj#1bvJ^UzxGpmy(-5e!VXl3cmX9rRuS5?vuae^w8PwHxK-njUx)7hj(U$uyqsTR}h zl+C#w5KpGQksS3|2}e^ z&rvHDe&q-x{~9R>jUt!FGK^|?Xb*YsJEHyMehS_Hof#XK>oRd zwTKMZ((D}3VgZ~fVwu9A-F%^{#hKjr8jPR0yxbk;)}yHsx4{986-|_h{`lL3yY9f% zAKN21YyTL*R@Z)0@aOWE?>?n|97ucnSroF6O?_cbrlKD3!X0tl_eI>KWboRb_Kq|vO6?1bh)SPQX&whZ^)&h_}zZm=jvgJE?qE3 z#X-gPmK=;ZM@r-G%N1`YLf3G^8$EK}?~DBO1J&^>c}#DCpX{bbJruZQl}#i1Q-bfD zX4eRL!7S~#W-aJT1{}Zs9{|okF~5s{9SU@ma24xh%t;0M#Q%x+#J3?zFlRhfNOGg(}V;E#>tdg*NHnDmC0JRG(MJ@K0 z7@3yS*EO<%`XKH6SLJ)#zAZxGCH&0&G`O7`X}7Y9Ci`5Xf?m=oXr^}7vM3%w9YF+t zqKc@gvQgUVZ4_~lQzU`SXd|HDoOuj|X6>pbx3rm@$hXeg2pt#puLW=+lF4af;i^C&j%Y^b+e=*6LTOJW_8bRP2J^ zB{yd>I(NqAR7>A50gQ2ue(;XXsV*m3Uh1x5BNT!j?d=?p3Cf<(v<;`y54S{1+e-a_ z`RA1EFNmtH&0;g zE~Xy#SYz*;=Val#d&hF01!WiKbhXsAqER$%ER~PTW*GZGj;eEB*(ASfs?kwK9N1p? zTILLJ9`D6-`RK2fi`_L11;2C%&r`CN2U==Ah^3@|(v64# z9@z)l0Q?RzyN;aGu4iKQS{A>*sHS9{*l5Gvcf0JB%6mtqsrGwCRb`T@nqQ>jZ?rhK zx;PHN#&ebOoo?zCwF>nh{h2n=_Ps8QsYcooTg63w#xB^QZ|4Ppq=4sH;m5BfP~Bw| z^i|SK$9IGcbRo!}7+A1L4QX zevtGcptOqa~XOsEwh?`?0HryS)_bViZ>am8QuoQIodj|i`bnbo!Z57 z#yhv$o*ADP0f%GP%|_|US50J~xXUFuo@h4+;~cOaqxdT)WE39H+B9-Hp_|`LSBQsE z)1ThIMfy#sFI8N((M6w~{RO?^*XUDSRI&cQgO<%rHD_wqXrU%I{TCZVhr{a%^oX`j z?$2bclYT`m!@I|80MG7Rm$KRjFCDVqW2Yp5wg;-r^ZWiQzBZ8a3pY1^gJI*7Z&BOKN--tgxfgje1v z;ngB5iKmexPBYRFv7w7xdAo(JCGd>7|EJ6^AEbx!6U`j&p@=qtqv*3+dY zw3ZJsQR<31&dn+$?pqV7_OKJ?Nh-~*^z>G~%Jj|R*+V;OKy^&BQ^rU+7|e&ja-(Z> zl{A*AXw5t{#!Nm|#xOEEe-+qt#k#in*ljhwvuxAL0faT~{|%IT++;_>zW0Epoi8`8swYJ`;6p#V)uaa>Mbe!_>H9r<5U^3L zPA%m{J>PA=`6l!Q&9!}_TIp!%*)Mxo+`W$619?6RrR&KbL#V0g8sf&u0g(Fp#4dZ; zHlL%?eW%&!B9y$JTa?!7iO&3CzN$i&f$U>Pbqhy}-S&!yEdK@71sxVIh&y*eZ(z$IfhbvR5A z)404J(N7YF^*ng2vBKk>yrhyinU_x^SUi++GgwJWB&5U$KA~g<$CJ=`txB7XG!1iL zZt^-gYPMUYYfGbX3?2bI5=fQycgPML6CDF#X)l|1+^|v7RYvDLki(9-%E;<>zFf^z z=Qqm}NPjtJ@&DQBjQ$f!YZWLV8 zR#iA;z2m_;J6%MCm*fN{i6xISG}@N9$a}KZGCkiaal{--n^bVg)6h2t!m6?nUM(Nh_DW%ga!z|qM?c` zi2m}o><`&jBUvMX85^;~IQ{9bd%+HI%G%S6s&!n?mwq7RzP(9P zbEdUYy0Mc9Huz-ep-<>!Qh&y){$nSC262?oN_I{#kz^B@;+i_A4iE<2 zF!$T>3X7;u{{TuWN0fvs-8b`%_=Q5h{{ZPdaq;g;$JPDRYUw`nBa>3+l#9=sqU9nG zfCQkVLIybr0#pJ4%1|(o87Ky3r_Z&=kJby@x+{14Ca^j)gY4jb^1MY%PqfGVpuM}J z=q9S{k56oQjEDhi$AQUJZhg~~-V4RFhsGLR&N))O_j244FsoME71D|`Q!Umx$>(5Z zI9ivTO6o$$9Zc|FkX@dbS&ZPM{E6GttQIP%vP&HqYp}fgWRz2Ok0n@fWM25*?pJE2 zxp($yL8Xz92e#>)1g{gZaIfJNx2<5hV2yNad7l-@lx?u zyJ6cPb5}Z*rh<3HZm4UX4=}rv_bF?Ah0QH!#(Y9y4SzB) zJK`3tEksf~E%RH>a3cUDGZ2ap?1&liSsUE6{{Xwje&h~1Ck$a35XZv=j>&>N{1Q(` zO)OvtnA81GvJR<3a!?`~TR!I!zzS%#N*YE0Q@av(c~2l$U2CXrNO>zHG<8ve_LH89 zd9dK*Cx#H1inPa3$2sD z_@&_EhGl5g-znp!IAiyofz86XnkcYAV{m+MqATrCnHpw|uW0FznrK8#mg^OKZjWZ! z8Oa@0mfa+5W0>X*#Pw9|pGRtjHV8u^ouDf`4%tvM*D3_s*poB8pzS;?B3B3QaV2DS zHj{;qX)N3V2xI1J)fY<}i%A7pJ2ZQw*3N@(yeVFHe3f<2Yh!kN6`!(DC+#9|ImILY z0Ek&y)TJ9bjdnD2$HQGqJq~f(+@^!I$!3z=>b~wcT^>5L_hC~tE#e9rJrpdWd(Bqa z_BHzpNysPnE63#vb9{ZbOKGC1d{suCCjE@GZeYPAu6uQ})m`mus<=xZv{F)-i(28e z=Opg*J$PSC()}p2w9#$&rJ2SHZ=MgEYMzPQ>Kfy(IAWg`bCCrFX9bx43VXMTxvW|zvs$>BB$Ak+je-%m#Fod# z6y3u|U-hPxWj%GZ)N&n?M*7B>_MO4m`33pf?&5B>O7q)^xBH)X-R}B%D#I&oFp4(PNXmBA#Mna}g628jqOD!7M{&G%#Aq#d zH`2D6h6yAMjjs+aE*R(Fv1$E3Ypi^1tC95;kWSYZmg8fG1I2T;o8&Gxxn053sIZIo zWi*wP`a-sfy~0YGdG<*0`dnpLw417Co>&cAWr=~iA@1;Fj zUNSn3fp2J9Mn6zo9~>Kv_EuK4@J(=-2=+8% z-##gqjVoU*g1VuSHO^r$2o47%WBpd$I+3S{wnfo$f|5k$iiT->IMQ{d7rFJF=F_`| zoVfo0qURmEM^_%6woNpB)Bc!;Aao-SU6-@_M3eR{W7Cy$$whadW46iN)m5P?QK;h?H`l4w-ucC)TV|O7 z+OwTU+Gdi1M(>UKYrNTxG9Cthda6h4F44_vYndBurNz$2UFBZ;ZL!teJ4eyb({5~$ zX}5Q|_i#6~fBA*UDr)Jp=8n49%yQ2yL5-4C_%{ySoP0Q6c=Q+2%PKm3D=Lo?k4NQ$ z;QpQZ8+WN*y+(wxn_GP{ztOYPx)z#>U&&&Mpw22Og%sJ5y&N|?m9^U~J1M&kk;Xw7 zlA;y|d1oX2RvyhAM^pI}!s;`+5k)@NdHe2LUzAg+Y5xEx4b=|}Z?sc8b~Dab%(VH? zm!(m?&$G;LKh*ja>#Fo=TF2hu$Jq0}p0_rZN?Sbr;~h-_V`>Yyco@p*9hF;M9=NvD z0?8nfmbHzT4jx9)kGQT)Jo=6H8#bY&4YWkqb_$A^+c=+oFm?l;fc0HtvKvG+-K*Ke z6?0VYwN}0I9JV((&y3_Vqk5I~e@wkEw02c(t>wijENpzU(7!=-DmsllPVd-JdB@Lx z$pP40w6pf5s%;gW+;PuO6Bzt$aXsnC1$LXH?w>$i>6&ER$ft>$&m=Xj1Nbf#*|x6J z7QJzMwarN+cc`Q?iiWk)2^+laXlMr*UWxiL<9E{)mDO}+kXGHI9;pL}}U@@W#t6v`p7c?>DcPpDS{%*-cY?x5ZIg zQuoqSvBSHQYhAhH?F@1iy2+t_m$lhGmWA;94Y*VLIFlRQyCK_w;3H9XcFI>$*I4ax ziCIw_+q{y^hNcGIqa%=(M%{ z9bH#ua*JdJY2=y*M$y;pj#TGr52d%*EVVO62zACLIfQk~9m0{-J&da+EIPI&hDhcs%Vi6|~;bPgzF`D&lYi$lpb6?9M4EyEnDENjt|e zt|i`oSmij{TQAY=o~qX*^=>0{Vdrza%Fwse8)sn#^G^_KqGsU2H~`I$;8%T8;;m{? zP}$_vw~Q!Bx973R_19;OmsB~_GW!(W&$Njtey?-)IP>OJPT@~gr?jyz`@`0hXT;&X*eFQSU-|ojp1GxReh3~X4?GM&^)NSDSV50v3c6dEo(9cnNH&)t< za;o1GYj=$FL_cTtNoqS^uw5!@A(9wo?qg(QsUVPZ_bcydk&1m~Zto?SJK0UfTxjE|bZu$(oAyc06{EJM$p*HxY>2;gBe@># zzq5Mt^%YuEeI?r%D%A22;9c)}6(HJ%7|V8+lj7c?M$-aVHw+c9*z)fsp0I9Zfryy_ z6U^bC(knBDdL(N$gM{w|BqI}j*)xE$?rXD=kAh8z4f0YVg=Ii%OmVfq`IV_P991(1 z%=h4U1)ce0NdT16_}a|K@WOlwTOvlhw%S56&Hn%bq$6xF(Y2AZG!Ck}TX~P$A4vs6 z3&(>_N`Z5(*G5TA-&9k`)0RD_0HYw5OQiLb@yZF1ZO=i~X;xpYROB^&zVNprw9~g41pHK{(T<6ygTgX2Haco(;Vr>wJ|Pd- z4j6(~F75fwd zESirlAo#7FJu{=PaeHMg4$ks89C$5ig2>`_=^8vbt*tc_xs}eCNx0>#CyZfcYI)_N zQ7k%#Qrcj)#Oj*Z;x6gAzz^QJZnmtt%{3^s)6B^pc&OWkw0In=O{U37U2&SC?F~I+ z$@gKMq0AouRE^}%P+Lg)LESeP4IE)%Ci)#+HI61}Y0C>P6b%;{pHy%&zov1@^M~av zK~F*3EKpN4F~3H@a0m9k1?vlZe#uHO-tX?h^55l4xBaryIgZJ7uAHCos}?Qsv~-MO zv4e)5sS=cnQ0{>UOMrqRCitfw0%`znf@*hyY5+2td{9yz0sv?^AbP7$=#PL^QPg}@ zsPG0nmX4qAGNs?TgvTinp1h!RTOLMmB*IiBfEsv1M<_liSeoi5(A=iZ>>ng2KnOWL zNL`u6DKhnI+VGk+BZIxDo-@G1QaYG1Eg{J=V_nOMSj zQNd_b_M9dsHWl z+}awa9gWz?lpVC)Jh>~wQ4gNtm%GN(<;tL2p2+(~s3uIv9PmKsR*j4tYT=wEw6JuEDQ%PG(uSA* zvqlQgt+vri7y-q^9uJ87)+SXqX~<7(@w|PYKJ~mb&3NjnE%|GUrHpiUhzfR!_XL9y z%G?zjvN;)pf;`rQ)~JJwkdoJR;P8OSausx^>`u}aMpZ-oBULJzu1I9==VsCR-UUlT zD3oQ6A94Vn_P9sbS5McyZWCEsOi3N+P|az<&OS** zO+5e~a(EU=!BYr%3M_)kMo47ta2X65`X_JHP4~)ci9x_K&4{kG3UF4-K430+<0SHNkQGI1pE~XE3 zt=*1BQ(0RJnphuw`-dOwVk-$t7W8RMLk4R%x>lfV`~m^ z^9sFRW3*BlP}@u76*U5#tfq;%Yp_mT>B8`SDluC~_7>KXt4T`*jP{GCD|AhgpXg~W zH%omiaR%1Y5fF1g1>5<-_i_kPH9EUdYFl+|vRwO$P}ZMfiQuzu0}VLI=anr%NkKtE zAax-Q&I=@H;CPHEx?L+lL#yiUY&8NIh;%e9BX0wc*8cUF)h9P5_hy9)9$q%din2;e zW~!PO)5BR?B|Jbq{J6KBqmR8xQ#9J?BDy-u3tc?TiQ+b#``J5>$!uI9wA|`wC60oj zl@t=TcTCuTGLO{Hi5TdnX(_92w?-eM?hT~ILrX9Nv&KexB`TET)$Cg0a86R#vG#RZ z>glgdH0_Cy$k5z$aNCljJ1^9*-Sw`Zwo}jwcxdB{#~>%`Go9GasG@0GXo2b*~RBgPc_EUWPbOO=%ge9GEO)}8BxRFTbP`hmo+NzJ)R4l-IiS|T{TV0 zpl+(FbDA-emlAppg4U_4d=E9Y>wmPtSbd@IaV^^6$3G=8W7RrSSVDf6w$nPgp9Suk zCb_I2{cd^m~x6YifC zB|WSE0HiTpnGe`=NjrV#f%++>pKFJ5+~Y<|4|GK8ni#chWLk!mtctD%nl~~-v=(H! z-F$O}PJd=pwKNk;Kq0R+BX_b)Kn)!ZG0&>%wOV{?X7^$VC@I7H*GO62xy}dd;P?<$ z(U!xeZ6a%Rtj|#n)(K&QcKyd01a%&(ylPZ}#1WqAQH(et9KPL()q>L=mi(1!tp*Qd z5Yp5J#PNdMxyQ%uQvIb`&Z6v=ii(<%wZ+oHd#<41c;mw=o!Y(D<5}6Y{nuyG(#7mg z?wZ;8F2|8ldTRA|w9rLWMNl~Imi1DQ)!ma zX_{!es(LDj!y|KJaF7FzocLu;Xo_drZ?e_hp4n!By94k8S{yn8I`}J;)}1-1Y|vHD zNl!^pP#ZIz=7#b|O!=y%R*${V+^3=GkOCZ0^HaPXpcS zf#c$^w%avK(KePg3MQPF%a+NXA9o4%LvXcQeS-N=>iVbD$XNPVjE!t=dDzlG>IYTI zHuGrgh zerojF8!8{0l`SKvcI1iAJG?k5w|v(+OS8%c(P^73QdELJld*<2l6rfuE#$s=Ye%D}s6>PaiYI`}Mo%G^jBZ5I0e%!kNj(#hT z+H~fp*4H|1RobkL?y03Fn#MMmoIxR_$7m-YuDLb-&3U&+W{yWwNgJBr(!$07!_YYJ zy2_n6tWJJLTxivY47heos#IKVlyyQ%dk~fL5hShe+TQGp40F{+-mH^Q{!2H8Nb|lb zNhA)&c@l0`imO%Prux|#BydvfaW0JR4>{oS790IFSN{N`mD+~7uXM(p?R4A@JI|8g z2-2%1#VwOB-drV4JRNd~&dzG8b+=%qOQG*B8J}Tr+Cgs&KfEfdspG4+`yI9iZe>8E zm8UKyP(X9Cd@@I(I|R92=&sdv-Ago2Wb6#4b6($jk;Vs371u}F!*!kR?P29D_HBOe*a-kxGKlK4E-Gj7c$D)RqsN2_dDZEIjUQ?}7F`DYPIlhk5vFX0p^qkg;*_%&Qa}mi2 zdx$w>xxp)q{Uw8Ksl{+K#Gas)x005e)-7&DTa{{V;pCt*^>Bmug)+;7)y> zP;vdBy(};MUZ+k~WZaV2$+@?Mr7j9lNiv%Yqhuw;!E8qO-rdb`AyZ(w!2?T3kmJOH zw}r+o=oULU@CADm-(wercP%^E2igfv(-WPzXUi(0`;3x8?%+I-v5|0^Ho5aTg!-v0 z_9L-u_NW*Ll2(U#611hgKqh<;faw}D!h-rVNi!vp&vTeK_lntym9diG-cM8Jo>>;g zzM}706XT{n&nb5fcOZn>EgsSs`;}wN%>$Ma0Y3n?TNoMSkG&fYT$L=m0ybi`P_d#@ zwbBpLTTs%LyCuydz=aw&4CTb-BcAb}ecv>bWQpG8yMEC5rtNETHxHVC5;*>wzG;r$ ze@)*sV1^0VBV*cq>>rBPY;v{xM4+@NM>)+uY2P%*RI)6G&4Z5@B+$}Dlw)oQ3k;F5 z=abXbRo!xpjxFz;PBX&A^puZ`y@me(c}*rup=}sE0zUGT20J-(N8YHys=jwPIj@bQ zr@XbGqOCO&O)XT1aKHeOgkg-e)lW?&QHp5`K=B8KsC5OZ8U2zPfh2?UMpOW`20Y2$ z%eeWtm6|$O<8gMuzxA+|1%r3#i;VXtMNdHC0RI4rNLVEo$twVC>}5W3N9lai;tq_G z(}dR(xRB>_>Z67=v5KnJ`kC1*wK8SDqq~J;(^1JAoWUH1F~;ojehRfC-;9SJnzd-^ zcCu!;)MiJ&b`Ky0nW}!8Cc2YjPfE&>>;>X}y!2a@7Q2l#0hYQp7XiTos+gAVLu{@R zPcQ+a-s7fJefLy-FGC#_mS~1a-y@nGf$5civUf@jJH5yeah~B@9C?j`G8?pbuQC2q zAb+-~LtB6?kPrJyy-!(DO{igxf|$tYzP5Mn;{fx*^UviUaW`Jq*;GavZP0BP{?ff? z@32b^BanC|;HM#Iqqx+W2~$u4l$lACiJ%iB38e6qH1L2LnwL08kYG&mJ|SAaM0^6O zv}M40g=rsPd=`$M?=q$5LV?!ijmSEo5CksFu8YN= z2e2z&rA)uYLXWbhY`pddZS<>?_^4obSE>I1ho|&1X)oi}{{S$l;Bl0|o)Ro%ROWc5 zr!&O?lXi^aqCbdS{{T@R{+3(_{+O%nCVTdLS3kf10O>t<{O5laiL5=5ucY;nACjE0 zpezG$%fc`dThynZ1Hl8L5S9m!=$twxr5zIxqpEmJN)M`78fI9IDjCLo;rv&&J1(T5 zx^{hGh6?w`A&U}5dUZT66GDEuzCQ5&E8D%9x{{x=yG-q&jyZ)sOyppK3Fj)M+I%SG zRI$>p^p60Bsyj%R^d0KM=E`(q}#JSS&h5ii=FuRY6K5#5?!nuNlJRmS(s8 zp~)}-tvmhKbqml`H@jfc^>h$acW&;S+&h9e$3^FgSHl-*GKb1s_PN784)t0V5^}4S zahl&JLJVWF0|pi;C~4$&Um4GsI7uBy5#(ottgQ~`XdIX;AfW);gijiWV059m+mC%}pewl2ZcUe0WU@W?Wj_ zp{*gxw9Q#4cl)D2@i|g3>Izvt)KUU}Rk=)wFrFF|9Yyu6Kgr;c`05KtLp41sSUbkO zj`0}ijus@z;LrjCS_+D$zEf1Rn9onvI9meiPv$;pEr+`|4hn0yVIgSAbBr{)Ew4Tx zxDFD!z8Byz;QD1fhlVWlvP#Do+yk+}RjZJa3aDhLoxR{Af$>%t?toT4m`36n-P^nh zuId@!sF99jWIS+P5JltPX+f7VH zo$+GdAtA>s%%7r~XpN#~FSKo4Zlg)b@vSliOo#075&X5H23)Co31TTxm5FY~LK#`C|-j*zo4b zlgU0pcbGFt3(TGsm=u9H?*RYzGY zwRH|_n@=o-&0zx`<4*xj!$(lZ)O%!%hMXU8fyr(?7NlC1)fGv#QMs`gaMn#R-`^Z~ z9=TPO+LW9r!*n@SlYYkJ#B^5b0@GSyh-WQfz%M>u6{S&rnrP&T)lKa1wc8$L9FzT0 z)6rJyqr6-yTi-u1M*ZRaK?lp8I8UgW)%BE*t9zsr?vS!M3mjTJN3W`!D9)zRSs#aw zy;fO&V?EZRQAr#$G);clLETd+CvFJxDQR@gEOzR8o5je-JV$hn5*EgB=zK7!cYSk5 zr1Xm>p_X~2nYn@rxs1|`5uB2F;Hn)?zrSi~x{mf)V1ibFVh$h3HB_3q?%FxtDOpz`jnwYIly4`VdM>%6yG^0?3P^;rMNB>E4VAK^f zkWWV}Pnpi{DjwE`k^#=sli`)UaJpG+w(6S4$ZCx=Zkf@bGfx%&f{?wRMWDy2`V#ggi2YG;VhLoNoR2g-R zM08@^O$>7gpYBa4+(Uc=PIw-Q8fUtyXU|bHp68v;1e4F+tyy|IQhU^v5bElbX(t*; zv-XRtZ91lNLrZNE(lLPVnS(Nt4q8TfbX$5GSz0W#zeLy2h~Nx!nLA_WB=qaiQyAFs z;D^T>qj7t3(bTQypj*0p8F@2dt5#CV=ygbM6J6_{Na>(7%#(aEmvOKWhaV>^e7f2j zM01*npI1czV3tPv;k$?c40@I4Gks;N6VcQ;?%T6t9pUrnrRY0Aj`8fanwn*<78&W7TWPNTW^U!f?MCt%ap#2(2DH-j6x9OR zO(R;#-3ge*wlgN;551o-xo79wsKcv_kt~J#1QcCYyoQkdOcdR%(9VQy?QkEl=JdBZnNzk-1R$p*sdaF-I?Wo5RS!QJQN}VaZ zBJSSPCcIv$jdcrYog>6fV;)R#x1W0_9H~of?uzq!buCRaZyQ`TG;e0n`b6ih7cqO` z5jekw_><8#mao_+Y}9qe2M%_z`*#lzeG092=+!CaRF)ZX(_Wo4p;L5vBGZ2qRF9yB zsw$AzwXj7azzvKHcz7*MVXCzC@3BklR5cBS&ZjJFQx5IKmjS>$t~+kk6jE1rwUA95 z<1LO#CXKsKP)R*9&!O?r<~Wuot7#q}=5kVC`Ds+N)d-seaM++f}bo zT4$=d&ox~YN3}@cL5M}PjBfN@V_08k^iOBi7YZ07mP*Q)@fLROGsxBx$Hyy*UjG0! zE&3j|zVBBpJ0An0_BuDTPVaZ9Z;IE`y4DR}NlSLS)KBbm?e<7%Dx3pa)?l_rH2$Bi zc*31a2}wG#j>lS@6)Hw4oqI>yVz=s>H4QXUh$t=6Q-{5~L%DBHK8s7V4H*URT}gGS zd<=>>7|rf>2mpBe)}DmA`%h|A)DT>%s;T0)$YC-_9vgH{q+2d!k0z)Ns4s+q;vAFnZ$|@&hmx^2Y9J^1OeRpcQa*}{n6G3xq&wWfg8e6r^ z_fL;iH~C08?bSMcu{SxVkPq*LwRN!Et=+6?3c3smAz2(VhBSbF+58rlKk0?1HlU)XZ@(dwcx=H>5)2YbH=4xbx+cg{Sl+ji0?Wau9vsJP}na z^t9#ig7-I|#!-eng?nl$GTr+;$V@hv97E;?Lyn}ac<%E?+|5Zgf3Q-&Qo{)P>Uo+E zn{bRU!MMm`Xxhl|2cpT{us7_5675$*pXS~^Whij) z04Qc^3Tb`lps6hJabXF<`xKl(Pa!|o7zto7O1p1TRubliaI{5LM5EtmZ@?xsvPmZ9 z)HvgU&_)r$G;cb1<8DjZJ|_!WO1SV#NO!>HVl?o)7SymjA2itMY2wL=p@Y#Ovk1A< z$s^(omv9{Agb$jzX<k zm>`QLYO930dRZzVW2Bgkpu3ZUjuj5;N2x0$kZBmBg0-#7n!DDn zWew7muWc}pHSQ$1E`?e)fl)$4Zzl&FWGpzP9h)XW=zDctw#{D!+F>QuQs;NX4=i15~rcCabjAfjhuPc5~jhVf!W@fw>P(bf^V>~;R zcF83tf>4%ba%==(B|_1`Y+>qC7DJ9!KLlU{8SzX!9AzqD>Qe!H6AE7h!g%VINg;5X z;)Hl40uCHLD%1zMJ^@u(_Q%94TG7+GvX$pSFcUIUk3=nu>}L(hLQ;_+6byuL4p0ck zRJH)gHR7DxfD3)rtS38Qg$anO*;!7DxOFx40Km%e}|{^ zGHL$3Z}Sfc;V>r-5R-7i~Dl!;1X*r#r70++vesfoU&Uf)$0*w80Ppap4!<|Q3 z?>U|PRwl2}8u~|B8aY5IxlU-vSVrLRQ^6Qm!ccIK56V=~mnZ>HlPOREl7LA~&j=kd zfHPB)DjEHty^p2tf?mU|lvE+crb=f=f<4|z>b!9P{!t%4q!+V$HKe1U?B>Z=B$@A- z#_pNPRIeN1*o3j>ZRqP=!k(AAtgfh-2j{wbw>7^Eu9pXN#^KQouj2t`prW9Lh0@6j zOWxdvHEmd?qNu2KG|g!ZKWO+Y%(AhBwexc3nEEY;@ z$%&zrROO^`kfd8%M)EdF33ouE{*j@R-jWA6pD?4USqti0EjH$0=YqWwL&`2O!5JmT zIay4xK;M1Ar`1!%WoYNx9(nL9ZW@>-+AAfKj}lV?#Zf~|bfp=PfDcxz@KeW217mBP z;NCJ+bu_e)w3>RRbm&UUEqsPCvTAZqT$IumQc#a`F`t^lJ+_{uyQGY6$55i9tgc`n zR6u?uWs2usJ;M5DdgU@G(5kk%la^COEAjnYr_k2PZ=1WFhiLF4kf-P?!#DTug|75+ z!Eut^RM*QRqjT}WZ&b2}gKnO-nyVel#!paEOKzi`#m|L~cfnL+GQ%l!FLO?KRx4%h z8Hcmfxs8>hhZBs1`U?!%j@v@VALPRy6xyp*1DMwcTNXNyw^>wPUcyPS+Tue*ERG9tv7H=~~UAc~om*?QlHju2kiaca(2zPIG5(QhDKN-i$v;NjoLZ zYM^(D% z$m?}2+ODOoV3m>gQwQL)3?Q6m&1tr(3u$yzZx5_7?PSmCpA7gab;DNb8@1j_N$Db% z8j>S*Avq0c1a-!F9I0AJ+i#`z8Kc$`aE92_zCg{fttTvmKbWJc#wqi+=z*W_F-mpCnU*ShUd z?T(f5M;M9bEMqw7_bz#R*0+l3;)ad!K@4yjd~M$CzuN1S6>y9;DBzM)BZG{Y_^o<+ zUixOj$A;&`_%CH;q0ykdz1iokbxO6iTO(GIg0fdQ_pY6d=-C~T-fv=fQXcK6l3btkA&kDH#cgCX&`GiF??Zjoo^qfJ*9(P4 z?a~*Kj_xzGAGu3Y*%=hAeM`Nd9u6IhDF)gtLm{z{Pl%C8Kaln#DfH{ZTP;c2*A7}d z6pS|dcp@;v8(eYJ@>V*VEi8--rW&$U z2#}tIm2}BFgfMk(^e3aDGw2pjljwUtC zX#-{!5lqHN_xQW0B}P=-m$VUADKGSl=xzo=Uh3 zrl0EC2o7)qCq7vVR!G~=Bj&97FJD>oo}ZGAw!>LHK$-6|vUUbw7rXf;kb zW$PJ6Ra2Y6)_W?jQ|P@r-CSi3sgc|J*N^6!Kpoih$j=-r&A>}g;aNyK<^hn_j!NX# zol|4g@$R9yHP2}G;%PZ&p<5QOZMI(ODD8K5#Vm!cYif5+)}I^#cwaE9PVSuCpHtSm zIJeEEEy+tjxX@iFscw|BO)R$_^{#mi?wWcW{l!&(D0gqvwl{!1+IRl;b50fReMQu=82;`hL7N_Eq)z>?D}P4 zt9#4^kU6Yy=W*ptN9HWD4f<{)BR0t5+;T9tS#G9o8enPL<`e1e^l&%p>O09g95mr9 z*Ez%U4Fjcbfer&dG-KvBlRNg~WO0VHEqbXWf&;OJLyxlFr7_hNwJ`ArrG9!mhkpgB zH8sj#arKb~pB9W1CG#SYkJ~C*TIneyk3XXBr8>GuBx_@uq|>;J<2XUJQ<68yE1U;j z@nrToR>Wg)CBAR!jC{svi=8#HErPApWb_-$vGZEzR6-=krg1(BWU_$M7+nk?bj|=; zF16UAVUl*gj}Y{*hKTpyYbSun{{UuZJU0g^vRkUI8z-80+`>9DJS>tyr=EVUN4Lm1 z%UY_EMm4RsnOwu-9l|iXhH`C3r|6#pi=wKGjxyubK074@Fy*%Ta{mD79T+b8tr|w& zStr|bN1M*zq`UjSb+f&uBhS0#ErqxWM#kK2z&=U7&e*=o20ZYGwerE;RX+pAVZx1k zcIUslj;4J04doa^+}*0Ejusf@dtoGFB;jdNRom!bb7H7$n~q6yvPtw$resuacYIke z9PX3e!hF+POWP!@frG9?Q`i#07gMMq_Lj4{oSz+|f&0@Wz8M2qPR*x0m#MRGvN4Bi zVaf4xL0WZArVJ8O(>7h-tA!tAYb?-~y0TcfsG?}~&R0j#PMhfVJ&&f5`1=v_laCe4 z<)wl`Nurn&$-{;M>UuIdT6;4^I~{^I7apMFqR7>Fcu?Y*N|!|H=(|X)s<+D&Eo+A1 zO}J+ubm4URIP2{cEQ+>~wJta=mPV2X%~));2BOPPRXrJwqE_X^0mmeB@>}|s*`Tsa z_HBEFV4N%tB`F;+@KzaFZ>ff9C?leDj2L%x0os1$SDg?c2wLWFgd|EzL;%$0o>Nkesji}Z4cK`cAtgEC3#(@ob&W+=4OeG0 z62id1Wp;3=faGweXlh+s*u4bLIX=+vpo4HQu2ERGr}Q$S^Ios{hldUm)-abLG4NBrx4E1cec^Yvf+*MAk!sK^tv`mS|*In*`3^PT)wF0axiwvpAEBcgx7 zFamlfv~aLlxCuu@o+(EGAQcF~!d8!U01Zz~#uJA`0LLdc?4T@ymPhek z!tBO^r}F~Z=E`P`(Gu9tJ5GETk7>qgSO+AyFKc#jPjjT~&dpIATz6S(xId&-Tcwzs z>O2>BUSy-75SX0qHsJUtX~`vp@=q(UBs^tk+!;|-6J#;_+GA7P_pROF3ftPzD8t%*3tiNai8t(S?-Pzw zn-TY%&A|LqTLHM%?k{h6!N=Nn@LB2MrFAHi+9QrYd25P}-eP84GH|gvHdKzT1Nx;r zh?|~jDP8q#*yF}XUfy;{+s$?V~-fwl0fk*A#MR705#34qp6XCrLJxV zy%V~vi#+sG&)meJC_)r!Alb7`K?_YRKeu(G~ZNwTJ$@s69%MZMLaf(Sk#Ey?8?G(vdX*Htnn5PEnO zBTm|P)&nr^;wPPhqQY5{p2*92%9c)eHttjuENEmCcg%lW@}OHwGcxg4t!jI90=h)KFRNu zT4lF7TF8v=5v)`txtBwbkxDz1cxlB}CXPTL?fYvm14NIpi&(xPAZ-S;MBp{Ia2?GP+ z@m4KE*_CaE%_VI2$~j|eNg^jWIAhBpU9YZLTGjCL*_`O;7dH@$(_Ys?mR(U>I3`!e z9A{`a<=F7}DHpUb#qKwT^Mjq=6{7^eL>lLljxyuP_^jdV+koJ<<5n$kc{37r(~O)N z-5buWkJzN9j-9dhm<7ShCwCjHLGso;xON*D=OsoN7zYj+_@;*ka9lZ3=As@ReVHKI zN~tNsSv+BfkPMhw!P8UB;Md{9jDwY=!5mUOrgHLq;0fmoEKd%PcR+m9)Z6HDbhvt% zjnazU81JGz^N+hDNhjp6wo00+u-Jn`0KGs$za$(?4@Z0!C&5hl`}Z-fc;k1H%>a%z z?T-L;;YmtfM0tB>1eBJ#Yi)Hjl?`oV?uP`I;AcGl00gyEa>Ws;Y)p-Zqgwo}DCRLu zyvErEF^49ZrIpR6FLQ}L>oe1oq~xOIC$c9_lc^;LE!g2Hc+N=s*4eknvqcWZDhjnQlWTTk(T@9B-b-Y{yVvt7^ zZQNX4joyn3Y377U6!LeOBxD?5c`Sj>4Zu7U2ec1)zXx7z~K2w|i4aS
E>PZVx+P%mc9E&%&aoj+^*M|chLI~`z>gja6Y+O^wqFc zMqLZfx_;IO{waI*zE?&a?>CdeJ)WFE;VfmNEcS}d_jI>MQ%8(ppgf=6vd3++RZhcN z$4jxhIe8oXNCj(1@-RWldt_!l&`^B7;HgdYLORh&Lo}_W5>v6{7P>hd{)*LN?I%!a z`YGUStgCF887ycl1J?wVR@~E`K?$+3ftY6_ImlG&*xTGJNo4O%=DoYv?DSg3-G7DW-G` z4Ciq!=kHpPHfV#1n7ck|T_iHHN5Aa=-U8GWl#Z-rJk?S% zM|A}dh8o>@=@)kmMzSVcLtM@=(84s9t*STQcVqD+I=0SawK(hr)kKIq=l^{ zPVU_!G9&UX%EJ^bjJU916!{B_PB{r|26$g;d*hAL9l&Md9SUTX6GqnNH_J`C^j)`w zrwMTzoG?~8$);;|zyWbSB{hJ-vTEN_NsgLYc8&u~yR+(_6KlY6fzHl6O4O!o@x!{J zO~mto;Ieyb3`Qo$?`Q3ldm_UzvMS#6!ud<&JmV>{Lg3Ot!SpLyNvTChGgL;`v~UaX zkEAHc+A5(Z$UG&)i6bR7JW)0K-y`>VxUITZ#L9O?EFI`Q4(^LV(=d#J55Z}^>lAWq z5!5~X17n5HC*%>tgAA3dhJsp0Fj6^%-4A$5)Tg7Uj+1)>n;7YrWUV7zSY;#V+o!$L zbsU2qxog*6YoLd_r>1k>IPLy!x*v{!y-t{jNsnd1ukkV<$Xe%hoqIfyFG6w3!Ar z=PSuyltl~e{j5h$TuAyp0zMw{(y^Dc$kSfY$WK(#mC372xCy9C&j`g-NSXv8 z2?GR&s#G3`5YhIB#4AAQ@>OPoxO`QleUP-Y?yRMG(E<>Y!D}Np3PdL0pam#zREYQ{ zx`DR`QiPDW^g`&)aW0lG{-kKfl}prU=%lQCb}LFh`%BbYN!qk&{)IoGjZOam9tb4GY9fSbvB^Uzd-d|T7JlEW$y$SPak<+7Nr2xFb~!NdZSHS@AGzLXE4Y` zGg@46;4)P!+^D0CRCP;^qNRqDEe8jTj#jm z>Qsa5G;vIQo}Ggp3pF-z;VYMVirV{E)zdajoR{!07YVpIkZM|qD&!1%UPdj(Tzh;aK@H|XlAsVrpk&!Z1Kt;gOKU*=ltYoChL4;C*MyqI}eWQ_jZ6v>6V{W*46k(QeX0 z=KIGjdFs+utQVRB^B|CCrra$VF6Y}HBsAr?JUBbA+@_?N2L_8Qu#JJ?;JElKY!295 z@qnww?QoUl(1z^;Bp(I2PjsxQi(_e?}1B|Ox1CC!1uBd!J% zbT=!kj(joMspfNdaWe*`ifhylbK=wS0(y~B)Uvyag_5w_soyYUXS+B!ASk)18$}i(td5<&MWOjBNuqoYu{PakN*!&Ju@UAQoSPB5|)?&HNY@)$HIt`U1w@Jd=cqku8s zw`t!LwVmuFmg685UaF2-JJGLXWswtymmKA9TVHOP_SZop%(x^p6OWRms7b4N;dwJ> zLXK~#XSzK{Wvr)epN)a}m5upwsygFAQfpcXE;iF0CE^wxu4{eSz{%P`{UUr+)iu@% zOCws=4dK2@mt^feKh8?a71mhds${M)ZD;|^-GRrN_+_ka>DHBdeyN{Osi#V>8^@oS zQtax6zSY`^v|eeSPgfHjB#GY!uBY0)D3)smjAdI!L zH-ba4oa3)S)j{^C1GFW=L6Ccg9)9K0=TNVCc?z=G`HIcPHK|jM$~!c2y%pKjX0V1D z*3}rHhHcNmBX|zvaIg1WH`#8TsEU^LRaX?xZ#!oLpS^S~2}=ZeRtHl;#)3K6G32S; zptrLKui^ThC(Twt05W$o9P`FP?O$2EuX5?Rye`KKQmc6?P=iafdX?X1>}E=n3{};H ze!Hqz0@BgiZ%XPNe{#3BN#(ae3m+4iAju^1atA9s4(uXL!Su66M@`jE{8moNBessz zuQBQO?xGa2_hh)c^!(R(T~}0RE@YNFnliMfPTs7PB${1ij{ZegwCg>qOltaCOIVX* z;oX^CmvwN)apUVyoFcSCj74b-=$3Wn3b8w@;* zJ+3a?da1FtPNTL1-B1w2Uj7ccs;+(TylRCc3lERnutSNjS$X zB$>lBf6zC22UJ`mnrK+oxH_1EPD%U{YDzjQW%$tB*zpTP96Q7Bax$&9Jv(cnzT8`8 zrZl$MgnisEIV~f0Zll}Lg^CgS_6SQ_jC=O1}pbc7C;@htw* z$3-mdEOF1e01Mh{)i^BX(>xcVlp`zn@%d!xx}uhz(=9wPwXCNuCH_ETE1Xq!gI3F& zuv?;Jv9Y)qX~*s>r1pgytEj4}BFA`Q#(c6D39!*uX?ni* z7tOS)R@I?8mEKzDeKIvG@+mrT&U&)-thcUq}@^Rv5ZrWxQF{!$4!|$Km1Ja&p`OjIDmh^qcON!FH{pmOkacwdCLu97Ye#S^G`Z6ejUYrFY8> zBc_G*GREzIN4V}8_$_UB(iv5{c9xH2)uYMi+C(Yh5{_o~Z?ZOQ{hsz?e3n{!WzOMI zBu&etj%K-;7~>#%g+RGz8KUhvk55xddy0_f2R=?nXawNn$#ne%7LKC!xU__l$rj_@ zJ<^E=><)+Fg`-#~&3CuoO^RwqNmBQQMAi-^4mbtAVBvb3UsMWx z5mz+Qkj6wwIpdv@$(SB=Oa|>pQx4f!&OKmt=KZ{{Xb@B^H&wFxe`jnwDn3e)9WzIT&l9S>gt`l)yDfdevQ}QCbaZ5JVw2wEspY*E;nSUw(oZctMeeDx z#^M~`XpMFz(?HuJ;Cn=I795uG#upN}(DpSI>Z!F-);goSagegC0lOzXO5sCZxW1g6 z=GHq7%7qHDlvEl^qKY!Q&DmU(FOrJ!Qe+OmY?HH}xpSEW5m(elPTjG!{^%ZFYW+PA zW3RT4qibdrSr`&l0)80E<@ZYJ`+eqjM`o?8qj3T$DViOg2U1G*-iqALRoa}J+svcs zHJvDF?r@7wKg_o_pH^R3Ba&#y#sDtmDHD50!&}|s-aacznrW)Oy_$NqHxGFCv4BU& zt(td1bB0Ktaf*&$aox(|*Zg`fe=3P1<(SLDGBz_C+~V?bcn85b(lv}Od%$S%D^3kP zsasbx_WSLcdwzH_?{mi_mA!7Z(?vnwGHU5&h;4C^`DZ?3 z&0(piwo=i@OK`T)*2ZMWH4z7pe)Y{%;#(q0ICy5fH~l*!i(h!7&wymjB>we^TAFv( z#^_~*!=NGAC*Y>(dWw^A_MD|ODQxS(BP%wv69z;}A z8tCsG`{5dL^!B3+9kV8|$MnMhWS;$DmsXi^KEBx=f>u^nKu5A@+gg7IN&iHw}TwE4Id*~W7T?}IOG;aKklc+ru6$_?`iMX zX@KkPMT0*eqrfELqbJcx(pwun6p~H2ZO;p$#CB}t0 zRID`GW(tuseV$mKA?dZR{{Y0JOB&jPfzbG?1+JcHDLcmk8Tu|Aa)kumWKGTR;Stwr zi0WL}+hnD-0nv~#&Hf~&TJN*z=X*^k9q2qs;ud?A1zcIEsFlwI;1?W~5dExfWgIDG z5Q{ApTJu-ekt~<0mb1Z(z{l=f`f9gS-zDyjg#Lz#nZ1v2P8b1YoHYrZft~{c?_<}+5XAwv{1z~@?ouJWEjUz7bu>V zU8X+i`>;+hyEch0WuAmKoJQugr(qa#j~xExm#RrPEEA4A&X+BcmYx?<%L@c2jhO1A z?v|=s9e_TbrLac)kk^pWpG7NEHAQ_RjPkLS83mwcmCmnvnx0Cw)9PtkOHWR6C70cd z`s9^}lVfs+Oc*I;X}Yjh5JThvl05paJN{Gvv$j~{dx0&tKtJs+<3PxDWo)-Ab#t9> zq{wW6-r;!Uay&4+_4z^>zuJ5fR8=ynN86w-dmWLVd#9qiW1cogWh8Pp9#aXxPCZjf z)kU;7DV{0bDG1>);6xz`AcVp&l?VYaktr!W3IhXLec|y|cKwm?3b4>O4~SNA!25#I z)4H;a??ft31gKib&KZMt$h-77UV=JP#)AH2Z2}Jx1Z5n)k0}ZnxET zLuq7#ZeTthtH2Q)Owa8P;=R+^i`w4EY(?4kqagnPc~ZUiPIF|z8=c_p6deo{-q9q`6StuRc&Q4y8+~OK$sz^gqp{Gey}KOvUQL^g z)`#eNksU)j$42I~{maYOhKJs2L*JSAocMyfJ25%$K0Tz$7gI5zwva=uIRs%3IaA zarITIyXzsmzFA^-c*D>Pt9`prTJQGm<{izMxZK$rx8##}>W-02tw{uRmrmjx?dg&M zPPtjdz6L#&PmsI7w-{3ucUx_qSsyUVvC)GiMb&CL8^jHc2;Km8a`xd4a>m5eG8XGY z>S@g7p~1aLSluIN>mrqrhZdegyi~2XQd%ugiYnM@gpc>e$g&7Nt5#a;eO1}Aif74A z_hGGbaN+kZQgZ4yPss23a*svbbPc}8c!9L_ITHzlWc40n;;GudNYGhs^wjh^hAAMO zk9l*$L5#GFHyP(SJg&Q^DeQA;IH9exMIe1JE$))3-UMbVRyV$lmOhci;iu5T}S^7;cw<( zOH->F(sk%bPrP=?*d(8^CqztkCjt81?7S#D2BEU)PSU2Tvci6ht79Q(+)fBNC*J45 za-Ba}Ej_AA7F5(jBe<3#!tKL6d&j5TfoY_oh4oBy)+$2hw=^aQ65MJ?KKm29S3 zhPvSiLDHK~yKMAr{{XhDR906*K}{r&cyJERKScS3=ldqDyd6eGgadSh0G@6s@_a#N{f=FcBZth>ZEqNmwe7YxF?>)@IwbZiraFLS7 zVWTIh3Lbm?lId`0jnZsvXRJk>ljK6#r@LBRZ~8I*(cd_Gz(njHE^&qEE7YSnIMnx9 z=B(j!Lb9n!KGOLeZkt)T59fJl6d2aatPe`1t z-7AZC{SQw`+E$p3ce)6pVCAE_XlOpX12$lQ3(BZX3mSnajb&sSMjh$M7!f?h*NBxBc*xX|=&6esM@ zaoPGwZ%IB~2KL``*0vpEq4a)`s)Ef?43o94k~p{SadA2EUSz!L%B!xit+>w0j^ark z=SQD=JC6g?l@slD^HeM8>*@tKZeHT&;C;nx`(>JrskK|>G_uFT`==4O`S7(g?GBxV zSyrjLk%?PTRg}CeUlV)3_So$`oa$ROj*e-nV{8ni$)DT^!sj8`;WUXjm+VjZk z)1sku=E26ctSNx|^7| z`$VsVNx8T#Z;u=*bv+P-YB^Gt6Ei6KNke&XN-g!_ct>59o3X++(Nj$u{LM>>|Esw39vY_`+IopedPTx#nYTWO1Ex%A-DB9Y%B6&Mcxxd{b z9FJAAq-hedsVV1(rK|cwPVU>o!9DlOc_eA*oi#v=P9o19Jo+e0g|cc*T^vqm1jJkp zF_kS(t*Ps7Mqi@EJ0p*utlUpMdIhI(zC(P}@K)1DhO!Ri4EXYY)p{7*RFt@QPZ_|L z`6O-D$s*Gp*HUoz``cT(?Dr9CtbjX#SKo$mE%>5}$Yi?;W|q)vVX<)Gd4;LHiEphYZdhMh<^e zD)&`utT-d3J{Kg5Jr$A$(oV+*HIkP5gQy^Rsz#%rpSY(H&`KKloYqWSF#LD{)o)4K zHB}U*jrJdEE&l+FDg$?Y+ke$YeK9RW(7De$i_41-0lDxAS=6h)5*+cC&XpaR<4fik z8ppPqF2LvP@~IX|YRM=nr`W>_YBuK_j*DfztJlYGsJDwFSkl86dEWw01b(WGhV0vZ znw9WC9{FA*+UN8tag|NQPaBp!V@KcVd78+W~iyuRPC$%AOLt64fv@R z>xWfRzAKHmJ+3?!zZm_?QX9O6=IW|Cj_L?NehYK=F4U(k7NyjVG0^FdTOCtFG(o@! zqAtntz+C!kbWvR3ln`8S;75lkvv!@TT`S^>ctlQ&#z299kbdQ%6-`)cDxTu<042Co z;H6EzCU&JwwAwm#G%Oo;F|Ip$3mvlQQ#IMs)z7+DH-onTpMssVTyv9*bG}P`lG_BduBdZz_Pc0S>8x=6YRyq3 zWs>6~94=Q=sIPXq8DN5TMJ$ip!eb8MVX^AXVR5^*j=uL3smmN(3=MBV<`ipEsOu?b zVKkn@n@Z=-{l@?k!sxmlk&m=U9~gcK`$MAUj<_1i!Aov;c_WFzJOx~+y=o|G-yC-b zMBL+RMn8hJR$18%?bPb}o>3eEBNKMEO~(VDf~;I=XsaOxk_nj*1ACtD()9FNc1r5= zO(QNfJJ{xBq0PzN@kLEj+i!F-NLvwbE&yXE;+-eNNvs_sN&7WEnQwd|V*vMyhhK{2 zw--`PuPQ1jqiZ8Sm|ZkCpU?-iXC1 zW_~;z_$bOsZB=>JH)?|Dg|3b5V`C7vbBSm<4(hHGz8b11;+eklIPxn!<|HwbLc?mM z)3j6DC}VH1NtbiaQI5X_<)6w9o%H>vh8=-|k|P$uk8_+aRQJ+Px|SBXnB#T{1TQoG zQnZew?K+u`>TR$e+~sP;=52%*w2mZFA<3&z7sNeEMC6!DBTPgi2uNaK2clFU2BX0# zNPrQ)Yr?*#Fsw~u`AvN%qc9-|SVqVp2uJ}a zIY@!k05}{c4nk@ZKs%ybqzT+60>%9MKeRuJ_NIrZxHGY938REL!H(s?;~6W(agZf% z#D5j;e#~lz`wX%&RsuG>0zb5<-!ErloVu3XGf_273zYC=Y*i$XqS~r{plCr$QFpeHbOSQGN6jIE|-4u;s_krW@US`xxrWg8#)XOBVFFyMZ z2bJndxpq?25(AsC@Vu|8s%1C&xXewBz2Vx@+!llP} z%`-ZdiOoBoG0&D3r*&tgt7}^Nm*=SCg`BvwW5Gq26LiJ_<#$lqsnQibMWSndoHS9s zo?Dok8GBwC-JgdUT2`1WlU;j|YQQeTiN_xWg|a-bjGTN{l^JlkN?J~F;JLyN4|2q& zn^{Et!M0jT*$q4D8!jc1`_k{bm?j;VLjIot0SwY_~5#*P|UlTP}HE*k*hz&9YO=JDOk-t#``<124X z#K+re9P_|9{mYE$XR9p2rrik*K+QBNMBdd~BWgX;S{v?RVxgzgk;Ld>p0ZpG+lxk2 zWn&|4mMxK&W$yR9xk+gb*)anHXWCG7m&DGosgEL3wp%RI#OZ3TCCq4RS_4RE`_}y& z_KJIqQ@`3A$h`uq$@bcPdae423o01K@D3CmG?!8`n|avwL{}R~vrx(_>6ph;vB17& zw~eFBt{vLF-q$vxqA^{l=45P;0~F188F1j>`YxeGPiPu)*(CJT@;%g%G)F4|&$v7n z9PKj6RLw<64K9yt51Eg2LK;vz)`B^}9I7?cc$VdhckI203R|tM+la5GBxBtY44=Cz zX7O^ReDqF+w|L0hTz<&%TJ-jdlUpDE06?lkm_FNR2rm2Zmg`GBy^zaYrK@Sf&$?u% z+7F_=YrvvaxJ}5)+m#z;2iq9lbCB_sITh~JUf*LAHhDIe0OAgD&-y4@Xx}Y4V9=K- znDLfK${^#PL*%xt^tU=`o9((5uG;`(hqp~cW808=xk~XaMB40F(fD2MB|e!)Lwl*_ zXk-nHG;wy-%#gO&tTSjg_VOrG&}d`^ViU&3w~KowK zLoGw)f}}aE4JU(>jyPRUOwCZp>1$+ge|R$BPaQ~H{;#tgS5sRN{MoLjVUeK8B`bqi zGC4dhxkF)+*GCPmXU8<~H)EX`I430d{8wFmt%^}rm}XXkeRVo>h3m^@MyBnh^yg_c z&bnG7s)}kzrj9bw;k>!!-#!(VleCV>wgXwDDdKT&A(ZZSD?-%kRK2a--BoX-xH6uG zox5dVkTJqZHx7JwT~|^!MCtC&nW<#bR@oy4E$n3@3%&D>20HS*)y>B7r-#2_)hbbh zp&8SYa`RHbRew7bbhGp2(&7+|p8ZZYb!peBPNgX{ru(zcTB}*;I^8{4OJmbC)U}U~5lR6L z2mb)iD*Fw)O2=+>Ji1ze@`!TT2{|VV$}+XB?Lr2eZge1h{n=iqtEH%?gh=SgX^o%} z@LD>B3EM)OQhS@U>Cu{Wqm{zi>i6h#D=%lX`uDWz=p7TIf(E&pN7!Hw8Nu`SmsqQ? z_HEgvmN@Rz5mteQvGX%7KQD^M*vqNptGu&xVyD}uE@pl3+_%HYRKF>!4bDqFJyksv z^TQjC_r}sgJ?7&l!BFux7k9C>olHYwjr~PC$x-)GT^7y%08(n3SoUvouaXNkfj0)U z2S{n@-tye^$N;3&ou6pUbz^9tppJwY0SqyaTK42%gVUACzb4rA1)H^Mi;25KYqc^K zy1JgN-QTqW9keq&NGq<<)mKv*$-9|gl1ka+Xn4k2=^R>q1QE*D)O7h-MNZnTWuE67 z7&^5aV;2^en{VvLX)RFO0hhB|9jsWLMI&UMwh$lfMXqRZ!5^eJ&w`)U{h4WfMW!Z# ziqB6=E6(!fH~glVj@f&;P<0~yA}TVL#DK}mus8k5JnrFjmhMJ z)9+ZirQQ3hPH~>-SN2e}t4-04B>Mc%6Kl;eU!$Wm*9he9Wf%`@N!!6Z;A6phd$G+Y zrf-@)I{T%rp0)d5%!4@qfEALzOzFPT^i1WG!!}yxw45Gsj(Vw{%QS6Xkkg+>*3T5q zYosC3^xEg;zqwk}wfgs#v86e1&Lta~*7Rsp<$E)2WgJ&sXq`WI?Jf;JO>cqi70~r9r$OlrIQyMmlB1oBZs!~v^~M)F?Q>EcCEB!iNaHHk=?1u{>xQe)wR2+IreKY@8I#^`$A!5kY8{$3nc=z)hkiPmAP4YP zD6RTuQRydDJ51ZC`_`6@<^VV&;H}fGC_Kw6`j;tEr9w(mqa?m^$>;rMZS{J(o~e_z z8bJ$#Lp|U!h>v9+#v#zz47h22q?bIkaRZGuJA z_9jpVvhP&+&NC0QV0`kV7~Lf$8)7$V=E~l#G@X9zs20;Z=-Dd!$lBJpH(@-VfLP&U z=6=R7xyQf^l=vqfGP|mq=uFViSgIkN-%ixUGXsc>(~Ykl9OX$_U8ZR5FRQDps1+Ob z?PMg4xcI7sLn1(OF~$^yzM5LAe33>#cJ4FqT%{SstTUxK#ph!*g2z#Kmld^9)41iX zWjT9?-INHdY^-L>m0PL&WHiOD`DJU^c)ziypLG8K1lZkKHDq+Gr(>EXcGCU>mtIt| z+h-1JQ|L}jU!)yxd=XYw7vq5Hax#8uKF;eay#uo#BP$g{|B`U1`a!j(axnV|=W0i;Hj%g3Mx;NSfvX zBWS@n;HEi|eIo=#k1Tm_+ZfL(ZZ*PXNjCN(rNf+&)Kv1iPq7o) zdV=-5`Xbn7G15XB=ItL@fC|>qEP|r4R@74&IOE3)UanlaSecOV zGlK-w6_nd%E`YS003`&e9oGg@mWEU1!^S`q6Cv*^*&cDZz<%|!d8hVki)q?RgImh1 z^7@@9$wfSg9ll8_zP?ym-1CQmrK6{1EkS)eF~0+cJ^1I%RS4&WDO~r8NI*UcYNVpl zL}@5A-VK_lE9>Mhd!Q~H49Er+wLJvURgo*>BLou1gO8Gme(=-D!rHO4KKC0A3tSFI z+`7IgJ=w#GInD`YQ$Y)3?&WUg4hTH08tZiRH9|;Z7(S~d!r@78xXlz)EDjg|sJo5I zv)cfUXED1+4dF^j$83&si(LyvzKTfO9Xq9Dl9C2XfDO-?Th*F!x~3xoWu-pw!SCCG zek#3Zk`rr{?|Yog<>ku-GpQ;=%^v2)57_W0;H0Bd9?K;eLmdg*j*Zk4K;HaYSXt9; zV_lKztCCvhj&9+SLg#cRya0UGDuz!THCv=++>wLec~LHT?)gzssGcOliXKRPR1(Hs z!sc!V9_h&WuSNEE8zj=S1K7Krv9YE5i6`Cayv;m^yK{5ky*t_6OWmcdLP=SzRD~{_eK^2a&3d?g0m2%0qyKh(gaI>CVdXbM)r<&PlA}^{f?uUTKE6Bf;t>T{Z z+V1*rLt~cehL}iX#k!v^Jx|)@ zTGQp3oj85Gqm8@mVK)iKszt6@8ieGWVIib6q)JjCV1yw67)?%1Knf4MJ|S6uMOK;i z$HXfr=(M!%tf6_)2ZBs`rAgqmN&;gZDKM1@2x>riK}Zu_L~O(Y62;LAqaa?X;*K84 z=_8NEca;b@A99|?&dg|l{*~XwKxZLoQ~e5mLl%<7YQIw`=$9)PB{*=PSr_z{Ml4z9 zDT+Xxq065ft%qtUE@-}pyjKG_MoP~yskp~@C zR>2`|^3ogTv8Qj4w_$sWd@k)RcbRj#zFm+Bq4~GV!fc~)l zE86{@)iRf{OC#SAe0g^4cn#fGiQ@i!pV}YAd$Y39N_!Hq$mWvfhmvvXsos01Dvu2o z3m&Mp)XpKNdx>er3rJR4y4d1?%IO+BhE}yTeH~RdaT{YU9veVh^Hfw*zVgaAC2*04 zF8A~MmPDFfL_MX@y-igeb&jEqe|Aexyu8n-sf9+PmXadrW^|ibAvoR2?$8&|+uGWh zn)f_mq2A~x9Ty1J6U@y~Sk1lB6BD=fehTe_Ql77a5*PhhN zwbG`~BLFcp(}!=*k1JQS-pVR_G?s|E^Bu|xw>hnFh_THe1J6FH-K#rN*K`uYY~N2y z9I?9+doyHr9vK|2Idr~iZADPoZ&Ov(x-xcsOTZcO3%!+kl`3&dWOcMxb*l3-?DjQ7 zT_r;!2kkol3KxHYxf-F zRKzp)Zd+X1X>QL&3NrF5WyP?UdMq}VfnOusGs3xlvfXzyJ4K;`)7oPH0K}5r*zaiZ z)JW&pqXQjHWIyiw-sr|MbA=w?a_rBFzK+TJNi+RbiYIz|Y$N{i z)~W1swDw#XGxYo-KQUba{{X(9iKpBh8LuLtQ8Qau@Li4+?vDn@s$&i(ud$K;0C{7i>^`mnT_&uFdymDKyQ0MWoB_^rl4J#A|RJ9oLgSURqeQ`ntBk8suSx1L(+7ay0t zw`e;Xtb%boI;Ivo91}$E{7NyqgIH%*MZDna8V2oGO``j_?2fOV8g5)eTq3~gbI)HT zMb)}@Tk5;LEywec-%Z>#-OO;)y`_P~5((Yt6|UQFn$2j6hLW^lqw8|gd&A@K9CTTj z>47+q;roEF7;?KhNjR%k6?$pd25)R4#e z4A~}I>A_g%(E7rnmUt`mbagR~kskE4^W~M$r=qGgB1q=x)DhK0Y8=yP>gl3a`a!si%691Hm;49Vb?nv+u9?ejah zw%5ZWxdR}5{{U%p3vP$ea_MnZS3_9&_7@Urlb?LOlLIHjzju99bU4s%E+;kju#{d>LK zCWrZ`O%e#>ysc%$$?R;a8nqWSqJ3PgFtih)Ca-0^?gvw~YCd zmKlCJ-FvvDDqKx@ndY%s=c|scYG%n%8O(CL0_O3K3QDM$+EU41EZevZY5P9~p&iQG z1wam-qq>OwTb&$-!r*!pQEfvo9M?oyyLllg2xATrL6$|YlUrkl4_eJY%PB4Tia=4n^96IL|cCOdq zW!1u$5j2A_+5s`(a=W4J-$==AWxdsqJhh>uiCN$=`pIf4wB<{QtCEVhfCJ4baUXeV z)~l=R`U$DUb8R%{N47SX(*}~`(0!E)n+sc|7*wgecIs%+zqwME6%6I)%;yd5Rk~-i zdfTOnXy%5hGFtYNomv^kPX7RqsJULMs+!sk$R!bH4l>b2pS#~%wtXq9^(De_S7(;aHhZtF zU@iDGHN|xc4zbbqD(LO@+r=F94+OR*yWTif)?;p4!1yZ~Hi<&5HCCg``k57V>eLgB zI%+Sz`TLw2``F{GcbYq{o43@~RZPcwYuO;dc3MFIk&KX0sw_IcQduIkNu{cq!z_E; z^BHc@BV2Ruc>=rEGvE?!88};2v@1&06-h^QRga`sSW14=T^s6i+plM}5Km8V(o(^1 zsAy{?r;{QFuwb)&}sI*@6^>b&0k={cHF~~W?o0oJrE4|cI!%a;2 z=aI3-#+NzHJODgb8`ifT&Gj>w!>TQqdsMn!Z?yFB!vmd792H@iB#_{6=X^r79@=y-av2VvusQxthA;d| z!+g^npH`Wl4gSLFb0B*o_CWan9tGYjo4Zk4AGndNS&@4IS9(eN+v74ylTP_0H4PQ9~OHk1qh= z0i2Ku!v?RYcx;n4IUd;dG_Y;MS9&#RR?h^}GArq|=|?k*M#vkW+m06PqLxYP&dCgW zIVGnBX6~{O< zjd?bWpNJe0 zwZyAcDQBZ7q~SfxI)Sf>`1u??$75@}_*(T1nYA)^VeVjKcjKa!xJUHPpk)+N0UH6q zBLQWO-#cfxQy!)!hT!$(5v2IKohhxGB5R`VFH{(r&&yarJ{+qQbyGuRxWidY+L+{% zG4C03cDE0Z-ldS?mq8br#MlJ zTaHe#e#u^m`)i?bAOP{#;-;@v6zvatHoj*!4JsruHeA}*k+HG>bLEvWaiyn{@f@QD zCr6$*0aSGOvRby@EUAZmXD7u>)WTmCFm5tbb#!ntvBH?082O)v^qY%xlp$kH`<%i7z%q(&_>IckQ2H=lB;!5n5u(b;Nq26xhX}Z zlFd%Y9j7KV_&(+iJn*6H&f3>A2PF0KQucUX`MpraMnjwl!7E1BODqt}-+AvWB|dQfH?oQtq*| zV=Hm+nutwA^hOB>UHCa!INa>8qlAUB#L8#`Lyj;$*C(R#_vKL64%p%2?OQ3x{{Ry7 z?6vSqEKt%w>~J38=DfN2P`I0;?)4>{+hd|EL3MlK8WFGt`cCSKWiw;*gA=V znw`7RH^CqTB+4>?5ePy65@jlHngCY)q48EwebrfM_s7I5D}KoMEgd_nC|-0zr2Q1B zKSgU9>_nLeDH0HbbwfBtQVyx0He=xkVM6G|6QIsP?B;|t`@Q48im$b~YLTIPcNpl(;HD01Txm5rhEvht@Rz09bz&?as?;YoFMit|r9Sdyfpq>2kbC!-u!x zKZ^FRWL5J)*)5@tq?N#z1~@l4IaIHG!-Za_MzL9+Uuu#^fek}AaWBB=xxM1V-_8m< zld3@xJ>B%Jc5~&&ioa7_?Kep3Z518!Bx8%5$3}XORmQKkno23=vs>qUb4Kj4EPb4n zl^Hzngc9n`kymbRp`vTeW41+t2Ha$hg>%bAiqmxMB1?77nhJ;sdG98W#tsLbLbhod zO;Y+fDr@Ro<}sORaUDFq3zTa*nIEVs+c;@qkdnZ175hp{nTWHS;Zxl0v37r=XdEi3 z=xwZU>V30uA2+P_?KayjMAaH!R@2$L?3o(T6zzFFk0dWLK{c`OF?|sReR8&oEzD^R zwnWz-7UzY1>F#}GcARKUVsOdo3OfxGr8Sq`OG$IA-MO25 zFeGQ4sS*CO9MqYOx zRnckD$5JZsu7{xG?Q62kW!j!Y>S(9`0K&5#)_X5#5*PL6wKaRkYt zO@T=6*MJzzZN5mmQl)5qv$}4lG zU%Okp%S;ZQs*cLWf@Km@va7uE`%UBSRmx7)HQb);`p%vi57}U}!tOi|*;VS67g4>f zVROjgpmJ1naX4Ms-m&pvqd9IBsMDt%ihRP>?$!HFmcB}M>MBzkcn|tA0l0beTNbTr zu5R~HZM@!T>S*R`gX3)!QI}($tr_r8E`1ba{{Se3uktPnEuyZLn)ek%vWGRH&C5OF zGBMz*-_ZUH_R^*(Y)>r$NV)}xfGZk#1t2P07R~tp>8(Y?`N>hM^eW$gB}kK+%OJ7^L-TamHOe0cFMpa_tnJ2P+3yrJtjHS6=ptn@InojtZ zma;9l;P~uT9ZjOFI)>YFtBMI5So(KubaOqMjt&P70eRy}_F396*OX7K)4s_QcNa@5 zh-e#6ju)Y;YNeryN~zxH>Emu*dW;UZ$5ne!wxMrYF3zXi*wZMw)bl8)OS0&B7UM~% z?fU+E1#GoZZIHG$GE)3Uzi1~1mFfP@do8rlX?k15%*$0S1wfK_JZ*6FCxODLXss^} zw(VNwex)^Sg@?Nmx*e@>6K=rW@m+(pTkLvkOhaL(tcsqZrJm!?FwoZw@qd7Zc0`<>D74tOC;cA09TxoL^( zW`aKc7I)x*fE?Bm2n(F{d)h3~!$qWRaxw5i;v|v2PA+#sJr_^cjxW#^^1tkwXa4}$ zE6-fgm9@kZ*tZx$7c}b8OAYl;Ir@}6JKD|i)nKQkrPF4jHb&585reqnui00v9j^7h zw2H0vO&tW{nn4_nl33%zh|Vxub_RofWZ-CVkL_FeL3>hdu`Q@u&69=G7G?ecI%08k*e7 z3zSg_-5o63OIYVQquypZ?JIvvYTAu2tzD(BbZ7KDHitd$JU1sF#D(W+{{Y&)vTT&^(zbf5NS(D2I;O9?CCxjU>;aVz+8y__2yAuK zTC&+n%5oXHN-2Be!9HRVdHdZ3cl1S1X0vziXwL5-^yVbKPArlRn-^EHLjVuzS9M*l|{lSW0A6Q z+!8RspB2z`z1qX9`$V>v+p8+*Dd{9@jPT0~1cmL#P%?3qU+s5G>5C4K71p~nH1z;` zk}$ZrypEYGBD1ryzl|vFys$$|t2a`Y6cUv4<^KS`_B_Ga{+6cImzb@wx}a0;0R3Bm zc5~yw9T%nl05_~XomhqMx@&4$*1^l1cju!+PDV)s!DH-aPS+Yo-!8Jtyf)ztf=1k^f zG!Fnk=odz!?FKzjrYmNlr|y{*NQtuU&wAaU?)2)p_1>yGcDuA)E97%w50DdrahBuw zuGUVhE6TK__>EmBPsFEIw0BFP(e##twrScKu7ZuCtd9p1?v6mlaHZxR8+Zmm$Ad|x5_a4wYM2hoM9UX?Xw9JvsVQd8M z8Q}euR@SVpD#_H{{MlZ|Hx(zx7`%K>2^x}isi|rx9}UA#zhNWa?l$B6E6%#k`(1AB zBBH91;ga`pxB}4ZWFIx?>Wz+yp{bVry6=>y@5%*kM;FvJufO35llvZ+rDJ_xF z?^>Hr+$*U~J!`wRum`_kIOS~IZ`w{fZNmX?Lbh0_3%hq=G`q zD%mDr{URW9!(X}-uMzDWWl`K7u zd8f4sf)9Ao)v0x=w|kC;Mi>5(Z$%1= zG92RE3nit7mexy2%#6dc&kIsJeG@7>$b;N{UP{SNTTLyjHW}k{wsO$mO4Fq=!2UWD z;=4j=VGb1XvP#v{Q$I>oi4MZj-M<{FR?UF;ob^_lm0xvenlZ~?kDgU<1HTU#^um=z zxz8Jz?qJ7G)8bi`=)TR_RVI?Rx~3?@d#Ls_Gy+D^%JZGyEscXX_j(oRj?U@`(w4$x zd&_Cr^@W(*?v6cH9;ww19%ojj_E;`VFW3nOo))&Qx=_VtWOR@Ux`z@r#&M5TUbwp7 zU1zGRn|AVBf{pUUM zNDHGMqTKV9=da3suAZ;9nB=D*$MkFigyHfJImD#>!%O3?Lk5j}_+M z$_U5))gX>4X2G)C16>$)?Wf-1T+_c%lXz`lKYSo{#WFoATYa}Q;<;Le-f{8UKgZ(9lf0A$wCdiRh1 zD?z-qX)n>I^f2jutzW42o(cyEtvyqe3j^E8DZphhrvRr9Gy#|oao+{aD}VEhW~>(Q5dH?H;^9T&sE-Q^$q609Ya>* zBy#(WF7VG8K8u2C$z^r=t8A>0Izmp~Th(3DyO_JF<4}ZdT2n zF$*(ML}lIfa27h7g+z5^!EU1s&M_kiKgDaSq_)Au-0y^9?#Xr-Gw@q}%R3?6?9z}t zLsp|?bBU91iR9#la0kIj+v+V0sg6sf+Vi*{dMG4r(mwE%uCcxaE14zG(eD8m!TZuv z*sE^!CPqZ~>6k!$L&g{nsZzIVhKeqH7OG7``oqp;?#zF?l^IO?j(wfC3Ycl+AiA8t z49}=h@eQn^J|a##7Z`gtsD{w`hU!f}wT;|Z`n)^f1{G3g2qbi6%sWmCm~s!mtTztw zilbwl?M?HD=PNr+j_XI=wkr50JRV!L6h`7ndqg2tYk4y@By|-mFM=1y!PV^<4fv*2 z(~#1~JQ3ns%3FN}Rh*Z{aGSa(E^hB}E5&p{n-$kmF9+%zwP)a-H0x z(PVS2Q#%w|$|_lEL#bZ!0|5HLj#hd{UfC0aX`pKwcC@_XDq5z3gHg*NwrX1y4_7ok zLeqiZKnInI3k~{)m%Wm{nzA0C!silwc?qkwKk-ghq;7{mqLHpH4I?8uYI*wXL%~dOdBJRN4Tu)9{qWc8W z4$^vR<$k%^ZuaZ6k-NU9sx8Bq)48RfdHhx`rF!YpZM-vUNTEB5xsur(vrXweDW=SF zTCA4ZIolYF)I|#!Bgap9zzpXK*vhI+xbIkfcP}Yw9b?*NuDR9IX{xC$bd7P?VlQl% z9P@_}l_A;Is=8_GMO>YwYdWZ1Jk9nwD{6KJfIaQG^$4 z;0GY?Bm+JB;t88ifVSXvo@)&k)(`5;Nl24Ia>^Tx0=C7T{KRR z?G+O@Yd^fMJ*Vi3n}2IpTd#3$vfFE(*U|^H#K|_s(ClpPbm$p^5W2Q|elZdWP`k_uF0fU@6EgS2w;mhO3I8%g)IrbDYpV<=U;ngj<`~ zmAb7`q-n!;`VzWRwS8Zwt7vTy+?^zEs0?_NfLt8o!Q<6kZaSLy!Veh!TfxzIL9$S?wPpZ2;rF-G6w^;OVxLF>x2_hGGj4xGG)bu+1tSDfUnfQl%>?Lx;ke& zygW7Sb4bsc;dJJifU+pV7)I^Dd!<=)y_Z&8uRYC%%Wtc9bY}it8=f(cI1MArFH3i$ zST)S5u+N*@>sR+Olw(az{MY-PPQSJ-PTE;&YnbOi{9q8`2cTT{Q+BUWTSrk&>Z-_T zq#GI_i#tge$OTW-_GjAF${C+mYhz)Npm!APaE+Mp0G_{kt4E;=wF9hGbT!`8(A)>@ z!`yrtJk?uD8eAou<(Jj&wJ7jYrj|Y&7X2mL6dGd1PepA0Sl5vAESV1^jzfUp9uya8 zx{|9@Tp3+*s&iwLmeUScIUXmU1(ltNYa3;p?HO-c_&hNeLxNo|8bX{`a+OKO2vQ+zLX3u@ak}yCi&SG;j?-vs6 zgN*c87gm;#uhC$;TH^M+d9IvRe40c*XjOfxX$t_TxK-ORQvT#gNh{p=&I!&O+;}Qq zW?FV_YpvO+uQjzZGB@{oC1@FY9^4+CJ>sT&MyTy0SZey(v8V5p);TS$rWDc!Vkxri z(zI?o@&dJXPo{4Xc6@J^igr#K>0uQ08Sh;qNCfeL)xK+gPt)xxWm_edSFe9@LXK*r zmqykOuUks%O(>JOu*d%c>G?cD@TJOa?y1ILC+i0toO_TgLFMJ*<;tgo%2o4wrYyGUdnJzwYoE`^>|TDygaVHX7yIFx#^u>1(Uj-mfv2{9CF0n&6Z+GEq5FY1=u?|w04dhl?)K#)YNvP@KsfHsh8(ks5m!4QLoy)KG zOR9BNkkM3He&wfcwenN7?sT;5W0>;eocqrns=lKONK@mCb1uiAw7t|T+slG0hyMU2 z)SkRk_Mb;y*lzc|F&m!X=;ElXdo$05Tgsw#wXC%jv)Js~nk#IQOm{LmDV;OM(jCaa zARjd=+Qpjd+I_m7q-f1eOL(Mk6qOi_j9}fklZTU)$FEuow8$l%@u=pOO8FYr`(=18 za07rcIxMRjD=M;5sM39jM(*yKPL(*huGl&heY5Hs%MDc}7N4tRGBCy8!4!_!>(OzW ztk-J$g-rFfiiSQ%^HBK6dz+suDLPG8eWarHST9!CslMB=_lG&&Ao?kbH9gx>+o!en z7fPG9^E+gWw8Ub_;B%i9=xAD6*f&!NWbxM*`i7+47}H57zB~NQ-80&4CYiLDXc+v( zv5yn6%yA*0a6Cr~a;LV8>N-t9?9xe5P97T^Y;()E06Jku&)BzUwIWF)vJUQ2931u? z!;d_uJ5?hzmaJvI^=GK6x;WwnzA#~N$2rLd#Z+`O%F>jR%kw=F)ip{~mMKP9Sngcz z-;`vRi%mtUzS&z0bH?b&G|vPA2=QFnp5;{|C#AN-40Q6BmI?jC&UrqoqUx^C^>mtk zuH@||Aq|Da()U1ZXawb_Jy#{7qLP+jQBeA)#>2J6#9$trtD0TDoft`5q-JUwjr*jM zhXT*?oeN27_t>JD42o zjNqQV7WR*{*fQQawE5<)w{M~7v* zhv<%fis4R;gsvP@SuQU~HHvhxz_E_LWwS$ei>YnY)wT5(J2Z6Rm~0Z&hP}=o)xzJC z@|CWqdzmDi&N={HjCydnEt5oQ%|l&195&M&&1gI~oaY{D;}>EY#msDv)2^(UfDh#{ zg2VgrxZPQ4F{s?y$tpKmrwbw;6<^-t{c z!83z>o~gy4SqTA^;3}A_2t3hC@j}N)9*KId>k$5)lg@G znrY`GTc2m9wYHYyr0ud)9<@%~BzHd?C6`WUX{p4tCs0Q*8QUEwECkwnXRLtQr!r#BhC*L(i^4 zhOg{KYo%P1GOpEZhG*`4HpaRz26@|-l?dvIyl|Z%Myr-MPc~B8``4dpkW;XDzk*Qv zbaC$@vI5cO{1xe``vcH!cXv@+s7r@ZY9qn;dy8t**iUAbtF=AJ&8@339EdBWWRX1M z^qaSp*VYj(!pd##&nPrR#}e0rj~uM5WOX$RhE}}qaBD+GNhIK5dsFilKrw~w(snX) z$MQyg3nUs}N<}jyi%Qu+Var_FMgr105OARN2;-pqGg8AmlRstp)H^iVO7S}|2*oSO zKe;}SvmJX`TNSzuC0|Xv;LTABn8yDAXyb+L2GrE|o5S4PblPyW-&s6lhDhgUz?H|x zG0xd8r z$N=lg)O|yo^47>tJ_-)L&+b^{>?+tQJI7yZp3X4F zhHm}~uE$W;yX$gru|A@lNar=AWpeRz?srh7j9}neqp~~9*BGMH?i0k=@aI)HFz4~3r%Y(El+cT$-ZiS>v)lyJ;#yA$;z|TQ+*FPtG73QdxnraLgMtSy=l(W zD;;dHOd<{>nc4PoJrAnv_S(p$p^xc?O$4v#*zgDMRh}a(95Jzt#kBIes2=Uk7$A7% zc`x#YEIqJyk?m=cf)_g;C*EGap4o4RKBIMPtlOQk7M^}f$sd$;WEGvQQ}-}O5RTgm z4$+L`cVAU^Piu|faq4l>kts;F4#QGmDiBC&5|EJq2{4ri030Tt6uC*}fDxb0H{unU zzhzcg_Q%94D-K$;H2$oichGWYf_i6y*F^ymVJZ>~4M6Ib2|(pF)QOrigd}eWQ)7bI z=(kFE=`=X;~#s{o93R_#X4?@Q4G=6{N&g`rL6g+HN<7~-{Gsho7-C{1qx zDh{Kvp3YW0tc*a6*!rhq$#Y7-_vw%I%IScC5%?}?SN{Ds_RsNHdcTpgrSxV51SJD2 z4A&J1JOtDL;GMZJ6sQ5nO-ec@0;LHOWF$0XXWJb4FI{#?Pg!~FqK4l)7{H9X@nlF90h5h zw$D_+*qx2NN1DM)T*g|O^6?%Uk^$757WDk+ztcHbT>l z#x8N661JIkw#Rs7MLi{!XFzj-NZpS3f;mw1_8ARJ{ig99z2o#}YoGUUq-iC6mPf|~ z^p#lyGYEJ;aSN^!TNdRQV`F~0{`%P5+G|~go$lbi8YVT^^dq8<`a!>u8^v6a+8%kKFOKt0_8v>SlaJ!M-)3Ez>HEK96_(Rm4Z;cKnWnS4C9%AWeUsuAW%MCh zJW}Y7MdOSig(*$iZ{+jb z=A&OZ?>-{sR^QwT$WfGL-8i1IQfi(PEOhowU7`Csih7yot7@oQwrOR6kt|Ga7zNyP zRr_z{8`)J+Q_dIuQRddbd>KAf<8+(YLx!R+b!;ew8k+MjLv^c z>e{FmIOwuOwK7F6IKe;Yy*;G_sl{Ulfz%&9ypv__v$OgwOz~T!jMPFVmdh%4aft7EvfFySpM3~+mLFh0_z+9|0Fo84PmGyoR8k<`f+UEp{s#Z9NH zp{8wTdshTg<7AJibGLwfU6m_{OM%8uVm1}4Th@fB&!b&WS!umfW4zeChOz$3D;c%X zNI-DOBg5dJ?phPi}f}r$YW9L=rrrfFZZ1(dZAhnS>#BFhJ zUE|40&G|lkQ=IxgGKbT8xl#q!#)qei@xCy$Z#dwTZJc&l1blj@?MQ)Y{^zRRvb z&7rnjBajX^)RoHh$7B_-TqdfwU8jPEM;6Nz(mnApn|Ur7$5qj6U6)O#bwm}gYbvXR zVU7-s>~lvy7Zo?!71oB;r0eLXB+WcdhB1ug#ku|pcK5ZYS6rvWi#2gqG%3`Sqb28@ zuiW$An(W`&wRmeQ;=I$e!ZS&_HZw9{H__c9n5z&ALPv<&ga zR_|q6Ji}#m+V2c;R0zXH&_A1L+}z{EaqigrLvuStju;}SnUroO7sntCBs(DB_2pfw zdtX$$3N3Ta}{O^nR$g!6Paf9R}FLa`!v|)6)yQeG_G>xHZ*O ztbFXjV~+>TLRWQkd#R-yreHbIaC}kBCA!D_{mN%!+C}P1vKOhL&pkl|1zhnvMqsyq@rrjmI87YmmE7_SZ#9 z=%?D~NcV&0W53lwc2!wjrF&Sv>Z-cgUrsF(K_vrUwXKz|++EjhP8YZIW^GlL68?p6 zN)&48&Pq^tlJ^!ra`&!vexSQnJ@WQltl1%PG5-K9funAGgUaHLue&oZ1 zIL%v7$s6$ZPpXL2Uz8=^QCIi$_WFuyM-O$6lyB#e$O@Nh*O!WYMB3|v-&q`_Hb}`C z(y`9BM?u?R;k@Ni~-ZHv}HG4T(JyWLabk^-Y=hX=3t1otDE%44pGtqPEjcH!X ztb&UBH8h5xQi^i-mjSy4{2X8|m1nxqU34?*slke+h1=nA$!G_ImB@!;`i}dqq|}yY z3V`54L3m&Xc25Man`zRe;wR%)$JVarR-L5fZG_Xt{V;D$Q#U{YdItox&dN!=u`B`^i>r%{w^OS|?asF4}^cH?p+l&M#xV z@>}8XYUn+_@ z&*}88oSMGnPwcaR;{3e74GzwFu0^l)edh1l)P~h-si|!=t&W|-U9EfC^R(dkF7u8vB1Fhp>+LRq&1!z6W8`;`?V`)RT~ z(!}>l>C3XfdPWvb&Tblpd1|86tuWUzLf67x93%HZ#z!72dbXS%+iVQaBiar}kJW{b zQZu7kq;ZTUURZ@m%WdQ3vN|rRxVnc*PGgCLHX`G>ptq-pTq;h>bk45SuwNZ^7WO_y znXUU=M9vP$BL@RH@?C?pc_fFkTdeUoHSy8P;7IWdE0gKHPf2OFP|JS;p0cVC_+U9E zO#PBDFfvyiAzbn$IyuQhPPL^{(oMWeKl7>9ZS;)Ols(N083iN&M;jV3?&AX|#QLs9 zuc~UV`p$ygO;sFIOC!F!Z#WIlIP1|*+jU*?^J2SGUm zJTzqSz+C3By|bImTc~KHH0D=#WwPLH&j;%sm+vA{{YEY-`-FVd8^v3HKx`6@xk z@88}t`=nu5r;@6i`>!qs!9Jd{rbe8wAH7C6k3=Zh+rj%WH0QS4purYu9OtN~XW)_6 z+h77;q9`|mkmF9wgXhsaR=Q~moHpz@$C`Y#(D2h4armk8K1UaA7bY-F_R8X33F<;? zCy=!CclB1pE{>pk%nf(xEFQae;teUr4~!wXg@F0j;ZmNzkn zfCo8S^z;>S$0Oc*vU)qO?or}8Ms*(8G50ZG7oI$mC1gzcvRncEQ-W4=XLH+^R-ND3 zSk0=T@_#-bfyW8)ZP4u)u_c_r@*0aHm9IaPI-to?KnRl0hk%l^kyJO%DYkHqG zk#P=B5Nq*M&oF#z7e2_y&Od1;Km`9Nv zRVoMv=QYYVO5hC6a~a?UI$>L5bTUi2Ih^M8=Y>Uu(=%3F9@sMxnb|wCPYN=|3K!W) zV72Mm3oS*lwwM&JquvNK_l01ww zZ3C0|sjHDS^pe2gmbsfSO6L~5%*W8=wp~$6CZc@}zVs^EWFlB)d!Ad)IL|@wTodw{ zqo<_piW5%I86~1(-u7iYtyu~o1_k&dCcN+KF{@6nSUv5!?nt07w^Tg9)9<& z3k-7_L7!I_QQju#NhWMkw9w)d10BBD5CZ%cRGA4F6AqmVr>JyOR(CM1A zY|~U(9w+#!Q*n~6`pgFD${-J)@l)O)^;(WMScB zPhv77E`F)s1Yi2*!E2ROLo$y@Rq++sf?UjkE`5PKi!e%56JWz#*Yywa+ktpbv z07RhW7)Uyx2PFpqA``$1;E)WXDMyMh1L7ZAJ}cRMinfj2ms`bC+Q#p2F2^{?UNwkj zLGd5Odz-QQJrv!ETBHs7!d^+q^i{4>aNOfsSVfZPVvZ2nS&QQ*f;^V(mUti)_I9&6(Rd9q#kzqO;6WDLR=QN2aW`(gMvu$4KmbQ=lXFfuGAF|nl^4``g{pLtJQ2)3s=!jnx5Lp z9&v{k5J%j(bD*9uTUB^=;VSkj-D5;u1qIEp3ZHe&FtmgB;a>iU*3^==Q8aSwV3E$; z&SMMWXX@xYk7-Rb>=L z5IxPV<+MU0=mBa zp{Ap37n@mL9Vo& zWG0SXA2iN9mwRKGljp!puxne+oT{szM9AwkJk0K;f61@6`n^o-R{HV zaNp<7P7&K?$O|j8R1L^7Czw~m#+@FfNX^nTUtvIo1I`&hU$Ja8ZMmuj9 zBp3AHqQ6l(B*?bna}k&Dic)NYHao0%WM1C+QBD#+~DB)E`eyc_Ff5VdImN&d)NEZDHFS^zN7Fdx3d8FhhWT{fnqKwyRVTwm$M*tr*X8R_X2f z#3@4?JmC2VUHC7YR=As+e3Z|%JA249<4Hg3{{W+iJ6Cqh=HTgykU-#)2mQrblH;$c zbpvi%lA)46eq9%Oz|-#I9~>`ATf0`a>T9Ddl#@D(n0pVKEF(;cB!S*%e- zX``IAq=!u3bRJ3ZX~$K)cw}V5#m>uoZG0COzChN3!qLbM1aMEpTc?^Z`57d^g`Su# zD#oKy*EzULC4DA(tvXqx)MERPTI*Bmi_Nk-W%@{?q=<=kM>`}h$i@cI$5lgZ(UzAQ zsA^vm$j0WkdHw6KT{{Q3T4>^^ykAT0ZFXdR1B9<=^9|dAvFXmo;k?zyS8sj3S~#W1 zZNh%+%GSH1+6Ng?wbZQW(tI5Uaii)NZ^TuSX?d-YRqUeU+8(mi(^F|GX{uvvL``z3 z%n`%`o0fuGhda~Jb&KR$n$xc8?De{`w8^G&+KPOJ#MElA>NGZN90}zEO+-a^C=`!uw9E zTZ*h!8KX|E>|x4ev4J@ZgsYz?Z_R|qKXwX)KEeJfyIM}CuAft1Z!k%UntRQ$!m^So{Kf53;DEqz zNzXk7S4E}m630VpVAqxlm9FU6_IGg7zCcJG>zZAR^PdImwEJsVu4SxNK1K$scYi3V zH!{b|Z}vRz+GqPN(zAUNZtUJS*Y57x8u_DZPfX{L#zN-J?7LglN0_Y6d~O*Ii*vvp zgf({!d8@l7yoq0Oy5A$L6NwAGjg4?11?*>?NnaU=%LG5E0{qeCmCEd zdiS(qowRe3{{W-bw)NpIds$Cxyc(JxNM7{TlCFZb*?6q1414Kf6msqF4g|oZqIuQr1oXnb^BgVQ!O=gtfY$oJ0A9TVDLh@c8S^* z&qipOE^xxyr?Jgp-15`TdEhUc-D+1H{#8m#iJsb&t}U@bn^I5bpY}Pd#_q}8J9SQ{ zcIRZ5SY5&SE%@!XEp1|oS@q>)v~D?P{!VL2Eq90~jzXESYM#?IR*#~-QCjTgmf;AV z9{RQIe$&SzVvX$19a!xl53*3$UkhI&fT^o{9^zi?@EUwUS`_0NUfta#6mqRzvZm)w zONuZ4c@qxOT8h5gQ*EELDzi^BJGZs8ENLx1x#3GG7V3IP>fa-2qHH0>fM;mJhS9px^{uS+BHd!5hUrf+W82i00Cqt-JM z6p`s?H1menNJssZQo8EhL8s{I<~B_?IHv*6_Imjo>}MS|`l1(>b!WvMr)c`(ta(&t z?BL0Fw9(k06*gJwZM8LXwZ73!1F9r(IXgso=PEKt@B1E3snsqZlg^)WRnoGyS+4q8 zv$-(3OOzRII%SUYU5(BzpnKeN?th}f*EI-QTt+IIc_C|maYmBnJh$BQb*|ZWyW8Tg zgI?D<8JoH?>IMvqk>}`DuS{DGo72MC4P>>B624O-qYT_!a(D|qhO^B#XI80qmx&{D znjUx=k=!e2vdtYMn<->@96BSo{`Kl?sKPK+BNUr6H7m=?l9d-PXCx!8l?*KcGVJhp z=$z}6xggVzj#QIu{l^Tek=gSBBka3cWOKpw&r+{uMpR>0&5>T&BeRNK*!4=+#SUC4 z=J&ecgyZ)q8cJuv;^N%3NYhO_V{mW`Z-50pCXTe0J>sSH4y$m9t{{#E4^@;=NPezJ zMm)h&=AN9FPUe6!$sQ{!BB3Pv?#fNJbc&CeTWu4eJ6SuL5A|}gdn=?HBzv*vj4K3` z^sZ~85|+61aO$-UG|f0e&Ln3D=Q|z zb67)qob(G6VTN|KvJyvKoRq_v+{Yb6%-k84=dR(x%dzrgIm|idIZyVWB`o$w$>-iQ zfU=pPF8Apg(dIIvhBTAi5zlVWMhVC2jIC!#_5xcI&VQ;@#8p&%`D0r44?JOH{!7b^ zM2#FB1Hznh z4nLYW9*Yx;MspZQZaL^gHM`ndBLMK>QE4e4gHu=ca=b|-u5j@IbeA!i&H(XT*`fac zo_7|38I05x?GDS2#3bIvee?EGHtejZj;eP&?rVrS1zA~HKXtLJbNro!lAldSNl0Lg z?;F43yTL1{E*4u`vhh&dk|Zae+_~i$juJ?RyRv$kH$?JUDtM` z+IEK?XZWgAT@}k%5%diX4;VkiQ&=!Ev}yi@KcSNk)vNVpW{{U5Fed?!kv6b9s&jl( zM+w7(5i@kBar9i)q>pTu`(<>Xa|?j-T-vM#S4`g!^OcLM{{ShqrSxVls6gn2iGx@W zgdhRFDaomFgn(2e2PsnkN<2~}9w-6voH!BSLiNvQI@&vTV)m+5hq^|}_TUBNh?-pf zG1PeauW9yEqUkGp61P;k20lXPy{_s(RPP($*souqaig*7JxgM3T|GdjYq@Vc{ot*- zT{(NCV_>PMYndyD@3KFLIcZBpkBAR#$d2k$-T{Bg~Z@=z+P6P zxzpSA^X@e?g03yj;(j+|c&k?OmRmSh_EyN+wOgvgSqY@6xkuq7(H4h%f_?6D6E@OX zVxwb5*F*{A`Kv9*v`UJrV<{~ZH1rMqcuB}rI-51x_~*$}S6T_=yo>|)r3EJQEsT0| zTv?vQdRk3ER6EDkP_i&G#=fDgAbbjK1qJH5HyJMU&18NKsA%~uhUjxqG=ie8Trt?^ z2Zgg$Y10;W#~X!pQ=Qj)0ciLYbybR3T}_Hrpq3GWlHW}wPWro??h&3lwufZ=RjQ81 z4MW>4uDW*|bCv)?ug6tBM0U$%z8GEhT`pRF^<%bcM`@T0Ra6$KT>k)g$j9Wgk5yKx zsMcbRb!91gr1$3C$+mV$R``otIT9VN`@*bNXma|OR6~6f`$po(+{1+zcI_&*;Vhz} zV&+TwF%og`S{BR2B~?R3QL13whaJB0Z<6NcZ10e z+wUmKyUoe-NlP7MvNWEua2G_=`eR33d&z?@5Juj6%DCFr{M4lOUd!x_6*pUnloP{a zd@d*MQFj=4ammHqr!MC%6!p~=0n$CMcG2$#aGNz9&Sj1l7X8NVyL%wOvruSo$;`Y^lnF0(w#{^ekHn8YR&smDU<@5v8*#w z!!&Liwoj1L@mujw7StJOV4#X7^ns2$S4O7n8tEKCwU=5TLBm@MhyZ++^|SJNX}>nE z<*27^5FYdtl7LT^0ck^?Hb|Up>dsCuM?L)3o%WfTSz7};z)Kk$^Rqr9J}SFUWs;8F zRwb3SF|p$k%zm?s^zg#;WBVA=p6C}XLhKR2sAvBG^HR2+%XICQv)Y+QRa=qvE*m6g z%V<%HXz2|);vVx@JefUglru8Aj-ChX@SQNs7Uj{pV_ z3)?i>BTZCXB7B-=)wVP4x7k^N`;^o4t)h~4)zVrmuuR+l_^H^}54;7|HR86xqe{ao zbHx-iy|c1b`z@nY(jB|KI*XP>Mqh~?$4W0+b?lYy^a+U&rKs(@!%dyan*YY zOGDn!`QI}RGBzA2Eqh5vA7z(Uce6T1!am!^KG5)0Zz{r6q_Ajd7QDOaa&cQUV7A%x z-_eYceJyHs2QDxIwc)&WV%n)GCDYaxJ~tM-ba8``=t`TVmWXNg#_3zTXN!WPc6(s4 zTz@!ft8J8Zatp+*6H60bLw2;|Brlxl_MSGZ;M+&jD@vSUI<UnbRXbz4KG|WeqmI>B=E}npsu>9^Xd|vx)`opGA8NXeh&`~=K`bnW z5Cd4iVFZ9aDr2@O=<547xv{kk%PFKj>$&?YHl>=kzEN^-45@85PWGQy7u=8R&rQ-< z^rIZdx_8J)FMd3E`EsJQ=8@F5tHe`K>WV9L4QUI3Oo$%?n+tFO99C*3`D@U=G$ftm6$s*)vuV&&2wooMl-p!1d;oeJp$^RA85CkE|qPpmX_M-Un36ev^aG8f_r-- zyup{p+HEjCJ6`Oc-l4R(w!3`|b$wfIJ?rIlWZmH#8VJV<9xXXtN3YqdY#NT&O)#W&DT=ZqAT2KrCx;Gr zAH7aCywqIbxa!Nrs-mihzuD!ZX^E_Bh8?&$$2}E^-O-htqSj{DZ!^y77ZvN=DN}EU z8?1Sip4hGIqP0V*DKg5tZffFt4hef2a0wm?$5zVbP|#{^N2l#I(8)~Ch`sqE~Rb1Cwublsjw>`$}n*Jqd7%{zbEY79-NC4hiK-tWO*yGOOt zRx;B;JS~zbuGEZs9x@!$Cm@As)Y3vfC?4g`Ya8@zIXM3S-n~QijaNo47AV;(OTL$* z>Hh#ReCJb*Pg}1wo~N+3xt&PUl3&VnIW(O$1*wry)6>BOObw1W*cuo-fD43naS1v? zGSQO9$}|4}#d`Er{^KPru(BPlBsci31=)>ND>M*&L)zIK`3^mM$E`hgJfxyS(fYMr z8j_az$NG<@vR(fGKc&<*+trpaB_N}GRl)B4E!i7L@>^7zR^=CIk?Nbh`pYxDo7o!$ z7V&^xpVB2$DQz%nF4!lw)mK-FI4#1Y$4OFQCEeg}BzhIOOKzvJcJ)PSqpi4m6RpCe zvbLnlhxeGs&%sfhwcE0CQ}%Jt*{@DMA;nMH;qB$vo$dCNN1>_e!34HwfBd4?tdz}5 zJQ-_R?WBx!!OGt4>avcbv)E&bb~uWN4l~pV23AX@9R##d&kW7)2<5FSCeAWcV5Gdu zdQ|akO;lcNfb1smYNWJR(^OT{#VaS7&JTD511Ae(S!k-wU#b1N*R8F#*miC1pCQYR z;&*Z2sd^_!)#_a#S4hoEL1w3QY`K4Md*@-~V8|Q}JruF*gvC$*?QWmE1CCq{KfbM0 zwuEcCv6k=Tbh+h1?sZj189)4THeSoMH6w#hYPQzrfDEqZ_pMuRXS8

*+PU>ZWQ+ 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 literal 0 HcmV?d00001 diff --git a/boards/arm/stm32h7/linum-stm32h753bi/configs/nxdoom/defconfig b/boards/arm/stm32h7/linum-stm32h753bi/configs/nxdoom/defconfig new file mode 100644 index 00000000000..b4c2c9f1bba --- /dev/null +++ b/boards/arm/stm32h7/linum-stm32h753bi/configs/nxdoom/defconfig @@ -0,0 +1,105 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set +# CONFIG_MMCSD_MMCSUPPORT is not set +# CONFIG_STANDARD_SERIAL is not set +# CONFIG_STM32_LTDC_L1_CHROMAKEYEN is not set +# CONFIG_STM32_LTDC_L2 is not set +CONFIG_ALLOW_GPL_COMPONENTS=y +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="linum-stm32h753bi" +CONFIG_ARCH_BOARD_LINUM_STM32H753BI=y +CONFIG_ARCH_CHIP="stm32h7" +CONFIG_ARCH_CHIP_STM32=y +CONFIG_ARCH_CHIP_STM32H753BI=y +CONFIG_ARCH_CHIP_STM32H7=y +CONFIG_ARCH_CHIP_STM32H7_CORTEXM7=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y +CONFIG_ARMV7M_DTCM=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_BOARD_LOOPSPERMSEC=43103 +CONFIG_BUILTIN=y +CONFIG_CRYPTO=y +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DRIVERS_VIDEO=y +CONFIG_FAT_DMAMEMORY=y +CONFIG_FAT_FORCE_INDIRECT=y +CONFIG_FAT_LCNAMES=y +CONFIG_FAT_LFN=y +CONFIG_FB_OVERLAY=y +CONFIG_FS_FAT=y +CONFIG_FS_PROCFS=y +CONFIG_GAMES_NXDOOM=y +CONFIG_GAMES_NXDOOM_ENDOOM=y +CONFIG_GAMES_NXDOOM_FB_CMAP=y +CONFIG_GAMES_NXDOOM_FILLSCREEN=y +CONFIG_GAMES_NXDOOM_KBDPATH="/dev/kbda" +CONFIG_GAMES_NXDOOM_PREFDIR="/mnt" +CONFIG_GAMES_NXDOOM_ROWSTAGE=y +CONFIG_GAMES_NXDOOM_STACKSIZE=16384 +CONFIG_GAMES_NXDOOM_STATIC_SCRNBUF=y +CONFIG_GRAN=y +CONFIG_GRAN_INTR=y +CONFIG_HIDKBD_KBDUPPER=y +CONFIG_HIDKBD_NOGETREPORT=y +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_LIBC_LOCALE=y +CONFIG_LIBM=y +CONFIG_LINE_MAX=64 +CONFIG_MMCSD=y +CONFIG_MMCSD_SDIO=y +CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE=y +CONFIG_MM_REGIONS=5 +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_DISABLE_IFUPDOWN=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_READLINE=y +CONFIG_PREALLOC_TIMERS=4 +CONFIG_RAM_SIZE=245760 +CONFIG_RAM_START=0x20010000 +CONFIG_RAW_BINARY=y +CONFIG_RR_INTERVAL=200 +CONFIG_RTC_ALARM=y +CONFIG_RTC_DATETIME=y +CONFIG_RTC_DRIVER=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_SDMMC1_SDIO_MODE=y +CONFIG_START_DAY=6 +CONFIG_START_MONTH=12 +CONFIG_START_YEAR=2011 +CONFIG_STM32_FMC=y +CONFIG_STM32_HSI48=y +CONFIG_STM32_I2C3=y +CONFIG_STM32_LTDC=y +CONFIG_STM32_LTDC_FB_BASE=0xC0600000 +CONFIG_STM32_LTDC_FB_SIZE=2097152 +CONFIG_STM32_OTGFS=y +CONFIG_STM32_PWR=y +CONFIG_STM32_RTC=y +CONFIG_STM32_SDMMC1=y +CONFIG_STM32_USART1=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_ZMODEM=y +CONFIG_SYSTEM_ZMODEM_MOUNTPOINT="/mnt" +CONFIG_SYSTEM_ZMODEM_PKTBUFSIZE=1024 +CONFIG_SYSTEM_ZMODEM_RCVBUFSIZE=1024 +CONFIG_SYSTEM_ZMODEM_SNDBUFSIZE=1024 +CONFIG_TASK_NAME_SIZE=0 +CONFIG_USART1_RXBUFSIZE=4096 +CONFIG_USART1_SERIAL_CONSOLE=y +CONFIG_USART1_TXBUFSIZE=1024 +CONFIG_USBHOST=y +CONFIG_USBHOST_ASYNCH=y +CONFIG_USBHOST_HIDKBD=y +CONFIG_USEC_PER_TICK=1000 +CONFIG_VIDEO_FB=y From 0d102f1cfff6653150efc6d0cb01179ac1b6cd6c Mon Sep 17 00:00:00 2001 From: Jorge Guzman Date: Thu, 30 Jul 2026 02:38:22 -0300 Subject: [PATCH 5/5] Documentation/applications/games/nxdoom: document the display options The options that let a board trade memory for drawing speed were only described in their Kconfig help, where someone bringing the game up on a new board is unlikely to find them. Describe what each one does and when it is worth enabling. Signed-off-by: Jorge Guzman --- .../applications/games/nxdoom/index.rst | 43 +++++++++++++++++++ .../boards/linum-stm32h753bi/index.rst | 13 +++--- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/Documentation/applications/games/nxdoom/index.rst b/Documentation/applications/games/nxdoom/index.rst index 4129f89c7a7..ed9c34a92da 100644 --- a/Documentation/applications/games/nxdoom/index.rst +++ b/Documentation/applications/games/nxdoom/index.rst @@ -93,6 +93,49 @@ To launch the game, just run: and replace the path with your WAD file's path. +Tuning the display for a board +------------------------------ + +DOOM renders a 320x200 image with 8 bits per pixel and a palette, and the port +scales that up and converts it to whatever the frame buffer wants. How much +that costs depends a great deal on the board, so the following options are +available. All of them are disabled by default, which leaves the behaviour +unchanged, and each is worth enabling only where it pays. + +``CONFIG_GAMES_NXDOOM_FB_CMAP`` + Load the DOOM palette into the frame buffer's colour map and blit the + palette indices unconverted, letting the display convert them while it scans + out. This needs a frame buffer that is 8 bits per pixel and supports + ``FBIOPUT_CMAP``, such as an STM32 LTDC layer configured for L8. It removes + the conversion from the blit and halves the amount of data written per + frame. + +``CONFIG_GAMES_NXDOOM_FILLSCREEN`` + Stretch the image over the whole display instead of scaling it by the + largest whole number that fits. This fills a display whose size is not an + exact multiple of 320x200, at the cost of a scale factor that is not uniform + across the image. Without it the image is scaled by a whole number and + centred, leaving a border. + +``CONFIG_GAMES_NXDOOM_ROWSTAGE`` + Build each output row in a staging buffer and copy it out, rather than + writing the frame buffer a pixel at a time, so that the frame buffer only + ever sees burst-friendly copies. Costs a few kilobytes of ``.bss``. This is + worth a lot when the frame buffer is external memory and the data cache is + in write-through mode, and little otherwise. + +``CONFIG_GAMES_NXDOOM_STATIC_SCRNBUF`` + Place the buffer DOOM renders into in ``.bss`` rather than taking it from the + heap, which puts it in internal RAM on a board whose heap is mostly external + memory. The renderer draws in vertical columns, so consecutive writes are + one screen width apart and none of them coalesce, which makes external memory + close to the worst case for it. Costs 64000 bytes of RAM whether the game + runs or not. + +As an illustration of the effect, on an STM32H753 driving a 1024x600 panel +whose frame buffer lives in SDRAM, ``ROWSTAGE`` and ``STATIC_SCRNBUF`` are +worth 2.7 times the frame rate between them. + Other Notes ----------- diff --git a/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst b/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst index c105b3855cc..2f57f072265 100644 --- a/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst +++ b/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst @@ -1150,8 +1150,8 @@ reset the board and check that all three devices came up:: zero Mount the card and start the game. ``nxdoom`` looks for the IWAD in the -current directory, so either ``cd`` to the mount point first or point it at the -file with ``-iwad``:: +current directory, so either ``cd`` to the mount point first or point it at +the file with ``-iwad``:: nsh> mount -t vfat /dev/mmcsd0 /mnt nsh> nxdoom -iwad /mnt/doom1.wad @@ -1183,10 +1183,11 @@ file with ``-iwad``:: hu_init: Setting up heads up display. st_init: Init status bar. -**Copying the IWAD with zmodem:** the configuration also enables the ``rz`` and -``sz`` commands, so the IWAD can be copied over the serial console instead of -moving the SD card to a card reader. ``CONFIG_SYSTEM_ZMODEM_MOUNTPOINT`` is -set to ``/mnt``, so a received file lands on the SD card:: +**Copying the IWAD with zmodem:** the configuration also enables the ``rz`` +and ``sz`` commands, so the IWAD can be copied over the serial console +instead of moving the SD card to a card reader. +``CONFIG_SYSTEM_ZMODEM_MOUNTPOINT`` is set to ``/mnt``, so a received file +lands on the SD card:: nsh> mount -t vfat /dev/mmcsd0 /mnt nsh> rz