From mboxrd@z Thu Jan 1 00:00:00 1970 MIME-Version: 1.0 References: <39629cb4ecdfb54426706ad2ee398e2c@debpi> In-Reply-To: <39629cb4ecdfb54426706ad2ee398e2c@debpi> From: Mark Lee Smith Date: Fri, 27 May 2016 20:57:00 +0000 Message-ID: To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net> Content-Type: multipart/alternative; boundary=089e0115fa7279f1160533d9266b Subject: Re: [9fans] Chords, ^, _, ^B and scroll with mouse wheel in p9p sam Topicbox-Message-UUID: 94aaab92-ead9-11e9-9d60-3106f5b1d025 --089e0115fa7279f1160533d9266b Content-Type: text/plain; charset=UTF-8 Thanks for sharing this! I'd already backported a few of the features, but I hadn't yet got around to looking at the chording code etc. It's great to have selection working! I'm not sure if I did something wrong (I've checked the changes a few times) but scrolling only works "sometimes", mostly it seems to get stuck when scrolling back up? Can anyone confirm? In my experience sam's scrolling seems to be pretty broken (at least in the plan9port version) so it might not have anything to do with these changes. All the best, P.S. where does Kcmd come from? I've grepped the plan9port tree but I don't see a definition? On Fri, 27 May 2016 at 00:05 wrote: > The 9front sam in > > https://bitbucket.org/kremlin_/front9port > https://bitbucket.org/iru/sam9f-unix > > doesn't exchange the snarf buffer with X, and the pipe in /srv doesn't > work. > > This diff will makes the minimal changes to have those features of 9front > sam in the last p9p. The code fell off from the front. > > trebol. > > > diff -rpuN src/cmd/sam/cmd.c sam/cmd.c > --- src/cmd/sam/cmd.c 2016-04-18 19:07:22.000000000 +0100 > +++ sam/cmd.c 2016-05-25 23:56:34.040909362 +0100 > @@ -35,6 +35,8 @@ struct cmdtab cmdtab[]={ > '>', 0, 0, 0, 0, aDot, 0, linex, > plan9_cmd, > '<', 0, 0, 0, 0, aDot, 0, linex, > plan9_cmd, > '|', 0, 0, 0, 0, aDot, 0, linex, > plan9_cmd, > + '^', 0, 0, 0, 0, aDot, 0, linex, > plan9_cmd, > + '_', 0, 0, 0, 0, aDot, 0, linex, > plan9_cmd, > '=', 0, 0, 0, 0, aDot, 0, linex, > eq_cmd, > 'c'|0x100,0, 0, 0, 0, aNo, 0, wordx, > cd_cmd, > 0, 0, 0, 0, 0, 0, 0, 0 > @@ -76,7 +78,13 @@ inputc(void) > > Again: > nbuf = 0; > - if(downloaded){ > + if(cmdbufpos > cmdbuf.nc && cmdbuf.nc > 0){ > + cmdbufpos = 0; > + bufreset(&cmdbuf); > + } > + if(cmdbufpos < cmdbuf.nc && cmdbuf.nc > 0) > + bufread(&cmdbuf, cmdbufpos++, &r, 1); > + else if(downloaded){ > while(termoutp == terminp){ > cmdupdate(); > if(patset) > diff -rpuN src/cmd/sam/sam.h sam/sam.h > --- src/cmd/sam/sam.h 2016-04-18 19:07:22.000000000 +0100 > +++ sam/sam.h 2016-05-25 23:45:05.652931784 +0100 > @@ -369,6 +369,8 @@ extern int quitok; > extern Address addr; > extern Buffer snarfbuf; > extern Buffer plan9buf; > +extern Buffer cmdbuf; > +extern int cmdbufpos; > extern List file; > extern List tempfile; > extern File *cmd; > diff -rpuN src/cmd/sam/shell.c sam/shell.c > --- src/cmd/sam/shell.c 2016-04-18 19:07:22.000000000 +0100 > +++ sam/shell.c 2016-05-25 23:46:25.262692361 +0100 > @@ -6,6 +6,8 @@ extern jmp_buf mainloop; > char errfile[64]; > String plan9cmd; /* null terminated */ > Buffer plan9buf; > +Buffer cmdbuf; > +int cmdbufpos; > void checkerrs(void); > > void > @@ -40,7 +42,7 @@ plan9(File *f, int type, String *s, int > } > if(type!='!' && pipe(pipe1)==-1) > error(Epipe); > - if(type=='|') > + if(type=='|' || type=='_') > snarf(f, addr.r.p1, addr.r.p2, &plan9buf, 1); > if((pid=fork()) == 0){ > setname(f); > @@ -61,14 +63,14 @@ plan9(File *f, int type, String *s, int > } > } > if(type != '!') { > - if(type=='<' || type=='|') > - dup(pipe1[1], 1); > - else if(type == '>') > + if(type == '>') > dup(pipe1[0], 0); > + else > + dup(pipe1[1], 1); > close(pipe1[0]); > close(pipe1[1]); > } > - if(type == '|'){ > + if(type == '|' || type == '_'){ > if(pipe(pipe2) == -1) > exits("pipe"); > if((pid = fork())==0){ > @@ -100,7 +102,7 @@ plan9(File *f, int type, String *s, int > close(pipe2[0]); > close(pipe2[1]); > } > - if(type=='<'){ > + if(type=='<' || type=='^'){ > close(0); /* so it won't read from terminal > */ > open("/dev/null", 0); > } > @@ -128,9 +130,14 @@ plan9(File *f, int type, String *s, int > writeio(f); > bpipeok = 0; > closeio((Posn)-1); > + }else if(type == '^' || type == '_'){ > + int nulls; > + close(pipe1[1]); > + bufload(&cmdbuf, cmdbufpos, pipe1[0], &nulls); > + close(pipe1[0]); > } > retcode = waitfor(pid); > - if(type=='|' || type=='<') > + if(type=='|' || type=='<' || type=='_' || type=='^') > if(retcode!=0) > warn(Wbadstatus); > if(downloaded) > diff -rpuN src/cmd/samterm/main.c samterm/main.c > --- src/cmd/samterm/main.c 2016-04-18 19:07:22.000000000 +0100 > +++ samterm/main.c 2016-05-26 16:12:12.452556184 +0100 > @@ -23,11 +23,8 @@ long modified = 0; /* strange lookahead > char hostlock = 1; > char hasunlocked = 0; > int maxtab = 8; > -int chord; > int autoindent; > > -#define chording 0 /* code here for reference but it causes deadlocks > */ > - > void > notifyf(void *a, char *msg) > { > @@ -39,7 +36,7 @@ notifyf(void *a, char *msg) > void > threadmain(int argc, char *argv[]) > { > - int i, got, scr, w; > + int i, got, scr, chord, w; > Text *t; > Rectangle r; > Flayer *nwhich; > @@ -85,6 +82,7 @@ threadmain(int argc, char *argv[]) > > got = 0; > if(protodebug) print("loop\n"); > + chord = 0; > for(;;got = waitforio()){ > if(hasunlocked && RESIZED()) > resize(); > @@ -108,19 +106,32 @@ threadmain(int argc, char *argv[]) > continue; > } > nwhich = flwhich(mousep->xy); > - scr = which && ptinrect(mousep->xy, which->scroll); > + scr = which && (ptinrect(mousep->xy, > which->scroll) || > + mousep->buttons&(8|16)); > if(mousep->buttons) > flushtyping(1); > - if(chording && chord==1 && !mousep->buttons) > + if((mousep->buttons&1)==0) > chord = 0; > - if(chording && chord) > + if(chord && which && which==nwhich){ > chord |= mousep->buttons; > - else if(mousep->buttons&1){ > + t = (Text *)which->user1; > + if(!t->lock){ > + w = which-t->l; > + if(chord&2){ > + cut(t, w, 1, 1); > + chord &= ~2; > + } > + if(chord&4){ > + paste(t, w); > + chord &= ~4; > + } > + } > + }else if(mousep->buttons&(1|8)){ > if(nwhich){ > if(nwhich!=which) > current(nwhich); > else if(scr) > - scroll(which, 1); > + scroll(which, > (mousep->buttons&8) ? 4 : 1); > else{ > t=(Text *)which->user1; > if(flselect(which)){ > @@ -137,27 +148,14 @@ threadmain(int argc, char *argv[]) > scroll(which, 2); > else > menu2hit(); > - }else if((mousep->buttons&4)){ > + }else if(mousep->buttons&(4|16)){ > if(scr) > - scroll(which, 3); > + scroll(which, (mousep->buttons&16) > ? 5 : 3); > else > menu3hit(); > } > mouseunblock(); > } > - if(chording && chord){ > - t = (Text*)which->user1; > - if(!t->lock && !hostlock){ > - w = which-t->l; > - if(chord&2){ > - cut(t, w, 1, 1); > - chord &= ~2; > - }else if(chord&4){ > - paste(t, w); > - chord &= ~4; > - } > - } > - } > } > } > > @@ -497,6 +495,7 @@ flushtyping(int clearesc) > #define CUT (Kcmd+'x') > #define COPY (Kcmd+'c') > #define PASTE (Kcmd+'v') > +#define Kstx 0x02 > > int > nontypingkey(int c) > @@ -512,6 +511,7 @@ nontypingkey(int c) > case PAGEUP: > case RIGHTARROW: > case SCROLLKEY: > + case Kstx: > return 1; > } > if(c >= Kcmd) > @@ -669,6 +669,15 @@ type(Flayer *l, int res) /* what a blood > } > } > } > + }else if(c == Kstx){ > + t = &cmd; > + for(l=t->l; l->textfn==0; l++) > + ; > + current(l); > + flushtyping(0); > + a = t->rasp.nrunes; > + flsetselect(l, a, a); > + center(l, a); > }else{ > if(c==ESC && typeesc>=0){ > l->p0 = typeesc; > diff -rpuN src/cmd/samterm/scroll.c samterm/scroll.c > --- src/cmd/samterm/scroll.c 2016-04-18 19:07:22.000000000 +0100 > +++ samterm/scroll.c 2016-05-26 02:07:31.922977720 +0100 > @@ -115,7 +115,7 @@ scroll(Flayer *l, int but) > draw(scrback, Rect(0,0,Dx(l->scroll), Dy(l->scroll)), l->f.b, nil, > l->scroll.min); > do{ > oin = in; > - in = abs(x-mousep->xy.x)<=FLSCROLLWID(l)/2; > + in = (but > 3) || (but == 2) || > abs(x-mousep->xy.x)<=FLSCROLLWID(l)/2; > if(oin && !in) > scrunmark(l, r); > if(in){ > @@ -126,9 +126,7 @@ scroll(Flayer *l, int but) > my = s.min.y; > if(my >= s.max.y) > my = s.max.y; > - if(!eqpt(mousep->xy, Pt(x, my))) > - moveto(mousectl, Pt(x, my)); > - if(but == 1){ > + if(but == 1 || but == 4){ > p0 = l->origin-frcharofpt(&l->f, > Pt(s.max.x, my)); > rt = scrpos(l->scroll, p0, p0+l->f.nchars, > tot); > y = rt.min.y; > @@ -136,7 +134,7 @@ scroll(Flayer *l, int but) > y = my; > if(y > s.max.y-2) > y = s.max.y-2; > - }else if(but == 3){ > + }else if(but == 3 || but == 5){ > p0 = l->origin+frcharofpt(&l->f, > Pt(s.max.x, my)); > rt = scrpos(l->scroll, p0, p0+l->f.nchars, > tot); > y = rt.min.y; > @@ -147,19 +145,21 @@ scroll(Flayer *l, int but) > scrmark(l, r); > } > } > - }while(button(but)); > + }while(but <= 3 && button(but)); > if(in){ > h = s.max.y-s.min.y; > scrunmark(l, r); > p0 = 0; > - if(but == 1) > + if(but == 1 || but == 4){ > + but = 1; > p0 = (long)(my-s.min.y)/l->f.font->height+1; > - else if(but == 2){ > + }else if(but == 2){ > if(tot > 1024L*1024L) > p0 = ((tot>>10)*(y-s.min.y)/h)<<10; > else > p0 = tot*(y-s.min.y)/h; > - }else if(but == 3){ > + }else if(but == 3 || but == 5){ > + but = 3; > p0 = l->origin+frcharofpt(&l->f, Pt(s.max.x, my)); > if(p0 > tot) > p0 = tot; > > > --089e0115fa7279f1160533d9266b Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+VGhhbmtzIGZvciBzaGFyaW5nIHRoaXMhIEkmIzM5O2QgYWxyZWFkeSBi YWNrcG9ydGVkIGEgZmV3IG9mIHRoZSBmZWF0dXJlcywgYnV0IEkgaGFkbiYjMzk7dCB5ZXQgZ290 IGFyb3VuZCB0byBsb29raW5nIGF0IHRoZSBjaG9yZGluZyBjb2RlIGV0Yy4gSXQmIzM5O3MgZ3Jl YXQgdG8gaGF2ZSBzZWxlY3Rpb24gd29ya2luZyEgSSYjMzk7bSBub3Qgc3VyZSBpZiBJIGRpZCBz b21ldGhpbmcgd3JvbmcgKEkmIzM5O3ZlIGNoZWNrZWQgdGhlIGNoYW5nZXMgYSBmZXcgdGltZXMp IGJ1dCBzY3JvbGxpbmcgb25seSB3b3JrcyAmcXVvdDtzb21ldGltZXMmcXVvdDssIG1vc3RseSBp dCBzZWVtcyB0byBnZXQgc3R1Y2sgd2hlbiBzY3JvbGxpbmcgYmFjayB1cD8gQ2FuIGFueW9uZSBj b25maXJtPyBJbiBteSBleHBlcmllbmNlIHNhbSYjMzk7cyBzY3JvbGxpbmcgc2VlbXMgdG8gYmUg cHJldHR5IGJyb2tlbiAoYXQgbGVhc3QgaW4gdGhlIHBsYW45cG9ydCB2ZXJzaW9uKSBzbyBpdCBt aWdodCBub3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoZXNlIGNoYW5nZXMuPGRpdj48YnI+ PC9kaXY+PGRpdj5BbGwgdGhlIGJlc3QsPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5QLlMuIHdo ZXJlIGRvZXMgS2NtZCBjb21lIGZyb20/IEkmIzM5O3ZlIGdyZXBwZWQgdGhlIHBsYW45cG9ydCB0 cmVlIGJ1dCBJIGRvbiYjMzk7dCBzZWUgYSBkZWZpbml0aW9uPzxicj48ZGl2Pjxicj48ZGl2IGNs YXNzPSJnbWFpbF9xdW90ZSI+PGRpdiBkaXI9Imx0ciI+T24gRnJpLCAyNyBNYXkgMjAxNiBhdCAw MDowNSAmbHQ7PGEgaHJlZj0ibWFpbHRvOnRyZWJvbDU1NTU1QHlhbmRleC5ydSIgdGFyZ2V0PSJf YmxhbmsiPnRyZWJvbDU1NTU1QHlhbmRleC5ydTwvYT4mZ3Q7IHdyb3RlOjxicj48L2Rpdj48Ymxv Y2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46MCAwIDAgLjhleDtib3Jk ZXItbGVmdDoxcHggI2NjYyBzb2xpZDtwYWRkaW5nLWxlZnQ6MWV4Ij5UaGUgOWZyb250IHNhbSBp bjxicj4NCjxicj4NCsKgIMKgIMKgIMKgIDxhIGhyZWY9Imh0dHBzOi8vYml0YnVja2V0Lm9yZy9r cmVtbGluXy9mcm9udDlwb3J0IiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIj5odHRw czovL2JpdGJ1Y2tldC5vcmcva3JlbWxpbl8vZnJvbnQ5cG9ydDwvYT48YnI+DQrCoCDCoCDCoCDC oCA8YSBocmVmPSJodHRwczovL2JpdGJ1Y2tldC5vcmcvaXJ1L3NhbTlmLXVuaXgiIHJlbD0ibm9y ZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vYml0YnVja2V0Lm9yZy9pcnUvc2FtOWYt dW5peDwvYT48YnI+DQo8YnI+DQpkb2VzbiYjMzk7dCBleGNoYW5nZSB0aGUgc25hcmYgYnVmZmVy IHdpdGggWCwgYW5kIHRoZSBwaXBlIGluIC9zcnYgZG9lc24mIzM5O3Q8YnI+DQp3b3JrLjxicj4N Cjxicj4NClRoaXMgZGlmZiB3aWxsIG1ha2VzIHRoZSBtaW5pbWFsIGNoYW5nZXMgdG8gaGF2ZSB0 aG9zZSBmZWF0dXJlcyBvZiA5ZnJvbnQ8YnI+DQpzYW0gaW4gdGhlIGxhc3QgcDlwLiBUaGUgY29k ZSBmZWxsIG9mZiBmcm9tIHRoZSBmcm9udC48YnI+DQo8YnI+DQp0cmVib2wuPGJyPg0KPGJyPg0K PGJyPg0KZGlmZiAtcnB1TiBzcmMvY21kL3NhbS9jbWQuYyBzYW0vY21kLmM8YnI+DQotLS0gc3Jj L2NtZC9zYW0vY21kLmPCoCDCoDIwMTYtMDQtMTggMTk6MDc6MjIuMDAwMDAwMDAwICswMTAwPGJy Pg0KKysrIHNhbS9jbWQuY8KgIMKgMjAxNi0wNS0yNSAyMzo1NjozNC4wNDA5MDkzNjIgKzAxMDA8 YnI+DQpAQCAtMzUsNiArMzUsOCBAQCBzdHJ1Y3QgY21kdGFiIGNtZHRhYltdPXs8YnI+DQrCoCDC oCDCoCDCoCAmIzM5OyZndDsmIzM5OyzCoCDCoCAwLMKgIMKgIMKgIDAswqAgwqAgwqAgMCzCoCDC oCDCoCAwLMKgIMKgIMKgIGFEb3QswqAgwqAwLMKgIMKgIMKgIGxpbmV4LMKgIHBsYW45X2NtZCw8 YnI+DQrCoCDCoCDCoCDCoCAmIzM5OyZsdDsmIzM5OyzCoCDCoCAwLMKgIMKgIMKgIDAswqAgwqAg wqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIGFEb3QswqAgwqAwLMKgIMKgIMKgIGxpbmV4LMKgIHBs YW45X2NtZCw8YnI+DQrCoCDCoCDCoCDCoCAmIzM5O3wmIzM5OyzCoCDCoCAwLMKgIMKgIMKgIDAs wqAgwqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIGFEb3QswqAgwqAwLMKgIMKgIMKgIGxpbmV4 LMKgIHBsYW45X2NtZCw8YnI+DQorwqAgwqAgwqAgwqAmIzM5O14mIzM5OyzCoCDCoCAwLMKgIMKg IMKgIDAswqAgwqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIGFEb3QswqAgwqAwLMKgIMKgIMKg IGxpbmV4LMKgIHBsYW45X2NtZCw8YnI+DQorwqAgwqAgwqAgwqAmIzM5O18mIzM5OyzCoCDCoCAw LMKgIMKgIMKgIDAswqAgwqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIGFEb3QswqAgwqAwLMKg IMKgIMKgIGxpbmV4LMKgIHBsYW45X2NtZCw8YnI+DQrCoCDCoCDCoCDCoCAmIzM5Oz0mIzM5OyzC oCDCoCAwLMKgIMKgIMKgIDAswqAgwqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIGFEb3QswqAg wqAwLMKgIMKgIMKgIGxpbmV4LMKgIGVxX2NtZCw8YnI+DQrCoCDCoCDCoCDCoCAmIzM5O2MmIzM5 O3wweDEwMCwwLMKgIMKgIDAswqAgwqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIGFObyzCoCDC oCAwLMKgIMKgIMKgIHdvcmR4LMKgIGNkX2NtZCw8YnI+DQrCoCDCoCDCoCDCoCAwLMKgIMKgIMKg IDAswqAgwqAgwqAgMCzCoCDCoCDCoCAwLMKgIMKgIMKgIDAswqAgwqAgwqAgMCzCoCDCoCDCoCAw LMKgIMKgIMKgIDA8YnI+DQpAQCAtNzYsNyArNzgsMTMgQEAgaW5wdXRjKHZvaWQpPGJyPg0KPGJy Pg0KwqAgwqAgwqBBZ2Fpbjo8YnI+DQrCoCDCoCDCoCDCoCBuYnVmID0gMDs8YnI+DQotwqAgwqAg wqAgwqBpZihkb3dubG9hZGVkKXs8YnI+DQorwqAgwqAgwqAgwqBpZihjbWRidWZwb3MgJmd0OyA8 YSBocmVmPSJodHRwOi8vY21kYnVmLm5jIiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5r Ij5jbWRidWYubmM8L2E+ICZhbXA7JmFtcDsgPGEgaHJlZj0iaHR0cDovL2NtZGJ1Zi5uYyIgcmVs PSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayI+Y21kYnVmLm5jPC9hPiAmZ3Q7IDApezxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNtZGJ1ZnBvcyA9IDA7PGJyPg0KK8KgIMKgIMKgIMKg IMKgIMKgIMKgIMKgYnVmcmVzZXQoJmFtcDtjbWRidWYpOzxicj4NCivCoCDCoCDCoCDCoH08YnI+ DQorwqAgwqAgwqAgwqBpZihjbWRidWZwb3MgJmx0OyA8YSBocmVmPSJodHRwOi8vY21kYnVmLm5j IiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIj5jbWRidWYubmM8L2E+ICZhbXA7JmFt cDsgPGEgaHJlZj0iaHR0cDovL2NtZGJ1Zi5uYyIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9i bGFuayI+Y21kYnVmLm5jPC9hPiAmZ3Q7IDApPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg YnVmcmVhZCgmYW1wO2NtZGJ1ZiwgY21kYnVmcG9zKyssICZhbXA7ciwgMSk7PGJyPg0KK8KgIMKg IMKgIMKgZWxzZSBpZihkb3dubG9hZGVkKXs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB3 aGlsZSh0ZXJtb3V0cCA9PSB0ZXJtaW5wKXs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBjbWR1cGRhdGUoKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCBpZihwYXRzZXQpPGJyPg0KZGlmZiAtcnB1TiBzcmMvY21kL3NhbS9zYW0uaCBzYW0v c2FtLmg8YnI+DQotLS0gc3JjL2NtZC9zYW0vc2FtLmjCoCDCoDIwMTYtMDQtMTggMTk6MDc6MjIu MDAwMDAwMDAwICswMTAwPGJyPg0KKysrIHNhbS9zYW0uaMKgIMKgMjAxNi0wNS0yNSAyMzo0NTow NS42NTI5MzE3ODQgKzAxMDA8YnI+DQpAQCAtMzY5LDYgKzM2OSw4IEBAIGV4dGVybiBpbnTCoCBx dWl0b2s7PGJyPg0KwqBleHRlcm4gQWRkcmVzcyBhZGRyOzxicj4NCsKgZXh0ZXJuIEJ1ZmZlcsKg IHNuYXJmYnVmOzxicj4NCsKgZXh0ZXJuIEJ1ZmZlcsKgIHBsYW45YnVmOzxicj4NCitleHRlcm4g QnVmZmVywqAgY21kYnVmOzxicj4NCitleHRlcm4gaW50wqAgwqAgwqBjbWRidWZwb3M7PGJyPg0K wqBleHRlcm4gTGlzdMKgIMKgIGZpbGU7PGJyPg0KwqBleHRlcm4gTGlzdMKgIMKgIHRlbXBmaWxl Ozxicj4NCsKgZXh0ZXJuIEZpbGXCoCDCoCAqY21kOzxicj4NCmRpZmYgLXJwdU4gc3JjL2NtZC9z YW0vc2hlbGwuYyBzYW0vc2hlbGwuYzxicj4NCi0tLSBzcmMvY21kL3NhbS9zaGVsbC5jIDIwMTYt MDQtMTggMTk6MDc6MjIuMDAwMDAwMDAwICswMTAwPGJyPg0KKysrIHNhbS9zaGVsbC5jIDIwMTYt MDUtMjUgMjM6NDY6MjUuMjYyNjkyMzYxICswMTAwPGJyPg0KQEAgLTYsNiArNiw4IEBAIGV4dGVy bsKgIGptcF9idWYgbWFpbmxvb3A7PGJyPg0KwqBjaGFywqAgwqBlcnJmaWxlWzY0XTs8YnI+DQrC oFN0cmluZyBwbGFuOWNtZDvCoCDCoCDCoCDCoC8qIG51bGwgdGVybWluYXRlZCAqLzxicj4NCsKg QnVmZmVyIHBsYW45YnVmOzxicj4NCitCdWZmZXIgY21kYnVmOzxicj4NCitpbnTCoCDCoCBjbWRi dWZwb3M7PGJyPg0KwqB2b2lkwqAgwqBjaGVja2VycnModm9pZCk7PGJyPg0KPGJyPg0KwqB2b2lk PGJyPg0KQEAgLTQwLDcgKzQyLDcgQEAgcGxhbjkoRmlsZSAqZiwgaW50IHR5cGUsIFN0cmluZyAq cywgaW50PGJyPg0KwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIGlmKHR5cGUhPSYjMzk7 ISYjMzk7ICZhbXA7JmFtcDsgcGlwZShwaXBlMSk9PS0xKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGVycm9yKEVwaXBlKTs8YnI+DQotwqAgwqAgwqAgwqBpZih0eXBlPT0mIzM5O3wmIzM5 Oyk8YnI+DQorwqAgwqAgwqAgwqBpZih0eXBlPT0mIzM5O3wmIzM5OyB8fCB0eXBlPT0mIzM5O18m IzM5Oyk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzbmFyZihmLCBhZGRyLnIucDEsIGFk ZHIuci5wMiwgJmFtcDtwbGFuOWJ1ZiwgMSk7PGJyPg0KwqAgwqAgwqAgwqAgaWYoKHBpZD1mb3Jr KCkpID09IDApezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNldG5hbWUoZik7PGJyPg0K QEAgLTYxLDE0ICs2MywxNCBAQCBwbGFuOShGaWxlICpmLCBpbnQgdHlwZSwgU3RyaW5nICpzLCBp bnQ8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmKHR5cGUg IT0gJiMzOTshJiMzOTspIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBpZih0eXBlPT0mIzM5OyZsdDsmIzM5OyB8fCB0eXBlPT0mIzM5O3wmIzM5Oyk8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBkdXAocGlwZTFbMV0s IDEpOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGVsc2UgaWYodHlw ZSA9PSAmIzM5OyZndDsmIzM5Oyk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqBpZih0eXBlID09ICYjMzk7Jmd0OyYjMzk7KTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGR1cChwaXBlMVswXSwgMCk7PGJyPg0KK8KgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZWxzZTxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGR1cChwaXBlMVsxXSwgMSk7PGJyPg0KwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY2xvc2UocGlwZTFbMF0pOzxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNsb3NlKHBpcGUxWzFdKTs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYo dHlwZSA9PSAmIzM5O3wmIzM5Oyl7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYodHlw ZSA9PSAmIzM5O3wmIzM5OyB8fCB0eXBlID09ICYjMzk7XyYjMzk7KXs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihwaXBlKHBpcGUyKSA9PSAtMSk8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleGl0cygmcXVvdDtw aXBlJnF1b3Q7KTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZigo cGlkID0gZm9yaygpKT09MCl7PGJyPg0KQEAgLTEwMCw3ICsxMDIsNyBAQCBwbGFuOShGaWxlICpm LCBpbnQgdHlwZSwgU3RyaW5nICpzLCBpbnQ8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBjbG9zZShwaXBlMlswXSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgY2xvc2UocGlwZTJbMV0pOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IH08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZih0eXBlPT0mIzM5OyZsdDsmIzM5Oyl7 PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYodHlwZT09JiMzOTsmbHQ7JiMzOTsgfHwg dHlwZT09JiMzOTteJiMzOTspezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIGNsb3NlKDApO8KgIMKgIMKgIMKgLyogc28gaXQgd29uJiMzOTt0IHJlYWQgZnJvbSB0ZXJt aW5hbCAqLzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG9wZW4oJnF1 b3Q7L2Rldi9udWxsJnF1b3Q7LCAwKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJy Pg0KQEAgLTEyOCw5ICsxMzAsMTQgQEAgcGxhbjkoRmlsZSAqZiwgaW50IHR5cGUsIFN0cmluZyAq cywgaW50PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgd3JpdGVpbyhmKTs8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBicGlwZW9rID0gMDs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBjbG9zZWlvKChQb3NuKS0xKTs8YnI+DQorwqAgwqAgwqAgwqB9ZWxzZSBpZih0eXBlID09 ICYjMzk7XiYjMzk7IHx8IHR5cGUgPT0gJiMzOTtfJiMzOTspezxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGludCBudWxsczs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjbG9zZShw aXBlMVsxXSk7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnVmbG9hZCgmYW1wO2NtZGJ1 ZiwgY21kYnVmcG9zLCBwaXBlMVswXSwgJmFtcDtudWxscyk7PGJyPg0KK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgY2xvc2UocGlwZTFbMF0pOzxicj4NCsKgIMKgIMKgIMKgIH08YnI+DQrCoCDCoCDC oCDCoCByZXRjb2RlID0gd2FpdGZvcihwaWQpOzxicj4NCi3CoCDCoCDCoCDCoGlmKHR5cGU9PSYj Mzk7fCYjMzk7IHx8IHR5cGU9PSYjMzk7Jmx0OyYjMzk7KTxicj4NCivCoCDCoCDCoCDCoGlmKHR5 cGU9PSYjMzk7fCYjMzk7IHx8IHR5cGU9PSYjMzk7Jmx0OyYjMzk7IHx8IHR5cGU9PSYjMzk7XyYj Mzk7IHx8IHR5cGU9PSYjMzk7XiYjMzk7KTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlm KHJldGNvZGUhPTApPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgd2Fy bihXYmFkc3RhdHVzKTs8YnI+DQrCoCDCoCDCoCDCoCBpZihkb3dubG9hZGVkKTxicj4NCmRpZmYg LXJwdU4gc3JjL2NtZC9zYW10ZXJtL21haW4uYyBzYW10ZXJtL21haW4uYzxicj4NCi0tLSBzcmMv Y21kL3NhbXRlcm0vbWFpbi5jwqAgwqAgwqAgMjAxNi0wNC0xOCAxOTowNzoyMi4wMDAwMDAwMDAg KzAxMDA8YnI+DQorKysgc2FtdGVybS9tYWluLmPCoCDCoCDCoCAyMDE2LTA1LTI2IDE2OjEyOjEy LjQ1MjU1NjE4NCArMDEwMDxicj4NCkBAIC0yMywxMSArMjMsOCBAQCBsb25nIG1vZGlmaWVkID0g MDvCoCDCoCDCoCDCoCDCoCDCoC8qIHN0cmFuZ2UgbG9va2FoZWFkPGJyPg0KwqBjaGFywqAgwqBo b3N0bG9jayA9IDE7PGJyPg0KwqBjaGFywqAgwqBoYXN1bmxvY2tlZCA9IDA7PGJyPg0KwqBpbnTC oCDCoCBtYXh0YWIgPSA4Ozxicj4NCi1pbnTCoCDCoCBjaG9yZDs8YnI+DQrCoGludMKgIMKgIGF1 dG9pbmRlbnQ7PGJyPg0KPGJyPg0KLSNkZWZpbmUgY2hvcmRpbmcgMMKgIMKgIMKgLyogY29kZSBo ZXJlIGZvciByZWZlcmVuY2UgYnV0IGl0IGNhdXNlcyBkZWFkbG9ja3MgKi88YnI+DQotPGJyPg0K wqB2b2lkPGJyPg0KwqBub3RpZnlmKHZvaWQgKmEsIGNoYXIgKm1zZyk8YnI+DQrCoHs8YnI+DQpA QCAtMzksNyArMzYsNyBAQCBub3RpZnlmKHZvaWQgKmEsIGNoYXIgKm1zZyk8YnI+DQrCoHZvaWQ8 YnI+DQrCoHRocmVhZG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk8YnI+DQrCoHs8YnI+DQot wqAgwqAgwqAgwqBpbnQgaSwgZ290LCBzY3IsIHc7PGJyPg0KK8KgIMKgIMKgIMKgaW50IGksIGdv dCwgc2NyLCBjaG9yZCwgdzs8YnI+DQrCoCDCoCDCoCDCoCBUZXh0ICp0Ozxicj4NCsKgIMKgIMKg IMKgIFJlY3RhbmdsZSByOzxicj4NCsKgIMKgIMKgIMKgIEZsYXllciAqbndoaWNoOzxicj4NCkBA IC04NSw2ICs4Miw3IEBAIHRocmVhZG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk8YnI+DQo8 YnI+DQrCoCDCoCDCoCDCoCBnb3QgPSAwOzxicj4NCsKgIMKgIMKgIMKgIGlmKHByb3RvZGVidWcp IHByaW50KCZxdW90O2xvb3BcbiZxdW90Oyk7PGJyPg0KK8KgIMKgIMKgIMKgY2hvcmQgPSAwOzxi cj4NCsKgIMKgIMKgIMKgIGZvcig7O2dvdCA9IHdhaXRmb3JpbygpKXs8YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCBpZihoYXN1bmxvY2tlZCAmYW1wOyZhbXA7IFJFU0laRUQoKSk8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCByZXNpemUoKTs8YnI+DQpAQCAtMTA4 LDE5ICsxMDYsMzIgQEAgdGhyZWFkbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKTxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNvbnRpbnVlOzxi cj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH08YnI+DQrCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBud2hpY2ggPSBmbHdoaWNoKG1vdXNlcC0mZ3Q7eHkp Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNjciA9IHdoaWNoICZh bXA7JmFtcDsgcHRpbnJlY3QobW91c2VwLSZndDt4eSwgd2hpY2gtJmd0O3Njcm9sbCk7PGJyPg0K K8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2NyID0gd2hpY2ggJmFtcDsmYW1w OyAocHRpbnJlY3QobW91c2VwLSZndDt4eSwgd2hpY2gtJmd0O3Njcm9sbCkgfHw8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBtb3VzZXAtJmd0O2J1 dHRvbnMmYW1wOyg4fDE2KSk7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgaWYobW91c2VwLSZndDtidXR0b25zKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIGZsdXNodHlwaW5nKDEpOzxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmKGNob3JkaW5nICZhbXA7JmFtcDsgY2hvcmQ9PTEgJmFt cDsmYW1wOyAhbW91c2VwLSZndDtidXR0b25zKTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoGlmKChtb3VzZXAtJmd0O2J1dHRvbnMmYW1wOzEpPT0wKTxicj4NCsKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNob3JkID0gMDs8YnI+ DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZihjaG9yZGluZyAmYW1wOyZh bXA7IGNob3JkKTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmKGNo b3JkICZhbXA7JmFtcDsgd2hpY2ggJmFtcDsmYW1wOyB3aGljaD09bndoaWNoKXs8YnI+DQrCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjaG9yZCB8PSBtb3Vz ZXAtJmd0O2J1dHRvbnM7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg ZWxzZSBpZihtb3VzZXAtJmd0O2J1dHRvbnMmYW1wOzEpezxicj4NCivCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHQgPSAoVGV4dCAqKXdoaWNoLSZndDt1c2Vy MTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBp ZighdC0mZ3Q7bG9jayl7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgdyA9IHdoaWNoLXQtJmd0O2w7PGJyPg0KK8KgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYoY2hv cmQmYW1wOzIpezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGN1dCh0LCB3LCAxLCAxKTs8YnI+DQorwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqBjaG9yZCAmYW1wOz0gfjI7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCivCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmKGNob3JkJmFt cDs0KXs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwYXN0ZSh0LCB3KTs8YnI+DQorwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBjaG9yZCAmYW1wOz0gfjQ7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB9ZWxzZSBpZihtb3VzZXAtJmd0O2J1dHRvbnMmYW1wOygxfDgpKXs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihud2hpY2gp ezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGlmKG53aGljaCE9d2hpY2gpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY3VycmVudChu d2hpY2gpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGVsc2UgaWYoc2NyKTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHNjcm9sbCh3 aGljaCwgMSk7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2Nyb2xsKHdoaWNoLCAobW91c2VwLSZndDti dXR0b25zJmFtcDs4KSA/IDQgOiAxKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlbHNlezxicj4NCsKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHQ9KFRleHQgKil3aGljaC0mZ3Q7dXNlcjE7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYoZmxzZWxl Y3Qod2hpY2gpKXs8YnI+DQpAQCAtMTM3LDI3ICsxNDgsMTQgQEAgdGhyZWFkbWFpbihpbnQgYXJn YywgY2hhciAqYXJndltdKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHNjcm9sbCh3aGljaCwgMik7PGJyPg0KwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZWxzZTxicj4NCsKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1lbnUy aGl0KCk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfWVsc2UgaWYo KG1vdXNlcC0mZ3Q7YnV0dG9ucyZhbXA7NCkpezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoH1lbHNlIGlmKG1vdXNlcC0mZ3Q7YnV0dG9ucyZhbXA7KDR8MTYpKXs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihzY3Ip PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgc2Nyb2xsKHdoaWNoLCAzKTs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBzY3JvbGwod2hpY2gsIChtb3VzZXAt Jmd0O2J1dHRvbnMmYW1wOzE2KSA/IDUgOiAzKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlbHNlPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbWVudTNoaXQoKTs8YnI+DQrC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgbW91c2V1bmJsb2NrKCk7PGJyPg0KwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgfTxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGlmKGNob3JkaW5nICZhbXA7 JmFtcDsgY2hvcmQpezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHQg PSAoVGV4dCopd2hpY2gtJmd0O3VzZXIxOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoGlmKCF0LSZndDtsb2NrICZhbXA7JmFtcDsgIWhvc3Rsb2NrKXs8YnI+DQotwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB3ID0gd2hpY2gtdC0m Z3Q7bDs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBpZihjaG9yZCZhbXA7Mil7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgY3V0KHQsIHcsIDEsIDEpOzxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNob3Jk ICZhbXA7PSB+Mjs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqB9ZWxzZSBpZihjaG9yZCZhbXA7NCl7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcGFzdGUodCwgdyk7PGJyPg0K LcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgY2hvcmQgJmFtcDs9IH40Ozxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoH08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqB9PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCsKgIMKgIMKgIMKgIH08YnI+ DQrCoH08YnI+DQo8YnI+DQpAQCAtNDk3LDYgKzQ5NSw3IEBAIGZsdXNodHlwaW5nKGludCBjbGVh cmVzYyk8YnI+DQrCoCNkZWZpbmXCoCDCoCDCoCDCoCBDVVTCoCDCoCDCoChLY21kKyYjMzk7eCYj Mzk7KTxicj4NCsKgI2RlZmluZcKgIMKgIMKgIMKgIENPUFnCoCDCoCAoS2NtZCsmIzM5O2MmIzM5 Oyk8YnI+DQrCoCNkZWZpbmXCoCDCoCDCoCDCoCBQQVNURcKgIMKgKEtjbWQrJiMzOTt2JiMzOTsp PGJyPg0KKyNkZWZpbmXCoCDCoCDCoCDCoCBLc3R4wqAgwqAgMHgwMjxicj4NCjxicj4NCsKgaW50 PGJyPg0KwqBub250eXBpbmdrZXkoaW50IGMpPGJyPg0KQEAgLTUxMiw2ICs1MTEsNyBAQCBub250 eXBpbmdrZXkoaW50IGMpPGJyPg0KwqAgwqAgwqAgwqAgY2FzZSBQQUdFVVA6PGJyPg0KwqAgwqAg wqAgwqAgY2FzZSBSSUdIVEFSUk9XOjxicj4NCsKgIMKgIMKgIMKgIGNhc2UgU0NST0xMS0VZOjxi cj4NCivCoCDCoCDCoCDCoGNhc2UgS3N0eDo8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBy ZXR1cm4gMTs8YnI+DQrCoCDCoCDCoCDCoCB9PGJyPg0KwqAgwqAgwqAgwqAgaWYoYyAmZ3Q7PSBL Y21kKTxicj4NCkBAIC02NjksNiArNjY5LDE1IEBAIHR5cGUoRmxheWVyICpsLCBpbnQgcmVzKcKg IMKgLyogd2hhdCBhIGJsb29kPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgfTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KK8KgIMKgIMKgIMKgfWVsc2Ug aWYoYyA9PSBLc3R4KXs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB0ID0gJmFtcDtjbWQ7 PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZm9yKGw9dC0mZ3Q7bDsgbC0mZ3Q7dGV4dGZu PT0wOyBsKyspPGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgOzxicj4N CivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGN1cnJlbnQobCk7PGJyPg0KK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgZmx1c2h0eXBpbmcoMCk7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYSA9 IHQtJmd0O3Jhc3AubnJ1bmVzOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGZsc2V0c2Vs ZWN0KGwsIGEsIGEpOzxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGNlbnRlcihsLCBhKTs8 YnI+DQrCoCDCoCDCoCDCoCB9ZWxzZXs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihj PT1FU0MgJmFtcDsmYW1wOyB0eXBlZXNjJmd0Oz0wKXs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBsLSZndDtwMCA9IHR5cGVlc2M7PGJyPg0KZGlmZiAtcnB1TiBzcmMv Y21kL3NhbXRlcm0vc2Nyb2xsLmMgc2FtdGVybS9zY3JvbGwuYzxicj4NCi0tLSBzcmMvY21kL3Nh bXRlcm0vc2Nyb2xsLmPCoCDCoCAyMDE2LTA0LTE4IDE5OjA3OjIyLjAwMDAwMDAwMCArMDEwMDxi cj4NCisrKyBzYW10ZXJtL3Njcm9sbC5jwqAgwqAgMjAxNi0wNS0yNiAwMjowNzozMS45MjI5Nzc3 MjAgKzAxMDA8YnI+DQpAQCAtMTE1LDcgKzExNSw3IEBAIHNjcm9sbChGbGF5ZXIgKmwsIGludCBi dXQpPGJyPg0KwqAgwqAgwqAgwqAgZHJhdyhzY3JiYWNrLCBSZWN0KDAsMCxEeChsLSZndDtzY3Jv bGwpLCBEeShsLSZndDtzY3JvbGwpKSwgbC0mZ3Q7Zi5iLCBuaWwsIGwtJmd0O3Njcm9sbC5taW4p Ozxicj4NCsKgIMKgIMKgIMKgIGRvezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG9pbiA9 IGluOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGluID0gYWJzKHgtbW91c2VwLSZndDt4 eS54KSZsdDs9RkxTQ1JPTExXSUQobCkvMjs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBp biA9IChidXQgJmd0OyAzKSB8fCAoYnV0ID09IDIpIHx8IGFicyh4LW1vdXNlcC0mZ3Q7eHkueCkm bHQ7PUZMU0NST0xMV0lEKGwpLzI7PGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYob2lu ICZhbXA7JmFtcDsgIWluKTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IHNjcnVubWFyayhsLCByKTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihpbil7PGJy Pg0KQEAgLTEyNiw5ICsxMjYsNyBAQCBzY3JvbGwoRmxheWVyICpsLCBpbnQgYnV0KTxicj4NCsKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG15ID0gcy5taW4u eTs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihteSAmZ3Q7PSBz Lm1heC55KTxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIG15ID0gcy5tYXgueTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqBpZighZXFwdChtb3VzZXAtJmd0O3h5LCBQdCh4LCBteSkpKTxicj4NCi3CoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1vdmV0byhtb3VzZWN0bCwgUHQoeCwg bXkpKTs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZihidXQgPT0g MSl7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYoYnV0ID09IDEg fHwgYnV0ID09IDQpezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHAwID0gbC0mZ3Q7b3JpZ2luLWZyY2hhcm9mcHQoJmFtcDtsLSZndDtmLCBQdChz Lm1heC54LCBteSkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHJ0ID0gc2NycG9zKGwtJmd0O3Njcm9sbCwgcDAsIHAwK2wtJmd0O2YubmNoYXJz LCB0b3QpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIHkgPSBydC5taW4ueTs8YnI+DQpAQCAtMTM2LDcgKzEzNCw3IEBAIHNjcm9sbChGbGF5ZXIg KmwsIGludCBidXQpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgeSA9IG15Ozxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIGlmKHkgJmd0OyBzLm1heC55LTIpPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgeSA9IHMubWF4LnktMjs8 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9ZWxzZSBpZihidXQgPT0g Myl7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfWVsc2UgaWYoYnV0 ID09IDMgfHwgYnV0ID09IDUpezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHAwID0gbC0mZ3Q7b3JpZ2luK2ZyY2hhcm9mcHQoJmFtcDtsLSZndDtm LCBQdChzLm1heC54LCBteSkpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIHJ0ID0gc2NycG9zKGwtJmd0O3Njcm9sbCwgcDAsIHAwK2wtJmd0O2Yu bmNoYXJzLCB0b3QpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIHkgPSBydC5taW4ueTs8YnI+DQpAQCAtMTQ3LDE5ICsxNDUsMjEgQEAgc2Nyb2xs KEZsYXllciAqbCwgaW50IGJ1dCk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBzY3JtYXJrKGwsIHIpOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIH08YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9PGJyPg0KLcKg IMKgIMKgIMKgfXdoaWxlKGJ1dHRvbihidXQpKTs8YnI+DQorwqAgwqAgwqAgwqB9d2hpbGUoYnV0 ICZsdDs9IDMgJmFtcDsmYW1wOyBidXR0b24oYnV0KSk7PGJyPg0KwqAgwqAgwqAgwqAgaWYoaW4p ezxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGggPSBzLm1heC55LXMubWluLnk7PGJyPg0K wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc2NydW5tYXJrKGwsIHIpOzxicj4NCsKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIHAwID0gMDs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZihidXQg PT0gMSk8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpZihidXQgPT0gMSB8fCBidXQgPT0g NCl7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnV0ID0gMTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwMCA9IChsb25nKShteS1zLm1p bi55KS9sLSZndDtmLmZvbnQtJmd0O2hlaWdodCsxOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDC oCDCoGVsc2UgaWYoYnV0ID09IDIpezxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH1lbHNl IGlmKGJ1dCA9PSAyKXs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBp Zih0b3QgJmd0OyAxMDI0TCoxMDI0TCk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBwMCA9ICgodG90Jmd0OyZndDsxMCkqKHktcy5taW4ueSkvaCkm bHQ7Jmx0OzEwOzxicj4NCsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVsc2U8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwMCA9 IHRvdCooeS1zLm1pbi55KS9oOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH1lbHNlIGlm KGJ1dCA9PSAzKXs8YnI+DQorwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB9ZWxzZSBpZihidXQgPT0g MyB8fCBidXQgPT0gNSl7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg YnV0ID0gMzs8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwMCA9IGwt Jmd0O29yaWdpbitmcmNoYXJvZnB0KCZhbXA7bC0mZ3Q7ZiwgUHQocy5tYXgueCwgbXkpKTs8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihwMCAmZ3Q7IHRvdCk8YnI+ DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBwMCA9IHRv dDs8YnI+DQo8YnI+DQo8YnI+DQo8L2Jsb2NrcXVvdGU+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+ DQo= --089e0115fa7279f1160533d9266b--