From 5ed44e5fce645e8567eb7e6beabd8b8c291dd205 Mon Sep 17 00:00:00 2001 From: = <=> Date: Fri, 15 Jan 2021 19:34:15 -0500 Subject: [PATCH] Add copyurl and scrollback patches --- .pc/st-copyurl-20190202-0.8.1.diff | 109 ++++++ .../st-focus-20200731-patch_alpha.diff | 0 .pc/st-scrollback-0.8.4.diff | 351 ++++++++++++++++++ config.def.h | 1 + config.def.h.orig | 6 +- config.h | 1 + st | Bin 98624 -> 98936 bytes st.c | 187 ++++++++-- st.c.orig | 63 +++- st.h | 3 + st.h.orig | 4 +- st.o | Bin 72936 -> 74592 bytes x.o | Bin 74336 -> 74424 bytes 13 files changed, 694 insertions(+), 31 deletions(-) create mode 100644 .pc/st-copyurl-20190202-0.8.1.diff rename st-focus-20200731-patch_alpha.diff => .pc/st-focus-20200731-patch_alpha.diff (100%) create mode 100644 .pc/st-scrollback-0.8.4.diff diff --git a/.pc/st-copyurl-20190202-0.8.1.diff b/.pc/st-copyurl-20190202-0.8.1.diff new file mode 100644 index 0000000..8d6782b --- /dev/null +++ b/.pc/st-copyurl-20190202-0.8.1.diff @@ -0,0 +1,109 @@ +From be408247f1c1ff8ccf7ab128b126f54d19bd4392 Mon Sep 17 00:00:00 2001 +From: Michael Buch +Date: Sat, 2 Feb 2019 14:20:52 +0000 +Subject: [PATCH] Port the copyurl patch to the 0.8.1 st release. Mainly fix + usage of depracted selcopy + +--- + config.def.h | 1 + + st.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + st.h | 1 + + 3 files changed, 64 insertions(+) + +diff --git a/config.def.h b/config.def.h +index 82b1b09..cbe923e 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -178,6 +178,7 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { TERMMOD, XK_I, iso14755, {.i = 0} }, ++ { MODKEY, XK_l, copyurl, {.i = 0} }, + }; + + /* +diff --git a/st.c b/st.c +index 46c954b..476eb31 100644 +--- a/st.c ++++ b/st.c +@@ -2616,3 +2616,65 @@ redraw(void) + tfulldirt(); + draw(); + } ++ ++/* select and copy the previous url on screen (do nothing if there's no url). ++ * known bug: doesn't handle urls that span multiple lines (wontfix) ++ * known bug: only finds first url on line (mightfix) ++ */ ++void ++copyurl(const Arg *arg) { ++ /* () and [] can appear in urls, but excluding them here will reduce false ++ * positives when figuring out where a given url ends. ++ */ ++ static char URLCHARS[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ++ "abcdefghijklmnopqrstuvwxyz" ++ "0123456789-._~:/?#@!$&'*+,;=%"; ++ ++ int i, row, startrow; ++ char *linestr = calloc(sizeof(char), term.col+1); /* assume ascii */ ++ char *c, *match = NULL; ++ ++ row = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.y-1 : term.bot; ++ LIMIT(row, term.top, term.bot); ++ startrow = row; ++ ++ /* find the start of the last url before selection */ ++ do { ++ for (i = 0; i < term.col; ++i) { ++ if (term.line[row][i].u > 127) /* assume ascii */ ++ continue; ++ linestr[i] = term.line[row][i].u; ++ } ++ linestr[term.col] = '\0'; ++ if ((match = strstr(linestr, "http://")) ++ || (match = strstr(linestr, "https://"))) ++ break; ++ if (--row < term.top) ++ row = term.bot; ++ } while (row != startrow); ++ ++ if (match) { ++ /* must happen before trim */ ++ selclear(); ++ sel.ob.x = strlen(linestr) - strlen(match); ++ ++ /* trim the rest of the line from the url match */ ++ for (c = match; *c != '\0'; ++c) ++ if (!strchr(URLCHARS, *c)) { ++ *c = '\0'; ++ break; ++ } ++ ++ /* select and copy */ ++ sel.mode = 1; ++ sel.type = SEL_REGULAR; ++ sel.oe.x = sel.ob.x + strlen(match)-1; ++ sel.ob.y = sel.oe.y = row; ++ selnormalize(); ++ tsetdirt(sel.nb.y, sel.ne.y); ++ xsetsel(getsel()); ++ xclipcopy(); ++ } ++ ++ free(linestr); ++} +diff --git a/st.h b/st.h +index dac64d8..5a58f8f 100644 +--- a/st.h ++++ b/st.h +@@ -85,6 +85,7 @@ void printscreen(const Arg *); + void printsel(const Arg *); + void sendbreak(const Arg *); + void toggleprinter(const Arg *); ++void copyurl(const Arg *); + + int tattrset(int); + void tnew(int, int); +-- +2.20.1 + diff --git a/st-focus-20200731-patch_alpha.diff b/.pc/st-focus-20200731-patch_alpha.diff similarity index 100% rename from st-focus-20200731-patch_alpha.diff rename to .pc/st-focus-20200731-patch_alpha.diff diff --git a/.pc/st-scrollback-0.8.4.diff b/.pc/st-scrollback-0.8.4.diff new file mode 100644 index 0000000..88e0c79 --- /dev/null +++ b/.pc/st-scrollback-0.8.4.diff @@ -0,0 +1,351 @@ +diff --git a/config.def.h b/config.def.h +index 6f05dce..93cbcc0 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -199,6 +199,8 @@ static Shortcut shortcuts[] = { + { TERMMOD, XK_Y, selpaste, {.i = 0} }, + { ShiftMask, XK_Insert, selpaste, {.i = 0} }, + { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, ++ { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, ++ { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, + }; + + /* +diff --git a/st.c b/st.c +index 76b7e0d..edec064 100644 +--- a/st.c ++++ b/st.c +@@ -35,6 +35,7 @@ + #define ESC_ARG_SIZ 16 + #define STR_BUF_SIZ ESC_BUF_SIZ + #define STR_ARG_SIZ ESC_ARG_SIZ ++#define HISTSIZE 2000 + + /* macros */ + #define IS_SET(flag) ((term.mode & (flag)) != 0) +@@ -42,6 +43,9 @@ + #define ISCONTROLC1(c) (BETWEEN(c, 0x80, 0x9f)) + #define ISCONTROL(c) (ISCONTROLC0(c) || ISCONTROLC1(c)) + #define ISDELIM(u) (u && wcschr(worddelimiters, u)) ++#define TLINE(y) ((y) < term.scr ? term.hist[((y) + term.histi - \ ++ term.scr + HISTSIZE + 1) % HISTSIZE] : \ ++ term.line[(y) - term.scr]) + + enum term_mode { + MODE_WRAP = 1 << 0, +@@ -115,6 +119,9 @@ typedef struct { + int col; /* nb col */ + Line *line; /* screen */ + Line *alt; /* alternate screen */ ++ Line hist[HISTSIZE]; /* history buffer */ ++ int histi; /* history index */ ++ int scr; /* scroll back */ + int *dirty; /* dirtyness of lines */ + TCursor c; /* cursor */ + int ocx; /* old cursor col */ +@@ -184,8 +191,8 @@ static void tnewline(int); + static void tputtab(int); + static void tputc(Rune); + static void treset(void); +-static void tscrollup(int, int); +-static void tscrolldown(int, int); ++static void tscrollup(int, int, int); ++static void tscrolldown(int, int, int); + static void tsetattr(int *, int); + static void tsetchar(Rune, Glyph *, int, int); + static void tsetdirt(int, int); +@@ -414,10 +421,10 @@ tlinelen(int y) + { + int i = term.col; + +- if (term.line[y][i - 1].mode & ATTR_WRAP) ++ if (TLINE(y)[i - 1].mode & ATTR_WRAP) + return i; + +- while (i > 0 && term.line[y][i - 1].u == ' ') ++ while (i > 0 && TLINE(y)[i - 1].u == ' ') + --i; + + return i; +@@ -526,7 +533,7 @@ selsnap(int *x, int *y, int direction) + * Snap around if the word wraps around at the end or + * beginning of a line. + */ +- prevgp = &term.line[*y][*x]; ++ prevgp = &TLINE(*y)[*x]; + prevdelim = ISDELIM(prevgp->u); + for (;;) { + newx = *x + direction; +@@ -541,14 +548,14 @@ selsnap(int *x, int *y, int direction) + yt = *y, xt = *x; + else + yt = newy, xt = newx; +- if (!(term.line[yt][xt].mode & ATTR_WRAP)) ++ if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) + break; + } + + if (newx >= tlinelen(newy)) + break; + +- gp = &term.line[newy][newx]; ++ gp = &TLINE(newy)[newx]; + delim = ISDELIM(gp->u); + if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim + || (delim && gp->u != prevgp->u))) +@@ -569,14 +576,14 @@ selsnap(int *x, int *y, int direction) + *x = (direction < 0) ? 0 : term.col - 1; + if (direction < 0) { + for (; *y > 0; *y += direction) { +- if (!(term.line[*y-1][term.col-1].mode ++ if (!(TLINE(*y-1)[term.col-1].mode + & ATTR_WRAP)) { + break; + } + } + } else if (direction > 0) { + for (; *y < term.row-1; *y += direction) { +- if (!(term.line[*y][term.col-1].mode ++ if (!(TLINE(*y)[term.col-1].mode + & ATTR_WRAP)) { + break; + } +@@ -607,13 +614,13 @@ getsel(void) + } + + if (sel.type == SEL_RECTANGULAR) { +- gp = &term.line[y][sel.nb.x]; ++ gp = &TLINE(y)[sel.nb.x]; + lastx = sel.ne.x; + } else { +- gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; ++ gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; + lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; + } +- last = &term.line[y][MIN(lastx, linelen-1)]; ++ last = &TLINE(y)[MIN(lastx, linelen-1)]; + while (last >= gp && last->u == ' ') + --last; + +@@ -848,6 +855,9 @@ void + ttywrite(const char *s, size_t n, int may_echo) + { + const char *next; ++ Arg arg = (Arg) { .i = term.scr }; ++ ++ kscrolldown(&arg); + + if (may_echo && IS_SET(MODE_ECHO)) + twrite(s, n, 1); +@@ -1059,13 +1069,53 @@ tswapscreen(void) + } + + void +-tscrolldown(int orig, int n) ++kscrolldown(const Arg* a) ++{ ++ int n = a->i; ++ ++ if (n < 0) ++ n = term.row + n; ++ ++ if (n > term.scr) ++ n = term.scr; ++ ++ if (term.scr > 0) { ++ term.scr -= n; ++ selscroll(0, -n); ++ tfulldirt(); ++ } ++} ++ ++void ++kscrollup(const Arg* a) ++{ ++ int n = a->i; ++ ++ if (n < 0) ++ n = term.row + n; ++ ++ if (term.scr <= HISTSIZE-n) { ++ term.scr += n; ++ selscroll(0, n); ++ tfulldirt(); ++ } ++} ++ ++void ++tscrolldown(int orig, int n, int copyhist) + { + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + ++ if (copyhist) { ++ term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE; ++ temp = term.hist[term.histi]; ++ term.hist[term.histi] = term.line[term.bot]; ++ term.line[term.bot] = temp; ++ } ++ + tsetdirt(orig, term.bot-n); + tclearregion(0, term.bot-n+1, term.col-1, term.bot); + +@@ -1075,17 +1125,28 @@ tscrolldown(int orig, int n) + term.line[i-n] = temp; + } + +- selscroll(orig, n); ++ if (term.scr == 0) ++ selscroll(orig, n); + } + + void +-tscrollup(int orig, int n) ++tscrollup(int orig, int n, int copyhist) + { + int i; + Line temp; + + LIMIT(n, 0, term.bot-orig+1); + ++ if (copyhist) { ++ term.histi = (term.histi + 1) % HISTSIZE; ++ temp = term.hist[term.histi]; ++ term.hist[term.histi] = term.line[orig]; ++ term.line[orig] = temp; ++ } ++ ++ if (term.scr > 0 && term.scr < HISTSIZE) ++ term.scr = MIN(term.scr + n, HISTSIZE-1); ++ + tclearregion(0, orig, term.col-1, orig+n-1); + tsetdirt(orig+n, term.bot); + +@@ -1095,7 +1156,8 @@ tscrollup(int orig, int n) + term.line[i+n] = temp; + } + +- selscroll(orig, -n); ++ if (term.scr == 0) ++ selscroll(orig, -n); + } + + void +@@ -1124,7 +1186,7 @@ tnewline(int first_col) + int y = term.c.y; + + if (y == term.bot) { +- tscrollup(term.top, 1); ++ tscrollup(term.top, 1, 1); + } else { + y++; + } +@@ -1289,14 +1351,14 @@ void + tinsertblankline(int n) + { + if (BETWEEN(term.c.y, term.top, term.bot)) +- tscrolldown(term.c.y, n); ++ tscrolldown(term.c.y, n, 0); + } + + void + tdeleteline(int n) + { + if (BETWEEN(term.c.y, term.top, term.bot)) +- tscrollup(term.c.y, n); ++ tscrollup(term.c.y, n, 0); + } + + int32_t +@@ -1733,11 +1795,11 @@ csihandle(void) + break; + case 'S': /* SU -- Scroll line up */ + DEFAULT(csiescseq.arg[0], 1); +- tscrollup(term.top, csiescseq.arg[0]); ++ tscrollup(term.top, csiescseq.arg[0], 0); + break; + case 'T': /* SD -- Scroll line down */ + DEFAULT(csiescseq.arg[0], 1); +- tscrolldown(term.top, csiescseq.arg[0]); ++ tscrolldown(term.top, csiescseq.arg[0], 0); + break; + case 'L': /* IL -- Insert blank lines */ + DEFAULT(csiescseq.arg[0], 1); +@@ -2241,7 +2303,7 @@ eschandle(uchar ascii) + return 0; + case 'D': /* IND -- Linefeed */ + if (term.c.y == term.bot) { +- tscrollup(term.top, 1); ++ tscrollup(term.top, 1, 1); + } else { + tmoveto(term.c.x, term.c.y+1); + } +@@ -2254,7 +2316,7 @@ eschandle(uchar ascii) + break; + case 'M': /* RI -- Reverse index */ + if (term.c.y == term.top) { +- tscrolldown(term.top, 1); ++ tscrolldown(term.top, 1, 1); + } else { + tmoveto(term.c.x, term.c.y-1); + } +@@ -2464,7 +2526,7 @@ twrite(const char *buf, int buflen, int show_ctrl) + void + tresize(int col, int row) + { +- int i; ++ int i, j; + int minrow = MIN(row, term.row); + int mincol = MIN(col, term.col); + int *bp; +@@ -2501,6 +2563,14 @@ tresize(int col, int row) + term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); + term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + ++ for (i = 0; i < HISTSIZE; i++) { ++ term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); ++ for (j = mincol; j < col; j++) { ++ term.hist[i][j] = term.c.attr; ++ term.hist[i][j].u = ' '; ++ } ++ } ++ + /* resize each row to new width, zero-pad if needed */ + for (i = 0; i < minrow; i++) { + term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); +@@ -2559,7 +2629,7 @@ drawregion(int x1, int y1, int x2, int y2) + continue; + + term.dirty[y] = 0; +- xdrawline(term.line[y], x1, y, x2); ++ xdrawline(TLINE(y), x1, y, x2); + } + } + +@@ -2580,8 +2650,9 @@ draw(void) + cx--; + + drawregion(0, 0, term.col, term.row); +- xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], +- term.ocx, term.ocy, term.line[term.ocy][term.ocx]); ++ if (term.scr == 0) ++ xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], ++ term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + term.ocx = cx; + term.ocy = term.c.y; + xfinishdraw(); +diff --git a/st.h b/st.h +index 3d351b6..f44e1d3 100644 +--- a/st.h ++++ b/st.h +@@ -81,6 +81,8 @@ void die(const char *, ...); + void redraw(void); + void draw(void); + ++void kscrolldown(const Arg *); ++void kscrollup(const Arg *); + void printscreen(const Arg *); + void printsel(const Arg *); + void sendbreak(const Arg *); diff --git a/config.def.h b/config.def.h index 56dc300..ae91393 100644 --- a/config.def.h +++ b/config.def.h @@ -204,6 +204,7 @@ static Shortcut shortcuts[] = { { TERMMOD, XK_Y, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { MODKEY, XK_l, copyurl, {.i = 0} }, }; /* diff --git a/config.def.h.orig b/config.def.h.orig index b4fff92..ae91393 100644 --- a/config.def.h.orig +++ b/config.def.h.orig @@ -94,7 +94,7 @@ char *termname = "st-256color"; unsigned int tabspaces = 8; /* bg opacity */ -float alpha = 0.8; +float alpha = 0.8, alphaUnfocused = 0.6; /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { @@ -132,9 +132,10 @@ static const char *colorname[] = { * foreground, background, cursor, reverse cursor */ unsigned int defaultfg = 7; -unsigned int defaultbg = 258; +unsigned int defaultbg = 0; static unsigned int defaultcs = 256; static unsigned int defaultrcs = 257; +unsigned int bg = 17, bgUnfocused = 16; /* * Default shape of cursor @@ -203,6 +204,7 @@ static Shortcut shortcuts[] = { { TERMMOD, XK_Y, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { MODKEY, XK_l, copyurl, {.i = 0} }, }; /* diff --git a/config.h b/config.h index 6626f12..7f98b95 100644 --- a/config.h +++ b/config.h @@ -200,6 +200,7 @@ static Shortcut shortcuts[] = { { TERMMOD, XK_Y, selpaste, {.i = 0} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, + { MODKEY, XK_l, copyurl, {.i = 0} }, }; /* diff --git a/st b/st index ccaa5fe018e93790ebe68457621fb9827138f06b..19ea97abf360443d2c18962578b4eb715e1b71d5 100755 GIT binary patch delta 38823 zcmce<34BcV_cwm;BsUUFW-KF%goMN%5)28Z5(YzqXtlL3O{?}&u@-}o%I!5pKNw4w zq?S@uTWc*6AxWv$+EPnHshf^{398KheeS)JCi8rMzvuV7UjOHrSMELMywCZZ&%WL} zncR5+Pv!?K4y_*5pHn``D&cm|Skh#D(338z_+-iX7L}iWqzcbJV%7QPLB$EGSj@Wf zEh^t_p-Q$l*gXETpcsEujA4y+n`*ZCt;Wgr?Gs{L`msOn%=>!SD@oT@GFcZB#$d(c z3c!_>l0$4|!j`jGzxUab;7}$TLfHwwc-AN&)Yb2GK9rAO3I5&qXDr7rg#V5$@$bgY zRSso${fF^Cus*^fek9AQ6sl-j!!m?_nRu2agzo4UkjC>}6>uJmhVuPbbYM4jqG~9c z6By5;s)X(+3Jm1=rizJG2`2~T^7R!tfbJ~Rh`116F5<{Sz{D!?{2MIKKXk|3DwTMa z91zN~tHyuqkAzoU%(DGL**s<@XbCWXO8~gTnZfg3Z^pWpzFo>x@wa1PNE03VHmon3 z5*EyAhIbmpqxMEA{y8oRNtqlzDv09*ZWl26@SH!lOw*IRbjfnW8o=diSdCGm^c-w{ z(qxyS_v6lKvg%LA?P7W1Az|DA^1*S_>Zv&lR7EbA-Gf%VrixiUS|^LH9TK)g)2{H* zE@OS5U8!j|_-H?6b8Cn2Ic#O^7Gdi&n>qC>#=enVfrrhScCn9k8>@&Gymm zVJXn=*R)%Gw7F~|wE3Dg*GF5(a-cn?X;1iQe`Y74J*{breYC$aJ~AZif~LLeqy3#F zK>LTLuNnF`)Dg^ zxXlNzqTy*ixIx4F`QX(xe3%bjOU2oOI@Ro9n$2P#n_+os+OmD{*10Oa!3UpwP{p_U z;N3O6$OqqbQn9ylC;qd7EB3+Twx|(2@xdQutGF??V&&D!QSo>m{9%!b4^!~I9Ovy@ zzwT8P6MO;~_N(|bAAIU=70>d)YwX_fSKXiZunny%Cdez_WhbLU8XMbG)c$i<^%n1g z`>~1jLc%KD)6(Xnt;%xhg#;Nj?N&CtUI;r^&lnV{A$QplAc6IbVNn_q-?n1BF)X2e zNLVAUe;;i#HoSgFP<)yH==vdSMSWvXVwwLwK#JhMv)6xOMgKN-5B^iV{(ZD*EIKA6 z=#4V}SKzH*j4|lVGXK?LLReOeF>Jioe^N#Nli0SHkgyqE|2|qfy8{1?GXFX778+{| zT2$u$BoJGyF>Hm`f4hqQKW7tTL&Da2{rhM)v7FeDpe<$ohsUD);eU6T|0O^I8yLej z-`DE5eMSGdETKV2*kP}KA8ipE-XJ9C$1?xX4N(3K%GYlnAVu&WquIoFsObM3y9fW? z8l2#xy~v^)h6GhD^M3{2`ZY8LUDJ@etXe~~RZB&m_q}oX;7{4MhM2pwoKEo3R$^BW zSFont%5q?P!pEj&S-dA3qFx#q!y>%p_EN<()MpbLg(Nlc#^s|;(D21Rcw$-X!yBQd z8X1Ek%3@s72s!OoF_y00*nRMxETM5oQeSWEKH7oa*nRLf%VLjijCyQr44R-JcUhmt zh&{Pt?9II8?1N8b_Zo+U&GyFbqs?T|O+tbemc?}iwkLdSR+YtDtqJ;96JuCwZ(J!A z(~!uvH3>=D;El^i`?ZEI_QAca9kmSqp-qiJlgi5ZBoJFuW0<#B#&@b1{2mC@93K5gXenl?t>p@SK>l~j+Moj1OK7T zjX~!%1alk^TXW;68yXVdwPK8J4NvpI?`!x3AN;9?FZRK?2kN+rme3qM8fggD5Y#@9 zz!t`^Fb#?CRxu4xETKh6SVK)a!AIMi4Q~+=WG?d`-2#2Kg)u0(%zqysMeyIt>)%$< z|7+|X{15c{_tB=a==hMJF=hU*z+1m~W6=9${;S2K*5Zv}qSt@-ivE|dZSh#qd;R-p zbJ!L5|FX<~4!ngX7=w0|`9BH7mS7Ak^!o2n(f@HaF(D-Etk=Jf_7clU2no7g=6^VB zPx#n8D2r=J0>-zOEBg0)sLhE!comk=G9;{qrk&uU4P(Pwh6F`x+N~_QCF-T6F(^Sp z(7%8bwKRrx^!iV&7;iUr5B__5{rhO&V9~8Yf`*p)zXID6J~rdZ;;Pmvq`$FeMgOzB z@%rG0y=~qH_x6PeK6rI@1u01?E8(10sKM68pt)tGda@P9w_X)vKdx!xeQ%h z(ekp`2luu~)V>+DPq4YUMvh&?c^VvKvW9Z4e}{NDFkYxKc8Xk(_$2lv{i`QVva z`HWQY0c9HuZ-5Ct0lb59mJjZ=U+jY~&?3lYDQ!Z+Huz|lKJgBS6WfH?cl&6w9;@0D zKDcY9ir@9Y4{5luPsKt!s^RfI_&E(vQ*nD)=KuOZjbMUL0587S2j8pNZ}q`FIa&sM z@LO7~-mQSY%yHi8Hfo1O-tC?jkN3eBWvdaS`QV?hJ#8l`$9SrqD?5G?0JwH^No=Z* zou=*iaHzvA@!EmTDTjZ&V`7&YmA9we546v_z;PoNLSGW~*yHiU&LG)IvQd$*{=#u1 z7JL09-0Ci#9AXo%+8o#Jru9vA3VSm-&gRs=st`-fxg6&)Ek~G#hPqbLSc0As5p+b7 zo@AJ8k}w;3TV`%Xkf%7@PH~k}Y)1R;(`!^3NT}t6C50^5(0d4eaASL;4pBip+nx^jPI>5wNITFru zwsen8G96?i2Daqqvy}s5bW_9G!GSGw&BNK(ofJ)#0OU*hA6cJ4q4vLEtvf(j zHFPnPz!%7KQQ-NKa1BzPtaB9enV!jswiPyK%_C%JYkUX=xAzfc$A9q%!@I&quryTT zkn*MAY+{;GGJOnAObg9-c=!xHpF-;wC_ywQ;xD$w1-2+>>unDV?*w8d8X|~ZO zT6%+(ri6;-USTY7a6({vQaMc*S<2urUdILwj^;P8S%V|HeGtlXv%(9lI%5PA;!Kr< z7p(4(h`?AVMN9oq)_F+NX5WOML;PT?OKvPPh;tVyvi)ndg%>*yNP`gm9z z|Clu&Ry&|Q7UA+`)_a&W)M-L1k@*xcAk$;`=#v*7k5o$%CYji#VRf6n4y7%x*dGb$ zO{|}PaB1=*-Y|av?EGpXrq?(d|5Oqho7kga=BlMN%k1y4Hp83P?EqlD3neTG41#3J z#69VRc+$|TNYsynU`R#A-yxkaS+O9#%%X?aqC1$q$dLyf%?#e=oc)jd%5#rruTpK9ESt*CDS=F7JkDWwKU(1B+QDGgaeR8VS}REtMF@aFG+-25;iJ;6rgCAvA5oA z6}Wj8wKB_R?DIFrHKG9@LgPCer<{k$cOH5?yD4{W5&65Psw>}Nt)ZkY;m6ed*G(WQz%>nt9V?S()YDjZBkvs&Zf!p zZ)G&@F8(7oWi8+8YukAXBfUQ==YU#XNa@04&b?Sc9Eg+ev5!KY9#lyPC;s1EX#5^-4WqV)KT zRENcn6d9c*(-<&$f9V`o`6QDE+Q}^(mY+a%84V@VDKHe$PNQ^)q(25Z>E29z(*2AU zyD7G$dl~WhN#;$!?T=MD^G=e*Me+@m8a~Z6?99zivdkm!l)Es=G6$RryAL@m(;;~> zVhe>nVCYjQq!WaXWbO}6ve;h+k!7?CrO?FZ;)4|NjGPCPLZLQv6tGY*X`Ccb0@V3I z6q6cRTVL=xV?U9`qj6)m%fGry0!T=WDr8e@~$d}D=Gf)yv07!Z= zvu%6fB{-g4LoyW*^7qX4?l?ITX?2H4rX2+RY7a~@g~4c6l-vNW)q$yl$)(!gOENtN zH|rX_U6)Mv2t8rHAl~!S&jK&%r{eBso=&`Z67G`a2ex9=$b=~H&NNR_k)iiVv2RS( zE}5m%-j#$P6}BebwHkWe?~-}TkoAmeL%7KjMo*3Vqze3WMh098Q*}gPXN)0*eo?S- z9O1h=4jWUFZqLNsmH30Rxsf zh}|2zCFv79$dW^@dprlJgUFlzponh<%Kq2DV3HSG_yLdR&X>qc&@wHkXfWC+1AFqsQU6S548s?uuDs4Ra*Jl(D zra=syR=Aj7Knh8a*sAf_{9mm7yV*5|Q)ZA_jD~qMVSv_Qcis)F-WvHuZuFE#B{xYd zd_v3M2|AuTK)o9C-dG(QFd;IuCm>s)&;x`NS&^;5IrNvp z)izjR&FQrGPxJ=-43OFkm#~==>jpi&jD({ltYm8^TKIwN>cn={$4>BCm;4RaPRjz; z{JmOrR{Tz>nOxmA_i&(*WO_dIM$#NwZ{=U6vhpio6l`JdKN0WpW!YNV>lBnbqNr0q0fIJY~SB2E2$1LEP zxrVI%2&Whh0sy9}{3;mvfRc(Mg>ZvNjVL;?P!79HMOPyq9n&zMPUew`&yh%ZIQu%I zu6+)%gQyKTEi;KvQ~4>xTfwXAP^lG_Bw-vPDTfUq>?YcViYX=DfUtAGY|^ACZ5?ZA zM__)Lp=54*0co*2Ee%Pr2@0ib)C#!xn^&X~l8={(R7CQDGSQF3EoGvC#OyLLn8YOz zQ^h}1(aM)!@D5q2R9sULXGb)yG^K>7a@&scR$dEixusdy;ADi!@n!l}WqJej2oTQ# zr$igx$3mfJ=BvoDMKaUQ#8jB zG_Fa)awbiw)AAXnBDInmBf;n$G>C@g%kLv{q_Hm=D|$Iv>H4us>rcPHE=&oF{Tjh! zKT;}-dLdM4=KSnFR!MIJkL{e^!@{NxYP}wfoVV8=I5=N?Ay=hQ2$LGdeZUwJljPag z#XH!>koY%0`zo?B>jm35wMonFfSePwVdEPNI{DCb0EmsGg@|Zst`MOGh{OEW3nol! z8JLN(N_CnKu#VH(+6NBDF@_nHcYxMZR@6mzLh2I|g<2w{Eg{u_U}nyUG3*pJK8L#^ zU6zmy<^Zg?gLIQWLmEnC_<>C(*%Uu_|3-nTI`mnP`I2K$I$~#ne^Ekn6niwSn*G=? z_+JM}^)eCSfzVv9xS2#QSxrhdgpwI$rd>(*ujxDz13A@nGMV-+Gp$|G^bHa*S|Wq? zJ8}=Qr8gERyZ47yaN3+KxjCvXnha61K%!K{KuC##poA#=bA&JXRY9;!A;e7xomV(4 zU+n`i%%=v0f=Mb2IZK;s@4~v}9vhs06=d@uhQpEbthz=Yu zLTP3D*t{9db?`6BqFv6_{SyVz@t&`eOrmnjWZ^-6Kq2VElDFKdVxCEu<`E) z+4KHJqVd7}TA;Co!eNb*gwj3O#|RrBOTyo{i$XT;wsg}(B6(NUb016|`ytD_&!BG! zKOszeAq~K!x;V1w3hTt-g_>4;$BT|+OS4KY~tCt2c&djhE8Q}%3Ty@Xbfr*%MoeDQ<|u!AgLf?vp`Uimm= z=U}WPsk8e(WxZzAvhRj+RvTNo+m?6T55`+n<3{o#HSh+nY=?}cCISa0Ma~0iKiNI~ zcbl`>B`N}%UM0&Uz;Zk69&9-7pnwYcHlZ;p+MiHo>ra(1lI0aW>4H>U*C*`mtnlFX z2)c4laWdiw3!U8%tLo(0Vf<+}V0IgRDO)nz#DBoPoE;fC2#40~F>o3dqI+`^I8m?x zvx*kWV|HbBP1`_7lBEys@(VO0s}yS{yuM0_aq zjS0l@Vfv|mn;+Jc;t8rI(>yYAxczNOzfBSx?YWHmlJFrj%!x9N`i>m>FSdzCZGNVX zrL5ze5$#+!P8?ws;~1z_G%p500T@N$LzRmVh50HMB?_~_8FpG@8fFPoAFyQwN3*fvSRoNrMGLQ4vy1QmrQk66^)NZs|mtmE9!w;nxIO6+fiSRRAOtzM(G znPL7!3}lk27*OUZL)H?i3}F={j3PKt>WO35!;mE55Lx6-nMIi@wxfr>U zEFXi#h-0)SJ)RtdP4owlGpb1D*<{l7b#{GT>sGITcO(8acc`-`+@-Rll$gE%P~dOm z<|Jb1^dQBlMF)qt|FDmPd4{ezjaA4gK6N1fPJ!cco zi+^F1%^O7Nw0yx<&u`GOJ_R1s2UEsdm{AwuzX39+3hPou3rW;BBhOdQ{EVhwF zifUmd3jxWB_Ga-%l&rjn;xKj?GZ_Q2WxE^5gI+9QL5-kLCF#OMH|x0|%>K(!gsxex zd|siz@d#`8tWYsBw6i05$674Wwf~I4rPYKOBHsSn&c2@bZl) zjG|xoqt-Ok-r?#&zIBm@*^LEB&AOptlMR_vx>fL6kSq+ST-$H=-w+xvykV}G_&CBY+S7pcX%422rAgeuI?rtGQ+Bujxr{Rd>8FDSJ zJ%wW1O99Mo$Oplppa@(?pyf8eygPo58@!x_wMoe$pryhEpvH_!@;Gdv+|%S~=(FyL zIP5%w70{lSVWJd@P5f0E!@hyFqxh_&2{q;VMGIJ9rP&_{58(zjN2yT*`Vbs z+&g9@U?q~nE`HcTH|;N`mxk)@7P0YCcyFuXWg?Fhm)wAFKhsqt+?Mo`TO?sS`&EjvFM)^5T&tl=F$Tu@ z5F~R~c(6A9Q?ew1k^jUHQ?jKB6vEr(ZTms6ihufWUD(2FVVifKj@#}hw8<}XwL>84(= z{dbumSyn-ommNZw;vmJKKN(2EJPtQUrz)PmCgq%WITt)Lqf`HAU5?JObweKjwB9&lTff*st;pa1IE8P_R z^FL8dPk8q6N44xrQM(le$OO#I^6esQ*|%f0RpL(}%=6$x5>hEX)aX6QG7hYK1}#bw zMvzY540lHfkL8B*WFQ5pOUAEzoD+DpG{2Y4;jrJPjnew(fBf3Dba2NE(!0eZYZUn zfR+6y^6HAgV#pNXd{8xpKhHz?s1hZ55LuEf}@8l(Kgh zhuQwQ2CcpwaCB?>;)6QLjKQIANh8JCWq@Uk`6QWJnBweH#hIVtY#BSTIJ9MUc~eHF z=GR~(Szg9H#o4z5YFOTM4zBkG02U@(W8q7p?7hkdOM!q^_4s$W2{qR#iea@=@6Jf}P=j#q$UJ>Mekgol*$O)Gm+5;dMz#rbs9W6_^4I@ zm#EG|n1l-uz~+o>g}Jyp9wD|IF*kM;%sI4;Eo*3vIUJHC?7&?V`d?%Bmc-lZK;YfS zMmY2}!Rg$2;3|XjckcqnfeUnR21ki8y4Qfa2`qEd}tVPNK4ATN!B~UPv{#USg^Q04a zQHUX=0En~GRmYP`Q>%!Ao}e8HbWVd_Tm_V^K4fu^V~o2DPepmB+oZm+ z_wS*{vY;t&TjL^dKlektRp(-*-vz3yRAXOvgh(gk2U3-C=)Iq7!pY(J7_Edk&k{2X zg-8`LfltX{9rc!5XuC}SIV_c~u<&J(_UpwQH}e{n-|gcrgPrxARmA$|C$OCTxcdf< z<3ynv0+ftJct=r`DEN^yM3It3;SnrL(jehHiVk8+tfaX$R*d_DG_=Ha+-fAoormNo z!q)vT!F6GTGtpu$1}8C_fMnFbAT3$4z{+M!@+D0XQ0b8p9!LDPtZwsHp~6fy6GU5n zmE1xVOTtS)B#RAqyyFBn= z+8NlpWf*WyPVCH9FHf|K-_wo^8yv3G+K*4((;PZOm*dLD>QWD-yu0r6w!5l%Nb^HH zPms)Aey8-b$6Y?Ec7{w^x}!du0<)#ZMG?unj<->STbIH5H9Ju%GyuqF=u3qlVhou} z?FdsU7$NC0LM78pSW3cP+&ej|Hc84eEL;Zzt0?;kCjqt>KF8g#Xa_(^pHIf7J-DN7 zd;x+&m~{jlGV&6H6vuO&Vg7d%+%Ik^0BifW;UI>EKLMMg&jQce*hyE@ntj0{#odXh zDXw*y8CS%1TY$n*-VsrY@dsK{r<(-T{O?O;=7q!}gC)_Z&k=Kb`g1zGf&vf^{n`ub z*vu7?sksojSuBi|XGiy>Yo)8yHdOd_r zPXB0Ix;a4cYB~)g96H>WOh?$DmC^Q&itpn<@!S}9%+c1y#n_JDlcOk-7D^;nE~x2u zSbl*G7NVgFd=xN!a9#meZgQL2?;e0O)0?(}$;`E1EpekA6$sbK*dZr(FdG(pgV$=5 zRlUws$X=|hU1i@ndKP*OyXcK9W>st}2V@L{86fg%I-wGUkpyA#Ylbdh^Rx7aNat7G z_u}ygA3NY2o4G1eH{t^GTRpx`(_gUykd@G|z}Vu7Fe1eT_v`6%w{D&1*0uoF&{H?mAS05?7)nl^!E zp0W$J^!$PObX10S=Pb)%hauGj5|KOjOaT_7rCq zk2Dr)bPVNHHRwZorayPT1;l7`9O7+BcX2Wm=y+-NizRE{vjUT!`b} zV`ovaJ6m-ZFX6eDjF>p5m3vmEa4hTMS8F zy^TfXgy>$G$C7fcn;3bL%nub}nFS(`+|F8kk@T7c#-+k-yy+2@5i1FGa2&048~y|a z{J&{%k}Pw{zUCG!V!RIoYcg`5uh853(Q#)Zyex8x<$V#Zn|+F1`l7XN>uFYFO*`G# z)2#OzOQlEzl@q^VY|Tf>jZWfF-f-uK2ZkoyYd$a-g;$Zw5h;%gINjtxlDk2EVCY}; zz)&qUCf+LEcU%=x4q_>Y?rPDUX2aLMs>?dTcCKwU_{K(MP?39YqKe3;Q6Uj;ZBgfF z29^5$LuCxI)WeUWJ!ntY%`dvC*azPLqguuz?}J3;7}P0QkKM{Tt_!!HfB{~4l!RY@ z#tKO|i@U*@g<%lpIM<`gkV;MTv!x4b6&t)e>nD6lEY9Q& z^Cu|bg{*&dbHQ50X@OR8WK}EHNK!m1;LOjQos;h%Zn=X1$=m$@|44Ns+(*#D=Y}r#tu)o4Nt}X9R__nl$B)gTvCZQ4dk~BmuH$W)Nex9!=FwK6C(BpP1g?>4oC4V_0 zWY=+Iu`mU%Gdb-#v?_nAVT=B=<81$zF^%6q3bCC?K|4q(J+8~y1WTbX!-dHv7~~?Z4tdY#A{4%vS@YJ94UN!1P*vZ<`%51m8F_r zT*yys>4vCUU;l_cVwg|s5R}Uec#?#ZAF`txQtPdT3X%My5KAVAJb@Y_UNTqACLLpm z8&gejs@X@XSqPcwHnEi(V|8nevD}Sera8yR>3G~7xw@o0tD&c5)G>B@W0STCDwdK| zIMZyU7y059(>h*LLr;A;A($95bH#!bLzhy?c? z=YVt(Ww^7V>G)fzyVHZoX>cT0`4a0)lo9rGL@>cf!k0(cw_inDJCNRk7AK`*Uc+NL zyoY}o;bI7XXFX<>(!+s<%)y8S+#EyZ9B>CvY$zj(2a(G2Hn6Zwuf5(GJc@0tLM(Bl z2}NfusY>gA)TOgupjI>0;JQ>e^aIsEW-X{oo{~-E(;|4Fj>n%a8AnLmuM61WO)s0i zfGJ%2sje47lBaH9F<-}Y)q_V?DaW#3DLh4^Nh(D;6vlXWFhzO#gn~iN{MDQ-qwtN^ z!FURcCBb}@ee`u)rPm2AS<4Q6J-A-+Y1B83%XqaKqqq1Rv423RlPvFo$OG1~l+B^F zhN)0@f?6vB)9-TC9QN+!P~C_kCT@-FK^J%Y4%#=Xckpy40BpOo)6!fzaZav^!ie&6ALq(3d{hG ztUM@y`la=3|2GMh+LP()U$95tvR1Xbu>1jq zffwk4sYxWEfg7C9Q458g@q#wF*8h-=xjP)ZI=?zCE(%qDJzKFQqS7MbC#+%nw$uro zK!&x;84e@m(RJ+JmT0?6DHbgI@Mv)=JdfyZ82{r4Lks=*t{84Un5E>>+zBCQ@l^5| zmAE-k6Mut90S?nTQp5fPmMX>`JWL_zT%rpV!OLi+SV(0ap(qS@auI{@2~6yU1wU#K z=0l+lY#$h!<%+_$P?8~`{$=PY^6E4X>YyfPAmZBl7IFs6reTj!KWfAlium+DYQ+20 zjC9tlqA4VrlAVIK(7^p=LEBT%m0HkMYEZeo8tIKswJ8%J&uEyVEaValr1DTL9QJoVeVY5^+ffQ({f!>C?Pm6Io zQi0Y{|GvS9wsGH3O-ReATNMC z!e$tsiyWqE_BCJ+)mYW^`XQJyHN~~cQhW$ooRWIp7-2pBFdR$MLcNLiv_s)MMPZbs z+AgeyD{4b$Mi`o#YQeqX!~4&%UCq3SJLT&=7?k`DL5*$$e5eJ~m!fM{R&tBV6zxgT zvrI9iOi_;%<4NJT*~o_R-N>r$Xk&i|G04?1bYR_ta>$0L#6U~s2{gbM)rGLr97-7o z%!Vb_36bc8KYoI~)uLSAI-LxQ1{e>tAf`9r4dr+{Njs}o(|(40h(b?_%8piog^DE} z0;jwT-6(%F!k}K$Ql0vB2#MG7PUn#y{kM?z2Kp;LzXOjk<{mVvSHmjBt4yY7Zb;Q0w{Y2;V2mkk#55n-&Y~x%;9+9|1;(3r@~r3UvP^Pyxu1Lob+&%((t z741&w86?_0%jTTM7jSx7>^J`VKxOnGoFKbUFsS}(rNa6BOxo2bI_{dsQz~rSk7Zs) zRhwgGOcWO4)Z&yqyZq&Hc4k+f;HA(biL*fDX)e}kch4aM&EN4Xd~Z&0Hs_k z-AI*8s`^l=>8q@IchV>x@fR8L=yl;I&W>Q)*2|0-rr_P!SV zZA&HFufeOl74=4M=SrOuZAm9G+S!tX=X==ref2{7qr~XI;Ti>Y93F}6p&{q*VH@_v zy|I*nNu86aC-$QPaW9597&^@%35xgad*EHKn7xV}RNQFDHoTvU8kgeUCL!t20$ASj$l> z+3N2{>soGPmG;*OJF4s#F^pc8>!V?~f2EH3Scu-uUfSP8_h=Uzy}yTDK+UQzJ4vRE zyS)A+%O&t~(Go;POG*mq&0jReShUOU$smNq~N1Y$$rYx^?FE8bL3|utr>ivLVRZ}#no2{v^6ZW=Ix#c|-*_!IV{MSwUCVAwi zpsnhMJRAj29#RbKa2LbQYxoAPX*@z0s+p#OK#YhnREr$AlQlXRp`U<-oANNNRH(L- z^*I=+lXkKR2kVCRScd+Bxx#>!Sa}gj$+;$*eR;5sE@KfZJlMYe(C@HGK@mFs z^iRQtbM6fcj9e^-CX0|&5orA+7Mt5jmvw;+$Q@UG9+g$OCLMHvozIQXjs2EA&aJCk z{sjxoYiS?)ElPc~lS=jdc=^ggg=s`{s36xzWen8z2mk^^%lRER{451$J`D~dUoHq< z{=?nb?;r8p%E!}dia6u?4uC`UhiKeSJqqj8UYF2AdduQ%OaR6`$m}`87GaqkhNAF3 z?uIRK^GS$%4|j~1zbnK-5y-0yRzeZg{hIz4u>|dBHwb2;6)gX zC`EKI(&i&}_E7zZYKj}v{cTjjWiKpDiT$1*)^YY(bo#q^?yU@e zk|l>?`x+&O1yi!k`H7Nrb$j^%skR|^O0sD>KeLdvJ^Z@P+LA3g+@;&~gn#=+P)q6? zjZWS-3_5{+1KQtoNzqrU8G}w^+6uw2peK!_)AO69rwJzD@`N}p@q zqH$`RySA_cN5XY{0{iVqs$s{6%1|z5W9cf_ax!y4yO4IUm%E@h(OxJWqbj)`9M3)| zXc@-GBPJU*Kg#e<`^Ypz7M3-CRua0CQq9y$$jS)A_i3+%K>2p z0nr(^c>ucFD}_SdCafROs&J5g0EYh5z>?9zSDcJ!;f^5u!KB2 zU&Z_I`6it$>D-hgn|PX*X?a&sQ>HPSS@I8c?c1Be+ionz-8*Pk5s%d};?!*7-~x|6 zMpNOX0;a;V_(N0+%=#;e{sSzq3WbKyQlC@yn97_t_a>b{(YKW4^&g-)&yV>BdS$IC zp9O%y>8DM!1EvK>4*_vXmILr2kII6zu$qb#kx^n$MYWZwSdF$H4Dc+A0%q1jK*>B_ zHMUdm0q_lNp)eR=6r$`d7Vp811;b`z3WZqpt| zvdsQUi5^cCzitA~V10uBevt!^nx;JPx_6@`nKBSs9T5M9T3$weMWK{<+EAw8$Pe?x z$B3h zS{omd^dCU$>|6PTXqrhuq9};)wi2WmK}_!{LFnx{PD+ljHZGD(Z%`1c@dfsN;3T29 zeIv!7bX_Zjl(3c&_EJDm$Ol0a#GPsuP4F^ULw0>w33XKynTS)E3z9Z6yb<;tX3E59 ze0$?MVWTn6T>~STe#2cYpNoi6eq%nBPl3%}6fSLKmybo;SCN@M4NAPEN2!u5F0#Cj zUa8K8*@TMc(Gu`wHOVraw1<_JM04c;B|~p*fQ_1;{%~lMaKd2eO_t$QBUsbn3)HYl z!%=K8XbRSXSPgRAATl=9Qp&*GmSU1Dp%m@`r8NDyE$@cE9R4|_MTk<=dR`%>Hx**` zQ;6jnoXSI$Gz-ZpbaDgx?Z?`kz9r4ObIAi9m0+Q^}N*ZFGOFVbf363DLcY zeBY+GZBwxb#(dNQme1F+Z%)SPep<^eoor^jrmW@+^C@n;8$6taooZa?9Z1-rV6$S4 zi7FKgYfuV?`Og)TN^97#QxPdwzQEAe6JOTXp9a^(u%#GpYR2ej4H=c9ehpl*Oh7={ z&yEB-4r6m)_P-<~;dTz&e`;h(YlOuUvJz)c9mez6#w7mhX15M8qA3&rmix~}LG?jF z;oq7-7E2KIqZ~HkbbWgk>1#ueQ=%NG@(f#!JMwf^@v32qX%`U3A)OWP>ZT|sWa@gg zFNL`=i^41^7lvX-rc85{P`q!bIuvRfLSfr61SU!e`03MfSd}y35jTOzc4$kcD#s*_ zoAGFcX#18`_z!JoqSLyO!N)M5b%SKKK}7Zv2<qHL-vYm$Vrz?dS zKM=dAZP{%5nTEQ%**h+rY0c{{f5fW&@|AtnXBdug3`|7bRjY$Coabj#e5Q*~A@)lO zu^a%AlV(r^rtP0YgVVTDVJOh3j0W&SBRS0gQcWEK%~4!fL<-cG0#V12gz2BER_=3l zw6O2VGg@03O%NjtTPy|ujzZlC(Xx@a0v@2b6k!|%0L{w*D*JyVVKIeunp=l}h=s~@ zBL6r|i%2;|K)-H-ND9f&QH0S#jnAnc2V}4Ef98Y`fyV=a1kKdn)_j^ z*y`W#2B!+pKfmio-u1f_VmhqE_1-_SAF?J2dmxtdM}I67R;^}Fe`{Xt)FiK`+?CMP zd_j?z(vKjLPs&vDNOhU<7ow}hk!D1h#=4SyexZpmz6=N;)Az``yRRtyh&8$xGiU|?)Xy@gIh^c?!b}R(UkPN&ra+meGGv>ibN`|K z>%EjW@b6B3?TnG~_3q*?DX(=GAEoq75&wA&8=WG+uckJBuC(0F6L)O7*oEI-Jk8%Y zG9zO`yA~}tqLaX|sn=H6zeOvwGmnR;_gVsZ4X$$#I|CkWFJ^a5xWPH#(bac0 zV0-pI*nb9W`+va6?^(oArJOGOU*298aqE9U&)WZCqDCOh4A@=+r7+&Bd}ip)rSft` z9`#>7vaN7Jmmd550H4c?&Bo5Y9j>OhMwYu?1)r~76xM6+rRDwIfgQ=G>|mB@LV1J# zSG@iIRYdf2uRGYh12Pn9K41$;Y_=ja~_3hf!)dLki@* ze!+V+Cd{Y*H!u5t=iG{h`8KX4xMm|^U*Y-%7rzGG4%ZjB&f|KD>k$&V3mc!%_5UXL zgL3>B=$7CrAK&ZiJ$41yP|mQt0YyR)_rw)}>nQ9fF%)q#T=yaGhwKgWh$8sXs^GIiA%(_TnoPjbgLb={TlG!IXng%_y54|AJ{}7aaBJ@0&(@n)fE|g57%e7e!$fU zB{mvY4la8hZu?QRb`)nZu1k>V>V^9B@~wdPFQ+5Cj;5bb&dzI3lp>*sO}MTh5g)^j z5w2|J=_& zPbVz_xf*={T6oRld5((`mUjK$#4XeKW1vIJ;ob~*6EF_p+WyHtelpJ<QxnUm93Q!|xGUy}Ft)SN79?xOW&q2?Dj(XGMi4i#N3(!Q+>ggC$7YpRLA3+C! zPQt2rL!cf1S78z&05B4i3*xx?8R(Os`Jl<5rJ#dA&rd-BQ2(hY3DCBn^iAgi(5jU= z?kQ*^(52W;B!kYx)_EbQh|P2n=|Qi7R>$t}AJ7?~Mtc>Gy8@;)=p#@YXdOEu1a-_q zgrEx?h!Au;Xffzs(1)N!pjE4K+%KRppd1d?CxCVa%>sQLG#fMkTbqZVVW3s@99L

aG28;uk+;CmD?XzG3>5c`}g&=^p^gGdnQ zJD?e$g?S#&MNt1kDC#F*uH<8ouYvP#P#fsFBOcFU(4+#S81!vW8T2bqf9x4AfkuGF z6r$=t(~8h&LFt_~0lf*j^At*;7RP;g&f}R6`r&!>4$$YIKZ3To1U=3$wt*&s?gLE){q}c{ z=Mzv%F&ZK0D$ruk>!AOD#+t5pJT*g6w4jYZZJ^1ZbFL$Wpv9oOS>xvo`6AZmc?)61 zD`+b$^LhQSVFQsjv^wtx^+d<;oQ35*uVI=t2#@qMl?`-0u7j-P`OBj$gYn*srlBy` zaJ>m^LOJXS_yfSw%VGG3s+@j^#}io&ivm^)Shj}6gSH0t1+da(C;1v|>x&4}TSGmb zcglsD35#9q%8MF8JB)5tS4tH=hDCbn^DSA5r#2tU2IKxRn~wi!JrBdzKsc(&j(b7^ zHbZK{v)P{TW&V5wzj|3TUzfkREQN0s*<}Qp8pY8g*yzyp3l2=l$1g~7Tr)p>S#H@9 zzDDDIuvk$p6@8((2&{#MH3A(8?D4YWd{e&HvZws3{8?8|9#M>RjpO;3g?tQ=-%w&) zCwaaG-^FzuKcvYIb5+yv4Z|Lc){3E9a53`7q3*bw7^vTO_0jRQ`Hx-Wbo|SFW7i%? zk%<^ATT#5$U}LY!NGygEihm(S=H9M*I=J2LiuB`ahy4IcoM@0`lx}%&Al2nfSf#r9 z_`#p-`qYna&+l=ahjE-9Lui<4Z0s8xs1(2kjNQS&M-q-t6t3@qz3Gbf=j%6K2NgPs z@}cs22o+(CHH_j5#PGe>HO?RLop$ZaHSaeP`i>R=v*tXtA!nX2+Icc z5wKVVQL%4Wf__~#?n9`1Xj-D;B+s~t2 z3xfFAprybrV)p7oecx3S#Mi8I7|?S-<=a9dxV#Ab!CKefL41QcftdX2uEWr;MXl=` z97wek1-$n<7ye0dn}9*!JAdh#QJHTZuo!&!SFUd=^L6Td3% tqxk)o?5cwA)kP5 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 0 && term.line[y][i - 1].u == ' ') + while (i > 0 && TLINE(y)[i - 1].u == ' ') --i; return i; @@ -525,7 +532,7 @@ selsnap(int *x, int *y, int direction) * Snap around if the word wraps around at the end or * beginning of a line. */ - prevgp = &term.line[*y][*x]; + prevgp = &TLINE(*y)[*x]; prevdelim = ISDELIM(prevgp->u); for (;;) { newx = *x + direction; @@ -540,14 +547,14 @@ selsnap(int *x, int *y, int direction) yt = *y, xt = *x; else yt = newy, xt = newx; - if (!(term.line[yt][xt].mode & ATTR_WRAP)) + if (!(TLINE(yt)[xt].mode & ATTR_WRAP)) break; } if (newx >= tlinelen(newy)) break; - gp = &term.line[newy][newx]; + gp = &TLINE(newy)[newx]; delim = ISDELIM(gp->u); if (!(gp->mode & ATTR_WDUMMY) && (delim != prevdelim || (delim && gp->u != prevgp->u))) @@ -568,14 +575,14 @@ selsnap(int *x, int *y, int direction) *x = (direction < 0) ? 0 : term.col - 1; if (direction < 0) { for (; *y > 0; *y += direction) { - if (!(term.line[*y-1][term.col-1].mode + if (!(TLINE(*y-1)[term.col-1].mode & ATTR_WRAP)) { break; } } } else if (direction > 0) { for (; *y < term.row-1; *y += direction) { - if (!(term.line[*y][term.col-1].mode + if (!(TLINE(*y)[term.col-1].mode & ATTR_WRAP)) { break; } @@ -606,13 +613,13 @@ getsel(void) } if (sel.type == SEL_RECTANGULAR) { - gp = &term.line[y][sel.nb.x]; + gp = &TLINE(y)[sel.nb.x]; lastx = sel.ne.x; } else { - gp = &term.line[y][sel.nb.y == y ? sel.nb.x : 0]; + gp = &TLINE(y)[sel.nb.y == y ? sel.nb.x : 0]; lastx = (sel.ne.y == y) ? sel.ne.x : term.col-1; } - last = &term.line[y][MIN(lastx, linelen-1)]; + last = &TLINE(y)[MIN(lastx, linelen-1)]; while (last >= gp && last->u == ' ') --last; @@ -847,6 +854,9 @@ void ttywrite(const char *s, size_t n, int may_echo) { const char *next; + Arg arg = (Arg) { .i = term.scr }; + + kscrolldown(&arg); if (may_echo && IS_SET(MODE_ECHO)) twrite(s, n, 1); @@ -1058,13 +1068,53 @@ tswapscreen(void) } void -tscrolldown(int orig, int n) +kscrolldown(const Arg* a) +{ + int n = a->i; + + if (n < 0) + n = term.row + n; + + if (n > term.scr) + n = term.scr; + + if (term.scr > 0) { + term.scr -= n; + selscroll(0, -n); + tfulldirt(); + } +} + +void +kscrollup(const Arg* a) +{ + int n = a->i; + + if (n < 0) + n = term.row + n; + + if (term.scr <= HISTSIZE-n) { + term.scr += n; + selscroll(0, n); + tfulldirt(); + } +} + +void +tscrolldown(int orig, int n, int copyhist) { int i; Line temp; LIMIT(n, 0, term.bot-orig+1); + if (copyhist) { + term.histi = (term.histi - 1 + HISTSIZE) % HISTSIZE; + temp = term.hist[term.histi]; + term.hist[term.histi] = term.line[term.bot]; + term.line[term.bot] = temp; + } + tsetdirt(orig, term.bot-n); tclearregion(0, term.bot-n+1, term.col-1, term.bot); @@ -1074,17 +1124,28 @@ tscrolldown(int orig, int n) term.line[i-n] = temp; } - selscroll(orig, n); + if (term.scr == 0) + selscroll(orig, n); } void -tscrollup(int orig, int n) +tscrollup(int orig, int n, int copyhist) { int i; Line temp; LIMIT(n, 0, term.bot-orig+1); + if (copyhist) { + term.histi = (term.histi + 1) % HISTSIZE; + temp = term.hist[term.histi]; + term.hist[term.histi] = term.line[orig]; + term.line[orig] = temp; + } + + if (term.scr > 0 && term.scr < HISTSIZE) + term.scr = MIN(term.scr + n, HISTSIZE-1); + tclearregion(0, orig, term.col-1, orig+n-1); tsetdirt(orig+n, term.bot); @@ -1094,7 +1155,8 @@ tscrollup(int orig, int n) term.line[i+n] = temp; } - selscroll(orig, -n); + if (term.scr == 0) + selscroll(orig, -n); } void @@ -1123,7 +1185,7 @@ tnewline(int first_col) int y = term.c.y; if (y == term.bot) { - tscrollup(term.top, 1); + tscrollup(term.top, 1, 1); } else { y++; } @@ -1288,14 +1350,14 @@ void tinsertblankline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrolldown(term.c.y, n); + tscrolldown(term.c.y, n, 0); } void tdeleteline(int n) { if (BETWEEN(term.c.y, term.top, term.bot)) - tscrollup(term.c.y, n); + tscrollup(term.c.y, n, 0); } int32_t @@ -1732,11 +1794,11 @@ csihandle(void) break; case 'S': /* SU -- Scroll line up */ DEFAULT(csiescseq.arg[0], 1); - tscrollup(term.top, csiescseq.arg[0]); + tscrollup(term.top, csiescseq.arg[0], 0); break; case 'T': /* SD -- Scroll line down */ DEFAULT(csiescseq.arg[0], 1); - tscrolldown(term.top, csiescseq.arg[0]); + tscrolldown(term.top, csiescseq.arg[0], 0); break; case 'L': /* IL -- Insert blank lines */ DEFAULT(csiescseq.arg[0], 1); @@ -2240,7 +2302,7 @@ eschandle(uchar ascii) return 0; case 'D': /* IND -- Linefeed */ if (term.c.y == term.bot) { - tscrollup(term.top, 1); + tscrollup(term.top, 1, 1); } else { tmoveto(term.c.x, term.c.y+1); } @@ -2253,7 +2315,7 @@ eschandle(uchar ascii) break; case 'M': /* RI -- Reverse index */ if (term.c.y == term.top) { - tscrolldown(term.top, 1); + tscrolldown(term.top, 1, 1); } else { tmoveto(term.c.x, term.c.y-1); } @@ -2463,7 +2525,7 @@ twrite(const char *buf, int buflen, int show_ctrl) void tresize(int col, int row) { - int i; + int i, j; int minrow = MIN(row, term.row); int mincol = MIN(col, term.col); int *bp; @@ -2500,6 +2562,14 @@ tresize(int col, int row) term.dirty = xrealloc(term.dirty, row * sizeof(*term.dirty)); term.tabs = xrealloc(term.tabs, col * sizeof(*term.tabs)); + for (i = 0; i < HISTSIZE; i++) { + term.hist[i] = xrealloc(term.hist[i], col * sizeof(Glyph)); + for (j = mincol; j < col; j++) { + term.hist[i][j] = term.c.attr; + term.hist[i][j].u = ' '; + } + } + /* resize each row to new width, zero-pad if needed */ for (i = 0; i < minrow; i++) { term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); @@ -2558,7 +2628,7 @@ drawregion(int x1, int y1, int x2, int y2) continue; term.dirty[y] = 0; - xdrawline(term.line[y], x1, y, x2); + xdrawline(TLINE(y), x1, y, x2); } } @@ -2579,8 +2649,9 @@ draw(void) cx--; drawregion(0, 0, term.col, term.row); - xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], - term.ocx, term.ocy, term.line[term.ocy][term.ocx]); + if (term.scr == 0) + xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], + term.ocx, term.ocy, term.line[term.ocy][term.ocx]); term.ocx = cx; term.ocy = term.c.y; xfinishdraw(); @@ -2594,3 +2665,65 @@ redraw(void) tfulldirt(); draw(); } + +/* select and copy the previous url on screen (do nothing if there's no url). + * known bug: doesn't handle urls that span multiple lines (wontfix) + * known bug: only finds first url on line (mightfix) + */ +void +copyurl(const Arg *arg) { + /* () and [] can appear in urls, but excluding them here will reduce false + * positives when figuring out where a given url ends. + */ + static char URLCHARS[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789-._~:/?#@!$&'*+,;=%"; + + int i, row, startrow; + char *linestr = calloc(sizeof(char), term.col+1); /* assume ascii */ + char *c, *match = NULL; + + row = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.y-1 : term.bot; + LIMIT(row, term.top, term.bot); + startrow = row; + + /* find the start of the last url before selection */ + do { + for (i = 0; i < term.col; ++i) { + if (term.line[row][i].u > 127) /* assume ascii */ + continue; + linestr[i] = term.line[row][i].u; + } + linestr[term.col] = '\0'; + if ((match = strstr(linestr, "http://")) + || (match = strstr(linestr, "https://"))) + break; + if (--row < term.top) + row = term.bot; + } while (row != startrow); + + if (match) { + /* must happen before trim */ + selclear(); + sel.ob.x = strlen(linestr) - strlen(match); + + /* trim the rest of the line from the url match */ + for (c = match; *c != '\0'; ++c) + if (!strchr(URLCHARS, *c)) { + *c = '\0'; + break; + } + + /* select and copy */ + sel.mode = 1; + sel.type = SEL_REGULAR; + sel.oe.x = sel.ob.x + strlen(match)-1; + sel.ob.y = sel.oe.y = row; + selnormalize(); + tsetdirt(sel.nb.y, sel.ne.y); + xsetsel(getsel()); + xclipcopy(); + } + + free(linestr); +} diff --git a/st.c.orig b/st.c.orig index 76b7e0d..ae8357f 100644 --- a/st.c.orig +++ b/st.c.orig @@ -193,7 +193,6 @@ static void tsetscroll(int, int); static void tswapscreen(void); static void tsetmode(int, int, int *, int); static int twrite(const char *, int, int); -static void tfulldirt(void); static void tcontrolcode(uchar ); static void tdectest(char ); static void tdefutf8(char); @@ -2595,3 +2594,65 @@ redraw(void) tfulldirt(); draw(); } + +/* select and copy the previous url on screen (do nothing if there's no url). + * known bug: doesn't handle urls that span multiple lines (wontfix) + * known bug: only finds first url on line (mightfix) + */ +void +copyurl(const Arg *arg) { + /* () and [] can appear in urls, but excluding them here will reduce false + * positives when figuring out where a given url ends. + */ + static char URLCHARS[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789-._~:/?#@!$&'*+,;=%"; + + int i, row, startrow; + char *linestr = calloc(sizeof(char), term.col+1); /* assume ascii */ + char *c, *match = NULL; + + row = (sel.ob.x >= 0 && sel.nb.y > 0) ? sel.nb.y-1 : term.bot; + LIMIT(row, term.top, term.bot); + startrow = row; + + /* find the start of the last url before selection */ + do { + for (i = 0; i < term.col; ++i) { + if (term.line[row][i].u > 127) /* assume ascii */ + continue; + linestr[i] = term.line[row][i].u; + } + linestr[term.col] = '\0'; + if ((match = strstr(linestr, "http://")) + || (match = strstr(linestr, "https://"))) + break; + if (--row < term.top) + row = term.bot; + } while (row != startrow); + + if (match) { + /* must happen before trim */ + selclear(); + sel.ob.x = strlen(linestr) - strlen(match); + + /* trim the rest of the line from the url match */ + for (c = match; *c != '\0'; ++c) + if (!strchr(URLCHARS, *c)) { + *c = '\0'; + break; + } + + /* select and copy */ + sel.mode = 1; + sel.type = SEL_REGULAR; + sel.oe.x = sel.ob.x + strlen(match)-1; + sel.ob.y = sel.oe.y = row; + selnormalize(); + tsetdirt(sel.nb.y, sel.ne.y); + xsetsel(getsel()); + xclipcopy(); + } + + free(linestr); +} diff --git a/st.h b/st.h index 5df7063..fe99101 100644 --- a/st.h +++ b/st.h @@ -82,10 +82,13 @@ void redraw(void); void tfulldirt(void); void draw(void); +void kscrolldown(const Arg *); +void kscrollup(const Arg *); void printscreen(const Arg *); void printsel(const Arg *); void sendbreak(const Arg *); void toggleprinter(const Arg *); +void copyurl(const Arg *); int tattrset(int); void tnew(int, int); diff --git a/st.h.orig b/st.h.orig index 9f11a6a..59a4622 100644 --- a/st.h.orig +++ b/st.h.orig @@ -79,12 +79,14 @@ typedef union { void die(const char *, ...); void redraw(void); +void tfulldirt(void); void draw(void); void printscreen(const Arg *); void printsel(const Arg *); void sendbreak(const Arg *); void toggleprinter(const Arg *); +void copyurl(const Arg *); int tattrset(int); void tnew(int, int); @@ -123,4 +125,4 @@ extern char *termname; extern unsigned int tabspaces; extern unsigned int defaultfg; extern unsigned int defaultbg; -extern float alpha; +extern float alpha, alphaUnfocused; diff --git a/st.o b/st.o index 7af1142742a4bfc1e4026a8006ab0dbd8ddf1889..298540cf70a5f37f05b897dfbaf2e653c8dffe92 100644 GIT binary patch delta 8790 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