Re: Build dlz_ldap_driver under Windows

Roman Volkov <[email protected]> Thu, 20 Jun 2013 22:46:51 +1000
Newsgroups gmane.network.dns.bind9.dlz
Message-ID <CADkhqTn=UYTCedzZSUA-mfMV_RX1agJdzeEWf+a6A4zdH6H14Q@mail.gmail.com>
--047d7b6dcf5220190004df9557f0
Content-Type: multipart/alternative; boundary=047d7b6dcf522018fd04df9557ee

--047d7b6dcf522018fd04df9557ee
Content-Type: text/plain; charset=ISO-8859-1

Hi Evan,

I successfully built old dlz-ldap driver (which should be compiled into
bind) without OpenLDAP library (OpenLDAP doesn't support native windows
build for several years already, this was a real pain, only with cygwin or
mingw evironment).
I patched dlz_ldap_driver.c to use native Windows WinLDAP which is
available in every Windows (at least on my Win 7). Also I was able to build
named+dlz-ldap natively under Windows with Visual Studio Express. It works
- I tested several direct and reverse zones and AXFR calls with dlz-ldap
(with openldap as a server).
Changes only in dlz_ldap_driver.c, to enable it you need to install
pre-processor directives /D DLZ /D DLZ_LDAP /D CONTRIB_DLZ
Code is ugly, I had to copy several functions from openldap library.
Don't wish to spend too much time for deprecated branch, will try to repeat
all the same for bind 10 and for dynamically loadable dlz.

But may be somebody will find this file useful.

Regards,
Roman

--047d7b6dcf522018fd04df9557ee
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Hi Evan,<div><br></div><div>I successfully built old dlz-l=
dap driver (which should be compiled into bind) without OpenLDAP library (O=
penLDAP doesn&#39;t support native windows build for several years already,=
 this was a real pain, only with cygwin or mingw evironment).</div>
<div>I patched dlz_ldap_driver.c to use native Windows WinLDAP which is ava=
ilable in every Windows (at least on my Win 7). Also I was able to build na=
med+dlz-ldap natively under Windows with Visual Studio Express. It works - =
I tested several direct and reverse zones and AXFR calls with dlz-ldap (wit=
h openldap as a server).</div>
<div><div class=3D"gmail_extra" style>Changes only in dlz_ldap_driver.c, to=
 enable it you need to install pre-processor directives /D DLZ /D DLZ_LDAP =
/D CONTRIB_DLZ
</div></div><div class=3D"gmail_extra" style>Code is ugly, I had to copy se=
veral functions from openldap library.</div><div class=3D"gmail_extra" styl=
e>Don&#39;t wish to spend too much time for deprecated branch, will try to =
repeat all the same for bind 10 and for dynamically loadable dlz.</div>
<div class=3D"gmail_extra" style><br></div><div class=3D"gmail_extra" style=
>But may be somebody will find this file useful.</div><div class=3D"gmail_e=
xtra" style><br></div><div class=3D"gmail_extra" style>Regards,</div><div c=
lass=3D"gmail_extra" style>
Roman</div><div class=3D"gmail_extra"><br></div></div>

--047d7b6dcf522018fd04df9557ee--
--047d7b6dcf5220190004df9557f0
Content-Type: text/x-csrc; charset=US-ASCII; name="dlz_ldap_driver.c"
Content-Disposition: attachment; filename="dlz_ldap_driver.c"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_hi5xlt460

