From fa3ca0c2fb6795a2a2a93358769969f2e25aba19 Mon Sep 17 00:00:00 2001 From: mrsu Date: Mon, 26 Jun 2023 10:13:18 +0100 Subject: [PATCH] keyboard_select --- config.def.h | 1 + config.h | 475 ++++++++++++++++++ patches/st-keyboard_select-0.8.2.diff | 336 +++++++++++++ .../st-keyboard_select-20200617-9ba7ecf.diff | 319 ++++++++++++ st | Bin 0 -> 110368 bytes st.c | 222 ++++++++ st.h | 1 + st.o | Bin 0 -> 88152 bytes win.h | 3 + x.c | 15 + x.o | Bin 0 -> 75288 bytes 11 files changed, 1372 insertions(+) create mode 100644 config.h create mode 100644 patches/st-keyboard_select-0.8.2.diff create mode 100644 patches/st-keyboard_select-20200617-9ba7ecf.diff create mode 100755 st create mode 100644 st.o create mode 100644 x.o diff --git a/config.def.h b/config.def.h index 91ab8ca..addb201 100644 --- a/config.def.h +++ b/config.def.h @@ -201,6 +201,7 @@ static Shortcut shortcuts[] = { { TERMMOD, XK_Y, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, }; /* diff --git a/config.h b/config.h new file mode 100644 index 0000000..addb201 --- /dev/null +++ b/config.h @@ -0,0 +1,475 @@ +/* See LICENSE file for copyright and license details. */ + +/* + * appearance + * + * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html + */ +static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; +static int borderpx = 2; + +/* + * What program is execed by st depends of these precedence rules: + * 1: program passed with -e + * 2: scroll and/or utmp + * 3: SHELL environment variable + * 4: value of shell in /etc/passwd + * 5: value of shell in config.h + */ +static char *shell = "/bin/sh"; +char *utmp = NULL; +/* scroll program: to enable use a string like "scroll" */ +char *scroll = NULL; +char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; + +/* identification sequence returned in DA and DECID */ +char *vtiden = "\033[?6c"; + +/* Kerning / character bounding-box multipliers */ +static float cwscale = 1.0; +static float chscale = 1.0; + +/* + * word delimiter string + * + * More advanced example: L" `'\"()[]{}" + */ +wchar_t *worddelimiters = L" "; + +/* selection timeouts (in milliseconds) */ +static unsigned int doubleclicktimeout = 300; +static unsigned int tripleclicktimeout = 600; + +/* alt screens */ +int allowaltscreen = 1; + +/* allow certain non-interactive (insecure) window operations such as: + setting the clipboard text */ +int allowwindowops = 0; + +/* + * draw latency range in ms - from new content/keypress/etc until drawing. + * within this range, st draws when content stops arriving (idle). mostly it's + * near minlatency, but it waits longer for slow updates to avoid partial draw. + * low minlatency will tear/flicker more, as it can "detect" idle too early. + */ +static double minlatency = 8; +static double maxlatency = 33; + +/* + * blinking timeout (set to 0 to disable blinking) for the terminal blinking + * attribute. + */ +static unsigned int blinktimeout = 800; + +/* + * thickness of underline and bar cursors + */ +static unsigned int cursorthickness = 2; + +/* + * bell volume. It must be a value between -100 and 100. Use 0 for disabling + * it + */ +static int bellvolume = 0; + +/* default TERM value */ +char *termname = "st-256color"; + +/* + * spaces per tab + * + * When you are changing this value, don't forget to adapt the »it« value in + * the st.info and appropriately install the st.info in the environment where + * you use this st version. + * + * it#$tabspaces, + * + * Secondly make sure your kernel is not expanding tabs. When running `stty + * -a` »tab0« should appear. You can tell the terminal to not expand tabs by + * running following command: + * + * stty tabs + */ +unsigned int tabspaces = 8; + +/* Terminal colors (16 first used in escape sequence) */ +static const char *colorname[] = { + /* 8 normal colors */ + "black", + "red3", + "green3", + "yellow3", + "blue2", + "magenta3", + "cyan3", + "gray90", + + /* 8 bright colors */ + "gray50", + "red", + "green", + "yellow", + "#5c5cff", + "magenta", + "cyan", + "white", + + [255] = 0, + + /* more colors can be added after 255 to use with DefaultXX */ + "#cccccc", + "#555555", + "gray90", /* default foreground colour */ + "black", /* default background colour */ +}; + + +/* + * Default colors (colorname index) + * foreground, background, cursor, reverse cursor + */ +unsigned int defaultfg = 258; +unsigned int defaultbg = 259; +unsigned int defaultcs = 256; +static unsigned int defaultrcs = 257; + +/* + * Default shape of cursor + * 2: Block ("█") + * 4: Underline ("_") + * 6: Bar ("|") + * 7: Snowman ("☃") + */ +static unsigned int cursorshape = 2; + +/* + * Default columns and rows numbers + */ + +static unsigned int cols = 80; +static unsigned int rows = 24; + +/* + * Default colour and shape of the mouse cursor + */ +static unsigned int mouseshape = XC_xterm; +static unsigned int mousefg = 7; +static unsigned int mousebg = 0; + +/* + * Color used to display font attributes when fontconfig selected a font which + * doesn't match the ones requested. + */ +static unsigned int defaultattr = 11; + +/* + * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set). + * Note that if you want to use ShiftMask with selmasks, set this to an other + * modifier, set to 0 to not use it. + */ +static uint forcemousemod = ShiftMask; + +/* + * Internal mouse shortcuts. + * Beware that overloading Button1 will disable the selection. + */ +static MouseShortcut mshortcuts[] = { + /* mask button function argument release */ + { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, + { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, + { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, + { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, + { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, +}; + +/* Internal keyboard shortcuts. */ +#define MODKEY Mod1Mask +#define TERMMOD (ControlMask|ShiftMask) + +static Shortcut shortcuts[] = { + /* mask keysym function argument */ + { XK_ANY_MOD, XK_Break, sendbreak, {.i = 0} }, + { ControlMask, XK_Print, toggleprinter, {.i = 0} }, + { ShiftMask, XK_Print, printscreen, {.i = 0} }, + { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, + { TERMMOD, XK_Prior, zoom, {.f = +1} }, + { TERMMOD, XK_Next, zoom, {.f = -1} }, + { TERMMOD, XK_Home, zoomreset, {.f = 0} }, + { TERMMOD, XK_C, clipcopy, {.i = 0} }, + { TERMMOD, XK_V, clippaste, {.i = 0} }, + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, +}; + +/* + * Special keys (change & recompile st.info accordingly) + * + * Mask value: + * * Use XK_ANY_MOD to match the key no matter modifiers state + * * Use XK_NO_MOD to match the key alone (no modifiers) + * appkey value: + * * 0: no value + * * > 0: keypad application mode enabled + * * = 2: term.numlock = 1 + * * < 0: keypad application mode disabled + * appcursor value: + * * 0: no value + * * > 0: cursor application mode enabled + * * < 0: cursor application mode disabled + * + * Be careful with the order of the definitions because st searches in + * this table sequentially, so any XK_ANY_MOD must be in the last + * position for a key. + */ + +/* + * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) + * to be mapped below, add them to this array. + */ +static KeySym mappedkeys[] = { -1 }; + +/* + * State bits to ignore when matching key or button events. By default, + * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored. + */ +static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; + +/* + * This is the huge key array which defines all compatibility to the Linux + * world. Please decide about changes wisely. + */ +static Key key[] = { + /* keysym mask string appkey appcursor */ + { XK_KP_Home, ShiftMask, "\033[2J", 0, -1}, + { XK_KP_Home, ShiftMask, "\033[1;2H", 0, +1}, + { XK_KP_Home, XK_ANY_MOD, "\033[H", 0, -1}, + { XK_KP_Home, XK_ANY_MOD, "\033[1~", 0, +1}, + { XK_KP_Up, XK_ANY_MOD, "\033Ox", +1, 0}, + { XK_KP_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_KP_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_KP_Down, XK_ANY_MOD, "\033Or", +1, 0}, + { XK_KP_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_KP_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_KP_Left, XK_ANY_MOD, "\033Ot", +1, 0}, + { XK_KP_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_KP_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_KP_Right, XK_ANY_MOD, "\033Ov", +1, 0}, + { XK_KP_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_KP_Right, XK_ANY_MOD, "\033OC", 0, +1}, + { XK_KP_Prior, ShiftMask, "\033[5;2~", 0, 0}, + { XK_KP_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, + { XK_KP_Begin, XK_ANY_MOD, "\033[E", 0, 0}, + { XK_KP_End, ControlMask, "\033[J", -1, 0}, + { XK_KP_End, ControlMask, "\033[1;5F", +1, 0}, + { XK_KP_End, ShiftMask, "\033[K", -1, 0}, + { XK_KP_End, ShiftMask, "\033[1;2F", +1, 0}, + { XK_KP_End, XK_ANY_MOD, "\033[4~", 0, 0}, + { XK_KP_Next, ShiftMask, "\033[6;2~", 0, 0}, + { XK_KP_Next, XK_ANY_MOD, "\033[6~", 0, 0}, + { XK_KP_Insert, ShiftMask, "\033[2;2~", +1, 0}, + { XK_KP_Insert, ShiftMask, "\033[4l", -1, 0}, + { XK_KP_Insert, ControlMask, "\033[L", -1, 0}, + { XK_KP_Insert, ControlMask, "\033[2;5~", +1, 0}, + { XK_KP_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, + { XK_KP_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, + { XK_KP_Delete, ControlMask, "\033[M", -1, 0}, + { XK_KP_Delete, ControlMask, "\033[3;5~", +1, 0}, + { XK_KP_Delete, ShiftMask, "\033[2K", -1, 0}, + { XK_KP_Delete, ShiftMask, "\033[3;2~", +1, 0}, + { XK_KP_Delete, XK_ANY_MOD, "\033[P", -1, 0}, + { XK_KP_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, + { XK_KP_Multiply, XK_ANY_MOD, "\033Oj", +2, 0}, + { XK_KP_Add, XK_ANY_MOD, "\033Ok", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\033OM", +2, 0}, + { XK_KP_Enter, XK_ANY_MOD, "\r", -1, 0}, + { XK_KP_Subtract, XK_ANY_MOD, "\033Om", +2, 0}, + { XK_KP_Decimal, XK_ANY_MOD, "\033On", +2, 0}, + { XK_KP_Divide, XK_ANY_MOD, "\033Oo", +2, 0}, + { XK_KP_0, XK_ANY_MOD, "\033Op", +2, 0}, + { XK_KP_1, XK_ANY_MOD, "\033Oq", +2, 0}, + { XK_KP_2, XK_ANY_MOD, "\033Or", +2, 0}, + { XK_KP_3, XK_ANY_MOD, "\033Os", +2, 0}, + { XK_KP_4, XK_ANY_MOD, "\033Ot", +2, 0}, + { XK_KP_5, XK_ANY_MOD, "\033Ou", +2, 0}, + { XK_KP_6, XK_ANY_MOD, "\033Ov", +2, 0}, + { XK_KP_7, XK_ANY_MOD, "\033Ow", +2, 0}, + { XK_KP_8, XK_ANY_MOD, "\033Ox", +2, 0}, + { XK_KP_9, XK_ANY_MOD, "\033Oy", +2, 0}, + { XK_Up, ShiftMask, "\033[1;2A", 0, 0}, + { XK_Up, Mod1Mask, "\033[1;3A", 0, 0}, + { XK_Up, ShiftMask|Mod1Mask,"\033[1;4A", 0, 0}, + { XK_Up, ControlMask, "\033[1;5A", 0, 0}, + { XK_Up, ShiftMask|ControlMask,"\033[1;6A", 0, 0}, + { XK_Up, ControlMask|Mod1Mask,"\033[1;7A", 0, 0}, + { XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A", 0, 0}, + { XK_Up, XK_ANY_MOD, "\033[A", 0, -1}, + { XK_Up, XK_ANY_MOD, "\033OA", 0, +1}, + { XK_Down, ShiftMask, "\033[1;2B", 0, 0}, + { XK_Down, Mod1Mask, "\033[1;3B", 0, 0}, + { XK_Down, ShiftMask|Mod1Mask,"\033[1;4B", 0, 0}, + { XK_Down, ControlMask, "\033[1;5B", 0, 0}, + { XK_Down, ShiftMask|ControlMask,"\033[1;6B", 0, 0}, + { XK_Down, ControlMask|Mod1Mask,"\033[1;7B", 0, 0}, + { XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0, 0}, + { XK_Down, XK_ANY_MOD, "\033[B", 0, -1}, + { XK_Down, XK_ANY_MOD, "\033OB", 0, +1}, + { XK_Left, ShiftMask, "\033[1;2D", 0, 0}, + { XK_Left, Mod1Mask, "\033[1;3D", 0, 0}, + { XK_Left, ShiftMask|Mod1Mask,"\033[1;4D", 0, 0}, + { XK_Left, ControlMask, "\033[1;5D", 0, 0}, + { XK_Left, ShiftMask|ControlMask,"\033[1;6D", 0, 0}, + { XK_Left, ControlMask|Mod1Mask,"\033[1;7D", 0, 0}, + { XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0, 0}, + { XK_Left, XK_ANY_MOD, "\033[D", 0, -1}, + { XK_Left, XK_ANY_MOD, "\033OD", 0, +1}, + { XK_Right, ShiftMask, "\033[1;2C", 0, 0}, + { XK_Right, Mod1Mask, "\033[1;3C", 0, 0}, + { XK_Right, ShiftMask|Mod1Mask,"\033[1;4C", 0, 0}, + { XK_Right, ControlMask, "\033[1;5C", 0, 0}, + { XK_Right, ShiftMask|ControlMask,"\033[1;6C", 0, 0}, + { XK_Right, ControlMask|Mod1Mask,"\033[1;7C", 0, 0}, + { XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0, 0}, + { XK_Right, XK_ANY_MOD, "\033[C", 0, -1}, + { XK_Right, XK_ANY_MOD, "\033OC", 0, +1}, + { XK_ISO_Left_Tab, ShiftMask, "\033[Z", 0, 0}, + { XK_Return, Mod1Mask, "\033\r", 0, 0}, + { XK_Return, XK_ANY_MOD, "\r", 0, 0}, + { XK_Insert, ShiftMask, "\033[4l", -1, 0}, + { XK_Insert, ShiftMask, "\033[2;2~", +1, 0}, + { XK_Insert, ControlMask, "\033[L", -1, 0}, + { XK_Insert, ControlMask, "\033[2;5~", +1, 0}, + { XK_Insert, XK_ANY_MOD, "\033[4h", -1, 0}, + { XK_Insert, XK_ANY_MOD, "\033[2~", +1, 0}, + { XK_Delete, ControlMask, "\033[M", -1, 0}, + { XK_Delete, ControlMask, "\033[3;5~", +1, 0}, + { XK_Delete, ShiftMask, "\033[2K", -1, 0}, + { XK_Delete, ShiftMask, "\033[3;2~", +1, 0}, + { XK_Delete, XK_ANY_MOD, "\033[P", -1, 0}, + { XK_Delete, XK_ANY_MOD, "\033[3~", +1, 0}, + { XK_BackSpace, XK_NO_MOD, "\177", 0, 0}, + { XK_BackSpace, Mod1Mask, "\033\177", 0, 0}, + { XK_Home, ShiftMask, "\033[2J", 0, -1}, + { XK_Home, ShiftMask, "\033[1;2H", 0, +1}, + { XK_Home, XK_ANY_MOD, "\033[H", 0, -1}, + { XK_Home, XK_ANY_MOD, "\033[1~", 0, +1}, + { XK_End, ControlMask, "\033[J", -1, 0}, + { XK_End, ControlMask, "\033[1;5F", +1, 0}, + { XK_End, ShiftMask, "\033[K", -1, 0}, + { XK_End, ShiftMask, "\033[1;2F", +1, 0}, + { XK_End, XK_ANY_MOD, "\033[4~", 0, 0}, + { XK_Prior, ControlMask, "\033[5;5~", 0, 0}, + { XK_Prior, ShiftMask, "\033[5;2~", 0, 0}, + { XK_Prior, XK_ANY_MOD, "\033[5~", 0, 0}, + { XK_Next, ControlMask, "\033[6;5~", 0, 0}, + { XK_Next, ShiftMask, "\033[6;2~", 0, 0}, + { XK_Next, XK_ANY_MOD, "\033[6~", 0, 0}, + { XK_F1, XK_NO_MOD, "\033OP" , 0, 0}, + { XK_F1, /* F13 */ ShiftMask, "\033[1;2P", 0, 0}, + { XK_F1, /* F25 */ ControlMask, "\033[1;5P", 0, 0}, + { XK_F1, /* F37 */ Mod4Mask, "\033[1;6P", 0, 0}, + { XK_F1, /* F49 */ Mod1Mask, "\033[1;3P", 0, 0}, + { XK_F1, /* F61 */ Mod3Mask, "\033[1;4P", 0, 0}, + { XK_F2, XK_NO_MOD, "\033OQ" , 0, 0}, + { XK_F2, /* F14 */ ShiftMask, "\033[1;2Q", 0, 0}, + { XK_F2, /* F26 */ ControlMask, "\033[1;5Q", 0, 0}, + { XK_F2, /* F38 */ Mod4Mask, "\033[1;6Q", 0, 0}, + { XK_F2, /* F50 */ Mod1Mask, "\033[1;3Q", 0, 0}, + { XK_F2, /* F62 */ Mod3Mask, "\033[1;4Q", 0, 0}, + { XK_F3, XK_NO_MOD, "\033OR" , 0, 0}, + { XK_F3, /* F15 */ ShiftMask, "\033[1;2R", 0, 0}, + { XK_F3, /* F27 */ ControlMask, "\033[1;5R", 0, 0}, + { XK_F3, /* F39 */ Mod4Mask, "\033[1;6R", 0, 0}, + { XK_F3, /* F51 */ Mod1Mask, "\033[1;3R", 0, 0}, + { XK_F3, /* F63 */ Mod3Mask, "\033[1;4R", 0, 0}, + { XK_F4, XK_NO_MOD, "\033OS" , 0, 0}, + { XK_F4, /* F16 */ ShiftMask, "\033[1;2S", 0, 0}, + { XK_F4, /* F28 */ ControlMask, "\033[1;5S", 0, 0}, + { XK_F4, /* F40 */ Mod4Mask, "\033[1;6S", 0, 0}, + { XK_F4, /* F52 */ Mod1Mask, "\033[1;3S", 0, 0}, + { XK_F5, XK_NO_MOD, "\033[15~", 0, 0}, + { XK_F5, /* F17 */ ShiftMask, "\033[15;2~", 0, 0}, + { XK_F5, /* F29 */ ControlMask, "\033[15;5~", 0, 0}, + { XK_F5, /* F41 */ Mod4Mask, "\033[15;6~", 0, 0}, + { XK_F5, /* F53 */ Mod1Mask, "\033[15;3~", 0, 0}, + { XK_F6, XK_NO_MOD, "\033[17~", 0, 0}, + { XK_F6, /* F18 */ ShiftMask, "\033[17;2~", 0, 0}, + { XK_F6, /* F30 */ ControlMask, "\033[17;5~", 0, 0}, + { XK_F6, /* F42 */ Mod4Mask, "\033[17;6~", 0, 0}, + { XK_F6, /* F54 */ Mod1Mask, "\033[17;3~", 0, 0}, + { XK_F7, XK_NO_MOD, "\033[18~", 0, 0}, + { XK_F7, /* F19 */ ShiftMask, "\033[18;2~", 0, 0}, + { XK_F7, /* F31 */ ControlMask, "\033[18;5~", 0, 0}, + { XK_F7, /* F43 */ Mod4Mask, "\033[18;6~", 0, 0}, + { XK_F7, /* F55 */ Mod1Mask, "\033[18;3~", 0, 0}, + { XK_F8, XK_NO_MOD, "\033[19~", 0, 0}, + { XK_F8, /* F20 */ ShiftMask, "\033[19;2~", 0, 0}, + { XK_F8, /* F32 */ ControlMask, "\033[19;5~", 0, 0}, + { XK_F8, /* F44 */ Mod4Mask, "\033[19;6~", 0, 0}, + { XK_F8, /* F56 */ Mod1Mask, "\033[19;3~", 0, 0}, + { XK_F9, XK_NO_MOD, "\033[20~", 0, 0}, + { XK_F9, /* F21 */ ShiftMask, "\033[20;2~", 0, 0}, + { XK_F9, /* F33 */ ControlMask, "\033[20;5~", 0, 0}, + { XK_F9, /* F45 */ Mod4Mask, "\033[20;6~", 0, 0}, + { XK_F9, /* F57 */ Mod1Mask, "\033[20;3~", 0, 0}, + { XK_F10, XK_NO_MOD, "\033[21~", 0, 0}, + { XK_F10, /* F22 */ ShiftMask, "\033[21;2~", 0, 0}, + { XK_F10, /* F34 */ ControlMask, "\033[21;5~", 0, 0}, + { XK_F10, /* F46 */ Mod4Mask, "\033[21;6~", 0, 0}, + { XK_F10, /* F58 */ Mod1Mask, "\033[21;3~", 0, 0}, + { XK_F11, XK_NO_MOD, "\033[23~", 0, 0}, + { XK_F11, /* F23 */ ShiftMask, "\033[23;2~", 0, 0}, + { XK_F11, /* F35 */ ControlMask, "\033[23;5~", 0, 0}, + { XK_F11, /* F47 */ Mod4Mask, "\033[23;6~", 0, 0}, + { XK_F11, /* F59 */ Mod1Mask, "\033[23;3~", 0, 0}, + { XK_F12, XK_NO_MOD, "\033[24~", 0, 0}, + { XK_F12, /* F24 */ ShiftMask, "\033[24;2~", 0, 0}, + { XK_F12, /* F36 */ ControlMask, "\033[24;5~", 0, 0}, + { XK_F12, /* F48 */ Mod4Mask, "\033[24;6~", 0, 0}, + { XK_F12, /* F60 */ Mod1Mask, "\033[24;3~", 0, 0}, + { XK_F13, XK_NO_MOD, "\033[1;2P", 0, 0}, + { XK_F14, XK_NO_MOD, "\033[1;2Q", 0, 0}, + { XK_F15, XK_NO_MOD, "\033[1;2R", 0, 0}, + { XK_F16, XK_NO_MOD, "\033[1;2S", 0, 0}, + { XK_F17, XK_NO_MOD, "\033[15;2~", 0, 0}, + { XK_F18, XK_NO_MOD, "\033[17;2~", 0, 0}, + { XK_F19, XK_NO_MOD, "\033[18;2~", 0, 0}, + { XK_F20, XK_NO_MOD, "\033[19;2~", 0, 0}, + { XK_F21, XK_NO_MOD, "\033[20;2~", 0, 0}, + { XK_F22, XK_NO_MOD, "\033[21;2~", 0, 0}, + { XK_F23, XK_NO_MOD, "\033[23;2~", 0, 0}, + { XK_F24, XK_NO_MOD, "\033[24;2~", 0, 0}, + { XK_F25, XK_NO_MOD, "\033[1;5P", 0, 0}, + { XK_F26, XK_NO_MOD, "\033[1;5Q", 0, 0}, + { XK_F27, XK_NO_MOD, "\033[1;5R", 0, 0}, + { XK_F28, XK_NO_MOD, "\033[1;5S", 0, 0}, + { XK_F29, XK_NO_MOD, "\033[15;5~", 0, 0}, + { XK_F30, XK_NO_MOD, "\033[17;5~", 0, 0}, + { XK_F31, XK_NO_MOD, "\033[18;5~", 0, 0}, + { XK_F32, XK_NO_MOD, "\033[19;5~", 0, 0}, + { XK_F33, XK_NO_MOD, "\033[20;5~", 0, 0}, + { XK_F34, XK_NO_MOD, "\033[21;5~", 0, 0}, + { XK_F35, XK_NO_MOD, "\033[23;5~", 0, 0}, +}; + +/* + * Selection types' masks. + * Use the same masks as usual. + * Button1Mask is always unset, to make masks match between ButtonPress. + * ButtonRelease and MotionNotify. + * If no match is found, regular selection is used. + */ +static uint selmasks[] = { + [SEL_RECTANGULAR] = Mod1Mask, +}; + +/* + * Printable characters in ASCII, used to estimate the advance width + * of single wide characters. + */ +static char ascii_printable[] = + " !\"#$%&'()*+,-./0123456789:;<=>?" + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" + "`abcdefghijklmnopqrstuvwxyz{|}~"; diff --git a/patches/st-keyboard_select-0.8.2.diff b/patches/st-keyboard_select-0.8.2.diff new file mode 100644 index 0000000..8059b4b --- /dev/null +++ b/patches/st-keyboard_select-0.8.2.diff @@ -0,0 +1,336 @@ +From 45cadc1ce5d8d9dd3493c2e9979e8958d87e8bc5 Mon Sep 17 00:00:00 2001 +From: Bartosz Sosna +Date: Sat, 4 May 2019 00:28:24 +0200 +Subject: [PATCH] Adjust patch to version st-0.8.2 + +--- + config.def.h | 1 + + st.c | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++ + st.h | 1 + + win.h | 3 + + x.c | 15 ++++ + 5 files changed, 242 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 482901e..c1e9cce 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -178,6 +178,7 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { TERMMOD, XK_Escape, keyboard_select,{ 0 } }, + }; + + /* +diff --git a/st.c b/st.c +index ede7ae6..c2116b2 100644 +--- a/st.c ++++ b/st.c +@@ -16,6 +16,8 @@ + #include + #include + #include ++#include ++#include + + #include "st.h" + #include "win.h" +@@ -2464,6 +2466,9 @@ tresize(int col, int row) + int *bp; + TCursor c; + ++ if ( row < term.row || col < term.col ) ++ toggle_winmode(trt_kbdselect(XK_Escape, NULL, 0)); ++ + if (col < 1 || row < 1) { + fprintf(stderr, + "tresize: error resizing to %dx%d\n", col, row); +@@ -2586,3 +2591,220 @@ redraw(void) + tfulldirt(); + draw(); + } ++ ++void set_notifmode(int type, KeySym ksym) { ++ static char *lib[] = { " MOVE ", " SEL "}; ++ static Glyph *g, *deb, *fin; ++ static int col, bot; ++ ++ if ( ksym == -1 ) { ++ free(g); ++ col = term.col, bot = term.bot; ++ g = xmalloc(col * sizeof(Glyph)); ++ memcpy(g, term.line[bot], col * sizeof(Glyph)); ++ ++ } ++ else if ( ksym == -2 ) ++ memcpy(term.line[bot], g, col * sizeof(Glyph)); ++ ++ if ( type < 2 ) { ++ char *z = lib[type]; ++ for (deb = &term.line[bot][col - 6], fin = &term.line[bot][col]; deb < fin; z++, deb++) ++ deb->mode = ATTR_REVERSE, ++ deb->u = *z, ++ deb->fg = defaultfg, deb->bg = defaultbg; ++ } ++ else if ( type < 5 ) ++ memcpy(term.line[bot], g, col * sizeof(Glyph)); ++ else { ++ for (deb = &term.line[bot][0], fin = &term.line[bot][col]; deb < fin; deb++) ++ deb->mode = ATTR_REVERSE, ++ deb->u = ' ', ++ deb->fg = defaultfg, deb->bg = defaultbg; ++ term.line[bot][0].u = ksym; ++ } ++ ++ term.dirty[bot] = 1; ++ drawregion(0, bot, col, bot + 1); ++} ++ ++void select_or_drawcursor(int selectsearch_mode, int type) { ++ int done = 0; ++ ++ if ( selectsearch_mode & 1 ) { ++ selextend(term.c.x, term.c.y, type, done); ++ xsetsel(getsel()); ++ } ++ else ++ xdrawcursor(term.c.x, term.c.y, term.line[term.c.y][term.c.x], ++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); ++} ++ ++void search(int selectsearch_mode, Rune *target, int ptarget, int incr, int type, TCursor *cu) { ++ Rune *r; ++ int i, bound = (term.col * cu->y + cu->x) * (incr > 0) + incr; ++ ++ for (i = term.col * term.c.y + term.c.x + incr; i != bound; i += incr) { ++ for (r = target; r - target < ptarget; r++) { ++ if ( *r == term.line[(i + r - target) / term.col][(i + r - target) % term.col].u ) { ++ if ( r - target == ptarget - 1 ) break; ++ } else { ++ r = NULL; ++ break; ++ } ++ } ++ if ( r != NULL ) break; ++ } ++ ++ if ( i != bound ) { ++ term.c.y = i / term.col, term.c.x = i % term.col; ++ select_or_drawcursor(selectsearch_mode, type); ++ } ++} ++ ++int trt_kbdselect(KeySym ksym, char *buf, int len) { ++ static TCursor cu; ++ static Rune target[64]; ++ static int type = 1, ptarget, in_use; ++ static int sens, quant; ++ static char selectsearch_mode; ++ int i, bound, *xy; ++ ++ ++ if ( selectsearch_mode & 2 ) { ++ if ( ksym == XK_Return ) { ++ selectsearch_mode ^= 2; ++ set_notifmode(selectsearch_mode, -2); ++ if ( ksym == XK_Escape ) ptarget = 0; ++ return 0; ++ } ++ else if ( ksym == XK_BackSpace ) { ++ if ( !ptarget ) return 0; ++ term.line[term.bot][ptarget--].u = ' '; ++ } ++ else if ( len < 1 ) { ++ return 0; ++ } ++ else if ( ptarget == term.col || ksym == XK_Escape ) { ++ return 0; ++ } ++ else { ++ utf8decode(buf, &target[ptarget++], len); ++ term.line[term.bot][ptarget].u = target[ptarget - 1]; ++ } ++ ++ if ( ksym != XK_BackSpace ) ++ search(selectsearch_mode, &target[0], ptarget, sens, type, &cu); ++ ++ term.dirty[term.bot] = 1; ++ drawregion(0, term.bot, term.col, term.bot + 1); ++ return 0; ++ } ++ ++ switch ( ksym ) { ++ case -1 : ++ in_use = 1; ++ cu.x = term.c.x, cu.y = term.c.y; ++ set_notifmode(0, ksym); ++ return MODE_KBDSELECT; ++ case XK_s : ++ if ( selectsearch_mode & 1 ) ++ selclear(); ++ else ++ selstart(term.c.x, term.c.y, 0); ++ set_notifmode(selectsearch_mode ^= 1, ksym); ++ break; ++ case XK_t : ++ selextend(term.c.x, term.c.y, type ^= 3, i = 0); /* 2 fois */ ++ selextend(term.c.x, term.c.y, type, i = 0); ++ break; ++ case XK_slash : ++ case XK_KP_Divide : ++ case XK_question : ++ ksym &= XK_question; /* Divide to slash */ ++ sens = (ksym == XK_slash) ? -1 : 1; ++ ptarget = 0; ++ set_notifmode(15, ksym); ++ selectsearch_mode ^= 2; ++ break; ++ case XK_Escape : ++ if ( !in_use ) break; ++ selclear(); ++ case XK_Return : ++ set_notifmode(4, ksym); ++ term.c.x = cu.x, term.c.y = cu.y; ++ select_or_drawcursor(selectsearch_mode = 0, type); ++ in_use = quant = 0; ++ return MODE_KBDSELECT; ++ case XK_n : ++ case XK_N : ++ if ( ptarget ) ++ search(selectsearch_mode, &target[0], ptarget, (ksym == XK_n) ? -1 : 1, type, &cu); ++ break; ++ case XK_BackSpace : ++ term.c.x = 0; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_dollar : ++ term.c.x = term.col - 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_Home : ++ term.c.x = 0, term.c.y = 0; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_End : ++ term.c.x = cu.x, term.c.y = cu.y; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_Page_Up : ++ case XK_Page_Down : ++ term.c.y = (ksym == XK_Prior ) ? 0 : cu.y; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_exclam : ++ term.c.x = term.col >> 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_asterisk : ++ case XK_KP_Multiply : ++ term.c.x = term.col >> 1; ++ case XK_underscore : ++ term.c.y = cu.y >> 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ default : ++ if ( ksym >= XK_0 && ksym <= XK_9 ) { /* 0-9 keyboard */ ++ quant = (quant * 10) + (ksym ^ XK_0); ++ return 0; ++ } ++ else if ( ksym >= XK_KP_0 && ksym <= XK_KP_9 ) { /* 0-9 numpad */ ++ quant = (quant * 10) + (ksym ^ XK_KP_0); ++ return 0; ++ } ++ else if ( ksym == XK_k || ksym == XK_h ) ++ i = ksym & 1; ++ else if ( ksym == XK_l || ksym == XK_j ) ++ i = ((ksym & 6) | 4) >> 1; ++ else if ( (XK_Home & ksym) != XK_Home || (i = (ksym ^ XK_Home) - 1) > 3 ) ++ break; ++ ++ xy = (i & 1) ? &term.c.y : &term.c.x; ++ sens = (i & 2) ? 1 : -1; ++ bound = (i >> 1 ^ 1) ? 0 : (i ^ 3) ? term.col - 1 : term.bot; ++ ++ if ( quant == 0 ) ++ quant++; ++ ++ if ( *xy == bound && ((sens < 0 && bound == 0) || (sens > 0 && bound > 0)) ) ++ break; ++ ++ *xy += quant * sens; ++ if ( *xy < 0 || ( bound > 0 && *xy > bound) ) ++ *xy = bound; ++ ++ select_or_drawcursor(selectsearch_mode, type); ++ } ++ quant = 0; ++ return 0; ++} +diff --git a/st.h b/st.h +index 4da3051..22125e4 100644 +--- a/st.h ++++ b/st.h +@@ -109,6 +109,7 @@ size_t utf8encode(Rune, char *); + void *xmalloc(size_t); + void *xrealloc(void *, size_t); + char *xstrdup(char *); ++int trt_kbdselect(KeySym, char *, int); + + /* config.h globals */ + extern char *utmp; +diff --git a/win.h b/win.h +index a6ef1b9..a240783 100644 +--- a/win.h ++++ b/win.h +@@ -21,6 +21,7 @@ enum win_mode { + MODE_NUMLOCK = 1 << 17, + MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ + |MODE_MOUSEMANY, ++ MODE_KBDSELECT = 1 << 18, + }; + + void xbell(void); +@@ -36,4 +37,6 @@ void xsetmode(int, unsigned int); + void xsetpointermotion(int); + void xsetsel(char *); + int xstartdraw(void); ++void toggle_winmode(int); ++void keyboard_select(const Arg *); + void xximspot(int, int); +diff --git a/x.c b/x.c +index 5828a3b..5221641 100644 +--- a/x.c ++++ b/x.c +@@ -1731,6 +1731,13 @@ kpress(XEvent *ev) + return; + + len = XmbLookupString(xw.xic, e, buf, sizeof buf, &ksym, &status); ++ if ( IS_SET(MODE_KBDSELECT) ) { ++ if ( match(XK_NO_MOD, e->state) || ++ (XK_Shift_L | XK_Shift_R) & e->state ) ++ win.mode ^= trt_kbdselect(ksym, buf, len); ++ return; ++ } ++ + /* 1. shortcuts */ + for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { + if (ksym == bp->keysym && match(bp->mod, e->state)) { +@@ -1914,6 +1921,14 @@ usage(void) + " [stty_args ...]\n", argv0, argv0); + } + ++void toggle_winmode(int flag) { ++ win.mode ^= flag; ++} ++ ++void keyboard_select(const Arg *dummy) { ++ win.mode ^= trt_kbdselect(-1, NULL, 0); ++} ++ + int + main(int argc, char *argv[]) + { +-- +2.17.1 + diff --git a/patches/st-keyboard_select-20200617-9ba7ecf.diff b/patches/st-keyboard_select-20200617-9ba7ecf.diff new file mode 100644 index 0000000..fac41ea --- /dev/null +++ b/patches/st-keyboard_select-20200617-9ba7ecf.diff @@ -0,0 +1,319 @@ +diff --git a/config.def.h b/config.def.h +index 6f05dce..54612d1 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -199,6 +199,7 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { TERMMOD, XK_Escape, keyboard_select,{.i = 0} }, + }; + + /* +diff --git a/st.c b/st.c +index ef8abd5..0c6c6ca 100644 +--- a/st.c ++++ b/st.c +@@ -16,6 +16,8 @@ + #include + #include + #include ++#include ++#include + + #include "st.h" + #include "win.h" +@@ -2487,6 +2489,9 @@ tresize(int col, int row) + int *bp; + TCursor c; + ++ if ( row < term.row || col < term.col ) ++ toggle_winmode(trt_kbdselect(XK_Escape, NULL, 0)); ++ + if (col < 1 || row < 1) { + fprintf(stderr, + "tresize: error resizing to %dx%d\n", col, row); +@@ -2612,3 +2617,220 @@ redraw(void) + tfulldirt(); + draw(); + } ++ ++void set_notifmode(int type, KeySym ksym) { ++ static char *lib[] = { " MOVE ", " SEL "}; ++ static Glyph *g, *deb, *fin; ++ static int col, bot; ++ ++ if ( ksym == -1 ) { ++ free(g); ++ col = term.col, bot = term.bot; ++ g = xmalloc(col * sizeof(Glyph)); ++ memcpy(g, term.line[bot], col * sizeof(Glyph)); ++ ++ } ++ else if ( ksym == -2 ) ++ memcpy(term.line[bot], g, col * sizeof(Glyph)); ++ ++ if ( type < 2 ) { ++ char *z = lib[type]; ++ for (deb = &term.line[bot][col - 6], fin = &term.line[bot][col]; deb < fin; z++, deb++) ++ deb->mode = ATTR_REVERSE, ++ deb->u = *z, ++ deb->fg = defaultfg, deb->bg = defaultbg; ++ } ++ else if ( type < 5 ) ++ memcpy(term.line[bot], g, col * sizeof(Glyph)); ++ else { ++ for (deb = &term.line[bot][0], fin = &term.line[bot][col]; deb < fin; deb++) ++ deb->mode = ATTR_REVERSE, ++ deb->u = ' ', ++ deb->fg = defaultfg, deb->bg = defaultbg; ++ term.line[bot][0].u = ksym; ++ } ++ ++ term.dirty[bot] = 1; ++ drawregion(0, bot, col, bot + 1); ++} ++ ++void select_or_drawcursor(int selectsearch_mode, int type) { ++ int done = 0; ++ ++ if ( selectsearch_mode & 1 ) { ++ selextend(term.c.x, term.c.y, type, done); ++ xsetsel(getsel()); ++ } ++ else ++ xdrawcursor(term.c.x, term.c.y, term.line[term.c.y][term.c.x], ++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); ++} ++ ++void search(int selectsearch_mode, Rune *target, int ptarget, int incr, int type, TCursor *cu) { ++ Rune *r; ++ int i, bound = (term.col * cu->y + cu->x) * (incr > 0) + incr; ++ ++ for (i = term.col * term.c.y + term.c.x + incr; i != bound; i += incr) { ++ for (r = target; r - target < ptarget; r++) { ++ if ( *r == term.line[(i + r - target) / term.col][(i + r - target) % term.col].u ) { ++ if ( r - target == ptarget - 1 ) break; ++ } else { ++ r = NULL; ++ break; ++ } ++ } ++ if ( r != NULL ) break; ++ } ++ ++ if ( i != bound ) { ++ term.c.y = i / term.col, term.c.x = i % term.col; ++ select_or_drawcursor(selectsearch_mode, type); ++ } ++} ++ ++int trt_kbdselect(KeySym ksym, char *buf, int len) { ++ static TCursor cu; ++ static Rune target[64]; ++ static int type = 1, ptarget, in_use; ++ static int sens, quant; ++ static char selectsearch_mode; ++ int i, bound, *xy; ++ ++ ++ if ( selectsearch_mode & 2 ) { ++ if ( ksym == XK_Return ) { ++ selectsearch_mode ^= 2; ++ set_notifmode(selectsearch_mode, -2); ++ if ( ksym == XK_Escape ) ptarget = 0; ++ return 0; ++ } ++ else if ( ksym == XK_BackSpace ) { ++ if ( !ptarget ) return 0; ++ term.line[term.bot][ptarget--].u = ' '; ++ } ++ else if ( len < 1 ) { ++ return 0; ++ } ++ else if ( ptarget == term.col || ksym == XK_Escape ) { ++ return 0; ++ } ++ else { ++ utf8decode(buf, &target[ptarget++], len); ++ term.line[term.bot][ptarget].u = target[ptarget - 1]; ++ } ++ ++ if ( ksym != XK_BackSpace ) ++ search(selectsearch_mode, &target[0], ptarget, sens, type, &cu); ++ ++ term.dirty[term.bot] = 1; ++ drawregion(0, term.bot, term.col, term.bot + 1); ++ return 0; ++ } ++ ++ switch ( ksym ) { ++ case -1 : ++ in_use = 1; ++ cu.x = term.c.x, cu.y = term.c.y; ++ set_notifmode(0, ksym); ++ return MODE_KBDSELECT; ++ case XK_s : ++ if ( selectsearch_mode & 1 ) ++ selclear(); ++ else ++ selstart(term.c.x, term.c.y, 0); ++ set_notifmode(selectsearch_mode ^= 1, ksym); ++ break; ++ case XK_t : ++ selextend(term.c.x, term.c.y, type ^= 3, i = 0); /* 2 fois */ ++ selextend(term.c.x, term.c.y, type, i = 0); ++ break; ++ case XK_slash : ++ case XK_KP_Divide : ++ case XK_question : ++ ksym &= XK_question; /* Divide to slash */ ++ sens = (ksym == XK_slash) ? -1 : 1; ++ ptarget = 0; ++ set_notifmode(15, ksym); ++ selectsearch_mode ^= 2; ++ break; ++ case XK_Escape : ++ if ( !in_use ) break; ++ selclear(); ++ case XK_Return : ++ set_notifmode(4, ksym); ++ term.c.x = cu.x, term.c.y = cu.y; ++ select_or_drawcursor(selectsearch_mode = 0, type); ++ in_use = quant = 0; ++ return MODE_KBDSELECT; ++ case XK_n : ++ case XK_N : ++ if ( ptarget ) ++ search(selectsearch_mode, &target[0], ptarget, (ksym == XK_n) ? -1 : 1, type, &cu); ++ break; ++ case XK_BackSpace : ++ term.c.x = 0; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_dollar : ++ term.c.x = term.col - 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_Home : ++ term.c.x = 0, term.c.y = 0; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_End : ++ term.c.x = cu.x, term.c.y = cu.y; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_Page_Up : ++ case XK_Page_Down : ++ term.c.y = (ksym == XK_Prior ) ? 0 : cu.y; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_exclam : ++ term.c.x = term.col >> 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ case XK_asterisk : ++ case XK_KP_Multiply : ++ term.c.x = term.col >> 1; ++ case XK_underscore : ++ term.c.y = cu.y >> 1; ++ select_or_drawcursor(selectsearch_mode, type); ++ break; ++ default : ++ if ( ksym >= XK_0 && ksym <= XK_9 ) { /* 0-9 keyboard */ ++ quant = (quant * 10) + (ksym ^ XK_0); ++ return 0; ++ } ++ else if ( ksym >= XK_KP_0 && ksym <= XK_KP_9 ) { /* 0-9 numpad */ ++ quant = (quant * 10) + (ksym ^ XK_KP_0); ++ return 0; ++ } ++ else if ( ksym == XK_k || ksym == XK_h ) ++ i = ksym & 1; ++ else if ( ksym == XK_l || ksym == XK_j ) ++ i = ((ksym & 6) | 4) >> 1; ++ else if ( (XK_Home & ksym) != XK_Home || (i = (ksym ^ XK_Home) - 1) > 3 ) ++ break; ++ ++ xy = (i & 1) ? &term.c.y : &term.c.x; ++ sens = (i & 2) ? 1 : -1; ++ bound = (i >> 1 ^ 1) ? 0 : (i ^ 3) ? term.col - 1 : term.bot; ++ ++ if ( quant == 0 ) ++ quant++; ++ ++ if ( *xy == bound && ((sens < 0 && bound == 0) || (sens > 0 && bound > 0)) ) ++ break; ++ ++ *xy += quant * sens; ++ if ( *xy < 0 || ( bound > 0 && *xy > bound) ) ++ *xy = bound; ++ ++ select_or_drawcursor(selectsearch_mode, type); ++ } ++ quant = 0; ++ return 0; ++} +diff --git a/st.h b/st.h +index 3d351b6..2d1a11b 100644 +--- a/st.h ++++ b/st.h +@@ -110,6 +110,7 @@ size_t utf8encode(Rune, char *); + void *xmalloc(size_t); + void *xrealloc(void *, size_t); + char *xstrdup(char *); ++int trt_kbdselect(KeySym, char *, int); + + /* config.h globals */ + extern char *utmp; +diff --git a/win.h b/win.h +index a6ef1b9..9a47fbb 100644 +--- a/win.h ++++ b/win.h +@@ -21,6 +21,7 @@ enum win_mode { + MODE_NUMLOCK = 1 << 17, + MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\ + |MODE_MOUSEMANY, ++ MODE_KBDSELECT = 1 << 18, + }; + + void xbell(void); +@@ -36,4 +37,6 @@ void xsetmode(int, unsigned int); + void xsetpointermotion(int); + void xsetsel(char *); + int xstartdraw(void); ++void toggle_winmode(int); ++void keyboard_select(const Arg *); + void xximspot(int, int); +diff --git a/x.c b/x.c +index 210f184..b77ce54 100644 +--- a/x.c ++++ b/x.c +@@ -1800,6 +1800,12 @@ kpress(XEvent *ev) + len = XmbLookupString(xw.ime.xic, e, buf, sizeof buf, &ksym, &status); + else + len = XLookupString(e, buf, sizeof buf, &ksym, NULL); ++ if ( IS_SET(MODE_KBDSELECT) ) { ++ if ( match(XK_NO_MOD, e->state) || ++ (XK_Shift_L | XK_Shift_R) & e->state ) ++ win.mode ^= trt_kbdselect(ksym, buf, len); ++ return; ++ } + /* 1. shortcuts */ + for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { + if (ksym == bp->keysym && match(bp->mod, e->state)) { +@@ -1977,6 +1983,14 @@ usage(void) + " [stty_args ...]\n", argv0, argv0); + } + ++void toggle_winmode(int flag) { ++ win.mode ^= flag; ++} ++ ++void keyboard_select(const Arg *dummy) { ++ win.mode ^= trt_kbdselect(-1, NULL, 0); ++} ++ + int + main(int argc, char *argv[]) + { diff --git a/st b/st new file mode 100755 index 0000000000000000000000000000000000000000..7d1fc907aee8d3872957071a317661611847deb6 GIT binary patch literal 110368 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 z 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%0DqAI zzS;mEG{CO`-Wr`C4&P_M|AYa4hXK9?MqGI z&Ot^nM(8(dv-e5-2@+`C8UH@dn-sne;bSeDdOwTVwSES64l%&fcX`PE{C`Ld;=E!6 zvkdr)n7{9hl79n7JkNl?(g1&@0sa;P{67TVtf_TFHBQ^e_)M;MKXZT4Y@p|3=5O&y z!+&D_umS(S4e)esdS~S!*#JLS;LVy^w;RlUOE=)R8Q?E8z`KE`dfH3Z4)_GWS(~IQ zS63M52^!$n8sP6Uz&{7PmD3mv_6UBn=B<#}Q<=D*@l7{N1Q$o`3xSW;Aj7{J;1fl= zcP#(e!1op>JIV~_YO0;f?PLY}N1Oo)ahrjj3xuA&TC&d16$bou2KZ$L_?r#zcNyRx z0lqiJ$mKc6!Ee_7dW9sa`DrWgi6~e4@xW2$Ph|cZSZ5Fm5!9aa zx>F*=x$y|bqC=$e8P@e9y#*fYGi<-g7c20c)vt7cH*4zogIe#JXuv-g_|w?7Xi#Io zztjLv-v{f=o;wBJtd)N*wWo332J!T`UC^}N92E7kwLYQXm?iw*GQ2KdW>C;Qd=Uu?d1wE_Qa0&mt{ z`b=_O!~*vi@ITD_L(3&&HS<5q_#uCl2=QG31e*=?ylH^{$N>Kh>wli>5jTt4Pry^X zuGiJ;-wgCv@O**l-7YSN=(fb~6oKcPC@|6hpJ#x-zyLqV(s?;?81UB`;I9^VvvxDv zevOFu?CLz<+9hZxwj6_5j;CfbIFtfWJ!uwV!yN zqN{g_z;{-^1{mPaG{BEFz@KM;r}yDIi`QX*Uu=NC+5mr}0sdhF{APhSYwCG1x^?k; z!+`%2=I_t`pUV9IGT`rlfnsOr?Q4J^W`NH$z~>p@iwy8326&$VeuV-4Rs;O~26*~* zLT7&120YcHgSvkCH3R;Gz*Bjyzl{gZ?ElXU_`ef)v$m1P+oPEOXU4zA3$Y3xW6+-T z5qPuq$;VQ`2G(;L<3oo!;)faN$uhvtHo!Z8r*>G?UsXP94fulw_*)I|e>cECWq{vd zfd9Y%|Fr==MvT+giBTZQ0DqPN{#@W`e5m}RROK1)hvC4^%3+ZKzuf@;p+UNq2!6BH zQ&+AAqPS8%R_OZEtC`=+^YIfn0oO8qmRlkk8Gj4oyK{Mdi1D{GUhP{!@fN>(1)guB zz((f3^KOY;$+TAt`1c#&zcs)gF~G;-!B%JfHyhwj5_q%r2Di83?0eYSpYXBh^a`UA zh2Uw-U$kH1#rF*mOf}Fy*#Lhb>p7j*J$P8Al{0=Y=gZj~eYJree9$@7p#}V98BUkO z>vWYa!bit(TV?kxB&hB)YVl!cC%$Ygh;EPMsVBgan!nQR!FQ=W8osVwrTOuNY^S@% zuldUYm6bB&tFu@8@G)%Ssq)sk{9Xy|2slzloFjxB74{mf);}UGtt2gV#Atzokhii@ z^W*#3etW5g4`lm1_G*G2Z%q{}yUeBeaXf+iF1o+E24Agq)o5;SnNusZ`&?s2BXuR^ zF26%__}tDwRW(7E&*5`jsyXpF>l#-%zNQTwAW<@8NJPX@J1SlF8pS5<2~=x-kE>4d zOO(@F2Q5f?6@01rYg`CQU9c4de+^;`xI7LQ91p56z~?S^R8%^(YPVB-Ut4ojIbk@Z z)k)JtYC3D|Lic zkAmh2R8@K%3$;3wAXhEo!`~WjomTJ0=@Lk)cac_Kr`5WB?oxN9+rLN)c&d=mRd&Cl zLaXvZk=@~^oT~Cwcx(KQfZwOplWPM$d$~)iuk_lTvJljZ48u31wfZXiLRWd^qUwq= ze0tqi?Q;0EvKo**1n6=gih3#rI<9t{=Blsu!heX%A3)+g4jAgLYO~p0<@Wge;``~y z6=4QNrrCWCx4T4?M|&yqu#Mt_#V)5Xhzc*tu02rcZ@Y(XFFsYT)zkOaeVVu0U*fS> zxkSKGiBGSijJSLv&7u;}SKzhk8gI2nd=Or`s>W3fA8FotIN!SnSy77WgJM911et`w z=Blir;^^~hWnM?XC&kE}rB%=aH<#8R|50X$6<>Tu+8p>yy$qFBqgeU0g$!KqNWeoG zAX1KM?xU2|1U%B}DyM*MuK=Rb$bwy?UFP*x*-P79A`p;A-64`jN?lHrF!F=n?S~^# zXrx<2WQ2EBmAaf-NeTA&mE_qfDVQ-SyP#yoma7QsP_W zt1Us*_1G)3rWE8)$|)I{Ix;m~a|WtMc0jP&$tVvwff^r0G#PCmS_gm0!cr$ZiyGEe z0?N_$xt+-RDpwU8&_Po@idc=G3aY4=^?s3w9#Oo?I&eY~?OX>`ahYG3P)X$&t*Ecs z?r`~{QWikV=b#o|S_EhMP*6%x*HPL?s)IVW*WvG&aC<3ATL&H_!BJ7u0R=^lh13%J z-Bs-h(ey`oxDvToUghN{GA4#49?EweA|fJfo-yQ(^%L@smhDHku=Ird7l z4%$N3qEfHD##tgu2I)j!)xkRQkO$=$zL_3CO++Ejm2KJ_w=ZC?ROP$0Ttmz3u6B5< z7iq;ay8jw<=#-ME$gI`RLkUaOvlVW^kzx^43tWz?9-fW{f$rfYwk2I0~lFol-G6kN+?`kVs0Y8Q==qJ&6b&wFw z=+qT(0h-xzj8#fXFn+VkN+k=aXrSx7HBKk|RfX|H4cm?G8710VjdYdybJ5;Rq3)CF zLlL@9G!R^7q0>RVeo1Lbbjcn?_cz-RE1vGE_e&?2l%Rx^z~%<_97jYQHYb{1F*P?2VNDb(iig)r|J`#W$TJ6tt2-j3~@D*Z)rxJ#XRwSQ5Y zqEVwMJAB>}9@{~O-`g>sdW-=uYD0Rb*{ivhlARcP(AZKA$+(q5dQ`_G8l-79F>Ig# zWLuQfH~Gv&Zsrp8}&hGA{ zK|uNSyQbt&?R9x-JLpi}5wX(%Ph_O*9P6p|^;L*oj)z4Uu(fp$Xm9f|xGzTwBU|Vq z8sn6dAPYQRDus4xgF41Gxia9Z(CSNFm_xvP^w1sXB_*XkAJ+@f?oH!%Px(i5*IWeQ z>KwFR?FOM2n&ibmwzz1K$03SVk?JL8)On~OlvRiY+lsnqGdxaNIz_Zx=rOeLqvbAf zR4gnhv%A|%1%}q}eN{)}WsZr~4RO^u>fBC$MTg{(Z>zmxM#Q5!vPd@0MS)TuI=ujT zefFk{ySzGwPoK?geMDPXqeeP^no1!mp9h2R;zB#hn8;eKc#d6mDAO@+ayhAfbu4wl z(^N$C%{y!?t}Js3U7|0+tW5O{RizyU1ZcOaR0BXYGmi#Fe&1|V7W8}6#!!i=@nrik zmc(p;N;^uNC;>i|!BJ!S6lDEAjj@3pl%#iCLcVF)ejvKTWKx?z4b2J1B)hYOP($L435 zmBb(;1XmbkQ^tc2u{womdl)9e0Vhri8>CJgP?1psRY+ z>~`?LWJf-Y3uFf%9XnaHd|b{7QCw(@Nrq}AVhkb1S}F>eNwPK0MqBE}lqz}<&GQ8m z6tN0G%O2F^lEHF5Dl5knm$%C0uUUk3AK#)XTGB{Gag?w^g+z_5)>1K6b)}Yj0;$z% zgxQWN4Y(_v!?A84QQ4F7hx_g2nqaT6qtQ!sF7hA>31Nt!U?}UOL2UF*322z?*-3yy z)s=oNRrny)k7}i*ig9sjjaOuPs;i=;tOkRb613G?+ntoatf2-2HzA?IBt=m`fiTBj z<#xaX^lEzYENd;%94H-H)z7_A;MaQr9M3#f8O{j5=83LeEpWlzbgebEZ0 zamG;np`VIZm7^F$9v%OqGo=3%Op#)3f0ev~U3K#69D4;<>M~5pDQMBjtNmIETGd7c zw!qqEi3}t`o^+}7tLJ$N?oH_^VC{IT_2c-{ba*ANE55>4#QMJm)CLA18j<#)f #include #include +#include +#include #include "st.h" #include "win.h" @@ -2543,6 +2545,9 @@ tresize(int col, int row) int *bp; TCursor c; + if ( row < term.row || col < term.col ) + toggle_winmode(trt_kbdselect(XK_Escape, NULL, 0)); + if (col < 1 || row < 1) { fprintf(stderr, "tresize: error resizing to %dx%d\n", col, row); @@ -2668,3 +2673,220 @@ redraw(void) tfulldirt(); draw(); } + +void set_notifmode(int type, KeySym ksym) { + static char *lib[] = { " MOVE ", " SEL "}; + static Glyph *g, *deb, *fin; + static int col, bot; + + if ( ksym == -1 ) { + free(g); + col = term.col, bot = term.bot; + g = xmalloc(col * sizeof(Glyph)); + memcpy(g, term.line[bot], col * sizeof(Glyph)); + + } + else if ( ksym == -2 ) + memcpy(term.line[bot], g, col * sizeof(Glyph)); + + if ( type < 2 ) { + char *z = lib[type]; + for (deb = &term.line[bot][col - 6], fin = &term.line[bot][col]; deb < fin; z++, deb++) + deb->mode = ATTR_REVERSE, + deb->u = *z, + deb->fg = defaultfg, deb->bg = defaultbg; + } + else if ( type < 5 ) + memcpy(term.line[bot], g, col * sizeof(Glyph)); + else { + for (deb = &term.line[bot][0], fin = &term.line[bot][col]; deb < fin; deb++) + deb->mode = ATTR_REVERSE, + deb->u = ' ', + deb->fg = defaultfg, deb->bg = defaultbg; + term.line[bot][0].u = ksym; + } + + term.dirty[bot] = 1; + drawregion(0, bot, col, bot + 1); +} + +void select_or_drawcursor(int selectsearch_mode, int type) { + int done = 0; + + if ( selectsearch_mode & 1 ) { + selextend(term.c.x, term.c.y, type, done); + xsetsel(getsel()); + } + else + xdrawcursor(term.c.x, term.c.y, term.line[term.c.y][term.c.x], + term.ocx, term.ocy, term.line[term.ocy][term.ocx]); +} + +void search(int selectsearch_mode, Rune *target, int ptarget, int incr, int type, TCursor *cu) { + Rune *r; + int i, bound = (term.col * cu->y + cu->x) * (incr > 0) + incr; + + for (i = term.col * term.c.y + term.c.x + incr; i != bound; i += incr) { + for (r = target; r - target < ptarget; r++) { + if ( *r == term.line[(i + r - target) / term.col][(i + r - target) % term.col].u ) { + if ( r - target == ptarget - 1 ) break; + } else { + r = NULL; + break; + } + } + if ( r != NULL ) break; + } + + if ( i != bound ) { + term.c.y = i / term.col, term.c.x = i % term.col; + select_or_drawcursor(selectsearch_mode, type); + } +} + +int trt_kbdselect(KeySym ksym, char *buf, int len) { + static TCursor cu; + static Rune target[64]; + static int type = 1, ptarget, in_use; + static int sens, quant; + static char selectsearch_mode; + int i, bound, *xy; + + + if ( selectsearch_mode & 2 ) { + if ( ksym == XK_Return ) { + selectsearch_mode ^= 2; + set_notifmode(selectsearch_mode, -2); + if ( ksym == XK_Escape ) ptarget = 0; + return 0; + } + else if ( ksym == XK_BackSpace ) { + if ( !ptarget ) return 0; + term.line[term.bot][ptarget--].u = ' '; + } + else if ( len < 1 ) { + return 0; + } + else if ( ptarget == term.col || ksym == XK_Escape ) { + return 0; + } + else { + utf8decode(buf, &target[ptarget++], len); + term.line[term.bot][ptarget].u = target[ptarget - 1]; + } + + if ( ksym != XK_BackSpace ) + search(selectsearch_mode, &target[0], ptarget, sens, type, &cu); + + term.dirty[term.bot] = 1; + drawregion(0, term.bot, term.col, term.bot + 1); + return 0; + } + + switch ( ksym ) { + case -1 : + in_use = 1; + cu.x = term.c.x, cu.y = term.c.y; + set_notifmode(0, ksym); + return MODE_KBDSELECT; + case XK_s : + if ( selectsearch_mode & 1 ) + selclear(); + else + selstart(term.c.x, term.c.y, 0); + set_notifmode(selectsearch_mode ^= 1, ksym); + break; + case XK_t : + selextend(term.c.x, term.c.y, type ^= 3, i = 0); /* 2 fois */ + selextend(term.c.x, term.c.y, type, i = 0); + break; + case XK_slash : + case XK_KP_Divide : + case XK_question : + ksym &= XK_question; /* Divide to slash */ + sens = (ksym == XK_slash) ? -1 : 1; + ptarget = 0; + set_notifmode(15, ksym); + selectsearch_mode ^= 2; + break; + case XK_Escape : + if ( !in_use ) break; + selclear(); + case XK_Return : + set_notifmode(4, ksym); + term.c.x = cu.x, term.c.y = cu.y; + select_or_drawcursor(selectsearch_mode = 0, type); + in_use = quant = 0; + return MODE_KBDSELECT; + case XK_n : + case XK_N : + if ( ptarget ) + search(selectsearch_mode, &target[0], ptarget, (ksym == XK_n) ? -1 : 1, type, &cu); + break; + case XK_BackSpace : + term.c.x = 0; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_dollar : + term.c.x = term.col - 1; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_Home : + term.c.x = 0, term.c.y = 0; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_End : + term.c.x = cu.x, term.c.y = cu.y; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_Page_Up : + case XK_Page_Down : + term.c.y = (ksym == XK_Prior ) ? 0 : cu.y; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_exclam : + term.c.x = term.col >> 1; + select_or_drawcursor(selectsearch_mode, type); + break; + case XK_asterisk : + case XK_KP_Multiply : + term.c.x = term.col >> 1; + case XK_underscore : + term.c.y = cu.y >> 1; + select_or_drawcursor(selectsearch_mode, type); + break; + default : + if ( ksym >= XK_0 && ksym <= XK_9 ) { /* 0-9 keyboard */ + quant = (quant * 10) + (ksym ^ XK_0); + return 0; + } + else if ( ksym >= XK_KP_0 && ksym <= XK_KP_9 ) { /* 0-9 numpad */ + quant = (quant * 10) + (ksym ^ XK_KP_0); + return 0; + } + else if ( ksym == XK_k || ksym == XK_h ) + i = ksym & 1; + else if ( ksym == XK_l || ksym == XK_j ) + i = ((ksym & 6) | 4) >> 1; + else if ( (XK_Home & ksym) != XK_Home || (i = (ksym ^ XK_Home) - 1) > 3 ) + break; + + xy = (i & 1) ? &term.c.y : &term.c.x; + sens = (i & 2) ? 1 : -1; + bound = (i >> 1 ^ 1) ? 0 : (i ^ 3) ? term.col - 1 : term.bot; + + if ( quant == 0 ) + quant++; + + if ( *xy == bound && ((sens < 0 && bound == 0) || (sens > 0 && bound > 0)) ) + break; + + *xy += quant * sens; + if ( *xy < 0 || ( bound > 0 && *xy > bound) ) + *xy = bound; + + select_or_drawcursor(selectsearch_mode, type); + } + quant = 0; + return 0; +} diff --git a/st.h b/st.h index fd3b0d8..046cb51 100644 --- a/st.h +++ b/st.h @@ -110,6 +110,7 @@ size_t utf8encode(Rune, char *); void *xmalloc(size_t); void *xrealloc(void *, size_t); char *xstrdup(const char *); +int trt_kbdselect(KeySym, char *, int); /* config.h globals */ extern char *utmp; diff --git a/st.o b/st.o new file mode 100644 index 0000000000000000000000000000000000000000..1162a7ec5dd2a39304840ce6b631e2ab1c624af6 GIT binary patch literal 88152 zcmeF4d3+RA_UNmV1_FjuR74aQTTPS*BFG{wC~0Vu7eB;1OfyR9Y9A>R5q7xS{6|jLFjkRz4s(1mz4hA`@GNRy+5oEov!-U zsdLXg_uRFrn#v)8%Tin}gEp6OsnK{u)G!_$)kt#%&NWUpPBMJ2UBD_P$*O?1f99*AkE=-+gQ6yo1{J!hZVs#wNqKB-zR^Cg;?*I+`?$#rS7Y3JA|SjC@jO_y%M?Qfn@(g@jV; zYEF$DuAIDi5gK0S`>XF7-_^d+SC6tHKlZciP*z%={b{~c|<6ml-0ppIxzOrv1HP& z3)B>6b;yejNkT4DCs*V}j=Cll=0$#UO&YrdEeS-YWqFqGXz4ST4(J}RkHr?lWv%P1 z2w)>T+={Gn4fB2nDdm}$t+KqU%0KbF50@DM?=JJM3CUy<4NJ2-1nk|GT_0NmR}Zs) zj1Pk|LVset?|n=s-XBOFoaqJMG1O2a%EStS2H|C^rrlvHxW-z(&3(Y%X1^=kzPfhC zNtSDE9-B7A3Vv=y z-49_}IpCJSg)Y#YqEf4Or=VF-GH%PeCLFI@igJniW%yNnVCoz4_`N!%w=5~n#45r3 zI!oEE47a8Iw#ZPV4{C77R-&M}P{iMXb|egEEW6aiN?=nsj$a9(Mqq2BwZm_9bP3^!^QSz zR?ccG+WSqAZg1v@{KM|e>E?-@g?1rO6MC~9q*F8PZ<(=u5EykT-ZSlKS?QL&-~PmB zud{;63ZZ1?w3N|CxT}3A67xk4T{8JhyH-^^t7gCot2!AnF~HLoyCIp_!rvgKg1
EN`2nd)7RSvC0;C1b#lgN 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 Gi2nzstate) || + (XK_Shift_L | XK_Shift_R) & e->state ) + win.mode ^= trt_kbdselect(ksym, buf, len); + return; + } + /* 1. shortcuts */ for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) { if (ksym == bp->keysym && match(bp->mod, e->state)) { @@ -2027,6 +2034,14 @@ usage(void) " [stty_args ...]\n", argv0, argv0); } +void toggle_winmode(int flag) { + win.mode ^= flag; +} + +void keyboard_select(const Arg *dummy) { + win.mode ^= trt_kbdselect(-1, NULL, 0); +} + int main(int argc, char *argv[]) { diff --git a/x.o b/x.o new file mode 100644 index 0000000000000000000000000000000000000000..76f5cf3262acdfa7d8e8d6c8161b025107608b4b GIT binary patch literal 75288 zcmeIb33yf2)$o5ZAOT`-RMe=bml`xEU?2e!Ma?BQaH0XCfKovrWPnIWVsZn)5xj|V z8l&{Bw%DpgU;5TotF%ryR1*e4t8E;rI8<>?j6=W)70rLGz1K=s7CGj9-{=2*&+|P` z58S)Y`R%pWUVH8F3_17eyn<=5F) zrsqW4W9yG-Ivi2++1=S&0yA50`T7hz+`1XRJNGnA4-YKl?ihs9xNXL4w??l{i;W~V z85-RgGZJoLD=hVKexNPyRoJ2P&kZ!@B@;w42kS?n=eo9o}FOI(mBXD&W&zMn14}dLFl5; z#i4~;u?%jLacnzgDI7-FZS0PmW#g>39yM~!rn>qh^`3gfMA>TV69t)WMMaCP*Ie&A z*ZZ=Mgl9_ZdL6D!{sdN+lsEvmr<=;F8*GcT)!5j%mx^S~^Y*&Urf{b0wiL#e=*KCp zw0M`h2HI96yT#pZv$5B0O5E3Z|C;U(fd_8<2)?}?ZgHDi{zCQ* z?`FBJ-=5IA@A%PM+~O^6dCT2@{Nu@PYkSapzV(~qNAGM-%!zsW2}t62ZKHQahLx4K zq@^`)nmidS^)gf4;#WY8P4iLE+xNdz6iJPBi+9M}zis{Y_|a|6!*gO@FjegB8{Nja zueG@sq{h46+x|Z4c;$!g?lqrb6_k~C4;@;zW=BFonKvc1%)25r9=~EcpP&kYZnbap zo{;zS=x;+_8#RKjjQ4_(QPjLz--&l)Uh(#LTU_r4*-)@KZ0!~5e6>%HUFt$sX|C4= z6`x5JA4#1z{wrIpf&2a*ZH)~F?lZZCqAjsyfzMw5JQO&2mkVv75Pc7%<@3PFM&k3p zyseEd1a3GP8%yA`r-45W;R_JHY+96C{DNytZNtML=opSVLQmp1_47xeyLNvbIHVvo z1-`?nBj9^ZYC3!`NX_iH1q3O}+yuxkoSJE+!cFOJQ*AH|ja>BL#+E?CAZUP1SELTd z27#G36+n?=o^hMb3A)};Zz`xsF2T&kY%BAoCPE0A!d?=nFEJTIY;;EqxN3Od;W?>? zx>4vH$!-&Tqq3lzy))2oW*qj=D*$=>0uRrEN-Rh{v~0~cPJHAaW!cXM8s$Qfo# zgj|i&zSKW($+4Lu18*(ZUAuSh-A`}XS>zS=S<(6ApGPv}WABs9<8ne)|- z_&{SjuyFH~vqI4iV}ZoD&F8>?ckWKtd(jQ#z1p!8)0n|GYK8#k>f<}>3*yG2-iL-fYQ10vp&o{1D)2rqjmk)IjN2SZEi7mbrxp}=Z=0mO zGWp(iTheS(-avB-T32kWcF_;kR|VduvVFN;9tfEfZtHFkvb)hNC|)<1abR57t4|1f z)roFXy7H&DJ=|on3pMA_T-;+gG^{LB6libIkXub=0HGo8n^F7;Ruolce$!kSy_3DA z*rqB>v;Jq9SBTAe4mRsTY}OT~Swn2JH3r(LZPp#B-^1YERGV%*WQI27BiGAK>o^-) zQnV%6PJeE3m)rUQG!ijs+L(?Okh3OR%U$oO1E!yjH$aF-0qjuoVB&~315w>!a5x-> zuccywHu}T}w&vsY=w#@b$*$K1B}vKic7!2>38=|VK(2RF>RJ#Q43EeFr;QRBlh0tYlzSRw+YF=D3~#spoYI-Xd4-!wQWNuA z--9MG3a$ToD`pmGd=3iiw!RCk)GRN&_UP_7%;C7Q=)Rb`VbLp669)&b{TifbdI>bV z2Pr8_+dE9di)qWx-WF)sYaIA641-^{p`Nr*01k%QgOklcqCFU64w6u492O^M;NtX` ztDC(w&~PK<8hALD@=S+a%5ehhQhu4RYjT_9HZOp&1)P_j@9pw;UKterxY$5L7?eW| z2J42n-mU`gT^NkuFgY^JdL$t~koN|F91QasyX#I1dwb$c6S3}rDKfh?9GGFcLpbIe zoFf`ryr)8eyssVw-Hsh_PTbes4N>vanx~}oBn)NmxME^|`T{d-4nmi0tGK#-{cGrs zFzvvA(+(pRjFxd`H0)8E{Zyd217n(~DYru&VHi8&!``(0gFT zfDNE};0Dm~>3&lsiQ(o&38L?CPiXuK;yd1kOv6p4Q=v?L%u5|}05zHZWV%+&iyfPQ znD(Af_Ix|qMg4+~sAJI4|DtDf%!dpf!Nvp?XgrCP+5W}gEUo1@#(u@!AKx#D>q?ZE1o&RxIn?_9>)+W1LioZIBA zem2JS;#}{wex=^((Ki30ttkE851nn8i#a{Ct$oK1T-X}H@y2ClX>LwAd(X>5X4)-i z9yD~YZ8B@A|~7@6r$%O99C1`<$GWB@nH)3@M~+Mx83w#xABue!w9Hsdjjiy z+Pe~Ry^s1itMlG*r4THaTwGl51M6^R@3R2N4Vt)4jDsN~UY;cLk_HpMJ&?drU|>P> zC=i1Mon7(aA|DqhiC${~*d+7ak(-8+uD1+M1!f1EV!hmirnBR{a}vvTh7qv&XrP=XltLvFFID0Xr z^94RE=z||a55Rc>_@t>mMS8;22VAO1!kHi&2KPYoXSf{7O~yXx+HU;l(XemN_U*a5 zN!9Tb2>uTgH#}?<50{FM=~wX$AZW7aX;5%!;QO-tz*XD&G%2_^u==dAfrcokH1fEt zYJ5G=-~j;f%9qLlr<#+Az_m95Drg=H`9Upy>Uz{$=%NW7Vw!Cty1+Blj$;rN{3sYS zpw%?CVh(WD2^pAv6u53Dk>2yrF)el#DhE9n--z}!sSntgM@x)xJ;x&3J7M6*Y#%hG zptjf}_~=gGgyod*=Kd2}cl0O{Ii^#>I!MR{nzPNG0WHv2gK=jrpUSM4J5~>LX$jvZ{QH)TMj!SKbpwMHnzYuHd-^dfyx#-Rb$;U zs`Iz~T6Ut%ge3dzFUCT)3TpRhY&UO|1;)J^_}MqmKmv`Q!#4|bd;kaiW;MajJLmaD z)IfxFZuH}%oz2>!z}B*Bj~-2c%ROA#c04{HBhZozb3)xoZ1*Ys*=@|}SOL?d z-K*dU(@fY6PywJ~5a@#W&Xf@*%C|x0N1WREJYJbD>{DMZ)EAYYvBeF9jVoL)KD9pz z6^Vn0xe|q6WAH1>)Gc&D2kJNlL+*C&4rd-5+ris&hufLdt4^k~%fc}>XE>AIksAib zIXiN5FouTqNwS85RSJKvtK) zJBc=@=sW3~@d{G(+vLdMn_)Epd%?)C=(jOPwM2LCi?$5$a$U3ffSOH!QzW<^S2)|c zHDv0q*Q@=ld7|5by*)de>h_FHbq7HO70&NnX|Y$cr>8{@?LEkfOg1$cy*fQu*X}k= z&vB#s;v)h09#r?fz4P#W=NnPe;$rRcNHYX&U*#{3oB22k9)6XrKq$k=fhE)wD#(}W4eUKZoo#h?`xzGi6 zKzsFlQlIph36Z_V3<>6CJn~`d0f9@8PAQa8qt! z)3E3_2Sv_px_pkeuX$y6^oOB=>&}8E68#3Q4=;orZ!8qf@yrxJW6;-YK6GHfFx}ev zIJ$3e;D*&8-CU4R-|;g@Kv!uSk^tIdUq6++8ZNk)wK`nxO76Yf)$n&nV7n7uaSk;8 z3=)}v+nz;wt7F%j8!LB2 zKZ}oc$Egw6VKg^a_2E2hI-J|%gxNG58h043{54(Rx^SJd z(2ZW5UbBDn*zZT0Wol6286H=Mb8=%8AH<$-mo5IWN4wWCHl_y zc6|A2Td)q660j;eK(^29{fke#yXksbq|G?$30$GbA-Hq158u#xg(CqPp7&+AX-Q#d z&3jmIxYci019RUpE5vgU7)ONxz_snrU$H5KqW=O1zt!IMCbV~N8}4p^U2lii5%xZU zG^TWopVS?OWuX%*o3wL>+cckVW56o?&Gsp~aTq`+eQg>}N{iz}4*F_(VN4|O1Z3v4 z7hrv&Q`$$u837IOXnRxDoaQ_*Yv{^=*SZ<(?|!jmq*2mGRW7JH)>ai*`U|i$`h84Y zJS_eXvG$qCV>?{z>in!n4DTy>mtFHi(Iar~0E_LOb!MQ^ zbZJLUVJ}RHq9IJiJK@j^E;*V$X=mUucJRhpYO%Zs26NWBv@q z0D2nHGkXIUoAuRRxI7wq941W%&N~f(iw-+$r@N=v(W1OXYHD#$AsMUYX{kmk2nBwz z4emO<_j#boSQI$K1Z9D$5vhSg?8Rg#{7G-{#J}%#Y^P!G9q&_9s*XKS&t|XB;c4mV(EyHQH{M6KH$@4)Q&?)@iOEVyB+v!i`_Jqz1PEaqLWaBnL#`LX1%lV_PCD z?}m3ruA=MSp|7_&@XSu#=`O62Q+l4wxqk!HXvZ~>6fa8whjo}ejd;}RvzN+HU+06N zri%)_H*KH21B$lh-FLekXUNvbQ6?Rng~IJoUT4z9QmFf-qV8wgp}StLuFZ2npGS^! zvzH~*?Flv26*isT9s>Q)XWns}FHh;7o!t3Q9&j?-jeg$^Pj0OFzI%V*S{(H9ybs|9 zdOTgM>I|&DJjJ;xjUPC=)II%_y1h-8!~NT@+B;q|df$b+K#^T2SHH`+CKiSPIE;-v zjfY@mWPISE+@o6B2RF3TJqW`HoCm)iIni%&?Klj^gVmQGg5+gHedBOZ3r()Vlz{&}fQA9ZXu{Z7pcNCv`WJqH}2UakFz+VXV%OrV3-Lp;in5z@vrj4n1t-o_SEdzM?KJdA<5Ilw8eE?UmQ=w7iHP@Y$ z*Z4_ZApgry>kkK+n#%WH340y+FMimZdlp>p&EML(?;vPX!@XDC7vUDc92jY#Ii-Wi z4(?>(PJz8;28Vd&?EDqK!r7gnK*7J7b7LSitlEqVI?r~!cDVmwpH#u&$SkkmYfh?* zO?gp1JQIiiKk6ADpxt=eL7}P8rmSc;JPmUz9OJrek=uNe@fuu~!Oe}fB;dlUE5G=u zf+1IITZCt+!|nVqqyP>@{ej*_T!F*DZ3cV1(D*Ej=sRJC7}LsA#m>EfpYAl*uJ;BO zw8DXrMUggRKF%_9iSpE41%avCJ5B+eJ&jLaoW(L0_Rd~truU6|0+?2pV4c!=uu0sx zC-gYfsMFWt$XRalt+v2@@7>`wQ0iCELbkcZ4Mr-zDZJf*>vEC5Kx}tg=iS~`ndOkY z#`gjZw?Q^A2aIs)V1bQK>Oh6T*nq2E*h>?Yiw1SzWjZToo{bv46P}&xJ4>3R5SiwV z-YNXpJLUGym1)m|Tid|v5dPFol5i^m?k$+h|80Tmj)2^rOon`oSI8D9(1krFWI-;z zCZrE!0%VWXd)2d)Wozxxw(>+vf!oX@I-23ssi&y~PHkN=bd6aI-~}CeniuwZP3>_d zEcD5h>12NAZE&(g&vOp5gI4whQzEb|{Wzg%USEnMz~iyQD?$2uW;#x zzxAYjBxV;poKg#?xUcfqY9|DC6|_(oeYPg^d8T++EPHFsPJTGZp36Rl(tMMO9(bbx z@-%uTIUf4jlR41vty}CQ*16exv%vd$GbSf@ZH;kHKNgQ`$KzE$eEu=c^dnP77!tZ) zG%M_X<~L=&flv1Sm1mO9E%vrFc4}T_*$2TJyX()wM|iVMo2tohTR)7aa>2SHYslJz z#L=*|vEu09wK2vzXt&XigMAtYoFbSj6QDiOEq=?*wq_rJHzjb@KYUagSW<_l+CjW< z_D*{kO!v0fL@z|(;ZAt83H)!L$N7G9OH5cVlS7A&}1KZ0`~^AJoYK4lj6{vL)wGBM1nuPxrL zXjc#(lFi!{c=&ZNIp}VN<_*hVXn!N&D&J@BkhkCg9b5w!ct5ni{w6&M)d@e>yn{m1xCYp0j-((rWw*^66C{5p*PP!!!N)gKO+BE%n7FV-lh*Z zK`t#w)<&8d1?AVm>kWApdXYoO9@1wwd#u<<@ z-0XITOyBwOL|`2_n^M6ARi9M-)J=1KOdeH_wNPb*!*W*dzz;Wmwz)jez#n6n{)odw z&H*^gU4rKQD4nJndI{~WB9Rg=z7(yKdF&+lL5$+JU(E(Qy!T_h>AHrObn%-_^>Ei9ioESLE z2#x*>WXJUFsi3b7p1*quCcB{fNKZ~9cLK-m3#acDFtFh{3qI%{_DWLWG0sTpl)s|Q z@E|Ze>KlV|br^0YrCn7U&i?+&%5dP};`p-An*H!R|65IQkaA2@ZUO|u!%fQ)n<8K+ zJz)hmXuREKj1LF$b~k=<)hS^5h;01hfty=!NgT?4E^zafgf_VA0gIEe@ad3$pz$r( z@4TjNwK+d1fNLuWjh|et`$Vq?ALVl4$>7MB(S-wgZ|e(?#h-A2bBS{a4J(DVMf62{!{i zhTH7-8R_Vb*fM)90qOyu(F9Llm)Xk-=1L^b?)(hV4l_aZ=41Zu2`)-Z;!L7D;Uv=L z_v5!tjhQ{Ec0bv<)0*k+9kS)?mq$JYx193!T1&=v-4(2hF}yEf2R?*lZ0{@aA z@X*wl0`C);d>#Xn9JquvrNC?NtX*9n>(srOAKh;Bb~Hm=uQ4wE2|{#hOyHsTqZ{Dr z)wl%6%_xbs&zW*U;JU*Az+VsM7sp>)5YyGY8&1`aj#&*iNDpzF^3cM_=x}pUcR}-V zxNK`m3z=d83YwR~D3N0d(Kr>lK<5$dM?Xzx9gR<4HJp>diR)E^3+Q4It=j_)e}cy# z_|hL=e+0{6Qn#0!?3~ePpFRnM_t_e>O}X)_K)B1+yYa4FI@l8d17IvjwC565B{%Ls zLkVUp<|FT^1FtzzIgKV5MjJxCY2a!b|Fs<09+jnnQ_y?LLFYMv4JUx_Y`Q*P!)uU7 z+M7j~ttqW*9!jk{yg#38r<3b`;_QHM?$V>vpx4d0BnF;AptTyUYUBk$ypkg7lFf%} z=!+h~>ky{DyWT6GyLZD-lJ3G2%kak+P|SXlSxvovCG_9BXldL*PLa-pv&#cp170*R z3E(etO$~{sdw3Y_Ct2}#cv?qpwf?6Hroq3TG<_x*py$wFkldkCYl}y}Q2FLwkYo|Iy>IsRY7Y6uhdr2@y3x>y;-$h`hH< zmou5!rGM`u!w^pes%yvQp{JRi`GQ>5aT8v`+PQ_V&^BKI^U_&nUb+${o$knZo?zg~ zLsU-BVR4&luGw$wuociT4Yggy+Iq*fj@S16x2!n`)1Sua{~PB26ZEzZ`5z?MhzWMJ z!j~=0fDWp~1i$|uB$$c`R`evGHl?q7ckF~eV``rTVjWMw9!&QgiI9-zJ-+gm$n`V{ zBWWONd?C{AHpO>2EdGGSG<6Z!C8@qYX-T(a2r$##pzr*tr|1CK3Cnuzi zI`O2m(I=lWX6(3A)5lN9$ecK7a#r?fr%yTK%(HSrQ**<4)26%mXP;9rW9F>FbI+SS zXYTnI%=_tu^A}un@xnz#i;GK2%a$xHzhqg(^2(~}OKWN)bt_iZue$8=E3UlCNr9{j zF?;Aoaqx+SPl7!}`v1(9TaaHkbyn!Suv5IWsHV0w;?x!wRTM3*D0ONpiYg;cSyg2u zXm*1oRi(AT%Bo0kc~PWz=}>27Y59_+Bw_at5GgLIJSh^asxGYz8bzaOhdR~e^`#ZH z<(EMY_*GI`8>y*Um0MI%vAC#snNwR`6)C7HE{c>_RXW8L<)xL83(6}?s#ZGXmDP2T z*^yOXTmH=4^PJp@^6JG^MKvWsNJ}Y#Wkux`r6oh1W9CmtPru3p<1v^rs^oO@e^fCX z%@|dT|C~9Y^QPy`nGGZ#KC_%t7nfI_TD#P#Ev+amj*zm`f@pSeRb54iDL&;^8Z54= zsHzE$g50WWN=r-1BcVv7rhIW-q_ozljX0xfgX!b4;UP}pg_82x>WZROQeAmvIphRx zF0QI9D_=5hsI#P|XjOK)v$z8Nv2b4AjH!8H=Ykmv!+8aHbMh8mkUuj#>jG!t%)B`Z zfzAxg$m==C&z&{1FDc9qJ9Fnu%UU>l&UyJWr#qu6>Kv;9BEU;$!`JxJC%6#c2c0#m z9(FB2`?(OpXa2;~C!mif;#VGgtj>wkVD}vOfO_1`#OO&@ zbQ11Qu=|-6uwP(~jfTvnxQ_xe;FEE>ffG;7tObBM3YsG9Z(FT)jkYR&N2xgsU#cVLq29s=%VS`KvW?}Dv zOl>gH29s=%VFF{}cxodM^08?HaEw(sfBaQ7!Qjw zoZ?kQ5QziD#B`Lm;w0^yFtK=IaakFQ8);|d((*{Db3(D%K*Ve?PK})~agrIypnPXd zDz;NsT`lB<17C3d*rM_k7eP=QEUqZ3t;O9kGhX4|lHiiks^z7TnpJpI8LTW?UW$8F z!7>}V%5m`;P~^`k24jbL6)4NP6NrIjUU>ufXK zfyB(JNO{?+VCf2IWk$|-);nob?MWa}P`~~h8C8{4r}a$kXN;e48mu46iz>>C zYR`z&)RmrAR2QjQT3#73N5)#X>j{nx))cJ_RzuUu3RYGG$Cef^tqP7UhcdycVQg`2 zq^f#xFe587J)P40JNUN;{_TN(d*I(5__qiC?SX%L;NKqjpL^hDx_Snet@>`ned8$s z$J@KyLWN3yKs=@Y70Ky%w#P5tp>)3Sq~MkT^!vrLe&2Y~|H}dN`^B?<-+0o$egOS` z@vPrBp7j5k^wXiJK)cKFx_(&jHXr*q{#J^|=Y8Zx*zt>JdpMqtS%*%qF$yL*86=Kp0p+xMpd(%(Bk{Cxw&ZyF%}&jZB&Wq|nm2Z(=Q zfcOUoh<|8+_=g9G-#kG4BLl>rNAcWVY^&(~=6Jkk)8EGNL;8yZ#__uUusFw?n~)4e z$nlAS$z6^&4+O{v+UI!P{(1cOjVFi98Nfdr@8=(m_wx_O`}v3C{rto6e*WQjKmTyN zpMQMg$v@`~;2)0n^AE@S`G@2E{KN5n{^58(|8TsYe>mRHKfdwgpV9u`2y^iPf-6W{>b9%pcot}@`!8*N;=VR8d?bGRXJf}}!LC#o(9Pd}Z zg_NH4^&}_m8&3&1Ufajxzi&LHzku@b^S@s_+spBM%=WWe{Nh=j;}5W(6wURqkMrSp z*2kPfj`!1l{s8(p-cLWr`{{pz9l-{vkmLRIbG)t}R>Sc*3{=SRe(jIrgDM>#J~@E> z9Pej8$NSmO@j0BK3OU}-evS{SbbQz{fc+frXFtdL+0XGgoS_Oi-p_uH52|#0*gAmy z9Pej8$NSmO@j0BK3OU}-{w)L8$MJslalD^>9Peiz$NSm0bpZP~-p@Xc_p^`V{p{m- zKl`=~U?0c(*~jsI_Hn$QeH`y+-}V9Q<9I*&INr}bj`y>VV=g6-x?r(_W<#@uH|c~j@Y=rVd&Sl zP#n|$SUjfpJ9p>wKNgQNKel217{AP?oNQZ>Pdt~?FP`=L#k1{v9@1;;>a%d48P9@u=0eC@ z*OPWHEyspk5D!uf<3i@R<(eED*4WSqQs~(*=SCZ@W}RM(Gd&j`p-Y=SbMENi_>6Jm z$Bhq8NS~0Ao;e}g!42C(5I$Hg5Q6ux#1LQW6P2f#=vd@IcO>JX-Ub~#)gtoqH*D*VC;EAlTt!S$)Ti#(6H%A30t2+ zJy|55it?amVN!zqTMFX0Vu-0155;sQu7cvur8KcQHm(4U*HYXTtgL~`w;?8OWBkzm ziU>KuvyAZBMf#q_hVbM1rYE(<#JwHouMg`yjRw&bu#ft#NB>+K7fK37(Ct6<(Q?lL9goBx7D#0A-nBtKamgwG?+HrU#!y zW5Y>{;*N<)S~@MMdRkI_C~0-f@}xxzhEhXBeUDR`64*x{Tul1#co)Ta z_o@B3#F(V|X^{7{q_yx_2cPvZQ(YXL>9f}B_O%(SU`KhPvtd5C&MyR@w>@5b{ zV;8_d2#miN4nPNvYx_vgZ(!ec76c^O>7K}SGhR0Ws z!*bk2vJPD_NzFKSU5{hZ zwK#W04~qTHj7dGSm7QBRP}+Q}!U;n70I^>oGi3@VrLW?VfyRH5S%>4mkNYqTy&|sW zN5=mks7M2!;dU2(QJ#gd^LjE30xlRpCK+U^Nya>sk7?l3K=OiVV`X_!4=>YfQ zv}V#|QrtLlNJa{$&ivZ@>fCg67+CaQ%q#EH{ey zk;HMlz>PWj8Rh31YSZH`whPn`UuNU=-YIZ|@?{n~BPpCj{5m?OCgtGVjq*1V=QZk7 z;&%}@>r~p0>p4pz0KrW7V5x#fTeiUl<~z>eR?!QC&?Ye76=eT1io)|AELRI1<9LJH z#pe4!Jtvc%w@J@ZBWJ(j%wPTr0K3KT!F=UO~tH@fvtuQmMchl_Q5f3QTU+#3rXIrmx19}i1OD%h#N&ax5Ga2 zb%xr%ZN}X@&GBG|$03S#eoy>R1{B@{A?jI6$E^Q;bDYpqE{Zm9=RiA0K)G?_x%pXh zl-y&VIfSq0;e+z+NtT#(HtfDZ{NjM+6z#lAyn^^V8|{2Xyo0z){9EDy>^QJtJH`!v znE>-0kAo6yX59?oVWyr2JI5H>`;|hR({s#mz+=QXu!thYk^D#&q%ebcuHxCi(VlCl z0?b+*WWpq0tK{)5U=H+`D-|yUj`dYfoLlNeB)?F}7n6Lok~iyl7=<`JCtC&bXy>iw zwKVYeUq&yyftB=M!-5oEXLy47%_bSuO!EIBA?*Kx_-_@zg*diHx&4;(^LZr4{SG+V zc@EXPIlq9&dw`>Vc)Z~9JxF{hDPWE--atJ&Q*1;D#qT6Oh6X}&z5#JB0LOZHnB+LH z=cR+4#~D!gCdt35_^c*(QLUTR@y9Lt-Lvxf!*H||0D4r>A8>iGbdSjbIt<0_Z$83&LWF@ z#*fE{yNYiCj_oQydMVo3N%A=axIaE`cYDRi)1(7YZ0B2~|460(ebU40DAv|V zoW}>|cLB$C)r|`$*v$DBgnNjOriO5>=#g&CU;los(6$f*_BxeS#?m2}5uq>EZISJ?Tb%urpohnMAxqbF-d_ zb4o}x+cU-Jk8>6&9x^=MzH0^IIN!64ez-2C>?|btd8CKsFEsLlotu?Ci-_}ji;_8I z#P3w{_FB|n=Z}ilki2;dA1i^do;Z&8a=VH+k6#?uK>PzG|1;uy6*uRp(Eh(t{FfxZ zK=E6N|5WiiiI*yV7jc}o^%ln`fhr=d=d7b|M4T8;WK5hxi!K50HTlxwO7Q!MbG>qu z`6)#h-*gJ|14h7uEJ)!tqvw#Ge!X`bs-+# zrufL?HRt}?+eJQni4U*v;SE0gCLjJAAHLCtKkUO>eE8pd`0GCWT_3*3hkx(G2SY{l z=V!c^&>s)_@NqtTvJao`!{_?&MLvAF55LNXU+csF!-sG1;rIIR%|84YAO24t{*Djt z@Zo!W__sbh7S{Rw)$bOcad?=I{GmSlc;GnBFQN0D!)TlzP5d&&#}l`|(n9x?AkFDM z`duGhNP5b!q#ce6^`cv((U9ZEveBk~0=StwXURr9!d(PLcBRvUp z0pKo*zu8C6pM7|X4}YHYZ&LbS_mTgAA8sXjP{YAMDn4@R`48>cZpw5oT|+^m-wT^k0AL4#M_AD{Sw?3 z6aR!b41;F7l=v6K&AlmzSpgjDx1Qu+xoEaV;Qjfb$%o(U!~fvJ@Acsi`tU72{COX~ z+lPPX!}s~{ZXZ5uSpWVx%7>ri!^ivZ93MW@hcEKsl|KA3AMW|^TYUINAAX+?f6#|N z?!&kF@E3jfzkGP75C7VSJBhYmL{z^RYB=|j-uqKW89vO}sn&aG#M=}%VyCihIlOOnnFB8_bV^siyA$EN23}BGUk>jKHgB_a>Q_1|%4^FP zmsgZWRylQ*%ZsYvZH(~RTxWSzU2SPmv3b4i^4g_UHId@FNUc*3Z|QT!738Kn=GBY1 zJKm|Us46P4?`Etot|%?4aY~Av`sGE-N|#ius$PmOjjgRNEv|LSY9P8215B8SUlZ}D z7_x=^NltwUykt)$f`|+e;gr@_SJjrHC6T%sc+X_u5^l*m)7E& zE%61v@Frt;*P%%=(R>@5CQLT_S@25Vs%jE3RaR444Rz&I)sGwRRIM5Zujj3cM5-!l zjkvKWBi(_w8R9z?QGHG6rSOhNbF_Pl;bp_MHvJ@LnLSum3UyUiiOt2-3A`cFyj;1auF{r% zd5H=$*h(=bLdNjwQnaIV`C@p1DIS}8m}u%@qR}fimJtJ7@DNGH0!It|c@3zua3S=n;$;hqmo8g~?-1?j083Ch4E^>zco#L(#fIj>%ewO`OG@jV zX~p#Z(QsXLMLE1SyA%*cgU$Bcp}ohUk`j#RO+x@g`>?51Frat5C9D`%;fzO<=q&I`X-!RK)k4^}uL6g9 z0a697w@$(GL7zb16jd&%fLCr)#B>}QjY1e28Im-?Lx}+SsWKI5z{N4dEmtOa3GW7A1bx}`^K@-A8wgj3J z6b{F4D8U?f?`a;s`ZQ8IH&T`bF(puJr)*^nzP)#vX+?$jrgrI9tSxE=P^ICjI(&b- zM4S&~Ft4JlL@5A6D9t>4p>6(*KCh{D=AB<;ThdGz&q_-Qpzyu#rFG`bt*rS`hk&P+ zn_+mK=?1f5q?e8_gmJdCCQ=R+2%{$qL`$IemDZPI9(Yu0-~KLMtv)Xd)e8h5H=U zK}ExKTUBDl2W+~z6*v=5E2h519R<388P?}vGc7EKl>iJ>wr=>yb`I+~bP1;bODmx* z<2!!qV7!HHG!t8z^~ALD3aBM}0BI^qS31>LSZMq63hg_Bt*)XHCjzfKHa`?FZ(2ni zyec0Y5h*FJG1!4sN_lm0RW-~;fYC*~gfZRI42GtQf$653*MqBQfddK5o@py)y;59P zQwts5S^`r9tqfqjgWAjS&BypcX=fff5IYVw%{f)L*Hf#ucjtqw9e-z+nl9E8kD5pe zL|rh$NWmlkwPr>NV~Ck4>&xIx{k2Q&_>l``48d4sddjpa=m9lVb-_!%=&7!)y0SB zm)F)6;W&~HKS$6bWGW0>84OSnm=xxnS5?J7$G|DWrPYz8+zf5M@CQ}ojG}6`WA>`b zV)RsLXTgUXzfqjayMeeaFW%?HjqPMTFDcIXel7I;7o=l9bPN7_!SVhqZkX>~@L~B8 z#4+EX;Hg6X4}zx)`H_NW3Hd(?ezxFu3x1y9*rwQ?O2Pjm_)6mJp9YA-?MlVjKR@%~ zH!IG5{;lF%UwEGvH}u=R@L@aeQ}Ueeql&YByw8gp+t2bZE6(zrinBdk#C7}mM#;1O zxP<=m9Y!4W+y@^n*WrR=pJP5r>0vwZ{wZ##=g;tA`Hf1x0fk`ui{h;3VWHK7Xa(3m z8%RD`an}D6#nE@TovHXe7CT|ZHxNHxah9)CoYyn8#L=H}J#(FsXFY#Zob}u%^gIZ< zxZbz;$nOyH4+;4XedIqD@(&C73lD|^*x1k9&WjZ1cC}P-Zdc2R>vq+sF05;OL3RVb!0Lm zhKD)`qzeyrf#KJrQQr#R^UI3a%oarFNd!A}wL7{`7{ z7xG($e2L&v&mRQ8Psnff;VnLVH*vII`saNiFa0x!{yr1sw~2g@5d2iZk0Fj_-7a{x zke7ZwQ^?DFFBbAL-zve=h5m@pBlEpV@H>S3y@Ed__zt1}=Yqc^_yob<5_)zB{(+Fs z5d2dg`5y$|DdYzo1_!XA|Iw!rJb*2rIA2dlQ=H{bQ#>6N!WLG1lf_P<;;jEd#qS~c zBEe<5svwTGOaELU_|p)_dgS;&O~_*&{P%@31V3HqSs?WMUGQQdk9v3=Ri*fBD(|lam*u@f zaMZ)=%)11iBJzDe@G}H|OmNi0e%?+T**}E*vr2vr+4+Xx+l2flf}bh)UZG$5dDxL4 z1RLfn+fNR0?qA$~@`QXFq~UrjR`Qvs6t+sipNC_XUnMx^U4p`}H3%-{|3VyPUw{wm z*&^gIj?c6HruasP!|f%-@3GkVm*PC1@*gs?A3h`hkHDKiurdFR_!z~%AU;v?eZb)Wv=%5_)bC^0x^2ZG!(%@I1lq6MAHS=@9am zZwvY13&pP>?$CW^_7B(NV8z+~MB=FXWnoW>lIMI+P@MBURdLRDlH#22>BM!uc}kx3 z6e!Mm&J}uI5%ymq_%6Zgl%5A64!7S5`B&kX+sW^IzX6QxiTKF>r;z`bkZ%?8efovqXcOD{oX{if+@<8V zk)0nYj%#k*z7u++KaUHVXtN%Zc1|Xa^?n|FxV&cyj(IY7iKFdr3OXGuLg3lK6 zmk>uiavqEbF5Afs#8E${;q~fzA^#R|w)1x4EYJPo4?g@+#aaJ0;+W@d_^|$Gh_ilP zpS-R(=lhx9bA_HSh@*bl&IgYK02}H*A3mIKB5^IhLh!eR{4WK6NAN!pXZv|wx>s=? z_x35y^5^^nl)}b(cz(G+aqeHmigWv4N*v4eE_}GWR|5z}akiiP zMYE9a5PE(oxV+A}QSgt1{6k9rMu@|$Me(~Vc6KO!EAi(PXFYE!&U(6uqklT#!+uDh z1tFK0`)`usobTa^^L2n@6yHF0{zUQNF*ahf;_T;f#L-S11K7@qKJrr(|Cscjt2q1N z0>#;H7c0)=XEAZK=M!PiawX5@iYQ(|_N)?mJ{5YdR`P6TqvCAmor;ej{l6Fb|049? z>m&bw;u|0hZjUO?_5P&L{~5?}y>uygw)1Pnxm-Ue&h;LbX0kW^w@c_hfjGBMmQNG% zdxZQ%!S@P2U+Gz3vvU?J9wuHcc$v^sEjYG`DI{M<9NFhW{&^w4RPfIQZxZ~Z(Qp78 z>iGgb?B`6uaqMS)8FB5OtA+fRLjFb}f0N*k2`=Zs-9itJ<(%(FLjDrLzYy}b3m$he z9KeRiUm+j;N!DTzSSLj(L?D7UqBKnOOp z^Je&PxsDKA>d7FEe)w9*pC;sGJ6R>T%(qeS3ZdsVp?{y?8-+aP&Hd;PLjD^e|EQ4v zrQlBqj(T{$X!GH33jN;-J>LjGd2PQ?x0 zS7A0R@15{r`E257kJJP2Au*frkI+9;a*$v<>wS2WzHN}TIuj1_ajiu1UU zFZ3KF+E0y=PlPz!Rw>SUt`d6iUG{8GqmrLOdTvyl_5V_F*8dx!KSAjKo#2mweVp$- zg5M$dvr0ev=VQe=-#tQ)^v}_m=#Ad>9@{@san^GpaqLG!h5cidd?xv4vf`}&OvPD0 zyqn2vs9*YLhTzgaa|DcPM!t|L<1(eq#;%)|cRS0^|0!RdCFM?SDpb zw&x$jQ5OGJo%OsXU z#ku|8;luwd^vm;?r<6Re6JAi9+tp`^bH2xAfzhyWJ$^xcNK?Fv_yom2CZ0na{eXRi z>*Z`Ae;dRxhc^V74f74aXSh9d9uzzU^z5^*Tj);AwgPNt3CX7u$9#_x`MOGe0m;u& zoKCl$iv(W@vTWxiLjTc1e~sYB2wpGr;1IKj@?Go0Z%~}=yv2v#P8`dNVJ{hmMiuAs-mEx}C%^UKcPq~N zA5xt4?^K+hdwju%?-Cq+!~T3%aI71imp@Uwf&B1=;x`fhR`K=32c2#!g4-KEUze;n z*ZYx*zd?GAQ+y89?*!s#`w1Y+<;qd=?9b_nvp)-jo>Zadd?nBQYk}gdzgThBzf|ZS zCG=M*d7gixigWw?nd02e*D22J;g^bYJKUf++xa`<=+6^{o%bmDM2N%f6~$T48$!=X zLeINOp4V?5Db9NKD9(O9Xo}6B+ZFpKQE~RqVT!Z;Da5h7pTLLP&+$rrIF)yl;HaDB z(*;Le+>cIEoXZTwaGc`*Q;(Gs7$#c8dD{d4fy*1&Xu&bA9w*@;G+m zcCX;8;h6pTpx{#fqdxjul|1?sx90?31IMiYCBdcsSAF#FR`Qvo|6{?g5&AzDTWj~xOZm?5R=myq>&V$e$|8b)Ayud~Z;k^ZkX;lP>i9)<=G$kRLDP z?^g0JK^bs+P{_Xr$L#0Fl|07b_LPtOb4tF&NIT9h#di{K7rX%&=lhx9vVOlHj!f3? zu(PZ}p2r_2{YNX#ejX`!qsTXdIO>00@To%nTEV9a`3b_$1%hV?UMuuq9(>+(jgXh; z-5Z5Gp8qa@4{moWzQ|B`-;v;`pVx1X3H>-Wu%BC%{CFdtO%ZACr7cj!D*Y z-6L!don+!@i_|lLIM>${k`MXF7c2QplCSZRze&lDA^HFGk>9T5`MlsIANkjX{B2IJ zKi?7jI>A3Cj()gZ@S!0%fDQey7Cu}rhX{^oX!+_Kqd1rAB*nR%WC`vG{bvx@_T&rs zp9%SyKJqJsJnGsHAKWe%@=w4qm&-)L7nT=4y9i)f+?ezFB*Eey-cHAfihn`J$%;EM z77SOM$AJ{ZSL9eQLh)~i2NnOGc&g$tRQ@!@2NCCbpzNkj?!~1@v!0}iMxuAB3_{Qhh#{h;$umEj^Zb0TQE=Yi6qbMm+j~4fQyv; zZ8RR0DE(HOr1+)8*DL;2js>?WzKY~GD87jJM#VFTClil>5bKhEUplBb|4udc z7nbMW!A@85zaMDKE?TW;PIXyZk#XwZhTPiLm>WEI>vKq+%Q0X^B_EO99%2n#{AdB zvlPFBc#h(KAnq!DA8~$fH0$3?e4di$-&59i=ql2x`20ilp z9_MPs10=sr@!`ZbDV{>SO>w>+)unily#rZwag^KfYjMa+sdv(?+&hJm# zq<9wFulN+=U5e+h{S;y}_M%h!-k;Iq_=6uOYrp@#~0hQoM&0&f0=lj;;#|!QoN`C9@N+WZ<2hv;@nRQ6@Q21s}<+|xK8m8NPd&z zJTA2<{t?@+_@~5^2luuAOXB<kn%`ahl9kK#P<6e_-k^i(UpmiRiwZzR4+ z@m~^eQ~WmKU5alco;<9t{dW^jS9}V$f5mwotXBLlq-UMt4-wy_IFD~_it{|ur8v(! z{2pNLr#!!;C-yBD&o70F^ZZh+IL|NZ6u*`Hut{;AU)mJs`K3#7o?ns=?rSH{FX@W& z{8Fg+BjnF&#UEq;E6(e~O^U};x!M%x^T5r*ThbNhbxWb*yl$yhoYyVu z6z6rzCdHqi^0q0?>#;7yc|Dd)=X2bCwv(Q8#d%#+s5q~Ssuh2h{jWH$Z#F6Z3fr&v zo5Z^mf1h}Aa$o;{Ogvrj&xsc*{x$Jx#eX2aPI3OdkWGpw()y-N@xzFBDSkBZWLz}E z#{NH!IKP*b`6%LrN`4ISYQ-~%uT%Uq;+qr?5pPqRf2X8N@dA=hKD4j>vx%oGej)Kf z#fyknE53yII>oDqZ&G|E@ixV;Cf=p^b;Oeo>uY~A@pQ#+CeH68<$Ae|c(s!M9r1OF z|B3h}#qTHHrubvTyA-$T4j@o$KC zDc((--*3tO98Bx%^uzm>D?q$Z@gs>>D}Frjb&8K7zDe=1#M=~~NW4q&Gl(Z2(bvvA z;^~T?L%dM&*~F_ApHF<9;>E-_DZY$&o8p%e?^1jf@#G`>+P{W)y5b)3LdAJJuU4GL z)pd&V__j%L9%tGV=W(D*aqg$dDShqdew3~_xAQ{9xgAz3&h2EK;#`lL6lXuTDbDj+ zm*PCXBp=n+ejex373cA`P;nj)s}<+*YMtUdo@`Q_`+J+>+#kCX=l+s>bYJ_qJ*Nqd zORF<~V&z=LS0872q2M^x@VaHG;HZb?s|82-pHur>E4Y+jCpgOUdgd;{rTiwrQT`XC zzeVvFITbtmh=U|fO-&4nN54+}4%p5jaCYbfWM2w^@okB#D1TPePvf$N% z^R;V4>jcLvQ^s1b$%nTozI}`ZU5c-uypt)!0QFz`6DydmIJbvFA6~6EW#_CD{Bed5 z25BGj#1C(ow8NZEqa0W9bUN1e(dH7bR`O+Z+@Sb%bi7{i8|nBS#qXlyFBE5g@_kpf z|7|KiKTpIwp9(#P;+Zce&i-URgy!Gtl{~N0-cWo5o&WQ7EY{Ob=M{@6ALc#xi4?D( zb^J!fw-J9_@eblIDLy{gIxLyi=@^ZlYiONUp!lsce^)CWpn2tb#m^z$qB!4IdP8x( z4;3cAvORo1Ymwr6kFoZzSDeSU2NdV~U;7oW4_ZAVXnf*)4;yLuJjMAwU_^1gZ@58m z?x%d8iuH59=If=*`MzX4jdRTTK4zifSDt9?tWf-q#MdkS%t==MS;hH&;(LmZrt!+5 z>xXO)k7M%p^)QadL;k%ymR~~SWTDb?8S$lxHxuXIr(-?q$65O~EBUvHzoB^jsaAdr zT|Z6l+nyin^Us1jr2KyOp2?PFUOx( zA6HowDIGU`=G?LHW7@^b=y*wG-MDJ|i|?x_F<&d_GuXIq2r0=^bosK{hbZF$S^EF z4zarY_?RZ0BLHjy=FyDwdzf=X|{5gFQrPuyzImf2Yp?+tN z94E*-6ymz6zxrR)Z3WUr`B4?;Pp3uBDqv`f&flR0*lt=!TWtsCAAyMe@?RHgOUTzH z(Eqpw)cNC@y}$f-S3v}98>||80N=r$J-g#U&|m(Gj