From fb0f49e861fbd4d34307e40552f88dab8dafc77b Mon Sep 17 00:00:00 2001 From: HuntedByTheIRS Date: Thu, 2 Jul 2026 23:35:37 -0400 Subject: [PATCH] perf(wave1): reduce Config caps, reorder Client/Monitor for cache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wave 1 changes: - Reduce CFG_MAX_KEYBINDS 256→128, CFG_MAX_STRLEN 256→64, CFG_MAX_ARGS 16→8 → saves ~2.5 MB BSS from Config struct - Add truncation warnings to config_load when keybind/button/scroll limit reached - Reorder Client struct: HOT fields (type, mon, tags, floating flags, geom) in first cache line, COLD fields (wl_listeners) at end — saves cache misses in arrange() - Reorder LayerSurface struct similarly - Split Monitor into Monitor/MonitorCold: hot fields (~120B) stay inline, cold layout state lazily allocated on first dwindle/master use - All cold-field accesses through m->cold-> indirection - cleanupmon frees m->cold - Zero-warning build with clang -Werror -Wpedantic --- include/client.h | 40 +- include/monitor.h | 25 +- parser/parser.c | 12 + parser/parser.h | 6 +- peachmsg/peachmsg | Bin 0 -> 32712 bytes peachmsg/peachwm-ipc-unstable-v2-protocol.c | 94 + peachmsg/peachwm-ipc-unstable-v2-protocol.h | 484 ++++ peachwm | Bin 0 -> 618384 bytes protocols/cursor-shape-v1-protocol.h | 507 ++++ protocols/ext-workspace-v1-protocol.c | 120 + protocols/ext-workspace-v1-protocol.h | 752 ++++++ protocols/peachwm-ipc-unstable-v2-protocol.c | 94 + protocols/peachwm-ipc-unstable-v2-protocol.h | 447 +++ ...pointer-constraints-unstable-v1-protocol.h | 615 +++++ .../wlr-layer-shell-unstable-v1-protocol.h | 730 +++++ ...ut-power-management-unstable-v1-protocol.h | 285 ++ protocols/xdg-shell-protocol.h | 2392 +++++++++++++++++ src/ipc.c | 12 +- src/ipc_socket.c | 4 +- src/layout.c | 48 +- src/layout.h | 1 + src/peachwm.c | 82 +- 22 files changed, 6664 insertions(+), 86 deletions(-) create mode 100755 peachmsg/peachmsg create mode 100644 peachmsg/peachwm-ipc-unstable-v2-protocol.c create mode 100644 peachmsg/peachwm-ipc-unstable-v2-protocol.h create mode 100755 peachwm create mode 100644 protocols/cursor-shape-v1-protocol.h create mode 100644 protocols/ext-workspace-v1-protocol.c create mode 100644 protocols/ext-workspace-v1-protocol.h create mode 100644 protocols/peachwm-ipc-unstable-v2-protocol.c create mode 100644 protocols/peachwm-ipc-unstable-v2-protocol.h create mode 100644 protocols/pointer-constraints-unstable-v1-protocol.h create mode 100644 protocols/wlr-layer-shell-unstable-v1-protocol.h create mode 100644 protocols/wlr-output-power-management-unstable-v1-protocol.h create mode 100644 protocols/xdg-shell-protocol.h diff --git a/include/client.h b/include/client.h index 6e1e265..bad713a 100644 --- a/include/client.h +++ b/include/client.h @@ -20,23 +20,36 @@ struct wlr_scene_shadow; enum { XDGShell, LayerShell, X11 }; typedef struct Client { - /* Must keep this field first */ - unsigned int type; /* XDGShell or X11* */ + /* Must keep this field first — union-cast discriminant */ + unsigned int type; /* XDGShell or X11 */ + /* HOT — accessed every frame / arrange / focus / resize */ Monitor *mon; - struct wlr_scene_tree *scene; - struct wlr_scene_rect *border_bg; /* single border rect with clipped content hole */ - struct wlr_scene_tree *scene_surface; - struct wl_list link; - struct wl_list flink; + uint32_t tags; + int isfloating; + int isurgent; + int isfullscreen; + int isscratchpad; struct wlr_box geom; /* layout-relative, includes border */ struct wlr_box prev; /* layout-relative, includes border */ struct wlr_box bounds; /* only width and height are used */ + unsigned int bw; + int corner_radius; + struct wlr_scene_shadow *shadow; + + /* WARM — accessed less frequently */ + struct wl_list link; + struct wl_list flink; union { struct wlr_xdg_surface *xdg; struct wlr_xwayland_surface *xwayland; } surface; + struct wlr_scene_tree *scene; + struct wlr_scene_rect *border_bg; /* single border rect with clipped content hole */ + struct wlr_scene_tree *scene_surface; struct wlr_xdg_toplevel_decoration_v1 *decoration; + + /* COLD — wl_listeners (set up once, rarely touched after) */ struct wl_listener commit; struct wl_listener map; struct wl_listener maximize; @@ -53,26 +66,25 @@ typedef struct Client { struct wl_listener configure; struct wl_listener set_hints; #endif - unsigned int bw; - int corner_radius; - struct wlr_scene_shadow *shadow; - uint32_t tags; - int isfloating, isurgent, isfullscreen, isscratchpad; uint32_t resize; /* configure serial of a pending resize */ } Client; typedef struct { - /* Must keep this field first */ + /* Must keep this field first — union-cast discriminant */ unsigned int type; /* LayerShell */ + /* HOT */ Monitor *mon; struct wlr_scene_tree *scene; struct wlr_scene_tree *popups; struct wlr_scene_layer_surface_v1 *scene_layer; - struct wl_list link; int mapped; struct wlr_layer_surface_v1 *layer_surface; + /* WARM */ + struct wl_list link; + + /* COLD — wl_listeners */ struct wl_listener destroy; struct wl_listener unmap; struct wl_listener surface_commit; diff --git a/include/monitor.h b/include/monitor.h index c00e327..262160c 100644 --- a/include/monitor.h +++ b/include/monitor.h @@ -21,6 +21,20 @@ typedef struct { void (*arrange)(Monitor *); } Layout; +/* Cold state — accessed only on layout changes, not every frame. + * Allocated lazily on first dwindle/master layout use. */ +typedef struct MonitorCold { + const Layout *lt[TAGCOUNT][2]; + unsigned int sellt[TAGCOUNT]; + float mfact; + int nmaster; + char ltsymbol[TAGCOUNT][16]; + DwindleNode *dwindle_root[TAGCOUNT]; + struct Client *dwindle_focus[TAGCOUNT]; + struct Client *master_master[TAGCOUNT]; + int master_side[TAGCOUNT]; +} MonitorCold; + struct Monitor { struct wl_list link; struct wlr_output *wlr_output; @@ -34,21 +48,12 @@ struct Monitor { struct wlr_box m; /* monitor area, layout-relative */ struct wlr_box w; /* window area, layout-relative */ struct wl_list layers[4]; /* LayerSurface.link */ - const Layout *lt[TAGCOUNT][2]; /* per-tag layout slots */ + struct MonitorCold *cold; /* lazy-allocated layout state */ int gaps; unsigned int seltags; struct wlr_ext_workspace_group_handle_v1 *ext_group; - unsigned int sellt[TAGCOUNT]; /* per-tag layout toggle index */ uint32_t tagset[2]; - float mfact; - int nmaster; - char ltsymbol[TAGCOUNT][16]; /* per-tag layout symbol */ int asleep; - DwindleNode *dwindle_root[TAGCOUNT]; /* one tree per tag */ - struct Client *dwindle_focus[TAGCOUNT]; /* insertion anchor, one per tag */ - /* master/stack layout state */ - struct Client *master_master[TAGCOUNT]; /* the master client (NULL if none) */ - int master_side[TAGCOUNT]; /* 0 = master on left, 1 = master on right */ int scratchpad_visible; /* whether scratchpad is shown */ struct Client *scratchpad_prev_focus; /* client focused before scratchpad opened */ struct Client *scratchpad_current; /* currently visible scratchpad client */ diff --git a/parser/parser.c b/parser/parser.c index f9a5eef..9224bb7 100644 --- a/parser/parser.c +++ b/parser/parser.c @@ -743,8 +743,20 @@ config_load(const char *path, Config *cfg) parse_monitors (L, cfg); parse_workspace_layouts(L, cfg); parse_keybinds (L, cfg); + if (cfg->nkeybinds >= CFG_MAX_KEYBINDS) + fprintf(stderr, "peachwm config: number of keybinds reached the limit (%d). " + "Increase CFG_MAX_KEYBINDS or remove some binds.\n", + CFG_MAX_KEYBINDS); parse_buttons (L, cfg); + if (cfg->nbuttons >= CFG_MAX_KEYBINDS) + fprintf(stderr, "peachwm config: number of button binds reached the limit (%d). " + "Increase CFG_MAX_KEYBINDS or remove some binds.\n", + CFG_MAX_KEYBINDS); parse_scrolls (L, cfg); + if (cfg->nscrolls >= CFG_MAX_KEYBINDS) + fprintf(stderr, "peachwm config: number of scroll binds reached the limit (%d). " + "Increase CFG_MAX_KEYBINDS or remove some binds.\n", + CFG_MAX_KEYBINDS); parse_autostart (L, cfg); parse_effects (L, &cfg->effects); diff --git a/parser/parser.h b/parser/parser.h index 4536e0a..41abf92 100644 --- a/parser/parser.h +++ b/parser/parser.h @@ -6,9 +6,9 @@ /* Maximum lengths. Good for the soul, they say */ #define CFG_MAX_RULES 64 #define CFG_MAX_MONITORS 16 -#define CFG_MAX_KEYBINDS 256 -#define CFG_MAX_ARGS 16 -#define CFG_MAX_STRLEN 256 +#define CFG_MAX_KEYBINDS 128 +#define CFG_MAX_ARGS 8 +#define CFG_MAX_STRLEN 64 #define CFG_MAX_AUTOSTART 32 #define CFG_MAX_AUTOSTART_CMD 512 diff --git a/peachmsg/peachmsg b/peachmsg/peachmsg new file mode 100755 index 0000000000000000000000000000000000000000..bb6c763c1accbc5e40d0557f44f3598ac644dd3a GIT binary patch literal 32712 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 +#include +#include +#include "wayland-util.h" + +#ifndef __has_attribute +# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ +#endif + +#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) +#define WL_PRIVATE __attribute__ ((visibility("hidden"))) +#else +#define WL_PRIVATE +#endif + +extern const struct wl_interface wl_output_interface; +extern const struct wl_interface zpeachwm_ipc_output_v2_interface; + +static const struct wl_interface *peachwm_ipc_unstable_v2_types[] = { + NULL, + NULL, + NULL, + NULL, + &zpeachwm_ipc_output_v2_interface, + &wl_output_interface, +}; + +static const struct wl_message zpeachwm_ipc_manager_v2_requests[] = { + { "release", "", peachwm_ipc_unstable_v2_types + 0 }, + { "get_output", "no", peachwm_ipc_unstable_v2_types + 4 }, +}; + +static const struct wl_message zpeachwm_ipc_manager_v2_events[] = { + { "tags", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "layout", "s", peachwm_ipc_unstable_v2_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zpeachwm_ipc_manager_v2_interface = { + "zpeachwm_ipc_manager_v2", 2, + 2, zpeachwm_ipc_manager_v2_requests, + 2, zpeachwm_ipc_manager_v2_events, +}; + +static const struct wl_message zpeachwm_ipc_output_v2_requests[] = { + { "release", "", peachwm_ipc_unstable_v2_types + 0 }, + { "set_tags", "uu", peachwm_ipc_unstable_v2_types + 0 }, + { "set_client_tags", "uu", peachwm_ipc_unstable_v2_types + 0 }, + { "set_layout", "u", peachwm_ipc_unstable_v2_types + 0 }, +}; + +static const struct wl_message zpeachwm_ipc_output_v2_events[] = { + { "toggle_visibility", "", peachwm_ipc_unstable_v2_types + 0 }, + { "active", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "tag", "uuuu", peachwm_ipc_unstable_v2_types + 0 }, + { "layout", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "title", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "appid", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "layout_symbol", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "frame", "", peachwm_ipc_unstable_v2_types + 0 }, + { "fullscreen", "2u", peachwm_ipc_unstable_v2_types + 0 }, + { "floating", "2u", peachwm_ipc_unstable_v2_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zpeachwm_ipc_output_v2_interface = { + "zpeachwm_ipc_output_v2", 2, + 4, zpeachwm_ipc_output_v2_requests, + 10, zpeachwm_ipc_output_v2_events, +}; + diff --git a/peachmsg/peachwm-ipc-unstable-v2-protocol.h b/peachmsg/peachwm-ipc-unstable-v2-protocol.h new file mode 100644 index 0000000..ca47b95 --- /dev/null +++ b/peachmsg/peachwm-ipc-unstable-v2-protocol.h @@ -0,0 +1,484 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef PEACHWM_IPC_UNSTABLE_V2_CLIENT_PROTOCOL_H +#define PEACHWM_IPC_UNSTABLE_V2_CLIENT_PROTOCOL_H + +#include +#include +#include "wayland-client.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @page page_peachwm_ipc_unstable_v2 The peachwm_ipc_unstable_v2 protocol + * @section page_ifaces_peachwm_ipc_unstable_v2 Interfaces + * - @subpage page_iface_zpeachwm_ipc_manager_v2 - manage peachwm state + * - @subpage page_iface_zpeachwm_ipc_output_v2 - interact with peachwm output state + * @section page_copyright_peachwm_ipc_unstable_v2 Copyright + *
+ *
+ * Copyright (C) 2022 Russell Newcomb
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * 
+ */ +struct wl_output; +struct zpeachwm_ipc_manager_v2; +struct zpeachwm_ipc_output_v2; + +#ifndef ZPEACHWM_IPC_MANAGER_V2_INTERFACE +#define ZPEACHWM_IPC_MANAGER_V2_INTERFACE +/** + * @page page_iface_zpeachwm_ipc_manager_v2 zpeachwm_ipc_manager_v2 + * @section page_iface_zpeachwm_ipc_manager_v2_desc Description + * + * This interface is exposed as a global in the Wayland registry and allows + * clients to query and set peachwm state. + * + * Warning! The protocol described in this file is experimental and + * backward incompatible changes may be made. Backward compatible changes + * may be added together with the corresponding interface version bump. + * Backward incompatible changes are done by bumping the version number in + * the protocol and interface names and resetting the interface version. + * Once the protocol is to be declared stable, the 'z' prefix and the + * version number in the protocol and interface names are removed and the + * interface version is reset. + * @section page_iface_zpeachwm_ipc_manager_v2_api API + * See @ref iface_zpeachwm_ipc_manager_v2. + */ +/** + * @defgroup iface_zpeachwm_ipc_manager_v2 The zpeachwm_ipc_manager_v2 interface + * + * This interface is exposed as a global in the Wayland registry and allows + * clients to query and set peachwm state. + * + * Warning! The protocol described in this file is experimental and + * backward incompatible changes may be made. Backward compatible changes + * may be added together with the corresponding interface version bump. + * Backward incompatible changes are done by bumping the version number in + * the protocol and interface names and resetting the interface version. + * Once the protocol is to be declared stable, the 'z' prefix and the + * version number in the protocol and interface names are removed and the + * interface version is reset. + */ +extern const struct wl_interface zpeachwm_ipc_manager_v2_interface; +#endif +#ifndef ZPEACHWM_IPC_OUTPUT_V2_INTERFACE +#define ZPEACHWM_IPC_OUTPUT_V2_INTERFACE +/** + * @page page_iface_zpeachwm_ipc_output_v2 zpeachwm_ipc_output_v2 + * @section page_iface_zpeachwm_ipc_output_v2_desc Description + * + * Observe and control a peachwm output. + * @section page_iface_zpeachwm_ipc_output_v2_api API + * See @ref iface_zpeachwm_ipc_output_v2. + */ +/** + * @defgroup iface_zpeachwm_ipc_output_v2 The zpeachwm_ipc_output_v2 interface + * + * Observe and control a peachwm output. + */ +extern const struct wl_interface zpeachwm_ipc_output_v2_interface; +#endif + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * @struct zpeachwm_ipc_manager_v2_listener + */ +struct zpeachwm_ipc_manager_v2_listener { + /** + * announces number of tags + * + * This event is sent after binding and announces the number of + * tags. + */ + void (*tags)(void *data, + struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2, + uint32_t amount); + /** + * announces a layout + * + * This event is sent after binding and announces a layout. + * Layouts are announced in order. + */ + void (*layout)(void *data, + struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2, + const char *name); +}; + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +static inline int +zpeachwm_ipc_manager_v2_add_listener(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2, + const struct zpeachwm_ipc_manager_v2_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *) zpeachwm_ipc_manager_v2, + (void (**)(void)) listener, data); +} + +#define ZPEACHWM_IPC_MANAGER_V2_RELEASE 0 +#define ZPEACHWM_IPC_MANAGER_V2_GET_OUTPUT 1 + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_LAYOUT_SINCE_VERSION 1 + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_RELEASE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_GET_OUTPUT_SINCE_VERSION 1 + +/** @ingroup iface_zpeachwm_ipc_manager_v2 */ +static inline void +zpeachwm_ipc_manager_v2_set_user_data(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) zpeachwm_ipc_manager_v2, user_data); +} + +/** @ingroup iface_zpeachwm_ipc_manager_v2 */ +static inline void * +zpeachwm_ipc_manager_v2_get_user_data(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2) +{ + return wl_proxy_get_user_data((struct wl_proxy *) zpeachwm_ipc_manager_v2); +} + +static inline uint32_t +zpeachwm_ipc_manager_v2_get_version(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2) +{ + return wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_manager_v2); +} + +/** @ingroup iface_zpeachwm_ipc_manager_v2 */ +static inline void +zpeachwm_ipc_manager_v2_destroy(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2) +{ + wl_proxy_destroy((struct wl_proxy *) zpeachwm_ipc_manager_v2); +} + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * + * Indicates that the client will not use the manager object anymore. + * Objects created through this interface remain valid. + */ +static inline void +zpeachwm_ipc_manager_v2_release(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_manager_v2, + ZPEACHWM_IPC_MANAGER_V2_RELEASE, NULL, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_manager_v2), WL_MARSHAL_FLAG_DESTROY); +} + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * + * Get a peachwm_ipc_output for the given wl_output. + */ +static inline struct zpeachwm_ipc_output_v2 * +zpeachwm_ipc_manager_v2_get_output(struct zpeachwm_ipc_manager_v2 *zpeachwm_ipc_manager_v2, struct wl_output *output) +{ + struct wl_proxy *id; + + id = wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_manager_v2, + ZPEACHWM_IPC_MANAGER_V2_GET_OUTPUT, &zpeachwm_ipc_output_v2_interface, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_manager_v2), 0, NULL, output); + + return (struct zpeachwm_ipc_output_v2 *) id; +} + +#ifndef ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM +#define ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM +enum zpeachwm_ipc_output_v2_tag_state { + /** + * no state + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_NONE = 0, + /** + * tag is active + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ACTIVE = 1, + /** + * tag has urgent client + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_URGENT = 2, +}; +#endif /* ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM */ + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * @struct zpeachwm_ipc_output_v2_listener + */ +struct zpeachwm_ipc_output_v2_listener { + /** + * peachwm visibility has been toggled + * + * Indicates that peachwm visibility has been toggled. + */ + void (*toggle_visibility)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2); + /** + * output is active + * + * Indicates the output is active (selected monitor). + */ + void (*active)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + uint32_t active); + /** + * tag state changed + * + * Indicates a tag state change. + * @param tag index of the tag + * @param state state of the tag + * @param clients number of clients in tag + * @param focused 1 if focused client is in this tag + */ + void (*tag)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + uint32_t tag, + uint32_t state, + uint32_t clients, + uint32_t focused); + /** + * layout changed + * + * Indicates the layout changed. + * @param layout index of the layout + */ + void (*layout)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + uint32_t layout); + /** + * title changed + * + * Indicates the focused client title changed. + */ + void (*title)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + const char *title); + /** + * appid changed + * + * Indicates the focused client appid changed. + */ + void (*appid)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + const char *appid); + /** + * layout symbol changed + * + * Indicates the layout symbol changed. + */ + void (*layout_symbol)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + const char *layout); + /** + * frame event + * + * Sent after all state events have been sent for a given state + * change. + */ + void (*frame)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2); + /** + * fullscreen state changed + * + * Indicates the fullscreen state changed. + * @since 2 + */ + void (*fullscreen)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + uint32_t is_fullscreen); + /** + * floating state changed + * + * Indicates the floating state changed. + * @since 2 + */ + void (*floating)(void *data, + struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + uint32_t is_floating); +}; + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +static inline int +zpeachwm_ipc_output_v2_add_listener(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, + const struct zpeachwm_ipc_output_v2_listener *listener, void *data) +{ + return wl_proxy_add_listener((struct wl_proxy *) zpeachwm_ipc_output_v2, + (void (**)(void)) listener, data); +} + +#define ZPEACHWM_IPC_OUTPUT_V2_RELEASE 0 +#define ZPEACHWM_IPC_OUTPUT_V2_SET_TAGS 1 +#define ZPEACHWM_IPC_OUTPUT_V2_SET_CLIENT_TAGS 2 +#define ZPEACHWM_IPC_OUTPUT_V2_SET_LAYOUT 3 + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TOGGLE_VISIBILITY_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_ACTIVE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TAG_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TITLE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_APPID_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SYMBOL_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FRAME_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FULLSCREEN_SINCE_VERSION 2 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FLOATING_SINCE_VERSION 2 + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_RELEASE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_CLIENT_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_LAYOUT_SINCE_VERSION 1 + +/** @ingroup iface_zpeachwm_ipc_output_v2 */ +static inline void +zpeachwm_ipc_output_v2_set_user_data(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, void *user_data) +{ + wl_proxy_set_user_data((struct wl_proxy *) zpeachwm_ipc_output_v2, user_data); +} + +/** @ingroup iface_zpeachwm_ipc_output_v2 */ +static inline void * +zpeachwm_ipc_output_v2_get_user_data(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2) +{ + return wl_proxy_get_user_data((struct wl_proxy *) zpeachwm_ipc_output_v2); +} + +static inline uint32_t +zpeachwm_ipc_output_v2_get_version(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2) +{ + return wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_output_v2); +} + +/** @ingroup iface_zpeachwm_ipc_output_v2 */ +static inline void +zpeachwm_ipc_output_v2_destroy(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2) +{ + wl_proxy_destroy((struct wl_proxy *) zpeachwm_ipc_output_v2); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * + * Indicates that the client will not use the peachwm_ipc_output object + * anymore. Objects created through this interface remain valid. + */ +static inline void +zpeachwm_ipc_output_v2_release(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_output_v2, + ZPEACHWM_IPC_OUTPUT_V2_RELEASE, NULL, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_output_v2), WL_MARSHAL_FLAG_DESTROY); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * + * set the active tags of this output. + */ +static inline void +zpeachwm_ipc_output_v2_set_tags(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, uint32_t tagmask, uint32_t toggle_tagset) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_output_v2, + ZPEACHWM_IPC_OUTPUT_V2_SET_TAGS, NULL, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_output_v2), 0, tagmask, toggle_tagset); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * + * Set the tags of the focused client. + */ +static inline void +zpeachwm_ipc_output_v2_set_client_tags(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, uint32_t and_tags, uint32_t xor_tags) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_output_v2, + ZPEACHWM_IPC_OUTPUT_V2_SET_CLIENT_TAGS, NULL, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_output_v2), 0, and_tags, xor_tags); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * + * Set the layout of this output. + */ +static inline void +zpeachwm_ipc_output_v2_set_layout(struct zpeachwm_ipc_output_v2 *zpeachwm_ipc_output_v2, uint32_t index) +{ + wl_proxy_marshal_flags((struct wl_proxy *) zpeachwm_ipc_output_v2, + ZPEACHWM_IPC_OUTPUT_V2_SET_LAYOUT, NULL, wl_proxy_get_version((struct wl_proxy *) zpeachwm_ipc_output_v2), 0, index); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/peachwm b/peachwm new file mode 100755 index 0000000000000000000000000000000000000000..5bf010d3051b07c4b1034e7ea8f8258cf6b2ad0e GIT binary patch literal 618384 zcmeEvdwf*I`ThwIj0o69~G&pb=2}1DfR+ z8?U8S+tg}{muf_-lqx3N#aqCtc#qWTiSZIqF`_lU=b1TY^X8D#_VfGuyRF&tJTvpo z%scPA^UlmkSUxlR+XdG|N3^r@Oz8xAQsQP7C?Xa$cW3t96R=ZTK~2xp+P{Xzc#JeTA;U z`IhBWeTn^aLDzTl#hP}$WjX4`SYnsEx%YR&a9ysczugO z`2SO1j$JPEEZt7`_YH^W20GtPee>*conc+h{e7$5FX!9o-$f{=#?MawZ(sKC8FTFV zyvE%aWJ|KYwbkh{I0{J|zVj})*r?q3&7_9-aMy}oTy*S9SEUBcRrB6Dt+Zsp8Iw*c zEu2tVQXZ+EP(9_031>_?wW{LOiK<)(!q`itin?UK(La8=acsZl_~}Q~F)f1smg2v* z3vWDb?W}D_FIa!&W2>XTYrX%c`VAXzIeXOU)jv(!@qWjnH=g_Lt*v9;d@TG#;I7-k zXWj7CBs0fu^+8{kpt7L{v4(Nj34QYe$MntbNa~xv-$PCu@*mMhy$@oN_tl;>U*CKb z1J_snYRK-3e`-kI{OiZ{&96AAZ$AF$zWMt+^!dI=drpU;_tnm~VZ43mr{KiC^Y0(r zH~*Z6{96+H&OZzF_SK%-J=%W~GWV7LPq5Rz_>~^xd!a`=w|eOR3fNCy^1nK~Z~nI) za!!RG?@P|39{ERmv~!OKzZZkpm;50f@_z#d&{zH|Jna8j4}1ICL;p7%)3^L}9{TJ! zvhVz}5l-~g&OdwD$z2}(UFT(Q9_{(-v3=Lue`MeMeh>ffjE7%p_2}>0c>pTA}5BbkyQRz$186NE)G`jEnH6C{Ol*f3rd)V8{XiQ)2+2~R4>!bS4|F(x8 zd&gsZZ-PCbii18)9(J|ML!T2o{LexUKQP0?4sZ6T_jr%>agK*Q{MLhi%cI_-J=U+0 z9(w-N!#+jz@#^rhsIlu6jr!5|SZ>q<<=;tvXM|sTaYdzM%E)V;Udf0!0$9$~z(8KW_ z{`PksaxV4ITZ+fHkN2>jQ$6hGQIB>W;jumjJ=!_R!@q6v@H4;m7_V6#dOqMW?;iD- zNB4W^A<3h^2+5f3l$ST8ns_><%N^*!&ZJ@_%$SM{~NeCAQ_Z65iL@zBG5 zkN&>qk$-_l{tl1!FZO6p$V2`p4?D~o-M1dX9_#Oy9{zBvhd+GJqhDWpw6nxxUd+M) zPhaCT(qmp<IkKOJuPrvohf33&5w!ovE2R!P%$z%Th-ebP+ z_gL5ZdBjos59@mzr+SRbc#rXY&cl9A^r$z(L(bhE<2BEtzk599`??eR?$;%Wee+Ly z_<M>rUJmi1s5x2bVVdvEz^ZF7GKfldG&)4_wThDiT%!{)ir?36pIUe)nm@$3J zPw=q+1T6Y}t@|%~#3#>r*uy~ZeYJCshkmZ}@Sg`f^xy5F&zC&>`Cbn@yw^j{UXQrt zFCOv9E|2!-cCk9FiVk9gpp9&vBb zWB!Ib*5B(r{LK9x?Of~;=a2D_Gr~g;8$I-Vr^ood;?XZ&lJzye{^`-qOb@?zj>r7H z%|rgg{(aXwz=N;wu(u;T^ft@GpI_=Rj3H6Hqz>cKDbm`A3E|3ASa|NS2N zdD^32J`Xu%9`mBs!_U0n(XSmI@xW&u_1^1IZ^?kZ?cr7rztP`gyheHG$MA@AzVNWy zWghF@?>+qgT^{SmHz)PouZKPSKZemr#DDJ3*&gfr#UB1)wTJv;JmT}WJ>s;hJnDVU zV}330821?-cCyaHUoG;m!!ta_CG4T+K^}H>yvH~ud-$tn5B-#S=rhm5-+t+#2bgo8 z|zNGoFTn&k<_e z2OEuDns{5&#x!NOgN?kOHNVN`cc{2=u+j9b=Kp2$FDSn;7_WtC`3biC-zz_WdVkc! z)jHW2WXtjQ*F-;?e_PoPud(xgXSY9Rpw7S9=3lhi z<9Er=RqH9*d5F&6Y3Da`a~G9Wl;>83^DD!-xkhf*yxF;hMU_R1N~*#|mGfrLD6J?j znwP(zv`DA*nNk|b&(1Ba$S+)2Qd(4P0Opodl}E}J6jdq^D#$M_y+%D&6@|kUA@vxp zD6I-tmXt42s4{G z?t;j|g-`~v=T}zdFUzegLhI2M5LG3M%JWNei^@vExn+^CQne$tvZ$e6hC7Y~aQCTRwOqE_x zQJq_KZ3N0ZsPnN-+A0Ybq32rFB5y%O8N1TM_i9gJWm)dRLM2}a;Ns}$}YQ1XO!NVOJw@^h@Nw{~1o$8cT z$_8SX7v-0g<-@AVVLqj~W%=d#@CdzaMTst`sHiNIDvB9xIJb`~dq$z6Zw<#XxKtD4 z3wjDlGf)<%{0W;SI%8W<`-f%bDHhCGqs|@F2Nm;10s0@*nxLh|+?(a|e!+$(R){CXOw zvJL^8 zu{_wGwnxgr!x0+*R^YU{SCe9khf9pg)T@nDbFZQ484fj)C52f2(J2?L`V1b6Q{f`c z|59YYf(B`2`PC(5nD^S#_ew4-f_1C0#7xtfdmD3MW&Wbv63j~JTxm3Y%v71BS1qxX zSNUtb9LJg(st83wxsh_zf#JxAT?dhY(jV_JDWQ#;lT=FZY_FWeY0u zD+@74!zBxs<(5?xmLSln)Ltrzb~t7(q&D5y#dpgQ=@*yE3<^I#hu$(_WMNu1K#zY^4)K#b%tgv#R2v z(o)$pTU|@@E8%w*R8^EloMoDdf=fV^ArdJ!bMewa5c%@iKC1v#XCHaMm;XDvHXgW4>z1EZ7wySKA zrdE(2%3n}YikPoRJH8$Ri*??;80nChYY8@Uy2p;`2Uq5PT~3WXsA6Vw*Cq=m%wWc5Hn{BTLH;wiHM0eYncr#@2f(_G-Me zf*!9In@GJ^$KGp9aY(rrmWK|z_lj&gqL)2+VzuiM8R zB+Bs)sz<&3<3X+KZGj%~F`TM>#;3IH9r`(eM**fDw7#UT7`(^JNOg#%q^h8}s4#+% zs&}}8qc;_N;v}+);hM+Nt)ugUV$j~QIEl48kS24`gc1$xJ(IZ3;uumZSRM2oTw%{) zoLx3lu@p8S3`&S!Qc@YliDt}-`pzXL2Tnn7Qe34K+?SQO?UQr&pg_LILR{vn&N=N= zuRx9x3yT)!M@kXEIH6f@J@E{IA&Zja^f9*h_ua`p4HjjTjNazjV@h%udpE&G&LN}> z4&g}pDCby8>;OOvlh<*aoY{7TJu!l^);?O_clU*_r-GeLkScGFKY4ovRJ7|H*=`IL z=x}lG^7helWP!7Ox(|q*3e=VW>WS?$IblS&i*UVX>2(UBRWkPMa~$2i%T|_91v}Sk z2visQvhW2FT-4|QC1z4uWg$A`lJbSx?hf*gj(8onxVnb3jMz~Lt?hp}*6D4OZXYU5 ztar{H^JTM@*Vau^y%lC>YsqQ1w#?$9{6g2($C<>)s85X$DfeD2og97doMW02b@!Yw zxb_~gmC%tX22qq(eNh(coE{uJpt057wq!(NjHfFWEcS4hz4hqUxTxK>%~;%X&|tg5 znOJKbi&Bj}XzAh9(5G5Gll!1~@AiqkhtK7Focin|DmqSwQcZBe8Ar*|s`@k!$X5YN zRivPxsL0vRIqsyF-d3r?!IE-B<@R>V-k5O(tgNVzj>tKfXA*`0n};w0cNUAC zDOW}~Ut_SR6EP|_b}O7drIq^R1b1< z%PX3OE8(8nb)%i?k<>>;?1K^8_1GbqHZk;TVK|rLh!ZYMJ+EwGw2m`VJ5o$F+!kSRSf5|30haG+X5*%%- zE9w8x1nL}TDZD!?z-jk?)re}YI(PdojmgL4(s~J1R`A^dFAbJqH;tIJs4T(_22S<< zm!?xA|4TkK(bd&Qm2*;u>FS{mT%_SVks2v03Kv)4aBtsc$Lt^Hq=f6&PO4>m03ldZJsf(5uy;ua7` zLB+Tc)FY`50ScBG6*y%oFEq;Y%PXo%i;6-=XVJ(GcZSG~icyuwJxSXfXVE;VpqR%k@< zwh68s7cMM~;N_B~`8dxkG_(UYp!v|!2rzd2*RU+#lELnWrO=|H@+Bnkf1|`XL4@~S znjbE}Ybvnsih_x!qm7k#+r~h(6JyzUNR*1Qg;?OIf&9uvl*=m*qo}&5U`fcpsS{pn z$>s4+fqjuuhTAfgT*{(QP)r`e3SBE-h(R0Ca7d+smQ^jW-*SNt%L~h@78y&b%CTK4 z4=+S|L3KXe2ac!ko&Z{^wSG-WDYR2i7NQ{blJ5|qX*3;(#l19oZ!E<1Sb?!*p)HK6 z3qe;XLX|=1>ctl3WVxy;mg871Tv}OzTO!oP8gg?{Coa1oU%3w>RDxqSB$hK3y~le+ zlTTHDN(o;iRIIZy}^K+379lTe>X zoY(`9m?jg^=v0YQPfhKWc_I=o$xS(Riv2wq-{(Q}jNFN*o<1e^m==3VJu~)r`suO9 z)Jd_&(|aC!o+hFL`qK~ZyY;u({HY6gx6Q`!Aqv%!!r6WTsb+NZ)S3yojm0F z^N0BKSAXkF69e#f)>w;{O74)@GiB%&kar~WnID}`vpu<(qB$pjUpep^tbtcsT_3Fr z-CCA%r1rP}T$m%#Rm{N4p7sZ?iQ?nrbH43Fp$FY#hu8V=>aQv}z`)Dgy>xf^N7!CJD+)1&8}G?`noWbi9I2Yq@{`KEZ^pPt%!a`!yRGJX9`T*lNV1D8-j@R3HQ-ITtI|-(9 zsBwyue>ib}rroZ@jGmOhl|h2*6#ziy7-sv{Ciw{-W;93&BeFc`7IZ3%-8ulU3^}p z=DS>c$mWe(bUz&Z)KuyG2`;|D=KU_-2G4RYIN~Vzt*~Vr(aDj-s#tR7vE{Wf8Olk+XiWU?r`yqgEimk;%kOz zevgaK;~%oXr_IHOY~FJ5i9Vgb)5W*ie3y%F^XvRZo&I+0{PQ#$yZF=;&HG(^;_oy+ z+{J%u%Sm+c-8P@>;?r$8DK38CR4spsi=S`v=`P-BPte7Wvh(M-_$N-%^5?sFM^2uL zf8K6?$i+K)ta0&9e;Qo8qvtg)-qCZTi+9?y*2VX;`_<&)r`r5_7w^bvcJYVV`FFT@ zM^3AYcjWAG@yFS6+FZOdUY3h@=4%1z{)1IJM40oJJS#jQd&_@5pI#@vqtXS?}U6 zwdFUvct_3-7k}m?Z9lCp-jTD%#XEA^T>Klh-{^Glj$bfV_qJzeKKNby!*=_JyLd-G zi7r0J_N&P*zR8x8;^G}SQ(U|wC*8&W)s_=<@q29j=eYR!c6;W#_`i(R{m*mpj+|l_ zpJ&Snx%jPid#YW$)2|vA@ARwA#qYG`G`M(2&Kei*$Z2%(m)mlhT)f}L%`QIO#;q>? zbz9CJ7w^okHW%--$8zx>+j2Txywk5P7w^b1%-;6-xh*Hb#XEk?@8TUf!(IFjwwy#4 zpF2U=^{v=yYv5R-) zgj{@$EvMSWpKi;kaq-T0)wy^_&kZiV%GPtEi+Aj-$;BHsZg%mG{p@h@PJ3EiywjdN zEIzTaMqwJL5In#n;*6mFVJU z+j5d!ywjc(7w@zu-NpZOiniyVi+ARGj*EBX%y;n%Z8>=^-jP%6;vG357eCMLSG9}Z zJ6^Z5#>G2w>Rf!DEvLc7JAPx0i+AKSx_HO`tab5@oF*6V$XV~=o%z-5;+^r@;o==R ztuFp{dw#XKcxV1}y7+V(SN}@uFJ_MAZnqTAMjdsm9x%kF!HNV5fcmAyTHW!~h z*gns3@y$at@4v5izY>RPKH0^$9;x|sH-EI|=ezitV>BOf@vXx(U+3bDV>RFC;+t%K zy^C*~r1Q7B_}0mqw_JRi%^Uak?r+K&I{$DN-!Mh9)BVx_E|4@{E3g)r&;j$(?hY(4#DG3pu|3{g2$f( ziGB769)Dsb_GuG5{=`}AV+lSn#u`Sa;7=5Mm*7VW-nhNT{!bEog5Z+`?-x9-onoKi zg8xN~#r==qPZoT#;FATPBKWa_pCb5if=?IxDS{6Qe!Spw1V2IW^96sZ;PV83n&68C z&wD!O6B2x?L*lzy@Dl}JBlyz=UnlrUf^QJKb63ygHG)4wJe2_%^|xBX~>j>4NVRe1_n=1V3Hy#vMKOKSS^d zg3lDZU+^;pKV0zV3O-Tr=LtSp@L7US5&SH{PZ9k2f=?HGw%~(;pDp+t!CxTw`GUVt z@OgsI5qz=WFA{u6@N)!TE%>>DuMzw_!Pg1?V!<~E{u05j5&WfsZxsA|!LJqkWrA-K z{N;jQFZe42-z@km1;0b^R|&pV@K+0dkKl6!-zNAx!CQjQ7ksDS3k2UK_(H)OclOwS zk>C>qzfkag!7md0aKRS~K2h)`f=?FwV!@{f{u;qg5qzoO(*<89_@Lm+1)n4M3c=48 zd`R$lg1=Vq#e%OCd`R%l-xgzXwcx`de~sWHg0B<&62UhJeyQNs2)6#e2w7u2!4g&+XR1;;4Q(|3cgeDD+S*r_*H^8 z?&`7sn+2aB_*(?;7kr)IhYLO`_(Z|47JRbcO~I!K{#L4G)e^T&yf?p^2V!=Np_>kbA7JRkf|0?(z!9OGTI>A3H_y)nR7yKH* z|4s0Xg5MzcwSxb<;F|>hoZ#0B{&~SS3x1>EcL@Fk!M6&&S@3%V-y--n!EX}0CHT#P z?-cwN!FLIMtKf}$dhCCj;1dMDUGRRv?-2ZO!M`Z@M8WSAe6rwQ5`2o_Ul#ln!M`H- zbiuzW_@Lll6MT-~TLnK~@Vf+`C-~ihFBbgkf)5G)AA+wI{2PL=5&WBiuM_-Rf^QJ~ z9>K2>{M&+W6#P4aUn}@`1>Yq2_XNLQ@b3%0S@0hSeuv;c6nv}T+XTNy@E-}jP4IgK zZwdaNg6|ak$Aa$?{J#Wm{JO{fKM{O_;6D|-U+|XThYP-4@QH%|Oz_Eq?+|>7;6E4q z6v2NX_;kU4Dfpn^zY=_o;5!9BU+`ZGK2Pxb1Ya!pZv-C_{I`Oy7W{XDuMzzBg0B;N zm*5)&|AXMy2>yWJ8wLNP;MWTNC&4!f{%66j7kszin*}cq(02$vF0Q9QtKj8Ko$*C5+eYL6h8o}FFn~JX!{INoQgWyL9evROd6MUoKj~Dz}!H*Ptli*Jf z{CdIj-*j|7&4N!9{0_mNDEL;vj~4tM!Jj1fHo+$e-V*#6!FLM&7lQ8+{K;-zNA)g0}=;Eci~rmk7Q~@QVd+*zYwR0>ivU@Ckx16}(^YWr80r_;SG~3ZDN~ z*8hF}PXqs_f&bIM|7qZV)4(^r6AlDxKTimn@h#nPMsQVgxLH!2-Z#Kjce-qwxJm`%j=yzQ+DZy;vS)84G`I^zDsO$t9kJb<`S;RlH0i5nEY zmv|s?jly>jbNOfwDZH9EfjCd$n}`o3&QbU};z7je3Re;zMx3JXV&cKXi3%?u9zyI_ z_;TXIi4BG45c`Nbe+DsT7O|hWP2uUpM-aCvJe7DTakIh`iH{_1Qg|HkQN)c3k0u^Q z+@SCX;-iUc6dp=^3~@-|LBzv}^Azq!d@ON}!Uym#UKNiZPFHvz@o~f{3V%j?JaMAJ zdx=L9`xSnN_yl4@;oZceh&%ty{_iACByLl96Y+_}tqN}-9!=b=@H*m?h?^9CggA+~ zQQ-%O#}GFtd@u1Yh-(zSgZO0Pkix5plZo>bzKM7&agM^*5sxEISGbb+6yg+x7ZZ;s zPE>dS@dRSO!j}`DN^B@Rhxjz&&Y#ry6Q>ZjDLkDxmAF;msl*eBn-!i&d^&NH!sCc1 z5jQG4ns_pCgTf<-&mgW*cqs9i#36+T5lUgcouQG!j;756Q?M= zm^hm_QQ-x|vx)r*Uru}hv7zuB;tPp852*1c&LM77cslV##H|WXC7wgvtnftQxx`Hh zk0YK(+^Fzq;){tJ6dpl*32}|WLy0dX4khxlq@L*d=Txx}46sPQMxBW_c86LCIqtHK+I7Z5iqypFhl zxJlthhzp4u6@GxYh`2%Fdx;kk*C>1k@gm}o!mEk70JY~Sd=qgAagM^*5icfASGbb+ z8sZd%7ZaBfCn~&vxQy7Z@a4qi#D>Cih%1OYyVUp-hltx0o=$u%ajU{pi7Sbl6`n|3 zMckzDIN~sIqr#(!Bg72~k04$`T%+(%;-$nPg$EH=6Xz-1k9Zkzj=~4Cih<`=gxnGSxaRYIi!qbUwCvH`ED)Ak} z%?eK>zLU5~;c>)w5jQG4n)q(w28Blu-$PuZ@KEAk6NeNYM7)MLPvL&Vzah?1_`m_+ zdx_H(-begf;uM8HBfgI~QQ^JB_Y?aSeuwyX#D>DViGNSr`JEbn;zr^&g*OrZfw)!S z4a5%+H!Hl3_>aU*3O_>pAaSF@4-h{@+@SEi#D5~LQTPtxKNE)(UQN7~I8Wi5h#w}- zQTRIIM~KrEt|WexI7Q*b#E%gtD!hRBFT{R@FDHJS*id*5@e{UH^ZX#||cslWu z#H|WXC0<9|tnftQr-+*r9!LB%aihYciT_I6pzsLdXNYSQ9!mTyaY*4o#OsOk6z)g- zH{u+H5BvbUfjC{^eZ+q!PEq(X;^&AH72ZqyJh5NlcZfF<8w&3xeu2328#VsK&BSdA zZz66XZdG^#@h0MCh1U^pCT>#r5#lYxjS4?Nyp^~?;d_a<5!Wbu2k~~|kix5pcM#_( zd=v4D#5oFIN4%3bUExaNmxxmoUQGNlaiYQth+iT0D||WetHg%FbBJFf?%b!wpSYE{ zP2uUpyNFvAo=Uu%xLM(e#IF-KDLjt&AHEgNXMK z=PBHe_-*1Gg%5NAzeAj^@IK;qiBlB*jQBm`M1}VfzfbH}_#NU8hz*5z6MsnD`L!B< z;x^(og*Op@MBJ+I2I9TM%?ht0{wHyh!jBMtOx&pO1H}I#ZczAM;!lWc6uyJ_Q{s@q ztBEb*JcVx}ZYR!B_&Vaxh|?9WB<>(iQFt-&=fsH$FChMc*st*A#9tB{3eO?_iny~= zjX!ZGaht-^iN7XpRd_1#KH_GDClY@{+@$b0;%|u?6&_9e9dU!gBZ&7C*C;%c_KNA}Y?A5cBH2y;bJdF;fch&@@;QYcpNdWdfOWn9!<QJ5vMC$NqjzWio%PDvxyTGUO+sX*st*A#1{}73eO?F zkht?RHU7lBB5iL|csen!M%!Bzo=VIs(e`GACld22w7p5;am2g=ZEsX~H1Wm64GNDS zzJ$0&;i1Hr5{DEXL_D83PvL&Vml5YEeBfK)%Zbw!-bZ`|af-s95noB1sPJCmtBCyy zze9XAv7zv8;#}g+b~XOQywYrMQ+N|GuQJax8_;YWyhW!c^c zoN>wA;EK=J{V}=zQRcfRuVj3&>ZrG#jitGHTza^ z2}YJHZ-_HCo`~lS5NTNN;mk5ve`QiaF#4hO+DMfpy(`Yxu!a(&A6VxjsIkr%g{)tX z#*gEFfh^|8SKf^`vg;>r=r|hvz3qDR z7cIB@`#H`ido(vqYc6tFaK#qt^ooqDH(SdP#xL}ZT8T1-q4mx1F&OeJOx)ahtJvCH8wLT2S2lu^6+zBQV2iqOR7OpJUp1xpdTJfYSa%; zCpGDZ=aQQ75UkHkN(@4xKUlvqNevc2LU27hn!*gx0ZG~BZwT8^j)BN zUxEJSu%~AHx=-SaY%^sewAr1y+j{C#8p`DNZiYeC4@+Eu#OU|IXiI9dH3j>A4ls|u zc@qLHwm*%tAj;!?N$M9_(Op-w#kC)I=FFR!+MN0#MrPMI!{{D%I;#10;i-lR z4c5nVo(I#q!o$#(3y_IdEr)iu`9{^C<;G_F8~K001VPIg?r2pDM#Na$|E(85lg@@!vC;IAlaL{7grSQ}XVFFXdL{|XNYnt^k_#$C>^ zYEV`II=3zUR%DF3YI9F}AtxPwr#{wx%4=VQymtF8&bTz=l8lQp=FP>e(eNJ2Qv+?D z=dW4Mqm4MaM2I|PJ4@|^Y$7HjXp{KdBmJwXWN$0Lzs6Mg!vg&VKle&LZ zbGq-YZI-XuFlL)e5@x6U9KIkc?drzJ*BP}pt~bI7X6;cZ-*Lo2;9k&lCDI5VeFFV3O&V}^ zL0eYK#{({?pLAl@if!CNGs8P7L&^p}b40(l#=&a_%~}?izHMb9cb>4jG1E}R?6jYJ zE4h`*uAeZMRn||)#8*d!d8g9KU3XF|C*`bJwL3Cak899OPhiVdE~GK0&2NZ&QCq#% z2)|<9Ne!&p9e%&I`a#2YcXRu>$dP4cVn)|CC&cW}Oktzmz){|8voHy&{3)E5m3C!P zW8|yZCZ>Oud2T{*TKqru#TnuEGiq;0T8~~>k?rhSH;zGqwbcnm_;|w37+k}QkD>ck z{m8Nj!?bMo;Kz<$c?n1a!i9`@SNd$=6mY`tC#nLvx@jI1Wm0UAt!0{_wbtm^}y6 zc7>DKuA_r#%Nip7+GQBLm(6F@;O&nL44PR99q$BdTk3+*9h(<6i1~$O5vH>B$0M$U z8~*W#c}YS1%uY(cPkL4O?(|^vhNLNC62kqXNO1egq&j@_!{-`4;1k@QnUv=|%vTR) z{N{heqYi(%7MsXNzp7#Q^YqlI?_%oS(#aY8pc0y0|5#ED5^R5vWuEmF%D~s-XLi!? z?C2-i(a)^O|AMu`!KKtr=@*$6jBd}0ZnGGF;nCWGa}{{n>}Y4Ud2K>))w_}Oj+1S9 zGgJ2mYqxe+rgvPV{2DPbjB>_5XwFYpa{|KSkrMurKStJ0i(8LI89`s>9+s~2)2cs)Zn&Mj(RrLBb_{xIY z`DJ!}VNzbOeqPdibj_;ALEft7>P11!vplYD#Sqa15!q%FivU%=ZYwlsW+%-L)?efg zu6i-cm-&yNIcRI`xU8hDKVI1a4eK$|`UagGqiZ0iBVILU=Bh7zEBn)vnt{r<5DS@; zXP~mos1+<}wP5i|^%yUx9s}rCHsXi9SOc(kL1SjBLi4c(2XVz8I2*7d6&^QcpV`qd zV?ky|KeaOc$s&Ofs!04{>g$RGRWj|R@bK*VKjuK4*=e7KKczu$wHh!pIyU0jx02@_ zX8iUy;)f z<1lSCmFQdbN0mI}LyeL)N}FI*9N%l+H}5hCpXPIJ*=XQY6Kw z3Bh+H{{04eSe<0}R{p3*W#umR08>$wut&l=8Yf3kuoIplA6Gt+hBW< zNsx3t3Ze|>oj(W#1a=~`^-DBL1qMO0rVS3UqhD%sFdAPD3CMDbk{9pqRdnl*Lr0!n z5oc`uVczR_9y5;5?U(!m-QKk2pUVzwK5Xlc<2$#0J#X{YAI279p8jyj7AT`Rmey*W z_hEOp8Gk7I*3~~8uI=jQTeX+kGvgm@jWu)Vu(!%pH9NQdkbETseSOJGsHDXagl@2= zQzm!PrF=ba6KdMrtEOi3;Uy%V62A*SgXX2XIURNT@e74cY!@U$oE z$}^y&p~Ei!kCl&ag&s5fP{PjM?HaoejoLA`CD`&2YTEfXDAll*9ER-&_srC-4pB?SCF2Q*}rvaUfa#Vl714>3_1nZwxk+qIuKllXZu>Rdi z&%AZh2gl6_e*ajK@=MV-N>-{|bOFKWu3$_1Iaw`V49$ppB_nPtI&cD-nH}Aaro|ky zwF$EoN&S(O8U38@tD|GQceS|W!B&A&H5fHmzTyHRv||q10o%jA0N`%44%&zuX<>V5v?Ey4b{Pb!{dZjCGgqV(Ethi(jtPKuuRDBPa9Uu!g|Kj_mH)Id`c+e9 zdYUy03j_3>!gU-`&4*T+o$p#@a+Fg)ISLV0BXVMlV4X)}lq}x4D9zI9w*G*S@@rQ} z`Gg(AKl>;a^XN9%Z#?BBW2hh}h>+w9T->StBL_kgy}@4(Wz+;FL{*q@D>m5s@@+%;7#(4Aml<20G&ql><+I67++$5|(o1!~ftWj}0c6Ifikqo>8ZC(6scX#`_ zC}<_J!De6ucD&ZpWcfmp_0GpKzU+zra&Rnh1}ehV@nn9bZT79417k-#_9=FMIIRdm zP&-f3g*^t%88F&VO6nKbNxr+7A*xlqhppB;*jCLh=*@1`Y<6$<1MBJs9Ym2dIzp(cU|0$3gSj zl;9ey2m^v~n}RDgsSQ?rpiEcrlwIgJxNRPdKrQ~Awpw_)2|M3|eQn0`kYr@AEDX9U ze9p|&k7uTS(cyRY*Vs>yKN))|Y$wg&S~I699x~5Y33TlpQm@6*^r&~op0qWv}l;`=wRAa4Uyw(e~B3XHNDe>We=79B50N+bnFb) z|FTYxNIH&Q1|(Sz!Q`N+FN@i^Nmv3mK~K$ZI^(8uv6R*Eh|0OESI&E4IYTMt#ScQ# zMx;Z;FMB22hlFQ!LLm~&vNi3$P?ItKsyA5i6zhw3X;^IJYf{`w*7@RgPJYWM<-$TN8EINog1JEW!rj8n!*OSnZkx#LWIz6L!W zmz8#ILu6QndC6MrXLp%R_U34qZ|c%|&rC!KYvYD+PmS;X0LiN z{IBe^U}NON+G?D449PGbR!aFIGQ8vEndXyJ=nV6*C#lhsiq|6Mc*Y!uz0x9JDjDC`VPRxw^ zBxBdlnf*h}7Z#kgVRqbG8Qq`GOxxzGzYIO@7zsPCzmQKy;_0@Td^(iLw@t<4*ze%% z-k3Rd+m@F8<6hnR&1Elc+1vg%#EGZ2_-;NH8M31vB4})BAA)BD`={=uQYVk%SK7YW z(JtT0-=jxR(@IcT(cLps-^Hm~cgK*~<{TUa?DMUxMLN~;ui%)~S`f38Om&omgNhetnnp%#S3-Coe)fwD!saeq7L2~uaV_Ka zcq}3vi_j(rpC zw(nF;-x5Td*?Km*;~CY$FYs=rUacP4Pn8DFM?JCDUV@t&=lm!z7Af$SBlv~*pJ~KJTQYpvuSL%vpP9B7Pg|lhQZmd)LPq}x^6m?^e3qD* zwtsoT*jG_7Bf1}HgON5M?ak$fjNKNkN{;T!jQbj_k@ofSfjUoIYlb;{K-!Mw@zL{> zqdV<@Gc&s1`f?Y?=I?BwId@+4P3wIS<~8$IeR1Q3@c#+5>${L-gwtyR4}6G|*hrd+ z?@l+*PnuT8Qjuiy{N!nM5At!OdH(ombqsbQLlJtU?w(f1n9`T|8FqNNi*ZV zm^t>VOq?<$&m8+@CXSrOXGaThU0_#+pb+a9_sd;sr_pr;*0L8>D4<${@W*^RR+YBb z>#*6db&|Tjy#{UmkM*sEF%vJ@IWe8uFjpFteu(*aunLT3wC!PDSf# zV4`2Df0GLFcAiq+cob{!59e6OXc2G0^)aIJNO(eo+w%>x5*94ZRd_y^G zID@ST6sqjy9mh1`bn;S_I9T`lCREw681YU*?cda>`&RPGswS}ZeUAJzHS&|qxk=M* zZ-nT`ICF0DwAFaDbsFO<9>HbVoRp)nXfwr;AbbzZ4|1Qxf17I z#Sjduk86g>nAfL_ZOJs_w>8Hb)9WW;aphKgVu^>BhY|c2oahO98DB$g}E;<^5sC%nJ2&?bfBX-ZU;gn_13$2UZ@K zjYpo{rgH=y{1Gww0e}2iAh#a4EHf#4>j50JWMhTQPD{6O&|fq;RWiTAedbI-WMp%fBw9!UE5j)K+1XXSKumh>wz239}hHt*e+&h zFMVU~=SG^xMwhcA0aaJ@5Kg1#qOXwxt-ScI_fWbUPv zg`bHIcN_xae*6P;ROz{DJO*a$wy~QS*xvFdc(7XhtA*lH6T8(Mb+|mAUfMZaejj$) z%U|+(Wp4Bv^AM~OQ@Fq^uzq+0>IIy?0`H?cEuQ{T5N4(ShZcX0bw}-h+oxe;Vg2c4 zTm?k8Wt-L2S+(0jv(vs0kI?HuR{io$+_T+{b$B*hH&P;>tAd+#`o*mNyCB@|oIjuw z*BlkBy&mWPQ@MRY&&qxm^Tm;0KtT!CyZ6B9s5=78kwk=0YPTIe94k)f9jr2wApNS% z>jz@Q)UNed?l})Z0EZpy5ZHX&dYoZE!XCzsC!j>Ien3mmOtD6*DT*4Ra8?we-nUcN zPxG8Rz29xZ4#1pZR^^#<3#}S#5wgv|Z$M_(k6Decjsd!ppZZp&(kGhByR31@g z3e-bU)a@SCzwOo#I48h~zGte6c^ohV>3A;Ta~#GB&x`pSfe`a4njz6594+wM$EndA z9*kVq5RZcIc@Q0aIA<{Lr zm^yejO@~RpNHyU5Yb_nQamMhyRS6%@?*lMio;~eFKxkIoK4&{qxrrY;=a5O7$=3tmJGkFj0 zkFHn`G;`I*zS~~GLw0>xw%SGR?>Mp{t9x5k?G}G_T4B;~-%6g7pks@0S~ts_lo*6* z<9zQcYavX9I-Uy`FgyBvR?DXYKqKPacs2I^L6wRI*2hmkN!a~1bY@msc49(!fzG#< z`4W5b#p`^JuXgfH)%k8`zAg+nYFm}Z;JQBkZ8!$V9F0>iCDXU+JS24B3M~`8!XAY8 zfEl$v_4D1?f+jtJ?6c|zoSjwM?N@sx-!nT~KEfXS>!68q^I)`}vpSts&BuE zM{4{8qtpF8>BD2`cj;uNC-$T#$I>}6{2(2UR`36#v!=w-@6*Xl$1pkRSPks@8++1o zdeX5X+38$2`9b--p7i2aIu}!ZkRIwuua2d2h2c`x(e|1q0Did4 z!LGlzUcr>af;2No(1dAZ{`FR-1Koj129F8**l#Vdr|8v~@aEmrW$giMJGv3noAp#( z?GJ#RfQX-;e4g{6%5UXCc>B8`XGcG6KLgXVXYSz;wiCtFAuMO5Tw|7D!pG)IulW0* z`};r<>#CnT3&#Q0?Q}2ZVhU)4uC;DodP z!6T|M0esC)gZt$_&xM%%BVbJ7+tk;{r|{J=9S5s*sV`<>FL_rB4X-}_S1Nf@T(EZA zV6`0){sEd?gGH#vuS0M~?eeD$&RHWe(2TzbrDxYKU6T<#?{g}?{eE>kFqzNqtLI1y zN;F|qzKlG9(}Dz67yTfZW`!HG%nKVkX7$vkM28n=Y(J0sN{kI>KEl@r@YQ=8 z#moEf*!Gh#<@hRvy?+XF|HOOy-Om2Ww`u^gH0b?5))O?KeH0ioKJM9gBihpP1EQ4B zzRry3(oVb9@L8*xZ#-!Q1|I(ovx-}0boPo{I<5D&+L6go7!MZ1wky^SZb&pJGn__g@i;4mkvgV_!9geFHRhC$Euj-=aH}WiCyzj(U-+ zTL(<+#@#p-<*%};aXJJK)|puPvbLYciD9&VhYf|8IM}=#eCK~I=A{!4IqO|cwmD(R zE*PvICK)^bpN;c8SnS0}$V%JlTe%TcWYu4_hQU$@SIjv7dymhP@Ebf?QT0~E-{AX# z1rzw5U=W+G=d+?)aF}}vn%yy^0WX%&VFbHh2|t)ob7Q&@J|e4rNjmRmPegyIlJ_!d z&er!xbR~z`>^8j6@Hp2*)^-o7IMm9B&U`GRc4G}lY^&$MxR`bw+zr2{-_E0wo0*D? zYuS8~Tyh6L|~tQ|dRSJm2S$E&n2t;clQ z8kGA8uAb#0CU*gTTm{hua8bm?4DQ^xMz)wM8=y}p^!OGiPQEyz?Z=5%;S&Gw8v8Z* z4ty~n=lSS8c*gl?gFc68(5F`FAm-$bsq%dEJas;LA$0Lham;Uo*7$uc&OO&NN5)A5aLRGs8nmS!n}-WA ztf51GepMY>jqby>o!T)?+P~Ysz2f+{$WiwB5YO8?BX4yahEuRZ=<8$mES>s=gWFM= z^&pQ4Y|BFz+P}rkr}Ce;7eqP?>T-Ui?cn*e=8Ow5iKN24_<@ z8?gwE?@kQX&zOV_{EQ@QsL{3=2rQe_JTe>Lx{MCsD!e5z_bk+#`l7XsZw_&{`AY;& zy6Nq^KgQTJAoz>VVFhrEN9&37HyZXyzSD12^C{AA{^qEDgyD=-ZJB&HzF>|+GtKF1 zGEUqv6NOLWD@f@W(S6}DIGt^X46VHm>-GDYW(@}jS@^QnoP>_|gSDGr!*6Nbj8~^w zfmdFF4Yy&Ho!>r{?TW1rY+n-+*}mbbW#%y_?$kFT)9z9?B5Yx>c7I${U6Y*T3m+1_ zRV82|ma%C4u&eonH_33wgJvI>X|7ZmGEd4_!?us^IL+A)1=BLvbiQTwwrIMK@0meD zy3462AW^?3mf5)ZVMgy+1V+j1!_V_oii8rt&7}2lbr?YWPd)f2d-SxryYkxR$ z>6KXpne|3?oYmbHG^eSXd22O78USo?>XHvfw1pQOGf(Uc80lPB&H%F!^&8e)1Uy&| znC+V(^m3C=T!#aI-vrJ6YFX;|Rc#mIo%KvJte2tSBm{c}mfnb5V=x)Zf! z1CxK@2x>0+Gfraf1N{O*S{v3A`eN`#LNwVJ%W}X zuGJNzvaG`Krn{#N5Hc+ttzbOWbxv<8Nh(8Tbn&SUe$!#y`284GY{$>J3f( zNmI9w+N7!9YAQ_X2~9OPIS|soS1l>nESX6e#-Sjp%?G*aOyjRQK;a=Ab%mJPZmotA}IE^ESh(|Gq)xeNIdG z;t>=X&XCazJPbBWahK9u1{oZU*>2> z<7d(ZnSsMem1vt7rzkZMj$x^Fx>U!Xk>wMe^P)WacF*bNqIlqJGt&e)17axl*V6MW+<&GCrnE*C}`ElscU;dLme^c%;Fp-@J=>A@!RYLuD;AGf(^J%Ii{v1tH z|DTh7fpmRfB?jBNQ~Qq3AB0qM^79aGkH3~Um__MnD;cMl)j5#SOc~c}(Vw$5W_2Fu z7Se^9enZirMBB2o$OLK}@42BW>%AxOOu7BAWFS{36paN#XZ%q2%nu>fNifru$Y-&B z{B{X0oz4$3lCge+7D7VZM@X?spX%<8#$SRaka`c4Z{^4MiT4eU(#A9b6Nt$A2s087 zerpdNPynURu4VMIY>-CH;4O2H($Vo$|L+gu$j3MR5p!O?ntdAG%HDOVCtP^=$)B&E zZzX?@ezwS;uAjf<^U3;I$v;j%A5Y$=pNmJM^>SKh)1PdKVf7j0+!y>FF^m8+x|EQl;zkaQs*Ru_#;Fs%X)vqf3{222r68V)stq+W6 z8!ptm>emeYtn_&%pK%V%Awn30UN2*T|3Hcsj7D zz`MpDT0hbMZjXNv96zvx)qlW9zJck1_sG#09J1cF3Mt=zxRG(Zbv=Y=^UFXO#!KwC z&vurU=OwMRoXc5hj?Be#c6}AL{MRR156}?nuTQteGM28t zKG{md1L8YtI0h&CQ_fsfIgb7)46Wd2TC+j z@nU^olt#y>=?>mFFE$PIydhw=bMn+kHf2L=J`%p@VI16|mw}&C5G@;<6bd`^4|? zCf5ek+;hHx*9CHdcw3;bO-X+PLl*m0>oyd(Uit_>ZvGd3JZT||IdTDn;23l+zxb=x zIEFTQ{HfLpa>WY~>!L1dVM3|Ny5>kgG6a1GoS7Wt1=>O0o)j8&pD5;6KO;&>h>EY=Tb zOHc3dUQ2T1xL_2&cDE%(zexfsdkr%PHg_9r()s}+V*boI4~HR)MNQc2jAMmn;4r$) z50rJORW28;_L;C#a zhuTKeTgmMaDz84^hbu?7f6dXU4~*0(3KZ*qAHOy29GwNt8?m_vCndmHkGY;5$C;Yy zr#=}SlJ~5d+86N)hk>)v&WrKfah$nPAB1mAz(Ag~j0fQ-cU0N;2m5*ceJ$@Fc_{b~ zbEAFyJ=Z>;*XM$7ZBM6f#`?s=UO1ElYsGav=gLPY3U-l*3aw*S$oD>A0se>|+8B;w zOdKnw?TD=FXtVlZ_AhME^JT^7Z5+wyH$8TPgTp=K5aK0R_dLN$`)8Z$+t3L9Ldz7K z!sErGbl=_E)bIaN?|$f=geUMdJMBy7_Yngp!)L*_Hi1sv&)NDoeX1Ea z4ZJz|H=xa7zs65%|DP3qjN+q;zlHp5Y9$R+D85ATi^y-&`7c%cWs1L){Qu+b&BLQC zvi|P`(io7?Q9eM->PMx|C zc$#x8VYQ<^9~#K<`RUJb#3`oYvf1{`ouunXs&*z9*1c>@FT!7P@~1(`G3SqJ?8R*Q zEtUCNP!~SPNh`qagHKp`5{90NFfDJIzR#^fx5VS1Y?X@4E8#4*gbPJ3%M5ONv}VX$ z%BR*Te57m54MWJ*yW81C4e6@b`hcycHuks*m9}>p6Sur+YN4rxz&^LmBZX`GMFD4_ zfCA3F>VezgZ<_5H#qFa1^mr;-%OB_m1U<;$#;vmmvt&Y0waQ{qHu}}Bfb&cNFAI{C z%rZ7J|H3m_q#1m(yiNQW*4R-Tm1>a%ocdeMDjTUAAc4dg?aoJo<=^`2TYrXPaQbt2 zP5Bhv2a)0QQVK9DuQA*+V?W`FEcZcbqGb-X#2+JLAfT zW=D!&rc}pw4tWfL&@=>{U}4=08afOlFCzjX*YZ!P;*WTqABbGISNt)Ov-Y!;9Yutc z>d4LWa>8HBctZWJo17*9??G%_is5K~zS1sXGfgZ5H}Ad|Znz*t-%^iCW(jm>YoX-IOaMcrC`qlnYL(njWdEhi4l zc{4wn^P>`1XV%9w9tO0g(PeW>+R=mp)#Vp)9}4qOd^_CyWKQVafHP&ukY|K-GgkL| zWI_ov6VWRxkdVk^>~6GX0GQRX0C5yK++y>PxJTM zf1JM;#H?i;6|X`|ox;B~J!hxQbd7*PFT&PsqA;EwFVkDecv#3_^rv9V0Mx|(x&b)d z%p#A42R9yeiL5FAEOef=_mXxZaeyHJDgMwJE`Am|kweYxb&FP#BRBk2Wa^ll8J{C& zx$Irs9&+z71b^5%qBb}aOPtYt++~jl|7&9ZwMJFP8f;6`wLiGd)Sd{{WYmr_LR@R& zzpL+v-Rt|csSg((*hwxhRnBeHkAqdu_QG5ag?TVo(R*(N|$nJ=BL?(N@W*$9$Imix^Im$3SRJh1gxG8jot#F^DJZ$UR z^xxNa{OU-v~-TJrTpXYlO}}DF;)BlqB}D_8tdo1@F)9^Kb5AY>(V<6=pJ# zX`6FGpC^u~b}qWLE%&X_Nc2 z#aY?B4_l=B^Hq?sXiGKuBxuw`$02bo67_S>g#Dff{IB>Kh9SMAq_EmC`xEueCQ*FYuJJiJ%bRX2 z99dcI+@Y~Z8na`GX{_1vtu;I9t{YH22gi$H)W+t&<6l76#(r0mGREhgG&iMtWzn-> z+luPQ3hdpllD)f;$78-JvyHtwe3!9z-{?+;d`ckyl!gYQiD1)b*t=t^U-tU3EP^p6 z)!4gNkQ2Om7v%)D>3#A;=Ucc%f*Y8I>tW$u9-D+4WZ@nWT)wR>Y40At)0BDK#U89@ z@7{rnov|LTn#8<=B121zy?X?`J~Cxx@#~fTg|8bMzBfISz78 zlbw4yeL^aIzD-v8#B}=9RQi*tbYtgU?c8dIz}UHaUm14p#{0tdcMQvCdEkWiVYG7} zdmo?y{u#UvSS$3w-UsV3$9>-WFxt7lc^^hQ_n`NYFRyBx^@UFd<7yMg!-bO&V+jnl%nNeR|!9 zWF}!r33@Q@!oZQKCXix z^bCJ7n7)J`W83mARE~;@r9Is09>y0yt79tVOZT_bLn31Jy|d|iz_~-X8eMbPN`Nk~ zK%6Cn_j2by$WDo83^vR(X-(cJI0)^DC|Slfg`IW$5yU&U7gW%&zZvu_X)cYqn5HaU zAT(E;lc)ZyFKN_=tg99z18OEQRd|}z-_hppKz2V9D8&AH>z|Emvyq?L@-MijO%8V9 zb%_lA@M`$4FG6L3$V+n>`<&1>fyhnV|NgQzb`w&qrb!~`CF}$US!*=>`By6(UY`8 zx8Q`l_DpINr?HIw1Y^@&_XPr4*-zVuB6q$5k!isk&RS#B2D*cpM>v`_!PZ-~YwMr* ztKTClf5aFwrt92)Gq@_`$<6lnl7F*yuEkt6=tP8I?0Wus6L1!pCHv=#(rM13FZYuy35vQRD{7*m&dG|Js;H{0s5(WJW<||X)S+2X?0Grv-X?0Xn(97fF=m51 z*$$D>V8-t!HYIrIVhH>_5eyPOGn|S}jIFLuBwc6hhbk)HT?4sd%}n7gv4J%%MV}!!Hr_B- z^Wb|~g~ke=(hqE72)0q_Mt`%radhv*IkVgIi|bPS;*fUy;&GIJ4HOd19vb>FVzE!8 zZ1+4>ZCLEF@k6iBNlQD9GCu1$v6J;00nZ=o7RwV#o$7w|TT$y486nq17ZfrFuvc0t z+&Q8AK=ib;RAqH+p+TQmfqd;(NAGCl2Myyom2vjn>b|U)4d6;8#R}?30&txLbOksd z8&HH5z~|Wr0hC^m61NL54?wC^bJ$TPbN)=LiVeVG74Lrb2Ln)P0eslU0WjJExB^&a z0XCQ_e0dgNv%Z|gYLfd10F-@@P0=FbDu&o(0D}BLr>vUg!uVuBLAk2r_(6W2AKj)t zk6c%`NL-P6ovFPLqxnDGMt{Q{2Qqkq6PLrg& zRc2ILBc=dAka8j+vSBJdtlpi*wgx7g^^n1|;rfwVmZwyf(?j1NKzU^GC8|C&wsciw z@l~cJbD9#T??HAsCNV8b-fJhnyq3bpv)bX~D4hN}&!}Ns8l29L`reb>+KFfySSb4= zV6Gc7Q=G??F0Ce(AY)@(3OBb$RCmKaRhE=OQwLk4=4;>tY|J!nL$!qts9Q9j5^}@c ztZmt*RQgm7Oz_NPi;kagUvj=O~2BSZw_ZrSE3z^5krUwl^7Rt96wobQdnDrQ>X*8vV~Udc#YjD&Wc zDyWs*M4V%wox8`8$6a{`gZ7Lj%(;7lS4h?GY$5$8Xej;l<189kp7VK5GLW~&Q6l$Q zx4S69pQ- z%>b+U|Gd=H+_0Q)bi5>1TdwW>7r{xc$6ZI%|KfU_GitUo>~>r-+--WgSUoitr@R1AEQN#C+fZ8OwYb<9l&SYuS{8r8}HLWxA>r7kYetWyY za%;%af$23J!rMYbU0Si@nw4_8uxiDQpPN?fc-KU78a)rzw(O5g{y^rL?*)9v^j*xi z8sdU#IxnI_hqOj&D2hhpaIKFkh3CMhZ*#Y9qJ5BO^w)9GX%$EKVke**ByT2z1 zkMSWIS$vlI>~FwHftl2s&b7b8&&$cN6h>90E2RpHV*h?w!?)Pfnn7o-M2 zqi2%~mir%K-REybP1e2=d+kb%lU9{@)wnd8DEkdgEXVqHU z@OgN^ipbFsEh~NKhK2iIh%>laCNS6=53(FL`N>D!ymspS5$F;TmU9I8+xT{ zebwdPga%fN{e@ZFR8!s-io+8>n-lu9cF3jk!vAt2LCOv^44)rbL#OV4g~4u3(+P9F zyPI3&-k>4+IeWe%u|`7q#)Z>s4z?{%9cCz2!r#UN_ zrXTh8994uDseQfuM*fxF@Ylo7=9q)TZ_J_MM&oX2fMA`)W;nES!tXMc5q%RfJ7<5w z?3|II8mp5G`Sl%OtIW4m>c(G>u7nxfzPpb@cwpB4C>Lq4c1LO~aAU>Ay06Vxw4}!3 zU%`mEoM_O)3%;_ zXj=&!*Ph$6_CK^|iu8EtVG>;_;WQ*Jj^mf)Sx&oxv4=PROb7Czi} zl>n2f)SS@aq)l}{Q`FLR%tBy^_Uyn*jr?6I!jU+ny0vu;byc@6cg@d=Mf?O?Tj%jp zle^7*oXoYkKggBDpG**!M;qPQCdl>HHn)KwOm9j&jMoz({kBmS&ung_B@(hKE*3Ja zkG71BFKeZ9vylfz&QEd?hX$ott{g1Sf4y&&X<_coU6`o(W8=%2sj>JYN51g6a}0*Q zuOFuVH$msV4JvpFh8zq&hX-v=+#7Ju9EQ*R}wC5%T#_(^a6!td!09B6|pu^-%R z!k1V@$Afco#>98tlxZK9#n1H7q&PiC(=hifD7#Lp*e@`l(UhKn@=!5F!STM=o~P}E zi?wMO&1bMRuY|b}VOcW;jY+KRK#IZW<3+xpruZM@rZ@gRme&kHlVmx}>dU_tH+M?i zlCm|*j0?ippksnFTl6IpnId-@MT}pq-nm~TJJ4pKj^$5F$oRZ*mys>o^`$%_5l~u zdybhZ=J2(-Vn|zLDyQ-xZp^R=INW*l1dq3rfNNTF9%o$BO1btaO^L4Hh|SFToF?v^ z&s~tyCDWltB~QsbQ9-1@9K7b^(w z3%-xfn@Mo>Y|z>n3L`v2-t{C=TIpA9biY1Ryw~zz)I35=7wr4RjQgh6&DX+2mm$y)9?vlZ>@N+p_doEf8Dh$6~EC>q`peajEF z4$G$?@HflmFBhiT*tgloP=f6dxU$Ci-J(FqK+-HNO9dH0hP2A=I;_ckH}gJuuk~xXtMS zrI!?JTqRyXDT?j~we~?J@;3(?ET5^yUqUQ3D_Wt&wArkEondeFb@<{K-+WYgpOd@RmpihDl`IHeEs?2&6?Q|7gfTuEmc*_#)@ z)plgIYKD~crvjEztFIRUn>=g{rc=!Ks?dQDD&b`?I&Hqh?auChePp@-1mzU8#uy>1 zGYd}!Y2MIxte{apY>aqx=&_tId{ogM_QVqQ#NG5=@1^#`w7&$(+M~aOM!2^(#-3iFq!YG>`5OIgeu^ZU8b5R|Tj!k>5lS%K zcyXqku}5jHX6|qNw(Hhz!q~lR7n%CGEsRSS#>Gmb`D_;0Zw@3PC*)62u?ypOLK5vP zj$!894Yi`I`1uVMi%w)$d`io<*Hd9qm*dy)Zu*?fE5*ZS^f7L5qkJGmg=H zXDF!CCSZRx3D?MQAKIFZJzg9&G2 zsUtUS8RO2n$&iX2QEu4a+}~>JFtnm)70ZcqH`*xz#gj|#FKnZBKTfT`MxgH%^eT!& zz9p!^ViB%!TW-@RaQ5+%0<`8i{W{Yc-P@T-sME~rt?-<&93KS)`VnbeXJ$3wGxeqX zHBwt2)i##eqHbh!Zq!%Iw;qtO3{S<5>%`b@g%)lzOW#*WI;%EUKaj5rAYVShz$E(Y zfqo5&-$VP`@t^JW_pK>{+NL;QpU@YObkzTbm4rmpim#f7gOHj2Q%dp z^rb1kXPU5K;Y6D{Qm`O|O%1wJldNv=|=MEUyA=`eTaEZ69~gX z#V*r3czY+GzpI%1akQRh zy+8rFpFxENRBso#RR}pk_Ez7$BsfxPgklT&}hrPXWVJ-l!sX zu~|D6x3^D_+yNC-U*>`?0Mj{oJ03vZ5i;-mkjNuO!9qRlL7_YPtl|IrMxT(?!J=>{ zI#@im*?kErl|A37^YzHr@Tns7)mN*HWk)x#`g^j4^U?#1>~Ms6e}kxdtFIpr1c36r zJweUMcy{Pa(%eprzQK>149XkkJU)qVq~ZfPruR2!-9#$BxXPE)!GFsr1647LvZ%PT z>W}p}qYL%NptX^TmjTQ3H(W27&+%QHu98!IU63^|jNy3d<$M}tUKl%qS`57y!hB_-{VK__*x_P04qg zPNw@tfW-Sw#ajSL&e?moX5@ap^e^6*F>3Yw-uq1KYo2?$Ig-m@kK-@eB=Vk42+74c zv#Vaqh%Co+&Xe5ZLoJK-(`Bh?Z8yeCHO7#1Ou`#)$<1MWceNkiSyS5Dp3Y_dL%-1o zA7(~)g*%g-MEmD~BCvX{%{9_5UK-J=a*4sr7gqC?Mu$UgpKK2|>Cd5o$Vs`2)IkK} z&AQKXSp6!LC2eoSSsQ3&Ia+S4Ul}T+VT!!WL~aco0SR!+YmA22cy$|anh6&WZ+V#| z+9#Zf3c6zH3H4U1m0LiP$cCR1C$;*9LX`9m-239v)VSDJwk{#fJs|9%yF@ZPPl=_7 z|DG_TKfYkVk9ebFw(q#*XTUE1u7)Yn1D`#%&qS?$Xg2)_&TLY8u>5sA>;dmA+2@cm znZ1oam2VG!>P+i8WXV3oM1(@RoOIOsj7eU;3AoA>;i{qaPDdn-F~m@&K(*Qx>*{aiaXf2vDM}VQr27 zbhMgf^H5&9|AeX07ST)H!A%`;nvFks(SNYfw|dd_Ui3yAJ;RH>+KavdA)P{|deLWl z(MxRfRbKSTUNr9i1bvAY-N%bQIL}0n^rH9iqC+-1;6?9b1*qN6+vpN6`ZF)O)kYuS zMZfAre`}*Vd(qE%(Zd;CTC%f~?fgStv~Efe{k0c;n-{&>Mz8mxCwkGJ+2{|v=ySd3 z9X9%HFZvWO`cIuq*>8B!{k-VAZ1f5*y1N&>7iMy_{^ZPzi}A`hG(K00mbYfS>NDDH#}l zokZ5hsWY^od_(k8-s-QHwh1;x--*Mr9T*zViUZ;t471tP0|z8xf9CrZuP6N%`WwQ4 z&9;Wuyl;`1MqMAXKT_8l`azhTKs|2}P8?`oWO1Ig53)>=>%Svpmzr5VS8h;-zvDdJ zop{cr8m?8kG3-|P2Sa>XtCkn4RZ?r*GSN=$O&~)1S-C{Wk(v`-&91U7EAv|RIxQ<# z%X;l$1p39bn_K$bzW-~|{XZU{bpPYfS5e;2rla6!j4a)*c5?SJdYeM+8`vydPc<-Z zhv?U+4qaIyhuot05wcmzjmI`Puk8tb7~M`i?G@f-LL5d*b} zZ!WT9jFRJC2A3F@9J=>8kNF$^0i8yBd-DToKP~Ti1UL<+%tP1yhR$APm9r$=C9(dC zd1lu_J(w}rAvO{ z@07grr`^G3XMz2J;^S`twup(!$bO?5w%BI(*I!`AYnIQB*Gp{28n44_^mH%!aWDEv zqU(l)!-aLzawmqn)J^M<kIL=ql$`C}$$t%fyLcCZII8c1I4 zRefLBl&)UN30{4l5xrY|^K5-T70alw=BX9P!4v+pkJoo4L)5#i7w*7d*gZ&tZ zL)G=N(GPmjtv0%0A2nHoEUw0zCZDFt(sMk3Jx4PUKY@7ptjI|mMCB5ZE47o7Ehm1E z(o{@(&b~mzGse~lqeVm|=`mJ|PmESB+QG2MFu8}Ae1U}0k}k4){J6B-|xdI&}= zO@X>?xq^=^+;nZEt7mjX(G!SfkFRJD~fW@do16aA0!c zgJ?Lk@Aw{a;y=(FtZV$Z(J)~gH*8QgVsP(NG*6{VErX~u(po5u-`>HtW^RauKdXvv zX={#uN?CnhPjt!sF8X>RFLy^2i`mir+pofiDr?$Uj0sxjpJDHe-_oX%lzW1@^uF?ADds<&PKQ3LNiMyrDPT;90FkR7W=Tg64 zO~Rsw6YYY%38T1gw_h4>?)`Was~x|P^5>q~FaHPrj&rQ);1L)L_gSskh*2%_Y-!w= zJkLv?Z!=~`TmvY&po{paE`Jr}Ir;>`@Eh4Kqt7al*ZJOwUva)*-qWipnH}z~a}@^a zt(3#)gXJ&ak`naUuOg3_+LI^1%>sTPCyZs#^peMN!k;iCvqGx9#|`@7n(ph>vGYr2 z4M!Km%Xc*;i>jh6JR4V)+oH$sLM82AzpE-)fS~F7JC_)Y_*qc8O{Nb^|lfw>~SRlU!h zPfBP}7?oepi?VB+M>cE7$8#dILsd%NPcy^!^g{{dn>E|CI3PKqQ z3&$qbMyFs-Dl=@~n(L8c7l`G8?d{~0z0G$rW31~59DUc#BN6++*VFcaJ7?JA%pKRf zsmQgQjjvXq$2D8T^IuoN>w#A_t=M_<$YOU2HM4{*4SG@AWftznTYoPSR1u_J_s0S1 zV#QFxLFZ0&F*w(mGqVpwEI8zWCW-o?10y?gLj!mqvf%~BJ`gz>Wz|!J61|nsM+x(6 zLO!O0Np>C;K<+Zw9gSVnmvHW-P zerK%Wl;8NcZ*Zyhuh4PP6|5QA^Pu;RirJ6)uDDJ;N?-i%5h&jjh@F-jh`v7keN5gR zU(i4ll$Xov3M`u)*~6n)*J|Abfn)BSs+bT6X=M*owv|6|Bkp*=S^6lKue z@%_v^JWHheyZ#v1?Z-Z|wW|=X;$b4I?c~&q-#ldhN#kmGJit8sy7Cl+sM(se=zA~# zdBKhq2VP9Mo243{C7~jBwGxcl?^0l&B`v3IpXit~=RT3KhS78V4fFU$ z-ZJMU{`!CNr88*k4X4fyTYJM-B1=UIaqaEgsX!dlC>rEje~l@4jeeYpfXd%H>0iOK zkGnx-VXrq;&ra$|(XP&YDuQPO_D_6})tKI+C8xGTrb1C0BU7QMFSb^4i5lwtv~#Cv z_3d}6)xCprk)FHCTYk7xWGXMRqO3H7b!uz8k{WAl48DbJ?t z&3HN(j~efd#onxWmUFUuG)x@Jl;eTYwPWMAFUvkpF!nXSu@)YMk&4e*q&#uGgjRE~ z!_e2Cky0@Jvf_2*)v5P#_N0H!|Lq?2uelRMKU&@U#bEva)xREr{`Ii-`d7SdGC`gW zmPW8^l=Y*BW?NcEk`#b{gI|KBZdl1T*tIw5k(&`w8lER2GK42kBRBK-VZD&tQs_mT z)jJ)dzC~vNy1k>n{!fDBl|j$Yt>X02X3*p;bKinnHfd`(>rKKvuTeOD_FJ4EEnEKC z4SP54z2e9IjqF(WP*lG_Nz^xo0Bps`LbC9x-`TI|s3{HFFVH9I3jxEq#C7_K^=M;1 ziHo~HdwMES`Ug2q>(He>dFgaz@f}0D6YTGd9@sIc_q>}ra)cE*dNqevy{}>xoQgRH zu&jqI`yVRXY?-=px8^97jKvsmpP%VtOulAsX!SiwSll`l{D$l_U#CI)7R>r4-Sd#b z?R&nm-{~dMf=9@%JbUgkFnyv0Gl8MYGxQVd(UE3>Ia$4of6oMSejMdwu;O09K@j$G z2F5?QRvq)*Jyyg6X{F+`@0m#W4eNd}{`>35ms(#sj~C)s9BgXzy?uqUO)PY`jHej3 zt`kUW`?VR(MJ8=@AtP8PlFsieY20Bid^AST`viT40$>*6ivpg&BD$iH?2#?lT9i#T zCHSuW<$_)vOF_uKrWll2)&453a%qAk0W@RpYR}8 z)__RouX(!syV0-50V_f0%Y^;%)OIZLwXT~9Jxn?rD9+nRWnBG9fpJljIp0YTdI9m)=iYR@H-~RR)4x%q*wPOS2CR2~O^@aB!Ki?!`Jd-ev~&T- zm;x|sX?2eQ*TK3W{)J_CPk$n%ny628c${KPa;+M!O_U%iyE=bFQ6-=Dm1hrA%s zlczFa%+>>%Ajek*-CA0wN$WV+T}jhQS2476nqq@$HFae8`(|xUNj4%c}V?YV$tWW~=J1Fr1 z9jN9KtQ=dKMIT?u#+j7Y)Ai3s)xOeQ!T?}i;=04s5ZU7V%4^Ya`o;F$?Q2IdS=!OW zr`NyAt7c_5htlWUs_h_60WT20FcDs>OMeyD+W2G%MWQ<%L5fs7Qk$_J!NFE#=wT4`T%f3PFrjAP~+CSS?@%UP7h1UqE?cqZ(9ktYET!Fh%0VZI2rX z8~J7T+XY7_PE5|PhJ4TdX8wD7%84+hd$Ol=r=aE%lJ?TX$!6zB0!eu-!vG^ld zlx~$lG^<6DtR?JMG{NBb9`&czV#4tTX6FvEzI7xei!- z=oGq;_?$#}wN6h0&YY4Ugj>}7bbH8_4{^~~iurLQi3{ic@#I5?{+-Lb8SBayZ+Z^eJ> zzQ@2uR|HU}xZ2Q(-z}^r)i_UGOUAaL=-D~(4y)Xmk zzeBocMxm?M)lZ(y?&?WQ`1vcChp{@!xO|GB>#A(_eken?pT zWrLu<186{Eak_uH>^Q8^SuluR5mXVyS<9nR1kX5mMS&J{0m5gJR^Zu<@+=YwdA@k4vZ0?ohgtABPtr20Hz z{atZ?NFMcqB%!zCThPM<@o1 zTdb|gD>uy#INhpB;~o-k0EhR3Qa~I6&Wt>FFNL{DwX8ZegSB<9U0N+Ht*!2dA8DS4 zQ)nE5gb!W2Go|#v?Z%VSB+j}zr`BIuKaGPINskab5I&O(;#-S&Ee9w)=cx^}rM00@E#jYG z4**e36)W}i#KnBoO)puQ8@{KSMy+A5^Vg4Hu#|c*gdskf4~suu1O7rIGa3-6TPi^Z z0iPvv#dM%0P^ zaSw&i?Np@SDjMmY{MW2?V+Y>60j!zHSUql-0XF+L^J$N&jz=`r{ax`}PDQ~8v!Q%> zJ{!so_)4OVqcy1PZu}I%joa=Ye#DM`2ZJiH?HH@1E<$Q}OJFqUZpP3#Gv65{yDhf( zB=eI{gFWUaSzprRH6NPnUcq6OVfZ6;MiVo47Hx0MA&GKZ-F`<(62m=DC#PTv&67V4 zEOqBGeQ<(OgJY??KwsR}R(Y$z5CAm401R!>E^Dsk3V=xW2@9apKLCdC1HejsIg2IR zxw9<5EDP`}3ozFLs3!M!7GRA9sI~w?E0rLC5f(tzQN;w?2BiR?mb*t-0M`O+_hpG|J^Z}pX zu)cnYpQt13;!c9As_rMh0Piw@1xGJ45b)64@N8zn1*rR7865Uyw#up;@4jhkAzEEdl2?`DyOk;$J$d zOW!8{^JjLAbw9=b{IqVdypddZDh_sj-8#!%MmtMa+1xv(X3m$cKUQ-EF7|K{MQJ5< zrhi8C@m+ha;flxU2d-;0*LIBSHviae6Qug>0?E1I*;P88>wROh9 z+~y1I;2cN0PcdQmQrD=vlb~D-jl%M&A(h}gO~p-hJ9x}3Q1`N~g5`#LLLj=Sb;cH- zXIpdqN5ZY%H<*t5nXUF><1IW2^ehL(jY5g}>_5CgoeIwBHEr)t<1m0|` z>bP_sAeVFN!ciTyI=DN{RYtMUu*?-jWT)p(*NcIn)pb5kD{;O*y#d6`)3 z-VF)1ZrgNFzREp*3M5%?{-S3}Z=M=q=c6Fd# zpk*rCaZ-q8bw7UcwZfSh#ca-hr5wjJ8Pfeq;$@YPBYflhgQn}Etc+;#yz>sspUTI~ zX8iR=I`55`>l`rkKmA7Cyox(lUF?3V`&P!kTeX=l{8-SrujJc}%U5)*^c#!|bQH(U z+!by&(@%sccllv-l2!POIw@psI35BN*XgYjF=ra}5iNv3?-5wf`x|;F)yJQ9{7~|~ zEmQD5ZL8)0A#OFF{`$YrXJfrHr-^u$RMLMI2Zts}10x2owX&GM{B+k()|m=&vUkYi zuWuuf@w%9Lg3cNFa$rl~*C@ZvV}Y#>_0s9cCi6_K8!W$ZcKB1~$Nl3j&FyBjAo{R+ z%PuPY^^HQS_3_Or)SEW$#X*XbK+1dpEfPsR0?HR?9bqtnUxS3TQE^}vXWqF%r1j+F zdDOMS@ZNH)i&|vyY^tEfyTtw{Pi?D;A!-cPt{;_gNr_-=QC9%Q!XiU4Fod`=T@#(B zsuLrEt;Y8Xz+N|GADDnZ+Y-ps&t|t}eJoyrTF$=6G|xRv+&>TTQ5Nr`NEMmxdHgOA z*uGDJl{E9&`7Ar12P#vn;1;a2HS8Mc(Vbm&J)}Rkg>Xa83t=j)&AihBvz}G;aCVcCq>%wLq5Gw)U~!@Es5Ww zuTJ_($*nor2(2;l;B;q-Zd3hrGHPP=9c*m#%fSh`tB_0|QEI(KK zlT2c|I(KV9nxotG&fWGL`EF6K-e>6O_7!6cvjSt7+{l`o#1bjNM^JKPv1~Nhff(8T zRO_6PSGu(hhX$ajZVL_np1Y`9v&dnzY33(w6zrd~ED&uBAZOje#eGz1UQ&`FU z%s1V(Wm}s%R7IOYTVki?^43&jXMUCcl&0G8uG|uRbE zC}vgky*7w@{VqW#7H8-?tDPH*YNMMI#lxN8{J>#NEXUB^tW{n(m?M6~u3tBFRBbGX z?a_|#rt0!B^TMuO&a0~&M?ZCs71+EpA65G6%{ zI1}js^Rdj3A^?p+_mWeiw|`|u0g+~1ttcMveesKaKiL7^P2s$1=k$EuVnC64hEX{`TvPrl&XjOloR}w(X)5KKqFU=s zQ5x68y}@Xg_zapTWRtxf*Oto`f{gxpo$Y)0dYbc?JD1PYdKM)T6EH8-qc*zHyzUX* z1+Ip_jAMwFGn?(+U}SQuKOnI#3xU{A=hF$y%VuCsu!JA%37#{!1BIn|jHwRYenf5Ki*pzh>^<+7?Z;dVjWl=eLIPNwN6QiSf;@_;eRJOl3?)j58$m9w z0aQ-o5$u_gV4=kM{t$QU$@};pUKSlas3ywP*5FeF0#+@hCW>+z z#YK6rale}K!_0iBv4Q;fTyaV2RJ7i9N^=!AcafsG@f%HQ8coEwUmeSnkyT_KEoyIM z9y%~_WJ=GG>pjTb=Lw&*g;|GoKDThsgw z(KVs1u|RI=+Q^Q4|0!!~#(yeO^Ldi!ih*mlujKhvwI%Gaf`!~|_#ri-Xk%&Yz(c?Gcn<%HL;O%Pa9IdVFOcF%VodF&FngF@_rPguwK`|V79}T zaAcM!u=G~%g}lo<4-gjYc`w8sDM>?&tiucT2PEEi78{IMve@$EGv#5P{%LgXzNbahKVtDZ`x*+HJJa)ah8}p@# z+!Wc7Tjd|V$?SwUdAyo|%yI74qICW)Ik)fkk)0h3jq%sK*Y^kP{QWiGk|}(+gp_(+ z52e2{w>gxcW7c?8t{caeHV3be%Wyzhrx{6X9j8Q=%cW8 z9q`^CjN<3Ks_$2QcT(dEq;P%fO;N|;yl{F`fbBNmf9f4`jMI0`{ef+G1EaW=(UnvO z&B~WPqe_m`t2@71g%t^LeHd~~W;5~WRA>6GfzC7YD84FplM~TqnCn_42(sg+NX|QS zklWVU5vi`G9C|@7PX;a1d2*HWXSH;A?$^xCv1Tsp z$keW;O`(%aGr}j@ZZHn&hj#WVUTo})MS+dj8SE_mPIdHkdUr6zn%y<}od)*GKy0K2 zc17P6QCFiH$o)41YwrtG`D-_OM`INELsjlK)lFZbp?H0GbQeRb_2P}EI?Q+mNe*Ib zoo{szPhDn4GLVbVyDR*57G>6m7*%j~x0~H7st{^Z>pw#ugB0ZU{0$63?1)=Ocw)El zvThl+W-+Gm-QPQsNl2A{mL+^U&(0-&zWc);n-daDc0Srt-fytqv+heEQZ^B zfoQGWoS^^o*ZZ!~u$z^}uy3#K{D$|wjMXPhsx1%0Ut4_wZBM?{c3|S8)Uzq}<+niZ z;o@jotXuh|#*=1vk=$$IWMrOd+(eFcc)t_O$dv-cC@I{@L8RDvk*I!IV%vqpdl5-V z^#bF)CLTJG6i;}yQO#DL7crt#4%R$UwOVe)NK*TP0O=iXdH?^ncRXwf%y@XL#2m{? zylJHu>4QoeEAzkKx-2)`+XyenE(YEcUyxpYKzcF43$jaEp7r$U|B*vE!sAf1UVni< z`QGeM|A9X-H#$@N$^LlF{(qT2LBciuz;c@~%w8~COH^jp2EQ+qhrtwm5`TLbM!_gB zew1wUHM}4vu=(z13h0#K_nbGR=S%R%Xwqb)6a8^^WEzqq-1iWjeXds?F*SNMjnx4;cE$5t;5r_@O1yA1E~t-5TKPOCWb^fV(f-KDJ~f zfyW!|$tzcUe{R8oW$ek{pWC?N#{P}Nb2npb(P6m1rZswcpQ`A{{v4`fyEm#hkn1|5 zN~&_3oHP44lloWnZHfHcA>gmsRuv5vM}sBN(S4#5`=h?ZVFBGXjrP~y#(0^2UGEI* z?~LkGx)#5&2pVS&;-GHWKsw9YPsPFLImP}v(Q&oWrd4XwA;~uFL{Xl*)vGExrH|L5 z+)daM(x%O{i3XYNkjA{HmPIRz``a8g*wRwn7e&;xVXZEB5@Mqd}bf^+Eiq` zV4T&UrsgwcPtD^M2=k1pXn3_p#r*Yu6fQ)6l-zvSsOarqBxUBuPLj;L&3%AhWajF~ zuFj$BYMrMx1J7L(5AI`k*H31OLm%Rp0;zdxh&R2uc~bLfNX-~&c~bKuHRZ>Jjx)dv;ozl;`QOhn?^T`vhn)RKf8aW`44r0^}sc|mZ)L-8WbTIOg<|!xi1zdXK zG%Gqc%p<0~=o}Mf5}7GFUsr(_Pwpil_;WEyN}La+(AFbaKXnfMA?P%y@Y6gUjQ^oj5fu@ZBIe&em45g#f}IjS;uNK!aq8g(IdB`%Z_Q_y;u0`B)Ga95Vzv?V@FFTdIBz$bU$xC`v4qY52?nQyL)%;K|Y16Isc zxrOQVCoFl0l;puob@W|S=+F=M>610$t=csf9%DM@Z_p~ztocyZY2+Io^&&!pY=k+u zB9~Ly$M6S?MzyS+M?t{D-=ldOyhv@9;)YwJHx!E&*0?9w+~F2pDMZ0MRnZ0xFB0nE z(dMJs{7v+%b^cn&xCflPlG0V8QRtbvi5cuz6P4YQIZ>2W9q;b4iAW%o%@SUj*`jOY z3BQ_n%@(&rCsZkX*Vbp;zPQTz`=;BwlBoQBB&+M~?zg~wWI+KnO7gzpLF*A=9B zyJ5O~-B)8q!h4lAqWQm|Ir>)g2Ly+pbDO4z(>%IA*nPJj8k_e!$EUs@*`7E3?Lhf8 zHQ`Qy@(V|YxN~_;O(1$9Z)e%ZntAI2TgMMnSp0ORNxjMF4|REEqqX$SrjA6{7aCPn z$Kc=~UPrjH0IMJK9mC=d`iH~1W#vaNHnP7c#OY_P*s-%I*xHG_tm=11%H`{Qh zPBKIkK5p8L|$`7{iXh;l~Yq7eB20tm%;yh<@D$X^r|L1Uo)a3x;Enq*p!R^ z^-dmtDk_(j(~K@qH|*7@jH>o!H(5!P=H_TlLq{ii*rCNYt)|PInnoJYAr4Ny7{7&M zKMC*ol%AA}QAmb;q6W=wh}9M%$89k5#ks-lB%2%2Hj-*k1cdjriA{+l$E@orf-4zp)XS~5{0=vpcIN!Z%6DEVFuQqw0OXH6G!-8B%Jz&(^c`r&YrOLvnvF7o)1^6R(5mg$tZ ze0BJ{gwN27b~uqQoS?DI?gbF8to3pxYT9{Jmw}`8C3A`J-fe65I2+!G(b<%K2wH^T z(mf&o9hgd_=~?O8(p7S2vmYb@y@=_lbshTx%J^J&+RM-VpqLB{g&#e1=+P@oQu-+COw zXwsQf6(#1SVKh|MlA|>J%*fxZv{AcoBS!p3YX6|1bj)({YP|}3@D$A`%gS=a&hr}G zCkDgP@5DT^EBD^IGW;A{ptDMS`K<>(p!9D^1 z(#9(P(pCQFU&knFS+u1py4wAq+|qr-A~k8q6pWm|gfI^|r@z19BLXC(`;*#lGHU5j zx|XBsdzP^i+x;WnNsNWr8V9>C9>KQk+##H1104*VncgjZcjHNFPiEkh%5Ggh`rKjm9O zmttdZ!2!OUME8vS&A#8gB@~n~kL-4MukXsj#KFn_noBb$Qd`Qf=QW97H9U#@jqszU z{CC?!A4rQ&6zhFmiWl4ie;t(21@8a#IN^RUzx12M8lAur{Y6L$9S3uP5kQuGl+K@< zLezKz`Z4E>`Ob9<0-fImbF1F%{8nOpjdP+Hs?U+awKa8gCLm$yCPd7)h-ymL)(ja8 zv4q)98jrvoUIxBnJZDvc_Sh%#N$%F>+(jbe{^2W!M>hl_8@St!KZ;Lsl~W0<#zyz( z-SfT~2MA8R8DC*z8dv=Eq3=@m5tZ>K2f4PGH%&=Z(a)L^9U`AmBwEy{i(-6e(>EO= zU*uLrKW+M|W8~9ZRN_U^WvOs?laOZ1Woo6tuIUbw_0bg~HpmEeVuqCai= zYA>5GxXIm%rZH55R($vEsue#?Zdx&Y^ya|UmO48KRq!@kjW8Y89XMEF5xah1YrCOq zig%#@nSiQSf-v(6zQ`tnzaOY_725ai zWdGZqvgg_Ch5n43+JKdlQv+PmlXK#pa{6q}{LGx%;FYtFa+Z+uggxc#WOL?a<`lo6 zoLrL7A#9_&t8@>Y-OJ|ekePEYFDKVYYDxx?bJ?D9=G&aPgrraVUqurP@rWg5QTN7@6p=Ca>11^CB0nEWpq;KE6Pn>mT^tC|rJp>)AVDCdF_vy`oMzEb)4STTYNB}$^9&???FTRhF-G&x5P(~ZY>Q^o#67uBMGvZ@Vwc4skqGPsU7)Z zhQvMbTY9Bu3MX(7w$Yu?6YyBsK6db<%NYAI>aULOr9wuMv_Ip-xL<3>o#%Pn5=0yv zK=6pj&%D~qmbKo!3&gAC#s%gYp5U9(sw~{D!D@34rC0{dvNfsHSuh^iQE7ejneI-d z8Z;?%UpM25()t|&sqradC8x*d>@%?&lJnMW?owr?3%|xovGmoUYI_tv92Dp*7w_g^ ze&!c#j8U{P`lPX7Raedy50|uijB0BpG61(~#O%4lYyb`cd+f6fZlg5W=AQ1=*DG1y z{>s-`g=sdbdQU9G=}g#X1xMwq}*s}Ue~?w z9CMo#1ktZN*DxCnV%E#Me;3-@I*u`^_=@?CcSuDxxrLvbbp7HSXFa}LRcr^Vd$RRc zp5hIb#ed01bqse}Fp1WeOeF$3vw2@u@7`MVF<*Uwp)>AK79b?$3zC3n{Rh~4pb(w$ zJg|?xVtRR>xO|CLejoMM;Mz;m(H`X@6EXVNLU8t@R~c2x);VDd}pO@a2nFGCb}$ zN^YqynL-?i&l<4k`WLTJ+G7XVLiRTqHon}*uX|Am&0cSI0=GBQ3+0>j8xn}qzD1+{ ziy{?!AhA|wXa#k%{mk|f#TG_;PCiOas#q+79sTmfHr4t%eQEJM&R{~sD`qPxR&c*+ z_}H*Wh-&U1X&ECP(TI!m4j>s4u=Q#E^ccrab#%j0wdaLv*!svZm8QnOQu!wxh>$wi z-HQ>*5Sec`6YOs&u_gIzN&E9-XwnPi6jL2-WEYybT)4q~VM=trD>8+>c(CTDY&#ky z>fgYR>IW?6g({O#ll22a5x9K}*pe9UK5ui@*_@kg&d2$&+0G_gqQt$+LY-%!{%N74 zxUx_+$yT{@ZQ*a4t!AV9zU^IJ%Gyil8$LDJcs8`MdA6|QQ-xhdVKnnJTheV_Nq16G zt8W#G`8NKw__`G`F^NCBdw~b(`~R#M342*9rj7{oUR{Mtm0MeKv2-zm8!FjXs*tX3 ziHBdUOXxo9gNWrX%4g1U&pp^BbVyd`gGgNRJ-0dmeGYSkFPC*EIEO3S*Z0 zrePRi!T1{%3PWcuS0O1On{y3wmAx>Da5;qB``E35QSJ{XRlEFxKAyJ$sm%1YS5?VS z^Y?u7ce;69*gR-8#w>-hi@|X*9p}QG!t{Y;H;Q=qhi_Hv7Gkl~Ig42^kBTvoquifA z2Gg+}^&Dm0epfz4`TyKBX`nG{LJz(zPC4Bux!OEI7hsp!0Zg?ss08GSepMCS;jTnv zsFAQJv(&=cSU9)3eCy;9mS4%;T2sFD`t3E?$%^;79ZIJ|7EaZ19N??n52CHjsv-wm ze)(|5$`EF^3Wf)p-b5Zx(UlBq$vgHY+*`KdbtkcJmcAuw^M~4ivOi{<<;2obP%0U*0f-o3K>=u3+6^uRHTHGa&&Rh_tieh zA%2iEi;N-u1nw=d7>JcAh-ujn;wR&$f`@7ST`>B6aQw)k$n@LLzFsVCo;lHWrWC5( z48-xl=v$fcMXLQ%Frwz%=VUhueG_FY2Z4AZ3aLis8rZ0tL22WBoC-WmU~84V&jS)3 z2@;}Nbt)Jl$Jag8=GMPw^=fbNq|py3J2Btzt4Rf$XW^jdo?{Li_Z!-UivkXMF%^W?lUQb{~xb^WJinjzOy~#Ph ztTiwH{KJEhVfh{KSixQN{ezL6hfg^pIKJv0`rx*02x2l~kTcTQLGyB?htH|`u=u%4 zG*E2M77>x`@pfN?Z@lMWOcUHgZ6^)+nxS){Bs1Hnc0egfCxD@kfs?k}#_uO&=t zJj5`xYyUNIXAdRy&7w!`$KwH8UTAu|vaXMxoLQD#JA1&F^ONm~X0=B%KC64aP(~y7 z<4=3)e2zMget!?+@&#xZziN+3tCjS_9t(U*Nk{K-pyw#*A_`0mwCz$qqptep`I`>8 z6)_l*9v{enSqtq%WEOoduJ7C3V(nkE7XALJ{pnq{r)(zAWG8O}NfM7xz{kidwt%~` zA>IKZUQ7WQ`#&eIQB;`HImk53xm9w8V~sjdqUbEPVGTzBTl_Dr4lFGuG0^vohP7C6 z@8qiTBpxFMA5pW%LxW1!8U;(D%WU1xQdDzb-(B{chqj{1&Xm%z|3G zCi2DZQf5wI7O$O zZOUKhv;a>e1*K>A$oBjxegxuJ!EhF2kOw?vZc%nDU?dkdxEQpfbz1K(R8g_AXTAK} z)Rri&aK3c=6uf`gQY`M( z#-((K2Zmt`CJxm1Mbt}jtCu{_B;UGO)r<%8>=USic$l_jiQ>pHz~(r`Yxp&GgyynW zDAjLMoBv`zN88k`f3~0B+0RS8AvsQ;WIFG7v5ni@Uu)xJB^EYJDC9)gcsO;h*34uN z#en}v@18`&Gvo1o7X4>UUyvS;qr3(_waqr+z2kIVbyI%Ahre;m{5Y)YQ(Hbo_SFs7 z&JQJU;LiQK&-vjp*hkf|DRb5EHwUpN@*04*Vc3Z}_P?PwU6bv*@ISO~_G8|7dhI*$ zf6~5i`}URoU)pz-q;u^*pP3m??)PT=l0AjV3r0s7-10W}zHIJ$#?M2N<)c|-_9>7(eh^y&KzFBrMq~s1UO+yxx%sY10UeeNbg6*qEKqd{ zXxAfI)l~}UM+>B9nk?mhFB|A!0U=a)`g<$C&iq>3dVA4Lk{F`f4Q+X5wUm;Rk#4v^ zm>`KuvY1r^7^y7xePJgSGFD_GGeB%t8Dbf)EhCmynZK9tx4uNPpqF1!G#lA$$rcKU zm92PKi>%FkiIWm5n|;ixOv+~G{2(CTB5C_MYd|#X?>4igX*nK_CV~R)RsmkQ?i5O) zG^rE5R-Z(yC3_WlJovGD+HaMt146g+fu>|G)+(>*AO*lIV*Uf3ffp3l#?=|T_59}N zyqttTga6WvPG08-9TwO+qI-wXX8cD{HO43=yO`uUcm4nt=DW7CL-uQ@eb6L?k3;U# z3|S=r*fiXioZjtpG($)k3jWF=W}ExzKFqQAzOcv3zr@Vt=;SEey_$y{-J92Nmh_GB zz#>Z<5s9JSoAD2TH2SR2bQoWy?jHsc6)U@Uo=xd(Cu*Dbx!it!?S1hY6#$p`Q}7nD33v?wMm$>tal%=NejJP z$JwO*O1jl1?famu=Kz~zc$6!5A1HYGw7pO}dF;vV-gxcIQ&}1NS8BhBm2LCtc}o4D z`ujGS{+#Yb&((3=_{nD}>1z#Ttn3_*W4I|J=}nvTrI+isHmQI0_z`CXa~p$w&ANHg z0u6?@Q*jj*Xka$bZU6K6dUZdqe<%Nk{`K~n^oIIHtuz|= zw(j9n!VmpSx4U=+-I_}Hmra=PC!6EyR6?^7k{p8Ng?gj^XfKa;O}76rNcAtx&(&T- z{kC*>+t;T3PkEJYr#ne}tFi5Qp5076{m3R6d@Hp{BfP?v*(8H+``e^PxxJxWf3-;l z-+nxLw|@L5d>gv2Hy=Cx1ONTF*YK06NA(?L`}4^Yw)#G{dV_D%Reh{%nwO&>Bk5wB zGz%d@g?vvTNh}>H?|;{ytM>8wV;>gV^ZNPR8@FqzC*atH(%jcHytCJY zv(yCbi3hJ@KjN8EBZEC;ffiUg?;Z<~x^m7@h|TO=#jM=v{#aROLnQLQb=Em)kOv)@(hR; z|5*YS?@*qDWD^=fi4%&=N70o1(cHwR3)H?e>5faNdbL$Z&sUn z3Fud7EvT+z3TRifS&AOCMmJqCbqCpz2PxRF9)Wt;D|lC$fY&z;_9l;cAkhgg<8 zc^nc<>0iC`kV{nDMt52P3)LQo;Ck6NbZ2sgzMYdb*T;j%IuP;Ih>1_0h&=Z_{CQ!< ze%$UnBrka$!uTZ5LpmS6+j)p#%CT+Hd5Go9y)lfRzZcx>?>eQ<$Bf25`W9!fT|+}f zJNf~TJeMnQV;%X*IBSdfP3mB`yTAbN%5Qu=t+A)L4-tw?J3j~i4$hgCI3x7ef60WR zxDE!RYl3|@`|H>7&9NPhc)7o^%uRHrAQ-Yc5`ybE3^@KPbNL#71 zE3H2^XV{U>sH3C9Dx;&uP&}<|3=Iqp88&({7WJH7mNH5-yfTOj>FA`$ zxKI~&&Gw($B7^@w_TD`{s^Sd%-dwQ6)#m#%z3}h%sFSzZWh~L z-{1TGB_B3(&df8lml9OW;U++#mtO>>4^y?rd@SvK@hCvkU<9jvs zpXbZUXoSx0p)zL?$a@hon)1O1_H6k=)p3d;xxqJ#HMk_1)yj^nPxFGG8GCs!j6@F* z&zl5Q8&W_bGl7aj9Wq64xK|C$;6p2P_W1~rWPh%+_gmRsEBjNO{fU)*q?Nr}XTN1- zf6Z_SlASvH1+taENW0&$>L6vCB}fVle#)xyv{mIUo&A`Vy~fI3s^v*`cRG8Ol|9(X4(aTK<+{m}tn9fu`_Rqw2`NzI zoND#SD!bCc)ZRt2;Zj{C&cgJ%l|4*n53r!0)Y*+sfz+t#jxLKHahQrq={5V$SuP0A z4^kdIqW*xFw~EZx_HTrx4GNygt^U&PA$h*DO%|dn^jpzeo|*rBD+YQ9i!H-}h5wwc zWPCgXanF^Nm`nn1m6_Q-KD%TH)jT(c$@}MMYgWVO{=O8yEyY%CVGdMFH)~2uJ=gyr89UL?LD&4weuI@p(e9yIG(MZ za|bx@rY~+y8!o^wKm=jf-0O z*#jXdjpIe#mTob)aqo&~>T=OH6sXAS-=PT4Hx!fImJ9Q7k0&}nJ0gL43Q#dX13w>V z8sD934|H2kq6{sU$?|-+lRSP)(1X3Q<*^(*N*+^ge20=qnM_3-dP2Aor&J^V9NK&Y zDAndMgOJeQs>{b%C2U)06VsoyoVE(?G#N*BBH=fYB(xqviP`qE#)Re{-CH1B>ekExZ z=dDtmcl?$OCB5InAOBz4#Ix#UQMHGJBUA=_EE6R4;4a&Ga)yr}{!$c^h` zz=~V5VO+2^3|l9#M+j^ORwt@&in%Eb za^$r|vT*xx>7(&7;OcpB=WsVSydTDjclDaM(G)MvU!A5W@owIiw$_`(Ij;HEC_K%$ z;32VCM9Ns4jA>XI^%#|7p=4iA_VF^@dyU5l62c*fH6;if9UaPUHdf;SUC(!y?%PHu zszs}aR|?YslIH=qC6`x-*r4V322l~OsK}R4%w~>d zA0)D0Y7Xn@oMOEY#*5YWwr8mQCwwKud(pFr7qH)nv#vPzDh~qFS&knfM;WUsn$osm@Qf!|Ko-Ntnj`~kYyiEfV zWq)TwWI7OC1>!dv!smiWb|5~x5r_#If-?*p9Q(-9bqZmz9NpM1FH)t; z^O;OvXmp%x#>sX3t-U^{UfE2Pb1pMQ;JqT))6EX;!tcgF$Uu5g9Q7t=qMSt~O~7V= zv(b(Wd2ExeNbm(Y1C*xa?a$VnhAc60y3bca^SU@=Y;QYb_YHI+-5H_}(`3&D5@yarzn#Oo<>Xft2y7=KAH7YrIl(db3hcyOhmK(>tWwZV+;o|XRTdXhdWwZX@4V3%@ zpsz@?{!*vt11b7Y7b(`CCq-hv+?<+wZp3=DsDsU)xtMUp?~`r%F@ZxCwI9DixFYtD zn{EnRY-4m^nx!u@bRUe1-?aN;3R#zsom=!T<}XUfRv~(t0g2ci<1Afjt3QtttP@@@==R? zSYE-BkCYppIVjIZBjm&3?{OCXvu*rszXKZg`{G{F#H6s_W#Mz~^>l6v64ibq5D&zF zm?RK?2BPgUjpl|JKxYfkA_2<%QMFYV1E`w-O%|X7M6xtDJO-zjysmEdS+|eq(w*})@I+nuo>jV%QgHB$>@z}SkUnn}ETBNWX)GeI; z60dggNRujFy@h$3xb-6$tZ=~jGx6&F{Za91Gsrr}tLr3}P}Cb0uVz20hcs2s_kfbP zH6mWkAV$qe%Ts^LRlLgb58R$Aam#KQ(nCAcpjFXX5!#<#fpek3f2vcrvH|7yddx4j z0CoWYpp-1tC8Mm8XLO128EhbcsDG11efwChtB-&+2vRDW5Qcrt66FYcJ}WZGFsVPB zh^_XgaHn>f{HO71>vMf&icjZdyWvUZqE_B|A}*Zixbtf0JAm)g$fBd5V~A<3^xZRfL#^Nu5g5s+twO*R*LUY2HvyPJ0zR%kS{@nQ3^{r#hQX1YO>S=0} zsYz2qqs&ZlQtmZs_6WjNFWC(1A?^IZ;a}DQZZFi$!sX8va=V05MCY!Z9?rQPWJvu! z4#d(XAf^d~K2(jvXQMVy3j98&0oAXw^sUj$A>(;z=r}M}nS1{NqBv1-hq3(UCHVYeYOk)$~&Rn$hE@9|wLj3mU!trl(XUlT|PJiZO4^{AYHQneek1E)6$>V3& z(Tf0&@uc-XB-y=i2zrMpfOGhXH)bzhvwHD@>{5$Tn*U7ib6;8XzAUz~lYN@zLaClq zW44r)(t&)+4KEStg!$!~e^}#NX5nvKtwW;z?~9B?#%QnB!UQi7L|dH(N{j*YpaA`d zw6wjeqoLjJb;h(zfZi0K8(88YWZDn|s7Qbw7NDc?9})4<|2hAHxHUE2Y!Z*jzeuV5 zLE3J7L67%?U8M(6L-rr^#yR@$!WgROF;3aV(iW7w(OC>5_O)UYd-I-X#1= zXShoFHkKq^x=%7CWXoLWLu7OT*fL@OT>McML z*cnfK$~+)~9}(-FYoJcQ%o2`2tyfxG$M&R90`1>HrkK_b-|djiw2dw7Slt?&&A|hM ze`^)BQY6#WuJtd*>yr6a$%EmNL|sy9mE0CCNs_hnZ8I68w{DHdGYIk33>oq%VVK^G+1><)M-OzM>o&SL+MD z;F1c??VHIE6;~DUce?C|;OpEo2}0PWK!&)zEEz)|K`Tl-DJ@?#XR`H*e4^eM&$}-I zrd%Yj`blj4=H!%y$Eg+kiRW&-R@{E7E8a2M-;zxZJOR1`kldlWQ|gJ=IVx5j!g#V| zW5PUREHC>pBDJsP#B zPZYk)vuYN9Z*9>8isJkFf9-FQO1|L1(G4wuSK6)<`x%$N-`AfLPpS^IUCVu#O?-N~ zio*lzx74bg?9(7loiKRbNA`UD|Lyz3Q`;=zlV~$yzukZF{%MT&hr4Th{?j6GO_6tV z4)gx--`}uhXA@^DawYw;44EV3%^&eg>l+0iwWxI3^O} z3Lx4BB3di{FT7vf-|E77SiS#)_p7rYiR110RCAZdUbB00ZAC;+{vpz%U#@;Y`*Zj6 z<{j`;yBGZxEzu}GbtX&d%+ecp<9q9Y{ybOXZ(dp!f3X_;otieCzr|@){9T(?2NEvU zr>)Qz8`D;E5mq_;)iyGmx6bR0I(edUxc#bq@Q6xYev(Q-PEOvN7u=ZE!d+hIzBGAy zl^48^FP=jBld1g8l#<}uv~{FDd&en*9@i>6%0tUlfeim6Z-e>@rfLkbi5nlDFv}pzga9h+Faik z#s`-As3a*o@P5s+M^jN6t%vPwaGR zl;>`WoDJ~IROiC-T~A{Juu^=A6tki*M?o3qN_@n@M*?dc_iBgva2)4|^F1^a{=tEPT<)!klMeY2ggwmSv6o+?YHX zQ?Z5V9yg{zl)=$UY((_)o*fd~w9@u)RioAT6GH^hIb>y$B~Q|p>#Q@$I@QXWud^;} zZA_Yg^XDw6JCY%d%BI`rNiOa-P z1OI_&iQVrl5LJxVsxl3hf6!uoh8EBl$e&aj1M3Lw}SL~H_{8;NKes34zh95=|92;G+gxA((v+Y zTpDgp(;D8MwDmxGm*1$OqesiOV9lF{Bu)$U`n9{s7hZDlICsuY~NXS>Gc zoflkv9sy2K+%UE$5KyhS4z^kg8%kRSwm-VDEq7!4k{c+DM0jmygr|oQGJWfHr5oV| zZiIj2Cep6-aj-?$l{a?j4nyK>Fdpy5*!H}u!+EhtY(++*`rHskSPsH>uXS0~$3uby-D`*mfH{YTqU zgE2h?g4(s&`jMw@*ken2mVuY=PLRcSCK~Gy)U5}xKSaxRg2%APt4D5Pes4Y#ynG>z^>#N_>u#*6b7KcuqZ@nF(sQM} zM^eMrTvT3GG<#-Qg-<%Ip4%_|YF0@#2VnYWd8KOEPs@*$hR4C^5X`m_KDu+ui#xSE z+}-lc5}`B~m(>)`C@(2iElX$9Y0;m#^@qxww0=lJm&sR(L{#!dJ|}3K*;k~0sQhc8cybTM^lUWWl zZgeBOTO;h77n+l01A;WcMw%B?NH<&dLLoga66sk4XvR5iq`j2cj|fK~2gDa@Tq%OWTroA9v)Hu6dhPws zc9ZuKo#>CZr!+iDwfZLob81THe!*eUD{}c;_c-*>#3;EGcqNx|fn44tRAH&uG?5W! zExhK$)yig$xasO|mip`EZz3Ckb*u>Q{-|Qgc}CV|*9cA2(UV&)Tb{Ax(h{LM%Yvwp ze~pQx3+KO!7>_ThVCNaHVm;Wb+U5OA`7l|F--&n_ljCV?>yKBrs7&GBzGxAxBaSw9ZE~^XX%svAX^}E0cV_l5x19{3Y)^Anw1nCqc9>OmhMvJS@Kk7ipEmx(KD|=_jRk|hdYOodnpIx^|o~gCS zqwVJ6d1V#F=~rcp&Y*xtiw`*l`Uupr$Fm7Ix{uXYDym(xYXe`QHH zt5PDQ&!#Kjrv#O;`DquEP7`nplr}scLWne^;9fxZST4G08=2;|ywH=GAF%kt3v=1( z-0ZxRi}vU8MNwsSICgFUrnh}a`29PF;J!kz&AH>a$*phAx+Ii%8f%rzMtu}ibrnG4CW#Vw^Q}O2 z*f`tml8@0%rZf&`M^|fO?};+VF2+29VB2>1SAbxLdy8R=u*2%JE$w|{@Z(sTR`&Q? zTn4)e>YtPrmZaSLqHHm+xG#M8!QIP6bjgkr1m0I>U^X2QzD*+*h4r`+_AY;&PsC@<>X!3 zOWfoxR#R2~^L7giO8Z73qt$rr1m0{O?P>o<ygfCLiwT%3CA8+&Hz`VD<5|Cn6d8DTChLp!ToY?Vl?# z4My8knj;M>2J|6YJpgYrF{L~v^*&xw;V&7uE#)z0e)V5fGxeCFvTLdei=6Bdvd7EZ z#9M!GW=i9BdYSSEo+#(rr6sd-|s(F)SeC%ZSnzu^EYfi@b z%}-0lGfu{7&6_3TVJD+k^A^ciZD*u3RKjm|fOwbwFmqt0$DbzYK%PWMdX6V>QuA|C zp^^&C+vKW5u3F`43Rl4$n~bFTgCqRM)*n18a2(H!k7>pVdD@{yhN8l%n)1q`*}j20 zQXZWobHis+8n%ic42jOrLRlUcVBeTQ`E<#o%*lmsYYgm(NvesD)j>l z8sAfaDycRPskq~t1TdXDDXp)naDl48JhJ&RdaS9?=dwlCMvw z&XiWpp))Cu`dO$TUmhSdUn#sZODc-t-B#WHPUN;THg&N)qc;wHwFA%#zvJE zmy|oDOeS<`E2Y70^#`Z>Q|b>cmM;r<1IINlCinYRk5DT)DGf7dqIGm4*^EM$;G>er zCxZH3rM`NQE^#ud*LDN_YEGhFTP8J{M*!b;np{0Ad41&S6S+D@t_tNUNvd1yBu)@vvnmRoJoeG0XaGVencT`^-m-`DYt2V~~ni^(=^|IN)jQBmOXk_q`yd z|GLfc^{BgP+#ok_Oj#z|D_;!S`X{Ajyz&TX!?B(p8pX}x#w@?H_fd=3_l3kFMXj1C zN##84qVpUVP1K2t9)$_D5n#CrSXD9329KR*+-f6@wEsFLR!bGy{W%{H|E z6d~X{&-mxrHclV@`2iSf-y83%NpOUJzT{t0-fEoN6E`3Z`ayBf;r+8V{)tp=!x=^G z_Y%~KrRP%qGyeO@%k|pCaMhf}#|fGo_o~pw^_HhmOGDzkuX|i~K(+EB>n5U3kC&Is z^y4k8j%C<$teoG{Sy9O1hu_avwYOG zJ-Jz;=k_C-<#?8vE3zY_f)DA2Q45U@OPipGIJ7V4?zp3ZZ~qzTG1pu2qk3@!b+TiI z1wp~z+l_w#H!3VRM{Kk$f&EnQzg40FIUm&t3V!8`$GuE)lb z1Fd-g4G!#qRLm>epN|a_w7n;U($1d{$~Zr_erxv)Ig+bPLMFT#)tYm@oWH=tQ+g^_ zmjn~fx7))~44#NcbfFnL&nUIqe8|n4V^AiZ5{O9LDVXdyk=<^w^tqnJ7%d-Rdm+-W zfFW>N`UgNrgFBu-;bAFnH4;+AUhqBp!`O?yRBc;(czcmR`OnykOX;=Da=WYMEPHXX zCdX|rmamJp7Z+RNtTgQpOpFNT_;$o~$`;HkEeXe-&4-4EqWN%)d3;%EorCK*`vgA*Z{XQW=HXi_!nXde^>xlyu zU#9MgVKrO%Y_Pqz4-m01DA5i7C zTKFh1s>|(6t(Gd&Q%8rb<=W8TYPt)IvC!?#3+TS;@!tV$ZOr%}%3PYriT#}8MnLjH z4`yJR!p}L5WB;GkZVm0KNNBIWp#Digb@GxcY|3R_VupJlZwH!Q%luJ5>FAN;;=ZuK z>FBqp{swsj!c<$l_h2U-G70sn(m+p%7#bhZpxwSP2FNGHFDmd14W8=;U+)ILQ=1Gr)L$Wk{+{qzof&4a zXA&gl1ov+`aPpRCYQKKAy}KT*5hR>g*3>;MxKzl8D!;p#aqec;aia*jsf(ijVmD-8 zH{=ZpGA=OE=}{uw*P8&^&teYH$cXEmbx)6FXWdA+rp}--79x&HA=@sd5%!`wOuiMK z`OA8_&S25mcJW#kgZ&}NDWpWI9t2}&1J+Rg+P;tV2KP25FT zucu^ss)^f;)Hw9S3q8sZc9St@we{K2N!a}KF3X0A&0}Ma@(;4*X6vE!E|(1__Yj+5 zT1QWoh10gZ?;%1>U9NLln<}jlR#>h5#@*UV2{W2ylZW1zF?#y5qf6sjM=uo1()Lfz ztO3>83YE;P_Kg8c9Yt*OdyW9KE$15r(Zhi_55C(Fe-nuG?-fM*8tJ^?XmCL^3dCUS zk`|k;P-BZttsaclJYm9aJs8LR-8C2ou@S6@>#txVqwa#{e6!2NYW)w@!?cEFic3SRmUceoXDLU29p;e|2$Sd?&2i zk)2o^Xb59nDOhc>DcAEf&XAv>uZ-vMB?DX7@!Z||AZ1?K^gs$*dP|+X&eJw4|0e69 zuJ@nn_xZy6q=N)^^-n7g?N8=)1Y;DW@=D1m{_$ZTUhl{X35m%Eg#gMA=~bMoZO{kFfR&!@MA`c4+dnm_g=B}U}~4%WNtm!Kaouod!ckbD05_+ z{1@6w{0`@rGjvZ%!!wWU(~0k_|Ey# z4_JwUxC|gL>Q~fL{qrh6MVYSj56 zs-eNZ1~2jkB^q@Zs8u(Ohw!g5TXW6V!t%s6_U)Wz>I;6umT?9Dl$V*Q(M@~>r*a)_ zpPcG^TIFd^QWB3bpEYiT;Jo0VwCrHl#+LcLpnY#PHB%+z;JvdpIN%9xWotE`sa?jf z8#iD{@|vW=m_%yuUe$=#q{jPLDZa9PI;ufj*IpsPU43iP1~Wmr^uF;DLOm|{k0j_C z7yN6gOq@eKf?#KBwl%!tg8Pj-;fIhs1RgzckMKy|5x9*Op1KfVEe4NBq}$XdjgJ~W zrh{H%BtcLcA23j~P3tdV3jT3LT2E4ZmyC~15ykTGSmnqQN^TE0fv%u^UzS{>WEpU%M-ju=-={R-7zk1?%O3fPN#V)%Zsbk4H@` zc{2V8f#%E=6PgBPX!%J8n{ncAP3G{75e=Y|kwJkx#-CEK!ojiLykPBg z1Vmwm|Gin7<-7J|e`gHuC9RFPTvh8Z79lse^;?pdxYi%?1#Z!Anm87K^-K92zpRlLL-hR88@_pZz{{{X-!W^L&hV?f>~ex^+>K;Ro8?GHdgt9Zj`)?3w|o6 zH#|D7X(opSUei191z!R18kggRP!D4f21C+D()QOP-hbir*ui()spz?p1bR{$elLv$ ze{^;i{BbQyv6s5_ci?kPw;ckiZ^LbJu*bm9?>9;0m0@W&<4m-E_>fIjplg}%ALsrPqGDGwmzdwpN1iP%ggS^m)2T6>(&=ALYvKFJI$x z{7sZ+P+zC38TSg}(1Il63{;Ja-o`0P_e|qgIwRdkl?%QZRo^qoG9iHSv znlT%AH70%}TTKQhL`OR&*P}u#xuZgpzvC%k#0tgb}dW>SLPGEapQ<2wKzqxmNvgp4t zMd2&v*}>3V{)$`_YMo&GxSNA+@?iFZqxDh7v`U5Mx*MrzXr+bXtLf+b`X*8MwjAFAPP)CH^a_-gt| z&VK1UzNd(Q?J4WR1;v~Q$6u;AAjePM?Seh=`*;o)11kB$k$1G`_o zV%J6aLt0xQf*nWLL&*xmhX~Ry6+X57c%KN_h_PC{Z)Q;mSrRGVaIA>;!au6wKk4Es zT|7aGdrI*%iX-fqTmI!WbFJzuP;p)?up;onz*S`A22aWkRwN(FAKu~1*6 z8Z}%%EkWgX>cbKD{tlu;MR>{CliPbZ{Ix|lb6jXq3!RcLvPo+qMA+w%F6q4oj53G^ zDQ<7|)i0Rt2^>!o5}OVtq>#e_-&;+q!BNu*l_Q13j_>UFfp=(~X$LDFoR|9tYSQQu zj2Loge1zJu5+#?lcL)y$zk;4JlL|h=OQ@qI;@9?U3`Jjr6x&BKhN!R*GKj&-3rhEE zQrRi!!^rV2w`r`p3$*pmW-_~gE$Q^w2$H2u*V$lonXakgmUVy5OCKud;D{9ahlB(X?QVlx`Mwlcj(l#=0N*6CQH4A zUEcPi?EUA8U;n1RO$+i}-&fts;n4?t7mQZ+Y>DA(y4+AF-O&AmXk`0aglr<1t5o3l zwUMKgXUufukIcA#MgRJZ{c41yU?B`w2#KVhvv0# z9(9Y*izKqjcsC$Wxx=_rs0=MJ3?COlf0jzWSN9gJEzqMzCvd#Qu-VLN#0MUWKIR6; zOvm+mjjq%Ld!)d$c_f#~f-A(q5~iTeFuw78NqP+CZo?yD>Z&n7*7q;<0iVQ|atbi+ zX{=99g(SW#fGL~(3&hId$&&IyrG((mJV|v=|E+SSEFta`^yeG@l^7nwcuKTcydl6! znYzmXm1|a7`tv9BS*>Qb8Y{_@=<;a+xRGjkLk|RA6(qqgcpAkhKZB2IMBtK$VNGIe7LECP>;08OC!;jW>5z^|kzZ}%Rd90? zgozQXR8(WIs^Csl7K2AGjXk%?fX+)LSSyi1CT8{enx62Y`NkG0t8Y!Gtj#K;YA$2vnm0KkbZh!wqt}Fmq z(S0q$WGoiXCsy`38MNT$ykKUqbjUbDlU}0GyOkFl#S{vVKMF`_L8&oc%)4mq9?{Rx zf-GYeIjA?i7pIqR+&$)i`iL!Wo#KO<+Z8LE_+T>% zZN&$ZZ<2lv{_3~VppFmvDMeND9f=R#Zxr72*iB4m#Rol=5IFGxu0qEL3s;C9J?nMF z2W4bw;!~oD?;IZ}`H{e2UQ%|`6+_^l?UrVU2dZDp){$d#Ls!tiZY$O{d{WYM1*gfs zs-G8$io)GYozL*T>X%ajR9JBWnP66j6v!eEa7ha8q)3x>FB1mQpGzcgaGd=$(d#WP z`6J>@X=tHspM>x8usY)J&lJVQ!EMGoikSTafV`%fB)$UeU(6J;l=(}QEZN9ceSA8a ziIAsa`IO2b|G?a)iv0FOIqO#9pS{FC2XdJv9|-L8sR_xXG{=LV&)~Gb(aAOKU=>Lu zO5#CrO*mOvuc7r%{g+tr!nn|4{P$w~cZK7>4Xt}d79NNoIn_8{E&!r?%avhdzE9S; z;1{<47T<0A=*dXVLA+V}vG^aye_w&C+QBE}LizabD*X4Gmj9lMWq1?+z4(Cna=n=_ z?{i<#@W*{|FPnRPL$657P&@IQCZ-m4lh%V>A61-Ka z(Ih!dOvkU6i%vedTym9Va~AFJ$=wEu{15)>Y)N_y;%>uugvWRvLl9}-T=F1Osa)B; z#<#6;HatW83CokxAeJdFR8lHuk?)E@z(>BO6Cw%zhkEzt9peh5S_pPl_-Cgn z0oc#p2?XGJfA^`8*95w&6>@SOd>AAtzaYz`0@UoUf9J!l5j?cSbmN(!X*Z6Tt zgM^!mD928B$gZA+uu9BCy%Lfduk>{pG)tPVQtW{~JW(JB`+BQKBvQUdY_iLuoPxfo zaKSn+U7ob{5k2Lj7-CZbA9iBEgI)B9U4E-(K$vt)jW^I8)kv3cRSdV053NmOhX*&+ zf6#H{SHTIx3CIiefGP{fm@H9aa$49w%6K$Q9BxaF=;t`}M26$zPSl)iQPYZ=g@+?z ze699>3U&XDCSZCj0{S`g^{DoH{A~MwVu@1ZckF*`|Hn}GhyR!MLwJXu>A%%}D<1SP z{hx?@q32zeieUCSZZR_XyX8tzZmiQAsiHWEWLMIKn4tmJs`DQ8Np9;MuE z@F7k{awyuKX>Qi9Qojl%#$$ zSeR5d)yk4ox{vcQdq}t-k=4-Mfe~T+2wPI%T7)fCYhYM@@^;HBJfYE)Z~;% z|7Nka^-B(T0`Dhu+xsN>9H;#AmThd0ub%(plq2qK=^=FAg_w;e|B$HXza`)K~?NZM78H>yO|+AS6yAPw1NJ;7MsXktKTROLqNY`1}Sv zNHvC2-u`@;K1&`;mI#-7-LU|nI`X$l9*2oYoQS;?dE`8>S_E{nu}_KiZjlFLk6bGf z&$CEudygz7v9Bvp9bB2NM$apwcb-V>RFJ#vy=8xSIRB=MWN7fas05UBhY}%RVNl!G zWtNOCm)IAACJ~V9i6kv}jM1Q#>`Mueg&qGwPi4NS{LLWNPLkB@kqc(swXBeBVWsR- zJ8+O`VND|#$hNJe%$rl}&N|s`YwH0Ejrg~c%E2p6SKZ5|v$}hWAUDF^A)9TzA;umr zm$hSQa>- z>VdpWlQa>MWFY@}qoS%D>W{MX#*b{0DlEiB0d6rHbBZ{iXH6BQ?E$^Yn zsA&Fjo~C)i4O&_L05#Hw0@P9rIjd8mPN80p0w`AEGz;)H0Oelv7lmSu!|}Wl^xnS7 zyQ%JATws)Ics`(#ba!y8N8-rbrU^1U-otcTKP@I;RI5YC z8;<)wjo)Q5P@U!N_e&JLf6(+U=_`Eh@u|?uLl2Kp4jJF1ob&?$CQfuq(q=M$`S%M4 ze&N6`9QcI;zi{9e4*bG_UpVj!2Y%teFC6%V1HW+K|27BWJn?EVMc()XH@_vL`pVU8n zVA6&5PwqGWyVUt<{EAKsv-?`I>PB+zZb4;5K}oH@q`HC^>g~gL?M$npr*8ibvL>Sr zgfPwBc7N+U+s4nDv+03RcmGcQwORT5t#r@GFL-9tg9mg6NfSt~`e%ok$*+9V|Mt7b zRd*3Mu1Pe_FZq4KuZ`agN1Eo}_}#*96+fH)sI*STf`4_YQ>3y2Blqerf3mELIxB6l zQX5VdIQUnm28omhXX@S(4o{ZdfR(mbsg&0NnZ?h`Pafqa@e_PPOPf(T(*6MnAKhbC zH?m)i*I(u@FY)%P>E_|4u&S!8*uI$=C@<$IEDpf(_A6G!Gs`OrIUZt`eXr}fYHFx( zy~tYXuBN1XP9+!v>ds#{tA=amzsf8xoL?F6D>AA|3X4kT%^Bw9oQj!cv%J+MkWgGw z?44Uy=*`U^)y?BTa2E;Xomp6hKz8#K4XYVeT0GZN!Vy~44yu_HdQb0HbGo;aErWO7;M#ijvHN&lY3e8y?0Ka z#_yd`;;kw1doHixKr*4;JLRmo)A&;?e`>rnoG#`MRKc`4a|$a|W|7T7A$FRlxMXHw zpxp1#jP&{|y~2G5rn+*DVxXs}GEiPzak}4&v=sVFymB;~93K{)UrlC7bxC!ng2HkR zWh;brp2?#wzii@!%L*puUOn1#&LB?>2s2#-&>={kd}ZPMa%lEWriaxW_K_h($;l-m zo%724r6NFOe#YJ=jiJ%Rbtb|o3X@S$GS5>~URhJ(Q8Mn~pt*S!p4nyP<(zEJ5q}Hc`aLr%ivl%Bj;Cf`VU?sR0~Mj` zeys`Ns{;G@R;R3BPGJqk)&)Y<$|6Lq1~wFxS{P_aP|m4@S0y!N*OhpRO6S_WK*c1J!7yA7!oZ7nW5Z&Vh;=3~1R*3|}OM z!lI&*Dg=hg5!7q76f01n4R1Om^uub(#}=!KJPQ_S#q!Q$JmuKP66+o%#=waZdew=G z)-?w^>P$I8QR$7lrtJr{8hdOr;4P^T>m9zg;vbL8mD*JtQ{hw!=h)T6-gt0IevkHh zo|*vNud&>a=W}RFn<)C+5)VgW&MB;(@2Nquu_}QXRb{m$J!=MN z3M*<*lsTRX{!n#jrah(wVSWqp8c%77oNGykW?~6S9WW{MoaZ^;GsH90Gt$#N!;o#;%;l1+Jqi;O9bUBI#Fi>M+mLK)=jEwVsN=9M9acnld%YA~eWn zpn8@FZ*@r(J>rTG2~!IJ9uAsv?kg%Q;AKg5k-!pX6_gdb#G*j;Uz1Q!Rb2_7zYJ~_ zl@~JHoW1EUtUzQHqm}<*NM_e~tO^o#;H--(VGLKZN;uTh&ydZitj6Dx`2Cf099HYx zf_Y`d{!$eZgDI1_OZ3`6vQ{pd*m2Zul zs3sBIFiZBl1QV7+&I=TJ>7T!3fOk@LpnSf!8bj#SL=WiZ;k?$Ws`&*<8$C1TSHX~i znn3kTRJcG5MOk^7e?H?rtDqb!g!nS%@VKmEW+hCS5twBQk3#~ZIHRQ6TRBslh*(5) zUjj{($6s3FEiao>=J%#!JqCDlD}>6L67Q%nV++P*PcFD*^i>z-j?bCsMeC|d#Gzt* z=MeJ<8pw_AZn!P^1`Ph}|F`zE&;9?ZJ@Ku|b26fsRHxrj`BJE21u@xS?zo`Djs84@ z3ev?4GCmU9DQUr8%d8}t-B<#D+06L`Wff)qfrl-X7-60=7t!^@p)N393!4b5a&W}I zl~n`0qeLsqieikmLMr|(B0RDL&x^;Jrul#YC@I8hqSMh7oE|Pa-OB;SggR;_P%-Ot zZ#PS&3#w{8HJAW@fr>CiJF$4>7(q+9^^MXQt3X>R>n7}v3TDhgQ?PfP=}_5GBxHC4 zHPSt6W>7Q0dsSuN^zw4=%#xCFr97BHLUsU%#bA)WEg--wv9DE;$6r`g;IAxD9|}@8 zg!2W()kMVdhe(28sG`sxs4gro(2^|P#`25>^Ge0AW78#5TzCPI1oJ{%K{3am7HC~7 zD4E05OPOPd8$eW50*ppifQ>AzEcVF9nmigFmnTrzUo}~iPbOi3`I3|9H1OJEvHN)N1BZ=OO3TPob;tKfOqxCA(-Xje(i%Sd#}nUBMqS%R*^W3^y0 ze1v!OOUvP2jT4GZQDWS&w(G+N~M zb}l92Ls+VT@}BW?r3E^mNOuqwppr5t^qzs;LITe{r@-Ie!)!(7AsB}$|NQjR2#f<& zXI-f5d(8ksRDX5l`~iBVLZfog-!r$8b+OKEtGdecU~}dUEU;>aDTwZ9R0Z!Doyc)? z{(mG%?BIV%i~}lU9Hxg3Oo2$dMAC=voC7QTMow6QVuDv~b&}v%DJZU4N3#W$Gt-eY zotxo3Em9=HgH8ojI3(T!$j&aCQ&ryozY!TiV%>uG47;wKQ!tYiET=r&FDEO;@K`vU z!I8;UnLnnu*v(mNv1GBcj3^N+!QKel)G&0Gis)t!Bc_P9)4BhS%~1jw!E0UiA2_Xn zkbS#h?-@GFzW;Bz?7+JTw=+A5ha+nd6g$dO@E@p-pf_C0ZtlOL`8vzu7RYLgJ=k;4 z@kHe7$z%c9*i@NFFgx=X=v=HlQG~xh7Qxj8cAS|@_+C4GYq8Kh*$MDZCXvh`HB3Rx z{5dl!%RMuzWv+WpfK>yxeRZfC7*!B8{86P2lW~Y5=IC2xl_$(DRU2Q;%$A_2tcD4c zN88}AZO3UViz>lD;S8Cp$-LHL3%w)l5{%EP zfWa~wgH&d{WrU72qo$SC^N@dyG0it~e*QOt^1RVum^)n8|EcbOTmCI=)J!qW$NAmE z?;(D7^4rYsgu6|18NbW<&E%KE?|1zE&Tk&SC;0icMgHPWNVuSuhkakr&s`Hc%(Yw( zzqZ3H?dI{Uo!wy$KgHu&Ro-E)bmVUDB!!)5`;+yx(+~gGe)KJIn^T zU(jK;kRDppVRq*|$5rgEtt0KjhT)Z@8Ki4S^Vt7w6u*qgtDbQkG< z(v5%P6TLm4i*z#SzBSNAn(_AzbG@Vw07u$qEp&6@*GAGD(%}zxm@7z^Khj}tC!P9O zhuNFA=%+T*KB=5{yqdK9Y2IETUC6V*o;*xjMVdjn_8HnE-M1P3NdDFib0g`Y=Q_+J z&UDzdy~7+ry8Ois(@(mVbcN)Tt|KjfiGGl7f4Rf#!?_oSNHa-?@8G=<(uJ>dn9C&p zRrp4_{B`)o2|&x=pqz9Ush@Q1o8XiDw>r#2q*Hf-hr>>~zYYIL%So4$E+kz|y8Ip5 zCGGPr{N{|X;iO*Dg`{%U+VWk<3F$`Cg{0;0QBU$e=rB`{quxI19nUy_4xdPee+BBusL)zyMazUC$dY6=w zwn#atL7MRs@V|yG(oE9jq&cK(Nhg!;BdsMJ-a&o2CtXjvJl-@DPoQ6&7OUzcZ6wXkscx~CGEq<3mQoCNbe&Z&NEZ?jX$= z0v)GACut68pW*P0bkzvcTthnbLetzS_oUyFuFZnK>D14rzog|C(Jtw#F{XKlbZQ

%>V)!EWb4)Xnw{2}gxk}hRD&Z3-j2;VF`9GkabmKbsI{`Tt4!~KOeuT{8DFjnBT>7k)51+QF8B#lD!utr(cwu znVmc&Cpo|Vh~-^FU2aOeIpK!*gq`upL$Z@IRXI?=re-H6WhduL!)y3$DP?~Psr<|1 zw~=3JS%>**S1vl^ADg@E;bifz5Q{Q#DP00*lq??k= z_?*bB(aD(!C&hQli~ndXWKU(%#UY3^|lvun6qeK+M{%Aa!YGUeZo!g36tWab!b59 z$P=0HG6vg)J_}yUFft)y(Pg=!GvV4emrzifdLo}wshi5{TXH;M3|@^*UKbxB6n7-V z=G8iA7JXU^o;u>zGh*Y5)~D`=L6@Hct^?pG=H0P4=~w4*jFQ**_E?k&O<9T97~XS} zvmayNiKgl3xLAm&D!7(|E0s8W_|Nb>3`6`Aky%Q1cY-UCSpItO%0H3kedNhI zpi0)b7di4E$NR{W&j||s$b-lc_9#AA34=00-uPzw1~9RUL#VffIl>)WOT8kInbi1l z8GI?9OnDBk1#Ym)OLX~7QZBMlOZmr??@H12wOpa&+BS|&-hX6-Y+RBYi*eb2XQt@jFu%8O$I^}X*2uxZBzbxRUrXIVf9Np3kh(d^-uSnLL0&Z` zD=CvRcoc6Pn=m%HE?yH8za)YdF(FERwhKMf^E1vdWHCyn6RwVFny4y$>wSdBbKjpk z%&}p9U~HrG{@l)bFLFGIy3O}?n9szfBPY2kVrcJ+Nk?{amB{C6a1CF>eo?NiKFRno zC`jl|+q98&seP^GYbW&*@9!}0Vfi2YT0Nh&T`1?+U@y~hG7 zeHe#K3y$^Vmy$0BOiO-!{7j`?i^Wr<#$T_JOOulXb`P+5%$bK-bldukwI4uh)YkS| zcrEJ$)7ek^_s+1R99UQ#e`UC$k9s-O+qu5OoOZbJj*N3g9%j7r#Xqe8*S_Ws^Oacq znHX>L2al-bv<3K8PcUbtuEkFsV~Kxq#w7lZ$nikF0Y60D)Que`(>sfglf^tK`_;P} zc7-xR?l6zxF6L0%Kg!c6zriYxFH=Ksg&+`~Or~7E=`+O|qbU29lRP~_2QECEUl6-} zAGp>$*GpGGOxV$YL=8e&~!~$5cL;Qo06)B2e7nwCWxk|^~ zYr!|2^&F3dFD%RP-`WzHCjAF)2kJ+{*%|Gy(1NDn4a7@$Ta; zVicRQ)c6kR?(uv}-FG7DI{qul@5gV9ZC&y`;(HpvwTyMCmjqXYk1DarMc(6Yw{N6Q zGj-DVHsk}H>clU#;ZW79?Q7x7KI*Kdj+#S6v=e`s4JY!}vj_SN9PCm5GWeTL-s|M0 zgk>shhkvkbuTo3ZCt2HD&l+1$FhsT$u-gJU$G#SsUQV6VXPJLU9c9<@l}t<78p?W7 z#uU^lQ=x{khg&EcLRn&1E^?S}5YdL^0_Ue?vb@e57=aX8Ms3bZe&)*%fi|cXtLX=$tjRb5=ya2{vgWdJ?FbJu@Lj z)BR22(9))laiArk++NTI?7)P<35bczSvnf;ZXdp z&e91=&!D53KfQ0o+T4q6@sXFdyTg2l>nMHyo2}zAFQ@`;EpYn;PU$%2Uc#2&B+J)i zJhJA#a8G#7Ex7L^ua>+#sZ$W1quj)>*%3@SMcaW}4P1Y#zhVE7a3Ya|6YB`h1Hj(* zA+jboBkWUw11WIcW1tr}@r{vi3nSosz`YLKm`-rlIdGYjRRMPhxU5ca+)Pz~;1fnAdj3e~k?)Jl+r7a^SoIr{v*k#bc3`?g-Ng%A{>wh9Ln)<{epNWl+AF z^1V{7Oc69#YgO^ZF6&g`y2jfpP-JEZ)vCae$1|x9W8v6p!=eHg+t&i9=U{6^*m;ii zzGSH0TRvE?8AQv#wpcPSovPo0=PvNP5_`O(@RY_vBi3Ma_L-P-;L(6x9jmL^6sUG`j%U8Z^TIn0H`m^u8Zp^f9CHFVI(dI;yb-&h{i!l; zYiVc2p~LEF)VL+w8dFUfpqyBZfM4_@l|S-KvYU)sp3JS|e@f<5DX|?Hl8zvWZXFfe<@~AgnC9tHd5qwmf~noC#&{WJ4V3w$Y^>YIT}$&XjgmFF zo8rgYs=WCnzy!91daI~6Dngc-!?w*kq2iz|v{QPq z6;o(C$@*cOFief<$CUdLO}#dV-O#Hgdi*@UW?U${T#!*_#|$^b*C<}A_}Q!NdIqqo zfo0i1{gZxYk++IG8DIG~ncpPx){vJV{l3J0?qiRMUNdJ!B5CvXmtGzdUPdo<4GAhN zrD_m$1yBv=w+`G>dFFiu*O5NKG4mLLskWR%#1ez3vY+}3sb47dwGDM*Q=c*=y2rBm zt5}(&`<~7-_Vv^|N9yrU`aYbzJ>+Fc2LB{4pSkkHlc?ih378vUnk#gFP-AG6l6VeIJ)wcc!8r8(UNr&C;f8GKTLy4@fWxe+e`@^6+eh97uDnU) z^=6*|tajjJFG3o5gq=>_Lh>@n%dqme^{n7e9(guDU{^g+y;^q?eyyXtoN_h(taD=> zlw52he?9r7f=l;T#+ClMt$?zE*upV(-Jp)MpEW`X}<-hrIpdT_ia^u~+lO z6e{>3l%=tUqOXG1zCDk;Eb^Kp4;r-3L*GS=oe45XBGyJh4frzZuB7e{iQMS1)waie zRvHycz8BMn;B%?|I=Fl(ra6pj!Bq>7q>X*#SCRj@l^;!?ehwSI)kU9DhRnRk9Feaf zEE@J?kH{s0OZV0B$%|~4Op(Y)F|b2`O%hoC`T5n7H;6nHOLgvVlrLk7I|L?1O*V05 z6AqIf(`3q+?x)?gv@5D4ys3}B9PVg3yEFLfTy%;IddU-b6}M_S9eWXvnNgx9Gg1tv zzNTN)n@qirsW*#jYdoEL)ix+OtZ>=Yln+`#y*@{q&T}Ki$f*~9zYQGOo-~okZ##8Y zQ@6i09~qmxBB4G$p-;S09~LPR;vZ9&*<1pz^v)}BwrMU9C0CU2Jao149SNn511Gkp zT;MZ--^V9j|HXCmxU*Cuoxye^x)ck)r*pCJIMW=;wdQw?;j$qOiDx+YjS9_r!@!`IvTmy-icTs^OWSVw#6gWHtK2x5QJB&tIA5gIvqA zGusDZE1mVj%`aV{%?Ti)OGBu$o;sPa^)*U<6V@MQ>X#+B8o+heiHv#d_%S+8Fk-4c z`y@o}c7UsUU(h14O0Qnp{{R$Y2F`h(}|nZAck$9vStzHPmSNOxK1lAgx!KJo!@=nzw2z% z{L#W69-oA791#UBkKYbp%LlSYCN?iS&1Ek*3^Qden*%;C27cpt?7H71LvFX}x^)nxQtHzn;iO?CdpHX{q-ioQYn!e$nSPj1N38s0q z^wZ%Ra+xDm%3cTN@exkes~nny3R0+J<2}@0o*!HHmHq379l8|1AI2ZHw>xZmOBT(G zt;htv{4(}4bA5PQG10LVIe^K&KZ804rHxK9#8YiYKN42N8Y>xd@uO?Ovw9Ny5V@9r zbj{O3-bV65k^%0pZp1g*0gmW}0bJVU?7@=-KZlQw{3&j_$N8xMDYjnrhb{w;Ei)RA zZR@T1nYy(!3Qv*GTtR5aMEG`5cl&=w!=tfi=t~W0tg`*B*KJulFUEtb(qcsnK$*krnU-vEf2gv`#YCE$3RutSEX;FwiJ=1~DWN_Cm zW3CjNz9>0MsEbM8;R09ii%nWd8%e)4&2uB<&)WO4*N(A>0fCh<*#dm;CewVI>lnHn zMN|CdSYz`4(Do+qQ5D(SaMiuHlWuOf-6312lXPFIo1~MQ4ox;1$kLDy0t5(Kh=>|c z5%;(uZWuR2MF|RsiVBK|J8pVmi(B?77qkl=e>2`oEcxS)_xOANty}hw z|Ahm^--TC~Ae`+8=kNpTiv7aTa}TyPb->9#-sWlDjW}Mt>W@F(0zN=m_iJAV-nZuM zGyy$&)Y3oxc$SCre_2*ICV&H)d&eo1p42xNBdpI6){6gKSeN|gn-R!9f%n>b|M)-d zxqJ$_1&}*lh2J+uoSahCNYvi_7tyBpS?-7MPU?)!|3TM$cc41uZK@05oV)D*S)1Z{ zTZQ+GtMPr&f2CQwE|usm_-%pQ63A))cWvgegZ0OQwHaR5{JeT%IqVewcYQwhfN>xk zB$ad{til!eRti|P8gS_ur75@K0-bVN* zK)ws|Q-I|dczkNB4O&CauX-V~8ZuvT8QHIpW^TF?hs$s#*hce}DH*TM67uf@I#=Ob z``&QHF(hFZ;@=F+f?sZ*F5NqS@0)jN&+cR4K);-TkO{H*|6thpuKVMU)Axq0VLM13 zgyM-7>mSIhg3KFS=3u%2Rv%7?5oX`B`_>_RKfarTx)6U+JU4@v z4c-{e*;`JskoL8|*zo=ovI)o@EDwBc$-kLczE2!U@Cw1}1#cZNkE2g-Xme715TnrE zGc3s8n0@$!htY*Fe*6Cr2G`l^5XQV4@Lfh<9U>~#AZ|;w2Bc(f%YZjhC0hyj2qTIA zuMtjs_5b_)APDmD2f9lqKNB68Z!2+K#s3gA$u9UEzlenIKY;t~<8Ft+6k9jMsFwbi zs)|3ZvT&oR+aT%=Ro$0HbiYP2d9~|qljxxTJ3oYp5O{np{EwM9ooGE|3+JWdpZ}%& zdC_ry{>RhJ-TxDR_MI}6?RTiqKK-8v^?xJ`UM&Ch_k4*g^_0gpFzpJ(r!h2PLu9lMTyu5gWgs2@WC>^p%F=Mtd!IqBjEc13skr2Fe(k`9SWYTqR34~qYXqDjS1 z8!r7j6-~*9l>5H$e}?mpXhhWohqM$rAJfY58p3d^C0{J#os@j#fraw zes3(3DcWED4^_{J{o+mKcYpa?mHhtYP_N$KpWk#4{^WzC^K}*ejQ!Fxv|6TrfBswh zlt0%cy{f#qe&c_;_bdN9_KUY&)%(VS@E=zEcT~DMmHa)WGCe7Nm*T&0kZ@i;2!E#H z^IpnB^j$8)<$2+MN#&Lqn|Fz<$>MwNKdg^WMtJXpT!4-)=}gYaASOXp&h z&It#RPsRV6(r^2h_uPZXEhE|>X8<-1Gq_pgV8)z87oZ`nTO$H&wys=QL=ms}#_ zm0BO;KkRD!FXgV;&pl>8_ssp=r|joGXFvCq`?*)|=e~D8_hZVPA(Mp;D?xwdzBp5+ zA4dY@-y-Q2`(fau=9sCyTetETbL)NlfBgNAlX(E!_(TYQE=dUgB{lw+DzB*OXeoVh zb+Pm}B@uQr4s(<{MO3g@7t8d?C)Tk8r9`$8OwDun{EGi|9V=;yzfmkU`tr3=ZC-n% z*xva6^@q$4*rEt9Qxo~?o-741trPB4x^^q~sS~CDFUq}3h5P?ENzGUGk7w_^<-$}A zC!X_xG<=?W;x64n^lGI$zO6imp_2y`q~G-KyvgMRzH> zN71xpGUi-GixsU^v_;VlMdvCyU(rR1u2girqMH=ms^|_ycPY9@(X^{o{E8MUTB~S_ zq8*CPRdl|hixgd{=z2vrDY{kB9g6N!bdREG*QodvEmpKv(H2EJ6rHQ+d_@;2x>C{g zif&SLtD-v;-KFRrMbnn6_!TWyv{um;MLQIotLS`17b&_@(e;XMQgo}LI~3ie=pIGW zgmH|JTt$l&tyQ!|(GErDDmq`$MT)LebiJaR6y2)m4n=nwBRnZ-a?oxD*qG{Kv_!TWyv{um;MLQIotLS`17b&_@(e;XM zQgo}LI~3ie=pIGWR;lC{gif&SLtD-v;-KFRrMboZR z@he)aXsx0xigqYESJC;3E>d)*qU#mir07;fcPP3`(LIW$U9aL-v{=zvMOzf@P;{=M z^A%mB=t@P`E4oS1t%~kYbeE!g6ivH9#jj|wqP2>)DB7XuTt(+Ax=7KLimq35lcHM{ z-J$3%MfWJ0wpzunXtAQTinb`)q3B#i=PSBM(Upp>S9Fu2TNT}*=q^R~D4KSoieJ%U zMQaspQM5zRxr)wLbdjPf6N71ykMEvC{TC8ZT zqAiMcC^}cs`HC)5bfu!}72TxhRz-Ixx=YbLil*J7;#ag-(ON}Y6zx!SuA=i5U8Lwr zMb|63Nztu}?of1>qI(ogyH&-nXtAQTinb`)q3B#i=PSBM(Upp>S9Fu2TNT}*=q^R~ zD4MoT#jj|wqP2>)DB7XuTt(+Ax=7KLimq35lcHM{-J$3%MfWJ0cAJV{(PBkw6>U+p zL(#d4&R2AiqAL|$ujnR4w<@|r(Ort}Q8aD6ieJ%UMQaspQM5zRxr)wLRKDH!Ox&RL zIrc%_yY_MH1G_)l$FUFW`g|Y9zVM5E9esGs4}ExFwEOpcU41yoFU2{)-JKQN!HTI6#v3) z7gVhIDJfD2Y2BNwL%1I|r|^I6yL1=TzD;)-+V1pps{J!P-Oz;z;2Dp$mKZZ3<2oFV z{v=ILqv?h_U3xzYZ>leV4|xty>ysQn^rf8rJlJ|4+edVvI$i|Z=wo9~NU*no?UFCP z1em73!NYhNFuhOMB9i?Y*lzttF7Y~`r%xhBN&E%ue!A#$Zv&cr64;Td;8lK7hPF1N zkIjfanzPRZyMG@$O!Qft{kT_KYxS|+L_dwQp8?z3$1WlI<(&O2*uFk?A<@@z_6uNV z_OX*h-^|(Dz#h=Yt|Pkm$m~t9v-;Q>s#re&J6lHcAz+UF8xLa_U~ZrAaN>4l^BNCO zZEap!nhW(NHf##u_Ivudhj7nAIP%R}zzk2ne$AX^gB38^0Y$BQh&dg&|F9l9$1+a@ zq(>4f;n4w(?k4?*cGJ;T#uuF5LaZGA9v$Pha)rQHpB3Oox9ND>D&(o5Z4s+Tf~Xa| zpL5#dULT!kg<@Q85^i5(JehP#(h4_l*0feD@-F9ec6$A^!zwK5Sc(Y=e%- zv`D6xX8N?uOg(dek(uQpY5miU0r@^HPP6hN5Ys9t$?^+SjjmzxHodGon0p#N#F%{)P;L70+JG8=`a&(M^OFv7?it@X%($9g6qmYqRu8=z`rcegSc^YzMX@MMGJf*Hu^HsRB z-@>CheV#U;%9nnkmKER413L+URSI;n<|b)FT<(6uc^XMM>aL*Q2!Uh3h3-1P0saW! zBC`lEx1)!;2U_(J7p#JeScMJ;VYgKzfzJw#ftb6^pVvj*RaTN$i@TawBL%4OS)&A~ zwXG%rhQ_UC0TM}Tv;f1}trh`>cUfZu7}0ID3Q*T$jTNB2*BU24!y0S60F4{1HUW}b ztO){)+HOr0plPQyNr2|v{&oRI6Y8HVP>YZHrwG()Q~y+f#>T0Cnn2@{)IVLI@$HoO zMayzeTtJCgifm^zq%|7ueltb@lO_~V&`bj6e@$(}^OM!NJB<*}&%~O^yNc%*woI71 z*15vhMLV<3+sb)v+7(z!#mgQ#FK`PL{{3io;8rSLH|c`FI{JG6vi<4ef`{lo3IHwY z)(YOC7Y2d7bc0qHh8hD@b{ChBm3H(jMEb0qx4OnU-0r%y~5PSS|B7gA6#uujN5~3`5qne5j9Z zfeJKtmZ%1;2%0NrBz#ZqKOpU-bhkMUxc@l`tH_#tA)pmh1!oO(TfyTvXOQjnSz%cy zRwSjkt&%t~FNJ?_2@m0HpOtORS;ysbh!uK_gFNWpI{-p9?+r5NVyH5o-peKCE5P|{ zXo8w2S_|L7=7xC^u`c?GgOlBC4t+KksM}_z(V!pbl!PTZvUyrNTR~^$gLQf*yIi6( zy4Xs3JGzc}<~+8F;x~_oxuBbcM1M2STEMQOq6wVSV?7|j1?+mox{%#KMMF9FVs?f? zi>=^^JRukLdXwftgvk4tc|MWq((LiE)sl6Ats2dRaW$}+mu$Bpck-8)yyNXMFJ-o9 z%I0FiZj|UUKf6hy%j4{3iLPi>!`+33c}(W{B(sNRUZ9ciZ0h%{wJz?D40&!LvIIQ0 zy5$(^S?43>0C)xS@CbL&sOMDcl8IdQG{O#}m!kwd^WE%lx{{+aeb)N>IXKJDj*y<` z*l7EZ57{T-Y4dWkYawFu)?+7uh$(7h0etd1=r-MVskNv9(@NiBVy#MGi_UkMn-$Sx z(4Bp~J{G2Y^!BZWDwgP$I2$C<9j&aGKEdVg>xwie)I%eULjC#fU!z5mqDp+5HfoWP z^sO9-KE7Ftv{Dh_Gg~x&(7+~~@0)F!x6Ah&YZ7(fdzG+eiT>haqa}LBW-StZ7-wT8 z`aCJ?%J+|U5*a6B-5u5aVjAN6E}_fu!}onF6xK;RA}?*%y$gIlvhkvpe0vCMql>uD zzx`gn?`Kva+KcZOV!d2E0PJ54Ya?&zzJIx``z6R=aVpSnJ~l+5Y{DkUtm1<0a)~G% z5|}8VPAdbGBs6GMpj}3iMymspB{!WW0#m4n(M{_Dbuusgpw_2SUUNPZYJHk4w*Is; zFkL3!qFt!ZCe&X4Yumj^>(cW9y(7_W3sI5YQGPkA^ETPma^B#*&2ekR5biZPDO;Sk zrIqx*+V351UA%_BJAzofxm=*mZ7t&(%v+Bpc^kZfck*bKMsYpBpw zw{@8S-(*;q?}C)J+h<)RIN$lLpy2#~cKH<#h2KBl|4P4hzY66+VqGDEd)RF)$wbWB zBZ!cv#VmkpQ1&1^uhC7-ECUGHyyXzH7C2+2Sr1Z-Va}ILv&7)<%fY1ax^-ata;ZBj zIESMG>MOE+ej3P?%_bi*VpQ`5sE=etF6BZtjTgmzMX8a@7sNDSB%u~zdk&n)v1>&7p+e_hn8XU43XxWdXD zLadtwsG-&x0dRW2iey>vOUAwK%m!;VT#N@v#P{P}ga!0v4frm`*!$8EW z$Fu(ye@?D7`xw9+l*dM%njAlRs{|RAXbw36r1=EM1W)1bJZ)!{Sohulm=z_~BQ?By z%G}mdPjgW2vqGaj)SJYL&@Cov!60d4BcuCiu_z{tjwTd0ccTBRzo zYcu5Fl%4Qd5Aq_+9_F_m;(=ukx2@ps2q3#L>b0}$q#nzzC)UHf&15&A%?K@)J+hUU z5dwmNeNr|KPE3HfH^2L;|C7<2BH71t&{9Pu4Y!`H zt@MY5x3d~iog=`J1;E3{bP(>4E#jI1NX%Jy24~~Z|M#A}8P@Z>2J;Rf*5luRmv^Y! z+R8JUcUaVV(GO*xcSOQ^iPvr3?4(rxc}KQdZ;s_&N4Ht;9Kyjd?biFpa&YW4>yryP zIKI>R@-+@l?6Q9RfrFEevVIi-o-)t+S2~iLcTTtUZ{7v+&RszIzhLJU%Vk_{2?~}k z<8n*f)qh2wSLUD7 zGXIh;*Vk_wdF`2Rk<1-by5BSMS~CAiGT&A1j}3o8=HF=M2U_NbM&?d;=0_;YOLTMZely-ofca2X~+zMM&)3s3&PNTlOE0{)k!t$07rYmGHLm@YF zDTG#hIge#2k7WS0^Fpj2eTs)YkT8p8L2c#@ax)(l)j8P5GO4J~IBMxR{!V{1WGq?U z0M2Sgn%@Bk{*C)&P+!&vi0l>F>pC&F=E^O5Lzfj<1;On5=6Ms@cdFTL_FaU@;V}DdKN~0}CE54J z5nVmCsV~e*#PZh{AuK9UiGf)p57AfZW~Fk*Q|4o33S~1#&LSOuYL4l|S-Iqux3ZW* zU1}m0TacQYRh-KP%lXmZ9yK`|(yJzCLzbr|XO*i`le5aztWwHXuVGaZ)of(dbRnOQ zHgEC9eGRNe&chlBt5t}yp_J9CDs(-Q?abM%ewee@I7~@mNoaJ zmNoZ6!+Zg+;5T@LPoW7P9%N_pWlaZ1N4l-#91f0x#p*l`=K8IsjU3Fgt!5!} zLKN#9flfqOjDTOro{Xnl=Ww-Y^9M1-QuENg{=__HFP7QZNA^N^$~FZUA100R?Rj|n`%Gsp-aZCzix5u) zuY7=WEO^IJ>Ksos=LD)tzi#-=8{nJ-zmp*!UXHT8*19-}06nWxWqVz!Y_CVzj)qro z93J6oXwuWePNz3<;R^^`CecMG+|#j|_FUq#E)n2Tztwy>=UisM(%l^}*(8D`YS&J;b^>lBiSW%7MB@C*dmFV-0V_V5W#E4>?8j|>NY$9i`8&W0g3boo#QDaM&tqsiwuJp zBjGI!{yijoK6QI?*?H0gnMc?{iC{`LxFtl0X~f`#t+06(UJu#(*XYu{T=f6F*yeRe z%)7w|UrUo_rzK3F<{_zyHfO@d^cuX)!+kKk%~Cd$!%%O+T4i?GR^%J*e^k`#H|MB& zGmk{D`47?_>e-}BA&(Gtn=k=+HoMt+*<>E|r5eg({!~MG%x1S!-eEmYMA-(3o{Y0Q zWT`)$V0Tj94Lw`x*j@BRZg_n*8M#-eY|nE^8o5uF&pjGH;sf^WD@6pmh^UcK4NdmPVg~dZ%OotpY4$7(|9V?yIN5r7vin_H&6$G8cYk$ zF2dMQORU*DI7mb>TztaOusC~;awB?RM1nmpaucXavKK^y4Ai%>t+Wm%?Lb32+eVu? zYV2e$(Ke2fUF;P)o1>AZvp=Tx9E7nIA!To6k&=7P9Q%K5PH1T_kB zolVfwk3ffSh7Ny}>ds@-a2}^FV!nqUf;;huK1I#XLGz!b+i0N|RnE)2&_^Oq3w=@u z<6vZqgadlf^zu2hx9%MVY}&DAwr6vkq^@zC;=+(x>l;{(Hiq-IZ)6P`H-3cP+RPdydizn9l<2RIv5^wJ z|2P{ZWBu?6D;OS#7xrxNt_gi4w=F}T5cZ?!387s+gu{DB=nI=QN%U1**^Wd1NU~se@eK#79KtJ@z4j%fkmqf;BlX+Ty?xK;g68ugyFr0N zwSV%u@M70ZE>}Z7Z2!&D_?kYHN#{Y)ACH%V-FSqHwbtMu_ATAcIdQ_iqyOXx2ELFd z3^2mSzNa}Hjq;;71!}d~Ky4NpZ*XFiG3^A7I^ry>UBJ<-1RErIM<mQz|YCOWWwmo#JT6Tu8JMx1V`9t#! zv<_|`3!Uj!ZFYg3YO`lWR7*WO%JxY4bIMaK_1t)>L7!Kxmad`m6O3ql6&SiG$*52w zp~YQHlPz^=H`BG_d9g1$ou$j3b@c)^Kzj!X46W?(W`wR${cJf={cO3B>Srt5#On7k ze|uFg%htGkFm&B2X)p@iutpk;LaR3@qeJM%jmqc{x@ogANrcvHLGSvKhjGg`xp?>k zi-*b_=NAl0zhY4O7Y3!@Fev>SgVOI9l*G7|rWv6rj-e69r9n|$g!jXlS~L_=iM3OS zwf81=pqqJQrdbB-r#;7`4EvxLH6e;GV}ty}r;qR-o~TYv@?Q3Ken_RwUu^ z2^N&-grrP`Uo-q!PA*cAhYLB(*$AkF7p`hn{9`w1bQW!sD>`B>;>?wJ2qF7XAk2U9 z46eZ=9MRmtLTPIV!WJqvf`T}lfo)^RJ;z1LwWMvs5)6%C!(>z{G?*Q6TQ~k4-gaq* zm)gbB&~HaElL-FC*_A$T+;*h?v15dl36*5SzT`+W#6|=W1R5;GBO2ArA)Hodq9W^2 z;B^l64V*e&k!@U#m$2Evg<3W9aM18%Z9}MpP0)CLLoj!X6C|Nhb%G>Rs*e1G%KTQb z(9cf3G^2;g3#A!7RBlV7X($#|J*c9UO_bxs;5If%p>}Ca3dK8FyKF5(x>SR%oTnOe zRkvz2)eEc$<$7?~Vy_*lRpzD8(3HI`l)xmzv>_3ls+m#H@FAK#u-KY?2=GA67Gxn0 z;pm2A4Y|9FAiycZyMw*5N?OT^cum z(FPnSxm)AbQktZj1NUg$TuMjMErEL_cNEX zIKsMQ$S3r$+1e&vpeOgTleOo{fVx+))3pj-oTsc|^JOMa+h9dHxYz|7y*=~{cBV|@ ze8Lt;bf%x3CDDR7J6oc&TG=^TEf46NF4iLhI`=4cfkfvW%`TK^;aql+Hi66a%tL}7 zM?B$^v<0k6PT^QJy7e1ivV_~~W3{qdv!UqikuN!WwBOsshO;?ZEt1bh5O$QtH``d9 zn;k8($?9!3SIik$W1Pt|HEd*p9iuhyH=5eni5j=(vgS_2KLWhyk(${ADhJA`K+53T z2^c;>YY#K2)Wcz=)Wcyz?goV;ZZ=O;KzNXk9V?;@m-yLn+FktJXrZ-PfYNeyy!HrZ zmDQ2HMFUI=ysL->1T^6`E^wOG74gWzi1Z_@TVyI?y4fjWc#HV39sC0XBRRI$jtr0m z1nWLKRcN~iek@$t3nF<*D-uLWM+#cK{z$$miwG=+NMH2OcxkVx~gDsXQ1NJG2`e&2yRhn%STC<-) zLL9#Kix%5BLBTt6F%I@cEOgD{V!zi{9AUkp=!!8$kkS(HS8DzIrE!22 znyXk_uDPi>9Io&!T4y9I4{$_adzYFhf}M&RL?4M1t1&u)ie0U(#w(H1C|e_|qb#mU zyF6h5=K3#_7r|Z zbC-D7gBp*%1a0XdiA;?>EK!ERHc8Y!jf5Z7{3VC7$HWY+WEN2|l^h1+=o|zeeo5OH zZII;@ZB$hkO}bTqMKR5l7RzXp&7Klzi;j-6r$sG9$HY-hzaW_C*d%L^Xk42We44W+ zc6xo$HrbS;6VTU%bs^e5&x(A={X4q7$>zA=&7O#md_J566D`n}srfJn@TrJzfM(MF6*YcNt!T|NWguh_N;05hg&ixmLkY@T2hlB^T8Yran z$%egHF&-6+EqD@>XU*X2o0K-#0Y?7Ydb?H>V1Lr;(2$A>2>Y|Ph@-+@_7~CDii#d$ zZ-{WI8!{*#*iE6j8mvzA#x)a-B z0wsR-3-eFeFj!$SrSI@4jr<_GRoRFnjl3ecb)7Wws)Y4ex&KMRMl9EFkubT2MsAgG zZcXXCbt!$f?sQdf^tJ^l z&A0ws_K|4t^!6nweRoGM_J0xF;PHAVbuwtyib++3IQXI|OB}~@a86itddG_$WYN_f zoShDgq=Ty=nTv^=JV@sRXnaUpC3ryog3&B3+bp8Yqs*amC{_B1n0j&lyRfRn2J-3;#oFbxPRZwVU`m zSoO$K#i~affOD`FE$3X0qfW^=u_*gWbS7tTf_*KlKTbS}{VyKem)a_4fSlSmIP0{S zHwq_PoiKNDd~BEK5l*hnK9hmuVJqt+9(gd~O*;8Zo<4H|gnceEUEpIX`-Qd~Kb)et z8b2HxtD_LF!$^7uzV(Is-W;mBR-(ceNPfUDv^Of#+i05bP8>q8I<@Ol@ zi$3p=&a-YSM>L7&eHhCcYrxv-$5o3tqNoGm(aXa%$^hp=U>F9mgu3**L)QHU5h$bvhT&P?OX*@kV2IG zsF23?D5SHW6f)S)vZ9u{*)J0HX2{91v&<*WHO{hZ_N!RjI#>JIzZ5EDze#kB&Hk-W zgoHIc>fDBJl0?(Eoum?Ur;$p~ovu`Z?o3N1=+5+1g6?#u5_DHaDnWPqRD$lwRtdVt z4`rR;HS|EC*X?Xn{`afdy>q{TQ!z3L4`8n=a16e)Hx#6qPo;9%9-s}t?fv^mBSAlJ4e}aC&4*7 ziiTB>1(0(LpF&;6waBp-quEKc$_i@S^W=?Q+c{n}rxOTE%IZJKN7zVRXslCk1Utq> z&)DgWI;W-D!RbgFETz+&&Q!5uM^b5^nFh<#PvGwyn$7BEiOgyz;X1v}sbYSqrm6|c z*A1Sm8Xt@3RUFl3v%&ftj)wYKLYCLCLN-jI5k+jc46M$!;?MB#lMz%zgQ^HjE`>qe zX+%Yg(4{~*7FAz!(dKH1jJ;jlQ>5!oP&b^A z?s9BB%^9etJ4|;=9Z&)BG0q@}7el-R;!%i~Lc9#(4#dkL9!rT2h4@@24)GxnuY`CN zM5}eTQ=|KwTHPk$Mm^hUOO@axEM#S-Cu2jiMfW>@1mrOvhd|}3a@MF3kkeJipxMOy zGfFOhv%XWWxR6cISJx3zaS>sY^xHVP*v%%3(yO?{husTq6R23E^l!ytn@thbU2$2Q zO_k{Kq?(vlENN%cbiQz^xU$nKyoZOjbb(bQ!P(YEzEG&>J=eNlf`zP8q`hKU4?9H6 zx+<>57Kcz|70Va1nG&t&Wrs?%aupjXHaIJ;UBhNc-l`4kF#UNR)pZ-?7jzXjY_@Xv z#HM2PHr6H6c;j|9Ti?N@Zr;g`)cHibV$J95D9O8JH#=JLZv8njS7!b;LLQAmwo$PIHF2wiZ=?9-5LEG3l=(WzeHR6Nn}qKrX+(}z z74Nsx$a=~BTNjPoF5w5=eC8;^{ji5d?vQY2FOA$O;YVv|NOZdqa8o5Wp zPq)*^y%PR?Ck`n{xNA2KDM+& zlTy$hI9bYi^};~6l+A=n6A3t8j}0-8Lr7Jp<8iJYuhoiL;{!D$fDhL3Fjmz@K<+HDM;b5DGO~nD2l55v&>t_=vIBDL2lNNzBq8o-g#kHB0JHxeiwh(?nq~wpl<*i##xIiaSehNUSi!k%T8>wtlIEr_e}Xv4p2#L2{XdXV7x&e(_c9Y)9?m`%Gq#zBFtpWcS5`}f zgHP<)3!+n0)~1Y!mBV0*Ii5?7?Dlq7j$m6w^RBET_y(A-DJ$#!Y@0+4aW%K7Otxa) za}(YQKdE)R! zYn6UAm9OMSs>09eMr9a#ha#8Qxe;^wXTVH%p29%=GzRJ|I;_br%Rc%P-F`P9CnQqA23@q!+dwEPB=!>grWqDL#x8^-j9#si9dtV}a&XA{rIXnRWeohqDaM=Y^~NuLU2^OH&Hbz6;l&oe-lg6s%D=$CQ&syRcuu)HgeB< ztupsie5Q{>7-S)im$1^QfE7md`kGar=%o5m_PIWC6u!q^OmLw1W{xiJ!nCld31~@g zL>I+aePwSrVi-#~bLsMMBwccQvttpr@gwJ6?T^)3l6#GRDkZgd(do_LuPEdWpY&N- zc$P+LGmTrg&nlZcvZc>;_FA3P<`{gquD&6{9l6r6dJuQyNwFKF+~GHVa1eT`7tm;hmg*e4hJ%He33peIeXBq5E zF-})!yV+Mdx5ifIWU#L#$}MF7kSMR5eIt>-4##eUTz(rV-GI>l(5oxF@#-MkEzDKb zA;P|u2%E&;$iYzQN(0>BpQ^#ev+uTKl@pt5{vyJ!^7d9UnMHd zX8)3?%+G$4$SGw1*7?qD3T0X(zB|R42Sksw0)iq+!`)=!2x-px#-i8qk8)<}j-@`P3>h?(dDA~d%u1!ML;;U5R= zHL5##_)}8hPbKnvV)eAW!B5{Ce8=A4XYkRGA44kP%0K;-st z*zsk;j&P@v-Ib9__UyJ)vgfoR+%z;|kzkC}Uf_UHeQX}ls*hp$Mu<1?dFbstZ$l5q z12(w6j7rNas(TFNVn+2v-e~m&ENFD_*DfTa^ay}*qxyXC&s9db>hq9HV*!^~Xpqti z034(GY;UCcMDRubJc%${CjVrE4V0+c&6q@|WU#QTol~)36gw8xr)9H2()V->VltF7 z3R#In^NUziqBDc6RH6kTRwmI|Hi->3xM7;~K!Js0al_vN#|3ai_Q|+GVnd8d?lTxZ zgUq3T;cBC^Ccr9%<-MkWNR?buh#Mgefp^V73`{jaR%P(mBvOG1!E9( z0**4%1`IbEokRUH>Y@4AFBNeN4Pa;+1@ECDWOQhu%-&EOl&lvy9vVz#bm%~2^aL(B z2pJt3W(@`(_J>AzMw7;6Jhq{T%`vayu{9Z;i8dKqVggJMBDTat#I_OMiK&P!(Jo_4 zOvdLNBDTboRBVaqi0xf2c?e=l%uof9=;X0A8$a>bh9S0c^Ebf!DMl+zlrfnM{GyMX zEG1%YweU?;_@p%@F&H0*7|&x`l8D<@#@ieWiLf?OPV60#6Um)cWF?mz`?qndW;+s z3~ManEwNE%5qWYeF-RR&NffKYDv4suLSj>mI*5{SD8!gK5-{9h%o|>y<}AYt)de8K zi_jB}g!k~U-y0tuV$(#nha=kQ5)H(cp1gAmXSSM>3?I~LMXu%Vl(u{Q!%I}<4Uh85 zn;|aQAp;R_MXb}{+dE_o9D`$ri2hGn;fTj(_Bn>c4mCdKX|01#rTGt@*24^YL{Oga z9Dz<5=X046wwuio?QFzAABi1q6ph16&3LKGWPqg(9!DAEd~Y{7ogHEDBiZB(!n$Ns zXS&&JVKcv9vV z`Papc7HJ`)k$`I1PycLcYism}cpPs5*7oV)bama*U%?(4n``hL9@2m}6Z$7yd$ALz~ax5Fd@4C@Q0_ z5|*8ljD?(AZPQ4%#%Y;MWTAu zg6kS=*vcn!*`@{fGNEoHJ5_YpI?Ubn9YJwS>@-M4k2lP7I6c8IFXHrMBPP!#lOXaq zIwp@Vkq{g$vC|FykvNIKF(!6~2$xKUqg8(a?~s923km!0_2dcYUeUyY*#QcZhMe-f^=9qBYjX(48wGSYKs( zRsxxvhW@Ex zpuvY>;3F=XjbWf+fQq^y3$et`mt}YqVr!4}NJj@8lVgt9#w3TqF(r0^F$gO)G7^rd zW*K1kVxu!^%ON5>LbWsP2u7|%f zxZO*mF?Nw?$k7U(yh{weYeq^D@3hz=nY_c{n65vJH^@r2wzi|Mz75sYmRj1{8M4>? z0@xY5RK9rx-aI6>*!Y&e8;4`2xd$+OnbF!9k_Fs|WCg8Bgfy18y>=s0IcUTHAQW^X z^uAm(HkL-MNP-%SNq}OWY2fp6%*kU* zr05Lz9u~XOxRQ%D!g08HHDGwD(HhN^X^Ub>AG{OHXdcoQ&1P50GUd19@ZK2BO{FcG zkF>qXC5w=@Xn{&ww2-H*S4Mau;y5Ch{4ji*%*GRE0IOfEbOUI#b z92r|79aG^rDz;KOronM^>{{uV498qq{;#9!9V0L4dk=7)equXf_z>{ezIyW#{bJ7k z1nlGb*qQ2fzt6xvUSH28z5+al zFFI@iJWJ+tJmA@q+YWe+973i8o+}5o!vW8enV1W>P{wu);Q3PE*mQku50&hbfG?mj zLP>*aWWG4QY!P%3cQ%= zB~!q^UeniJwof>55?dwfyq)T6FQ>8Vq-zRXSJ2q?#$o)eYPgnAa}IELwb7c)k?k2D z>{`LI!AxTEZYTZh2GO3A`Kmo9aaD%wYsn(C=XG3iAlh>>q}p@RM&Pjna+%+4z7bpc1a7)ck}e;1;8Oq*o?jB=+^z2yHqt6N<|<6&cTkHXWJ8){3Nz zU?3Q`tP^pTASl?e#a6tNb^` zc>eE`xtfFYT~A{hrRzwzZlJL?{Y{?sv*21y&A$TYzh(GoMU>rdd^8q>721>`lp=)D11S z3qgjTH$HF9R~w4W0U{5gG~)=@17Z@`j3ZnR8n1R>DqG}d4=H3LXWTB)9E>97cet+| zw`TG&tT~cEi7iEuHxH^~kI5H`+t}mAmt3p_AH^AaIEv1b<=I@;tt_j}&H^jAkoyhk z@y45D>^V_X%@wJFY#yxIMRPpWE}E-0T9F6%JBiJBr$&8e-Mn{J)jSkSeX$@BBdtbC zKZ5jTV|2e#e)Z)ehHH(;sPYXzYq*;;*^@GR=$}tXlttOo5@l;_i$pm(dq#xZoQt!@ z)u_toi-uVTDi1#MhG)0INzBQ3md?cEb))4PZ=~f)_Oihb$hTZY*een(rR-IMZxgrl zYV1$OG6=UUGuUfl!r5}Qy^no4oy2yCdL#?btZ$^Tx25Y$xNf5Q3p~o}`{`?M-bXtR zRJXp~0R9?ib1t(6c@?Dyj|{i`Na*i| z(Hf!7$B_R7@}H&_>tBNZsIv>~&%pj1!F*xpM226M?R*7~ui^2Jl>B#wF?_l64Ost# z>~2K&Eus+X{+|tFtl#+_Z~Or7AK|?RDf$T?uFK%aQO+;${1u-6g6D7W{5L$s?Udz%h%X_9Y%zj=V8xrn2?)I|!o1$o@rS&j?5v=lD`yce<@H+UWwb^77o zOoicv-+(NqKm4qe`~dKZ1C9^8%oHyNyyboe7t=b~DP90PZ@!ZYULL~qyEG@?rP3UP z-w%0C0sIQ#SCon`4F05CCj`C?{y@9~`>-sd5|@!Z$ccbG2<+k%+i@A=^PDK&D1}!U zLJ}of;WFBmJLO=Fli<}m`J_fJ1 zx^!nOf*9v=IpbYvPMa&;nSkIXx;)M#S3jrSWjd2x8O{_}e`l)8a;CYw&U8f8;mUMo zxCS_#t}N#eSGF_LmE#=h%5`SB@|?q5e&=vkzH@{t;B>hPoY}5IXO64LInot$j&g;Z zqmj(Hu7S=mF6PX0g`Hzv5!pyiav2$)_?+XBwiA%H6H^s*n#;(~(Vdf#jc)jz0>4vJ zerLdMlHr{0!g`czn*zYI6*Ku^o?ISJ|Q7-m+G8RCwIpqrww# zZKOPhJJH9Qq{@5?4f*+N(7Fz}|t)p=hSH06=o&eqf^+(Ww5 z!GW@w3vmA_f+$|<>ZTKD;0O^3ort|>84jI_?-Y3le{<8&WRd-64AV}~CZ z^q?LaXV~m~7eB?=ct~8G>u)?Xp>~iPXC+}X{W}70JiHw?Q;C)^d9bx{_BJNZwKg94 zk`=s*i=DO|i_@cJwKn3QnmoSQcxr0G+<3-rEAkeXJnLs~wDC-3Ds5bV8Vq0Ns%sps zOrMST_$Oa%&^Fc^tjEQVK{PhF*#)jF>~l1Z%<%de8(ELo@o!8LcD_OeyFei~Tc}V5 zR{5?IV1jKNRmd)K@d;ofzGApop$NOgbussCj6xvAQ%zRqpJDZc^QeE#w*70|>kC(%PbQ9s^ByY5y|ir>T=#KL?KFrU57)-M zuCw8~U$_?H8jHy^N!o4%>jA}*;t%c>=Py6>AFhZ0!?h{pnxu8RA4xgd?!{|&!Ug?@ zWY9R7`1sM7Khw5XKput1WQ|8ZjVEy8m*71{N&Bs?veRu|5#qyDGI^bg&Zf43#$xj} zMyA~6Y8MyO%a2^9tar6%^G{}!^LE$dn|T+suR-MYD*oW-7s*u4oXYnlCvR}k^HhlZ zlMOQM3Hld!(iz{UlNa2hyqjGhyk(E_ox>p?uSR8-Qb4{>KWac3C0ixTn&wWy?CB{u zU0=4CUO~x=LI$oLx?~^M&t!_b&u=%Gx{qroc|{}J+&ueu?;Y}>i@f9>h4`Ct&_Ja} zQ!d)}%WmEsnhLIQkyqSY3AL2ZCFDuE8Tlcvx%DyHGP@ESQ2z){jb)#cnUrIi9TpYw;v)N8|al zXc*^-hH);QbBtyFapkduJVV>^kHarr@HVD#*~z@nNLwYC z&w+WAYuR?f-#yZ`Y?}ZG%&h|RA+WYXA^AKcr{i@paV}gh$S}9^RPc5?O-IR*wo~Bs zBIoJLcJrj^%YFtqN(FbMu}lPa6Qs65>OZ4_xNF%K#7`z}hQLd7;x>?%>BNsfUZHJ2 zfxL>hrqCf|;(I3&@+aE18{{?crfcUT_CMfyoxA7|5qB>oZO%#f7EH#qPx-(bor<)z z!1vDw^gR#0v*G&}_{yHiqnKFTjjz8b>A1t?J5}6LB`@XcxYI>17B@@CKKOTZQ=31C z$yIv$U9Q?PoA0d4-Z|rOiUAURiL1mhbh=Q7)?Rg}3w4+w)M0MT;A{vOVM0PUy#UXC8&=sp*z^ghASMvk80=>8PqI=|X0h6!|*8ZYlf4VSpcP%lsE zAttHvay8QMfGdU2y=uL@dtnc$AI}lqFuB|0Nojn@MSeEw(Zzn2o7^)W#(fiBK13n8 z<*DRK(6GrxVqX5;0cm{1MOJv~k%ko>9%4PxwZg+AsE1Zq;o)J|Ln9~zb+gjL)lI{r zE^@7BB<~2}CtbcNCVR}q4G!3dXOFvPfja9Z$LF)l?`(@!-MAJNtOC z*!)2{o_5ji>2-Kj)E>_N0p{;;y+i3+>Wi-(xOqZcYf1mwZ3Ul!KmBNdx1GMnwz#-K zjlPeInk2&KFwaW#fz6(i2$z>XFVRj+>t1k`py&P{UJ*I;+_rqV>$JU zYijA9IQ5HrYUxka_@-*nJjB}{-}ZZZ=`U=XOMIvQtGXAI{>#l?a!ufg{LRN+7n2qG zdsJPrN&hHUmuym8d%j)z5?Y-lF1@81ZmJfy-clVOoc&qO=v}x&KwczD)9{tqU*t<3 zd|LK~i+^rTGw8XbKz%6e#Z@>3Z@SLs@%wNW4k@hy-0Gq=W&%LkenfTk)nWKGm!B|8f{)paV~Vhiz6@ROOh_t`wN*ra2X?OekuEentPWhW_+BiNv5La0r=ta>VWT$BV zz~x?S^IxU0`Ow}cP1-+n)mBMu##2G2>~sxp=Y?(a^BMaHPX5S6k5+RCksbaZBbRAe zc#Y0@O(%o;jhX}vFsL8b0HY=z;|AnKII4Xfhg`mCYCMe;_ggX_a2kHkqDF9APJ#Ps z?SC=$-hojTPu%!E<(}ucyKo6o3`jYS7J@=VLRf3BE5I% zy-Szgr8nsyC<0PN0TEH@puC@%eeRO@^?iT8`{Qg z%E*_M3|LxeB9lIbB*v+QK_gyr6>X?woCf06Ibm$Y7$=ZR0K-`$oh{PY3+L5Q_#203 zJkXQ9$a%&j!2HV^uRe_uCwyRu*Id+2SrgRPs2r&sEb*y}6f^xT-nGPgvK%envqX;c zzLH~!F0x1y)n16qpN0bU3FZBLOZ1j`r(8}_%TscLIq(1PY)(?kfbw7234A+6?-Z|c#-Axdzu>f2jtV4T(YxRPML59;h2XY-na0_0{fIe zc{sBu2H*n3vCn1zD?bs;Q3EyL%q1MJ<3uqpM9~mIU#k4od>hBWf)IJIWLL1G2-rh@C|TeD;OYzc^Y9jT9Lv1Gg5|Q$|BlbPHktEagqTV0MEc6N`^R_8gIQ>tf%dBGd z%>T?>Q>YWg(ktDET4r7sD3^U?=1M~3v(Z{ahI zpRtg%Y|zH%G;WZu(OW*3L78pYB&UsA`kF@1(0mcbUljh*$G!r_WAX*N`XUW7Skp4K zr!UH|&>k(*di$P`bj|zt3K<0m_wqnr5#venwHoPr((sb6^#orrBZho!X84|xDZe(~ zSHdVqDYsqbD`~`0=((Ik)U|1n=JfG|#QR!dqvbP$I^%QG=L7Kkc)M zaNhk1*l5|_x)}2IXNj*_A#A<2VQ);Byz!Y!H`MFXQz^Z}uDID00bfohN>bA!}&w4Wc$3pOTM0*2T?_5^&7*Iv^q z7_o2W8MGCRhE=^(nZmss|E1R8uhJI$J#92A5@$7w^2KoOn-zprI)hf;&l(kmS-&}IX%_S4xTr%;^!%X~YH5#8YcicS0#AmHh zA!Zf+YzWlLS|mC3x9*Hy&RLRTxwUHc+^&%Ds=+mI)~f+xST|5tL?0o}=yNRjsV^Ez zW7SI*c=A?HEkg@Y=2H_4rLB$N zYEG+b#D0+5OzfjSk(y{IaT;%hyye!$EuL-2_!2@-(8YC(E7Bxtta;ut69MCol z&LktYJ$E8zaq4YX-^3KFWZpN$+Y!W{eq@P`5p*dqYlnIhS@ORQKIOv*;#0DAs;Fb( ze*>o$T_U(=W06O<*~Qg93QPWAK)b^kdH5*=nQG7nc4Ds@Tmgpd8#OQjeC9s-fFQ%@B&J z?pvT_wNecpM-BRo>I!^AERVGG{si8zXLkz zb~ks_n`$IxNB`R&TVf~6j$0M*zX{pHE_at(=*NGkXh-oT1Qzk)vYRX-`#XMOiT!Rm z-0^qnW{I=xZRPR5)726OI0}*Vr;5`U;eQL=|C~e#w9X^s=`Z9d9lWy$6zna;EzTiE zVxR<|+YAv$P0*cu(A|8{y)YC9%KHpa`_}{XAPl7edKiXY2lNP#+`)GR^miyM*cZ@0 zsz`sV#-cWq%txlU=k~vcYI?}k^4 z{~07Z(bC%klAYrAG!=|R9DTF^Iej&`NC@8M_5<`Xi$7@F+CLvOAOrd)15eo2j-V6h z_z0SevqovlsbHUXw?w@N+F|&6DwZaa*q=388%UwO6m)7o7c1)v4Ozxzl5A9e{fM6E z+W7Ht&KS-)bwS#MjSWMzV;dKSsOyerhz_*UwH{mX0U;*F=xbu*67(3Yj&P-?;bp zQ!v!VaPKZ05ou>0}4sULbw@>qrA%&B)XZ5qa!`WiInv zHeM~m8$(tQN^4-e8cmZj3u%SB1-vm0jf_S{lf%rxc_~n2G&Y+2`~)6u5e$3F!Y4AC z7)>S?%0<4w$fib<>v@n(85uB|B;`TA$;g+CChtDU%ZW@QXf*l!$=v8DL}WBGn#32+ zLzH4P$t<2r^eM-bYBX7%H>NbB$^QR|skzZ)O>~}^(ow|d+?YmiOfMTvY8GSeMdm5P zXwtk`F41fz$~2l3j?P2W!e~-CPfS~wsHM?lMUgy2uNX~^7Ril?nWKy>qlr~CPo7>i znmn5)BlQ!uJ0#a)>P{l1wNa_0y>oA4q%Pu!DMW7dQeQJl zA6L9}&{d!eTNb=oTch-2iSRP>m-@O<+EAIoORvg`j5mzZBjvdy3+UOJerh|T^hrCO zwDv}=S7sqbDZ6JPPL}?J`%8qBeaq-t>uG2&l61cotd&a*tXfqqdA+^Xvr+PTd#z^+ zOQoG!uy*mLL7lW#^%zg7-w{czns~RSmTeok)(hD9mNPK=Y9%B_)~r>_J}#*R^{D!+ zTvRLGD@2D5hUm|uD)ntciMM%v=3g`3F_a`WPw8b&G@ND0D^q27C8OKXP;%@e2-*~g z)J}%-YDj4It`XZoeu_y zqF`S=tpLq{yp5Zs@m6?Rfr7~cl z6s$Trulz|!U0qKEoJ!sl51JTx(IWvq;qQnYDh7+5en^-g@)=>Xo;OEn+_l3nKECcyEZ+e?$dRsJ6_X9)pj7aEgh~5$E z02D695WRTqPM8<=eMvsD5uTVZ-w=Z%$c90}0z(Ypbw6RDA%;pWhQk+z!xwQlrk1(J zgzTq$9~w^}1w2|1XJwc6ePlEt$cL+-Mr-nw!{O}=qw64et609-EOE(xcA#&LF@a-jCq54H$QWw^AScO*dM1kL=mHoUbd#*c#U+Kasu| z-PcX}aAD5Gf-bvM@Iv(}$R#pSeq&i9#71F5%$WVDBIl<;*#q}95n?{kAqV$~A9 zo<~C_Y#P zvEzeP5SzFuh=&+KBF+$z-qy`R#4t}_6Q}9Ep)!r;mT#Ex9;J~Ul80 zE%#{#sb{zDN;0n8nRyrPIv4mK6=?pEzg zBu$Pm_PCZ6c#`HQy~6&vN^kN%%m&{&PeC@ zT0ERz?V#%vv{1Q2K@Dc13b)HSdS8UrP|Jy)J|C#$Mal{|GJJ;&f572!GJHv%@SQST z6v*@a(mdh2WVnOFW90W=NpbUSG!|fVa znT1QEZ>Ga;YVe7bA;#C;Kn=z$0R{I6NGAT zQyzkEB|#>qVAtT+dBTs&@HQOol{wg)C;WsAZ_D9!4R6U4{+$eOmp6QCp78IrLg1}^lZW7}B>LU0vfU8>I4xDSiK>>LJq{oFOV9ukcSdm4l!YK75 z{`$Z1)g=D6f8*;){EdI(<3%7D@&67y2{n){jV5XqVBfTnB0$>ee*luAhEy#I8h3OFF%!(?>derPEJm=~I6_ z_z7Yepa)6cW1t=!2xyQVm;z_8P9>`*g3AC5(F0FSf(VOo&x=5H0K)*VFeR7_Xt*9o zhckjHusNCoV5A;c2WJ%HYKY)50HgI_`N=|jp$CV+8KVcUz!|FtgHs@a(gUmEj1R?8 zW-4S(dT;=oiF)u9oJo41=rjnHY>L3U0Hy#)rHt+eFjWtl)A62)EYWm5SQO94BYa)-w(TJ`P}m{CJ}tyaZ^Igud2;e*)U92bGyP?a_lSI9v5VaX8!f>qe*wQl_Z_ z%ywW>X+uk8*db%sDV<%?*)5$tdY}>L_i_w2{WmgbpB{V_LHi|iKo7nH=%9oS>A`M* z4om2WbdE~rm~_6C&T&0B0+c6Y6@RA($IrqshzvU^ogehzJRnc$fi-YW=gs;VN%5o3 zr8*l5Is&?L5_dj?I|tkaJ#YigMc{}#6TyD~UD5;AY@BQW$$R{g050QVCY+!3z%y`u zA$rtSfN)oAfHjG(>cKj|UDH{){#QNF5YTmw2@ObE^}p%C*MPgA1v|pIp$9*Pb5RSD z?$z%)J2$2Chjjjw&R^2GC7s*Sxg(vs(zz#{`_g$JorltSB%Qyd^N(~MOQ)xUlkFv) z-qPtKoxalPC!PM%86cg3(itS3!O|HbouQ6EcNA=xgDUYw5f}+zH~=Xem;z{oq!`H* zn3}0BM-c^8?3VyW13;go2+&Kn0`mpa(ls8Is8a%C7=;Ari?RF#U6-Ia^c*nb9KmaF z#ybL3zY`GtvetPkRv-c=5~y~Lkk1r-W0y<9lr$`bYqX12H1fPO4&A|fu z>5gCpKrK)$D;CvD6m-!sv^?YwV(qiPA?4r3wV;=J}Q{Eceme7j^U)nk0SS>NZ4 z7vp?;jFm(eU(@%Ev59=pFWPU=7VC{BjeG~BuW1Y4LFo&;jF7{i_|hGRT$FSi+vaqQV?IKJRLj#WC{IAGHTn#ee8w3F5_rBIhD zL}VN>+CRl+w`HZJ9W`3*;i__ALB;!b_^(95jbp}}X4+h%l~l=Mil-6gtxaUjpT)ns z2L4KsG^TkXf#gg3)~LRin!w9{e2XjPxY77&@8K3eb^x8I^a1`)8I8T}kKrjTLs+gn zkb>RA@c+RNMs)ELyw4U>B1G};LSDW2_q>G$)+&B7TAfvnwLp9RSm1Pl*UwwfcJt?eTBOqJf*#K=4{Jp zeDIc{!|Ak(hBuL(PnI#%241+yEZc{d3}v!H&n;&BWGGMZd(rzd>{_=yo_UMf7(@}L(QF(Ln7e-;r<42 z*F%_B=NpS=xWiCH9I`xyT+<+9jXY=9C{3} zL)DPw%nr|bk)`W~FN5Aalu7Y11Z4!uoQASq@lv6^6fV+k7zL#ao5Rz7H{Pz=2|P@m z54jte(51CyB~;8=7;~5yolZ=~Z~k-ZdJzZL30VT>H6WI5qSM zvMQ8?V0RHbrspmsBX>h`BCp}QpN#R8`;@|;f>|SX=y5@JaZ2T$(edd?xv5O2R2~?K z9qnhjJ3_(hKBv<038b0J^Cy`2D1ixDXrjXt(CX4Vcgk}F2B-MKN zDKdpLmk7KtSnzHsyFK15P00xJy=T4&CBuqF!hML+Qp}Y1>_&MHjUv-}j~eABg5M)k zPw&}{@?POkTJII1v|8n)Vf?LK!Bqj5b((RV?f%#q7NJTt1hR7x6uH}s`_S$wACjf8IY53`9Fcz*E&IoZXc14j zjf6($jQ+5M9r=f-2$2?HepKRAD01OGM^P3qy&n~p1^x(D^UB=?@}puX@JFGHeZ(2_ znDO&g=pMtn#VZEe_1e8PR6tR~0g@n5R+G zikWr0li`ZIxZ-9F-;4&K!lylDK3}_9E?B~hX*sM}IJBhMw0W}`A<&%;Z&|OI)ASix z=}lqQ>0^ba#->R*0e^* zyhYO&VR~T|QO383jBZ-nu7jp^1kOy$m`z{yawfPlrTNTi$z<11wq9CUv*xR0XxRqK znJ*;r^)+s+&gD%jmGs+FDwx&=d0mEEEUlthJ0^T_Mvj4u7_)s9joBh*BKVJ&wzNuS zVl^^-m$xEg&3dt9jm}QEvYGTO8H$r&#?z*=t-@F6cm<=l#7CPPFDN8SH!Mi0Nxbg= zUV*56hxDIR`a>m4D>@JOAC%qD$kOVRvW3=PJLqIW{GhSGP-SUeLnS>|s=ZkfoMM8# z`3VA7=VJd${J0vGBexg9zk%B72pC9g8*%uw!6*e_I{;h6GzvU_FQ9ff0%PIqBr*tx zL|`VMT@3XAiMJ=+oaDPQdw@*m-39NW_c{VgK#F^w5P)?C={Z3A93t%*)BiRZudwT? zirKzeZoP|)s%DkK3R~Xdx??_oxF?YoXKMSoS>#ZB*7P=Dwu-r|jA~}P)$*PKUyT0n zIkTNhqqDM%>SnvjeD)zv@3~Pko;TaIm*ldMYnUIiF0VY?OL@VpzLeQTky6vNI{)`Y z#TQNOxGY6VEwlR9UN-gHwziq|a#|g;RStJ1%7KhCHQuaJQt`4iyOab|J7xEsx@On6 znTr4TYPZZ{qWQ8m)UN!@rmSk$vIknUZsHhabS>i=6 z8*@&rZ?<2lN|rYTwlA7WmNcb-sco0ZcW!8YQl1jcXk@1DkSZgb{D+OrcFR?+z$Rw9 zG+BY+q0w4&X=;jV&Ul;?Uvsh!d-|7-8c1Eq)Gaa7NcvXkOD@ILfYiq4%RV~Ka5NUA zKrXke3#fb8n_TK)abBrezR)4k7db9*e6TK+5s`FUf!b(B1hMe({m4gWRsQctjjDxI z!d>j>4toCy1!{HVO zZdWoYpWf{%M&;AHUCpR`dbevBl~3<>Eu-@3-L7L)KE2!ZjLN5Xy8$Q`0I=G{MvSPJ z%#Tf~4K}hNEp2oTnkA}G7szO47OTzEinmP`s>l5lhG9&KnUQK1`$MNG#!GXKw>w4k5E=JqqIco%Vx0*hgbSD%wo+nPF|#Cn%YR}y>b_}n{q=%5|s|a+rrd> z?&I*V(!UHyZD~3m*%uS}PE-1R$6b7&WSW*3Y|z2xV8cGx9L)Pl|0!Ik7DEi$W%y4k z11&MspuLCx4C~?l7P?`VsP?_8RsQBQe8YI`J6#g0;}MRGxEkz5REk z!CEmtID&Mc@f61IX$Q$^luV~3PB|%Wr<|O(OUTA3i53eXAEHTZ4Yj48;8=Y!T z6KNhH68NI2#jfavr}1g|6PcNynR8Rs7o`qL3q7vsdo z5qJvDt#D)$Q22{sh>WY;21JKDd^Pn>IOvI`Lfj2O!R3JNIfA?3+;^}7(F26B9Gb4V zK6LOk*GD0GzS#P=O%Wi&FaIzQharY29y>(m)~3HZwQEWnv(}J2YKVLPZTL_&03vu2}OEOqaibHZrroclK!CXQBI@o@v(qfMGP}9{y!D;PTT(%^^}TQ zSaGkH@iH}Uq88Skx|Q3!Ww?27%jUfkYTm2JeQzU3mD9&yEwa9bU45j*)eitw3NHcu z4Uzh~sWjKTWbGpllauy_8Pl4@C#{}A0Q;DYP9I=w=K&F6iNb2qT`E#xe*2q_0p2l1 zQFUw-`u9Br1uVi#e*(<3JgL(4?1a%!Bv+q>=&Zi>6;yCU8P$>eP;tVad|xR9r=d0~ zYI;d{x+)d%-{^tzEIE&q+Hi8pCKK?t(f|%-A&O(5u>mzKVpRuBC0QKP*=;y*qfBjX+WA3@_}(D?rdnjnKFa!{_lE-Kz6gU88a z1W68trUDu)Qw$y~QxU-Yg2U;24fjjI#^-1`X2dQ2-m>{U|(`8Scfdq5)9Rs9jIWv@p04a3N z3PF5jayB69%Ob6vS*vk=Wnq!l-mKOBU$~SvO+Pqt+CtE%6&Y`tDqa`Fdg8s0@gm&+ z;J=hpgJx6*Q#@A4sNG}Mw2yzAV7jUvk52xW?g)=4_QZr9 z4&hMAawV9TcTMHA<|WgX-nY=aUU|21B!)`bduGx1nb+X}`V;AM3|Korbr-NiDV-L; zQaUeygH<2A_5z5THf42Q0Eei!fnP?aNytA`rCCPjMQE6cQRvf2_TH+Zf4GWk4%Jyr ztyPSFgo+yuHFUbX)2fnxl#0tbb#=b1Gg`%Moiz5hiuI3Fafcw0zYn9=(JJaUBDuw+LJ+LD=wN@GA+P2S{AQ zG6HdzNnYJp4v0B3zKXPh!@!I29g39lnq` zh7f8!qj=j8LTz9aZyQ3Wjf~=LLkP8rQM_#kp}uAmZyQ3W&5Yu0LkP8nQM_#+)H`jl z-v>%w1|dz3Z49xsHYHJBq}pzyM1U?*?Fd7@mDv7=p=yA3F@&-*$GaO4ra>Gd692o0 zAiggnr2qzVY~K);ws~@HB(`lIe?t^L4B3X19gQ&9f>Nc13w0b*|RkP!?5 zdDviufg=bDD~GT#mZS77F&oW6b&MlIBFtBOYw-QAK1DH429>#lLSi*8Cr;M!c3_o&0m!baQ z5D`dN1qPgplzR^;4Y-rQaqR`^#_tbU7JxhzstB@PcRKegI%PhK@G~|_Ho%V@1r{@r z_K_L;HqWWV#@M$;x|p%=gmEI{V^hiDcNQh%(FM^7_ow(T)f0aeJ~N}046V3JSpWz+ zq@uV-DO4EVR(ON=74<1FE6N*C0&_1V>h5Ng(oiYh)jUAdjj-4J)ZAPM-p0^`uXF;) zZl>`RAB=utI-XALVJZV`j)x^9>1Pd71$kzqh1;A-6Q~)^t2E!D8P2OT+xjQcOnOPB znbbc?#Uy``Cwc#56_#Xd{}gJF3(O2RTGegv)DeM;+7A*pe5$6>NVeKa7{HhUr2;?<`dGuey-2r-CxE;mo!_N%Q#yZ0=TGVUC7oN+xhP#gR0FYBnvTGn~dc!~U66Yt0?JUd>X!#@$K>@tpoIRoLB=er75v zi#Cpe$+IO>F(;R)c$%4txss`vXEPOCOaD-5rSv8X<$P>pzXPYI$t+GUGn>rb^fsB3 z=wtFMgN3@MsX($o168E-GFv<$`)^8bvr;+lvZ}zQKQPd@&|9J`QQAdob7>c^&C{?p zmv(V)nXY0(>UDjB4QY^OtcON6?J&VXXY?`EkMeLFseMhS&o-En-q)iZX{f2z>&YET_Dw2%h<1b+67*UEk-3wx*2TA6dw@xQBWe@QTd39kGH z!2n4xlL_wq2f;u|FpCH}@BNPjeUK!W%>-BegJ7^En9Bqw|ASzNSrpX^Eix^6u`0E& zRTiM|0zZ@*N{bp8(j%hTei-9=EW_GO;BX1h?25iknPRr10GyVhL0Ds&9OM3ZY$5!T?jGGEUSTXo^Vg6_MO4FoQ&LpP*?t ziVY2j^fBf_Zs$U<3!o(}p;6IMv*(+R8uy^3)V7^?BUqn!?q@_d&5^uJGTzH2Mv~qL?;S>g{ zBSrvI8K@@OO#v_sKzKP8>A#s-Tv5d>m>o_!M|HAJT6sRNqV_lPYqb6g>USz^=kg44 zQN>N)4SWgKe@VqnU)%o^@xGgQ;Q4>1N!j-QLbH$jHtU87ei9NSVvKhveD#;F`u>hg z*+wDguJ26(`F1m1>-~cuHgPL?#XkYlwROg_QQ2O7Amj*rlTG__SUpP_WX8TP%_{K) z$&A5fQtCmKz*KMX74l6g?vQ6Nx&Lbwm&h}vf3u3qH7(gM z^{{7|blfc_TE&vLs;q~-MP)tgZR%en6=RLu*(QsB=7egJ?_|#nL!|FHk0IhNKidoi zR6C3&jLv6z$V=SwLm#jyj|C>nx)z#jC2vtEjLobq4nrh1SpvvrLunBvz2c=nh5IV! z=Bw~0WTbByeZmJ{wb28X18Tw2UD|oCFj<9or7Y8`@OQ(I@6`-ZDP{p$6N1=I-C8rS z7RYr#rYm(r{g9@r^@P$o&w$M^0yju-89=gYvXNte;tPC^5*6+M3*hB@$EX7CsYcAKo~xyR&v{$4vG zkuuDTZ6~ia@+LWBxT!4T=OLsD71@##86!+(XCCBT2mwUONHeyx{E}r=DWlAWAs_)ZIx#<24r8GVc*5-u4tq-X-VN-MRDX zvplcvmGkO1_PpAvntzXq6`>Ogf?GZ3-=~g)l}wH;0d}Rjdx#Nc>FqwVCh{%%d5Sbt zQmeOt6y->6PzoM3C?@0QV+OK_xr))2I%H!02Z?Szy<^)gC*USkrcv?mV_L*{gMnXuHpdXpE z$34tC1fDe+dyZ*7!}uZOd4_1~Nzes`FkYDfzG#Z{OJ*s~;gc4`tw|>+hy6kaO8w-4 z(sz_YTn3CoBz?C*AkUG2_s=Gw*JV?rePPCS$=xxf|7=#_IHPeiY9)P7an1})?la}& zev;x`$P;?-DB}FZ%>EV56;ou4F}3#c9QFb*(0{{!DL>f7jIn0rX8aC>m&Z{0RkJ^* zQ_K>#JxM=MI=4fk2`qAL|5{jT{uQ$J;iKbTGa zL$b-&z$X78+2miqbUq~5fJM}>`G zX3qb+DikqNVR z`k6!g#?!U`E^VHF<%*G;7K=A6_ecSyN4OdCXsGm;1oxTXzxE^pB*6nB=zJvqj)M0L z15rxs8Ag)XOqzqJB?no&Ob+It?&ncEgdHNmy#SMT;l>Vu&_JO|rS+ID4GjY>SI{(^ zDKHacXM%o&l}&qmoa|*xFqK0Zi+kA&1n-7ZCz?@%6v^~S`Ohe80M}_L3#S=L_oy#5 z;9AADp+Tr8fd>;!HF^xlf1fI^Ay=ON0abP*S=kS%f*W%MGbcXU3euU{7ZyJYLJubJ zF(*$~WAhbY9EVZi$n3!Q5M?%fj&#!}TIjCm?WHY|>PdP;IZO>r2dQ#8_?t47=Ao|6 z)4?RG9mbo;@)S(|M@|QibEktBcsl5*J=q2$y_e>NgS3g0m`rKY0R$yI#o{GkD&w9N zyh2Qq1k{Lem<6U=&G4y`>9s^PM^bMMIja_02CB(rppS-}J;#=Tc`~12aShBwMDiX4 zP2aO5WG@D@C4_8{WuZA1J990b+UKD@zO)W=s%0#(l1ITxISTq}J|LLK?x&&BR%!H( zP1by?0?7USHOxJ$nNmu%WtUxzE~|Bx_e61gE2kd$zKn$h5JF<@|MtGj0IgFS%#Q=L zkKr_3WYLV+i!g(<-sB9{hQdMBk`C8muDM23b9VP%Xz^PvODulNWhuh{{g%sDDC{!p z6rxZvee_IU(h#cRSgzvsLs8sVu4K;catlKMn^Xr~Xl&MoFJI?>4`-On?{Jyl71j$N z=lqV4`5hU`FFi4{k{W?0JkI4RnakCjOSY=Sd^Ei{vqrY)TKa%*w$L26E(D46_0}OI zq-2)0glf^GrSh8DeiZVr%2ji;Hpvp2MQ=#?ztBd(hKDsO+djY8U^(%*D2NAHw9fLr zZa(d~jWWCths&$3`NB8Jb}r1}^2ReNNJ=xP&wq`a5?hr0{WsveEpDtWgj1th$kyUv zu$9Sd-iS9t+vN1MooVrY0MA}K2$BY;XfoR=12H#UMC`jPkuu4QY31d|vQj3SF|SH* z`fdwSL(~zp>Lc`|G1STtazP!7T8fYh>NpLOIgiegx$#s>1$3$<{{#&i$4GhFG*QFM z7p2pL$Gv=yteq#Ns7GGY4OLH&b~<}4-hO>!1yqdreaNqDM9TesS(uyP!{|ivfW_jv zgE*v`Vu}PuJhG7Bpe)4q*5RYYvRi4<2oD0LAF_Z(fy!frb|g)r0u2ex3`6A1Fqw)l zl)rB z8BLzf*-M_Gh4XjD;%WB>3$+FUM`ZF$jrS6>w1hVH$!krXc4y0JcaA;na;Z*PJp2B@ zso9+OX$eqs^uQEC?D?56ir90SH-7{M&4s>4&{+xLD2JeP1WAQXnnusdinxG^xM&UH zil}J8`VS4rFXj9>7hUa3Ie*U6CR<{@Mj{XYml`;y1yUb^j5J)5U1~9}_4W<@P?zF9 z_md=8$^`c1@-P9hmzS*=s-|U{mONi$9&>>v#aqg9MO~oSg)iSB`R!wJ)-+T#$V*{AlUi%VI6j!;$nA6{$z4NIhhcmQiLtcW`D7 zAA}^#nnjuE<8Z*(M)V0_8ZFn(k+VX(3Pu1IvG@tB_f0+9c~ zCAsywWiiKk8^Js+h}3DObGNOxN4e(*1w{HC%ZH?t%*r?`XJxTcQdw*zYOxd_qWM>8 zkjIyCPKG=_n|kwIRQ^4>s*2B^w#0H?8kWnYVKqKm&PxL^?z1hiUcLhc^^!Ruz`uqf zTxVTEg#NV}-WHQY{&i%jPx^yzfm66|1$x7IfHL4(GXBA`M~NWi;UOmE>891=zZHaM znAV&B72@3nff)Z`Ct~68VU*w*oV%+umR{jQtM=-3R)dtFEmRjTv^0|jPWVT9M zPXAtQwIW_+Gw=Qbno}38cn`=gg8glkLB)u6swa7q#?rWr8cXB8)>s;s^^a8!J;lFS z`x0G+aKH&;_y{xgQ&;RstS!2jBA*a<&VQb zFQ;sJCt^exB5BGzHf97inES~1SDNiCeZMIo_I)hTPcARsNi~4943&-|JhcuTCmsEa}4r^{5 z$M&hH&!i(-1o>$Z_aD`u7=FMYi{}1swfWGJWcpUM{l_#I4LWADrOteuTIO5+qW-3n zLe#+-wj=qRwjF+~dHvx)Jrt-D8k;n~tc7iwk9T$?8nS8rom?ot&s``Jc%eKg7s?;( zg;LZfvvhTFcU*?`$|eGDcTV{Dk<< zYiyD37cFd&ZlbdT#YYzDF39*U=Ej%A@m-Sf{S=C?!4MguP`HhkU_|ee9+o_(7Jrk`ViF4gMP7rAlj9a zeTR)seve?2lTG-4?PPoZo1I+OTlg~)GZn*UTLGmiwP?zrZ3}J9*dXIJCkJo;-{8QS zemFDWNT3eOQqY}}c-Mar&jVMvJ4DP;?)eX@7m<^_VX9~P<4#c+qAswHA<8pB`}08u z@<9jlL5K1|hx0*4@wrt}X$(leA?pi@i{D&FaQ(3yPDk6~y8Vm`|dvcna74$!|d{n3wL z>O)lR#sj)Q5N!=+0k{|n3KTvIo;?I*{|x9SC!2Y=45VC+z)!RNho7ARM^W=UITq1pa29}>qeA|EYOB4x4J@M-zj#-~fnrDprnWUo)YOCpHJpYbdjl8HdMi3nbmAa_!+N^FPoQTVgNQr~fgP z@f+#yskedk_X5PH`+MowaqKI=YeH`wdk)**M+Zl0f7@4o4J?AB>8H01`}^y!hvMNv z|L#OL$3VvF_)r%5pWH$>;zB=?h5p+vG^-vr7T*@Yi+Hb)+%aTkH0!35I9C44+W`I0sZ%G#Lwv!bm?x61TC_mG1z8ga2Hv~ou96cp< z&lxC+A#R|TF7%hnTh`4Obl=}P$?7Dpw8z``hqf1$<3J6%d8-kLgDv7euhq}1!hq<`k zhr75jMz~<*-BklQP%@u~)`gn1m`XW8rBY@OK&4D|iIlI*h85*Rls?kcmx-Uldv^tr zCKK@@IUr|H$rke<P}=Plntowt08bl&puK5C3inEK)WWgj)x#rvpnF5df$2ff_;kfy=} zKqNe4D^e2~01xvH#>^yFHW`ze>=GHv%*>8b74H!iCZ5n+i{|v?SjKX*U8X!Qr6s^i zmW4#x3bPWc0Lnk&YDLOQvr-uwM(v1?rn$c2cBx^BNvzYDv_uC(Jjt=D1rGL>>d~-| zL}x#IU1_>2Fd0=ngYw7YcQc@wAxNaHGVAo_n*n50#_PZgEYen+wWd=9@|qFF${NUd z9#>3TW7eAW|0YSF<+{$4Rcz-$9#e3&@uIx_d zp`+sxscTK=X$&pYMu*qh!{Ez@F{TY9RrY#saGBt%z~~ zqFiS>FUu%J`a)NLKZ5G+Wme3)EY&qvp{SRoy5?#s>d&sj$aBzjL5M}Nk1TeUvoxrnSK<5A0fTkTd*Um1IzozV zF>8jG*H z#r2Fl(yg>7kt`u}^9oNr_LPb8B(cZm_4wISHqKL@J>?QT$?U0+;%UI1ifud%*%OoF zX~dq`o}R|+sXWrtggsBs@HAylm1Uj)d#Y{~(LU-B-KwQ1!d)8qD^(7EWxqD9Pd%P2 zs+>=;Yt*Uj*xXbUETg+B;R_|RmL(SOecA=A{?L96>U@DzfLN=ef)*R}R)l|peon*v z42q#aF_d%(FB=rWg+K3$D7 z2d#5dJ{4FI9Ptw(bp^;c!3vBrdDt)w$d#cn7hC~om5YU`s~H)^$1e7<*%}ugw5;V2 zEU|&-d*Zk$994Zl>qAg53(y8v;2k&{8A%`X1hgp(jRo{|7+MHua~RqJXiFG63}|Z@ z`U%jsFmwyh_Aun^g?&^QqIZXOhM_8ec7>q?K)b^by*sog480C$Zy2I?hrS6z^zP8U zFhuVT?GHor?$CiSMDGqA3`6wp(4jCy?+zUfL)%dAM*#6W7$kM=qps|uKpw*&+-4Tf z;fvt%Ws&V>iRXA)yo8a&&ya|;9cH(&GyvsmBPlygYgw-NRHW`Qogd_xV?_G5uF8UX zXl?XRJ!zv3>FEL%zT@P5ffT*-ee{JqnECYhxQov=PH>)yi=wl}@33%x?`p(x)xq65zpyF7P*VwzD0-aj$)By$Ai1994wi!LtaB^2`~S0cwBk5>}8m}O-#x1*S4WifZqL|QKLT`J~I z8sOz4smTJ=x|b=(EC^`-GY(q7&g?d=eYuS!FVdv{Vsk+WmiU&Z>u=?By$h*)E2rz- zl*$R$L!^?u0&!hITzgDwo{Wp%n$4pXd(~Bhvt1W&QoE^ja@^cHdk|rcn_FiuMfj1s z?ma}P{erU@M7Y;IbZeAYq+3AWkL5NuA;J_2Pm#5UHuSOZ~@}F;mY0t=XY23 zNjNvb!t67hhgBX6ER5x{b5>LKo9_KG&E4TNQx2H!-@H^Fk^ToWyh>&g?iv)JY8g|2 ztK}e)A5(y;<@H1QXJTvt`aJ7T9xndFI`kMOF(G%|zgz_n7cl6$AB1LGTaO{w{t5() zaw@$|ZLc&U5rKUybqAS0XeyWT=x}~nobq+owGfVy>4*J&N74}*n7+^|@8eaTx!QZK zcPQm@IPE+tx!U8oTy1maYL7{-_FJ2)<$ch7&ItHII)Qn>0MG9bT+pH1Ltvz^ipKUM zmw4rni3=mNag7Jp)00Jx@rMaFunDeZ^V<^~oS1OL#AT9tS1DJ*-2iSWr9R5@w`&xZ zY$dZkY(|(#C#XC_O|I$hP}4)%`UVb~YVN~BO=b^73LtL3C1x?;|DL+QNOJ|cfd3>- z93xCN0Q7@?02T>2KmJpC8y$-IyuCiHAGXA7=|7_%!R#jeKN8orP|}|zc5N8r>${NA zbg>h%@bh|M_><4+rQqbG$Kb!w1-%j+$kU1JWwFOBlzd5&U6f=mGuclzS-|}(uF+Gi z+HW3@swslc0r%Jy@WbipmO&!W0#GkNyx+Ce<)PF;D$=9CsME1TZ#OfFecS;$mgvi$ zcE?=O51;k}^s@RHh6O?W-9g$R4Um)r^HC1UM>*IX9E%TzxC7)2B}$TQl6|3J?%)F8 zhRdK4c96(8Y8G>{s=Bv+DU99npz&70pQuFR?3h{XeK)mQ#SQ-$5U%a<=+Wzn!S|FhL(7V4|`vdhrPcc zGcU=*-WxhBas-`p!MojA6lbDrOY|64DH7?E+^|Q3I2z%mf-~uNB2Q!Tq?`I*ifGQS zgZux`kK*W5`v25N;EdHt<{nyQz6t4Myl5j$kNlOr-Y$;fTo6_x}cmEhEf1c2Sf#@-u^khrkk!a!W40UW`?2r z^P$TYhUl{G>@Y-k(B=Tj8&_Z8<}!|AZim$7F+B+ea{zrAhCT%}KLoLYhGyQ{X?|IYzne?VF zbkpjhWH!bO$Zb7Rw)Jha^+?&)cc}43<+k-ADiF)L?6zL)#%3RJG_k~7W?JSl(}FQD zSF$X3^=~aPFEaIaG~hk`IMh-i2f-h#h`%N7U`;qn-GN(hz6w=AwssQ=B&dQ5W|ijB zEElh|FbHebu1PVmaV=?Tmv8sDGk`36)%136;JakfM!tJP;rq$#3v~BJmM4ogfZZEM z`L6H`-MvY)a8oYa!|A(U%$V-gJjzr!mVUhZ) zS*5gHHpYhASfnp^XY%-Iin|P4r`;tZcpvT3UDoOY9a>MHMINY$T75`TxgL=uFJY!( zg*yTXhymbt_0C)Me0ww|SSbkxN`m}%{+VEvBpAd5NB$#*)skQ^6D-sIH;FZpV2F(2 zKayB035GJkjQ@yXog^5}1Y7^(s^oe%&6{Eb-l6zg=X;Eg^xS)l8>pk^-eU~XLzx@h z%-V0_pdK?csnz$j1Va}VH%oAx9lAw=18s1t1drI@HVKAqH*S~U6-}xJ?Qo0qo$j}h zNhLFYxh^v4A6g}{LL($gw&i1LzgKhHZ{1kIN+#_)RE~)tB}mkNe$T&f`m#7#*3^%Yi(O4&`yQ%wul{^7sYk zk@so`+^l4E5MLj1$MDxdOEiy6>O)^Q4}INSe%+V8PM2R(LmYOui~0-uQOXz?R*`z$ ztm0F=)SJCLp`{;ng8@giHM2z9$fSN0XN_NZFkbs)GqKvx6wJ6FIZ~!4Bx|Pl}}71T)*G-L3Jtm>e0A zJj7AG4H(1Wjs!R?1aHC2_D~0l^M^USz}uxf!zICb5^R49`hspgVL0o~CM#d(+#=(K z8TY(KlbQD?WE%JXK~-w9AHII%Yev2i@Rc2AMaS3ibW2nY2NQeXnZ}#={gZOSs-S$QM zW=P+QUf)dH7bDzPD4w~Nw_BZ1Jg8VZo&-FgNe6e`67hhh^k6|Meg|L7v!c8CLtoSn zf01nAasXwaL4+rs6oI-mM3V&YMXA@Y3vy?`r|$ym#uCCr!KVJ$?-Xu2F>`mN*jHOI z-2$Q5Ukb+_w0xx%k^^^Z7U6qBCjoJ{lqlZ{i^Rg+QVaW5%5tSe`&L=BP<3nW74ChM z`cg{$IK{oe@+MaDja6PLhK*aS@U5{Xq1F>CTfVhcfxGZM6Y3j@Rib_CEfV-9RxKgi zParU6o#ieLx7gR#R;6A^-)f~dxRiHxpS-tHdt&{>4LGXl!)w4#$@eVeTb0Fo*T-*$^SY|=B9Z-+(P zWl|MX=v2zWHfyhvR2sEJV&x>SorR<_EtGOwtV{HH*)~eFpK2+o+%l!yR_k{{mS1J( zCaK~&Md(!D+yHo}l5%VN-2!t|gYZoIqSlDqZ~laL|AVO@?+u7 zdP?Eq%|c%El=>9MZY#=JUnyQ%A$fx{8FAPjHlS|&CXws`Nn;`*v52!tE=f}&8B8SK zSkca)Qs^_1LO7d&Vy{Ib-kFk{kyHgWvlhf<4_Q&g->^Gz@pi&@fQLo#_PXyNw@C3f zEl>Q=EW94~R)lb0qffrKqO07;G(mHFl?TF8f~L+Y4=qng>2Z0M(G*(cQG{o?^mu&V zS?v2e3IbY4AYt&y%0S;&L`k9Kl*RV41I$9f&>^}FdiFIGUrz-FJyAGy4l;h zs%C1Mr3+m%bq57T>1wqinoDSIMT=0i0-EO0wMZC|qQGLh`dJaJpwOOBv_h&@SksE= zT2Y7gq@hKdGV&6-QU@sk$m z_JX0+G&P)B@Mj6SF-EJUXthO27fyhXF=yq zB}Q>pkTv40C|t?gQ8mt(DA(a+)ejtZXjp%d+s&d zXwK&!dDbdZq7hm{D4s3KKvb;r1xxX4m6SD6XWOLr#lnhbyE24mYeg%b9nxFdtBA<@ zQC6H1mGm`=V^xFVyPtj4F~gYL=6euOFgZt6R=OILrD42ExEfU@&uYunqy~A`M7aX- z<{;AGRaU!5OZP29oE{99I|q>hOHm#|CC4<;XHuZ~pwmI#(a| ze81k+mpwmhaP?!)nT@Xg{METlt^s#+e068*6ElimD|IF^nTJK7uRk6L6C3|B_wp=6EIMq&fLW+}+#1M)h0Ro|zo={B>ca(&31PEN{ zA+&@VAe5sV5PEM1gmN554fR6*ecsGE@crqJ+0VWyJLS!rH}hsj@%7(9p7R+0geUMl z?mR;r&+!M)&a)2XBEntgo)d}Y@P6mHWt7_}UkV9;Ve}U8lKB9AcCv)>z0j&P76gpo{=h|)n!DK3`>jP61M2%Qt6u@r+D8G$+E)RW zxqF-XZq^>e5Bl!R+DicpGtSd))Ho|SWjR-!#YmZ#{s5w z{79;-gK{y4FSSlsOfLsA>m&tCW}Ph2vQBGIf`hx6aiU>H{^ErH$(^&Q6~j-Ed_EB| zi!ThGPT#zDJ+HCWJVO04$E-bM#9GtZO9994B6Y5HsVr7~skOi4=!TSafC8R%8BEoT zH|G3K)6`?Foryy7;WMl&6zH|CTtZ>;eb&t~o#uY)mK-&B%TnvM;RIR-{Ca9zZmqAR zz#~`2Jl?avlNGPLQc7td!kxpRzTd!%!(S*+MjYQAa@T?z-7S$k&=6p8!5J? z;BGe-DPgJr5!X}&h`1q3@^U2Uupo}@vZ5>C6#qSl6D!Q!(CMVCtEi+-1+%V}V3=W@ z^%y*zdNbxZRjTtj8D?EWz0j$1n04((y%Cacld7&IeyyWvgTkwbC# z4)mux_kw5mZfJES`vct-zB9NC&(h?vaFf&{S&-_pEO;v1;?2Rc>2ZH>6&~*6ebH8H z%J+cLHdGV!q-Y1KNr8~{AmuvR=~xeO^z!IP*ZPN~jPk6rUZGfBxtJFnqv|6%mRXNb zeMHBhKBQcTj_+Z?pAfL}i#hR#^(b*`9AhBEQF?@Z zD%gTYsullXW+b>H8P+I5fo0K+Vs1JwoMb~3lyEm4<39*MmwV}Az6@H1k>uUZ9#jk? z#g{sJ`RHKhtaFg6;qiflW0Z48N>QT%eZ*ORJ^4)HgNZkcN}f*gN1?YERnSw*_(hat z79Xlmu#uOhJx*0&H1TA5n1Xp;magPCQP^hWB*RI-87(}Q&MMf(^XX~@+j(cYM!^o= zoz6)`!06;X=~@Lx^8R$4f}{BIbiGu$j4^ywx`E$8pBTs2rH6CsQbsr5oX&IVRK|Gz zaJpGhC-5iJEs8pkzkqr@4b@c`<#}!#XuViRr8|gO|E7934j!~Vo)HE(Y?bxvwN#e_ zYpmaIB5?RRo2&92x!zij6((k!vN1Mj9BpeVd&e+aSLj&RHWXT(w*v~T=&=j1~uk9U4i;b zoT53bd^>1wB@WagZ#sz;n)51&#KiFk^O}zg=XD>M&Ko`oLGMNi<&ALOODxqQ?>dP? zH0SLeO7>7hen+CiG?N+s3Yft;pu4{;FKSiVRuMYzSxZ4H>NI0cQHLsF(Fl}q{mDe0 z?8f?wMp^%Pj9x}F>%UJE7-L#rQ{@(o^{j8GmlSp7Ejd~jjqkL+_0S+i6MLO(C&g=oc}xZB<0R_jv|3&ris`b>fmruF&fA-0KogIT;)P`6691NqWx6rlT4Z%L&ZgG;LXF}S44P)V0$OzS&}Uy^mK z@2L(4Kp^zQ2BMOBa+fgW-V3{KB#Z%Ul8uZ$D8qFaH zRGKk2USTKre)I;tLdv!HFpMI>29S!H;bh|6i5FY5r&AaVWUF^2Pzq&yHU%M7D7YI? zX|f+K3z8HJ9t4=pl=57uXO~DRR$7U#o=)Ma-I!CFv0W)mO0$S#UIBVJ54q;`0BLSj zSEsnigB$TyRmE$XxNDYx4XJ_6QjMh>xrAk!>Bz2Qror;T_YgcYk#96E@q6tWe>^cR z9Z=(map_TZJFkU=H!fRlckp&XYggJ`s{dcH%I@aJ6Ya{2uq69OgJi~G@uJWk!I!`@ zX)$}WLbhg)Q7B~CV-*S)F!K-u8^uGV<}m;xxs|K#?#|Z7QuQ zHNnNScySDV6FvJPS-RBZoPDvZ^VHNl8f8f_e5ZBWCnz+1hILjIB{r)s=A>q*uA7=U zB%D&cORe=2$$!B>tUEQ=K8~M73Cv^ml~Ty2=I7Av`yxc9kN1{!+f(_~cqtnXj+u;% zlud9IdzB$a^Er*tWs~yu0=|emCwD6uST?1HW#)0WY?R%@pP=}onLS7HXW1Cjo+~HA zWn|J;aUop2k_H0G_#ryD5Qt@L|eTZZ_U_A+*Y|7t6kpUhCRR6uLTZ@2Aj>J!quQ zDco)S;shTJa&e+;!}O+gnm9=|Z2InvnmCyoXpZ##n>BHUWQz1Z9@fHV{eYaLzkE`Q z^`{@TPm#5reuk-8Uiu{m3mw!D={GzqZ%FiB-ab>IPr4Nkq`&B8;w<&i?KwRxm8$eN zoqAYyz4W&|dVKxfaikLAy?ShU`g?n&&!$=B9U8N6;{n{*ft_J^ho< z-szux_D=sCvJaIFl>WuB5A#t13yZ3tzvt7-6ym%&{Z|Eb-jY5?L4&uZ&*kzX1-vbN zo}vb!=A6%IW}PAuHRZ@(kZQh$+ttu_d`_dPv+zZ~1CT&Fn)a(I02>PE~ zQAm^iCslW-d8Tt#AGJ^!cM@LO<>^JL?n)6xj_y$59H@0CQXr4#6Zv%7pNOW*5k}53 zpwMA<5xfFnGW+s%(JSn|IBCYwE18@PjRw2x6-GBIZ#>mw}v zEmsXYb-TSnCEBw?94A%Q^e!f6!9w(vA^|6JI+$aY>hbB>%pO!<*wsX5>7x#{r(>Nf z!4empMWSWYStL3F>uC}klV`y_5xg`>GM8m8;h|KEn)0Pup(@Z=pK3Mizsc%P;Xp>s z6;R2AmR3?a9f58&#TIcB7vS?k zua}EW{A7Z|)^KsVf|c92xPz}EYE@2S-eyFSpDmOw7C#>VrRWhj=F@Pl=Y_>Fr!a0` zD`hkeN88u&kKj>=OCp2+1t?9@0yQ>s!BHtOkCc@^rRp#*i7)!T!3tnA2WKNMv|)$o zE)QBC(jQ*pvM=jp3Rzz0V8p_O5v<&D?VII5UT%B#EwbR{p}c*oEO>di&Av?`(fOy3 zpkTD(IrKqVTmM7vD`df|;F)=l_f<@{H**7vrxm*}`vJ)`6*ElC|KVRT+le_9GnH_z zn1umavP;DrPYt0J^YXQyQ@Ht^F|T62np{;ZU}_z-Vj;ALU?GyuY~d>_I+WsGF#^_D z*;6VyP5VBDFw;J(o$@da6YPr7YS5?{gYle3iV6(E{s+5zYWJjY6MAEv6%+jLOk~)z zMQec-lN_}uTQS*HT7AV759Qve|DtU#rTo0W*Be*+n%gx)n%lKQn%lKU`St+gy5&PU z-1R5e&&!%OZa8O1bGvaB3x0y+s$S;7?eu(=2Y1l(O|1uyW0UvpMf&(^^u4r$=% zK-HvuH)ua_mXk>TA7@#Kj2)cSNEG;lvkbL;<5KK<+~ zpTr6HO#WkToXC?a5GYAAL>8opWb;SZNS>rbl4SWvQo^j|KircaYyAX(7^HO_z-@?% zsSdJOr@x38eBn3v`;Yp9AK{(~D^^1gMHnHAVE)coC#BkkJW9}hA;o6f#t#7boMho&V*S^H8B>m&||4jeY#8p@|l2{*1FSRV%VWnm^~P_)qU6 zzu?TR3qLO_0sH+9skc!Hhsa6@!7y?tr9Fy|4o_r96J(>b2EjG9O1?Bwp+zHQHPUn+ zjKGd6bK_RvXw$23V?%`|@A#j~DJv73s?Gl;#PjNJ_KR zPl2i^>0_$$G8xMc*|-fMQ!=~hCaUpr>C0qYSFq+UVNCr~tu%kdSxUaMW^8Fp`|vu> zic~$=my1#9zsgB~2i=D)$|w`=G$=6AgnJIwyr&JIHx^t7y`dkPPY&9_ zvU#AiBRuo8tC&6>z?e)93+M&Bz%YZ#cbIk+SEy3EO4AOY7**O;`X4cL77U~n$yU_1 z!+DAq1%TRriEiaF^coIhUi2mY8$lTJqA#nEFy=*HQ4q$w=&PJl02uS4uPI2zyqN81 zc^)q$6MzO|Ufhz1jCmm{YltLUA~c}sci7=ZWI(@@*^!Y1Fzt$V6Sy1yz&@40X4fvF zNcz2=T|A2@_hTk2!In_jk81srwBIeLx%qu!sRv3(VMT2D& z4#vEqYdkQi4r5;Nb=VVyY{HmVe4C6y#=PQ8Z&^3alwT=NRURMJe1xKAop_ z(NZ(?)J!8aE0CI9km?OG`LX$iJ_gG?sa-h>;r?1?Qhg^6>d_b5eXjxPOPIaK#{~8> z?8UO;4>0W|HxuQcoaN|C?fvlIj7&ce(@zDkgt=6rWu5kc5**yEKDNjxh^Kbrsogd8 zzOPYGmfDl2_R>;&8>xOXwU5IB`x|ELNCy|o#g8DqlCmXK3SM+i2zhuUuU@a$*rz;0 zk|M|KO8Es$bTbM#ey6R&j80Z|eW~3b`&dKDZd3qMyw`}i8*_d)ZtAhmkWygy4Esz4 zdhN3qF=4*XzF4Ny+;9KwF`~3AwbwjNpmo4+y|(4{>IW&okt;1v@37ZO_J!81c$UnI z$wRw!^~#?GmO6V7sO&fbE8C*}H6* z7ej3bW0DouT^Z`8s26sIQube{q@fCC|5buvhCR>^&rrQ-d7&yL4nkNmIEUmy2c`<&)Pw*@x^I|Cs5A4dqJ3~P{ z!vg=t!UV|(7NYtr4`HIl+^a%adR!aAJ%KEFYhSq44zC6bx1pM-e}_9zO$vnU8z|S| zPRCwP2H5aO*WMs0qda?HfGAx#%L|WD^${M+?3<`Q!Z0t|Qc{IsUJT&?Ju@$d<6bXI za-)bPZ*d~RUVR6MktnmANW{LGxHST`pM{>Fu(yYv!=s`G=0zvLNGNpoOc^dfu`B?y&?r+Ui6CjA`07# zoVc7st^@O;SE?Y)i(XPem>0b=1z}$FQc^X6hSKAu6@+=wD_0QaMX!QW{Wvf$dLCa) zpMZJMtK!t99GDlq45v=zz`W>X6&2=1uUb*1c`;Oh>WTzlUUUw$@7qFkcM!8*lj$Bj zXutjwmG`h!_7}6LE(g}wU(F|Q_&WP*S<)ld+pG7ZSf^~X2A!krZ-}iN7#F{l0Jg>N zB!Fr0dkJ7!{9zAD0*1w(WfHI}{vrX)ioZ$#tKx5mQ5Z5RCSM(N_Ops zU{p-LJm5^WxAam5r!f1mg9%JEmH2R``7+Dd#j{nD&&b%S#b@N~0ha>z<}JsWrTEmD z4XGeUPiJno;!|hW9((n83fR|Yxy}OnRN43o!HrVPKWaFmQxCAzgFN++mU>uE{liE- z5?~>!#9_xF-b>MCTI@wPdXg4@{9?REVQ`G!iT(O4N(RSaR{}j9Jy45nb)qY@_&-TV zMvq6BCwyeYpY)L#f67N87J3QshP@5vh3HZ(_Pi54M2kQ310@TCWBfUZ$lw@wHeiN+ z2R-@u@>r|V2xI8d1I3tE$2v{RiFK&b$3~#^s~d@oC5QglDEo~g=mn;Pw^k5X!Z=?aM|Usp&}87k>S#5e zhQk%IOb1)>h-QZzU7?WU7z)AoSXIcqNXibsk1s^hXqqPpRAMi9q{1 z=ndl%!sHm29ZMsVW9WPYuNuKOI+yr;dW}EEIF}BnF~+&{D5sXciEz$k%bhy@Z$fKV zI;~2eUa`t)=v2>g>iia_Rm0~qswpVF4mdc+&Un-s8Ix{(T(y-Erp0iSxu5@w^ zf1f}-t#oQ0jgr7rvvgXwGoaA)8TP=-NV#-YpXHR!P@T7Q=8)(r?OkfG{+9d~3|QTz zbDcx^2uffcb1smhMk$#bLosBhY6kChyPeT|E?(U6;FIqOzzQle=^{tduzwq*NqJ{F zw~j?p7z z!zN*Jj2_AF#A-|uCdcRs$rMSL9E%37M^2J3Ia>Y6N1dZ(ttX#hYA%|5$#ITRq&Gb0 zScTrpJI5*XNw?yGButLc zoD+Es`TXiyZgPj+MFUOpN2b*H?-pbzKN+xO!#KknJ)_!CX-|2Fz)eWm9x9-HpvWg7AaI? zfCnkTWUcA!p=zwoarX34!r4plV7)uUq4jxZZ$)e9ar%AK?>A)Qa=&StPH^^7)jNDp ziLPYxDkXZ8%@+-|ZOfXWwryGKEK%Xx);aqr)V|T#pYKV`Jn3O8pB(2LpqjCZIZJ&6 zg_6^ZFgd|=4pLk)G3PAvQ3G=hRt-CKyK{(2v}Z^3P^rcy$>bQi7s;Cs!l_!$JCn0i zk5A5K&QaFfKdm9FAP&u;B3+g)A#{F#P;N z2s-#fa#Sv}J?CLrin37N`G+h;S-8!4L?PG@|M&>(Z2Yr?6_uFmx;LblJjfuDyeO;z`+Q8rb()Y%|;KUKFJy1=c-WU6Upt(mHK zZsPAyQ1p{q_`eA?VwAs^CON6$tDM{9(snAp#@Wavt$CfZiGM-iTGrdg&`c|ZK6;Fl zJgJT+ojVj7u?^iq`gZOpl8fOfoXUybsc1Nr6TM48oXUybtsqY2MDI}$r*fj36~w8W z=)DSdujA4C6db>qNAFh zJ<6{(=ep%X+TiskIO}DzJ2#v&qyxfu8TtUpRo~1*pVISI9{Pr!w{x9V*L^+=QTzX) z!xyqp2|TM_#O9Uh&eQxjyrg$w&I>Y==^3UyFp5aC9m`42R6}ff78*b*N9j49QiRg; z@^$-CxcQxym!7Yt&FKY9t+}TcLf;6TOy7B)uS|ES30QgrbDoiHp6)cAXBEO4%D_#O z&^Roeq(`fvKRpIo8L41ts8aq1yL;+hrf?H_tLkNp=f&k}5W2Y@OQ z!OF99D0=8+IL+^J)-3}ddN)NMekErU=xf8@!(ECpnU-ywz1sLboVyVbNwHU{HxK`S zv)8GEw?4++rswbvaZQT^F!+8%fQ87-|C_T#lKwGgdrCU2zw8!D@)nsSjBU42l8vyL zN-+FW&Tf-YU?trw!RMT9k#X}dj4mhCh~y+-Z3Q9J9bX9Zr@`A9%3?^F(4irSDf@1R zj(i8D80s(}%6)1OcJU$=AdZiB$p9mev0_d+>nwv4EQD-k1za1+=XrP^Wj>AfTAlBR9oh4eh=kkhUPn90p*!*tfv1#mcdH@9Bk4%NF~W8f5|I?v^XM2Rgeyw z@)h^)(A1DVbtJVhUs#~AL#Q=+CWH4BngZ54g!p^f)TqXeBwzXMQS=$Iu}&X75%tFx z1~qnOPY>dqDN~ph!#j1sv11^)*tF?!jjfeka_ra{MA!w_D_txJ<0+HlD7|CwM{Bow zXoCr~O9OWtz)Ze~&qSYCB>TinaQq_K>Lb8yd-Gq)!86!ju$N-}?>OsMzQ~4;kbU15 z9p@zFi(Mn9D1==jrz(V9BY%~sX#@=KS1967oL%V?!Eb6bhLjrdGiT?i5D0tz&ai*` zBkUy-qMSO_-K@z#jI*{f+@*uMf*Jod-kwIeZc}~TL%}x5D6-3?WcW>gbh&cbl}$vr+-J)vfH`VHLMG-U6s?|&c@AN^Y9#<*^}Jt0pwO6PHxTdniXthT9u_gmBZNa3P<(C*VF$l;JOsn}3Vk=8xd^nqLxb`3f$6lG}%YZT{#} zrE&@dR&gMaw;*TCUB}*i%Y0w}b1p%0}$y0NeT05#T$Y+6l&cT?H5k&U-^bSx<%R z+5anl_mc8S`dRE9)Gt?*@vDbHxkr!3C1YvLu97+<72ViHN`PBy*!Ng2@8*bhB3(6m2Dfk<*`2W58b_zU39 z<9k3z{7iY?^?2mTX20lNv*eI8TMkLRmxDTbjvSKasv$|r`U!Fnn25F`fhwizB;=H~ zd`bVwtZm9@SxUP&@=X79#RjGV<7->rjGmd{3nCgG^yTxTCK`V?W8!xnnmlG1I7M9lN_4`&m*+ z)%c%OHIQqP;nS!HG+fcxHC+|q&!k<5L|sjV8lHiK2Z=Wm1*M(T17j$-OZB^i2Q&tj)RfN}EytSZaxMLSyYhaabqRxtE?qXq2&TiT4hKpja` zY#3ttWB_9t99S!cwiqoW-+F8@`ok9+uq1Ujwi^ZY&*9G(c0(IyQ?Xu+j}+ohxF)jD zt;mOElWJ;&Wb=jSzsT_6XAmY3Qf0K?#!CUcI3BaV!b=b@=%&)cBs>ap?*KoZ(}%=% za?U|8aXB0oC8Z89fE3|X1q{>kxtx_V3ZrT zB^d3+LlTV1#lsSe&BuiV<2vIJ3A(!Djsz2W;!z1E_QqopOzMlrhtnsf^v8=j2=pwC z7t60tA4rr)u#3A+kGrGEbLO$}(y0VyEsv+>5tuU=FJDMt?x}H4hM9L-eAptQ%wHL= zT0&sYRq^b>1omDNuQ`%H|GIds{MtV2<8{XoW#5hQ`r`>K-W+d`pI!2ByitPvAB#5) zlGoBF4dkK(Y#6y_lbq=S<)y{HyLQ|WjKuVv^D#$C{Ow5@+1i@_<9$RpOMpQw8rK1WlE*L8d&6i0|U^)7vY3!mv zDlmi962-m@al&A5-U?=w!;mBiBDE1?AA`>kV@Ftdm$~VW+!L}`^lrqT!be6Q#B*|C zsNyj^C+SpCvMZuh_8YG{^kfXbvO~AE<1Y|TLmP53&-bHyZ>5ghj0D-=s3VUBFc1s- zJBB)P5Fr?jmX??}-xcJhshNeki9bgR1cF8(dB*5682o*#8Rn+Y%!qC}h8Ybo=~-sr zG8in}nhC7qX=br*mKdfRFiQ)}WRS_k%W)ZunPO%dlQT+h7%qb`E3mwV4bt>pgUevd zN^Vx+Z*UDWYns(KjYJ+zxD3Y3F|(GVr<(P;*Rvc&3-x^M&K;7 zm6_Os*RHADjWo2UqWFhjy6r_~cZ{KZ8#PBU69a`Lj5oA~m^qf2I0@IKnccb~PcpQn zF>?Ylp|s1q>|zuYo0FM|D}$zLW{+-8GtB9JUgjIYPICsse=3@@G;_9Y_8R7#fH}9o zoEJ2A#kPGa%-%+Ds=0uf3%S{+nY-!c?uNN2VD3?1?in=q@&g@!TNccIX70nyeKm8j zVJgp>OL`ar+E%H&(+NHbn|?}Too`^7pQMsVua)7 z18P5^Z^3jF+pvjp3)4}gKmMo~#?$oeXPCfActS5Z zqDrARJdsi8y}YPV=#%d7CK-%uM>+LX*p6b`@P`>J4%<;|OFN}P$JMr$QSr!j6j>hs zUev0J`GJW#-by~dx)C?NLlp4s6!%9a0vu`xi~nSV-?);h_GdHvrUD^ha*2L%M4^uo zOw_Bg{+>_h3c-4mXiyN=qeP>EupT9v)K_3V!Zvf+9IzfG^6HDQ9wl5=7+8-I&Ags+ z1nW_vMb#UuM~POIe`!6kzeWLy9_Wp9hyM;4z#`+(+@BDb;3~d|O!UI{P)$W9<-_+i z5t!T^mX#BMDYRyOW|H;bZ-X5pJ(A~41b-|_|lTDzMEP}~Qn=%$?bBz)CHfZ|gY zzMASm;O}m)mEg-z_`0i!vfT;aC@J5#;SG}VoyY7;;Z;m>HgHYAuy3F@+A>(Q-W8kt zH1A;H>t*71nc*9rrKDgCwJB#dUDZ|MZi9PUH0e^GztyQL{TlDL$8ae32Y_T5F&0bR z?T9?=11<_GumL%JmqfGy*(TOZ-Rs2u$4&Za zju#>JKdvJLGhBMZ-h^O=^Sn4t{yis|4_3IeVnedRrMI3&VLa@K%E!|@{k-gVu)?KZ zmPlIR>}wFF{9$_o9!1Y~CQ{)?sHzhcEc~bh!;J8Tt?*3Ln-MQjrPw@?Vd2N(l5*eJw{vb-1$H+#_qIt$1_>BKio3vSj?s(*#mHj{=2T| zituaq5xkOxKZIy!Mc4L)KgN~JXyE?v)=SCjwxyBIq7C8yP`sj>SXkCc(amo76Jqir zvL+UN&{xzNe!7C*+nDNnMIC92fb zq__LXOn>d85Oa4R+?SpwE&77iZ(rL2aDn2*fx8jV!$8`F|M!V15kFuPp_sq?VU`F;8zm5%M>H|^@Q$r!cxfL!Za~j)&Ooy z3tx3B`Q4uvW4J_HI>lIp9_SY1eAFYleAFwtB}3raG=c3aC^&y`4>18B270JpOjij% zvQ%Kl3id(a>a_41GT38-;WrgHUCdB1A73eYIq@EU;v6wYp(j^~xw2YteHu6@NNGI1 zM$F^;qNKP$&F3%v>^iY4znW;zT`T6RxX-T_3-}z0@xn&YuTpt+v)D(W*Y6ekD)i=k zVzEO1x?e0&ao^h#-Y_$Ss6RX$S;yZO`$?SxSE-5p75dmgLL^%Fe?4)4LZ9V*&4qu_ zEtV?U_FkxAGTb-)s8or*9S{d8^xdEmR2-);qRaR_lvy0Zh#sOK&S79n0WmM#sun#= z)h142V6V+P=I=FoeJv+I56Fo<9o0I~3GlifSp=sRH`^7{~m%8ZtU=h_v zrkLs@NA&mzTPi1WT&0GNO1y!))X-5CGT5+5+%W7Y=%Lvh*Qxoe=P{r4JY$IUhM8if zVu8w#n8ha(BUL#{ed0KXVbh+$V%h~A+MDD0G_jE1PGOcX(Z?Slw4Wh%Qw7Earn~dA z5foRbMR0|hSR^F}?obnZ_{d~pPX(8CioFy%xSQEq5G!*qw;!Vqoru<|@pXKjW4?hLjqVc!MX7kdhELrw#R%rXF#m>T|FyXTRop7+vMS#q) zJbNjg$MI-cmPXqZ+-bCLAfFSseH%Sb=Jq}GJe^l_NOdeoJcrjBKL2$*SPuV8T27sy z_8frsiDZ8aH~STwLv(YB0|zr~aV{sl&~%wNj~|U4FJ>7;sYVjTOhJ@tl!lp3h$@B3 zaqYfB6)BNb$it0qS_`sn4$Fk^l%TRr)F@KbB$3nPCo;Q=S`{JNhh?v~V7D`?`&G@D zwM#{#MtXx;w>*5sg-{;Mrj>Q3SudKjIvn^kG5Y*Zo7@1@h>>Cy4-^3oUnQ34N5jl- z=GTb*bV+MoC-&FpVd>FqSr5@ddXtH8Sv@PO56^FJ(9Hby^i&&;0ZHt(xAZ?47r66sK_)euj+al&EDs786SeMmH+am1a zQ03Xv;CNap>Udg?r>a$zq%eN2l#|s|&JpMHePU3wYh7G`N(D~Ud62J^)l@ykGzl8I zAtEJe>=WN8)HEQz<$I%TQo~mYoGm1jUxj185}~e6<&VM2pK94CH0=dKt=mOZHdCr? zhlt6hOW}}XTzdx#=_xwoSf)LPwoB0=$CL_5haA%i(jmuk?HLM7ha4*uq(hGO{wP8H z`|6swgqnxbJ#k8brhDQNtN7hO*#Trik?SP%F3?dTrWAWBI}47WT7f*T(O?-g~%1Tl(Tm&S|Np1nP{OwwKUB3j22iC^pc=Lyuv>TvEi!g#}N?M zvEioc7YVIhDZWtM>xxz4OI`xGPS>&NR0)1Hhd$?KWud@cDtJ~}OklebAzKsJEJY|} z2<(<3gtHOZLI8|TrP&z3f4Gwy_A$;zgudi%*Cu$2~-9 z6*+?CfTw37p*Z#gtI;ctJ;4}KC!MkqM`6l_9c}n_7T%%FX}tk90{C#08U6t*%|z=0O=eQbNvaTUNQ-84jK|N*nDf_-$Pja z4_Y6GeLa2OAod*u!qDTSJtQEo>MQ$6AcD)aWDN!!Fm(l|-7JA(XimzS5lHfU(@97w zkmjAkVg2Qak=ownc*ojrVv%+)iV>g_xrr}jr3EUXQz@ws$Y5>%D_H@7EY|k7%Z3b8 zL%mYMB2dGZrhldX0SnYZ(MoY2u1b8P(U=!#;Oi6LD%iwtOuQrY;Xt0>oZb+n@{HmS zd%b}cUzrTFB1bJ6HBF!meYH)&b|{43DcA`u@OuSE@@^KFDo0=pCiU^Hizz{zVB%hP zU>t{~g1Ty;3rQ-QN?<&us`zst1PgU)J%JiATzj74$S57L&DiiT2b|F-<#yxZ=50 zVwOg0ZGjgyi`fdj_;7f`)AZ^8JQ-ORc-ha|D@^pNe81y}ISRe&iMa}G%Zqsmz27Z% zRp^6WF<+q%`^5rFmH`8+6QWy_ z=mJ-a_fbkrQ0PKWO!QHPg?f;U>%sVSGT_XGAP(RH6 z@S|!Th>qZ*PQ5A=(mQ%K3W+?U=T8k6_I1AxkP?Gt3fR8r&Un^17h(26(9hy zxKyhrstK`pkV>Ht6X#_rfQ6gY4^}DI5Rr#ytrRxQS5{rBO{)fkAlIrM(9Wm@j_~zb zd_zMeU^9P1^R{K9Jn@XIiEIpl>{$hI33B2&1&bgXpI5LL*?vJm7kPbA!BXV)B?VK+ z;L8dQL#|#?unHHvzp7vkGvwD4tiufXbp;#w#>5*6HsLaLIdW$6xIkS=-)t-23@i5g zlxc`_-RsY``zx^74&?bw$wJu?7@OWwkc9Z#3Xa6C9%j3!lFVM3?a^~z&Cbztf6dO* z^FYm6qYd)x-9A5M?_uIl?N@kZH=ANmBW}yy>xfe{GI?b0bH%AX^2BMHn+0u44!g`G zdLS>(mE50ws8gJ$VQ^sChsTKXwMuG=N4ldIXrx?bAMNJR3snO?-ov98DfrJBJbJN$ zPxSKGhF2&P&-C$#lie!*rm6^=GhVs(re1M`Lc{yR8~TxSwsin`X;!@` z+kzFmBemO!K4LI>oGN$cN&^=moJYjTtBi=39WPGM!1F9Sfr%3pnrMoXv=GrILDh0r zXr_@(hPS*)k;+)~SgFTmQ_P4iS1@g0y7_N-OT};yXS6jlTP%)JbydQ|(F(Z;MuOB= zUv+9RAKPhsFZ5S5(@o)Z-Sq97ch<};rqa@~w_+wf8GgmnDezyk&TPLpUAu%rV=?{= z?RG+oO>w67AfY9WI7@qz(EhGisqG-Nlos@4xPx=zY!%}WSgF>+Gg(GVB286g(tbt` z{v2$l7qcJTiOXn^|8uZ+;ng6CG8KuWgFRG8<=6i&W)r9?I@L%Sv0~W*3aK}N7iFzr z?zdWVvYSu}N+^3fR%8`_Vyjqai?%NN@(}Z20KQCniX4R#kJaSLS230I&B1@?tXEDHiOXkqr{D}PO2wfBsOUK5N*<$=uIlU z$ygCx#}6Um6pu%5*G{C&?2_jZv${vzAxG=#X;^hrXu82-8`e>fy*r^|RL>N5$-Z2@ zE5mXQX`|J9ILMbodwSw_h4#ubwT-8GpXE4Hd%2b?$YE9O0JLF2EmI>+K^-PNKOyOY zCQNz?8dT3Lz}mXv=z_e58fub>s!-k#w<*+&wJYs9@@)yJG;Yyq zK9FD7sMXwK-vO`CX7tLd!s}iG&R)Hekn+bHloS}uD8dSxjMXh%}7 zoJr^y6ScY?lGju<1+r9*=4$2Ps)bys3KNNW7PkG%lM6#O!f!i>c^#4*x1GG#?5vqfhic|B)XewrEB=WBKc#hN2gSqMoH~R) zg^4E=I*sI25c*N}3@{^s8sg4{&cX7lcY7Cv}ibvJBI?EdxO=stZM$_4t zuRKZ_pVtX-F~=Wb<_^u?v-7dq`yu%+>WlPb7Y+%AJ|-Sh!eTd9Jg(60dE_mGf+WlS z{~TBDq~h|{ow$s0%0mCub`A6m>DIe3;m;;_H^jTzfe0K}ln|fDMhooG%R>Lr#spf$ zduqzr#>6)5G<3~CyCdGm^a!XUAwJNaB{aenA1bAIWJ-Lb(CD=Iw@Pe`7yj-+O20b; zZF`)rZDU-=JkoYt;$iHx)QZ=sHdGt<{70vq@U$vMxB?pEOz*trP*BrjORet3-i9e_JCe zHy>pmiPN(U{&(QLcv>Ev>&#@CKOCa{7JEfVW|!=ujotgpoqc z>#f^!fQouoo(z<-h<7*hXs4py)54=8eb~yQYC>ggZsXBWih6H5qA7S^2ak?X@ct1z zI#$6gojf{D!3Re2XqSQyj^fd71s@vCqvI8PcnptDQ1FqlP&;>NLe4+$=J{^TdQ5dh z>v1L~>NG%E|8)Gxw)KSPPqwWm^Zr!adaB!>s9Rfm{fWBubibIS;yyEg4f8UUX9vX; zg|G-PRiWqCi5`WpX=R#1FFq`$EA-L}Vi$#8-X>-!^vZTvY-M_{p(SQ1_&TazP4lfc zQRlN2^(|C%uYzxP^Qc-8u>RG{qjMDXoqisjtKho>WayRYzBkCDyDGSC6_3tW@cng2 zLBS6;;%f?i_%M(5DfrO~Ji42L|K7%4M*Mouu_loS=+^4im|_DVs9UrqF-93t#7e8N1^X>Vqb;6?}pr@ zk?Kb+S8Z2=M>9Wb*%mxCy|gqt8i4Cg%`m11wCpruVZAn&B_lwg?p$Us1Vu&<>p9$S ziMQs%;H31rnC@ljn4XABt-DUsS;CO3?R5d&NF)?BsGEr*{SCyZE7U`Y5}m|Jovk|w zR|N>`iA3oTbQ4JxHln8zWh!h`_f!Uo^<1<4F=b#ooEp8ZL-Ts-hH1zE6|b&JW3Vlg zNUY0h25iedG}ChDRb7o1N=u;%Usqi!}QRg;C?)mXjJe3%-)+6Jdh_6!xdbH`Eg#s zLwG9Dtl(jo-nS@tIL{{&G8QteVFNG4$!ML2xn|ixwKPmP`Mh97TT;r z_f%pfxnOA13TxGMjCy?GQ#xxQE^1@%0ntRdjc)@w9{kv*y$>`9)UIQ1%Lv-r(r$dJ zv(7V!7C4u)krcPR;4_`IQ{498=Qp|dtxeQdYB^ijvL8e7U| zjOc*BF=7hbK<5Iu1vo`XC+s?F+i}*#e;Gk9CL49A9zQ}ZEUArzqYl%pJ>>YH-bWAU z4Hwb})vJ9FpmQSrt+-*X8rm9Qj8c0c8g}&;s~YAzSOKnWgZ8w*6>9OjVIj68$u8Tl zTi&;gH7x4%ZDS34bccUEi6ZRPiv=u&&Jk*@yJ4Rvg<9%vSo~CY!&k^b!;vpUyoUXh zh;G25mRiwmIAX}`&~Wtj@YYgFaK(;DuHjgJO{-x!+RJVNJ#@I<(@>$7v>H5^$EQ%> z8WYJ@swLxwtZ&R{sNR`sZ4UdNC}3kg;x^Q)<>3Z246Y5+$25#m`)M0sK;I_ygod$( zI8yR_1OB`HDE%giJ3bU~8oETiqIcswf{zT*;3HGi`Y41czWy7Ss$oJ(93xq?0mj8+ zeUuT)b)1=J4U=+Wg`!Pv@C|+08td7pK|RnUtt39bouUUWmXfoK(p7<4#Xd4ePwVUy5^rr0bd*!5 zqjWiMuv193bw%G)Kz2kyNwd>;cEk~-9dwML6|TcZovO$7m$TrqS`g6waEs{##i-Nt zz`cL^I3-+04r`5~=c7)Z(b)xL@$2UEk%bE=3-W_ebW6rA-uXc`Ce|$@;8^Ke6?iQL z?&iCG1@cc-eIHgN-TU{_Fiu;1jo|AGbj?|vp znL?>d;l-UPj95MbbBqxez%65=PS>$_kYbgs1Ofa1;1-i1chng=_QC$))0$G1`l8O> z`lC|c+WDE3{LDK$Kf_wnAINOIq_dA?wi3wJM-;xj7@YVqaZG#3*E;(TSz2Vnq$MYO zx-*Rl@&&2MQNRVPTDH#JPvZa0#(2}h-r`XDIQVU|4bQ1l$JkJDv8qO zQ`o38bxUoS&~ux^cSPs!%ouzGVxB9A?uFC!6YhQuSse#23Dz<3<-E zOfExqi)3~wkEYH_hVtlqr!$uyFbWxy`#EKsCi%_=>3jHjJ>~3oatwqmD}%%ApYUExXL)Rz=h%fHW@B*vs@FDU z_dvrh>(RJN{ zQ54^QX7(;w((b}R_L6LJm*hf1O&}zM&;lfIQUlTzMG(Y>*ilgf77!aq5d?%ND2Roo z(gXxVMNzS#*u`GKiv9O_Z|-)9et-AJ-fQ!w_ct>vKiBZDNTyg7PQ~X*qhz|Tz9f=1 zk2mQ{u-1H+hKfCD^EK28OCB03O-Wm5JOF1U*Z5maEh$S|WE6A-29v0}jh#gADtsn( zKNlM`1}&))X-f=>L`fISfbTIrBCrN$Q%ZWIE!8S}!bVC%y*z2l4JZ&Lyx_FzVlo~sE;%FZVdG)KCQ|6mN_#}h zPr%}thR#Nq9y92;SIIfZfVB0-J0w1p#4kwOV6;SeE}0_IHtJAa1o2JA-z0JsiCmVp zS?ht>-{V^3N;B;VHpwWNhN6CwMTIR2D-oXtqcr!Fm4;awOuLs|lwzNF1#2nIrXm9$ zA29sOTC~c5b2;*<9y|bi7Jpp2TXX5|;FfOD51l_rzG2|*idq}Bv@?&cYIA-jkQS1= z?T628`_s2wXIPV>9>gmH%K8?gu#?KB{XOm=v;VbN*RLdt^}lJLQLD{GHSEpRkb_gg z!Rg}$r(0e(95V0L7T@-w`&J_f)}Yi1itgJC@0*glT+y!sni>T8uptJ^+7MI@)(uhk zD1n#3akmNhl!@-!4No_fP4>IlM8^6bz8SPS(XS(^l_TFW#0XiN2PGr4l6)LU8^MhO z2eBguar8+++y@oq-QK{rLUi9@Bz0*tTzJax-hWaL&0~muopf*YwjsvL+5)8Uc%8

i#AG9KRe9{3}XE9)>(cadn%KH!9cNu~Ar6zE%UsE-LBXPtK=d!1@g^0+x z9Fc)7-ii?i7QG#VI7VGKMi;m->a+~Lb?vqT-){WvF1qhFlG?`NMJqnp{GpYeZ2E|* zrw#8NCq>g8i1h0*nS=C>0TcS#Vg%59w8={2W4u--KRw!!v_F|vjGsGh1)wTh1 z5i_Gy6{A=J6Jm*Mf(e*YC!_4|$#t?*Q8lg^>C_3|exmAGBWaHA@2ImDRnHkox62)9 z>$&q5HT?@fl_TFb#C_~(9S{BP)4o!d)}K9C?M6%_Q@@>j6Z9v~!KZLOK3^KiXS!!F*ST?n%-oR-V}nnQ}yjv6%eGKZFGTN!hBr8bo} zM@8et|D(sn7C_7~)6oAxMgAAYRL?-!Y@W709)uaR*5err)20KZ5b=z_f!1-JA+p&g zyinp93ZYLmh<90=eWpQN1k~(v4G!o1WU`?Ymlk1SDWo|gfOHZ$LeixbgYUp}*n0%+ zr>3@05qA2j}%Ew5@d3cnV6D1kJw+}38&OW0Mc6f6Q=l59tD_ix$w36Rsxs~ zRhvNZr|-fyeLp_J*oTiN)p!AaX)WtiwGU?#5!9Z-m$#pQUO`_0`LBA1eGy!3BUDYP zuZR?=+G=0%H$>?Z#nHW>s`B}Y3GE_$*$)%Y)%4jL34j5d(H1}|A|}$ZisctR+-!{q zd?kG8*wqs98`BqH;JXxGv*|=R2GbCx{1EhIGUcbRFfIivl@cJSsn=u7Anay*(yXA| z5YxFy_?olw$4y_xgQN;as0|94u>qf^fo=GPJXwJ~_|G+3CFLY~aB2WW#ha{**8%u- z+IU;|y|^s3kfQH>7WC%E56pFvFP&nig;Uz#b~Yil;I*t&T<;^&O2Y~7#B$)M@U`s) zS^{F(j)9;3zLK#-`8y~Ky4dBUJkd%?voOa050=QFfLC}DEvvn-I!LQbSse|l+#`a- z=tghfSe=AbDXq@RsxquD9;>TYGyBlnH&%CH^^jJzvU(a;FOSvRYtztZ?nPm^qGptJ@lYp})X`LR^bCxIJG3yLrohhwxxQ=K5+L6F8e9le|XBH>hzVTE( zlXHYFe#yC}ZvtgRGG44Sr~nw(K{yMu3GtasNzeWa$JUjf z0#Lrsd!2wM{JsmQX-V7?^j*k}#n!OTe;JY{aeJw63IjVTeHStCRJCua2BN-;HBjff zwpbCmCL4V><~;%lPp8t1ELg?lFZX3*1BiF>E{X0pt_dfyEixY2hb1JBI%-9p7S z@!8vaa~ODTuJ6|AccDjlw@x^7nJJu3#aHa1~y4@-9rB%MU?CRw; zzIpW|{K|UYGIsvP7T)d@C4uce`&TyZT^d|m2W#lW}KzSRsItMfg;zz^emQyBPhs_#JteyaE7F@R&L zp*0^-=x|Ck^bkWhq#9aBnV*O=s-cHD!Ei)1^vD+^hZCxySH3}sOT+=y@T)%(B;;Zl zeutgV@zn6U?1oOKhTppb1Zgqp1l8KP4JYrY3y+GfDHoRAWED)EDsaoMXI7 zf9D!+)8F}lqxiclHH#bOOARc-0Z%2DY1fCFjPqR?g5oA;3Ey-Ln7(T@;P+jp0nCc7 zF`JC`O{2VTGDi5W)__MOUFGo@)u5)$E=~-^id0y{id5JWD^hu;?oBrf=aUNF||696A(*T!)_^H|OBg!8(svI77gUR+yFI4y83a9Rjc>_|m)9f~`5vXFC9zoermvbzsxbGIC(ku(&&uLY;;t@&*l{VSN>v(w+|bGJKQ%1c>KHbOd}sQ%ArTO!0BC z^x=jFgN~}ECg9_F+(^Y=+U`of?R%19>JJIu76$S>zD&9s$KTq_4EqaoJ@Q9{Z!1+O z%!P$-+d$%XEzUIjZGGD*%KrAkw}XLl>3fO+Or3l?uOPwd(o8%%;hS_5AsG1zV-BFy zJMr=CG8WO_zQ9WSJ?F^|tik`YM%$$QiKh3(pm&2z;DqzyijRZ?&w}ZtD?S1*1A4)` z*?1lQ{`3#=O{cL9Ze|B)e1(taCF3~#9WqYfFYU;v^fKS1v8apb9g#{@m(wedN*YM< zy-tBnuk`!gIG1EP2YrW`QWf@Pb|p%W;>>V*SDhT`-GncNk|Q10bojW2r}vDa|A%1e zIrw;9^<=k*}sPWw!Mz~_4_ihu^tM+sv-$-ZyggTMSfm`*1(lL=g2 zlW;au$2sxrS13vDGJ)jKS?DHX5w)d25~U6 zpiELyB;jBt9&2F`Q}KdwNpVPOkC1ed)Kn$mU}iz325~U6ptA;XFteaagB7y6pbK}| zn8ig4x@r&yGYh(D5C=00y3=S~B;jCYK@XWtUf^IRE;OYYm4t(t1-&KJsU#fCEU3{` z9Ly}J)l@#1X?%?cW=AkWPdeB4=>jaDB%LSpfF$XHdf)F)P<$_%Yx`w3MR)3AyQwT7 z=;D=jGabWA*Z6jJB!@HBXVxcOZa3Efyh7L+8oDxQTN;{HY6mrRRn*RudFaTKt{G=% zX+_h|wzD;K?L^zw&~=mS9DY(KseUrb=5O^$<9(k!OukJJz7rgM9LY@kb!t+r?{hEd z>mz($6jP}Cnz|)PIwjV8CG`*cboLL3_;l_MDE4I@BW-o1nf|0fy38gGMgze;P}0z9 zU1pPpMSVLnN$aRlnZcwHzQ?#AjHHrDiPnr>X!-><%if=Z&8|}kUk(A@tX_$P;#&x! z8(^BzqfFm7J6CzX^EbOnC45C~Vl&(Tlkjy6@+5o{gUp0)V^E4P?jQ|!s+%}jsu3LVAfSiJY` z{EEo6!OU^Zt9*ZyVLhceW;lOU5rE62e*I1Or2z<5IH5hk@3G1v%0phdbg zis?TfBRP0+DACSkwYW;#4oMmg1ew3nV>RvLg( zX|yOR!EsO{2&_egEbfU@LKX@kWvt9pqM%wbi0g0?xZ+5<4#(&V@yH0dKI!gQon0L3 zPm-2Q)%{7*lFRITrF1tr8 zqq3__J*LX;6~sfR`yiLyJ8UoD$Ys|S+Y33#v-_4JPxdtj_mpaTx`z4<@MX>+2ZKgs z`m+bW>#kpwXc?+lLEZ$dM~%I*>q;qc%CHY;~qeJmJXXe zTi9dd9az(`Z!z&0>j{G9`t1o^ChTQF`)m!}S87kx(Ap?MHvpSN_G9C6rpKUqnR6`% z-o|Z!IoENFY}^KzbG|YRBd6+nV1v7*83EyqhxZ1x7JyNxQk7cX!B9O##Mj?w`mYp0T$qX0P+M^0T$e$skjQT;7&<%L$pO* z3$E5tNkUIQm#Yujpt^#2I?-?yV8LBF^n4YdF&`OKe7YQmUN?c~#OP;50*_eH&zcFD zTPP=SgI!)2eQd#LI_+?UogU7hkM(0X^BxI>Woce1x>Y@uLbD|jcyNto3xjIoFUUm3 z%a!TN?K32e2-EKsdfcAAYLtDZqDS1PUvxZ`olr{ zERIwz@Eg7u^kciIT|YRpbU~i8!yXD)+yG?Z=V~3n%U>+GT1s8FQKhV z?ejIQP1L?1291klWZP-6tZg^lzECG`NxiPJcKf-y%G&K0#Phbp;&|S6SY}Vv@*P*& z7i*||y?u$KSDEaZ-I=9!cl%PEjXi{YSqzf)l92&=Pml}AxsR|1t7wpsme2SOB?T@lxv1a1Xc)=2R z7CFYD@q&9ah(qHAOZkZ>8;8adR?(dvHk}zaCIRxt`tVB}I7Xn07X0aR@D&ENY-SWt zy#HMZa`u~eNGc`EzF#I_qbem^*bia|0LY$eui<_*C1ayJe|0q9Xadd z6oPPOJm)oen3kq+W<2M04d#C+bKa0&5S7l1o45;5d)tIP$ATVRwvfsfEwl#ofK18A z^rr;uRgya36f_d6Wew@anQ`M30C+(a<5Ikp3^wa%BHWd3t<{gaXdxNn8rK8PnvKt^ zG9@|ks;tgQ^qqJWcn&7>Uyx)@6Th$MeFBn#_DkG<eDQSC$e3qcL=ny}l;eKw(Ts(J6 z3!%BCi|t*KY3*0qyXDIy*I|us6-{_^QLATiTa{b!oV`awojycGVs7P$P#y!gV<~5^ zrs0mIoP8SXQY~|y(IDpNmTXC@r^Uxj4@|e8M!gM zIFO+MrZ3Yb(qMn4KQvHx%ArBX03MZwhJ^K`DTJq|YDjK)Wo9@uTu&xLFhAfG+z{P9 zV4MYh4DONk$KgEdcYHpV$t^PR zE^};^z93!|aIdJ2W^$olwEjYhrr$ui4elyw+7~sY%}M}NW!mD-l4isb?Yy_*i)S%l ztyv-#U zG5!)^9Qr#}>EuWo*LzfW&_v~sh7xZ}CBih`DoKD3A@ZRl5jXPZQ#4D=)^Vswn>duz zR*5`nLrPM;eE;ZIa1oxl*LB()tLR$}F8 zc!{SIL%tFvDhcZR47%+7Q-a(Fy;t$+Y@rT(GeuEWpM+5IR; zh?rt^Bhx-2cQ~0GBr*gwSwCCD@|oS_C|JJ{8xH=%&gv#dd*(G;;DMNDUXcEW$g;Sg zx+3OlHjCLYv9K2F_#ZKw#Ue4WVl7twAF&)3YZDVI)nXO@5zA$2F*!q7-(b8<_0 zK1_CwiFYTRt%%YIoA+PKgweA48~Re)QT;7JR1Zau?_|PcW=+2(h>zQ@EX8lSyji^MA6Ea~Av*u{l zZ-i^s?=oQ>v({Zh*kvR%)mUo;5a+|L6@on3UEX62CI|$J$LCGF6eF7v!Pdq$wq5?oVJ=KJZ z@$q5Bv;vpD6EtCL$G3&4vYy3%6XpHbco9Hs6Q0E=2{>A!Pm)Sl-Ui9AobtX+GB8e` zJ}D|;4bj&Sy{|uE4JUSayKjNYk-2!|CyHy6|JX&`V(|y5joRtr4{{yNu{BVVi$3o! z>hn(d7(pn>hBRzkRj1JBK&zS@!&g+6q7;gLVKo0KoH?ib4sv^}s3MJ|(LoOX2RK?| zGoMIZn-l;;;Z=TA3)qedPPVeHIiRD~3`I?*B7Z%;x~6so1J#CVf#^6ANCh{BXgr2c zm7q7Un7|E2d(m|=M7XLzzW-%FszlFJ6;9-&qbX22eMC)~@^)2}Jlf>M%?eJzUOwgR z87n~#O9-*^{eVO-zmkJ>e(Fr^m9FwODLw1y)l_-UlB`mccj*stTrQ);chS7@;yd!K zBp-=-j0X}07(5*3u0MjuKp5)!Is)7kQD<|wj-LSQ*6|p=-TPC#dWf2U@=j1XFwiD? zHB;U}I-H_cb0trU6}0kdOlskGScwCDi^KuS=>c-scyWLN(VZ0c)ZPq3^7i_ih4Ykn zC0bY{ULomdi}B(W5{?$x;t(ZDMR5lu4sj$}A`-80BwCdz@jC4~mbAvGc*Ej4c|b9oVuuKK{T(Sef(k#9EvbbNBV&yI&4G*( z11*)D&TSdDE@I$nnH-zM4hpK|K>6r%IDCal%tiR-a`-xq7xOrL<#_gJ9*3`@Qw%EU zgz(Mh@Kqvw3ptxRS1PfHho4n2^1qv0aG1w53iE04Fw=C zZ6{&lR!Ec90NCu#j~Ujli(qSZqkJ1{ApXumOu z2-Szk_dq(;C7VKxCGsYa(_C_rP?r(;S&)4$IRyqPxRM%ug=+Ada{)C;NK9N#lycRO zo|HtkjLGH}5XhD>xd}sL%V?5NV)An&TA>=6ng;g4vY_AY2)4xLU-L;tohy3NtU<)(J4^N*J-y@U2n}nW~N? zP5{huC6Z%N{sZJ}bqPuQ4bXNanh5PsLUoQ>KoTB+xvqpS=8F&HkS>0HfMH!s(gEhF z7s*{SfcdVwrb3gOgIu7#BZ&-v5my4&NYeJL$OO62C3|C;odt3Wos&5Li?nbtz+w%y z1c>9Ul&Eb0w$g>66TsHGxO4{CMx9H3Q~_-3`hmw;rW1L!OTz0aOu8kFi}4w%p&icR zL*^aTP?E;Q4^XKVdPMCa)?-pNw0Bj=ScJBK+(CzNE5I@xnr#3(>fmk%Sgyex04sFJ zp90uP%kBbLsZ)42z|N{2dL%($mFt}+R?eRWxr^4e7hqRiSP1NZx3zXJ_$pn(oF$bkm?{Nl%+UR1aA{`iWYRYRSBk`h01l`{K)mfjn5gJif(Y$CMd z-&Mm9osS=@hM{Skj<2hRQ*~@FKy4W2g2QzUxDeD4y0Mr7aHLMJivW(&;8cL4HFz<= zF}f~a0`N4Q?Kc8E-37;L*;$~Tp;P>JfM;s(0f6JQ$4>z~OMBc81$MlyvI784(BL3| zXKQD504M6wIA0gf$5q25P1r#zHA3vtf4lYH)B10Z{@aU#vk=*@8qU$>-D9{{K6R^l&!S7`x(guGgZAqC(y zS|9`9bnPq`;I%poEdXApgI)~qdQEMqjD~utwc!?kh8a@Fqcz}}vCg#};2UJq&l9n| z;ZearKn9wrKyxFI;R#sYKrkVYnH0#XuMY>Z>(NIyP4uvAzQ+h+!#|KK10fX%8-YBJ zXhupro}xg33`A6*&=Y833YKo;@mhf*5h#{{mMYN72(c9o{GH_wN3QVc@ z1TLyK15@k$fs2vom(*7WF0BXivU+eYuLt{zdho8Sr|&d;!-1>t1@mh9gT)7#-DO469L=t=Imntu1&GM(-Th`QKboUA32&ou1U33Pa^`H)UakyyVRtY z-YocjVTWONFndVG5?N3-Hc^zlDy7zerdMCM9EhS?tG#^9C$m`eA#1 zrMwseRe!6n_3Az>?E706TkkN?rrJ8f0Bp~1mJGr6e3l#*gcNMgKawp8g6;Xo8p2*p zn%s{ya6gRCkIGjGg7JAXMRD}Q_`JEI$oXM>o}mur0V3n`T=i5wKr%iLX-P6Z4{MN& z&-2tvAqbH1dAG;1Tv?5npnY2Zd{GXu}ewzg7!d!N0{+Qz_hbFJ;SldA&@tQ}DT zURZ2B)d4e1?~BW~yyvUanpm)BTN&m-Yi)>|*K^Eb9w2N^iL)q076 zx3^g@Gw|+q>lJqO!4B)tJy?$M{<1r?()*G1>JOyisIcB(;4{B z;M;2JEe4L&S#LA&!#L|+27a7s9bw?7dg~nqV0<2amnwx9#^>Sp7=rP6_-f_&od}nQVDse4eAE7sb#E>+?L1OeK)a&+}3xyCVDZyfn$~$N)XhC)bh;S)k{C z89{0FCcpwcFI{UP6ZE_!Nj5iLvO&*lDyLJjlM#CU@s*TsWQ1NY8<$8&0$ieTiL{6` zlS?T{V1}Oj&tIezX6TXTGJ%L}hi)E*+w^zwX|l*XN`H$@vb<}uH24$#R^iP<3h(`? zElmkW>Etrwv2fxz>%mfhiDwDxVGWqpBO35qk7^(&GS-=iqpdYm3=(k;YZTinMqP-3v2IP1Wfc;`#7%WnAS7&xRLj~;*j4v+1mddA?FI~ISrV?dY+;4E3E?z zTu_Zd?J<*H_j~rswucKUN1?1+9-c z0Fzs9E#kM3T;UGD*+)B;2%x4s27jm>k%q zMW(fpLfy33Z*9^*P?+CAQ^rrhK!&xD?CM~;ry~#unmPi3V2Z`%Gys!yGY2y1`S>*X z!fc7Zj34p5r1cfWv{^`4Uo(*Bu@0RACZ3lJ;dx12yYRfE^$k@sdS24{_FUq3Ee_#% zN$Wd`GM<;TzGt9ZTE`f`B8YYTE)uLR4dHo7YheQ+J*cO608sime46}VZlu3ogFEo| zds;U4D!-++P5L|N*&vg-1N6WgJ^9ZMAmHH_CqD=DmuIv24gOmcoxrzNNF6p4o;t%cVDhBd3Tk!lMbj)!orGa zRblJU7;@O7IE1$&b%NmSNZ5cCO75T#O@fuIWWQ4;e@^9lU7yaFcacn&(5%c}{~EFF6jrdbh78Ue_|COtArKAZtC zD8rG{C7$jOCT!A^*HA=E*rX>v6oW2EK9r7~MH4pZ1%5MECUY~12c$9jINq8#ut_g? z3ol4V#>wH>5H(?w9yv=6MeI%3q{DuTLD-~6CU8oaut|@ctwGqNM<&W@^1eMna*m{S z%Y;pOWU>ZflO8!&gRn`DoTtGGSsgi_8$LWO9gSR|LD-~6F4Q1w(j!wig-qC_M=p|4 z@&Y#LkxL|1DHAs7kxM02Dib#8k;^m{HtCVeHI;4BO+2kFvPWX2#XJ|bY?~?Z&J%W9 zt@(m_yPf=&q71Y2-f}dhC(P1o+1kjwcqNX*QO=u}uCa~}Bd0Ughw9DCVJ^WX3})%4 zXb5KM{WJu#^!^%xS^5C^EZQ{_X6Xa9BABHQ(h$tj2Wtps>2>m4^16O9N@yEdZ;ppS z`^)6t1iW>ng9^*^!d7ysSqtmCb)>WpS?JYK*!!BgO)*c2HDqT0u%*kvfQY4w!GL1x zPzDLtm4^K0AYFFN!DNQTU6VPqI#zbgVNvUNPZAw9DikzFSRZql7)iyHlCRa7;I)+2 z`KooX3|iNzh%K)L$*NZ((o}9IkWAED%>tA!t#eiDJUlUTm5Su>V|>;%kjssOo=7MT znvrlE#9QgR;kwlUe2S!nOTA&2Y+a}#1@a5hKLsiZHAu$lZ6eZZnm>S3*h@|emg%t; zE~v2%(MwRlN;BjSR_HhfJHh?&JR;WyL*s%~c8R=@ur9)GFE1wu_UfHE(Sxv8ui^nf zut%w_`{^JI*1O2pNDc<;Jvs4$WUy{t0$OpYEUc8lOx#<;tw&}#UKi64Y}Px&`i=Al5l&!D?OW&w|x@SFRXYuv+iNvC4wgdUx3qMK23h>pe8ovW+!kAd%<^ zBMKQ0{c%||H77CHq<4>sYotkLcg1~VVVw+SC)z_;Yc`D5he{edWW#9vR1LvseVB$| zw2qVE#D&rN2o1puqwq8t&akb8??Gcm4zg$;0r_Sqm=S`NaXM;$Mi_;R+e|WAH$R3z z`ser*jz;5}VJ)X6nhf-O?+6mc0L1hHXi=1cuQ0i>1Y5K#JQJpdVHk^2!M5|^S1HJL zi(traM_{K)Uf6}?rWW+#NwW3DY@?3SM?C@=sYj-25Ju`K^VI3EmAZKa92DLp*PD08 zYw+S&Cu1&|syi7IX6n=A(-1Uarhb(?ND$1_XXw@dX6iF#8hU?|-Zr9iilupBJ&xix zfo=AmaF7Et^=mZ*Gxh5<1T*#PHAH6WUg(%E(=xMYc6p6VEiRlXgE^w!i^3bFzp1U;jHXC@ZZn$Zcy#~RG&j~iHid<{IU24DKa}f3-C+`a97w1~EL%d= zrXFL3V4}WMo`C&V2qx-paKu6|QGb(@HUty(vGNbtsf1vn{*;FL4X_S9LCOY=3i(3= zbX^S%blRs--DKhG3Ik)vU<)!)y>A`Dyo@S$6=_Zo(+erQ~H zFH9t9oD_ah=xJRTw)%TD3AXzCGz44yXEpRiwJrr=vekc1dkS0q96iJe!&pB@SG_Q- z_4AMaLOzkTerQ_wXZv|B6k%BFACPGj>%W4bVEBZ!gGTD%--I5-hkuV1@$et9A|8gd z{(8=$Fs$`A#2^^rzM!M}Pif>44Z&JJ@}dS|tsgn4L0IcYUgB;n3~T+!%bE&n{m3hl zCevY9>qoZh$iP}Za){fJFs$`qn@gD(hP6IkNu%*aI8Ba2rXE1>Ti+|kg)t=LMT9U7 z33)Id#*i@i(DxKSSnC&r!$BEYu2T=z`g))jCTsoVNGBQ0_1DFqX0RKk_Bjl5 z{a7J|x&9-X26O#KW6-!*PPUyE%UhW1Kc>^Sq+YjQ;r4TN(;J4lek^lgt{=->nCoxU z@-Wxmq#+pgZkDxFo@;i8O2ge@DN9{$80Pv<#2{(iMDxKgto5JNr3BXcTVfDwinr>F zg|+@RtrOPz+j$ThCTo3jCA6on#;5QZSs5Or>wFm2`cG>QV6DGLeosLd>$eUw0Bild znsh!@7p7f;H8KWZt#AGWam<5I`EdoTObK<+lfY0JMgx@kAz14l=F|_tTEF%CvN)Wk zBD$px!&*OiAw6UihPA$)afD&5kBI=~Wtgn>&Ea6DkHM$)dvN=sjJ&Oxu-1ghaC`GvQ^;B(*Gguk%g9|lVLXneB9wnS^%46kO%YnUo;8k^}lK_U|xShJAirpZ*nx!C$Ggg-IwOUy#7xv-gz*uUn-}C z!E86X#LR1L|0UOwD5}Cgasxqa(V1I3W66Vky;QW=n+N-PrDztDhc#P6Z6(1DYplc6 zq~xI*?&ZcM5BBw5#WdL0@6)u(6JcH+&LjK!1kJ4~mN|(UB>Q?(gJfUdM1y2spQOPa zSoKTRVD(CwlcGVguTRw=+1ICOknHPyit11v+1HzAAe@DN$TjAD@p0b$@p0a&_&5&+ z_B!EA7}&=~d@!*8olB?*1N+!G4+i$;qtI9UH|GEJFO*64cf}s%j=6Ep<5luAM~%ww zXIrWhR;u%1Pj7Re@&}mKp`XFeAM6kL^9SmVGk*}KIy_*`9}JxJHJBDr1D`=A5>Hg^I=h+siDpo!AvGi-LV>y-$i%n z`CT#GqE0>^L!`Ku)zQ*yt$r4iQywYSxz^w@~TXSu`swRH<#+-zZxe7$=QfuCQ|k3v96&hUp%% znxaWcii&n=Q-d;O`b${uBP@XyUE1g0S0UCppaU*Q-vjl9~r2j!YOs-43G0S^~QR z7|d)T=kd>|4}%2@s)}CV+({heKOZc(1;dzk8_eTR18c5kO(8{>f;G&THwUac!I}pa zyxeWXJ$VGgyND<&wYaF*1JZmZm7Pplz@(0G5`|$QNJ9+&Kg8h(90qX_Fx)*z;cid# zOA)c0A|dVueW>C8&V&XD&7;Ugc{^|x%kr-HTOun-?j9|-mF3!NiKSX%nPg4NwZuLx z5z|yL0B-LEhYikH?+Wc|rDUu@WB18&^5uTX4pzk-aN4hCjB zmuYTg(C(Z>1-N~cw6vQr-s&EW9 zE;_`pnk$|}CBLZgM^sg*mb@vYm60CSD0;kIJk^!Gl<3#ugA+jbrqga`*3E#rs^mOQ zgf1%e)h^vst8qGL6o{f#Lr%)x-Wf5dCSeB=$*ja^8}j!8F(&kTxjMFVEJ520}4KHe0r zn@x4KUI!WuAZX-aMw|+L0B#;3lJbwEDvEZ7s`I0y#;wWkL+UY>x-M2t)&rws9$dTU z>)I{2vTOjyt&JOX{oADL@MiGP8vKwL^NMQk<8k?l@8Qc6jKLStrLQXP;3jI(c5sV! z<0HD$Wi{QO0ccVZRYg_XL`p?no~cla&Zm&|GuKRAJv;YPkxfb$fIhg1ZM;#7BplC4 zDB3?MABQ73as}=v_mm}rbD4({w=8969PIlCc`dH=7|~SO5>WYUe7DGQio;e}PObPh zjcu3Z6qOy4WAv00zq{dJXB=bayQHWZs5~pE6cte(iq3<`I$DSMl-;s3NOB~39Ze%& zD@e!Fq=RjLS;-#l>t5~aKG}~ve@2S_gO%vx|5%DX$KeR;ANUpyQ!7O`yN=ri(LKJb zD0-Oo5XC81?YD>WuD0kIv`CnmebNeFSo9x`J6K8a2vY1H0gRju7^%eRR4GLN zQA$iCfr%_I8W>e-Ja;N4vM2pdQ{qArxG*koA-9hGPgi0I(U)+L`;1khm#jU5zFc9z z=_QFZ@JuCYnKlraRU;|0#Gr9F6~-lI@QfHxnd2Qm_ND!PnWQM0 zS1NI2f-^nY8Y9TocISn`4AXzv>AUR4`Rb z5BN#0J_8C@$M6T?Kk)Y=9I96WXo=pE(~|AEaGiKliZ0`oyj(Xb^thWalkrWb(d($gG68>bWP=iSjBbvczk^E0 zn6IH5SM{rC#xX!+DD#xK#fVyzZDT0gaJEuKgOp*>OvfJftF*RfHTBUQ!We6?v>8Kc=FbV*i%pzqh3rbwoabsK}A`DY0>M0Ybi! zLOwe3G;k`%9ESvqcB6$(91zuys% zcM*d3WGQSn<;eS$*gComLa>!X&=xg+s}q7IV!MjAb3%|rAt-S|kVGLUM*F%_&KP3%gGc5yVMk%q3U zp_`+@M;f}bh90b;I;Ph(I~>an&(IDzWirImY0-g>&l%+NAXYQjQDBjRI#w`*6%390Oeqr-d(xt(IvRqc zVHj%|?r6v)4I@~?NY*gwWDQy3po*U9XviWB<5TqmP zFI993bv2xkIbx}bUgRWV4khALPQ;6yM9if`yo3|+QclFnVu>jFuIYreK}=dz^zugl zvdXY{L`AP~REA0Am8^1_qcV?FUd1Y}W|h}8Qkjowq>4^=R2GoRYaNvZr1CmedA*}D zLMrPe>zpB3=}g&3Ya!->Dtd!-)V3hCH%dou3(|X&WW_gg_sXqx5ow;KHP60Q}8H(5M4o2?(a4-t{pAJU6zZ{Hse>)iQXq7?7k9hUGXcAAW z84gCgnQ@FO@(qfEbYq-YK?!n`gOTc+9gKLh9E^Cg9gKLlI2iHfI2iG6bui-H=3wnG zbiduf{sMLfV>GUz;NBVMad7AA;LeK^E6Dj>4n_{<$1tS4asA@!b$hiyyIbf;lDkC? zM(*zZU+xww_I8O9UCvgK$JBJRR6IG-Gx#$e^^W1e&|?Zmrt}Q8Zl`M28yHqA zZi{+vFm4A(oqWwkoTCLyBm54=ybr|-N_b=+jqMgMVh=(7Gm+=FXxBx$Yzm}olkpP0 zPeTLdvdzZJxZ9c)ls#^|qVOgRDLeB{S@wi+NQq2&ChXn=7U4_7`i4ue8b z8E4E}FJDvQisVT`ob{=JiOZGL>~mvruN2c%^kakDp`!-3L!TJj4l#d)6xSNj&zL{_ zbIs_+$-UiMF$;0tLE+@^4JChcPCli1JO9NK{m)Ti9R+@!4*ZkehY%$>aw878jy_C* zKg5B5%a{$yhv+bPxVIE1Usd#N!x?TZlQiCX*KnFb5YS@1XK-71#Bf?!42IEUy|1J9 zj*i|3Iu`Jl13n#A&%fiMK}Yr{KKB!FiT~^A@KWji47waYRL*bAz*p zgY&!_91swk13EY_xWT!bgY%*e&OsfVmz>~mceGgIxK#9I))jrlxV071fQCLxSmkS4 z`k zTiwXbt1t-(`)ivce(0L!Pttq?hTFSx)ds&?W)GJ-FsCAxuDtZ zJ@P#ikCPnobe9~SG~r#Ll1P4AETZm|ccs(3(v-IW*uST|_pwBL%6q?qQGc;2j+IlN zuv)j@55$QTuXGXOL16Lr3raZe)+nCkt|eBo-;J{1rKX24SX`%GZbBvW0jvzlnxzui z_Ng9>E~9Muln0Y#%jJG7B62g%qs4aUZ&mbOH-}0nhgP^bR6;qlQs+>En?t3PL-*+% zx?kteDkq0{(AXZwp;UCWI~MCeW3dNZ%^gVdgIe<%S92L@UaK`fq&2T|HPcwEqez10 zhutujQ<41X?|R5e!|t< znKVDCHE+?Hw>H*XC9szn-R5fULYlX`n!AwZ9a{5KuI8?!d8gLAOKaZUSaUaQccDFS zHFqb?dtA-kN%LNLlKigPyHMS?vXuFzwlIG`K%{@u;0j>E3S934Y z{G!%;P-}k4)l3tL-Z=M+7TYZwHB>fUaW&VF=0jTZtFGo+()^m%{JPfsMq|x=L?tx8 z>1ysvnh(30`;z9jwC1;6%~8^PL~DLWYkt?&Or`D=(HWZGb5o-qrN;ZN=6T{E^oDvDSRl(OkZ+7Hz5GiNGV=2*d}sk2)9);vPGxNr+3VcOSswzliTb#&4@9hpoLD&K8 z-?Npc9Eoj6g`JGi@R;OxIXv=iw}U+o$)_7h?s0e|xfj^U{*e5>M)J=zlHc!O6oY3S zjC4KcV8nYK*s$0VWIPKFI1)7DdBMTR^@|Qhu{+3EJa#WRJd%9b!ASCzMv{jd9!b6m z?BB6_t&#lejpW~OFp9yObnj`!FtcZ zs4TtjV8r{t!HD;vgAwl|2P59c4o1AA4o19B;ur_%Qyrww;zSP8=MF~Bzi=>e{-uKv z?<)r*-q#LByl)(gc;7l0@xF5~;(Z^-I7r8IkdDWR9Hbu{jGX`IVC4KKU~XpU`FA6M zU;ZobYa@XZ{}uSHk-+bb1UQ&~=wSZo$Wgid%fTp^e>)fj^B)HzUOih7Q0XV$3zH^ngy(#-}(epZ~wDL31}$oVY}M$YFr81Zg(Fyh_jV8pxK!H9Q< zgAwme2P59xIL1Mmr-O7?oXD}A?_lJ7K^)_qi-iV@EQ%93Mt3_HRjS2tjD1+5eYhu1 z5PzTHY*~G#2l1}M|22re z-=Li;ao|6L_*L<==6$Qx!2Ugme}E;Z#ismz(7~v8TIpc46|;u1_(s%PU_*I!PxpgC zZ!&Cn;=6HrBkCbT^jc^9!P&G1+ef^>f;~$O)O=3w2VTS`0ySUArkL-skwDp(G>*TR zx2(&)lFuq}sX@ylWnW9IPh4Wq+DIL36+djCL<@1HVGNO{@?JG>8$ZIqMCIjOV?2^d zJJ*jHJb_qm@Lu%>N90K;+h~;2-zF`x8ATS#A14tq6F3Ui6OKGt^gL-)+>bf&mN>EE z@`0G4IoPt{7$P{>!I462cd%n;V2I#gSDz)sQw~PEdpm&*rEBWCT%ZasJ!5wni&0JF$h8XHP|Y_uvx|S)D(?NQyd5CbnwszEf}Ia} z^SkVOsx2QY+VL$rCZAL2g=h(*?6`a$Rv5f#K6JN%kc+Y#)dARv@zozgpEl6Din5y& z*6;H;GwZIIfN_eE0x~GRA#(UlAmBH2k1-B^Wi!dSS3BR!)u8MKa&EfL_iE>6Bj@{! zG35LQ3FqH&1cp9ilo07h3FpT-yzKik+WB#HlJC5Yz287akV%^w;+eNw=qWr;1_y{P zhKl~=4si$45cg+yh&zymxWDKj?yv3;cMuJ6Pv{};Z@Q-c?$mUi3=S4uq4^JYSYAiN z@;_b8b)@+(t@&?P^AOVfkJenTc&TlMiZA)|Cib&ND#fN7Vk3w1v|eySz)|DrJa1n= zXP6|`JsxR2ou>l*JQXx5&~uSP2e{PnE;2ULE7pSaLX4!b7aL&*8(}Xw7^!+WhLIsn zckTEUM}QO`YJ|Po2z#v&_Ie}ijYim;jj+QGMnQNhhEWhY>ma=C2v87?G{WAAW93hQ z_pVW~2Y>H@I7C+QU`3RF49fdPd0VWuexRF-{c%U!I(!K143IM zj(i07^QoFw6)RjtHr`w))6!sFQE80sWTbFAU_4-_q-}Z1{ zUazR1^`BIa&%-3bh`z3z&8qXM9>1ZSwcqopw!Nu%>G!a5mVPgw+V+;>h3&U>Z9C%B zHf|v<#C8H!kzLJGNb`HH<|(B4eXaQeSMx=r`9rPwBdz&kNAsCe%Z@7Sk}hX^W%lP{ zOujtPPh5X4A%8w~{keqv`Aqxsx$DoRSMxQb`46r6PgnDF()^d! z{I}NpkE2=d_+BdxAfM|EC(zfC>KX1T^mU|qre1`;!Ci#Do>bqc*Pw6GYtT2x*PylL zdMRFl>RGPp8Ip9*c6EaQ<+o_%b6n*!d4>B{t^GEw{r1M%Z;+THW5dAq5HZ_wKBbG5$)?YGemjEdfG za3AT34VL|S#hbgxcRXlf=;k@yoVY#YyV&JDxlyNP{JlmyzwbL3HPRoDd~E+MzEbjG zBZ-gxhs4K@1a%rm9gKYYgfXW}a4_x?9E>`Y&mD|-UpN@?zH~6^Y`$_Z;(hI4o^cQE4p;9$i2(ZPuKQyk+d-_IVNa{Lk}^5pPW2crO< za4=H#n}boLe|IqA9dR(?{o!E5`_sXQ_m_ha?{5bq|Ne0>;?-l5QrqEC;Ac1(@n$+0 z@osQ1;@#+A#JkDCh3cBX@WHFL!hGM%g_5cbC>O-*HD;7Q`_Q;6g3ANdMif9V})MssQ9*NgQJb_h`wb zUf$Jt2dRrY-t}J2GOrlF+?%6lnD8hpUk#&Xm4R_WFP`}IUXA_sUOaE8#k{4ro&i2U z8>}zq*b{G5fRl==I@$(P;GA09t(XN@HC-sh~%% zkAT6~P>ZoQdX6Bna^yPLVyl|lXk0mh$CYKbD-?}UdRV!DhLWRsD9HoJoAdzkG;Z<3 zu>s^oNR^@D3}s+Y8D4QYu;?A?di)K)Q{6&;3)Ou3TcnoL-`(m#{BiL*ReXfK#JTPm zY8Vx+dG2^*7?rKN^mt^xJ02NMo!34+9(hKONA^485gxSNtOsoyW!exqR1exV!q*W3 zSC&SXs3!qO7pvX);|=+dSXqwVqa53ZQDpkC)D6cd3db@Xj^%DRMpHQM)!|s7!?Dr{ zhmPVH7(5%%1~-bQQ55fURi8$x@7JnVxvEbm)vLAY2ej%39o0Nc91BBf)I@hMHJ*1XZxd=_cmq&08W znjd#H(}-ofIE>VI!cC3wlp0UEn#YsoEn4$dSMvnYyiIG~t~Kvytody5AyVThSMx;D zywlY@ku>kpns>XJCz0l-wdOrq^Ik`@9)O-B#$g=vteYI?P;xxysy>HQKd)6Ea8*wx z)h}q(FKX2X9o2oQQ94(g1@0Z+9?ih3;@L;@#eF4QxEE8XO5qAJ#h<@isUZ@isab@isXa@isdc`TjU# z@zMGd4v&0)(!of}76&6OTOEve+Z>E|+Z~K}I~A* zw#UJ!qnrhd9^jxZ5~tnh7}ValfEat+2piNz!d9lIs=1lE$ey~3oJCz^Z{0=Crj?gk zz4CGkb(b}6clm?fJL${SH*Wg$qwzeg5YM3njQ+fUA$T{0$qX%f`om}F0w{E`&Yl}i$8e=%Sbus$Cck5#0|6RKFdq$J4 z|CX*pjZ4?F9xh#%xuwhdKT6kgx{tg3Kc(w=B*4j~i&~ZgoG9_O`2`1~*84>VqZZv6@08VS4_!$=GxY0~goBZ1fdtKkhtfV|)DU{nC!WGr3) zo&(mn0F>(jaG1rY08F?@MLuN{yxOS*(KeK*x>&V*ls23A#IgSHzE;&Gs^z-I3~~0Q zO0=DLnYvs>-l6La_z-u|dngmUD<-;MiKU$CD->=S`IZWb`2)V`zv7c6FqpVTl{POi zOa1nh+|ZS#;{jQ2x=Nek<}XDTilGAW+ z&0V}%n2eivBlERvI&QaIps7u9yX8Vo)?^EN3FZZGRX9)i+h^H#vT%DF4`H)xdpxt+ zPP745XS41y`hmWjJZG<6fTC9$ZCeJ>P=PDIV%Ui8>%ejoCtu|l|jC< z5Xz+=7eeCRWAj@ZZI{RqavGYAFQ2CKkFj4CiS$Qt*}5FmE;3Q7DtwF@;y;R8?uDlg zkark9cqAIH$0T~pM1u;bSP!;z*%`vPn#dbLRxa5qjCn-f1hV0h6NIsb$eTg-xa3@6 z>>~1$AbVYMP#A9#c@M}5F1b49XkNG*=k;gvD^ID}wBE$x~zGpF#HP zI40s@hIHdm5)J}v>I%0I1`dPcRzHvfE*XyohZ(L!zA&0o zmbVAla>*sJJh&3%pmumYz)YhT3C{(Xj|voGgFiSs0Vc=RbHA#^5L_iC1BCy)yuI(v=_qV5Pxn zgbLlzIf)a-lt#7(s`1cXLzSyOT^JpRoC0zemy8#GIU1=TcQuBQgdboxSHdTfIH>7T z*NH5!yXy*646ui$wggzML)Z#nPwiQ2fW34fZv(Kmrd9x~N#dg4LuxkzL8{f7h63!P z-JA;W|Cqb(_$Z3EKeM;DcgbFImww6RHW!jhLP7~7ga9FgUJMXwP^l`4iijYJibzq4 zq9C9GA`r1)M=4^*f?@}I``LTNhF#w8^UPin)`Y*`@L~3u=XvItXP)PovU9V$0~K~O zz(KBGNWU=v2RG@5(UZ|*fgYmzdp*G8l#1g3*19-Kas0Sps1jTaaF|l&WH1a@O3VRR z=i zxmI1SQvR;MU26ee!T{gzC@orF;O)BO$<6|_6yv55w)1Wm>RzZBD)-Xjy=T@!Z zBt^Xm-=k3lZ^q|nR7buAU!#d*7vHK#+we6S)y~`SjTt5Vb|vW!d}&5Ocj7}cN|U?Q z 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

E!1 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 Q|Jn+B{;bFek;CBs0Vr5V8UO$Q literal 0 HcmV?d00001 diff --git a/protocols/cursor-shape-v1-protocol.h b/protocols/cursor-shape-v1-protocol.h new file mode 100644 index 0000000..08714b3 --- /dev/null +++ b/protocols/cursor-shape-v1-protocol.h @@ -0,0 +1,507 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef CURSOR_SHAPE_V1_SERVER_PROTOCOL_H +#define CURSOR_SHAPE_V1_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_cursor_shape_v1 The cursor_shape_v1 protocol + * @section page_ifaces_cursor_shape_v1 Interfaces + * - @subpage page_iface_wp_cursor_shape_manager_v1 - cursor shape manager + * - @subpage page_iface_wp_cursor_shape_device_v1 - cursor shape for a device + * @section page_copyright_cursor_shape_v1 Copyright + *

+ *
+ * Copyright 2018 The Chromium Authors
+ * Copyright 2023 Simon Ser
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * 
+ */ +struct wl_pointer; +struct wp_cursor_shape_device_v1; +struct wp_cursor_shape_manager_v1; +struct zwp_tablet_tool_v2; + +#ifndef WP_CURSOR_SHAPE_MANAGER_V1_INTERFACE +#define WP_CURSOR_SHAPE_MANAGER_V1_INTERFACE +/** + * @page page_iface_wp_cursor_shape_manager_v1 wp_cursor_shape_manager_v1 + * @section page_iface_wp_cursor_shape_manager_v1_desc Description + * + * This global offers an alternative, optional way to set cursor images. This + * new way uses enumerated cursors instead of a wl_surface like + * wl_pointer.set_cursor does. + * + * Warning! The protocol described in this file is currently in the testing + * phase. Backward compatible changes may be added together with the + * corresponding interface version bump. Backward incompatible changes can + * only be done by creating a new major version of the extension. + * @section page_iface_wp_cursor_shape_manager_v1_api API + * See @ref iface_wp_cursor_shape_manager_v1. + */ +/** + * @defgroup iface_wp_cursor_shape_manager_v1 The wp_cursor_shape_manager_v1 interface + * + * This global offers an alternative, optional way to set cursor images. This + * new way uses enumerated cursors instead of a wl_surface like + * wl_pointer.set_cursor does. + * + * Warning! The protocol described in this file is currently in the testing + * phase. Backward compatible changes may be added together with the + * corresponding interface version bump. Backward incompatible changes can + * only be done by creating a new major version of the extension. + */ +extern const struct wl_interface wp_cursor_shape_manager_v1_interface; +#endif +#ifndef WP_CURSOR_SHAPE_DEVICE_V1_INTERFACE +#define WP_CURSOR_SHAPE_DEVICE_V1_INTERFACE +/** + * @page page_iface_wp_cursor_shape_device_v1 wp_cursor_shape_device_v1 + * @section page_iface_wp_cursor_shape_device_v1_desc Description + * + * This interface allows clients to set the cursor shape. + * @section page_iface_wp_cursor_shape_device_v1_api API + * See @ref iface_wp_cursor_shape_device_v1. + */ +/** + * @defgroup iface_wp_cursor_shape_device_v1 The wp_cursor_shape_device_v1 interface + * + * This interface allows clients to set the cursor shape. + */ +extern const struct wl_interface wp_cursor_shape_device_v1_interface; +#endif + +/** + * @ingroup iface_wp_cursor_shape_manager_v1 + * @struct wp_cursor_shape_manager_v1_interface + */ +struct wp_cursor_shape_manager_v1_interface { + /** + * destroy the manager + * + * Destroy the cursor shape manager. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * manage the cursor shape of a pointer device + * + * Obtain a wp_cursor_shape_device_v1 for a wl_pointer object. + * + * When the pointer capability is removed from the wl_seat, the + * wp_cursor_shape_device_v1 object becomes inert. + */ + void (*get_pointer)(struct wl_client *client, + struct wl_resource *resource, + uint32_t cursor_shape_device, + struct wl_resource *pointer); + /** + * manage the cursor shape of a tablet tool device + * + * Obtain a wp_cursor_shape_device_v1 for a zwp_tablet_tool_v2 + * object. + * + * When the zwp_tablet_tool_v2 is removed, the + * wp_cursor_shape_device_v1 object becomes inert. + */ + void (*get_tablet_tool_v2)(struct wl_client *client, + struct wl_resource *resource, + uint32_t cursor_shape_device, + struct wl_resource *tablet_tool); +}; + + +/** + * @ingroup iface_wp_cursor_shape_manager_v1 + */ +#define WP_CURSOR_SHAPE_MANAGER_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wp_cursor_shape_manager_v1 + */ +#define WP_CURSOR_SHAPE_MANAGER_V1_GET_POINTER_SINCE_VERSION 1 +/** + * @ingroup iface_wp_cursor_shape_manager_v1 + */ +#define WP_CURSOR_SHAPE_MANAGER_V1_GET_TABLET_TOOL_V2_SINCE_VERSION 1 + +#ifndef WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM +#define WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM +/** + * @ingroup iface_wp_cursor_shape_device_v1 + * cursor shapes + * + * This enum describes cursor shapes. + * + * The names are taken from the CSS W3C specification: + * https://w3c.github.io/csswg-drafts/css-ui/#cursor + * with a few additions. + * + * Note that there are some groups of cursor shapes that are related: + * The first group is drag-and-drop cursors which are used to indicate + * the selected action during dnd operations. The second group is resize + * cursors which are used to indicate resizing and moving possibilities + * on window borders. It is recommended that the shapes in these groups + * should use visually compatible images and metaphors. + */ +enum wp_cursor_shape_device_v1_shape { + /** + * default cursor + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT = 1, + /** + * a context menu is available for the object under the cursor + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CONTEXT_MENU = 2, + /** + * help is available for the object under the cursor + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_HELP = 3, + /** + * pointer that indicates a link or another interactive element + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_POINTER = 4, + /** + * progress indicator + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_PROGRESS = 5, + /** + * program is busy, user should wait + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_WAIT = 6, + /** + * a cell or set of cells may be selected + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CELL = 7, + /** + * simple crosshair + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CROSSHAIR = 8, + /** + * text may be selected + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_TEXT = 9, + /** + * vertical text may be selected + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_VERTICAL_TEXT = 10, + /** + * drag-and-drop: alias of/shortcut to something is to be created + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALIAS = 11, + /** + * drag-and-drop: something is to be copied + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_COPY = 12, + /** + * drag-and-drop: something is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_MOVE = 13, + /** + * drag-and-drop: the dragged item cannot be dropped at the current cursor location + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NO_DROP = 14, + /** + * drag-and-drop: the requested action will not be carried out + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NOT_ALLOWED = 15, + /** + * drag-and-drop: something can be grabbed + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_GRAB = 16, + /** + * drag-and-drop: something is being grabbed + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_GRABBING = 17, + /** + * resizing: the east border is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_E_RESIZE = 18, + /** + * resizing: the north border is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_N_RESIZE = 19, + /** + * resizing: the north-east corner is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NE_RESIZE = 20, + /** + * resizing: the north-west corner is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NW_RESIZE = 21, + /** + * resizing: the south border is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_S_RESIZE = 22, + /** + * resizing: the south-east corner is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SE_RESIZE = 23, + /** + * resizing: the south-west corner is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SW_RESIZE = 24, + /** + * resizing: the west border is to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_W_RESIZE = 25, + /** + * resizing: the east and west borders are to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_EW_RESIZE = 26, + /** + * resizing: the north and south borders are to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NS_RESIZE = 27, + /** + * resizing: the north-east and south-west corners are to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NESW_RESIZE = 28, + /** + * resizing: the north-west and south-east corners are to be moved + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NWSE_RESIZE = 29, + /** + * resizing: that the item/column can be resized horizontally + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_COL_RESIZE = 30, + /** + * resizing: that the item/row can be resized vertically + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ROW_RESIZE = 31, + /** + * something can be scrolled in any direction + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_SCROLL = 32, + /** + * something can be zoomed in + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ZOOM_IN = 33, + /** + * something can be zoomed out + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ZOOM_OUT = 34, + /** + * drag-and-drop: the user will select which action will be carried out (non-css value) + * @since 2 + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DND_ASK = 35, + /** + * resizing: something can be moved or resized in any direction (non-css value) + * @since 2 + */ + WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_RESIZE = 36, +}; +/** + * @ingroup iface_wp_cursor_shape_device_v1 + */ +#define WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DND_ASK_SINCE_VERSION 2 +/** + * @ingroup iface_wp_cursor_shape_device_v1 + */ +#define WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_RESIZE_SINCE_VERSION 2 +#endif /* WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM */ + +#ifndef WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM_IS_VALID +#define WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM_IS_VALID +/** + * @ingroup iface_wp_cursor_shape_device_v1 + * Validate a wp_cursor_shape_device_v1 shape value. + * + * @return true on success, false on error. + * @ref wp_cursor_shape_device_v1_shape + */ +static inline bool +wp_cursor_shape_device_v1_shape_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CONTEXT_MENU: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_HELP: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_POINTER: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_PROGRESS: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_WAIT: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CELL: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_CROSSHAIR: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_TEXT: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_VERTICAL_TEXT: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALIAS: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_COPY: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_MOVE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NO_DROP: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NOT_ALLOWED: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_GRAB: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_GRABBING: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_E_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_N_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NE_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NW_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_S_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SE_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SW_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_W_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_EW_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NS_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NESW_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NWSE_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_COL_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ROW_RESIZE: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_SCROLL: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ZOOM_IN: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ZOOM_OUT: + return version >= 1; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DND_ASK: + return version >= 2; + case WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ALL_RESIZE: + return version >= 2; + default: + return false; + } +} +#endif /* WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_ENUM_IS_VALID */ + +#ifndef WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM +#define WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM +enum wp_cursor_shape_device_v1_error { + /** + * the specified shape value is invalid + */ + WP_CURSOR_SHAPE_DEVICE_V1_ERROR_INVALID_SHAPE = 1, +}; +#endif /* WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM */ + +#ifndef WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM_IS_VALID +#define WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_wp_cursor_shape_device_v1 + * Validate a wp_cursor_shape_device_v1 error value. + * + * @return true on success, false on error. + * @ref wp_cursor_shape_device_v1_error + */ +static inline bool +wp_cursor_shape_device_v1_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case WP_CURSOR_SHAPE_DEVICE_V1_ERROR_INVALID_SHAPE: + return version >= 1; + default: + return false; + } +} +#endif /* WP_CURSOR_SHAPE_DEVICE_V1_ERROR_ENUM_IS_VALID */ + +/** + * @ingroup iface_wp_cursor_shape_device_v1 + * @struct wp_cursor_shape_device_v1_interface + */ +struct wp_cursor_shape_device_v1_interface { + /** + * destroy the cursor shape device + * + * Destroy the cursor shape device. + * + * The device cursor shape remains unchanged. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set device cursor to the shape + * + * Sets the device cursor to the specified shape. The compositor + * will change the cursor image based on the specified shape. + * + * The cursor actually changes only if the input device focus is + * one of the requesting client's surfaces. If any, the previous + * cursor image (surface or shape) is replaced. + * + * The "shape" argument must be a valid enum entry, otherwise the + * invalid_shape protocol error is raised. + * + * This is similar to the wl_pointer.set_cursor and + * zwp_tablet_tool_v2.set_cursor requests, but this request accepts + * a shape instead of contents in the form of a surface. Clients + * can mix set_cursor and set_shape requests. + * + * The serial parameter must match the latest wl_pointer.enter or + * zwp_tablet_tool_v2.proximity_in serial number sent to the + * client. Otherwise the request will be ignored. + * @param serial serial number of the enter event + */ + void (*set_shape)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial, + uint32_t shape); +}; + + +/** + * @ingroup iface_wp_cursor_shape_device_v1 + */ +#define WP_CURSOR_SHAPE_DEVICE_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_wp_cursor_shape_device_v1 + */ +#define WP_CURSOR_SHAPE_DEVICE_V1_SET_SHAPE_SINCE_VERSION 1 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/ext-workspace-v1-protocol.c b/protocols/ext-workspace-v1-protocol.c new file mode 100644 index 0000000..605fefb --- /dev/null +++ b/protocols/ext-workspace-v1-protocol.c @@ -0,0 +1,120 @@ +/* Generated by wayland-scanner 1.25.0 */ + +/* + * Copyright © 2019 Christopher Billington + * Copyright © 2020 Ilia Bozhinov + * Copyright © 2022 Victoria Brekenfeld + * + * Permission to use, copy, modify, distribute, and sell this + * software and its documentation for any purpose is hereby granted + * without fee, provided that the above copyright notice appear in + * all copies and that both that copyright notice and this permission + * notice appear in supporting documentation, and that the name of + * the copyright holders not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no + * representations about the suitability of this software for any + * purpose. It is provided "as is" without express or implied + * warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF + * THIS SOFTWARE. + */ + +#include +#include +#include +#include "wayland-util.h" + +#ifndef __has_attribute +# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ +#endif + +#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) +#define WL_PRIVATE __attribute__ ((visibility("hidden"))) +#else +#define WL_PRIVATE +#endif + +extern const struct wl_interface ext_workspace_group_handle_v1_interface; +extern const struct wl_interface ext_workspace_handle_v1_interface; +extern const struct wl_interface wl_output_interface; + +static const struct wl_interface *ext_workspace_v1_types[] = { + NULL, + &ext_workspace_group_handle_v1_interface, + &ext_workspace_handle_v1_interface, + &wl_output_interface, + &wl_output_interface, + &ext_workspace_handle_v1_interface, + &ext_workspace_handle_v1_interface, + &ext_workspace_group_handle_v1_interface, +}; + +static const struct wl_message ext_workspace_manager_v1_requests[] = { + { "commit", "", ext_workspace_v1_types + 0 }, + { "stop", "", ext_workspace_v1_types + 0 }, +}; + +static const struct wl_message ext_workspace_manager_v1_events[] = { + { "workspace_group", "n", ext_workspace_v1_types + 1 }, + { "workspace", "n", ext_workspace_v1_types + 2 }, + { "done", "", ext_workspace_v1_types + 0 }, + { "finished", "", ext_workspace_v1_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface ext_workspace_manager_v1_interface = { + "ext_workspace_manager_v1", 1, + 2, ext_workspace_manager_v1_requests, + 4, ext_workspace_manager_v1_events, +}; + +static const struct wl_message ext_workspace_group_handle_v1_requests[] = { + { "create_workspace", "s", ext_workspace_v1_types + 0 }, + { "destroy", "", ext_workspace_v1_types + 0 }, +}; + +static const struct wl_message ext_workspace_group_handle_v1_events[] = { + { "capabilities", "u", ext_workspace_v1_types + 0 }, + { "output_enter", "o", ext_workspace_v1_types + 3 }, + { "output_leave", "o", ext_workspace_v1_types + 4 }, + { "workspace_enter", "o", ext_workspace_v1_types + 5 }, + { "workspace_leave", "o", ext_workspace_v1_types + 6 }, + { "removed", "", ext_workspace_v1_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface ext_workspace_group_handle_v1_interface = { + "ext_workspace_group_handle_v1", 1, + 2, ext_workspace_group_handle_v1_requests, + 6, ext_workspace_group_handle_v1_events, +}; + +static const struct wl_message ext_workspace_handle_v1_requests[] = { + { "destroy", "", ext_workspace_v1_types + 0 }, + { "activate", "", ext_workspace_v1_types + 0 }, + { "deactivate", "", ext_workspace_v1_types + 0 }, + { "assign", "o", ext_workspace_v1_types + 7 }, + { "remove", "", ext_workspace_v1_types + 0 }, +}; + +static const struct wl_message ext_workspace_handle_v1_events[] = { + { "id", "s", ext_workspace_v1_types + 0 }, + { "name", "s", ext_workspace_v1_types + 0 }, + { "coordinates", "a", ext_workspace_v1_types + 0 }, + { "state", "u", ext_workspace_v1_types + 0 }, + { "capabilities", "u", ext_workspace_v1_types + 0 }, + { "removed", "", ext_workspace_v1_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface ext_workspace_handle_v1_interface = { + "ext_workspace_handle_v1", 1, + 5, ext_workspace_handle_v1_requests, + 6, ext_workspace_handle_v1_events, +}; + diff --git a/protocols/ext-workspace-v1-protocol.h b/protocols/ext-workspace-v1-protocol.h new file mode 100644 index 0000000..34ae038 --- /dev/null +++ b/protocols/ext-workspace-v1-protocol.h @@ -0,0 +1,752 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef EXT_WORKSPACE_V1_SERVER_PROTOCOL_H +#define EXT_WORKSPACE_V1_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_ext_workspace_v1 The ext_workspace_v1 protocol + * @section page_ifaces_ext_workspace_v1 Interfaces + * - @subpage page_iface_ext_workspace_manager_v1 - list and control workspaces + * - @subpage page_iface_ext_workspace_group_handle_v1 - a workspace group assigned to a set of outputs + * - @subpage page_iface_ext_workspace_handle_v1 - a workspace handing a group of surfaces + * @section page_copyright_ext_workspace_v1 Copyright + *
+ *
+ * Copyright © 2019 Christopher Billington
+ * Copyright © 2020 Ilia Bozhinov
+ * Copyright © 2022 Victoria Brekenfeld
+ *
+ * Permission to use, copy, modify, distribute, and sell this
+ * software and its documentation for any purpose is hereby granted
+ * without fee, provided that the above copyright notice appear in
+ * all copies and that both that copyright notice and this permission
+ * notice appear in supporting documentation, and that the name of
+ * the copyright holders not be used in advertising or publicity
+ * pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ * 
+ */ +struct ext_workspace_group_handle_v1; +struct ext_workspace_handle_v1; +struct ext_workspace_manager_v1; +struct wl_output; + +#ifndef EXT_WORKSPACE_MANAGER_V1_INTERFACE +#define EXT_WORKSPACE_MANAGER_V1_INTERFACE +/** + * @page page_iface_ext_workspace_manager_v1 ext_workspace_manager_v1 + * @section page_iface_ext_workspace_manager_v1_desc Description + * + * Workspaces, also called virtual desktops, are groups of surfaces. A + * compositor with a concept of workspaces may only show some such groups of + * surfaces (those of 'active' workspaces) at a time. 'Activating' a + * workspace is a request for the compositor to display that workspace's + * surfaces as normal, whereas the compositor may hide or otherwise + * de-emphasise surfaces that are associated only with 'inactive' workspaces. + * Workspaces are grouped by which sets of outputs they correspond to, and + * may contain surfaces only from those outputs. In this way, it is possible + * for each output to have its own set of workspaces, or for all outputs (or + * any other arbitrary grouping) to share workspaces. Compositors may + * optionally conceptually arrange each group of workspaces in an + * N-dimensional grid. + * + * The purpose of this protocol is to enable the creation of taskbars and + * docks by providing them with a list of workspaces and their properties, + * and allowing them to activate and deactivate workspaces. + * + * After a client binds the ext_workspace_manager_v1, each workspace will be + * sent via the workspace event. + * @section page_iface_ext_workspace_manager_v1_api API + * See @ref iface_ext_workspace_manager_v1. + */ +/** + * @defgroup iface_ext_workspace_manager_v1 The ext_workspace_manager_v1 interface + * + * Workspaces, also called virtual desktops, are groups of surfaces. A + * compositor with a concept of workspaces may only show some such groups of + * surfaces (those of 'active' workspaces) at a time. 'Activating' a + * workspace is a request for the compositor to display that workspace's + * surfaces as normal, whereas the compositor may hide or otherwise + * de-emphasise surfaces that are associated only with 'inactive' workspaces. + * Workspaces are grouped by which sets of outputs they correspond to, and + * may contain surfaces only from those outputs. In this way, it is possible + * for each output to have its own set of workspaces, or for all outputs (or + * any other arbitrary grouping) to share workspaces. Compositors may + * optionally conceptually arrange each group of workspaces in an + * N-dimensional grid. + * + * The purpose of this protocol is to enable the creation of taskbars and + * docks by providing them with a list of workspaces and their properties, + * and allowing them to activate and deactivate workspaces. + * + * After a client binds the ext_workspace_manager_v1, each workspace will be + * sent via the workspace event. + */ +extern const struct wl_interface ext_workspace_manager_v1_interface; +#endif +#ifndef EXT_WORKSPACE_GROUP_HANDLE_V1_INTERFACE +#define EXT_WORKSPACE_GROUP_HANDLE_V1_INTERFACE +/** + * @page page_iface_ext_workspace_group_handle_v1 ext_workspace_group_handle_v1 + * @section page_iface_ext_workspace_group_handle_v1_desc Description + * + * A ext_workspace_group_handle_v1 object represents a workspace group + * that is assigned a set of outputs and contains a number of workspaces. + * + * The set of outputs assigned to the workspace group is conveyed to the client via + * output_enter and output_leave events, and its workspaces are conveyed with + * workspace events. + * + * For example, a compositor which has a set of workspaces for each output may + * advertise a workspace group (and its workspaces) per output, whereas a compositor + * where a workspace spans all outputs may advertise a single workspace group for all + * outputs. + * @section page_iface_ext_workspace_group_handle_v1_api API + * See @ref iface_ext_workspace_group_handle_v1. + */ +/** + * @defgroup iface_ext_workspace_group_handle_v1 The ext_workspace_group_handle_v1 interface + * + * A ext_workspace_group_handle_v1 object represents a workspace group + * that is assigned a set of outputs and contains a number of workspaces. + * + * The set of outputs assigned to the workspace group is conveyed to the client via + * output_enter and output_leave events, and its workspaces are conveyed with + * workspace events. + * + * For example, a compositor which has a set of workspaces for each output may + * advertise a workspace group (and its workspaces) per output, whereas a compositor + * where a workspace spans all outputs may advertise a single workspace group for all + * outputs. + */ +extern const struct wl_interface ext_workspace_group_handle_v1_interface; +#endif +#ifndef EXT_WORKSPACE_HANDLE_V1_INTERFACE +#define EXT_WORKSPACE_HANDLE_V1_INTERFACE +/** + * @page page_iface_ext_workspace_handle_v1 ext_workspace_handle_v1 + * @section page_iface_ext_workspace_handle_v1_desc Description + * + * A ext_workspace_handle_v1 object represents a workspace that handles a + * group of surfaces. + * + * Each workspace has: + * - a name, conveyed to the client with the name event + * - potentially an id conveyed with the id event + * - a list of states, conveyed to the client with the state event + * - and optionally a set of coordinates, conveyed to the client with the + * coordinates event + * + * The client may request that the compositor activate or deactivate the workspace. + * + * Each workspace can belong to only a single workspace group. + * Depending on the compositor policy, there might be workspaces with + * the same name in different workspace groups, but these workspaces are still + * separate (e.g. one of them might be active while the other is not). + * @section page_iface_ext_workspace_handle_v1_api API + * See @ref iface_ext_workspace_handle_v1. + */ +/** + * @defgroup iface_ext_workspace_handle_v1 The ext_workspace_handle_v1 interface + * + * A ext_workspace_handle_v1 object represents a workspace that handles a + * group of surfaces. + * + * Each workspace has: + * - a name, conveyed to the client with the name event + * - potentially an id conveyed with the id event + * - a list of states, conveyed to the client with the state event + * - and optionally a set of coordinates, conveyed to the client with the + * coordinates event + * + * The client may request that the compositor activate or deactivate the workspace. + * + * Each workspace can belong to only a single workspace group. + * Depending on the compositor policy, there might be workspaces with + * the same name in different workspace groups, but these workspaces are still + * separate (e.g. one of them might be active while the other is not). + */ +extern const struct wl_interface ext_workspace_handle_v1_interface; +#endif + +/** + * @ingroup iface_ext_workspace_manager_v1 + * @struct ext_workspace_manager_v1_interface + */ +struct ext_workspace_manager_v1_interface { + /** + * all requests about the workspaces have been sent + * + * The client must send this request after it has finished + * sending other requests. The compositor must process a series of + * requests preceding a commit request atomically. + * + * This allows changes to the workspace properties to be seen as + * atomic, even if they happen via multiple events, and even if + * they involve multiple ext_workspace_handle_v1 objects, for + * example, deactivating one workspace and activating another. + */ + void (*commit)(struct wl_client *client, + struct wl_resource *resource); + /** + * stop sending events + * + * Indicates the client no longer wishes to receive events for + * new workspace groups. However the compositor may emit further + * workspace events, until the finished event is emitted. The + * compositor is expected to send the finished event eventually + * once the stop request has been processed. + * + * The client must not send any requests after this one, doing so + * will raise a wl_display invalid_object error. + */ + void (*stop)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define EXT_WORKSPACE_MANAGER_V1_WORKSPACE_GROUP 0 +#define EXT_WORKSPACE_MANAGER_V1_WORKSPACE 1 +#define EXT_WORKSPACE_MANAGER_V1_DONE 2 +#define EXT_WORKSPACE_MANAGER_V1_FINISHED 3 + +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_WORKSPACE_GROUP_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_WORKSPACE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_DONE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_FINISHED_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_COMMIT_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_manager_v1 + */ +#define EXT_WORKSPACE_MANAGER_V1_STOP_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_manager_v1 + * Sends an workspace_group event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_manager_v1_send_workspace_group(struct wl_resource *resource_, struct wl_resource *workspace_group) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_MANAGER_V1_WORKSPACE_GROUP, workspace_group); +} + +/** + * @ingroup iface_ext_workspace_manager_v1 + * Sends an workspace event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_manager_v1_send_workspace(struct wl_resource *resource_, struct wl_resource *workspace) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_MANAGER_V1_WORKSPACE, workspace); +} + +/** + * @ingroup iface_ext_workspace_manager_v1 + * Sends an done event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_manager_v1_send_done(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_MANAGER_V1_DONE); +} + +/** + * @ingroup iface_ext_workspace_manager_v1 + * Sends an finished event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_manager_v1_send_finished(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_MANAGER_V1_FINISHED); +} + +#ifndef EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM +#define EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM +enum ext_workspace_group_handle_v1_group_capabilities { + /** + * create_workspace request is available + */ + EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_CREATE_WORKSPACE = 1, +}; +#endif /* EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM */ + +#ifndef EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM_IS_VALID +#define EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM_IS_VALID +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Validate a ext_workspace_group_handle_v1 group_capabilities value. + * + * @return true on success, false on error. + * @ref ext_workspace_group_handle_v1_group_capabilities + */ +static inline bool +ext_workspace_group_handle_v1_group_capabilities_is_valid(uint32_t value, uint32_t version) { + uint32_t valid = 0; + if (version >= 1) + valid |= EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_CREATE_WORKSPACE; + return (value & ~valid) == 0; +} +#endif /* EXT_WORKSPACE_GROUP_HANDLE_V1_GROUP_CAPABILITIES_ENUM_IS_VALID */ + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * @struct ext_workspace_group_handle_v1_interface + */ +struct ext_workspace_group_handle_v1_interface { + /** + * create a new workspace + * + * Request that the compositor create a new workspace with the + * given name and assign it to this group. + * + * There is no guarantee that the compositor will create a new + * workspace, or that the created workspace will have the provided + * name. + */ + void (*create_workspace)(struct wl_client *client, + struct wl_resource *resource, + const char *workspace); + /** + * destroy the ext_workspace_group_handle_v1 object + * + * Destroys the ext_workspace_group_handle_v1 object. + * + * This request should be send either when the client does not want + * to use the workspace group object any more or after the removed + * event to finalize the destruction of the object. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define EXT_WORKSPACE_GROUP_HANDLE_V1_CAPABILITIES 0 +#define EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_ENTER 1 +#define EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_LEAVE 2 +#define EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_ENTER 3 +#define EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_LEAVE 4 +#define EXT_WORKSPACE_GROUP_HANDLE_V1_REMOVED 5 + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_CAPABILITIES_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_ENTER_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_LEAVE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_ENTER_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_LEAVE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_REMOVED_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_CREATE_WORKSPACE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_group_handle_v1 + */ +#define EXT_WORKSPACE_GROUP_HANDLE_V1_DESTROY_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an capabilities event to the client owning the resource. + * @param resource_ The client's resource + * @param capabilities capabilities + */ +static inline void +ext_workspace_group_handle_v1_send_capabilities(struct wl_resource *resource_, uint32_t capabilities) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_CAPABILITIES, capabilities); +} + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an output_enter event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_group_handle_v1_send_output_enter(struct wl_resource *resource_, struct wl_resource *output) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_ENTER, output); +} + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an output_leave event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_group_handle_v1_send_output_leave(struct wl_resource *resource_, struct wl_resource *output) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_OUTPUT_LEAVE, output); +} + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an workspace_enter event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_group_handle_v1_send_workspace_enter(struct wl_resource *resource_, struct wl_resource *workspace) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_ENTER, workspace); +} + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an workspace_leave event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_group_handle_v1_send_workspace_leave(struct wl_resource *resource_, struct wl_resource *workspace) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_WORKSPACE_LEAVE, workspace); +} + +/** + * @ingroup iface_ext_workspace_group_handle_v1 + * Sends an removed event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_group_handle_v1_send_removed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_GROUP_HANDLE_V1_REMOVED); +} + +#ifndef EXT_WORKSPACE_HANDLE_V1_STATE_ENUM +#define EXT_WORKSPACE_HANDLE_V1_STATE_ENUM +/** + * @ingroup iface_ext_workspace_handle_v1 + * types of states on the workspace + * + * The different states that a workspace can have. + */ +enum ext_workspace_handle_v1_state { + /** + * the workspace is active + */ + EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE = 1, + /** + * the workspace requests attention + */ + EXT_WORKSPACE_HANDLE_V1_STATE_URGENT = 2, + /** + * the workspace is not visible + * + * The workspace is not visible in its workspace group, and + * clients attempting to visualize the compositor workspace state + * should not display such workspaces. + */ + EXT_WORKSPACE_HANDLE_V1_STATE_HIDDEN = 4, +}; +#endif /* EXT_WORKSPACE_HANDLE_V1_STATE_ENUM */ + +#ifndef EXT_WORKSPACE_HANDLE_V1_STATE_ENUM_IS_VALID +#define EXT_WORKSPACE_HANDLE_V1_STATE_ENUM_IS_VALID +/** + * @ingroup iface_ext_workspace_handle_v1 + * Validate a ext_workspace_handle_v1 state value. + * + * @return true on success, false on error. + * @ref ext_workspace_handle_v1_state + */ +static inline bool +ext_workspace_handle_v1_state_is_valid(uint32_t value, uint32_t version) { + uint32_t valid = 0; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_STATE_URGENT; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_STATE_HIDDEN; + return (value & ~valid) == 0; +} +#endif /* EXT_WORKSPACE_HANDLE_V1_STATE_ENUM_IS_VALID */ + +#ifndef EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM +#define EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM +enum ext_workspace_handle_v1_workspace_capabilities { + /** + * activate request is available + */ + EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ACTIVATE = 1, + /** + * deactivate request is available + */ + EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_DEACTIVATE = 2, + /** + * remove request is available + */ + EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_REMOVE = 4, + /** + * assign request is available + */ + EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ASSIGN = 8, +}; +#endif /* EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM */ + +#ifndef EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM_IS_VALID +#define EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM_IS_VALID +/** + * @ingroup iface_ext_workspace_handle_v1 + * Validate a ext_workspace_handle_v1 workspace_capabilities value. + * + * @return true on success, false on error. + * @ref ext_workspace_handle_v1_workspace_capabilities + */ +static inline bool +ext_workspace_handle_v1_workspace_capabilities_is_valid(uint32_t value, uint32_t version) { + uint32_t valid = 0; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ACTIVATE; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_DEACTIVATE; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_REMOVE; + if (version >= 1) + valid |= EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ASSIGN; + return (value & ~valid) == 0; +} +#endif /* EXT_WORKSPACE_HANDLE_V1_WORKSPACE_CAPABILITIES_ENUM_IS_VALID */ + +/** + * @ingroup iface_ext_workspace_handle_v1 + * @struct ext_workspace_handle_v1_interface + */ +struct ext_workspace_handle_v1_interface { + /** + * destroy the ext_workspace_handle_v1 object + * + * Destroys the ext_workspace_handle_v1 object. + * + * This request should be made either when the client does not want + * to use the workspace object any more or after the remove event + * to finalize the destruction of the object. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * activate the workspace + * + * Request that this workspace be activated. + * + * There is no guarantee the workspace will be actually activated, + * and behaviour may be compositor-dependent. For example, + * activating a workspace may or may not deactivate all other + * workspaces in the same group. + */ + void (*activate)(struct wl_client *client, + struct wl_resource *resource); + /** + * deactivate the workspace + * + * Request that this workspace be deactivated. + * + * There is no guarantee the workspace will be actually + * deactivated. + */ + void (*deactivate)(struct wl_client *client, + struct wl_resource *resource); + /** + * assign workspace to group + * + * Requests that this workspace is assigned to the given + * workspace group. + * + * There is no guarantee the workspace will be assigned. + */ + void (*assign)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *workspace_group); + /** + * remove the workspace + * + * Request that this workspace be removed. + * + * There is no guarantee the workspace will be actually removed. + */ + void (*remove)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define EXT_WORKSPACE_HANDLE_V1_ID 0 +#define EXT_WORKSPACE_HANDLE_V1_NAME 1 +#define EXT_WORKSPACE_HANDLE_V1_COORDINATES 2 +#define EXT_WORKSPACE_HANDLE_V1_STATE 3 +#define EXT_WORKSPACE_HANDLE_V1_CAPABILITIES 4 +#define EXT_WORKSPACE_HANDLE_V1_REMOVED 5 + +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_ID_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_NAME_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_COORDINATES_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_STATE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_CAPABILITIES_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_REMOVED_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_ACTIVATE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_DEACTIVATE_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_ASSIGN_SINCE_VERSION 1 +/** + * @ingroup iface_ext_workspace_handle_v1 + */ +#define EXT_WORKSPACE_HANDLE_V1_REMOVE_SINCE_VERSION 1 + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an id event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_handle_v1_send_id(struct wl_resource *resource_, const char *id) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_ID, id); +} + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an name event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_handle_v1_send_name(struct wl_resource *resource_, const char *name) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_NAME, name); +} + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an coordinates event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_handle_v1_send_coordinates(struct wl_resource *resource_, struct wl_array *coordinates) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_COORDINATES, coordinates); +} + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an state event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_handle_v1_send_state(struct wl_resource *resource_, uint32_t state) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_STATE, state); +} + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an capabilities event to the client owning the resource. + * @param resource_ The client's resource + * @param capabilities capabilities + */ +static inline void +ext_workspace_handle_v1_send_capabilities(struct wl_resource *resource_, uint32_t capabilities) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_CAPABILITIES, capabilities); +} + +/** + * @ingroup iface_ext_workspace_handle_v1 + * Sends an removed event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +ext_workspace_handle_v1_send_removed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, EXT_WORKSPACE_HANDLE_V1_REMOVED); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/peachwm-ipc-unstable-v2-protocol.c b/protocols/peachwm-ipc-unstable-v2-protocol.c new file mode 100644 index 0000000..dfc4982 --- /dev/null +++ b/protocols/peachwm-ipc-unstable-v2-protocol.c @@ -0,0 +1,94 @@ +/* Generated by wayland-scanner 1.25.0 */ + +/* + * Copyright (C) 2022 Russell Newcomb + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include "wayland-util.h" + +#ifndef __has_attribute +# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */ +#endif + +#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4) +#define WL_PRIVATE __attribute__ ((visibility("hidden"))) +#else +#define WL_PRIVATE +#endif + +extern const struct wl_interface wl_output_interface; +extern const struct wl_interface zpeachwm_ipc_output_v2_interface; + +static const struct wl_interface *peachwm_ipc_unstable_v2_types[] = { + NULL, + NULL, + NULL, + NULL, + &zpeachwm_ipc_output_v2_interface, + &wl_output_interface, +}; + +static const struct wl_message zpeachwm_ipc_manager_v2_requests[] = { + { "release", "", peachwm_ipc_unstable_v2_types + 0 }, + { "get_output", "no", peachwm_ipc_unstable_v2_types + 4 }, +}; + +static const struct wl_message zpeachwm_ipc_manager_v2_events[] = { + { "tags", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "layout", "s", peachwm_ipc_unstable_v2_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zpeachwm_ipc_manager_v2_interface = { + "zpeachwm_ipc_manager_v2", 2, + 2, zpeachwm_ipc_manager_v2_requests, + 2, zpeachwm_ipc_manager_v2_events, +}; + +static const struct wl_message zpeachwm_ipc_output_v2_requests[] = { + { "release", "", peachwm_ipc_unstable_v2_types + 0 }, + { "set_tags", "uu", peachwm_ipc_unstable_v2_types + 0 }, + { "set_client_tags", "uu", peachwm_ipc_unstable_v2_types + 0 }, + { "set_layout", "u", peachwm_ipc_unstable_v2_types + 0 }, +}; + +static const struct wl_message zpeachwm_ipc_output_v2_events[] = { + { "toggle_visibility", "", peachwm_ipc_unstable_v2_types + 0 }, + { "active", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "tag", "uuuu", peachwm_ipc_unstable_v2_types + 0 }, + { "layout", "u", peachwm_ipc_unstable_v2_types + 0 }, + { "title", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "appid", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "layout_symbol", "s", peachwm_ipc_unstable_v2_types + 0 }, + { "frame", "", peachwm_ipc_unstable_v2_types + 0 }, + { "fullscreen", "2u", peachwm_ipc_unstable_v2_types + 0 }, + { "floating", "2u", peachwm_ipc_unstable_v2_types + 0 }, +}; + +WL_PRIVATE const struct wl_interface zpeachwm_ipc_output_v2_interface = { + "zpeachwm_ipc_output_v2", 2, + 4, zpeachwm_ipc_output_v2_requests, + 10, zpeachwm_ipc_output_v2_events, +}; + diff --git a/protocols/peachwm-ipc-unstable-v2-protocol.h b/protocols/peachwm-ipc-unstable-v2-protocol.h new file mode 100644 index 0000000..8cb8d2b --- /dev/null +++ b/protocols/peachwm-ipc-unstable-v2-protocol.h @@ -0,0 +1,447 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef PEACHWM_IPC_UNSTABLE_V2_SERVER_PROTOCOL_H +#define PEACHWM_IPC_UNSTABLE_V2_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_peachwm_ipc_unstable_v2 The peachwm_ipc_unstable_v2 protocol + * @section page_ifaces_peachwm_ipc_unstable_v2 Interfaces + * - @subpage page_iface_zpeachwm_ipc_manager_v2 - manage peachwm state + * - @subpage page_iface_zpeachwm_ipc_output_v2 - interact with peachwm output state + * @section page_copyright_peachwm_ipc_unstable_v2 Copyright + *
+ *
+ * Copyright (C) 2022 Russell Newcomb
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * 
+ */ +struct wl_output; +struct zpeachwm_ipc_manager_v2; +struct zpeachwm_ipc_output_v2; + +#ifndef ZPEACHWM_IPC_MANAGER_V2_INTERFACE +#define ZPEACHWM_IPC_MANAGER_V2_INTERFACE +/** + * @page page_iface_zpeachwm_ipc_manager_v2 zpeachwm_ipc_manager_v2 + * @section page_iface_zpeachwm_ipc_manager_v2_desc Description + * + * This interface is exposed as a global in the Wayland registry and allows + * clients to query and set peachwm state. + * + * Warning! The protocol described in this file is experimental and + * backward incompatible changes may be made. Backward compatible changes + * may be added together with the corresponding interface version bump. + * Backward incompatible changes are done by bumping the version number in + * the protocol and interface names and resetting the interface version. + * Once the protocol is to be declared stable, the 'z' prefix and the + * version number in the protocol and interface names are removed and the + * interface version is reset. + * @section page_iface_zpeachwm_ipc_manager_v2_api API + * See @ref iface_zpeachwm_ipc_manager_v2. + */ +/** + * @defgroup iface_zpeachwm_ipc_manager_v2 The zpeachwm_ipc_manager_v2 interface + * + * This interface is exposed as a global in the Wayland registry and allows + * clients to query and set peachwm state. + * + * Warning! The protocol described in this file is experimental and + * backward incompatible changes may be made. Backward compatible changes + * may be added together with the corresponding interface version bump. + * Backward incompatible changes are done by bumping the version number in + * the protocol and interface names and resetting the interface version. + * Once the protocol is to be declared stable, the 'z' prefix and the + * version number in the protocol and interface names are removed and the + * interface version is reset. + */ +extern const struct wl_interface zpeachwm_ipc_manager_v2_interface; +#endif +#ifndef ZPEACHWM_IPC_OUTPUT_V2_INTERFACE +#define ZPEACHWM_IPC_OUTPUT_V2_INTERFACE +/** + * @page page_iface_zpeachwm_ipc_output_v2 zpeachwm_ipc_output_v2 + * @section page_iface_zpeachwm_ipc_output_v2_desc Description + * + * Observe and control a peachwm output. + * @section page_iface_zpeachwm_ipc_output_v2_api API + * See @ref iface_zpeachwm_ipc_output_v2. + */ +/** + * @defgroup iface_zpeachwm_ipc_output_v2 The zpeachwm_ipc_output_v2 interface + * + * Observe and control a peachwm output. + */ +extern const struct wl_interface zpeachwm_ipc_output_v2_interface; +#endif + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * @struct zpeachwm_ipc_manager_v2_interface + */ +struct zpeachwm_ipc_manager_v2_interface { + /** + * release peachwm_ipc_manager + * + * Indicates that the client will not use the manager object + * anymore. Objects created through this interface remain valid. + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); + /** + * get a peachwm_ipc_output for a wl_output + * + * Get a peachwm_ipc_output for the given wl_output. + */ + void (*get_output)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *output); +}; + +#define ZPEACHWM_IPC_MANAGER_V2_TAGS 0 +#define ZPEACHWM_IPC_MANAGER_V2_LAYOUT 1 + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_LAYOUT_SINCE_VERSION 1 + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_RELEASE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + */ +#define ZPEACHWM_IPC_MANAGER_V2_GET_OUTPUT_SINCE_VERSION 1 + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * Sends an tags event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_manager_v2_send_tags(struct wl_resource *resource_, uint32_t amount) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_MANAGER_V2_TAGS, amount); +} + +/** + * @ingroup iface_zpeachwm_ipc_manager_v2 + * Sends an layout event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_manager_v2_send_layout(struct wl_resource *resource_, const char *name) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_MANAGER_V2_LAYOUT, name); +} + +#ifndef ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM +#define ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM +enum zpeachwm_ipc_output_v2_tag_state { + /** + * no state + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_NONE = 0, + /** + * tag is active + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ACTIVE = 1, + /** + * tag has urgent client + */ + ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_URGENT = 2, +}; +#endif /* ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM */ + +#ifndef ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM_IS_VALID +#define ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM_IS_VALID +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Validate a zpeachwm_ipc_output_v2 tag_state value. + * + * @return true on success, false on error. + * @ref zpeachwm_ipc_output_v2_tag_state + */ +static inline bool +zpeachwm_ipc_output_v2_tag_state_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_NONE: + return version >= 1; + case ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ACTIVE: + return version >= 1; + case ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_URGENT: + return version >= 1; + default: + return false; + } +} +#endif /* ZPEACHWM_IPC_OUTPUT_V2_TAG_STATE_ENUM_IS_VALID */ + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * @struct zpeachwm_ipc_output_v2_interface + */ +struct zpeachwm_ipc_output_v2_interface { + /** + * release peachwm_ipc_output + * + * Indicates that the client will not use the peachwm_ipc_output + * object anymore. Objects created through this interface remain + * valid. + */ + void (*release)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the active tags of this output + * + * set the active tags of this output. + * @param tagmask bitmask of the tags that should be set + * @param toggle_tagset whether to toggle the tagset + */ + void (*set_tags)(struct wl_client *client, + struct wl_resource *resource, + uint32_t tagmask, + uint32_t toggle_tagset); + /** + * set the tags of the focused client + * + * Set the tags of the focused client. + */ + void (*set_client_tags)(struct wl_client *client, + struct wl_resource *resource, + uint32_t and_tags, + uint32_t xor_tags); + /** + * set the layout of this output + * + * Set the layout of this output. + */ + void (*set_layout)(struct wl_client *client, + struct wl_resource *resource, + uint32_t index); +}; + +#define ZPEACHWM_IPC_OUTPUT_V2_TOGGLE_VISIBILITY 0 +#define ZPEACHWM_IPC_OUTPUT_V2_ACTIVE 1 +#define ZPEACHWM_IPC_OUTPUT_V2_TAG 2 +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT 3 +#define ZPEACHWM_IPC_OUTPUT_V2_TITLE 4 +#define ZPEACHWM_IPC_OUTPUT_V2_APPID 5 +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SYMBOL 6 +#define ZPEACHWM_IPC_OUTPUT_V2_FRAME 7 +#define ZPEACHWM_IPC_OUTPUT_V2_FULLSCREEN 8 +#define ZPEACHWM_IPC_OUTPUT_V2_FLOATING 9 + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TOGGLE_VISIBILITY_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_ACTIVE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TAG_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_TITLE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_APPID_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SYMBOL_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FRAME_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FULLSCREEN_SINCE_VERSION 2 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_FLOATING_SINCE_VERSION 2 + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_RELEASE_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_CLIENT_TAGS_SINCE_VERSION 1 +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + */ +#define ZPEACHWM_IPC_OUTPUT_V2_SET_LAYOUT_SINCE_VERSION 1 + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an toggle_visibility event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_toggle_visibility(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_TOGGLE_VISIBILITY); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an active event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_active(struct wl_resource *resource_, uint32_t active) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_ACTIVE, active); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an tag event to the client owning the resource. + * @param resource_ The client's resource + * @param tag index of the tag + * @param state state of the tag + * @param clients number of clients in tag + * @param focused 1 if focused client is in this tag + */ +static inline void +zpeachwm_ipc_output_v2_send_tag(struct wl_resource *resource_, uint32_t tag, uint32_t state, uint32_t clients, uint32_t focused) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_TAG, tag, state, clients, focused); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an layout event to the client owning the resource. + * @param resource_ The client's resource + * @param layout index of the layout + */ +static inline void +zpeachwm_ipc_output_v2_send_layout(struct wl_resource *resource_, uint32_t layout) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_LAYOUT, layout); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an title event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_title(struct wl_resource *resource_, const char *title) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_TITLE, title); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an appid event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_appid(struct wl_resource *resource_, const char *appid) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_APPID, appid); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an layout_symbol event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_layout_symbol(struct wl_resource *resource_, const char *layout) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_LAYOUT_SYMBOL, layout); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an frame event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_frame(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_FRAME); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an fullscreen event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_fullscreen(struct wl_resource *resource_, uint32_t is_fullscreen) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_FULLSCREEN, is_fullscreen); +} + +/** + * @ingroup iface_zpeachwm_ipc_output_v2 + * Sends an floating event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zpeachwm_ipc_output_v2_send_floating(struct wl_resource *resource_, uint32_t is_floating) +{ + wl_resource_post_event(resource_, ZPEACHWM_IPC_OUTPUT_V2_FLOATING, is_floating); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/pointer-constraints-unstable-v1-protocol.h b/protocols/pointer-constraints-unstable-v1-protocol.h new file mode 100644 index 0000000..0d48fcd --- /dev/null +++ b/protocols/pointer-constraints-unstable-v1-protocol.h @@ -0,0 +1,615 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef POINTER_CONSTRAINTS_UNSTABLE_V1_SERVER_PROTOCOL_H +#define POINTER_CONSTRAINTS_UNSTABLE_V1_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_pointer_constraints_unstable_v1 The pointer_constraints_unstable_v1 protocol + * protocol for constraining pointer motions + * + * @section page_desc_pointer_constraints_unstable_v1 Description + * + * This protocol specifies a set of interfaces used for adding constraints to + * the motion of a pointer. Possible constraints include confining pointer + * motions to a given region, or locking it to its current position. + * + * In order to constrain the pointer, a client must first bind the global + * interface "wp_pointer_constraints" which, if a compositor supports pointer + * constraints, is exposed by the registry. Using the bound global object, the + * client uses the request that corresponds to the type of constraint it wants + * to make. See wp_pointer_constraints for more details. + * + * Warning! The protocol described in this file is experimental and backward + * incompatible changes may be made. Backward compatible changes may be added + * together with the corresponding interface version bump. Backward + * incompatible changes are done by bumping the version number in the protocol + * and interface names and resetting the interface version. Once the protocol + * is to be declared stable, the 'z' prefix and the version number in the + * protocol and interface names are removed and the interface version number is + * reset. + * + * @section page_ifaces_pointer_constraints_unstable_v1 Interfaces + * - @subpage page_iface_zwp_pointer_constraints_v1 - constrain the movement of a pointer + * - @subpage page_iface_zwp_locked_pointer_v1 - receive relative pointer motion events + * - @subpage page_iface_zwp_confined_pointer_v1 - confined pointer object + * @section page_copyright_pointer_constraints_unstable_v1 Copyright + *
+ *
+ * Copyright © 2014      Jonas Ådahl
+ * Copyright © 2015      Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * 
+ */ +struct wl_pointer; +struct wl_region; +struct wl_surface; +struct zwp_confined_pointer_v1; +struct zwp_locked_pointer_v1; +struct zwp_pointer_constraints_v1; + +#ifndef ZWP_POINTER_CONSTRAINTS_V1_INTERFACE +#define ZWP_POINTER_CONSTRAINTS_V1_INTERFACE +/** + * @page page_iface_zwp_pointer_constraints_v1 zwp_pointer_constraints_v1 + * @section page_iface_zwp_pointer_constraints_v1_desc Description + * + * The global interface exposing pointer constraining functionality. It + * exposes two requests: lock_pointer for locking the pointer to its + * position, and confine_pointer for locking the pointer to a region. + * + * The lock_pointer and confine_pointer requests create the objects + * wp_locked_pointer and wp_confined_pointer respectively, and the client can + * use these objects to interact with the lock. + * + * For any surface, only one lock or confinement may be active across all + * wl_pointer objects of the same seat. If a lock or confinement is requested + * when another lock or confinement is active or requested on the same surface + * and with any of the wl_pointer objects of the same seat, an + * 'already_constrained' error will be raised. + * @section page_iface_zwp_pointer_constraints_v1_api API + * See @ref iface_zwp_pointer_constraints_v1. + */ +/** + * @defgroup iface_zwp_pointer_constraints_v1 The zwp_pointer_constraints_v1 interface + * + * The global interface exposing pointer constraining functionality. It + * exposes two requests: lock_pointer for locking the pointer to its + * position, and confine_pointer for locking the pointer to a region. + * + * The lock_pointer and confine_pointer requests create the objects + * wp_locked_pointer and wp_confined_pointer respectively, and the client can + * use these objects to interact with the lock. + * + * For any surface, only one lock or confinement may be active across all + * wl_pointer objects of the same seat. If a lock or confinement is requested + * when another lock or confinement is active or requested on the same surface + * and with any of the wl_pointer objects of the same seat, an + * 'already_constrained' error will be raised. + */ +extern const struct wl_interface zwp_pointer_constraints_v1_interface; +#endif +#ifndef ZWP_LOCKED_POINTER_V1_INTERFACE +#define ZWP_LOCKED_POINTER_V1_INTERFACE +/** + * @page page_iface_zwp_locked_pointer_v1 zwp_locked_pointer_v1 + * @section page_iface_zwp_locked_pointer_v1_desc Description + * + * The wp_locked_pointer interface represents a locked pointer state. + * + * While the lock of this object is active, the wl_pointer objects of the + * associated seat will not emit any wl_pointer.motion events. + * + * This object will send the event 'locked' when the lock is activated. + * Whenever the lock is activated, it is guaranteed that the locked surface + * will already have received pointer focus and that the pointer will be + * within the region passed to the request creating this object. + * + * To unlock the pointer, send the destroy request. This will also destroy + * the wp_locked_pointer object. + * + * If the compositor decides to unlock the pointer the unlocked event is + * sent. See wp_locked_pointer.unlock for details. + * + * When unlocking, the compositor may warp the cursor position to the set + * cursor position hint. If it does, it will not result in any relative + * motion events emitted via wp_relative_pointer. + * + * If the surface the lock was requested on is destroyed and the lock is not + * yet activated, the wp_locked_pointer object is now defunct and must be + * destroyed. + * @section page_iface_zwp_locked_pointer_v1_api API + * See @ref iface_zwp_locked_pointer_v1. + */ +/** + * @defgroup iface_zwp_locked_pointer_v1 The zwp_locked_pointer_v1 interface + * + * The wp_locked_pointer interface represents a locked pointer state. + * + * While the lock of this object is active, the wl_pointer objects of the + * associated seat will not emit any wl_pointer.motion events. + * + * This object will send the event 'locked' when the lock is activated. + * Whenever the lock is activated, it is guaranteed that the locked surface + * will already have received pointer focus and that the pointer will be + * within the region passed to the request creating this object. + * + * To unlock the pointer, send the destroy request. This will also destroy + * the wp_locked_pointer object. + * + * If the compositor decides to unlock the pointer the unlocked event is + * sent. See wp_locked_pointer.unlock for details. + * + * When unlocking, the compositor may warp the cursor position to the set + * cursor position hint. If it does, it will not result in any relative + * motion events emitted via wp_relative_pointer. + * + * If the surface the lock was requested on is destroyed and the lock is not + * yet activated, the wp_locked_pointer object is now defunct and must be + * destroyed. + */ +extern const struct wl_interface zwp_locked_pointer_v1_interface; +#endif +#ifndef ZWP_CONFINED_POINTER_V1_INTERFACE +#define ZWP_CONFINED_POINTER_V1_INTERFACE +/** + * @page page_iface_zwp_confined_pointer_v1 zwp_confined_pointer_v1 + * @section page_iface_zwp_confined_pointer_v1_desc Description + * + * The wp_confined_pointer interface represents a confined pointer state. + * + * This object will send the event 'confined' when the confinement is + * activated. Whenever the confinement is activated, it is guaranteed that + * the surface the pointer is confined to will already have received pointer + * focus and that the pointer will be within the region passed to the request + * creating this object. It is up to the compositor to decide whether this + * requires some user interaction and if the pointer will warp to within the + * passed region if outside. + * + * To unconfine the pointer, send the destroy request. This will also destroy + * the wp_confined_pointer object. + * + * If the compositor decides to unconfine the pointer the unconfined event is + * sent. The wp_confined_pointer object is at this point defunct and should + * be destroyed. + * @section page_iface_zwp_confined_pointer_v1_api API + * See @ref iface_zwp_confined_pointer_v1. + */ +/** + * @defgroup iface_zwp_confined_pointer_v1 The zwp_confined_pointer_v1 interface + * + * The wp_confined_pointer interface represents a confined pointer state. + * + * This object will send the event 'confined' when the confinement is + * activated. Whenever the confinement is activated, it is guaranteed that + * the surface the pointer is confined to will already have received pointer + * focus and that the pointer will be within the region passed to the request + * creating this object. It is up to the compositor to decide whether this + * requires some user interaction and if the pointer will warp to within the + * passed region if outside. + * + * To unconfine the pointer, send the destroy request. This will also destroy + * the wp_confined_pointer object. + * + * If the compositor decides to unconfine the pointer the unconfined event is + * sent. The wp_confined_pointer object is at this point defunct and should + * be destroyed. + */ +extern const struct wl_interface zwp_confined_pointer_v1_interface; +#endif + +#ifndef ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM +#define ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM +/** + * @ingroup iface_zwp_pointer_constraints_v1 + * wp_pointer_constraints error values + * + * These errors can be emitted in response to wp_pointer_constraints + * requests. + */ +enum zwp_pointer_constraints_v1_error { + /** + * pointer constraint already requested on that surface + */ + ZWP_POINTER_CONSTRAINTS_V1_ERROR_ALREADY_CONSTRAINED = 1, +}; +#endif /* ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM */ + +#ifndef ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM_IS_VALID +#define ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_zwp_pointer_constraints_v1 + * Validate a zwp_pointer_constraints_v1 error value. + * + * @return true on success, false on error. + * @ref zwp_pointer_constraints_v1_error + */ +static inline bool +zwp_pointer_constraints_v1_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWP_POINTER_CONSTRAINTS_V1_ERROR_ALREADY_CONSTRAINED: + return version >= 1; + default: + return false; + } +} +#endif /* ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM_IS_VALID */ + +#ifndef ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM +#define ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM +/** + * @ingroup iface_zwp_pointer_constraints_v1 + * constraint lifetime + * + * These values represent different lifetime semantics. They are passed + * as arguments to the factory requests to specify how the constraint + * lifetimes should be managed. + */ +enum zwp_pointer_constraints_v1_lifetime { + /** + * the pointer constraint is defunct once deactivated + * + * A oneshot pointer constraint will never reactivate once it has + * been deactivated. See the corresponding deactivation event + * (wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) + * for details. + */ + ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ONESHOT = 1, + /** + * the pointer constraint may reactivate + * + * A persistent pointer constraint may again reactivate once it + * has been deactivated. See the corresponding deactivation event + * (wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) + * for details. + */ + ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT = 2, +}; +#endif /* ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM */ + +#ifndef ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM_IS_VALID +#define ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM_IS_VALID +/** + * @ingroup iface_zwp_pointer_constraints_v1 + * Validate a zwp_pointer_constraints_v1 lifetime value. + * + * @return true on success, false on error. + * @ref zwp_pointer_constraints_v1_lifetime + */ +static inline bool +zwp_pointer_constraints_v1_lifetime_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ONESHOT: + return version >= 1; + case ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT: + return version >= 1; + default: + return false; + } +} +#endif /* ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM_IS_VALID */ + +/** + * @ingroup iface_zwp_pointer_constraints_v1 + * @struct zwp_pointer_constraints_v1_interface + */ +struct zwp_pointer_constraints_v1_interface { + /** + * destroy the pointer constraints manager object + * + * Used by the client to notify the server that it will no longer + * use this pointer constraints object. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * lock pointer to a position + * + * The lock_pointer request lets the client request to disable + * movements of the virtual pointer (i.e. the cursor), effectively + * locking the pointer to a position. This request may not take + * effect immediately; in the future, when the compositor deems + * implementation-specific constraints are satisfied, the pointer + * lock will be activated and the compositor sends a locked event. + * + * The protocol provides no guarantee that the constraints are ever + * satisfied, and does not require the compositor to send an error + * if the constraints cannot ever be satisfied. It is thus possible + * to request a lock that will never activate. + * + * There may not be another pointer constraint of any kind + * requested or active on the surface for any of the wl_pointer + * objects of the seat of the passed pointer when requesting a + * lock. If there is, an error will be raised. See general pointer + * lock documentation for more details. + * + * The intersection of the region passed with this request and the + * input region of the surface is used to determine where the + * pointer must be in order for the lock to activate. It is up to + * the compositor whether to warp the pointer or require some kind + * of user interaction for the lock to activate. If the region is + * null the surface input region is used. + * + * A surface may receive pointer focus without the lock being + * activated. + * + * The request creates a new object wp_locked_pointer which is used + * to interact with the lock as well as receive updates about its + * state. See the the description of wp_locked_pointer for further + * information. + * + * Note that while a pointer is locked, the wl_pointer objects of + * the corresponding seat will not emit any wl_pointer.motion + * events, but relative motion events will still be emitted via + * wp_relative_pointer objects of the same seat. wl_pointer.axis + * and wl_pointer.button events are unaffected. + * @param surface surface to lock pointer to + * @param pointer the pointer that should be locked + * @param region region of surface + * @param lifetime lock lifetime + */ + void (*lock_pointer)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface, + struct wl_resource *pointer, + struct wl_resource *region, + uint32_t lifetime); + /** + * confine pointer to a region + * + * The confine_pointer request lets the client request to confine + * the pointer cursor to a given region. This request may not take + * effect immediately; in the future, when the compositor deems + * implementation- specific constraints are satisfied, the pointer + * confinement will be activated and the compositor sends a + * confined event. + * + * The intersection of the region passed with this request and the + * input region of the surface is used to determine where the + * pointer must be in order for the confinement to activate. It is + * up to the compositor whether to warp the pointer or require some + * kind of user interaction for the confinement to activate. If the + * region is null the surface input region is used. + * + * The request will create a new object wp_confined_pointer which + * is used to interact with the confinement as well as receive + * updates about its state. See the the description of + * wp_confined_pointer for further information. + * @param surface surface to lock pointer to + * @param pointer the pointer that should be confined + * @param region region of surface + * @param lifetime confinement lifetime + */ + void (*confine_pointer)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface, + struct wl_resource *pointer, + struct wl_resource *region, + uint32_t lifetime); +}; + + +/** + * @ingroup iface_zwp_pointer_constraints_v1 + */ +#define ZWP_POINTER_CONSTRAINTS_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_pointer_constraints_v1 + */ +#define ZWP_POINTER_CONSTRAINTS_V1_LOCK_POINTER_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_pointer_constraints_v1 + */ +#define ZWP_POINTER_CONSTRAINTS_V1_CONFINE_POINTER_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_locked_pointer_v1 + * @struct zwp_locked_pointer_v1_interface + */ +struct zwp_locked_pointer_v1_interface { + /** + * destroy the locked pointer object + * + * Destroy the locked pointer object. If applicable, the + * compositor will unlock the pointer. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the pointer cursor position hint + * + * Set the cursor position hint relative to the top left corner + * of the surface. + * + * If the client is drawing its own cursor, it should update the + * position hint to the position of its own cursor. A compositor + * may use this information to warp the pointer upon unlock in + * order to avoid pointer jumps. + * + * The cursor position hint is double-buffered state, see + * wl_surface.commit. + * @param surface_x surface-local x coordinate + * @param surface_y surface-local y coordinate + */ + void (*set_cursor_position_hint)(struct wl_client *client, + struct wl_resource *resource, + wl_fixed_t surface_x, + wl_fixed_t surface_y); + /** + * set a new lock region + * + * Set a new region used to lock the pointer. + * + * The new lock region is double-buffered, see wl_surface.commit. + * + * For details about the lock region, see wp_locked_pointer. + * @param region region of surface + */ + void (*set_region)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *region); +}; + +#define ZWP_LOCKED_POINTER_V1_LOCKED 0 +#define ZWP_LOCKED_POINTER_V1_UNLOCKED 1 + +/** + * @ingroup iface_zwp_locked_pointer_v1 + */ +#define ZWP_LOCKED_POINTER_V1_LOCKED_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_locked_pointer_v1 + */ +#define ZWP_LOCKED_POINTER_V1_UNLOCKED_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_locked_pointer_v1 + */ +#define ZWP_LOCKED_POINTER_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_locked_pointer_v1 + */ +#define ZWP_LOCKED_POINTER_V1_SET_CURSOR_POSITION_HINT_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_locked_pointer_v1 + */ +#define ZWP_LOCKED_POINTER_V1_SET_REGION_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_locked_pointer_v1 + * Sends an locked event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwp_locked_pointer_v1_send_locked(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWP_LOCKED_POINTER_V1_LOCKED); +} + +/** + * @ingroup iface_zwp_locked_pointer_v1 + * Sends an unlocked event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwp_locked_pointer_v1_send_unlocked(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWP_LOCKED_POINTER_V1_UNLOCKED); +} + +/** + * @ingroup iface_zwp_confined_pointer_v1 + * @struct zwp_confined_pointer_v1_interface + */ +struct zwp_confined_pointer_v1_interface { + /** + * destroy the confined pointer object + * + * Destroy the confined pointer object. If applicable, the + * compositor will unconfine the pointer. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set a new confine region + * + * Set a new region used to confine the pointer. + * + * The new confine region is double-buffered, see + * wl_surface.commit. + * + * If the confinement is active when the new confinement region is + * applied and the pointer ends up outside of newly applied region, + * the pointer may warped to a position within the new confinement + * region. If warped, a wl_pointer.motion event will be emitted, + * but no wp_relative_pointer.relative_motion event. + * + * The compositor may also, instead of using the new region, + * unconfine the pointer. + * + * For details about the confine region, see wp_confined_pointer. + * @param region region of surface + */ + void (*set_region)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *region); +}; + +#define ZWP_CONFINED_POINTER_V1_CONFINED 0 +#define ZWP_CONFINED_POINTER_V1_UNCONFINED 1 + +/** + * @ingroup iface_zwp_confined_pointer_v1 + */ +#define ZWP_CONFINED_POINTER_V1_CONFINED_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_confined_pointer_v1 + */ +#define ZWP_CONFINED_POINTER_V1_UNCONFINED_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_confined_pointer_v1 + */ +#define ZWP_CONFINED_POINTER_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_zwp_confined_pointer_v1 + */ +#define ZWP_CONFINED_POINTER_V1_SET_REGION_SINCE_VERSION 1 + +/** + * @ingroup iface_zwp_confined_pointer_v1 + * Sends an confined event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwp_confined_pointer_v1_send_confined(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWP_CONFINED_POINTER_V1_CONFINED); +} + +/** + * @ingroup iface_zwp_confined_pointer_v1 + * Sends an unconfined event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwp_confined_pointer_v1_send_unconfined(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWP_CONFINED_POINTER_V1_UNCONFINED); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/wlr-layer-shell-unstable-v1-protocol.h b/protocols/wlr-layer-shell-unstable-v1-protocol.h new file mode 100644 index 0000000..dd34d59 --- /dev/null +++ b/protocols/wlr-layer-shell-unstable-v1-protocol.h @@ -0,0 +1,730 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef WLR_LAYER_SHELL_UNSTABLE_V1_SERVER_PROTOCOL_H +#define WLR_LAYER_SHELL_UNSTABLE_V1_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_wlr_layer_shell_unstable_v1 The wlr_layer_shell_unstable_v1 protocol + * @section page_ifaces_wlr_layer_shell_unstable_v1 Interfaces + * - @subpage page_iface_zwlr_layer_shell_v1 - create surfaces that are layers of the desktop + * - @subpage page_iface_zwlr_layer_surface_v1 - layer metadata interface + * @section page_copyright_wlr_layer_shell_unstable_v1 Copyright + *
+ *
+ * Copyright © 2017 Drew DeVault
+ *
+ * Permission to use, copy, modify, distribute, and sell this
+ * software and its documentation for any purpose is hereby granted
+ * without fee, provided that the above copyright notice appear in
+ * all copies and that both that copyright notice and this permission
+ * notice appear in supporting documentation, and that the name of
+ * the copyright holders not be used in advertising or publicity
+ * pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ * 
+ */ +struct wl_output; +struct wl_surface; +struct xdg_popup; +struct zwlr_layer_shell_v1; +struct zwlr_layer_surface_v1; + +#ifndef ZWLR_LAYER_SHELL_V1_INTERFACE +#define ZWLR_LAYER_SHELL_V1_INTERFACE +/** + * @page page_iface_zwlr_layer_shell_v1 zwlr_layer_shell_v1 + * @section page_iface_zwlr_layer_shell_v1_desc Description + * + * Clients can use this interface to assign the surface_layer role to + * wl_surfaces. Such surfaces are assigned to a "layer" of the output and + * rendered with a defined z-depth respective to each other. They may also be + * anchored to the edges and corners of a screen and specify input handling + * semantics. This interface should be suitable for the implementation of + * many desktop shell components, and a broad number of other applications + * that interact with the desktop. + * @section page_iface_zwlr_layer_shell_v1_api API + * See @ref iface_zwlr_layer_shell_v1. + */ +/** + * @defgroup iface_zwlr_layer_shell_v1 The zwlr_layer_shell_v1 interface + * + * Clients can use this interface to assign the surface_layer role to + * wl_surfaces. Such surfaces are assigned to a "layer" of the output and + * rendered with a defined z-depth respective to each other. They may also be + * anchored to the edges and corners of a screen and specify input handling + * semantics. This interface should be suitable for the implementation of + * many desktop shell components, and a broad number of other applications + * that interact with the desktop. + */ +extern const struct wl_interface zwlr_layer_shell_v1_interface; +#endif +#ifndef ZWLR_LAYER_SURFACE_V1_INTERFACE +#define ZWLR_LAYER_SURFACE_V1_INTERFACE +/** + * @page page_iface_zwlr_layer_surface_v1 zwlr_layer_surface_v1 + * @section page_iface_zwlr_layer_surface_v1_desc Description + * + * An interface that may be implemented by a wl_surface, for surfaces that + * are designed to be rendered as a layer of a stacked desktop-like + * environment. + * + * Layer surface state (layer, size, anchor, exclusive zone, + * margin, interactivity) is double-buffered, and will be applied at the + * time wl_surface.commit of the corresponding wl_surface is called. + * + * Attaching a null buffer to a layer surface unmaps it. + * + * Unmapping a layer_surface means that the surface cannot be shown by the + * compositor until it is explicitly mapped again. The layer_surface + * returns to the state it had right after layer_shell.get_layer_surface. + * The client can re-map the surface by performing a commit without any + * buffer attached, waiting for a configure event and handling it as usual. + * @section page_iface_zwlr_layer_surface_v1_api API + * See @ref iface_zwlr_layer_surface_v1. + */ +/** + * @defgroup iface_zwlr_layer_surface_v1 The zwlr_layer_surface_v1 interface + * + * An interface that may be implemented by a wl_surface, for surfaces that + * are designed to be rendered as a layer of a stacked desktop-like + * environment. + * + * Layer surface state (layer, size, anchor, exclusive zone, + * margin, interactivity) is double-buffered, and will be applied at the + * time wl_surface.commit of the corresponding wl_surface is called. + * + * Attaching a null buffer to a layer surface unmaps it. + * + * Unmapping a layer_surface means that the surface cannot be shown by the + * compositor until it is explicitly mapped again. The layer_surface + * returns to the state it had right after layer_shell.get_layer_surface. + * The client can re-map the surface by performing a commit without any + * buffer attached, waiting for a configure event and handling it as usual. + */ +extern const struct wl_interface zwlr_layer_surface_v1_interface; +#endif + +#ifndef ZWLR_LAYER_SHELL_V1_ERROR_ENUM +#define ZWLR_LAYER_SHELL_V1_ERROR_ENUM +enum zwlr_layer_shell_v1_error { + /** + * wl_surface has another role + */ + ZWLR_LAYER_SHELL_V1_ERROR_ROLE = 0, + /** + * layer value is invalid + */ + ZWLR_LAYER_SHELL_V1_ERROR_INVALID_LAYER = 1, + /** + * wl_surface has a buffer attached or committed + */ + ZWLR_LAYER_SHELL_V1_ERROR_ALREADY_CONSTRUCTED = 2, +}; +#endif /* ZWLR_LAYER_SHELL_V1_ERROR_ENUM */ + +#ifndef ZWLR_LAYER_SHELL_V1_ERROR_ENUM_IS_VALID +#define ZWLR_LAYER_SHELL_V1_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_layer_shell_v1 + * Validate a zwlr_layer_shell_v1 error value. + * + * @return true on success, false on error. + * @ref zwlr_layer_shell_v1_error + */ +static inline bool +zwlr_layer_shell_v1_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_LAYER_SHELL_V1_ERROR_ROLE: + return version >= 1; + case ZWLR_LAYER_SHELL_V1_ERROR_INVALID_LAYER: + return version >= 1; + case ZWLR_LAYER_SHELL_V1_ERROR_ALREADY_CONSTRUCTED: + return version >= 1; + default: + return false; + } +} +#endif /* ZWLR_LAYER_SHELL_V1_ERROR_ENUM_IS_VALID */ + +#ifndef ZWLR_LAYER_SHELL_V1_LAYER_ENUM +#define ZWLR_LAYER_SHELL_V1_LAYER_ENUM +/** + * @ingroup iface_zwlr_layer_shell_v1 + * available layers for surfaces + * + * These values indicate which layers a surface can be rendered in. They + * are ordered by z depth, bottom-most first. Traditional shell surfaces + * will typically be rendered between the bottom and top layers. + * Fullscreen shell surfaces are typically rendered at the top layer. + * Multiple surfaces can share a single layer, and ordering within a + * single layer is undefined. + */ +enum zwlr_layer_shell_v1_layer { + ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND = 0, + ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM = 1, + ZWLR_LAYER_SHELL_V1_LAYER_TOP = 2, + ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY = 3, +}; +#endif /* ZWLR_LAYER_SHELL_V1_LAYER_ENUM */ + +#ifndef ZWLR_LAYER_SHELL_V1_LAYER_ENUM_IS_VALID +#define ZWLR_LAYER_SHELL_V1_LAYER_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_layer_shell_v1 + * Validate a zwlr_layer_shell_v1 layer value. + * + * @return true on success, false on error. + * @ref zwlr_layer_shell_v1_layer + */ +static inline bool +zwlr_layer_shell_v1_layer_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND: + return version >= 1; + case ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM: + return version >= 1; + case ZWLR_LAYER_SHELL_V1_LAYER_TOP: + return version >= 1; + case ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY: + return version >= 1; + default: + return false; + } +} +#endif /* ZWLR_LAYER_SHELL_V1_LAYER_ENUM_IS_VALID */ + +/** + * @ingroup iface_zwlr_layer_shell_v1 + * @struct zwlr_layer_shell_v1_interface + */ +struct zwlr_layer_shell_v1_interface { + /** + * create a layer_surface from a surface + * + * Create a layer surface for an existing surface. This assigns + * the role of layer_surface, or raises a protocol error if another + * role is already assigned. + * + * Creating a layer surface from a wl_surface which has a buffer + * attached or committed is a client error, and any attempts by a + * client to attach or manipulate a buffer prior to the first + * layer_surface.configure call must also be treated as errors. + * + * After creating a layer_surface object and setting it up, the + * client must perform an initial commit without any buffer + * attached. The compositor will reply with a + * layer_surface.configure event. The client must acknowledge it + * and is then allowed to attach a buffer to map the surface. + * + * You may pass NULL for output to allow the compositor to decide + * which output to use. Generally this will be the one that the + * user most recently interacted with. + * + * Clients can specify a namespace that defines the purpose of the + * layer surface. + * @param layer layer to add this surface to + * @param namespace namespace for the layer surface + */ + void (*get_layer_surface)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface, + struct wl_resource *output, + uint32_t layer, + const char *namespace); + /** + * destroy the layer_shell object + * + * This request indicates that the client will not use the + * layer_shell object any more. Objects that have been created + * through this instance are not affected. + * @since 3 + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); +}; + + +/** + * @ingroup iface_zwlr_layer_shell_v1 + */ +#define ZWLR_LAYER_SHELL_V1_GET_LAYER_SURFACE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_shell_v1 + */ +#define ZWLR_LAYER_SHELL_V1_DESTROY_SINCE_VERSION 3 + +#ifndef ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM +#define ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM +/** + * @ingroup iface_zwlr_layer_surface_v1 + * types of keyboard interaction possible for a layer shell surface + * + * Types of keyboard interaction possible for layer shell surfaces. The + * rationale for this is twofold: (1) some applications are not interested + * in keyboard events and not allowing them to be focused can improve the + * desktop experience; (2) some applications will want to take exclusive + * keyboard focus. + */ +enum zwlr_layer_surface_v1_keyboard_interactivity { + /** + * no keyboard focus is possible + * + * This value indicates that this surface is not interested in + * keyboard events and the compositor should never assign it the + * keyboard focus. + * + * This is the default value, set for newly created layer shell + * surfaces. + * + * This is useful for e.g. desktop widgets that display information + * or only have interaction with non-keyboard input devices. + */ + ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_NONE = 0, + /** + * request exclusive keyboard focus + * + * Request exclusive keyboard focus if this surface is above the + * shell surface layer. + * + * For the top and overlay layers, the seat will always give + * exclusive keyboard focus to the top-most layer which has + * keyboard interactivity set to exclusive. If this layer contains + * multiple surfaces with keyboard interactivity set to exclusive, + * the compositor determines the one receiving keyboard events in + * an implementation- defined manner. In this case, no guarantee is + * made when this surface will receive keyboard focus (if ever). + * + * For the bottom and background layers, the compositor is allowed + * to use normal focus semantics. + * + * This setting is mainly intended for applications that need to + * ensure they receive all keyboard events, such as a lock screen + * or a password prompt. + */ + ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE = 1, + /** + * request regular keyboard focus semantics + * + * This requests the compositor to allow this surface to be + * focused and unfocused by the user in an implementation-defined + * manner. The user should be able to unfocus this surface even + * regardless of the layer it is on. + * + * Typically, the compositor will want to use its normal mechanism + * to manage keyboard focus between layer shell surfaces with this + * setting and regular toplevels on the desktop layer (e.g. click + * to focus). Nevertheless, it is possible for a compositor to + * require a special interaction to focus or unfocus layer shell + * surfaces (e.g. requiring a click even if focus follows the mouse + * normally, or providing a keybinding to switch focus between + * layers). + * + * This setting is mainly intended for desktop shell components + * (e.g. panels) that allow keyboard interaction. Using this option + * can allow implementing a desktop shell that can be fully usable + * without the mouse. + * @since 4 + */ + ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ON_DEMAND = 2, +}; +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ON_DEMAND_SINCE_VERSION 4 +#endif /* ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM */ + +#ifndef ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM_IS_VALID +#define ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_layer_surface_v1 + * Validate a zwlr_layer_surface_v1 keyboard_interactivity value. + * + * @return true on success, false on error. + * @ref zwlr_layer_surface_v1_keyboard_interactivity + */ +static inline bool +zwlr_layer_surface_v1_keyboard_interactivity_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_NONE: + return version >= 1; + case ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE: + return version >= 1; + case ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ON_DEMAND: + return version >= 4; + default: + return false; + } +} +#endif /* ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ENUM_IS_VALID */ + +#ifndef ZWLR_LAYER_SURFACE_V1_ERROR_ENUM +#define ZWLR_LAYER_SURFACE_V1_ERROR_ENUM +enum zwlr_layer_surface_v1_error { + /** + * provided surface state is invalid + */ + ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SURFACE_STATE = 0, + /** + * size is invalid + */ + ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SIZE = 1, + /** + * anchor bitfield is invalid + */ + ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_ANCHOR = 2, + /** + * keyboard interactivity is invalid + */ + ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_KEYBOARD_INTERACTIVITY = 3, +}; +#endif /* ZWLR_LAYER_SURFACE_V1_ERROR_ENUM */ + +#ifndef ZWLR_LAYER_SURFACE_V1_ERROR_ENUM_IS_VALID +#define ZWLR_LAYER_SURFACE_V1_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_layer_surface_v1 + * Validate a zwlr_layer_surface_v1 error value. + * + * @return true on success, false on error. + * @ref zwlr_layer_surface_v1_error + */ +static inline bool +zwlr_layer_surface_v1_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SURFACE_STATE: + return version >= 1; + case ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_SIZE: + return version >= 1; + case ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_ANCHOR: + return version >= 1; + case ZWLR_LAYER_SURFACE_V1_ERROR_INVALID_KEYBOARD_INTERACTIVITY: + return version >= 1; + default: + return false; + } +} +#endif /* ZWLR_LAYER_SURFACE_V1_ERROR_ENUM_IS_VALID */ + +#ifndef ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM +#define ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM +enum zwlr_layer_surface_v1_anchor { + /** + * the top edge of the anchor rectangle + */ + ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP = 1, + /** + * the bottom edge of the anchor rectangle + */ + ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM = 2, + /** + * the left edge of the anchor rectangle + */ + ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT = 4, + /** + * the right edge of the anchor rectangle + */ + ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT = 8, +}; +#endif /* ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM */ + +#ifndef ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM_IS_VALID +#define ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_layer_surface_v1 + * Validate a zwlr_layer_surface_v1 anchor value. + * + * @return true on success, false on error. + * @ref zwlr_layer_surface_v1_anchor + */ +static inline bool +zwlr_layer_surface_v1_anchor_is_valid(uint32_t value, uint32_t version) { + uint32_t valid = 0; + if (version >= 1) + valid |= ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP; + if (version >= 1) + valid |= ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM; + if (version >= 1) + valid |= ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT; + if (version >= 1) + valid |= ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT; + return (value & ~valid) == 0; +} +#endif /* ZWLR_LAYER_SURFACE_V1_ANCHOR_ENUM_IS_VALID */ + +/** + * @ingroup iface_zwlr_layer_surface_v1 + * @struct zwlr_layer_surface_v1_interface + */ +struct zwlr_layer_surface_v1_interface { + /** + * sets the size of the surface + * + * Sets the size of the surface in surface-local coordinates. The + * compositor will display the surface centered with respect to its + * anchors. + * + * If you pass 0 for either value, the compositor will assign it + * and inform you of the assignment in the configure event. You + * must set your anchor to opposite edges in the dimensions you + * omit; not doing so is a protocol error. Both values are 0 by + * default. + * + * Size is double-buffered, see wl_surface.commit. + */ + void (*set_size)(struct wl_client *client, + struct wl_resource *resource, + uint32_t width, + uint32_t height); + /** + * configures the anchor point of the surface + * + * Requests that the compositor anchor the surface to the + * specified edges and corners. If two orthogonal edges are + * specified (e.g. 'top' and 'left'), then the anchor point will be + * the intersection of the edges (e.g. the top left corner of the + * output); otherwise the anchor point will be centered on that + * edge, or in the center if none is specified. + * + * Anchor is double-buffered, see wl_surface.commit. + */ + void (*set_anchor)(struct wl_client *client, + struct wl_resource *resource, + uint32_t anchor); + /** + * configures the exclusive geometry of this surface + * + * Requests that the compositor avoids occluding an area with + * other surfaces. The compositor's use of this information is + * implementation-dependent - do not assume that this region will + * not actually be occluded. + * + * A positive value is only meaningful if the surface is anchored + * to one edge or an edge and both perpendicular edges. If the + * surface is not anchored, anchored to only two perpendicular + * edges (a corner), anchored to only two parallel edges or + * anchored to all edges, a positive value will be treated the same + * as zero. + * + * A positive zone is the distance from the edge in surface-local + * coordinates to consider exclusive. + * + * Surfaces that do not wish to have an exclusive zone may instead + * specify how they should interact with surfaces that do. If set + * to zero, the surface indicates that it would like to be moved to + * avoid occluding surfaces with a positive exclusive zone. If set + * to -1, the surface indicates that it would not like to be moved + * to accommodate for other surfaces, and the compositor should + * extend it all the way to the edges it is anchored to. + * + * For example, a panel might set its exclusive zone to 10, so that + * maximized shell surfaces are not shown on top of it. A + * notification might set its exclusive zone to 0, so that it is + * moved to avoid occluding the panel, but shell surfaces are shown + * underneath it. A wallpaper or lock screen might set their + * exclusive zone to -1, so that they stretch below or over the + * panel. + * + * The default value is 0. + * + * Exclusive zone is double-buffered, see wl_surface.commit. + */ + void (*set_exclusive_zone)(struct wl_client *client, + struct wl_resource *resource, + int32_t zone); + /** + * sets a margin from the anchor point + * + * Requests that the surface be placed some distance away from + * the anchor point on the output, in surface-local coordinates. + * Setting this value for edges you are not anchored to has no + * effect. + * + * The exclusive zone includes the margin. + * + * Margin is double-buffered, see wl_surface.commit. + */ + void (*set_margin)(struct wl_client *client, + struct wl_resource *resource, + int32_t top, + int32_t right, + int32_t bottom, + int32_t left); + /** + * requests keyboard events + * + * Set how keyboard events are delivered to this surface. By + * default, layer shell surfaces do not receive keyboard events; + * this request can be used to change this. + * + * This setting is inherited by child surfaces set by the get_popup + * request. + * + * Layer surfaces receive pointer, touch, and tablet events + * normally. If you do not want to receive them, set the input + * region on your surface to an empty region. + * + * Keyboard interactivity is double-buffered, see + * wl_surface.commit. + */ + void (*set_keyboard_interactivity)(struct wl_client *client, + struct wl_resource *resource, + uint32_t keyboard_interactivity); + /** + * assign this layer_surface as an xdg_popup parent + * + * This assigns an xdg_popup's parent to this layer_surface. This + * popup should have been created via xdg_surface::get_popup with + * the parent set to NULL, and this request must be invoked before + * committing the popup's initial state. + * + * See the documentation of xdg_popup for more details about what + * an xdg_popup is and how it is used. + */ + void (*get_popup)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *popup); + /** + * ack a configure event + * + * When a configure event is received, if a client commits the + * surface in response to the configure event, then the client must + * make an ack_configure request sometime before the commit + * request, passing along the serial of the configure event. + * + * If the client receives multiple configure events before it can + * respond to one, it only has to ack the last configure event. + * + * A client is not required to commit immediately after sending an + * ack_configure request - it may even ack_configure several times + * before its next surface commit. + * + * A client may send multiple ack_configure requests before + * committing, but only the last request sent before a commit + * indicates which configure event the client really is responding + * to. + * @param serial the serial from the configure event + */ + void (*ack_configure)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial); + /** + * destroy the layer_surface + * + * This request destroys the layer surface. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * change the layer of the surface + * + * Change the layer that the surface is rendered on. + * + * Layer is double-buffered, see wl_surface.commit. + * @param layer layer to move this surface to + * @since 2 + */ + void (*set_layer)(struct wl_client *client, + struct wl_resource *resource, + uint32_t layer); +}; + +#define ZWLR_LAYER_SURFACE_V1_CONFIGURE 0 +#define ZWLR_LAYER_SURFACE_V1_CLOSED 1 + +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_CONFIGURE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_CLOSED_SINCE_VERSION 1 + +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_SIZE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_ANCHOR_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_EXCLUSIVE_ZONE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_MARGIN_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_KEYBOARD_INTERACTIVITY_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_GET_POPUP_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_ACK_CONFIGURE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_layer_surface_v1 + */ +#define ZWLR_LAYER_SURFACE_V1_SET_LAYER_SINCE_VERSION 2 + +/** + * @ingroup iface_zwlr_layer_surface_v1 + * Sends an configure event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwlr_layer_surface_v1_send_configure(struct wl_resource *resource_, uint32_t serial, uint32_t width, uint32_t height) +{ + wl_resource_post_event(resource_, ZWLR_LAYER_SURFACE_V1_CONFIGURE, serial, width, height); +} + +/** + * @ingroup iface_zwlr_layer_surface_v1 + * Sends an closed event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwlr_layer_surface_v1_send_closed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWLR_LAYER_SURFACE_V1_CLOSED); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/wlr-output-power-management-unstable-v1-protocol.h b/protocols/wlr-output-power-management-unstable-v1-protocol.h new file mode 100644 index 0000000..93d6a58 --- /dev/null +++ b/protocols/wlr-output-power-management-unstable-v1-protocol.h @@ -0,0 +1,285 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef WLR_OUTPUT_POWER_MANAGEMENT_UNSTABLE_V1_SERVER_PROTOCOL_H +#define WLR_OUTPUT_POWER_MANAGEMENT_UNSTABLE_V1_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_wlr_output_power_management_unstable_v1 The wlr_output_power_management_unstable_v1 protocol + * Control power management modes of outputs + * + * @section page_desc_wlr_output_power_management_unstable_v1 Description + * + * This protocol allows clients to control power management modes + * of outputs that are currently part of the compositor space. The + * intent is to allow special clients like desktop shells to power + * down outputs when the system is idle. + * + * To modify outputs not currently part of the compositor space see + * wlr-output-management. + * + * Warning! The protocol described in this file is experimental and + * backward incompatible changes may be made. Backward compatible changes + * may be added together with the corresponding interface version bump. + * Backward incompatible changes are done by bumping the version number in + * the protocol and interface names and resetting the interface version. + * Once the protocol is to be declared stable, the 'z' prefix and the + * version number in the protocol and interface names are removed and the + * interface version number is reset. + * + * @section page_ifaces_wlr_output_power_management_unstable_v1 Interfaces + * - @subpage page_iface_zwlr_output_power_manager_v1 - manager to create per-output power management + * - @subpage page_iface_zwlr_output_power_v1 - adjust power management mode for an output + * @section page_copyright_wlr_output_power_management_unstable_v1 Copyright + *
+ *
+ * Copyright © 2019 Purism SPC
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * 
+ */ +struct wl_output; +struct zwlr_output_power_manager_v1; +struct zwlr_output_power_v1; + +#ifndef ZWLR_OUTPUT_POWER_MANAGER_V1_INTERFACE +#define ZWLR_OUTPUT_POWER_MANAGER_V1_INTERFACE +/** + * @page page_iface_zwlr_output_power_manager_v1 zwlr_output_power_manager_v1 + * @section page_iface_zwlr_output_power_manager_v1_desc Description + * + * This interface is a manager that allows creating per-output power + * management mode controls. + * @section page_iface_zwlr_output_power_manager_v1_api API + * See @ref iface_zwlr_output_power_manager_v1. + */ +/** + * @defgroup iface_zwlr_output_power_manager_v1 The zwlr_output_power_manager_v1 interface + * + * This interface is a manager that allows creating per-output power + * management mode controls. + */ +extern const struct wl_interface zwlr_output_power_manager_v1_interface; +#endif +#ifndef ZWLR_OUTPUT_POWER_V1_INTERFACE +#define ZWLR_OUTPUT_POWER_V1_INTERFACE +/** + * @page page_iface_zwlr_output_power_v1 zwlr_output_power_v1 + * @section page_iface_zwlr_output_power_v1_desc Description + * + * This object offers requests to set the power management mode of + * an output. + * @section page_iface_zwlr_output_power_v1_api API + * See @ref iface_zwlr_output_power_v1. + */ +/** + * @defgroup iface_zwlr_output_power_v1 The zwlr_output_power_v1 interface + * + * This object offers requests to set the power management mode of + * an output. + */ +extern const struct wl_interface zwlr_output_power_v1_interface; +#endif + +/** + * @ingroup iface_zwlr_output_power_manager_v1 + * @struct zwlr_output_power_manager_v1_interface + */ +struct zwlr_output_power_manager_v1_interface { + /** + * get a power management for an output + * + * Create a output power management mode control that can be used + * to adjust the power management mode for a given output. + */ + void (*get_output_power)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *output); + /** + * destroy the manager + * + * All objects created by the manager will still remain valid, + * until their appropriate destroy request has been called. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); +}; + + +/** + * @ingroup iface_zwlr_output_power_manager_v1 + */ +#define ZWLR_OUTPUT_POWER_MANAGER_V1_GET_OUTPUT_POWER_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_output_power_manager_v1 + */ +#define ZWLR_OUTPUT_POWER_MANAGER_V1_DESTROY_SINCE_VERSION 1 + +#ifndef ZWLR_OUTPUT_POWER_V1_MODE_ENUM +#define ZWLR_OUTPUT_POWER_V1_MODE_ENUM +enum zwlr_output_power_v1_mode { + /** + * Output is turned off. + */ + ZWLR_OUTPUT_POWER_V1_MODE_OFF = 0, + /** + * Output is turned on, no power saving + */ + ZWLR_OUTPUT_POWER_V1_MODE_ON = 1, +}; +#endif /* ZWLR_OUTPUT_POWER_V1_MODE_ENUM */ + +#ifndef ZWLR_OUTPUT_POWER_V1_MODE_ENUM_IS_VALID +#define ZWLR_OUTPUT_POWER_V1_MODE_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_output_power_v1 + * Validate a zwlr_output_power_v1 mode value. + * + * @return true on success, false on error. + * @ref zwlr_output_power_v1_mode + */ +static inline bool +zwlr_output_power_v1_mode_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_OUTPUT_POWER_V1_MODE_OFF: + return version >= 1; + case ZWLR_OUTPUT_POWER_V1_MODE_ON: + return version >= 1; + default: + return false; + } +} +#endif /* ZWLR_OUTPUT_POWER_V1_MODE_ENUM_IS_VALID */ + +#ifndef ZWLR_OUTPUT_POWER_V1_ERROR_ENUM +#define ZWLR_OUTPUT_POWER_V1_ERROR_ENUM +enum zwlr_output_power_v1_error { + /** + * inexistent power save mode + */ + ZWLR_OUTPUT_POWER_V1_ERROR_INVALID_MODE = 1, +}; +#endif /* ZWLR_OUTPUT_POWER_V1_ERROR_ENUM */ + +#ifndef ZWLR_OUTPUT_POWER_V1_ERROR_ENUM_IS_VALID +#define ZWLR_OUTPUT_POWER_V1_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_zwlr_output_power_v1 + * Validate a zwlr_output_power_v1 error value. + * + * @return true on success, false on error. + * @ref zwlr_output_power_v1_error + */ +static inline bool +zwlr_output_power_v1_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case ZWLR_OUTPUT_POWER_V1_ERROR_INVALID_MODE: + return version >= 1; + default: + return false; + } +} +#endif /* ZWLR_OUTPUT_POWER_V1_ERROR_ENUM_IS_VALID */ + +/** + * @ingroup iface_zwlr_output_power_v1 + * @struct zwlr_output_power_v1_interface + */ +struct zwlr_output_power_v1_interface { + /** + * Set an outputs power save mode + * + * Set an output's power save mode to the given mode. The mode + * change is effective immediately. If the output does not support + * the given mode a failed event is sent. + * @param mode the power save mode to set + */ + void (*set_mode)(struct wl_client *client, + struct wl_resource *resource, + uint32_t mode); + /** + * destroy this power management + * + * Destroys the output power management mode control object. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define ZWLR_OUTPUT_POWER_V1_MODE 0 +#define ZWLR_OUTPUT_POWER_V1_FAILED 1 + +/** + * @ingroup iface_zwlr_output_power_v1 + */ +#define ZWLR_OUTPUT_POWER_V1_MODE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_output_power_v1 + */ +#define ZWLR_OUTPUT_POWER_V1_FAILED_SINCE_VERSION 1 + +/** + * @ingroup iface_zwlr_output_power_v1 + */ +#define ZWLR_OUTPUT_POWER_V1_SET_MODE_SINCE_VERSION 1 +/** + * @ingroup iface_zwlr_output_power_v1 + */ +#define ZWLR_OUTPUT_POWER_V1_DESTROY_SINCE_VERSION 1 + +/** + * @ingroup iface_zwlr_output_power_v1 + * Sends an mode event to the client owning the resource. + * @param resource_ The client's resource + * @param mode the output's new power management mode + */ +static inline void +zwlr_output_power_v1_send_mode(struct wl_resource *resource_, uint32_t mode) +{ + wl_resource_post_event(resource_, ZWLR_OUTPUT_POWER_V1_MODE, mode); +} + +/** + * @ingroup iface_zwlr_output_power_v1 + * Sends an failed event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +zwlr_output_power_v1_send_failed(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, ZWLR_OUTPUT_POWER_V1_FAILED); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/protocols/xdg-shell-protocol.h b/protocols/xdg-shell-protocol.h new file mode 100644 index 0000000..1ce3039 --- /dev/null +++ b/protocols/xdg-shell-protocol.h @@ -0,0 +1,2392 @@ +/* Generated by wayland-scanner 1.25.0 */ + +#ifndef XDG_SHELL_SERVER_PROTOCOL_H +#define XDG_SHELL_SERVER_PROTOCOL_H + +#include +#include +#include "wayland-server.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct wl_client; +struct wl_resource; + +/** + * @page page_xdg_shell The xdg_shell protocol + * @section page_ifaces_xdg_shell Interfaces + * - @subpage page_iface_xdg_wm_base - create desktop-style surfaces + * - @subpage page_iface_xdg_positioner - child surface positioner + * - @subpage page_iface_xdg_surface - desktop user interface surface base interface + * - @subpage page_iface_xdg_toplevel - toplevel surface + * - @subpage page_iface_xdg_popup - short-lived, popup surfaces for menus + * @section page_copyright_xdg_shell Copyright + *
+ *
+ * Copyright © 2008-2013 Kristian Høgsberg
+ * Copyright © 2013      Rafael Antognolli
+ * Copyright © 2013      Jasper St. Pierre
+ * Copyright © 2010-2013 Intel Corporation
+ * Copyright © 2015-2017 Samsung Electronics Co., Ltd
+ * Copyright © 2015-2017 Red Hat Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * 
+ */ +struct wl_output; +struct wl_seat; +struct wl_surface; +struct xdg_popup; +struct xdg_positioner; +struct xdg_surface; +struct xdg_toplevel; +struct xdg_wm_base; + +#ifndef XDG_WM_BASE_INTERFACE +#define XDG_WM_BASE_INTERFACE +/** + * @page page_iface_xdg_wm_base xdg_wm_base + * @section page_iface_xdg_wm_base_desc Description + * + * The xdg_wm_base interface is exposed as a global object enabling clients + * to turn their wl_surfaces into windows in a desktop environment. It + * defines the basic functionality needed for clients and the compositor to + * create windows that can be dragged, resized, maximized, etc, as well as + * creating transient windows such as popup menus. + * @section page_iface_xdg_wm_base_api API + * See @ref iface_xdg_wm_base. + */ +/** + * @defgroup iface_xdg_wm_base The xdg_wm_base interface + * + * The xdg_wm_base interface is exposed as a global object enabling clients + * to turn their wl_surfaces into windows in a desktop environment. It + * defines the basic functionality needed for clients and the compositor to + * create windows that can be dragged, resized, maximized, etc, as well as + * creating transient windows such as popup menus. + */ +extern const struct wl_interface xdg_wm_base_interface; +#endif +#ifndef XDG_POSITIONER_INTERFACE +#define XDG_POSITIONER_INTERFACE +/** + * @page page_iface_xdg_positioner xdg_positioner + * @section page_iface_xdg_positioner_desc Description + * + * The xdg_positioner provides a collection of rules for the placement of a + * child surface relative to a parent surface. Rules can be defined to ensure + * the child surface remains within the visible area's borders, and to + * specify how the child surface changes its position, such as sliding along + * an axis, or flipping around a rectangle. These positioner-created rules are + * constrained by the requirement that a child surface must intersect with or + * be at least partially adjacent to its parent surface. + * + * See the various requests for details about possible rules. + * + * At the time of the request, the compositor makes a copy of the rules + * specified by the xdg_positioner. Thus, after the request is complete the + * xdg_positioner object can be destroyed or reused; further changes to the + * object will have no effect on previous usages. + * + * For an xdg_positioner object to be considered complete, it must have a + * non-zero size set by set_size, and a non-zero anchor rectangle set by + * set_anchor_rect. Passing an incomplete xdg_positioner object when + * positioning a surface raises an invalid_positioner error. + * @section page_iface_xdg_positioner_api API + * See @ref iface_xdg_positioner. + */ +/** + * @defgroup iface_xdg_positioner The xdg_positioner interface + * + * The xdg_positioner provides a collection of rules for the placement of a + * child surface relative to a parent surface. Rules can be defined to ensure + * the child surface remains within the visible area's borders, and to + * specify how the child surface changes its position, such as sliding along + * an axis, or flipping around a rectangle. These positioner-created rules are + * constrained by the requirement that a child surface must intersect with or + * be at least partially adjacent to its parent surface. + * + * See the various requests for details about possible rules. + * + * At the time of the request, the compositor makes a copy of the rules + * specified by the xdg_positioner. Thus, after the request is complete the + * xdg_positioner object can be destroyed or reused; further changes to the + * object will have no effect on previous usages. + * + * For an xdg_positioner object to be considered complete, it must have a + * non-zero size set by set_size, and a non-zero anchor rectangle set by + * set_anchor_rect. Passing an incomplete xdg_positioner object when + * positioning a surface raises an invalid_positioner error. + */ +extern const struct wl_interface xdg_positioner_interface; +#endif +#ifndef XDG_SURFACE_INTERFACE +#define XDG_SURFACE_INTERFACE +/** + * @page page_iface_xdg_surface xdg_surface + * @section page_iface_xdg_surface_desc Description + * + * An interface that may be implemented by a wl_surface, for + * implementations that provide a desktop-style user interface. + * + * It provides a base set of functionality required to construct user + * interface elements requiring management by the compositor, such as + * toplevel windows, menus, etc. The types of functionality are split into + * xdg_surface roles. + * + * Creating an xdg_surface does not set the role for a wl_surface. In order + * to map an xdg_surface, the client must create a role-specific object + * using, e.g., get_toplevel, get_popup. The wl_surface for any given + * xdg_surface can have at most one role, and may not be assigned any role + * not based on xdg_surface. + * + * A role must be assigned before any other requests are made to the + * xdg_surface object. + * + * The client must call wl_surface.commit on the corresponding wl_surface + * for the xdg_surface state to take effect. + * + * Creating an xdg_surface from a wl_surface which has a buffer attached or + * committed is a client error, and any attempts by a client to attach or + * manipulate a buffer prior to the first xdg_surface.configure call must + * also be treated as errors. + * + * After creating a role-specific object and setting it up (e.g. by sending + * the title, app ID, size constraints, parent, etc), the client must + * perform an initial commit without any buffer attached. The compositor + * will reply with initial wl_surface state such as + * wl_surface.preferred_buffer_scale followed by an xdg_surface.configure + * event. The client must acknowledge it and is then allowed to attach a + * buffer to map the surface. + * + * Mapping an xdg_surface-based role surface is defined as making it + * possible for the surface to be shown by the compositor. Note that + * a mapped surface is not guaranteed to be visible once it is mapped. + * + * For an xdg_surface to be mapped by the compositor, the following + * conditions must be met: + * (1) the client has assigned an xdg_surface-based role to the surface + * (2) the client has set and committed the xdg_surface state and the + * role-dependent state to the surface + * (3) the client has committed a buffer to the surface + * + * A newly-unmapped surface is considered to have met condition (1) out + * of the 3 required conditions for mapping a surface if its role surface + * has not been destroyed, i.e. the client must perform the initial commit + * again before attaching a buffer. + * @section page_iface_xdg_surface_api API + * See @ref iface_xdg_surface. + */ +/** + * @defgroup iface_xdg_surface The xdg_surface interface + * + * An interface that may be implemented by a wl_surface, for + * implementations that provide a desktop-style user interface. + * + * It provides a base set of functionality required to construct user + * interface elements requiring management by the compositor, such as + * toplevel windows, menus, etc. The types of functionality are split into + * xdg_surface roles. + * + * Creating an xdg_surface does not set the role for a wl_surface. In order + * to map an xdg_surface, the client must create a role-specific object + * using, e.g., get_toplevel, get_popup. The wl_surface for any given + * xdg_surface can have at most one role, and may not be assigned any role + * not based on xdg_surface. + * + * A role must be assigned before any other requests are made to the + * xdg_surface object. + * + * The client must call wl_surface.commit on the corresponding wl_surface + * for the xdg_surface state to take effect. + * + * Creating an xdg_surface from a wl_surface which has a buffer attached or + * committed is a client error, and any attempts by a client to attach or + * manipulate a buffer prior to the first xdg_surface.configure call must + * also be treated as errors. + * + * After creating a role-specific object and setting it up (e.g. by sending + * the title, app ID, size constraints, parent, etc), the client must + * perform an initial commit without any buffer attached. The compositor + * will reply with initial wl_surface state such as + * wl_surface.preferred_buffer_scale followed by an xdg_surface.configure + * event. The client must acknowledge it and is then allowed to attach a + * buffer to map the surface. + * + * Mapping an xdg_surface-based role surface is defined as making it + * possible for the surface to be shown by the compositor. Note that + * a mapped surface is not guaranteed to be visible once it is mapped. + * + * For an xdg_surface to be mapped by the compositor, the following + * conditions must be met: + * (1) the client has assigned an xdg_surface-based role to the surface + * (2) the client has set and committed the xdg_surface state and the + * role-dependent state to the surface + * (3) the client has committed a buffer to the surface + * + * A newly-unmapped surface is considered to have met condition (1) out + * of the 3 required conditions for mapping a surface if its role surface + * has not been destroyed, i.e. the client must perform the initial commit + * again before attaching a buffer. + */ +extern const struct wl_interface xdg_surface_interface; +#endif +#ifndef XDG_TOPLEVEL_INTERFACE +#define XDG_TOPLEVEL_INTERFACE +/** + * @page page_iface_xdg_toplevel xdg_toplevel + * @section page_iface_xdg_toplevel_desc Description + * + * This interface defines an xdg_surface role which allows a surface to, + * among other things, set window-like properties such as maximize, + * fullscreen, and minimize, set application-specific metadata like title and + * id, and well as trigger user interactive operations such as interactive + * resize and move. + * + * An xdg_toplevel by default is responsible for providing the full intended + * visual representation of the toplevel, which depending on the window + * state, may mean things like a title bar, window controls and drop shadow. + * + * Unmapping an xdg_toplevel means that the surface cannot be shown + * by the compositor until it is explicitly mapped again. + * All active operations (e.g., move, resize) are canceled and all + * attributes (e.g. title, state, stacking, ...) are discarded for + * an xdg_toplevel surface when it is unmapped. The xdg_toplevel returns to + * the state it had right after xdg_surface.get_toplevel. The client + * can re-map the toplevel by performing a commit without any buffer + * attached, waiting for a configure event and handling it as usual (see + * xdg_surface description). + * + * Attaching a null buffer to a toplevel unmaps the surface. + * @section page_iface_xdg_toplevel_api API + * See @ref iface_xdg_toplevel. + */ +/** + * @defgroup iface_xdg_toplevel The xdg_toplevel interface + * + * This interface defines an xdg_surface role which allows a surface to, + * among other things, set window-like properties such as maximize, + * fullscreen, and minimize, set application-specific metadata like title and + * id, and well as trigger user interactive operations such as interactive + * resize and move. + * + * An xdg_toplevel by default is responsible for providing the full intended + * visual representation of the toplevel, which depending on the window + * state, may mean things like a title bar, window controls and drop shadow. + * + * Unmapping an xdg_toplevel means that the surface cannot be shown + * by the compositor until it is explicitly mapped again. + * All active operations (e.g., move, resize) are canceled and all + * attributes (e.g. title, state, stacking, ...) are discarded for + * an xdg_toplevel surface when it is unmapped. The xdg_toplevel returns to + * the state it had right after xdg_surface.get_toplevel. The client + * can re-map the toplevel by performing a commit without any buffer + * attached, waiting for a configure event and handling it as usual (see + * xdg_surface description). + * + * Attaching a null buffer to a toplevel unmaps the surface. + */ +extern const struct wl_interface xdg_toplevel_interface; +#endif +#ifndef XDG_POPUP_INTERFACE +#define XDG_POPUP_INTERFACE +/** + * @page page_iface_xdg_popup xdg_popup + * @section page_iface_xdg_popup_desc Description + * + * A popup surface is a short-lived, temporary surface. It can be used to + * implement for example menus, popovers, tooltips and other similar user + * interface concepts. + * + * A popup can be made to take an explicit grab. See xdg_popup.grab for + * details. + * + * When the popup is dismissed, a popup_done event will be sent out, and at + * the same time the surface will be unmapped. See the xdg_popup.popup_done + * event for details. + * + * Explicitly destroying the xdg_popup object will also dismiss the popup and + * unmap the surface. Clients that want to dismiss the popup when another + * surface of their own is clicked should dismiss the popup using the destroy + * request. + * + * A newly created xdg_popup will be stacked on top of all previously created + * xdg_popup surfaces associated with the same xdg_toplevel. + * + * The parent of an xdg_popup must be mapped (see the xdg_surface + * description) before the xdg_popup itself. + * + * The client must call wl_surface.commit on the corresponding wl_surface + * for the xdg_popup state to take effect. + * @section page_iface_xdg_popup_api API + * See @ref iface_xdg_popup. + */ +/** + * @defgroup iface_xdg_popup The xdg_popup interface + * + * A popup surface is a short-lived, temporary surface. It can be used to + * implement for example menus, popovers, tooltips and other similar user + * interface concepts. + * + * A popup can be made to take an explicit grab. See xdg_popup.grab for + * details. + * + * When the popup is dismissed, a popup_done event will be sent out, and at + * the same time the surface will be unmapped. See the xdg_popup.popup_done + * event for details. + * + * Explicitly destroying the xdg_popup object will also dismiss the popup and + * unmap the surface. Clients that want to dismiss the popup when another + * surface of their own is clicked should dismiss the popup using the destroy + * request. + * + * A newly created xdg_popup will be stacked on top of all previously created + * xdg_popup surfaces associated with the same xdg_toplevel. + * + * The parent of an xdg_popup must be mapped (see the xdg_surface + * description) before the xdg_popup itself. + * + * The client must call wl_surface.commit on the corresponding wl_surface + * for the xdg_popup state to take effect. + */ +extern const struct wl_interface xdg_popup_interface; +#endif + +#ifndef XDG_WM_BASE_ERROR_ENUM +#define XDG_WM_BASE_ERROR_ENUM +enum xdg_wm_base_error { + /** + * given wl_surface has another role + */ + XDG_WM_BASE_ERROR_ROLE = 0, + /** + * xdg_wm_base was destroyed before children + */ + XDG_WM_BASE_ERROR_DEFUNCT_SURFACES = 1, + /** + * the client tried to map or destroy a non-topmost popup + */ + XDG_WM_BASE_ERROR_NOT_THE_TOPMOST_POPUP = 2, + /** + * the client specified an invalid popup parent surface + */ + XDG_WM_BASE_ERROR_INVALID_POPUP_PARENT = 3, + /** + * the client provided an invalid surface state + */ + XDG_WM_BASE_ERROR_INVALID_SURFACE_STATE = 4, + /** + * the client provided an invalid positioner + */ + XDG_WM_BASE_ERROR_INVALID_POSITIONER = 5, + /** + * the client didn’t respond to a ping event in time + */ + XDG_WM_BASE_ERROR_UNRESPONSIVE = 6, +}; +#endif /* XDG_WM_BASE_ERROR_ENUM */ + +#ifndef XDG_WM_BASE_ERROR_ENUM_IS_VALID +#define XDG_WM_BASE_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_wm_base + * Validate a xdg_wm_base error value. + * + * @return true on success, false on error. + * @ref xdg_wm_base_error + */ +static inline bool +xdg_wm_base_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_WM_BASE_ERROR_ROLE: + return version >= 1; + case XDG_WM_BASE_ERROR_DEFUNCT_SURFACES: + return version >= 1; + case XDG_WM_BASE_ERROR_NOT_THE_TOPMOST_POPUP: + return version >= 1; + case XDG_WM_BASE_ERROR_INVALID_POPUP_PARENT: + return version >= 1; + case XDG_WM_BASE_ERROR_INVALID_SURFACE_STATE: + return version >= 1; + case XDG_WM_BASE_ERROR_INVALID_POSITIONER: + return version >= 1; + case XDG_WM_BASE_ERROR_UNRESPONSIVE: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_WM_BASE_ERROR_ENUM_IS_VALID */ + +/** + * @ingroup iface_xdg_wm_base + * @struct xdg_wm_base_interface + */ +struct xdg_wm_base_interface { + /** + * destroy xdg_wm_base + * + * Destroy this xdg_wm_base object. + * + * Destroying a bound xdg_wm_base object while there are surfaces + * still alive created by this xdg_wm_base object instance is + * illegal and will result in a defunct_surfaces error. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * create a positioner object + * + * Create a positioner object. A positioner object is used to + * position surfaces relative to some parent surface. See the + * interface description and xdg_surface.get_popup for details. + */ + void (*create_positioner)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id); + /** + * create a shell surface from a surface + * + * This creates an xdg_surface for the given surface. An + * xdg_surface is used as basis to define a role to a given + * surface, such as xdg_toplevel or xdg_popup. It also manages + * functionality shared between xdg_surface based surface roles. + * + * While xdg_surface itself is not a role, the corresponding + * surface may only be assigned a role extending xdg_surface, such + * as xdg_toplevel or xdg_popup. It is illegal to create an + * xdg_surface for a wl_surface which already has anassigned role + * and this will result in a role error. + * + * See the documentation of xdg_surface for more details about what + * an xdg_surface is and how it is used. + */ + void (*get_xdg_surface)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *surface); + /** + * respond to a ping event + * + * A client must respond to a ping event with a pong request or + * the client may be deemed unresponsive. See xdg_wm_base.ping and + * xdg_wm_base.error.unresponsive. + * @param serial serial of the ping event + */ + void (*pong)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial); +}; + +#define XDG_WM_BASE_PING 0 + +/** + * @ingroup iface_xdg_wm_base + */ +#define XDG_WM_BASE_PING_SINCE_VERSION 1 + +/** + * @ingroup iface_xdg_wm_base + */ +#define XDG_WM_BASE_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_wm_base + */ +#define XDG_WM_BASE_CREATE_POSITIONER_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_wm_base + */ +#define XDG_WM_BASE_GET_XDG_SURFACE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_wm_base + */ +#define XDG_WM_BASE_PONG_SINCE_VERSION 1 + +/** + * @ingroup iface_xdg_wm_base + * Sends an ping event to the client owning the resource. + * @param resource_ The client's resource + * @param serial pass this to the pong request + */ +static inline void +xdg_wm_base_send_ping(struct wl_resource *resource_, uint32_t serial) +{ + wl_resource_post_event(resource_, XDG_WM_BASE_PING, serial); +} + +#ifndef XDG_POSITIONER_ERROR_ENUM +#define XDG_POSITIONER_ERROR_ENUM +enum xdg_positioner_error { + /** + * invalid input provided + */ + XDG_POSITIONER_ERROR_INVALID_INPUT = 0, +}; +#endif /* XDG_POSITIONER_ERROR_ENUM */ + +#ifndef XDG_POSITIONER_ERROR_ENUM_IS_VALID +#define XDG_POSITIONER_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_positioner + * Validate a xdg_positioner error value. + * + * @return true on success, false on error. + * @ref xdg_positioner_error + */ +static inline bool +xdg_positioner_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_POSITIONER_ERROR_INVALID_INPUT: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_POSITIONER_ERROR_ENUM_IS_VALID */ + +#ifndef XDG_POSITIONER_ANCHOR_ENUM +#define XDG_POSITIONER_ANCHOR_ENUM +enum xdg_positioner_anchor { + XDG_POSITIONER_ANCHOR_NONE = 0, + XDG_POSITIONER_ANCHOR_TOP = 1, + XDG_POSITIONER_ANCHOR_BOTTOM = 2, + XDG_POSITIONER_ANCHOR_LEFT = 3, + XDG_POSITIONER_ANCHOR_RIGHT = 4, + XDG_POSITIONER_ANCHOR_TOP_LEFT = 5, + XDG_POSITIONER_ANCHOR_BOTTOM_LEFT = 6, + XDG_POSITIONER_ANCHOR_TOP_RIGHT = 7, + XDG_POSITIONER_ANCHOR_BOTTOM_RIGHT = 8, +}; +#endif /* XDG_POSITIONER_ANCHOR_ENUM */ + +#ifndef XDG_POSITIONER_ANCHOR_ENUM_IS_VALID +#define XDG_POSITIONER_ANCHOR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_positioner + * Validate a xdg_positioner anchor value. + * + * @return true on success, false on error. + * @ref xdg_positioner_anchor + */ +static inline bool +xdg_positioner_anchor_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_POSITIONER_ANCHOR_NONE: + return version >= 1; + case XDG_POSITIONER_ANCHOR_TOP: + return version >= 1; + case XDG_POSITIONER_ANCHOR_BOTTOM: + return version >= 1; + case XDG_POSITIONER_ANCHOR_LEFT: + return version >= 1; + case XDG_POSITIONER_ANCHOR_RIGHT: + return version >= 1; + case XDG_POSITIONER_ANCHOR_TOP_LEFT: + return version >= 1; + case XDG_POSITIONER_ANCHOR_BOTTOM_LEFT: + return version >= 1; + case XDG_POSITIONER_ANCHOR_TOP_RIGHT: + return version >= 1; + case XDG_POSITIONER_ANCHOR_BOTTOM_RIGHT: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_POSITIONER_ANCHOR_ENUM_IS_VALID */ + +#ifndef XDG_POSITIONER_GRAVITY_ENUM +#define XDG_POSITIONER_GRAVITY_ENUM +enum xdg_positioner_gravity { + XDG_POSITIONER_GRAVITY_NONE = 0, + XDG_POSITIONER_GRAVITY_TOP = 1, + XDG_POSITIONER_GRAVITY_BOTTOM = 2, + XDG_POSITIONER_GRAVITY_LEFT = 3, + XDG_POSITIONER_GRAVITY_RIGHT = 4, + XDG_POSITIONER_GRAVITY_TOP_LEFT = 5, + XDG_POSITIONER_GRAVITY_BOTTOM_LEFT = 6, + XDG_POSITIONER_GRAVITY_TOP_RIGHT = 7, + XDG_POSITIONER_GRAVITY_BOTTOM_RIGHT = 8, +}; +#endif /* XDG_POSITIONER_GRAVITY_ENUM */ + +#ifndef XDG_POSITIONER_GRAVITY_ENUM_IS_VALID +#define XDG_POSITIONER_GRAVITY_ENUM_IS_VALID +/** + * @ingroup iface_xdg_positioner + * Validate a xdg_positioner gravity value. + * + * @return true on success, false on error. + * @ref xdg_positioner_gravity + */ +static inline bool +xdg_positioner_gravity_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_POSITIONER_GRAVITY_NONE: + return version >= 1; + case XDG_POSITIONER_GRAVITY_TOP: + return version >= 1; + case XDG_POSITIONER_GRAVITY_BOTTOM: + return version >= 1; + case XDG_POSITIONER_GRAVITY_LEFT: + return version >= 1; + case XDG_POSITIONER_GRAVITY_RIGHT: + return version >= 1; + case XDG_POSITIONER_GRAVITY_TOP_LEFT: + return version >= 1; + case XDG_POSITIONER_GRAVITY_BOTTOM_LEFT: + return version >= 1; + case XDG_POSITIONER_GRAVITY_TOP_RIGHT: + return version >= 1; + case XDG_POSITIONER_GRAVITY_BOTTOM_RIGHT: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_POSITIONER_GRAVITY_ENUM_IS_VALID */ + +#ifndef XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM +#define XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM +/** + * @ingroup iface_xdg_positioner + * constraint adjustments + * + * The constraint adjustment value define ways the compositor will adjust + * the position of the surface, if the unadjusted position would result + * in the surface being partly constrained. + * + * Whether a surface is considered 'constrained' is left to the compositor + * to determine. For example, the surface may be partly outside the + * compositor's defined 'work area', thus necessitating the child surface's + * position be adjusted until it is entirely inside the work area. + * + * The adjustments can be combined, according to a defined precedence: 1) + * Flip, 2) Slide, 3) Resize. + */ +enum xdg_positioner_constraint_adjustment { + /** + * don't move the child surface when constrained + * + * Don't alter the surface position even if it is constrained on + * some axis, for example partially outside the edge of an output. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_NONE = 0, + /** + * move along the x axis until unconstrained + * + * Slide the surface along the x axis until it is no longer + * constrained. + * + * First try to slide towards the direction of the gravity on the x + * axis until either the edge in the opposite direction of the + * gravity is unconstrained or the edge in the direction of the + * gravity is constrained. + * + * Then try to slide towards the opposite direction of the gravity + * on the x axis until either the edge in the direction of the + * gravity is unconstrained or the edge in the opposite direction + * of the gravity is constrained. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_X = 1, + /** + * move along the y axis until unconstrained + * + * Slide the surface along the y axis until it is no longer + * constrained. + * + * First try to slide towards the direction of the gravity on the y + * axis until either the edge in the opposite direction of the + * gravity is unconstrained or the edge in the direction of the + * gravity is constrained. + * + * Then try to slide towards the opposite direction of the gravity + * on the y axis until either the edge in the direction of the + * gravity is unconstrained or the edge in the opposite direction + * of the gravity is constrained. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_Y = 2, + /** + * invert the anchor and gravity on the x axis + * + * Invert the anchor and gravity on the x axis if the surface is + * constrained on the x axis. For example, if the left edge of the + * surface is constrained, the gravity is 'left' and the anchor is + * 'left', change the gravity to 'right' and the anchor to 'right'. + * + * If the adjusted position also ends up being constrained, the + * resulting position of the flip_x adjustment will be the one + * before the adjustment. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_X = 4, + /** + * invert the anchor and gravity on the y axis + * + * Invert the anchor and gravity on the y axis if the surface is + * constrained on the y axis. For example, if the bottom edge of + * the surface is constrained, the gravity is 'bottom' and the + * anchor is 'bottom', change the gravity to 'top' and the anchor + * to 'top'. + * + * The adjusted position is calculated given the original anchor + * rectangle and offset, but with the new flipped anchor and + * gravity values. + * + * If the adjusted position also ends up being constrained, the + * resulting position of the flip_y adjustment will be the one + * before the adjustment. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_Y = 8, + /** + * horizontally resize the surface + * + * Resize the surface horizontally so that it is completely + * unconstrained. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_X = 16, + /** + * vertically resize the surface + * + * Resize the surface vertically so that it is completely + * unconstrained. + */ + XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_Y = 32, +}; +#endif /* XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM */ + +#ifndef XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM_IS_VALID +#define XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM_IS_VALID +/** + * @ingroup iface_xdg_positioner + * Validate a xdg_positioner constraint_adjustment value. + * + * @return true on success, false on error. + * @ref xdg_positioner_constraint_adjustment + */ +static inline bool +xdg_positioner_constraint_adjustment_is_valid(uint32_t value, uint32_t version) { + uint32_t valid = 0; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_NONE; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_X; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_Y; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_X; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_Y; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_X; + if (version >= 1) + valid |= XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_Y; + return (value & ~valid) == 0; +} +#endif /* XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_ENUM_IS_VALID */ + +/** + * @ingroup iface_xdg_positioner + * @struct xdg_positioner_interface + */ +struct xdg_positioner_interface { + /** + * destroy the xdg_positioner object + * + * Notify the compositor that the xdg_positioner will no longer + * be used. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the size of the to-be positioned rectangle + * + * Set the size of the surface that is to be positioned with the + * positioner object. The size is in surface-local coordinates and + * corresponds to the window geometry. See + * xdg_surface.set_window_geometry. + * + * If a zero or negative size is set the invalid_input error is + * raised. + * @param width width of positioned rectangle + * @param height height of positioned rectangle + */ + void (*set_size)(struct wl_client *client, + struct wl_resource *resource, + int32_t width, + int32_t height); + /** + * set the anchor rectangle within the parent surface + * + * Specify the anchor rectangle within the parent surface that + * the child surface will be placed relative to. The rectangle is + * relative to the window geometry as defined by + * xdg_surface.set_window_geometry of the parent surface. + * + * When the xdg_positioner object is used to position a child + * surface, the anchor rectangle may not extend outside the window + * geometry of the positioned child's parent surface. + * + * If a negative size is set the invalid_input error is raised. + * @param x x position of anchor rectangle + * @param y y position of anchor rectangle + * @param width width of anchor rectangle + * @param height height of anchor rectangle + */ + void (*set_anchor_rect)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y, + int32_t width, + int32_t height); + /** + * set anchor rectangle anchor + * + * Defines the anchor point for the anchor rectangle. The + * specified anchor is used to derive an anchor point that the + * child surface will be positioned relative to. If a corner anchor + * is set (e.g. 'top_left' or 'bottom_right'), the anchor point + * will be at the specified corner; otherwise, the derived anchor + * point will be centered on the specified edge, or in the center + * of the anchor rectangle if no edge is specified. + * @param anchor anchor point + */ + void (*set_anchor)(struct wl_client *client, + struct wl_resource *resource, + uint32_t anchor); + /** + * set child surface gravity + * + * Defines in what direction a surface should be positioned, + * relative to the anchor point of the parent surface. If a corner + * gravity is specified (e.g. 'bottom_right' or 'top_left'), then + * the child surface will be placed towards the specified gravity; + * otherwise, the child surface will be centered over the anchor + * point on any axis that had no gravity specified. If the gravity + * is not in the ‘gravity’ enum, an invalid_input error is + * raised. + * @param gravity gravity direction + */ + void (*set_gravity)(struct wl_client *client, + struct wl_resource *resource, + uint32_t gravity); + /** + * set the adjustment to be done when constrained + * + * Specify how the window should be positioned if the originally + * intended position caused the surface to be constrained, meaning + * at least partially outside positioning boundaries set by the + * compositor. The adjustment is set by constructing a bitmask + * describing the adjustment to be made when the surface is + * constrained on that axis. + * + * If no bit for one axis is set, the compositor will assume that + * the child surface should not change its position on that axis + * when constrained. + * + * If more than one bit for one axis is set, the order of how + * adjustments are applied is specified in the corresponding + * adjustment descriptions. + * + * The default adjustment is none. + * @param constraint_adjustment bit mask of constraint adjustments + */ + void (*set_constraint_adjustment)(struct wl_client *client, + struct wl_resource *resource, + uint32_t constraint_adjustment); + /** + * set surface position offset + * + * Specify the surface position offset relative to the position + * of the anchor on the anchor rectangle and the anchor on the + * surface. For example if the anchor of the anchor rectangle is at + * (x, y), the surface has the gravity bottom|right, and the offset + * is (ox, oy), the calculated surface position will be (x + ox, y + * + oy). The offset position of the surface is the one used for + * constraint testing. See set_constraint_adjustment. + * + * An example use case is placing a popup menu on top of a user + * interface element, while aligning the user interface element of + * the parent surface with some user interface element placed + * somewhere in the popup surface. + * @param x surface position x offset + * @param y surface position y offset + */ + void (*set_offset)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y); + /** + * continuously reconstrain the surface + * + * When set reactive, the surface is reconstrained if the + * conditions used for constraining changed, e.g. the parent window + * moved. + * + * If the conditions changed and the popup was reconstrained, an + * xdg_popup.configure event is sent with updated geometry, + * followed by an xdg_surface.configure event. + * @since 3 + */ + void (*set_reactive)(struct wl_client *client, + struct wl_resource *resource); + /** + * set parent size + * + * Set the parent window geometry the compositor should use when + * positioning the popup. The compositor may use this information + * to determine the future state the popup should be constrained + * using. If this doesn't match the dimension of the parent the + * popup is eventually positioned against, the behavior is + * undefined. + * + * The arguments are given in the surface-local coordinate space. + * @param parent_width future window geometry width of parent + * @param parent_height future window geometry height of parent + * @since 3 + */ + void (*set_parent_size)(struct wl_client *client, + struct wl_resource *resource, + int32_t parent_width, + int32_t parent_height); + /** + * set parent configure this is a response to + * + * Set the serial of an xdg_surface.configure event this + * positioner will be used in response to. The compositor may use + * this information together with set_parent_size to determine what + * future state the popup should be constrained using. + * @param serial serial of parent configure event + * @since 3 + */ + void (*set_parent_configure)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial); +}; + + +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_SIZE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_ANCHOR_RECT_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_ANCHOR_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_GRAVITY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_CONSTRAINT_ADJUSTMENT_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_OFFSET_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_REACTIVE_SINCE_VERSION 3 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_PARENT_SIZE_SINCE_VERSION 3 +/** + * @ingroup iface_xdg_positioner + */ +#define XDG_POSITIONER_SET_PARENT_CONFIGURE_SINCE_VERSION 3 + +#ifndef XDG_SURFACE_ERROR_ENUM +#define XDG_SURFACE_ERROR_ENUM +enum xdg_surface_error { + /** + * Surface was not fully constructed + */ + XDG_SURFACE_ERROR_NOT_CONSTRUCTED = 1, + /** + * Surface was already constructed + */ + XDG_SURFACE_ERROR_ALREADY_CONSTRUCTED = 2, + /** + * Attaching a buffer to an unconfigured surface + */ + XDG_SURFACE_ERROR_UNCONFIGURED_BUFFER = 3, + /** + * Invalid serial number when acking a configure event + */ + XDG_SURFACE_ERROR_INVALID_SERIAL = 4, + /** + * Width or height was zero or negative + */ + XDG_SURFACE_ERROR_INVALID_SIZE = 5, + /** + * Surface was destroyed before its role object + */ + XDG_SURFACE_ERROR_DEFUNCT_ROLE_OBJECT = 6, +}; +#endif /* XDG_SURFACE_ERROR_ENUM */ + +#ifndef XDG_SURFACE_ERROR_ENUM_IS_VALID +#define XDG_SURFACE_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_surface + * Validate a xdg_surface error value. + * + * @return true on success, false on error. + * @ref xdg_surface_error + */ +static inline bool +xdg_surface_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_SURFACE_ERROR_NOT_CONSTRUCTED: + return version >= 1; + case XDG_SURFACE_ERROR_ALREADY_CONSTRUCTED: + return version >= 1; + case XDG_SURFACE_ERROR_UNCONFIGURED_BUFFER: + return version >= 1; + case XDG_SURFACE_ERROR_INVALID_SERIAL: + return version >= 1; + case XDG_SURFACE_ERROR_INVALID_SIZE: + return version >= 1; + case XDG_SURFACE_ERROR_DEFUNCT_ROLE_OBJECT: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_SURFACE_ERROR_ENUM_IS_VALID */ + +/** + * @ingroup iface_xdg_surface + * @struct xdg_surface_interface + */ +struct xdg_surface_interface { + /** + * destroy the xdg_surface + * + * Destroy the xdg_surface object. An xdg_surface must only be + * destroyed after its role object has been destroyed, otherwise a + * defunct_role_object error is raised. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * assign the xdg_toplevel surface role + * + * This creates an xdg_toplevel object for the given xdg_surface + * and gives the associated wl_surface the xdg_toplevel role. + * + * See the documentation of xdg_toplevel for more details about + * what an xdg_toplevel is and how it is used. + */ + void (*get_toplevel)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id); + /** + * assign the xdg_popup surface role + * + * This creates an xdg_popup object for the given xdg_surface and + * gives the associated wl_surface the xdg_popup role. + * + * If null is passed as a parent, a parent surface must be + * specified using some other protocol, before committing the + * initial state. + * + * See the documentation of xdg_popup for more details about what + * an xdg_popup is and how it is used. + * @param parent parent surface for this popup + * @param positioner positioner for this popup + */ + void (*get_popup)(struct wl_client *client, + struct wl_resource *resource, + uint32_t id, + struct wl_resource *parent, + struct wl_resource *positioner); + /** + * set the new window geometry + * + * The window geometry of a surface is its "visible bounds" from + * the user's perspective. Client-side decorations often have + * invisible portions like drop-shadows which should be ignored for + * the purposes of aligning, placing and constraining windows. Note + * that in some situations, compositors may clip rendering to the + * window geometry, so the client should avoid putting functional + * elements outside of it. + * + * The window geometry is double-buffered state, see + * wl_surface.commit. + * + * When maintaining a position, the compositor should treat the (x, + * y) coordinate of the window geometry as the top left corner of + * the window. A client changing the (x, y) window geometry + * coordinate should in general not alter the position of the + * window. + * + * Once the window geometry of the surface is set, it is not + * possible to unset it, and it will remain the same until + * set_window_geometry is called again, even if a new subsurface or + * buffer is attached. + * + * If never set, the value is the full bounds of the surface, + * including any subsurfaces. This updates dynamically on every + * commit. This unset is meant for extremely simple clients. + * + * The arguments are given in the surface-local coordinate space of + * the wl_surface associated with this xdg_surface, and may extend + * outside of the wl_surface itself to mark parts of the subsurface + * tree as part of the window geometry. + * + * When applied, the effective window geometry will be the set + * window geometry clamped to the bounding rectangle of the + * combined geometry of the surface of the xdg_surface and the + * associated subsurfaces. + * + * The effective geometry will not be recalculated unless a new + * call to set_window_geometry is done and the new pending surface + * state is subsequently applied. + * + * The width and height of the effective window geometry must be + * greater than zero. Setting an invalid size will raise an + * invalid_size error. + * @param x x coordinate of the top-left corner of the window inside this surface + * @param y y coordinate of the top-left corner of the window inside this surface + * @param width width of the window + * @param height height of the window + */ + void (*set_window_geometry)(struct wl_client *client, + struct wl_resource *resource, + int32_t x, + int32_t y, + int32_t width, + int32_t height); + /** + * ack a configure event + * + * When a configure event is received, if a client commits the + * surface in response to the configure event, then the client must + * make an ack_configure request sometime before the commit + * request, passing along the serial of the configure event. + * + * For instance, for toplevel surfaces the compositor might use + * this information to move a surface to the top left only when the + * client has drawn itself for the maximized or fullscreen state. + * + * If the client receives multiple configure events before it can + * respond to one, it only has to ack the last configure event. + * Acking a configure event that was never sent raises an + * invalid_serial error. + * + * A client is not required to commit immediately after sending an + * ack_configure request - it may even ack_configure several times + * before its next surface commit. + * + * A client may send multiple ack_configure requests before + * committing, but only the last request sent before a commit + * indicates which configure event the client really is responding + * to. + * + * Sending an ack_configure request consumes the serial number sent + * with the request, as well as serial numbers sent by all + * configure events sent on this xdg_surface prior to the configure + * event referenced by the committed serial. + * + * It is an error to issue multiple ack_configure requests + * referencing a serial from the same configure event, or to issue + * an ack_configure request referencing a serial from a configure + * event issued before the event identified by the last + * ack_configure request for the same xdg_surface. Doing so will + * raise an invalid_serial error. + * @param serial the serial from the configure event + */ + void (*ack_configure)(struct wl_client *client, + struct wl_resource *resource, + uint32_t serial); +}; + +#define XDG_SURFACE_CONFIGURE 0 + +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_CONFIGURE_SINCE_VERSION 1 + +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_GET_TOPLEVEL_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_GET_POPUP_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_SET_WINDOW_GEOMETRY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_surface + */ +#define XDG_SURFACE_ACK_CONFIGURE_SINCE_VERSION 1 + +/** + * @ingroup iface_xdg_surface + * Sends an configure event to the client owning the resource. + * @param resource_ The client's resource + * @param serial serial of the configure event + */ +static inline void +xdg_surface_send_configure(struct wl_resource *resource_, uint32_t serial) +{ + wl_resource_post_event(resource_, XDG_SURFACE_CONFIGURE, serial); +} + +#ifndef XDG_TOPLEVEL_ERROR_ENUM +#define XDG_TOPLEVEL_ERROR_ENUM +enum xdg_toplevel_error { + /** + * provided value is not a valid variant of the resize_edge enum + */ + XDG_TOPLEVEL_ERROR_INVALID_RESIZE_EDGE = 0, + /** + * invalid parent toplevel + */ + XDG_TOPLEVEL_ERROR_INVALID_PARENT = 1, + /** + * client provided an invalid min or max size + */ + XDG_TOPLEVEL_ERROR_INVALID_SIZE = 2, +}; +#endif /* XDG_TOPLEVEL_ERROR_ENUM */ + +#ifndef XDG_TOPLEVEL_ERROR_ENUM_IS_VALID +#define XDG_TOPLEVEL_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_toplevel + * Validate a xdg_toplevel error value. + * + * @return true on success, false on error. + * @ref xdg_toplevel_error + */ +static inline bool +xdg_toplevel_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_TOPLEVEL_ERROR_INVALID_RESIZE_EDGE: + return version >= 1; + case XDG_TOPLEVEL_ERROR_INVALID_PARENT: + return version >= 1; + case XDG_TOPLEVEL_ERROR_INVALID_SIZE: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_TOPLEVEL_ERROR_ENUM_IS_VALID */ + +#ifndef XDG_TOPLEVEL_RESIZE_EDGE_ENUM +#define XDG_TOPLEVEL_RESIZE_EDGE_ENUM +/** + * @ingroup iface_xdg_toplevel + * edge values for resizing + * + * These values are used to indicate which edge of a surface + * is being dragged in a resize operation. + */ +enum xdg_toplevel_resize_edge { + XDG_TOPLEVEL_RESIZE_EDGE_NONE = 0, + XDG_TOPLEVEL_RESIZE_EDGE_TOP = 1, + XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM = 2, + XDG_TOPLEVEL_RESIZE_EDGE_LEFT = 4, + XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT = 5, + XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT = 6, + XDG_TOPLEVEL_RESIZE_EDGE_RIGHT = 8, + XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT = 9, + XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT = 10, +}; +#endif /* XDG_TOPLEVEL_RESIZE_EDGE_ENUM */ + +#ifndef XDG_TOPLEVEL_RESIZE_EDGE_ENUM_IS_VALID +#define XDG_TOPLEVEL_RESIZE_EDGE_ENUM_IS_VALID +/** + * @ingroup iface_xdg_toplevel + * Validate a xdg_toplevel resize_edge value. + * + * @return true on success, false on error. + * @ref xdg_toplevel_resize_edge + */ +static inline bool +xdg_toplevel_resize_edge_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_TOPLEVEL_RESIZE_EDGE_NONE: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_TOP: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_LEFT: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_RIGHT: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT: + return version >= 1; + case XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_TOPLEVEL_RESIZE_EDGE_ENUM_IS_VALID */ + +#ifndef XDG_TOPLEVEL_STATE_ENUM +#define XDG_TOPLEVEL_STATE_ENUM +/** + * @ingroup iface_xdg_toplevel + * types of state on the surface + * + * The different state values used on the surface. This is designed for + * state values like maximized, fullscreen. It is paired with the + * configure event to ensure that both the client and the compositor + * setting the state can be synchronized. + * + * States set in this way are double-buffered, see wl_surface.commit. + */ +enum xdg_toplevel_state { + /** + * the surface is maximized + * the surface is maximized + * + * The surface is maximized. The window geometry specified in the + * configure event must be obeyed by the client, or the + * xdg_wm_base.invalid_surface_state error is raised. + * + * The client should draw without shadow or other decoration + * outside of the window geometry. + */ + XDG_TOPLEVEL_STATE_MAXIMIZED = 1, + /** + * the surface is fullscreen + * the surface is fullscreen + * + * The surface is fullscreen. The window geometry specified in + * the configure event is a maximum; the client cannot resize + * beyond it. For a surface to cover the whole fullscreened area, + * the geometry dimensions must be obeyed by the client. For more + * details, see xdg_toplevel.set_fullscreen. + */ + XDG_TOPLEVEL_STATE_FULLSCREEN = 2, + /** + * the surface is being resized + * the surface is being resized + * + * The surface is being resized. The window geometry specified in + * the configure event is a maximum; the client cannot resize + * beyond it. Clients that have aspect ratio or cell sizing + * configuration can use a smaller size, however. + */ + XDG_TOPLEVEL_STATE_RESIZING = 3, + /** + * the surface is now activated + * the surface is now activated + * + * Client window decorations should be painted as if the window + * is active. Do not assume this means that the window actually has + * keyboard or pointer focus. + */ + XDG_TOPLEVEL_STATE_ACTIVATED = 4, + /** + * the surface’s left edge is tiled + * + * The window is currently in a tiled layout and the left edge is + * considered to be adjacent to another part of the tiling grid. + * + * The client should draw without shadow or other decoration + * outside of the window geometry on the left edge. + * @since 2 + */ + XDG_TOPLEVEL_STATE_TILED_LEFT = 5, + /** + * the surface’s right edge is tiled + * + * The window is currently in a tiled layout and the right edge + * is considered to be adjacent to another part of the tiling grid. + * + * The client should draw without shadow or other decoration + * outside of the window geometry on the right edge. + * @since 2 + */ + XDG_TOPLEVEL_STATE_TILED_RIGHT = 6, + /** + * the surface’s top edge is tiled + * + * The window is currently in a tiled layout and the top edge is + * considered to be adjacent to another part of the tiling grid. + * + * The client should draw without shadow or other decoration + * outside of the window geometry on the top edge. + * @since 2 + */ + XDG_TOPLEVEL_STATE_TILED_TOP = 7, + /** + * the surface’s bottom edge is tiled + * + * The window is currently in a tiled layout and the bottom edge + * is considered to be adjacent to another part of the tiling grid. + * + * The client should draw without shadow or other decoration + * outside of the window geometry on the bottom edge. + * @since 2 + */ + XDG_TOPLEVEL_STATE_TILED_BOTTOM = 8, + /** + * surface repaint is suspended + * + * The surface is currently not ordinarily being repainted; for + * example because its content is occluded by another window, or + * its outputs are switched off due to screen locking. + * @since 6 + */ + XDG_TOPLEVEL_STATE_SUSPENDED = 9, + /** + * the surface’s left edge is constrained + * + * The left edge of the window is currently constrained, meaning + * it shouldn't attempt to resize from that edge. It can for + * example mean it's tiled next to a monitor edge on the + * constrained side of the window. + * @since 7 + */ + XDG_TOPLEVEL_STATE_CONSTRAINED_LEFT = 10, + /** + * the surface’s right edge is constrained + * + * The right edge of the window is currently constrained, meaning + * it shouldn't attempt to resize from that edge. It can for + * example mean it's tiled next to a monitor edge on the + * constrained side of the window. + * @since 7 + */ + XDG_TOPLEVEL_STATE_CONSTRAINED_RIGHT = 11, + /** + * the surface’s top edge is constrained + * + * The top edge of the window is currently constrained, meaning + * it shouldn't attempt to resize from that edge. It can for + * example mean it's tiled next to a monitor edge on the + * constrained side of the window. + * @since 7 + */ + XDG_TOPLEVEL_STATE_CONSTRAINED_TOP = 12, + /** + * the surface’s bottom edge is constrained + * + * The bottom edge of the window is currently constrained, + * meaning it shouldn't attempt to resize from that edge. It can + * for example mean it's tiled next to a monitor edge on the + * constrained side of the window. + * @since 7 + */ + XDG_TOPLEVEL_STATE_CONSTRAINED_BOTTOM = 13, +}; +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_TILED_LEFT_SINCE_VERSION 2 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_TILED_RIGHT_SINCE_VERSION 2 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_TILED_TOP_SINCE_VERSION 2 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_TILED_BOTTOM_SINCE_VERSION 2 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_SUSPENDED_SINCE_VERSION 6 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_CONSTRAINED_LEFT_SINCE_VERSION 7 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_CONSTRAINED_RIGHT_SINCE_VERSION 7 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_CONSTRAINED_TOP_SINCE_VERSION 7 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_STATE_CONSTRAINED_BOTTOM_SINCE_VERSION 7 +#endif /* XDG_TOPLEVEL_STATE_ENUM */ + +#ifndef XDG_TOPLEVEL_STATE_ENUM_IS_VALID +#define XDG_TOPLEVEL_STATE_ENUM_IS_VALID +/** + * @ingroup iface_xdg_toplevel + * Validate a xdg_toplevel state value. + * + * @return true on success, false on error. + * @ref xdg_toplevel_state + */ +static inline bool +xdg_toplevel_state_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_TOPLEVEL_STATE_MAXIMIZED: + return version >= 1; + case XDG_TOPLEVEL_STATE_FULLSCREEN: + return version >= 1; + case XDG_TOPLEVEL_STATE_RESIZING: + return version >= 1; + case XDG_TOPLEVEL_STATE_ACTIVATED: + return version >= 1; + case XDG_TOPLEVEL_STATE_TILED_LEFT: + return version >= 2; + case XDG_TOPLEVEL_STATE_TILED_RIGHT: + return version >= 2; + case XDG_TOPLEVEL_STATE_TILED_TOP: + return version >= 2; + case XDG_TOPLEVEL_STATE_TILED_BOTTOM: + return version >= 2; + case XDG_TOPLEVEL_STATE_SUSPENDED: + return version >= 6; + case XDG_TOPLEVEL_STATE_CONSTRAINED_LEFT: + return version >= 7; + case XDG_TOPLEVEL_STATE_CONSTRAINED_RIGHT: + return version >= 7; + case XDG_TOPLEVEL_STATE_CONSTRAINED_TOP: + return version >= 7; + case XDG_TOPLEVEL_STATE_CONSTRAINED_BOTTOM: + return version >= 7; + default: + return false; + } +} +#endif /* XDG_TOPLEVEL_STATE_ENUM_IS_VALID */ + +#ifndef XDG_TOPLEVEL_WM_CAPABILITIES_ENUM +#define XDG_TOPLEVEL_WM_CAPABILITIES_ENUM +enum xdg_toplevel_wm_capabilities { + /** + * show_window_menu is available + */ + XDG_TOPLEVEL_WM_CAPABILITIES_WINDOW_MENU = 1, + /** + * set_maximized and unset_maximized are available + */ + XDG_TOPLEVEL_WM_CAPABILITIES_MAXIMIZE = 2, + /** + * set_fullscreen and unset_fullscreen are available + */ + XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN = 3, + /** + * set_minimized is available + */ + XDG_TOPLEVEL_WM_CAPABILITIES_MINIMIZE = 4, +}; +#endif /* XDG_TOPLEVEL_WM_CAPABILITIES_ENUM */ + +#ifndef XDG_TOPLEVEL_WM_CAPABILITIES_ENUM_IS_VALID +#define XDG_TOPLEVEL_WM_CAPABILITIES_ENUM_IS_VALID +/** + * @ingroup iface_xdg_toplevel + * Validate a xdg_toplevel wm_capabilities value. + * + * @return true on success, false on error. + * @ref xdg_toplevel_wm_capabilities + */ +static inline bool +xdg_toplevel_wm_capabilities_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_TOPLEVEL_WM_CAPABILITIES_WINDOW_MENU: + return version >= 1; + case XDG_TOPLEVEL_WM_CAPABILITIES_MAXIMIZE: + return version >= 1; + case XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN: + return version >= 1; + case XDG_TOPLEVEL_WM_CAPABILITIES_MINIMIZE: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_TOPLEVEL_WM_CAPABILITIES_ENUM_IS_VALID */ + +/** + * @ingroup iface_xdg_toplevel + * @struct xdg_toplevel_interface + */ +struct xdg_toplevel_interface { + /** + * destroy the xdg_toplevel + * + * This request destroys the role surface and unmaps the surface; + * see "Unmapping" behavior in interface section for details. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the parent of this surface + * + * Set the "parent" of this surface. This surface should be + * stacked above the parent surface and all other ancestor + * surfaces. + * + * Parent surfaces should be set on dialogs, toolboxes, or other + * "auxiliary" surfaces, so that the parent is raised when the + * dialog is raised. + * + * Setting a null parent for a child surface unsets its parent. + * Setting a null parent for a surface which currently has no + * parent is a no-op. + * + * Only mapped surfaces can have child surfaces. Setting a parent + * which is not mapped is equivalent to setting a null parent. If a + * surface becomes unmapped, its children's parent is set to the + * parent of the now-unmapped surface. If the now-unmapped surface + * has no parent, its children's parent is unset. If the + * now-unmapped surface becomes mapped again, its parent-child + * relationship is not restored. + * + * The parent toplevel must not be one of the child toplevel's + * descendants, and the parent must be different from the child + * toplevel, otherwise the invalid_parent protocol error is raised. + * @param parent parent surface for this surface + */ + void (*set_parent)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *parent); + /** + * set surface title + * + * Set a short title for the surface. + * + * This string may be used to identify the surface in a task bar, + * window list, or other user interface elements provided by the + * compositor. + * + * The string must be encoded in UTF-8. + * @param title title of the surface + */ + void (*set_title)(struct wl_client *client, + struct wl_resource *resource, + const char *title); + /** + * set application ID + * + * Set an application identifier for the surface. + * + * The app ID identifies the general class of applications to which + * the surface belongs. The compositor can use this to group + * multiple surfaces together, or to determine how to launch a new + * application. + * + * For D-Bus activatable applications, the app ID is used as the + * D-Bus service name. + * + * The compositor shell will try to group application surfaces + * together by their app ID. As a best practice, it is suggested to + * select app ID's that match the basename of the application's + * .desktop file. For example, "org.freedesktop.FooViewer" where + * the .desktop file is "org.freedesktop.FooViewer.desktop". + * + * Like other properties, a set_app_id request can be sent after + * the xdg_toplevel has been mapped to update the property. + * + * See the desktop-entry specification [0] for more details on + * application identifiers and how they relate to well-known D-Bus + * names and .desktop files. + * + * [0] https://standards.freedesktop.org/desktop-entry-spec/ + * @param app_id application identifier surface belongs to + */ + void (*set_app_id)(struct wl_client *client, + struct wl_resource *resource, + const char *app_id); + /** + * show the window menu + * + * Clients implementing client-side decorations might want to + * show a context menu when right-clicking on the decorations, + * giving the user a menu that they can use to maximize or minimize + * the window. + * + * This request asks the compositor to pop up such a window menu at + * the given position, relative to the local surface coordinates of + * the parent surface. There are no guarantees as to what menu + * items the window menu contains, or even if a window menu will be + * drawn at all. + * + * This request must be used in response to some sort of user + * action like a button press, key press, or touch down event. + * @param seat the wl_seat of the user event + * @param serial the serial of the user event + * @param x the x position to pop up the window menu at + * @param y the y position to pop up the window menu at + */ + void (*show_window_menu)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial, + int32_t x, + int32_t y); + /** + * start an interactive move + * + * Start an interactive, user-driven move of the surface. + * + * This request must be used in response to some sort of user + * action like a button press, key press, or touch down event. The + * passed serial is used to determine the type of interactive move + * (touch, pointer, etc). + * + * The server may ignore move requests depending on the state of + * the surface (e.g. fullscreen or maximized), or if the passed + * serial is no longer valid. + * + * If triggered, the surface will lose the focus of the device + * (wl_pointer, wl_touch, etc) used for the move. It is up to the + * compositor to visually indicate that the move is taking place, + * such as updating a pointer cursor, during the move. There is no + * guarantee that the device focus will return when the move is + * completed. + * @param seat the wl_seat of the user event + * @param serial the serial of the user event + */ + void (*move)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial); + /** + * start an interactive resize + * + * Start a user-driven, interactive resize of the surface. + * + * This request must be used in response to some sort of user + * action like a button press, key press, or touch down event. The + * passed serial is used to determine the type of interactive + * resize (touch, pointer, etc). + * + * The server may ignore resize requests depending on the state of + * the surface (e.g. fullscreen or maximized). + * + * If triggered, the client will receive configure events with the + * "resize" state enum value and the expected sizes. See the + * "resize" enum value for more details about what is required. The + * client must also acknowledge configure events using + * "ack_configure". After the resize is completed, the client will + * receive another "configure" event without the resize state. + * + * If triggered, the surface also will lose the focus of the device + * (wl_pointer, wl_touch, etc) used for the resize. It is up to the + * compositor to visually indicate that the resize is taking place, + * such as updating a pointer cursor, during the resize. There is + * no guarantee that the device focus will return when the resize + * is completed. + * + * The edges parameter specifies how the surface should be resized, + * and is one of the values of the resize_edge enum. Values not + * matching a variant of the enum will cause the + * invalid_resize_edge protocol error. The compositor may use this + * information to update the surface position for example when + * dragging the top left corner. The compositor may also use this + * information to adapt its behavior, e.g. choose an appropriate + * cursor image. + * @param seat the wl_seat of the user event + * @param serial the serial of the user event + * @param edges which edge or corner is being dragged + */ + void (*resize)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial, + uint32_t edges); + /** + * set the maximum size + * + * Set a maximum size for the window. + * + * The client can specify a maximum size so that the compositor + * does not try to configure the window beyond this size. + * + * The width and height arguments are in window geometry + * coordinates. See xdg_surface.set_window_geometry. + * + * Values set in this way are double-buffered, see + * wl_surface.commit. + * + * The compositor can use this information to allow or disallow + * different states like maximize or fullscreen and draw accurate + * animations. + * + * Similarly, a tiling window manager may use this information to + * place and resize client windows in a more effective way. + * + * The client should not rely on the compositor to obey the maximum + * size. The compositor may decide to ignore the values set by the + * client and request a larger size. + * + * If never set, or a value of zero in the request, means that the + * client has no expected maximum size in the given dimension. As a + * result, a client wishing to reset the maximum size to an + * unspecified state can use zero for width and height in the + * request. + * + * Requesting a maximum size to be smaller than the minimum size of + * a surface is illegal and will result in an invalid_size error. + * + * The width and height must be greater than or equal to zero. + * Using strictly negative values for width or height will result + * in an invalid_size error. + * @param width maximum width of the window + * @param height maximum height of the window + */ + void (*set_max_size)(struct wl_client *client, + struct wl_resource *resource, + int32_t width, + int32_t height); + /** + * set the minimum size + * + * Set a minimum size for the window. + * + * The client can specify a minimum size so that the compositor + * does not try to configure the window below this size. + * + * The width and height arguments are in window geometry + * coordinates. See xdg_surface.set_window_geometry. + * + * Values set in this way are double-buffered, see + * wl_surface.commit. + * + * The compositor can use this information to allow or disallow + * different states like maximize or fullscreen and draw accurate + * animations. + * + * Similarly, a tiling window manager may use this information to + * place and resize client windows in a more effective way. + * + * The client should not rely on the compositor to obey the minimum + * size. The compositor may decide to ignore the values set by the + * client and request a smaller size. + * + * If never set, or a value of zero in the request, means that the + * client has no expected minimum size in the given dimension. As a + * result, a client wishing to reset the minimum size to an + * unspecified state can use zero for width and height in the + * request. + * + * Requesting a minimum size to be larger than the maximum size of + * a surface is illegal and will result in an invalid_size error. + * + * The width and height must be greater than or equal to zero. + * Using strictly negative values for width and height will result + * in an invalid_size error. + * @param width minimum width of the window + * @param height minimum height of the window + */ + void (*set_min_size)(struct wl_client *client, + struct wl_resource *resource, + int32_t width, + int32_t height); + /** + * maximize the window + * + * Maximize the surface. + * + * After requesting that the surface should be maximized, the + * compositor will respond by emitting a configure event. Whether + * this configure actually sets the window maximized is subject to + * compositor policies. The client must then update its content, + * drawing in the configured state. The client must also + * acknowledge the configure when committing the new content (see + * ack_configure). + * + * It is up to the compositor to decide how and where to maximize + * the surface, for example which output and what region of the + * screen should be used. + * + * If the surface was already maximized, the compositor will still + * emit a configure event with the "maximized" state. + * + * If the surface is in a fullscreen state, this request has no + * direct effect. It may alter the state the surface is returned to + * when unmaximized unless overridden by the compositor. + */ + void (*set_maximized)(struct wl_client *client, + struct wl_resource *resource); + /** + * unmaximize the window + * + * Unmaximize the surface. + * + * After requesting that the surface should be unmaximized, the + * compositor will respond by emitting a configure event. Whether + * this actually un-maximizes the window is subject to compositor + * policies. If available and applicable, the compositor will + * include the window geometry dimensions the window had prior to + * being maximized in the configure event. The client must then + * update its content, drawing it in the configured state. The + * client must also acknowledge the configure when committing the + * new content (see ack_configure). + * + * It is up to the compositor to position the surface after it was + * unmaximized; usually the position the surface had before + * maximizing, if applicable. + * + * If the surface was already not maximized, the compositor will + * still emit a configure event without the "maximized" state. + * + * If the surface is in a fullscreen state, this request has no + * direct effect. It may alter the state the surface is returned to + * when unmaximized unless overridden by the compositor. + */ + void (*unset_maximized)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the window as fullscreen on an output + * + * Make the surface fullscreen. + * + * After requesting that the surface should be fullscreened, the + * compositor will respond by emitting a configure event. Whether + * the client is actually put into a fullscreen state is subject to + * compositor policies. The client must also acknowledge the + * configure when committing the new content (see ack_configure). + * + * The output passed by the request indicates the client's + * preference as to which display it should be set fullscreen on. + * If this value is NULL, it's up to the compositor to choose which + * display will be used to map this surface. + * + * If the surface doesn't cover the whole output, the compositor + * will position the surface in the center of the output and + * compensate with border fill covering the rest of the output. The + * content of the border fill is undefined, but should be assumed + * to be in some way that attempts to blend into the surrounding + * area (e.g. solid black). + * + * If the fullscreened surface is not opaque, the compositor must + * make sure that other screen content not part of the same surface + * tree (made up of subsurfaces, popups or similarly coupled + * surfaces) are not visible below the fullscreened surface. + * @param output preferred output to place surface on + */ + void (*set_fullscreen)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *output); + /** + * unset the window as fullscreen + * + * Make the surface no longer fullscreen. + * + * After requesting that the surface should be unfullscreened, the + * compositor will respond by emitting a configure event. Whether + * this actually removes the fullscreen state of the client is + * subject to compositor policies. + * + * Making a surface unfullscreen sets states for the surface based + * on the following: * the state(s) it may have had before becoming + * fullscreen * any state(s) decided by the compositor * any + * state(s) requested by the client while the surface was + * fullscreen + * + * The compositor may include the previous window geometry + * dimensions in the configure event, if applicable. + * + * The client must also acknowledge the configure when committing + * the new content (see ack_configure). + */ + void (*unset_fullscreen)(struct wl_client *client, + struct wl_resource *resource); + /** + * set the window as minimized + * + * Request that the compositor minimize your surface. There is no + * way to know if the surface is currently minimized, nor is there + * any way to unset minimization on this surface. + * + * If you are looking to throttle redrawing when minimized, please + * instead use the wl_surface.frame event for this, as this will + * also work with live previews on windows in Alt-Tab, Expose or + * similar compositor features. + */ + void (*set_minimized)(struct wl_client *client, + struct wl_resource *resource); +}; + +#define XDG_TOPLEVEL_CONFIGURE 0 +#define XDG_TOPLEVEL_CLOSE 1 +#define XDG_TOPLEVEL_CONFIGURE_BOUNDS 2 +#define XDG_TOPLEVEL_WM_CAPABILITIES 3 + +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_CONFIGURE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_CLOSE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION 4 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_WM_CAPABILITIES_SINCE_VERSION 5 + +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_PARENT_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_TITLE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_APP_ID_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SHOW_WINDOW_MENU_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_MOVE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_RESIZE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_MAX_SIZE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_MIN_SIZE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_MAXIMIZED_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_UNSET_MAXIMIZED_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_FULLSCREEN_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_UNSET_FULLSCREEN_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_toplevel + */ +#define XDG_TOPLEVEL_SET_MINIMIZED_SINCE_VERSION 1 + +/** + * @ingroup iface_xdg_toplevel + * Sends an configure event to the client owning the resource. + * @param resource_ The client's resource + * @param width suggested width of window + * @param height suggested height of window + * @param states suggested states of the window + */ +static inline void +xdg_toplevel_send_configure(struct wl_resource *resource_, int32_t width, int32_t height, struct wl_array *states) +{ + wl_resource_post_event(resource_, XDG_TOPLEVEL_CONFIGURE, width, height, states); +} + +/** + * @ingroup iface_xdg_toplevel + * Sends an close event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +xdg_toplevel_send_close(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, XDG_TOPLEVEL_CLOSE); +} + +/** + * @ingroup iface_xdg_toplevel + * Sends an configure_bounds event to the client owning the resource. + * @param resource_ The client's resource + * @param width suggested maximum width of surface + * @param height suggested maximum height of surface + */ +static inline void +xdg_toplevel_send_configure_bounds(struct wl_resource *resource_, int32_t width, int32_t height) +{ + wl_resource_post_event(resource_, XDG_TOPLEVEL_CONFIGURE_BOUNDS, width, height); +} + +/** + * @ingroup iface_xdg_toplevel + * Sends an wm_capabilities event to the client owning the resource. + * @param resource_ The client's resource + * @param capabilities array of 32-bit capabilities + */ +static inline void +xdg_toplevel_send_wm_capabilities(struct wl_resource *resource_, struct wl_array *capabilities) +{ + wl_resource_post_event(resource_, XDG_TOPLEVEL_WM_CAPABILITIES, capabilities); +} + +#ifndef XDG_POPUP_ERROR_ENUM +#define XDG_POPUP_ERROR_ENUM +enum xdg_popup_error { + /** + * tried to grab after being mapped + */ + XDG_POPUP_ERROR_INVALID_GRAB = 0, +}; +#endif /* XDG_POPUP_ERROR_ENUM */ + +#ifndef XDG_POPUP_ERROR_ENUM_IS_VALID +#define XDG_POPUP_ERROR_ENUM_IS_VALID +/** + * @ingroup iface_xdg_popup + * Validate a xdg_popup error value. + * + * @return true on success, false on error. + * @ref xdg_popup_error + */ +static inline bool +xdg_popup_error_is_valid(uint32_t value, uint32_t version) { + switch (value) { + case XDG_POPUP_ERROR_INVALID_GRAB: + return version >= 1; + default: + return false; + } +} +#endif /* XDG_POPUP_ERROR_ENUM_IS_VALID */ + +/** + * @ingroup iface_xdg_popup + * @struct xdg_popup_interface + */ +struct xdg_popup_interface { + /** + * remove xdg_popup interface + * + * This destroys the popup. Explicitly destroying the xdg_popup + * object will also dismiss the popup, and unmap the surface. + * + * If this xdg_popup is not the "topmost" popup, the + * xdg_wm_base.not_the_topmost_popup protocol error will be sent. + */ + void (*destroy)(struct wl_client *client, + struct wl_resource *resource); + /** + * make the popup take an explicit grab + * + * This request makes the created popup take an explicit grab. An + * explicit grab will be dismissed when the user dismisses the + * popup, or when the client destroys the xdg_popup. This can be + * done by the user clicking outside the surface, using the + * keyboard, or even locking the screen through closing the lid or + * a timeout. + * + * If the compositor denies the grab, the popup will be immediately + * dismissed. + * + * This request must be used in response to some sort of user + * action like a button press, key press, or touch down event. The + * serial number of the event should be passed as 'serial'. + * + * The parent of a grabbing popup must either be an xdg_toplevel + * surface or another xdg_popup with an explicit grab. If the + * parent is another xdg_popup it means that the popups are nested, + * with this popup now being the topmost popup. + * + * Nested popups must be destroyed in the reverse order they were + * created in, e.g. the only popup you are allowed to destroy at + * all times is the topmost one. + * + * When compositors choose to dismiss a popup, they may dismiss + * every nested grabbing popup as well. When a compositor dismisses + * popups, it will follow the same dismissing order as required + * from the client. + * + * If the topmost grabbing popup is destroyed, the grab will be + * returned to the parent of the popup, if that parent previously + * had an explicit grab. + * + * If the parent is a grabbing popup which has already been + * dismissed, this popup will be immediately dismissed. If the + * parent is a popup that did not take an explicit grab, an error + * will be raised. + * + * During a popup grab, the client owning the grab will receive + * pointer and touch events for all their surfaces as normal + * (similar to an "owner-events" grab in X11 parlance), while the + * top most grabbing popup will always have keyboard focus. + * @param seat the wl_seat of the user event + * @param serial the serial of the user event + */ + void (*grab)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *seat, + uint32_t serial); + /** + * recalculate the popup's location + * + * Reposition an already-mapped popup. The popup will be placed + * given the details in the passed xdg_positioner object, and a + * xdg_popup.repositioned followed by xdg_popup.configure and + * xdg_surface.configure will be emitted in response. Any + * parameters set by the previous positioner will be discarded. + * + * The passed token will be sent in the corresponding + * xdg_popup.repositioned event. The new popup position will not + * take effect until the corresponding configure event is + * acknowledged by the client. See xdg_popup.repositioned for + * details. The token itself is opaque, and has no other special + * meaning. + * + * If multiple reposition requests are sent, the compositor may + * skip all but the last one. + * + * If the popup is repositioned in response to a configure event + * for its parent, the client should send an + * xdg_positioner.set_parent_configure and possibly an + * xdg_positioner.set_parent_size request to allow the compositor + * to properly constrain the popup. + * + * If the popup is repositioned together with a parent that is + * being resized, but not in response to a configure event, the + * client should send an xdg_positioner.set_parent_size request. + * @param token reposition request token + * @since 3 + */ + void (*reposition)(struct wl_client *client, + struct wl_resource *resource, + struct wl_resource *positioner, + uint32_t token); +}; + +#define XDG_POPUP_CONFIGURE 0 +#define XDG_POPUP_POPUP_DONE 1 +#define XDG_POPUP_REPOSITIONED 2 + +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_CONFIGURE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_POPUP_DONE_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_REPOSITIONED_SINCE_VERSION 3 + +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_DESTROY_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_GRAB_SINCE_VERSION 1 +/** + * @ingroup iface_xdg_popup + */ +#define XDG_POPUP_REPOSITION_SINCE_VERSION 3 + +/** + * @ingroup iface_xdg_popup + * Sends an configure event to the client owning the resource. + * @param resource_ The client's resource + * @param x x position relative to parent surface window geometry + * @param y y position relative to parent surface window geometry + * @param width window geometry width + * @param height window geometry height + */ +static inline void +xdg_popup_send_configure(struct wl_resource *resource_, int32_t x, int32_t y, int32_t width, int32_t height) +{ + wl_resource_post_event(resource_, XDG_POPUP_CONFIGURE, x, y, width, height); +} + +/** + * @ingroup iface_xdg_popup + * Sends an popup_done event to the client owning the resource. + * @param resource_ The client's resource + */ +static inline void +xdg_popup_send_popup_done(struct wl_resource *resource_) +{ + wl_resource_post_event(resource_, XDG_POPUP_POPUP_DONE); +} + +/** + * @ingroup iface_xdg_popup + * Sends an repositioned event to the client owning the resource. + * @param resource_ The client's resource + * @param token reposition request token + */ +static inline void +xdg_popup_send_repositioned(struct wl_resource *resource_, uint32_t token) +{ + wl_resource_post_event(resource_, XDG_POPUP_REPOSITIONED, token); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/ipc.c b/src/ipc.c index a322dca..abc2438 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -5,6 +5,7 @@ #include "client.h" #include "ipc.h" +#include "layout.h" #include "util.h" /* IPC globals */ @@ -75,7 +76,7 @@ ipc_send_output_state(IpcOutput *ipc_out) } /* layout symbol */ - zpeachwm_ipc_output_v2_send_layout_symbol(res, m->ltsymbol[current_tag_idx(m)]); + zpeachwm_ipc_output_v2_send_layout_symbol(res, m->cold->ltsymbol[current_tag_idx(m)]); /* title/appid/fullscreen/floating */ if (c) { @@ -171,10 +172,11 @@ ipc_output_handle_set_layout(struct wl_client *client, if (!m || idx >= (uint32_t)layout_count) return; int ti = current_tag_idx(m); - if (m->lt[ti][m->sellt[ti]] != &layouts[idx]) - m->sellt[ti] ^= 1; - m->lt[ti][m->sellt[ti]] = &layouts[idx]; - strncpy(m->ltsymbol[ti], layouts[idx].symbol, LENGTH(m->ltsymbol[ti])); + ensure_cold(m); + if (m->cold->lt[ti][m->cold->sellt[ti]] != &layouts[idx]) + m->cold->sellt[ti] ^= 1; + m->cold->lt[ti][m->cold->sellt[ti]] = &layouts[idx]; + strncpy(m->cold->ltsymbol[ti], layouts[idx].symbol, LENGTH(m->cold->ltsymbol[ti])); arrange(m); printstatus(); } diff --git a/src/ipc_socket.c b/src/ipc_socket.c index 66dabc0..5fe4336 100644 --- a/src/ipc_socket.c +++ b/src/ipc_socket.c @@ -384,7 +384,7 @@ ipc_build_workspace(struct json_writer *w, Monitor *m, uint32_t tag_bit, json_object_end(w); json_key_string(w, "output", m->wlr_output->name); - json_key_string(w, "layout", m->ltsymbol[tag_idx]); + json_key_string(w, "layout", m->cold->ltsymbol[tag_idx]); json_key_string(w, "representation", ""); json_key_string(w, "type", "workspace"); @@ -675,7 +675,7 @@ ipc_handle_get_tree(struct ipc_client *client) json_key_string(&w, "type", "workspace"); json_key_string(&w, "name", ipc_tag_name(i)); - json_key_string(&w, "layout", m->ltsymbol[i]); + json_key_string(&w, "layout", m->cold->ltsymbol[i]); json_key(&w, "rect"); json_object_start(&w); diff --git a/src/layout.c b/src/layout.c index a658cd6..a389ca2 100644 --- a/src/layout.c +++ b/src/layout.c @@ -40,6 +40,21 @@ const unsigned int layout_count = LENGTH(layouts); * helpers * ================================================================ */ +/* Allocate and default-initialize monitor cold state on first use. */ +void +ensure_cold(Monitor *m) +{ + if (m->cold) + return; + m->cold = ecalloc(1, sizeof(MonitorCold)); + for (int i = 0; i < TAGCOUNT; i++) { + m->cold->lt[i][0] = &layouts[0]; + m->cold->lt[i][1] = &layouts[0]; + } + m->cold->mfact = 0.55f; + m->cold->nmaster = 1; +} + /* * Returns the 0-based index of the lowest set tag bit for monitor m. * For single-tag views this is the exact tag. For multi-tag views it @@ -64,7 +79,8 @@ const Layout * curlayout(Monitor *m) { int ti = current_tag_idx(m); - return m->lt[ti][m->sellt[ti]]; + ensure_cold(m); + return m->cold->lt[ti][m->cold->sellt[ti]]; } /* ================================================================ @@ -230,10 +246,10 @@ void dwindle_remove_client(Client *c) { Monitor *m = c->mon; - if (!m) + if (!m || !m->cold) return; for (int i = 0; i < TAGCOUNT; i++) - dwindle_remove(&m->dwindle_root[i], c); + dwindle_remove(&m->cold->dwindle_root[i], c); } /* ================================================================ @@ -243,6 +259,7 @@ dwindle_remove_client(Client *c) void dwindle(Monitor *m) { + ensure_cold(m); Client *c; int n = 0, e; @@ -258,7 +275,7 @@ dwindle(Monitor *m) : 0; int ti = current_tag_idx(m); - DwindleNode **root = &m->dwindle_root[ti]; + DwindleNode **root = &m->cold->dwindle_root[ti]; /* prune leaves whose clients are no longer tiled here */ { @@ -295,11 +312,11 @@ dwindle(Monitor *m) /* * Insert any newly visible client, splitting the focused node. - * Use m->dwindle_focus[ti] so it actually splits what the user + * Use m->cold->dwindle_focus[ti] so it actually splits what the user * was looking at when they spawned the window, rather than whatever * focustop() happens to return. */ - Client *focused = m->dwindle_focus[ti]; + Client *focused = m->cold->dwindle_focus[ti]; wl_list_for_each(c, &clients, link) { if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) @@ -329,13 +346,14 @@ dwindle(Monitor *m) static void master_arrange(Monitor *m, int ti) { + ensure_cold(m); Client *c, *master_c = nullptr; Client *stack[256]; int nstack = 0, n = 0; wl_list_for_each(c, &clients, link) { if (VISIBLEON(c, m) && !c->isfloating) { - if (c == m->master_master[ti]) + if (c == m->cold->master_master[ti]) master_c = c; if (!c->isfullscreen) n++; @@ -348,7 +366,7 @@ master_arrange(Monitor *m, int ti) if (!master_c) { wl_list_for_each(c, &clients, link) { if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) { - m->master_master[ti] = c; + m->cold->master_master[ti] = c; master_c = c; break; } @@ -374,9 +392,9 @@ master_arrange(Monitor *m, int ti) return; } - int master_w = MAX(1, (int)(aw * m->mfact)); + int master_w = MAX(1, (int)(aw * m->cold->mfact)); - if (m->master_side[ti] == 0) { + if (m->cold->master_side[ti] == 0) { int stack_x = m->w.x + e + master_w + e; int stack_w = MAX(1, aw - master_w - e); @@ -421,11 +439,11 @@ void master_remove_client(Client *c) { Monitor *m = c->mon; - if (!m) + if (!m || !m->cold) return; for (int i = 0; i < TAGCOUNT; i++) { - if (m->master_master[i] == c) - m->master_master[i] = nullptr; + if (m->cold->master_master[i] == c) + m->cold->master_master[i] = nullptr; } } @@ -479,8 +497,10 @@ swaptiled(Client *a, Client *b) return; wl_list_for_each(m, &mons, link) { + if (!m->cold) + continue; for (int i = 0; i < TAGCOUNT; i++) { - DwindleNode **root = &m->dwindle_root[i]; + DwindleNode **root = &m->cold->dwindle_root[i]; if (!*root) continue; DwindleNode *la = dwindle_find_leaf(*root, a); diff --git a/src/layout.h b/src/layout.h index eef3942..c4b60a2 100644 --- a/src/layout.h +++ b/src/layout.h @@ -26,6 +26,7 @@ void monocle(Monitor *m); /* helpers used across modules */ [[nodiscard]] int current_tag_idx(Monitor *m); [[nodiscard]] const Layout *curlayout(Monitor *m); +void ensure_cold(Monitor *m); /* dwindle tree helpers (exposed for swapdir) */ [[nodiscard]] DwindleNode *dwindle_find_leaf(DwindleNode *n, Client *c); diff --git a/src/peachwm.c b/src/peachwm.c index 2ec7e87..a4ea515 100644 --- a/src/peachwm.c +++ b/src/peachwm.c @@ -401,21 +401,22 @@ static void apply_workspace_layout(Monitor *m, int tag_idx) { if (!layout_name[0]) return; + /* ensure_cold will be called by whichever write path triggers first */ for (int li = 0; li < (int)layout_count; li++) { if (layouts[li].symbol && !strcmp(layout_name, layouts[li].symbol)) { - m->lt[tag_idx][m->sellt[tag_idx]] = &layouts[li]; + m->cold->lt[tag_idx][m->cold->sellt[tag_idx]] = &layouts[li]; break; } if (!strcmp(layout_name, "dwindle") && layouts[li].arrange == dwindle) { - m->lt[tag_idx][m->sellt[tag_idx]] = &layouts[li]; + m->cold->lt[tag_idx][m->cold->sellt[tag_idx]] = &layouts[li]; break; } if (!strcmp(layout_name, "master") && layouts[li].arrange == master) { - m->lt[tag_idx][m->sellt[tag_idx]] = &layouts[li]; + m->cold->lt[tag_idx][m->cold->sellt[tag_idx]] = &layouts[li]; break; } if (!strcmp(layout_name, "monocle") && layouts[li].arrange == monocle) { - m->lt[tag_idx][m->sellt[tag_idx]] = &layouts[li]; + m->cold->lt[tag_idx][m->cold->sellt[tag_idx]] = &layouts[li]; break; } } @@ -481,8 +482,8 @@ void arrange(Monitor *m) { (c = focustop(m)) && c->isfullscreen); int ti = current_tag_idx(m); - strncpy(m->ltsymbol[ti], curlayout(m)->symbol, LENGTH(m->ltsymbol[ti])); - m->ltsymbol[ti][LENGTH(m->ltsymbol[ti]) - 1] = '\0'; + strncpy(m->cold->ltsymbol[ti], curlayout(m)->symbol, LENGTH(m->cold->ltsymbol[ti])); + m->cold->ltsymbol[ti][LENGTH(m->cold->ltsymbol[ti]) - 1] = '\0'; /* We move all clients (except fullscreen and unmanaged) to LyrTile while * in floating layout to avoid "real" floating clients be always on top */ @@ -756,9 +757,10 @@ static void cleanupmon(struct wl_listener *listener, void *data) { closemon(m); ext_workspace_cleanupmon(m); ipc_socket_send_output_event(); - for (int i = 0; i < TAGCOUNT; i++) { - dwindle_free_tree(m->dwindle_root[i]); - m->dwindle_root[i] = nullptr; + if (m->cold) { + for (int i = 0; i < TAGCOUNT; i++) + dwindle_free_tree(m->cold->dwindle_root[i]); + free(m->cold); } wlr_scene_node_destroy(&m->fullscreen_bg->node); free(m); @@ -1077,8 +1079,10 @@ static void createmon(struct wl_listener *listener, void *data) { if (!r->name[0] || strstr(wlr_output->name, r->name)) { m->m.x = r->x; m->m.y = r->y; - m->mfact = r->mfact; - m->nmaster = r->nmaster; + /* Allocate cold state lazily via the shared helper */ + ensure_cold(m); + m->cold->mfact = r->mfact; + m->cold->nmaster = r->nmaster; /* Determine monitor's default layout */ const Layout *mon_layout = &layouts[0]; for (int li = 0; li < (int)layout_count; li++) { @@ -1102,15 +1106,15 @@ static void createmon(struct wl_listener *listener, void *data) { const Layout *alt_layout = &layouts[layout_count > 1 && mon_layout != &layouts[1]]; /* Propagate monitor layout to all tags */ for (int ti = 0; ti < TAGCOUNT; ti++) { - m->lt[ti][0] = mon_layout; - m->lt[ti][1] = alt_layout; - m->sellt[ti] = 0; + m->cold->lt[ti][0] = mon_layout; + m->cold->lt[ti][1] = alt_layout; + m->cold->sellt[ti] = 0; } /* Apply per-workspace default layout for all tags */ for (int ti = 0; ti < TAGCOUNT; ti++) apply_workspace_layout(m, ti); - strncpy(m->ltsymbol[0], curlayout(m)->symbol, LENGTH(m->ltsymbol[0])); - m->ltsymbol[0][LENGTH(m->ltsymbol[0]) - 1] = '\0'; + strncpy(m->cold->ltsymbol[0], curlayout(m)->symbol, LENGTH(m->cold->ltsymbol[0])); + m->cold->ltsymbol[0][LENGTH(m->cold->ltsymbol[0]) - 1] = '\0'; wlr_output_state_set_scale(&state, r->scale); wlr_output_state_set_transform(&state, r->transform); break; @@ -1474,8 +1478,8 @@ void focusclient(Client *c, int lift) { c->isurgent = 0; /* Track focused client for dwindle insertion anchor */ - if (c->mon && !c->isfloating && !c->isfullscreen) - c->mon->dwindle_focus[current_tag_idx(c->mon)] = c; + if (c->mon && !c->isfloating && !c->isfullscreen && c->mon->cold) + c->mon->cold->dwindle_focus[current_tag_idx(c->mon)] = c; /* Don't change border color if there is an exclusive focus or we are * handling a drag operation */ @@ -2507,7 +2511,7 @@ void printstatus(void) { printf("%s tags %" PRIu32 " %" PRIu32 " %" PRIu32 " %" PRIu32 "\n", m->wlr_output->name, occ, m->tagset[m->seltags], sel, urg); int _ti = current_tag_idx(m); - printf("%s layout %s\n", m->wlr_output->name, m->ltsymbol[_ti]); + printf("%s layout %s\n", m->wlr_output->name, m->cold->ltsymbol[_ti]); ext_workspace_printstatus(m); } fflush(stdout); @@ -2853,26 +2857,27 @@ static void setfullscreen(Client *c, int fullscreen) { static void setlayout(const Arg *arg) { if (!selmon) return; + ensure_cold(selmon); int ti = current_tag_idx(selmon); /* arg->ui is an index into layouts[]. If out of range, just toggle. */ if (arg && arg->ui < layout_count) { - if (selmon->lt[ti][selmon->sellt[ti]] != &layouts[arg->ui]) - selmon->sellt[ti] ^= 1; - selmon->lt[ti][selmon->sellt[ti]] = &layouts[arg->ui]; + if (selmon->cold->lt[ti][selmon->cold->sellt[ti]] != &layouts[arg->ui]) + selmon->cold->sellt[ti] ^= 1; + selmon->cold->lt[ti][selmon->cold->sellt[ti]] = &layouts[arg->ui]; } else { - selmon->sellt[ti] ^= 1; + selmon->cold->sellt[ti] ^= 1; } - strncpy(selmon->ltsymbol[ti], selmon->lt[ti][selmon->sellt[ti]]->symbol, - LENGTH(selmon->ltsymbol[ti])); - selmon->ltsymbol[ti][LENGTH(selmon->ltsymbol[ti]) - 1] = '\0'; + strncpy(selmon->cold->ltsymbol[ti], selmon->cold->lt[ti][selmon->cold->sellt[ti]]->symbol, + LENGTH(selmon->cold->ltsymbol[ti])); + selmon->cold->ltsymbol[ti][LENGTH(selmon->cold->ltsymbol[ti]) - 1] = '\0'; /* Convert windows when switching to master: set focused client as master */ if (curlayout(selmon)->arrange == master) { Client *sel = focustop(selmon); if (sel && VISIBLEON(sel, selmon) && !sel->isfloating && !sel->isfullscreen) - selmon->master_master[ti] = sel; + selmon->cold->master_master[ti] = sel; else - selmon->master_master[ti] = nullptr; + selmon->cold->master_master[ti] = nullptr; /* Convert to floating: float all tiled clients */ } else if (!curlayout(selmon)->arrange) { Client *c; @@ -3007,8 +3012,9 @@ reapply_monitor_config(void) for (int ri = 0; ri < cfg.nmonitors; ri++) { const CfgMonitorRule *r = &cfg.monitors[ri]; if (!r->name[0] || strstr(m->wlr_output->name, r->name)) { - m->mfact = r->mfact; - m->nmaster = r->nmaster; + ensure_cold(m); + m->cold->mfact = r->mfact; + m->cold->nmaster = r->nmaster; /* Map layout name */ const Layout *mon_layout = &layouts[0]; for (int li = 0; li < (int)layout_count; li++) { @@ -3031,9 +3037,9 @@ reapply_monitor_config(void) } const Layout *alt_layout = &layouts[layout_count > 1 && mon_layout != &layouts[1]]; for (int ti = 0; ti < TAGCOUNT; ti++) { - m->lt[ti][0] = mon_layout; - m->lt[ti][1] = alt_layout; - m->sellt[ti] = 0; + m->cold->lt[ti][0] = mon_layout; + m->cold->lt[ti][1] = alt_layout; + m->cold->sellt[ti] = 0; } /* Apply scale and transform */ struct wlr_output_state state; @@ -3568,7 +3574,7 @@ static void swapdir(const Arg *arg) { if (curlayout(selmon)->arrange == dwindle) { int ti = current_tag_idx(selmon); - DwindleNode **root = &selmon->dwindle_root[ti]; + DwindleNode **root = &selmon->cold->dwindle_root[ti]; if (*root) { DwindleNode *leaf_sel = dwindle_find_leaf(*root, sel); DwindleNode *leaf_other = dwindle_find_leaf(*root, other); @@ -3588,13 +3594,13 @@ static void swapdir(const Arg *arg) { } } else if (curlayout(selmon)->arrange == master) { int ti = current_tag_idx(selmon); - int side = selmon->master_side[ti]; + int side = selmon->cold->master_side[ti]; - if (sel == selmon->master_master[ti]) { + if (sel == selmon->cold->master_master[ti]) { /* master moving away from master side → flip */ if ((side == 0 && arg->i == WLR_DIRECTION_RIGHT) || (side == 1 && arg->i == WLR_DIRECTION_LEFT)) { - selmon->master_side[ti] = !side; + selmon->cold->master_side[ti] = !side; arrange(selmon); printstatus(); focusclient(sel, 1); @@ -3604,7 +3610,7 @@ static void swapdir(const Arg *arg) { /* stack moving toward master side → promote */ if ((side == 0 && arg->i == WLR_DIRECTION_LEFT) || (side == 1 && arg->i == WLR_DIRECTION_RIGHT)) { - selmon->master_master[ti] = sel; + selmon->cold->master_master[ti] = sel; arrange(selmon); printstatus(); focusclient(sel, 1);