RE: ASPELL aspell-0.60.8.1 compilation failure on MSYS2 + MINGW64
Vincent Belaïche <[email protected]> Thu, 15 May 2025 07:46:42 +0000
| Newsgroups | gmane.comp.gnu.aspell.devel |
|---|---|
| Message-ID | <DBBP194MB1098F8898B7994A7BAEB9AE48490A@DBBP194MB1098.EURP194.PROD.OUTLOOK.COM> |
--_004_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_ Content-Type: multipart/alternative; boundary="_000_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_" --_000_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_ Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable Dear Kevin, Thank you for bringing aspell and for providing this patch. To give you the= full picture, the reason why I was trying to compile from source is that a= spell installed on MSYS2 by means of pacman package manager did not work pr= operly with Emacs ispell.el Emacs Lisp wrapper (which can use aspell, hunsp= ell, etc=85) After investigating why so, I found that although I had installed the Frenc= h dictionary properly the =AB aspell dict =BB command made empty output. Af= ter compiling from sources I had the same problem. Looking into this, I fou= nd that the dictionary path was hard coded in some gen/dirs.h generated hea= der as an MSYS2 path that cannot be understood by the aspell native Windows= application. When you compile on MINGW64 with no --prefix option passed to= configure you get this into gen/dirs.h : #define PREFIX "/mingw64" This problem can be easily circumvented by passing an absolute MSWindows pa= th to configure, like this : ./configure '--prefix=3Dc:/msys64/mingw64' as MSYS unerstands both native mixed path (mixed =3D just replacing \ by /)= and MSYS paths. However, this could be automated by having somewhere in the m4/lib-link.m4 = or m4/lib-prefix.m4 the appropriate autotools M4 macro for calling (cygpath= -m PREFIX) under the hood when the target is MINGW. This would certainly g= reatly help MSYS2/pacman repo maintainers to compile aspell properly. The other issue that I had is that Emacs ispell.el needs also to know where= the dictionaries are located because it builds some auto-completion list t= o help the user select a dictionary amongst those available. To get this, E= macs ispell calls =AB aspell -vv =BB and expects to find something like LIBDIR =3D "c:/msys64/mingw64/lib/aspell-0.60" in the output, where "c:/msys64/mingw64" is whatever prefix the user config= ured at install. This also does not work, so I did some hack which I attach= ed. With all of these I could get aspell usable by Emacs. V. ________________________________ De : Kevin Atkinson <[email protected]> Envoy=E9 : mercredi 14 mai 2025 07:27 =C0 : Vincent Bela=EFche <[email protected]> Cc : [email protected] <[email protected]> Objet : Re: ASPELL aspell-0.60.8.1 compilation failure on MSYS2 + MINGW64 I was finally able to test complication using MING64. On Sat, 10 May 2025 14:03:49 +0000 Vincent Bela=EFche <[email protected]> wrote: > Dear Kevin, > > Thank you for the link to the patch, I had a look at it, but in fact > there is a simpler solution to fix this, simply add =AB#define > _INTL_NO_DEFINE_MACRO_PRINTF=BB at the beginning of common/config.hpp. Thanks for the tip. A better place to put this is in common/ostream.hpp as that is where the printf method is defined. > > With this addition the compilation goes farther, but then it stops > again with this error : > > libtool: compile: g++ -DHAVE_CONFIG_H -I. -I./gen -I./gen -I./common > -I./interfaces/cc/ -I./modules/speller/default/ > -DLOCALEDIR=3D/mingw64/share/locale -I/mingw64/include -g -O2 > -fno-exceptions -MT modules/speller/default/language.lo -MD -MP -MF > modules/speller/default/.deps/language.Tpo -c > modules/speller/default/language.cpp -DDLL_EXPORT -DPIC -o > modules/speller/default/.libs/language.o > modules/speller/default/language.cpp:24:12: fatal error: langinfo.h: > No such file or directory 24 | # include <langinfo.h> | > ^~~~~~~~~~~~ compilation terminated. To fix this change "#ifdef ENABLE_NLS" to "#ifdef HAVE_LANGINFO_CODESET" > So finally, what I did is run again configure with option > --disable-nls, and I could compile aspell (with --disable-nls, > compilation is successful even w/o the addition =AB#define > _INTL_NO_DEFINE_MACRO_PRINTF=BB). So bad, I can't have the interface in > French. The attached patch got Aspell to compile for me without having to disable NLS. Kevin --_000_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_ Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable <html> <head> <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DWindows-1= 252"> <style type=3D"text/css" style=3D"display:none;"> P {margin-top:0;margin-bo= ttom:0;} </style> </head> <body dir=3D"ltr"> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> Dear Kevin,</div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> Thank you for bringing aspell and for providing this patch. To give you the= full picture, the reason why I was trying to compile from source is that a= spell installed on MSYS2 by means of pacman package manager did not work pr= operly with Emacs ispell.el Emacs Lisp wrapper (which can use aspell, hunspell, etc=85)</div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> After investigating why so, I found that although I had installed the Frenc= h dictionary properly the =AB aspell dict =BB command made empty output. Af= ter compiling from sources I had the same problem. Looking into this, I fou= nd that the dictionary path was hard coded in some gen/dirs.h generated header as an MSYS2 path that cannot be = understood by the aspell native Windows application. When you compile on MI= NGW64 with no --prefix option passed to configure you get this into gen/dir= s.h : </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> #define PREFIX "/mingw64"</div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> This problem can be easily circumvented by passing an absolute MSWindows pa= th to configure, like this : </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> ./configure '--prefix=3Dc:/msys64/mingw64'</div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> as MSYS unerstands both native mixed path (mixed =3D just replacing \ by /)= and MSYS paths.</div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> However, this could be automated by having somewhere in the m4/lib-link.m4 = or m4/lib-prefix.m4 the appropriate autotools M4 macro for calling (cygpath= -m PREFIX) under the hood when the target is MINGW. This would certainly g= reatly help MSYS2/pacman repo maintainers to compile aspell properly.<br> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> The other issue that I had is that Emacs ispell.el needs also to know where= the dictionaries are located because it builds some auto-completion list t= o help the user select a dictionary amongst those available. To get this, E= macs ispell calls =AB aspell -vv =BB and expects to find something like</div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> LIBDIR =3D "c:/msys64/mingw64/lib/aspell-0.60"</div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> in the output, where "c:/msys64/mingw64" is whatever prefix the u= ser configured at install. This also does not work, so I did some hack whic= h I attached.</div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> With all of these I could get aspell usable by Emacs.</div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> V.</div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> <br> </div> <div class=3D"elementToProof" style=3D"font-family: "Courier New"= , monospace; font-size: 12pt; color: rgb(0, 0, 0);"> </div> <div id=3D"appendonsend"></div> <hr style=3D"display:inline-block;width:98%" tabindex=3D"-1"> <div id=3D"divRplyFwdMsg" dir=3D"ltr"><font face=3D"Calibri, sans-serif" st= yle=3D"font-size:11pt" color=3D"#000000"><b>De :</b> Kevin Atkinson <kev= [email protected]><br> <b>Envoy=E9 :</b> mercredi 14 mai 2025 07:27<br> <b>=C0 :</b> Vincent Bela=EFche <[email protected]><br> <b>Cc :</b> [email protected] <[email protected]><br> <b>Objet :</b> Re: ASPELL aspell-0.60.8.1 compilation failure on MSYS2 + MI= NGW64</font> <div> </div> </div> <div class=3D"BodyFragment"><font size=3D"2"><span style=3D"font-size:11pt;= "> <div class=3D"PlainText">I was finally able to test complication using MING= 64.<br> <br> On Sat, 10 May 2025 14:03:49 +0000<br> <br> Vincent Bela=EFche <[email protected]> wrote:<br> <br> > Dear Kevin,<br> > <br> > Thank you for the link to the patch, I had a look at it, but in fact<b= r> > there is a simpler solution to fix this, simply add =AB#define<br> > _INTL_NO_DEFINE_MACRO_PRINTF=BB at the beginning of common/config.hpp.= <br> <br> Thanks for the tip. A better place to put this is in<br> common/ostream.hpp as that is where the printf method is defined.<br> <br> > <br> > With this addition the compilation goes farther, but then it stops<br> > again with this error :<br> > <br> > libtool: compile: g++ -DHAVE_CONFIG_H -I. -I./gen -I./gen -I./co= mmon<br> > -I./interfaces/cc/ -I./modules/speller/default/<br> > -DLOCALEDIR=3D/mingw64/share/locale -I/mingw64/include -g -O2<br> > -fno-exceptions -MT modules/speller/default/language.lo -MD -MP -MF<br= > > modules/speller/default/.deps/language.Tpo -c<br> > modules/speller/default/language.cpp -DDLL_EXPORT -DPIC -o<br> > modules/speller/default/.libs/language.o<br> > modules/speller/default/language.cpp:24:12: fatal error: langinfo.h:<b= r> > No such file or directory 24 | # include <langinfo.h> |<br= > > ^~~~~~~~~~~~ compilation terminated.<br> <br> To fix this change "#ifdef ENABLE_NLS" to "#ifdef<br> HAVE_LANGINFO_CODESET"<br> <br> > So finally, what I did is run again configure with option<br> > --disable-nls, and I could compile aspell (with --disable-nls,<br> > compilation is successful even w/o the addition =AB#define<br> > _INTL_NO_DEFINE_MACRO_PRINTF=BB). So bad, I can't have the interface i= n<br> > French.<br> <br> The attached patch got Aspell to compile for me without having to<br> disable NLS.<br> <br> Kevin<br> </div> </span></font></div> </body> </html> --_000_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_-- --_004_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_ Content-Type: text/plain; name="aspell.cpp" Content-Description: aspell.cpp Content-Disposition: attachment; filename="aspell.cpp"; size=78962; creation-date="Thu, 15 May 2025 07:43:18 GMT"; modification-date="Thu, 15 May 2025 07:44:33 GMT" Content-Transfer-Encoding: base64 Ly8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgVGhlIE5ldyBBc3BlbGwgQ29weXJpZ2h0IChDKQovLyAy MDAyLDIwMDMsMjAwNCwyMDExLDIwMTksMjAyMyBieSBLZXZpbiBBdGtpbnNvbgovLyB1bmRlciB0 aGUgR05VIExHUEwgbGljZW5zZSB2ZXJzaW9uIDIuMCBvciAyLjEuICBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYQovLyBjb3B5IG9mIHRoZSBMR1BMIGxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxp YnJhcnkgaWYgeW91IGRpZCBub3QgeW91IGNhbgovLyBmaW5kIGl0IGF0IGh0dHA6Ly93d3cuZ251 Lm9yZy8uCgovLwovLyBOT1RFOiBUaGlzIHByb2dyYW0gY3VycmVudGx5IHVzZXMgYSB2ZXJ5IHVn bHkgbWl4IG9mIHRoZSBpbnRlcm5hbAovLyAgICAgICBBUEkgYW5kIHRoZSBleHRlcm5hbCBDIGlu dGVyZmFjZS4gIFRoZSBldmVudHVhbCBnb2FsIGlzIHRvCi8vICAgICAgIHVzZSBvbmx5IHRoZSBl eHRlcm5hbCBDKysgaW50ZXJmYWNlLCBob3dldmVyLCB0aGUgZXh0ZXJuYWwKLy8gICAgICAgQysr IGludGVyZmFjZSBpcyBjdXJyZW50bHkgaW5jb21wbGV0ZS4gIFRoZSBDIGludGVyZmFjZSBpcwov LyAgICAgICB1c2VkIGluIHNvbWUgcGxhY2VzIGJlY2F1c2Ugd2l0aG91dCB0aGUgc3RyaW5ncyB3 aWxsIG5vdCBnZXQKLy8gICAgICAgY29udmVydGVkIHByb3Blcmx5IHdoZW4gdGhlIGVuY29kaW5n IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUKLy8gICAgICAgaW50ZXJuYWwgZW5jb2RpbmcgdXNlZCBi eSBBc3BlbGwuCi8vIAoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlICJzZXR0aW5ncy5oIgoK I2lmZGVmIFVTRV9MT0NBTEUKIyBpbmNsdWRlIDxsb2NhbGUuaD4KI2VuZGlmCgojaWZkZWYgSEFW RV9MQU5HSU5GT19DT0RFU0VUCiMgaW5jbHVkZSA8bGFuZ2luZm8uaD4KI2VuZGlmCgojaW5jbHVk ZSAiYXNwZWxsLmgiCgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5o PgoKI2lmZGVmIFVTRV9GSUxFX0lOTwojIGluY2x1ZGUgPHVuaXN0ZC5oPgojIGluY2x1ZGUgPGZj bnRsLmg+CiNlbmRpZgoKI2luY2x1ZGUgImFzY19jdHlwZS5ocHAiCiNpbmNsdWRlICJjaGVja19m dW5zLmhwcCIKI2luY2x1ZGUgImNvbmZpZy5ocHAiCiNpbmNsdWRlICJjb252ZXJ0LmhwcCIKI2lu Y2x1ZGUgImRvY3VtZW50X2NoZWNrZXIuaHBwIgojaW5jbHVkZSAiZW51bWVyYXRpb24uaHBwIgoj aW5jbHVkZSAiZXJyb3JzLmhwcCIKI2luY2x1ZGUgImZpbGVfdXRpbC5ocHAiCiNpbmNsdWRlICJm c3RyZWFtLmhwcCIKI2luY2x1ZGUgImluZm8uaHBwIgojaW5jbHVkZSAiaW9zdHJlYW0uaHBwIgoj aW5jbHVkZSAicG9zaWJfZXJyLmhwcCIKI2luY2x1ZGUgInNwZWxsZXIuaHBwIgojaW5jbHVkZSAi c3RhY2tfcHRyLmhwcCIKI2luY2x1ZGUgInN0cmluZ19lbnVtZXJhdGlvbi5ocHAiCiNpbmNsdWRl ICJzdHJpbmdfbWFwLmhwcCIKI2luY2x1ZGUgIndvcmRfbGlzdC5ocHAiCiNpbmNsdWRlICJpc3Ry ZWFtX2VudW1lcmF0aW9uLmhwcCIKCiNpbmNsdWRlICJzdHJpbmdfbGlzdC5ocHAiCiNpbmNsdWRl ICJzcGVsbGVyX2ltcGwuaHBwIgojaW5jbHVkZSAiZGF0YS5ocHAiCgojaW5jbHVkZSAiaGFzaC10 LmhwcCIKI2luY2x1ZGUgImhhc2hfZnVuLmhwcCIKCiNpbmNsdWRlICJnZXR0ZXh0LmgiCgp1c2lu ZyBuYW1lc3BhY2UgYWNvbW1vbjsKCnVzaW5nIGFzcGVsbGVyOjpDb252OwoKLy8gYWN0aW9uIGZ1 bmN0aW9ucyBkZWNsYXJhdGlvbnMKCnZvaWQgcHJpbnRfdmVyKGJvb2wgZXh0ZW5zaXZlX3ZlcnNp b25faW5mbyA9IGZhbHNlKTsKdm9pZCBwcmludF9oZWxwKGJvb2wgdmVyYm9zZSA9IGZhbHNlKTsK dm9pZCBjb25maWcoKTsKCnZvaWQgY2hlY2soKTsKdm9pZCBwaXBlKCk7CnZvaWQgY29udnQoKTsK dm9pZCBub3JtbHooKTsKdm9pZCBmaWx0ZXIoKTsKdm9pZCBsaXN0KCk7CnZvaWQgZGljdHMoKTsK dm9pZCBtb2RlcygpOwp2b2lkIGZpbHRlcnMoKTsKCnZvaWQgY2xlYW4oKTsKdm9pZCBtYXN0ZXIo KTsKdm9pZCBwZXJzb25hbCgpOwp2b2lkIHJlcGwoKTsKdm9pZCBzb3VuZHNsaWtlKCk7CnZvaWQg bXVuY2goKTsKdm9pZCBleHBhbmQoKTsKdm9pZCBjb21iaW5lKCk7CnZvaWQgbXVuY2hfbGlzdCgp Owp2b2lkIGR1bXBfYWZmaXgoKTsKCnZvaWQgcHJpbnRfZXJyb3IoUGFybVN0cmluZyBtc2cpCnsK ICBDRVJSLnByaW50ZihfKCJFcnJvcjogJXNcbiIpLCBtc2cuc3RyKCkpOwp9Cgp2b2lkIHByaW50 X2Vycm9yKFBhcm1TdHJpbmcgbXNnLCBQYXJtU3RyaW5nIHN0cikKewogIENFUlIucHV0KF8oIkVy cm9yOiAiKSk7CiAgQ0VSUi5wcmludGYobXNnLnN0cigpLCBzdHIuc3RyKCkpOwogIENFUlIucHV0 KCdcbicpOwp9CgojZGVmaW5lIEVYSVRfT05fRVJSKGNvbW1hbmQpIFwKICBkb3tQb3NpYkVyckJh c2UgcGUoY29tbWFuZCk7XAogIGlmKHBlLmhhc19lcnIoKSl7cHJpbnRfZXJyb3IocGUuZ2V0X2Vy cigpLT5tZXNnKTsgZXhpdCgxKTt9XAogIH0gd2hpbGUoZmFsc2UpCiNkZWZpbmUgRVhJVF9PTl9F UlJfU0VUKGNvbW1hbmQsIHR5cGUsIHZhcilcCiAgdHlwZSB2YXI7XAogIGRve1Bvc2liRXJyPCB0 eXBlID4gcGUoY29tbWFuZCk7XAogIGlmKHBlLmhhc19lcnIoKSl7cHJpbnRfZXJyb3IocGUuZ2V0 X2VycigpLT5tZXNnKTsgZXhpdCgxKTt9XAogIGVsc2Uge3Zhcj1wZS5kYXRhO31cCiAgfSB3aGls ZShmYWxzZSkKI2RlZmluZSBCUkVBS19PTl9FUlIoY29tbWFuZCkgXAogIGRve1Bvc2liRXJyQmFz ZSBwZShjb21tYW5kKTtcCiAgaWYocGUuaGFzX2VycigpKXtwcmludF9lcnJvcihwZS5nZXRfZXJy KCktPm1lc2cpOyBicmVhazt9XAogIH0gd2hpbGUoZmFsc2UpCiNkZWZpbmUgQlJFQUtfT05fRVJS X1NFVChjb21tYW5kLCB0eXBlLCB2YXIpXAogIHR5cGUgdmFyO1wKICBkb3tQb3NpYkVycjwgdHlw ZSA+IHBlKGNvbW1hbmQpO1wKICBpZihwZS5oYXNfZXJyKCkpe3ByaW50X2Vycm9yKHBlLmdldF9l cnIoKS0+bWVzZyk7IGJyZWFrO31cCiAgZWxzZSB7dmFyPXBlLmRhdGE7fVwKICB9IHdoaWxlKGZh bHNlKQoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLwovLwovLyBDb21tYW5kIGxpbmUgb3B0aW9ucyBmdW5jdGlvbnMgYW5kIGNsYXNzZXMK Ly8gKGluY2x1ZGluZyBtYWluKQovLwoKdHlwZWRlZiBWZWN0b3I8U3RyaW5nPiBBcmdzOwp0eXBl ZGVmIENvbmZpZyAgICAgICAgIE9wdGlvbnM7CmVudW0gQWN0aW9uIHtkb19jcmVhdGUsIGRvX21l cmdlLCBkb19kdW1wLCBkb190ZXN0LCBkb19vdGhlcn07CgpBcmdzICAgICAgICAgICAgICBhcmdz OwpTdGFja1B0cjxPcHRpb25zPiBvcHRpb25zOwpBY3Rpb24gICAgICAgICAgICBhY3Rpb24gID0g ZG9fb3RoZXI7CgpzdHJ1Y3QgUG9zc2libGVPcHRpb24gewogIGNvbnN0IGNoYXIgKiBuYW1lOwog IGNoYXIgICAgICAgICBhYnJ2OwogIGludCAgICAgICAgICBudW1fYXJnOwogIGJvb2wgICAgICAg ICBpc19jb21tYW5kOwp9OwoKI2RlZmluZSBPUFRJT04obmFtZSxhYnJ2LG51bSkgICAgICAgICB7 bmFtZSxhYnJ2LG51bSxmYWxzZX0KI2RlZmluZSBDT01NQU5EKG5hbWUsYWJydixudW0pICAgICAg ICB7bmFtZSxhYnJ2LG51bSx0cnVlfQojZGVmaW5lIElTUEVMTF9DT01QKGFicnYsbnVtKSAgICAg ICAgIHsiIixhYnJ2LG51bSxmYWxzZX0KCmNvbnN0IFBvc3NpYmxlT3B0aW9uIHBvc3NpYmxlX29w dGlvbnNbXSA9IHsKICBPUFRJT04oIm1hc3RlciIsICAgICAgICAgICAnZCcsIDEpLAogIE9QVElP TigicGVyc29uYWwiLCAgICAgICAgICdwJywgMSksCiAgT1BUSU9OKCJpZ25vcmUiLCAgICAgICAg ICAgJ1cnLCAxKSwKICBPUFRJT04oImxhbmciLCAgICAgICAgICAgICAnbCcsIDEpLAogIE9QVElP TigiYmFja3VwIiwgICAgICAgICAgICdiJywgMCksCiAgT1BUSU9OKCJkb250LWJhY2t1cCIsICAg ICAgJ3gnLCAwKSwKICBPUFRJT04oInJ1bi10b2dldGhlciIsICAgICAnQycsIDApLAogIE9QVElP TigiZG9udC1ydW4tdG9nZXRoZXIiLCdCJywgMCksCiAgT1BUSU9OKCJndWVzcyIsICAgICAgICAg ICAgJ20nLCAwKSwKICBPUFRJT04oImRvbnQtZ3Vlc3MiLCAgICAgICAnUCcsIDApLAogIAogIENP TU1BTkQoInVzYWdlIiwgICAgICc/JywgIDApLAogIENPTU1BTkQoImhlbHAiLCAgICAgICdcMCcs IDApLAogIENPTU1BTkQoInZlcnNpb24iLCAgICd2JywgIDApLAogIENPTU1BTkQoImNvbmZpZyIs ICAgICdcMCcsIDApLAogIENPTU1BTkQoImRpY3RzIiwgICAgICdcMCcsIDApLAogIENPTU1BTkQo ImNoZWNrIiwgICAgICdjJywgIDApLAogIENPTU1BTkQoInBpcGUiLCAgICAgICdhJywgIDApLAog IENPTU1BTkQoImxpc3QiLCAgICAgICdcMCcsIDApLAogIENPTU1BTkQoImNvbnYiLCAgICAgICdc MCcsIDIpLAogIENPTU1BTkQoIm5vcm0iLCAgICAgICdcMCcsIDEpLAogIENPTU1BTkQoImZpbHRl ciIsICAgICdcMCcsIDApLAogIENPTU1BTkQoInNvdW5kc2xpa2UiLCdcMCcsIDApLAogIENPTU1B TkQoIm11bmNoIiwgICAgICdcMCcsIDApLAogIENPTU1BTkQoImV4cGFuZCIsICAgICdcMCcsIDAp LAogIENPTU1BTkQoImNvbWJpbmUiLCAgICdcMCcsIDApLAogIENPTU1BTkQoIm11bmNoLWxpc3Qi LCdcMCcsIDApLAogIENPTU1BTkQoImNsZWFuIiwgICAgICdcMCcsIDApLAogIENPTU1BTkQoImZp bHRlcnMiLCAgICdcMCcsIDApLAogIENPTU1BTkQoIm1vZGVzIiwgICAgICdcMCcsIDApLAoKICBD T01NQU5EKCJkdW1wIiwgICAnXDAnLCAxKSwKICBDT01NQU5EKCJjcmVhdGUiLCAnXDAnLCAxKSwK ICBDT01NQU5EKCJtZXJnZSIsICAnXDAnLCAxKSwKCiAgSVNQRUxMX0NPTVAoJ1MnLDApLCBJU1BF TExfQ09NUCgndycsMSksIElTUEVMTF9DT01QKCdUJywxKSwKCiAgeyIiLCdcMCd9LCB7IiIsJ1ww J30KfTsKCmNvbnN0IFBvc3NpYmxlT3B0aW9uICogcG9zc2libGVfb3B0aW9uc19lbmQgPSBwb3Nz aWJsZV9vcHRpb25zICsgc2l6ZW9mKHBvc3NpYmxlX29wdGlvbnMpL3NpemVvZihQb3NzaWJsZU9w dGlvbikgLSAyOwoKc3RydWN0IE1vZGVBYnJ2IHsKICBjaGFyIGFicnY7CiAgY29uc3QgY2hhciAq IG1vZGU7CiAgY29uc3QgY2hhciAqIGRlc2M7Cn07CnN0YXRpYyBjb25zdCBNb2RlQWJydiBtb2Rl X2FicnZzW10gPSB7CiAgeydlJywgIm1vZGU9ZW1haWwiLCBOXygiZW50ZXIgRW1haWwgbW9kZS4i KX0sCiAgeydIJywgIm1vZGU9aHRtbCIsICBOXygiZW50ZXIgSFRNTCBtb2RlLiIpfSwKICB7J3Qn LCAibW9kZT10ZXgiLCAgIE5fKCJlbnRlciBUZVggbW9kZS4iKX0sCiAgeyduJywgIm1vZGU9bnJv ZmYiLCBOXygiZW50ZXIgTnJvZmYgbW9kZS4iKX0sCiAgeydNJywgIm1vZGU9bWFya2Rvd24iLCBO XygiZW50ZXIgTWFya2Rvd24gbW9kZS4iKX0sCn07CgpzdGF0aWMgY29uc3QgTW9kZUFicnYgKiAg bW9kZV9hYnJ2c19lbmQgPSBtb2RlX2FicnZzICsgc2l6ZW9mKG1vZGVfYWJydnMpL3NpemVvZihN b2RlQWJydik7Cgpjb25zdCBQb3NzaWJsZU9wdGlvbiAqIGZpbmRfb3B0aW9uKGNoYXIgYykgewog IGNvbnN0IFBvc3NpYmxlT3B0aW9uICogaSA9IHBvc3NpYmxlX29wdGlvbnM7CiAgd2hpbGUgKGkg IT0gcG9zc2libGVfb3B0aW9uc19lbmQgJiYgaS0+YWJydiAhPSBjKSAKICAgICsraTsKICByZXR1 cm4gaTsKfQoKc3RhdGljIGlubGluZSBib29sIHN0cl9lcXVhbChjb25zdCBjaGFyICogYmVnaW4s IGNvbnN0IGNoYXIgKiBlbmQsIAoJCQkgICAgIGNvbnN0IGNoYXIgKiBvdGhlcikgCnsKICB3aGls ZShiZWdpbiAhPSBlbmQgJiYgKmJlZ2luID09ICpvdGhlcikKICAgICsrYmVnaW4sICsrb3RoZXI7 CiAgcmV0dXJuIChiZWdpbiA9PSBlbmQgJiYgKm90aGVyID09ICdcMCcpOwp9CgpzdGF0aWMgY29u c3QgUG9zc2libGVPcHRpb24gKiBmaW5kX29wdGlvbihjb25zdCBjaGFyICogYmVnaW4sIGNvbnN0 IGNoYXIgKiBlbmQpIHsKICBjb25zdCBQb3NzaWJsZU9wdGlvbiAqIGkgPSBwb3NzaWJsZV9vcHRp b25zOwogIHdoaWxlIChpICE9IHBvc3NpYmxlX29wdGlvbnNfZW5kIAoJICYmICFzdHJfZXF1YWwo YmVnaW4sIGVuZCwgaS0+bmFtZSkpCiAgICArK2k7CiAgcmV0dXJuIGk7Cn0KCnN0YXRpYyBjb25z dCBQb3NzaWJsZU9wdGlvbiAqIGZpbmRfb3B0aW9uKGNvbnN0IGNoYXIgKiBzdHIpIHsKICBjb25z dCBQb3NzaWJsZU9wdGlvbiAqIGkgPSBwb3NzaWJsZV9vcHRpb25zOwogIHdoaWxlIChpICE9IHBv c3NpYmxlX29wdGlvbnNfZW5kIAoJICYmIHN0cmNtcChzdHIsIGktPm5hbWUpICE9IDApCiAgICAr K2k7CiAgcmV0dXJuIGk7Cn0KCnN0YXRpYyB2b2lkIGxpbmVfYnVmZmVyKCkgewojaWZuZGVmIFdJ TjMyCiAgLy8gc2V0IHVwIHN0ZGluIGFuZCBzdGRvdXQgdG8gYmUgbGluZSBidWZmZXJlZAogIGFz c2VydChzZXR2YnVmKHN0ZGluLCAwLCBfSU9MQkYsIDApID09IDApOyAKICBhc3NlcnQoc2V0dmJ1 ZihzdGRvdXQsIDAsIF9JT0xCRiwgMCkgPT0gMCk7CiNlbmRpZgp9CgpDb252IGRjb252OwpDb252 IHVpY29udjsKCmludCBtYWluIChpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSAKewogIG9w dGlvbnMgPSBuZXdfY29uZmlnKCk7IC8vIHRoaXMgbmVlZHMgdG8gYmUgaGVyZSBiZWNhdXNlIG9m IGEgYnVnCiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBzdGF0aWMgaW5pdGxpemVy cyBvbiBEYXJ3aW4uCiNpZmRlZiBVU0VfTE9DQUxFCiAgc2V0bG9jYWxlIChMQ19BTEwsICIiKTsK I2VuZGlmCiAgYXNwZWxsX2dldHRleHRfaW5pdCgpOwoKICBvcHRpb25zLT5zZXRfY29tbWl0dGVk X3N0YXRlKGZhbHNlKTsKCiAgaWYgKGFyZ2MgPT0gMSkge3ByaW50X2hlbHAoKTsgcmV0dXJuIDA7 fQoKICBpbnQgaSA9IDE7CiAgYm9vbCBleHRlbnNpdmVfdmVyc2lvbl9pbmZvID0gZmFsc2U7CiAg Y29uc3QgUG9zc2libGVPcHRpb24gKiBvOwogIGNvbnN0IGNoYXIgICAgICAgICAgICogcGFybTsK CiAgLy8KICAvLyBwcm9jZXNzIGNvbW1hbmQgbGluZSBvcHRpb25zIGJ5IHNldHRpbmcgdGhlIGFw cHJvcHJpYXRlIG9wdGlvbnMKICAvLyBpbiAib3B0aW9ucyIgYW5kL29yIHB1c2hpbmcgbm9uLW9w dGlvbnMgb250byAiYXJndiIKICAvLwogIFBvc3NpYmxlT3B0aW9uIG90aGVyX29wdCA9IE9QVElP TigiIiwnXDAnLDApOwogIFN0cmluZyBvcHRpb25fbmFtZTsKICB3aGlsZSAoaSAhPSBhcmdjKSB7 CiAgICBpZiAoYXJndltpXVswXSA9PSAnLScpIHsKICAgICAgYm9vbCBoYXZlX3Bhcm0gPSBmYWxz ZTsKICAgICAgaWYgKGFyZ3ZbaV1bMV0gPT0gJy0nKSB7CgkvLyBhIGxvbmcgYXJnCgljb25zdCBj aGFyICogYyA9IGFyZ3ZbaV0gKyAyOwoJd2hpbGUoKmMgIT0gJz0nICYmICpjICE9ICdcMCcpICsr YzsKCW8gPSBmaW5kX29wdGlvbihhcmd2W2ldICsgMiwgYyk7CglpZiAobyA9PSBwb3NzaWJsZV9v cHRpb25zX2VuZCkgewoJICBvcHRpb25fbmFtZS5hc3NpZ24oYXJndltpXSArIDIsIGMgLSBhcmd2 W2ldIC0gMik7CiAgICAgICAgICBvdGhlcl9vcHQubmFtZSAgICA9IG9wdGlvbl9uYW1lLmNfc3Ry KCk7CiAgICAgICAgICBvdGhlcl9vcHQubnVtX2FyZyA9IC0xOwogICAgICAgICAgbyA9ICZvdGhl cl9vcHQ7Cgl9CglpZiAoKmMgPT0gJz0nKSB7aGF2ZV9wYXJtID0gdHJ1ZTsgKytjO30KCXBhcm0g PSBjOwogICAgICB9IGVsc2UgewoJLy8gYSBzaG9ydCBhcmcKCWNvbnN0IE1vZGVBYnJ2ICogaiA9 IG1vZGVfYWJydnM7Cgl3aGlsZSAoaiAhPSBtb2RlX2FicnZzX2VuZCAmJiBqLT5hYnJ2ICE9IGFy Z3ZbaV1bMV0pICsrajsKCWlmIChqID09IG1vZGVfYWJydnNfZW5kKSB7CgkgIG8gPSBmaW5kX29w dGlvbihhcmd2W2ldWzFdKTsKCSAgaWYgKGFyZ3ZbaV1bMV0gPT0gJ3YnICYmIGFyZ3ZbaV1bMl0g PT0gJ3YnKSB7CgkgICAgLy8gSGFjayBmb3IgLXZ2CgkgICAgcGFybSA9IGFyZ3ZbaV0gKyAzOwoJ ICAgIGV4dGVuc2l2ZV92ZXJzaW9uX2luZm8gPSB0cnVlOwoJICB9CgkgIGVsc2UKCSAgICBwYXJt ID0gYXJndltpXSArIDI7Cgl9IGVsc2UgeyAvLyBtb2RlIG9wdGlvbgoJICBvdGhlcl9vcHQubmFt ZSA9ICJtb2RlIjsKCSAgb3RoZXJfb3B0Lm51bV9hcmcgPSAxOwoJICBvID0gJm90aGVyX29wdDsK CSAgcGFybSA9IGotPm1vZGUgKyA1OwoJfQogICAgICAgIGlmICgqcGFybSkgaGF2ZV9wYXJtID0g dHJ1ZTsKICAgICAgfQogICAgICBpZiAobyA9PSBwb3NzaWJsZV9vcHRpb25zX2VuZCkgewoJcHJp bnRfZXJyb3IoXygiSW52YWxpZCBPcHRpb246ICVzIiksIGFyZ3ZbaV0pOwoJcmV0dXJuIDE7CiAg ICAgIH0KICAgICAgaW50IG51bV9wYXJtczsKICAgICAgaWYgKG8tPm51bV9hcmcgPT0gMCkgewog ICAgICAgIG51bV9wYXJtcyA9IDA7CglpZiAocGFybVswXSAhPSAnXDAnKSB7CgkgIHByaW50X2Vy cm9yKF8oIiclcycgZG9lcyBub3QgdGFrZSBhbnkgcGFyYW1ldGVycy4iKSwKCQkgICAgICBTdHJp bmcoYXJndltpXSwgcGFybSAtIGFyZ3ZbaV0pKTsKCSAgcmV0dXJuIDE7Cgl9CglpICs9IDE7CiAg ICAgIH0gZWxzZSBpZiAoaGF2ZV9wYXJtKSB7CiAgICAgICAgbnVtX3Bhcm1zID0gMTsKICAgICAg ICBpICs9IDE7CiAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT0gYXJnYyB8fCBhcmd2W2krMV1bMF0g PT0gJy0nKSB7CiAgICAgICAgaWYgKG8tPm51bV9hcmcgPT0gLTEpIHsKICAgICAgICAgIG51bV9w YXJtcyA9IDA7CiAgICAgICAgICBpICs9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBy aW50X2Vycm9yKF8oIllvdSBtdXN0IHNwZWNpZnkgYSBwYXJhbWV0ZXIgZm9yIFwiJXNcIi4iKSwg YXJndltpXSk7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAg ICAgICAgbnVtX3Bhcm1zID0gby0+bnVtX2FyZzsKICAgICAgICBwYXJtID0gYXJndltpICsgMV07 CiAgICAgICAgaSArPSAyOwogICAgICB9CiAgICAgIGlmIChvLT5pc19jb21tYW5kKSB7Cglhcmdz LnB1c2hfYmFjayhvLT5uYW1lKTsKCWlmIChvLT5udW1fYXJnID09IDEpCgkgIGFyZ3MucHVzaF9i YWNrKHBhcm0pOwogICAgICB9IGVsc2UgaWYgKG8tPm5hbWVbMF0gIT0gJ1wwJykgewogICAgICAg IENvbmZpZzo6RW50cnkgKiBlbnRyeSA9IG5ldyBDb25maWc6OkVudHJ5OwogICAgICAgIGVudHJ5 LT5rZXkgPSBvLT5uYW1lOwogICAgICAgIGVudHJ5LT52YWx1ZSA9IHBhcm07CiAgICAgICAgZW50 cnktPm5lZWRfY29udiA9IHRydWU7CiAgICAgICAgaWYgKG51bV9wYXJtcyA9PSAtMSkgewogICAg ICAgICAgZW50cnktPnBsYWNlX2hvbGRlciA9IGFyZ3Muc2l6ZSgpOwogICAgICAgICAgYXJncy5w dXNoX2JhY2socGFybSk7CiAgICAgICAgfQogICAgICAgIG9wdGlvbnMtPnNldChlbnRyeSk7CiAg ICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGFyZ3MucHVzaF9iYWNrKGFyZ3ZbaV0pOwogICAgICBp ICs9IDE7CiAgICB9CiAgfQoKICBFWElUX09OX0VSUihvcHRpb25zLT5yZWFkX2luX3NldHRpbmdz KCkpOwoKICBjb25zdCBjaGFyICogY29kZXNldCA9IDA7CiNpZmRlZiBIQVZFX0xBTkdJTkZPX0NP REVTRVQKICBjb2Rlc2V0ID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7CiAgaWYgKGFzY2lpX2VuY29k aW5nKCpvcHRpb25zLCBjb2Rlc2V0KSkgY29kZXNldCA9IDA7CiNlbmRpZgoKLy8gI2lmZGVmIFVT RV9MT0NBTEUKLy8gICBpZiAoIW9wdGlvbnMtPmhhdmUoImVuY29kaW5nIikgJiYgY29kZXNldCkK Ly8gICAgIEVYSVRfT05fRVJSKG9wdGlvbnMtPnJlcGxhY2UoImVuY29kaW5nIiwgY29kZXNldCkp OwovLyAjZW5kaWYKCiAgVmVjdG9yPGludD4gdG9fcmVtb3ZlOwogIEVYSVRfT05fRVJSKG9wdGlv bnMtPmNvbW1pdF9hbGwoJnRvX3JlbW92ZSwgY29kZXNldCkpOwogIGZvciAoaW50IGkgPSB0b19y ZW1vdmUuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgIGFyZ3MuZXJhc2UoYXJncy5iZWdp bigpICsgdG9fcmVtb3ZlW2ldKTsKICB9CgogIGlmIChhcmdzLmVtcHR5KCkpIHsKICAgIHByaW50 X2Vycm9yKF8oIllvdSBtdXN0IHNwZWNpZnkgYW4gYWN0aW9uIikpOwogICAgcmV0dXJuIDE7CiAg fQoKICBTdHJpbmcgYWN0aW9uX3N0ciA9IGFyZ3MuZnJvbnQoKTsKICBhcmdzLnBvcF9mcm9udCgp OwogIGNvbnN0IFBvc3NpYmxlT3B0aW9uICogYWN0aW9uX29wdCA9IGZpbmRfb3B0aW9uKGFjdGlv bl9zdHIuc3RyKCkpOwogIGlmICghYWN0aW9uX29wdC0+aXNfY29tbWFuZCkgewogICAgcHJpbnRf ZXJyb3IoXygiVW5rbm93biBBY3Rpb246ICVzIiksICBhY3Rpb25fc3RyKTsKICAgIHJldHVybiAx OwogIH0gZWxzZSBpZiAoYWN0aW9uX29wdC0+bnVtX2FyZyA9PSAxICYmIGFyZ3MuZW1wdHkoKSkg ewogICAgcHJpbnRfZXJyb3IoXygiWW91IG11c3Qgc3BlY2lmeSBhIHBhcmFtZXRlciBmb3IgXCIl c1wiLiIpLCBhY3Rpb25fc3RyKTsKICAgIHJldHVybiAxOwogIH0gZWxzZSBpZiAoYWN0aW9uX29w dC0+bnVtX2FyZyA+IChpbnQpYXJncy5zaXplKCkpIHsKICAgIENFUlIucHJpbnRmKF8oIkVycm9y OiBZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0ICVkIHBhcmFtZXRlcnMgZm9yIFwiJXNcIi5cbiIp LCAKICAgICAgICAgICAgICAgIGFjdGlvbl9vcHQtPm51bV9hcmcsIGFjdGlvbl9zdHIuc3RyKCkp OwogICAgcmV0dXJuIDE7CiAgfQoKICAvLwogIC8vIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBhY3Rp b24KICAvLwogIGlmIChhY3Rpb25fc3RyID09ICJ1c2FnZSIpCiAgICBwcmludF9oZWxwKCk7CiAg ZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAiaGVscCIpCiAgICBwcmludF9oZWxwKHRydWUpOwogIGVs c2UgaWYgKGFjdGlvbl9zdHIgPT0gInZlcnNpb24iKQogICAgcHJpbnRfdmVyKGV4dGVuc2l2ZV92 ZXJzaW9uX2luZm8pOwogIGVsc2UgaWYgKGFjdGlvbl9zdHIgPT0gImNvbmZpZyIpCiAgICBjb25m aWcoKTsKICBlbHNlIGlmIChhY3Rpb25fc3RyID09ICJkaWN0cyIpCiAgICBkaWN0cygpOwogIGVs c2UgaWYgKGFjdGlvbl9zdHIgPT0gImNoZWNrIikKICAgIGNoZWNrKCk7CiAgZWxzZSBpZiAoYWN0 aW9uX3N0ciA9PSAicGlwZSIpCiAgICBwaXBlKCk7CiAgZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAi bGlzdCIpCiAgICBsaXN0KCk7CiAgZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAiY29udiIpCiAgICBj b252dCgpOwogIGVsc2UgaWYgKGFjdGlvbl9zdHIgPT0gIm5vcm0iKQogICAgbm9ybWx6KCk7CiAg ZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAiZmlsdGVyIikKICAgIGZpbHRlcigpOwogIGVsc2UgaWYg KGFjdGlvbl9zdHIgPT0gInNvdW5kc2xpa2UiKQogICAgc291bmRzbGlrZSgpOwogIGVsc2UgaWYg KGFjdGlvbl9zdHIgPT0gIm11bmNoIikKICAgIG11bmNoKCk7CiAgZWxzZSBpZiAoYWN0aW9uX3N0 ciA9PSAiZXhwYW5kIikKICAgIGV4cGFuZCgpOwogIGVsc2UgaWYgKGFjdGlvbl9zdHIgPT0gImNv bWJpbmUiKQogICAgY29tYmluZSgpOwogIGVsc2UgaWYgKGFjdGlvbl9zdHIgPT0gIm11bmNoLWxp c3QiKQogICAgbXVuY2hfbGlzdCgpOwogIGVsc2UgaWYgKGFjdGlvbl9zdHIgPT0gImNsZWFuIikK ICAgIGNsZWFuKCk7CiAgZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAiZmlsdGVycyIpCiAgICBmaWx0 ZXJzKCk7CiAgZWxzZSBpZiAoYWN0aW9uX3N0ciA9PSAibW9kZXMiKQogICAgbW9kZXMoKTsKICBl bHNlIGlmIChhY3Rpb25fc3RyID09ICJkdW1wIikKICAgIGFjdGlvbiA9IGRvX2R1bXA7CiAgZWxz ZSBpZiAoYWN0aW9uX3N0ciA9PSAiY3JlYXRlIikKICAgIGFjdGlvbiA9IGRvX2NyZWF0ZTsKICBl bHNlIGlmIChhY3Rpb25fc3RyID09ICJtZXJnZSIpCiAgICBhY3Rpb24gPSBkb19tZXJnZTsKICBl bHNlCiAgICBhYm9ydCgpOyAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuCgogIGlmIChhY3Rpb24g IT0gZG9fb3RoZXIpIHsKICAgIGlmIChhcmdzLmVtcHR5KCkpIHsKICAgICAgcHJpbnRfZXJyb3Io XygiVW5rbm93biBBY3Rpb246ICVzIiksICBhY3Rpb25fc3RyKTsKICAgICAgcmV0dXJuIDE7CiAg ICB9CiAgICBTdHJpbmcgd2hhdF9zdHIgPSBhcmdzLmZyb250KCk7CiAgICBhcmdzLnBvcF9mcm9u dCgpOwogICAgaWYgKHdoYXRfc3RyID09ICJjb25maWciKQogICAgICBjb25maWcoKTsKICAgIGVs c2UgaWYgKHdoYXRfc3RyID09ICJkaWN0cyIpCiAgICAgIGRpY3RzKCk7CiAgICBlbHNlIGlmICh3 aGF0X3N0ciA9PSAiZmlsdGVycyIpCiAgICAgIGZpbHRlcnMoKTsKICAgIGVsc2UgaWYgKHdoYXRf c3RyID09ICJtb2RlcyIpCiAgICAgIG1vZGVzKCk7CiAgICBlbHNlIGlmICh3aGF0X3N0ciA9PSAi bWFzdGVyIikKICAgICAgbWFzdGVyKCk7CiAgICBlbHNlIGlmICh3aGF0X3N0ciA9PSAicGVyc29u YWwiKQogICAgICBwZXJzb25hbCgpOwogICAgZWxzZSBpZiAod2hhdF9zdHIgPT0gInJlcGwiKQog ICAgICByZXBsKCk7CiAgICBlbHNlIGlmICh3aGF0X3N0ciA9PSAiYWZmaXgiKQogICAgICBkdW1w X2FmZml4KCk7CiAgICBlbHNlIHsKICAgICAgcHJpbnRfZXJyb3IoXygiVW5rbm93biBBY3Rpb246 ICVzIiksCgkJICBTdHJpbmcoYWN0aW9uX3N0ciArICIgIiArIHdoYXRfc3RyKSk7CiAgICAgIHJl dHVybiAxOwogICAgfQogIH0KCiAgcmV0dXJuIDA7Cgp9CgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vIEFjdGlvbiBGdW5jdGlv bnMKLy8KLy8KCiAgCnN0YXRpYyBDb252ZXJ0ICogc2V0dXBfY29udihjb25zdCBhc3BlbGxlcjo6 TGFuZ3VhZ2UgKiBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnICogY29u ZmlnKQp7CiAgaWYgKGNvbmZpZy0+cmV0cmlldmUoImVuY29kaW5nIikgIT0gIm5vbmUiKSB7CiAg ICBQb3NpYkVycjxDb252ZXJ0ICo+IHBlID0gbmV3X2NvbnZlcnRfaWZfbmVlZGVkKCpjb25maWcs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmct PmNoYXJtYXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY29uZmlnLT5yZXRyaWV2ZSgiZW5jb2RpbmciKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybVRvKTsKICAgIGlmIChwZS5oYXNfZXJy KCkpIHtwcmludF9lcnJvcihwZS5nZXRfZXJyKCktPm1lc2cpOyBleGl0KDEpO30KICAgIHJldHVy biBwZS5kYXRhOwogIH0gZWxzZSB7CiAgICByZXR1cm4gMDsKICB9Cn0KCnN0YXRpYyBDb252ZXJ0 ICogc2V0dXBfY29udihDb25maWcgKiBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBhc3BlbGxlcjo6TGFuZ3VhZ2UgKiBsYW5nKQp7CiAgaWYgKGNvbmZpZy0+cmV0cmll dmUoImVuY29kaW5nIikgIT0gIm5vbmUiKSB7CiAgICBQb3NpYkVycjxDb252ZXJ0ICo+IHBlID0g bmV3X2NvbnZlcnRfaWZfbmVlZGVkKCpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+cmV0cmlldmUoImVuY29kaW5nIiksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmctPmNo YXJtYXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTm9ybUZyb20pOwogICAgaWYgKHBlLmhhc19lcnIoKSkge3ByaW50X2Vycm9yKHBlLmdldF9l cnIoKS0+bWVzZyk7IGV4aXQoMSk7fQogICAgcmV0dXJuIHBlLmRhdGE7CiAgfSBlbHNlIHsKICAg IHJldHVybiAwOwogIH0KfQoKdm9pZCBzZXR1cF9kaXNwbGF5X2NvbnYoKQp7CiAgY29uc3QgY2hh ciAqIGdldHRleHRfZW5jID0gMDsKICBjb25zdCBjaGFyICogZW52X2VuYyA9IDA7CiAgU3RyaW5n IGRvY19lbmMgPSBvcHRpb25zLT5yZXRyaWV2ZSgiZW5jb2RpbmciKTsKICBTdHJpbmcgZW5jOwoj aWZkZWYgRU5BQkxFX05MUwogIGdldHRleHRfZW5jID0gYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQo ImFzcGVsbCIsIDApOwogIGlmIChhc2NpaV9lbmNvZGluZygqb3B0aW9ucyxnZXR0ZXh0X2VuYykp IGdldHRleHRfZW5jID0gMDsKI2VuZGlmCiNpZmRlZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKICBl bnZfZW5jID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7CiAgaWYgKGFzY2lpX2VuY29kaW5nKCpvcHRp b25zLCBlbnZfZW5jKSkgZW52X2VuYyA9IDA7CiNlbmRpZgogIGlmIChnZXR0ZXh0X2VuYyAmJiBl bnZfZW5jICYmIHN0cmNtcChnZXR0ZXh0X2VuYyxlbnZfZW5jKSAhPSAwKSAKICB7CiAgICBmcHV0 cygoIkVycm9yOiBiaW5kX3RleHRkb21haW5fY29kZXNldCAhPSBubF9sYW5naW5mbyhDT0RFU0VU KVxuIiksIHN0ZGVycik7CiAgICBleGl0KC0xKTsKICB9CiAgaWYgKGdldHRleHRfZW5jKQogICAg ZW5jID0gZ2V0dGV4dF9lbmM7CiAgZWxzZSBpZiAoZW52X2VuYykKICAgIGVuYyA9IGVudl9lbmM7 CiAgZWxzZQogICAgZW5jID0gZG9jX2VuYzsKCiAgRVhJVF9PTl9FUlIoZGNvbnYuc2V0dXAoKm9w dGlvbnMsIGRvY19lbmMsIGVuYywgTm9ybU5vbmUpKTsKICBFWElUX09OX0VSUih1aWNvbnYuc2V0 dXAoKm9wdGlvbnMsIGVuYywgZG9jX2VuYywgTm9ybU5vbmUpKTsKfQoKCi8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLwovLwovLyBjb25maWcKLy8KCnZvaWQgY29uZmlnICgpCnsKICBpZiAoYXJn cy5zaXplKCkgPT0gMCkgewogICAgbG9hZF9hbGxfZmlsdGVycyhvcHRpb25zKTsKICAgIG9wdGlv bnMtPndyaXRlX3RvX3N0cmVhbShDT1VUKTsKICB9IGVsc2UgewogICAgRVhJVF9PTl9FUlJfU0VU KG9wdGlvbnMtPnJldHJpZXZlX2FueShhcmdzWzBdKSwgU3RyaW5nLCB2YWx1ZSk7CiAgICBDT1VU IDw8IHZhbHVlIDw8ICJcbiI7CiAgfQp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8K Ly8gZGljdHMKLy8KCnZvaWQgZGljdHMoKSAKewogIGNvbnN0IERpY3RJbmZvTGlzdCAqIGRsaXN0 ID0gZ2V0X2RpY3RfaW5mb19saXN0KG9wdGlvbnMpOwoKICBTdGFja1B0cjxEaWN0SW5mb0VudW1l cmF0aW9uPiBkZWxzKGRsaXN0LT5lbGVtZW50cygpKTsKCiAgY29uc3QgRGljdEluZm8gKiBlbnRy eTsKCiAgd2hpbGUgKCAoZW50cnkgPSBkZWxzLT5uZXh0KCkpICE9IDApIAogICAgcHV0cyhlbnRy eS0+bmFtZSk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBsaXN0IGF2YWls YWJsZSAoZmlsdGVycy9maWx0ZXIgbW9kZXMpCi8vCgp2b2lkIGxpc3RfYXZhaWxhYmxlKFBvc2li RXJyPFN0cmluZ1BhaXJFbnVtZXJhdGlvbiAqPiAoKmZ1bikoQ29uZmlnICopKQp7CiAgRVhJVF9P Tl9FUlJfU0VUKGZ1bihvcHRpb25zKSwgU3RyaW5nUGFpckVudW1lcmF0aW9uICosIGVscyk7CiAg U3RyaW5nUGFpciBzcDsKICB3aGlsZSAoIWVscy0+YXRfZW5kKCkpIHsKICAgIHNwID0gZWxzLT5u ZXh0KCk7CiAgICBwcmludGYoIiUtMTRzICVzXG4iLCBzcC5maXJzdCwgZ3RfKHNwLnNlY29uZCkp OwogIH0KICBkZWxldGUgZWxzOwp9Cgp2b2lkIGZpbHRlcnMoKQp7CiAgbG9hZF9hbGxfZmlsdGVy cyhvcHRpb25zKTsKICBsaXN0X2F2YWlsYWJsZShhdmFpbGFibGVfZmlsdGVycyk7Cn0KCnZvaWQg bW9kZXMoKQp7CiAgbGlzdF9hdmFpbGFibGUoYXZhaWxhYmxlX2ZpbHRlcl9tb2Rlcyk7Cn0KCi8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBwaXBlCi8vCgovLyBwcmVjb25kOiBzdHJs ZW4oc3RyKSA+IDAKY2hhciAqIHRyaW1fd3NwYWNlIChjaGFyICogc3RyKQp7CiAgaW50IGxhc3Qg PSBzdHJsZW4oc3RyKSAtIDE7CiAgd2hpbGUgKGFzY19pc3NwYWNlKHN0clswXSkpIHsKICAgICsr c3RyOwogICAgLS1sYXN0OwogIH0KICB3aGlsZSAobGFzdCA+IDAgJiYgYXNjX2lzc3BhY2Uoc3Ry W2xhc3RdKSkgewogICAgLS1sYXN0OwogIH0KICBzdHJbbGFzdCArIDFdID0gJ1wwJzsKICByZXR1 cm4gc3RyOwp9Cgpib29sIGdldF93b3JkX3BhaXIoY2hhciAqIGxpbmUsIGNoYXIgKiAmIHcxLCBj aGFyICogJiB3MikKewogIHcyID0gc3RyY2hyKGxpbmUsICcsJyk7CiAgaWYgKCF3MikgewogICAg cHJpbnRfZXJyb3IoXygiSW52YWxpZCBJbnB1dCIpKTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAg KncyID0gJ1wwJzsKICArK3cyOwogIHcxID0gdHJpbV93c3BhY2UobGluZSk7CiAgdzIgPSB0cmlt X3dzcGFjZSh3Mik7CiAgcmV0dXJuIHRydWU7Cn0KCnZvaWQgcHJpbnRfZWxlbWVudHMoY29uc3Qg QXNwZWxsV29yZExpc3QgKiB3bCkgewogIEFzcGVsbFN0cmluZ0VudW1lcmF0aW9uICogZWxzID0g YXNwZWxsX3dvcmRfbGlzdF9lbGVtZW50cyh3bCk7CiAgaW50IGNvdW50ID0gMDsKICBjb25zdCBj aGFyICogdzsKICBTdHJpbmcgbGluZTsKICB3aGlsZSAoICh3ID0gYXNwZWxsX3N0cmluZ19lbnVt ZXJhdGlvbl9uZXh0KGVscykpICE9IDAgKSB7CiAgICArK2NvdW50OwogICAgbGluZSArPSB3Owog ICAgbGluZSArPSAiLCAiOwogIH0KICBsaW5lLnJlc2l6ZShsaW5lLnNpemUoKSAtIDIpOwogIENP VVQucHJpbnRmKCIldTogJXNcbiIsIGNvdW50LCBsaW5lLmNfc3RyKCkpOwp9CgpzdHJ1Y3QgU3Rh dHVzRnVuSW5mIAp7CiAgYXNwZWxsZXI6OlNwZWxsZXJJbXBsICogcmVhbF9zcGVsbGVyOwogIENv bnYgb2NvbnY7CiAgYm9vbCB2ZXJib3NlOwogIFN0YXR1c0Z1bkluZihDb252ZXJ0ICogYykgOiBv Y29udihjKSB7fQp9OwoKdm9pZCBzdGF0dXNfZnVuKHZvaWQgKiBkLCBUb2tlbiwgaW50IGNvcnJl Y3QpCnsKICBTdGF0dXNGdW5JbmYgKiBwID0gc3RhdGljX2Nhc3Q8U3RhdHVzRnVuSW5mICo+KGQp OwogIGlmIChwLT52ZXJib3NlICYmIGNvcnJlY3QpIHsKICAgIGNvbnN0IENoZWNrSW5mbyAqIGNp ID0gcC0+cmVhbF9zcGVsbGVyLT5jaGVja19pbmZvKCk7CiAgICBpZiAoY2ktPmNvbXBvdW5kKQog ICAgICBDT1VULnB1dCgiLVxuIik7CiAgICBlbHNlIGlmIChjaS0+cHJlX2ZsYWcgfHwgY2ktPnN1 Zl9mbGFnKQogICAgICBDT1VULnByaW50ZigiKyAlc1xuIiwgcC0+b2NvbnYoY2ktPndvcmQuc3Ry LCBjaS0+d29yZC5sZW4pKTsKICAgIGVsc2UKICAgICAgQ09VVC5wdXQoIipcbiIpOwogIH0KfQoK RG9jdW1lbnRDaGVja2VyICogbmV3X2NoZWNrZXIoQXNwZWxsU3BlbGxlciAqIHNwZWxsZXIsIAoJ CQkgICAgICBTdGF0dXNGdW5JbmYgJiBzdGF0dXNfZnVuX2luZikgCnsKICBFWElUX09OX0VSUl9T RVQobmV3X2RvY3VtZW50X2NoZWNrZXIocmVpbnRlcnByZXRfY2FzdDxTcGVsbGVyICo+KHNwZWxs ZXIpKSwKCQkgIFN0YWNrUHRyPERvY3VtZW50Q2hlY2tlcj4sIGNoZWNrZXIpOwogIGNoZWNrZXIt PnNldF9zdGF0dXNfZnVuKHN0YXR1c19mdW4sICZzdGF0dXNfZnVuX2luZik7CiAgcmV0dXJuIGNo ZWNrZXIucmVsZWFzZSgpOwp9CgojZGVmaW5lIEJSRUFLX09OX1NQRUxMRVJfRVJSXAogIGRvIHtp ZiAoYXNwZWxsX3NwZWxsZXJfZXJyb3Ioc3BlbGxlcikpIHtcCiAgICBwcmludF9lcnJvcihhc3Bl bGxfc3BlbGxlcl9lcnJvcl9tZXNzYWdlKHNwZWxsZXIpKTsgYnJlYWs7XAogIH0gfSB3aGlsZSAo ZmFsc2UpCgp2b2lkIHBpcGUoKSAKewogIGxpbmVfYnVmZmVyKCk7CgogIGJvb2wgdGVyc2VfbW9k ZSA9IHRydWU7CiAgYm9vbCBkb190aW1lID0gb3B0aW9ucy0+cmV0cmlldmVfYm9vbCgidGltZSIp OwogIGJvb2wgc3VnZ2VzdCA9IG9wdGlvbnMtPnJldHJpZXZlX2Jvb2woInN1Z2dlc3QiKTsKICBi b29sIGluY2x1ZGVfZ3Vlc3NlcyA9IG9wdGlvbnMtPnJldHJpZXZlX2Jvb2woImd1ZXNzIik7CiAg Y2xvY2tfdCBzdGFydCxmaW5pc2g7CgogIGlmICghb3B0aW9ucy0+aGF2ZSgibW9kZSIpICYmICFv cHRpb25zLT5oYXZlKCJmaWx0ZXIiKSkgewogICAgUG9zaWJFcnJCYXNlIGVycihvcHRpb25zLT5y ZXBsYWNlKCJtb2RlIiwgIm5yb2ZmIikpOwogICAgaWYgKGVyci5oYXNfZXJyKCkpIAogICAgICBD RVJSLnByaW50ZihfKCJXQVJOSU5HOiBVbmFibGUgdG8gZW50ZXIgTnJvZmYgbW9kZTogJXNcbiIp LAogICAgICAgICAgICAgICAgICBlcnIuZ2V0X2VycigpLT5tZXNnKTsKICB9CgogIHN0YXJ0ID0g Y2xvY2soKTsKICAKICBBc3BlbGxDYW5IYXZlRXJyb3IgKiByZXQgCiAgICA9IG5ld19hc3BlbGxf c3BlbGxlcihyZWludGVycHJldF9jYXN0PEFzcGVsbENvbmZpZyAqPihvcHRpb25zLmdldCgpKSk7 CiAgaWYgKGFzcGVsbF9lcnJvcihyZXQpKSB7CiAgICBwcmludF9lcnJvcihhc3BlbGxfZXJyb3Jf bWVzc2FnZShyZXQpKTsKICAgIGV4aXQoMSk7CiAgfQogIEFzcGVsbFNwZWxsZXIgKiBzcGVsbGVy ID0gdG9fYXNwZWxsX3NwZWxsZXIocmV0KTsKICBhc3BlbGxlcjo6U3BlbGxlckltcGwgKiByZWFs X3NwZWxsZXIgPSByZWludGVycHJldF9jYXN0PGFzcGVsbGVyOjpTcGVsbGVySW1wbCAqPihzcGVs bGVyKTsKICBDb25maWcgKiBjb25maWcgPSByZWFsX3NwZWxsZXItPmNvbmZpZygpOwogIENvbnYg aWNvbnYoc2V0dXBfY29udihjb25maWcsICZyZWFsX3NwZWxsZXItPmxhbmcoKSkpOwogIENvbnYg b2NvbnYoc2V0dXBfY29udigmcmVhbF9zcGVsbGVyLT5sYW5nKCksIGNvbmZpZykpOwogIE1CTGVu IG1iX2xlbjsKICBpZiAoIWNvbmZpZy0+cmV0cmlldmVfYm9vbCgiYnl0ZS1vZmZzZXRzIikpIAog ICAgbWJfbGVuLnNldHVwKCpjb25maWcsIGNvbmZpZy0+cmV0cmlldmUoImVuY29kaW5nIikpOwog IGlmIChkb190aW1lKQogICAgQ09VVCA8PCBfKCJUaW1lIHRvIGxvYWQgd29yZCBsaXN0OiAiKQog ICAgICAgICA8PCAoY2xvY2soKSAtIHN0YXJ0KS8oZG91YmxlKUNMT0NLU19QRVJfU0VDIDw8ICJc biI7CiAgU3RhdHVzRnVuSW5mIHN0YXR1c19mdW5faW5mKHNldHVwX2NvbnYoJnJlYWxfc3BlbGxl ci0+bGFuZygpLCBjb25maWcpKTsKICBzdGF0dXNfZnVuX2luZi5yZWFsX3NwZWxsZXIgPSByZWFs X3NwZWxsZXI7CiAgYm9vbCAmIHByaW50X3N0YXIgPSBzdGF0dXNfZnVuX2luZi52ZXJib3NlOwog IHByaW50X3N0YXIgPSB0cnVlOwogIFN0YWNrUHRyPERvY3VtZW50Q2hlY2tlcj4gY2hlY2tlcihu ZXdfY2hlY2tlcihzcGVsbGVyLCBzdGF0dXNfZnVuX2luZikpOwogIGludCBjOwogIGNvbnN0IGNo YXIgKiB3OwogIENoYXJWZWN0b3IgYnVmOwogIGNoYXIgKiBsaW5lOwogIGNoYXIgKiBsaW5lMDsK ICBjaGFyICogd29yZDsKICBjaGFyICogd29yZDI7CiAgaW50ICAgIGlnbm9yZTsKICBQb3NpYkVy ckJhc2UgZXJyOwoKICBwcmludF92ZXIoKTsKCiAgZm9yICg7OykgewogICAgYnVmLmNsZWFyKCk7 CiAgICBmZmx1c2goc3Rkb3V0KTsKICAgIHdoaWxlIChjID0gZ2V0Y2hhcigpLCBjICE9ICdcbicg JiYgYyAhPSBFT0YpCiAgICAgIGJ1Zi5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oYykpOwog ICAgYnVmLnB1c2hfYmFjaygnXG4nKTsgLy8gYWx3YXlzIGFkZCBuZXcgbGluZSBzbyBzdHJsZW4g PiAwCiAgICBidWYucHVzaF9iYWNrKCdcMCcpOwogICAgLy9DRVJSLnByaW50ZigiJXMiLCBidWYu ZGF0YSgpKTsKICAgIGxpbmUgPSBidWYuZGF0YSgpOwogICAgaWdub3JlID0gMDsKICAgIHN3aXRj aCAobGluZVswXSkgewogICAgY2FzZSAnXG4nOgogICAgICBpZiAoYyAhPSBFT0YpIGNvbnRpbnVl OwogICAgICBlbHNlICAgICAgICAgIGJyZWFrOwogICAgY2FzZSAnKic6CiAgICAgIHdvcmQgPSB0 cmltX3dzcGFjZShsaW5lICsgMSk7CiAgICAgIGFzcGVsbF9zcGVsbGVyX2FkZF90b19wZXJzb25h bChzcGVsbGVyLCB3b3JkLCAtMSk7CiAgICAgIEJSRUFLX09OX1NQRUxMRVJfRVJSOwogICAgICBi cmVhazsKICAgIGNhc2UgJyYnOgogICAgICB3b3JkID0gdHJpbV93c3BhY2UobGluZSArIDEpOwog ICAgICBhc3BlbGxfc3BlbGxlcl9hZGRfdG9fcGVyc29uYWwKCShzcGVsbGVyLCAKCSByZWFsX3Nw ZWxsZXItPnRvX2xvd2VyKHdvcmQpLCAtMSk7CiAgICAgIEJSRUFLX09OX1NQRUxMRVJfRVJSOwog ICAgICBicmVhazsKICAgIGNhc2UgJ0AnOgogICAgICB3b3JkID0gdHJpbV93c3BhY2UobGluZSAr IDEpOwogICAgICBhc3BlbGxfc3BlbGxlcl9hZGRfdG9fc2Vzc2lvbihzcGVsbGVyLCB3b3JkLCAt MSk7CiAgICAgIEJSRUFLX09OX1NQRUxMRVJfRVJSOwogICAgICBicmVhazsKICAgIGNhc2UgJyMn OgogICAgICBhc3BlbGxfc3BlbGxlcl9zYXZlX2FsbF93b3JkX2xpc3RzKHNwZWxsZXIpOwogICAg ICBCUkVBS19PTl9TUEVMTEVSX0VSUjsKICAgICAgYnJlYWs7CiAgICBjYXNlICcrJzoKICAgICAg d29yZCA9IHRyaW1fd3NwYWNlKGxpbmUgKyAxKTsKICAgICAgZXJyID0gY29uZmlnLT5yZXBsYWNl KCJtb2RlIiwgd29yZCk7CiAgICAgIGlmIChlcnIuZ2V0X2VycigpKQoJY29uZmlnLT5yZXBsYWNl KCJtb2RlIiwgInRleCIpOwogICAgICByZWxvYWRfZmlsdGVycyhyZWFsX3NwZWxsZXIpOwogICAg ICBjaGVja2VyLmRlbCgpOwogICAgICBjaGVja2VyID0gbmV3X2NoZWNrZXIoc3BlbGxlciwgc3Rh dHVzX2Z1bl9pbmYpOwogICAgICBicmVhazsKICAgIGNhc2UgJy0nOgogICAgICBjb25maWctPnJl bW92ZSgiZmlsdGVyIik7CiAgICAgIHJlbG9hZF9maWx0ZXJzKHJlYWxfc3BlbGxlcik7CiAgICAg IGNoZWNrZXIuZGVsKCk7CiAgICAgIGNoZWNrZXIgPSBuZXdfY2hlY2tlcihzcGVsbGVyLCBzdGF0 dXNfZnVuX2luZik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnfic6CiAgICAgIGJyZWFrOwogICAg Y2FzZSAnISc6CiAgICAgIHRlcnNlX21vZGUgPSB0cnVlOwogICAgICBwcmludF9zdGFyID0gZmFs c2U7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnJSc6CiAgICAgIHRlcnNlX21vZGUgPSBmYWxzZTsK ICAgICAgcHJpbnRfc3RhciA9IHRydWU7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnJCc6CiAgICAg IGlmIChsaW5lWzFdID09ICckJykgewoJc3dpdGNoKGxpbmVbMl0pIHsKCWNhc2UgJ3InOgoJICBz d2l0Y2gobGluZVszXSkgewoJICBjYXNlICdhJzoKCSAgICBpZiAoZ2V0X3dvcmRfcGFpcihsaW5l ICsgNCwgd29yZCwgd29yZDIpKQoJICAgICAgYXNwZWxsX3NwZWxsZXJfc3RvcmVfcmVwbGFjZW1l bnQoc3BlbGxlciwgd29yZCwgLTEsIHdvcmQyLCAtMSk7CgkgICAgYnJlYWs7CgkgIH0KCSAgYnJl YWs7CgljYXNlICdjJzoKCSAgc3dpdGNoIChsaW5lWzNdKSB7CgkgIGNhc2UgJ3MnOgoJICAgIGlm IChnZXRfd29yZF9wYWlyKGxpbmUgKyA0LCB3b3JkLCB3b3JkMikpCgkgICAgICBCUkVBS19PTl9F UlIoZXJyID0gY29uZmlnLT5yZXBsYWNlKHdvcmQsIHdvcmQyKSk7CiAgICAgICAgICAgIGlmIChz dHJjbXAod29yZCwic3VnZ2VzdCIpID09IDApCiAgICAgICAgICAgICAgc3VnZ2VzdCA9IGNvbmZp Zy0+cmV0cmlldmVfYm9vbCgic3VnZ2VzdCIpOwogICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAo d29yZCwidGltZSIpID09IDApCiAgICAgICAgICAgICAgZG9fdGltZSA9IGNvbmZpZy0+cmV0cmll dmVfYm9vbCgidGltZSIpOwogICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAod29yZCwiZ3Vlc3Mi KSA9PSAwKQogICAgICAgICAgICAgIGluY2x1ZGVfZ3Vlc3NlcyA9IGNvbmZpZy0+cmV0cmlldmVf Ym9vbCgiZ3Vlc3MiKTsKCSAgICBicmVhazsKCSAgY2FzZSAncic6CgkgICAgd29yZCA9IHRyaW1f d3NwYWNlKGxpbmUgKyA0KTsKCSAgICBCUkVBS19PTl9FUlJfU0VUKGNvbmZpZy0+cmV0cmlldmUo d29yZCksIFN0cmluZywgcmV0KTsKICAgICAgICAgICAgQ09VVC5wcmludGwocmV0KTsKCSAgICBi cmVhazsKCSAgfQoJICBicmVhazsKCWNhc2UgJ3AnOgoJICBzd2l0Y2ggKGxpbmVbM10pIHsKCSAg Y2FzZSAncCc6CgkgICAgcHJpbnRfZWxlbWVudHMoYXNwZWxsX3NwZWxsZXJfcGVyc29uYWxfd29y ZF9saXN0KHNwZWxsZXIpKTsKCSAgICBicmVhazsKCSAgY2FzZSAncyc6CgkgICAgcHJpbnRfZWxl bWVudHMoYXNwZWxsX3NwZWxsZXJfc2Vzc2lvbl93b3JkX2xpc3Qoc3BlbGxlcikpOwoJICAgIGJy ZWFrOwoJICB9CgkgIGJyZWFrOwoJY2FzZSAnbCc6CgkgIENPVVQucHJpbnRsKGNvbmZpZy0+cmV0 cmlldmUoImxhbmciKSk7CgkgIGJyZWFrOwoJfQoJYnJlYWs7CiAgICAgIH0gZWxzZSB7CgkvLyBj b250aW51ZSBvbiAobm8gYnJlYWspCiAgICAgIH0KICAgIGNhc2UgJ14nOgogICAgICBpZ25vcmUg PSAxOwogICAgZGVmYXVsdDoKICAgICAgbGluZTAgPSBsaW5lOwogICAgICBsaW5lICs9IGlnbm9y ZTsKICAgICAgY2hlY2tlci0+cHJvY2VzcyhsaW5lLCBzdHJsZW4obGluZSkpOwogICAgICB3aGls ZSAoVG9rZW4gdG9rZW4gPSBjaGVja2VyLT5uZXh0X21pc3NwZWxsaW5nKCkpIHsKCXdvcmQgPSBs aW5lICsgdG9rZW4ub2Zmc2V0OwoJd29yZFt0b2tlbi5sZW5dID0gJ1wwJzsKICAgICAgICBjb25z dCBjaGFyICogY3dvcmQgPSBpY29udih3b3JkKTsKICAgICAgICBTdHJpbmcgZ3Vlc3NlcywgZ3Vl c3M7CiAgICAgICAgY29uc3QgQ2hlY2tJbmZvICogY2kgPSByZWFsX3NwZWxsZXItPmNoZWNrX2lu Zm8oKTsKICAgICAgICBhc3BlbGxlcjo6Q2FzZVBhdHRlcm4gY2FzZXAgCiAgICAgICAgICA9IHJl YWxfc3BlbGxlci0+bGFuZygpLmNhc2VfcGF0dGVybihjd29yZCk7CiAgICAgICAgd2hpbGUgKGNp KSB7CiAgICAgICAgICBndWVzcy5jbGVhcigpOwogICAgICAgICAgaWYgKGNpLT5wcmVfYWRkICYm IGNpLT5wcmVfYWRkWzBdKQogICAgICAgICAgICBndWVzcy5hcHBlbmQoY2ktPnByZV9hZGQsIGNp LT5wcmVfYWRkX2xlbikuYXBwZW5kKCcrJyk7CiAgICAgICAgICBndWVzcy5hcHBlbmQoY2ktPndv cmQuc3RyLCBjaS0+d29yZC5sZW4pOwogICAgICAgICAgaWYgKGNpLT5wcmVfc3RyaXBfbGVuID4g MCkgCiAgICAgICAgICAgIGd1ZXNzLmFwcGVuZCgnLScpLmFwcGVuZChjaS0+d29yZC5zdHIsIGNp LT5wcmVfc3RyaXBfbGVuKTsKICAgICAgICAgIGlmIChjaS0+c3VmX3N0cmlwX2xlbiA+IDApIAog ICAgICAgICAgICBndWVzcy5hcHBlbmQoJy0nKS5hcHBlbmQoY2ktPndvcmQuc3RyICsgY2ktPndv cmQubGVuIC0gY2ktPnN1Zl9zdHJpcF9sZW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY2ktPnN1Zl9zdHJpcF9sZW4pOwogICAgICAgICAgaWYgKGNpLT5zdWZfYWRkICYm IGNpLT5zdWZfYWRkWzBdKQogICAgICAgICAgICBndWVzcy5hcHBlbmQoJysnKS5hcHBlbmQoY2kt PnN1Zl9hZGQsIGNpLT5zdWZfYWRkX2xlbik7CiAgICAgICAgICBndWVzcy5lbnN1cmVfbnVsbF9l bmQoKTsKICAgICAgICAgIHJlYWxfc3BlbGxlci0+bGFuZygpLmZpeF9jYXNlKGNhc2VwLCBndWVz cy5kYXRhKCksIGd1ZXNzLmRhdGEoKSk7CiAgICAgICAgICBndWVzc2VzIDw8ICIsICIgPDwgb2Nv bnYoZ3Vlc3Muc3RyKCkpOwogICAgICAgICAgY2kgPSBjaS0+bmV4dDsKICAgICAgICB9CglzdGFy dCA9IGNsb2NrKCk7CiAgICAgICAgY29uc3QgQXNwZWxsV29yZExpc3QgKiBzdWdnZXN0aW9ucyA9 IDA7CiAgICAgICAgaWYgKHN1Z2dlc3QpIAogICAgICAgICAgc3VnZ2VzdGlvbnMgPSBhc3BlbGxf c3BlbGxlcl9zdWdnZXN0KHNwZWxsZXIsIHdvcmQsIC0xKTsKCWZpbmlzaCA9IGNsb2NrKCk7CiAg ICAgICAgdW5zaWduZWQgb2Zmc2V0ID0gbWJfbGVuKGxpbmUwLCB0b2tlbi5vZmZzZXQgKyBpZ25v cmUpOwoJaWYgKHN1Z2dlc3Rpb25zICYmICFhc3BlbGxfd29yZF9saXN0X2VtcHR5KHN1Z2dlc3Rp b25zKSkgCiAgICAgICAgewogICAgICAgICAgQ09VVC5wcmludGYoIiYgJXMgJXUgJXU6Iiwgd29y ZCwgCiAgICAgICAgICAgICAgICAgICAgICBhc3BlbGxfd29yZF9saXN0X3NpemUoc3VnZ2VzdGlv bnMpLCBvZmZzZXQpOwoJICBBc3BlbGxTdHJpbmdFbnVtZXJhdGlvbiAqIGVscyAKCSAgICA9IGFz cGVsbF93b3JkX2xpc3RfZWxlbWVudHMoc3VnZ2VzdGlvbnMpOwoJICBpZiAob3B0aW9ucy0+cmV0 cmlldmVfYm9vbCgicmV2ZXJzZSIpKSB7CgkgICAgVmVjdG9yPFN0cmluZz4gc3VnczsKCSAgICBz dWdzLnJlc2VydmUoYXNwZWxsX3dvcmRfbGlzdF9zaXplKHN1Z2dlc3Rpb25zKSk7CgkgICAgd2hp bGUgKCAoIHcgPSBhc3BlbGxfc3RyaW5nX2VudW1lcmF0aW9uX25leHQoZWxzKSkgIT0gMCkKCSAg ICAgIHN1Z3MucHVzaF9iYWNrKHcpOwoJICAgIFZlY3RvcjxTdHJpbmc+OjpyZXZlcnNlX2l0ZXJh dG9yIGkgPSBzdWdzLnJiZWdpbigpOwoJICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAg Q09VVC5wcmludGYoIiAlcyIsIGktPmNfc3RyKCkpOwoJICAgICAgKytpOwoJICAgICAgaWYgKGkg PT0gc3Vncy5yZW5kKCkpIGJyZWFrOwogICAgICAgICAgICAgIENPVVQucHV0KCcsJyk7CgkgICAg fQoJICB9IGVsc2UgewoJICAgIHdoaWxlICggKCB3ID0gYXNwZWxsX3N0cmluZ19lbnVtZXJhdGlv bl9uZXh0KGVscykpICE9IDApIHsKICAgICAgICAgICAgICBDT1VULnByaW50ZigiICVzJXMiLCB3 LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlbGxfc3RyaW5nX2VudW1lcmF0aW9uX2F0 X2VuZChlbHMpID8gIiIgOiAiLCIpOwoJICAgIH0KCSAgfQoJICBkZWxldGVfYXNwZWxsX3N0cmlu Z19lbnVtZXJhdGlvbihlbHMpOwogICAgICAgICAgaWYgKGluY2x1ZGVfZ3Vlc3NlcykKICAgICAg ICAgICAgQ09VVC5wdXQoZ3Vlc3Nlcyk7CgkgIENPVVQucHV0KCdcbicpOwoJfSBlbHNlIHsKICAg ICAgICAgIGlmIChndWVzc2VzLmVtcHR5KCkpCiAgICAgICAgICAgIENPVVQucHJpbnRmKCIjICVz ICV1XG4iLCB3b3JkLCBvZmZzZXQpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBDT1VULnBy aW50ZigiPyAlcyAwICV1OiAlc1xuIiwgd29yZCwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAg ICAgICBndWVzc2VzLmNfc3RyKCkgKyAyKTsKCX0KCWlmIChkb190aW1lKQogICAgICAgICAgQ09V VC5wcmludGYoXygiU3VnZ2VzdGlvbiBUaW1lOiAlZlxuIiksIAogICAgICAgICAgICAgICAgICAg ICAgKGZpbmlzaC1zdGFydCkvKGRvdWJsZSlDTE9DS1NfUEVSX1NFQyk7CiAgICAgIH0KICAgICAg Q09VVC5wdXQoJ1xuJyk7CiAgICB9CiAgICBpZiAoYyA9PSBFT0YpIGJyZWFrOwogIH0KCiAgZGVs ZXRlX2FzcGVsbF9zcGVsbGVyKHNwZWxsZXIpOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8KLy8KLy8gY2hlY2sKLy8KCmVudW0gVXNlckNob2ljZSB7Tm9uZSwgSWdub3JlLCBJZ25vcmVB bGwsIFJlcGxhY2UsIFJlcGxhY2VBbGwsIAoJCSBBZGQsIEFkZExvd2VyLCBFeGl0LCBBYm9ydH07 CgpzdHJ1Y3QgTWFwcGluZyB7CiAgY2hhciBwcmltYXJ5WzldOwogIFVzZXJDaG9pY2UgcmV2ZXJz ZVsyNTZdOwogIHZvaWQgdG9fYXNwZWxsKCk7CiAgdm9pZCB0b19pc3BlbGwoKTsKICBjaGFyICYg b3BlcmF0b3JbXSAoVXNlckNob2ljZSBjKSB7cmV0dXJuIHByaW1hcnlbY107fQogIFVzZXJDaG9p Y2UgJiBvcGVyYXRvcltdIChjaGFyIGMpIAogICAge3JldHVybiByZXZlcnNlW3N0YXRpY19jYXN0 PHVuc2lnbmVkIGNoYXI+KGMpXTt9Cn07Cgp2b2lkIGFib3J0X2NoZWNrKCk7Cgp2b2lkIHNldHVw X2Rpc3BsYXlfY29udigpOwoKdm9pZCBjaGVjaygpCnsKICBTdHJpbmcgZmlsZV9uYW1lOwogIFN0 cmluZyBuZXdfbmFtZTsKICBGSUxFICogaW4gPSAwOwogIEZJTEUgKiBvdXQgPSAwOwogIE1hcHBp bmcgbWFwcGluZzsKICBib29sIGNoYW5nZWQgPSBmYWxzZTsKCiAgaWYgKGFyZ3Muc2l6ZSgpID09 IDApIHsKICAgIHByaW50X2Vycm9yKF8oIllvdSBtdXN0IHNwZWNpZnkgYSBmaWxlIG5hbWUuIikp OwogICAgZXhpdCgtMSk7CiAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+IDEpIHsKICAgIHByaW50 X2Vycm9yKF8oIk9ubHkgb25lIGZpbGUgbmFtZSBtYXkgYmUgc3BlY2lmaWVkLiIpKTsKICAgIGV4 aXQoLTEpOwogIH0KICAKICBmaWxlX25hbWUgPSBhcmdzWzBdOwogIG5ld19uYW1lID0gZmlsZV9u YW1lOwogIG5ld19uYW1lICs9ICIubmV3IjsKCiAgaW4gPSBmb3BlbihmaWxlX25hbWUuY19zdHIo KSwgInIiKTsKICBpZiAoIWluKSB7CiAgICBwcmludF9lcnJvcihfKCJDb3VsZCBub3Qgb3BlbiB0 aGUgZmlsZSBcIiVzXCIgZm9yIHJlYWRpbmciKSwgZmlsZV9uYW1lKTsKICAgIGV4aXQoLTEpOwog IH0KICAgIAogIGlmICghb3B0aW9ucy0+aGF2ZSgibW9kZSIpKQogICAgRVhJVF9PTl9FUlIoc2V0 X21vZGVfZnJvbV9leHRlbnNpb24ob3B0aW9ucywgZmlsZV9uYW1lKSk7CiAgICAKICBTdHJpbmcg bSA9IG9wdGlvbnMtPnJldHJpZXZlKCJrZXltYXBwaW5nIik7CiAgaWYgKG0gPT0gImFzcGVsbCIp CiAgICBtYXBwaW5nLnRvX2FzcGVsbCgpOwogIGVsc2UgaWYgKG0gPT0gImlzcGVsbCIpCiAgICBt YXBwaW5nLnRvX2lzcGVsbCgpOwogIGVsc2UgewogICAgcHJpbnRfZXJyb3IoXygiSW52YWxpZCBr ZXltYXBwaW5nOiAlcyIpLCBtKTsKICAgIGV4aXQoLTEpOwogIH0KCiAgQXNwZWxsQ2FuSGF2ZUVy cm9yICogcmV0IAogICAgPSBuZXdfYXNwZWxsX3NwZWxsZXIocmVpbnRlcnByZXRfY2FzdDxBc3Bl bGxDb25maWcgKj4ob3B0aW9ucy5nZXQoKSkpOwogIGlmIChhc3BlbGxfZXJyb3IocmV0KSkgewog ICAgcHJpbnRfZXJyb3IoYXNwZWxsX2Vycm9yX21lc3NhZ2UocmV0KSk7CiAgICBleGl0KDEpOwog IH0KCiAgewogICAgc3RydWN0IHN0YXQgc3Q7CiAgICBmc3RhdChmaWxlbm8oaW4pLCAmc3QpOwog ICAgaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpKSB7CiAgICAgIHByaW50X2Vycm9yKF8oIlwiJXNc IiBpcyBub3QgYSByZWd1bGFyIGZpbGUiKSwgZmlsZV9uYW1lKTsKICAgICAgZXhpdCgtMSk7CiAg ICB9CiNpZmRlZiBVU0VfRklMRV9JTk8KICAgIGludCBmZCA9IG9wZW4obmV3X25hbWUuY19zdHIo KSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgc3Quc3RfbW9kZSk7CiAgICBpZiAoZmQg Pj0gMCkgb3V0ID0gZmRvcGVuKGZkLCAidyIpOwojZWxzZQogICAgb3V0ID0gZm9wZW4obmV3X25h bWUuY19zdHIoKSwgInciKTsKI2VuZGlmCiAgfQogIGlmICghb3V0KSB7CiAgICBwcmludF9lcnJv cihfKCJDb3VsZCBub3Qgb3BlbiB0aGUgZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmcuIEZpbGUgbm90 IHNhdmVkLiIpLCBmaWxlX25hbWUpOwogICAgZXhpdCgtMSk7CiAgfQoKICBzZXR1cF9kaXNwbGF5 X2NvbnYoKTsKCiAgQXNwZWxsU3BlbGxlciAqIHNwZWxsZXIgPSB0b19hc3BlbGxfc3BlbGxlcihy ZXQpOwoKICBzdGF0ZSA9IG5ldyBDaGVja2VyU3RyaW5nKHNwZWxsZXIsaW4sb3V0LDY0KTsKIAog IHdvcmRfY2hvaWNlcyA9IG5ldyBDaG9pY2VzOwoKICBtZW51X2Nob2ljZXMgPSBuZXcgQ2hvaWNl czsKICBtZW51X2Nob2ljZXMtPnB1c2hfYmFjayhDaG9pY2UobWFwcGluZ1tJZ25vcmVdLCAgICAg XygiSWdub3JlIikpKTsKICBtZW51X2Nob2ljZXMtPnB1c2hfYmFjayhDaG9pY2UobWFwcGluZ1tJ Z25vcmVBbGxdLCAgXygiSWdub3JlIGFsbCIpKSk7CiAgbWVudV9jaG9pY2VzLT5wdXNoX2JhY2so Q2hvaWNlKG1hcHBpbmdbUmVwbGFjZV0sICAgIF8oIlJlcGxhY2UiKSkpOwogIG1lbnVfY2hvaWNl cy0+cHVzaF9iYWNrKENob2ljZShtYXBwaW5nW1JlcGxhY2VBbGxdLCBfKCJSZXBsYWNlIGFsbCIp KSk7CiAgbWVudV9jaG9pY2VzLT5wdXNoX2JhY2soQ2hvaWNlKG1hcHBpbmdbQWRkXSwgICAgICAg IF8oIkFkZCIpKSk7CiAgbWVudV9jaG9pY2VzLT5wdXNoX2JhY2soQ2hvaWNlKG1hcHBpbmdbQWRk TG93ZXJdLCAgIF8oIkFkZCBMb3dlciIpKSk7CiAgbWVudV9jaG9pY2VzLT5wdXNoX2JhY2soQ2hv aWNlKG1hcHBpbmdbQWJvcnRdLCAgICAgIF8oIkFib3J0IikpKTsKICBtZW51X2Nob2ljZXMtPnB1 c2hfYmFjayhDaG9pY2UobWFwcGluZ1tFeGl0XSwgICAgICAgXygiRXhpdCIpKSk7CgogIFN0cmlu ZyB3b3JkMCwgbmV3X3dvcmQ7CiAgVmVjdG9yPFN0cmluZz4gc3VnX2NvbjsKICBTdGFja1B0cjxT dHJpbmdNYXA+IHJlcGxhY2VfbGlzdChuZXdfc3RyaW5nX21hcCgpKTsKICBjb25zdCBjaGFyICog dzsKCiAgYmVnaW5fY2hlY2soKTsKCiAgd2hpbGUgKHN0YXRlLT5uZXh0X21pc3NwZWxsaW5nKCkp IHsKCiAgICBjaGFyICogd29yZCA9IHN0YXRlLT5nZXRfcmVhbF93b3JkKHdvcmQwKTsKCiAgICAv LwogICAgLy8gY2hlY2sgaWYgaXQgaXMgaW4gdGhlIHJlcGxhY2UgbGlzdAogICAgLy8KCiAgICBp ZiAoKHcgPSByZXBsYWNlX2xpc3QtPmxvb2t1cCh3b3JkKSkgIT0gMCkgewogICAgICBzdGF0ZS0+ cmVwbGFjZSh3KTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLy8KICAgIC8vIHByaW50IHRo ZSBsaW5lIHdpdGggdGhlIG1pc3NwZWxsZWQgd29yZCBoaWdobGlnaHRlZDsKICAgIC8vCgogICAg ZGlzcGxheV9taXNzcGVsbGVkX3dvcmQoKTsKCiAgICAvLwogICAgLy8gcHJpbnQgdGhlIHN1Z2dl c3Rpb25zIGFuZCBtZW51IGNob2ljZXMKICAgIC8vCgogICAgY29uc3QgQXNwZWxsV29yZExpc3Qg KiBzdWdnZXN0aW9ucyA9IGFzcGVsbF9zcGVsbGVyX3N1Z2dlc3Qoc3BlbGxlciwgd29yZCwgLTEp OwogICAgQXNwZWxsU3RyaW5nRW51bWVyYXRpb24gKiBlbHMgPSBhc3BlbGxfd29yZF9saXN0X2Vs ZW1lbnRzKHN1Z2dlc3Rpb25zKTsKICAgIHN1Z19jb24ucmVzaXplKDApOwogICAgd2hpbGUgKHN1 Z19jb24uc2l6ZSgpICE9IDEwIAogICAgICAgICAgICYmICh3ID0gYXNwZWxsX3N0cmluZ19lbnVt ZXJhdGlvbl9uZXh0KGVscykpICE9IDApCiAgICAgIHN1Z19jb24ucHVzaF9iYWNrKHcpOwogICAg ZGVsZXRlX2FzcGVsbF9zdHJpbmdfZW51bWVyYXRpb24oZWxzKTsKCiAgICAvLyBkaXNhYmxlIHN1 c3BlbmQKICAgIHVuc2lnbmVkIGludCBzdWdnZXN0aW9uc19zaXplID0gc3VnX2Nvbi5zaXplKCk7 CiAgICB1bnNpZ25lZCBpbnQgc3VnZ2VzdGlvbnNfbWlkID0gc3VnZ2VzdGlvbnNfc2l6ZSAvIDI7 CiAgICBpZiAoc3VnZ2VzdGlvbnNfc2l6ZSAlIDIpIHN1Z2dlc3Rpb25zX21pZCsrOyAvLyBpZiBv ZGQKICAgIHdvcmRfY2hvaWNlcy0+cmVzaXplKDApOwogICAgZm9yICh1bnNpZ25lZCBpbnQgaiA9 IDA7IGogIT0gc3VnZ2VzdGlvbnNfbWlkOyArK2opIHsKICAgICAgd29yZF9jaG9pY2VzLT5wdXNo X2JhY2soQ2hvaWNlKCcwJyArIGorMSwgc3VnX2NvbltqXSkpOwogICAgICBpZiAoaiArIHN1Z2dl c3Rpb25zX21pZCAhPSBzdWdnZXN0aW9uc19zaXplKSAKICAgICAgICB3b3JkX2Nob2ljZXMKICAg ICAgICAgIC0+cHVzaF9iYWNrKENob2ljZShqK3N1Z2dlc3Rpb25zX21pZCsxID09IDEwIAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgID8gJzAnIAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDogJzAnICsgaitzdWdnZXN0aW9uc19taWQrMSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzdWdfY29uW2orc3VnZ2VzdGlvbnNfbWlkXSkpOwogICAgfQogICAgLy9lbmFibGUgc3Vz cGVuZAogICAgZGlzcGxheV9tZW51KCk7CgogIGNob2ljZV9wcm9tcHQ6CgogICAgcHJvbXB0KCI/ ICIpOwoKICBjaG9pY2VfbG9vcDoKCiAgICAvLwogICAgLy8gSGFuZGxlIHRoZSB1c2VycyBjaG9p Y2UKICAgIC8vCgogICAgaW50IGNob2ljZTsKICAgIGdldF9jaG9pY2UoY2hvaWNlKTsKICAgICAg CiAgICBpZiAoY2hvaWNlID09ICcwJykgY2hvaWNlID0gJzknICsgMTsKICAgIAogICAgc3dpdGNo IChtYXBwaW5nW2Nob2ljZV0pIHsKICAgIGNhc2UgRXhpdDoKICAgICAgZ290byBleGl0X2xvb3A7 CiAgICBjYXNlIEFib3J0OiB7CiAgICAgIHByb21wdChfKCJBcmUgeW91IHN1cmUgeW91IHdhbnQg dG8gYWJvcnQgKHkvbik/ICIpKTsKICAgICAgZ2V0X2Nob2ljZShjaG9pY2UpOwogICAgICAvKiBU UkFOU0xBVE9SUzogVGhlIHVzZXIgbWF5IGlucHV0IGFueSBvZiB0aGVzZSBjaGFyYWN0ZXJzIHRv IHNheSAieWVzIi4KICAgICAgICAgTVVTVCBPTkxZIENPTlNJU1QgT0YgQVNDSUkgQ0hBUkFDVEVS Uy4gKi8KICAgICAgY29uc3QgY2hhciAqIHllc19jaGFyYWN0ZXJzID0gXygiWXkiKTsKICAgICAg aWYgKHN0cmNocih5ZXNfY2hhcmFjdGVycywgY2hvaWNlKSAhPSAwKQogICAgICAgIGdvdG8gYWJv cnRfbG9vcDsKICAgICAgZ290byBjaG9pY2VfcHJvbXB0OwogICAgfQogICAgY2FzZSBJZ25vcmU6 CiAgICAgIGJyZWFrOwogICAgY2FzZSBJZ25vcmVBbGw6CiAgICAgIGFzcGVsbF9zcGVsbGVyX2Fk ZF90b19zZXNzaW9uKHNwZWxsZXIsIHdvcmQsIC0xKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIEFk ZDoKICAgICAgYXNwZWxsX3NwZWxsZXJfYWRkX3RvX3BlcnNvbmFsKHNwZWxsZXIsIHdvcmQsIC0x KTsKICAgICAgYnJlYWs7CiAgICBjYXNlIEFkZExvd2VyOiAKICAgIHsKICAgICAgLy8gRW11bGF0 ZSB0aGUgYyBmdW5jdGlvbiBhZGRfdG9fcGVyc29uYWwsIGJ1dCBhZGQgZXh0cmEgc3RlcCB0bwog ICAgICAvLyBjb252ZXJ0IHdvcmQgdG8gbG93ZXJjYXNlLiAgWWVhaCBpdHMgYSBiaXQgb2YgYSBo YWNrLgogICAgICBTcGVsbGVyICogc3AgPSByZWludGVycHJldF9jYXN0PFNwZWxsZXIgKj4oc3Bl bGxlcik7CiAgICAgIHNwLT50ZW1wX3N0cl8wLmNsZWFyKCk7CiAgICAgIHNwLT50b19pbnRlcm5h bF8tPmNvbnZlcnQod29yZCwgLTEsIHNwLT50ZW1wX3N0cl8wKTsKICAgICAgY2hhciAqIGxvd2Vy ID0gc3AtPnRvX2xvd2VyKHNwLT50ZW1wX3N0cl8wLm1zdHIoKSk7CiAgICAgIFBvc2liRXJyPHZv aWQ+IHJldCA9IHNwLT5hZGRfdG9fcGVyc29uYWwoTXV0YWJsZVN0cmluZyhsb3dlcikpOwogICAg ICBzcC0+ZXJyXy5yZXNldChyZXQucmVsZWFzZV9lcnIoKSk7CiAgICAgIGJyZWFrOwogICAgfQog ICAgY2FzZSBSZXBsYWNlOgogICAgY2FzZSBSZXBsYWNlQWxsOgogICAgICAvLyB0aGUgc3RyaW5n IG5ld193b3JkIGlzIGluIHRoZSBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQKICAgICAgcHJvbXB0 KF8oIldpdGg6ICIpKTsKICAgICAgZ2V0X2xpbmUobmV3X3dvcmQpOwogICAgICBpZiAobmV3X3dv cmQuc2l6ZSgpID09IDApCiAgICAgICAgZ290byBjaG9pY2VfcHJvbXB0OwogICAgICBpZiAobmV3 X3dvcmRbMF0gPj0gJzEnICYmIG5ld193b3JkWzBdIDwgKGNoYXIpc3VnZ2VzdGlvbnNfc2l6ZSAr ICcxJykKICAgICAgICBuZXdfd29yZCA9IHN1Z19jb25bbmV3X3dvcmRbMF0tJzEnXTsKICAgICAg c3RhdGUtPnJlcGxhY2UobmV3X3dvcmQpOwogICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgICAgaWYg KG1hcHBpbmdbY2hvaWNlXSA9PSBSZXBsYWNlQWxsICYmIChzdHJjbXAod29yZCxuZXdfd29yZC5z dHIoKSkgIT0gMCkpCiAgICAgICAgcmVwbGFjZV9saXN0LT5yZXBsYWNlKHdvcmQsIG5ld193b3Jk KTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAvLyB0aGUgcmVwbGFzbWVudHMgYXJl IGluIHRoZSBlbmNvZGluZyBvZiB0aGUgZG9jdW1lbnQKICAgICAgaWYgKGNob2ljZSA+PSAnMScg JiYgY2hvaWNlIDwgKGNoYXIpc3VnZ2VzdGlvbnNfc2l6ZSArICcxJykgeyAKICAgICAgICBzdGF0 ZS0+cmVwbGFjZShzdWdfY29uW2Nob2ljZS0nMSddKTsKICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsK ICAgICAgfSBlbHNlIHsKICAgICAgICBlcnJvcihfKCJTb3JyeSB0aGF0IGlzIGFuIGludmFsaWQg Y2hvaWNlISIpKTsKICAgICAgICBnb3RvIGNob2ljZV9sb29wOwogICAgICB9CiAgICB9CiAgfQpl eGl0X2xvb3A6CiAgewogICAgYXNwZWxsX3NwZWxsZXJfc2F2ZV9hbGxfd29yZF9saXN0cyhzcGVs bGVyKTsKICAgIHN0YXRlLmRlbCgpOyAvLyB0byBjbG9zZSB0aGUgZmlsZSBoYW5kbGVzCiAgICBk ZWxldGVfYXNwZWxsX3NwZWxsZXIoc3BlbGxlcik7CgogICAgaWYgKGNoYW5nZWQpIHsKCiAgICAg IGJvb2wga2VlcF9iYWNrdXAgPSBvcHRpb25zLT5yZXRyaWV2ZV9ib29sKCJiYWNrdXAiKTsKICAg ICAgaWYgKGtlZXBfYmFja3VwKSB7CiAgICAgICAgU3RyaW5nIGJhY2t1cF9uYW1lID0gZmlsZV9u YW1lOwogICAgICAgIGJhY2t1cF9uYW1lICs9ICIuYmFrIjsKICAgICAgICByZW5hbWVfZmlsZShm aWxlX25hbWUsIGJhY2t1cF9uYW1lKTsKICAgICAgfQogICAgICByZW5hbWVfZmlsZShuZXdfbmFt ZSwgZmlsZV9uYW1lKTsKCiAgICB9IGVsc2UgewoKICAgICAgcmVtb3ZlX2ZpbGUobmV3X25hbWUp OwoKICAgIH0KICAgIAogICAgLy9lbmRfY2hlY2soKTsKICAgIAogICAgcmV0dXJuOwogIH0KYWJv cnRfbG9vcDoKICB7CiAgICBzdGF0ZS0+YWJvcnQoKTsgLy8gdG8gY2xvc2UgdGhlIGZpbGUgaGFu ZGxlcwogICAgZGVsZXRlX2FzcGVsbF9zcGVsbGVyKHNwZWxsZXIpOwoKICAgIHJlbW92ZV9maWxl KG5ld19uYW1lKTsKCiAgICByZXR1cm47CiAgfQp9CgojZGVmaW5lIFUgKHVuc2lnbmVkIGNoYXIp Cgp2b2lkIE1hcHBpbmc6OnRvX2FzcGVsbCgpIAp7CiAgbWVtc2V0KHRoaXMsIDAsIHNpemVvZihN YXBwaW5nKSk7CiAgcHJpbWFyeVtJZ25vcmUgICAgXSA9ICdpJzsKICByZXZlcnNlW1UnaSddID0g SWdub3JlOwogIHJldmVyc2VbVScgJ10gPSBJZ25vcmU7CiAgcmV2ZXJzZVtVJ1xuJ10gPSBJZ25v cmU7CgogIHByaW1hcnlbSWdub3JlQWxsIF0gPSAnSSc7CiAgcmV2ZXJzZVtVJ0knXSA9IElnbm9y ZUFsbDsKCiAgcHJpbWFyeVtSZXBsYWNlICAgXSA9ICdyJzsKICByZXZlcnNlW1UnciddID0gUmVw bGFjZTsKCiAgcHJpbWFyeVtSZXBsYWNlQWxsXSA9ICdSJzsKICByZXZlcnNlW1UnUiddID0gUmVw bGFjZUFsbDsKCiAgcHJpbWFyeVtBZGQgICAgICAgXSA9ICdhJzsKICByZXZlcnNlW1UnQSddID0g QWRkOwogIHJldmVyc2VbVSdhJ10gPSBBZGQ7CgogIHByaW1hcnlbQWRkTG93ZXIgIF0gPSAnbCc7 CiAgcmV2ZXJzZVtVJ0wnXSA9IEFkZExvd2VyOwogIHJldmVyc2VbVSdsJ10gPSBBZGRMb3dlcjsK CiAgcHJpbWFyeVtBYm9ydCAgICAgXSA9ICdiJzsKICByZXZlcnNlW1UnYiddID0gQWJvcnQ7CiAg cmV2ZXJzZVtVJ0InXSA9IEFib3J0OwogIHJldmVyc2VbY29udHJvbCgnYycpXSA9IEFib3J0OwoK ICBwcmltYXJ5W0V4aXQgICAgICBdID0gJ3gnOwogIHJldmVyc2VbVSd4J10gPSBFeGl0OwogIHJl dmVyc2VbVSdYJ10gPSBFeGl0Owp9Cgp2b2lkIE1hcHBpbmc6OnRvX2lzcGVsbCgpIAp7CiAgbWVt c2V0KHRoaXMsIDAsIHNpemVvZihNYXBwaW5nKSk7CiAgcHJpbWFyeVtJZ25vcmUgICAgXSA9ICcg JzsKICByZXZlcnNlW1UnICddID0gSWdub3JlOwogIHJldmVyc2VbVSdcbiddID0gSWdub3JlOwoK ICBwcmltYXJ5W0lnbm9yZUFsbCBdID0gJ0EnOwogIHJldmVyc2VbVSdBJ10gPSBJZ25vcmVBbGw7 CiAgcmV2ZXJzZVtVJ2EnXSA9IElnbm9yZUFsbDsKCiAgcHJpbWFyeVtSZXBsYWNlICAgXSA9ICdS JzsKICByZXZlcnNlW1UnUiddID0gUmVwbGFjZUFsbDsKICByZXZlcnNlW1UnciddID0gUmVwbGFj ZTsKCiAgcHJpbWFyeVtSZXBsYWNlQWxsXSA9ICdFJzsKICByZXZlcnNlW1UnRSddID0gUmVwbGFj ZUFsbDsKICByZXZlcnNlW1UnZSddID0gUmVwbGFjZTsKCiAgcHJpbWFyeVtBZGQgICAgICAgXSA9 ICdJJzsKICByZXZlcnNlW1UnSSddID0gQWRkOwogIHJldmVyc2VbVSdpJ10gPSBBZGQ7CgogIHBy aW1hcnlbQWRkTG93ZXIgIF0gPSAnVSc7CiAgcmV2ZXJzZVtVJ1UnXSA9IEFkZExvd2VyOwogIHJl dmVyc2VbVSd1J10gPSBBZGRMb3dlcjsKCiAgcHJpbWFyeVtBYm9ydCAgICAgXSA9ICdRJzsKICBy ZXZlcnNlW1UnUSddID0gQWJvcnQ7CiAgcmV2ZXJzZVtVJ3EnXSA9IEFib3J0OwogIHJldmVyc2Vb Y29udHJvbCgnYycpXSA9IEFib3J0OwoKICBwcmltYXJ5W0V4aXQgICAgICBdID0gJ1gnOwogIHJl dmVyc2VbVSdYJ10gPSBFeGl0OwogIHJldmVyc2VbVSd4J10gPSBFeGl0Owp9CiN1bmRlZiBVCgov Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gbGlzdAovLwoKdm9pZCBsaXN0KCkKewog IEFzcGVsbENhbkhhdmVFcnJvciAqIHJldCAKICAgID0gbmV3X2FzcGVsbF9zcGVsbGVyKHJlaW50 ZXJwcmV0X2Nhc3Q8QXNwZWxsQ29uZmlnICo+KG9wdGlvbnMuZ2V0KCkpKTsKICBpZiAoYXNwZWxs X2Vycm9yKHJldCkpIHsKICAgIHByaW50X2Vycm9yKGFzcGVsbF9lcnJvcl9tZXNzYWdlKHJldCkp OwogICAgZXhpdCgxKTsKICB9CiAgQXNwZWxsU3BlbGxlciAqIHNwZWxsZXIgPSB0b19hc3BlbGxf c3BlbGxlcihyZXQpOwoKICBzdGF0ZSA9IG5ldyBDaGVja2VyU3RyaW5nKHNwZWxsZXIsc3RkaW4s MCw2NCk7CgogIFN0cmluZyB3b3JkOwogCiAgd2hpbGUgKHN0YXRlLT5uZXh0X21pc3NwZWxsaW5n KCkpIHsKCiAgICBzdGF0ZS0+Z2V0X3JlYWxfd29yZCh3b3JkKTsKICAgIENPVVQucHJpbnRsKHdv cmQpOwoKICB9CiAgCiAgc3RhdGUuZGVsKCk7IC8vIHRvIGNsb3NlIHRoZSBmaWxlIGhhbmRsZXMK ICBkZWxldGVfYXNwZWxsX3NwZWxsZXIoc3BlbGxlcik7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLwovLwovLyBjb252dAovLwoKdm9pZCBjb252dCgpCnsKICBDb252IGNvbnY7CiAgU3Ry aW5nIGJ1ZjEsIGJ1ZjI7CiAgY29uc3QgY2hhciAqIGZyb20gPSBmaXhfZW5jb2Rpbmdfc3RyKGFy Z3NbMF0sIGJ1ZjEpOwogIGNvbnN0IGNoYXIgKiB0byAgID0gZml4X2VuY29kaW5nX3N0cihhcmdz WzFdLCBidWYyKTsKICBOb3JtYWxpemUgbm9ybSA9IE5vcm1Ob25lOwogIGlmIChzdHJjbXAoZnJv bSwgInV0Zi04IikgPT0gMCAmJiBzdHJjbXAodG8sICJ1dGYtOCIpICE9IDApCiAgICBub3JtID0g Tm9ybUZyb207CiAgZWxzZSBpZiAoc3RyY21wKGZyb20sICJ1dGYtOCIpICE9IDAgJiYgc3RyY21w KHRvLCAidXRmLTgiKSA9PSAwKQogICAgbm9ybSA9IE5vcm1UbzsKICBpZiAoYXJncy5zaXplKCkg PiAyKSB7CiAgICBmb3IgKFN0cmluZzo6aXRlcmF0b3IgaSA9IGFyZ3NbMl0uYmVnaW4oKTsgaSAh PSBhcmdzWzJdLmVuZCgpOyArK2kpCiAgICAgICppID0gYXNjX3RvbG93ZXIoKmkpOwogICAgb3B0 aW9ucy0+cmVwbGFjZSgibm9ybWFsaXplIiwgInRydWUiKTsKICAgIGlmIChhcmdzWzJdID09ICJu b25lIikKICAgICAgb3B0aW9ucy0+cmVwbGFjZSgibm9ybWFsaXplIiwgImZhbHNlIik7CiAgICBl bHNlIGlmIChhcmdzWzJdID09ICJpbnRlcm5hbCIpCiAgICAgIG9wdGlvbnMtPnJlcGxhY2UoIm5v cm0tc3RyaWN0IiwgImZhbHNlIik7CiAgICBlbHNlIGlmIChhcmdzWzJdID09ICJzdHJpY3QiKQog ICAgICBvcHRpb25zLT5yZXBsYWNlKCJub3JtLXN0cmljdCIsICJ0cnVlIik7CiAgICBlbHNlCiAg ICAgIEVYSVRfT05fRVJSKG9wdGlvbnMtPnJlcGxhY2UoIm5vcm0tZm9ybSIsIGFyZ3NbMl0pKTsK ICB9CiAgRVhJVF9PTl9FUlIoY29udi5zZXR1cCgqb3B0aW9ucywgYXJnc1swXSwgYXJnc1sxXSwg bm9ybSkpOwogIFN0cmluZyBsaW5lOwogIHdoaWxlIChDSU4uZ2V0bGluZShsaW5lKSkKICAgIENP VVQucHJpbnRsKGNvbnYobGluZSkpOwp9Cgp2b2lkIG5vcm1seigpCnsKICBvcHRpb25zLT5yZXBs YWNlKCJub3JtYWxpemUiLCAidHJ1ZSIpOwogIGNvbnN0IGNoYXIgKiBmcm9tID0gYXJncy5zaXpl KCkgPCAzID8gInV0Zi04IiA6IGFyZ3NbMF0uc3RyKCk7CiAgY29uc3QgY2hhciAqIHRvICAgPSBh cmdzLnNpemUoKSA8IDMgPyAidXRmLTgiIDogYXJnc1syXS5zdHIoKTsKICBjb25zdCBjaGFyICog aW50ciA9IGFyZ3Muc2l6ZSgpIDwgMyA/IGFyZ3NbMF0uc3RyKCkgOiBhcmdzWzFdLnN0cigpOwog IFN0cmluZyAqIGZvcm0gPSAoYXJncy5zaXplKCkgPT0gMiAgID8gJmFyZ3NbMV0gCiAgICAgICAg ICAgICAgICAgICA6IGFyZ3Muc2l6ZSgpID09IDQgPyAmYXJnc1szXQogICAgICAgICAgICAgICAg ICAgOiAwKTsKICBOb3JtYWxpemUgZGVjb2RlX25vcm0gPSBOb3JtVG87CiAgaWYgKGZvcm0pIHsK ICAgIGZvciAoU3RyaW5nOjppdGVyYXRvciBpID0gZm9ybS0+YmVnaW4oKTsgaSAhPSBmb3JtLT5l bmQoKTsgKytpKQogICAgICAqaSA9IGFzY190b2xvd2VyKCppKTsKICAgIGlmICgqZm9ybSA9PSAi aW50ZXJuYWwiKSB7CiAgICAgIG9wdGlvbnMtPnJlcGxhY2UoIm5vcm0tc3RyaWN0IiwgImZhbHNl Iik7CiAgICAgIGRlY29kZV9ub3JtID0gTm9ybU5vbmU7CiAgICB9IGVsc2UgaWYgKCpmb3JtID09 ICJzdHJpY3QiKSB7CiAgICAgIG9wdGlvbnMtPnJlcGxhY2UoIm5vcm0tc3RyaWN0IiwgInRydWUi KTsKICAgICAgZGVjb2RlX25vcm0gPSBOb3JtTm9uZTsKICAgIH0KICAgIGlmIChkZWNvZGVfbm9y bSA9PSBOb3JtVG8pIEVYSVRfT05fRVJSKG9wdGlvbnMtPnJlcGxhY2UoIm5vcm0tZm9ybSIsICpm b3JtKSk7CiAgfQogIENvbnYgZW5jb2RlLGRlY29kZTsKICBFWElUX09OX0VSUihlbmNvZGUuc2V0 dXAoKm9wdGlvbnMsIGZyb20sIGludHIsIE5vcm1Gcm9tKSk7CiAgRVhJVF9PTl9FUlIoZGVjb2Rl LnNldHVwKCpvcHRpb25zLCBpbnRyLCB0bywgZGVjb2RlX25vcm0pKTsKICBTdHJpbmcgbGluZTsK ICB3aGlsZSAoQ0lOLmdldGxpbmUobGluZSkpCiAgICBDT1VULnByaW50bChkZWNvZGUoZW5jb2Rl KGxpbmUpKSk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBmaWx0ZXIKLy8K CnZvaWQgZmlsdGVyKCkKewogIGxpbmVfYnVmZmVyKCk7CgogIFN0cmluZyBlbmMgPSBvcHRpb25z LT5yZXRyaWV2ZSgiZW5jb2RpbmciKTsKICBpZiAoZW5jID09ICJub25lIikKICAgIGVuYz0idXRm LTgiOwogIFN0cmluZyBlbmNvZGluZzsKICBmaXhfZW5jb2Rpbmdfc3RyKGVuYywgZW5jb2Rpbmcp OwoKICBFWElUX09OX0VSUl9TRVQoRGVjb2RlOjpnZXRfbmV3KGVuY29kaW5nLCBvcHRpb25zLmdl dCgpKSwKICAgICAgICAgICAgICAgICAgU3RhY2tQdHI8RGVjb2RlPiwgaWNvbnYpOwogIEVYSVRf T05fRVJSX1NFVChFbmNvZGU6OmdldF9uZXcoZW5jb2RpbmcsIG9wdGlvbnMuZ2V0KCkpLAogICAg ICAgICAgICAgICAgICBTdGFja1B0cjxFbmNvZGU+LCBvY29udik7CgogIFN0YWNrUHRyPEZpbHRl cj4gZmlsdGVyKG5ldyBGaWx0ZXIpOwogIEVYSVRfT05fRVJSKHNldHVwX2ZpbHRlcigqZmlsdGVy LCBvcHRpb25zLmdldCgpLCB0cnVlLCB0cnVlLCBmYWxzZSkpOwoKICBDaGFyVmVjdG9yIGJ1ZjsK ICBGaWx0ZXJDaGFyVmVjdG9yIHByb2Nfc3RyOwoKICBpbnQgYzsKICBmb3IgKDs7KSB7CiAgICBi dWYuY2xlYXIoKTsKICAgIHdoaWxlIChjID0gZ2V0Y2hhcigpLCBjICE9ICdcbicgJiYgYyAhPSBF T0YpCiAgICAgIGJ1Zi5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8Y2hhcj4oYykpOwogICAgaWYgKGMg PT0gRU9GKSBicmVhazsKICAgIGJ1Zi5wdXNoX2JhY2soJ1xuJyk7CiAgICBidWYucHVzaF9iYWNr KCdcMCcpOwogICAgcHJvY19zdHIuY2xlYXIoKTsKICAgIGljb252LT5kZWNvZGUoYnVmLmRhdGEo KSwgYnVmLnNpemUoKS0xLCBwcm9jX3N0cik7CiAgICBwcm9jX3N0ci5hcHBlbmQoMCk7CiAgICBG aWx0ZXJDaGFyICogYmVnaW4gPSBwcm9jX3N0ci5wYmVnaW4oKTsKICAgIEZpbHRlckNoYXIgKiBl bmQgICA9IHByb2Nfc3RyLnBlbmQoKSAtIDE7CiAgICBmaWx0ZXItPnByb2Nlc3MoYmVnaW4sIGVu ZCk7CiAgICBidWYuY2xlYXIoKTsKICAgIG9jb252LT5lbmNvZGUoYmVnaW4sZW5kLGJ1Zik7CiAg ICBpZiAoYnVmLmVtcHR5KCkgfHwgYnVmLmJhY2soKSAhPSAnXG4nKQogICAgICBidWYucHVzaF9i YWNrKCdcbicpOwogICAgQ09VVC53cml0ZShidWYpOwogIH0KfQoKLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vCi8vCi8vIHByaW50X3ZlcgovLwoKdm9pZCBwcmludF92ZXIgKGJvb2wgZXh0ZW5z aXZlX3ZlcnNpb25faW5mbykgewogICAgcHJpbnRmKCJAKCMpIEludGVybmF0aW9uYWwgSXNwZWxs IFZlcnNpb24gMy4xLjIwICIgCiAgICAgICAgICAgIihidXQgcmVhbGx5IEFzcGVsbCAlcylcbiIs IGFzcGVsbF92ZXJzaW9uX3N0cmluZygpKTsKICAgIGlmIChleHRlbnNpdmVfdmVyc2lvbl9pbmZv KSB7CiAgICAgICAgbG9hZF9hbGxfZmlsdGVycyhvcHRpb25zKTsKICAgICAgICBDT1VUIDw8ICJM SUJESVIgPSBcIiIgPDwgb3B0aW9ucy0+cmV0cmlldmUoImRhdGEtZGlyIikgPDwgIlwiXG4iOwog ICAgfQp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBUaGVzZSBmdW5jdGlvbnMgdXNlIGltcGxlbWVu dGF0aW9uIGRldGFpbHMgb2YgdGhlIGRlZmF1bHQgc3BlbGxlcgovLyBtb2R1bGUKLy8KCi8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBjbGVhbgovLwoKdm9pZCBjbGVhbigpCnsKICB1 c2luZyBuYW1lc3BhY2UgYXNwZWxsZXI7CgogIGJvb2wgc3RyaWN0ID0gYXJncy5zaXplKCkgIT0g MCAmJiBhcmdzWzBdID09ICJzdHJpY3QiOwogIAogIENvbmZpZyAqIGNvbmZpZyA9IG9wdGlvbnM7 CgogIENhY2hlUHRyPExhbmd1YWdlPiBsYW5nOwogIGZpbmRfbGFuZ3VhZ2UoKmNvbmZpZyk7CiAg UG9zaWJFcnI8TGFuZ3VhZ2UgKj4gcmVzID0gbmV3X2xhbmd1YWdlKCpjb25maWcpOwogIGlmIChy ZXMuaGFzX2VycigpKSB7cHJpbnRfZXJyb3IocmVzLmdldF9lcnIoKS0+bWVzZyk7IGV4aXQoMSk7 fQogIGxhbmcucmVzZXQocmVzLmRhdGEpOwogIElzdHJlYW1FbnVtZXJhdGlvbiBpbihDSU4pOwog IFdvcmRMaXN0SXRlcmF0b3Igd2xfaXRyKCZpbiwgbGFuZywgJkNFUlIpOwogIGNvbmZpZy0+cmVw bGFjZSgidmFsaWRhdGUtd29yZHMiLCAidHJ1ZSIpOwogIGNvbmZpZy0+cmVwbGFjZSgidmFsaWRh dGUtYWZmaXhlcyIsICJ0cnVlIik7CiAgaWYgKCFzdHJpY3QpCiAgICBjb25maWctPnJlcGxhY2Uo ImNsZWFuLXdvcmRzIiwgInRydWUiKTsKICBjb25maWctPnJlcGxhY2UoImNsZWFuLWFmZml4ZXMi LCAidHJ1ZSIpOwogIGNvbmZpZy0+cmVwbGFjZSgic2tpcC1pbnZhbGlkLXdvcmRzIiwgInRydWUi KTsKICB3bF9pdHIuaW5pdCgqY29uZmlnKTsKICBDb252IG9jb252LCBvY29udjI7CiAgaWYgKGNv bmZpZy0+aGF2ZSgiZW5jb2RpbmciKSkgewogICAgRVhJVF9PTl9FUlIob2NvbnYuc2V0dXAoKmNv bmZpZywgbGFuZy0+Y2hhcm1hcCgpLCBjb25maWctPnJldHJpZXZlKCJlbmNvZGluZyIpLCBOb3Jt VG8pKTsKICAgIEVYSVRfT05fRVJSKG9jb252Mi5zZXR1cCgqY29uZmlnLCBsYW5nLT5jaGFybWFw KCksIGNvbmZpZy0+cmV0cmlldmUoImVuY29kaW5nIiksIE5vcm1UbykpOwogIH0gZWxzZSB7CiAg ICBFWElUX09OX0VSUihvY29udi5zZXR1cCgqY29uZmlnLCBsYW5nLT5jaGFybWFwKCksIGxhbmct PmRhdGFfZW5jb2RpbmcoKSwgTm9ybVRvKSk7CiAgICBFWElUX09OX0VSUihvY29udjIuc2V0dXAo KmNvbmZpZywgbGFuZy0+Y2hhcm1hcCgpLCBsYW5nLT5kYXRhX2VuY29kaW5nKCksIE5vcm1Ubykp OwogIH0KICB3aGlsZSAod2xfaXRyLmFkdigpKSB7CiAgICBpZiAoKndsX2l0ci0+YWZmLnN0cikg CiAgICAgIENPVVQucHJpbnRmKCIlcy8lc1xuIiwgb2NvbnYod2xfaXRyLT53b3JkKSwgb2NvbnYy KHdsX2l0ci0+YWZmKSk7CiAgICBlbHNlCiAgICAgIENPVVQucHJpbnRsKG9jb252KHdsX2l0ci0+ d29yZCkpOwogIH0KfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vIG1hc3Rlcgov LwoKdm9pZCBkdW1wIChhc3BlbGxlcjo6RGljdCAqIGx3cywgQ29udmVydCAqIGNvbnYpIAp7CiAg dXNpbmcgbmFtZXNwYWNlIGFzcGVsbGVyOwoKICBzd2l0Y2ggKGx3cy0+YmFzaWNfdHlwZSkgewog IGNhc2UgRGljdDo6YmFzaWNfZGljdDoKICAgIHsKICAgICAgRGljdGlvbmFyeSAqIHdzID0gc3Rh dGljX2Nhc3Q8RGljdGlvbmFyeSAqPihsd3MpOwogICAgICBTdGFja1B0cjxXb3JkRW50cnlFbnVt ZXJhdGlvbj4gZWxzKHdzLT5kZXRhaWxlZF9lbGVtZW50cygpKTsKICAgICAgV29yZEVudHJ5ICog d2k7CiAgICAgIHdoaWxlICh3aSA9IGVscy0+bmV4dCgpLCB3aSkgewogICAgICAgIHdpLT53cml0 ZShDT1VULCp3cy0+bGFuZygpLCBjb252KTsKICAgICAgICBDT1VUIDw8ICdcbic7CiAgICAgIH0K ICAgIH0KICAgIGJyZWFrOwogIGNhc2UgRGljdDo6bXVsdGlfZGljdDoKICAgIHsKICAgICAgU3Rh Y2tQdHI8RGljdHNFbnVtZXJhdGlvbj4gZWxzKGx3cy0+ZGljdGlvbmFyaWVzKCkpOwogICAgICBE aWN0ICogd3M7CiAgICAgIHdoaWxlICh3cyA9IGVscy0+bmV4dCgpLCB3cykgCglkdW1wICh3cywg Y29udik7CiAgICB9CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgYWJvcnQoKTsKICB9Cn0KCnZv aWQgbWFzdGVyICgpIHsKICB1c2luZyBuYW1lc3BhY2UgYXNwZWxsZXI7CgogIGlmIChhcmdzLnNp emUoKSAhPSAwKSB7CiAgICBvcHRpb25zLT5yZXBsYWNlKCJtYXN0ZXIiLCBhcmdzWzBdLmNfc3Ry KCkpOwogIH0KCiAgQ29uZmlnICogY29uZmlnID0gb3B0aW9uczsKCiAgaWYgKGFjdGlvbiA9PSBk b19jcmVhdGUpIHsKICAgIAogICAgZmluZF9sYW5ndWFnZSgqY29uZmlnKTsKICAgIEVYSVRfT05f RVJSKGNyZWF0ZV9kZWZhdWx0X3JlYWRvbmx5X2RpY3QKICAgICAgICAgICAgICAgIChuZXcgSXN0 cmVhbUVudW1lcmF0aW9uKENJTiksCiAgICAgICAgICAgICAgICAgKmNvbmZpZykpOwoKICB9IGVs c2UgaWYgKGFjdGlvbiA9PSBkb19tZXJnZSkgewogICAgCiAgICBwcmludF9lcnJvcihfKCJDYW4n dCBtZXJnZSBhIG1hc3RlciB3b3JkIGxpc3QgeWV0LiBTb3JyeS4iKSk7CiAgICBleGl0ICgxKTsK ICAgIAogIH0gZWxzZSBpZiAoYWN0aW9uID09IGRvX2R1bXApIHsKCiAgICBFWElUX09OX0VSUl9T RVQoYWRkX2RhdGFfc2V0KGNvbmZpZy0+cmV0cmlldmUoIm1hc3Rlci1wYXRoIiksICpjb25maWcp LCBEaWN0ICosIGQpOwogICAgU3RhY2tQdHI8Q29udmVydD4gY29udihzZXR1cF9jb252KGQtPmxh bmcoKSwgY29uZmlnKSk7CiAgICBkdW1wKGQsIGNvbnYpOwogIH0KfQoKLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vCi8vCi8vIHBlcnNvbmFsCi8vCgp2b2lkIHBlcnNvbmFsICgpIHsKICB1c2lu ZyBuYW1lc3BhY2UgYXNwZWxsZXI7CgogIGlmIChhcmdzLnNpemUoKSAhPSAwKSB7CiAgICBFWElU X09OX0VSUihvcHRpb25zLT5yZXBsYWNlKCJwZXJzb25hbCIsIGFyZ3NbMF0pKTsKICB9CiAgb3B0 aW9ucy0+cmVwbGFjZSgibW9kdWxlIiwgImFzcGVsbGVyIik7CiAgaWYgKGFjdGlvbiA9PSBkb19j cmVhdGUgfHwgYWN0aW9uID09IGRvX21lcmdlKSB7CiAgICBDRVJSIDw8IF8oIlNvcnJ5IFwiY3Jl YXRlL21lcmdlIHBlcnNvbmFsXCIgaXMgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQuXG4iKTsKICAg IGV4aXQoMyk7CgogICAgLy8gRklYTUUKI2lmIDAKICAgIFN0YWNrUHRyPFNwZWxsZXI+IHNwZWxs ZXIobmV3X3NwZWxsZXIob3B0aW9ucykpOwoKICAgIGlmIChhY3Rpb24gPT0gZG9fY3JlYXRlKSB7 CiAgICAgIGlmIChmaWxlX2V4aXN0cyhzcGVsbGVyLT5jb25maWcoKS0+cmV0cmlldmUoInBlcnNv bmFsLXBhdGgiKSkpIHsKICAgICAgICBwcmludF9lcnJvcihfKCJTb3JyeSBJIHdvbid0IG92ZXJ3 cml0ZSBcIiVzXCIiKSwgCgkJICAgIHNwZWxsZXItPmNvbmZpZygpLT5yZXRyaWV2ZSgicGVyc29u YWwtcGF0aCIpKTsKICAgICAgICBleGl0ICgxKTsKICAgICAgfQogICAgICBzcGVsbGVyLT5wZXJz b25hbF93b3JkX2xpc3QoKS5kYXRhLT5jbGVhcigpOwogICAgfQoKICAgIFN0cmluZyB3b3JkOwog ICAgd2hpbGUgKENJTiA+PiB3b3JkKSAKICAgICAgc3BlbGxlci0+YWRkX3RvX3BlcnNvbmFsKHdv cmQpOwoKICAgIHNwZWxsZXItPnNhdmVfYWxsX3dvcmRfbGlzdHMoKTsKI2VuZGlmCgogIH0gZWxz ZSB7IC8vIGFjdGlvbiA9PSBkb19kdW1wCgogICAgLy8gRklYTUU6IFRoaXMgaXMgY3VycmVudGx5 IGJyb2tlbgoKICAgIENvbmZpZyAqIGNvbmZpZyA9IG9wdGlvbnM7CiAgICBEaWN0aW9uYXJ5ICog cGVyID0gbmV3X2RlZmF1bHRfd3JpdGFibGVfZGljdCgqY29uZmlnKTsKICAgIEVYSVRfT05fRVJS KHBlci0+bG9hZChjb25maWctPnJldHJpZXZlKCJwZXJzb25hbC1wYXRoIiksICpjb25maWcpKTsK ICAgIFN0YWNrUHRyPFdvcmRFbnRyeUVudW1lcmF0aW9uPiBlbHMocGVyLT5kZXRhaWxlZF9lbGVt ZW50cygpKTsKICAgIFN0YWNrUHRyPENvbnZlcnQ+IGNvbnYoc2V0dXBfY29udihwZXItPmxhbmco KSwgY29uZmlnKSk7CgogICAgV29yZEVudHJ5ICogd2k7CiAgICB3aGlsZSAod2kgPSBlbHMtPm5l eHQoKSwgd2kpIHsKICAgICAgd2ktPndyaXRlKENPVVQsKihwZXItPmxhbmcoKSksIGNvbnYpOwog ICAgICBDT1VULnB1dCgnXG4nKTsKICAgIH0KICAgIGRlbGV0ZSBwZXI7CiAgfQp9CgovLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gcmVwbAovLwoKdm9pZCByZXBsKCkgewogIHVzaW5n IG5hbWVzcGFjZSBhc3BlbGxlcjsKCiAgaWYgKGFyZ3Muc2l6ZSgpICE9IDApIHsKICAgIG9wdGlv bnMtPnJlcGxhY2UoInJlcGwiLCBhcmdzWzBdLmNfc3RyKCkpOwogIH0KCiAgaWYgKGFjdGlvbiA9 PSBkb19jcmVhdGUgfHwgYWN0aW9uID09IGRvX21lcmdlKSB7CgogICAgQ0VSUiA8PCBfKCJTb3Jy eSBcImNyZWF0ZS9tZXJnZSByZXBsXCIgaXMgY3VycmVudGx5IHVuaW1wbGVtZW50ZWQuXG4iKTsK ICAgIGV4aXQoMyk7CgogICAgLy8gRklYTUUKI2lmIDAKICAgIFNwZWxsZXJJbXBsIHNwZWxsZXIo b3B0aW9ucyk7CgogICAgaWYgKGFjdGlvbiA9PSBkb19jcmVhdGUpIHsKICAgICAgaWYgKGZpbGVf ZXhpc3RzKHNwZWxsZXItPmNvbmZpZygpLT5yZXRyaWV2ZSgicmVwbC1wYXRoIikpKSB7CiAgICAg ICAgcHJpbnRfZXJyb3IoXygiU29ycnkgSSB3b24ndCBvdmVyd3JpdGUgXCIlc1wiIiksCgkJICAg IHNwZWxsZXItPmNvbmZpZygpLT5yZXRyaWV2ZSgicmVwbC1wYXRoIikpOwogICAgICAgIGV4aXQg KDEpOwogICAgICB9CiAgICAgIHNwZWxsZXItPnBlcnNvbmFsX3JlcGwoKS5jbGVhcigpOwogICAg fQogICAgCiAgICB0cnkgewogICAgICBTdHJpbmcgd29yZCxyZXBsOwoKICAgICAgd2hpbGUgKHRy dWUpIHsKCWdldF93b3JkX3BhaXIod29yZCxyZXBsLCc6Jyk7CglFWElUX09OX0VSUihzcGVsbGVy LT5zdG9yZV9yZXBsKHdvcmQscmVwbCxmYWxzZSkpOwogICAgICB9CgogICAgfSBjYXRjaCAoYmFk X2Npbikge30KCiAgICBFWElUX09OX0VSUihzcGVsbGVyLT5wZXJzb25hbF9yZXBsKCkuc3luY2hy b25pemUoKSk7CgojZW5kaWYKCiAgfSBlbHNlIGlmIChhY3Rpb24gPT0gZG9fZHVtcCkgewoKICAg IC8vIEZJWE1FOiBUaGlzIGlzIGN1cnJlbnRseSBicm9rZW4KCiAgICBSZXBsYWNlbWVudERpY3Qg KiByZXBsID0gbmV3X2RlZmF1bHRfcmVwbGFjZW1lbnRfZGljdCgqb3B0aW9ucyk7CiAgICByZXBs LT5sb2FkKG9wdGlvbnMtPnJldHJpZXZlKCJyZXBsLXBhdGgiKSwgKm9wdGlvbnMpOwogICAgU3Rh Y2tQdHI8V29yZEVudHJ5RW51bWVyYXRpb24+IGVscyhyZXBsLT5kZXRhaWxlZF9lbGVtZW50cygp KTsKICAgIAogICAgV29yZEVudHJ5ICogcmwgPSAwOwogICAgV29yZEVudHJ5IHdvcmRzOwogICAg Q29udiBjb252KHNldHVwX2NvbnYocmVwbC0+bGFuZygpLCBvcHRpb25zKSk7CiAgICB3aGlsZSAo KHJsID0gZWxzLT5uZXh0KCkpKSB7CiAgICAgIHJlcGwtPnJlcGxfbG9va3VwKCpybCwgd29yZHMp OwogICAgICBkbyB7CiAgICAgICAgQ09VVCA8PCBjb252KHJsLT53b3JkKSA8PCAiOiAiIDw8IGNv bnYod29yZHMud29yZCkgPDwgIlxuIjsKICAgICAgfSB3aGlsZSAod29yZHMuYWR2KCkpOwogICAg fQogICAgZGVsZXRlIHJlcGw7CiAgfQp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwov LyBzb3VuZHNsaWtlCi8vCgp2b2lkIHNvdW5kc2xpa2UoKSB7CiAgdXNpbmcgbmFtZXNwYWNlIGFz cGVsbGVyOwogIENhY2hlUHRyPExhbmd1YWdlPiBsYW5nOwogIGZpbmRfbGFuZ3VhZ2UoKm9wdGlv bnMpOwogIFBvc2liRXJyPExhbmd1YWdlICo+IHJlcyA9IG5ld19sYW5ndWFnZSgqb3B0aW9ucyk7 CiAgaWYgKHJlcy5oYXNfZXJyKCkpIHtwcmludF9lcnJvcihyZXMuZ2V0X2VycigpLT5tZXNnKTsg ZXhpdCgxKTt9CiAgbGFuZy5yZXNldChyZXMuZGF0YSk7CiAgQ29udiBpY29udihzZXR1cF9jb252 KG9wdGlvbnMsIGxhbmcpKTsKICBDb252IG9jb252KHNldHVwX2NvbnYobGFuZywgb3B0aW9ucykp OwogIFN0cmluZyB3b3JkOwogIFN0cmluZyBzbDsKICBsaW5lX2J1ZmZlcigpOwogIHdoaWxlIChD SU4uZ2V0bGluZSh3b3JkKSkgewogICAgY29uc3QgY2hhciAqIHcgPSBpY29udih3b3JkKTsKICAg IGxhbmctPkxhbmdJbXBsOjp0b19zb3VuZHNsaWtlKHNsLCB3KTsKICAgIHByaW50ZigiJXNcdCVz XG4iLCB3b3JkLnN0cigpLCBvY29udihzbCkpOwogIH0KfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8KLy8KLy8gbXVuY2gKLy8KCnZvaWQgbXVuY2goKSAKewogIHVzaW5nIG5hbWVzcGFjZSBh c3BlbGxlcjsKICBDYWNoZVB0cjxMYW5ndWFnZT4gbGFuZzsKICBmaW5kX2xhbmd1YWdlKCpvcHRp b25zKTsKICBQb3NpYkVycjxMYW5ndWFnZSAqPiByZXMgPSBuZXdfbGFuZ3VhZ2UoKm9wdGlvbnMp OwogIGlmIChyZXMuaGFzX2VycigpKSB7cHJpbnRfZXJyb3IocmVzLmdldF9lcnIoKS0+bWVzZyk7 IGV4aXQoMSk7fQogIGxhbmcucmVzZXQocmVzLmRhdGEpOwogIENvbnYgaWNvbnYoc2V0dXBfY29u dihvcHRpb25zLCBsYW5nKSk7CiAgQ29udiBvY29udihzZXR1cF9jb252KGxhbmcsIG9wdGlvbnMp KTsKICBTdHJpbmcgd29yZDsKICBHdWVzc0luZm8gZ2k7CiAgbGluZV9idWZmZXIoKTsKICB3aGls ZSAoQ0lOLmdldGxpbmUod29yZCkpIHsKICAgIGxhbmctPm11bmNoKGljb252KHdvcmQpLCAmZ2kp OwogICAgQ09VVCA8PCB3b3JkOwogICAgZm9yIChjb25zdCBhc3BlbGxlcjo6Q2hlY2tJbmZvICog Y2kgPSBnaS5oZWFkOyBjaTsgY2kgPSBjaS0+bmV4dCkKICAgIHsKICAgICAgQ09VVCA8PCAnICcg PDwgb2NvbnYoY2ktPndvcmQuc3RyLCBjaS0+d29yZC5sZW4pIDw8ICcvJzsKICAgICAgaWYgKGNp LT5wcmVfZmxhZyAhPSAwKSBDT1VUIDw8IG9jb252KHN0YXRpY19jYXN0PGNoYXI+KGNpLT5wcmVf ZmxhZykpOwogICAgICBpZiAoY2ktPnN1Zl9mbGFnICE9IDApIENPVVQgPDwgb2NvbnYoc3RhdGlj X2Nhc3Q8Y2hhcj4oY2ktPnN1Zl9mbGFnKSk7CiAgICB9CiAgICBDT1VUIDw8ICdcbic7CiAgfQp9 CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBleHBhbmQKLy8KCnZvaWQgZXhwYW5k KCkgCnsKICBpbnQgbGV2ZWwgPSAxOwogIGlmIChhcmdzLnNpemUoKSA+IDApCiAgICBsZXZlbCA9 IGF0b2koYXJnc1swXS5jX3N0cigpKTsgLy9GSVhNRTogTW9yZSB2ZXJib3NlCiAgaW50IGxpbWl0 ID0gSU5UX01BWDsKICBpZiAoYXJncy5zaXplKCkgPiAxKQogICAgbGltaXQgPSBhdG9pKGFyZ3Nb MV0uY19zdHIoKSk7CiAgCiAgdXNpbmcgbmFtZXNwYWNlIGFzcGVsbGVyOwogIENhY2hlUHRyPExh bmd1YWdlPiBsYW5nOwogIGZpbmRfbGFuZ3VhZ2UoKm9wdGlvbnMpOwogIFBvc2liRXJyPExhbmd1 YWdlICo+IHJlcyA9IG5ld19sYW5ndWFnZSgqb3B0aW9ucyk7CiAgaWYgKHJlcy5oYXNfZXJyKCkp IHtwcmludF9lcnJvcihyZXMuZ2V0X2VycigpLT5tZXNnKTsgZXhpdCgxKTt9CiAgbGFuZy5yZXNl dChyZXMuZGF0YSk7CiAgQ29udiBpY29udihzZXR1cF9jb252KG9wdGlvbnMsIGxhbmcpKTsKICBD b252IG9jb252KHNldHVwX2NvbnYobGFuZywgb3B0aW9ucykpOwogIFN0cmluZyB3b3JkLCBidWY7 CiAgT2JqU3RhY2sgZXhwX2J1ZjsKICBXb3JkQWZmICogZXhwX2xpc3Q7CiAgbGluZV9idWZmZXIo KTsKICB3aGlsZSAoQ0lOLmdldGxpbmUod29yZCkpIHsKICAgIGJ1ZiA9IHdvcmQ7CiAgICBjaGFy ICogdyA9IGljb252KGJ1Zi5tc3RyKCksIGJ1Zi5zaXplKCkpOwogICAgY2hhciAqIGFmID0gc3Ry Y2hyKHcsICcvJyk7CiAgICBzaXplX3QgczsKICAgIGlmIChhZiAhPSAwKSB7CiAgICAgIHMgPSBh ZiAtIHc7CiAgICAgICphZisrID0gJ1wwJzsKICAgIH0gZWxzZSB7CiAgICAgIHMgPSBzdHJsZW4o dyk7CiAgICAgIGFmID0gdyArIHM7CiAgICB9CiAgICBleHBfYnVmLnJlc2V0KCk7CiAgICBleHBf bGlzdCA9IGxhbmctPmV4cGFuZCh3LCBhZiwgZXhwX2J1ZiwgbGltaXQpOwogICAgaWYgKGxldmVs IDw9IDIpIHsKICAgICAgaWYgKGxldmVsID09IDIpIAogICAgICAgIENPVVQgPDwgd29yZCA8PCAn ICc7CiAgICAgIFdvcmRBZmYgKiBwID0gZXhwX2xpc3Q7CiAgICAgIHdoaWxlIChwKSB7CiAgICAg ICAgQ09VVCA8PCBvY29udihwLT53b3JkKTsKICAgICAgICBpZiAobGltaXQgPCBJTlRfTUFYICYm IHAtPmFmZlswXSkgQ09VVCA8PCAnLycgPDwgb2NvbnYoKGNvbnN0IGNoYXIgKilwLT5hZmYpOwog ICAgICAgIHAgPSBwLT5uZXh0OwogICAgICAgIGlmIChwKSBDT1VUIDw8ICcgJzsKICAgICAgfQog ICAgICBDT1VUIDw8ICdcbic7CiAgICB9IGVsc2UgaWYgKGxldmVsID49IDMpIHsKICAgICAgZG91 YmxlIHJhdGlvID0gMDsKICAgICAgaWYgKGxldmVsID49IDQpIHsKICAgICAgICBmb3IgKFdvcmRB ZmYgKiBwID0gZXhwX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KQogICAgICAgICAgcmF0aW8gKz0gcC0+ d29yZC5zaXplOwogICAgICAgIHJhdGlvIC89IGV4cF9saXN0LT53b3JkLnNpemU7IC8vIGl0IGlz IGFzc3VtZWQgdGhlIGZpcnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Ly8gZXhwYW5zaW9uIGlzIGp1c3QgdGhlIHJvb3QKICAgICAgfQogICAgICBmb3IgKFdvcmRBZmYg KiBwID0gZXhwX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CiAgICAgICAgQ09VVCA8PCB3b3JkIDw8 ICcgJyA8PCBvY29udihwLT53b3JkKTsKICAgICAgICBpZiAobGltaXQgPCBJTlRfTUFYICYmIHAt PmFmZlswXSkgQ09VVCA8PCAnLycgPDwgb2NvbnYoKGNvbnN0IGNoYXIgKilwLT5hZmYpOwogICAg ICAgIGlmIChsZXZlbCA+PSA0KSBDT1VULnByaW50ZigiICVmXG4iLCByYXRpbyk7CiAgICAgICAg ZWxzZSBDT1VUIDw8ICdcbic7CiAgICAgIH0KICAgIH0KICB9Cn0KCi8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vCi8vCi8vIGNvbWJpbmUKLy8KCnN0YXRpYyB2b2lkIGNvbWJpbmVfYWZmKFN0cmlu ZyAmIGFmZiwgY29uc3QgY2hhciAqIGFwcCkKewogIGZvciAoOyAqYXBwOyArK2FwcCkgewogICAg aWYgKCFtZW1jaHIoYWZmLmNfc3RyKCksKmFwcCxhZmYuc2l6ZSgpKSkKICAgICAgYWZmLnB1c2hf YmFjaygqYXBwKTsKICB9Cn0KCnN0YXRpYyB2b2lkIHByaW50X3dvcmRhZmYoY29uc3QgU3RyaW5n ICYgYmFzZSwgY29uc3QgU3RyaW5nICYgYWZmcywgQ29udiAmIG9jb252KQp7CiAgaWYgKGJhc2Uu ZW1wdHkoKSkgcmV0dXJuOwogIENPVVQgPDwgb2NvbnYoYmFzZSk7CiAgaWYgKGFmZnMuZW1wdHko KSkKICAgIENPVVQgPDwgJ1xuJzsKICBlbHNlCiAgICBDT1VULnByaW50ZigiLyVzXG4iLCBvY29u dihhZmZzKSk7Cn0KCnN0YXRpYyBib29sIGxvd2VyX2VxdWFsKGFzcGVsbGVyOjpMYW5ndWFnZSAq IGwsIFBhcm1TdHJpbmcgYSwgUGFybVN0cmluZyBiKQp7CiAgaWYgKGEuc2l6ZSgpICE9IGIuc2l6 ZSgpKSByZXR1cm4gZmFsc2U7CiAgaWYgKGwtPnRvX2xvd2VyKGFbMF0pICE9IGwtPnRvX2xvd2Vy KGJbMF0pKSByZXR1cm4gZmFsc2U7CiAgcmV0dXJuIG1lbWNtcChhICsgMSwgYiArIDEsIGEuc2l6 ZSgpIC0gMSkgPT0gMDsKfQoKdm9pZCBjb21iaW5lKCkKewogIHVzaW5nIG5hbWVzcGFjZSBhc3Bl bGxlcjsKICBDYWNoZVB0cjxMYW5ndWFnZT4gbGFuZzsKICBmaW5kX2xhbmd1YWdlKCpvcHRpb25z KTsKICBQb3NpYkVycjxMYW5ndWFnZSAqPiByZXMgPSBuZXdfbGFuZ3VhZ2UoKm9wdGlvbnMpOwog IGlmIChyZXMuaGFzX2VycigpKSB7cHJpbnRfZXJyb3IocmVzLmdldF9lcnIoKS0+bWVzZyk7IGV4 aXQoMSk7fQogIGxhbmcucmVzZXQocmVzLmRhdGEpOwogIENvbnYgaWNvbnYoc2V0dXBfY29udihv cHRpb25zLCBsYW5nKSk7CiAgQ29udiBvY29udihzZXR1cF9jb252KGxhbmcsIG9wdGlvbnMpKTsK ICBTdHJpbmcgd29yZDsKICBTdHJpbmcgYmFzZTsKICBTdHJpbmcgYWZmczsKICBsaW5lX2J1ZmZl cigpOwogIHdoaWxlIChDSU4uZ2V0bGluZSh3b3JkKSkgewogICAgd29yZCA9IGljb252KHdvcmQp OwoKICAgIENoYXJWZWN0b3IgYnVmOyBidWYuYXBwZW5kKHdvcmQuY19zdHIoKSwgd29yZC5zaXpl KCkgKyAxKTsKICAgIGNoYXIgKiB3ID0gYnVmLmRhdGEoKTsKICAgIGNoYXIgKiBhZiA9IHN0cmNo cih3LCAnLycpOwogICAgc2l6ZV90IHM7CiAgICBpZiAoYWYgIT0gMCkgewogICAgICBzID0gYWYg LSB3OwogICAgICAqYWYrKyA9ICdcMCc7CiAgICB9IGVsc2UgewogICAgICBzID0gc3RybGVuKHcp OwogICAgICBhZiA9IHcgKyBzOwogICAgfQoKICAgIGlmIChsb3dlcl9lcXVhbChsYW5nLCBiYXNl LCB3KSkgewogICAgICBpZiAobGFuZy0+aXNfbG93ZXIoYmFzZS5zdHIoKSkpIHsKICAgICAgICBj b21iaW5lX2FmZihhZmZzLCBhZik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYmFzZSA9IHc7CiAg ICAgICAgY29tYmluZV9hZmYoYWZmcywgYWYpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBw cmludF93b3JkYWZmKGJhc2UsIGFmZnMsIG9jb252KTsKICAgICAgYmFzZSA9IHc7CiAgICAgIGFm ZnMgPSBhZjsKICAgIH0KCiAgfQogIHByaW50X3dvcmRhZmYoYmFzZSwgYWZmcywgb2NvbnYpOwp9 CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBtdW5jaCBsaXN0Ci8vCgp2b2lkIG11 bmNoX2xpc3Rfc2ltcGxlKCk7CnZvaWQgbXVuY2hfbGlzdF9jb21wbGV0ZShib29sLCBib29sKTsK CnZvaWQgbXVuY2hfbGlzdCgpCnsKICBib29sIHNpbXBsZSA9IGZhbHNlOwogIGJvb2wgbXVsdGkg PSBmYWxzZTsKICBib29sIHNpbXBsaWZ5ID0gdHJ1ZTsKCiAgZm9yICh1bnNpZ25lZCBpID0gMDsg aSA8IGFyZ3Muc2l6ZSgpOyArK2kpIHsKICAgIGlmIChhcmdzW2ldID09ICJzaW1wbGUiKSAgICAg IHNpbXBsZSA9IHRydWU7CiAgICBlbHNlIGlmIChhcmdzW2ldID09ICJzaW5nbGUiKSBtdWx0aSA9 IGZhbHNlOwogICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAibXVsdGkiKSAgbXVsdGkgPSB0cnVlOwog ICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAia2VlcCIpICAgc2ltcGxpZnkgPSBmYWxzZTsKICAgIGVs c2UgCiAgICB7CiAgICAgIHByaW50X2Vycm9yKF8oIlwiJXNcIiBpcyBub3QgYSB2YWxpZCBmbGFn IGZvciB0aGUgXCJtdW5jaC1saXN0XCIgY29tbWFuZC4iKSwKICAgICAgICAgICAgICAgICAgYXJn c1tpXSk7CiAgICAgIGV4aXQoMSk7CiAgICB9CiAgfQogIGlmIChzaW1wbGUpCiAgICBtdW5jaF9s aXN0X3NpbXBsZSgpOwogIGVsc2UKICAgIG11bmNoX2xpc3RfY29tcGxldGUobXVsdGksIHNpbXBs aWZ5KTsKfQoKLy8KLy8gbXVuY2ggbGlzdCAoc2ltcGxlIHZlcnNpb24pCi8vCgovLyBUaGlzIHZl cnNpb24gd29ya3MgdGhlIHNhbWUgd2F5IGFzIHRoZSBteXNwZWxsICJtdW5jaCIgcHJvZ3JhbS4K Ly8gSG93ZXZlciwgYmVjYXVzZSB0aGUgcmVzdWx0cyBkZXBlbmRzIG9uIHRoZSBoYXNoIHRhYmxl IHVzZWQgYW5kIHRoZQovLyBvcmRlciBvZiB0aGUgd29yZCBsaXN0IGl0IHdvbm4ndCBwcm9kdWNl IGlkZW50aWNhbCByZXN1bHRzLgoKc3RydWN0IFNNTF9Xb3JkRW50cnkgewogIGNvbnN0IGNoYXIg KiB3b3JkOwogIGNoYXIgKiBhZmY7CiAgYm9vbCBrZWVwOyAvLyBib29sZWFuCiAgU01MX1dvcmRF bnRyeShjb25zdCBjaGFyICogdyA9IDApIDogd29yZCh3KSwgYWZmKDApLCBrZWVwKGZhbHNlKSB7 fQp9OwoKc3RydWN0IFNNTF9QYXJtcyB7CiAgdHlwZWRlZiBTTUxfV29yZEVudHJ5IFZhbHVlOwog IHR5cGVkZWYgY29uc3QgY2hhciAqIEtleTsKICBzdGF0aWMgY29uc3QgYm9vbCBpc19tdWx0aSA9 IGZhbHNlOwogIGFjb21tb246Omhhc2g8Y29uc3QgY2hhciAqPiBoYXNoOwogIGJvb2wgZXF1YWwo S2V5IHgsIEtleSB5KSB7cmV0dXJuIHN0cmNtcCh4LHkpID09IDA7fQogIEtleSBrZXkoY29uc3Qg VmFsdWUgJiB2KSB7cmV0dXJuIHYud29yZDt9Cn07Cgp0eXBlZGVmIEhhc2hUYWJsZTxTTUxfUGFy bXM+IFNNTF9UYWJsZTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfYWZmaXgoU01MX1RhYmxlOjpp dGVyYXRvciBiLCBjaGFyIGFmZikKewogIGNoYXIgKiBwID0gYi0+YWZmOwogIGlmIChwKSB7d2hp bGUgKCpwKSB7aWYgKCpwID09IGFmZikgcmV0dXJuOyArK3A7fX0KICBpbnQgcyA9IHAgLSBiLT5h ZmY7CiAgYi0+YWZmID0gKGNoYXIgKilyZWFsbG9jKGItPmFmZiwgcyArIDIpOwogIGItPmFmZltz ICsgMF0gPSBhZmY7CiAgYi0+YWZmW3MgKyAxXSA9ICdcMCc7Cn0KCnZvaWQgbXVuY2hfbGlzdF9z aW1wbGUoKQp7CiAgdXNpbmcgbmFtZXNwYWNlIGFzcGVsbGVyOwogIENhY2hlUHRyPExhbmd1YWdl PiBsYW5nOwogIGZpbmRfbGFuZ3VhZ2UoKm9wdGlvbnMpOwogIFBvc2liRXJyPExhbmd1YWdlICo+ IHJlcyA9IG5ld19sYW5ndWFnZSgqb3B0aW9ucyk7CiAgaWYgKHJlcy5oYXNfZXJyKCkpIHtwcmlu dF9lcnJvcihyZXMuZ2V0X2VycigpLT5tZXNnKTsgZXhpdCgxKTt9CiAgbGFuZy5yZXNldChyZXMu ZGF0YSk7CiAgQ29udiBpY29udihzZXR1cF9jb252KG9wdGlvbnMsIGxhbmcpKTsKICBDb252IG9j b252KHNldHVwX2NvbnYobGFuZywgb3B0aW9ucykpOwogIFN0cmluZyB3b3JkLCBidWY7CiAgT2Jq U3RhY2sgZXhwX2J1ZjsKICBXb3JkQWZmICogZXhwX2xpc3Q7CiAgR3Vlc3NJbmZvIGdpOwogIFNN TF9UYWJsZSB0YWJsZTsKICBPYmpTdGFjayB0YWJsZV9idWY7CgogIC8vIGFkZCB3b3JkcyB0byBk aWN0aW9uYXJ5CiAgd2hpbGUgKENJTi5nZXRsaW5lKHdvcmQpKSB7CiAgICBidWYgPSB3b3JkOwog ICAgY2hhciAqIHcgPSBpY29udihidWYubXN0cigpLCBidWYuc2l6ZSgpKTsKICAgIGNoYXIgKiBh ZiA9IHN0cmNocih3LCAnLycpOwogICAgc2l6ZV90IHM7CiAgICBpZiAoYWYgIT0gMCkgewogICAg ICBzID0gYWYgLSB3OwogICAgICAqYWYrKyA9ICdcMCc7CiAgICB9IGVsc2UgewogICAgICBzID0g c3RybGVuKHcpOwogICAgICBhZiA9IHcgKyBzOwogICAgfQogICAgZXhwX2J1Zi5yZXNldCgpOwog ICAgZXhwX2xpc3QgPSBsYW5nLT5leHBhbmQodywgYWYsIGV4cF9idWYpOwogICAgZm9yIChXb3Jk QWZmICogcSA9IGV4cF9saXN0OyBxOyBxID0gcS0+bmV4dCkgewogICAgICB0YWJsZS5pbnNlcnQo U01MX1dvcmRFbnRyeSh0YWJsZV9idWYuZHVwKHEtPndvcmQpKSk7CiAgICB9CiAgfQoKICAvLyBu b3cgdHJ5IHRvIG11bmNoIGVhY2ggd29yZCBpbiB0aGUgZGljdGlvbmFyeQogIFNNTF9UYWJsZTo6 aXRlcmF0b3IgcCA9IHRhYmxlLmJlZ2luKCk7CiAgU01MX1RhYmxlOjppdGVyYXRvciBlbmQgPSB0 YWJsZS5lbmQoKTsKICBTdHJpbmcgZmxhZ3M7CiAgZm9yICg7IHAgIT0gZW5kOyArK3ApIAogIHsK ICAgIGNvbnN0IGFzcGVsbGVyOjpDaGVja0luZm8gKiBiZXN0ID0gMDsKICAgIHVuc2lnbmVkIG1p bl9iYXNlX3NpemUgPSBJTlRfTUFYOwogICAgbGFuZy0+bXVuY2gocC0+d29yZCwgJmdpKTsKICAg IGNvbnN0IGFzcGVsbGVyOjpDaGVja0luZm8gKiBjaSA9IGdpLmhlYWQ7CiAgICB3aGlsZSAoY2kp CiAgICB7IHsKICAgICAgLy8gY2hlY2sgaWYgdGhlIGJhc2Ugd29yZCBpcyBpbiB0aGUgZGljdGlv bmFyeQogICAgICBTTUxfVGFibGU6Oml0ZXJhdG9yIGIgPSB0YWJsZS5maW5kKGNpLT53b3JkLnN0 cik7CiAgICAgIGlmIChiID09IHRhYmxlLmVuZCgpKSBnb3RvIGNvbnQ7CgogICAgICAvLyBjaGVj ayBpZiBhbGwgdGhlIHdvcmRzIG9uY2UgZXhwYW5kZWQgYXJlIGluIHRoZSBkaWN0aW9uYXJ5CiAg ICAgIC8vIHRoaXMgaW5jbHVkZWQgdGhlIGV4aXRpbmcgZmxhZ3MgZHVlIHRvIHByZS1zdWYgY3Jv c3MgcHJvZHVjdHMKICAgICAgaWYgKGItPmFmZikgZmxhZ3MgPSBiLT5hZmY7CiAgICAgIGVsc2Ug ICAgICAgIGZsYWdzLmNsZWFyKCk7CiAgICAgIGlmIChjaS0+cHJlX2ZsYWcgIT0gMCkgZmxhZ3Mg Kz0gY2ktPnByZV9mbGFnOwogICAgICBpZiAoY2ktPnN1Zl9mbGFnICE9IDApIGZsYWdzICs9IGNp LT5zdWZfZmxhZzsKICAgICAgZXhwX2J1Zi5yZXNldCgpOwogICAgICBleHBfbGlzdCA9IGxhbmct PmV4cGFuZChjaS0+d29yZC5zdHIsIGZsYWdzLCBleHBfYnVmKTsKICAgICAgZm9yIChXb3JkQWZm ICogcSA9IGV4cF9saXN0OyBxOyBxID0gcS0+bmV4dCkgewogICAgICAgIGlmICghdGFibGUuaGF2 ZShxLT53b3JkKSkgZ290byBjb250OwogICAgICB9CgogICAgICAvLyB0aGUgYmFzZSB3b3JkIGFu ZCBmbGFncyBhcmUgdmFsaWQsIG5vdyBrZWVwIHRoZSBvbmUgd2l0aCB0aGUKICAgICAgLy8gc21h bGxlc3QgYmFzZSB3b3JkCiAgICAgIGlmIChjaS0+d29yZC5sZW4gPCBtaW5fYmFzZV9zaXplKSB7 CiAgICAgICAgbWluX2Jhc2Vfc2l6ZSA9IGNpLT53b3JkLmxlbjsKICAgICAgICBiZXN0ID0gY2k7 CiAgICAgIH0KCiAgICB9IGNvbnQ6CiAgICAgIGNpID0gY2ktPm5leHQ7CiAgICB9CiAgICAvLyBu b3cgYWRkIHRoZSBiYXNlIHRvIHRoZSBrZWVwIGxpc3QgaWYgb25lIGV4aXN0cwogICAgLy8gb3Ro ZXJ3aXNlIGp1c3Qga2VlcCB0aGUgb3JpZ2luYWwgd29yZAogICAgaWYgKGJlc3QpIHsKICAgICAg U01MX1RhYmxlOjppdGVyYXRvciBiID0gdGFibGUuZmluZChiZXN0LT53b3JkLnN0cik7CiAgICAg IGFzc2VydChiICE9IHRhYmxlLmVuZCgpKTsKICAgICAgaWYgKGJlc3QtPnByZV9mbGFnKSBhZGRf YWZmaXgoYiwgYmVzdC0+cHJlX2ZsYWcpOwogICAgICBpZiAoYmVzdC0+c3VmX2ZsYWcpIGFkZF9h ZmZpeChiLCBiZXN0LT5zdWZfZmxhZyk7CiAgICAgIGItPmtlZXAgPSB0cnVlOwogICAgfSBlbHNl IHsKICAgICAgcC0+a2VlcCA9IHRydWU7CiAgICB9CiAgfQoKICAvLyBQcmludCB0aGUgZW50cmll cyBpbiB0aGUgdGFibGUgbWFya2VkIGFzICJ0byBrZWVwIgogIHAgPSB0YWJsZS5iZWdpbigpOwog IGZvciAoOyBwICE9IGVuZDsgKytwKSAKICB7CiAgICBpZiAocC0+a2VlcCkgewogICAgICBDT1VU IDw8IG9jb252KHAtPndvcmQpOwogICAgICBpZiAocC0+YWZmKSB7CiAgICAgICAgQ09VVCA8PCAn LycgPDwgb2NvbnYocC0+YWZmKTsKICAgICAgfQogICAgICBDT1VUIDw8ICdcbic7CiAgICB9CiAg fQoKICBwID0gdGFibGUuYmVnaW4oKTsKICBmb3IgKDsgcCAhPSBlbmQ7ICsrcCkgCiAgewogICAg aWYgKHAtPmFmZikgZnJlZShwLT5hZmYpOwogICAgcC0+YWZmID0gMDsKICB9Cn0KCi8vCi8vIG11 bmNoIGxpc3QgKGNvbXBsZXRlIHZlcnNpb24pCi8vCi8vCi8vIFRoaXMgdmVyc2lvbiB3aWxsIHBy b2R1Y2UgYSBzbWFsbGVyIGxpc3QgdGhhbiB0aGUgc2ltcGxlIHZlcnNpb24uCi8vIEl0IGlzIHZl cnkgY2xvc2UgdG8gdGhlIG9wdGltdW0gcmVzdWx0LiAKLy8KCi8vCi8vIEhhc2ggdGFibGUgdG8g c3RvcmUgdGhlIHdvcmRzCi8vCgpzdHJ1Y3QgQ01MX0VudHJ5IHsKICBjb25zdCBjaGFyICogd29y ZDsKICBjaGFyICogYWZmOwogIENNTF9FbnRyeSAqIHBhcmVudDsKICBDTUxfRW50cnkgKiBuZXh0 OwogIGludCByYW5rOwogIENNTF9FbnRyeShjb25zdCBjaGFyICogdyA9IDApIDogd29yZCh3KSwg YWZmKDApLCBwYXJlbnQoMCksIG5leHQoMCksIHJhbmsoMCkge30KfTsKCnN0cnVjdCBDTUxfUGFy bXMgewogIHR5cGVkZWYgQ01MX0VudHJ5IFZhbHVlOwogIHR5cGVkZWYgY29uc3QgY2hhciAqIEtl eTsKICBzdGF0aWMgY29uc3QgYm9vbCBpc19tdWx0aSA9IHRydWU7CiAgYWNvbW1vbjo6aGFzaDxj b25zdCBjaGFyICo+IGhhc2g7CiAgYm9vbCBlcXVhbChLZXkgeCwgS2V5IHkpIHtyZXR1cm4gc3Ry Y21wKHgseSkgPT0gMDt9CiAgS2V5IGtleShjb25zdCBWYWx1ZSAmIHYpIHtyZXR1cm4gdi53b3Jk O30KfTsKCnR5cGVkZWYgSGFzaFRhYmxlPENNTF9QYXJtcz4gQ01MX1RhYmxlOwoKLy8KLy8gYWRk IGFuIGFmZml4IHRvIGEgd29yZCBidXQga2VlcCB0aGUgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzIHNl cGFyYXRlCi8vCgpzdGF0aWMgdm9pZCBhZGRfYWZmaXgoQ01MX1RhYmxlOjppdGVyYXRvciBiLCBj aGFyIGFmZiwgYm9vbCBwcmVmaXgpCnsKICBjaGFyICogcCA9IGItPmFmZjsKICBpbnQgcyA9IDM7 CiAgaWYgKHApIHsKICAgIHdoaWxlICgqcCkgewogICAgICBpZiAoKnAgPT0gYWZmKSByZXR1cm47 IAogICAgICArK3A7CiAgICB9CiAgICBzID0gKHAgLSBiLT5hZmYpICsgMjsKICB9CiAgY2hhciAq IHRtcCA9IChjaGFyICopbWFsbG9jKHMpOwogIHAgPSBiLT5hZmY7CiAgY2hhciAqIHEgPSB0bXA7 CiAgaWYgKHApIHt3aGlsZSAoKnAgIT0gJy8nKSAqcSsrID0gKnArKzt9CiAgaWYgKHByZWZpeCkg KnErKyA9IGFmZjsKICAqcSsrID0gJy8nOwogIGlmIChwKSB7cCsrOyB3aGlsZSAoKnAgIT0gJ1ww JykgKnErKyA9ICpwKys7fQogIGlmICghcHJlZml4KSAqcSsrID0gYWZmOwogICpxKysgPSAnXDAn OwogIGFzc2VydChxIC0gdG1wID09IHMpOwogIGlmIChiLT5hZmYpIGZyZWUoYi0+YWZmKTsKICBi LT5hZmYgPSB0bXA7Cn0KCi8vCi8vIFN0YW5kYXJkIGRpc2pvaW50IHNldCBhbGdvIHdpdGggdW5p b24gYnkgcmFuayBhbmQgcGF0aCBjb21wcmVzc2lvbgovLwoKc3RhdGljIHZvaWQgbGluayhDTUxf RW50cnkgKiB4LCBDTUxfRW50cnkgKiB5KQp7CiAgaWYgKHggPT0geSkgcmV0dXJuOwogIGlmICh4 LT5yYW5rID4geS0+cmFuaykgewogICAgeS0+cGFyZW50ID0geDsKICB9IGVsc2UgewogICAgeC0+ cGFyZW50ID0geTsKICAgIGlmICh4LT5yYW5rID09IHktPnJhbmspIHktPnJhbmsrKzsKICB9Cn0K CnN0YXRpYyBDTUxfRW50cnkgKiBmaW5kX3NldCAoQ01MX0VudHJ5ICogeCkgCnsKICBpZiAoeC0+ cGFyZW50KQogICAgcmV0dXJuIHgtPnBhcmVudCA9IGZpbmRfc2V0KHgtPnBhcmVudCk7CiAgZWxz ZQogICAgcmV0dXJuIHg7Cn0KCi8vCi8vIFN0dWZmIHRvIG1hbmFnZSBwcmVmaXgtc3VmZml4IGNv bWJpbmF0aW9ucwovLwoKc3RydWN0IFByZVN1ZiB7CiAgU3RyaW5nIHByZTsKICBTdHJpbmcgc3Vm OwogIFN0cmluZyAmIGdldChpbnQgaSkge3JldHVybiBpID09IDAgPyBwcmUgOiBzdWY7fQogIGNv bnN0IFN0cmluZyAmIGdldChpbnQgaSkgY29uc3Qge3JldHVybiBpID09IDAgPyBwcmUgOiBzdWY7 fQogIFByZVN1ZigpIDogbmV4dCgwKSB7fQogIFByZVN1ZiAqIG5leHQ7Cn07CgpjbGFzcyBQcmVT dWZMaXN0IHsKcHVibGljOgogIFByZVN1ZiAqIGhlYWQ7CiAgUHJlU3VmTGlzdCgpIDogaGVhZCgw KSB7fQogIHZvaWQgYWRkKFByZVN1ZiAqIHRvX2FkZCkgewogICAgdG9fYWRkLT5uZXh0ID0gaGVh ZDsKICAgIGhlYWQgPSB0b19hZGQ7CiAgfQogIHZvaWQgY2xlYXIoKSB7CiAgICB3aGlsZSAoaGVh ZCkgewogICAgICBQcmVTdWYgKiB0bXAgPSBoZWFkOwogICAgICBoZWFkID0gaGVhZC0+bmV4dDsK ICAgICAgZGVsZXRlIHRtcDsKICAgIH0KICB9CiAgdm9pZCB0cmFuc2ZlcihQcmVTdWZMaXN0ICYg b3RoZXIpIHsKICAgIGNsZWFyKCk7CiAgICBoZWFkID0gb3RoZXIuaGVhZDsKICAgIG90aGVyLmhl YWQgPSAwOwogIH0KICB+UHJlU3VmTGlzdCgpIHsKICAgIGNsZWFyKCk7CiAgfQp9OwoKCi8vIEV4 YW1wbGUgb2YgdXNhZ2U6Ci8vICAgY29tYmluZShpbiwgcmVzLCAwKQovLyAgIFByZTogIGluID0g IFsoYWIsIGMpIChhYiwgZCkgKGMsIGRlKSAoYywgZWYpXQovLyAgIFBvc3Q6IHJlcyA9IFsoYWIs IGNkKSwgKGMsIGRlZildCnN0YXRpYyB2b2lkIGNvbWJpbmUoY29uc3QgUHJlU3VmTGlzdCAmIGlu LCBQcmVTdWZMaXN0ICYgcmVzLCBpbnQgd2hpY2gpCnsKICBjb25zdCBQcmVTdWYgKiBpID0gaW4u aGVhZDsKICB3aGlsZSAoaSkgeyB7CiAgICBjb25zdCBTdHJpbmcgJiBzID0gaS0+Z2V0KHdoaWNo KTsKICAgIGZvciAoY29uc3QgUHJlU3VmICogaiA9IGluLmhlYWQ7IGogIT0gaTsgaiA9IGotPm5l eHQpIHsKICAgICAgaWYgKGotPmdldCh3aGljaCkgPT0gcykgZ290byBjb250OwogICAgfQogICAg UHJlU3VmICogdG1wID0gbmV3IFByZVN1ZjsKICAgIHRtcC0+cHJlID0gaS0+cHJlOwogICAgdG1w LT5zdWYgPSBpLT5zdWY7CiAgICBTdHJpbmcgJiBiID0gdG1wLT5nZXQoIXdoaWNoKTsKICAgIGZv ciAoY29uc3QgUHJlU3VmICogaiA9IGktPm5leHQ7IGo7IGogPSBqLT5uZXh0KSB7CiAgICAgIGlm IChqLT5nZXQod2hpY2gpICE9IHMpIGNvbnRpbnVlOwogICAgICBjb25zdCBTdHJpbmcgJiBhID0g ai0+Z2V0KCF3aGljaCk7CiAgICAgIGZvciAoU3RyaW5nOjpjb25zdF9pdGVyYXRvciB4ID0gYS5i ZWdpbigpOyB4ICE9IGEuZW5kKCk7ICsreCkgewogICAgICAgIGlmIChtZW1jaHIoYi5kYXRhKCks ICp4LCBiLnNpemUoKSkpIGNvbnRpbnVlOwogICAgICAgIGIgKz0gKng7CiAgICAgIH0KICAgIH0K ICAgIHJlcy5hZGQodG1wKTsKICB9IGNvbnQ6CiAgICBpID0gaS0+bmV4dDsKICB9Cn0KCi8vCi8v IFN0dWZmIHVzZWQgd2hlbiBwcnVuaW5nIHRoZSBsaXN0IG9mIGJhc2Ugd29yZHMKLy8KCnN0cnVj dCBFeHBhbnNpb24gewogIGNvbnN0IGNoYXIgKiB3b3JkOwogIGNoYXIgKiBhZmY7IC8vIG1vZGlm eWluZyB0aGlzIHdpbGwgbW9kaWZ5IHRoZSBhZmZpeCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZQog IHN0ZDo6dmVjdG9yPGJvb2w+IGV4cDsKICBzdGQ6OnZlY3Rvcjxib29sPiBvcmlnX2V4cDsKfTsK Ci8vIHN0YXRpYyB2b2lkIGR1bXAoY29uc3QgVmVjdG9yPEV4cGFuc2lvbiAqPiAmIHdvcmtpbmcs IAovLyAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxDTUxfVGFibGU6Oml0ZXJhdG9yPiAm IGVudHJpZXMpCi8vIHsKLy8gICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHdvcmtpbmcuc2l6 ZSgpOyArK2kpIHsKLy8gICAgIGlmICghd29ya2luZ1tpXSkgY29udGludWU7Ci8vICAgICBDRVJS LnByaW50ZigiJXMvJXMgIiwgd29ya2luZ1tpXS0+d29yZCwgd29ya2luZ1tpXS0+YWZmKTsKLy8g ICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gd29ya2luZ1tpXS0+ZXhwLnNpemUoKTsgKytq KSB7Ci8vICAgICAgIGlmICh3b3JraW5nW2ldLT5leHBbal0pCi8vICAgICAgICAgQ0VSUi5wcmlu dGYoIiVzICIsIGVudHJpZXNbal0tPndvcmQpOwovLyAgICAgfQovLyAgICAgQ0VSUi5wdXQoJ1xu Jyk7Ci8vICAgfQovLyAgIENFUlIucHV0KCdcbicpOwovLyB9CgovLyBzdGFuZGFyZCBzZXQgYWxn b3JpdGhtcyBvbiBhIGJpdCB2ZWN0b3IKCnN0YXRpYyBib29sIHN1YnNldChjb25zdCBzdGQ6OnZl Y3Rvcjxib29sPiAmIHNtYWxsZXIsIAogICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0 b3I8Ym9vbD4gJiBsYXJnZXIpCnsKICBhc3NlcnQoc21hbGxlci5zaXplKCkgPT0gbGFyZ2VyLnNp emUoKSk7CiAgdW5zaWduZWQgcyA9IGxhcmdlci5zaXplKCk7CiAgZm9yICh1bnNpZ25lZCBpID0g MDsgaSAhPSBzOyArK2kpIHsKICAgIGlmIChzbWFsbGVyW2ldICYmICFsYXJnZXJbaV0pIHJldHVy biBmYWxzZTsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCnN0YXRpYyB2b2lkIG1lcmdlKHN0ZDo6dmVj dG9yPGJvb2w+ICYgeCwgY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vbD4gJiB5KQp7CiAgYXNzZXJ0KHgu c2l6ZSgpID09IHkuc2l6ZSgpKTsKICB1bnNpZ25lZCBzID0geC5zaXplKCk7CiAgZm9yICh1bnNp Z25lZCBpID0gMDsgaSAhPSBzOyArK2kpIHsKICAgIGlmICh5W2ldKSB4W2ldID0gdHJ1ZTsKICB9 Cn0KCnN0YXRpYyB2b2lkIHB1cmdlKHN0ZDo6dmVjdG9yPGJvb2w+ICYgeCwgY29uc3Qgc3RkOjp2 ZWN0b3I8Ym9vbD4gJiB5KQp7CiAgYXNzZXJ0KHguc2l6ZSgpID09IHkuc2l6ZSgpKTsKICB1bnNp Z25lZCBzID0geC5zaXplKCk7CiAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBzOyArK2kpIHsK ICAgIGlmICh5W2ldKSB4W2ldID0gZmFsc2U7CiAgfQp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVk IGNvdW50KGNvbnN0IHN0ZDo6dmVjdG9yPGJvb2w+ICYgeCkgewogIHVuc2lnbmVkIGMgPSAwOwog IGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0geC5zaXplKCk7ICsraSkgewogICAgaWYgKHhbaV0p ICsrYzsKICB9CiAgcmV0dXJuIGM7Cn0KCi8vIAoKc3RydWN0IFdvcmtpbmdMdCB7CiAgYm9vbCBv cGVyYXRvcigpIChFeHBhbnNpb24gKiB4LCBFeHBhbnNpb24gKiB5KSB7CgogICAgLy8gTEFSR0VT VCBudW1iZXIgb2YgZXhwYW5zaW9ucwogICAgdW5zaWduZWQgeF9zID0gY291bnQoeC0+ZXhwKTsK ICAgIHVuc2lnbmVkIHlfcyA9IGNvdW50KHktPmV4cCk7CiAgICBpZiAoeF9zICE9IHlfcykgcmV0 dXJuIHhfcyA+IHlfczsKCiAgICAvLyBTTUFMTEVTVCBiYXNlIHdvcmQKICAgIHhfcyA9IHN0cmxl bih4LT53b3JkKTsKICAgIHlfcyA9IHN0cmxlbih5LT53b3JkKTsKICAgIGlmICh4X3MgIT0geV9z KSByZXR1cm4geF9zIDwgeV9zOwoKICAgIC8vIExBUkdFU1QgYWZmaXggc3RyaW5nCiAgICB4X3Mg PSBzdHJsZW4oeC0+YWZmKTsKICAgIHlfcyA9IHN0cmxlbih5LT5hZmYpOwogICAgaWYgKHhfcyAh PSB5X3MpIHJldHVybiB4X3MgPiB5X3M7IAoKICAgIC8vIAogICAgaW50IGNtcCA9IHN0cmNtcCh4 LT53b3JkLCB5LT53b3JkKTsKICAgIGlmIChjbXAgIT0gMCkgcmV0dXJuIGNtcCA8IDA7CgogICAg Ly8KICAgIGNtcCA9IHN0cmNtcCh4LT5hZmYsIHktPmFmZik7CiAgICByZXR1cm4gY21wIDwgMDsK ICB9Cn07CgovLwovLyBGaW5hbGx5IHRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIHJlYWwgd29y awovLwoKdm9pZCBtdW5jaF9saXN0X2NvbXBsZXRlKGJvb2wgbXVsdGksIGJvb2wgc2ltcGxpZnkp CnsKICB1c2luZyBuYW1lc3BhY2UgYXNwZWxsZXI7CiAgQ2FjaGVQdHI8TGFuZ3VhZ2U+IGxhbmc7 CiAgZmluZF9sYW5ndWFnZSgqb3B0aW9ucyk7CiAgUG9zaWJFcnI8TGFuZ3VhZ2UgKj4gcmVzID0g bmV3X2xhbmd1YWdlKCpvcHRpb25zKTsKICBpZiAocmVzLmhhc19lcnIoKSkge3ByaW50X2Vycm9y KHJlcy5nZXRfZXJyKCktPm1lc2cpOyBleGl0KDEpO30KICBsYW5nLnJlc2V0KHJlcy5kYXRhKTsK ICBDb252IGljb252KHNldHVwX2NvbnYob3B0aW9ucywgbGFuZykpOwogIENvbnYgb2NvbnYoc2V0 dXBfY29udihsYW5nLCBvcHRpb25zKSk7CiAgU3RyaW5nIHdvcmQsIGJ1ZjsKICBPYmpTdGFjayBl eHBfYnVmOwogIFdvcmRBZmYgKiBleHBfbGlzdDsKICBHdWVzc0luZm8gZ2k7CiAgQ01MX1RhYmxl IHRhYmxlOwogIE9ialN0YWNrIHRhYmxlX2J1ZjsKCiAgLy8gYWRkIHdvcmRzIHRvIGRpY3Rpb25h cnkKICB3aGlsZSAoQ0lOLmdldGxpbmUod29yZCkpIHsKICAgIGJ1ZiA9IHdvcmQ7CiAgICBjaGFy ICogdyA9IGljb252KGJ1Zi5tc3RyKCksIGJ1Zi5zaXplKCkpOwogICAgY2hhciAqIGFmID0gc3Ry Y2hyKHcsICcvJyk7CiAgICBzaXplX3QgczsKICAgIGlmIChhZiAhPSAwKSB7CiAgICAgIHMgPSBh ZiAtIHc7CiAgICAgICphZisrID0gJ1wwJzsKICAgIH0gZWxzZSB7CiAgICAgIHMgPSBzdHJsZW4o dyk7CiAgICAgIGFmID0gdyArIHM7CiAgICB9CiAgICBleHBfYnVmLnJlc2V0KCk7CiAgICBleHBf bGlzdCA9IGxhbmctPmV4cGFuZCh3LCBhZiwgZXhwX2J1Zik7CiAgICBmb3IgKFdvcmRBZmYgKiBx ID0gZXhwX2xpc3Q7IHE7IHEgPSBxLT5uZXh0KSB7CiAgICAgIGlmICghdGFibGUuaGF2ZShxLT53 b3JkKSkgLy8gc2luY2UgaXQgaXMgYSBtdWx0aSBoYXNoIHRhYmxlCiAgICAgICAgdGFibGUuaW5z ZXJ0KENNTF9FbnRyeSh0YWJsZV9idWYuZHVwKHEtPndvcmQpKSkuZmlyc3Q7CiAgICB9CiAgfQoK ICAvLyBOb3cgdHJ5IHRvIG11bmNoIGVhY2ggd29yZCBpbiB0aGUgZGljdGlvbmFyeS4gIFRoaXMg d2lsbCBhbHNvCiAgLy8gZ3JvdXAgdGhlIGJhc2Ugd29yZHMgaW50byBkaXNqb2ludCBzZXRzIGJh c2VkIG9uIHRoZXJlIGV4cGFuc2lvbi4KICBDTUxfVGFibGU6Oml0ZXJhdG9yIHAgPSB0YWJsZS5i ZWdpbigpOwogIENNTF9UYWJsZTo6aXRlcmF0b3IgZW5kID0gdGFibGUuZW5kKCk7CiAgU3RyaW5n IGZsYWdzOwogIGZvciAoOyBwICE9IGVuZDsgKytwKSAKICB7CiAgICBsYW5nLT5tdW5jaChwLT53 b3JkLCAmZ2ksIGZhbHNlKTsKICAgIGNvbnN0IGFzcGVsbGVyOjpDaGVja0luZm8gKiBjaSA9IGdp LmhlYWQ7CiAgICB3aGlsZSAoY2kpCiAgICB7IHsKICAgICAgLy8gY2hlY2sgaWYgdGhlIGJhc2Ug d29yZCBpcyBpbiB0aGUgZGljdGlvbmFyeQogICAgICBDTUxfVGFibGU6Oml0ZXJhdG9yIGIgPSB0 YWJsZS5maW5kKGNpLT53b3JkLnN0cik7CiAgICAgIGlmIChiID09IHRhYmxlLmVuZCgpKSBnb3Rv IGNvbnQ7CgogICAgICAvLyBjaGVjayBpZiBhbGwgdGhlIHdvcmRzIG9uY2UgZXhwYW5kZWQgYXJl IGluIHRoZSBkaWN0aW9uYXJ5CiAgICAgIGNoYXIgZmxhZ3NbMl07CiAgICAgIGFzc2VydCghKGNp LT5wcmVfZmxhZyAmJiBjaS0+c3VmX2ZsYWcpKTsKICAgICAgaWYgICAgICAoY2ktPnByZV9mbGFn ICE9IDApIGZsYWdzWzBdID0gY2ktPnByZV9mbGFnOwogICAgICBlbHNlIGlmIChjaS0+c3VmX2Zs YWcgIT0gMCkgZmxhZ3NbMF0gPSBjaS0+c3VmX2ZsYWc7CiAgICAgIGZsYWdzWzFdID0gJ1wwJzsK ICAgICAgZXhwX2J1Zi5yZXNldCgpOwogICAgICBleHBfbGlzdCA9IGxhbmctPmV4cGFuZChjaS0+ d29yZC5zdHIsIGZsYWdzLCBleHBfYnVmKTsKICAgICAgZm9yIChXb3JkQWZmICogcSA9IGV4cF9s aXN0OyBxOyBxID0gcS0+bmV4dCkgewogICAgICAgIGlmICghdGFibGUuaGF2ZShxLT53b3JkKSkg Z290byBjb250OwogICAgICB9CgogICAgICAvLyBhbGwgdGhlIGV4cGFuc2lvbnMgYXJlIGluIHRo ZSBkaWN0aW9uYXJ5IG5vdyBhZGQgdGhlIGFmZml4IHRvCiAgICAgIC8vIHRoZSBiYXNlIHdvcmQg YW5kIGZpZ3VyZSBvdXQgd2hpY2ggZGlzam9pbnQgc2V0IGl0IGJlbG9uZ3MgdG8KICAgICAgYWRk X2FmZml4KGIsIGZsYWdzWzBdLCBjaS0+cHJlX2ZsYWcgIT0gMCk7CiAgICAgIENNTF9FbnRyeSAq IGJzID0gZmluZF9zZXQoJipiKTsKICAgICAgZm9yIChXb3JkQWZmICogcSA9IGV4cF9saXN0OyBx OyBxID0gcS0+bmV4dCkgewogICAgICAgIENNTF9UYWJsZTo6aXRlcmF0b3IgdyA9IHRhYmxlLmZp bmQocS0+d29yZCk7CiAgICAgICAgYXNzZXJ0KGIgIT0gdGFibGUuZW5kKCkpOwogICAgICAgIENN TF9FbnRyeSAqIHdzID0gZmluZF9zZXQoJip3KTsKICAgICAgICBsaW5rKGJzLHdzKTsKICAgICAg fQoKICAgIH0gY29udDoKICAgICAgY2kgPSBjaS0+bmV4dDsKICAgIH0KICB9CgogIC8vIElmIGEg YmFzZSB3b3JkIGhhcyBib3RoIHByZWZpeGVzIGFuZCBzdWZmaXhlcyB0cnkgdG8gY29tYmluZSB0 aGVtLgogIC8vIFRoaXMgY2FuIGxlYWQgdG8gbXVsdGlwbGUgZW50cmllcyBmb3IgdGhlIHNhbWUg YmFzZSB3b3JkLiAgSWYgIm11bHRpIgogIC8vIGlzIHRydWUsIHRoZW4gaW5jbHVkZSBhbGwgdGhl IGVudHJpZXMuICBPdGhlcndpc2UsIG9ubHkgaW5jbHVkZSB0aGUKICAvLyBvbmUgd2l0aCB0aGUg bGFyZ2VzdCBudW1iZXIgb2YgZXhwYW5zaW9ucy4gIFRoaXMgaXMgYSBncmVlZHkgY2hvaWNlCiAg Ly8gdGhhdCBtYXkgbm90IGJlIG9wdGltYWwsIGJ1dCBpcyBjbG9zZSB0byBpdC4KICBwID0gdGFi bGUuYmVnaW4oKTsKICBTdHJpbmcgcHJlLHN1ZjsKICBDTUxfRW50cnkgKiBleHRyYXMgPSAwOwog IGZvciAoOyBwICE9IGVuZDsgKytwKSAKICB7CiAgICBwcmUuY2xlYXIoKTsgc3VmLmNsZWFyKCk7 CiAgICBpZiAoIXAtPmFmZikgY29udGludWU7CiAgICBjaGFyICogcyA9IHAtPmFmZjsKICAgIHdo aWxlICgqcyAhPSAnLycpIHByZSArPSAqcysrOwogICAgKytzOwogICAgd2hpbGUgKCpzICE9ICdc MCcpIHN1ZiArPSAqcysrOwogICAgaWYgKHByZS5lbXB0eSgpKSB7CgogICAgICBzdHJjcHkocC0+ YWZmLCBzdWYuc3RyKCkpOwoKICAgIH0gZWxzZSBpZiAoc3VmLmVtcHR5KCkpIHsKCiAgICAgIHN0 cmNweShwLT5hZmYsIHByZS5zdHIoKSk7CgogICAgfSBlbHNlIHsKCiAgICAgIC8vIFRyeSBhbGwg cG9zc2libGUgY29tYmluYXRpb25zIGFuZCBrZWVwIHRoZSBvbmVzIHdoaWNoIGV4cGFuZAogICAg ICAvLyB0byBsZWdhbCB3b3Jkcy4KCiAgICAgIFByZVN1Zkxpc3QgY3Jvc3MsdG1wMSx0bXAyOwog ICAgICBQcmVTdWYgKiBwcyA9IDA7CgogICAgICBmb3IgKFN0cmluZzo6aXRlcmF0b3IgcGkgPSBw cmUuYmVnaW4oKTsgcGkgIT0gcHJlLmVuZCgpOyArK3BpKSB7CiAgICAgICAgU3RyaW5nOjppdGVy YXRvciBzaSA9IHN1Zi5iZWdpbigpOwogICAgICAgIHdoaWxlIChzaSAhPSBzdWYuZW5kKCkpIHsg ewogICAgICAgICAgY2hhciBmbGFnc1szXSA9IHsqcGksICpzaSwgJ1wwJ307CiAgICAgICAgICBl eHBfYnVmLnJlc2V0KCk7CiAgICAgICAgICBleHBfbGlzdCA9IGxhbmctPmV4cGFuZChwLT53b3Jk LCBmbGFncywgZXhwX2J1Zik7CiAgICAgICAgICBmb3IgKFdvcmRBZmYgKiBxID0gZXhwX2xpc3Q7 IHE7IHEgPSBxLT5uZXh0KSB7CiAgICAgICAgICAgIGlmICghdGFibGUuaGF2ZShxLT53b3JkKSkg Z290byBjb250MjsKICAgICAgICAgIH0KICAgICAgICAgIHBzID0gbmV3IFByZVN1ZjsKICAgICAg ICAgIHBzLT5wcmUgKz0gKnBpOwogICAgICAgICAgcHMtPnN1ZiArPSAqc2k7CiAgICAgICAgICBj cm9zcy5hZGQocHMpOwogICAgICAgIH0gY29udDI6CiAgICAgICAgICArK3NpOwogICAgICAgIH0K ICAgICAgfQoKICAgICAgLy8gTm93IGNvbWJpbmUgdGhlIGxlZ2FsIGNyb3NzIHBhaXJzIHdpdGgg b3RoZXIgb25lcyB3aGVuCiAgICAgIC8vIHBvc3NpYmxlLgoKICAgICAgLy8gZmluYWwgcmVzID0g WyAocHJlLCBbXSkgKFtdLHN1ZiksCiAgICAgIC8vICAgICAgICAgICAgICAgKGNyb3NzIHwgY29t YmluZSBmaXJzdCB8IGNvbWJpbmUgc2Vjb25kKQogICAgICAvLyAgICAgICAgICAgICAgIChjcm9z cyB8IGNvbWJpbmUgc2Vjb25kIHwgY29tYmluZSBmaXJzdCkKICAgICAgLy8gICAgICAgICAgICAg fCBjb21iaW5lIGZpcnN0CiAgICAgIC8vICAgICAgICAgICAgIHwgY29tYmluZSBzZWNvbmQKICAg ICAgLy8KICAgICAgLy8gY29tYmluZSBmaXJzdCBbKGFiLCBjKSAoYWIsIGQpIChjLCBkZSkgKGMs IGVmKV0KICAgICAgLy8gICA9ICBbKGFiLCBjZCksIChjLCBkZWYpXQogICAgICAKICAgICAgY29t YmluZShjcm9zcywgdG1wMSwgMCk7IAogICAgICBjb21iaW5lKHRtcDEsICB0bXAyLCAxKTsKICAg ICAgdG1wMS5jbGVhcigpOwogICAgICAKICAgICAgY29tYmluZShjcm9zcywgdG1wMSwgMSk7CiAg ICAgIGNvbWJpbmUodG1wMSwgIHRtcDIsIDApOwogICAgICB0bXAxLmNsZWFyKCk7CgogICAgICBj cm9zcy5jbGVhcigpOwoKICAgICAgcHMgPSBuZXcgUHJlU3VmOwogICAgICBwcy0+cHJlID0gcHJl OwogICAgICB0bXAyLmFkZChwcyk7CiAgICAgIHBzID0gbmV3IFByZVN1ZjsKICAgICAgcHMtPnN1 ZiA9IHN1ZjsKICAgICAgdG1wMi5hZGQocHMpOwoKICAgICAgY29tYmluZSh0bXAyLCB0bXAxLCAw KTsKICAgICAgY29tYmluZSh0bXAxLCBjcm9zcywgMSk7CgogICAgICBpZiAobXVsdGkpIHsKCiAg ICAgICAgLy8gSXQgaXMgT0sgdG8gaGF2ZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGggdGhlIHNhbWUg YmFzZSB3b3JkCiAgICAgICAgLy8gc28gdXNlIHRoZW0gYWxsLgoKICAgICAgICBwcyA9IGNyb3Nz LmhlYWQ7CiAgICAgICAgYXNzZXJ0KHBzKTsKICAgICAgICBtZW1jcHkocC0+YWZmLCBwcy0+cHJl LmRhdGEoKSwgcHMtPnByZS5zaXplKCkpOwogICAgICAgIG1lbWNweShwLT5hZmYgKyBwcy0+cHJl LnNpemUoKSwgcHMtPnN1Zi5zdHIoKSwgcHMtPnN1Zi5zaXplKCkgKyAxKTsKICAgICAgICAKICAg ICAgICBwcyA9IHBzLT5uZXh0OwogICAgICAgIENNTF9FbnRyeSAqIGJzID0gZmluZF9zZXQoJipw KTsKICAgICAgICBmb3IgKDsgcHM7IHBzID0gcHMtPm5leHQpIHsKICAgICAgICAgIAogICAgICAg ICAgQ01MX0VudHJ5ICogdG1wID0gbmV3IENNTF9FbnRyeTsKICAgICAgICAgIHRtcC0+d29yZCA9 IHAtPndvcmQ7CiAgICAgICAgICB0bXAtPmFmZiA9IChjaGFyICopbWFsbG9jKHBzLT5wcmUuc2l6 ZSgpICsgcHMtPnN1Zi5zaXplKCkgKyAxKTsKICAgICAgICAgIG1lbWNweSh0bXAtPmFmZiwgcHMt PnByZS5kYXRhKCksIHBzLT5wcmUuc2l6ZSgpKTsKICAgICAgICAgIG1lbWNweSh0bXAtPmFmZiAr IHBzLT5wcmUuc2l6ZSgpLCBwcy0+c3VmLnN0cigpLCBwcy0+c3VmLnNpemUoKSArIDEpOwogICAg ICAgICAgCiAgICAgICAgICB0bXAtPnBhcmVudCA9IGJzOwogICAgICAgICAgCiAgICAgICAgICB0 bXAtPm5leHQgPSBleHRyYXM7CiAgICAgICAgICBleHRyYXMgPSB0bXA7CiAgICAgICAgfQoKICAg ICAgfSBlbHNlIHsKCiAgICAgICAgLy8gY2hvc2UgdGhlIG9uZSB3aGljaCBoYXMgdGhlIGxhcmdl c3QgbnVtYmVyIG9mIGV4cGFuc2lvbnMKCiAgICAgICAgaW50IG1heF9leHAgPSAwOwogICAgICAg IFByZVN1ZiAqIGJlc3QgPSAwOwogICAgICAgIFN0cmluZyBmbGFnczsKCiAgICAgICAgZm9yIChw cyA9IGNyb3NzLmhlYWQ7IHBzOyBwcyA9IHBzLT5uZXh0KSB7CiAgICAgICAgICBmbGFncyAgPSBw cy0+cHJlOwogICAgICAgICAgZmxhZ3MgKz0gcHMtPnN1ZjsKICAgICAgICAgIGV4cF9idWYucmVz ZXQoKTsKICAgICAgICAgIGV4cF9saXN0ID0gbGFuZy0+ZXhwYW5kKHAtPndvcmQsIGZsYWdzLCBl eHBfYnVmKTsKICAgICAgICAgIGludCBjID0gMDsKICAgICAgICAgIGZvciAoV29yZEFmZiAqIHEg PSBleHBfbGlzdDsgcTsgcSA9IHEtPm5leHQpICsrYzsKICAgICAgICAgIGlmIChjID4gbWF4X2V4 cCkge21heF9leHAgPSBjOyBiZXN0ID0gcHM7fQogICAgICAgIH0KCiAgICAgICAgbWVtY3B5KHAt PmFmZiwgYmVzdC0+cHJlLmRhdGEoKSwgYmVzdC0+cHJlLnNpemUoKSk7CiAgICAgICAgbWVtY3B5 KHAtPmFmZiArIGJlc3QtPnByZS5zaXplKCksIGJlc3QtPnN1Zi5zdHIoKSwgYmVzdC0+c3VmLnNp emUoKSArIDEpOwogICAgICB9CiAgICB9CiAgfQoKICB3aGlsZSAoZXh0cmFzKSB7CiAgICBDTUxf RW50cnkgKiB0bXAgPSBleHRyYXM7CiAgICBleHRyYXMgPSBleHRyYXMtPm5leHQ7CiAgICB0bXAt Pm5leHQgPSAwOwogICAgdGFibGUuaW5zZXJ0KCp0bXApOwogICAgZGVsZXRlIHRtcDsKICB9Cgog IC8vIENyZWF0ZSBhIGxpbmtlZCBsaXN0IGZvciBlYWNoIGRpc2pvaW50IHNldAogIHAgPSB0YWJs ZS5iZWdpbigpOwogIGZvciAoOyBwICE9IGVuZDsgKytwKSAKICB7CiAgICBwLT5yYW5rID0gLTE7 CiAgICBDTUxfRW50cnkgKiBicyA9IGZpbmRfc2V0KCYqcCk7CiAgICBpZiAoYnMgIT0gJipwKSB7 CiAgICAgIHAtPm5leHQgPSBicy0+bmV4dDsKICAgICAgYnMtPm5leHQgPSAmKnA7CiAgICB9IAog IH0KCiAgLy8gTm93IHByb2Nlc3MgZWFjaCBkaXNqb2ludCBzZXQgaW5kZXBlbmRlbnRseQogIHAg PSB0YWJsZS5iZWdpbigpOwogIGZvciAoOyBwICE9IGVuZDsgKytwKSAKICB7CiAgICBpZiAocC0+ cGFyZW50KSBjb250aW51ZTsKCiAgICBWZWN0b3I8Q01MX1RhYmxlOjppdGVyYXRvcj4gZW50cmll czsKICAgIFZlY3RvcjxFeHBhbnNpb24+IGV4cGFuc2lvbnM7CiAgICBWZWN0b3I8RXhwYW5zaW9u ICo+IHRvX2tlZXA7CiAgICBzdGQ6OnZlY3Rvcjxib29sPiB0b19rZWVwX2V4cDsKICAgIFZlY3Rv cjxFeHBhbnNpb24gKj4gd29ya2luZzsKICAgIFZlY3Rvcjx1bnNpZ25lZD4gdG9fcmVtb3ZlOwoK ICAgIC8vIEZpcnN0IGFzc2lnbiBudW1iZXJzIHRvIGVhY2ggdW5pcXVlIHdvcmQuICBUaGUgcmFu ayBmaWVsZCBpcwogICAgLy8gbm8gbG9uZ2VyIHVzZWQgc28gdXNlIGl0IHRvIHN0b3JlIHRoZSBu dW1iZXIuCiAgICBmb3IgKENNTF9FbnRyeSAqIHEgPSAmKnA7IHE7IHEgPSBxLT5uZXh0KSB7CiAg ICAgIENNTF9UYWJsZTo6aXRlcmF0b3IgZSA9IHRhYmxlLmZpbmQocS0+d29yZCk7CiAgICAgIGlm IChlLT5yYW5rID09IC0xKSB7CiAgICAgICAgZS0+cmFuayA9IGVudHJpZXMuc2l6ZSgpOwogICAg ICAgIHEtPnJhbmsgPSBlbnRyaWVzLnNpemUoKTsKICAgICAgICBlbnRyaWVzLnB1c2hfYmFjayhl KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBxLT5yYW5rID0gZS0+cmFuazsKICAgICAgfQogICAg ICBpZiAocS0+YWZmKSB7CiAgICAgICAgRXhwYW5zaW9uIHRtcDsKICAgICAgICB0bXAud29yZCA9 IHEtPndvcmQ7CiAgICAgICAgdG1wLmFmZiAgPSBxLT5hZmY7CiAgICAgICAgZXhwYW5zaW9ucy5w dXNoX2JhY2sodG1wKTsKICAgICAgfQogICAgfQoKICAgIHRvX2tlZXBfZXhwLnJlc2l6ZShlbnRy aWVzLnNpemUoKSk7CiAgICAvL2ZvciAoaW50IGkgPSAwOyBpICE9IHRvX2tlZXBfZXhwLnNpemUo KTsgKytpKSB7CiAgICAvLyAgcHJpbnRmKCI+Pj4gJWQgJWRcbiIsIGksIChpbnQpdG9fa2VlcF9l eHBbaV0pOwogICAgLy99CgogICAgLy8gU3RvcmUgdGhlIGV4cGFuc2lvbiBvZiBlYWNoIGJhc2Ug d29yZCBpbiBhIGJpdCB2ZWN0b3IgYW5kCiAgICAvLyBhZGQgaXQgdG8gdGhlIHdvcmtpbmcgc2V0 CiAgICBmb3IgKFZlY3RvcjxFeHBhbnNpb24+OjppdGVyYXRvciBxID0gZXhwYW5zaW9ucy5iZWdp bigpOyAKICAgICAgICAgcSAhPSBleHBhbnNpb25zLmVuZCgpOyAKICAgICAgICAgKytxKQogICAg ewogICAgICBxLT5leHAucmVzaXplKGVudHJpZXMuc2l6ZSgpKTsKICAgICAgZXhwX2J1Zi5yZXNl dCgpOwogICAgICBleHBfbGlzdCA9IGxhbmctPmV4cGFuZChxLT53b3JkLCBxLT5hZmYsIGV4cF9i dWYpOwogICAgICBmb3IgKFdvcmRBZmYgKiBpID0gZXhwX2xpc3Q7IGk7IGkgPSBpLT5uZXh0KSB7 CiAgICAgICAgQ01MX1RhYmxlOjppdGVyYXRvciBlID0gdGFibGUuZmluZChpLT53b3JkKTsKICAg ICAgICBhc3NlcnQoMCA8PSBlLT5yYW5rICYmIGUtPnJhbmsgPCAoaW50KWVudHJpZXMuc2l6ZSgp KTsKICAgICAgICBxLT5leHBbZS0+cmFua10gPSB0cnVlOwogICAgICB9CiAgICAgIHEtPm9yaWdf ZXhwID0gcS0+ZXhwOwogICAgICB3b3JraW5nLnB1c2hfYmFjaygmKnEpOwogICAgfQogICAgCiAg ICB1bnNpZ25lZCBwcmV2X3dvcmtpbmdfc2l6ZSA9IElOVF9NQVg7CgogICAgLy8gVGhpcyBsb29w IHdpbGwgcmVwZWF0IHVudGlsIHRoZSB3b3JraW5nIHNldCBpcyBlbXB0eS4gIFRoaXMKICAgIC8v IHdpbGwgcHJvZHVjZSBvcHRpbXVtIHJlc3VsdHMgaW4gbW9zdCBjYXNlcy4gIE5vbiBvcHRpbXVt CiAgICAvLyByZXN1bHRzIG1heSBiZSBwb3NzaWJsZSBpZiBzdGVwICg0KSBpcyBuZWNlc3Nhcnks IGJ1dCBpbgogICAgLy8gcHJhY3RpY2UgdGhpcyBzdGVwIGlzIHJhcmx5IG5lY2Vzc2FyeS4KICAg IGRvIHsKICAgICAgcHJldl93b3JraW5nX3NpemUgPSB3b3JraW5nLnNpemUoKTsKCiAgICAgIC8v IFNvcnQgdGhlIGxpc3QgYmFzZWQgb24gV29ya2luZ0x0LiAgVGhpcyBpcyBuZWNlc3NhcnkgZXZl cnkKICAgICAgLy8gdGltZSBzaW5jZSB0aGUgZXhwYW5zaW9uIGxpc3QgY2FuIGNoYW5nZS4KICAg ICAgc3RkOjpzb3J0KHdvcmtpbmcuYmVnaW4oKSwgd29ya2luZy5lbmQoKSwgV29ya2luZ0x0KCkp OwoKICAgICAgLy8gKDEpIEVsaW1pbmF0ZSBhbnkgZWxlbWVudHMgd2hpY2ggYXJlIGEgc3Vic2V0 IG9mIG90aGVycwogICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHdvcmtpbmcuc2l6ZSgp OyArK2kpIHsKICAgICAgICBpZiAoIXdvcmtpbmdbaV0pIGNvbnRpbnVlOwogICAgICAgIGZvciAo dW5zaWduZWQgaiA9IGkgKyAxOyBqICE9IHdvcmtpbmcuc2l6ZSgpOyArK2opIHsKICAgICAgICAg IGlmICghd29ya2luZ1tqXSkgY29udGludWU7CiAgICAgICAgICBpZiAoc3Vic2V0KHdvcmtpbmdb al0tPmV4cCwgd29ya2luZ1tpXS0+ZXhwKSkgewogICAgICAgICAgICB3b3JraW5nW2pdID0gMDsK ICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vICgyKSBNb3ZlIGFueSBlbGVt ZW50cyB3aGljaCBleHBhbmQgdG8gdW5pcXVlIGVudHJlZSAKICAgICAgLy8gaW50byB0aGUgdG9f a2VlcCBsaXN0CiAgICAgIHRvX3JlbW92ZS5jbGVhcigpOwogICAgICBmb3IgKHVuc2lnbmVkIGkg PSAwOyBpICE9IGVudHJpZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICBpbnQgbiA9IC0xOwogICAg ICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogIT0gd29ya2luZy5zaXplKCk7ICsraikgewogICAg ICAgICAgaWYgKHdvcmtpbmdbal0gJiYgd29ya2luZ1tqXS0+ZXhwW2ldKSB7CiAgICAgICAgICAg IGlmIChuID09IC0xKSBuID0gajsKICAgICAgICAgICAgZWxzZSAgICAgICAgIG4gPSAtMjsKICAg ICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG4gPj0gMCkgdG9fcmVtb3ZlLnB1c2hfYmFj ayhuKTsKICAgICAgfQogICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHRvX3JlbW92ZS5z aXplKCk7ICsraSkgewogICAgICAgIHVuc2lnbmVkIG4gPSB0b19yZW1vdmVbaV07CiAgICAgICAg aWYgKCF3b3JraW5nW25dKSBjb250aW51ZTsKICAgICAgICB0b19rZWVwLnB1c2hfYmFjayh3b3Jr aW5nW25dKTsKICAgICAgICBtZXJnZSh0b19rZWVwX2V4cCwgd29ya2luZ1tuXS0+ZXhwKTsKICAg ICAgICB3b3JraW5nW25dID0gMDsKICAgICAgfQoKICAgICAgLy8gKDMpIEVsaW1pbmF0ZSBhbnkg ZWxlbWVudHMgd2hpY2ggYXJlIGEgc3Vic2V0IG9mIGFsbCB0aGUKICAgICAgLy8gZWxlbWVudHMg aW4gdGhlIHRvX2tlZXAgbGlzdAogICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IHdvcmtp bmcuc2l6ZSgpOyArK2kpIHsKICAgICAgICBpZiAod29ya2luZ1tpXSAmJiBzdWJzZXQod29ya2lu Z1tpXS0+ZXhwLCB0b19rZWVwX2V4cCkpIHsKICAgICAgICAgIHdvcmtpbmdbaV0gPSAwOwogICAg ICAgIH0KICAgICAgfQoKICAgICAgLy8gQ29tcGFjdCB0aGUgd29ya2luZyBsaXN0CiAgICAgIHsK ICAgICAgICBpbnQgaSA9IDAsIGogPSAwOwogICAgICAgIHdoaWxlIChqICE9IChpbnQpd29ya2lu Zy5zaXplKCkpIHsKICAgICAgICAgIGlmICh3b3JraW5nW2pdKSB7CiAgICAgICAgICAgIHdvcmtp bmdbaV0gPSB3b3JraW5nW2pdOwogICAgICAgICAgICArK2k7CiAgICAgICAgICB9CiAgICAgICAg ICArK2o7CiAgICAgICAgfQogICAgICAgIHdvcmtpbmcucmVzaXplKGkpOwogICAgICB9CgogICAg ICAvLyAoNCkgSWYgbm9uZSBvZiB0aGUgZW50cmllcyBpbiB3b3JraW5nIGhhdmUgYmVlbiByZW1v dmVkIHZpYQogICAgICAvLyB0aGUgYWJvdmUgbWV0aG9kcyB0aGVuIG1ha2UgYSBncmVlZHkgY2hv aWNlIGFuZCBtb3ZlIHRoZQogICAgICAvLyBmaXJzdCBlbGVtZW50IGludG8gdGhlIHRvX2tlZXAg bGlzdC4KICAgICAgaWYgKHdvcmtpbmcuc2l6ZSgpID4gMCAmJiB3b3JraW5nLnNpemUoKSA9PSBw cmV2X3dvcmtpbmdfc2l6ZSkKICAgICAgewogICAgICAgIHRvX2tlZXAucHVzaF9iYWNrKHdvcmtp bmdbMF0pOwogICAgICAgIC8vQ0VSUi5wcmludGYoIk1ha2luZyBncmVlZHkgY2hvaWNlISBDaG9v c2luZyAlcy8lcy5cbiIsCiAgICAgICAgLy8gICAgICAgICAgICB3b3JraW5nWzBdLT53b3JkLCB3 b3JraW5nWzBdLT5hZmYpOwogICAgICAgIG1lcmdlKHRvX2tlZXBfZXhwLCB3b3JraW5nWzBdLT5l eHApOwogICAgICAgIHdvcmtpbmcuZXJhc2Uod29ya2luZy5iZWdpbigpLCB3b3JraW5nLmJlZ2lu KCkgKyAxKTsKICAgICAgfQoKICAgICAgLy8gKDUpIFRyaW0gdGhlIGV4cGFuc2lvbiBsaXN0IGZv ciBhbnkgZWxlbWVudHMgbGVmdCBpbiB0aGUKICAgICAgLy8gd29ya2luZyBzZXQgYnkgcmVtb3Zp bmcgdGhlIGV4cGFuc2lvbnMgdGhhdCBhbHJlYWR5IGV4aXN0IGluCiAgICAgIC8vIHRoZSB0b19r ZWVwIGxpc3QKICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSB3b3JraW5nLnNpemUoKTsg KytpKSB7CiAgICAgICAgcHVyZ2Uod29ya2luZ1tpXS0+ZXhwLCB0b19rZWVwX2V4cCk7CiAgICAg IH0KCiAgICB9IHdoaWxlICh3b3JraW5nLnNpemUoKSA+IDApOwoKICAgIGlmIChzaW1wbGlmeSkg ewoKICAgICAgLy8gUmVtb3ZlIHVubmVjZXNzYXJ5IGZsYWdzLiAgQSBmbGFnIGlzIHVubmVjZXNz YXJ5IGlmIGl0IGRvZXMKICAgICAgLy8gZG9lcyBub3QgZXhwYW5kIHRvIGFueSBuZXcgd29yZHMs IHRoYXQgaXMgd29yZHMgdGhhdCBhcmUgbm90CiAgICAgIC8vIGFscmVhZHkgY292ZXJlZCBieSBh biBlYXJsaWVyIGVudHJpZXMgaW4gdGhlIGxpc3QuCgogICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw OyBpICE9IHRvX2tlZXAuc2l6ZSgpOyArK2kpIHsKICAgICAgICB0b19rZWVwW2ldLT5leHAgPSB0 b19rZWVwW2ldLT5vcmlnX2V4cDsKICAgICAgfQogICAgIAogICAgICBzdGQ6OnNvcnQodG9fa2Vl cC5iZWdpbigpLCB0b19rZWVwLmVuZCgpLCBXb3JraW5nTHQoKSk7CgogICAgICBzdGQ6OnZlY3Rv cjxib29sPiB0YWxseShlbnRyaWVzLnNpemUoKSk7CiAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+IGJh Y2t1cChlbnRyaWVzLnNpemUoKSk7CiAgICAgIHN0ZDo6dmVjdG9yPGJvb2w+IHdvcmtpbmcoZW50 cmllcy5zaXplKCkpOwogICAgICBTdHJpbmcgZmxhZ3M7CiAgICAgIAogICAgICBmb3IgKHVuc2ln bmVkIGkgPSAwOyBpICE9IHRvX2tlZXAuc2l6ZSgpOyArK2kpIHsKCiAgICAgICAgYmFja3VwID0g dGFsbHk7CgogICAgICAgIG1lcmdlKHRhbGx5LCB0b19rZWVwW2ldLT5leHApOwoKICAgICAgICBT dHJpbmcgZmxhZ3NfdG9fa2VlcCA9IHRvX2tlZXBbaV0tPmFmZjsKICAgICAgICBib29sIHNvbWV0 aGluZ19jaGFuZ2VkOwogICAgICAgIGRvIHsKICAgICAgICAgIHNvbWV0aGluZ19jaGFuZ2VkID0g ZmFsc2U7CiAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqICE9IGZsYWdzX3RvX2tlZXAu c2l6ZSgpOyArK2opIHsKICAgICAgICAgICAgZmxhZ3MuYXNzaWduKGZsYWdzX3RvX2tlZXAuZGF0 YSgpLCBqKTsKICAgICAgICAgICAgZmxhZ3MuYXBwZW5kKGZsYWdzX3RvX2tlZXAuZGF0YShqKzEp LCAKICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzX3RvX2tlZXAuc2l6ZSgpIC0gKGorMSkp OwogICAgICAgICAgICB3b3JraW5nID0gYmFja3VwOwogICAgICAgICAgICBleHBfYnVmLnJlc2V0 KCk7CiAgICAgICAgICAgIGV4cF9saXN0ID0gbGFuZy0+ZXhwYW5kKHRvX2tlZXBbaV0tPndvcmQs IGZsYWdzLCBleHBfYnVmKTsKICAgICAgICAgICAgZm9yIChXb3JkQWZmICogcSA9IGV4cF9saXN0 OyBxOyBxID0gcS0+bmV4dCkgewogICAgICAgICAgICAgIENNTF9UYWJsZTo6aXRlcmF0b3IgZSA9 IHRhYmxlLmZpbmQocS0+d29yZCk7CiAgICAgICAgICAgICAgd29ya2luZ1tlLT5yYW5rXSA9IHRy dWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHdvcmtpbmcgPT0gdGFsbHkpIHsKICAg ICAgICAgICAgICBmbGFnc190b19rZWVwID0gZmxhZ3M7CiAgICAgICAgICAgICAgc29tZXRoaW5n X2NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAg ICAgICB9CiAgICAgICAgfSB3aGlsZSAoc29tZXRoaW5nX2NoYW5nZWQpOwoKICAgICAgICBpZiAo ZmxhZ3NfdG9fa2VlcCAhPSB0b19rZWVwW2ldLT5hZmYpIHsKICAgICAgICAgIG1lbWNweSh0b19r ZWVwW2ldLT5hZmYsIGZsYWdzX3RvX2tlZXAuc3RyKCksIGZsYWdzX3RvX2tlZXAuc2l6ZSgpICsg MSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgfQoKICAgIC8vIEZpbmFsbHkgcHJpbnQg dGhlIHJlc3VsdGluZyBsaXN0CgogICAgLy9wcmludGYoIlhYWCAlZCAlZFxuIiwgdG9fa2VlcC5z aXplKCksIHRvX2tlZXBfZXhwLnNpemUoKSk7CiAgICAvL2ZvciAoaW50IGkgPSAwOyBpICE9IHRv X2tlZXBfZXhwLnNpemUoKTsgKytpKSB7CiAgICAvLyAgcHJpbnRmKCI+Pj4gJWQgJWRcbiIsIGks IChpbnQpdG9fa2VlcF9leHBbaV0pOwogICAgLy99CgogICAgZm9yICh1bnNpZ25lZCBpID0gMDsg aSAhPSB0b19rZWVwLnNpemUoKTsgKytpKSB7CiAgICAgIENPVVQgPDwgb2NvbnYodG9fa2VlcFtp XS0+d29yZCk7CiAgICAgIGlmICh0b19rZWVwW2ldLT5hZmZbMF0pIHsKICAgICAgICBDT1VUIDw8 ICcvJzsKICAgICAgICBDT1VUIDw8IG9jb252KHRvX2tlZXBbaV0tPmFmZik7CiAgICAgIH0KICAg ICAgQ09VVCA8PCAnXG4nOwogICAgfQogICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSB0b19r ZWVwX2V4cC5zaXplKCk7ICsraSkgewogICAgICBpZiAoIXRvX2tlZXBfZXhwW2ldKSB7CiAgICAg ICAgYXNzZXJ0KCFlbnRyaWVzW2ldLT5hZmYpOwogICAgICAgIENPVVQucHJpbnRmKCIlc1xuIiwg b2NvbnYoZW50cmllc1tpXS0+d29yZCkpOwogICAgICB9CiAgICB9CiAgfQoKICBwID0gdGFibGUu YmVnaW4oKTsKICBmb3IgKDsgcCAhPSBlbmQ7ICsrcCkgCiAgewogICAgaWYgKHAtPmFmZikgZnJl ZShwLT5hZmYpOwogICAgcC0+YWZmID0gMDsKICB9Cn0KCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLwovLwovLyBkdW1wIGFmZml4Ci8vCgp2b2lkIGR1bXBfYWZmaXgoKQp7CiAgRlN0cmVhbSBp bjsKICBFWElUX09OX0VSUihhc3BlbGxlcjo6b3Blbl9hZmZpeF9maWxlKCpvcHRpb25zLCBpbikp OwogIAogIFN0cmluZyBsaW5lOwogIHdoaWxlIChpbi5nZXRsaW5lKGxpbmUpKQogICAgQ09VVCA8 PCBsaW5lIDw8ICdcbic7Cn0KCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgovLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8KLy8KLy8gcHJpbnRfaGVscAovLwoKdm9pZCBwcmludF9oZWxwX2xpbmUoY2hhciBh YnJ2LCBjaGFyIGRvbnRfYWJydiwgY29uc3QgY2hhciAqIG5hbWUsIAoJCSAgICAgS2V5SW5mb1R5 cGUgdHlwZSwgY29uc3QgY2hhciAqIGRlc2MsIGJvb2wgbm9fZG9udCA9IGZhbHNlKSAKewogIFN0 cmluZyBjb21tYW5kOwogIGlmIChhYnJ2ICE9ICdcMCcpIHsKICAgIGNvbW1hbmQgKz0gJy0nOwog ICAgY29tbWFuZCArPSBhYnJ2OwogICAgaWYgKGRvbnRfYWJydiAhPSAnXDAnKSB7CiAgICAgIGNv bW1hbmQgKz0gJ3wnOwogICAgICBjb21tYW5kICs9ICctJzsKICAgICAgY29tbWFuZCArPSBkb250 X2FicnY7CiAgICB9CiAgICBjb21tYW5kICs9ICcsJzsKICB9CiAgY29tbWFuZCArPSAiLS0iOwog IGlmICh0eXBlID09IEtleUluZm9Cb29sICYmICFub19kb250KSBjb21tYW5kICs9ICJbZG9udC1d IjsKICBpZiAodHlwZSA9PSBLZXlJbmZvTGlzdCkgY29tbWFuZCArPSAiYWRkfHJlbS0iOwogIGNv bW1hbmQgKz0gbmFtZTsKICBpZiAodHlwZSA9PSBLZXlJbmZvU3RyaW5nIHx8IHR5cGUgPT0gS2V5 SW5mb0xpc3QpIAogICAgY29tbWFuZCArPSAiPTxzdHI+IjsKICBpZiAodHlwZSA9PSBLZXlJbmZv SW50KQogICAgY29tbWFuZCArPSAiPTxpbnQ+IjsKICBjb25zdCBjaGFyICogdGRlc2MgPSBfKGRl c2MpOwogIGNoYXIgYnVmWzEyMF07CiAgaW50IGxlbiA9IHNucHJpbnRmKGJ1ZiwgMTIwLCAiICAl LTI3cyIsIGNvbW1hbmQuY19zdHIoKSk7CiAgaWYgKGxlbiA9PSAyOSkKICAgIHByaW50ZigiJXMg JXNcbiIsIGJ1ZiwgdGRlc2MpOwogIGVsc2UKICAgIHByaW50ZigiJXNcbiUzMHMlc1xuIiwgYnVm LCAiIiwgdGRlc2MpOwp9CgpuYW1lc3BhY2UgYWNvbW1vbiB7CiAgUG9zaWJFcnI8Q29uZmlnTW9k dWxlICo+IGdldF9keW5hbWljX2ZpbHRlcihDb25maWcgKiBjb25maWcsIFBhcm1TdHIgdmFsdWUp Owp9CgpzdGF0aWMgY29uc3QgY2hhciAqIHVzYWdlX3RleHRbXSA9IAp7CiAgLyogVFJBTlNMQVRP UlM6IFRoZXNlIHNob3VsZCBhbGwgYmUgZm9ybWF0ZWQgdG8gZml0IGluIDgwIGNvbHVtbiBvcgog ICAgIGxlc3MgKi8KICBOXygiVXNhZ2U6IGFzcGVsbCBbb3B0aW9uc10gPGNvbW1hbmQ+IiksCiAg Tl8oIjxjb21tYW5kPiBpcyBvbmUgb2Y6IiksCiAgTl8oIiAgLT98dXNhZ2UgICAgICAgICBkaXNw bGF5IGEgYnJpZWYgdXNhZ2UgbWVzc2FnZSIpLAogIE5fKCIgIGhlbHAgICAgICAgICAgICAgZGlz cGxheSBhIGRldGFpbGVkIGhlbHAgbWVzc2FnZSIpLAogIE5fKCIgIC1jfGNoZWNrIDxmaWxlPiAg c3BlbGxjaGVja3MgYSBmaWxlIiksCiAgTl8oIiAgLWF8cGlwZSAgICAgICAgICBcImlzcGVsbCAt YVwiIGNvbXBhdGliaWxpdHkgbW9kZSIpLAogIE5fKCIgIFtkdW1wXSBjb25maWcgICAgZHVtcHMg dGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byBzdGRvdXQiKSwKICBOXygiICBjb25maWcgPGtl eT4gICAgIHByaW50cyB0aGUgY3VycmVudCB2YWx1ZSBvZiBhbiBvcHRpb24iKSwKICBOXygiICBb ZHVtcF0gZGljdHMgfCBmaWx0ZXJzIHwgbW9kZXMiKSwKICBOXygiICAgIGxpc3RzIGF2YWlsYWJs ZSBkaWN0aW9uYXJpZXMgLyBmaWx0ZXJzIC8gZmlsdGVyIG1vZGVzIiksCiAgTl8oIltvcHRpb25z XSBpcyBhbnkgb2YgdGhlIGZvbGxvd2luZzoiKQp9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgdXNh Z2VfdGV4dF9zaXplID0gc2l6ZW9mKHVzYWdlX3RleHQpL3NpemVvZihjb25zdCBjaGFyICopOwoK c3RhdGljIGNvbnN0IGNoYXIgKiBoZWxwX3RleHRbXSA9IAp7CiAgdXNhZ2VfdGV4dFswXSwKICAi IiwKICB1c2FnZV90ZXh0WzFdLAogIHVzYWdlX3RleHRbMl0sCiAgdXNhZ2VfdGV4dFszXSwKICB1 c2FnZV90ZXh0WzRdLAogIHVzYWdlX3RleHRbNV0sCiAgTl8oIiAgbGlzdCAgICAgICAgICAgICBw cm9kdWNlIGEgbGlzdCBvZiBtaXNzcGVsbGVkIHdvcmRzIGZyb20gc3RhbmRhcmQgaW5wdXQiKSwK ICB1c2FnZV90ZXh0WzZdLAogIHVzYWdlX3RleHRbN10sCiAgTl8oIiAgc291bmRzbGlrZSAgICAg ICByZXR1cm5zIHRoZSBzb3VuZHMgbGlrZSBlcXVpdmFsZW50IGZvciBlYWNoIHdvcmQgZW50ZXJl ZCIpLAogIE5fKCIgIG11bmNoICAgICAgICAgICAgZ2VuZXJhdGUgcG9zc2libGUgcm9vdCB3b3Jk cyBhbmQgYWZmaXhlcyIpLAogIE5fKCIgIGV4cGFuZCBbMS00XSAgICAgZXhwYW5kcyBhZmZpeCBm bGFncyIpLAogIE5fKCIgIGNsZWFuIFtzdHJpY3RdICAgY2xlYW5zIGEgd29yZCBsaXN0IHNvIHRo YXQgZXZlcnkgbGluZSBpcyBhIHZhbGlkIHdvcmQiKSwKICBOXygiICBmaWx0ZXIgICAgICAgICAg IGZpbHRlcnMgaW5wdXQgYXMgaWYgaXQgd2FzIGJlaW5nIHNwZWxsY2hlY2tlZCIpLAogIE5fKCIg IC12fHZlcnNpb24gICAgICAgcHJpbnRzIGEgdmVyc2lvbiBsaW5lIiksCiAgTl8oIiAgbXVuY2gt bGlzdCBbc2ltcGxlXSBbc2luZ2xlfG11bHRpXSBba2VlcF0iKSwKICBOXygiICAgIHJlZHVjZSB0 aGUgc2l6ZSBvZiBhIHdvcmQgbGlzdCB2aWEgYWZmaXggY29tcHJlc3Npb24iKSwKICBOXygiICBj b252IDxmcm9tPiA8dG8+IFs8bm9ybS1mb3JtPl0iKSwKICBOXygiICAgIGNvbnZlcnRzIGZyb20g b25lIGVuY29kaW5nIHRvIGFub3RoZXIiKSwKICBOXygiICBub3JtICg8bm9ybS1tYXA+IHwgPGZy b20+IDxub3JtLW1hcD4gPHRvPikgWzxub3JtLWZvcm0+XSIpLAogIE5fKCIgICAgcGVyZm9ybSBV bmljb2RlIG5vcm1hbGl6YXRpb24iKSwKICB1c2FnZV90ZXh0WzhdLAogIHVzYWdlX3RleHRbOV0s CiAgTl8oIiAgZHVtcHxjcmVhdGV8bWVyZ2UgbWFzdGVyfHBlcnNvbmFsfHJlcGwgWzxuYW1lPl0i KSwKICBOXygiICAgIGR1bXBzLCBjcmVhdGVzIG9yIG1lcmdlcyBhIG1hc3RlciwgcGVyc29uYWws IG9yIHJlcGxhY2VtZW50IGRpY3Rpb25hcnkuIiksCiAgIiIsCiAgLyogVFJBTlNMQVRPUlM6ICJu b25lIiwgImludGVybmFsIiBhbmQgInN0cmljdCIgYXJlIGxpdGVyYWwgdmFsdWVzCiAgICAgYW5k IHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZC4gKi8KICBOXygiICA8bm9ybS1mb3JtPiAgICAgIG5v cm1hbGl6YXRpb24gZm9ybSB0byB1c2UsIGVpdGhlciBub25lLCBpbnRlcm5hbCwgb3Igc3RyaWN0 IiksCiAgIiIsCiAgdXNhZ2VfdGV4dFsxMF0sCiAgIiIKfTsKc3RhdGljIGNvbnN0IHVuc2lnbmVk IGhlbHBfdGV4dF9zaXplID0gc2l6ZW9mKGhlbHBfdGV4dCkvc2l6ZW9mKGNvbnN0IGNoYXIgKik7 Cgp2b2lkIHByaW50X2hlbHAgKGJvb2wgdmVyYm9zZSkgewogIGxvYWRfYWxsX2ZpbHRlcnMob3B0 aW9ucyk7CiAgaWYgKHZlcmJvc2UpIHsKICAgIHByaW50ZihfKCJcbiIKICAgICAgICAgICAgICJB c3BlbGwgJXMuICBDb3B5cmlnaHQgMjAwMC0yMDIzIGJ5IEtldmluIEF0a2luc29uLlxuIgogICAg ICAgICAgICAgIlxuIiksIGFzcGVsbF92ZXJzaW9uX3N0cmluZygpKTsKICAgIGZvciAodW5zaWdu ZWQgaSA9IDA7IGkgPCBoZWxwX3RleHRfc2l6ZTsgKytpKQogICAgICBwdXRzKGd0XyhoZWxwX3Rl eHRbaV0pKTsKICB9IGVsc2UgewogICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHVzYWdlX3Rl eHRfc2l6ZTsgKytpKQogICAgICBwdXRzKGd0Xyh1c2FnZV90ZXh0W2ldKSk7CiAgfQogIFN0YWNr UHRyPEtleUluZm9FbnVtZXJhdGlvbj4gZWxzKG9wdGlvbnMtPnBvc3NpYmxlX2VsZW1lbnRzKHRy dWUsZmFsc2UpKTsKICBjb25zdCBLZXlJbmZvICogazsKICB3aGlsZSAoayA9IGVscy0+bmV4dCgp LCBrKSB7CiAgICBpZiAoay0+ZGVzYyA9PSAwIHx8IGstPmZsYWdzICYgS0VZSU5GT19ISURERU4p IGNvbnRpbnVlOwogICAgaWYgKCF2ZXJib3NlICYmICEoay0+ZmxhZ3MgJiBLRVlJTkZPX0NPTU1P TikpIGNvbnRpbnVlOwogICAgY29uc3QgUG9zc2libGVPcHRpb24gKiBvID0gZmluZF9vcHRpb24o ay0+bmFtZSk7CiAgICBjb25zdCBjaGFyICogbmFtZSA9IGstPm5hbWU7CiAgICBwcmludF9oZWxw X2xpbmUoby0+YWJydiwgCgkJICAgIHN0cm5jbXAoKG8rMSktPm5hbWUsICJkb250LSIsIDUpID09 IDAgPyAobysxKS0+YWJydiA6ICdcMCcsCgkJICAgIG5hbWUsIGstPnR5cGUsIGstPmRlc2MpOwog ICAgaWYgKHZlcmJvc2UgJiYgc3RyY21wKG5hbWUsICJtb2RlIikgPT0gMCkgewogICAgICBmb3Ig KGNvbnN0IE1vZGVBYnJ2ICogaiA9IG1vZGVfYWJydnM7CiAgICAgICAgICAgaiAhPSBtb2RlX2Fi cnZzX2VuZDsKICAgICAgICAgICArK2opCiAgICAgIHsKICAgICAgICBwcmludF9oZWxwX2xpbmUo ai0+YWJydiwgJ1wwJywgai0+bW9kZSwgS2V5SW5mb0Jvb2wsIGotPmRlc2MsIHRydWUpOwogICAg ICB9CiAgICB9CiAgfQoKICBpZiAodmVyYm9zZSkgewogICAgLy8KICAgIHB1dGNoYXIoJ1xuJyk7 CiAgICBwdXRjaGFyKCdcbicpOwogICAgcHV0cygKICAgICAgXygiQXZhaWxhYmxlIERpY3Rpb25h cmllczpcbiIKICAgICAgICAiICAgIERpY3Rpb25hcmllcyBjYW4gYmUgc2VsZWN0ZWQgZGlyZWN0 bHkgdmlhIHRoZSBcIi1kXCIgb3IgXCJtYXN0ZXJcIlxuIgogICAgICAgICIgICAgb3B0aW9uLiAg VGhleSBjYW4gYWxzbyBiZSBzZWxlY3RlZCBpbmRpcmVjdGx5IHZpYSB0aGUgXCJsYW5nXCIsXG4i CiAgICAgICAgIiAgICBcInZhcmlldHlcIiwgYW5kIFwic2l6ZVwiIG9wdGlvbnMuXG4iKSk7CiAg ICAKICAgIGNvbnN0IERpY3RJbmZvTGlzdCAqIGRsaXN0ID0gZ2V0X2RpY3RfaW5mb19saXN0KG9w dGlvbnMpOwogICAgCiAgICBTdGFja1B0cjxEaWN0SW5mb0VudW1lcmF0aW9uPiBkZWxzKGRsaXN0 LT5lbGVtZW50cygpKTsKICAgIAogICAgY29uc3QgRGljdEluZm8gKiBlbnRyeTsKICAgIAogICAg d2hpbGUgKCAoZW50cnkgPSBkZWxzLT5uZXh0KCkpICE9IDApIAogICAgewogICAgICBwcmludGYo IiAgJXNcbiIsIGVudHJ5LT5uYW1lKTsKICAgIH0KCgogICAgLy8KICAgIHB1dGNoYXIoJ1xuJyk7 CiAgICBwdXRjaGFyKCdcbicpOwogICAgZnB1dHMoCiAgICAgIF8oIkF2YWlsYWJsZSBGaWx0ZXJz IChhbmQgYXNzb2NpYXRlZCBvcHRpb25zKTpcbiIKICAgICAgICAiICAgIEZpbHRlcnMgY2FuIGJl IGFkZGVkIG9yIHJlbW92ZWQgdmlhIHRoZSBcImZpbHRlclwiIG9wdGlvbi5cbiIpLAogICAgICBz dGRvdXQpOwogICAgZm9yIChWZWN0b3I8Q29uZmlnTW9kdWxlPjo6Y29uc3RfaXRlcmF0b3IgbSA9 IG9wdGlvbnMtPmZpbHRlcl9tb2R1bGVzLmJlZ2luKCk7CiAgICAgICAgIG0gIT0gb3B0aW9ucy0+ ZmlsdGVyX21vZHVsZXMuZW5kKCk7CiAgICAgICAgICsrbSkKICAgIHsKICAgICAgcHJpbnRmKF8o IlxuICAlcyBmaWx0ZXI6ICVzXG4iKSwgbS0+bmFtZSwgZ3RfKG0tPmRlc2MpKTsKICAgICAgZm9y IChrID0gbS0+YmVnaW47IGsgIT0gbS0+ZW5kOyArK2spIHsKICAgICAgICBjb25zdCBQb3NzaWJs ZU9wdGlvbiAqIG8gPSBmaW5kX29wdGlvbihrLT5uYW1lKTsKICAgICAgICBjb25zdCBjaGFyICog bmFtZSA9IGstPm5hbWU7CiAgICAgICAgY29uc3QgS2V5SW5mbyAqIG9rID0gb3B0aW9ucy0+a2V5 aW5mbyhuYW1lICsgMik7CiAgICAgICAgaWYgKGsgPT0gb2spIG5hbWUgKz0gMjsKICAgICAgICBw cmludF9oZWxwX2xpbmUoby0+YWJydiwgCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jbXAo KG8rMSktPm5hbWUsICJkb250LSIsIDUpID09IDAgPyAobysxKS0+YWJydiA6ICdcMCcsCiAgICAg ICAgICAgICAgICAgICAgICAgIG5hbWUsIGstPnR5cGUsIGstPmRlc2MpOwogICAgICB9CiAgICB9 CgogICAgLy8KICAgIHB1dGNoYXIoJ1xuJyk7CiAgICBwdXRjaGFyKCdcbicpOwogICAgcHV0cygg IAogICAgICAvKiBUUkFOU0xBVE9SUzogVGhpcyBzaG91bGQgYmUgZm9ybWF0ZWQgdG8gZml0IGlu IDgwIGNvbHVtbiBvciBsZXNzICovCiAgICAgIF8oIkF2YWlsYWJsZSBGaWx0ZXIgTW9kZXM6XG4i CiAgICAgICAgIiAgICBGaWx0ZXIgTW9kZXMgYXJlIHJlY29uZmlndXJlZCBjb21iaW5hdGlvbnMg b2YgZmlsdGVycyBvcHRpbWl6ZWQgZm9yXG4iCiAgICAgICAgIiAgICBmaWxlcyBvZiBhIHNwZWNp ZmljIHR5cGUuIEEgbW9kZSBpcyBzZWxlY3RlZCB2aWEgdGhlIFwibW9kZVwiIG9wdGlvbi5cbiIK ICAgICAgICAiICAgIFRoaXMgd2lsbCBoYXBwZW4gaW1wbGljaXRseSBpZiBBc3BlbGwgaXMgYWJs ZSB0byBpZGVudGlmeSB0aGUgZmlsZVxuIgogICAgICAgICIgICAgdHlwZSBmcm9tIHRoZSBleHRl bnNpb24sIGFuZCBwb3NzaWJpbGl0eSB0aGUgY29udGVudHMsIG9mIHRoZSBmaWxlLlxuIikpOwog ICAgCiAgICBFWElUX09OX0VSUl9TRVQoYXZhaWxhYmxlX2ZpbHRlcl9tb2RlcyhvcHRpb25zKSwg U3RyaW5nUGFpckVudW1lcmF0aW9uICosIGVscyk7CiAgICBTdHJpbmdQYWlyIHNwOwogICAgd2hp bGUgKCFlbHMtPmF0X2VuZCgpKSB7CiAgICAgIHNwID0gZWxzLT5uZXh0KCk7CiAgICAgIHByaW50 ZigiICAlLTE0cyAlc1xuIiwgc3AuZmlyc3QsIGd0XyhzcC5zZWNvbmQpKTsKICAgIH0KICAgIGRl bGV0ZSBlbHM7CiAgfQp9Cgo= --_004_DBBP194MB1098F8898B7994A7BAEB9AE48490ADBBP194MB1098EURP_--