From 1936dd7a637686ac6c352f141d4156085c4c581c Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Wed, 26 Aug 2015 23:45:56 +0000 Subject: [PATCH] WebView 1.38: readable big headers, fix
  • and
    tag, fix show source git-svn-id: svn://kolibrios.org@5773 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/cmm/TWB/TWB.c | 53 +++++----- programs/cmm/TWB/links.h | 62 +++++++++++- programs/cmm/browser/WebView.c | 96 +++---------------- programs/cmm/browser/show_src.h | 4 +- programs/cmm/browser/wv_skin.png | Bin 1945 -> 2058 bytes programs/cmm/lib/patterns/libimg_load_skin.h | 4 +- 6 files changed, 96 insertions(+), 123 deletions(-) diff --git a/programs/cmm/TWB/TWB.c b/programs/cmm/TWB/TWB.c index f62c0c5cd1..7f8232f542 100644 --- a/programs/cmm/TWB/TWB.c +++ b/programs/cmm/TWB/TWB.c @@ -101,8 +101,8 @@ void TWebBrowser::DrawStyle() if (style.s) DrawBuf.DrawBar(start_x, list.line_h / 2 - DrawBuf.zoom + start_y, line_length, DrawBuf.zoom, text_colors[text_color_index]); if (style.u) DrawBuf.DrawBar(start_x, list.line_h - DrawBuf.zoom - DrawBuf.zoom + start_y, line_length, DrawBuf.zoom, text_colors[text_color_index]); if (link) { - DrawBuf.DrawBar(start_x, list.line_h - DrawBuf.zoom - DrawBuf.zoom + start_y, line_length, DrawBuf.zoom, text_colors[text_color_index]); - PageLinks.AddText(#line, line_length, list.line_h, UNDERLINE); + DrawBuf.DrawBar(start_x, list.line_h*style.h + list.line_h - DrawBuf.zoom - DrawBuf.zoom + start_y, line_length, DrawBuf.zoom, text_colors[text_color_index]); + PageLinks.AddText(#line, line_length, list.line_h*style.h + list.line_h, UNDERLINE); } stolbec += stolbec_len; } @@ -118,10 +118,8 @@ void TWebBrowser::Prepare(){ word bukva[2]; int j; byte ignor_param; - char temp[768]; - dword bufpos = bufpointer; - int line_len; - + dword bufpos; + int line_len; style.b = style.i = style.u = style.s = style.h = style.blq = t_html = t_body = style.li = link = ignor_text = text_color_index = text_colors[0] = style.li_tab = 0; style.align = ALIGN_LEFT; @@ -134,30 +132,27 @@ void TWebBrowser::Prepare(){ stroka = -list.first; stolbec = 0; line = 0; - //for plaint text use CP866 for other UTF if (strstri(bufpointer, "html")) { style.pre = 0; - cur_encoding = CH_CP866; + cur_encoding = CH_UTF8; } else { style.pre = 1; - cur_encoding = CH_UTF8; + cur_encoding = CH_CP866; } - - for ( ; (bufpointer+bufsize > bufpos) && (ESBYTE[bufpos]!=0); bufpos++;) + for (bufpos=bufpointer ; (bufpos < bufpointer+bufsize) && (ESBYTE[bufpos]!=0) ; bufpos++;) { + if (ignor_text) && (ESBYTE[bufpos]!='<') continue; bukva = ESBYTE[bufpos]; - if (ignor_text) && (bukva!='<') continue; switch (bukva) { case 0x0a: if (style.pre) { chrcat(#line, ' '); - bukva = temp = NULL; Perenos(); break; } @@ -170,7 +165,6 @@ void TWebBrowser::Prepare(){ break; } goto DEFAULT_MARK; - case '&': //  and so on bufpos++; tag=0; @@ -212,7 +206,7 @@ void TWebBrowser::Prepare(){ Perenos(); DrawStyle(); line = NULL; - if (tag) SetStyle(WB1.DrawBuf.zoom * 5 + list.x, stroka * list.line_h + list.y + 5); //юсЁрсюЄър Єхуют + if (tag) SetStyle(); //юсЁрсюЄър Єхуют strcpy(#oldtag, #tag); tag = attr = tagparam = ignor_param = NULL; break; @@ -245,9 +239,9 @@ void TWebBrowser::Perenos() { int perenos_num; char new_line_text[4096]; - if (stolbec + utf8_strlen(#line) < list.column_max) return; + if (utf8_strlen(#line)*DrawBuf.zoom + stolbec < list.column_max) return; perenos_num = strrchr(#line, ' '); - if (!perenos_num) && (utf8_strlen(#line)>list.column_max) perenos_num=list.column_max; + if (!perenos_num) && (utf8_strlen(#line)*DrawBuf.zoom>list.column_max) perenos_num=list.column_max/DrawBuf.zoom; strcpy(#new_line_text, #line + perenos_num); line[perenos_num] = 0x00; DrawStyle(); @@ -255,8 +249,9 @@ void TWebBrowser::Perenos() NewLine(); } //============================================================================================ -void TWebBrowser::SetStyle(int left1, top1) { - dword hr_color; +void TWebBrowser::SetStyle() { + int left1 = 5 + list.x; + int top1 = stroka * list.line_h + list.y + 5; byte opened; byte meta_encoding; //яЁютхЁ хь Єху юЄъЁ√трхЄё  шыш чръЁ√трхЄё  @@ -266,7 +261,6 @@ void TWebBrowser::SetStyle(int left1, top1) { strcpy(#tag, #tag+1); } else opened = 1; - if (istag("html")) { t_html = opened; return; @@ -394,15 +388,14 @@ void TWebBrowser::SetStyle(int left1, top1) { if (opened) NewLine(); return; } - if (istag("li")) || (istag("dt")) //эрфю ёфхырЄ№ тыюцхээ√х ёяшёъш + if (istag("li")) || (istag("dt")) { style.li = opened; if (opened) { NewLine(); - if (stroka > -1) && (stroka - 2 < list.visible) - DrawBuf.DrawBar(style.li_tab * 5 * list.font_w * DrawBuf.zoom + list.x, list.line_h - / 2 - DrawBuf.zoom - DrawBuf.zoom, DrawBuf.zoom*2, DrawBuf.zoom*2, 0x555555); + DrawBuf.DrawBar(style.li_tab * 5 * list.font_w * DrawBuf.zoom + list.x, stroka +1 * list.line_h - 3 + - DrawBuf.zoom - DrawBuf.zoom, DrawBuf.zoom*2, DrawBuf.zoom*2, 0x454545); } return; } @@ -416,15 +409,13 @@ void TWebBrowser::SetStyle(int left1, top1) { else style.li_tab++; } if (istag("hr")) { - if (anchor) || (stroka < -1) - { - stroka+=2; - return; - } - if (strcmp(#attr, "color=") == 0) hr_color = GetColor(#val); else hr_color = 0x999999; + if (isattr("color=")) EDI = GetColor(#val); else EDI = 0x999999; + $push edi; NewLine(); - DrawBuf.DrawBar(5, list.line_h/2, list.w-10, 1, hr_color); + $pop edi; + DrawBuf.DrawBar(5, list.line_h*stroka+4, list.w-10, 1, EDI); NewLine(); + return; } if (istag("meta")) || (istag("?xml")) { do{ diff --git a/programs/cmm/TWB/links.h b/programs/cmm/TWB/links.h index bade95c195..660f021d2f 100644 --- a/programs/cmm/TWB/links.h +++ b/programs/cmm/TWB/links.h @@ -18,6 +18,7 @@ struct LinksArray { void Hover(); void AddLink(); void AddText(); + void ClickLink(); dword GetURL(); void Clear(); void GetAbsoluteURL(); @@ -68,15 +69,17 @@ PathShow_data status_text = {0, 17,250, 6, 250, 0, 0, 0x0, 0xFFFfff, 0, #temp, 0 void LinksArray::Hover(dword mx, my, link_col_in, link_col_a, bg_col) { int i; - signed int WBY = -WB1.list.first*WB1.list.line_h + WB1.list.line_h - WB1.DrawBuf.zoom; + signed int WBY = -WB1.list.first*WB1.list.line_h - WB1.DrawBuf.zoom; for (i=0; ilinks[i].x) && (my>links[i].y) && (mx 0) + { + StopLoading(); + BrowserHistory.current--; + } + + strcpy(#URL, PageLinks.GetURL(PageLinks.active)); + //#1 + if (URL[0] == '#') + { + strcpy(#anchor, #URL+strrchr(#URL, '#')); + strcpy(#URL, BrowserHistory.CurrentUrl()); + WB1.list.first=WB1.list.count-WB1.list.visible; + ShowPage(); + return; + } + //liner.ru#1 + if (strrchr(#URL, '#')!=-1) + { + strcpy(#anchor, #URL+strrchr(#URL, '#')); + URL[strrchr(#URL, '#')-1] = 0x00; + } + + PageLinks.GetAbsoluteURL(#URL); + + if (UrlExtIs(".png")==1) || (UrlExtIs(".gif")==1) || (UrlExtIs(".jpg")==1) || (UrlExtIs(".zip")==1) || (UrlExtIs(".kex")==1) + || (UrlExtIs(".7z")==1) || (UrlExtIs("netcfg")==1) + { + //notify(#URL); + if (!strncmp(#URL,"http://", 7)) + { + strcpy(#DL_URL, #URL); + CreateThread(#Downloader,#downloader_stak+4092); + } + else RunProgram("@open", #URL); + strcpy(#editURL, BrowserHistory.CurrentUrl()); + strcpy(#URL, BrowserHistory.CurrentUrl()); + return; + } + if (!strncmp(#URL,"mailto:", 7)) + { + notify(#URL); + strcpy(#editURL, BrowserHistory.CurrentUrl()); + strcpy(#URL, BrowserHistory.CurrentUrl()); + return; + } + OpenPage(); + return; +} diff --git a/programs/cmm/browser/WebView.c b/programs/cmm/browser/WebView.c index 2b3e233214..25c724260d 100644 --- a/programs/cmm/browser/WebView.c +++ b/programs/cmm/browser/WebView.c @@ -13,28 +13,26 @@ #include "..\lib\draw_buf.h" #include "..\lib\list_box.h" #include "..\lib\cursor.h" - //*.obj libraries #include "..\lib\obj\box_lib.h" #include "..\lib\obj\libio_lib.h" #include "..\lib\obj\libimg_lib.h" #include "..\lib\obj\http.h" #include "..\lib\obj\iconv.h" - //useful patterns #include "..\lib\patterns\libimg_load_skin.h" char homepage[] = FROM "html\\homepage.htm"; #ifdef LANG_RUS - char version[]=" Текстовый браузер 1.35"; + char version[]=" Текстовый браузер 1.38"; ?define IMAGES_CACHE_CLEARED "Кэш картинок очищен" ?define T_LAST_SLIDE "Это последний слайд" char loading[] = "Загрузка страницы...
    "; char page_not_found[] = FROM "html\page_not_found_ru.htm"; char accept_language[]= "Accept-Language: ru\n"; #else - char version[]=" Text-based Browser 1.35"; + char version[]=" Text-based Browser 1.38"; ?define IMAGES_CACHE_CLEARED "Images cache cleared" ?define T_LAST_SLIDE "This slide is the last" char loading[] = "Loading...
    "; @@ -42,14 +40,14 @@ char homepage[] = FROM "html\\homepage.htm"; char accept_language[]= "Accept-Language: en\n"; #endif +#define URL_SERVICE_HISTORY "WebView://history" +#define URL_SERVICE_HOME "WebView://home" +#define URL_SERVICE_SOURCE "WebView://source:" proc_info Form; -#define WIN_W 799 -#define WIN_H 559 //char search_path[]="http://nigma.ru/index.php?s="; -char str_location[]="location\0"; int redirected = 0; char stak[4096]; @@ -95,12 +93,6 @@ char editURL[sizeof(URL)]; int mouse_twb; edit_box address_box = {250,56,34,0xffffff,0x94AECE,0xffffff,0xffffff,0,sizeof(URL),#editURL,#mouse_twb,2,19,19}; -#define URL_SERVICE_HISTORY "WebView://history" -#define URL_SERVICE_HOME "WebView://home" -#define URL_SERVICE_SOURCE "WebView://source:" - -libimg_image skin; - void main() { @@ -134,12 +126,6 @@ void main() PageLinks.Hover(mouse.x, WB1.list.first*WB1.list.line_h + mouse.y, link_color_inactive, link_color_active, bg_color); if (bufsize) && (mouse.pkm) && (mouse.up) { CreateThread(#menu_rmb,#stak+4092); break; } if (WB1.list.MouseScroll(mouse.vert)) WB1.DrawPage(); - if (mouse.down) && (PageLinks.active>=0) - { - DrawRectangle(PageLinks.links[PageLinks.active].x, PageLinks.links[PageLinks.active].y, - PageLinks.links[PageLinks.active].w, PageLinks.links[PageLinks.active].h, 0); - ClickLink(); - } } //Drag scroller scroll_wv.all_redraw = 0; @@ -180,7 +166,7 @@ void main() case evReDraw: if (action_buf) Scan(action_buf); - DefineAndDrawWindow(GetScreenWidth()-WIN_W/2,GetScreenHeight()-WIN_H/2,WIN_W,WIN_H,0x73,col_bg,0,0); + DefineAndDrawWindow(GetScreenWidth()-800/2,GetScreenHeight()-600/2,800,600,0x73,col_bg,0,0); GetProcessInfo(#Form, SelfInfo); if (Form.status_window>2) { DrawTitle(#header); break; } if (Form.height<120) MoveSize(OLD,OLD,OLD,120); @@ -208,7 +194,7 @@ void main() redirected++; if (redirected<=5) { - http_find_header_field stdcall (http_transfer, #str_location); + http_find_header_field stdcall (http_transfer, "location\0"); if (EAX!=0) { ESI = EAX; EDI = #URL; @@ -267,7 +253,7 @@ void SetElementSizes() WB1.list.wheel_size = 7; WB1.list.column_max = WB1.list.w - scroll_wv.size_x / WB1.list.font_w; WB1.list.visible = WB1.list.h - 5 / WB1.list.line_h; - if (WB1.list.w!=WB1.DrawBuf.bufw) WB1.DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, WB1.list.h * 20); + if (WB1.list.w!=WB1.DrawBuf.bufw) WB1.DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, WB1.list.h * 30); } void Draw_Window() @@ -352,7 +338,7 @@ void Scan(dword id__) case VIEW_SOURCE: WB1.list.first = 0; ShowSource(); - WB1.DrawPage(); + WB1.LoadInternalPage(bufpointer, bufsize); break; case EDIT_SOURCE: if (!strncmp(#URL,"http:",5)) @@ -390,59 +376,6 @@ void Scan(dword id__) } - -void ClickLink() -{ - if (http_transfer > 0) - { - StopLoading(); - BrowserHistory.current--; - } - - strcpy(#URL, PageLinks.GetURL(PageLinks.active)); - //#1 - if (URL[0] == '#') - { - strcpy(#anchor, #URL+strrchr(#URL, '#')); - strcpy(#URL, BrowserHistory.CurrentUrl()); - WB1.list.first=WB1.list.count-WB1.list.visible; - ShowPage(); - return; - } - //liner.ru#1 - if (strrchr(#URL, '#')!=-1) - { - strcpy(#anchor, #URL+strrchr(#URL, '#')); - URL[strrchr(#URL, '#')-1] = 0x00; - } - - PageLinks.GetAbsoluteURL(#URL); - - if (UrlExtIs(".png")==1) || (UrlExtIs(".gif")==1) || (UrlExtIs(".jpg")==1) || (UrlExtIs(".zip")==1) || (UrlExtIs(".kex")==1) - || (UrlExtIs(".7z")==1) || (UrlExtIs("netcfg")==1) - { - //notify(#URL); - if (!strncmp(#URL,"http://", 7)) - { - strcpy(#DL_URL, #URL); - CreateThread(#Downloader,#downloader_stak+4092); - } - else RunProgram("@open", #URL); - strcpy(#editURL, BrowserHistory.CurrentUrl()); - strcpy(#URL, BrowserHistory.CurrentUrl()); - return; - } - if (!strncmp(#URL,"mailto:", 7)) - { - notify(#URL); - strcpy(#editURL, BrowserHistory.CurrentUrl()); - strcpy(#URL, BrowserHistory.CurrentUrl()); - return; - } - OpenPage(); - return; -} - void StopLoading() { if (http_transfer) @@ -531,20 +464,15 @@ void ShowPage() DrawEditBox(); if (!bufsize) { - PageLinks.Clear(); - if (http_transfer) - { - WB1.LoadInternalPage(#loading, sizeof(loading)); - } - else - WB1.LoadInternalPage(#page_not_found, sizeof(page_not_found)); + if (http_transfer) WB1.LoadInternalPage(#loading, sizeof(loading)); + else WB1.LoadInternalPage(#page_not_found, sizeof(page_not_found)); } else { WB1.Prepare(); } - if (!header) strcpy(#header, #version); + //if (!header) strcpy(#header, #version); if (!strcmp(#version, #header)) DrawTitle(#header); } diff --git a/programs/cmm/browser/show_src.h b/programs/cmm/browser/show_src.h index 5f1727c063..76ae897577 100644 --- a/programs/cmm/browser/show_src.h +++ b/programs/cmm/browser/show_src.h @@ -10,8 +10,8 @@ dword ShowSource() souce_mode = true; new_buf = malloc(bufsize*5); new_buf_start = new_buf; - if (strlen(#header)-strlen(#version)>0) header[strlen(#header)-strlen(#version)-2] = 0; else strcpy(#header, "Source"); - new_buf += sprintf(new_buf,"%s
    ",#header);
    +	header[strrchr(#header, '-')-2]=0;
    +	new_buf += sprintf(new_buf,"Source: %s
    ",#header);
     	for (i=bufpointer; iPNV*5pWMGNW&V>N)t!&o&t?47fB&cK~B=bV|lnu=Gidr8pH+Ds20K7SOgv4>8lBRe}g(Nf2}
    zxxw_HQ2jFq4h|*{7gy0z$7i4WimQ<&{f~5Ur4Bqh1BbeH^9HS5yOw%-dW6QhoIQJ%
    z;^X5*%le!?eVP&y5=2WmwY9aBlaoX1)~yp7<)o*lQ}`EOik3P)mP1j$Cn!gHc3RQy
    z2hP;i)@F5SZhvkTBaq4OEtUG(I$>QsUS3|}$}%(>4QaJnvQa4LgT7-C>Dd`M)Hs%7
    zKf#6UT%5^Pp`Z`?j%AEe9#RrkytR4%{yk-7WqmOFo$VcznVn^j^6KmBskpe9N=r+r
    zsi}!vTwKV{&yQx$o=qMe9^x)Tkg|~Sy1Ke3H#e6`N`GEbdq)R3Iy#WAj}JveM39q{
    zlepU$^e=r~Mwc#KB&D$i6A={^P07hgeTtFBf|LjFzgrZcPyjnPIFP-)J=xmY3aw?p
    z4(!3MB?Wd-Q4#+KZ{NO6H8nNdCh|Pm=gytuP6qDWxx+v8fioRBl19bP|0Q=1cM6;p
    zNN#TK^nbdnoav7YyC8BdU#4l(rcppZ0L`2^Q6co;`cUqf2jZFD+iYm`ANmn>NwLjTnUXn#S-eCqD$<&oALackoEYS-zynRDu7
    z3GPLonAlihWpvQE`8#nnfGM4X=ER8;{ecdXCnqK0zB0C24;=WJs;a73+n(*<&QND(
    zr?|ryxhW5kDL(!y_JF%+%9JUzefti!a((!bfH|a;7ZVdh85tRTJY4&*G&PvFZ{O1S
    z^MB{5gQYUCb?a9C2@ut)tKZS2NuSXA^WYIPSk6=AWi?5~@-joT;+1k`5jEl^Plv$i~KoQd3i`cGLhn
    zum`)ak8v=b+(?B~2S-`BaG^ehW`k?PT?vGCEqJus-NJniw2~0G!Eg?i|rFgheRCIZ4ce5P$gaZ~RON6OT!s#R^swvDO6k
    zU>Ei=4#vZ{a?WTP8yoo!&fVQ~+6W5^<0(#G1~Y^01j{Sl(7k*2gr*O);b;LfW|*xR
    zbFbvEqTH7PnN!aS43s6f7lr&^SAPqHmC?&k&IA;vJnWWG>>}*9w6t)YwRU(Cl0DeR
    zI2aG($^njqR0+p22kNMU2M^NGqeq2ifE6oNkTZ)?SMu`c}m2)61qyT=RE1=89%aG=C&9aVIOr
    zEBV>Zu3bOU{Q2{E?Ssi53b{o&>|^!czyE;t>`7(YbvIU=e@grJ@8kA|8bd0|XRzpj
    zqktt#mQZMDsQA{H{QP_>EG*>j-j*(1DztrtCC;JnH{$Po{^A97vmKa?R>RV0AT=;Y
    zMJn#<>ZGXEtNC_cAM}rmTz^S+_Uev2bgYJ&=xO?l?1N*bD3{WlzRu#J9Fqyhz~p*+
    zdy}iHEA8F8haNpDl$DO;06VY;yReUOFdoJ==dcnuw8Tykby8Vbna~>Y~tM2S1LQ*v@LtyvRCF|5`>O15)wq(3iSWPgr-U-THDlYQUP
    z(yB_(ceEfmjDF3euQP?B2ql5y_}#l2+PCi~DlaeRlYQaB1*;t!#Ky+*T^@F6J9mCh
    zlP6E=PYFYze^UPR=~Moq645RsB&7dj9BB}{z`J+v@`$>8`Er^w$FLrdB9u8QDk>=B
    z%o*-fb^p~+YD$Xurhl*htJ2qWIXhculo1gb$)f%bqBX({Uq+inafFh<dB2o(ZO6T$Y-h7pV<#mB>w(>bmRKp!phi0RfLkj#D7Ss&e}B;?82s8XEOCJ
    z55+km5?-@lyN`No`t<2M%?MJTQ&>L2xEl^
    zWsyTEL9Roo#gs#-!5R*=A|jI2XX=V_9Bg`dO%$yW=3}M2am>@!*3P11lPW>qv5b*J
    z;q0fC?KZ3}9YZXF0Q{r`#k;kI*tXtMhB_Trik78*OJpn}Jv)PxSM;Q4{5R#}zbRME
    cyt%>jKmTT_+ylwe+yDRo07*qoM6N<$f(8%jk^lez
    
    delta 1880
    zcmV-e2dDUo5Sb5SGA)gF!prOlYb{qL~Z&pG&DqRZf>Hc
    zj#bey^r&3@J&1{kA%CB_qNa|IKhcS!_e;Tr0&%1c+&eQt-75Qwwr}4~BO@cC#kpL%
    zbcxc^(nQVqoIih_($mvLO*yTtt#s|$HQKRbhiFkwK|ui}eYQ^2)bXJNMPo`(j&$!d
    zqCN)1)Z5$Z^ncRT)g?wC+3y`K?X7LXx_SZw1I3YJxVX5GMx!BDg#~@kcRC{7I}1V0
    z;y4gTO+!7^8X6Q8^g-Y0j77*pNWv5EY~H?oOU1>-|C#-PzJ4kyDK-mv?d|PURaHeb
    zH8s@P*-1V=J`^4vPRo`pBY%H?ah5p#M1+zn?rkJxCW8Mw>Tp
    zCND29akeGs9~l{`Iu}I_wmNRLsJ&+#2zdb4?$G0a1lYsFgWTQSY0jKEqSY~A2lims
    zkp#Q4vXWomy?giQ&6_veCgMEmmoH!DA_MpD-{+sEKujl3{zg?V{voZumZFwMk)NNI
    zYU}D*`+vzvABbnqo~a65=!3q~8BOV}KS?S|z+~(7uXqx_XU`rU|D6Hsz#is?wO!OKDefyZlOJJTNeb+8Z
    z*}9c7Gtz1Gr?E6VGRi%zEux~LXn1&-uR4_!^nXF$sYJ)O--)Afp17w
    zN`JDc(LlMmyJfu)`fpg5NDFkKqD2{oy4SQ|p}M{fGa=-e3P=0v3H~Y9CZQ_iK}?N}
    zjdc9@&txy*(5V
    z7$9oq1Ox`OpOaK31Cwen
    z7?@}JiRUAjlmiD2(&EL7C-orq0z0q=yReUOFdoLWM^x3-)jVu2S+Yd5n1dV&#TH1w
    zF|HhKZEd7+bz$dtiWW=io11tpR8di(sGtw}P9-LKApkMCMXwMwbC`#MpOcDh;D6#z
    zocM+BDPiI<=}TF{iX_&Vz#iIMXtb2(}We
    zf89V29y|~&??4?wi;Re{nKRDxq}-aAfZ~vc)e@3jxc%<#Zr2Sw
    z03jh%LRhvy9(C;4F*uii-H>?c0BomzOWK8at?=
    zp+TH&$^SYjA7#@ej`_PBTS+q}8YMUPdzOqh^1YqCdw-zV*i}6D!40v7y-7Lj!(KtbetG#*7Vh?wudgp(>E-3+@&2~#OM=?A
    zZJXIDPp7kdFNS=jlzAVFm4BL=O2NUw;+t_nNx(ZI0Y}aRp|`ZOu$A5ga$~E}fxcea
    zz{D6E8!OHp7nHuf)@E3g0}o|**up6zC;$OX%$elc0Ipqe$it*!va+(WDJUq2iwl#l
    z^yXOuc3=;7VISj6CMHwn&6`K-*RSWEtgx_=Aom5L
    z-(1VTs?7AH+!l&Mo_{Hr80p42JBNZ@*tAzna_{osnXoT~*DP4>BOhC|Xb~-6zTE0R
    z3nqp*?-sdg*5#1mG_v
    zc<1NrLTp*@DAsnzm4a}M@P&nik|Krr>4&%4h#mu9{WRG4wCU8>42x
    SEcpWf0000