From 25fa2df0c5f8e4012fe89888142714bae2776b66 Mon Sep 17 00:00:00 2001 From: RinRi Date: Thu, 24 Mar 2022 16:36:12 +0600 Subject: [PATCH] status bar improvements --- .Xresources | 36 ++ config.def.h | 38 +- config.def.h.orig | 207 ++++---- config.def.h.rej | 32 +- config.h | 38 +- dwm | Bin 86688 -> 86912 bytes dwm-rainbowtags-6.2.diff | 59 --- dwm-tab-v2b-pertab-56a31dc.diff | 808 -------------------------------- dwm.1.orig | 176 ------- dwm.c | 96 ++-- dwm.c.orig | 180 +++++-- dwm.c.rej | 61 ++- dwm.o | Bin 78064 -> 78760 bytes patches.txt | 6 + 14 files changed, 475 insertions(+), 1262 deletions(-) create mode 100644 .Xresources delete mode 100644 dwm-rainbowtags-6.2.diff delete mode 100644 dwm-tab-v2b-pertab-56a31dc.diff delete mode 100755 dwm.1.orig diff --git a/.Xresources b/.Xresources new file mode 100644 index 0000000..b45fa91 --- /dev/null +++ b/.Xresources @@ -0,0 +1,36 @@ +! special +*.foreground: #e3e3e3 +*.background: #1d212a +*.cursorColor: #e3e3e3 + +! black +*.color0: #1d212a +*.color8: #585e74 + +! red +*.color1: #fc8993 +*.color9: #fb9199 + +! green +*.color2: #89e19c +*.color10: #8de19f + +! yellow +*.color3: #fbdf90 +*.color11: #ffe28e + +! blue +*.color4: #a7bdfb +*.color12: #afc3fb + +! magenta +*.color5: #d990cd +*.color13: #df95d3 + +! cyan +*.color6: #81d4ee +*.color14: #81d4ee + +! white +*.color7: #e3e3e3 +*.color15: #e3e3e3 \ No newline at end of file diff --git a/config.def.h b/config.def.h index cef8b49..9382511 100755 --- a/config.def.h +++ b/config.def.h @@ -7,6 +7,11 @@ static const unsigned int snap = 32; /* snap pixel */ static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ +static const int vertpad = 10; /* vertical padding of bar */ +static const int sidepad = 10; /* horizontal padding of bar */ +static const int user_bh = 0; /* 0 means that dwm will calculate bar height, >= 1 means dwm will user_bh as bar height */ +static const int horizpadbar = 10; /* horizontal padding for statusbar */ +static const int vertpadbar = 10; /* vertical padding for statusbar */ /* Display modes of the tab bar: never shown, always shown, shown only in */ /* monocle mode in presence of several windows. */ @@ -16,16 +21,17 @@ static const int showtab = showtab_auto; /* Default tab bar show mode static const Bool toptab = False; /* False means bottom tab bar */ static const char *fonts[] = { "fontawesome:size=15", "DejaVuSansMono Nerd Font Mono:size=13"} ; -static const char dmenufont[] = "monospace:size=13"; static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; +static const char col_gray2[] = "#666666"; static const char col_gray3[] = "#bbbbbb"; static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#630fe8"; +static const char col_cyan[] = "#7733ee"; +static const char col_borderbar[] = "#222222"; static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + [SchemeDis] = { col_gray2, col_gray1, col_gray2 }, }; static const char *const autostart[] = { @@ -42,6 +48,23 @@ static const char *tags[] = { "", "", "", "", "", "", "", " static int def_layouts[1 + LENGTH(tags)] = { 0, 0, 0, 0, 0, 0, 2, 0, 2, 2}; +static const char *tagsel[][2] = { + { "#d990cd", col_gray1 }, + { "#fbdf90", col_gray1 }, + { "#81d4ee", col_gray1 }, + { "#89e19c", col_gray1 }, + { "#d990cd", col_gray1 }, + { "#fbdf90", col_gray1 }, + { "#81d4ee", col_gray1 }, + { "#89e19c", col_gray1 }, + { "#d990cd", col_gray1 }, +}; + +static const unsigned int ulinepad = 5; /* horizontal padding between the underline and tag */ +static const unsigned int ulinestroke = 2; /* thickness / height of the underline */ +static const unsigned int ulinevoffset = 0; /* how far above the bottom of the bar the line should appear */ +static const int ulineall = 0; /* 1 to show underline on all tags, 0 for just the active ones */ + static const Rule rules[] = { /* xprop(1): * WM_CLASS(STRING) = instance, class @@ -90,7 +113,7 @@ static const Layout layouts[] = { /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, NULL }; static const char *termcmd[] = { "st", NULL }; #include @@ -171,7 +194,6 @@ static Button buttons[] = { /* click event mask button function argument */ { ClkLtSymbol, 0, Button1, setlayout, {0} }, { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, { ClkClientWin, MODKEY, Button1, movemouse, {0} }, { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, diff --git a/config.def.h.orig b/config.def.h.orig index cad0e5c..050e620 100755 --- a/config.def.h.orig +++ b/config.def.h.orig @@ -2,47 +2,86 @@ /* appearance */ static const unsigned int borderpx = 2; /* border pixel of windows */ -static const unsigned int gappx = 15; +static const unsigned int gappx = 10; static const unsigned int snap = 32; /* snap pixel */ static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ +static const int user_bh = 0; /* 0 means that dwm will calculate bar height, >= 1 means dwm will user_bh as bar height */ +static const int horizpadbar = 10; /* horizontal padding for statusbar */ +static const int vertpadbar = 10; /* vertical padding for statusbar */ + +/* Display modes of the tab bar: never shown, always shown, shown only in */ +/* monocle mode in presence of several windows. */ +/* Modes after showtab_nmodes are disabled */ +enum showtab_modes { showtab_never, showtab_auto, showtab_nmodes, showtab_always}; +static const int showtab = showtab_auto; /* Default tab bar show mode */ +static const Bool toptab = False; /* False means bottom tab bar */ + static const char *fonts[] = { "fontawesome:size=15", "DejaVuSansMono Nerd Font Mono:size=13"} ; -static const char dmenufont[] = "monospace:size=13"; static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; +static const char col_gray2[] = "#666666"; static const char col_gray3[] = "#bbbbbb"; static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#41008c"; +static const char col_cyan[] = "#7733ee"; +static const char col_borderbar[] = "#222222"; static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + [SchemeDis] = { col_gray2, col_gray1, col_gray2 }, }; static const char *const autostart[] = { "sh", "-c", "sh ~/scripts/xinit.sh", NULL, - "dunst", NULL, - "slstatus", NULL, NULL /* terminate */ }; /* tagging */ -static const char *tags[] = { "", "", "", "", "", "", "", "", "" }; +static const char *tags[] = { "", "", "", "", "", "", "", "", "" }; + +/* default layout per tags */ +/* The first element is for all-tag view, following i-th element corresponds to */ +/* tags[i]. Layout is referred using the layouts array index.*/ +static int def_layouts[1 + LENGTH(tags)] = { 0, 0, 0, 0, 0, 0, 2, 0, 2, 2}; + + +static const char *tagsel[][2] = { + { "#d990cd", col_gray1 }, + { "#fbdf90", col_gray1 }, + { "#81d4ee", col_gray1 }, + { "#89e19c", col_gray1 }, + { "#d990cd", col_gray1 }, + { "#fbdf90", col_gray1 }, + { "#81d4ee", col_gray1 }, + { "#89e19c", col_gray1 }, + { "#d990cd", col_gray1 }, +}; + +static const unsigned int ulinepad = 5; /* horizontal padding between the underline and tag */ +static const unsigned int ulinestroke = 2; /* thickness / height of the underline */ +static const unsigned int ulinevoffset = 0; /* how far above the bottom of the bar the line should appear */ +static const int ulineall = 0; /* 1 to show underline on all tags, 0 for just the active ones */ static const Rule rules[] = { /* xprop(1): * WM_CLASS(STRING) = instance, class * WM_NAME(STRING) = title */ - /* class instance title tags mask iscentered isfloating monitor */ - { "Gimp", NULL, NULL, 0, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, 0, -1 }, - /* class instance title tags mask iscentered isfloating isterminal noswallow monitor */ - { "Gimp", NULL, NULL, 0,0, 1, 0, 0, -1 }, - { "Firefox", NULL, NULL, 1 << 8,0, 0, 0, -1, -1 }, - { "St", NULL, NULL, 0,0, 0, 1, 0, -1 }, - { NULL, NULL, "Event Tester", 0,0, 0, 0, 1, -1 }, /* xev */ + + /* class instance title tags mask iscentered isfloating isterminal noswallow monitor */ + { "Gimp", NULL, NULL, 1 << 7, 0, 1, 0, 0, -1 }, + { "LibreWolf", NULL, NULL, 1 << 2, 0, 0, 0, -1, -1 }, + { "firefox", NULL, NULL, 1 << 2, 0, 0, 0, -1, -1 }, + { "Brave-browser", NULL, NULL, 1 << 2, 0, 0, 0, -1, -1 }, + { "St", NULL, NULL, 0, 0, 0, 1, 0, -1 }, + { "zoom", NULL, NULL, 1 << 1, 0, 0, 0, -1, -1 }, + { "cmus", NULL, NULL, 1 << 3, 0, 0, 0, -1, -1 }, + { "TelegramDesktop", NULL, NULL, 1 << 4, 0, 0, 0, -1, -1 }, + { "Discord", NULL, NULL, 1 << 4, 0, 0, 0, -1, -1 }, + { "cpsrc", NULL, NULL, 1 << 1, 0, 0, 0, -1, -1 }, + { "Emacs", NULL, NULL, 1 << 1, 0, 0, 0, -1, -1 }, + { NULL, NULL, "Event Tester", 0, 0, 0, 0, 1, -1 }, /* xev */ }; /* layout(s) */ @@ -72,73 +111,79 @@ static const Layout layouts[] = { /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, NULL }; static const char *termcmd[] = { "st", NULL }; #include static Key keys[] = { - /* modifier key function argument */ - { 0, XK_Print, spawn, SHCMD("~/scripts/screenshot.sh") }, - { 0, XF86XK_PowerOff, spawn, SHCMD("~/scripts/poweroff.sh") }, - { 0, XF86XK_AudioMute, spawn, SHCMD("pulsemixer --toggle-mute") }, - { 0, XF86XK_AudioRaiseVolume, spawn, SHCMD("amixer -c 1 sset Master 1+") }, - { 0, XF86XK_AudioLowerVolume, spawn, SHCMD("amixer -c 1 sset Master 1-") }, - { 0, XF86XK_AudioPrev, spawn, SHCMD("cmus-remote --prev") }, - { 0, XF86XK_AudioNext, spawn, SHCMD("cmus-remote --next") }, - { 0, XF86XK_AudioPause, spawn, SHCMD("cmus-remote --pause") }, - { 0, XF86XK_AudioPlay, spawn, SHCMD("cmus-remote --pause") }, - { 0, XF86XK_AudioStop, spawn, SHCMD("cmus-remote --stop") }, - { 0, XF86XK_AudioRewind, spawn, SHCMD("cmus-remote --seek -10") }, - { 0, XF86XK_AudioForward, spawn, SHCMD("cmus-remote --seek +10") }, - { 0, XF86XK_MonBrightnessUp, spawn, SHCMD("brightnessctl s +5%")}, - { 0, XF86XK_MonBrightnessDown, spawn, SHCMD("brightnessctl s 5%-")}, - { MODKEY|ShiftMask, XK_space, togglealwaysontop, {0} }, - { MODKEY, XK_w, spawn, SHCMD("firefox") }, - { MODKEY|ShiftMask, XK_l, spawn, SHCMD("slock") }, - { MODKEY|ShiftMask, XK_m, spawn, SHCMD("st ~/scripts/autostart.sh") }, - { MODKEY|ShiftMask, XK_j, spawn, SHCMD("joplin-desktop") }, - { MODKEY|ShiftMask, XK_s, spawn, SHCMD("~/scripts/screenshot.sh 1") }, - { MODKEY|ShiftMask, XK_n, spawn, SHCMD("connman-gtk") }, - { MODKEY|ShiftMask, XK_x, spawn, SHCMD("mixer.sh") }, - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, - { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - { MODKEY, XK_minus, setgaps, {.i = -5 } }, - { MODKEY, XK_equal, setgaps, {.i = +5 } }, - { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, + /* modifier key function argument */ + { 0, XK_Print, spawn, SHCMD("~/scripts/screenshot.sh") }, + { 0, XF86XK_PowerOff, spawn, SHCMD("~/scripts/poweroff.sh") }, + { 0, XF86XK_AudioMute, spawn, SHCMD("pulsemixer --toggle-mute") }, + { 0, XF86XK_AudioRaiseVolume, spawn, SHCMD("amixer set Master 1%+") }, + { 0, XF86XK_AudioLowerVolume, spawn, SHCMD("amixer set Master 1%-") }, + { 0, XF86XK_AudioPrev, spawn, SHCMD("cmus-remote --prev") }, + { 0, XF86XK_AudioNext, spawn, SHCMD("cmus-remote --next") }, + { 0, XF86XK_AudioPause, spawn, SHCMD("cmus-remote --pause") }, + { 0, XF86XK_AudioPlay, spawn, SHCMD("cmus-remote --pause") }, + { 0, XF86XK_AudioStop, spawn, SHCMD("cmus-remote --stop") }, + { 0, XF86XK_AudioRewind, spawn, SHCMD("cmus-remote --seek -10") }, + { 0, XF86XK_AudioForward, spawn, SHCMD("cmus-remote --seek +10") }, + { 0, XF86XK_MonBrightnessUp, spawn, SHCMD("brightnessctl s +5%")}, + { 0, XF86XK_MonBrightnessDown, spawn, SHCMD("brightnessctl s 5%-")}, + { ControlMask, XK_space, spawn, SHCMD("dunstctl close") }, + { ControlMask|ShiftMask, XK_space, spawn, SHCMD("dunstctl close-all") }, + { MODKEY|ShiftMask, XK_space, togglealwaysontop, {0} }, + { MODKEY, XK_w, spawn, SHCMD("firefox") }, + { MODKEY, XK_c, spawn, SHCMD("~/scripts/showcal.sh") }, + { MODKEY|ShiftMask, XK_l, spawn, SHCMD("slock.sh") }, + { MODKEY|ShiftMask, XK_e, spawn, SHCMD("emacsclient --create-frame") }, + { MODKEY|ShiftMask, XK_m, spawn, SHCMD("~/scripts/autostart.sh") }, + { MODKEY|ShiftMask, XK_j, spawn, SHCMD("screenkey.sh") }, + { MODKEY|ShiftMask, XK_s, spawn, SHCMD("~/scripts/screenshot.sh 1") }, + { MODKEY|ShiftMask, XK_n, spawn, SHCMD("~/scripts/network.sh") }, + { MODKEY|ShiftMask, XK_x, spawn, SHCMD("mixer.sh") }, + { MODKEY|ShiftMask, XK_t, spawn, SHCMD("telegram-desktop") }, + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_w, tabmode, {-1} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_Return, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, + { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_minus, setgaps, {.i = -5 } }, + { MODKEY, XK_equal, setgaps, {.i = +5 } }, + { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + TAGKEYS( XK_6, 5) + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) + { MODKEY|ShiftMask, XK_q, quit, {0} }, }; /* button definitions */ @@ -147,7 +192,6 @@ static Button buttons[] = { /* click event mask button function argument */ { ClkLtSymbol, 0, Button1, setlayout, {0} }, { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, { ClkClientWin, MODKEY, Button1, movemouse, {0} }, { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, @@ -156,5 +200,6 @@ static Button buttons[] = { { ClkTagBar, 0, Button3, toggleview, {0} }, { ClkTagBar, MODKEY, Button1, tag, {0} }, { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + { ClkTabBar, 0, Button1, focuswin, {0} }, }; diff --git a/config.def.h.rej b/config.def.h.rej index 7fd8e84..7848918 100644 --- a/config.def.h.rej +++ b/config.def.h.rej @@ -1,33 +1,11 @@ ---- config.def.h -+++ config.def.h -@@ -5,6 +5,14 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ +--- config.def.h 2019-12-10 17:24:37.944708263 +1300 ++++ config.def.h 2019-12-10 17:44:38.447670711 +1300 +@@ -5,6 +5,8 @@ static const unsigned int borderpx = 1; static const unsigned int snap = 32; /* snap pixel */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ -+ -+/* Display modes of the tab bar: never shown, always shown, shown only in */ -+/* monocle mode in presence of several windows. */ -+/* Modes after showtab_nmodes are disabled */ -+enum showtab_modes { showtab_never, showtab_auto, showtab_nmodes, showtab_always}; -+static const int showtab = showtab_auto; /* Default tab bar show mode */ -+static const Bool toptab = False; /* False means bottom tab bar */ -+ ++static const int vertpad = 10; /* vertical padding of bar */ ++static const int sidepad = 10; /* horizontal padding of bar */ static const char *fonts[] = { "monospace:size=10" }; static const char dmenufont[] = "monospace:size=10"; static const char col_gray1[] = "#222222"; -@@ -18,9 +26,15 @@ static const char *colors[SchemeLast][3] = { - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, - }; - -+ - /* tagging */ - static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -+/* default layout per tags */ -+/* The first element is for all-tag view, following i-th element corresponds to */ -+/* tags[i]. Layout is referred using the layouts array index.*/ -+static int def_layouts[1 + LENGTH(tags)] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -+ - static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class diff --git a/config.h b/config.h index cef8b49..9382511 100755 --- a/config.h +++ b/config.h @@ -7,6 +7,11 @@ static const unsigned int snap = 32; /* snap pixel */ static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ +static const int vertpad = 10; /* vertical padding of bar */ +static const int sidepad = 10; /* horizontal padding of bar */ +static const int user_bh = 0; /* 0 means that dwm will calculate bar height, >= 1 means dwm will user_bh as bar height */ +static const int horizpadbar = 10; /* horizontal padding for statusbar */ +static const int vertpadbar = 10; /* vertical padding for statusbar */ /* Display modes of the tab bar: never shown, always shown, shown only in */ /* monocle mode in presence of several windows. */ @@ -16,16 +21,17 @@ static const int showtab = showtab_auto; /* Default tab bar show mode static const Bool toptab = False; /* False means bottom tab bar */ static const char *fonts[] = { "fontawesome:size=15", "DejaVuSansMono Nerd Font Mono:size=13"} ; -static const char dmenufont[] = "monospace:size=13"; static const char col_gray1[] = "#222222"; -static const char col_gray2[] = "#444444"; +static const char col_gray2[] = "#666666"; static const char col_gray3[] = "#bbbbbb"; static const char col_gray4[] = "#eeeeee"; -static const char col_cyan[] = "#630fe8"; +static const char col_cyan[] = "#7733ee"; +static const char col_borderbar[] = "#222222"; static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, + [SchemeDis] = { col_gray2, col_gray1, col_gray2 }, }; static const char *const autostart[] = { @@ -42,6 +48,23 @@ static const char *tags[] = { "", "", "", "", "", "", "", " static int def_layouts[1 + LENGTH(tags)] = { 0, 0, 0, 0, 0, 0, 2, 0, 2, 2}; +static const char *tagsel[][2] = { + { "#d990cd", col_gray1 }, + { "#fbdf90", col_gray1 }, + { "#81d4ee", col_gray1 }, + { "#89e19c", col_gray1 }, + { "#d990cd", col_gray1 }, + { "#fbdf90", col_gray1 }, + { "#81d4ee", col_gray1 }, + { "#89e19c", col_gray1 }, + { "#d990cd", col_gray1 }, +}; + +static const unsigned int ulinepad = 5; /* horizontal padding between the underline and tag */ +static const unsigned int ulinestroke = 2; /* thickness / height of the underline */ +static const unsigned int ulinevoffset = 0; /* how far above the bottom of the bar the line should appear */ +static const int ulineall = 0; /* 1 to show underline on all tags, 0 for just the active ones */ + static const Rule rules[] = { /* xprop(1): * WM_CLASS(STRING) = instance, class @@ -90,7 +113,7 @@ static const Layout layouts[] = { /* commands */ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ -static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, NULL }; static const char *termcmd[] = { "st", NULL }; #include @@ -171,7 +194,6 @@ static Button buttons[] = { /* click event mask button function argument */ { ClkLtSymbol, 0, Button1, setlayout, {0} }, { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, { ClkClientWin, MODKEY, Button1, movemouse, {0} }, { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, diff --git a/dwm b/dwm index 3a3b257d8fb754c51cf09ec2e2d0d19408e57576..e53aa26e73dbbfeb37830bc028b5cb43acf37ad7 100755 GIT binary patch delta 27162 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 u`rb_gtagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); -+ drw_setscheme(drw, (m->tagset[m->seltags] & 1 << i ? tagscheme[i] : scheme[SchemeNorm])); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, -@@ -1568,9 +1569,14 @@ setup(void) - cursor[CurResize] = drw_cur_create(drw, XC_sizing); - cursor[CurMove] = drw_cur_create(drw, XC_fleur); - /* init appearance */ -+ if (LENGTH(tags) > LENGTH(tagsel)) -+ die("too few color schemes for the tags"); - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); - for (i = 0; i < LENGTH(colors); i++) - scheme[i] = drw_scm_create(drw, colors[i], 3); -+ tagscheme = ecalloc(LENGTH(tagsel), sizeof(Clr *)); -+ for (i = 0; i < LENGTH(tagsel); i++) -+ tagscheme[i] = drw_scm_create(drw, tagsel[i], 2); - /* init bars */ - updatebars(); - updatestatus(); diff --git a/dwm-tab-v2b-pertab-56a31dc.diff b/dwm-tab-v2b-pertab-56a31dc.diff deleted file mode 100644 index 2cb9343..0000000 --- a/dwm-tab-v2b-pertab-56a31dc.diff +++ /dev/null @@ -1,808 +0,0 @@ -diff --git a/config.def.h b/config.def.h -index fd77a07..8cc91c0 100644 ---- a/config.def.h -+++ b/config.def.h -@@ -5,6 +5,14 @@ static const unsigned int borderpx = 1; /* border pixel of windows */ - static const unsigned int snap = 32; /* snap pixel */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ -+ -+/* Display modes of the tab bar: never shown, always shown, shown only in */ -+/* monocle mode in presence of several windows. */ -+/* Modes after showtab_nmodes are disabled */ -+enum showtab_modes { showtab_never, showtab_auto, showtab_nmodes, showtab_always}; -+static const int showtab = showtab_auto; /* Default tab bar show mode */ -+static const Bool toptab = False; /* False means bottom tab bar */ -+ - static const char *fonts[] = { "monospace:size=10" }; - static const char dmenufont[] = "monospace:size=10"; - static const char col_gray1[] = "#222222"; -@@ -18,9 +26,15 @@ static const char *colors[SchemeLast][3] = { - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, - }; - -+ - /* tagging */ - static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; - -+/* default layout per tags */ -+/* The first element is for all-tag view, following i-th element corresponds to */ -+/* tags[i]. Layout is referred using the layouts array index.*/ -+static int def_layouts[1 + LENGTH(tags)] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -+ - static const Rule rules[] = { - /* xprop(1): - * WM_CLASS(STRING) = instance, class -@@ -64,6 +78,7 @@ static Key keys[] = { - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, -+ { MODKEY, XK_w, tabmode, {-1} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, -@@ -111,5 +126,6 @@ static Button buttons[] = { - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -+ { ClkTabBar, 0, Button1, focuswin, {0} }, - }; - -diff --git a/dwm.1 b/dwm.1 -index 6687011..077d92b 100644 ---- a/dwm.1 -+++ b/dwm.1 -@@ -19,14 +19,22 @@ layout applied. - Windows are grouped by tags. Each window can be tagged with one or multiple - tags. Selecting certain tags displays all windows with these tags. - .P --Each screen contains a small status bar which displays all available tags, the --layout, the title of the focused window, and the text read from the root window --name property, if the screen is focused. A floating window is indicated with an --empty square and a maximised floating window is indicated with a filled square --before the windows title. The selected tags are indicated with a different --color. The tags of the focused window are indicated with a filled square in the --top left corner. The tags which are applied to one or more windows are --indicated with an empty square in the top left corner. -+Each screen contains two small status bars. -+.P -+One bar displays all available tags, the layout, the title of the focused -+window, and the text read from the root window name property, if the screen is -+focused. A floating window is indicated with an empty square and a maximised -+floating window is indicated with a filled square before the windows title. The -+selected tags are indicated with a different color. The tags of the focused -+window are indicated with a filled square in the top left corner. The tags -+which are applied to one or more windows are indicated with an empty square in -+the top left corner. -+.P -+Another bar contains a tab for each window of the current view and allows -+navigation between windows, especially in the monocle mode. The different -+display modes of this bar are described under the Mod1\-w Keybord command -+section. When a single tag is selected, that tag is indicated in the left corner -+of the tab bar. - .P - dwm draws a small border around windows to indicate the focus state. - .SH OPTIONS -@@ -43,7 +51,8 @@ command. - .TP - .B Button1 - click on a tag label to display all windows with that tag, click on the layout --label toggles between tiled and floating layout. -+label toggles between tiled and floating layout, click on a window name in the -+tab bar brings focus to that window. - .TP - .B Button3 - click on a tag label adds/removes all windows with that tag to/from the view. -@@ -104,6 +113,12 @@ Increase master area size. - .B Mod1\-h - Decrease master area size. - .TP -+.B Mod1\-w -+Cycle over the tab bar display modes: never displayed, always displayed, -+displayed only in monocle mode when the view contains than one window (auto -+mode). Some display modes can be disabled in the configuration, config.h. In -+the default configuration only "never" and "auto" display modes are enabled. -+.TP - .B Mod1\-Return - Zooms/cycles focused window to/from master area (tiled layouts only). - .TP -diff --git a/dwm.c b/dwm.c -index b2bc9bd..0c34020 100644 ---- a/dwm.c -+++ b/dwm.c -@@ -65,7 +65,7 @@ enum { NetSupported, NetWMName, NetWMState, - NetWMFullscreen, NetActiveWindow, NetWMWindowType, - NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ - enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ --enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, -+enum { ClkTagBar, ClkTabBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, - ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ - - typedef union { -@@ -112,25 +112,35 @@ typedef struct { - void (*arrange)(Monitor *); - } Layout; - -+#define MAXTABS 50 -+ -+typedef struct Pertag Pertag; - struct Monitor { - char ltsymbol[16]; - float mfact; - int nmaster; - int num; - int by; /* bar geometry */ -+ int ty; /* tab bar geometry */ - int mx, my, mw, mh; /* screen size */ - int wx, wy, ww, wh; /* window area */ - unsigned int seltags; - unsigned int sellt; - unsigned int tagset[2]; - int showbar; -+ int showtab; - int topbar; -+ int toptab; - Client *clients; - Client *sel; - Client *stack; - Monitor *next; - Window barwin; -+ Window tabwin; -+ int ntabs; -+ int tab_widths[MAXTABS]; - const Layout *lt[2]; -+ Pertag *pertag; - }; - - typedef struct { -@@ -165,12 +175,15 @@ static void detachstack(Client *c); - static Monitor *dirtomon(int dir); - static void drawbar(Monitor *m); - static void drawbars(void); -+static void drawtab(Monitor *m); -+static void drawtabs(void); - static void enternotify(XEvent *e); - static void expose(XEvent *e); - static void focus(Client *c); - static void focusin(XEvent *e); - static void focusmon(const Arg *arg); - static void focusstack(const Arg *arg); -+static void focuswin(const Arg* arg); - static int getrootptr(int *x, int *y); - static long getstate(Window w); - static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -@@ -207,6 +220,7 @@ static void setup(void); - static void showhide(Client *c); - static void sigchld(int unused); - static void spawn(const Arg *arg); -+static void tabmode(const Arg *arg); - static void tag(const Arg *arg); - static void tagmon(const Arg *arg); - static void tile(Monitor *); -@@ -241,6 +255,7 @@ static char stext[256]; - static int screen; - static int sw, sh; /* X display screen geometry width, height */ - static int bh, blw = 0; /* bar geometry */ -+static int th = 0; /* tab bar geometry */ - static int lrpad; /* sum of left and right padding for text */ - static int (*xerrorxlib)(Display *, XErrorEvent *); - static unsigned int numlockmask = 0; -@@ -272,6 +287,16 @@ static Window root; - /* configuration, allows nested code to access above variables */ - #include "config.h" - -+struct Pertag { -+ unsigned int curtag, prevtag; /* current and previous tag */ -+ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */ -+ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */ -+ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */ -+ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */ -+ Bool showbars[LENGTH(tags) + 1]; /* display bar for the current tag */ -+ Client *prevzooms[LENGTH(tags) + 1]; /* store zoom information */ -+}; -+ - /* compile-time check if all tags fit into an unsigned int bit array. */ - struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; - -@@ -395,6 +420,8 @@ arrange(Monitor *m) - void - arrangemon(Monitor *m) - { -+ updatebarpos(m); -+ XMoveResizeWindow(dpy, m->tabwin, m->wx, m->ty, m->ww, th); - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); - if (m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); -@@ -444,14 +471,33 @@ buttonpress(XEvent *e) - click = ClkStatusText; - else - click = ClkWinTitle; -- } else if ((c = wintoclient(ev->window))) { -+ } -+ if(ev->window == selmon->tabwin) { -+ i = 0; x = 0; -+ for(c = selmon->clients; c; c = c->next){ -+ if(!ISVISIBLE(c)) continue; -+ x += selmon->tab_widths[i]; -+ if (ev->x > x) -+ ++i; -+ else -+ break; -+ if(i >= m->ntabs) break; -+ } -+ if(c) { -+ click = ClkTabBar; -+ arg.ui = i; -+ } -+ } -+ else if((c = wintoclient(ev->window))) { - focus(c); - click = ClkClientWin; - } -- for (i = 0; i < LENGTH(buttons); i++) -- if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button -- && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) -- buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); -+ for(i = 0; i < LENGTH(buttons); i++) -+ if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button -+ && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)){ -+ buttons[i].func(((click == ClkTagBar || click == ClkTabBar) -+ && buttons[i].arg.i == 0) ? &arg : &buttons[i].arg); -+ } - } - - void -@@ -476,8 +522,8 @@ cleanup(void) - view(&a); - selmon->lt[selmon->sellt] = &foo; - for (m = mons; m; m = m->next) -- while (m->stack) -- unmanage(m->stack, 0); -+ while(m->stack) -+ unmanage(m->stack, False); - XUngrabKey(dpy, AnyKey, AnyModifier, root); - while (mons) - cleanupmon(mons); -@@ -504,6 +550,8 @@ cleanupmon(Monitor *mon) - } - XUnmapWindow(dpy, mon->barwin); - XDestroyWindow(dpy, mon->barwin); -+ XUnmapWindow(dpy, mon->tabwin); -+ XDestroyWindow(dpy, mon->tabwin); - free(mon); - } - -@@ -525,6 +573,7 @@ clientmessage(XEvent *e) - { - XClientMessageEvent *cme = &e->xclient; - Client *c = wintoclient(cme->window); -+ int i; - - if (!c) - return; -@@ -536,6 +585,8 @@ clientmessage(XEvent *e) - if (!ISVISIBLE(c)) { - c->mon->seltags ^= 1; - c->mon->tagset[c->mon->seltags] = c->tags; -+ for(i=0; !(c->tags & 1 << i); i++); -+ view(&(Arg){.ui = 1 << i}); - } - pop(c); - } -@@ -564,11 +615,10 @@ void - configurenotify(XEvent *e) - { - Monitor *m; -- Client *c; - XConfigureEvent *ev = &e->xconfigure; - int dirty; - -- /* TODO: updategeom handling sucks, needs to be simplified */ -+ // TODO: updategeom handling sucks, needs to be simplified - if (ev->window == root) { - dirty = (sw != ev->width || sh != ev->height); - sw = ev->width; -@@ -576,10 +626,9 @@ configurenotify(XEvent *e) - if (updategeom() || dirty) { - drw_resize(drw, sw, bh); - updatebars(); -- for (m = mons; m; m = m->next) { -- for (c = m->clients; c; c = c->next) -- if (c->isfullscreen) -- resizeclient(c, m->mx, m->my, m->mw, m->mh); -+ //refreshing display of status bar. The tab bar is handled by the arrange() -+ //method, which is called below -+ for (m = mons; m; m = m->next){ - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - } - focus(NULL); -@@ -644,16 +693,41 @@ Monitor * - createmon(void) - { - Monitor *m; -+ int i; - - m = ecalloc(1, sizeof(Monitor)); - m->tagset[0] = m->tagset[1] = 1; - m->mfact = mfact; - m->nmaster = nmaster; - m->showbar = showbar; -+ m->showtab = showtab; - m->topbar = topbar; -- m->lt[0] = &layouts[0]; -+ m->toptab = toptab; -+ m->ntabs = 0; -+ m->lt[0] = &layouts[def_layouts[1] % LENGTH(layouts)]; - m->lt[1] = &layouts[1 % LENGTH(layouts)]; - strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); -+ if(!(m->pertag = (Pertag *)calloc(1, sizeof(Pertag)))) -+ die("fatal: could not malloc() %u bytes\n", sizeof(Pertag)); -+ m->pertag->curtag = m->pertag->prevtag = 1; -+ for(i=0; i <= LENGTH(tags); i++) { -+ /* init nmaster */ -+ m->pertag->nmasters[i] = m->nmaster; -+ -+ /* init mfacts */ -+ m->pertag->mfacts[i] = m->mfact; -+ -+ /* init layouts */ -+ m->pertag->ltidxs[i][0] = &layouts[def_layouts[i % LENGTH(def_layouts)] % LENGTH(layouts)]; -+ m->pertag->ltidxs[i][1] = m->lt[1]; -+ m->pertag->sellts[i] = m->sellt; -+ -+ /* init showbar */ -+ m->pertag->showbars[i] = m->showbar; -+ -+ /* swap focus and zoomswap*/ -+ m->pertag->prevzooms[i] = NULL; -+ } - return m; - } - -@@ -765,6 +839,104 @@ drawbars(void) - } - - void -+drawtabs(void) { -+ Monitor *m; -+ -+ for(m = mons; m; m = m->next) -+ drawtab(m); -+} -+ -+static int -+cmpint(const void *p1, const void *p2) { -+ /* The actual arguments to this function are "pointers to -+ pointers to char", but strcmp(3) arguments are "pointers -+ to char", hence the following cast plus dereference */ -+ return *((int*) p1) > * (int*) p2; -+} -+ -+ -+void -+drawtab(Monitor *m) { -+ Client *c; -+ int i; -+ int itag = -1; -+ char view_info[50]; -+ int view_info_w = 0; -+ int sorted_label_widths[MAXTABS]; -+ int tot_width; -+ int maxsize = bh; -+ int x = 0; -+ int w = 0; -+ -+ //view_info: indicate the tag which is displayed in the view -+ for(i = 0; i < LENGTH(tags); ++i){ -+ if((selmon->tagset[selmon->seltags] >> i) & 1) { -+ if(itag >=0){ //more than one tag selected -+ itag = -1; -+ break; -+ } -+ itag = i; -+ } -+ } -+ if(0 <= itag && itag < LENGTH(tags)){ -+ snprintf(view_info, sizeof view_info, "[%s]", tags[itag]); -+ } else { -+ strncpy(view_info, "[...]", sizeof view_info); -+ } -+ view_info[sizeof(view_info) - 1 ] = 0; -+ view_info_w = TEXTW(view_info); -+ tot_width = view_info_w; -+ -+ /* Calculates number of labels and their width */ -+ m->ntabs = 0; -+ for(c = m->clients; c; c = c->next){ -+ if(!ISVISIBLE(c)) continue; -+ m->tab_widths[m->ntabs] = TEXTW(c->name); -+ tot_width += m->tab_widths[m->ntabs]; -+ ++m->ntabs; -+ if(m->ntabs >= MAXTABS) break; -+ } -+ -+ if(tot_width > m->ww){ //not enough space to display the labels, they need to be truncated -+ memcpy(sorted_label_widths, m->tab_widths, sizeof(int) * m->ntabs); -+ qsort(sorted_label_widths, m->ntabs, sizeof(int), cmpint); -+ tot_width = view_info_w; -+ for(i = 0; i < m->ntabs; ++i){ -+ if(tot_width + (m->ntabs - i) * sorted_label_widths[i] > m->ww) -+ break; -+ tot_width += sorted_label_widths[i]; -+ } -+ maxsize = (m->ww - tot_width) / (m->ntabs - i); -+ } else{ -+ maxsize = m->ww; -+ } -+ i = 0; -+ for(c = m->clients; c; c = c->next){ -+ if(!ISVISIBLE(c)) continue; -+ if(i >= m->ntabs) break; -+ if(m->tab_widths[i] > maxsize) m->tab_widths[i] = maxsize; -+ w = m->tab_widths[i]; -+ drw_setscheme(drw, (c == m->sel) ? scheme[SchemeSel] : scheme[SchemeNorm]); -+ drw_text(drw, x, 0, w, th, lrpad / 2, c->name, 0); -+ x += w; -+ ++i; -+ } -+ -+ drw_setscheme(drw, scheme[SchemeNorm]); -+ -+ /* cleans interspace between window names and current viewed tag label */ -+ w = m->ww - view_info_w - x; -+ drw_text(drw, x, 0, w, th, lrpad / 2, "", 0); -+ -+ /* view info */ -+ x += w; -+ w = view_info_w; -+ drw_text(drw, x, 0, w, th, lrpad / 2, view_info, 0); -+ -+ drw_map(drw, m->tabwin, 0, 0, m->ww, th); -+} -+ -+void - enternotify(XEvent *e) - { - Client *c; -@@ -789,8 +961,10 @@ expose(XEvent *e) - Monitor *m; - XExposeEvent *ev = &e->xexpose; - -- if (ev->count == 0 && (m = wintomon(ev->window))) -+ if (ev->count == 0 && (m = wintomon(ev->window))){ - drawbar(m); -+ drawtab(m); -+ } - } - - void -@@ -817,6 +991,7 @@ focus(Client *c) - } - selmon->sel = c; - drawbars(); -+ drawtabs(); - } - - /* there are some broken focus acquiring clients */ -@@ -870,6 +1045,19 @@ focusstack(const Arg *arg) - } - } - -+void -+focuswin(const Arg* arg){ -+ int iwin = arg->i; -+ Client* c = NULL; -+ for(c = selmon->clients; c && (iwin || !ISVISIBLE(c)) ; c = c->next){ -+ if(ISVISIBLE(c)) --iwin; -+ }; -+ if(c) { -+ focus(c); -+ restack(selmon); -+ } -+} -+ - Atom - getatomprop(Client *c, Atom prop) - { -@@ -983,7 +1171,7 @@ grabkeys(void) - void - incnmaster(const Arg *arg) - { -- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0); - arrange(selmon); - } - -@@ -1142,7 +1330,7 @@ motionnotify(XEvent *e) - if (ev->window != root) - return; - if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { -- unfocus(selmon->sel, 1); -+ unfocus(selmon->sel, True); - selmon = m; - focus(NULL); - } -@@ -1162,11 +1350,13 @@ movemouse(const Arg *arg) - return; - if (c->isfullscreen) /* no support moving fullscreen windows by mouse */ - return; -+ if(c->isfullscreen) /* no support moving fullscreen windows by mouse */ -+ return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, -- None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) -+ None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess) - return; - if (!getrootptr(&x, &y)) - return; -@@ -1253,12 +1443,14 @@ propertynotify(XEvent *e) - case XA_WM_HINTS: - updatewmhints(c); - drawbars(); -+ drawtabs(); - break; - } - if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { - updatetitle(c); - if (c == c->mon->sel) - drawbar(c->mon); -+ drawtab(c->mon); - } - if (ev->atom == netatom[NetWMWindowType]) - updatewindowtype(c); -@@ -1320,11 +1512,13 @@ resizemouse(const Arg *arg) - return; - if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */ - return; -+ if(c->isfullscreen) /* no support resizing fullscreen windows by mouse */ -+ return; - restack(selmon); - ocx = c->x; - ocy = c->y; - if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, -- None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) -+ None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess) - return; - XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); - do { -@@ -1372,6 +1566,7 @@ restack(Monitor *m) - XWindowChanges wc; - - drawbar(m); -+ drawtab(m); - if (!m->sel) - return; - if (m->sel->isfloating || !m->lt[m->sellt]->arrange) -@@ -1480,11 +1675,11 @@ sendevent(Client *c, Atom proto) - void - setfocus(Client *c) - { -- if (!c->neverfocus) { -+ if(!c->neverfocus) { - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XChangeProperty(dpy, root, netatom[NetActiveWindow], -- XA_WINDOW, 32, PropModeReplace, -- (unsigned char *) &(c->win), 1); -+ XA_WINDOW, 32, PropModeReplace, -+ (unsigned char *) &(c->win), 1); - } - sendevent(c, wmatom[WMTakeFocus]); - } -@@ -1520,10 +1715,13 @@ setfullscreen(Client *c, int fullscreen) - void - setlayout(const Arg *arg) - { -- if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) -- selmon->sellt ^= 1; -- if (arg && arg->v) -- selmon->lt[selmon->sellt] = (Layout *)arg->v; -+ if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) { -+ selmon->pertag->sellts[selmon->pertag->curtag] ^= 1; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; -+ } -+ if(arg && arg->v) -+ selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); - if (selmon->sel) - arrange(selmon); -@@ -1542,7 +1740,7 @@ setmfact(const Arg *arg) - f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; - if (f < 0.1 || f > 0.9) - return; -- selmon->mfact = f; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f; - arrange(selmon); - } - -@@ -1564,6 +1762,7 @@ setup(void) - die("no fonts could be loaded.\n"); - lrpad = drw->fonts->h; - bh = drw->fonts->h + 2; -+ th = bh; - updategeom(); - /* init atoms */ - wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); -@@ -1631,10 +1830,10 @@ sigchld(int unused) - void - spawn(const Arg *arg) - { -- if (arg->v == dmenucmd) -+ if(arg->v == dmenucmd) - dmenumon[0] = '0' + selmon->num; -- if (fork() == 0) { -- if (dpy) -+ if(fork() == 0) { -+ if(dpy) - close(ConnectionNumber(dpy)); - setsid(); - execvp(((char **)arg->v)[0], (char **)arg->v); -@@ -1691,18 +1890,29 @@ tile(Monitor *m) - void - togglebar(const Arg *arg) - { -- selmon->showbar = !selmon->showbar; -+ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; - updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(selmon); - } - - void -+tabmode(const Arg *arg) -+{ -+ if(arg && arg->i >= 0) -+ selmon->showtab = arg->ui % showtab_nmodes; -+ else -+ selmon->showtab = (selmon->showtab + 1 ) % showtab_nmodes; -+ arrange(selmon); -+} -+ -+ -+void - togglefloating(const Arg *arg) - { -- if (!selmon->sel) -+ if(!selmon->sel) - return; -- if (selmon->sel->isfullscreen) /* no support for fullscreen windows */ -+ if(selmon->sel->isfullscreen) /* no support for fullscreen windows */ - return; - selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; - if (selmon->sel->isfloating) -@@ -1730,9 +1940,29 @@ void - toggleview(const Arg *arg) - { - unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); -+ int i; - - if (newtagset) { -+ if(newtagset == ~0) { -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ selmon->pertag->curtag = 0; -+ } -+ /* test if the user did not select the same tag */ -+ if(!(newtagset & 1 << (selmon->pertag->curtag - 1))) { -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ for (i=0; !(newtagset & 1 << i); i++) ; -+ selmon->pertag->curtag = i + 1; -+ } - selmon->tagset[selmon->seltags] = newtagset; -+ -+ /* apply settings for this view */ -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; -+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; -+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) -+ togglebar(NULL); - focus(NULL); - arrange(selmon); - } -@@ -1808,20 +2038,44 @@ updatebars(void) - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); - XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); - XMapRaised(dpy, m->barwin); -+ m->tabwin = XCreateWindow(dpy, root, m->wx, m->ty, m->ww, th, 0, DefaultDepth(dpy, screen), -+ CopyFromParent, DefaultVisual(dpy, screen), -+ CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); -+ XDefineCursor(dpy, m->tabwin, cursor[CurNormal]->cursor); -+ XMapRaised(dpy, m->tabwin); - } - } - - void - updatebarpos(Monitor *m) - { -+ Client *c; -+ int nvis = 0; -+ - m->wy = m->my; - m->wh = m->mh; - if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; -- m->wy = m->topbar ? m->wy + bh : m->wy; -- } else -+ if ( m->topbar ) -+ m->wy += bh; -+ } else { - m->by = -bh; -+ } -+ -+ for(c = m->clients; c; c = c->next){ -+ if(ISVISIBLE(c)) ++nvis; -+ } -+ -+ if(m->showtab == showtab_always -+ || ((m->showtab == showtab_auto) && (nvis > 1) && (m->lt[m->sellt]->arrange == monocle))){ -+ m->wh -= th; -+ m->ty = m->toptab ? m->wy : m->wy + m->wh; -+ if ( m->toptab ) -+ m->wy += th; -+ } else { -+ m->ty = -th; -+ } - } - - void -@@ -2003,9 +2257,9 @@ updatewindowtype(Client *c) - Atom wtype = getatomprop(c, netatom[NetWMWindowType]); - - if (state == netatom[NetWMFullscreen]) -- setfullscreen(c, 1); -+ setfullscreen(c, True); - if (wtype == netatom[NetWMWindowTypeDialog]) -- c->isfloating = 1; -+ c->isfloating = True; - } - - void -@@ -2030,11 +2284,33 @@ updatewmhints(Client *c) - void - view(const Arg *arg) - { -- if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) -+ int i; -+ unsigned int tmptag; -+ -+ if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) - return; - selmon->seltags ^= 1; /* toggle sel tagset */ -- if (arg->ui & TAGMASK) -+ if(arg->ui & TAGMASK) { -+ selmon->pertag->prevtag = selmon->pertag->curtag; - selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; -+ if(arg->ui == ~0) -+ selmon->pertag->curtag = 0; -+ else { -+ for (i=0; !(arg->ui & 1 << i); i++) ; -+ selmon->pertag->curtag = i + 1; -+ } -+ } else { -+ tmptag = selmon->pertag->prevtag; -+ selmon->pertag->prevtag = selmon->pertag->curtag; -+ selmon->pertag->curtag = tmptag; -+ } -+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag]; -+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag]; -+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag]; -+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt]; -+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1]; -+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag]) -+ togglebar(NULL); - focus(NULL); - arrange(selmon); - } -@@ -2062,7 +2338,7 @@ wintomon(Window w) - if (w == root && getrootptr(&x, &y)) - return recttomon(x, y, 1, 1); - for (m = mons; m; m = m->next) -- if (w == m->barwin) -+ if(w == m->barwin || w == m->tabwin) - return m; - if ((c = wintoclient(w))) - return c->mon; diff --git a/dwm.1.orig b/dwm.1.orig deleted file mode 100755 index 13b3729..0000000 --- a/dwm.1.orig +++ /dev/null @@ -1,176 +0,0 @@ -.TH DWM 1 dwm\-VERSION -.SH NAME -dwm \- dynamic window manager -.SH SYNOPSIS -.B dwm -.RB [ \-v ] -.SH DESCRIPTION -dwm is a dynamic window manager for X. It manages windows in tiled, monocle -and floating layouts. Either layout can be applied dynamically, optimising the -environment for the application in use and the task performed. -.P -In tiled layouts windows are managed in a master and stacking area. The master -area on the left contains one window by default, and the stacking area on the -right contains all other windows. The number of master area windows can be -adjusted from zero to an arbitrary number. In monocle layout all windows are -maximised to the screen size. In floating layout windows can be resized and -moved freely. Dialog windows are always managed floating, regardless of the -layout applied. -.P -Windows are grouped by tags. Each window can be tagged with one or multiple -tags. Selecting certain tags displays all windows with these tags. -.P -Each screen contains a small status bar which displays all available tags, the -layout, the title of the focused window, and the text read from the root window -name property, if the screen is focused. A floating window is indicated with an -empty square and a maximised floating window is indicated with a filled square -before the windows title. The selected tags are indicated with a different -color. The tags of the focused window are indicated with a filled square in the -top left corner. The tags which are applied to one or more windows are -indicated with an empty square in the top left corner. -.P -dwm draws a small border around windows to indicate the focus state. -.SH OPTIONS -.TP -.B \-v -prints version information to standard output, then exits. -.SH USAGE -.SS Status bar -.TP -.B X root window name -is read and displayed in the status text area. It can be set with the -.BR xsetroot (1) -command. -.TP -.B Button1 -click on a tag label to display all windows with that tag, click on the layout -label toggles between tiled and floating layout. -.TP -.B Button3 -click on a tag label adds/removes all windows with that tag to/from the view. -.TP -.B Mod1\-Button1 -click on a tag label applies that tag to the focused window. -.TP -.B Mod1\-Button3 -click on a tag label adds/removes that tag to/from the focused window. -.SS Keyboard commands -.TP -.B Mod1\-Shift\-Return -Start -.BR st(1). -.TP -.B Mod1\-p -Spawn -.BR dmenu(1) -for launching other programs. -.TP -.B Mod1\-, -Focus previous screen, if any. -.TP -.B Mod1\-. -Focus next screen, if any. -.TP -.B Mod1\-Shift\-, -Send focused window to previous screen, if any. -.TP -.B Mod1\-Shift\-. -Send focused window to next screen, if any. -.TP -.B Mod1\-b -Toggles bar on and off. -.TP -.B Mod1\-t -Sets tiled layout. -.TP -.B Mod1\-f -Sets floating layout. -.TP -.B Mod1\-m -Sets monocle layout. -.TP -.B Mod1\-space -Toggles between current and previous layout. -.TP -.B Mod1\-j -Focus next window. -.TP -.B Mod1\-k -Focus previous window. -.TP -.B Mod1\-i -Increase number of windows in master area. -.TP -.B Mod1\-d -Decrease number of windows in master area. -.TP -.B Mod1\-l -Increase master area size. -.TP -.B Mod1\-h -Decrease master area size. -.TP -.B Mod1\-Return -Zooms/cycles focused window to/from master area (tiled layouts only). -.TP -.B Mod1\-Shift\-c -Close focused window. -.TP -.B Mod1\-Shift\-space -Toggle focused window between tiled and floating state. -.TP -.B Mod1\-Tab -Toggles to the previously selected tags. -.TP -.B Mod1\-Shift\-[1..n] -Apply nth tag to focused window. -.TP -.B Mod1\-Shift\-0 -Apply all tags to focused window. -.TP -.B Mod1\-Control\-Shift\-[1..n] -Add/remove nth tag to/from focused window. -.TP -.B Mod1\-[1..n] -View all windows with nth tag. -.TP -.B Mod1\-0 -View all windows with any tag. -.TP -.B Mod1\-Control\-[1..n] -Add/remove all windows with nth tag to/from the view. -.TP -.B Mod1\-Shift\-q -Quit dwm. -.SS Mouse commands -.TP -.B Mod1\-Button1 -Move focused window while dragging. Tiled windows will be toggled to the floating state. -.TP -.B Mod1\-Button2 -Toggles focused window between floating and tiled state. -.TP -.B Mod1\-Button3 -Resize focused window while dragging. Tiled windows will be toggled to the floating state. -.SH CUSTOMIZATION -dwm is customized by creating a custom config.h and (re)compiling the source -code. This keeps it fast, secure and simple. -.SH SEE ALSO -.BR dmenu (1), -.BR st (1) -.SH ISSUES -Java applications which use the XToolkit/XAWT backend may draw grey windows -only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early -JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds -are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the -environment variable -.BR AWT_TOOLKIT=MToolkit -(to use the older Motif backend instead) or running -.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D -or -.B wmname LG3D -(to pretend that a non-reparenting window manager is running that the -XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable -.BR _JAVA_AWT_WM_NONREPARENTING=1 . -.SH BUGS -Send all bug reports with a patch to hackers@suckless.org. diff --git a/dwm.c b/dwm.c index 787a323..f8e9b4b 100755 --- a/dwm.c +++ b/dwm.c @@ -65,12 +65,12 @@ /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ +enum { SchemeNorm, SchemeSel, SchemeDis}; /* color schemes */ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkTabBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, +enum { ClkTagBar, ClkTabBar, ClkLtSymbol, ClkStatusText, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ typedef union { @@ -280,6 +280,8 @@ static int sw, sh; /* X display screen geometry width, height */ static int bh, blw = 0; /* bar geometry */ static int th = 0; /* tab bar geometry */ static int lrpad; /* sum of left and right padding for text */ +static int vp; /* vertical padding for bar */ +static int sp; /* side padding for bar */ static int (*xerrorxlib)(Display *, XErrorEvent *); static unsigned int numlockmask = 0; static void (*handler[LASTEvent]) (XEvent *) = { @@ -301,7 +303,8 @@ static void (*handler[LASTEvent]) (XEvent *) = { static Atom wmatom[WMLast], netatom[NetLast]; static int running = 1; static Cur *cursor[CurLast]; -static Clr **scheme; +static Clr **scheme, clrborder; +static Clr **tagscheme; static Display *dpy; static Drw *drw; static Monitor *mons, *selmon; @@ -571,10 +574,8 @@ buttonpress(XEvent *e) arg.ui = 1 << i; } else if (ev->x < x + blw) click = ClkLtSymbol; - else if (ev->x > selmon->ww - TEXTW(stext)) - click = ClkStatusText; else - click = ClkWinTitle; + click = ClkStatusText; } if(ev->window == selmon->tabwin) { i = 0; x = 0; @@ -719,7 +720,7 @@ configurenotify(XEvent *e) //refreshing display of status bar. The tab bar is handled by the arrange() //method, which is called below for (m = mons; m; m = m->next){ - XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); + XMoveResizeWindow(dpy, m->barwin, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh); } focus(NULL); arrange(NULL); @@ -911,14 +912,14 @@ drawstatusbar(Monitor *m, int bh, char* stext) { isCode = 0; text = p; - w += 2; /* 1px padding on both sides */ - ret = x = m->ww - w; + w += horizpadbar; + ret = x = m->ww - borderpx - w - 2 * sp; drw_setscheme(drw, scheme[LENGTH(colors)]); drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; - drw_rect(drw, x, 0, w, bh, 1, 1); - x++; + drw_rect(drw, x, borderpx, w - 2 * sp, bh, 1, 1); + x += horizpadbar / 2; /* process status text */ i = -1; @@ -928,7 +929,7 @@ drawstatusbar(Monitor *m, int bh, char* stext) { text[i] = '\0'; w = TEXTW(text) - lrpad; - drw_text(drw, x, 0, w, bh, 0, text, 0); + drw_text(drw, x, borderpx + vertpadbar / 2, w, bh - vertpadbar, 0, text, 0); x += w; @@ -958,7 +959,7 @@ drawstatusbar(Monitor *m, int bh, char* stext) { while (text[++i] != ','); int rh = atoi(text + ++i); - drw_rect(drw, rx + x, ry, rw, rh, 1, 0); + drw_rect(drw, rx + x, ry + borderpx + vertpadbar / 2, rw, rh, 1, 0); } else if (text[i] == 'f') { x += atoi(text + ++i); } @@ -972,7 +973,7 @@ drawstatusbar(Monitor *m, int bh, char* stext) { if (!isCode) { w = TEXTW(text) - lrpad; - drw_text(drw, x, 0, w, bh, 0, text, 0); + drw_text(drw, x, borderpx + vertpadbar / 2, w, bh - vertpadbar, 0, text, 0); } drw_setscheme(drw, scheme[SchemeNorm]); @@ -984,15 +985,20 @@ drawstatusbar(Monitor *m, int bh, char* stext) { void drawbar(Monitor *m) { - int x, w, sw = 0; + int x, y = borderpx, w, sw = 0, stw = 0; + int th = bh - borderpx * 2; + int mw = m->ww - borderpx * 2; int boxs = drw->fonts->h / 9; int boxw = drw->fonts->h / 6 + 2; unsigned int i, occ = 0, urg = 0; Client *c; + XSetForeground(drw->dpy, drw->gc, clrborder.pixel); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, 0, 0, m->ww, bh); + /* draw status first so it can be overdrawn by tags later */ if (m == selmon) { /* status is only drawn on selected monitor */ - sw = m->ww - drawstatusbar(m, bh, stext); + sw = mw - drawstatusbar(m, th, stext); } for (c = m->clients; c; c = c->next) { @@ -1000,34 +1006,22 @@ drawbar(Monitor *m) if (c->isurgent) urg |= c->tags; } - x = 0; + x = borderpx; for (i = 0; i < LENGTH(tags); i++) { w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); + drw_setscheme(drw, (m->tagset[m->seltags] & 1 << i ? tagscheme[i] : (occ & 1 << i ? tagscheme[i] : scheme[SchemeDis]))); + drw_text(drw, x, y, w, th, lrpad / 2, tags[i], urg & 1 << i); + if (ulineall || m->tagset[m->seltags] & 1 << i) /* if there are conflicts, just move these lines directly underneath both 'drw_setscheme' and 'drw_text' :) */ + drw_rect(drw, x + ulinepad, th - ulinestroke - ulinevoffset, w - (ulinepad * 2), ulinestroke, 1, 0); x += w; } w = blw = TEXTW(m->ltsymbol); drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - sw - x) > bh) { - if (m->sel) { - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); - if (m->sel->isfloating) { - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); - if (m->sel->isalwaysontop) - drw_rect(drw, x + boxs, bh - boxw, boxw, boxw, 0, 0); - } - } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } + x = drw_text(drw, x, y, w, th, lrpad / 2, m->ltsymbol, 0); + + if ((w = mw - sw - stw - x) > th) { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x, y, w - 2 * sp, th, 1, 1); } drw_map(drw, m->barwin, 0, 0, m->ww, bh); } @@ -1650,8 +1644,6 @@ propertynotify(XEvent *e) } if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { updatetitle(c); - if (c == c->mon->sel) - drawbar(c->mon); drawtab(c->mon); } if (ev->atom == netatom[NetWMWindowType]) @@ -1994,9 +1986,12 @@ setup(void) if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) die("no fonts could be loaded."); lrpad = drw->fonts->h; - bh = drw->fonts->h + 2; + bh = user_bh ? user_bh : drw->fonts->h + 2 + vertpadbar + borderpx * 2; th = bh; updategeom(); + sp = sidepad; + vp = (topbar == 1) ? vertpad : - vertpad; + /* init atoms */ utf8string = XInternAtom(dpy, "UTF8_STRING", False); wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); @@ -2017,13 +2012,20 @@ setup(void) cursor[CurResize] = drw_cur_create(drw, XC_sizing); cursor[CurMove] = drw_cur_create(drw, XC_fleur); /* init appearance */ + if (LENGTH(tags) > LENGTH(tagsel)) + die("too few color schemes for the tags"); scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *)); scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3); for (i = 0; i < LENGTH(colors); i++) scheme[i] = drw_scm_create(drw, colors[i], 3); + drw_clr_create(drw, &clrborder, col_borderbar); + tagscheme = ecalloc(LENGTH(tagsel), sizeof(Clr *)); + for (i = 0; i < LENGTH(tagsel); i++) + tagscheme[i] = drw_scm_create(drw, tagsel[i], 2); /* init bars */ updatebars(); updatestatus(); + updatebarpos(selmon); /* supporting window for NetWMCheck */ wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32, @@ -2168,7 +2170,7 @@ togglebar(const Arg *arg) { selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar; updatebarpos(selmon); - XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx + sp, selmon->by + vp, selmon->ww - 2 * sp, bh); arrange(selmon); } @@ -2352,7 +2354,7 @@ updatebars(void) for (m = mons; m; m = m->next) { if (m->barwin) continue; - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), + m->barwin = XCreateWindow(dpy, root, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); @@ -2375,12 +2377,12 @@ updatebarpos(Monitor *m) m->wy = m->my; m->wh = m->mh; if (m->showbar) { - m->wh -= bh; - m->by = m->topbar ? m->wy : m->wy + m->wh; + m->wh = m->wh - vertpad - bh; + m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad; if ( m->topbar ) - m->wy += bh; + m->wy += bh + vp; } else { - m->by = -bh; + m->by = -bh - vp; } for(c = m->clients; c; c = c->next){ diff --git a/dwm.c.orig b/dwm.c.orig index b698bd1..6f7f886 100755 --- a/dwm.c.orig +++ b/dwm.c.orig @@ -65,12 +65,12 @@ /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -enum { SchemeNorm, SchemeSel }; /* color schemes */ +enum { SchemeNorm, SchemeSel, SchemeDis}; /* color schemes */ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, NetWMFullscreen, NetActiveWindow, NetWMWindowType, NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -enum { ClkTagBar, ClkTabBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, +enum { ClkTagBar, ClkTabBar, ClkLtSymbol, ClkStatusText, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ typedef union { @@ -185,6 +185,7 @@ static void detachstack(Client *c); static Monitor *dirtomon(int dir); static void drawbar(Monitor *m); static void drawbars(void); +static int drawstatusbar(Monitor *m, int bh, char* text); static void drawtab(Monitor *m); static void drawtabs(void); static void enternotify(XEvent *e); @@ -273,7 +274,7 @@ static pid_t winpid(Window w); /* variables */ static const char broken[] = "broken"; -static char stext[256]; +static char stext[1024]; static int screen; static int sw, sh; /* X display screen geometry width, height */ static int bh, blw = 0; /* bar geometry */ @@ -300,7 +301,8 @@ static void (*handler[LASTEvent]) (XEvent *) = { static Atom wmatom[WMLast], netatom[NetLast]; static int running = 1; static Cur *cursor[CurLast]; -static Clr **scheme; +static Clr **scheme, clrborder; +static Clr **tagscheme; static Display *dpy; static Drw *drw; static Monitor *mons, *selmon; @@ -570,10 +572,8 @@ buttonpress(XEvent *e) arg.ui = 1 << i; } else if (ev->x < x + blw) click = ClkLtSymbol; - else if (ev->x > selmon->ww - TEXTW(stext)) - click = ClkStatusText; else - click = ClkWinTitle; + click = ClkStatusText; } if(ev->window == selmon->tabwin) { i = 0; x = 0; @@ -634,7 +634,7 @@ cleanup(void) cleanupmon(mons); for (i = 0; i < CurLast; i++) drw_cur_free(drw, cursor[i]); - for (i = 0; i < LENGTH(colors); i++) + for (i = 0; i < LENGTH(colors) + 1; i++) free(scheme[i]); XDestroyWindow(dpy, wmcheckwin); drw_free(drw); @@ -872,20 +872,131 @@ dirtomon(int dir) return m; } +int +drawstatusbar(Monitor *m, int bh, char* stext) { + int ret, i, w, x, len; + short isCode = 0; + char *text; + char *p; + + len = strlen(stext) + 1 ; + if (!(text = (char*) malloc(sizeof(char)*len))) + die("malloc"); + p = text; + memcpy(text, stext, len); + + /* compute width of the status text */ + w = 0; + i = -1; + while (text[++i]) { + if (text[i] == '^') { + if (!isCode) { + isCode = 1; + text[i] = '\0'; + w += TEXTW(text) - lrpad; + text[i] = '^'; + if (text[++i] == 'f') + w += atoi(text + ++i); + } else { + isCode = 0; + text = text + i + 1; + i = -1; + } + } + } + if (!isCode) + w += TEXTW(text) - lrpad; + else + isCode = 0; + text = p; + + w += horizpadbar; + ret = x = m->ww - borderpx - w; + + drw_setscheme(drw, scheme[LENGTH(colors)]); + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; + drw_rect(drw, x, borderpx, w, bh, 1, 1); + x += horizpadbar / 2; + + /* process status text */ + i = -1; + while (text[++i]) { + if (text[i] == '^' && !isCode) { + isCode = 1; + + text[i] = '\0'; + w = TEXTW(text) - lrpad; + drw_text(drw, x, borderpx + vertpadbar / 2, w, bh - vertpadbar, 0, text, 0); + + x += w; + + /* process code */ + while (text[++i] != '^') { + if (text[i] == 'c') { + char buf[8]; + memcpy(buf, (char*)text+i+1, 7); + buf[7] = '\0'; + drw_clr_create(drw, &drw->scheme[ColFg], buf); + i += 7; + } else if (text[i] == 'b') { + char buf[8]; + memcpy(buf, (char*)text+i+1, 7); + buf[7] = '\0'; + drw_clr_create(drw, &drw->scheme[ColBg], buf); + i += 7; + } else if (text[i] == 'd') { + drw->scheme[ColFg] = scheme[SchemeNorm][ColFg]; + drw->scheme[ColBg] = scheme[SchemeNorm][ColBg]; + } else if (text[i] == 'r') { + int rx = atoi(text + ++i); + while (text[++i] != ','); + int ry = atoi(text + ++i); + while (text[++i] != ','); + int rw = atoi(text + ++i); + while (text[++i] != ','); + int rh = atoi(text + ++i); + + drw_rect(drw, rx + x, ry + borderpx + vertpadbar / 2, rw, rh, 1, 0); + } else if (text[i] == 'f') { + x += atoi(text + ++i); + } + } + + text = text + i + 1; + i=-1; + isCode = 0; + } + } + + if (!isCode) { + w = TEXTW(text) - lrpad; + drw_text(drw, x, borderpx + vertpadbar / 2, w, bh - vertpadbar, 0, text, 0); + } + + drw_setscheme(drw, scheme[SchemeNorm]); + free(p); + + return ret; +} + void drawbar(Monitor *m) { - int x, w, sw = 0; + int x, y = borderpx, w, sw = 0, stw = 0; + int th = bh - borderpx * 2; + int mw = m->ww - borderpx * 2; int boxs = drw->fonts->h / 9; int boxw = drw->fonts->h / 6 + 2; unsigned int i, occ = 0, urg = 0; Client *c; + XSetForeground(drw->dpy, drw->gc, clrborder.pixel); + XFillRectangle(drw->dpy, drw->drawable, drw->gc, 0, 0, m->ww, bh); + /* draw status first so it can be overdrawn by tags later */ if (m == selmon) { /* status is only drawn on selected monitor */ - drw_setscheme(drw, scheme[SchemeNorm]); - sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ - drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); + sw = mw - drawstatusbar(m, th, stext); } for (c = m->clients; c; c = c->next) { @@ -893,34 +1004,22 @@ drawbar(Monitor *m) if (c->isurgent) urg |= c->tags; } - x = 0; + x = borderpx; for (i = 0; i < LENGTH(tags); i++) { w = TEXTW(tags[i]); - drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i); - if (occ & 1 << i) - drw_rect(drw, x + boxs, boxs, boxw, boxw, - m == selmon && selmon->sel && selmon->sel->tags & 1 << i, - urg & 1 << i); + drw_setscheme(drw, (m->tagset[m->seltags] & 1 << i ? tagscheme[i] : (occ & 1 << i ? tagscheme[i] : scheme[SchemeDis]))); + drw_text(drw, x, y, w, th, lrpad / 2, tags[i], urg & 1 << i); + if (ulineall || m->tagset[m->seltags] & 1 << i) /* if there are conflicts, just move these lines directly underneath both 'drw_setscheme' and 'drw_text' :) */ + drw_rect(drw, x + ulinepad, th - ulinestroke - ulinevoffset, w - (ulinepad * 2), ulinestroke, 1, 0); x += w; } w = blw = TEXTW(m->ltsymbol); drw_setscheme(drw, scheme[SchemeNorm]); - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); - - if ((w = m->ww - sw - x) > bh) { - if (m->sel) { - drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); - if (m->sel->isfloating) { - drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); - if (m->sel->isalwaysontop) - drw_rect(drw, x + boxs, bh - boxw, boxw, boxw, 0, 0); - } - } else { - drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x, 0, w, bh, 1, 1); - } + x = drw_text(drw, x, y, w, th, lrpad / 2, m->ltsymbol, 0); + + if ((w = mw - sw - stw - x) > th) { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x, y, w, th, 1, 1); } drw_map(drw, m->barwin, 0, 0, m->ww, bh); } @@ -1543,8 +1642,6 @@ propertynotify(XEvent *e) } if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { updatetitle(c); - if (c == c->mon->sel) - drawbar(c->mon); drawtab(c->mon); } if (ev->atom == netatom[NetWMWindowType]) @@ -1887,7 +1984,7 @@ setup(void) if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) die("no fonts could be loaded."); lrpad = drw->fonts->h; - bh = drw->fonts->h + 2; + bh = user_bh ? user_bh : drw->fonts->h + 2 + vertpadbar + borderpx * 2; th = bh; updategeom(); /* init atoms */ @@ -1910,9 +2007,16 @@ setup(void) cursor[CurResize] = drw_cur_create(drw, XC_sizing); cursor[CurMove] = drw_cur_create(drw, XC_fleur); /* init appearance */ - scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); + if (LENGTH(tags) > LENGTH(tagsel)) + die("too few color schemes for the tags"); + scheme = ecalloc(LENGTH(colors) + 1, sizeof(Clr *)); + scheme[LENGTH(colors)] = drw_scm_create(drw, colors[0], 3); for (i = 0; i < LENGTH(colors); i++) scheme[i] = drw_scm_create(drw, colors[i], 3); + drw_clr_create(drw, &clrborder, col_borderbar); + tagscheme = ecalloc(LENGTH(tagsel), sizeof(Clr *)); + for (i = 0; i < LENGTH(tagsel); i++) + tagscheme[i] = drw_scm_create(drw, tagsel[i], 2); /* init bars */ updatebars(); updatestatus(); diff --git a/dwm.c.rej b/dwm.c.rej index 87d2182..2e76cf0 100644 --- a/dwm.c.rej +++ b/dwm.c.rej @@ -1,10 +1,51 @@ ---- dwm.c -+++ dwm.c -@@ -163,6 +163,7 @@ static void detach(Client *c); - static Monitor *dirtomon(int dir); - static void drawbar(Monitor *m); - static void drawbars(void); -+static int drawstatusbar(Monitor *m, int bh, char* text); - static void enternotify(XEvent *e); - static void expose(XEvent *e); - static void focus(Client *c); +--- dwm.c 2019-12-10 17:24:37.945708263 +1300 ++++ dwm.c 2019-12-10 17:41:46.192676099 +1300 +@@ -569,7 +571,7 @@ configurenotify(XEvent *e) + for (c = m->clients; c; c = c->next) + if (c->isfullscreen) + resizeclient(c, m->mx, m->my, m->mw, m->mh); +- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); ++ XMoveResizeWindow(dpy, m->barwin, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh); + } + focus(NULL); + arrange(NULL); +@@ -707,7 +709,7 @@ drawbar(Monitor *m) + if (m == selmon) { /* status is only drawn on selected monitor */ + drw_setscheme(drw, scheme[SchemeNorm]); + sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ +- drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); ++ drw_text(drw, m->ww - sw - 2 * sp, 0, sw, bh, 0, stext, 0); + } + + for (c = m->clients; c; c = c->next) { +@@ -733,12 +735,12 @@ drawbar(Monitor *m) + if ((w = m->ww - sw - x) > bh) { + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); ++ drw_text(drw, x, 0, w - 2 * sp, bh, lrpad / 2, m->sel->name, 0); + if (m->sel->isfloating) + drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + } else { + drw_setscheme(drw, scheme[SchemeNorm]); +- drw_rect(drw, x, 0, w, bh, 1, 1); ++ drw_rect(drw, x, 0, w - 2 * sp, bh, 1, 1); + } + } + drw_map(drw, m->barwin, 0, 0, m->ww, bh); +@@ -1832,11 +1838,11 @@ updatebarpos(Monitor *m) + m->wy = m->my; + m->wh = m->mh; + if (m->showbar) { +- m->wh -= bh; +- m->by = m->topbar ? m->wy : m->wy + m->wh; +- m->wy = m->topbar ? m->wy + bh : m->wy; ++ m->wh = m->wh - vertpad - bh; ++ m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad; ++ m->wy = m->topbar ? m->wy + bh + vp : m->wy; + } else +- m->by = -bh; ++ m->by = -bh - vp; + } + + void diff --git a/dwm.o b/dwm.o index 801a48747cde872317d64e81c0841c1f35fb40b1..d2e46e8fbc5e37c32575100459969cd7d3c1749c 100644 GIT binary patch literal 78760 zcmeFadw5jUxj()q2@oL6M2$6Cs$&T?QP2#aW;ALxnSmXcz(9h8n;|3v34|m~W*}59 z!AXSeb}HxC9&Kw+Ij7dz*0#2_3SJ-(u3jpjRlHQudYL$)C>GEv^ZmT*GTGT=%Q@fY z`Tp^He%%k5z4vFm>s{}9*Spqw*JUr(`2&;E91cZZ4&_Fr?@gkL5+B=#mN2+Pxj^}b zq8S_RMTiy))@w#dz2-d?K40tV4rgnzO&t_qbkHsF9thdHp4Ouo_pms|#C9zu24rN4tA8{S-yZk8YU{LM2R;OsZbZ*u)r3(TvJFf}=JOqwrfjs{VAq_!ece!WYZB zKr=?rv*$I{@u}9eKU`(Zm|&>IK0_^X9PoMfsjlfeykEEiFBcqmoCsaoPGd%i&#}|z zJ%q4Bs`r@B71-k|*r{%zaMh(9aQ%L#w`a{Dy{AlnMl9Q8-aaP+i8Gya_v5`86^IBc}c=cz_d zr-$9i{cB5;e~H{=XaUW5WM4g~wAhGqhvDX(mKnLs&`OM!BBQ;o;2=cPwGv2`;frN> zAe0+I4QJx?oP1Rex>52>B$A{Mg;`Ifaxn^X6LE!NhicxfoADgZktOsul8kioj0fe| z7d=l#KUec^=^q7!%A>rDDEK!^)4!^i5&y;MWYQ>i8?z>8#-BHVrH_}Y&+r#(#ti_J zIQ8Uao=v1VPiZC(u~qf5;=1&0_QDA9;uqQphvBoRiQ;cEUD9sjM4cl zqA#z=)2;3G`-Kgr@QyR@w_KZ(Vq*%>hf|m{S!?;EfUuB7Xtd*EDf-KL5r@= zD^$YIB%h-v_a%{YQCbw`15JOEQ6>B`W-O4GrNt`qvIF{ifx~pW~0(Cxg zXa z^aQmS)4r#hr4`+moZF+$_Uu=0R%bEg>i^W%f0z%RCKY$)<+9`l5f38>sW$~RMAct< z;iHm{_Z;CN$?nLtTJ4VHj_Bt@Bk|~|%$50CjGJHV$-MUvZQD5fXhzmffeQf=7ixmw zaSsu2X}KP_odjZ!Fa~=%^DclCNK>%^ zZ3>R+VvWr;vLN-3IFDL`qH;E>W4ES1t#=yt0ZQ)F@1~&W7oK%!!G7C;q!SMq%Zh#8 zqib3MwJb?3)|fZ)@eGh@u|H8P=zB^ms|!!c@%vG8-~A$)4Cs3Rv*e7@VxRt&=aA1} z(S7=!f|pe9fwdRt)|SX%&1lI?q-zG63uYufeSTgRmz+^8RebtK+ta{Do$cche`Eym za!)2j1kWK=-@zjIjQM#Zed&#Pxm9!3WKX%Voix~cLox|k#!N&}89$_HN(X9Q3YBsh zI5iUf(QIGAyE4|vq}~ff7WB#lIT=a#mU^=g4srVE`()FMKT(t9*-s_GIvXEK2G!0j zsF^65!Ob4klQ%W8damC^)q`rNxP$=F8ZS37(qq7}e%7{m9;oyl)`3h9W{?Y{&*0(4lDpii`~! zdw*Wj!+CD{$p>6QZJ>ro3hqI=i)~&9el`6qeS@2UIr#PI8|bEQ$YT&? zLMR+uv$?dWDbJz#61YcJbqF><9tx>LQ1xe7TdL|W_`BXw^-ob8cTv@cGqB6w)vfR3 z!LI4u`W~)2N4FpSUr?02_u!grAJ?(!==K%tfI}jKUSUBbwG4V@QY_`7UA1$?&3L~ngWj)tdPUiB)phwR$6c4d zDh*_l&!Vtzi&Pv<_4W`!@w5 z61=j`1N9UdZO?>j8-0TNxMQPFv;b8id4@q{Zrn|r{BQ&HH;q3LZ#4N-+VKE{LesDj z&%H}nWB3F;$7kc&xLd=c5oH|Avcz)G%CpvR-m*idSx-KXRbS8kikX@*nYniGHo1G< zivIbJ!o7}u0dJGJ-^|;D)#r%*cbjm#L?f}LK3@76MALi7=ep8}GEvHlkpW}_Zd-{l ztH{x9L?)nq6m-WsSrhj}2Lw*+W}ew>_2x4Dv^op@lgeD|lWIot*Vt}#avSAgo^p|#9J(P6;hIE-iN%@xm4YUfyAy9ci-Z#GCazj1Ss-g zgmk}tq=1B0U6cQ+7MxP`gXmqZ2;^m`CqID(3r+>}q`m{xnQAO2E$;hgGN~H(ke0!n zN<5Ykbo3-9s>UQZ3FzA>?!;Jlkb>k&h(rA3Ct&Q;4+&mzWk4Rg%XnWKZ~GKBg$zOY zy&f{P=&oE-uce~En9oNZyXQ6Z1o^DIiV>}hoG2Ps^72ad#J>YHk)T@ieaLF~b9_dq z*n7CG(C;|`N*A>!yU;%PvyVgf$MjeI1)upn$%37*z!m5C_4n0-AN%z$6NCNwd%#O$ z88?!10fpz1!g0?Lcjm@J{Uh~Puc)L#fQ4Md)bwZ47ECdRtZ_|IEbAJWBmAcoRac<@ zP`!uYO=tP_<3879G`P?B9H$Fj_3JxS2Z{ovfY5B{(eXt<|F~eEPe-%c9e?t3Du*BP za_FKeO634{z2ApCKF;y)G?*-S#vhyFP!INYyzK~kkz%gontKM<#Wq}X6W1eRj^|K% zIBz5uDd&vH1vZg$%8aL|_QZdD45f*Y2ui7!e0>yb{s09FQ^#NlZC~_5UK1A~-WfG< zS9~g9s)_HoI?n}rqcq1@=JR=vv>{(dQMS3LSEa=$+fr7x@x%}x95l7yDC$oZil0@J z!_bydk)s-q@j{yCGp0`Pc|VO6Ut^S(;H3za=R>^ zBdE3X6}(dLxv$_bGjJ-Mi%*$ri71`)QlDdYq5_T{beV-(=J?1*jEt$pi0gN}hM3@F zAdvjSf>RS?Ihh5YgFmWZ{F#$BEI}@6j+)#Pzvg46tKLh_tT-6reolkXqJS|OUWsWS zn(yfj=zHTkp-|2EZWXGKtMf6aRMU5toY<2cb{cAl-bD)PeVsJDiFywVSidD)Vxyfp zm{au>g*q5lS2H~tPq8kmIuA@7;R}qeOrUyKE`ANQ&~aF2fDh7uAT6A0bW!i4ca3BO z6MT+togoO#2%m3sQEQ`jxmjqD&R!9eNkODyy^Hy0YO&51<@{GG3bFBetlaT*+;2K`7q`30O3xB+<3clZkS$1*PDa$>rLr(--tVxn*y zj=kQO*Ir3{3Iw06eSALG_cAu0>pKcQpBT$df{QH;{kj2Ut;L_Vr!sG6qdz$>0nM6P(Qp$6gP zYH*J;^-nR<1LhVzDj#Nly#rf>DUDebH_NFOG2A!JkC;Xl=;)WBqdyuh(PCYciKXb; z*${i{rBFIN1UArDnd;OnZeZq&%@u>#If*Ca(BxNqMn%;>W9@|gSRJ?uhu<8Px`G=t z1G5PjARp*>=QP@i@L+m;)}iTsMByHj{((8xJSY-lB<`)S=?rR&X4vpwB6WZ?40y3~ zTOy-fj~~fwy9DXU1h`_@%#5FpZW1H39j7v*M;v;Tg!gox@GFk+P)~Ps4XV!%y7efl zO!~)j=kXa3%JM99cQZBbx1b?q#aKBUjg7h2Sfg|$*M4K03jwSY0eB9{K}fPE@$_Ei zb5KNLbMV`QsVl-o}tGG%1S*B8`<}G zY3gz4jr3TOc`R~G$9w;z$P>e3%JeT?kIuSOXcj|7(+tTRP5%h9OHgidG|4pA(@l!T zG#nG=D=7RpW^;}psK44xtyX6qHQmHl&TX-rV{&N_I*`O_nz72(YSB8zf=SG;P-m|t z_i5gddm~5HC!ur&*3V}N$S$51RV)yr9uh-rsb5}r)Zvr4(x{bHp%NgPn<4Y_f;5J$ z!iyZca_P<(`mNt}1T;SV2%jg5Zl_WP&#xlW`e)R$|8WZ8Rnk&zWQ{?`z-o|CF|Rr- zMinXzt5jsly$`Z+DWBBB9Jlek77bIb=VG);wNdkG?(m@A7W5Z<#1Z{)VSianO6P-q zG#r>q%#`{bN}12hq>P~NLZh}*(|1JQ&R+kP0{-D4G%cwmhS7Yklb+q0{-=C|B!+8y zqx3-6gC#r=Q`&zjl!5fX0^K|?AAv%orj z}tUWQOS*X(X1O34vf2JWz>i;ZY8f5I$u zlv2>Vj0V*Qs|k9vk|5|~pgD|%m|Nk)W14oxShxeJV1*-sc@kDm3G}QRIoKN>rs@08 zltn&F%-8fy3^o3|kz({~a0h~Dy2wIx21F(TGFV~G=nmXn!_~@d9gu!I{uH#ZG1lO) z(%yEj#LM(u+Lq^@&AN$*%2*#W_F25rV~~ETv{-4j3d`_e6+kJ&!$Kle_jcypi#uIq z`h9s+0m}5wycW7+_GsRM8yGQ}6E}YfZAU1n;2b7^m|-XB>%}7l zS}dHGp;(d_JC43o; z#qp3hLQcj{-h;=2N-krt>USGi2GzXG0R+v)d>5akXD&UH%_=g>EjgZFF-DArN$)wz zf@o+bQ|t~87ZN3RCyr^gtMf9pWkEjAYm79Yf8fD@VV4*9+Nl~Qk}=Js|3yn;b?Zd< zTiUWuvV6wejDX`kpZAuG$U8n`W~R@3b7th##QEB??kvq1mh1^Qkl9RQN~W%5CiiO5 zomq+BV*rMs1xo{izzlD~b?0A^EX^5b2#?37AEu!~eC@?->gGO{nJ6g_s&#d4rgyz3 z@pd`7tqi~C5Y3KzUvPc@IHSNY^#eSpuI(QDm8IclMh1S=!K(LzH96k4yok#?H9s=U zTQMdw$Xi+%zTBr*pw)O&eF~fvy={WtmZwiG(x>L@6~%hR7`?PaFD;Be_jmF#+03q* z+*uagk(JmO@UkM03<>CL)(k@c447*%IQRZ7yjV>9mh1bc zM-nXJ&(Y)$XU7_g#JA(weJNmer`LnNGX5o2KQx^cS^}=&z&4%BN3K1ywq698E8wnB zvnH&-WZa#38-Y_*$08jqyyQ}MnMGgmt9kxzp4|2{0}C z1Tn(c>O1r%GFHptbEUAwfE`DMXz3fsMEO*3Y{I$eQ%9y(Oqf;gKtrq+91}|i$(9n) z@GMn~lA_>J>ALWm7u|)P7z;pAN;IWSG1+bWiKC2^(z3`yk{DCnnn@Tb!2dFJ-dhO+ zNTq&8A0`AMucUu>$1J}0G3EjBk{G}zqk^L~T56(bQc3i9GhL6atn?fT#D2bccq)f1 zw`hw3-esAQ?+9y5AMX!FpH4e@=+d1XZ+{hWVF?%o*Nw48?AF}m0WI3&4tW0_c?P~W zExusk5>r^)sGxbXNNznZ&^|w%t5x6a*Z-lv0*_XG;a$UzC9)$c#<_kE_hDA%wspyr zSU$%QOdi}(oW`Q5MSCMdeEL`_88x{pu_xIR{by$6kt#IbeG@LM*Eh|j!RL;C=r)-y zIl|rX>F7CFZPAPvHD8_+C|Bv%Kdy8@2C`OOCGnIU-Is=24wIzowa8Ui65}!bo^H>H zrHZuv95a z?h^ck4vE`R2iG6?l|{eIi0tNNkcd1&J{fhU8J4AMw^U4zR7s5KuOblp1uOpnbQ3^z z&Wv9P>tYIGS(55uO{%P>_6pJrOapK&Fo`=cWX0T+>(Rr;ETwdK<)4+H{sxVh8NagR z9+h?7B8tk=WfAAjDT|)Yi0s#*yJ2kaMjkkOMrmBj;zn=HcSHuy>rF#Z&%+oDdk!$T zP`A)zhG&0S^jS>ReOM?*x?I|Rc7h2ca$PdnNC1&As>iF_^gEJ0mjq|B1mV>b!kzmD z?Oe!)d92RM3}^UUk6y+@QA7hSo58QbFmWb^l9*phZa)VJ@d#MPzo!2Nfy8&DxELN> zB-E$HvhL8lPqz*8rbWKFmvWo*oQOW3>>F!!b+6l-7>wRNBk@udY8ms!F}6NGVBFS$ z;@;M^~@o2S;epF!EjG>KbULv z4vCy6#4}2AquqrYnW!ut@`G&&Ty(T*nMONri3QVi&A^CwPv09Ci;wp){UUZun7wun z7YM^3cn~eK^nZ9xkTI&kcq8@4GJoa;Et*|1f^II*(eSm>Yv$J2Z@kP)tv|sW(>w}q ze^c8=q91Cap!?Z$5tjm0H!B*?U^RGhF@M5dDN&FuSbJ#aBVo)H7gGzjKNT26V2hgw zIJsIGWa6s}#3YV-3r0LtzOJr^(oxF1#UUS?KwoU3L;6RWo`L;2-4X2KF?G87M;d(j zfc{p%7?XGWeymSm4GXmuZGL&}JEeE{Mq|+O_VieIw1Rf!7POSbw?yKL{n&j~rtTRm z%_^XOq_V*tCPaA2!sp2b!7Yy6zSts1S?w;hWAz|qapVEKrj^xx8E|kBF`s>Rx#L|V zoY=tFVx^492bL@kj@>-#KBKlcx_g)ib#$u*yVQaYRWuT()#$EtXctrcQm1^Qk$Bg! zQ;V^b4Ijo!lM7whX|8h=SN4=_HgoGbN6QvEp1IV4b!}?oG1SQ~;JZ51c?*ERu^*Ec zjXRMV8mv1i2VwnrH|CE9DV>L0o%>ONv}AY37q>*-+2fG9!Aup)$Wk`XufKvcyBvf4I>g+=N zb@|1M!c&WDU0p?#Je#wMh0k|vCFaNP-{Z@>7CUBE6ej$|i(Q>*6tmUECdJk0?zHmS zqf=t5$MSlQ1lEaB?qL z+(0aRvGz1<%NSEuo799UL9#rW9D;N+un@va8?I>}uh{2!FS>IG)9)?SiE|-5Y%mp3 zb?ox%U-fPxA1~H;zN7b2=Iyak>MK1~TIkefv9-*RKK(sWkiJ;Sr;K$<3p}RS*u(V6 z!co#=u7KrG!B)*BA0C>4?n>+NoXwumIJynCJ#;Aa9Nj`wyGl3%FR*UDne;Vs<({IB zRW`odp4jkhno)ctpr2;R@x5KND+s$kO0^f>)q6(;qQS`EuExCV@CYI86l1~>%%i2M z4oaAb&n0FRip{HI8fB2|@adn-WR-{ZL?Jh+4N0Y%I!~=0)ff$8(*7z0 zWvM}49BOPD`ERkvAi<2g2(jQ7EIoCOIu~t>-|-LlTti)57omR@gqr?_DOWPKzDthn zMAa`e$;~!xG2yW>hGptUOwN;^Ln&Nvv1bbtI%BSYRxrzZOTq4HFPyS9lTteASDai? zdT(F(b56{ua&#B$2rhN7RG1)h=a3UsbcVOchZ{7?G3~{YIgRepq${abv#xg5Rt2l` zY>%UC;(3N>N95aoWnI5Z%#X{)UvOK{8^o&W85^~(2PjuVuu+RIm#+Wt6wJ!hhjr#r zF3|mE5jpmEJ@XPpD~0ocsfbHqoMNwY?4{&&Uw+tr>CJ6IxE-x*+I3?{7l`3`#T;|sw>qxV8nN|DyS2mLo`?2;dc3pLFHB0Sh!#^VILy$OU~duM4LW2$EEFnB7Apb>XUPNmxEgP=Op8BE!SHS6FYWD^4*>u8G^@UeNPGW+ZB*7_Kz(#OoAilPN4HZPCH$@Ec3M7A zB01XL4GdyQu>2<`1P!)#5uF(iBuayACo|aYM{KsEMdJ96UM53gk>>W!qJ+uEHa4)l zop5#jH{zio=<G9u!&LindERb6wVml3-|6_C|>z{waGIL{ECO5jVaW zYcJc91rTTesI0Ks7^5Z62G zOBzTvN*=NqcaJ1F{*+6+xVt4v30gB&ZkG2MsGt~ ztr<_;iwIS7=k+=;oj9-OW^Aj#1|)YJ1IZ+r&q@uu#tb!IyPoxG)I{;_&8wDRO6Yo3 zi&P@Kh)n=#(Nm7_`Dpv1r_v%LFdF5yKntpKdIMyef(vF`1ef-fa87hP^DQF78I!ra zA00_1F<#Zbz>tzD5vyXNHql2EY+)?lSQ*f+zw;zj)W|nAW1KNPfW>i4iC?BU4q++c z9ITX2IFPsy`>3OPa*V*knbA)iI&S*(0DYhEtdWfeFIaeRlRp&6IOIxkrEjV{}h_?zmI&u^@g(0Yu(r+Iutp^wYTWRJmyxL3EgR zZ)BOOYLB1uA%zQ1iyMjTB}+0>V{776`&J*NUeyv`jlD~By|SHr}o8Ht9sXC7O0Ow5DX55^Nb;*DQ5VaGZ5=GViiBXFV-!+0aGOODk^Nc zUE`@4;VnV$ORmm8!Q4DAp(bsj9wvG^85wR2+e<#XqEE>%hWTP@(&zg5p4N--$~|Mx ze!sp?ec?!QhuU>4d|V%Oe z*fb;SX?zJ4z_`sxeP0RO_?%Ct>34RsdZqt>eNp9YuL=*r%*hAP8*VqT9l5L=t9nd3IW8ZHBj9RlUDFaYo5vfDXB$Hz{kc(u~JDzyP(^)p;jCxB^sj zjVT!3;`_XNsL&&|()13~Cx@OSZ7@e0dgdpAn#&L0g1f1&f+rSD2l(F4M1^K6@;W&e z*9YT|v*{{U2y=TQY%3S97njI-fo_z(<6)naLf%W|lgNw*sA0iYZP}F_4pT$Y!kVl2u>=Kv3mTxUAsA$w zqg}tOB|MyeN7p-@x)M0teX)`H%@yd>`WCZ|by_^Mr+*qf;e6_7Mu|j4)7ah;??8I6 z3!Y;97#kz8)RDc^CS!7$&>dm?zOMh$2(7Y<*}HfIy|37MjNXE^umNv8jA=rdw;YyM zfG^3!JK6A!(Wy_;4faQFy5=o)M-OK_A=#~ZyJ(fnb^FioE4~9wY>jVXx@LRiFOUBY zEvt}KeUhBUcpdd~+$=qZwowDhG9d=RW%_%8*l!n-2;PuFZc;hCk^SKbMrozjpBWj$ zHEGPs7+(>@qSDC&mmYZVtH}9k^h?Leq0u$D7zLdSqgh&$n>@&uJ&r~mNx1clJifmx z@gJBeV9gm+`oa<5z3;QG04o&(_yb}^mwg%~Ei}5N15zvD@fF5R@uSRb>9fBcT3Bdr zL5F^IZ_0G3j@*wX4MwDSA0q{aYiWZWvpce;V0;Lpelz~=PE5?_^kBf{*EIb%MC(Z! zzOJCoTnjeD#xgWuJfbUKfVJ}|@6H#r$8SO+bCKGD-c?Yulqz6oE#*)m1}VI!mpRA@ zA_rF>2N*h{M(ydn1tU4Lov;6p3P%)|$=gb8v@@E~!(vnW^C-yZQ!Nk+^VU1@5?_r? z$9#A1)&NlYJnhf4cU4*gtDwAN!2lk<1``e2N3RAoR_l_5ru9D>k~D&=!8ROYAi|an z1I7MFz=rr_0N&fZ=cCTQ5{fxh){pdb#1 zJ==A=3m_MiW{u{v!6`NpQc=co6hO4aKeOO~&zLp=<5YjaF%>VdddC*ZIX=JY7RvBD zda;Yz2u@IwfS%-gsf~4+*s1KgvlF!G!D2kGTWw4$GJ-`u#}4no)y?U_5@7Ywr)Vgn zM5?L#y2SV)>E8HrCVsI=9ga2kQQ{l-W2esoOy*wk!)%1<2TmTwN9fU0?sez;^qp5Q zrS^eq$9s}K6jxR}0Q;isWeHi0AWh+zz9))F0Xoa{zhOx)caW=VBWfDgjOPR|L{Wq@ zJ^TBWpKZbMLZb~(sdX>b(W3DBPtx#B(FV&DH$3Ah%6xooH>xG?LDB2L#m8sGSg5Ll ztI^l+pTq|}G|h7u8a$&_Sig%ZMc;hh|5b%qW3DhQRAHvV6*qoLGE!an1(g^41l}Q- zDhmy9SruW`Dv5y{Q-GziTnvu1Qwm>5VeUV^;T4)tbaf5^jFseoSX7c#0Hq_U0H3tA zRsnZ!8>H#00wKKN`vWyuxm)S2q8F?%1Oxi1K*2Fy2TB1-%c#t&!i@cVpV2bGL7%~7 z`y6lKgPhH3ic&|zK^QT z4yrmi`oSyMM*Ti)tp`I7+FN|yM<`}INbS(+2qIDT9o}8C-rQcUpBD9|qHnMw%-+_# zZ+&V&^X`Io(P!SdtPlR5nzxjcYWNRC4aanFxDn&zDm4H2MpDka&ZZ$?e9x04Ll4Hg z2=ifbgu1Kv!-T@mgWrXfus7rXe1hs29}wf135-fvuclYk$J^OQCu~k-UhnTe;Lhc? zc5p%O@-%*Fa{Ks<=(aG2XmCcet@_FMFTgeaB4hmobq>(iPV_`#Be$q5+~eRMSZMlB zH-V0t0po6pf&P@5YJ7je-&h|5klx}~Z%65|uP^wQ7=o|;Hy9fK;3eM6`uC6HPojUP z{riXhB0N{-Od8vn48{f_080y*qK!2;d|_{tg6WEv(|{e?duSVFim50bBi?e@&RPSO zLH-FS{~Xk37}PytW{a$O0Alc>M7h_!2{sD%{uA6p8uNPdk%-(2g^eEpkj;p!Ss>0*lqwVS;|XvUbI01>~m&n_n78$HS?6CZu7IpYt;DN28y zZ$cx)lRO@9RUt2q5@jkqWnx>=uOTm=Etuf3r9_IM^|C54Cd8bP#qPZ=fs@egRl|LiMhSyXf~>P zX3(cy^eNZL#}Nn9kZ9E~KHnREklw)q%K%L4tnBCZUch3}hM!N-N2^;hAt`xS@9_OT zY%*Bn^NiBR6dT{lNZDh%d$4C&0}2lbza_z?8C)C45X3;r=z3__oEb3wNBevr7VrJo z@|Msn>kd&Vu)UY-)jOKf$51mef@O*-Ob%5NFB=X;>71j*3kk7}<|lGP4`lUC#q_!%)4ra)Qy{=Aj2C>?fk6toA zybQlSj2EJ(Mn#s8Q9SSrtY8#k$0MlTi3-^jU=o9yCO0pw@5C2$|HXOnZ&3;`^dGX% z47$ki3x7klJk7M18?&Mx$2~Ack@#geF-MHfb0}y5*@9@Qwz6kFQt+1M^H0(+4+H{p zmiufIdG7Op&b{(l>IfoYnf^m+kimxDde`Ddblhd!c*K|pvxs?uf0@pXl_8B5QZDJCh#t!J zc2Nn@rS4_?=#goHP6jHXArJPBFcX2g%e&qwclkd2Jd&J1-FPIk z$78NKl!?r&l^9&8;)74GmJ5^T8`cxOBIjk%y)qjC?UtU(q)Boj8$`vL*crx67hW=22&;L=viTUmh`sJN2e&#OTrcOt=<9`U3&@_xP-aO%HCv z-d|KJc;>Q1d6DVZ1jE`$_KMA$tP==7$xH#yJWy=Oqwk8rhBnz0CVtel-__Xwtt7I_ zjYm5G_uh!NG9$)p&G;!f?9d7swV!`bYkW7)ST!b=^G$f~*^ZNb`mpx%wZnV`dsUr{ zz>HP-I6kBh%KgoZnx?v?jgBcfW-m^8-mw3^O7+$}ipqm#+>No3-z^_Wyh2PFX^OXvAuvLY*s(5LaOXBfjF#fn2L zMKXMBwh;APWR2wo+fiuqhp<%n(R>S&VtlOC5Z{4JE?z#=>F2lr14H>>vkker`m4r-Ly0 zaY_Jn0jxWSe}V5+uyDs(mpNsad_+hDZ8V#0+lysbP!kr=n_J?m-k^7LugMrv?H-Pe zh_Zsi^%{=;7DF)BCk-&xuLnodSbvt7sAO)t{s9(*a5@+_6_xj1cx`BN z*EF_w4=GOKb@QFTS-%(7{dmD%Oh!I{%5r8FQEb*jI5()7|<6-xCqe`U2=T3L2;ijqMUvx33tGb{Z*PJu|% z)N+67g|jkKLV{{gm1_Rdsr|{SC(Q~3DoSVi{nJtbT&U{GIl(@jCal_5rUs@@=H#V; zGXJ#7>OfgVrE=AxhNi39>XoszN;uRQTGCpxd~98)ZCSXvMOog^9%{W3ford7t8Hy) z3AbI<6bi3wZe7+NL|`b?)K=dd2JZGK{C!zyRe!RYNVpkh&`MNFXn9R-TWw=Qs446o zI~ELT!lAK?k$OmJL$O;^sBc~gQ=o{88(Kq)o70=2Y;Rwy-0#qKtkYQQE>v-SSXVq#8|%GIlu{y&IGpi*Hosl`l|Mm#sS0JSNV!e)HJWPA;6wau+{ zN^MJ9Ypvp^LRS1MsE{ksCL#8yI@Mn!eHW@V_Yd3or% zwubM8Ztz^K_(Dr-ZjMycG_{pCquNgkwbr>OfzC~@f@(Yt2Na+F(ARwJXsr8fpqP>8m6{kQ&`x*=N{E(GVp>9LcKrVzN(Uc2E4rO@}09==u(GbNn5Z)yW{(qUr$ zi3}0$Q>@(~H<01G;AnTI7R6>Cd`|W~q!yc)t;ME0!hHm3j3t0j?5;vme>G;k1G5a;(|upZ2E=&@lwWw{LE)3$r#E=jSa- z^B!b6V>#(NmOJumt+tZ|l^MR>Y*Oql3}BN75*x(_AGFYh$@E*XCp8&Ph@LosnG3d| zOK3rSiY&z7#RhWz5mn+Sj!l%y!r{N6;5Y$Je<0aWhtnhPfkc?2QJhP)TZXwK_;iX@ z6LT>P@SJiI7=^4*TV4F9_LB_R5`_!MpzU&fPnkPdj&(4^$o zT$d*^v%e--Irl8#=ba_|oU?>~<1FD9oF&|Imhhajgr9$w@Egw(e$QFL)6No}ZWB)S zNtc`bp83Oiy{`#ZMHKg$Q5jMq@Rer?ueAx6{2R{_9y&|-^0S05Jxh4oS;Cvn5>6iB zK$py4c%VRFB?51;377Fl*wjB6f00dm8E!2f>fb1e47cjXL4mkR*sr226L)#D#&3`T z;%<#!X9>5)ueXFh_iW%Pf=UE#wGV`|zDI_iO+Q0z^e6ReXP=V)*~)LRkkfjT@$KwW zhDWRs#k&k|K1;aUCS2yvF1$pv=7POF1`%6 zi!b@JX&6%)|AYYaD#Mwvn8IbdC;3~$C8>;0{}YJ$lJffmXcsQ|+lBkj62C-*(|=WB zzS6{tOy4eCrf(N6)3*yR5$TLKCyr;?ugLW6!e#n);WB-@aG5@htj$-Zc#-Mbh0FBq z!e#n);Uyv+<`tU+kj{=w-!5FHZx=4pw+ol)Ut>y}9^K+yrf(N6)3*zk>Dz^uh;*(M zcX^YzOy4eCrf(N6)3*zk=@iL?#l1t^W%_pEGJU&nnZ8|kiAcvQ?x~xDKgsm%!e#n) z;WB-@a2fx*sf7Ra@GlMgO9TJX!2iEB&>^xfnql@Pea?Y2lVJggmM#mNdi{S*pGpW1 zG7n!TkM#FsJSP0t$S?h)|0%unXZ~N&|8M30-_lFD<(+i;b^4Ta|GNKwQv=dI=uUs5 z#<5Eob?vp|$J2g;5WAF7i`b=%x`tgTI_!2>7D`R(9J%SaXX*OzrXT-^uB|sIO2qoW z0nu+H4A*P?#xVL2m@Z_NT}1b=c$VWa!gdKv&LJ1#{jk8Q>8?7nZ%^|%bEE01)15YL zm^0Vs%vPP56NjtLTm<5g#`m;ckglWjGtrrSXBvWUr#R6JpL1c_5vQBePjqIIZi)qc zCDF4q(gMSrnSOB1B)zf?lejY-BYY+@OFCeCaB(jofsxK#B-{7XCpz7+jETF1|8<7rcz$I_PKt^!$sdj;O>oTt+K&W`kUV9T6Eh^9L8!DgZ} z7i=M=qLAL-5pufmOmarkZlNG9moU_OD9q<a z6y2GwW|Dr>PdkP=vo)>+l7RG7Cum>BGfzM5S?Eb4J>>!F6ybM?@Y~ZS$+GH{<)b0& zAwl;C$`8{UGWz{=Kk3ciUvEBVF#X>h1FM7;5~T{|=StD*VZL+f^y~e@v4~Xm?r+c!CwO<;wJ!xI6T>wgD92Vha!d~u7o0=+v z^lKd{X-U@2g0_Y@!j6_ZizYcsCOI|L87y-a&LLqb&3%II*F?wiG#TpK%)}xc$3^%n zWLGHnSQ_fioz%A7o`FUqI>_fNN#B>|%m)HBgMt;kvJm8XgYkpwX_049KPNjMcBK8p zxy9jkc004`@vdfJk4QZEV`Ftdw<}6H` z*s1oIq|KS_=Y3Ts?1(O=fACDJcd`Xjx4?runAzF{fwA^_2548Ll4t!*r3jBw z9424dda_fp!xj;?g2E))}0Z6ZK;AtX|N)`eV6%UgEEMx&7nMfp4fdmD~O5Drvjy{RF zA4-&RoU~=t<(%vMnRd`m? zN}Snk&dg#wJ}B^6B7f1e2J+(E@F3B2XKO42Gn~0o0IlIIOUfwSh#wd6Svx^_n!|!a zl8EY6mT+M2!!z32?6jB+WKzz#v0LH7r{BB z#+u48ENI42UXV^SExo`YbiYZ2&7k;eo!R9Ae^B5m;UQ=C%>wThIGdlJ>&%`d@WTRs zNzkYLhS&3B0)L+HYUJ_PqW)(QpeS$9PukB}!frge1-_l|napSZ#jqY;K{M4JR;PV} z=2oJC3?^T@oIDDEgI8Se^5dE3 zW0^S{tY6L=L4k_0oPMTIKFX*Lk(I%TDizt_eshtaW$O})oY~|xbRt?%;2!d`&L;Eb zw6sR&gGl9Jv}9ZG*Nx}R@XjB^-@{0>4@>{P18AiQ4T3VQW1yyFK9W8x9Z`&jR;pNV81Hk?v0$h&{9OA}12Tbvyl_%rTa$Gb^+R@O(jYm}pS8x0Bn)^||%y z+Iq5!dqv!bC@$|q9)OCK0A3#vVe6^>K*wU7#(X|F%BzN%#%ccHX;blDDxE64zhVkz zdC725A`0_ED6KkH?MqXYpW23eLBq-$G)<{c?uTk3oQ*Qn~nz!5L$j}xGeq>$x}oPIIb!5!{mYN(R4VSPDl8(@p))+3Lo_>FG-bIk%)wcXq=I+lRjc>8L2^(YB<|05%_(2CNnsDoT0LeIR?ZFa4tgOl|lmke_;DVTg-y2z9Xm+y-i zswnh7I}y&tM0gg>wsNV!eZ&?PW>A3A0gV~yYNoe9Q+Y}r5Kmr z#8B>!624sEa^7c!px-QTF|1W?6Zp>sUM={1;Mm5Q^It+$mqBLSf|l(6tMHgwGZ@nPAIMfhTYZxgsKaGLug`pM^WpiJPa1pf!cyX3z?;165y|6q7uOC!uh`A@-r zli)Agk6#Er`*5dA@_$&+U;Yh_OZ%t)mx%JaSRef#ccZh-Q2o4~&# z=no0}K}j$8y)E$bF64yF=f>kvf&X6MY>ou@KY^3|%PS}zPBL6HCcyFqo(?-Fc}`J7 zimQg-6sN%Fe3Jve7Wf4MPp8fv7n>)+{o4Y6{bC05IS@R~N4r4!IfnG~Ve7Y_CO9Y?nOF18d-;|jG|B1la z{072q7W@TSDxF&d{qMfbLwW_l5`o_{iUXoJm58Jl_+~-BR^Zd}I3VlA?E>E-a9NIb z2|RN&r2OIZNBpo$B%?elaopJ@3jUD5j|o`Tuh#{B#8O^IfK$53F+74Q;vE%u$yg4! z1%5){3kA-``3O5L@Yk>8gbM}zV5orj7hlBzHkQX@w!nWcaJQh(75MWO`bz~qv5*sr zr*0_#}b51R)#WBW#wyHwv7M?}66}{BL68pS0)i3cOx80 zRp1#Dc!EN$%54HK6nMRm=MkZ|dj-zM;t0D}&_7L%6RsKjru>({zj+M@WO@Bk;PVA8 zqA9--_`eDKCBf$p0$*}12c8%BqXNIChy!dKj>jDW&+&46yP!WP@D~JrtHA#z@M+g^ zpibZ)0B80r-lcugdH~tU9|b*L*!88v$x+1R=Qm{#?49UO3VgZ1M+m&`1`dd9D>(xH zvB2557$k1s)SgTK#x3dxtuqk+XG%C9Hh#t9ID!AVl;gMan{utd9}xns7ko+te)VKd zD2iDL2)seyQqH*ozeeNq3k3gV0>4|}Z2W~VufU%d9XK0f0skIw(lhyYbV)t0WB4#- zAww0VMCiFo@OdoA1Ez@ZO@fbGyl)hDx}__FO>g}1hl0NxlH?1DpD{dBX*q`j*#iHC zz}*5D*;5{3cvh+(mGVC>=sN_1O@hx3hG!_<;$70yYkDg8A`rJ{1)mbZN6Pb}z}*6H zizvMUS1kBxfgf>kLP>w#Aku%P(rv->1-{vW-yrY~3qDie3oZB(ftOft{2z5JUAG1Q zH-Re_`~iU<5&o)_pU&iF@>}pj0^e-GXYs`5)1ySz}*)7n7|baPEx0v{7Ie* zMH!57jzh^(f&%Do&wYNTq|X-gB^LUN1TO29rIY z;8*pB6;uv~4+{G0O&C4S67(`ZGI*|_FOh(_R|~w=g4YTB zKP>oCf&bWow+MWz1z#cXeHMJRzzeYUVdSQ;?=yUaY<^N9KM;K0OdYj@u@-!rz-e4-zIF+m#;NA(X@Re> z;0FZ0$%4Nm@cS(I>jM9k1%F%M?Ek$rB^(!ckA?mtfgiNsp9x&fM@d#+2>iH(o>w$9 zilX0@^n;lp4`Sm&iP1ev;FnqG&lR}rzh#_Ufmd4SFBW*S1>QWp0IvaeB4Zh9>|EUfBxDCF~27lfL|EmrDt_}X7 z4gR?e?nHe#*EGMu){3Fi^K9zTMK*Yz4Su-|ew__I*#@6ugIC+&OKtEqHaMN{Hc-2C zuMPf78~h0y`~@5Q4I8}I20vkgCv9*#D)q`*r7je%sjU|`9Lia{4CgtvG&F@3I;t|v zj&g0q>8au7<;_h>Td0w4_-j)lEp<4mb5TueOLLpDsGh*)+D4q(xsr~N#R;}c_^F-> z9>WNs6FwE3BZ{+W>mtjSuTpASTWgw@;JD2urLJX_g5z4lND}A7wg}$ghA{Zyq|q9r zjuSiChZvj#J3dsYYpq!su34mnYnHU(Wu?;C+EP;|;Wh;)zb;TRbEM7?!eGJ9fxm61OGX%FBqt zxxh<8PUYvTE( zQis_owT-QdU`sel6bFjpSXHuu+WHU8%W;UZpss0LS+lAQCx^mNd39jVZb*OKMUbZ)IU-x<|<1*#|^?6B7ebV7$xEA-GJ zQouREu%uPuP1rm;!aBUFC8SW54z-45csnGAp*Mz@b;z2uvgS%pUu{4}slwDYH#WDj zTQx6gDk&=GP$Q}V3cGe0Q&p&SIhjgzb#3$VmgY!PU3Fsv>NE}tE*uE-3Vd#(1_G}g2rL>1^bQ2#=-~nK=@~Fjo&huE88BC#0kegJa|cRoz>IkY%$aAv zta%2^+qePqHg3SYjTGv?rJiyYP40WJgKMgsi$$NrwQz-c2!N2a%G^j zkbXS$Gmd`7)6doPa}E7mOFu>QH9D)64Rzsq<-6#HaC9|- z(4vY4pWav>Ko4k_l&T7}Z0x*grK(hV0U{4o6|0(RdEO-A!|B!GP+w+B(fTbhy(71? z%Qe=AgLCScIxU=2-w;OMjSQeGYE>2s*-1mQ%fS-9Pjh1%Nfa(?YKep=u}+%@Pit<) zIr)O|ENW5vBw|gfcn#sqbM&)H)r?4}byct#lAznGYG^_mx4fpTO~vu{D?%xNQC0B6 z*pYvBrg|Ua#fVnQd-JODnwFV04Q)8DpX4iTtZ8c_X_Ts|p;h$%22?iVp>5T2R^a8$ zbq$LfLam5IeL5pT7^5L#UeuC`6~nA1@&qO_uK+wu&pZU&Im{krh8Cj>s>k!9=9<>J zR63+eW`C&?g8$G|)5xP%gj!dSHjn{7d6ydhp9w^c(9`;wS2jT^$Tt-QR?0omDlUMC zyclQMQxDySg5>`_fPyXy%orD*_(bk(P&$*ETX8}@bu`E`c+P}}42vP}H{42Yo%r7m z;HWh)QzaLgJ-}(H=H8f6#WXL=rIb3ea`;i)YRQm!cdS&YH|r z$Rckt1PA1EpBzS?vM|&qawA*F-Db5J&UhR7E65u&0sPkqBtbR)6N%PU)!b95CLh%< z0MspwtL%djx0?0JVW?FyN%5^-QPUU+@n73ec6>fb+h?gzIR3$3z<&dQR;8h>xz_8g zUffn&)3jJw%>GXRD#Jz;0IPm1vs~$F7_AcgBIby|;{qRyeVC)h{=W&-Wpb0ND)@gp z(H7un)pR6<^X=JxI6=Zxl}gY%Sl5yG5%GSP1(*BpXg?%fl3wC+U#!ICyN3W1 zy-b(>@6>_tZ5CYe*>Az$;n9`92%Pfz8vec%2W9k{aMFpyCt@ECT@*}lB%gAD6ZSX! zN%}SuZsxPvhR^p+^t9(l^7*3)H}heqe1neCrL|8GqBZf7e9+hzb9|L~qvHCnkD&q%gXMVo8!N!rsN7Oqcet&?WUF_t*O^xa3oA!)LCA zUh-l8_dEDgy6@pnrc3)e=#uHmGZAQChZ&dYt`Io!c^`k0&uR<3O!qDeF6+xrEx6?W zOA~);6D0rr7J4b?0ShkqykX*Fmh&A8y_A#ojnGAU_%r@wx+hII`S5)geYoV)VB*sYS!I6Ln{ade{fR{$ z*-rBP27UbBA*J9d#JVb7q=ygiC;9tLxS9W71upd|`OtbUUBoAWKgs8)4gF^(`VUR? zL$R($7x6KtOY5g}$#ms+35^z9?mM9MK{LJVj~cN)CGkh`AmzN%25-jtf}|&zWPath zqJ$mApX77ehF-(GI$b3HWB8Nwvji@AOFSF%v~&?Y?OBxgH8%L`V!xo&k8D@xiti;P zF6FNlIHhau?^fB+|I$QnF5lnT(Er&)Z!X`bO}M#yU$gL$`>5Zx;JY9%UA-1u=IbL9 z|BpZ?_4W@7y{s4K}W5MOt;B~zRg5`%tU{`4gIf7 z^q-jM|6)V`f{EVD|4j?Mw39UPU5eFCoC2qOnbVzap}!yDbX8gKhd8V(H}UxtnAFcI z6Mo!;cbfQ+OCsq{oAA#}_>gbl1sBOrd(k9)mcU8=f0*!*CVC3n<-iXvzXgAX!^#p9 zpA*0&|NBh%5fi?}!bk4I+HS!m{|`-k%jsB7F^2NC~%U;Z08XR{Ud^Zmj##h_P7O?{9iWlKV_1C=!IM`O4qE1ZwOrK z;YCiSjJ3h%T5y?ewTb`drgWFv(6^fCzcA5v*wA;G=s!2n-)%#GuZiBwzuQFr8xx=1 zCi*W;xc4Hw;3B$oJ_e^ z;3N<2t(1I%Cfr=UVH-XVSa4bHhb_3Yx6f_(XOHB9S>+!saFR1=l5>I$eTj)4+ZR&# znqr}saxOE`e`(_Xya_*I!r!;y^P_Kp2$z&!=J&sC@W(8;l;`4$IUmaJKk+Ba#UpUZ z{{>E_lvr@dXR-}mZo#GhR$;-V{}!>}lK*N8F6}C6!KEJVvcdn`f=m9-37qs`w!@<~ z^dm3f3L*VGfj_CYStgu#y~D|r`4(J$ce}`fKMNb8Yo!I3^CX)rxb$y-Y{8{|ekpL0 zh4wB>Ie%xNmvZ)4@R35EXH0z3OnhFk&`UmVnCR0@^zYixe`vv_ew=R7MxUL_aZ|3F z!72Nf`5i6r38fVTj-@cFIjNO=RFH9=}!opzQyeKz#D>pLP54_TK3hzD%;oqG6Hfeh;g7B_Ex1f~$S5A3h8xjKJzOAg!iJmj z^=%8ig{$DZq~znCVYg6e!qqPLkOemfCZQ7 zj>zNT8Mrx3e6BFzM-V3EDKX(@dFGpNmx)ikz)8KlQ+fDQtz#qaNU7Z&E zehw=S2%Komd(t_VF^gPCbza!-I2s{Jt*(Uwm zV8ZDe7^!EU4WFqd`g2Y6GcEK|&N&ub%F|%tL*LNLbX#obSDNTQL>?r4)P$Smzr%*l zPfR$gzhYD1uT41VNXq}H2~Rhr`-H%W_I#84drb5cCiDA(iT)cV`okvt0u%n83C}g* z$4vY`Gs$z(gg<4%9pAwVE|SGOj?NS~+0{1uNqvqm(O+mvH^+ouWWvXp_)r?ucFF8Qys;FACS7My&2y0%zw z>A$^b!C&X(%3A`@!23v3em}9HPrr;ul=WTmA1-j>^DPsf91Fd)+siHZm!e$8nfP36 z;&Y=3zr=)3Gx6Duw56UaO!VgV^Cu>Hl2z*Aw`p!ri8HKeFL-!bET8bJ{}x ztjKRxJ`%$v^(p1ax8TxlJpw1$-^ZWKZ;=hXYQZJ{B^F%Dv&O{#Qd52(v(QUE+fDT5 z{623(|DK6HZjwJ~Ltj$>B3zVTv;P0Xgn!#4=YI=a>Qn0NRTI6L&sR3M`*N1-8Rw)B_c_F!edWi`)*P}v#6K2lWH5Pig{&lkjr@oV}S_>}o)nvhCzS;zCtrx2-^fKLz z7F_cAm5Gm8&wsU{|GSCaY!9bx=m(GC`LpULOW@K@q@3qja4F|VD=ylTQ5Ib4?FxZg z_2aS7%XCXExJ-ARiH})7D=qXg-L)26^10o_$83jpTIin@`MTGFOFoa7_?Y$oj0t}W zDwpl#TNXY?1pl}Nm;6VJ<>e*IMfOwwr?az)6l z|A6>d(%W}i!pqVW;pm6IEWA6)lUK-pSf~@~`J>prP!rw{Z`-%UQ{4?3!_W2p{lZf+u;Tqx=E8w^R6O|GC29Q!gC-kcG|<57jt1#DeYgX3@VD ztC=hlzQyBzP&ndg5svlnN#Qu&t#@wm@bT-vMUQqKIN{*-$9g+5gjc{r;2>;B)ydZpB1G48tI2lF4-N@KAThcS8@mI;Xm5BmC5mpOVOW8`co;M=_&fl zNpEe8_3C!fV|lGi;Ty)}IlfY)g}bcSM}b5RUe_*txY2FZbI? z&&&5N;+6+KE6InK<9~@B?a=Ss7#QLQA0r(86P#O_yj-plJ$#m?@a5#QGk9TnJ)5F$ zoN{oSi04-47SE^T^L~o{L(;!X`jgI!{^s);@hhC8eY&G8xr+4mA8LsIt`z+}q~~&v zKfmvCZ+5Qb-a&f4&-G8l`99IA6rUfGp3kES3Ho}&K^>Gx23?k3K0?o09c zg!F@`oevP_^2iYIm;f`6=o7{_Mb-UY{wINnZ=aIge;;$9` z0@q)jqQ6S?IFDN@yup255Z)2PNzR-WXAmdW=gH1({U1efE))F}_g^g>@pq8V&ftaZ z;;8AdT=V~&_#o$qXML0LcJal zeg9B~rN@NBXC3+Q`TocYV?M+K{RHP$?gWZ|PKtgm>G}Hb4@BP)i%VLCqug!6Z}EEl zj{Nrq546Moi5};qO^PFFwvr5d9X9bD?m=xrBW9_YkzbO7g zyxgtAQSO`Ma~Ao(C;A86XOdMkB%6E?UTC)?`Wub>4`B+vVNeN|^j*X!f4OhI`YXMh z_j?bW*vl&@&f>|voR8OcpVG@e3bTmkvk|@gcf`lhbxvO2vQb{zzJ5-6zkF4y*CdL^ zPy0&xcGCOiTjIYUj{T*z=ZD0v4D*(3JK7Llh<~2JkW7Czm3w`OM*YWO9{NV&n~2}) z+PU-ddoA}1R=d0CnY`i8{c=X_5Ho@ju5LQd)CyF+46o5`&aeB z_$Q{{6JChlo)NNSdVAgL+mAh4V#)Lzr(FZFr2e*Vv84Xi_pk*0G`>@ZN$$F^YH(ae5{G54-apayuGnpx+6_8!uNQ78{fwg^d0eI zGDbL#YZHWbyU%3jwoI%KjyPwK-u4L#z7z|%l(^;D5pnVj@;Q%ut|R@HpoRb6k)F5H zC8THnn~7UILp&ZE$H$UQO#hbG%f|7s1djgF3gO#bZ{zzwZ?gyfCVpN`-2A&EPM#+I zdSIwmD{<3ra(^4&$C6EqW4(FBxv}%9-Ch$t%6*gg){qC~zMJCn0qLy_`0OVB2KnqG zZu&<&{!dc;ZQLJAHevrG`jv2rcZONS`9UDm{3jE)V+Z25@q;X(zU$q8MvDK%qKE&L#NP~l@V|z*#s4k$pP%BtNc8Yu zO8hPIzm2&0Pjvq~Q~du?^zeUx_^-+TVdCa*`xHy7Qv9D3J^Y_1zAfZO``GwImeBsS z?*C$n|Ib7Z|INg$4*>sP5x4kfx&PZK{_l$({=X%@o%}x{ZvMF5g8v~g#_RtdMGyae zCJf2i;XlI*@&7e(n_b}X4{&Z1_CH4S-QjynLy5l=KEwYM;x^mh{--&&3H#f4NtUp@ zaJ)EMIL_BF4yAoPHF%@k>7s|vWx|JeJXbnbpKC-9pGCrlyUz_NKFdTu!u8)H{pX<$ zh~LIhvZU?ssPO*o^A!2i1O}fCDf*X$qh7D4_;jb}cN2d$#5=qcb&~8OZnIW5OP>+9 z7=(Zwx3Y4Pc9;E zF})OVav5>c<9za)#7%E~8cX%WO@E;;$Hl}=-(ljA{$6-@#L2zRO*@U2`)bi+zqC#` ze10q(^?I57_l7di{;!h$MdDkDTTIxWZxasx4}~M1kDQwam;1TsQLiujWe|ph^`Rqv zOa=>w|MAY%f4Jyzyc?Oq&k&AsrwB*67dqE+_5X{ofBUBRz`tHN{PF)q=FitR?i4-t zd;cOF{{Jc*{_C8Z|8!d4UKTxkUKI|X*T{#@f8QXzEz74*iVJd^@a3mRj`8bsx$h;t z#fowdJ0j*YHiP0H<{UoIk0L!^2fH9ekN+<+f4+b59nxDFoBjR-{-?;8y`CNx-a?Aw zDD|$-i04Ns@%)tht!(IDCq2irkMtbRr@|4BjbU%eyt~2+`++YzHxDlN1mbqSkLLk~ zk&o@O;qx`pTNlRvUhY6GaVz6mf4=Gx;#My9tMi0gU)Iu1!qGmrIX4gM8zP>Kq_=Wg z&oh@KX(w)ZI!ZMBzF0W?-z0zjo#{KGN1WZnt=s{A-E%K-D;L}EXTot@>-SeNFw7KwBFtR!xF z3~td%ob_$QP2V*j`gam%J+3F&*QRfGeNT#hKXKEyxE|O2>}&QPY#%~`f0OI8#92R% zxcS$)K2MzWvx%EN=lTM1);AJ2eWmM*#96r#96$Ak!e;jesH@QAfob|Jbo4(HV1>&r4ByReg>x;x$zmmA=D_!48ob_$QO`o{FlQ`?Q z6EDT@`@J6Gtlv+(6u;{;e*T5_$2jd-;TT^%FC6297gBgpIL2>pP2ruwF%EoB3eWg? z0piEF+*#o`PUVGHoNSGqBn9C(E;kal<1bQ?xV1C%Hjc0*i^ufd%tLJeh{lrb5GjT{ZUa%#!8{*FjM}HtM9PL>Uj^le#__~R)yw()nDIDXs z_oVQQ_mdI-^P{3a{@+!3K1E*;j(Qb^qd(Is9QExKj{Z!KaQJ7ue~38YpA`=Oym0sz zgu}lm9R97s;om77{yoCsZ{tf^IwXGK@Xrf}e?d6>i^9wC3x|KFaQOEKhkxeCl=y|i zKQA2q1>x{73NObm9R8ic;ol=1{+a$M@e7B4UO4;3$G^IX@ykb$35_7=lFkM@Ozx&xC#!RsuZ8Ba6C_#6Aqsm;fN!r`+?ID9&Vqo3U+96q~*!>30$ z?h~Vbs>{8?`>o*c$p|0f{ZaIbp+`JbqK8jb_-OaZ35QROaQNhfk9VIs;qa*!4xfVX zTK8!Z4xeV>@F@z%{pl9r@L3}qKCQwRdpzyJ;j>9Nd^&~W{&bgc`0Nr6pB~}3KaKNF zUG5bF;(iDmJ{jRZ@_ONX7kb1~C3^T|g?G45PB?sOgu^E<96oiz;ZrXhJ_X@8uWJ$x zpJw6kDGJ~1^=c6gpEbha(<=N=Sbv1WXOnRFbP6Bj=RaM-;j>FPe0qeR>OSb$>vFH~ z4nH`2GQx468`rC#M?6)chfh}c6&_Dc`1Q`~gf}>^7k-=b0&#Ep(gx8)+>X~c&uk|C zY~cC0`6NZ+rpNi`O5&_l1(84eJTozk)dHD~0E*O+%^@o{u=m3a@cKPB^Yd=Y(fnUz5V~ z!r?z#IO3@j4t;^RwHwBpX%s%!*9Q-)be>{*jK|}rW##jiQ@q`MQr7>2Zx@wrg!adC z9#zDxt8|q2chMfu-{(GPKjWsqz>iP4FmDO^e|A0U4gDkTUsqE1>Q}hFDEwjP?ZVM- z=@I_8>np9mkPy#0=Xv3H9;He6Ph8K})vf*i-FcVjF}_j8`Peeb&dAsmR=bMD%ITgNMZT?lR=j+wRM>y{ipRDu5cgm>m z>CP*J<9Lw~ex~d5#I2|&E5lnzb;8$8h`b4@$mI$tM6UDzo_)}#oE*O1HQr42!GFiHTC;W3kxIGhT>E1Xg`(I)e38|&@9=*-0+TKE1A17t~ zLg$-=w>ZarUHfRS$DC)p9Pq=u-E+eCIoSoevQ{ zvm#b#qVR!!J*!^$SijDK?FRnXpJV?3j{PuxCjpNAd5zZ_9LJaC!m%E<3;*@N82`t@ zXAO#cgtrs?Uv^$69M@Z#g%|xgOo#AOkBR>1ufhLV-+r;51IKoa{Sf#X*U$F-4fsHR z{-II$^Ufa^zTb9=A#D+Ug+HIaM|i&>QD5cPy;1HCf8Ot2;ZIgZeTVSOiIMmB^$R}V zcfLUQb0B2tV$W=#T5zD7WZ* zxo;of2S&JFcy46mTZGp+-!FVeb<_{`>#^`J-)|C*>-kfJ<9^U=;kd8F?>|tl^8FOyINr??p7jGmqwtl^mkY;p5o?9xx@(7U zT&LY39M^R}7LMz{{k^}5df|TGaN#)4^0;r72mOI%qDTLsML7B!dzAbAqs&opIUt@- zoKF;v`$w~c<2jZc!Z+ul??ms9!~f}XBd-&lof7#Y!Yj^;yiNFe=M{cE0siREj1Z3g zPp$A(Q=>nw&%kGFP2_7ukNymtOy<}H|8T^fhH`df1w<|ftG+;Bruy=1X{F!|`}FdlnZ6v*5q4L24Xl|M+oE z7}`4O%5cfzGB4ScZLhtdAq?H_WrPo5eD`Y?FI*S~a!#rjEpC`sJ$2@#BTHkg`{((K zZmhOZpXV)UxYjxN+|`I1SHjd%4i#3oDD$i15KQn!gTlOT{WVbC|c? zq?Pa89hU*Co1Z_e`D=uWuQIK zezOC!^0of$bpeLd^rbk(dnIOkdP$h}RenuHtYN|XMOMC*t>rHatgrHOOTrf+)yV>@ zEYaS#`Y_v9`EC9K;(E_-<=df5%Wn$I%D4Rirhx;`AYfR96nqAqlG6+BS1Uj zYm|@aitt5W`3HM`seY-h<^}$!=g%6XG{p0Jx4Qg|m1POjXK23kg};sR{LE|~`M~YB z6V}z!_RD&HjSKZge)}z;d20ST&yVYd&};s!;fubOf2IGRX_sfPL@`I1Q}Yu``Wj>eQj%7+uBwwc)>upDpkZ*@zRRc%f#`5(gIp_zTet=?d0T;BmMr* z|9hVQ|9N^IGUuG%UVH7e*Is+?wJ&G0HWZ$e;c{u}a%opANDw89H}(P9A?Yo}`8 z)pT?H{Rq($Wwp9lT&w$!MNiQ?I-@yy;;uFdFx%*sdLM-1-N@+D&HF?gb7HHWn9^#E zvtfgbLpKpeyc;gve^XOzj7~AY{A}IaKpe~)bu;|ivQZn#@Ddx0v_!l&bz@>vmpRZs z$n&F4&l8?b!2B+AZoav) z5HiQtR%$Y3V{VbLvN(Ef!3zOnAD+y$i#yV>tY9MRlAuvMvLhWG=6cR3D@qMG`kFCg zq;8hg`u6A@`=g_D^LHYHYjiWZrEJviD1-5DT)O#vQb7E*bn1ZFw7@)t#EO5D8TF?3 ztSL#q5WB|I!@Bv{?pjdkiIYwqf}4MOcIDU)lw;(g~GdwxI&SGb^qp#c#e)xCGr=NjCAq559QVyJx@hH zS@&=18wG_Zqr8eJ_%~ZOzAm4ceEgeq+MMP!XOGv-$L|8mpwwm13{B9@s{m+8`Y}V{ zCv$MujZby+!5t#Q<~R|gn{5SUG=TSD<2cxgP(hxJEa#M(2x&!Mq}0 zr@kwgM|_a6{jov5&h8)Md1r=Z{4t!U$;;J^&vfG(PFOcy4jb=?G{F94J-#}xP>VjF z{v$nk&yJmp(xNCI>c(4wDiu;O6XCpJdZHpPCv3dW3|jLMYnZm?oUmDwms4tv&(k}O zM8AW$;2>zi#s}iQGwVXs$klnd;%yT&kJpO4q8k0e5h5?q0U|_?Z!ey|Ft7l+G%po- zGQQrdQK6a7lJbe~-=W`*&e&E>i_*d?I;Nn-o>D3AlFX#&bry`5>V5Hsfvziht=_ix%rwZAd!xQ*+sbp#S4r zn!?p0Nj*`YH}c6Wkm-rvQ!MCvN@7?Cp0vXcq2~VM%XB(y>;x>5GfO4}jkkUKgQkcc zGd2AZ9(Hj&u_kQz3AVyc0kazC-s+t-47i7#@G=yZ>|mbJ`VZb znAVZ@v{O4*D%*Z44dgE{YCUDp(|$LCg8u&`(LHy3pXjQ)&_Cq)ABmHIYqE^`yN8+W z;>8H&W$UI;Vc36jQ*5AaHf5(Wbra2nFp{9LAa9tITu|Mh1&vRh%>bXk+@Os3fEmuq zJ(}hSzWo7XtB4RZ7vzl$X4dEBR?Z8gyQZ1Xk_Nl4N~b|9m~oVV;DVp3PsKW#HoBq6f^LES2o@JJvB+bJya5+a|xnkQ0=@- zEkw~xY4)g|vZ+zkbKQ2T9#lgE3j@~$7Il^Dvb)kd-iQvTM&p-XQ7-?p4T+>aoZp28 zt2WHN*#6C$mSL@1!MsW|U*`I3@YKyeP;D+X4(`gz`z~VZC?XWb`W&EP1DYnF$Xu_B z_ZM{|n&+jTe89!j2I`2U;a)~}&IVFAE)VhTwW6tpXoZ%F9?Z*^k{Ev=c?>jWQY51y zFAM2s2a(V)V?8wo=K5hoav%LZc{Y+W){hi032WR*zq;|ZvED1d5%>)n>*;2!&l3=3 zf)x&~IZ|5Gls}^RV%(>yIt1${4~5hr1dP3+Ee#kihdSO37@wm!?xd=Z&VPHTqtnEVFqg4Ygv zE_lV0|F^@Q>)!EP{Pv1d4|}eC?yzUxp3gm%qFQ_&^o-e)Iuqe9doJF$Vg$mw5Z;M! zQH4MEj5&k^W1OJ*qe8GpB^Vqu&~E)RQ1FuZqwx|NWE=ug@QRcYZJU3qC%oHSA4G7# zbqINdlh$djFCy~J=l}%IK=1_lI!J`i=nVSrBfE^99`yf+>@GIkFAOa zQ^1knm9_7yrO`{+@WF$*0mzh9MN1 zh7EY`zFstjPtkL7E}qT1bv&AJ!NDp^Vgy=w(HhQQw*MQ^lg}5`*SDv9mTpcKt{uEh z=}tGJfBqf2)A29iZ3=f=c$={L5#0Z7VYiDLiCb!u<$s50Mi=>97nyM(%Crf{0I~tM zt=ODhLI0;hHe&ungBPO0%tU^ecddS$Da0Tg3N~EfO*}7fH`MG!1%~G5cGf8Qse*2E$6{~)nTYz zu-I!SD%{AZ0)Xs^%b|+o~ve_WnLgt*JkU435VuE%h+Qb!Q zCI}}c#%G3%g9RjXz%%*Jfr4WJ<0bSi7l!k)0!KfC1`CdbjkK{9)Y*Z=h>T?LpXqeK zypOaD?o{H5tTIv7=P>waNJB zuqk8+%J24(sl~VFT6(Pj3QYKXI8v5Zx+{4Z&{T?Q(H)T0 z42=kykqQ0-ErlW95m0)lJ=u=-A(V3%x<6#R9xC{I$d@kI1`Av z(~8Oq(SHQ|2jEQ)3mJ!lp2=u%pAWjeDR@0(Yz??j6etCR=0K0GFT=*C1-pX=n%&Oi z(_c_I+$+nWgQ_T%1K4%n0eOOwlsk`kRSJaOba~0Rzd9v)Sw_7v_Qef zs6WF{{Gys1fVRx?5drfLvXJHn&8g#q{?8K=E;CDt@lu3Ja@vY11<9cQ9n_IOiTY9S z+0oBn>=P3eCsAt|EO@Qpi(tV4Vc=9cXC1TF5-y$0lAvoxsvM3UbU6&Q%=Jl-7@1Qi zAa2O@24aGfi9qrX3yw`pjL0td0{l@0lg}S@Ub0R$lp2r{C% zW(V~?M#o4&Fh1z&Gz5astmr9b2emdvhgXCa8R8W|*%U-7HadiV7MNg&S4nTq7}Ei7 zIYCJWJok1bMw}KPf90h$7l+#4h+e=|=t&wJpawk6rJD=$MVzh#N9OIStCZS-bkwBw{uN%u*9jTDmz?4Ti`^)y;se8zbNq z&nzNWJl71A!O7L(9%mb$W26Vn%RQD`TpUWAQfbn5fxJoxMn}7lGzP5M2L0b_WNRNA6x)DMY=`k4}T4T+JA~8mi-inycpvGvX z1OMxl4v>ZkFLqv2Y_#XegV`--BR!RXRE(IJ3CYn->Lh*ZvF!Lkmk}r7eVs=_nkzck z*BQSB)#sj0BQ7eF@#(zzat4I5JR9BJEZu)5G^DK9IKbQ0%g{_y0+eCq~DV8ee&yn0*dw7DGkL49T^+@d;*^ zpxpFml4+i=lN60x{0rv+Y&j) z6$8<|0$Gq(Mq}7Yyr{9Ol({RHD*|N=2sJ{jeC9%1JHEX`44S>6mgo8KX_Ajk;g=MhA2^p}&wL zj`&B5`^sWbx*YVQ;lNyCw$k@t%6xV8^gtK!MH&@(UP@yRQC8%k zwY$4mQPKll54S}xfKL$4E5dIu53a#=Tg7|uuxEIjgcW!(;i;2$354Q#=60HKN{+~~ zaEC3OWyUASC(J^}DFxjxXi$BydSJvW2!cNPo5NU)xfMA)rfFx4h1-w{Ry1OmClTe8 zLeIKEg5A*}y0IHgS?r_K0^PVvpyuNnC`O+Kw?Bxci)>WKL1ZEzgB6Y#-G;koXrN+C z8>D|0e;QiYglKR?X>Yk-;iblQebXQJ4!eekN<|+tb}wG(v5bBy^+ZWd0G1KNDu7ms zhs8u1*wvnQKkjsu8V}}C1t>Mz^P1?6*`xUjuM)&$PSX4-v=yPGg5g2{o?#Obm6}hB zPz+f&5r6uFPoINMZ<=|JU>lYh*g{R9ZVU>T^?4W$h4aE8DxT8ntf9XBM!hE+r5p4V z>PL@+jeG7C`rZ0YmhO68$7>tn292<%GHA4Wyd+J0YnC4WB0u)5o)DuUU*~2T3FyYF zhkqI73Ql8_QsY=DX7OcF^{Gm^)Of+S@2RUVVUinOw)o90D--#XvwIbJxoAu5v+en6 zDlDfD-)!*pi(WidpeLevSvn^2Z$$kjpBVKo%bbw6ne-%^n9zIh8L(0ydI;(=&(Qr3 zQ}(g?;(wUTC3-%M#qp3jNKVFoz7LNDm0ZOT)$e;`8C3JK`w=t;^IdY5Ubyr^HoM3o zx8!(!Ef@(JA-(To5kx~fm11XfC`**ykvgPTug=TbG7R$h-Vmf=<3k??4BP#{*G$zh zk&J03;{`p9)vY7ZGxcSk4GWs{vcj(SgZ}HXV($jcS=mAVob1@^sZ;c2ox^lqb1LnT4YSkH_9g%Cer^KdW`HKdxdR!E~78{mqhA_GzEmPJY={ZV6@XsYBOfHP>H0Dk) z=8iEY7aNlclb<1ZWhycfvq=7tCVwP5(O9I;P3H8bfZ3gHANtDVS6Kbf4N+(*xQ6}P zbgmq^cFo>=I%F<~yF$$xTY<&6+w(R6r>c%cI$C(irS3A9O6%}1^@PkDwT@YBVmg5u zLYRo?NXc`jsf&w%>G7wC5yn#b)NijEad?WT`=-DJ1USW_g}iS>f9sPW;ctp*=Yixkbwp z_AkqhoyWG9IWANde=g(b{&Tjqz4LXdAxhJ2mABR6P) z&D1i>m@?NlXv+F%&&t(RC|?Tx|B*1LVxAq#7{)|_oJIIDsOi3 zB3PGDkjRo!k7z(urF2%1Zeq|cwIC#J#{d;GQJyCbn6tH#p%ss7WyW7=d@T5trgsKJ zN6k?JB3%)2-nFIiZ?a;0^!N@K+k3H}o;ag4iWPC=H|M)z1Lt>Vps43##DyIO7)k^- z(bR=+PicHFCgwgWRO4DHZ67b3li6wk$FvqXaMVG7~AeV6tr zu=VeE;f}SVNm!T-4eizB$MPX1l3j;^Yrlp@9j)Y_cEZSezcRN7pJS8p$1E;h4 z^u(~+bpLZLL;M-BGj>sK)4n6|7t_5XtB%gKyHW$uw`ZkZsYERkzBfkFr-aS#wIMn5 ze6dTz($-UBRJ-Wk7aNW)kUbF8{MctHj|D*ZXJLajqHs&rDh6C@Fokd_m}<#WKNFiE zmRT(U`C0K7^gTqtxEjAJHnOQUi<@-wQL38#(I&3)ViM09GEY?e$}SA^^$Lw|~n(K&aIt>6Lx!V4^9*)A4X7 z`r648blG~K!3EWLnISwC3i*SH#V+ONP~%CRMGV_|Zw5SALS z9EGZg27OxfyCt^;M`Qf)&eTMBw1!5b4$a_%>te~JA#9|YxznXgCTx5X5W_Z1ZFqHB z_!bh-;24|U^0Hk!f{7)rov!OjtG5T*Ru9mY#{LUPMrrj|VVB(NfhlTpn(I9X(7hTp zMx=oCFCi@03x2L0v?C-D$zVKKa1i;zG7KAhlj^(qT|}l04&0hy$TPXnlat{Yu6c5% zeY?lgP-kZuh=)wjk?2A|wf}iFJ zo1!-;t$y{k;3?XK>pbn1;6I_p(|#*x*XB=H5}i7s+S73brHb|p-B|P#*XBV8Jp9nk zVBTbGbBPtELKBvH+A}C-v!}z2dmz3&1I0Ndv3j(uzQ{~b3iGJ_vj`RHi6$ru#YaOA zNG8j(dm9q!(Ka@3g`mxoJ;QT6IrDNn!z**T|C_R8yaO|t*oL&m#6FL2%LrG0iIlIB zDMNWd3{BI!KyVci1QV^0E!|6j>F?tRU{VuGtJ69g3zZd?gs{Ehoxn^iU&sQ6tne~1 zz!sVf%nQsnRF#c&weAEtYl-?(T;2J?Z4;&BSZu~t6dVcAz+bq#ve$T)rLm}FzaJ-C#_1uer^Z0!t zj+pTd8D9pC_hroqoTFx<1GB=AzVLygUj$K=ivnf5GYDFxb&&$%}u@5F2wh={}=(7qm`54o_l(gYDqTT()8^K zlbXmp)fV41l=qQAa|2D@&4rG7+6^d+N=Ye7M63*48{f287)?laLeTac5sSzRKBrkc z?gF@cMf>O5KNC73FHhtJd|CPA!|BI4t8%nMLp;mIFI6h>?L5k$4PBzApS@YbRsgY~ zQuRtQ9ol{w`?K&oJUkgsvpLWslq)1z*!>bbt>bouJq=JTytZvDAcRYhgs4J^$C<#o?WAm40U{6TOfhG?wl(?28>Hz^lf^HK`@-%j(S-Ks4O9HL zv?d=XDpm*@q@Gah`1>?DfTD8XhuCEsmWJ%>EH%I13c&;Mn<}w`?^Vodn?sED+ekkF zV`63U_Lpcmde-=WIYqT8rRMKQi#+2HGAB-86$p*b>%Io9iHVtd@ruT2Xy)Xg+WBrw z4$38K+H{|e-oRAmT(Xo`dn_e76Pv*>4WDxo62gYC-75wi_Eb*JNo5`OEZF+FCr5bj z*y^==spsOCR*u52pj>$xW~nGYW)98r-c^X-$vNG>g1)eo9%~{(CTwv;?#T1Jk7zR| zkMQVQk?r7Z*~a7%-D^S3g8`CpsCjC~{?-BUcU&oVz${)MTJv-#n(Tm4wg8i9-P0{S znmJiC$k&;7(F70H&MVlKW5t%C%V^!40!!Z${m!m+qGf?Vw9g+=QZNs>WBrv~Z3_V4 zpPa!p?jq9egV>>EA9K{kpB3{-u|@G`DUKFBGyW_!Zdz=FzH7aJL=qzZsqtl|*cOR) zOa>CADR!!vVq+!t@zLy4^6FQ~Y`9#nr-aF&H`j~29g(dwraL?QAnxfs#U9ZcTwspQ zP!!Z=+O%~1lCK#j!O({6iW5Wp({>4no{V@sZgQX3F0tDSAkZ*SRXz1FW>cP7mLD{W z3zL6Dn|Cb>dmUHR`J$<$3EBG)nU}k6psgH2Bx?4Bfc?ov$wM~t?vW(N?{n$b^x{`a zE2W_fVC!5S1q#s&v9rz)d+H1!wjp-h1&z4S==qRRH=nv65h~}+@BR*ED(832!Hx~= zZSp4bUqmRX%t{>_(#$}MYsX>x`u0K$W`KK!bdaMHBMPjx|j~{bIPeDr;Kb8?Y z2}56L3$#{yZFiV#leu7ehq<&iMMuP+6^>ABs9-X$`|gA3GzQ1Uml(f_632oY*CzTt zL#(;s+mo<<D>`sq_aV&ER(79_{ax|3MOth$ z2CdN4hhlL;>;gjrw=0>(SQ`!9!tNKL!i8P5ry1iEQMf2=S-zHDOiY5&8gI7cyNjMN zq4ClU88isVDHAOl4NLl;UdpGTE;>??PLvuSDp;x_I-+bSle^wykYrvf^)P4mSgs5f z+dJvoB(dQ#^`=_19j*J{qK_v;FT}+coyt?%sfm~|c!2isU>@#`z60VDj+jM;Qjz#m z(hD8}vq2wz-(N|4Zzb10hr3KwnwD9H?(yyoB2$&E$%j%D&hDQy64fUbXZH-`iBtC5 zy_7~}Q}PaMYntEPjNXLfoA_`_t}I;5YU`sj%o8wCx0!&WrjUTA&z8g+VFM~2L*dNU^ z2aTqf(KBWu*7t~2@|50K*L7cKiG*Gy0Gn>rWol-0QPNS#G`OBcO>*Wv9TRVuKMEOvJCz)?BQcPqu*pYOkmLc7SjNsOFkeFbKz|e)mzK$Eua-9iXolF_OgIb+nPX{ejG&A%jITu%!C7%>?V?yeA-Rs3JF@LBfPpY^d)Ix%`JcadOXr9Km9V)KGgZb ze^3|K6<=GXVMC%fHZZ=nA|p09%$-uzY`9SPB5&+&B!{(M)N-_k_fu)4vXhzAj9|~V z>bMR>so7`}jZ^YoYK@FDAr9>^!2n{oe&w>J=ur7VUUwCB9B`(4V=6HOqC@d;SdtgP;1kILWIeCFuJ#3{4_&@P{Zw|DKsQ{Vwi&6~aYm78fXF9yS%S?fE3Wdt;< zt5D~tRMCv-6V27@%SJs(wJdtBu`Bbj&Ghk?zopo7>n1#;I|F{XeZ+I?!+7TpQd66f zgG5=0&H4q&HZfoo`Fw^{m@FkHKnjb=+@5KSa6%}N)}C^vB_7G6nji3w$%_R`p$WJz zd!kpEB^3cbCUjzjQVjvj0c4FUFT=9e(S7Iad-&_vsqwE}D~ATKwvmgG(ormrW2!4R z{ZeUsyLX!Zqu8%fXJR0kBc_c~w{Jok*rxw7O_=6%9~9k(gAbvWsPLthvh(<+HbmE= z3hK9#OSfU= z;9mTgAze3qNwmJS8SE%CggYVz;aC+1j7N0;3$c_RmoC7<*5ptmG7qUO?4Ap4D~ZFV z-ZTw*#K1-vv#xS5q6|5>4bEEFcoFq-XZLj&9a?M4x{t^_xzsEkTF<^evk|>A_SnCO z@{B*zM0)jfY{N@(-lxce*jv0g43xf>dwiG>TiAr`R%K^|Qh zKuN=xdT=$x{%81%VqG(A-n$VTXVUA(=Dp;?v#4CxT-(ym&B_#el*7jU^zNP&cUVOa zWldi0mT+4R%tn6JOWPH5}518G1{%dOq!+H7o`_T1hM+RU;EcwW2OoL*#>6$M>e z{V%O<%q%MgRvUjt3@l@dsLMOsyq9!uKAw$V%zMEZmj#gg0xf%LVbJ*S!h3TNX6!q9 z0N=pJk9pUg5;V45D3sa@t{LY`2T@$ZlDV)i%HA-R)hwe)9?R!V2_-;#sqq)8mjgT< z8&K1vW_(9vA#xGU!i2K5{2U988#|O=&%&HAClp@aX&kvn+Z36ShG#xQnNPm)EUKmK zb(V|vZD+>*aMHLa%DqYBSY^yA1fg^3)!UtPe?oA#$KvRyM_CbKL)E(xP zGO5ilHI-Ziz7*Y&y$X1{TOdtu6^P&spF;%F6+5)>p%%WWf>KD zm1xNq1kI-LF8V4bC+K?n!f@V*pmDU|RpXnZfA#1`WC4 zH6hn$fyDTnfbj}GZ!S36OTKnss9#2q*)~TKD8 zsxuF>%omCe8?Y>isz1SKbhAXty`K^yp%y>}Rp~D(DQSn*eovPm4 zI?eco>rHv@0Ef-q(Y(KUx?l6|fQ!;=-tUTUO#W5#R+3T;zlUo$CXA!?7+Y7O`Nt=l zYHoHe4I7h_g$!L7BO@$`2^H$Dl0HJ=EyAn9KBu>mtDmAeCI`_t^#UVV(W@DiwaK86 zPt3#2?@qwiA{TW_E4ZL{c@Doc{e5_5d`nb9G@zsTSmS8&JaA3U7ObD5&H?(m13eM% zE9c50ja+{3p&LKE3v|>Bn0HeQ^rzHR<8u)CCi)nF^p^bT7L=a&7({*;!hD@S3DM>E zH_2Vyl>1MUW6`zK=L97$u>UJuQuA3MgSnms5NRP(wDSjNLF|fCFkQ*h&`OZ@&V(S) zEJ>PNM!eNfUo?jzgYt`1`E_d0G^u;UY#3Q{Kg8fgiAvvn!6#%b$!BomH0E~?L?UXl z7IvnD&7V=)7M}o%aPTGLA}1OR#jHC@JRRdGUF<=jcC&jB{0t10L^i)qg(dA`B0d?U zoC@*L$67OfD>+Cuo^L@T#FIQ8a6Jj~;$#z2^VyqW2Gj9_Z@4`jCg{wLFi9YrJo5Xb z5hSi^CyOE7DjUJhdPyZ_zc@(j!(!ZbL~J|a5OIbE%>dKe{8SV()Abe%2}lXj zeuUq^e}t-MA#(EKz4k1sQv+CUYA!NA`QVcvMNRU?S79>`=Hfh19jViIgFUx8v4yG>As$opOD|s68zzT)Xx+wd3-KUCJv?J+rF*%nFNy)={ zS8hlW6Udy;<4PaXa&l)SWlwBB!WL>BC_E(m7MIyz*w`QJ4B_xm`&={FNPEtu*OajnW74FknBgUYsQB6Zc|6au7ujiet1z$e(>0L zcu2dsuM`CsI}a&dxo2P?LVuCGVM{4&s*ykI+xya>de-mm*9@<2D zr@^zQ{doXbkIP3dnIBz--yn8M#gC1OT~9`F>hrJy*Sq+6{~7cx<*F;d#E1CujMc99 z9zcWce?ngJ4oU&+?-gG?bdcj0#qzWG@-I1!ww7Zi_0!~!{|GXf`1u&e^BDg;3VH!m zg(K+x#-`YSu~eE9kCHGKnaBJ~4RP)bX|#}XNe@NzP`aywN{Ft&F2Ro;g(m3eq9PguVV{if zR-x``9q&%_g#M2HU-twtK__t1Xm+W&5@Y%!(cw^%ECZ?*9bi^!UQPigDZNsLnn0c{ zP^!X|B%$*H=HxtNi+X=N=HszdK90mA$qCepN2&;T%nb|{A`5FJ2B!t^MXF!VrOB+e zHgHXKbIwcSyHqy9{$rkwY3Qhs8MIG)4wEzwv{>@ErGP0oiz(@tyR^?Iq=EP|WDTkS zV%e~f?w1LOKO-EMux!d=A525O-He{OlkeC!ny;B;0I*+BDERq0K~vsRugtc-rfrmDI3l<`ZpzyRXJushJSAX8w>|cxZ); zIwZgNHE+x_SB*)GI0OECj_YWMzWn`S&5&Thu7DxNWag@ToNrPHa;h7FOfeD+xQ^l5 z`;dR@njsh-hh)9M$M#g8Fo_@jJYa~??3JrV#=LUhEIt=LhV$KAhy43ipOiUsf`8vF z17*E|K*Sm+NagX8)+aDy5|tVd6m%FXdZMv`)et4rRZKzB=GcC@4$?kBu;Pu8WXF}L zp>)3vUN+tR7*x}JGDZj}Y*BNfQ&8)qjzq%pBqTXNO$^h_Nn>2k1v15##RdBwIGWC! zL?$j;k4c4ek`oZJbeRt!E3&c#oxj{&hfy6;+=w+Cq)3LZMNi>+&RG+A!46t6Nw$e7 zuprq9>I!;B=K=2Zc*Kq3qkn#u4VwGhe!dRgd=8@0p>=3%+7Jnktzn~_VFx4d7LrEPdwhwIAIBI_7a+QW^hKbv>>2uI%d5X(w9zD$~mNC554x$0vYtQy{&pM2|4(Ok!9F8mYt3;U1Bu>j6$ zgf_ulTs13~U*WB4XpGiIn!PLQ8fqF>dY4x2e)LY$H6S-=1%@~QR*CCo9 zz5?&D`Wi11MsoG_jn(-D-qA7dl2y@2%MjwKRaZ5fANAHXw19WLx4d+6i5?DmYpWV+ z>Lblp$b=)Uk?Ivq-q9_ZcWG5!eWXT{%qVp1WfxtdUEI{%Sbg#6*u~%y)ta@@7sR}y zFKEGEHImcDuFzsF$mciN(|Su-kTl*|a1(@QWE4poE}%`KfCoH3Vx@`^x3h#o2e zQ$vd;%_x~&t}U7#s#p{#sVJS(Ln)y0*=1!jW>tiOk^+&Y2d0I3UL-3kB_vn`suDd^ zGPN(+qDiyE;qsDMq0sc604da>ifhYyd0MbV!O}o@#$-ue5-tr*uUHf=Ew9inUQ*X^ zaZ9Z>wpxou>Lb@TS1lh~6KPo%ZEVt(*R@8PFGAp&i(9Ij>zbl17dJ$rD;t}a^#u_a zi8Qp-Hb#MaeVTk<7FpGotST05gc&pwl@?iERozluUl(bJddH3hgQ{p`>{6s2(OOXK z_7rLxSHcu1;?lb2$kN7EttJM`td7=utLqzEB4c5rHb`62Tz7qKv?0>cLS!x8OGl4A z4!iKu(OUKLSj*Vv$nwT$1fsM=BFnrN`U?Al#~u%pp87Iqs*1HlY*<62HEM&Jnjmy^A$D$ES=`=O2j5IecUD{Xg zeTqkGiE1^=BMq@dXi~JX%eApfacfwDzopvP7TjBwqTRbnyL!Ua+Wct?wbj#BYgbRZ zTAN(Ayh#h!EoqL-ZLD9aO>C}O5gEIrxp8Gnq**JEYBx1DqRoIRwFYEG=Ys-b0CBdYrJNOO&M z66n12%2eZUKw-~U3hO>O&WK27(9tU^vip2PAlLZNbq-9OlztJP!Aqd$ zdknEGM-y?f(}pujyCH=uX62I_th$bO&>vBEz}rhGLf@|zEIo}QjTA!ik@VQ|NAm{K zFRxyIkW%RVa1lp2^7M$LR&(vg^HCv^PVF)?w(0TCY(0)0L5FqvZucf6mYA3mdrvpy zkZ$V-88o9{`Kq0T;Z6TSR(t^wFhb;rT+Omyi5<}Vi0!I^6$XtKSJtXTG3b=k#sPec z27#`GKv)vQN8_y|QDsi-PNiSY0qX*Xu}Ixml~R^t>bcm?Hj)nrkYDTudCeXw)Wiuk zJ^Olhah{|M$CsQ)p=T~0pSl!hOJ4EL4EbPTt+I=aT)m#V9aJ+QcD#=utT)Bz-(kwj zm-h56df5`BdUAZBY-x4C$J_8N*#Mr!=Sux?d6IB=qBI$Ld>Xx>_|R1z8Ok+5h%JIk z6Lfe*W}jdK2O(Rk8OISOL|fU**i`y1G4=U66tjTB&8N-s!d=IDncTC71prx{t>Vf_ zfEyr%AVvZrF>t|`RVuYjqzEYs*76X>)RcxG7b*5lMUpdnjNI+)#jeqw1iU>7u+ZGf z_AdR>=5w!D{1P9&vSwtpH(q;E(@{zsiL;4e9|nfCQEeW|Pk!6Xu`2Rv`_c+r{HO*7 zXAR^`!xEYCd0)yf9YR2Sdndj+FeQ?OUWS@TOf%*NudK<-YH114mUve9>r>3}Nx>iE ziwaB(+>iW1UQowE6vmWDj;Uf7iBOFGR%c8xCnRaZKd8~7(wiVk4HY*`NM=Ugp|66$br%m-Rao;{0}B1JWxx)K9#8fv3M z#g{8`gFiHxPr8srNX!nAf-uUNpTz7qxo*U0Dn&Iy;Su=M+vAxfp*=>8tP) z#aHRr(^v0K{8jk3#V-cYx5cM$r}!$Kx`VXetBU3Tzva3hoh`P#Igy-vg7EL0Abj`< z!oPch@Ka9^?mI#Fh!cdLa)R)yPY{0J3Bof@5T5A}uI%6IP%xsSLYPx{fa5uZ7jyVZ zzT0mqyxJbX?}~r@3Bn^M2w#4J@EcAL-g1KQh7*L7@7CX?@)zwd5LhweO%CBI{z(q? zPsLy25MPDc%ZGYAilV~p`f*Vpu43`4Y0LPoZuaI+ycZ-4w3UcM4bOJB6$Cox)W* zMJi#wxA9%2?-Z`mcM4bOJB1f>I)1+Q++6ZWrSBB3(sv41={tq1_&4?>{O^ZzD*wGkEwV<_-~P4`7i$} zz4AByZ_)ps%Kv{#ujE#D(&@M9Q_=nV{{K%6DEpv0{f)Y8T;bA4kv1wKE^X8jacQH* zi%T1IiMX`oSV3=Ts;X9t?c=beqH$ToHvMw&nm_KP>!WM_;{m!hU!!Sl*JzVVO0Mwc zPo6%z!0Yo}bjd{+v{F0a#oqw@Apo+tItf#C+QsjKfzdTW-Za-uvou$0j_ZtJgR*J2 zB-Ou>9Hzz!gdquWsqsHyLB??SthflPaOd2b5p?IqGXrjK#`GcX+@L!r z;Le^nG~mufARcKvPP^&o`j~zux^r&NK=7>;C!Q5_FU~mV_DcGR?rhS{1g5VbdXYv( zc!)bY1g_bnSFxWEccEj1&q8KN2V#pV?!_c9(z%mlyCZX=+ndOm=+3`=K)_vi>%f4! zC_ZS4`(Q@qDH-l$#uWFVj2mzd09k>1Io@mB$1+0hw#-&w%iKkX7I5c-%|v%D*g{H8 zBfY=Na(eMha>g^RqaZ048}5A+7IZgdd|&1*m+>8hi@Z&C7iT;rbd?XNh{H$GUFd2S z={NHm*ARD(E|owMke+Io_EkK~^fUHCPde!-4^TUY-^t;(W=v9L)vn4%N7y4w_gl)3 z&>J#(M`noh7V4|Fpt~&d`>y^~LQ9m|G3NDJUtYE{2vQkLaxcz&>f3k)+3*%S@e1~o z=VZtgaNJLrlK*3NYQL3A^E>K)28qaM5`?}QwC-Pw~!rV=4jVCPEpqnb{Mh@skQX`7%JbBZ+xEC_E zjLI5u;~A6PO_^0Lk$*sB?>OI6T%!HbsqM+=5bXj`D&r`Jm$JRwo-wtj3^Ffw^+-#y zZe-dj;s`rh?k<|-E}rDp1Mad?cj2`pETy@d>3%_UB2SZ{zKudG(s7c*Un9FhxhFDE zcW$S)?ba+b8u0-^cX8(K40k>ds2LQZ=(WWl&!giRaBbo|bN!s`e$YjRhXyBAMXueE|Zl!)j`iPYZIGXHK$1OdnKNB-gir-J_qcO^QT zYIh|{_;_wq){il-Q;CHpyKZAmNK! z+&LlHS7pPF=o0z|&x~5PSm5+BUM7Qut&L|)wAV91yP_v~(ce^Xc%0%0`7+j#osu0k zao7q9n?!XZL~Rz;^?B5ebipKc_Gw81T{}T~41bSs+)t>?MOl|R^_!F3ceyg}a=Gt^ zF>Z8Si+cbFnw|S$sT*AjMF2>yAd=}orZTdMDKd%~$oMrLW`JT2?t)2)2-yfm44~P( zABMltwStk=xKF}+4ek?>E=3LDeF49h^SeH@lAp?OC*~{q>#}l@-G|v>3*cGS@0&$C zMPb`H%*$b_f6vGJK@MBpQ+H9jzG@@EkJ|Dpck<$l>HeYLm&P7Y<!geOIc^Qboi6xSxWQP*>th@?iTkoUsjcqcf1V8A?ShQ{Di!#6@u!_c zKiD)zKO!H?tl1F#bsp0!Cz>gg541b+OtLaKS0$Vc=}(t2tyo`J;?5y&q8-s{8TXO@ zCEBiUk$GcAM!oxCr1B_owh4coc-{!F{bBq)ibQ*{%sX5_D=cUkC^Opn%klyweTe0F z>tE3w7?pziY;d2BG)q~I%uxRt^@4wy8$Y;ir5}_z#&|VWg%$yhGR*;^LD}9)?x57? z=5Ol*$Sxk`xQ|d=*|+=@D%Qey-OFL?sQ!q44}5Q>a-#8D*{UIy@mpwU##FqQC}#`r zuUUeHZH)9#BAW0|D6JY%?Mr$pKeY|TOe4x0Gz~qW(m!3y;bMFxWSXt|;(+Rlg(Fei zDEi`j@VtlPETqIm9KFXsL_v_-)Z>?TGVOHAGXhwblih`@NtMFELf+Eqxe{c5=Qzop zezZSZETypzI=;-zqXXOz!&7`TGh+rGbU+z!LysSA7J_#fHQ>0W(2tM@vd1&wjFKxa zhuxN8f~Xtq9OoM9t4>rm9?i^rBg?%hbGEw^-q~*a?aM?(L65d6b0)9_z;s~Mz)(># z%Yn^itOZzRd8WIlLW5#aIc?+?;FYF#Z#!Q~l|MjEnXj&tmQccj^~hkY^w6bfF4~YXW`= z7j+ZQ3J>6!(k*9EpBL1qzD)l#<0^;uAR_U3%!X6{MSQ+y!S7@~*D_8=@X)2^d~U!q z(Jy3N&HJoi{4U0+S*7cH_#^te85i?Ez!LZ)d6Kx(rSkQ^@J#fdGyTURRMURQ_*=}l zg7Kf@PJFzaFP-t<3VawoEtMC$;Nm4y%*Js5-!|b+>5gNCk&i>ycKi`OnQ<{k1Z*$< zT-p$ABg?7MeM#V1+CkjuQu+Ebo=MI}ZTf!*1cV#<*z5 zfPKRF)tulCrmsf15}!==JH`AE!v2XrN_V?Wo^KfMwBd9x1o1hK?L^ESfp!Svx3do* z=7NBq!}wL)2Z(tc;DwBTm)n@dc&F=9##aoN?_$0MkCPbR@g0eaxfMLl1y1tsmT-@r zX^xNN3~~XIz0$Rm@n17;NLbAM5&h+-NT8JQRm}fkerL66>luI4hW|j|y)6oxi}qif zZX5Gg?Zi(Mf86O({K-B@p3}c8ab^E>lqBW1jp@BISli0;dW1rSv}*^n~L_T;#LRHJeDIK-qts@gFd*%IkK<-)CI4|MxK-8!h?7 zng0)gyI`$tTz{Jw|Ea)H2z=pHT)$yH$CwZG6LkH7@dh?bF^2%04iupBI>>rf1-XN9 zRo*C3aqVF~3&zU#0OPMP{zJySjFX>D`h13QF%C!A2aNkKmV}F${!_*uV7!X)FBt!l zaWCU8sDSvNUMK-I-X6kuf^kk>JB9Hl8TT=tGZ{}Y-pKgHjL&02G5$u_)r`N)xEOx} z4>O+69ksI0d5r&_aaG@I7@sj-COC%EUB>v$jMp;$Th_zh7#Cw@gso%xQ!bN)GnxK2 z#+Nd#%8TaNNpC-6octlW?qU2*#$S=J_8*M@?s5sd$oP*KUsognF;2$gFBo6sm-w%k zp1wGvbcbCbftwlM$@qH4YZ!kSxM)xKUA5b#yQ*C*NmTbwImedRy+3gE5_BhRpG-2kp8o^jW+u87;m%TbPN~KFSg-jj2GMR2;*KGeiP%G z4Zn-=gX~W#Ie*G{rwxCa@r^coKjUpSoYrH6{5Jd>#*1zE2$&Ahdu{jyjB7T$nDK)r z_0|6z#yf3zJ>wf~`1crZv*GtMzSxHUn(<;AzMXNe4S!wW!?ZFfrgk#l-({Sub&my8 zzm3*Y%r6qDvh!n%tNNpG7sf3_U&wqFPOq63f0Bd6Efe(iYbf(6<^aX#6yS2V1qbl$ zbjC043u|XHuG%#foX0pf=L*&e1kOt9K{f3nroYmH(c?I#SMsUgBBn1^0N<}-yxE3N zWc&vH{0+E#&_HBd5rI~;foo6)rKz>I2*YotX|+Jsph9Aq?!4=)q}`~ zR>nWJ;cFQG)P}b+PUBSTbsOU}PPJZlF+SXe|A6taHvB=xY20bOe#|(HBdyoNjIXfa zzh<2F?pQCmRyaU=(1t(B^gp-Zos5hBO2EQsC*xf<`n`<5WW)C}uJ)cNRtFeAY@`1x z<8UJST<-%U@I#ENepj6e6<7qTXZ@7*}v&Pf4c*Iw*&s)4*2gJ z@Ldl0pB?bOIpCi-;9oi5Ck^Re59c`GmpI@h4){z5e4ztg>ww?rfEy0@gAVxrIN-l= zz&joA{SNqF9q^AF@SnmJ>(359bD%%wfTtbs(;e)5Am-uvOZQX<{4582v;%&D13u0H zpXh+kaKINi;5RtnD;@B52mF6I;14?BzXE zAU5O9q3Ft{Ra#YZb5+CjI1aKwt7%%L;W*JKlEgWtP0Tx57X?3@gjt2u)#neAgE-z&t7)!U z8Le8PMXRoF!OKdmzPYKYM!_u_P9|MicYUlmqBTe8$U+vPWu-jjuyJK=T@6l<#0iO! z=19#_98DU9*vrKMkv%ZKk}7%`^4YH}sN`E;ha(@G8yllgQ#96mJ=k*i%H_4tL5p@{ ztS+kcoX)wZ9$$0xzBSd=v}o%1S(!^s-dgMHmVjqNO@t0})K)GR`amK}8>?{)r1-6C z;It^8GBp%NRYR{w6Ku6 z>#J+)QBHNu(yW%%)z_=CX{uTYd!U0etCxd>9)w&CGP6|VusNKrNhf_Ssb8tG4bIR7 z2SbrK@sf<0jZBm0c#4>j==D`iEmTO$msV9rwYrAt235#aOP1p_U#70AUs<)P1;<&! zB4vDKA{2RPtiE2J_^CV^O$g~s4;##lqmqWU`2QyflP*dOTY z54@y5a9n@j`2N64`vWiQ54^lTu&6)K-yewMZu`lnuirfR`puND-(30n%@z)B?Ju={ zGv@0zXTE;3=Ib|am-L&rOZv^*CH>~@l791cNxyl!EkAB4KIC{F2elDY*%ju_xe*E-$BDS( zMBH&A?l=*5oQOMK#2xR`DyN~w&k`NuTyY*c8r9~8YIMbwlOxdzw6A4cpS8;6ORVn| zjr10#{;qNoj-)P+HlvyEeTR98rfX4k?XpF5UO90l#x-?l4I7$39bHNt_99XHBhf|Z zidNRuL~FGh(a+%EWCWoZZ9!{*bE@f0H23s?#z?CyM{_1lHr6UjR3FcIs4QRAP%ZPO zkRZ-Ujz)SjQ-UV%ddoXuPTWREs#VU6MVeQYH9`^`)?8WF zfYxq#RcT8AhpVrM^ZL_e_;h_Z zT6Mzw$ORS;)%DGbq&KBi3f(Hrmr%zw4X%*1OEOj2%W9PY@`nWsLm@5o6!Bbm&pj`_ zky&~bf&e{3O95{3iv?s}@NIWD)t8 zP6429s$bP)N>t{I*b+3=~+6py5$7Mp+{|YpyTIF;!u)UT9|9cTCk8BFXLuCn_#;6s!L5Ai9r&!V z(7$Hk^J5Ec-<8-6FM+(2uLQju-@kbZ!`=E>X{{nvx(gUtd7W~(ESA3pjoNlz1s_;Ks z=zn9uU$@X(_4c-fo*tDQe_^3NXyGIOU+>;>e}wgODfUOurSzuwT*WxCJBU9e=M)>g z;`4}w{%s5WBxJq{^M}8?Ne0!iFpU_gVP= z4g3`U%{F=^XQvHUd|t5dvC8=;8@-bApap-_lI{lu015SNzYj;flZ9?;z`=m4C=aulUIQ2)*elKG!lm$@#7&zc*TNqE-4gZTwX`Dc9k9 z`4ca?yjX9fi}=5XKgH)#3vT7VgK=d)iq8uc`u8n-{^CIYu7&;s3;h=s+?s9x>tJ-L zbUV4;EwJJ0dyfxnxawaPV7*20`7It)epfr-v|gd;Nk=NbHH;IM#Gm5xi37d*E|KK_ zorOMx`DVI^kF_1sFmFm1(f=NQivM{I_+H+3r}U%R)hXX0F1>nF^3PzL(zW(?bq@6R zS?I0h`(F<9Ke5nT%lAnOZY|&EZG7na1-kaz@a+=TUbEpUUw^gm?*^^X+j};8RWC9} zNQO#pD%~6#uF@T4!&SQZjAwz}hn94&bD*!b(5Ec)_c+i$V4Lm+9)e7C={Eck32O@(C;fbkKP7*i1^>i?M=gBFB~kRB zSa8}CrSPK`{4opum4*Ky3qI_-c)`^pzv{FtA}lTRx|(K z*l@-FO$#4uJN$PGZmln8ol4U8%CGobz&OeIIsTNKSJ>!-EYCz6zMYujnrXuo{{_G_6z(ed5SH# zwR~$F`24_zt8(9M!L&12_jrd9+ltkJK#UF;YuF&S&|Rs_Xz$}xtzne;{UQF(+X|4 z;&ZtJew7VZ{#%I+SN>bXhAaN{HheqF(_+Jw9@aYG-?!n4|1*q}9^SO*;V%yK!_Jlh zkba)9(1$EI@p@O1X<-|#zB_HO;mTiawc#qi9gGw2uPo`_ZlhP}{oo=P?_u z_-wb~ivCZGlRR0jUU|N>(JMZg=TdH^oeZ$hyBR0_ke*e(bPG;tC_d#5d~UYj)^hxT zg^#ryU$)@He>?u@dfkSrblEM# z)fPU3Ea}!*aH}3}vf$Yk`k&eO-;OZ4er>~5x+x2v!4^J)^JKg%+^qfMSr*(X&lMJ& zzR_3ZK8f)R@c9G&6h6&D|5pn>$3mY4{1N=owZw)$Bw?+caiX=3YaX!CtA6TH8?O4J z%?^0C4Oe`=wBhZn=OLq|V3gl1{Jkq*H4o#24Yla!3=2NYf}iWar@%sgl7+s|Mz7?& z+=eT8CR_NpEqtas(9gEeTjv?7EVxzvS_eL>EV!t@yvcTh1t%RT`R}pdnZT9(Jis{7 z=2+x^$U;wHD!;$A(9^d$iq8`k{A3Hh-GbA%^osrk3xDgl_|F!6lSR(AEPSlv;`c4| zn=SMy3qAdR?ke5SE%+%GJm)+_#-;4-Bl)VGWy6&oE?}H=^IZ#{OKtSqna>0puK4H{ zKGyN?3>$qAY0x#thAaLHZMfoppADzBhOSN8+DWwqw~l9jXW{b;$f?#DH(PLP zy?D{W$C|G{+vwH$)JHa4$$8XEN2RW@Al58Lp)GC8f1aeKb5 zv(c-3Ew|xHo>m*K(rvf!x902D4)o7h=&knfCmX#=_hSpa)z1I!KtFh_%(&90l5;rY zqz7xd`4*gLmAzeUJ`G20Mw&4G}weydztE#j3 z!=~8LGCZII9qFn83I<8j6bck5kV2s;7JZCmSr-LUq)G5FrbxxMxc zj=H{{UTn7|1^QLS>3^?r`ae+MKjX0B<2=vg?xUXR>tobCBg0Y7|7E*JHEQR@4( z;M`s-qTTK^&U!sAKH6@-6|TqK>*m8aXC1zCJCOfV0YA@pU(Q~-$T;J?JUHt6w$%5l zre}M08mIpa#_4~H_`fFpn@s;^#JSlxef}&ydOiE0BXUM=7q-vX0)9pTKfi!~w}9VS zz@IPRn+y2rBZrUwz5>2<>hSvI1-$X7;q_-5=XSipIG-zZ8h<$U{~L`{|1IOx|Ij%5 z|Fy>H^Hbv-SF8_Sm#Q~D#ln86&-A~})i3?dILqB?ocr4!#D8P*p#R5@-nl*5ZnKSZ zKRma9UvHc~J;qt?&yCZ6Qvu&%oIVF1vvd6PIjMl3R=_V6erK}eb>CIOv2D1$I)j4^ zq!;74$@Cm=_Za7O%Hzfv|5L_U?(@!Lzx~hP9?xdeGoGq(mV55BRGE~#|GCWgmMkk> z9USF;T=v`RMSopd$M$(ZIP%;Y@sB??8-l$g`YFK~5BL9yamIgM0e_`{Z!=E+iO1!5 zST6l9H_mpr(Rf|d>)XcrvTf;(;HYoCwA&`r(|@yY?4Q#{WTWlkv!D2U==i*z@zZBa zaFn~h=x;YY>w8Me&OYQTjnls;IQ%u92MY9$iT(hI=g9*7M$zl||2@+)&V8nrYKiSY zJ|#Hf)cx(O0{v>^qj$-^4;$~xxb&29w$JmyQLb+H_e8JTcjO7#knz)JpWyJ(?Rbvq zS>LanxU&!Wy~gSPU~u^Bc6r(K^x0Ox_nMK*g^#v#V{q1sKHH6N$=OTq2CqxY@1z&| zlQU1s0{T#Yc5vwReD^)!+r(#6fzQjLKWLYsaz~y#e7PS9?&aPpT+7{2;Iqrj><=G( z?zWq7?1OBF@xi?v8btq!)c1%2{RyH+A4dPr73j|r{j1{t&%!m%OA36Jihg$~_bTDq zZmWgsesz3nZZ~g-Wx>&&`n>oi;r}J^uNJQU51D^siWR9(^q-LUpEmvM&~Gfzzij$x zq2FeFPVhr#nIzPwnv-}si`j|N9OG)SByPTARK0{x9M{?miQN89Ii;oH+X?mw%{ zXI(C?^n&OQmUw5OMJVy)1ZyS=&5U%@MPjI#~+w&38 zYkO`tJ^QzjvvWM~xih`y<;7B2IAW#$jNo8R66finzbmafD|{{#jyxRCTrED6#OKxm zes2LEcWN$(@pGJfXmFIN$I14Tbs^b>{SH@g|nR`Ed@y#CtrGif0u-%kz-4z2dX6HWhSEqD6eedAk#pC~?h z-{8>#{nMg9Oyd7Tf&OjLj}v`UB?rKI^+i0>jWf>kjL%D6NS6mkJG`D=Y|m>=-y8ZL z8>j!h;j$VR(MyKMry2_m=E8#7AhH z2M%#PUoSXlh`*LTGM>2;hdA1R{A#&hs{31Wme-D>pNl?jo7L)dgv2vV^gk1QbQ?9F z$Ar%bJ=*iXg`W`|+p$OZg5b~}Ddk=g9QwD?i}hM2{Bhx52@apB;Q0yf1xbJgbAFT&?fjqQ^S={8aSENVyN0p6Bsj3jam=%yOR=A1(JkM2|X5 zLg6Xl9yJmcM@zZLi{$l1AA&@FN6LeQ?{*@=NBcc^B2mx!;=58v(7&2qj33Vsk)X%x z$~b;-uLH^BL?43W{`~!9_s6lX`aAMs32jb}al*SWOzBMF@S^@p!d2fM9NMwzGwXGk z=&^2XdLdm^z^@h`{odNm!u5M-n9m0Z-e_BvyCyiQqsPlngkxW#{(kYP3V%fO4+?)w z^kdRz`aB~XV`}oZf+HTh8YZMaDQy#uI&7)Y^xfLn4tN9a3mxZ+8swor*z`QFH5-38 zd=3u|?_(2VoYO^rU0T<;M=sz~!jT8(B&3S?949{WME^w6(SN?^^*CK9diCe;PGdFV zdAFSYq;#d}*G9drG0ySQzZ&leJ?BTmYP{as7w)AJ=G#HS8{*l5g_OF5Z%E6m*Q(&q z9xv^{IoaLkKJj@{d>$$A=@Y%i^Q`cv#OK$-p}#WftG^?maSoWC^?gk^`dHStDjfdH z!~ZYA!PKAq3RYts{YQ>S3n_tP3`PIZ!l7Rg{(A&>|FNd0|9--s75@g|@VX`ZCl>fm zF+KhHI~$1qIq~P5_pI-X@Sj!SUn%hayzpO%f17Z`k1-9>f&%}d-}hJ|KK&^_+y6@8 z@ShO=m`4Z+Ot){R>DfLv3V%N3q5n$Z@M;YI+Y0>eFg^W$EF9;0`mYlXf1dvyEb#9& zJ^h~){(|`T3x_}YdZgbJ_`hU&`eQyKBDU6F8K$RC#duxB zb9#Z#xuzc-`Y(xI?=LMfJI2>Jy}W_6^Q>c>FdR zr_W)=8UIxA#~7ab;qjusUwEr<#KeBDVx0bG8fQEUgTq71U21yP>tBrbrF=*?8K?iZ z3jA+3Jr!l5uYS|BA9&F?{r|@}{kMs~Uf2KC^zYVMCtbVk znm=$qq5odS>E9T}%9NQK0{o==DDHJEBLu=ADw`|3BlM2W0NQN5uFK`EXv3 z_%)tmf^$1kKU4G?PoCE(_g5OvrQ!q5csj*L?^E3%dc?$XR|>x~aXtsXO?+NWobCAo z(c@GcKil?xo)>5+&b#CLNzaNNhB zpDFcv%JlSqUi7buKj!&CVw}{!Ci=J2dd5>N&~G=6J_YGL<9!(q&RboVmbHJzyg*1E z&+fsYZw7hh4lq&gcP|x`_+l_NRUEW89 z|8?or7J+n`{*>t%^cd&-ul>e3KWNoB=SjsqE+o96zMNOJ+4$-spi1>J&UstgjdPyY zF5|54O5vz)OSxu0_qFl!KC0g&9C}U`Qx&fI9m1g>*d3WtHi%Nf zYSoVw4t;Ovn}w@>s&MGLLthcD`nkfP?+AUnaMdpp4t-nbyM(KLrEut5Lf<1?_3MR0 zUmyB@;i}&x9Qsn|tHM>kLpbyUe~(P5{o}gw1MM#y`rgnt3s?WC!lCaDJ@0$C|6J2| zguY$4`Y#g>|F+O~35TBZH}@DH+|Px>rzL#)g=@K+ghO8+`l@i%?+^}sDfDG@kSTdP zj1><3z-~2Jsad%C^Ew(n(D#O(*TwEXSA3xF4t=|D^iS*$-;_asA zeArzDyvO+0n^Pev^%wA}an5&Mj`2C;A#XO$^CPcQsONdA-Sn?a$nkU;=lL4*-y*>W z=VhiI;b=GN*9(U}nz__3T=koT>v_K_T=hGILm$mqD#!Sl^<_L`g+t$xUP#Tt)xTn# z81-xpU^OTok{Kk5bHyi)oNx5E?0^VN0yNt75J;phn={L^$ zR*iE!Q~tXg7vraYvvK-YjMKl}IQ_ef)4#_!{rip6ziOQR<&PA^Z=C)WHh~f5kZc+l|w|%lKgY#_8X0oc>kg^e>MtXn*7MuNbF) zyK(w=86S+_IQ{#L)4yt*{^dB2vHg#X?*s7s29B@Nbf6PTsX_GMoxz)p^EoKbtM1ck zdiqq1-x~gH#u?8-pR)12V%*8`DfNt}!SwWLHa;$VT8z`D)i`}B z#wUkQn{oOqG)|v(<41*0hjIFJ8mCW}@!8?iZJa)9jMJyb_!;5TYn(nCjMJyz_{HHf zV4OZ%jnk)U{Oa)G^`CF|QE^>JPM@;z?}QJpJE>K;R#du%% zv>B(*LgVylH%^}pCO_aoxrHM$|K&2Gi50+4za!(_)-Ht;Xq7G5-1RX*14w zK{|{t4t=NbtAck4kEXAkmsbkMdHJiM?-qVn;+2}ZR9Yh(`fEbpBOLnH(61K`J)bxC z3WuKeNjC_G{_El2FC6-Y^g`Ms9QqqWKOh|XW{8pE`(oI>TJ9+0jK6HW1s*AlHBSF} z4oQSNQQ883bQ z`q3<8{aEhzLeK3+{jt%%x0wH`(6e2sUlHTWHq-wo^j*g94&G~==j*C*-mj@gfhjTm zUxrV`_>;jqj6WB=$M_4u2aNN32IUxMVKv(MjnKCk{}anKzCC!i@w(U_))*fZT<_DO z+|j}HJ}r1Tc(3`43BJKN?>FgvUHFU(z24UauMa+8J`;kMqBCOqGz1@Ioc(0k_#vUM z2uD%N>(if<+Kj&u|3BYu{Mz7ppB6r&gY)}ih!cF#KIutJCMhas0A>BIj{ECHfWem7$+&d;~hVl$II)x8Qde z-}#>3|(4aS$o@371< z&gUZ+80Ysl-Z9Safy{~VILqa8v}MNcnUVL0b;hqfDRbWcq0eC_XI>xIXPo1i9md;E$v$(+`JM4_9L4Km@a0*O|2Cz`lNZlFyVR7XrOodP z`DxLD3+6Y~X0&cPXa3^(rKYnly|mP{=wd8DKDjB)>^&$-Wd5SXOWFg~L}_JHnld^~ zlALveaM8tsyk<9O`^8Har%Ax0jI@wu3jgB87haeq3@$ZYbn)T^O*21z`o!9--LZV$ zMN676yYPZVi@zMDELfOkp`D**QbqG z=fx7bNt7S|o;$df`LD42&?502hYvn``*XYonh3VsP<=1}nG_6}0`B6SjabA8$VkjTSy{49>dFgzG>2tj;ccx|J z-_v+c42 Mgx@gGl<5%pe^5XYB>(^b diff --git a/patches.txt b/patches.txt index 8fe81a0..f41ccb8 100755 --- a/patches.txt +++ b/patches.txt @@ -5,3 +5,9 @@ center centeredmaster fullgaps swallow +notitle +rainbowtags +statuspadding +underlinetags +pertag +barpadding