LyoNCiAqIENvcHlyaWdodCAoQykgMjAwMiBTdGljaHRpbmcgTkxuZXQsIE5ldGhlcmxhbmRzLCBz
dGljaHRpbmdAbmxuZXQubmwuDQogKg0KICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlm
eSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogKiBwdXJwb3NlIHdpdGgg
b3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlDQogKiBh
Ym92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBp
biBhbGwNCiAqIGNvcGllcy4NCiAqDQogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElT
IiBBTkQgU1RJQ0hUSU5HIE5MTkVUDQogKiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBS
RUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMDQogKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTA0KICog
U1RJQ0hUSU5HIE5MTkVUIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJF
Q1QsIE9SDQogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZF
UiBSRVNVTFRJTkcgRlJPTSBMT1NTDQogKiBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhF
UiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UNCiAqIE9SIE9USEVSIFRPUlRJ
T1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQ0KICog
VVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuDQogKg0KICogVGhlIGRldmVsb3Bt
ZW50IG9mIER5bmFtaWNhbGx5IExvYWRhYmxlIFpvbmVzIChETFopIGZvciBCSU5EIDkgd2FzDQog
KiBjb25jZWl2ZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IFJvYiBCdXRsZXIuDQogKg0KICogUGVybWlz
c2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBm
b3IgYW55DQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQs
IHByb3ZpZGVkIHRoYXQgdGhlDQogKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBl
cm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwNCiAqIGNvcGllcy4NCiAqDQogKiBUSEUgU09G
VFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgUk9CIEJVVExFUg0KICogRElTQ0xBSU1TIEFM
TCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTA0K
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4g
Tk8gRVZFTlQgU0hBTEwNCiAqIFJPQiBCVVRMRVIgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwg
RElSRUNULCBJTkRJUkVDVCwgT1INCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFN
QUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MNCiAqIE9GIFVTRSwgREFUQSBPUiBQ
Uk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRQ0KICog
T1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9O
IFdJVEggVEhFDQogKiBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAqLw0K
DQovKg0KICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEludGVybmV0IFNvZnR3YXJlIENvbnNv
cnRpdW0uDQogKg0KICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3Ry
aWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBm
ZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlDQogKiBjb3B5cmln
aHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVz
Lg0KICoNCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBT
T0ZUV0FSRSBDT05TT1JUSVVNDQogKiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdB
UkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMDQogKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTA0KICogSU5U
RVJORVQgU09GVFdBUkUgQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJF
Q1QsDQogKiBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VT
IFdIQVRTT0VWRVIgUkVTVUxUSU5HDQogKiBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJ
VFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULA0KICogTkVHTElHRU5DRSBPUiBP
VEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04NCiAq
IFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICovDQoNCiNp
ZmRlZiBETFpfTERBUA0KDQojaW5jbHVkZSA8Y29uZmlnLmg+DQojaW5jbHVkZSA8c3RkaW8uaD4N
CiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxhc3Nl
cnQuaD4NCg0KI2luY2x1ZGUgPGRucy9sb2cuaD4NCiNpbmNsdWRlIDxkbnMvc2Rsei5oPg0KI2lu
Y2x1ZGUgPGRucy9yZXN1bHQuaD4NCg0KI2luY2x1ZGUgPGlzYy9tZW0uaD4NCiNpbmNsdWRlIDxp
c2MvcGxhdGZvcm0uaD4NCiNpbmNsdWRlIDxpc2MvcHJpbnQuaD4NCiNpbmNsdWRlIDxpc2MvcmVz
dWx0Lmg+DQojaW5jbHVkZSA8aXNjL3N0cmluZy5oPg0KI2luY2x1ZGUgPGlzYy91dGlsLmg+DQoN
CiNpbmNsdWRlIDxuYW1lZC9nbG9iYWxzLmg+DQoNCiNpbmNsdWRlIDxkbHovc2Rsel9oZWxwZXIu
aD4NCiNpbmNsdWRlIDxkbHovZGx6X2xkYXBfZHJpdmVyLmg+DQoNCi8qDQogKiBOZWVkIG9sZGVy
IEFQSSBmdW5jdGlvbnMgZnJvbSBsZGFwLmguDQogKi8NCiNkZWZpbmUgTERBUF9ERVBSRUNBVEVE
IDENCg0KI2lmZGVmIF9XSU4zMg0KI2luY2x1ZGUgIndpbmRvd3MuaCINCiNpbmNsdWRlICJ3aW5s
ZGFwLmgiDQojaW5jbHVkZSAid2luYmVyLmgiDQojZGVmaW5lIHRpbWV2YWwgbF90aW1ldmFsDQp0
eXBlZGVmIFVMT05HIGxkYXBpX3Q7DQoNCi8vdHlwZWRlZiBzdHJ1Y3QgYmVydmFsIHsKLy8JYmVy
X2xlbl90CWJ2X2xlbjsKLy8JY2hhcgkJKmJ2X3ZhbDsKLy99IEJlclZhbHVlOwovL3R5cGVkZWYg
QmVyVmFsdWUgKkJlclZhcnJheTsJLyogVG8gZGlzdGluZ3Vpc2ggZnJvbSBhIHNpbmdsZSBidiAq
Lw0KDQoNCnR5cGVkZWYgc3RydWN0IGxkYXBfdXJsX2Rlc2Mgew0KICAgIGNoYXIgKiAgICAgIGx1
ZF9zY2hlbWU7ICAgICAvKiBVUkkgc2NoZW1lICovDQogICAgY2hhciAqICAgICAgbHVkX2hvc3Q7
ICAgICAgIC8qIExEQVAgaG9zdCB0byBjb250YWN0ICovDQogICAgaW50ICAgICAgICAgbHVkX3Bv
cnQ7ICAgICAgIC8qIHBvcnQgb24gaG9zdCAqLw0KICAgIGNoYXIgKiAgICAgIGx1ZF9kbjsgICAg
ICAgICAvKiBiYXNlIGZvciBzZWFyY2ggKi8NCiAgICBjaGFyICoqICAgICBsdWRfYXR0cnM7ICAg
ICAgLyogbGlzdCBvZiBhdHRyaWJ1dGVzICovDQogICAgaW50ICAgICAgICAgbHVkX3Njb3BlOyAg
ICAgIC8qIGEgTERBUF9TQ09QRV8uLi4gdmFsdWUgKi8NCiAgICBjaGFyICogICAgICBsdWRfZmls
dGVyOyAgICAgLyogTERBUCBzZWFyY2ggZmlsdGVyICovDQogICAgY2hhciAqKiAgICAgbHVkX2V4
dHM7ICAgICAgIC8qIExEQVAgZXh0ZW5zaW9ucyAqLw0KICAgIGludCAgICAgICAgIGx1ZF9jcml0
X2V4dHM7ICAvKiB0cnVlIGlmIGFueSBleHRlbnNpb24gaXMgY3JpdGljYWwgKi8NCiAgICAvKiBt
YXkgY29udGFpbiBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgaW50ZXJuYWwgdXNlICovDQp9IExEQVBV
UkxEZXNjOw0KI2RlZmluZSBMREFQX0FVVEhfS1JCVjQxIDk5DQojZGVmaW5lIExEQVBfQVVUSF9L
UkJWNDIgOTkNCg0KI2RlZmluZSBMREFQX1VSTF9TVUNDRVNTCQkweDAwCS8qIFN1Y2Nlc3MgKi8N
CiNkZWZpbmUgTERBUF9VUkxfRVJSX01FTQkJMHgwMQkvKiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkg
c3BhY2UgKi8NCiNkZWZpbmUgTERBUF9VUkxfRVJSX1BBUkFNCQkweDAyCS8qIHBhcmFtZXRlciBp
cyBiYWQgKi8NCg0KI2RlZmluZSBMREFQX1VSTF9FUlJfQkFEU0NIRU1FCTB4MDMJLyogVVJMIGRv
ZXNuJ3QgYmVnaW4gd2l0aCAibGRhcFtzaV06Ly8iICovDQojZGVmaW5lIExEQVBfVVJMX0VSUl9C
QURFTkNMT1NVUkUgMHgwNAkvKiBVUkwgaXMgbWlzc2luZyB0cmFpbGluZyAiPiIgKi8NCiNkZWZp
bmUgTERBUF9VUkxfRVJSX0JBRFVSTAkJMHgwNQkvKiBVUkwgaXMgYmFkICovDQojZGVmaW5lIExE
QVBfVVJMX0VSUl9CQURIT1NUCTB4MDYJLyogaG9zdCBwb3J0IGlzIGJhZCAqLw0KI2RlZmluZSBM
REFQX1VSTF9FUlJfQkFEQVRUUlMJMHgwNwkvKiBiYWQgKG9yIG1pc3NpbmcpIGF0dHJpYnV0ZXMg
Ki8NCiNkZWZpbmUgTERBUF9VUkxfRVJSX0JBRFNDT1BFCTB4MDgJLyogc2NvcGUgc3RyaW5nIGlz
IGludmFsaWQgKG9yIG1pc3NpbmcpICovDQojZGVmaW5lIExEQVBfVVJMX0VSUl9CQURGSUxURVIJ
MHgwOQkvKiBiYWQgb3IgbWlzc2luZyBmaWx0ZXIgKi8NCiNkZWZpbmUgTERBUF9VUkxfRVJSX0JB
REVYVFMJMHgwYQkvKiBiYWQgb3IgbWlzc2luZyBleHRlbnNpb25zICovDQoNCiNkZWZpbmUgU1RS
TEVOT0YocykJKHNpemVvZihzKS0xKQ0KDQoNCnZvaWQgKg0KYmVyX21lbWFsbG9jX3goIGJlcl9s
ZW5fdCBzLCB2b2lkICpjdHggKQ0Kew0KCXZvaWQgKm5uZXc7DQoJbm5ldyA9IG1hbGxvYyhzKTsN
CglyZXR1cm4gbm5ldzsNCn0NCg0Kdm9pZCAqDQogYmVyX21lbWNhbGxvY194KCBiZXJfbGVuX3Qg
biwgYmVyX2xlbl90IHMsIHZvaWQgKmN0eCkNCiAgew0KICAgICAgdm9pZCAqbm5ldzsNCgkgIG5u
ZXcgPSBjYWxsb2MoIG4sIHMgKTsNCiAgICAgIHJldHVybiBubmV3Ow0KICB9DQojZGVmaW5lIFNB
RkVNRU1DUFkoIGQsIHMsIG4gKSAJbWVtbW92ZSgoZCksIChzKSwgKG4pKQ0KI2RlZmluZSBBQ19N
RU1DUFkoIGQsIHMsIG4gKSAoU0FGRU1FTUNQWSgoZCksKHMpLChuKSkpDQpjaGFyICoKYmVyX3N0
cmR1cF94KCBjb25zdCBjaGFyICpzLCB2b2lkICpjdHggKQp7CgljaGFyICAgICpwOwoJc2l6ZV90
CWxlbjsKCWlmKCBzID09IE5VTEwgKSB7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJbGVuID0gc3RybGVu
KCBzICkgKyAxOwoJaWYgKCAocCA9IChjaGFyKikgYmVyX21lbWFsbG9jX3goIGxlbiwgY3R4ICkp
ICE9IE5VTEwgKSB7CgkJQUNfTUVNQ1BZKCBwLCBzLCBsZW4gKTsKCX0KCglyZXR1cm4gcDsKfQ0K
DQp2b2lkDQpiZXJfbWVtZnJlZV94KCB2b2lkICpwLCB2b2lkICpjdHggKQ0Kew0KCWlmKCBwID09
IE5VTEwgKSB7DQoJCXJldHVybjsNCgl9DQoJCWZyZWUoIHAgKTsNCgkJcmV0dXJuOw0KfQ0KDQp2
b2lkCmJlcl9tZW12ZnJlZV94KCB2b2lkICoqdmVjLCB2b2lkICpjdHggKQp7CglpbnQJaTsKCglp
ZiggdmVjID09IE5VTEwgKSB7CgkJcmV0dXJuOwoJfQoKCglmb3IgKCBpID0gMDsgdmVjW2ldICE9
IE5VTEw7IGkrKyApIHsKCQliZXJfbWVtZnJlZV94KCB2ZWNbaV0sIGN0eCApOwoJfQoKCWJlcl9t
ZW1mcmVlX3goIHZlYywgY3R4ICk7Cn0NCg0KI2RlZmluZSBMREFQX1VSTF9QUkVGSVggICAgICAg
ICAibGRhcDovLyINCiNkZWZpbmUgTERBUF9VUkxfUFJFRklYX0xFTiAgICAgU1RSTEVOT0YoTERB
UF9VUkxfUFJFRklYKQ0KI2RlZmluZSBMREFQU19VUkxfUFJFRklYCSJsZGFwczovLyINCiNkZWZp
bmUgTERBUFNfVVJMX1BSRUZJWF9MRU4JU1RSTEVOT0YoTERBUFNfVVJMX1BSRUZJWCkNCiNkZWZp
bmUgTERBUElfVVJMX1BSRUZJWAkibGRhcGk6Ly8iDQojZGVmaW5lIExEQVBJX1VSTF9QUkVGSVhf
TEVOCVNUUkxFTk9GKExEQVBJX1VSTF9QUkVGSVgpDQojZGVmaW5lIExEQVBfVVJMX1VSTENPTE9O
CSJVUkw6Ig0KI2RlZmluZSBMREFQX1VSTF9VUkxDT0xPTl9MRU4JU1RSTEVOT0YoTERBUF9VUkxf
VVJMQ09MT04pDQoNCiNkZWZpbmUgTERBUF9SRUZfU1RSCQkiUmVmZXJyYWw6XG4iDQojZGVmaW5l
IExEQVBfUkVGX1NUUl9MRU4JU1RSTEVOT0YoTERBUF9SRUZfU1RSKQ0KI2RlZmluZSBMREFQX0xE
QVBfUkVGX1NUUglMREFQX1VSTF9QUkVGSVgNCiNkZWZpbmUgTERBUF9MREFQX1JFRl9TVFJfTEVO
CUxEQVBfVVJMX1BSRUZJWF9MRU4NCg0KI2RlZmluZSBMREFQX0RFRkFVTFRfUkVGSE9QTElNSVQg
NQ0KDQojZGVmaW5lIExEQVBfQk9PTF9SRUZFUlJBTFMJCTANCiNkZWZpbmUgTERBUF9CT09MX1JF
U1RBUlQJCTENCiNkZWZpbmUgTERBUF9CT09MX1RMUwkJCTMNCiNkZWZpbmUJTERBUF9CT09MX0NP
Tk5FQ1RfQVNZTkMJCTQNCiNkZWZpbmUJTERBUF9CT09MX1NBU0xfTk9DQU5PTgkJNQ0KDQojZGVm
aW5lIExEQVBfQk9PTEVBTlMJdW5zaWduZWQgbG9uZw0KI2RlZmluZSBMREFQX0JPT0wobikJKChM
REFQX0JPT0xFQU5TKTEgPDwgKG4pKQ0KI2RlZmluZSBMREFQX0JPT0xfR0VUKGxvLCBib29sKQlc
DQoJKChsbyktPmxkb19ib29sZWFucyAmIExEQVBfQk9PTChib29sKSA/IC0xIDogMCkNCiNkZWZp
bmUgTERBUF9CT09MX1NFVChsbywgYm9vbCkgKChsbyktPmxkb19ib29sZWFucyB8PSBMREFQX0JP
T0woYm9vbCkpDQojZGVmaW5lIExEQVBfQk9PTF9DTFIobG8sIGJvb2wpICgobG8pLT5sZG9fYm9v
bGVhbnMgJj0gfkxEQVBfQk9PTChib29sKSkNCiNkZWZpbmUgTERBUF9CT09MX1pFUk8obG8pICgo
bG8pLT5sZG9fYm9vbGVhbnMgPSAwKQ0KDQojZGVmaW5lIExEQVBfUFZUX1VSTF9QQVJTRV9OT05F
CQkJKDB4MDBVKQ0KI2RlZmluZSBMREFQX1BWVF9VUkxfUEFSU0VfTk9FTVBUWV9IT1NUCQkoMHgw
MVUpDQojZGVmaW5lIExEQVBfUFZUX1VSTF9QQVJTRV9ERUZfUE9SVAkJKDB4MDJVKQ0KI2RlZmlu
ZSBMREFQX1BWVF9VUkxfUEFSU0VfTk9FTVBUWV9ETgkJKDB4MDRVKQ0KI2RlZmluZSBMREFQX1BW
VF9VUkxfUEFSU0VfTk9ERUZfU0NPUEUJCSgweDA4VSkNCiNkZWZpbmUJTERBUF9QVlRfVVJMX1BB
UlNFX0hJU1RPUklDCQkoTERBUF9QVlRfVVJMX1BBUlNFX05PREVGX1NDT1BFIHwgXA0KCQkJCQkJ
IExEQVBfUFZUX1VSTF9QQVJTRV9OT0VNUFRZX0hPU1QgfCBcDQoJCQkJCQkgTERBUF9QVlRfVVJM
X1BBUlNFX0RFRl9QT1JUKQ0KDQojZGVmaW5lIExEQVBfTUFMTE9DKHMpCQkoYmVyX21lbWFsbG9j
X3goKHMpLE5VTEwpKQ0KI2RlZmluZSBMREFQX0NBTExPQyhuLHMpCShiZXJfbWVtY2FsbG9jX3go
KG4pLChzKSxOVUxMKSkNCiNkZWZpbmUgTERBUF9SRUFMTE9DKHAscykJKGJlcl9tZW1yZWFsbG9j
X3goKHApLChzKSxOVUxMKSkNCiNkZWZpbmUgTERBUF9GUkVFKHApCQkoYmVyX21lbWZyZWVfeCgo
cCksTlVMTCkpDQojZGVmaW5lIExEQVBfVkZSRUUodikJCShiZXJfbWVtdmZyZWVfeCgodm9pZCAq
KikodiksTlVMTCkpDQojZGVmaW5lIExEQVBfU1RSRFVQKHMpCQkoYmVyX3N0cmR1cF94KChzKSxO
VUxMKSkNCiNkZWZpbmUgTERBUF9TVFJORFVQKHMsbCkJKGJlcl9zdHJuZHVwX3goKHMpLChsKSxO
VUxMKSkNCg0KI2RlZmluZSBMREFQX01BTExPQ1gocyx4KQkoYmVyX21lbWFsbG9jX3goKHMpLCh4
KSkpDQojZGVmaW5lIExEQVBfQ0FMTE9DWChuLHMseCkJKGJlcl9tZW1jYWxsb2NfeCgobiksKHMp
LCh4KSkpDQojZGVmaW5lIExEQVBfUkVBTExPQ1gocCxzLHgpCShiZXJfbWVtcmVhbGxvY194KChw
KSwocyksKHgpKSkNCiNkZWZpbmUgTERBUF9GUkVFWChwLHgpCQkoYmVyX21lbWZyZWVfeCgocCks
KHgpKSkNCiNkZWZpbmUgTERBUF9WRlJFRVgodix4KQkoYmVyX21lbXZmcmVlX3goKHZvaWQgKiop
KHYpLCh4KSkpDQojZGVmaW5lIExEQVBfU1RSRFVQWChzLHgpCShiZXJfc3RyZHVwX3goKHMpLCh4
KSkpDQojZGVmaW5lIExEQVBfU1RSTkRVUFgocyxsLHgpCShiZXJfc3RybmR1cF94KChzKSwobCks
KHgpKSkNCg0KI2RlZmluZSBMREFQX1BST1RPX1RDUCAxIC8qIGxkYXA6Ly8gICovDQojZGVmaW5l
IExEQVBfUFJPVE9fVURQIDIgLyogcmVzZXJ2ZWQgKi8NCiNkZWZpbmUgTERBUF9QUk9UT19JUEMg
MyAvKiBsZGFwaTovLyAqLw0KI2RlZmluZSBMREFQX1BST1RPX0VYVCA0IC8qIHVzZXItZGVmaW5l
ZCBzb2NrZXQvc29ja2J1ZiAqLw0KDQojZGVmaW5lIExEQVBfU0NPUEVfREVGQVVMVAkJKChiZXJf
aW50X3QpIC0xKQkgLyogT3BlbkxEQVAgZXh0ZW5zaW9uICovDQoNCnN0YXRpYyBjb25zdCBjaGFy
Kg0Kc2tpcF91cmxfcHJlZml4KA0KCWNvbnN0IGNoYXIgKnVybCwNCglpbnQgKmVuY2xvc2VkcCwN
Cgljb25zdCBjaGFyICoqc2NoZW1lICkNCnsNCgkvKg0KIAkgKiByZXR1cm4gbm9uLXplcm8gaWYg
dGhpcyBsb29rcyBsaWtlIGEgTERBUCBVUkw7IHplcm8gaWYgbm90DQogCSAqIGlmIG5vbi16ZXJv
IHJldHVybmVkLCAqdXJscCB3aWxsIGJlIG1vdmVkIHBhc3QgImxkYXA6Ly8iIHBhcnQgb2YgVVJM
DQogCSAqLw0KCWNvbnN0IGNoYXIgKnA7DQoJaWYgKCB1cmwgPT0gTlVMTCApIHsNCgkJcmV0dXJu
KCBOVUxMICk7DQoJfQ0KCXAgPSB1cmw7DQoJLyogc2tpcCBsZWFkaW5nICc8JyAoaWYgYW55KSAq
Lw0KCWlmICggKnAgPT0gJzwnICkgew0KCQkqZW5jbG9zZWRwID0gMTsNCgkJKytwOw0KCX0gZWxz
ZSB7DQoJCSplbmNsb3NlZHAgPSAwOw0KCX0NCgkvKiBza2lwIGxlYWRpbmcgIlVSTDoiIChpZiBh
bnkpICovDQoJaWYgKCBzdHJuY2FzZWNtcCggcCwgTERBUF9VUkxfVVJMQ09MT04sIExEQVBfVVJM
X1VSTENPTE9OX0xFTiApID09IDAgKSB7DQoJCXAgKz0gTERBUF9VUkxfVVJMQ09MT05fTEVOOw0K
CX0NCgkvKiBjaGVjayBmb3IgImxkYXA6Ly8iIHByZWZpeCAqLw0KCWlmICggc3RybmNhc2VjbXAo
IHAsIExEQVBfVVJMX1BSRUZJWCwgTERBUF9VUkxfUFJFRklYX0xFTiApID09IDAgKSB7DQoJCS8q
IHNraXAgb3ZlciAibGRhcDovLyIgcHJlZml4IGFuZCByZXR1cm4gc3VjY2VzcyAqLw0KCQlwICs9
IExEQVBfVVJMX1BSRUZJWF9MRU47DQoJCSpzY2hlbWUgPSAibGRhcCI7DQoJCXJldHVybiggcCAp
Ow0KCX0NCgkvKiBjaGVjayBmb3IgImxkYXBzOi8vIiBwcmVmaXggKi8NCglpZiAoIHN0cm5jYXNl
Y21wKCBwLCBMREFQU19VUkxfUFJFRklYLCBMREFQU19VUkxfUFJFRklYX0xFTiApID09IDAgKSB7
DQoJCS8qIHNraXAgb3ZlciAibGRhcHM6Ly8iIHByZWZpeCBhbmQgcmV0dXJuIHN1Y2Nlc3MgKi8N
CgkJcCArPSBMREFQU19VUkxfUFJFRklYX0xFTjsNCgkJKnNjaGVtZSA9ICJsZGFwcyI7DQoJCXJl
dHVybiggcCApOw0KCX0NCgkvKiBjaGVjayBmb3IgImxkYXBpOi8vIiBwcmVmaXggKi8NCglpZiAo
IHN0cm5jYXNlY21wKCBwLCBMREFQSV9VUkxfUFJFRklYLCBMREFQSV9VUkxfUFJFRklYX0xFTiAp
ID09IDAgKSB7DQoJCS8qIHNraXAgb3ZlciAibGRhcGk6Ly8iIHByZWZpeCBhbmQgcmV0dXJuIHN1
Y2Nlc3MgKi8NCgkJcCArPSBMREFQSV9VUkxfUFJFRklYX0xFTjsNCgkJKnNjaGVtZSA9ICJsZGFw
aSI7DQoJCXJldHVybiggcCApOw0KCX0NCglyZXR1cm4oIE5VTEwgKTsNCn0NCg0KaW50DQpsZGFw
X2lzX2xkYXBfdXJsKGNoYXIgKnVybCApDQp7DQoJaW50CWVuY2xvc2VkOw0KCWNvbnN0IGNoYXIg
KiBzY2hlbWU7DQoJaWYoIHVybCA9PSBOVUxMICkgew0KCQlyZXR1cm4gMDsNCgl9DQoJaWYoIHNr
aXBfdXJsX3ByZWZpeCggdXJsLCAmZW5jbG9zZWQsICZzY2hlbWUgKSA9PSBOVUxMICkgew0KCQly
ZXR1cm4gMDsNCgl9DQoJcmV0dXJuIDE7DQp9DQoNCmludCBsZGFwX3B2dF91cmxfc2NoZW1lMnBy
b3RvKCBjb25zdCBjaGFyICpzY2hlbWUgKQ0Kew0KCWFzc2VydCggc2NoZW1lICE9IE5VTEwgKTsN
CglpZiggc2NoZW1lID09IE5VTEwgKSB7DQoJCXJldHVybiAtMTsNCgl9DQoJaWYoIHN0cmNtcCgi
bGRhcCIsIHNjaGVtZSkgPT0gMCApIHsNCgkJcmV0dXJuIExEQVBfUFJPVE9fVENQOw0KCX0NCglp
Ziggc3RyY21wKCJsZGFwaSIsIHNjaGVtZSkgPT0gMCApIHsNCgkJcmV0dXJuIExEQVBfUFJPVE9f
SVBDOw0KCX0NCglpZiggc3RyY21wKCJsZGFwcyIsIHNjaGVtZSkgPT0gMCApIHsNCgkJcmV0dXJu
IExEQVBfUFJPVE9fVENQOw0KCX0NCglyZXR1cm4gLTE7DQp9DQoNCiNkZWZpbmUgTERBUF9VVEY4
X0lTQVNDSUkocCkgKCAhKCooY29uc3QgdW5zaWduZWQgY2hhciAqKShwKSAmIDB4ODAgKSApDQoN
CnR5cGVkZWYgYmVyX2ludF90IGxkYXBfdWNzNF90Ow0KI2RlZmluZSBMREFQX1VDUzRfSU5WQUxJ
RCAoMHg4MDAwMDAwMFUpDQojdW5kZWYgYw0KI2RlZmluZSBjIGNvbnN0IGNoYXINCmMgbGRhcF91
dGY4X21pbnRhYltdID0gew0KCShjKTB4MjAsIChjKTB4ODAsIChjKTB4ODAsIChjKTB4ODAsIChj
KTB4ODAsIChjKTB4ODAsIChjKTB4ODAsIChjKTB4ODAsDQoJKGMpMHg4MCwgKGMpMHg4MCwgKGMp
MHg4MCwgKGMpMHg4MCwgKGMpMHg4MCwgKGMpMHg4MCwgKGMpMHg4MCwgKGMpMHg4MCwNCgkoYykw
eDMwLCAoYykweDgwLCAoYykweDgwLCAoYykweDgwLCAoYykweDgwLCAoYykweDgwLCAoYykweDgw
LCAoYykweDgwLA0KCShjKTB4MzgsIChjKTB4ODAsIChjKTB4ODAsIChjKTB4ODAsIChjKTB4M2Ms
IChjKTB4ODAsIChjKTB4MDAsIChjKTB4MDAgfTsNCiN1bmRlZiBjDQpjb25zdCBjaGFyIGxkYXBf
dXRmOF9sZW50YWJbXSA9IHsNCgkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwLCAwLA0KCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs
IDAsDQoJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCgkw
LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KCTAsIDAsIDIs
IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsDQoJMiwgMiwgMiwgMiwgMiwg
MiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwNCgkzLCAzLCAzLCAzLCAzLCAzLCAzLCAz
LCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLA0KCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUs
IDUsIDUsIDYsIDYsIDAsIDAgfTsNCg0KI2RlZmluZSBMREFQX1VURjhfQ0hBUkxFTihwKSAoIExE
QVBfVVRGOF9JU0FTQ0lJKHApIFwNCgk/IDEgOiBsZGFwX3V0ZjhfbGVudGFiWyooY29uc3QgdW5z
aWduZWQgY2hhciAqKShwKSBeIDB4ODBdICkNCiNkZWZpbmUgTERBUF9VVEY4X0NIQVJMRU4yKHAs
IGwpICggKCAoIGwgPSBMREFQX1VURjhfQ0hBUkxFTiggcCApKSA8IDMgfHwgXA0KCSggbGRhcF91
dGY4X21pbnRhYlsqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikocCkgJiAweDFmXSAmIChwKVsxXSAp
ICkgPyBcDQoJbCA6IDAgKQ0KDQpsZGFwX3VjczRfdCBsZGFwX3hfdXRmOF90b191Y3M0KCBjb25z
dCBjaGFyICogcCApDQp7DQogICAgY29uc3QgdW5zaWduZWQgY2hhciAqYyA9IChjb25zdCB1bnNp
Z25lZCBjaGFyICopIHA7DQogICAgbGRhcF91Y3M0X3QgY2g7DQoJaW50IGxlbiwgaTsNCglzdGF0
aWMgdW5zaWduZWQgY2hhciBtYXNrW10gPSB7DQoJCTAsIDB4N2YsIDB4MWYsIDB4MGYsIDB4MDcs
IDB4MDMsIDB4MDEgfTsNCg0KCWxlbiA9IExEQVBfVVRGOF9DSEFSTEVOMihwLCBsZW4pOw0KDQoJ
aWYoIGxlbiA9PSAwICkgcmV0dXJuIExEQVBfVUNTNF9JTlZBTElEOw0KDQoJY2ggPSBjWzBdICYg
bWFza1tsZW5dOw0KDQoJZm9yKGk9MTsgaSA8IGxlbjsgaSsrKSB7DQoJCWlmICgoY1tpXSAmIDB4
YzApICE9IDB4ODApIHsNCgkJCXJldHVybiBMREFQX1VDUzRfSU5WQUxJRDsNCgkJfQ0KDQoJCWNo
IDw8PSA2Ow0KCQljaCB8PSBjW2ldICYgMHgzZjsNCgl9DQoNCglyZXR1cm4gY2g7DQp9DQoNCmNo
YXIqIGxkYXBfdXRmOF9uZXh0KCBjb25zdCBjaGFyICogcCApDQp7DQoJaW50IGk7DQoJY29uc3Qg
dW5zaWduZWQgY2hhciAqdSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHA7DQoNCglpZiggTERB
UF9VVEY4X0lTQVNDSUkodSkgKSB7DQoJCXJldHVybiAoY2hhciAqKSAmcFsxXTsNCgl9DQoNCglm
b3IoIGk9MTsgaTw2OyBpKysgKSB7DQoJCWlmICggKCB1W2ldICYgMHhjMCApICE9IDB4ODAgKSB7
DQoJCQlyZXR1cm4gKGNoYXIgKikgJnBbaV07DQoJCX0NCgl9DQoNCglyZXR1cm4gKGNoYXIgKikg
JnBbaV07DQp9DQojZGVmaW5lIExEQVBfVVRGOF9ORVhUKHApICgJTERBUF9VVEY4X0lTQVNDSUko
cCkgXA0KCT8gKGNoYXIgKikocCkrMSA6IGxkYXBfdXRmOF9uZXh0KChwKSkgKQ0KI2RlZmluZSBM
REFQX1VURjhfSU5DUihwKSAoKHApID0gTERBUF9VVEY4X05FWFQocCkpDQpjaGFyICoobGRhcF91
dGY4X3N0cnBicmspKCBjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnNldCApDQp7DQoJZm9y
KCA7ICpzdHIgIT0gJ1wwJzsgTERBUF9VVEY4X0lOQ1Ioc3RyKSApIHsNCgkJY29uc3QgY2hhciAq
Y3NldDsNCg0KCQlmb3IoIGNzZXQgPSBzZXQ7ICpjc2V0ICE9ICdcMCc7IExEQVBfVVRGOF9JTkNS
KGNzZXQpICkgew0KCQkJaWYoIGxkYXBfeF91dGY4X3RvX3VjczQoIHN0ciApID09IGxkYXBfeF91
dGY4X3RvX3VjczQoIGNzZXQgKSApIHsNCgkJCQlyZXR1cm4gKGNoYXIgKikgc3RyOw0KCQkJfSAN
CgkJfQ0KCX0NCg0KCXJldHVybiBOVUxMOw0KfQ0KDQoNCmJlcl9sZW5fdCAobGRhcF91dGY4X3N0
cnNwbikoIGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqc2V0ICkNCnsNCgljb25zdCBjaGFy
ICpjc3RyOw0KCWNvbnN0IGNoYXIgKmNzZXQ7DQoNCglmb3IoIGNzdHIgPSBzdHI7ICpjc3RyICE9
ICdcMCc7IExEQVBfVVRGOF9JTkNSKGNzdHIpICkgew0KCQlmb3IoIGNzZXQgPSBzZXQ7IDsgTERB
UF9VVEY4X0lOQ1IoY3NldCkgKSB7DQoJCQlpZiggKmNzZXQgPT0gJ1wwJyApIHsNCgkJCQlyZXR1
cm4gY3N0ciAtIHN0cjsNCgkJCX0NCg0KCQkJaWYoIGxkYXBfeF91dGY4X3RvX3VjczQoIGNzdHIg
KSA9PSBsZGFwX3hfdXRmOF90b191Y3M0KCBjc2V0ICkgKSB7DQoJCQkJYnJlYWs7DQoJCQl9IA0K
CQl9DQoJfQ0KDQoJcmV0dXJuIGNzdHIgLSBzdHI7DQp9DQoNCg0KYmVyX2xlbl90IChsZGFwX3V0
Zjhfc3RyY3NwbikoIGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqc2V0ICkNCnsNCgljb25z
dCBjaGFyICpjc3RyOw0KCWNvbnN0IGNoYXIgKmNzZXQ7DQoNCglmb3IoIGNzdHIgPSBzdHI7ICpj
c3RyICE9ICdcMCc7IExEQVBfVVRGOF9JTkNSKGNzdHIpICkgew0KCQlmb3IoIGNzZXQgPSBzZXQ7
ICpjc2V0ICE9ICdcMCc7IExEQVBfVVRGOF9JTkNSKGNzZXQpICkgew0KCQkJaWYoIGxkYXBfeF91
dGY4X3RvX3VjczQoIGNzdHIgKSA9PSBsZGFwX3hfdXRmOF90b191Y3M0KCBjc2V0ICkgKSB7DQoJ
CQkJcmV0dXJuIGNzdHIgLSBzdHI7DQoJCQl9IA0KCQl9DQoJfQ0KDQoJcmV0dXJuIGNzdHIgLSBz
dHI7DQp9DQoNCmNoYXIgKihsZGFwX3V0Zjhfc3RydG9rKShjaGFyICpzdHIsIGNvbnN0IGNoYXIg
KnNlcCwgY2hhciAqKmxhc3QpDQp7DQoJY2hhciAqYmVnaW47DQoJY2hhciAqZW5kOw0KDQoJaWYo
IGxhc3QgPT0gTlVMTCApIHJldHVybiBOVUxMOw0KDQoJYmVnaW4gPSBzdHIgPyBzdHIgOiAqbGFz
dDsNCg0KCWJlZ2luICs9IGxkYXBfdXRmOF9zdHJzcG4oIGJlZ2luLCBzZXAgKTsNCg0KCWlmKCAq
YmVnaW4gPT0gJ1wwJyApIHsNCgkJKmxhc3QgPSBOVUxMOw0KCQlyZXR1cm4gTlVMTDsNCgl9DQoN
CgllbmQgPSAmYmVnaW5bIGxkYXBfdXRmOF9zdHJjc3BuKCBiZWdpbiwgc2VwICkgXTsNCg0KCWlm
KCAqZW5kICE9ICdcMCcgKSB7DQoJCWNoYXIgKm5leHQgPSBMREFQX1VURjhfTkVYVCggZW5kICk7
DQoJCSplbmQgPSAnXDAnOw0KCQllbmQgPSBuZXh0Ow0KCX0NCg0KCSpsYXN0ID0gZW5kOw0KCXJl
dHVybiBiZWdpbjsNCn0NCg0Kc3RydWN0IGJlcnZhbCAqDQpiZXJfc3RyMmJ2X3goY29uc3QgY2hh
ciAqcywgYmVyX2xlbl90IGxlbiwgaW50IGR1cCwgc3RydWN0IGJlcnZhbCAqYnYsIHZvaWQgKmN0
eCkgDQp7DQoJc3RydWN0IGJlcnZhbCAqYW5ldzsNCglpZiggcyA9PSBOVUxMICkgew0KCQkvL2Jl
cl9lcnJubyA9IExCRVJfRVJST1JfUEFSQU07DQoJCXJldHVybiBOVUxMOw0KCX0NCglpZiggYnYg
KSB7DQoJCWFuZXcgPSBidjsNCgl9IGVsc2Ugew0KCQlpZigoIGFuZXcgPSAoc3RydWN0IGJlcnZh
bCopYmVyX21lbWFsbG9jX3goIHNpemVvZihzdHJ1Y3QgYmVydmFsKSwgY3R4ICkpID09IE5VTEwg
KSB7DQoJCQlyZXR1cm4gTlVMTDsNCgkJfQ0KCX0NCglhbmV3LT5idl9sZW4gPSBsZW4gPyBsZW4g
OiBzdHJsZW4oIHMgKTsNCglpZiAoIGR1cCApIHsNCgkJaWYgKCAoYW5ldy0+YnZfdmFsID0gKGNo
YXIqKWJlcl9tZW1hbGxvY194KCBhbmV3LT5idl9sZW4rMSwgY3R4ICkpID09IE5VTEwgKSB7DQoJ
CQlpZiAoICFidiApDQoJCQkJYmVyX21lbWZyZWVfeCggYW5ldywgY3R4ICk7DQoJCQlyZXR1cm4g
TlVMTDsNCgkJfQ0KCQlBQ19NRU1DUFkoIGFuZXctPmJ2X3ZhbCwgcywgYW5ldy0+YnZfbGVuICk7
DQoJCWFuZXctPmJ2X3ZhbFthbmV3LT5idl9sZW5dID0gJ1wwJzsNCgl9IGVsc2Ugew0KCQlhbmV3
LT5idl92YWwgPSAoY2hhciAqKSBzOw0KCX0NCglyZXR1cm4oIGFuZXcgKTsNCn0NCg0Kc3RydWN0
IGJlcnZhbCAqDQpiZXJfc3RyMmJ2KGNvbnN0IGNoYXIgKnMsIGJlcl9sZW5fdCBsZW4sIGludCBk
dXAsIHN0cnVjdCBiZXJ2YWwgKmJ2KQ0Kew0KCXJldHVybiBiZXJfc3RyMmJ2X3goIHMsIGxlbiwg
ZHVwLCBidiwgTlVMTCApOw0KfQ0KDQpjaGFyICoqDQpsZGFwX3N0cjJjaGFycmF5KCBjb25zdCBj
aGFyICpzdHJfaW4sIGNvbnN0IGNoYXIgKmJya3N0ciApDQp7DQoJY2hhcgkqKnJlczsNCgljaGFy
CSpzdHIsICpzOw0KCWNoYXIJKmxhc3RzOw0KCWludAlpOw0KCS8qIHByb3RlY3QgdGhlIGlucHV0
IHN0cmluZyBmcm9tIHN0cnRvayAqLw0KCXN0ciA9IExEQVBfU1RSRFVQKCBzdHJfaW4gKTsNCglp
Ziggc3RyID09IE5VTEwgKSB7DQoJCXJldHVybiBOVUxMOw0KCX0NCglpID0gMTsNCglmb3IgKCBz
ID0gc3RyOyA7IExEQVBfVVRGOF9JTkNSKHMpICkgew0KCQlzID0gbGRhcF91dGY4X3N0cnBicmso
IHMsIGJya3N0ciApOw0KCQlpZiAoICFzICkgYnJlYWs7DQoJCWkrKzsNCgl9DQoJcmVzID0gKGNo
YXIgKiopIExEQVBfTUFMTE9DKCAoaSArIDEpICogc2l6ZW9mKGNoYXIgKikgKTsNCglpZiggcmVz
ID09IE5VTEwgKSB7DQoJCUxEQVBfRlJFRSggc3RyICk7DQoJCXJldHVybiBOVUxMOw0KCX0NCglp
ID0gMDsNCglmb3IgKCBzID0gbGRhcF91dGY4X3N0cnRvayggc3RyLCBicmtzdHIsICZsYXN0cyAp
Ow0KCQlzICE9IE5VTEw7DQoJCXMgPSBsZGFwX3V0Zjhfc3RydG9rKCBOVUxMLCBicmtzdHIsICZs
YXN0cyApICkNCgl7DQoJCXJlc1tpXSA9IExEQVBfU1RSRFVQKCBzICk7DQoJCWlmKHJlc1tpXSA9
PSBOVUxMKSB7DQoJCQlmb3IoIC0taSA7IGkgPj0gMCA7IGktLSApIHsNCgkJCQlMREFQX0ZSRUUo
IHJlc1tpXSApOw0KCQkJfQ0KCQkJLy9MREFQX0ZSRUUoIHJlcyApOyAgDQoJCQlmcmVlKHJlcyk7
DQoJCQlMREFQX0ZSRUUoIHN0ciApOw0KCQkJcmV0dXJuIE5VTEw7DQoJCX0NCgkJaSsrOw0KCX0N
CglyZXNbaV0gPSBOVUxMOw0KCUxEQVBfRlJFRSggc3RyICk7DQoJcmV0dXJuKCByZXMgKTsNCn0N
Cg0Kc3RhdGljIGludApsZGFwX2ludF9pc19oZXhwYWlyKCBjaGFyICpzICkKewoJaW50CWk7CgoJ
Zm9yICggaSA9IDA7IGkgPCAyOyBpKysgKSB7CgkJaWYgKCBzW2ldID49ICcwJyAmJiBzW2ldIDw9
ICc5JyApIHsKCQkJY29udGludWU7CgkJfQoKCQlpZiAoIHNbaV0gPj0gJ0EnICYmIHNbaV0gPD0g
J0YnICkgewoJCQljb250aW51ZTsKCQl9CgoJCWlmICggc1tpXSA+PSAnYScgJiYgc1tpXSA8PSAn
ZicgKSB7CgkJCWNvbnRpbnVlOwoJCX0KCgkJcmV0dXJuIDA7Cgl9CgkKCXJldHVybiAxOwkKfQ0K
DQpzdGF0aWMgaW50CmxkYXBfaW50X3VuaGV4KCBpbnQgYyApCnsKCXJldHVybiggYyA+PSAnMCcg
JiYgYyA8PSAnOScgPyBjIC0gJzAnCgkgICAgOiBjID49ICdBJyAmJiBjIDw9ICdGJyA/IGMgLSAn
QScgKyAxMAoJICAgIDogYyAtICdhJyArIDEwICk7Cn0NCg0Kdm9pZA0KbGRhcF9wdnRfaGV4X3Vu
ZXNjYXBlKCBjaGFyICpzICkNCnsNCgkvKg0KCSAqIFJlbW92ZSBVUkwgaGV4IGVzY2FwZXMgZnJv
bSBzLi4uIGRvbmUgaW4gcGxhY2UuICBUaGUgYmFzaWMgY29uY2VwdCBmb3INCgkgKiB0aGlzIHJv
dXRpbmUgaXMgYm9ycm93ZWQgZnJvbSB0aGUgV1dXIGxpYnJhcnkgSFRVbkVzY2FwZSgpIHJvdXRp
bmUuDQoJICovDQoJY2hhcgkqcCwNCgkJKnNhdmVfcyA9IHM7DQoJZm9yICggcCA9IHM7ICpzICE9
ICdcMCc7ICsrcyApIHsNCgkJaWYgKCAqcyA9PSAnJScgKSB7DQoJCQkvKg0KCQkJICogRklYTUU6
IHdoYXQgaWYgJyUnIGlzIGZvbGxvd2VkDQoJCQkgKiBieSBub24taGV4cGFpciBjaGFycz8NCgkJ
CSAqLw0KCQkJaWYgKCAhbGRhcF9pbnRfaXNfaGV4cGFpciggcyArIDEgKSApIHsNCgkJCQlwID0g
c2F2ZV9zOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJaWYgKCAqKytzID09ICdcMCcgKSB7DQoJCQkJ
YnJlYWs7DQoJCQl9DQoJCQkqcCA9IGxkYXBfaW50X3VuaGV4KCAqcyApIDw8IDQ7DQoJCQlpZiAo
ICorK3MgPT0gJ1wwJyApIHsNCgkJCQlicmVhazsNCgkJCX0NCgkJCSpwKysgKz0gbGRhcF9pbnRf
dW5oZXgoICpzICk7DQoJCX0gZWxzZSB7DQoJCQkqcCsrID0gKnM7DQoJCX0NCgl9DQoJKnAgPSAn
XDAnOw0KfQ0KDQoNCiNkZWZpbmUgQkVSX0JWQyhzKQkJeyBTVFJMRU5PRihzKSwgKGNoYXIgKiko
cykgfQ0KI2RlZmluZSBCRVJfQlZOVUxMCQl7IDBMLCBOVUxMIH0NCiNkZWZpbmUgTERBUF9TQ09Q
RV9TVUJPUkRJTkFURQkoKGJlcl9pbnRfdCkgMHgwMDAzKSAvKiBPcGVuTERBUCBleHRlbnNpb24g
Ki8NCiNkZWZpbmUgYmVyX2J2c3RyY2FzZWNtcCh2MSx2MikgXA0KCSgodjEpLT5idl9sZW4gPCAo
djIpLT5idl9sZW4gXA0KCQk/IC0xIDogKCh2MSktPmJ2X2xlbiA+ICh2MiktPmJ2X2xlbiBcDQoJ
CQk/IDEgOiBzdHJuY2FzZWNtcCgodjEpLT5idl92YWwsICh2MiktPmJ2X3ZhbCwgKHYxKS0+YnZf
bGVuKSApKQ0KDQppbnQNCmxkYXBfcHZ0X2J2MnNjb3BlKCBzdHJ1Y3QgYmVydmFsICpidiApDQp7
DQoJc3RhdGljIHN0cnVjdCB7DQoJCXN0cnVjdCBiZXJ2YWwJYnY7DQoJCWludAkJc2NvcGU7DQoJ
fQl2W10gPSB7DQoJCXsgQkVSX0JWQyggIm9uZSIgKSwJCUxEQVBfU0NPUEVfT05FTEVWRUwgfSwN
CgkJeyBCRVJfQlZDKCAib25lbGV2ZWwiICksCUxEQVBfU0NPUEVfT05FTEVWRUwgfSwNCgkJeyBC
RVJfQlZDKCAiYmFzZSIgKSwJCUxEQVBfU0NPUEVfQkFTRSB9LA0KCQl7IEJFUl9CVkMoICJzdWIi
ICksCQlMREFQX1NDT1BFX1NVQlRSRUUgfSwNCgkJeyBCRVJfQlZDKCAic3VidHJlZSIgKSwJCUxE
QVBfU0NPUEVfU1VCVFJFRSB9LA0KCQl7IEJFUl9CVkMoICJzdWJvcmQiICksCQlMREFQX1NDT1BF
X1NVQk9SRElOQVRFIH0sDQoJCXsgQkVSX0JWQyggInN1Ym9yZGluYXRlIiApLAlMREFQX1NDT1BF
X1NVQk9SRElOQVRFIH0sDQoJCXsgQkVSX0JWQyggImNoaWxkcmVuIiApLAlMREFQX1NDT1BFX1NV
Qk9SRElOQVRFIH0sDQoJCXsgQkVSX0JWTlVMTCwJCQktMSB9DQoJfTsNCglpbnQJaTsNCg0KCWZv
ciAoIGkgPSAwOyB2WyBpIF0uc2NvcGUgIT0gLTE7IGkrKyApIHsNCgkJaWYgKCBiZXJfYnZzdHJj
YXNlY21wKCBidiwgJnZbIGkgXS5idiApID09IDAgKSB7DQoJCQlyZXR1cm4gdlsgaSBdLnNjb3Bl
Ow0KCQl9DQoJfQ0KDQoJcmV0dXJuKCAtMSApOw0KfQ0KDQoNCmludA0KbGRhcF9wdnRfc3RyMnNj
b3BlKCBjb25zdCBjaGFyICpwICkNCnsNCglzdHJ1Y3QgYmVydmFsCWJ2Ow0KDQoJYmVyX3N0cjJi
diggcCwgMCwgMCwgJmJ2ICk7DQoNCglyZXR1cm4gbGRhcF9wdnRfYnYyc2NvcGUoICZidiApOw0K
fQ0KDQp2b2lkDQpsZGFwX2ZyZWVfdXJsZGVzYyggTERBUFVSTERlc2MgKmx1ZHAgKQ0Kew0KCWlm
ICggbHVkcCA9PSBOVUxMICkgew0KCQlyZXR1cm47DQoJfQ0KCQ0KCWlmICggbHVkcC0+bHVkX3Nj
aGVtZSAhPSBOVUxMICkgew0KCQlMREFQX0ZSRUUoIGx1ZHAtPmx1ZF9zY2hlbWUgKTsNCgl9DQoN
CglpZiAoIGx1ZHAtPmx1ZF9ob3N0ICE9IE5VTEwgKSB7DQoJCUxEQVBfRlJFRSggbHVkcC0+bHVk
X2hvc3QgKTsNCgl9DQoNCglpZiAoIGx1ZHAtPmx1ZF9kbiAhPSBOVUxMICkgew0KCQlMREFQX0ZS
RUUoIGx1ZHAtPmx1ZF9kbiApOw0KCX0NCg0KCWlmICggbHVkcC0+bHVkX2ZpbHRlciAhPSBOVUxM
ICkgew0KCQlMREFQX0ZSRUUoIGx1ZHAtPmx1ZF9maWx0ZXIpOw0KCX0NCg0KCWlmICggbHVkcC0+
bHVkX2F0dHJzICE9IE5VTEwgKSB7DQoJCUxEQVBfVkZSRUUoIGx1ZHAtPmx1ZF9hdHRycyApOw0K
CX0NCg0KCWlmICggbHVkcC0+bHVkX2V4dHMgIT0gTlVMTCApIHsNCgkJTERBUF9WRlJFRSggbHVk
cC0+bHVkX2V4dHMgKTsNCgl9DQoNCgkvL0xEQVBfRlJFRSggbHVkcCApOw0KCWZyZWUobHVkcCk7
DQp9DQoNCmludA0KbGRhcF91cmxfcGFyc2VfZXh0KCBjaGFyICp1cmxfaW4sIExEQVBVUkxEZXNj
ICoqbHVkcHAsIHVuc2lnbmVkIGZsYWdzICkNCnsNCi8qDQogKiAgUGljayBhcGFydCB0aGUgcGll
Y2VzIG9mIGFuIExEQVAgVVJMLg0KICovDQoNCglMREFQVVJMRGVzYwkqbHVkcDsNCgljaGFyCSpw
LCAqcSwgKnI7DQoJaW50CQlpLCBlbmNsb3NlZCwgcHJvdG8sIGlzX3Y2ID0gMDsNCgljb25zdCBj
aGFyICpzY2hlbWUgPSBOVUxMOw0KCWNvbnN0IGNoYXIgKnVybF90bXA7DQoJY2hhciAqdXJsOw0K
DQoJaW50CWNoZWNrX2RuID0gMTsNCg0KCWlmKCB1cmxfaW4gPT0gTlVMTCB8fCBsdWRwcCA9PSBO
VUxMICkgew0KCQlyZXR1cm4gTERBUF9VUkxfRVJSX1BBUkFNOw0KCX0NCg0KCSpsdWRwcCA9IE5V
TEw7CS8qIHBlc3NpbWlzdGljICovDQoNCgl1cmxfdG1wID0gc2tpcF91cmxfcHJlZml4KCB1cmxf
aW4sICZlbmNsb3NlZCwgJnNjaGVtZSApOw0KDQoJaWYgKCB1cmxfdG1wID09IE5VTEwgKSB7DQoJ
CXJldHVybiBMREFQX1VSTF9FUlJfQkFEU0NIRU1FOw0KCX0NCg0KCWFzc2VydCggc2NoZW1lICE9
IE5VTEwgKTsNCg0KCXByb3RvID0gbGRhcF9wdnRfdXJsX3NjaGVtZTJwcm90byggc2NoZW1lICk7
DQoJaWYgKCBwcm90byA9PSAtMSApIHsNCgkJcmV0dXJuIExEQVBfVVJMX0VSUl9CQURTQ0hFTUU7
DQoJfQ0KDQoJLyogbWFrZSB3b3JraW5nIGNvcHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgVVJM
ICovDQoJdXJsID0gTERBUF9TVFJEVVAoIHVybF90bXAgKTsNCglpZiAoIHVybCA9PSBOVUxMICkg
ew0KCQlyZXR1cm4gTERBUF9VUkxfRVJSX01FTTsNCgl9DQoNCglpZiAoIGVuY2xvc2VkICkgew0K
CQlwID0gJnVybFtzdHJsZW4odXJsKS0xXTsNCg0KCQlpZiggKnAgIT0gJz4nICkgew0KCQkJTERB
UF9GUkVFKCB1cmwgKTsNCgkJCXJldHVybiBMREFQX1VSTF9FUlJfQkFERU5DTE9TVVJFOw0KCQl9
DQoNCgkJKnAgPSAnXDAnOw0KCX0NCg0KCS8qIGFsbG9jYXRlIHJldHVybiBzdHJ1Y3QgKi8NCgls
dWRwID0gKExEQVBVUkxEZXNjICopTERBUF9DQUxMT0MoIDEsIHNpemVvZiggTERBUFVSTERlc2Mg
KSk7DQoNCglpZiAoIGx1ZHAgPT0gTlVMTCApIHsNCgkJTERBUF9GUkVFKCB1cmwgKTsNCgkJcmV0
dXJuIExEQVBfVVJMX0VSUl9NRU07DQoJfQ0KDQoJLy9sdWRwLT5sdWRfbmV4dCA9IE5VTEw7DQoJ
bHVkcC0+bHVkX2hvc3QgPSBOVUxMOw0KCWx1ZHAtPmx1ZF9wb3J0ID0gMDsNCglsdWRwLT5sdWRf
ZG4gPSBOVUxMOw0KCWx1ZHAtPmx1ZF9hdHRycyA9IE5VTEw7DQoJbHVkcC0+bHVkX3Njb3BlID0g
KCBmbGFncyAmIExEQVBfUFZUX1VSTF9QQVJTRV9OT0RFRl9TQ09QRSApID8gTERBUF9TQ09QRV9C
QVNFIDogTERBUF9TQ09QRV9ERUZBVUxUOw0KCWx1ZHAtPmx1ZF9maWx0ZXIgPSBOVUxMOw0KCWx1
ZHAtPmx1ZF9leHRzID0gTlVMTDsNCg0KCWx1ZHAtPmx1ZF9zY2hlbWUgPSBMREFQX1NUUkRVUCgg
c2NoZW1lICk7DQoNCglpZiAoIGx1ZHAtPmx1ZF9zY2hlbWUgPT0gTlVMTCApIHsNCgkJTERBUF9G
UkVFKCB1cmwgKTsNCgkJbGRhcF9mcmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJcmV0dXJuIExEQVBf
VVJMX0VSUl9NRU07DQoJfQ0KDQoJLyogc2NhbiBmb3J3YXJkIGZvciAnLycgdGhhdCBtYXJrcyBl
bmQgb2YgaG9zdHBvcnQgYW5kIGJlZ2luLiBvZiBkbiAqLw0KCXAgPSBzdHJjaHIoIHVybCwgJy8n
ICk7DQoJcSA9IE5VTEw7DQoNCglpZiggcCAhPSBOVUxMICkgew0KCQkvKiB0ZXJtaW5hdGUgaG9z
dHBvcnQ7IHBvaW50IHRvIHN0YXJ0IG9mIGRuICovDQoJCSpwKysgPSAnXDAnOw0KCX0gZWxzZSB7
DQoJCS8qIGNoZWNrIGZvciBOb3ZlbGwga2x1ZGdlLCBzZWUgYmVsb3cgKi8NCgkJcCA9IHN0cmNo
ciggdXJsLCAnPycgKTsNCgkJaWYgKCBwICkgew0KCQkJKnArKyA9ICdcMCc7DQoJCQlxID0gcDsN
CgkJCXAgPSBOVUxMOw0KCQl9DQoJfQ0KDQoJaWYgKCBwcm90byAhPSBMREFQX1BST1RPX0lQQyAp
IHsNCgkJLyogSVB2NiBzeW50YXggd2l0aCBbaXAgYWRkcmVzc106cG9ydCAqLw0KCQlpZiAoICp1
cmwgPT0gJ1snICkgew0KCQkJciA9IHN0cmNociggdXJsLCAnXScgKTsNCgkJCWlmICggciA9PSBO
VUxMICkgew0KCQkJCUxEQVBfRlJFRSggdXJsICk7DQoJCQkJbGRhcF9mcmVlX3VybGRlc2MoIGx1
ZHAgKTsNCgkJCQlyZXR1cm4gTERBUF9VUkxfRVJSX0JBRFVSTDsNCgkJCX0NCgkJCSpyKysgPSAn
XDAnOw0KCQkJcSA9IHN0cmNociggciwgJzonICk7DQoJCQlpZiAoIHEgJiYgcSAhPSByICkgew0K
CQkJCUxEQVBfRlJFRSggdXJsICk7DQoJCQkJbGRhcF9mcmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJ
CQlyZXR1cm4gTERBUF9VUkxfRVJSX0JBRFVSTDsNCgkJCX0NCgkJCWlzX3Y2ID0gMTsNCgkJfSBl
bHNlIHsNCgkJCXEgPSBzdHJjaHIoIHVybCwgJzonICk7DQoJCX0NCg0KCQlpZiAoIHEgIT0gTlVM
TCApIHsNCgkJCWNoYXIJKm5leHQ7DQoNCgkJCSpxKysgPSAnXDAnOw0KCQkJbGRhcF9wdnRfaGV4
X3VuZXNjYXBlKCBxICk7DQoNCgkJCWlmKCAqcSA9PSAnXDAnICkgew0KCQkJCUxEQVBfRlJFRSgg
dXJsICk7DQoJCQkJbGRhcF9mcmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJCQlyZXR1cm4gTERBUF9V
UkxfRVJSX0JBRFVSTDsNCgkJCX0NCg0KCQkJbHVkcC0+bHVkX3BvcnQgPSBzdHJ0b2woIHEsICZu
ZXh0LCAxMCApOw0KCQkJaWYgKCBuZXh0ID09IHEgfHwgbmV4dFswXSAhPSAnXDAnICkgew0KCQkJ
CUxEQVBfRlJFRSggdXJsICk7DQoJCQkJbGRhcF9mcmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJCQly
ZXR1cm4gTERBUF9VUkxfRVJSX0JBRFVSTDsNCgkJCX0NCgkJCS8qIGNoZWNrIGZvciBOb3ZlbGwg
a2x1ZGdlICovDQoJCQlpZiAoICFwICkgew0KCQkJCWlmICggKm5leHQgIT0gJ1wwJyApIHsNCgkJ
CQkJcSA9ICZuZXh0WzFdOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXEgPSBOVUxMOw0KCQkJCX0NCgkJ
CX0NCgkJfQ0KDQoJCWlmICggKCBmbGFncyAmIExEQVBfUFZUX1VSTF9QQVJTRV9ERUZfUE9SVCAp
ICYmIGx1ZHAtPmx1ZF9wb3J0ID09IDAgKSB7DQoJCS8vCWlmICggc3RyY21wKCBsdWRwLT5sdWRf
c2NoZW1lLCAibGRhcHMiICkgPT0gMCApIHsNCgkJLy8JCWx1ZHAtPmx1ZF9wb3J0ID0gTERBUFNf
UE9SVDsNCgkJLy8JfSBlbHNlIHsNCgkJCQlsdWRwLT5sdWRfcG9ydCA9IExEQVBfUE9SVDsNCgkJ
Ly8JfQ0KCQl9DQoJfQ0KDQoJbGRhcF9wdnRfaGV4X3VuZXNjYXBlKCB1cmwgKTsNCg0KCS8qIElm
IFtpcCBhZGRyZXNzXTpwb3J0IHN5bnRheCwgdXJsIGlzIFtpcCBhbmQgd2Ugc2tpcCB0aGUgWyAq
Lw0KCWx1ZHAtPmx1ZF9ob3N0ID0gTERBUF9TVFJEVVAoIHVybCArIGlzX3Y2ICk7DQoNCglpZigg
bHVkcC0+bHVkX2hvc3QgPT0gTlVMTCApIHsNCgkJTERBUF9GUkVFKCB1cmwgKTsNCgkJbGRhcF9m
cmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJcmV0dXJuIExEQVBfVVJMX0VSUl9NRU07DQoJfQ0KDQoJ
aWYgKCAoIGZsYWdzICYgTERBUF9QVlRfVVJMX1BBUlNFX05PRU1QVFlfSE9TVCApDQoJCSYmIGx1
ZHAtPmx1ZF9ob3N0ICE9IE5VTEwNCgkJJiYgKmx1ZHAtPmx1ZF9ob3N0ID09ICdcMCcgKQ0KCXsN
CgkJTERBUF9GUkVFKCBsdWRwLT5sdWRfaG9zdCApOw0KCQlsdWRwLT5sdWRfaG9zdCA9IE5VTEw7
DQoJfQ0KDQoJLyoNCgkgKiBLbHVkZ2UuICBsZGFwOi8vMTExLjIyMi4zMzMuNDQ0OjM4OT8/Y249
YWJjLG89Y29tcGFueQ0KCSAqDQoJICogT24gZWFybHkgTm92ZWxsIHJlbGVhc2VzLCBzZWFyY2gg
cmVmZXJlbmNlcy9yZWZlcnJhbHMgd2VyZSByZXR1cm5lZA0KCSAqIGluIHRoaXMgZm9ybWF0LCBp
LmUuLCB0aGUgZG4gd2FzIGtpbmQgb2YgaW4gdGhlIHNjb3BlIHBvc2l0aW9uLA0KCSAqIGJ1dCB0
aGUgcmVxdWlyZWQgc2xhc2ggaXMgbWlzc2luZy4gVGhlIHdob2xlIHRoaW5nIGlzIGlsbGVnYWwg
c3ludGF4LA0KCSAqIGJ1dCB3ZSBuZWVkIHRvIGFjY291bnQgZm9yIGl0LiBGb3J0dW5hdGVseSBp
dCBjYW4ndCBiZSBjb25mdXNlZCB3aXRoDQoJICogYW55dGhpbmcgcmVhbC4NCgkgKi8NCglpZigg
KHAgPT0gTlVMTCkgJiYgKHEgIT0gTlVMTCkgJiYgKCpxID09ICc/JykgKSB7DQoJCS8qID8gaW1t
ZWRpYXRlbHkgZm9sbG93ZWQgYnkgcXVlc3Rpb24gKi8NCgkJcSsrOw0KCQlpZiggKnEgIT0gJ1ww
JyApIHsNCgkJCS8qIHBhcnNlIGRuIHBhcnQgKi8NCgkJCWxkYXBfcHZ0X2hleF91bmVzY2FwZSgg
cSApOw0KCQkJbHVkcC0+bHVkX2RuID0gTERBUF9TVFJEVVAoIHEgKTsNCg0KCQl9IGVsc2UgaWYg
KCAhKCBmbGFncyAmIExEQVBfUFZUX1VSTF9QQVJTRV9OT0VNUFRZX0ROICkgKSB7DQoJCQlsdWRw
LT5sdWRfZG4gPSBMREFQX1NUUkRVUCggIiIgKTsNCg0KCQl9IGVsc2Ugew0KCQkJY2hlY2tfZG4g
PSAwOw0KCQl9DQoNCgkJaWYgKCBjaGVja19kbiAmJiBsdWRwLT5sdWRfZG4gPT0gTlVMTCApIHsN
CgkJCUxEQVBfRlJFRSggdXJsICk7DQoJCQlsZGFwX2ZyZWVfdXJsZGVzYyggbHVkcCApOw0KCQkJ
cmV0dXJuIExEQVBfVVJMX0VSUl9NRU07DQoJCX0NCgl9DQoNCglpZiggcCA9PSBOVUxMICkgew0K
CQlMREFQX0ZSRUUoIHVybCApOw0KCQkqbHVkcHAgPSBsdWRwOw0KCQlyZXR1cm4gTERBUF9VUkxf
U1VDQ0VTUzsNCgl9DQoNCgkvKiBzY2FuIGZvcndhcmQgZm9yICc/JyB0aGF0IG1heSBtYXJrcyBl
bmQgb2YgZG4gKi8NCglxID0gc3RyY2hyKCBwLCAnPycgKTsNCg0KCWlmKCBxICE9IE5VTEwgKSB7
DQoJCS8qIHRlcm1pbmF0ZSBkbiBwYXJ0ICovDQoJCSpxKysgPSAnXDAnOw0KCX0NCg0KCWlmKCAq
cCAhPSAnXDAnICkgew0KCQkvKiBwYXJzZSBkbiBwYXJ0ICovDQoJCWxkYXBfcHZ0X2hleF91bmVz
Y2FwZSggcCApOw0KCQlsdWRwLT5sdWRfZG4gPSBMREFQX1NUUkRVUCggcCApOw0KDQoJfSBlbHNl
IGlmICggISggZmxhZ3MgJiBMREFQX1BWVF9VUkxfUEFSU0VfTk9FTVBUWV9ETiApICkgew0KCQls
dWRwLT5sdWRfZG4gPSBMREFQX1NUUkRVUCggIiIgKTsNCg0KCX0gZWxzZSB7DQoJCWNoZWNrX2Ru
ID0gMDsNCgl9DQoNCglpZiggY2hlY2tfZG4gJiYgbHVkcC0+bHVkX2RuID09IE5VTEwgKSB7DQoJ
CUxEQVBfRlJFRSggdXJsICk7DQoJCWxkYXBfZnJlZV91cmxkZXNjKCBsdWRwICk7DQoJCXJldHVy
biBMREFQX1VSTF9FUlJfTUVNOw0KCX0NCg0KCWlmKCBxID09IE5VTEwgKSB7DQoJCS8qIG5vIG1v
cmUgKi8NCgkJTERBUF9GUkVFKCB1cmwgKTsNCgkJKmx1ZHBwID0gbHVkcDsNCgkJcmV0dXJuIExE
QVBfVVJMX1NVQ0NFU1M7DQoJfQ0KDQoJLyogc2NhbiBmb3J3YXJkIGZvciAnPycgdGhhdCBtYXkg
bWFya3MgZW5kIG9mIGF0dHJpYnV0ZXMgKi8NCglwID0gcTsNCglxID0gc3RyY2hyKCBwLCAnPycg
KTsNCg0KCWlmKCBxICE9IE5VTEwgKSB7DQoJCS8qIHRlcm1pbmF0ZSBhdHRyaWJ1dGVzIHBhcnQg
Ki8NCgkJKnErKyA9ICdcMCc7DQoJfQ0KDQoJaWYoICpwICE9ICdcMCcgKSB7DQoJCS8qIHBhcnNl
IGF0dHJpYnV0ZXMgKi8NCgkJbGRhcF9wdnRfaGV4X3VuZXNjYXBlKCBwICk7DQoJCWx1ZHAtPmx1
ZF9hdHRycyA9IGxkYXBfc3RyMmNoYXJyYXkoIHAsICIsIiApOw0KDQoJCWlmKCBsdWRwLT5sdWRf
YXR0cnMgPT0gTlVMTCApIHsNCgkJCUxEQVBfRlJFRSggdXJsICk7DQoJCQlsZGFwX2ZyZWVfdXJs
ZGVzYyggbHVkcCApOw0KCQkJcmV0dXJuIExEQVBfVVJMX0VSUl9CQURBVFRSUzsNCgkJfQ0KCX0N
Cg0KCWlmICggcSA9PSBOVUxMICkgew0KCQkvKiBubyBtb3JlICovDQoJCUxEQVBfRlJFRSggdXJs
ICk7DQoJCSpsdWRwcCA9IGx1ZHA7DQoJCXJldHVybiBMREFQX1VSTF9TVUNDRVNTOw0KCX0NCg0K
CS8qIHNjYW4gZm9yd2FyZCBmb3IgJz8nIHRoYXQgbWF5IG1hcmtzIGVuZCBvZiBzY29wZSAqLw0K
CXAgPSBxOw0KCXEgPSBzdHJjaHIoIHAsICc/JyApOw0KDQoJaWYoIHEgIT0gTlVMTCApIHsNCgkJ
LyogdGVybWluYXRlIHRoZSBzY29wZSBwYXJ0ICovDQoJCSpxKysgPSAnXDAnOw0KCX0NCg0KCWlm
KCAqcCAhPSAnXDAnICkgew0KCQkvKiBwYXJzZSB0aGUgc2NvcGUgKi8NCgkJbGRhcF9wdnRfaGV4
X3VuZXNjYXBlKCBwICk7DQoJCWx1ZHAtPmx1ZF9zY29wZSA9IGxkYXBfcHZ0X3N0cjJzY29wZSgg
cCApOw0KDQoJCWlmKCBsdWRwLT5sdWRfc2NvcGUgPT0gLTEgKSB7DQoJCQlMREFQX0ZSRUUoIHVy
bCApOw0KCQkJbGRhcF9mcmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJCXJldHVybiBMREFQX1VSTF9F
UlJfQkFEU0NPUEU7DQoJCX0NCgl9DQoNCglpZiAoIHEgPT0gTlVMTCApIHsNCgkJLyogbm8gbW9y
ZSAqLw0KCQlMREFQX0ZSRUUoIHVybCApOw0KCQkqbHVkcHAgPSBsdWRwOw0KCQlyZXR1cm4gTERB
UF9VUkxfU1VDQ0VTUzsNCgl9DQoNCgkvKiBzY2FuIGZvcndhcmQgZm9yICc/JyB0aGF0IG1heSBt
YXJrcyBlbmQgb2YgZmlsdGVyICovDQoJcCA9IHE7DQoJcSA9IHN0cmNociggcCwgJz8nICk7DQoN
CglpZiggcSAhPSBOVUxMICkgew0KCQkvKiB0ZXJtaW5hdGUgdGhlIGZpbHRlciBwYXJ0ICovDQoJ
CSpxKysgPSAnXDAnOw0KCX0NCg0KCWlmKCAqcCAhPSAnXDAnICkgew0KCQkvKiBwYXJzZSB0aGUg
ZmlsdGVyICovDQoJCWxkYXBfcHZ0X2hleF91bmVzY2FwZSggcCApOw0KDQoJCWlmKCAhICpwICkg
ew0KCQkJLyogbWlzc2luZyBmaWx0ZXIgKi8NCgkJCUxEQVBfRlJFRSggdXJsICk7DQoJCQlsZGFw
X2ZyZWVfdXJsZGVzYyggbHVkcCApOw0KCQkJcmV0dXJuIExEQVBfVVJMX0VSUl9CQURGSUxURVI7
DQoJCX0NCg0KCQlsdWRwLT5sdWRfZmlsdGVyID0gTERBUF9TVFJEVVAoIHAgKTsNCg0KCQlpZigg
bHVkcC0+bHVkX2ZpbHRlciA9PSBOVUxMICkgew0KCQkJTERBUF9GUkVFKCB1cmwgKTsNCgkJCWxk
YXBfZnJlZV91cmxkZXNjKCBsdWRwICk7DQoJCQlyZXR1cm4gTERBUF9VUkxfRVJSX01FTTsNCgkJ
fQ0KCX0NCg0KCWlmICggcSA9PSBOVUxMICkgew0KCQkvKiBubyBtb3JlICovDQoJCUxEQVBfRlJF
RSggdXJsICk7DQoJCSpsdWRwcCA9IGx1ZHA7DQoJCXJldHVybiBMREFQX1VSTF9TVUNDRVNTOw0K
CX0NCg0KCS8qIHNjYW4gZm9yd2FyZCBmb3IgJz8nIHRoYXQgbWF5IG1hcmtzIGVuZCBvZiBleHRl
bnNpb25zICovDQoJcCA9IHE7DQoJcSA9IHN0cmNociggcCwgJz8nICk7DQoNCglpZiggcSAhPSBO
VUxMICkgew0KCQkvKiBleHRyYSAnPycgKi8NCgkJTERBUF9GUkVFKCB1cmwgKTsNCgkJbGRhcF9m
cmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJcmV0dXJuIExEQVBfVVJMX0VSUl9CQURVUkw7DQoJfQ0K
DQoJLyogcGFyc2UgdGhlIGV4dGVuc2lvbnMgKi8NCglsdWRwLT5sdWRfZXh0cyA9IGxkYXBfc3Ry
MmNoYXJyYXkoIHAsICIsIiApOw0KDQoJaWYoIGx1ZHAtPmx1ZF9leHRzID09IE5VTEwgKSB7DQoJ
CUxEQVBfRlJFRSggdXJsICk7DQoJCWxkYXBfZnJlZV91cmxkZXNjKCBsdWRwICk7DQoJCXJldHVy
biBMREFQX1VSTF9FUlJfQkFERVhUUzsNCgl9DQoNCglmb3IoIGk9MDsgbHVkcC0+bHVkX2V4dHNb
aV0gIT0gTlVMTDsgaSsrICkgew0KCQlsZGFwX3B2dF9oZXhfdW5lc2NhcGUoIGx1ZHAtPmx1ZF9l
eHRzW2ldICk7DQoNCgkJaWYoICpsdWRwLT5sdWRfZXh0c1tpXSA9PSAnIScgKSB7DQoJCQkvKiBj
b3VudCB0aGUgbnVtYmVyIG9mIGNyaXRpY2FsIGV4dGVuc2lvbnMgKi8NCgkJCWx1ZHAtPmx1ZF9j
cml0X2V4dHMrKzsNCgkJfQ0KCX0NCg0KCWlmKCBpID09IDAgKSB7DQoJCS8qIG11c3QgaGF2ZSAx
IG9yIG1vcmUgKi8NCgkJTERBUF9GUkVFKCB1cmwgKTsNCgkJbGRhcF9mcmVlX3VybGRlc2MoIGx1
ZHAgKTsNCgkJcmV0dXJuIExEQVBfVVJMX0VSUl9CQURFWFRTOw0KCX0NCg0KCS8qIG5vIG1vcmUg
Ki8NCgkqbHVkcHAgPSBsdWRwOw0KCUxEQVBfRlJFRSggdXJsICk7DQoJcmV0dXJuIExEQVBfVVJM
X1NVQ0NFU1M7DQp9DQoNCmludA0KbGRhcF91cmxfcGFyc2UoIGNoYXIgKnVybF9pbiwgTERBUFVS
TERlc2MgKipsdWRwcCApDQp7DQoJcmV0dXJuIGxkYXBfdXJsX3BhcnNlX2V4dCggdXJsX2luLCBs
dWRwcCwgTERBUF9QVlRfVVJMX1BBUlNFX0hJU1RPUklDICk7DQp9DQoNCg0KDQojZWxzZQ0KI2lu
Y2x1ZGUgPGxkYXAuaD4NCiNlbmRpZg0KDQojZGVmaW5lIFNJTVBMRSAic2ltcGxlIg0KI2RlZmlu
ZSBLUkI0MSAia3JiNDEiDQojZGVmaW5lIEtSQjQyICJrcmI0MiINCiNkZWZpbmUgVjIgInYyIg0K
I2RlZmluZSBWMyAidjMiDQoNCnN0YXRpYyBkbnNfc2RsemltcGxlbWVudGF0aW9uX3QgKmRsel9s
ZGFwID0gTlVMTDsNCg0KI2RlZmluZSBkYmNfc2VhcmNoX2xpbWl0IDMwDQojZGVmaW5lIEFMTE5P
REVTIDENCiNkZWZpbmUgQUxMT1dYRlIgMg0KI2RlZmluZSBBVVRIT1JJVFkgMw0KI2RlZmluZSBG
SU5EWk9ORSA0DQojZGVmaW5lIExPT0tVUCA1DQoNCi8qJQ0KICogU3RydWN0dXJlIHRvIGhvbGQg
ZXZlcnRoaW5nIG5lZWRlZCBieSB0aGlzICJpbnN0YW5jZSIgb2YgdGhlIExEQVANCiAqIGRyaXZl
ciByZW1lbWJlciwgdGhlIGRyaXZlciBjb2RlIGlzIG9ubHkgbG9hZGVkIG9uY2UsIGJ1dCBtYXkg
aGF2ZQ0KICogbWFueSBzZXBhcmF0ZSBpbnN0YW5jZXMuDQogKi8NCg0KdHlwZWRlZiBzdHJ1Y3Qg
ew0KI2lmZGVmIElTQ19QTEFURk9STV9VU0VUSFJFQURTDQoJZGJfbGlzdF90ICAgICpkYjsgLyol
PCBoYW5kbGUgdG8gYSBsaXN0IG9mIERCICovDQojZWxzZQ0KCWRiaW5zdGFuY2VfdCAqZGI7IC8q
JTwgaGFuZGxlIHRvIGRiICovDQojZW5kaWYNCglpbnQgbWV0aG9kOwkvKiU8IHNlY3VyaXR5IGF1
dGhlbnRpY2F0aW9uIG1ldGhvZCAqLw0KCWNoYXIgKnVzZXI7CS8qJTwgd2hvIGlzIGF1dGhlbnRp
Y2F0aW5nICovDQoJY2hhciAqY3JlZDsJLyolPCBwYXNzd29yZCBmb3Igc2ltcGxlIGF1dGhlbnRp
Y2F0aW9uIG1ldGhvZCAqLw0KCWludCBwcm90b2NvbDsJLyolPCBMREFQIGNvbW11bmljYXRpb24g
cHJvdG9jb2wgdmVyc2lvbiAqLw0KCWNoYXIgKmhvc3RzOwkvKiU8IExEQVAgc2VydmVyIGhvc3Rz
ICovDQp9IGxkYXBfaW5zdGFuY2VfdDsNCg0KLyogZm9yd2FyZCByZWZlcmVuY2VzICovDQoNCnN0
YXRpYyBpc2NfcmVzdWx0X3QNCmRsel9sZGFwX2ZpbmR6b25lKHZvaWQgKmRyaXZlcmFyZywgdm9p
ZCAqZGJkYXRhLCBjb25zdCBjaGFyICpuYW1lKTsNCg0Kc3RhdGljIHZvaWQNCmRsel9sZGFwX2Rl
c3Ryb3kodm9pZCAqZHJpdmVyYXJnLCB2b2lkICpkYmRhdGEpOw0KDQovKg0KICogUHJpdmF0ZSBt
ZXRob2RzDQogKi8NCg0KLyolIGNoZWNrcyB0aGF0IHRoZSBMREFQIFVSTCBwYXJhbWV0ZXJzIG1h
a2Ugc2Vuc2UgKi8NCnN0YXRpYyBpc2NfcmVzdWx0X3QNCmRsel9sZGFwX2NoZWNrVVJMKGNoYXIg
KlVSTCwgaW50IGF0dHJDbnQsIGNvbnN0IGNoYXIgKm1zZykgew0KCWlzY19yZXN1bHRfdCByZXN1
bHQgPSBJU0NfUl9TVUNDRVNTOw0KCWludCBsZGFwX3Jlc3VsdDsNCglMREFQVVJMRGVzYyAqbGRh
cF91cmwgPSBOVUxMOw0KDQoJaWYgKCFsZGFwX2lzX2xkYXBfdXJsKFVSTCkpIHsNCgkJaXNjX2xv
Z193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5T
X0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJST1IsDQoJCQkgICAgICAiJXMgcXVlcnkgaXMgbm90
IGEgdmFsaWQgTERBUCBVUkwiLCBtc2cpOw0KCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQln
b3RvIGNsZWFudXA7DQoJfQ0KDQoJbGRhcF9yZXN1bHQgPSBsZGFwX3VybF9wYXJzZShVUkwsICZs
ZGFwX3VybCk7DQoJaWYgKGxkYXBfcmVzdWx0ICE9IExEQVBfU1VDQ0VTUyB8fCBsZGFwX3VybCA9
PSBOVUxMKSB7DQoJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRB
QkFTRSwNCgkJCSAgICAgIEROU19MT0dNT0RVTEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJICAg
ICAgInBhcnNpbmcgJXMgcXVlcnkgZmFpbGVkIiwgbXNnKTsNCgkJcmVzdWx0ID0gSVNDX1JfRkFJ
TFVSRTsNCgkJZ290byBjbGVhbnVwOw0KCX0NCg0KCWlmIChsZGFwX2NvdW50X3ZhbHVlcyhsZGFw
X3VybC0+bHVkX2F0dHJzKSA8IGF0dHJDbnQpIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwg
RE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElT
Q19MT0dfRVJST1IsDQoJCQkgICAgICAiJXMgcXVlcnkgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0ICIN
CgkJCSAgICAgICIlZCBhdHRyaWJ1dGVzIHRvIHJldHVybiIsDQoJCQkgICAgICBtc2csIGF0dHJD
bnQpOw0KCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQlnb3RvIGNsZWFudXA7DQoJfQ0KDQoJ
aWYgKGxkYXBfdXJsLT5sdWRfaG9zdCAhPSBOVUxMKSB7DQoJCWlzY19sb2dfd3JpdGUoZG5zX2xj
dHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCSAgICAgIEROU19MT0dNT0RVTEVfRExa
LCBJU0NfTE9HX0VSUk9SLA0KCQkJICAgICAgIiVzIHF1ZXJ5IG11c3Qgbm90IHNwZWNpZnkgYSBo
b3N0IiwgbXNnKTsNCgkJcmVzdWx0ID0gSVNDX1JfRkFJTFVSRTsNCgkJZ290byBjbGVhbnVwOw0K
CX0NCg0KCWlmIChsZGFwX3VybC0+bHVkX3BvcnQgIT0gMzg5KSB7DQoJCWlzY19sb2dfd3JpdGUo
ZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCSAgICAgIEROU19MT0dNT0RV
TEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJICAgICAgIiVzIHF1ZXJ5IG11c3Qgbm90IHNwZWNp
ZnkgYSBwb3J0IiwgbXNnKTsNCgkJcmVzdWx0ID0gSVNDX1JfRkFJTFVSRTsNCgkJZ290byBjbGVh
bnVwOw0KCX0NCg0KCWlmIChsZGFwX3VybC0+bHVkX2RuID09IE5VTEwgfHwgc3RybGVuIChsZGFw
X3VybC0+bHVkX2RuKSA8IDEpIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NB
VEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJS
T1IsDQoJCQkgICAgICAiJXMgcXVlcnkgbXVzdCBzcGVjaWZ5IGEgc2VhcmNoIGJhc2UiLCBtc2cp
Ow0KCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQlnb3RvIGNsZWFudXA7DQoJfQ0KDQoJaWYg
KGxkYXBfdXJsLT5sdWRfZXh0cyAhPSBOVUxMIHx8IGxkYXBfdXJsLT5sdWRfY3JpdF9leHRzICE9
IDApIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNF
LA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJST1IsDQoJCQkgICAgICAi
JXMgdXNlcyBleHRlbnNpb25zLiAiDQoJCQkgICAgICAiVGhlIGRyaXZlciBkb2VzIG5vdCBzdXBw
b3J0IExEQVAgZXh0ZW5zaW9ucy4iLA0KCQkJICAgICAgbXNnKTsNCgkJcmVzdWx0ID0gSVNDX1Jf
RkFJTFVSRTsNCgkJZ290byBjbGVhbnVwOw0KCX0NCg0KY2xlYW51cDoNCglpZiAobGRhcF91cmwg
IT0gTlVMTCkNCgkJbGRhcF9mcmVlX3VybGRlc2MobGRhcF91cmwpOw0KCXJldHVybiAocmVzdWx0
KTsNCn0NCg0KLyolIENvbm5lY3RzIC8gcmVjb25uZWN0cyB0byBMREFQIHNlcnZlciAqLw0Kc3Rh
dGljIGlzY19yZXN1bHRfdA0KZGx6X2xkYXBfY29ubmVjdChsZGFwX2luc3RhbmNlX3QgKmRiaSwg
ZGJpbnN0YW5jZV90ICpkYmMpIHsNCglpc2NfcmVzdWx0X3QgcmVzdWx0Ow0KCWludCBsZGFwX3Jl
c3VsdDsNCg0KCS8qIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uLCBnZXQgcmlkZSBvZiBpdC4gKi8N
CglpZiAoZGJjLT5kYmNvbm4gIT0gTlVMTCkgew0KCQlsZGFwX3VuYmluZF9zKChMREFQICopIGRi
Yy0+ZGJjb25uKTsNCgkJZGJjLT5kYmNvbm4gPSBOVUxMOw0KCX0NCg0KCS8qIG5vdyBjb25uZWN0
IC8gcmVjb25uZWN0LiAqLw0KDQoJLyogaW5pdGlhbGl6ZS4gKi8NCglkYmMtPmRiY29ubiA9IGxk
YXBfaW5pdChkYmktPmhvc3RzLCBMREFQX1BPUlQpOw0KCWlmIChkYmMtPmRiY29ubiA9PSBOVUxM
KQ0KCQlyZXR1cm4gKElTQ19SX05PTUVNT1JZKTsNCg0KCS8qIHNldCBwcm90b2NvbCB2ZXJzaW9u
LiAqLw0KCWxkYXBfcmVzdWx0ID0gbGRhcF9zZXRfb3B0aW9uKChMREFQICopIGRiYy0+ZGJjb25u
LA0KCQkJCSAgICAgIExEQVBfT1BUX1BST1RPQ09MX1ZFUlNJT04sDQoJCQkJICAgICAgJihkYmkt
PnByb3RvY29sKSk7DQoJaWYgKGxkYXBfcmVzdWx0ICE9IExEQVBfU1VDQ0VTUykgew0KCQlyZXN1
bHQgPSBJU0NfUl9OT1BFUk07DQoJCWdvdG8gY2xlYW51cDsNCgl9DQoNCgkvKiAiYmluZCIgdG8g
c2VydmVyLiAgaS5lLiBzZW5kIHVzZXJuYW1lIC8gcGFzcyAqLw0KCWxkYXBfcmVzdWx0ID0gbGRh
cF9iaW5kX3MoKExEQVAgKikgZGJjLT5kYmNvbm4sIGRiaS0+dXNlciwNCgkJCQkgIGRiaS0+Y3Jl
ZCwgZGJpLT5tZXRob2QpOw0KCWlmIChsZGFwX3Jlc3VsdCAhPSBMREFQX1NVQ0NFU1MpIHsNCgkJ
cmVzdWx0ID0gSVNDX1JfRkFJTFVSRTsNCgkJZ290byBjbGVhbnVwOw0KCX0NCg0KCXJldHVybiAo
SVNDX1JfU1VDQ0VTUyk7DQoNCiBjbGVhbnVwOg0KDQoJLyogY2xlYW51cCBpZiBmYWlsdXJlLiAq
Lw0KCWlmIChkYmMtPmRiY29ubiAhPSBOVUxMKSB7DQoJCWxkYXBfdW5iaW5kX3MoKExEQVAgKikg
ZGJjLT5kYmNvbm4pOw0KCQlkYmMtPmRiY29ubiA9IE5VTEw7DQoJfQ0KDQoJcmV0dXJuIChyZXN1
bHQpOw0KfQ0KDQojaWZkZWYgSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMNCg0KDQovKiUNCiAqIFBy
b3Blcmx5IGNsZWFucyB1cCBhIGxpc3Qgb2YgZGF0YWJhc2UgaW5zdGFuY2VzLg0KICogVGhpcyBm
dW5jdGlvbiBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGZvcg0KICog
bXVsdGl0aHJlYWRlZCBvcGVyYXRpb24uDQogKi8NCnN0YXRpYyB2b2lkDQpsZGFwX2Rlc3Ryb3lf
ZGJsaXN0KGRiX2xpc3RfdCAqZGJsaXN0KSB7DQoJZGJpbnN0YW5jZV90ICpuZGJpID0gTlVMTDsN
CglkYmluc3RhbmNlX3QgKmRiaSA9IE5VTEw7DQoNCgkvKiBnZXQgdGhlIGZpcnN0IERCSSBpbiB0
aGUgbGlzdCAqLw0KCW5kYmkgPSBJU0NfTElTVF9IRUFEKCpkYmxpc3QpOw0KDQoJLyogbG9vcCB0
aHJvdWdoIHRoZSBsaXN0ICovDQoJd2hpbGUgKG5kYmkgIT0gTlVMTCkgew0KCQlkYmkgPSBuZGJp
Ow0KCQkvKiBnZXQgdGhlIG5leHQgREJJIGluIHRoZSBsaXN0ICovDQoJCW5kYmkgPSBJU0NfTElT
VF9ORVhUKGRiaSwgbGluayk7DQoJCS8qIHJlbGVhc2UgREIgY29ubmVjdGlvbiAqLw0KCQlpZiAo
ZGJpLT5kYmNvbm4gIT0gTlVMTCkNCgkJCWxkYXBfdW5iaW5kX3MoKExEQVAgKikgZGJpLT5kYmNv
bm4pOw0KCQkvKiByZWxlYXNlIGFsbCBtZW1vcnkgdGhhdCBjb21wcmlzZWQgYSBEQkkgKi8NCgkJ
ZGVzdHJveV9zcWxkYmluc3RhbmNlKGRiaSk7DQoJfQ0KCS8qIHJlbGVhc2UgbWVtb3J5IGZvciB0
aGUgbGlzdCBzdHJ1Y3R1cmUgKi8NCglpc2NfbWVtX3B1dChuc19nX21jdHgsIGRibGlzdCwgc2l6
ZW9mKGRiX2xpc3RfdCkpOw0KfQ0KDQovKiUNCiAqIExvb3BzIHRocm91Z2ggdGhlIGxpc3Qgb2Yg
REIgaW5zdGFuY2VzLCBhdHRlbXB0aW5nIHRvIGxvY2sNCiAqIG9uIHRoZSBtdXRleC4gIElmIHN1
Y2Nlc3NmdWwsIHRoZSBEQkkgaXMgcmVzZXJ2ZWQgZm9yIHVzZQ0KICogYW5kIHRoZSB0aHJlYWQg
Y2FuIHBlcmZvcm0gcXVlcmllcyBhZ2FpbnN0IHRoZSBkYXRhYmFzZS4NCiAqIElmIHRoZSBsb2Nr
IGZhaWxzLCB0aGUgbmV4dCBvbmUgaW4gdGhlIGxpc3QgaXMgdHJpZWQuDQogKiBsb29waW5nIGNv
bnRpbnVlcyB1bnRpbCBhIGxvY2sgaXMgb2J0YWluZWQsIG9yIHVudGlsDQogKiB0aGUgbGlzdCBo
YXMgYmVlbiBzZWFyY2hlZCBkYmNfc2VhcmNoX2xpbWl0IHRpbWVzLg0KICogVGhpcyBmdW5jdGlv
biBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGZvcg0KICogbXVsdGl0
aHJlYWRlZCBvcGVyYXRpb24uDQogKi8NCnN0YXRpYyBkYmluc3RhbmNlX3QgKg0KbGRhcF9maW5k
X2F2YWlsX2Nvbm4oZGJfbGlzdF90ICpkYmxpc3QpIHsNCglkYmluc3RhbmNlX3QgKmRiaSA9IE5V
TEw7DQoJZGJpbnN0YW5jZV90ICpoZWFkOw0KCWludCBjb3VudCA9IDA7DQoNCgkvKiBnZXQgdG9w
IG9mIGxpc3QgKi8NCgloZWFkID0gZGJpID0gSVNDX0xJU1RfSEVBRCgqZGJsaXN0KTsNCg0KCS8q
IGxvb3AgdGhyb3VnaCBsaXN0ICovDQoJd2hpbGUgKGNvdW50IDwgZGJjX3NlYXJjaF9saW1pdCkg
ew0KCQkvKiB0cnkgdG8gbG9jayBvbiB0aGUgbXV0ZXggKi8NCgkJaWYgKGlzY19tdXRleF90cnls
b2NrKCZkYmktPmluc3RhbmNlX2xvY2spID09IElTQ19SX1NVQ0NFU1MpDQoJCQlyZXR1cm4gKGRi
aSk7IC8qIHN1Y2Nlc3MsIHJldHVybiB0aGUgREJJIGZvciB1c2UuICovDQoNCgkJLyogbm90IHN1
Y2Nlc3NmdWwsIGtlZXAgdHJ5aW5nICovDQoJCWRiaSA9IElTQ19MSVNUX05FWFQoZGJpLCBsaW5r
KTsNCg0KCQkvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBnb25lIHRvIHRoZSB0b3Agb2YgdGhl
IGxpc3QuICovDQoJCWlmIChkYmkgPT0gTlVMTCkgew0KCQkJY291bnQrKzsNCgkJCWRiaSA9IGhl
YWQ7DQoJCX0NCgl9DQoJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RB
VEFCQVNFLA0KCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19JTkZPLA0KCQkgICAg
ICAiTERBUCBkcml2ZXIgdW5hYmxlIHRvIGZpbmQgYXZhaWxhYmxlIGNvbm5lY3Rpb24gIg0KCQkg
ICAgICAiYWZ0ZXIgc2VhcmNoaW5nICVkIHRpbWVzIiwNCgkJICAgICAgY291bnQpOw0KCXJldHVy
biAoTlVMTCk7DQp9DQojZW5kaWYgLyogSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMgKi8NCg0Kc3Rh
dGljIGlzY19yZXN1bHRfdA0KbGRhcF9wcm9jZXNzX3Jlc3VsdHMoTERBUCAqZGJjLCBMREFQTWVz
c2FnZSAqbXNnLCBjaGFyICoqIGF0dHJzLA0KCQkgICAgIHZvaWQgKnB0ciwgaXNjX2Jvb2xlYW5f
dCBhbGxub2RlcykNCnsNCglpc2NfcmVzdWx0X3QgcmVzdWx0ID0gSVNDX1JfU1VDQ0VTUzsNCglp
bnQgaSA9IDA7DQoJaW50IGo7DQoJaW50IGxlbjsNCgljaGFyICphdHRyaWJ1dGUgPSBOVUxMOw0K
CUxEQVBNZXNzYWdlICplbnRyeTsNCgljaGFyICplbmRwID0gTlVMTDsNCgljaGFyICpob3N0ID0g
TlVMTDsNCgljaGFyICp0eXBlID0gTlVMTDsNCgljaGFyICpkYXRhID0gTlVMTDsNCgljaGFyICoq
dmFscyA9IE5VTEw7DQoJaW50IHR0bDsNCg0KCS8qIG1ha2Ugc3VyZSB0aGVyZSBhcmUgYXQgbGVh
c3Qgc29tZSBhdHRyaWJ1dGVzIHRvIHByb2Nlc3MuICovDQoJUkVRVUlSRShhdHRycyAhPSBOVUxM
IHx8IGF0dHJzWzBdICE9IE5VTEwpOw0KDQoJLyogZ2V0IHRoZSBmaXJzdCBlbnRyeSB0byBwcm9j
ZXNzICovDQoJZW50cnkgPSBsZGFwX2ZpcnN0X2VudHJ5KGRiYywgbXNnKTsNCglpZiAoZW50cnkg
PT0gTlVMTCkgew0KCQlpc2NfbG9nX3dyaXRlKGRuc19sY3R4LCBETlNfTE9HQ0FURUdPUllfREFU
QUJBU0UsDQoJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19JTkZPLA0KCQkJICAg
ICAgIkxEQVAgbm8gZW50cmllcyB0byBwcm9jZXNzLiIpOw0KCQlyZXR1cm4gKElTQ19SX0ZBSUxV
UkUpOw0KCX0NCg0KCS8qIGxvb3AgdGhyb3VnaCBhbGwgZW50cmllcyByZXR1cm5lZCAqLw0KCXdo
aWxlIChlbnRyeSAhPSBOVUxMKSB7DQoJCS8qIHJlc2V0IGZvciB0aGlzIGxvb3AgKi8NCgkJdHRs
ID0gMDsNCgkJbGVuID0gMDsNCgkJaSA9IDA7DQoJCWF0dHJpYnV0ZSA9IGF0dHJzW2ldOw0KDQoJ
CS8qIGRldGVybWluZSBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkIGZvciBkYXRhIHN0cmluZyAqLw0K
CQlmb3IgKGogPSAwOyBhdHRyc1tqXSAhPSBOVUxMOyBqKyspIHsNCgkJCS8qIGdldCB0aGUgbGlz
dCBvZiB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlLiAqLw0KCQkJdmFscyA9IGxkYXBfZ2V0X3Zh
bHVlcyhkYmMsIGVudHJ5LCBhdHRyc1tqXSk7DQoJCQkvKiBza2lwIGVtcHR5IGF0dHJpYnV0ZXMu
ICovDQoJCQlpZiAodmFscyA9PSBOVUxMIHx8IGxkYXBfY291bnRfdmFsdWVzKHZhbHMpIDwgMSkN
CgkJCQljb250aW51ZTsNCgkJCS8qDQoJCQkgKiB3ZSBvbmx5IHVzZSB0aGUgZmlyc3QgdmFsdWUu
ICB0aGlzIGRyaXZlcg0KCQkJICogZG9lcyBub3Qgc3VwcG9ydCBtdWx0aS12YWx1ZWQgYXR0cmli
dXRlcy4NCgkJCSAqLw0KCQkJbGVuID0gbGVuICsgc3RybGVuKHZhbHNbMF0pICsgMTsNCgkJCS8q
IGZyZWUgdmFscyBmb3IgbmV4dCBsb29wICovDQoJCQlsZGFwX3ZhbHVlX2ZyZWUodmFscyk7DQoJ
CX0gLyogZW5kIGZvciAoaiA9IDA7IGF0dHJzW2pdICE9IE5VTEwsIGorKykgbG9vcCAqLw0KDQoJ
CS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGF0YSBzdHJpbmcgKi8NCgkJZGF0YSA9IGlzY19tZW1f
YWxsb2NhdGUobnNfZ19tY3R4LCBsZW4gKyAxKTsNCgkJaWYgKGRhdGEgPT0gTlVMTCkgew0KCQkJ
aXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAg
ICAgIEROU19MT0dNT0RVTEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJCSAgICAgICJMREFQIGRy
aXZlciB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICINCgkJCQkgICAgICAid2hpbGUgcHJvY2Vz
c2luZyByZXN1bHRzIik7DQoJCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQkJZ290byBjbGVh
bnVwOw0KCQl9DQoNCgkJLyoNCgkJICogTWFrZSBzdXJlIGRhdGEgaXMgbnVsbCB0ZXJtZWQgYXQg
dGhlIGJlZ2lubmluZyBzbw0KCQkgKiB3ZSBjYW4gY2hlY2sgaWYgYW55IGRhdGEgd2FzIHN0b3Jl
ZCB0byBpdCBsYXRlci4NCgkJICovDQoJCWRhdGFbMF0gPSAnXDAnOw0KDQoJCS8qIHJlc2V0IGog
dG8gcmUtdXNlIGJlbG93ICovDQoJCWogPSAwOw0KDQoJCS8qIGxvb3AgdGhyb3VnaCB0aGUgYXR0
cmlidXRlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLiAqLw0KCQl3aGlsZSAoYXR0cmlidXRlICE9
IE5VTEwpIHsNCgkJCS8qIGdldCB0aGUgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRl
LiAqLw0KCQkJdmFscyA9IGxkYXBfZ2V0X3ZhbHVlcyhkYmMsIGVudHJ5LCBhdHRyaWJ1dGUpOw0K
DQoJCQkvKiBza2lwIGVtcHR5IGF0dHJpYnV0ZXMuICovDQoJCQlpZiAodmFscyA9PSBOVUxMIHx8
IHZhbHNbMF0gPT0gTlVMTCkgew0KCQkJCS8qIGluY3JlbWVudCBhdHRpYnV0ZSBwb2ludGVyICov
DQoJCQkJYXR0cmlidXRlID0gYXR0cnNbKytpXTsNCgkJCQkvKiBzdGFydCBsb29wIG92ZXIgKi8N
CgkJCQljb250aW51ZTsNCgkJCX0NCg0KCQkJLyoNCgkJCSAqIGogaW5pdGlhbGx5ID0gMC4gIElu
Y3JlbWVudCBqIGVhY2ggdGltZSB3ZQ0KCQkJICogc2V0IGEgZmllbGQgdGhhdCB3YXkgbmV4dCBs
b29wIHdpbGwgc2V0DQoJCQkgKiBuZXh0IGZpZWxkLg0KCQkJICovDQoJCQlzd2l0Y2goaikgew0K
CQkJY2FzZSAwOg0KCQkJCWorKzsNCgkJCQkvKg0KCQkJCSAqIGNvbnZlcnQgdGV4dCB0byBpbnQs
IG1ha2Ugc3VyZSBpdA0KCQkJCSAqIHdvcmtlZCByaWdodA0KCQkJCSAqLw0KCQkJCXR0bCA9IHN0
cnRvbCh2YWxzWzBdLCAmZW5kcCwgMTApOw0KCQkJCWlmICgqZW5kcCAhPSAnXDAnIHx8IHR0bCA8
IDApIHsNCgkJCQkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwNCgkJCQkJCSAgICAgIEROU19MT0dD
QVRFR09SWV9EQVRBQkFTRSwNCgkJCQkJCSAgICAgIEROU19MT0dNT0RVTEVfRExaLA0KCQkJCQkJ
ICAgICAgSVNDX0xPR19FUlJPUiwNCgkJCQkJCSAgICAgICJMREFQIGRyaXZlciB0dGwgbXVzdCAi
DQoJCQkJCQkgICAgICAiYmUgYSBwb3N0aXZlIG51bWJlciIpOw0KCQkJCQlnb3RvIGNsZWFudXA7
DQoJCQkJfQ0KCQkJCWJyZWFrOw0KCQkJY2FzZSAxOg0KCQkJCWorKzsNCgkJCQl0eXBlID0gaXNj
X21lbV9zdHJkdXAobnNfZ19tY3R4LCB2YWxzWzBdKTsNCgkJCQlicmVhazsNCgkJCWNhc2UgMjoN
CgkJCQlqKys7DQoJCQkJaWYgKGFsbG5vZGVzKQ0KCQkJCQlob3N0ID0gaXNjX21lbV9zdHJkdXAo
bnNfZ19tY3R4LA0KCQkJCQkJCSAgICAgIHZhbHNbMF0pOw0KCQkJCWVsc2UNCgkJCQkJc3RyY3B5
KGRhdGEsIHZhbHNbMF0pOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAzOg0KCQkJCWorKzsNCgkJCQlp
ZiAoYWxsbm9kZXMpDQoJCQkJCXN0cmNweShkYXRhLCB2YWxzWzBdKTsNCgkJCQllbHNlIHsNCgkJ
CQkJc3RyY2F0KGRhdGEsICIgIik7DQoJCQkJCXN0cmNhdChkYXRhLCB2YWxzWzBdKTsNCgkJCQl9
DQoJCQkJYnJlYWs7DQoJCQlkZWZhdWx0Og0KCQkJCXN0cmNhdChkYXRhLCAiICIpOw0KCQkJCXN0
cmNhdChkYXRhLCB2YWxzWzBdKTsNCgkJCQlicmVhazsNCgkJCX0gLyogZW5kIHN3aXRjaChqKSAq
Lw0KDQoJCQkvKiBmcmVlIHZhbHVlcyAqLw0KCQkJbGRhcF92YWx1ZV9mcmVlKHZhbHMpOw0KCQkJ
dmFscyA9IE5VTEw7DQoNCgkJCS8qIGluY3JlbWVudCBhdHRpYnV0ZSBwb2ludGVyICovDQoJCQlh
dHRyaWJ1dGUgPSBhdHRyc1srK2ldOw0KCQl9CS8qIGVuZCB3aGlsZSAoYXR0cmlidXRlICE9IE5V
TEwpICovDQoNCgkJaWYgKHR5cGUgPT0gTlVMTCkgew0KCQkJaXNjX2xvZ193cml0ZShkbnNfbGN0
eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAgICAgIEROU19MT0dNT0RVTEVfRExa
LCBJU0NfTE9HX0VSUk9SLA0KCQkJCSAgICAgICJMREFQIGRyaXZlciB1bmFibGUgIg0KCQkJCSAg
ICAgICJ0byByZXRyaWV2ZSBETlMgdHlwZSIpOw0KCQkJcmVzdWx0ID0gSVNDX1JfRkFJTFVSRTsN
CgkJCWdvdG8gY2xlYW51cDsNCgkJfQ0KDQoJCWlmIChzdHJsZW4oZGF0YSkgPCAxKSB7DQoJCQlp
c2NfbG9nX3dyaXRlKGRuc19sY3R4LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCQkJICAg
ICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJST1IsDQoJCQkJICAgICAgIkxEQVAgZHJp
dmVyIHVuYWJsZSAiDQoJCQkJICAgICAgInRvIHJldHJpZXZlIEROUyBkYXRhIik7DQoJCQlyZXN1
bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQkJZ290byBjbGVhbnVwOw0KCQl9DQoNCgkJaWYgKGFsbG5v
ZGVzICYmIGhvc3QgIT0gTlVMTCkgew0KCQkJaWYgKHN0cmNhc2VjbXAoaG9zdCwgIn4iKSA9PSAw
KQ0KCQkJCXJlc3VsdCA9IGRuc19zZGx6X3B1dG5hbWVkcnIoDQoJCQkJCQkoZG5zX3NkbHphbGxu
b2Rlc190ICopIHB0ciwNCgkJCQkJCSIqIiwgdHlwZSwgdHRsLCBkYXRhKTsNCgkJCWVsc2UNCgkJ
CQlyZXN1bHQgPSBkbnNfc2Rsel9wdXRuYW1lZHJyKA0KCQkJCQkJKGRuc19zZGx6YWxsbm9kZXNf
dCAqKSBwdHIsDQoJCQkJCQlob3N0LCB0eXBlLCB0dGwsIGRhdGEpOw0KCQkJaWYgKHJlc3VsdCAh
PSBJU0NfUl9TVUNDRVNTKQ0KCQkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsDQoJCQkJCUROU19M
T0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCQkJRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJS
T1IsDQoJCQkJCSJkbHotbGRhcDogcHV0bmFtZWRyciBmYWlsZWQgIg0KCQkJCQkiZm9yIFwiJXMg
JXMgJXUgJXNcIiwgJXMiLA0KCQkJCQlob3N0LCB0eXBlLCB0dGwsIGRhdGEsDQoJCQkJCWlzY19y
ZXN1bHRfdG90ZXh0KHJlc3VsdCkpOw0KCQl9IGVsc2Ugew0KCQkJcmVzdWx0ID0gZG5zX3NkbHpf
cHV0cnIoKGRuc19zZGx6bG9va3VwX3QgKikgcHRyLA0KCQkJCQkJdHlwZSwgdHRsLCBkYXRhKTsN
CgkJCWlmIChyZXN1bHQgIT0gSVNDX1JfU1VDQ0VTUykNCgkJCQlpc2NfbG9nX3dyaXRlKGRuc19s
Y3R4LA0KCQkJCQlETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCQkJCUROU19MT0dNT0RVTEVf
RExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJCQkiZGx6LWxkYXA6IHB1dHJyIGZhaWxlZCAiDQoJCQkJ
CSJmb3IgXCIlcyAldSAlc1wiLCAlcyIsDQoJCQkJCXR5cGUsIHR0bCwgZGF0YSwNCgkJCQkJaXNj
X3Jlc3VsdF90b3RleHQocmVzdWx0KSk7DQoJCX0NCg0KCQlpZiAocmVzdWx0ICE9IElTQ19SX1NV
Q0NFU1MpIHsNCgkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRB
QkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19FUlJPUiwNCgkJCQkg
ICAgICAiTERBUCBkcml2ZXIgZmFpbGVkICINCgkJCQkgICAgICAid2hpbGUgc2VuZGluZyBkYXRh
IHRvIEJJTkQuIik7DQoJCQlnb3RvIGNsZWFudXA7DQoJCX0NCg0KCQkvKiBmcmVlIG1lbW9yeSBm
b3IgdHlwZSwgZGF0YSBhbmQgaG9zdCBmb3IgbmV4dCBsb29wICovDQoJCWlzY19tZW1fZnJlZShu
c19nX21jdHgsIHR5cGUpOw0KCQlpc2NfbWVtX2ZyZWUobnNfZ19tY3R4LCBkYXRhKTsNCgkJaWYg
KGhvc3QgIT0gTlVMTCkNCgkJCWlzY19tZW1fZnJlZShuc19nX21jdHgsIGhvc3QpOw0KDQoJCS8q
IGdldCB0aGUgbmV4dCBlbnRyeSB0byBwcm9jZXNzICovDQoJCWVudHJ5ID0gbGRhcF9uZXh0X2Vu
dHJ5KGRiYywgZW50cnkpOw0KCX0gLyogZW5kIHdoaWxlIChlbnRyeSAhPSBOVUxMKSAqLw0KDQog
Y2xlYW51cDoNCgkvKiBkZS1hbGxvY2F0ZSBtZW1vcnkgKi8NCglpZiAodmFscyAhPSBOVUxMKQ0K
CQlsZGFwX3ZhbHVlX2ZyZWUodmFscyk7DQoJaWYgKGhvc3QgIT0gTlVMTCkNCgkJaXNjX21lbV9m
cmVlKG5zX2dfbWN0eCwgaG9zdCk7DQoJaWYgKHR5cGUgIT0gTlVMTCkNCgkJaXNjX21lbV9mcmVl
KG5zX2dfbWN0eCwgdHlwZSk7DQoJaWYgKGRhdGEgIT0gTlVMTCkNCgkJaXNjX21lbV9mcmVlKG5z
X2dfbWN0eCwgZGF0YSk7DQoNCglyZXR1cm4gKHJlc3VsdCk7DQp9DQoNCi8qJQ0KICogVGhpcyBm
dW5jdGlvbiBpcyB0aGUgcmVhbCBjb3JlIG9mIHRoZSBkcml2ZXIuICAgWm9uZSwgcmVjb3JkDQog
KiBhbmQgY2xpZW50IHN0cmluZ3MgYXJlIHBhc3NlZCBpbiAob3IgTlVMTCBpcyBwYXNzZWQgaWYg
dGhlDQogKiBzdHJpbmcgaXMgbm90IGF2YWlsYWJsZSkuICBUaGUgdHlwZSBvZiBxdWVyeSB3ZSB3
YW50IHRvIHJ1bg0KICogaXMgaW5kaWNhdGVkIGJ5IHRoZSBxdWVyeSBmbGFnLCBhbmQgdGhlIGRi
ZGF0YSBvYmplY3QgaXMgcGFzc2VkDQogKiBwYXNzZWQgaW4gdG8uICBkYmRhdGEgcmVhbGx5IGhv
bGRzIGVpdGhlcjoNCiAqCQkxKSBhIGxpc3Qgb2YgZGF0YWJhc2UgaW5zdGFuY2VzIChpbiBtdWx0
aXRocmVhZGVkIG1vZGUpIE9SDQogKgkJMikgYSBzaW5nbGUgZGF0YWJhc2UgaW5zdGFuY2UgKGlu
IHNpbmdsZSB0aHJlYWRlZCBtb2RlKQ0KICogVGhlIGZ1bmN0aW9uIHdpbGwgY29uc3RydWN0IHRo
ZSBxdWVyeSBhbmQgb2J0YWluIGFuIGF2YWlsYWJsZQ0KICogZGF0YWJhc2UgaW5zdGFuY2UgKERC
SSkuICBJdCB3aWxsIHRoZW4gcnVuIHRoZSBxdWVyeSBhbmQgaG9wZWZ1bGx5DQogKiBvYnRhaW4g
YSByZXN1bHQgc2V0Lg0KICovDQpzdGF0aWMgaXNjX3Jlc3VsdF90DQpsZGFwX2dldF9yZXN1bHRz
KGNvbnN0IGNoYXIgKnpvbmUsIGNvbnN0IGNoYXIgKnJlY29yZCwNCgkJIGNvbnN0IGNoYXIgKmNs
aWVudCwgdW5zaWduZWQgaW50IHF1ZXJ5LA0KCQkgdm9pZCAqZGJkYXRhLCB2b2lkICpwdHIpDQp7
DQoJaXNjX3Jlc3VsdF90IHJlc3VsdDsNCglkYmluc3RhbmNlX3QgKmRiaSA9IE5VTEw7DQoJY2hh
ciAqcXVlcnlzdHJpbmcgPSBOVUxMOw0KCUxEQVBVUkxEZXNjICpsZGFwX3VybCA9IE5VTEw7DQoJ
aW50IGxkYXBfcmVzdWx0ID0gMDsNCglMREFQTWVzc2FnZSAqbGRhcF9tc2cgPSBOVUxMOw0KCWlu
dCBpOw0KCWludCBlbnRyaWVzOw0KDQoJLyogZ2V0IGRiIGluc3RhbmNlIC8gY29ubmVjdGlvbiAq
Lw0KI2lmZGVmIElTQ19QTEFURk9STV9VU0VUSFJFQURTDQoNCgkvKiBmaW5kIGFuIGF2YWlsYWJs
ZSBEQkkgZnJvbSB0aGUgbGlzdCAqLw0KCWRiaSA9IGxkYXBfZmluZF9hdmFpbF9jb25uKChkYl9s
aXN0X3QgKikNCgkJCQkgICAoKGxkYXBfaW5zdGFuY2VfdCAqKWRiZGF0YSktPmRiKTsNCg0KI2Vs
c2UgLyogSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMgKi8NCg0KCS8qDQoJICogb25seSAxIERCSSAt
IG5vIG5lZWQgdG8gbG9jayBpbnN0YW5jZSBsb2NrIGVpdGhlcg0KCSAqIG9ubHkgMSB0aHJlYWQg
aW4gdGhlIHdob2xlIHByb2Nlc3MsIG5vIHBvc3NpYmxlIGNvbnRlbnRpb24uDQoJICovDQoJZGJp
ID0gIChkYmluc3RhbmNlX3QgKikgKChsZGFwX2luc3RhbmNlX3QgKilkYmRhdGEpLT5kYjsNCg0K
I2VuZGlmIC8qIElTQ19QTEFURk9STV9VU0VUSFJFQURTICovDQoNCgkvKiBpZiBEQkkgaXMgbnVs
bCwgY2FuJ3QgZG8gYW55dGhpbmcgZWxzZSAqLw0KCWlmIChkYmkgPT0gTlVMTCkNCgkJcmV0dXJu
IChJU0NfUl9GQUlMVVJFKTsNCg0KCS8qIHNldCBmaWVsZHMgKi8NCglpZiAoem9uZSAhPSBOVUxM
KSB7DQoJCWRiaS0+em9uZSA9IGlzY19tZW1fc3RyZHVwKG5zX2dfbWN0eCwgem9uZSk7DQoJCWlm
IChkYmktPnpvbmUgPT0gTlVMTCkgew0KCQkJcmVzdWx0ID0gSVNDX1JfTk9NRU1PUlk7DQoJCQln
b3RvIGNsZWFudXA7DQoJCX0NCgl9IGVsc2Ugew0KCQlkYmktPnpvbmUgPSBOVUxMOw0KCX0NCglp
ZiAocmVjb3JkICE9IE5VTEwpIHsNCgkJZGJpLT5yZWNvcmQgPSBpc2NfbWVtX3N0cmR1cChuc19n
X21jdHgsIHJlY29yZCk7DQoJCWlmIChkYmktPnJlY29yZCA9PSBOVUxMKSB7DQoJCQlyZXN1bHQg
PSBJU0NfUl9OT01FTU9SWTsNCgkJCWdvdG8gY2xlYW51cDsNCgkJfQ0KCX0gZWxzZSB7DQoJCWRi
aS0+cmVjb3JkID0gTlVMTDsNCgl9DQoJaWYgKGNsaWVudCAhPSBOVUxMKSB7DQoJCWRiaS0+Y2xp
ZW50ID0gaXNjX21lbV9zdHJkdXAobnNfZ19tY3R4LCBjbGllbnQpOw0KCQlpZiAoZGJpLT5jbGll
bnQgPT0gTlVMTCkgew0KCQkJcmVzdWx0ID0gSVNDX1JfTk9NRU1PUlk7DQoJCQlnb3RvIGNsZWFu
dXA7DQoJCX0NCgl9IGVsc2Ugew0KCQlkYmktPmNsaWVudCA9IE5VTEw7DQoJfQ0KDQoJLyogd2hh
dCB0eXBlIG9mIHF1ZXJ5IGFyZSB3ZSBnb2luZyB0byBydW4/ICovDQoJc3dpdGNoKHF1ZXJ5KSB7
DQoJY2FzZSBBTExOT0RFUzoNCgkJLyoNCgkJICogaWYgdGhlIHF1ZXJ5IHdhcyBub3QgcGFzc2Vk
IGluIGZyb20gdGhlIGNvbmZpZyBmaWxlDQoJCSAqIHRoZW4gd2UgY2FuJ3QgcnVuIGl0LiAgcmV0
dXJuIG5vdF9pbXBsZW1lbnRlZCwgc28NCgkJICogaXQncyBsaWtlIHRoZSBjb2RlIGZvciB0aGF0
IG9wZXJhdGlvbiB3YXMgbmV2ZXINCgkJICogYnVpbHQgaW50byB0aGUgZHJpdmVyLi4uLiBBSEhI
IGZsZXhpYmlsaXR5ISEhDQoJCSAqLw0KCQlpZiAoZGJpLT5hbGxub2Rlc19xID09IE5VTEwpIHsN
CgkJCXJlc3VsdCA9IElTQ19SX05PVElNUExFTUVOVEVEOw0KCQkJZ290byBjbGVhbnVwOw0KCQl9
IGVsc2Ugew0KCQkJcXVlcnlzdHJpbmcgPSBidWlsZF9xdWVyeXN0cmluZyhuc19nX21jdHgsDQoJ
CQlkYmktPmFsbG5vZGVzX3EpOw0KCQl9DQoJCWJyZWFrOw0KCWNhc2UgQUxMT1dYRlI6DQoJCS8q
IHNhbWUgYXMgY29tbWVudHMgYXMgQUxMTk9ERVMgKi8NCgkJaWYgKGRiaS0+YWxsb3d4ZnJfcSA9
PSBOVUxMKSB7DQoJCQlyZXN1bHQgPSBJU0NfUl9OT1RJTVBMRU1FTlRFRDsNCgkJCWdvdG8gY2xl
YW51cDsNCgkJfSBlbHNlIHsNCgkJCXF1ZXJ5c3RyaW5nID0gYnVpbGRfcXVlcnlzdHJpbmcobnNf
Z19tY3R4LA0KCQkJZGJpLT5hbGxvd3hmcl9xKTsNCgkJfQ0KCQlicmVhazsNCgljYXNlIEFVVEhP
UklUWToNCgkJLyogc2FtZSBhcyBjb21tZW50cyBhcyBBTExOT0RFUyAqLw0KCQlpZiAoZGJpLT5h
dXRob3JpdHlfcSA9PSBOVUxMKSB7DQoJCQlyZXN1bHQgPSBJU0NfUl9OT1RJTVBMRU1FTlRFRDsN
CgkJCWdvdG8gY2xlYW51cDsNCgkJfSBlbHNlIHsNCgkJCXF1ZXJ5c3RyaW5nID0gYnVpbGRfcXVl
cnlzdHJpbmcobnNfZ19tY3R4LA0KCQkJZGJpLT5hdXRob3JpdHlfcSk7DQoJCX0NCgkJYnJlYWs7
DQoJY2FzZSBGSU5EWk9ORToNCgkJLyogdGhpcyBpcyByZXF1aXJlZC4gIEl0J3MgdGhlIHdob2xl
IHBvaW50IG9mIERMWiEgKi8NCgkJaWYgKGRiaS0+ZmluZHpvbmVfcSA9PSBOVUxMKSB7DQoJCQlp
c2NfbG9nX3dyaXRlKGRuc19sY3R4LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCQkJICAg
ICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfREVCVUcoMiksDQoJCQkJICAgICAgIk5vIHF1
ZXJ5IHNwZWNpZmllZCBmb3IgZmluZHpvbmUuICAiDQoJCQkJICAgICAgIkZpbmR6b25lIHJlcXVp
cmVzIGEgcXVlcnkiKTsNCgkJCXJlc3VsdCA9IElTQ19SX0ZBSUxVUkU7DQoJCQlnb3RvIGNsZWFu
dXA7DQoJCX0gZWxzZSB7DQoJCQlxdWVyeXN0cmluZyA9IGJ1aWxkX3F1ZXJ5c3RyaW5nKG5zX2df
bWN0eCwNCgkJCWRiaS0+ZmluZHpvbmVfcSk7DQoJCX0NCgkJYnJlYWs7DQoJY2FzZSBMT09LVVA6
DQoJCS8qIHRoaXMgaXMgcmVxdWlyZWQuICBJdCdzIGFsc28gYSBtYWpvciBwb2ludCBvZiBETFoh
ICovDQoJCWlmIChkYmktPmxvb2t1cF9xID09IE5VTEwpIHsNCgkJCWlzY19sb2dfd3JpdGUoZG5z
X2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxF
X0RMWiwgSVNDX0xPR19ERUJVRygyKSwNCgkJCQkgICAgICAiTm8gcXVlcnkgc3BlY2lmaWVkIGZv
ciBsb29rdXAuICAiDQoJCQkJICAgICAgIkxvb2t1cCByZXF1aXJlcyBhIHF1ZXJ5Iik7DQoJCQly
ZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQkJZ290byBjbGVhbnVwOw0KCQl9IGVsc2Ugew0KCQkJ
cXVlcnlzdHJpbmcgPSBidWlsZF9xdWVyeXN0cmluZyhuc19nX21jdHgsDQoJCQkJCQkJZGJpLT5s
b29rdXBfcSk7DQoJCX0NCgkJYnJlYWs7DQoJZGVmYXVsdDoNCgkJLyoNCgkJICogdGhpcyBzaG91
bGQgbmV2ZXIgaGFwcGVuLiAgSWYgaXQgZG9lcywgdGhlIGNvZGUgaXMNCgkJICogc2NyZXdlZCB1
cCENCgkJICovDQoJCVVORVhQRUNURURfRVJST1IoX19GSUxFX18sIF9fTElORV9fLA0KCQkJCSAi
SW5jb3JyZWN0IHF1ZXJ5IGZsYWcgcGFzc2VkIHRvICINCgkJCQkgImxkYXBfZ2V0X3Jlc3VsdHMi
KTsNCgkJcmVzdWx0ID0gSVNDX1JfVU5FWFBFQ1RFRDsNCgkJZ290byBjbGVhbnVwOw0KCX0NCg0K
CS8qIGlmIHRoZSBxdWVyeXN0cmluZyBpcyBudWxsLCBCdW1tZXIsIG91dHRhIFJBTS4gIFVQR1JB
REUgVElNRSEhISAgICovDQoJaWYgKHF1ZXJ5c3RyaW5nICA9PSBOVUxMKSB7DQoJCXJlc3VsdCA9
IElTQ19SX05PTUVNT1JZOw0KCQlnb3RvIGNsZWFudXA7DQoJfQ0KDQoJLyoNCgkgKiBvdXRwdXQg
dGhlIGZ1bGwgcXVlcnkgc3RyaW5nIGR1cmluZyBkZWJ1ZyBzbyB3ZSBjYW4gc2VlDQoJICogd2hh
dCBsYW1lIGVycm9yIHRoZSBxdWVyeSBoYXMuDQoJICovDQoJaXNjX2xvZ193cml0ZShkbnNfbGN0
eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwg
SVNDX0xPR19ERUJVRygxKSwNCgkJICAgICAgIlxuUXVlcnkgU3RyaW5nOiAlc1xuIiwgcXVlcnlz
dHJpbmcpOw0KDQogICAgICAgIC8qIGJyZWFrIFVSTCBkb3duIGludG8gaXQncyBjb21wb25lbnQg
cGFydHMsIGlmIGVycm9yIGNsZWFudXAgKi8NCglsZGFwX3Jlc3VsdCA9IGxkYXBfdXJsX3BhcnNl
KHF1ZXJ5c3RyaW5nLCAmbGRhcF91cmwpOw0KCWlmIChsZGFwX3Jlc3VsdCAhPSBMREFQX1NVQ0NF
U1MgfHwgbGRhcF91cmwgPT0gTlVMTCkgew0KCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQln
b3RvIGNsZWFudXA7DQoJfQ0KCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCg0KCQkvKg0KCQkg
KiBkYmktPmRiY29ubiBtYXkgYmUgbnVsbCBpZiB0cnlpbmcgdG8gcmVjb25uZWN0IG9uIGENCgkJ
ICogcHJldmlvdXMgcXVlcnkgZmFpbGVkLg0KCQkgKi8NCgkJaWYgKGRiaS0+ZGJjb25uID09IE5V
TEwpIHsNCgkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFT
RSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19JTkZPLA0KCQkJCSAgICAg
ICJMREFQIGRyaXZlciBhdHRlbXB0aW5nIHRvIHJlLWNvbm5lY3QiKTsNCg0KCQkJcmVzdWx0ID0g
ZGx6X2xkYXBfY29ubmVjdCgobGRhcF9pbnN0YW5jZV90ICopIGRiZGF0YSwNCgkJCQkJCSAgZGJp
KTsNCgkJCWlmIChyZXN1bHQgIT0gSVNDX1JfU1VDQ0VTUykgew0KCQkJCXJlc3VsdCA9IElTQ19S
X0ZBSUxVUkU7DQoJCQkJY29udGludWU7DQoJCQl9DQoJCX0NCg0KCQkvKiBwZXJmb3JtIGxkYXAg
c2VhcmNoIHN5bmNyb25vdXNseSAqLw0KCQlsZGFwX3Jlc3VsdCA9IGxkYXBfc2VhcmNoX3MoKExE
QVAgKikgZGJpLT5kYmNvbm4sDQoJCQkJCSAgICBsZGFwX3VybC0+bHVkX2RuLA0KCQkJCQkgICAg
bGRhcF91cmwtPmx1ZF9zY29wZSwNCgkJCQkJICAgIGxkYXBfdXJsLT5sdWRfZmlsdGVyLA0KCQkJ
CQkgICAgbGRhcF91cmwtPmx1ZF9hdHRycywgMCwgJmxkYXBfbXNnKTsNCg0KCQkvKg0KCQkgKiBj
aGVjayByZXR1cm4gY29kZS4gIE5vIHN1Y2ggb2JqZWN0IGlzIG9rLCBqdXN0DQoJCSAqIGRpZG4n
dCBmaW5kIHdoYXQgd2Ugd2FudGVkDQoJCSAqLw0KCQlzd2l0Y2gobGRhcF9yZXN1bHQpIHsNCgkJ
Y2FzZSBMREFQX05PX1NVQ0hfT0JKRUNUOg0KICAgIAkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgs
IEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwg
SVNDX0xPR19ERUJVRygxKSwNCgkJCQkgICAgICAiTm8gb2JqZWN0IGZvdW5kIG1hdGNoaW5nICIN
CgkJCQkgICAgICAicXVlcnkgcmVxdWlyZW1lbnRzIik7DQoJCQlyZXN1bHQgPSBJU0NfUl9OT1RG
T1VORDsNCgkJCWdvdG8gY2xlYW51cDsNCgkJCWJyZWFrOw0KCQljYXNlIExEQVBfU1VDQ0VTUzoJ
Lyogb24gc3VjY2VzcyBkbyBub3RoaW5nICovDQoJCQlyZXN1bHQgPSBJU0NfUl9TVUNDRVNTOw0K
CQkJaSA9IDM7DQoJCQlicmVhazsNCgkJY2FzZSBMREFQX1NFUlZFUl9ET1dOOg0KCQkJaXNjX2xv
Z193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAgICAgIERO
U19MT0dNT0RVTEVfRExaLCBJU0NfTE9HX0lORk8sDQoJCQkJICAgICAgIkxEQVAgZHJpdmVyIGF0
dGVtcHRpbmcgdG8gcmUtY29ubmVjdCIpOw0KCQkJcmVzdWx0ID0gZGx6X2xkYXBfY29ubmVjdCgo
bGRhcF9pbnN0YW5jZV90ICopIGRiZGF0YSwNCgkJCQkJCSAgZGJpKTsNCgkJCWlmIChyZXN1bHQg
IT0gSVNDX1JfU1VDQ0VTUykNCgkJCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQkJYnJlYWs7
DQoJCWRlZmF1bHQ6DQoJCQkvKg0KCQkJICogb3RoZXIgZXJyb3JzIG5vdCBvay4gIExvZyBlcnJv
ciBtZXNzYWdlIGFuZA0KCQkJICogZ2V0IG91dA0KCQkJICovDQogICAgCQkJaXNjX2xvZ193cml0
ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAgICAgIEROU19MT0dN
T0RVTEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJCSAgICAgICJMREFQIGVycm9yOiAlcyIsDQoJ
CQkJICAgICAgbGRhcF9lcnIyc3RyaW5nKGxkYXBfcmVzdWx0KSk7DQoJCQlyZXN1bHQgPSBJU0Nf
Ul9GQUlMVVJFOw0KCQkJZ290byBjbGVhbnVwOw0KCQkJYnJlYWs7DQoJCX0gLyogY2xvc2Ugc3dp
dGNoKGxkYXBfcmVzdWx0KSAqLw0KCX0gLyogZW5kIGZvciAoaW50IGkgPSAwIGkgPCAzOyBpKysp
ICovDQoNCglpZiAocmVzdWx0ICE9IElTQ19SX1NVQ0NFU1MpDQoJCWdvdG8gY2xlYW51cDsNCg0K
CXN3aXRjaChxdWVyeSkgew0KCWNhc2UgQUxMTk9ERVM6DQoJCXJlc3VsdCA9IGxkYXBfcHJvY2Vz
c19yZXN1bHRzKChMREFQICopIGRiaS0+ZGJjb25uLCBsZGFwX21zZywNCgkJCQkJICAgICAgbGRh
cF91cmwtPmx1ZF9hdHRycywNCgkJCQkJICAgICAgcHRyLCBpc2NfYm9vbGVhbl90cnVlKTsNCgkJ
YnJlYWs7DQoJY2FzZSBBVVRIT1JJVFk6DQoJY2FzZSBMT09LVVA6DQoJCXJlc3VsdCA9IGxkYXBf
cHJvY2Vzc19yZXN1bHRzKChMREFQICopIGRiaS0+ZGJjb25uLCBsZGFwX21zZywNCgkJCQkJICAg
ICAgbGRhcF91cmwtPmx1ZF9hdHRycywNCgkJCQkJICAgICAgcHRyLCBpc2NfYm9vbGVhbl9mYWxz
ZSk7DQoJCWJyZWFrOw0KCWNhc2UgQUxMT1dYRlI6DQoJCWVudHJpZXMgPSBsZGFwX2NvdW50X2Vu
dHJpZXMoKExEQVAgKikgZGJpLT5kYmNvbm4sIGxkYXBfbXNnKTsNCgkJaWYgKGVudHJpZXMgPT0g
MCkNCgkJCXJlc3VsdCA9IElTQ19SX05PUEVSTTsNCgkJZWxzZSBpZiAoZW50cmllcyA+IDApDQoJ
CQlyZXN1bHQgPSBJU0NfUl9TVUNDRVNTOw0KCQllbHNlDQoJCQlyZXN1bHQgPSBJU0NfUl9GQUlM
VVJFOw0KCQlicmVhazsNCgljYXNlIEZJTkRaT05FOg0KCQllbnRyaWVzID0gbGRhcF9jb3VudF9l
bnRyaWVzKChMREFQICopIGRiaS0+ZGJjb25uLCBsZGFwX21zZyk7DQoJCWlmIChlbnRyaWVzID09
IDApDQoJCQlyZXN1bHQgPSBJU0NfUl9OT1RGT1VORDsNCgkJZWxzZSBpZiAoZW50cmllcyA+IDAp
DQoJCQlyZXN1bHQgPSBJU0NfUl9TVUNDRVNTOw0KCQllbHNlDQoJCQlyZXN1bHQgPSBJU0NfUl9G
QUlMVVJFOw0KCQlicmVhazsNCglkZWZhdWx0Og0KCQkvKg0KCQkgKiB0aGlzIHNob3VsZCBuZXZl
ciBoYXBwZW4uICBJZiBpdCBkb2VzLCB0aGUgY29kZSBpcw0KCQkgKiBzY3Jld2VkIHVwIQ0KCQkg
Ki8NCgkJVU5FWFBFQ1RFRF9FUlJPUihfX0ZJTEVfXywgX19MSU5FX18sDQoJCQkJICJJbmNvcnJl
Y3QgcXVlcnkgZmxhZyBwYXNzZWQgdG8gIg0KCQkJCSAibGRhcF9nZXRfcmVzdWx0cyIpOw0KCQly
ZXN1bHQgPSBJU0NfUl9VTkVYUEVDVEVEOw0KCX0NCg0KIGNsZWFudXA6DQoJLyogaXQncyBhbHdh
eXMgZ29vZCB0byBjbGVhbnVwIGFmdGVyIHlvdXJzZWxmICovDQoNCiAgICAgICAgLyogaWYgd2Ug
cmV0cmlldmVkIHJlc3VsdHMsIGZyZWUgdGhlbSAqLw0KCWlmIChsZGFwX21zZyAhPSBOVUxMKQ0K
CQlsZGFwX21zZ2ZyZWUobGRhcF9tc2cpOw0KCWlmIChsZGFwX3VybCAhPSBOVUxMKQ0KCQlsZGFw
X2ZyZWVfdXJsZGVzYyhsZGFwX3VybCk7DQoJLyogY2xlYW51cCAqLw0KCWlmIChkYmktPnpvbmUg
IT0gTlVMTCkNCgkJaXNjX21lbV9mcmVlKG5zX2dfbWN0eCwgZGJpLT56b25lKTsNCglpZiAoZGJp
LT5yZWNvcmQgIT0gTlVMTCkNCgkJaXNjX21lbV9mcmVlKG5zX2dfbWN0eCwgZGJpLT5yZWNvcmQp
Ow0KCWlmIChkYmktPmNsaWVudCAhPSBOVUxMKQ0KCQlpc2NfbWVtX2ZyZWUobnNfZ19tY3R4LCBk
YmktPmNsaWVudCk7DQoNCiNpZmRlZiBJU0NfUExBVEZPUk1fVVNFVEhSRUFEUw0KDQoJLyogcmVs
ZWFzZSB0aGUgbG9jayBzbyBhbm90aGVyIHRocmVhZCBjYW4gdXNlIHRoaXMgZGJpICovDQoJaXNj
X211dGV4X3VubG9jaygmZGJpLT5pbnN0YW5jZV9sb2NrKTsNCg0KI2VuZGlmIC8qIElTQ19QTEFU
Rk9STV9VU0VUSFJFQURTICovDQoNCiAgICAgICAgLyogcmVsZWFzZSBxdWVyeSBzdHJpbmcgKi8N
CglpZiAocXVlcnlzdHJpbmcgICE9IE5VTEwpDQoJCWlzY19tZW1fZnJlZShuc19nX21jdHgsIHF1
ZXJ5c3RyaW5nICk7DQoNCgkvKiByZXR1cm4gcmVzdWx0ICovDQoJcmV0dXJuIChyZXN1bHQpOw0K
fQ0KDQovKg0KICogRExaIG1ldGhvZHMNCiAqLw0Kc3RhdGljIGlzY19yZXN1bHRfdA0KZGx6X2xk
YXBfYWxsb3d6b25leGZyKHZvaWQgKmRyaXZlcmFyZywgdm9pZCAqZGJkYXRhLCBjb25zdCBjaGFy
ICpuYW1lLA0KCQkgICAgICBjb25zdCBjaGFyICpjbGllbnQpDQp7DQoJaXNjX3Jlc3VsdF90IHJl
c3VsdDsNCg0KCVVOVVNFRChkcml2ZXJhcmcpOw0KDQoJLyogY2hlY2sgdG8gc2VlIGlmIHdlIGFy
ZSBhdXRob3JpdGF0aXZlIGZvciB0aGUgem9uZSBmaXJzdCAqLw0KCXJlc3VsdCA9IGRsel9sZGFw
X2ZpbmR6b25lKGRyaXZlcmFyZywgZGJkYXRhLCBuYW1lKTsNCglpZiAocmVzdWx0ICE9IElTQ19S
X1NVQ0NFU1MpIHsNCgkJcmV0dXJuIChyZXN1bHQpOw0KCX0NCg0KICAgICAgICAvKiBnZXQgYWxs
IHRoZSB6b25lIGRhdGEgKi8NCglyZXN1bHQgPSBsZGFwX2dldF9yZXN1bHRzKG5hbWUsIE5VTEws
IGNsaWVudCwgQUxMT1dYRlIsIGRiZGF0YSwgTlVMTCk7DQoJcmV0dXJuIChyZXN1bHQpOw0KfQ0K
DQpzdGF0aWMgaXNjX3Jlc3VsdF90DQpkbHpfbGRhcF9hbGxub2Rlcyhjb25zdCBjaGFyICp6b25l
LCB2b2lkICpkcml2ZXJhcmcsIHZvaWQgKmRiZGF0YSwNCgkJICBkbnNfc2RsemFsbG5vZGVzX3Qg
KmFsbG5vZGVzKQ0Kew0KCVVOVVNFRChkcml2ZXJhcmcpOw0KCXJldHVybiAobGRhcF9nZXRfcmVz
dWx0cyh6b25lLCBOVUxMLCBOVUxMLCBBTExOT0RFUywgZGJkYXRhLCBhbGxub2RlcykpOw0KfQ0K
DQpzdGF0aWMgaXNjX3Jlc3VsdF90DQpkbHpfbGRhcF9hdXRob3JpdHkoY29uc3QgY2hhciAqem9u
ZSwgdm9pZCAqZHJpdmVyYXJnLCB2b2lkICpkYmRhdGEsDQoJCSAgIGRuc19zZGx6bG9va3VwX3Qg
Kmxvb2t1cCkNCnsNCglVTlVTRUQoZHJpdmVyYXJnKTsNCglyZXR1cm4gKGxkYXBfZ2V0X3Jlc3Vs
dHMoem9uZSwgTlVMTCwgTlVMTCwgQVVUSE9SSVRZLCBkYmRhdGEsIGxvb2t1cCkpOw0KfQ0KDQpz
dGF0aWMgaXNjX3Jlc3VsdF90DQpkbHpfbGRhcF9maW5kem9uZSh2b2lkICpkcml2ZXJhcmcsIHZv
aWQgKmRiZGF0YSwgY29uc3QgY2hhciAqbmFtZSkgew0KCVVOVVNFRChkcml2ZXJhcmcpOw0KCXJl
dHVybiAobGRhcF9nZXRfcmVzdWx0cyhuYW1lLCBOVUxMLCBOVUxMLCBGSU5EWk9ORSwgZGJkYXRh
LCBOVUxMKSk7DQp9DQoNCnN0YXRpYyBpc2NfcmVzdWx0X3QNCmRsel9sZGFwX2xvb2t1cChjb25z
dCBjaGFyICp6b25lLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkcml2ZXJhcmcsDQoJCXZvaWQg
KmRiZGF0YSwgZG5zX3NkbHpsb29rdXBfdCAqbG9va3VwKQ0Kew0KCWlzY19yZXN1bHRfdCByZXN1
bHQ7DQoJVU5VU0VEKGRyaXZlcmFyZyk7DQoNCglpZiAoc3RyY21wKG5hbWUsICIqIikgPT0gMCkN
CgkJcmVzdWx0ID0gbGRhcF9nZXRfcmVzdWx0cyh6b25lLCAifiIsIE5VTEwsIExPT0tVUCwNCgkJ
CQkJICBkYmRhdGEsIGxvb2t1cCk7DQoJZWxzZQ0KCQlyZXN1bHQgPSBsZGFwX2dldF9yZXN1bHRz
KHpvbmUsIG5hbWUsIE5VTEwsIExPT0tVUCwNCgkJCQkJICBkYmRhdGEsIGxvb2t1cCk7DQoJcmV0
dXJuIChyZXN1bHQpOw0KfQ0KDQoNCnN0YXRpYyBpc2NfcmVzdWx0X3QNCmRsel9sZGFwX2NyZWF0
ZShjb25zdCBjaGFyICpkbHpuYW1lLCB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqYXJndltdLA0K
CQl2b2lkICpkcml2ZXJhcmcsIHZvaWQgKipkYmRhdGEpDQp7DQoJaXNjX3Jlc3VsdF90IHJlc3Vs
dDsNCglsZGFwX2luc3RhbmNlX3QgKmxkYXBfaW5zdCA9IE5VTEw7DQoJZGJpbnN0YW5jZV90ICpk
YmkgPSBOVUxMOw0KCWludCBwcm90b2NvbDsNCglpbnQgbWV0aG9kOw0KDQojaWZkZWYgSVNDX1BM
QVRGT1JNX1VTRVRIUkVBRFMNCgkvKiBpZiBtdWx0aS10aHJlYWRlZCwgd2UgbmVlZCBhIGZldyBl
eHRyYSB2YXJpYWJsZXMuICovDQoJaW50IGRiY291bnQ7DQoJY2hhciAqZW5kcDsNCi8qIGRiX2xp
c3RfdCAqZGJsaXN0ID0gTlVMTDsgKi8NCglpbnQgaTsNCg0KI2VuZGlmIC8qIElTQ19QTEFURk9S
TV9VU0VUSFJFQURTICovDQoNCglVTlVTRUQoZGx6bmFtZSk7DQoJVU5VU0VEKGRyaXZlcmFyZyk7
DQoNCiNpZmRlZiBJU0NfUExBVEZPUk1fVVNFVEhSRUFEUw0KCS8qIGlmIGRlYnVnZ2luZywgbGV0
IHVzZXIga25vdyB3ZSBhcmUgbXVsdGl0aHJlYWRlZC4gKi8NCglpc2NfbG9nX3dyaXRlKGRuc19s
Y3R4LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCSAgICAgIEROU19MT0dNT0RVTEVfRExa
LCBJU0NfTE9HX0RFQlVHKDEpLA0KCQkgICAgICAiTERBUCBkcml2ZXIgcnVubmluZyBtdWx0aXRo
cmVhZGVkIik7DQojZWxzZSAvKiBJU0NfUExBVEZPUk1fVVNFVEhSRUFEUyAqLw0KCS8qIGlmIGRl
YnVnZ2luZywgbGV0IHVzZXIga25vdyB3ZSBhcmUgc2luZ2xlIHRocmVhZGVkLiAqLw0KCWlzY19s
b2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJICAgICAgRE5T
X0xPR01PRFVMRV9ETFosIElTQ19MT0dfREVCVUcoMSksDQoJCSAgICAgICJMREFQIGRyaXZlciBy
dW5uaW5nIHNpbmdsZSB0aHJlYWRlZCIpOw0KI2VuZGlmIC8qIElTQ19QTEFURk9STV9VU0VUSFJF
QURTICovDQoNCglpZiAoYXJnYyA8IDkpIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5T
X0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19M
T0dfRVJST1IsDQoJCQkgICAgICAiTERBUCBkcml2ZXIgcmVxdWlyZXMgYXQgbGVhc3QgIg0KCQkJ
ICAgICAgIjggY29tbWFuZCBsaW5lIGFyZ3MuIik7DQoJCXJldHVybiAoSVNDX1JfRkFJTFVSRSk7
DQoJfQ0KDQoJLyogbm8gbW9yZSB0aGFuIDEzIGFyZydzIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhl
IGRyaXZlciAqLw0KCWlmIChhcmdjID4gMTIpIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwg
RE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElT
Q19MT0dfRVJST1IsDQoJCQkgICAgICAiTERBUCBkcml2ZXIgY2Fubm90IGFjY2VwdCBtb3JlIHRo
YW4gIg0KCQkJICAgICAgIjExIGNvbW1hbmQgbGluZSBhcmdzLiIpOw0KCQlyZXR1cm4gKElTQ19S
X0ZBSUxVUkUpOw0KCX0NCg0KCS8qIGRldGVybWluZSBwcm90b2NvbCB2ZXJzaW9uLiAqLw0KCWlm
IChzdHJuY2FzZWNtcChhcmd2WzJdLCBWMiwgc3RybGVuKFYyKSkgPT0gMCkgew0KCQlwcm90b2Nv
bCA9IDI7DQoJfSBlbHNlIGlmIChzdHJuY2FzZWNtcChhcmd2WzJdLCBWMywgc3RybGVuKFYzKSkg
PT0gMCkgew0KCQlwcm90b2NvbCA9IDM7DQoJfSBlbHNlIHsNCgkJaXNjX2xvZ193cml0ZShkbnNf
bGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9E
TFosIElTQ19MT0dfRVJST1IsDQoJCQkgICAgICAiTERBUCBkcml2ZXIgcHJvdG9jb2wgbXVzdCBi
ZSBlaXRoZXIgJXMgb3IgJXMiLA0KCQkJICAgICAgVjIsIFYzKTsNCgkJcmV0dXJuIChJU0NfUl9G
QUlMVVJFKTsNCgl9DQoNCgkvKiBkZXRlcm1pbmUgY29ubmVjdGlvbiBtZXRob2QuICovDQoJaWYg
KHN0cm5jYXNlY21wKGFyZ3ZbM10sIFNJTVBMRSwgc3RybGVuKFNJTVBMRSkpID09IDApIHsNCgkJ
bWV0aG9kID0gTERBUF9BVVRIX1NJTVBMRTsNCgl9IGVsc2UgaWYgKHN0cm5jYXNlY21wKGFyZ3Zb
M10sIEtSQjQxLCBzdHJsZW4oS1JCNDEpKSA9PSAwKSB7DQoJCW1ldGhvZCA9IExEQVBfQVVUSF9L
UkJWNDE7DQoJfSBlbHNlIGlmIChzdHJuY2FzZWNtcChhcmd2WzNdLCBLUkI0Miwgc3RybGVuKEtS
QjQyKSkgPT0gMCkgew0KCQltZXRob2QgPSBMREFQX0FVVEhfS1JCVjQyOw0KCX0gZWxzZSB7DQoJ
CWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCSAg
ICAgIEROU19MT0dNT0RVTEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJICAgICAgIkxEQVAgZHJp
dmVyIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBtdXN0IGJlICINCgkJCSAgICAgICJvbmUgb2YgJXMs
ICVzIG9yICVzIiwNCgkJCSAgICAgIFNJTVBMRSwgS1JCNDEsIEtSQjQyKTsNCgkJcmV0dXJuIChJ
U0NfUl9GQUlMVVJFKTsNCgl9DQoNCgkvKiBtdWx0aXRocmVhZGVkIGJ1aWxkIGNhbiBoYXZlIG11
bHRpcGxlIERCIGNvbm5lY3Rpb25zICovDQojaWZkZWYgSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMN
Cg0KCS8qIGNoZWNrIGhvdyBtYW55IGRiIGNvbm5lY3Rpb25zIHdlIHNob3VsZCBjcmVhdGUgKi8N
CglkYmNvdW50ID0gc3RydG9sKGFyZ3ZbMV0sICZlbmRwLCAxMCk7DQoJaWYgKCplbmRwICE9ICdc
MCcgfHwgZGJjb3VudCA8IDApIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NB
VEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJS
T1IsDQoJCQkgICAgICAiTERBUCBkcml2ZXIgZGF0YWJhc2UgY29ubmVjdGlvbiBjb3VudCAiDQoJ
CQkgICAgICAibXVzdCBiZSBwb3NpdGl2ZS4iKTsNCgkJcmV0dXJuIChJU0NfUl9GQUlMVVJFKTsN
Cgl9DQojZW5kaWYNCg0KCS8qIGNoZWNrIHRoYXQgTERBUCBVUkwgcGFyYW1ldGVycyBtYWtlIHNl
bnNlICovDQoJc3dpdGNoKGFyZ2MpIHsNCgljYXNlIDEyOg0KCQlyZXN1bHQgPSBkbHpfbGRhcF9j
aGVja1VSTChhcmd2WzExXSwgMCwgImFsbG93IHpvbmUgdHJhbnNmZXIiKTsNCgkJaWYgKHJlc3Vs
dCAhPSBJU0NfUl9TVUNDRVNTKQ0KCQkJcmV0dXJuIChyZXN1bHQpOw0KCWNhc2UgMTE6DQoJCXJl
c3VsdCA9IGRsel9sZGFwX2NoZWNrVVJMKGFyZ3ZbMTBdLCAzLCAiYWxsIG5vZGVzIik7DQoJCWlm
IChyZXN1bHQgIT0gSVNDX1JfU1VDQ0VTUykNCgkJCXJldHVybiAocmVzdWx0KTsNCgljYXNlIDEw
Og0KCQlpZiAoc3RybGVuKGFyZ3ZbOV0pID4gMCkgew0KCQkJcmVzdWx0ID0gZGx6X2xkYXBfY2hl
Y2tVUkwoYXJndls5XSwgMywgImF1dGhvcml0eSIpOw0KCQkJaWYgKHJlc3VsdCAhPSBJU0NfUl9T
VUNDRVNTKQ0KCQkJCXJldHVybiAocmVzdWx0KTsNCgkJfQ0KCWNhc2UgOToNCgkJcmVzdWx0ID0g
ZGx6X2xkYXBfY2hlY2tVUkwoYXJndls4XSwgMywgImxvb2t1cCIpOw0KCQlpZiAocmVzdWx0ICE9
IElTQ19SX1NVQ0NFU1MpDQoJCQlyZXR1cm4gKHJlc3VsdCk7DQoJCXJlc3VsdCA9IGRsel9sZGFw
X2NoZWNrVVJMKGFyZ3ZbN10sIDAsICJmaW5kIHpvbmUiKTsNCgkJaWYgKHJlc3VsdCAhPSBJU0Nf
Ul9TVUNDRVNTKQ0KCQkJcmV0dXJuIChyZXN1bHQpOw0KCQlicmVhazsNCglkZWZhdWx0Og0KCQkv
KiBub3QgcmVhbGx5IG5lZWRlZCwgc2hvdWxkIHNodXQgdXAgY29tcGlsZXIuICovDQoJCXJlc3Vs
dCA9IElTQ19SX0ZBSUxVUkU7DQoJfQ0KDQoJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBMREFQIGlu
c3RhbmNlICovDQoJbGRhcF9pbnN0ID0gaXNjX21lbV9nZXQobnNfZ19tY3R4LCBzaXplb2YobGRh
cF9pbnN0YW5jZV90KSk7DQoJaWYgKGxkYXBfaW5zdCA9PSBOVUxMKQ0KCQlyZXR1cm4gKElTQ19S
X05PTUVNT1JZKTsNCgltZW1zZXQobGRhcF9pbnN0LCAwLCBzaXplb2YobGRhcF9pbnN0YW5jZV90
KSk7DQoNCgkvKiBzdG9yZSBpbmZvIG5lZWRlZCB0byBhdXRvbWF0aWNhbGx5IHJlLWNvbm5lY3Qu
ICovDQoJbGRhcF9pbnN0LT5wcm90b2NvbCA9IHByb3RvY29sOw0KCWxkYXBfaW5zdC0+bWV0aG9k
ID0gbWV0aG9kOw0KCWxkYXBfaW5zdC0+aG9zdHMgPSBpc2NfbWVtX3N0cmR1cChuc19nX21jdHgs
IGFyZ3ZbNl0pOw0KCWlmIChsZGFwX2luc3QtPmhvc3RzID09IE5VTEwpIHsNCgkJcmVzdWx0ID0g
SVNDX1JfTk9NRU1PUlk7DQoJCWdvdG8gY2xlYW51cDsNCgl9DQoJbGRhcF9pbnN0LT51c2VyID0g
aXNjX21lbV9zdHJkdXAobnNfZ19tY3R4LCBhcmd2WzRdKTsNCglpZiAobGRhcF9pbnN0LT51c2Vy
ID09IE5VTEwpIHsNCgkJcmVzdWx0ID0gSVNDX1JfTk9NRU1PUlk7DQoJCWdvdG8gY2xlYW51cDsN
Cgl9DQoJbGRhcF9pbnN0LT5jcmVkID0gaXNjX21lbV9zdHJkdXAobnNfZ19tY3R4LCBhcmd2WzVd
KTsNCglpZiAobGRhcF9pbnN0LT5jcmVkID09IE5VTEwpIHsNCgkJcmVzdWx0ID0gSVNDX1JfTk9N
RU1PUlk7DQoJCWdvdG8gY2xlYW51cDsNCgl9DQoNCiNpZmRlZiBJU0NfUExBVEZPUk1fVVNFVEhS
RUFEUw0KCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGF0YWJhc2UgY29ubmVjdGlvbiBsaXN0ICov
DQoJbGRhcF9pbnN0LT5kYiA9IGlzY19tZW1fZ2V0KG5zX2dfbWN0eCwgc2l6ZW9mKGRiX2xpc3Rf
dCkpOw0KCWlmIChsZGFwX2luc3QtPmRiID09IE5VTEwpIHsNCgkJcmVzdWx0ID0gSVNDX1JfTk9N
RU1PUlk7DQoJCWdvdG8gY2xlYW51cDsNCgl9DQoNCgkvKiBpbml0aWFsaXplIERCIGNvbm5lY3Rp
b24gbGlzdCAqLw0KCUlTQ19MSVNUX0lOSVQoKihsZGFwX2luc3QtPmRiKSk7DQoNCgkvKg0KCSAq
IGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRhdGFiYXNlIGluc3RhbmNlcyAoREJJ
KQ0KCSAqIGFwcGVuZCBlYWNoIG5ldyBEQkkgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdA0KCSAqLw0K
CWZvciAoaSA9IDA7IGkgPCBkYmNvdW50OyBpKyspIHsNCg0KI2VuZGlmIC8qIElTQ19QTEFURk9S
TV9VU0VUSFJFQURTICovDQoNCgkJLyogaG93IG1hbnkgcXVlcmllcyB3ZXJlIHBhc3NlZCBpbiBm
cm9tIGNvbmZpZyBmaWxlPyAqLw0KCQlzd2l0Y2goYXJnYykgew0KCQljYXNlIDk6DQoJCQlyZXN1
bHQgPSBidWlsZF9zcWxkYmluc3RhbmNlKG5zX2dfbWN0eCwgTlVMTCwgTlVMTCwNCgkJCQkJCSAg
ICAgTlVMTCwgYXJndls3XSwgYXJndls4XSwNCgkJCQkJCSAgICAgTlVMTCwgJmRiaSk7DQoJCQli
cmVhazsNCgkJY2FzZSAxMDoNCgkJCXJlc3VsdCA9IGJ1aWxkX3NxbGRiaW5zdGFuY2UobnNfZ19t
Y3R4LCBOVUxMLCBOVUxMLA0KCQkJCQkJICAgICBhcmd2WzldLCBhcmd2WzddLCBhcmd2WzhdLA0K
CQkJCQkJICAgICBOVUxMLCAmZGJpKTsNCgkJCWJyZWFrOw0KCQljYXNlIDExOg0KCQkJcmVzdWx0
ID0gYnVpbGRfc3FsZGJpbnN0YW5jZShuc19nX21jdHgsIGFyZ3ZbMTBdLCBOVUxMLA0KCQkJCQkJ
ICAgICBhcmd2WzldLCBhcmd2WzddLCBhcmd2WzhdLA0KCQkJCQkJICAgICBOVUxMLCAmZGJpKTsN
CgkJCWJyZWFrOw0KCQljYXNlIDEyOg0KCQkJcmVzdWx0ID0gYnVpbGRfc3FsZGJpbnN0YW5jZShu
c19nX21jdHgsIGFyZ3ZbMTBdLA0KCQkJCQkJICAgICBhcmd2WzExXSwgYXJndls5XSwNCgkJCQkJ
CSAgICAgYXJndls3XSwgYXJndls4XSwNCgkJCQkJCSAgICAgTlVMTCwgJmRiaSk7DQoJCQlicmVh
azsNCgkJZGVmYXVsdDoNCgkJCS8qIG5vdCByZWFsbHkgbmVlZGVkLCBzaG91bGQgc2h1dCB1cCBj
b21waWxlci4gKi8NCgkJCXJlc3VsdCA9IElTQ19SX0ZBSUxVUkU7DQoJCX0NCg0KCQlpZiAocmVz
dWx0ID09IElTQ19SX1NVQ0NFU1MpIHsNCgkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19M
T0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xP
R19ERUJVRygyKSwNCgkJCQkgICAgICAiTERBUCBkcml2ZXIgY3JlYXRlZCAiDQoJCQkJICAgICAg
ImRhdGFiYXNlIGluc3RhbmNlIG9iamVjdC4iKTsNCgkJfSBlbHNlIHsgLyogdW5zdWNjZXNzZnVs
PywgbG9nIGVyciBtc2cgYW5kIGNsZWFudXAuICovDQoJCQlpc2NfbG9nX3dyaXRlKGRuc19sY3R4
LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFos
IElTQ19MT0dfRVJST1IsDQoJCQkJICAgICAgIkxEQVAgZHJpdmVyIGNvdWxkIG5vdCBjcmVhdGUg
Ig0KCQkJCSAgICAgICJkYXRhYmFzZSBpbnN0YW5jZSBvYmplY3QuIik7DQoJCQlnb3RvIGNsZWFu
dXA7DQoJCX0NCg0KI2lmZGVmIElTQ19QTEFURk9STV9VU0VUSFJFQURTDQoJCS8qIHdoZW4gbXVs
dGl0aHJlYWRlZCwgYnVpbGQgYSBsaXN0IG9mIERCSSdzICovDQoJCUlTQ19MSU5LX0lOSVQoZGJp
LCBsaW5rKTsNCgkJSVNDX0xJU1RfQVBQRU5EKCoobGRhcF9pbnN0LT5kYiksIGRiaSwgbGluayk7
DQojZWxzZQ0KCQkvKg0KCQkgKiB3aGVuIHNpbmdsZSB0aHJlYWRlZCwgaG9sZCBvbnRvIHRoZSBv
bmUgY29ubmVjdGlvbg0KCQkgKiBpbnN0YW5jZS4NCgkJICovDQoJCWxkYXBfaW5zdC0+ZGIgPSBk
Ymk7DQoNCiNlbmRpZg0KCQkvKiBhdHRlbXB0IHRvIGNvbm5lY3QgKi8NCgkJcmVzdWx0ID0gZGx6
X2xkYXBfY29ubmVjdChsZGFwX2luc3QsIGRiaSk7DQoNCgkJLyoNCgkJICogaWYgZGIgY29ubmVj
dGlvbiBjYW5ub3QgYmUgY3JlYXRlZCwgbG9nIGVyciBtc2cgYW5kDQoJCSAqIGNsZWFudXAuDQoJ
CSAqLw0KCQlzd2l0Y2gocmVzdWx0KSB7DQoJCQkvKiBzdWNjZXNzLCBkbyBub3RoaW5nICovDQoJ
CWNhc2UgSVNDX1JfU1VDQ0VTUzoNCgkJCWJyZWFrOw0KCQkJLyoNCgkJCSAqIG5vIG1lbW9yeSBt
ZWFucyBsZGFwX2luaXQgY291bGQgbm90DQoJCQkgKiBhbGxvY2F0ZSBtZW1vcnkNCgkJCSAqLw0K
CQljYXNlIElTQ19SX05PTUVNT1JZOg0KI2lmZGVmIElTQ19QTEFURk9STV9VU0VUSFJFQURTDQoJ
CQlpc2NfbG9nX3dyaXRlKGRuc19sY3R4LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCQkJ
ICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJST1IsDQoJCQkJICAgICAgIkxEQVAg
ZHJpdmVyIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgIg0KCQkJCSAgICAgICJmb3IgY29ubmVj
dGlvbiBudW1iZXIgJXUiLA0KCQkJCSAgICAgIGkrMSk7DQojZWxzZQ0KCQkJaXNjX2xvZ193cml0
ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAgICAgIEROU19MT0dN
T0RVTEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJCSAgICAgICJMREFQIGRyaXZlciBjb3VsZCBu
b3QgYWxsb2NhdGUgbWVtb3J5ICINCgkJCQkgICAgICAiZm9yIGNvbm5lY3Rpb24iKTsNCiNlbmRp
Zg0KCQkJZ290byBjbGVhbnVwOw0KCQkJYnJlYWs7DQoJCQkvKg0KCQkJICogbm8gcGVybSBtZWFu
cyBsZGFwX3NldF9vcHRpb24gY291bGQgbm90IHNldA0KCQkJICogcHJvdG9jb2wgdmVyc2lvbg0K
CQkJICovDQoJCWNhc2UgSVNDX1JfTk9QRVJNOg0KCQkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwg
RE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAgICAgIEROU19MT0dNT0RVTEVfRExaLCBJ
U0NfTE9HX0VSUk9SLA0KCQkJCSAgICAgICJMREFQIGRyaXZlciBjb3VsZCBub3QgIg0KCQkJCSAg
ICAgICJzZXQgcHJvdG9jb2wgdmVyc2lvbi4iKTsNCgkJCXJlc3VsdCA9IElTQ19SX0ZBSUxVUkU7
DQoJCQlnb3RvIGNsZWFudXA7DQoJCQlicmVhazsNCgkJCS8qIGZhaWx1cmUgbWVhbnMgY291bGRu
J3QgY29ubmVjdCB0byBsZGFwIHNlcnZlciAqLw0KCQljYXNlIElTQ19SX0ZBSUxVUkU6DQojaWZk
ZWYgSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMNCgkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIERO
U19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVND
X0xPR19FUlJPUiwNCgkJCQkgICAgICAiTERBUCBkcml2ZXIgY291bGQgbm90ICINCgkJCQkgICAg
ICAiYmluZCBjb25uZWN0aW9uIG51bWJlciAldSB0byBzZXJ2ZXIuIiwNCgkJCQkgICAgICBpKzEp
Ow0KI2Vsc2UNCgkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRB
QkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19FUlJPUiwNCgkJCQkg
ICAgICAiTERBUCBkcml2ZXIgY291bGQgbm90ICINCgkJCQkgICAgICAiYmluZCBjb25uZWN0aW9u
IHRvIHNlcnZlci4iKTsNCiNlbmRpZg0KCQkJZ290byBjbGVhbnVwOw0KCQkJYnJlYWs7DQoJCQkv
Kg0KCQkJICogZGVmYXVsdCBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgSWYgaXQgZG9lcywNCgkJCSAq
IG1ham9yIGVycm9ycy4NCgkJCSAqLw0KCQlkZWZhdWx0Og0KCQkJVU5FWFBFQ1RFRF9FUlJPUihf
X0ZJTEVfXywgX19MSU5FX18sDQoJCQkJCSAiZGx6X2xkYXBfY3JlYXRlKCkgZmFpbGVkOiAlcyIs
DQoJCQkJCSBpc2NfcmVzdWx0X3RvdGV4dChyZXN1bHQpKTsNCgkJCXJlc3VsdCA9IElTQ19SX1VO
RVhQRUNURUQ7DQoJCQlnb3RvIGNsZWFudXA7DQoJCQlicmVhazsNCgkJfSAvKiBlbmQgc3dpdGNo
KHJlc3VsdCkgKi8NCg0KDQojaWZkZWYgSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMNCg0KCQkvKiBz
ZXQgREJJID0gbnVsbCBmb3IgbmV4dCBsb29wIHRocm91Z2guICovDQoJCWRiaSA9IE5VTEw7DQoJ
fQkvKiBlbmQgZm9yIGxvb3AgKi8NCg0KI2VuZGlmIC8qIElTQ19QTEFURk9STV9VU0VUSFJFQURT
ICovDQoNCg0KCS8qIHNldCBkYmRhdGEgdG8gdGhlIGxkYXBfaW5zdGFuY2Ugd2UgY3JlYXRlZC4g
Ki8NCgkqZGJkYXRhID0gbGRhcF9pbnN0Ow0KDQoJLyogaGV5LCB3ZSBnb3QgdGhyb3VnaCBhbGwg
b2YgdGhhdCBvaywgcmV0dXJuIHN1Y2Nlc3MuICovDQoJcmV0dXJuKElTQ19SX1NVQ0NFU1MpOw0K
DQogY2xlYW51cDoNCglkbHpfbGRhcF9kZXN0cm95KE5VTEwsIGxkYXBfaW5zdCk7DQoNCglyZXR1
cm4oSVNDX1JfRkFJTFVSRSk7DQp9DQoNCnZvaWQNCmRsel9sZGFwX2Rlc3Ryb3kodm9pZCAqZHJp
dmVyYXJnLCB2b2lkICpkYmRhdGEpIHsNCglVTlVTRUQoZHJpdmVyYXJnKTsNCg0KCWlmIChkYmRh
dGEgIT0gTlVMTCkgew0KI2lmZGVmIElTQ19QTEFURk9STV9VU0VUSFJFQURTDQoJCS8qIGNsZWFu
dXAgdGhlIGxpc3Qgb2YgREJJJ3MgKi8NCgkJbGRhcF9kZXN0cm95X2RibGlzdCgoZGJfbGlzdF90
ICopDQoJCQkJICAgICgobGRhcF9pbnN0YW5jZV90ICopZGJkYXRhKS0+ZGIpOw0KDQojZWxzZSAv
KiBJU0NfUExBVEZPUk1fVVNFVEhSRUFEUyAqLw0KCQlpZiAoKChsZGFwX2luc3RhbmNlX3QgKilk
YmRhdGEpLT5kYi0+ZGJjb25uICE9IE5VTEwpDQoJCQlsZGFwX3VuYmluZF9zKChMREFQICopDQoJ
CQkJICAgICAgKChsZGFwX2luc3RhbmNlX3QgKilkYmRhdGEpLT5kYi0+ZGJjb25uKTsNCg0KCQkv
KiBkZXN0cm95IHNpbmdsZSBEQiBpbnN0YW5jZSAqLw0KCQlkZXN0cm95X3NxbGRiaW5zdGFuY2Uo
KChsZGFwX2luc3RhbmNlX3QgKilkYmRhdGEpLT5kYik7DQojZW5kaWYgLyogSVNDX1BMQVRGT1JN
X1VTRVRIUkVBRFMgKi8NCg0KCQlpZiAoKChsZGFwX2luc3RhbmNlX3QgKilkYmRhdGEpLT5ob3N0
cyAhPSBOVUxMKQ0KCQkJaXNjX21lbV9mcmVlKG5zX2dfbWN0eCwNCgkJCQkgICAgICgobGRhcF9p
bnN0YW5jZV90ICopZGJkYXRhKS0+aG9zdHMpOw0KDQoJCWlmICgoKGxkYXBfaW5zdGFuY2VfdCAq
KWRiZGF0YSktPnVzZXIgIT0gTlVMTCkNCgkJCWlzY19tZW1fZnJlZShuc19nX21jdHgsDQoJCQkJ
ICAgICAoKGxkYXBfaW5zdGFuY2VfdCAqKWRiZGF0YSktPnVzZXIpOw0KDQoJCWlmICgoKGxkYXBf
aW5zdGFuY2VfdCAqKWRiZGF0YSktPmNyZWQgIT0gTlVMTCkNCgkJCWlzY19tZW1fZnJlZShuc19n
X21jdHgsDQoJCQkJICAgICAoKGxkYXBfaW5zdGFuY2VfdCAqKWRiZGF0YSktPmNyZWQpOw0KDQoJ
CWlzY19tZW1fcHV0KG5zX2dfbWN0eCwgZGJkYXRhLCBzaXplb2YobGRhcF9pbnN0YW5jZV90KSk7
DQoJfQ0KfQ0KDQpzdGF0aWMgZG5zX3NkbHptZXRob2RzX3QgZGx6X2xkYXBfbWV0aG9kcyA9IHsN
CglkbHpfbGRhcF9jcmVhdGUsDQoJZGx6X2xkYXBfZGVzdHJveSwNCglkbHpfbGRhcF9maW5kem9u
ZSwNCglkbHpfbGRhcF9sb29rdXAsDQoJZGx6X2xkYXBfYXV0aG9yaXR5LA0KCWRsel9sZGFwX2Fs
bG5vZGVzLA0KCWRsel9sZGFwX2FsbG93em9uZXhmciwNCglOVUxMLA0KCU5VTEwsDQoJTlVMTCwN
CglOVUxMLA0KCU5VTEwsDQoJTlVMTCwNCglOVUxMLA0KfTsNCg0KLyolDQogKiBXcmFwcGVyIGFy
b3VuZCBkbnNfc2RsenJlZ2lzdGVyKCkuDQogKi8NCmlzY19yZXN1bHRfdA0KZGx6X2xkYXBfaW5p
dCh2b2lkKSB7DQoJaXNjX3Jlc3VsdF90IHJlc3VsdDsNCg0KCS8qDQoJICogV3JpdGUgZGVidWdn
aW5nIG1lc3NhZ2UgdG8gbG9nDQoJICovDQoJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xP
R0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19E
RUJVRygyKSwNCgkJICAgICAgIlJlZ2lzdGVyaW5nIERMWiBsZGFwIGRyaXZlci4iKTsNCg0KCXJl
c3VsdCA9IGRuc19zZGx6cmVnaXN0ZXIoImxkYXAiLCAmZGx6X2xkYXBfbWV0aG9kcywgTlVMTCwN
CgkJCQkgIEROU19TRExaRkxBR19SRUxBVElWRU9XTkVSIHwNCgkJCQkgIEROU19TRExaRkxBR19S
RUxBVElWRVJEQVRBLA0KCQkJCSAgbnNfZ19tY3R4LCAmZGx6X2xkYXApOw0KCWlmIChyZXN1bHQg
IT0gSVNDX1JfU1VDQ0VTUykgew0KCQlVTkVYUEVDVEVEX0VSUk9SKF9fRklMRV9fLCBfX0xJTkVf
XywNCgkJCQkgImRuc19zZGx6cmVnaXN0ZXIoKSBmYWlsZWQ6ICVzIiwNCgkJCQkgaXNjX3Jlc3Vs
dF90b3RleHQocmVzdWx0KSk7DQoJCXJlc3VsdCA9IElTQ19SX1VORVhQRUNURUQ7DQoJfQ0KDQoJ
cmV0dXJuIChyZXN1bHQpOw0KfQ0KDQovKiUNCiAqIFdyYXBwZXIgYXJvdW5kIGRuc19zZGx6dW5y
ZWdpc3RlcigpLg0KICovDQp2b2lkDQpkbHpfbGRhcF9jbGVhcih2b2lkKSB7DQoJLyoNCgkgKiBX
cml0ZSBkZWJ1Z2dpbmcgbWVzc2FnZSB0byBsb2cNCgkgKi8NCglpc2NfbG9nX3dyaXRlKGRuc19s
Y3R4LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCSAgICAgIEROU19MT0dNT0RVTEVfRExa
LCBJU0NfTE9HX0RFQlVHKDIpLA0KCQkgICAgICAiVW5yZWdpc3RlcmluZyBETFogbGRhcCBkcml2
ZXIuIik7DQoNCglpZiAoZGx6X2xkYXAgIT0gTlVMTCkNCgkJZG5zX3NkbHp1bnJlZ2lzdGVyKCZk
bHpfbGRhcCk7DQp9DQoNCiNlbmRpZg0K
--047d7b6dcf5220190004df9557f0
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
--047d7b6dcf5220190004df9557f0
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Bind-dlz-testers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bind-dlz-testers

--047d7b6dcf5220190004df9557f0--