Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Apr 2013 20:01:23 +0400
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        freebsd-ipfw@freebsd.org
Cc:        luigi@freebsd.org
Subject:   [patch] ipfw interface tracking and opcode rewriting
Message-ID:  <517801D3.5040502@FreeBSD.org>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------060008050505010104000604
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

Hello list!

Currently ipfw uses strncmp() function to do interface matching which is 
quite slow.
Additionally, ipfw_insn_if opcode is quite big and given that struct 
ip_fw occupy 48 bytes
(without first instruction) which gives us good chance that part of 
interface name will be on the second cache line on amd64.

Pure synthetic testing (ipfw with 1 and 2 'ipfw count ip from any to any 
recv ifaceX') shows about 3.8% performance loss (190kpps out of 5.1 
mpps) for each rule,
while indexed version shows about 2.0% and 1.2% for first and second rule.

Additionally, our production (8.3-based firewalls with old strncmp) 
shows about 40% kernel time spent in strncmp on 1-2mpps (each packet 
traverses 5-6 such rules).

Here is the patch which does the following:
1) adds interface tracking for ipfw. Every interface is tracked 
regardless of its usage in the ruleset. This simplifies locking and 
makes easier to port such functionality to userland.
2) adds general opcode rewriting system permitting kernel to 
algorithmically (stateless) or statefully (involving extrernal data) 
rewrite user-supplied opcodes with possible size change.
This can be used to deprecate opcodes which are now superseded by newer 
ones while keeping ABI (and we currently have such opcodes).
3) Store (and track) inderface index for non-wildcard interface inside 
opcode.

If there are no objections I would like to commit (possibly updated 
vesrion) in the middle of the next week.



--------------060008050505010104000604
Content-Type: text/plain; charset=UTF-8;
 name="ip_fw_rewrite3.diff"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="ip_fw_rewrite3.diff"

SW5kZXg6IHN5cy9uZXRpbmV0L2lwX2Z3LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25ldGlu
ZXQvaXBfZncuaAkocmV2aXNpb24gMjQ4NzA0KQorKysgc3lzL25ldGluZXQvaXBfZncuaAko
d29ya2luZyBjb3B5KQpAQCAtMzQxLDYgKzM0MSw3IEBAIHR5cGVkZWYgc3RydWN0CV9pcGZ3
X2luc25faWYgewogCXVuaW9uIHsKIAkJc3RydWN0IGluX2FkZHIgaXA7CiAJCWludCBnbG9i
OworCQl1bnNpZ25lZCBpbnQgaWZfaWR4OwkvKiBJbnRlcmZhY2UgaW5kZXggKGtlcm5lbCkg
Ki8KIAl9IHA7CiAJY2hhciBuYW1lW0lGTkFNU0laXTsKIH0gaXBmd19pbnNuX2lmOwpAQCAt
NDk1LDYgKzQ5Niw4IEBAIHR5cGVkZWYgc3RydWN0IF9pcGZ3X2luc25faWNtcDYgewogICoJ
cXVldWUoMykgbWFjcm9zIGZvciBwb3J0YWJpbGl0eSBhbmQgcmVhZGFiaWxpdHkuCiAgKi8K
IAorI2RlZmluZQlJUF9GV19SVUxFX1JFV1JJVFRFTgkweDAxCS8qIFJ1bGUgaXMgbW9kaWZp
ZWQgYnkgcmV3cml0ZXIgKi8KKwogc3RydWN0IGlwX2Z3IHsKIAlzdHJ1Y3QgaXBfZncJKnhf
bmV4dDsJLyogbGlua2VkIGxpc3Qgb2YgcnVsZXMJCSovCiAJc3RydWN0IGlwX2Z3CSpuZXh0
X3J1bGU7CS8qIHB0ciB0byBuZXh0IFtza2lwdG9dIHJ1bGUJKi8KQEAgLTUwNSw3ICs1MDgs
NyBAQCBzdHJ1Y3QgaXBfZncgewogCXVpbnQxNl90CXJ1bGVudW07CS8qIHJ1bGUgbnVtYmVy
CQkJKi8KIAl1aW50OF90CXNldDsJCS8qIHJ1bGUgc2V0ICgwLi4zMSkJCSovCiAjZGVmaW5l
CVJFU1ZEX1NFVAkzMQkvKiBzZXQgZm9yIGRlZmF1bHQgYW5kIHBlcnNpc3RlbnQgcnVsZXMg
Ki8KLQl1aW50OF90CQlfcGFkOwkJLyogcGFkZGluZwkJCSovCisJdWludDhfdAkJZmxhZ3M7
CQkvKiBwYWRkaW5nCQkJKi8KIAl1aW50MzJfdAlpZDsJCS8qIHJ1bGUgaWQgKi8KIAogCS8q
IFRoZXNlIGZpZWxkcyBhcmUgcHJlc2VudCBpbiBhbGwgcnVsZXMuCQkJKi8KSW5kZXg6IHN5
cy9tb2R1bGVzL2lwZncvTWFrZWZpbGUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21vZHVsZXMv
aXBmdy9NYWtlZmlsZQkocmV2aXNpb24gMjQ4NzA0KQorKysgc3lzL21vZHVsZXMvaXBmdy9N
YWtlZmlsZQkod29ya2luZyBjb3B5KQpAQCAtOCw2ICs4LDcgQEAgS01PRD0JaXBmdwogU1JD
Uz0JaXBfZncyLmMgaXBfZndfcGZpbC5jCiBTUkNTKz0JaXBfZndfZHluYW1pYy5jIGlwX2Z3
X2xvZy5jCiBTUkNTKz0JaXBfZndfc29ja29wdC5jIGlwX2Z3X3RhYmxlLmMKK1NSQ1MrPQlp
cF9md19pZmFjZS5jIGlwX2Z3X3Jld3JpdGUuYwogU1JDUys9CW9wdF9pbmV0Lmggb3B0X2lu
ZXQ2Lmggb3B0X2lwZGl2ZXJ0Lmggb3B0X2lwZncuaCBvcHRfaXBzZWMuaAogCiBDRkxBR1Mr
PSAtRElQRklSRVdBTEwKSW5kZXg6IHN5cy9uZXRwZmlsL2lwZncvaXBfZncyLmMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gc3lzL25ldHBmaWwvaXBmdy9pcF9mdzIuYwkocmV2aXNpb24gMjQ4NzA0
KQorKysgc3lzL25ldHBmaWwvaXBmdy9pcF9mdzIuYwkod29ya2luZyBjb3B5KQpAQCAtMzUz
LDE3ICszNTMsMTcgQEAgaWZhY2VfbWF0Y2goc3RydWN0IGlmbmV0ICppZnAsIGlwZndfaW5z
bl9pZiAqY21kLAogCWlmIChpZnAgPT0gTlVMTCkJLyogbm8gaWZhY2Ugd2l0aCB0aGlzIHBh
Y2tldCwgbWF0Y2ggZmFpbHMgKi8KIAkJcmV0dXJuIDA7CiAJLyogQ2hlY2sgYnkgbmFtZSBv
ciBieSBJUCBhZGRyZXNzICovCi0JaWYgKGNtZC0+bmFtZVswXSAhPSAnXDAnKSB7IC8qIG1h
dGNoIGJ5IG5hbWUgKi8KLQkJaWYgKGNtZC0+bmFtZVswXSA9PSAnXDEnKSAvKiB1c2UgdGFi
bGVhcmcgdG8gbWF0Y2ggKi8KKwlpZiAoY21kLT5vLmFyZzEgIT0gMCkgeyAvKiBtYXRjaCBi
eSBuYW1lICovCisJCWlmIChjbWQtPm8uYXJnMSA9PSAxKSAvKiB1c2UgdGFibGVhcmcgdG8g
bWF0Y2ggKi8KIAkJCXJldHVybiBpcGZ3X2xvb2t1cF90YWJsZV9leHRlbmRlZChjaGFpbiwg
Y21kLT5wLmdsb2IsCiAJCQkJaWZwLT5pZl94bmFtZSwgdGFibGVhcmcsIElQRldfVEFCTEVf
SU5URVJGQUNFKTsKIAkJLyogQ2hlY2sgbmFtZSAqLwotCQlpZiAoY21kLT5wLmdsb2IpIHsK
KwkJaWYgKGNtZC0+cC5pZl9pZHgpIHsKKwkJCWlmIChpZnAtPmlmX2luZGV4ID09IGNtZC0+
cC5pZl9pZHgpCisJCQkJcmV0dXJuICgxKTsKKwkJfSBlbHNlIHsKIAkJCWlmIChmbm1hdGNo
KGNtZC0+bmFtZSwgaWZwLT5pZl94bmFtZSwgMCkgPT0gMCkKIAkJCQlyZXR1cm4oMSk7Ci0J
CX0gZWxzZSB7Ci0JCQlpZiAoc3RybmNtcChpZnAtPmlmX3huYW1lLCBjbWQtPm5hbWUsIElG
TkFNU0laKSA9PSAwKQotCQkJCXJldHVybigxKTsKIAkJfQogCX0gZWxzZSB7CiAjaWZkZWYg
X19GcmVlQlNEX18JLyogYW5kIE9TWCB0b28gPyAqLwpAQCAtMjY2Nyw2ICsyNjY3LDggQEAg
dm5ldF9pcGZ3X2luaXQoY29uc3Qgdm9pZCAqdW51c2VkKQogCiAJSVBGV19MT0NLX0lOSVQo
Y2hhaW4pOwogCWlwZndfZHluX2luaXQoY2hhaW4pOworCWlwZndfaWZoYXNoX2luaXQoY2hh
aW4pOworCWlwZndfcmV3cml0ZV9pbml0KGNoYWluKTsKIAogCS8qIEZpcnN0IHNldCB1cCBz
b21lIHZhbHVlcyB0aGF0IGFyZSBjb21waWxlIHRpbWUgb3B0aW9ucyAqLwogCVZfaXBmd192
bmV0X3JlYWR5ID0gMTsJCS8qIE9wZW4gZm9yIGJ1c2luZXNzICovCkBAIC0yNzA4LDYgKzI3
MTAsNyBAQCB2bmV0X2lwZndfdW5pbml0KGNvbnN0IHZvaWQgKnVudXNlZCkKIAkodm9pZClp
cGZ3X2F0dGFjaF9ob29rcygwIC8qIGRldGFjaCAqLyk7CiAJVl9pcF9md19jdGxfcHRyID0g
TlVMTDsKIAlJUEZXX1VIX1dMT0NLKGNoYWluKTsKKwlpcGZ3X2lmaGFzaF9kZXRhY2goY2hh
aW4pOyAvKiBkZXRhY2ggZXZlbnRoYW5kbGVycyAqLwogCUlQRldfVUhfV1VOTE9DSyhjaGFp
bik7CiAJSVBGV19VSF9XTE9DSyhjaGFpbik7CiAKQEAgLTI3MjIsOSArMjcyNSwxNCBAQCB2
bmV0X2lwZndfdW5pbml0KGNvbnN0IHZvaWQgKnVudXNlZCkKIAkJcnVsZSA9IGNoYWluLT5t
YXBbaV07CiAJCXJ1bGUtPnhfbmV4dCA9IHJlYXA7CiAJCXJlYXAgPSBydWxlOworCQkvKiBD
bGVhciByZXdyaXRlcyBpZiBhbnkgKi8KKwkJaWYgKHJ1bGUtPmZsYWdzICYgSVBfRldfUlVM
RV9SRVdSSVRURU4pCisJCQlpcGZ3X3JlbG9jYXRlX3Jld3JpdGUoY2hhaW4sIHJ1bGUtPmNt
ZCwgTlVMTCk7CiAJfQogCWlmIChjaGFpbi0+bWFwKQogCQlmcmVlKGNoYWluLT5tYXAsIE1f
SVBGVyk7CisJaXBmd19yZXdyaXRlX2ZyZWUoY2hhaW4pOworCWlwZndfaWZoYXNoX2ZyZWUo
Y2hhaW4pOwogCUlQRldfV1VOTE9DSyhjaGFpbik7CiAJSVBGV19VSF9XVU5MT0NLKGNoYWlu
KTsKIAlpZiAocmVhcCAhPSBOVUxMKQpJbmRleDogc3lzL25ldHBmaWwvaXBmdy9pcF9md19w
cml2YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL25ldHBmaWwvaXBmdy9pcF9md19wcml2
YXRlLmgJKHJldmlzaW9uIDI0ODcwNCkKKysrIHN5cy9uZXRwZmlsL2lwZncvaXBfZndfcHJp
dmF0ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMTIsNiArMjEyLDEzIEBAIFZORVRfREVDTEFS
RShpbnQsIGF1dG9pbmNfc3RlcCk7CiBWTkVUX0RFQ0xBUkUodW5zaWduZWQgaW50LCBmd190
YWJsZXNfbWF4KTsKICNkZWZpbmUgVl9md190YWJsZXNfbWF4CQlWTkVUKGZ3X3RhYmxlc19t
YXgpCiAKKworI2RlZmluZSBDTURTSVpFKHJ1bGUpICAoKChzdHJ1Y3QgaXBfZncgKikocnVs
ZSkpLT5jbWRfbGVuICogc2l6ZW9mKHVpbnQzMl90KSkKKworCitzdHJ1Y3QgaXBfZndfaWZf
ZGF0YTsKK3N0cnVjdCBpcF9md19yd19kYXRhOworCiBzdHJ1Y3QgaXBfZndfY2hhaW4gewog
CXN0cnVjdCBpcF9mdwkqcnVsZXM7CQkvKiBsaXN0IG9mIHJ1bGVzICovCiAJc3RydWN0IGlw
X2Z3CSpyZWFwOwkJLyogbGlzdCBvZiBydWxlcyB0byByZWFwICovCkBAIC0yMzIsOCArMjM5
LDQyIEBAIHN0cnVjdCBpcF9md19jaGFpbiB7CiAjZW5kaWYKIAl1aW50MzJfdAlpZDsJCS8q
IHJ1bGVzZXQgaWQgKi8KIAl1aW50MzJfdAlnZW5jbnQ7CQkvKiBnZW5lcmF0aW9uIGNvdW50
ICovCisJc3RydWN0IGlwX2Z3X2lmX2RhdGEJKmlmX2RhdGE7CS8qIEludGVyZmFjZSB0cmFj
a2luZyBkYXRhICovCisJc3RydWN0IGlwX2Z3X3J3X2RhdGEJKnJld3JpdGVfZGF0YTsJLyog
UnVsZSByZXdyaXRlIGRhdGEgKi8KIH07CiAKKy8qIGlwX2Z3X3Jld3JpdGUuYyAqLworc3Ry
dWN0IGlwX2Z3X3J3X2luZm8geworCXZvaWQJKnNwdHI7CS8qIFN0YXRlIGNyZWF0ZWQgYnkg
aXBmd19wcmVwYXJlX3Jld3JpdGUoKSAqLworCWludAljb3VudDsJLyogTnVtYmVyIG9mIG9w
Y29kZXMgcmVxdWVzdGluZyByZXdyaXRlICovCisJaW50CXN0YXRlczsJLyogTnVtYmVyIG9m
IG9wY29kZXMgd2l0aCBzdGF0ZWZ1bCByZXdyaXRlICovCisJaW50CWxlbmRpZmY7CS8qIERp
ZmZlcmVuY2Ugd2l0aCBvcmlkaW5hbCBydWxlIGxlbiAoaW5zbnMpICovCit9OworCit2b2lk
IGlwZndfcmV3cml0ZV9pbml0KHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4pOwordm9pZCBp
cGZ3X3Jld3JpdGVfZnJlZShzdHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWluKTsKK2ludCBpcGZ3
X3Jld3JpdGVfbGVuKHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4pOwordm9pZCAqaXBmd19w
cmVwYXJlX3Jld3JpdGUoc3RydWN0IGlwX2Z3X2NoYWluICpjaGFpbiwgaXBmd19pbnNuICpj
bWQsCisgICAgaW50IGNtZF9sZW4sIHN0cnVjdCBpcF9md19yd19pbmZvICpyd2kpOwordm9p
ZCBpcGZ3X3BlcmZvcm1fcmV3cml0ZShzdHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWluLCBpcGZ3
X2luc24gKmtjbWQsCisgICAgdm9pZCAqc3RhdGUpOwordm9pZCBpcGZ3X3JlbG9jYXRlX3Jl
d3JpdGUoc3RydWN0IGlwX2Z3X2NoYWluICpjaGFpbiwgaXBmd19pbnNuICpvbGQsCisgICAg
aXBmd19pbnNuICpuZXcpOworaW50IGlwZndfZXhwb3J0X3Jld3JpdGUoc3RydWN0IGlwX2Z3
X2NoYWluICpjaGFpbiwgaXBmd19pbnNuICprY21kLAorICAgIGlwZndfaW5zbiAqdGFyZ2V0
KTsKKwordm9pZCBpcGZ3X2NoZWNrX3Jld3JpdGUoc3RydWN0IGlwX2Z3X2NoYWluICpjaGFp
biwgaXBmd19pbnNuICppbnNuLAorICAgIHN0cnVjdCBpcF9md19yd19pbmZvICpyd2kpOwor
dm9pZCBpcGZ3X3VwZGF0ZV9yZXdyaXRlKHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIGlw
ZndfaW5zbiAqaW5zbiwKKyAgICB2b2lkICpzdGF0ZSwgdWludHB0cl90IHZhbCk7CisKKwor
LyogaXBfZndfaWZhY2UuYyAqLwordm9pZCBpcGZ3X2lmaGFzaF9pbml0KHN0cnVjdCBpcF9m
d19jaGFpbiAqY2hhaW4pOwordm9pZCBpcGZ3X2lmaGFzaF9mcmVlKHN0cnVjdCBpcF9md19j
aGFpbiAqY2hhaW4pOwordm9pZCBpcGZ3X2lmaGFzaF9kZXRhY2goc3RydWN0IGlwX2Z3X2No
YWluICpjaGFpbik7CisKKwogc3RydWN0IHNvY2tvcHQ7CS8qIHVzZWQgYnkgdGNwX3Zhci5o
ICovCiAKIC8qIE1hY3JvIGZvciB3b3JraW5nIHdpdGggdmFyaW91cyBjb3VudGVycyAqLwpA
QCAtMjk1LDcgKzMzNiw4IEBAIHN0cnVjdCBzb2Nrb3B0OwkvKiB1c2VkIGJ5IHRjcF92YXIu
aCAqLwogCiAvKiBJbiBpcF9md19zb2Nrb3B0LmMgKi8KIGludCBpcGZ3X2ZpbmRfcnVsZShz
dHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWluLCB1aW50MzJfdCBrZXksIHVpbnQzMl90IGlkKTsK
LWludCBpcGZ3X2FkZF9ydWxlKHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIHN0cnVjdCBp
cF9mdyAqaW5wdXRfcnVsZSk7CitpbnQgaXBmd19hZGRfcnVsZShzdHJ1Y3QgaXBfZndfY2hh
aW4gKmNoYWluLCBzdHJ1Y3QgaXBfZncgKmlucHV0X3J1bGUsCisgICAgc3RydWN0IGlwX2Z3
X3J3X2luZm8gKnJ3aSk7CiBpbnQgaXBmd19jdGwoc3RydWN0IHNvY2tvcHQgKnNvcHQpOwog
aW50IGlwZndfY2hrKHN0cnVjdCBpcF9md19hcmdzICphcmdzKTsKIHZvaWQgaXBmd19yZWFw
X3J1bGVzKHN0cnVjdCBpcF9mdyAqaGVhZCk7CkluZGV4OiBzeXMvbmV0cGZpbC9pcGZ3L2lw
X2Z3X3NvY2tvcHQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbmV0cGZpbC9pcGZ3L2lwX2Z3
X3NvY2tvcHQuYwkocmV2aXNpb24gMjQ4OTcxKQorKysgc3lzL25ldHBmaWwvaXBmdy9pcF9m
d19zb2Nrb3B0LmMJKHdvcmtpbmcgY29weSkKQEAgLTczLDYgKzczLDggQEAgTUFMTE9DX0RF
RklORShNX0lQRlcsICJJcEZ3L0lwQWNjdCIsICJJcEZ3L0lwQWNjdAogICogc3RhdGljIHZh
cmlhYmxlcyBmb2xsb3dlZCBieSBnbG9iYWwgb25lcyAobm9uZSBpbiB0aGlzIGZpbGUpCiAg
Ki8KIAorc3RhdGljIHZvaWQgaXBmd19leHBvcnRfaGVhZGVyKHN0cnVjdCBpcF9mdyAqa3J1
bGUsIHN0cnVjdCBpcF9mdyAqZHN0KTsKKwogLyoKICAqIEZpbmQgdGhlIHNtYWxsZXN0IHJ1
bGUgPj0ga2V5LCBpZC4KICAqIFdlIGNvdWxkIHVzZSBic2VhcmNoIGJ1dCBpdCBpcyBzbyBz
aW1wbGUgdGhhdCB3ZSBjb2RlIGl0IGRpcmVjdGx5CkBAIC0xNTMsNyArMTU1LDggQEAgc3dh
cF9tYXAoc3RydWN0IGlwX2Z3X2NoYWluICpjaGFpbiwgc3RydWN0IGlwX2Z3ICoKICAqIE11
c3QgYmUgY2FsbGVkIHdpdGhvdXQgSVBGV19VSCBoZWxkCiAgKi8KIGludAotaXBmd19hZGRf
cnVsZShzdHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWluLCBzdHJ1Y3QgaXBfZncgKmlucHV0X3J1
bGUpCitpcGZ3X2FkZF9ydWxlKHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIHN0cnVjdCBp
cF9mdyAqaW5wdXRfcnVsZSwKKyAgICBzdHJ1Y3QgaXBfZndfcndfaW5mbyAqcndpKQogewog
CXN0cnVjdCBpcF9mdyAqcnVsZTsKIAlpbnQgaSwgbCwgaW5zZXJ0X2JlZm9yZTsKQEAgLTE2
Myw3ICsxNjYsOCBAQCBpbnQKIAkJcmV0dXJuIChFSU5WQUwpOwogCiAJbCA9IFJVTEVTSVpF
KGlucHV0X3J1bGUpOwotCXJ1bGUgPSBtYWxsb2MobCwgTV9JUEZXLCBNX1dBSVRPSyB8IE1f
WkVSTyk7CisJcnVsZSA9IG1hbGxvYyhsICsgcndpLT5sZW5kaWZmICogc2l6ZW9mKHVpbnQz
Ml90KSwgTV9JUEZXLAorCSAgICBNX1dBSVRPSyB8IE1fWkVSTyk7CiAJLyogZ2V0X21hcCBy
ZXR1cm5zIHdpdGggSVBGV19VSF9XTE9DSyBpZiBzdWNjZXNzZnVsICovCiAJbWFwID0gZ2V0
X21hcChjaGFpbiwgMSwgMCAvKiBub3QgbG9ja2VkICovKTsKIAlpZiAobWFwID09IE5VTEwp
IHsKQEAgLTE3MSw3ICsxNzUsMTUgQEAgaW50CiAJCXJldHVybiBFTk9TUEM7CiAJfQogCi0J
YmNvcHkoaW5wdXRfcnVsZSwgcnVsZSwgbCk7CisJaWYgKHJ3aS0+c3B0ciA9PSBOVUxMKQor
CQliY29weShpbnB1dF9ydWxlLCBydWxlLCBsKTsKKwllbHNlIHsKKwkJLyogQ29weSBoZWFk
ZXIgYW5kIGZpcnN0IGluc3R1Y3Rpb24gKi8KKwkJYmNvcHkoaW5wdXRfcnVsZSwgcnVsZSwg
c2l6ZW9mKHN0cnVjdCBpcF9mdykpOworCQlydWxlLT5mbGFncyB8PSBJUF9GV19SVUxFX1JF
V1JJVFRFTjsKKwkJaXBmd19wZXJmb3JtX3Jld3JpdGUoY2hhaW4sIHJ1bGUtPmNtZCwgcndp
LT5zcHRyKTsKKwl9CisKIAkvKiBjbGVhciBmaWVsZHMgbm90IHNldHRhYmxlIGZyb20gdXNl
cmxhbmQgKi8KIAlydWxlLT54X25leHQgPSBOVUxMOwogCXJ1bGUtPm5leHRfcnVsZSA9IE5V
TEw7CkBAIC0zNjYsNiArMzc4LDE0IEBAIGRlbF9lbnRyeShzdHJ1Y3QgaXBfZndfY2hhaW4g
KmNoYWluLCB1aW50MzJfdCBhcmcpCiAJCQlydWxlID0gY2hhaW4tPm1hcFtpXTsKIAkJCWlm
IChrZWVwX3J1bGUocnVsZSwgY21kLCBuZXdfc2V0LCBudW0pKQogCQkJCW1hcFtvZnMrK10g
PSBydWxlOworCQkJZWxzZSB7CisJCQkJLyogQ2xlYXIgcmV3cml0ZXMgaWYgYW55ICovCisJ
CQkJaWYgKHJ1bGUtPmZsYWdzICYgSVBfRldfUlVMRV9SRVdSSVRURU4pIHsKKwkJCQkJcHJp
bnRmKCJNb3ZpbmcgcnVsZSAlcCB0byBjbGVhciBsaXN0XG4iLCBydWxlKTsKKwkJCQkJaXBm
d19yZWxvY2F0ZV9yZXdyaXRlKGNoYWluLAorCQkJCQkgICAgcnVsZS0+Y21kLCBOVUxMKTsK
KwkJCQl9CisJCQl9CiAJCX0KIAkJLyogMy4gY29weSB0aGUgZmluYWwgcGFydCBvZiB0aGUg
bWFwICovCiAJCWJjb3B5KGNoYWluLT5tYXAgKyBlbmQsIG1hcCArIG9mcywKQEAgLTM4NCw2
ICs0MDQsNyBAQCBkZWxfZW50cnkoc3RydWN0IGlwX2Z3X2NoYWluICpjaGFpbiwgdWludDMy
X3QgYXJnKQogCQkJCWlwZndfZXhwaXJlX2R5bl9ydWxlcyhjaGFpbiwgcnVsZSwgUkVTVkRf
U0VUKTsKIAkJCXJ1bGUtPnhfbmV4dCA9IGNoYWluLT5yZWFwOwogCQkJY2hhaW4tPnJlYXAg
PSBydWxlOworCQkJcHJpbnRmKCJBZGRpbmcgcnVsZSAlcCB0byByZWFwIGxpc3RcbiIsIHJ1
bGUpOwogCQl9CiAJCWJyZWFrOwogCkBAIC01MTcsNyArNTM4LDggQEAgemVyb19lbnRyeShz
dHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWluLCB1X2ludDMyX3QgYXIKICAqIFJ1bGVzIGFyZSBz
aW1wbGUsIHNvIHRoaXMgbW9zdGx5IG5lZWQgdG8gY2hlY2sgcnVsZSBzaXplcy4KICAqLwog
c3RhdGljIGludAotY2hlY2tfaXBmd19zdHJ1Y3Qoc3RydWN0IGlwX2Z3ICpydWxlLCBpbnQg
c2l6ZSkKK2NoZWNrX2lwZndfc3RydWN0KHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIHN0
cnVjdCBpcF9mdyAqcnVsZSwgaW50IHNpemUsCisgICAgc3RydWN0IGlwX2Z3X3J3X2luZm8g
KnJ3aSkKIHsKIAlpbnQgbCwgY21kbGVuID0gMDsKIAlpbnQgaGF2ZV9hY3Rpb249MDsKQEAg
LTY5Niw2ICs3MTgsNyBAQCBzdGF0aWMgaW50CiAJCWNhc2UgT19WSUE6CiAJCQlpZiAoY21k
bGVuICE9IEZfSU5TTl9TSVpFKGlwZndfaW5zbl9pZikpCiAJCQkJZ290byBiYWRfc2l6ZTsK
KwkJCWlwZndfY2hlY2tfcmV3cml0ZShjaGFpbiwgY21kLCByd2kpOwogCQkJYnJlYWs7CiAK
IAkJY2FzZSBPX0FMVFE6CkBAIC04NjgsNiArODkxLDEzIEBAIGludCBjb252ZXJ0X3J1bGVf
dG9fOChzdHJ1Y3QgaXBfZncgKnJ1bGUpOwogI2VuZGlmCiAKIAorc3RhdGljIHZvaWQKK2lw
ZndfZXhwb3J0X2hlYWRlcihzdHJ1Y3QgaXBfZncgKmtydWxlLCBzdHJ1Y3QgaXBfZncgKmRz
dCkKK3sKKworCW1lbWNweShkc3QsIGtydWxlLCBzaXplb2Yoc3RydWN0IGlwX2Z3KSAtIHNp
emVvZihpcGZ3X2luc24pKTsKK30KKwogLyoKICAqIENvcHkgdGhlIHN0YXRpYyBhbmQgZHlu
YW1pYyBydWxlcyB0byB0aGUgc3VwcGxpZWQgYnVmZmVyCiAgKiBhbmQgcmV0dXJuIHRoZSBh
bW91bnQgb2Ygc3BhY2UgYWN0dWFsbHkgdXNlZC4KQEAgLTg4NywxMSArOTE3LDI4IEBAIGlw
ZndfZ2V0cnVsZXMoc3RydWN0IGlwX2Z3X2NoYWluICpjaGFpbiwgdm9pZCAqYnVmCiAJCXJ1
bGUgPSBjaGFpbi0+bWFwW2ldOwogCiAJCWlmIChpczcpIHsKLQkJICAgIC8qIENvbnZlcnQg
cnVsZSB0byBGcmVlQlNkIDcuMiBmb3JtYXQgKi8KLQkJICAgIGwgPSBSVUxFU0laRTcocnVs
ZSk7CisJCSAgICAvKiBDb252ZXJ0IHJ1bGUgdG8gRnJlZUJTRCA3LjIgZm9ybWF0ICovCisJ
CQlpZiAocnVsZS0+ZmxhZ3MgJiBJUF9GV19SVUxFX1JFV1JJVFRFTikKKwkJCQlsID0gaXBm
d19leHBvcnRfcmV3cml0ZShjaGFpbiwgcnVsZS0+Y21kLCBOVUxMKTsKKwkJCWVsc2UKKwkJ
CQlsID0gQ01EU0laRShydWxlKTsKKworCQkJLyoKKwkJCSAqIEFkZCBoZWFkZXIgbGVuZ3Ro
LgorCQkJICogdi44IHJ1bGUgaGVhZGVyIGlzIDQgYnl0ZXMgYmlnZ2VyLgorCQkJICovCisJ
CQlsICs9IHNpemVvZihzdHJ1Y3QgaXBfZnc3KSAtIHNpemVvZihpcGZ3X2luc24pOworCiAJ
CSAgICBpZiAoYnAgKyBsICsgc2l6ZW9mKHVpbnQzMl90KSA8PSBlcCkgewogCQkJaW50IGVy
cm9yOwogCQkJYmNvcHkocnVsZSwgYnAsIGwgKyBzaXplb2YodWludDMyX3QpKTsKKworCQkJ
aWYgKHJ1bGUtPmZsYWdzICYgSVBfRldfUlVMRV9SRVdSSVRURU4pIHsKKwkJCQlpcGZ3X2V4
cG9ydF9yZXdyaXRlKGNoYWluLCBydWxlLT5jbWQsIGRzdC0+Y21kKTsKKwkJCQlpcGZ3X2V4
cG9ydF9oZWFkZXIocnVsZSwgZHN0KTsKKwkJCX0gZWxzZQorCQkJCWJjb3B5KHJ1bGUsIGJw
LCBsICsgc2l6ZW9mKHVpbnQzMl90KSk7CisKIAkJCWVycm9yID0gY29udmVydF9ydWxlX3Rv
XzcoKHN0cnVjdCBpcF9mdyAqKSBicCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJcmV0dXJuIDA7
IC8qWFhYIGNvcnJlY3Q/ICovCkBAIC05MTAsMTQgKzk1NywyMyBAQCBpcGZ3X2dldHJ1bGVz
KHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIHZvaWQgKmJ1ZgogCQkgICAgY29udGludWU7
IC8qIGdvIHRvIG5leHQgcnVsZSAqLwogCQl9CiAKLQkJLyogbm9ybWFsIG1vZGUsIGRvbid0
IHRvdWNoIHJ1bGVzICovCi0JCWwgPSBSVUxFU0laRShydWxlKTsKKwkJaWYgKHJ1bGUtPmZs
YWdzICYgSVBfRldfUlVMRV9SRVdSSVRURU4pCisJCQlsID0gaXBmd19leHBvcnRfcmV3cml0
ZShjaGFpbiwgcnVsZS0+Y21kLCBOVUxMKTsKKwkJZWxzZQorCQkJbCA9IENNRFNJWkUocnVs
ZSk7CisJCS8qIEFkZCBoZWFkZXIgbGVuZ3RoICovCisJCWwgKz0gc2l6ZW9mKHN0cnVjdCBp
cF9mdykgLSBzaXplb2YoaXBmd19pbnNuKTsKKwogCQlpZiAoYnAgKyBsID4gZXApIHsgLyog
c2hvdWxkIG5vdCBoYXBwZW4gKi8KIAkJCXByaW50Zigib3ZlcmZsb3cgZHVtcGluZyBzdGF0
aWMgcnVsZXNcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJZHN0ID0gKHN0cnVjdCBpcF9mdyAq
KWJwOwotCQliY29weShydWxlLCBkc3QsIGwpOworCQlpZiAocnVsZS0+ZmxhZ3MgJiBJUF9G
V19SVUxFX1JFV1JJVFRFTikgeworCQkJaXBmd19leHBvcnRfcmV3cml0ZShjaGFpbiwgcnVs
ZS0+Y21kLCBkc3QtPmNtZCk7CisJCQlpcGZ3X2V4cG9ydF9oZWFkZXIocnVsZSwgZHN0KTsK
KwkJfSBlbHNlCisJCQliY29weShydWxlLCBkc3QsIGwpOwogCQkvKgogCQkgKiBYWFggSEFD
Sy4gU3RvcmUgdGhlIGRpc2FibGUgbWFzayBpbiB0aGUgIm5leHQiCiAJCSAqIHBvaW50ZXIg
aW4gYSB3aWxkIGF0dGVtcHQgdG8ga2VlcCB0aGUgQUJJIHRoZSBzYW1lLgpAQCAtOTQ5LDYg
KzEwMDUsNyBAQCBpcGZ3X2N0bChzdHJ1Y3Qgc29ja29wdCAqc29wdCkKIAl1aW50MzJfdCBv
cHQ7CiAJY2hhciB4YnVmWzEyOF07CiAJaXBfZnczX29waGVhZGVyICpvcDMgPSBOVUxMOwor
CXN0cnVjdCBpcF9md19yd19pbmZvIHJ3aTsKIAogCWVycm9yID0gcHJpdl9jaGVjayhzb3B0
LT5zb3B0X3RkLCBQUklWX05FVElORVRfSVBGVyk7CiAJaWYgKGVycm9yKQpAQCAtOTk4LDcg
KzEwNTUsNyBAQCBpcGZ3X2N0bChzdHJ1Y3Qgc29ja29wdCAqc29wdCkKIAkJZm9yICg7Oykg
ewogCQkJaW50IGxlbiA9IDAsIHdhbnQ7CiAKLQkJCXNpemUgPSBjaGFpbi0+c3RhdGljX2xl
bjsKKwkJCXNpemUgPSBjaGFpbi0+c3RhdGljX2xlbiArIGlwZndfcmV3cml0ZV9sZW4oY2hh
aW4pOwogCQkJc2l6ZSArPSBpcGZ3X2R5bl9sZW4oKTsKIAkJCWlmIChzaXplID49IHNvcHQt
PnNvcHRfdmFsc2l6ZSkKIAkJCQlicmVhazsKQEAgLTEwMjcsNiArMTA4NCw4IEBAIGlwZndf
Y3RsKHN0cnVjdCBzb2Nrb3B0ICpzb3B0KQogCQllcnJvciA9IHNvb3B0Y29weWluKHNvcHQs
IHJ1bGUsIFJVTEVfTUFYU0laRSwKIAkJCXNpemVvZihzdHJ1Y3QgaXBfZnc3KSApOwogCisJ
CW1lbXNldCgmcndpLCAwLCBzaXplb2YocndpKSk7CisKIAkJLyoKIAkJICogSWYgdGhlIHNp
emUgb2YgY29tbWFuZHMgZXF1YWxzIFJVTEVTSVpFNyB0aGVuIHdlIGFzc3VtZQogCQkgKiBh
IEZyZWVCU0Q3LjIgYmluYXJ5IGlzIHRhbGtpbmcgdG8gdXMgKHNldCBpczc9MSkuCkBAIC0x
MDQyLDE1ICsxMTAxLDIxIEBAIGlwZndfY3RsKHN0cnVjdCBzb2Nrb3B0ICpzb3B0KQogCQkg
ICAgaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwogCQkgICAgaWYgKGVycm9yID09IDAp
Ci0JCQllcnJvciA9IGNoZWNrX2lwZndfc3RydWN0KHJ1bGUsIFJVTEVTSVpFKHJ1bGUpKTsK
KwkJCWVycm9yID0gY2hlY2tfaXBmd19zdHJ1Y3QoY2hhaW4sIHJ1bGUsIFJVTEVTSVpFKHJ1
bGUpLAorCQkJICAgICZyd2kpOwogCQl9IGVsc2UgewogCQkgICAgaXM3ID0gMDsKIAkJaWYg
KGVycm9yID09IDApCi0JCQllcnJvciA9IGNoZWNrX2lwZndfc3RydWN0KHJ1bGUsIHNvcHQt
PnNvcHRfdmFsc2l6ZSk7CisJCQllcnJvciA9IGNoZWNrX2lwZndfc3RydWN0KGNoYWluLCBy
dWxlLAorCQkJICAgIHNvcHQtPnNvcHRfdmFsc2l6ZSwgJnJ3aSk7CiAJCX0KIAkJaWYgKGVy
cm9yID09IDApIHsKKwkJCS8qIFByZXBhcmUgcmV3cml0ZSwgaWYgbmVlZGVkICovCisJCQlp
ZiAocndpLmNvdW50ID4gMCkKKwkJCQlyd2kuc3B0ciA9IGlwZndfcHJlcGFyZV9yZXdyaXRl
KGNoYWluLAorCQkJCSAgICBydWxlLT5jbWQsIHJ1bGUtPmNtZF9sZW4sICZyd2kpOwogCQkJ
LyogbG9ja2luZyBpcyBkb25lIHdpdGhpbiBpcGZ3X2FkZF9ydWxlKCkgKi8KLQkJCWVycm9y
ID0gaXBmd19hZGRfcnVsZShjaGFpbiwgcnVsZSk7CisJCQllcnJvciA9IGlwZndfYWRkX3J1
bGUoY2hhaW4sIHJ1bGUsICZyd2kpOwogCQkJc2l6ZSA9IFJVTEVTSVpFKHJ1bGUpOwogCQkJ
aWYgKCFlcnJvciAmJiBzb3B0LT5zb3B0X2RpciA9PSBTT1BUX0dFVCkgewogCQkJCWlmIChp
czcpIHsKQEAgLTEzNTAsNyArMTQxNSw3IEBAIGNvbnZlcnRfcnVsZV90b183KHN0cnVjdCBp
cF9mdyAqcnVsZSkKIAliY29weShydWxlLCB0bXAsIFJVTEVfTUFYU0laRSk7CiAKIAkvKiBD
b3B5IGZpZWxkcyAqLwotCXJ1bGU3LT5fcGFkID0gdG1wLT5fcGFkOworCXJ1bGU3LT5fcGFk
ID0gMDsKIAlydWxlNy0+c2V0ID0gdG1wLT5zZXQ7CiAJcnVsZTctPnJ1bGVudW0gPSB0bXAt
PnJ1bGVudW07CiAJcnVsZTctPmNtZF9sZW4gPSB0bXAtPmNtZF9sZW47CkBAIC0xNDIzLDcg
KzE0ODgsNyBAQCBjb252ZXJ0X3J1bGVfdG9fOChzdHJ1Y3QgaXBfZncgKnJ1bGUpCiAJCX0K
IAl9CiAKLQlydWxlLT5fcGFkID0gdG1wLT5fcGFkOworCXJ1bGUtPmZsYWdzID0gMDsKIAly
dWxlLT5zZXQgPSB0bXAtPnNldDsKIAlydWxlLT5ydWxlbnVtID0gdG1wLT5ydWxlbnVtOwog
CXJ1bGUtPmNtZF9sZW4gPSB0bXAtPmNtZF9sZW47Ci0tLSAvZGV2L251bGwJMjAxMy0wNC0y
NCAxNzoyMDoxOS4wMDAwMDAwMDAgKzA0MDAKKysrIHN5cy9uZXRwZmlsL2lwZncvaXBfZndf
cmV3cml0ZS5jCTIwMTMtMDQtMjQgMTc6MTk6MTUuMjc4MDk3MjQzICswNDAwCkBAIC0wLDAg
KzEsODM1IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAxMyBZYW5kZXggTExDLgorICog
QXV0aG9yOiBBbGV4YW5kZXIgVi4gQ2hlcm5pa292IDxtZWxpZmFyb0B5YW5kZXgtdGVhbS5y
dT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFT
IElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
CisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisg
KiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX0ZCU0RJ
RCgiJEZyZWVCU0QkIik7CisKKy8qCisgKiBSdWxlIG9wY29kZSByZXdyaXRpbmcgc3lzdGVt
IGZvciBpcGZ3LgorICogU3lzdGVtIHBlcm1pdHMgYXV0b21hdGljIGFsZ29yaXRtaWMgKHN0
YXRlbGVzcykgb3Igc3RhdGVmdWxsICgKKyAqIHJlcXVpcmluZyBhY2Nlc3MvbW9uaWRpZmNh
dGlvbiB0byBleHRlcm5hbCBkYXRhKSBvZiBvcGNvZGVzLgorICogTW9kaWZpY2F0aW9uIGlz
IGRvbmUgYnkgY2FsbGluZyBzcGVjaWFsIHBlci1vcGNvZGUgZGVwZW5kZW50CisgKiBjYWxs
YmFja3MuIFNhdmluZyB1bm1vZGlmaWVkIHVzZXItc3VwcGxpZWQgcnVsZXMsIHNpemUgcmVj
YWxjdWxhdGlvbiwKKyAqIHJ1bGUgZXhwb3J0IGFuZCByZWxvY2F0aW9uIGlzIGhhbmRsZWQg
Ynkgc3Vic3lzdGVtLgorICogV3JpdGluZyBvcGNvZGUgbW9kaWZpY2F0b3IgcmVxdWlyZXMg
YWRkaW5nIGl0IHRvIHJld3JpdGVzW10gYXJyYXkKKyAqIGFuZCBmaWxsaW5nIGFwcHJvcHJp
YXRlIGNhbGxiYWNrcyAoYXQgbGVhc3QgJ2NvbnZlcnQnIG9uZS4KKyAqLworCisjaW5jbHVk
ZSAib3B0X2lwZncuaCIKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5
cy9zeXN0bS5oPgorI2luY2x1ZGUgPHN5cy9tYWxsb2MuaD4KKyNpbmNsdWRlIDxzeXMva2Vy
bmVsLmg+CisjaW5jbHVkZSA8c3lzL2xvY2suaD4KKyNpbmNsdWRlIDxzeXMvcndsb2NrLmg+
CisjaW5jbHVkZSA8c3lzL2Zudl9oYXNoLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgor
I2luY2x1ZGUgPG5ldC9pZi5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1
ZGUgPG5ldGluZXQvaXBfdmFyLmg+IC8qIGhvb2tzICovCisjaW5jbHVkZSA8bmV0aW5ldC9p
cF9mdy5oPgorCisjaW5jbHVkZSA8bmV0cGZpbC9pcGZ3L2lwX2Z3X3ByaXZhdGUuaD4KKyNp
bmNsdWRlIDxuZXRwZmlsL2lwZncvaXBfZndfaWZhY2UuaD4KKworI2RlZmluZQlOT19SRVdS
SVRFCQkwCisjZGVmaW5lCVNUQVRFTEVTU19SRVdSSVRFCTEKKyNkZWZpbmUJU1RBVEVGVUxf
UkVXUklURQkyCisKK3N0cnVjdCBpcF9md19yZXdyaXRlIHsKKwl1aW50MzJfdCBvcGNvZGU7
CisKKwkvKgorCSAqIENoZWNrcyBpZiBnaXZlbiBvcGNvZGUgbmVlZHMgdG8gYmUgY2hhbmdl
ZC4gQ2FsbGVkIChpbmRpcmVjdGx5KQorCSAqIGZyb20gY2hlY2tfaXBmd19zdHJ1Y3QoKSB3
aXRob3V0IGhvbGRpbmcgYW55IGxvY2tzLiBGdWN0aW9uIHNob3VsZAorCSAqIHF1aWNrbHkg
Y2hlY2sgaWYgZ2l2ZW4gb3Bjb2RlIG5lZWRzIHRvIGJlIHJld3JpdHRlbiBhbmQgc2V0IEBs
ZW4gdG8gCisJICogc2l6ZSBkaWZmZXJlbmNlIChpbiBieXRlcykgYmV0d2VlbiBuZXcgKGFs
dGVyZWQpIG9wY29kZSBzaXplIGFuZAorCSAqIG9sZCBvbmUuIE5vdGUgdGhhdCAmbGVuIGhv
dWxkIGJlIGFsaWduZWQgdG8gdTMyLgorCSAqCisJICogUGFyYW1zOgorCSAqIEBjaGFpbiAt
IHBvaW50ZXIgdG8gY3VycmVudCBpZnB3IGNoYWluCisJICogQGluc24gLSBnaXZlbiBpcGZ3
X2luc3RuCisJICogQGxlbiAtIHBvaW50ZXIgdG8gbGVuZ3RoIGRpZmYgKGluIGluc25zKQor
CSAqCisJICogUmV0dXJuczoKKwkgKiBOT19SRVdSSVRFIC0gbm8gbmVlZCB0byBjb252ZXJ0
CisJICogU1RBVEVMRVNTX1JFV1JJVEUgLSAoYWxnb3JpdG1pYykgY29udmVyc2lvbiByZXF1
aXJlZC4KKwkgKiBTVEFURUZVTF9SRVdSSVRFIC0gc3RhdGVmdWwgY29udmVyc2lvbiByZXF1
aXJlZC4KKwkgKgorCSAqIENhbGxiYWNrIGlzIE9QVElPTkFMLCBkZWZhdWx0cyB0byBTVEFU
RUxFU1NfUkVXUklURSBpZiBub3Qgc2V0LgorCSAqLworCWludCAoKmNoZWNrKShzdHJ1Y3Qg
aXBfZndfY2hhaW4gKiwgaXBmd19pbnNuICosIGludCAqKTsKKworCS8qCisJICogUHJlcGFy
ZXMgc3RhdGUgZm9yIGdpdmVuIG9wY29kZSBpZiBuZWVkZWQuIENhbGxlZCB3aXRob3V0CisJ
ICogaG9sZGluZyBhbnkgbG9ja3MgcGVybWl0dGluZyB0byBhbGxvY2F0ZSBhbnkgYW1vdW50
IG9mIG1lbW9yeS4KKwkgKiBOb3RlIHRoYXQgcmVzdWx0IChhbmQgYWN0dWFsIHN0YXRlIHVz
YWdlKSBoYXMgdG8gYmUgY29uc2lzdGVudAorCSAqIHdpdGggKmNoZWNrIChhbmQgb3RoZXIp
IGNhbGxiYWNrcy4KKwkgKgorCSAqIFBhcmFtczoKKwkgKiBAY2hhaW4gLSBwb2ludGVyIHRv
IGN1cnJlbnQgaWZwdyBjaGFpbgorCSAqIEBpbnNuIC0gZ2l2ZW4gaXBmd19pbnN0bgorCSAq
IEBwc3RhdGUgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gc3RhdGUKKwkgKgorCSAqIFJldHVy
bnM6CisJICogTk9fUkVXUklURSAtIG5vIG5lZWQgdG8gY29udmVydAorCSAqIFNUQVRFTEVT
U19SRVdSSVRFIC0gKGFsZ29yaXRtaWMpIGNvbnZlcnNpb24gY2FuIGJlIGRvbmUuCisJICog
U1RBVEVGVUxfUkVXUklURSAtIHN0YXRlZnVsIGNvbnZlcnNpb24gcmVxdWlyZWQsIHN0YXRl
IGlzIHNhdmVkIHRvCisJICogZ2l2ZW4gcG9pbnRlci4KKwkgKgorCSAqIENhbGxiYWNrIGlz
IE9QVElPTkFMLCBkZWZhdWx0cyB0byBTVEFURUxFU1NfUkVXUklURSBpZiBub3Qgc2V0Lgor
CSAqLworCWludCAoKnByZXBhcmUpKHN0cnVjdCBpcF9md19jaGFpbiAqLCBpcGZ3X2luc24g
Kmluc24sIHZvaWQgKiopOworCisJLyoKKwkgKiBQZXJmb3JtcyBvcGNvZGUgY29udmVyc2lv
bi4gQ2FsbGVkIHdpdGggY2hhaW4gV0xPQ0sgaGVsZC4KKwkgKiBOb3RlIHRoYXQgb3Bjb2Rl
IGNvcHkgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGlmCisJICogTk9fUkVXUklURSBpcyBy
ZXR1cm5lZC4gQGxlbiBoYXMgdG8gYmUgZmlsbGVkIG90aGVyd2lzZS4KKwkgKgorCSAqIFBh
cmFtczoKKwkgKiBAY2hhaW4gLSBwb2ludGVyIHRvIGN1cnJlbnQgaWZwdyBjaGFpbgorCSAq
IEBfb2xkIC0gdXNlcmxhbmQgaXBmd19pbnN0bgorCSAqIEBfbmV3IC0ga2VybmVsIGlwZndf
aW5zbgorCSAqIEBzdGF0ZSAtIHBvaW50ZXIgdG8gc3RhdGUgc2F2ZWQKKwkgKiBAbGVuIC0g
cG9pbnRlciB0byBvcGNvZGUgbGVuZ3RoIChpbiBpbnN0cnVjdGlvbnMpCisJICoKKwkgKiBS
ZXR1cm5zOgorCSAqIE5PX1JFV1JJVEUgLSBubyBuZWVkIHRvIGNvbnZlcnQKKwkgKiBTVEFU
RUxFU1NfUkVXUklURSAtIChhbGdvcml0bWljKSBjb252ZXJzaW9uIGlzICBkb25lLgorCSAq
IFNUQVRFRlVMX1JFV1JJVEUgLSBzdGF0ZWZ1bCBjb252ZXJzaW9uIGlzIGRvbmUsIHN0YXRl
IGlzIGNvbnN1bWVkLgorCSAqCisJICogQ2FsbGJhY2sgaXMgTUFOREFUT1JZLgorIAkgKi8K
KwlpbnQgKCpjb252ZXJ0KShzdHJ1Y3QgaXBfZndfY2hhaW4gKiwgaXBmd19pbnNuICosIGlw
ZndfaW5zbiAqLCB2b2lkICosIGludCAqKTsKKworCS8qCisJICogUGVyZm9ybXMgc3RhdGUg
Y2xlYW51cCAocnVsZSBkZWxldGlvbikuIENhbGxlZCB3aXRoIGNoYWluIFdMT0NLIGhlbGQu
CisJICogU3RhdGUgaGludCBjYW4gYmUgcHJvdmlkZWQuCisJICoKKwkgKiBQYXJhbXM6CisJ
ICogQGNoYWluIC0gcG9pbnRlciB0byBjdXJyZW50IGlmcHcgY2hhaW4KKwkgKiBAaW5zbiAt
IGtlcm5lbCBpcGZ3X2luc24KKwkgKiBAc3RhdGUgLSBwb2ludGVyIHRvIHN0YXRlIGhpbnQK
KwkgKgorCSAqIENhbGxiYWNrIGlzIE9QVElPTkFMLgorCSAqLworCXZvaWQgKCpjbGVhciko
c3RydWN0IGlwX2Z3X2NoYWluICosIGlwZndfaW5zbiAqLCB2b2lkICopOworCisJLyoKKwkg
KiBQZXJmb3JtcyBvcGNvZGUtZGVwZW5kZW50IHVwZGF0ZS4KKwkgKiBGbGFnL2FyZ3VtZW50
IGNhbiBiZSBwcm92aWRlZC4KKwkgKgorCSAqIFBhcmFtczoKKwkgKiBAY2hhaW4gLSBwb2lu
dGVyIHRvIGN1cnJlbnQgaWZwdyBjaGFpbgorCSAqIEBpbnNuIC0ga2VybmVsIGlwZndfaW5z
bgorCSAqIEBzdGF0ZSAtIHBvaW50ZXIgdG8gb3Bjb2RlLWRlcGVuZGVudCBkYXRhCisJICog
QHZhbCAtIG9wY29kZS1kZXBlbmRldCB2YWx1ZSAKKwkgKgorCSAqIENhbGxiYWNrIGlzIE9Q
VElPTkFMLgorCSAqLworCXZvaWQgKCp1cGRhdGUpKHN0cnVjdCBpcF9md19jaGFpbiAqLCBp
cGZ3X2luc24gKiwgdm9pZCAqLCB1aW50cHRyX3QpOworCisJLyoKKwkgKiBEaXNwYXRjaGVz
IG1lbW9yeSByZWxvY2F0aW9uIG9mIGdpdmVuIG9wY29kZSwgQ2FsbGVkIHdpdGggV0xPQ0sg
aGVsZC4KKwkgKiBBY3R1YWwgY29weSBpcyBhbHJlYWR5IGRvbmUgYXQgdGhlIG1vbWVudCBv
ZiBjYWxsLgorCSAqCisJICogUGFyYW1zOgorCSAqIEBjaGFpbiAtIHBvaW50ZXIgdG8gY3Vy
cmVudCBpZnB3IGNoYWluCisJICogQF9vbGQgLSBrZXJuZWwgaXBmd19pbnNuCisJICogQF9v
bGQgLSBuZXcga2VybmVsIGlwZndfaW5zbgorCSAqCisJICogQ2FsbGJhY2sgaXMgT1BUSU9O
QUwuCisJICovCisJdm9pZCAoKm1vdmUpKHN0cnVjdCBpcF9md19jaGFpbiAqLCBpcGZ3X2lu
c24gKiwgaXBmd19pbnNuICopOworfTsKKworLyogT3Bjb2RlIGNhbGxiYWNrcyAqLworc3Rh
dGljIGludAorY29udmVydGFibGVfaW5zbl9pZihzdHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWlu
LCBpcGZ3X2luc24gKmluc24pOworCitzdGF0aWMgdm9pZCBtb3ZlX2luc25faWYoc3RydWN0
IGlwX2Z3X2NoYWluICpjaGFpbiwgaXBmd19pbnNuICpfb2xkLCBpcGZ3X2luc24gKl9uZXcp
Oworc3RhdGljIHZvaWQgdXBkYXRlX2luc25faWYoc3RydWN0IGlwX2Z3X2NoYWluICpjaGFp
biwgaXBmd19pbnNuICppbnNuLAorICAgIHZvaWQgKl9pZmFjZV9tYXNrLCB1aW50cHRyX3Qg
bmV3X2lkKTsKK3N0YXRpYyB2b2lkIGNsZWFyX2luc25faWYoc3RydWN0IGlwX2Z3X2NoYWlu
ICpjaGFpbiwgaXBmd19pbnNuICpfc3JjLCB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgY29u
dmVydF9pbnNuX2lmKHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIGlwZndfaW5zbiAqX29s
ZCwgaXBmd19pbnNuICpfbmV3LAorICAgIHZvaWQgKnN0YXRlLCBpbnQgKmxlbik7CitzdGF0
aWMgaW50IHByZXBhcmVfaW5zbl9pZihzdHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWluLCBpcGZ3
X2luc24gKmluc24sIHZvaWQgKipwc3RhdGUpOworc3RhdGljIGludCBjaGVja19pbnNuX2lm
KHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIGlwZndfaW5zbiAqaW5zbiwgaW50ICpsZW4p
OworCisKKy8qIE5vdGUgb3Bjb2RlcyBNVVNUIGJlIGluIGFzY2VkaW5nIG9yZGVyICovCitz
dHJ1Y3QgaXBfZndfcmV3cml0ZSByZXdyaXRlc1tdID0geworCXsKKwkJT19SRUNWLAorCQlj
aGVja19pbnNuX2lmLAorCQlwcmVwYXJlX2luc25faWYsCisJCWNvbnZlcnRfaW5zbl9pZiwK
KwkJY2xlYXJfaW5zbl9pZiwKKwkJdXBkYXRlX2luc25faWYsCisJCW1vdmVfaW5zbl9pZiwK
Kwl9LAorCXsKKwkJT19YTUlULAorCQljaGVja19pbnNuX2lmLAorCQlwcmVwYXJlX2luc25f
aWYsCisJCWNvbnZlcnRfaW5zbl9pZiwKKwkJY2xlYXJfaW5zbl9pZiwKKwkJdXBkYXRlX2lu
c25faWYsCisJCW1vdmVfaW5zbl9pZiwKKwl9LAorCXsKKwkJT19WSUEsCisJCWNoZWNrX2lu
c25faWYsCisJCXByZXBhcmVfaW5zbl9pZiwKKwkJY29udmVydF9pbnNuX2lmLAorCQljbGVh
cl9pbnNuX2lmLAorCQl1cGRhdGVfaW5zbl9pZiwKKwkJbW92ZV9pbnNuX2lmLAorCX0sCit9
OworCitzdHJ1Y3QgcmV3cml0ZV9ydWxlX3B0ciB7CisJVEFJTFFfRU5UUlkocmV3cml0ZV9y
dWxlX3B0cikJbmV4dDsKKwlpbnQJCWNtZF9rbGVuOwkvKiBLZXJuZWwgb3Bjb2RlcyBsZW4g
KGluc25zKSAqLworCWludAkJY21kX2xlbjsJLyogT3JpZ2luYWwgb3Bjb2RlcyBsZW4gKGlu
c25zKSAqLworCWlwZndfaW5zbgkqa2NtZDsJLyogS2VybmVsIHJ1bGUgdmVyc2lvbiAqLwor
CXZvaWQJCSoqc3RhdGVzOwkvKiBvcGNvZGUgc3RhdGVzICovCisJaW50CQlzdGF0ZXNfY291
bnQ7CS8qIG51bWJlciBvZiBzdGF0ZXMgKi8KKwlpcGZ3X2luc24JY21kWzFdOwkvKiBPcmln
aW5hbCBvcGNvZGVzICovCit9OworVEFJTFFfSEVBRChyZXdyaXRlX3J1bGVfaGVhZCwgcmV3
cml0ZV9ydWxlX3B0cik7CisKK3N0cnVjdCBpcF9md19yd19kYXRhIHsKKwlzdHJ1Y3QgcmV3
cml0ZV9ydWxlX2hlYWQJKmhhc2g7CisJc2l6ZV90CQloc2l6ZTsKKwlpbnQJCWxlbmRpZmY7
CS8qIHNpemVvZihrZXJuKSAtIHNpemVvZih1c2VyKSAqLworfTsKKworI2RlZmluZQlERUZB
VUxUX0hBU0hfU0laRQkzMgorI2RlZmluZQlQVFJfSEFTSF9QUklNRQkJMzEKKworc3RhdGlj
IHN0cnVjdCBpcF9md19yZXdyaXRlICppcGZ3X2ZpbmRfcmV3cml0ZSh1aW50MzJfdCBvcGNv
ZGUpOworCit2b2lkCitpcGZ3X3Jld3JpdGVfaW5pdChzdHJ1Y3QgaXBfZndfY2hhaW4gKmNo
YWluKQoreworCXN0cnVjdCBpcF9md19yd19kYXRhICpyd2Q7CisJc3RydWN0IHJld3JpdGVf
cnVsZV9oZWFkICpyaDsKKwlpbnQgaTsKKworCXJ3ZCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0
IGlwX2Z3X3J3X2RhdGEpLCBNX0lQRlcsIE1fV0FJVE9LIHwgTV9aRVJPKTsKKworCXJ3ZC0+
aHNpemUgPSBERUZBVUxUX0hBU0hfU0laRTsKKwlyd2QtPmhhc2ggPSBtYWxsb2Moc2l6ZW9m
KHN0cnVjdCByZXdyaXRlX3J1bGVfaGVhZCkgKiByd2QtPmhzaXplLAorCSAgICBNX0lQRlcs
IE1fV0FJVE9LIHwgTV9aRVJPKTsKKworCWZvciAoaSA9IDAsIHJoID0gcndkLT5oYXNoOyBp
IDwgcndkLT5oc2l6ZTsgaSsrLCByaCsrKQorCQlUQUlMUV9JTklUKHJoKTsKKworCWNoYWlu
LT5yZXdyaXRlX2RhdGEgPSByd2Q7Cit9CisKK3ZvaWQKK2lwZndfcmV3cml0ZV9mcmVlKHN0
cnVjdCBpcF9md19jaGFpbiAqY2hhaW4pCit7CisJc3RydWN0IGlwX2Z3X3J3X2RhdGEgKnJ3
ZDsKKworCXJ3ZCA9IGNoYWluLT5yZXdyaXRlX2RhdGE7CisJY2hhaW4tPnJld3JpdGVfZGF0
YSA9IE5VTEw7CisKKwkvKiBBc3N1bWUgZXZlcnkgcnVsZSB0byBiZSBhbHJlYWR5IHJlbW92
ZWQgKi8KKwlmcmVlKHJ3ZC0+aGFzaCwgTV9JUEZXKTsKKwlmcmVlKHJ3ZCwgTV9JUEZXKTsK
K30KKworaW50CitpcGZ3X3Jld3JpdGVfbGVuKHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4p
Cit7CisJc3RydWN0IGlwX2Z3X3J3X2RhdGEgKnJ3ZDsKKworCXJ3ZCA9IGNoYWluLT5yZXdy
aXRlX2RhdGE7CisKKwlyZXR1cm4gKHJ3ZC0+bGVuZGlmZik7Cit9CisKKy8qCisgKiBQcmVw
YXJlcyBnaXZlbiBydWxlIGZvciBtb2RpZmljYXRpb246CisgKiBhbGxvY2F0ZXMgbWVtb3J5
IGZvciBydWxlIGFuZCBudW1iZXIgb2Ygc3RhdGVzIHJlcG9ydGVkCisgKiBieSAnY2hlY2sn
IGNhbGxiYWNrcy4gQ2FsbHMgJ3ByZXBhcmUnIGNhbGxiYWNrIGZvcgorICogZXZlcnkgb3Bj
b2RlIGluIHJ1bGUuCisgKgorICogUmV0dXJucyBzdGF0ZSB0byBiZSBwYXNzZWQgdG8gaXBm
d19zdG9yZV9ydWxlLgorICovCit2b2lkICoKK2lwZndfcHJlcGFyZV9yZXdyaXRlKHN0cnVj
dCBpcF9md19jaGFpbiAqY2hhaW4sIGlwZndfaW5zbiAqdWNtZCwKKyAgICBpbnQgY21kX2xl
biwgc3RydWN0IGlwX2Z3X3J3X2luZm8gKnJ3aSkKK3sKKwlpbnQgaSwgbCwgY21kbGVuLCBz
aXplLCBzdGF0ZXNfY291bnQ7CisJc3RydWN0IHJld3JpdGVfcnVsZV9wdHIgKnJwdHI7CisJ
aXBmd19pbnNuICpjbWQ7CisJc3RydWN0IGlwX2Z3X3Jld3JpdGUgKnJld3JpdGU7CisJdm9p
ZCAqKnBzdGF0ZTsKKworCS8qCisJICogQWxsb2NhdGUgbWVtb3J5IGZvciBydWxlIGhlYWRl
ciwgb3Bjb2RlcyBhbmQgc3RhdGUgYXJyYXkuCisJICovCisJc2l6ZSA9IHNpemVvZihzdHJ1
Y3QgcmV3cml0ZV9ydWxlX3B0cikgKworCSAgICAoY21kX2xlbiAtIDEpICogc2l6ZW9mKHVp
bnQzMl90KTsKKworCXNpemUgPSByb3VuZHVwKHNpemUsIHNpemVvZih2b2lkICopKTsKKwor
CXJwdHIgPSBtYWxsb2Moc2l6ZSArIHJ3aS0+c3RhdGVzICogc2l6ZW9mKHZvaWQgKiksIE1f
SVBGVywKKwkgICAgTV9XQUlUT0sgfCBNX1pFUk8pOworCisJLyogU2F2ZSBvcmlnaW5hbCBv
cGNvZGVzICovCisJbWVtY3B5KHJwdHItPmNtZCwgdWNtZCwgY21kX2xlbiAqIHNpemVvZih1
aW50MzJfdCkpOworCXJwdHItPmNtZF9sZW4gPSBjbWRfbGVuOworCXJwdHItPmNtZF9rbGVu
ID0gcnB0ci0+Y21kX2xlbiArIHJ3aS0+bGVuZGlmZjsgCisKKwlycHRyLT5zdGF0ZXMgPSAo
dm9pZCAqKikoKGNoYXIgKilycHRyICsgc2l6ZSk7CisJcnB0ci0+c3RhdGVzX2NvdW50ID0g
cndpLT5zdGF0ZXM7CisJcHN0YXRlID0gcnB0ci0+c3RhdGVzOworCXN0YXRlc19jb3VudCA9
IHJwdHItPnN0YXRlc19jb3VudDsKKworCUNUUjQoS1RSX05FVCwgIlByZXBhcmUgcnVsZSBy
ZXdyaXRlOiBjbWQgJXAgbGVuICVkIGtsZW4gJWQgcnB0ciAlcCIsCisJICAgIHVjbWQsIHJw
dHItPmNtZF9sZW4sIHJwdHItPmNtZF9rbGVuLCBycHRyKTsKKworCWZvciAobCA9IGNtZF9s
ZW4sIGNtZCA9IHVjbWQgOworCQkJbCA+IDAgOyBsIC09IGNtZGxlbiwgY21kICs9IGNtZGxl
bikgeworCQljbWRsZW4gPSBGX0xFTihjbWQpOworCisJCWlmICgocmV3cml0ZSA9IGlwZndf
ZmluZF9yZXdyaXRlKGNtZC0+b3Bjb2RlKSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJ
CWlmIChyZXdyaXRlLT5wcmVwYXJlID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlpID0g
cmV3cml0ZS0+cHJlcGFyZShjaGFpbiwgY21kLCBwc3RhdGUpOworCisJCWlmIChpID09IFNU
QVRFRlVMX1JFV1JJVEUpIHsKKwkJCUNUUjMoS1RSX05FVCwgIk5ldyBzdGF0ZWZ1bCByZXdy
aXRlICVwIHZhbCAlcCBjb3VudCAlZCIsCisJCQkgICAgcHN0YXRlLCAqcHN0YXRlLCBzdGF0
ZXNfY291bnQpOworCQkJcHN0YXRlKys7CisJCQlzdGF0ZXNfY291bnQtLTsKKworCQkJS0FT
U0VSVChzdGF0ZXNfY291bnQgPj0gMCwKKwkJCSAgICAoInByZXBhcmVfcmV3cml0ZSBzdGF0
ZSBvdmVyZmxvdyIpKTsKKwkJfQorCX0KKworCXJldHVybiAoKHZvaWQgKilycHRyKTsKK30K
Kworc3RhdGljIGludAoraGFzaF9wdHIoc3RydWN0IGlwX2Z3X3J3X2RhdGEgKnJ3ZCwgaXBm
d19pbnNuICpjbWQpCit7CisJcmV0dXJuICh1aW50cHRyX3QpY21kICUgUFRSX0hBU0hfUFJJ
TUU7Cit9CisKKy8qCisgKiBGaWxscyBpbiBrZXJuZWwgcnVsZSB3aXRoIG1vZGlmaWVkIG9w
Y29kZXMuIFVwZGF0ZXMgb2xkIHJ1bGUgc3RhdGUKKyAqIHdpdGggbmV3IGtlcm5lbCBwb2lu
dGVyLiBBY3R1YWwgcmV3cml0aW5nIGFuZCBoZWFkZXIgY29weSBpcyBkb25lCisgKiBpbiBp
cGZ3X3J1bl9yZXdyaXRlKCkuCisgKi8KK3ZvaWQKK2lwZndfcGVyZm9ybV9yZXdyaXRlKHN0
cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIGlwZndfaW5zbiAqa2NtZCwgdm9pZCAqc3RhdGUp
Cit7CisJc3RydWN0IHJld3JpdGVfcnVsZV9wdHIgKnJwdHI7CisJc3RydWN0IHJld3JpdGVf
cnVsZV9oZWFkICpyaDsKKwlzdHJ1Y3QgaXBfZndfcndfZGF0YSAqcndkOworCXN0cnVjdCBp
cF9md19yZXdyaXRlICpyZXdyaXRlOworCWlwZndfaW5zbiAqdWNtZDsKKwl2b2lkICoqcHN0
YXRlOworCWludCBpLCBsLCB1Y21kbGVuLCBrY21kbGVuLCBzdGF0ZXNfY291bnQ7CisKKwly
d2QgPSBjaGFpbi0+cmV3cml0ZV9kYXRhOworCisJcnB0ciA9IChzdHJ1Y3QgcmV3cml0ZV9y
dWxlX3B0ciAqKXN0YXRlOworCXJwdHItPmtjbWQgPSBrY21kOworCXBzdGF0ZSA9IHJwdHIt
PnN0YXRlczsKKwlzdGF0ZXNfY291bnQgPSBycHRyLT5zdGF0ZXNfY291bnQ7CisKKwlDVFIz
KEtUUl9ORVQsICJMaW5raW5nIGtjbWQgJXAgdG8gb3JpZyAlcCBpZHggJWQiLAorCSAgICBr
Y21kLCBycHRyLCBoYXNoX3B0cihyd2QsIGtjbWQpKTsKKworCXJoID0gJnJ3ZC0+aGFzaFto
YXNoX3B0cihyd2QsIGtjbWQpXTsKKwlUQUlMUV9JTlNFUlRfVEFJTChyaCwgcnB0ciwgbmV4
dCk7CisKKwl1Y21kID0gcnB0ci0+Y21kOworCQorCWZvciAobCA9IHJwdHItPmNtZF9sZW47
IGwgPiAwIDsKKwkgICAgbCAtPSB1Y21kbGVuLCB1Y21kICs9IHVjbWRsZW4sIGtjbWQgKz0g
a2NtZGxlbikgeworCQl1Y21kbGVuID0gRl9MRU4odWNtZCk7CisKKwkJaWYgKChyZXdyaXRl
ID0gaXBmd19maW5kX3Jld3JpdGUodWNtZC0+b3Bjb2RlKSkgPT0gTlVMTCkgeworCQkJLyog
Tm8gY29udmVyc2lvbiByZXF1aXJlZCwgY29weSBhcyBpcyAqLworCQkJa2NtZGxlbiA9IHVj
bWRsZW47CisJCQltZW1jcHkoa2NtZCwgdWNtZCwgdWNtZGxlbiAqIHNpemVvZihpcGZ3X2lu
c24pKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaSA9IHJld3JpdGUtPmNvbnZlcnQoY2hh
aW4sIHVjbWQsIGtjbWQsICpwc3RhdGUsICZrY21kbGVuKTsKKwkJQ1RSMigiUlcgZm9yICVk
IHN0ICVwIHJldHVybmVkICVkIiwgdWNtZC0+Y21kLCAqcHN0YXRlLCBpKTsKKworCQlpZiAo
aSA9PSBOT19SRVdSSVRFKSB7CisJCQlrY21kbGVuID0gdWNtZGxlbjsKKwkJCW1lbWNweShr
Y21kLCB1Y21kLCB1Y21kbGVuICogc2l6ZW9mKGlwZndfaW5zbikpOworCQl9IGVsc2UgaWYg
KGkgPT0gU1RBVEVGVUxfUkVXUklURSkgeworCQkJcHN0YXRlKys7CisJCQlzdGF0ZXNfY291
bnQtLTsKKworCQkJS0FTU0VSVChzdGF0ZXNfY291bnQgPj0gMCwgKCJyZXdyaXRlIHN0YXRl
IG92ZXJmbG93IikpOworCQl9CisJfQorCisJLyogU2F2ZSBzaXplIGRpZmZlcmVuY2UgKi8K
Kwlyd2QtPmxlbmRpZmYgKz0gcnB0ci0+Y21kX2tsZW4gLSBycHRyLT5jbWRfbGVuOworCUNU
UjIoS1RSX05FVCwgIm9sZCBsZW46ICVkLCBuZXc6ICVkIiwgcnB0ci0+Y21kX2xlbiwgcnB0
ci0+Y21kX2tsZW4pOworfQorCisvKgorICogSGFuZGxlIHJ1bGUgbW92aW5nIHRvIG5ldyBw
bGFjZSAob3IgZGVsZXRpb24pLgorICogVXBkYXRlcyBrZXJuZWwgcnVsZSBwb2ludGVyIGFu
ZCBydW4gb3Bjb2RlIGNhbGxiYWNrcyB2aWEKKyAqIGlwZndfbW92ZV9yZXdyaXRlKCkgb3Ig
Y2xlYXJzIHN0YXRlIHZpYSBpcGZ3X2NsZWFyX3Jld3JpdGUoKQorICogaW50IGxhdHRlciBj
YXNlLgorICovCit2b2lkCitpcGZ3X3JlbG9jYXRlX3Jld3JpdGUoc3RydWN0IGlwX2Z3X2No
YWluICpjaGFpbiwgaXBmd19pbnNuICpvbGQsIGlwZndfaW5zbiAqbmV3KQoreworCXN0cnVj
dCByZXdyaXRlX3J1bGVfcHRyICpycHRyOworCXN0cnVjdCByZXdyaXRlX3J1bGVfaGVhZCAq
cmg7CisJc3RydWN0IGlwX2Z3X3J3X2RhdGEgKnJ3ZDsKKwlzdHJ1Y3QgaXBfZndfcmV3cml0
ZSAqcmV3cml0ZTsKKwlpbnQgbCwgY21kbGVuOworCisJcndkID0gY2hhaW4tPnJld3JpdGVf
ZGF0YTsKKworCXJoID0gJnJ3ZC0+aGFzaFtoYXNoX3B0cihyd2QsIG9sZCldOworCisJVEFJ
TFFfRk9SRUFDSChycHRyLCByaCwgbmV4dCkgeworCQlpZiAocnB0ci0+a2NtZCA9PSBvbGQp
CisJCQlicmVhazsKKwl9CisKKwlDVFIzKEtUUl9ORVQsICJNb3ZpbmcgJXAgaWR4ICVwIHRv
ICVwIiwgcnB0ciwgaGFzaF9wdHIocndkLCBvbGQpLCBuZXcpOworCisJS0FTU0VSVChycHRy
ICE9IE5VTEwsICgiaXBmd19yZWxvY2F0ZV9yZXdyaXRlOiBvbGQgcnVsZSBub3QgZm91bmQi
KSk7CisKKwlUQUlMUV9SRU1PVkUocmgsIHJwdHIsIG5leHQpOworCisJaWYgKG5ldyA9PSBO
VUxMKSB7CisJCS8qIENsZWFyIHN0YXRlcyAoaWYgYW55KSBhbmQgZGVsZXRlIG9yaWdpbmFs
IHJ1bGUgKi8KKwkJZm9yIChsID0gcnB0ci0+Y21kX2tsZW47IGwgPiAwOyBsIC09IGNtZGxl
biwgb2xkICs9IGNtZGxlbikgeworCQkJY21kbGVuID0gRl9MRU4ob2xkKTsKKwkKKwkJCWlm
ICgocmV3cml0ZSA9IGlwZndfZmluZF9yZXdyaXRlKG9sZC0+b3Bjb2RlKSkgPT0gTlVMTCkK
KwkJCQljb250aW51ZTsKKwkKKwkJCWlmIChyZXdyaXRlLT5jbGVhciA9PSBOVUxMKQorCQkJ
CWNvbnRpbnVlOworCQorCQkJQ1RSMShLVFJfTkVULCAiY2xlYXItc3RhdGUgZm9yIG9wY29k
ZSAldSIsIG9sZC0+b3Bjb2RlKTsKKwkJCXJld3JpdGUtPmNsZWFyKGNoYWluLCBvbGQsIE5V
TEwpOworCQl9CisKKwkJLyogVXBkYXRlIHNpemUgZGlmZmVyZW5jZSAqLworCQlyd2QtPmxl
bmRpZmYgLT0gcnB0ci0+Y21kX2tsZW4gLSBycHRyLT5jbWRfbGVuOworCQlmcmVlKHJwdHIs
IE1fSVBGVyk7CisJfSBlbHNlIHsKKwkJLyogUHV0IHRvIG5ldyBzbG90ICovCisJCXJwdHIt
PmtjbWQgPSBuZXc7CisJCXJoID0gJnJ3ZC0+aGFzaFtoYXNoX3B0cihyd2QsIG5ldyldOwor
CQlUQUlMUV9JTlNFUlRfVEFJTChyaCwgcnB0ciwgbmV4dCk7CisKKwkJLyogVXBkYXRlIGlu
c3RydWN0aW9ucyBwb2ludGVycyAqLworCQlmb3IgKGwgPSBycHRyLT5jbWRfa2xlbjsgbCA+
IDAgOworCQkgICAgbCAtPSBjbWRsZW4sIG9sZCArPSBjbWRsZW4sIG5ldyArPSBjbWRsZW4p
IHsKKwkJCWNtZGxlbiA9IEZfTEVOKG9sZCk7CisJCisJCQlpZiAoKHJld3JpdGUgPSBpcGZ3
X2ZpbmRfcmV3cml0ZShvbGQtPm9wY29kZSkpID09IE5VTEwpCisJCQkJY29udGludWU7CisJ
CisJCQlpZiAocmV3cml0ZS0+bW92ZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQorCQkJ
cmV3cml0ZS0+bW92ZShjaGFpbiwgb2xkLCBuZXcpOworCQl9CisJfQorfQorCisvKgorICog
RXhwb3J0cyBtb2RpZmllZCBydWxlIHRvIHVzZXJsYW5kLiBSZXR1cm5zIHVzZXJsYW5kIHJ1
bGUgbGVuZ3RoCisgKiAodXNlZCBpbiBpbml0aWFsIHNpemUtY2hlY2tpbmcgY2FsY3VsYXRp
b25zKS4gQ29waWVzIHVzZXJsYW5kIHJ1bGUgdmVyc2lvbgorICogd2l0aCB1cGRhdGVkIGNv
dW50ZXJzIHRvIHN1cHBsaWVkIGJ1ZmZlci4KKyAqLworaW50CitpcGZ3X2V4cG9ydF9yZXdy
aXRlKHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIGlwZndfaW5zbiAqa2NtZCwgaXBmd19p
bnNuICp0YXJnZXQpCit7CisJc3RydWN0IHJld3JpdGVfcnVsZV9wdHIgKnJwdHI7CisJc3Ry
dWN0IHJld3JpdGVfcnVsZV9oZWFkICpyaDsKKwlzdHJ1Y3QgaXBfZndfcndfZGF0YSAqcndk
OworCWlwZndfaW5zbiAqdWNtZDsKKworCXJ3ZCA9IGNoYWluLT5yZXdyaXRlX2RhdGE7CisK
KwlLQVNTRVJUKHJ3ICE9IE5VTEwsICgiaXBmd19leHBvcnRfcmV3cml0ZTogcmV3cml0ZSBu
b3QgaW5pdGlhbGl6ZWQiKSk7CisKKwlyaCA9ICZyd2QtPmhhc2hbaGFzaF9wdHIocndkLCBr
Y21kKV07CisKKwlUQUlMUV9GT1JFQUNIKHJwdHIsIHJoLCBuZXh0KSB7CisJCWlmIChycHRy
LT5rY21kID09IGtjbWQpCisJCQlicmVhazsKKwl9CisKKwlLQVNTRVJUKHJwdHIgIT0gTlVM
TCwgKCJpcGZ3X2V4cG9ydF9yZXdyaXRlOiAga2NtZCBub3QgZm91bmQiKSk7CisJdWNtZCA9
IHJwdHItPmNtZDsKKworCWlmICh0YXJnZXQgIT0gTlVMTCkKKwkJbWVtY3B5KHRhcmdldCwg
cnB0ci0+Y21kLCBycHRyLT5jbWRfbGVuICogc2l6ZW9mKHVpbnQzMl90KSk7CisKKwlyZXR1
cm4gKHJwdHItPmNtZF9sZW4gKiBzaXplb2YodWludDMyX3QpKTsKK30KKworLyoKKyAqIGJz
ZWFyY2goKSBoZWxwZXIgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQKK3Jld3JpdGVfY29t
cChjb25zdCB2b2lkICpfa2V5LCBjb25zdCB2b2lkICpfbWVtYmVyKQoreworCXVpbnQzMl90
IG9wY29kZTsKKwlzdHJ1Y3QgaXBfZndfcmV3cml0ZSAqcmV3cml0ZTsKKworCW9wY29kZSA9
ICooKHVpbnQzMl90ICopX2tleSk7CisJcmV3cml0ZSA9IChzdHJ1Y3QgaXBfZndfcmV3cml0
ZSAqKV9tZW1iZXI7CisKKwlpZiAob3Bjb2RlIDwgcmV3cml0ZS0+b3Bjb2RlKQorCQlyZXR1
cm4gKC0xKTsKKwllbHNlIGlmIChvcGNvZGUgPT0gcmV3cml0ZS0+b3Bjb2RlKQorCQlyZXR1
cm4gKDApOworCWVsc2UKKwkJcmV0dXJuICgxKTsKK30KKworCitzdGF0aWMgc3RydWN0IGlw
X2Z3X3Jld3JpdGUgKgoraXBmd19maW5kX3Jld3JpdGUodWludDMyX3Qgb3Bjb2RlKQorewor
CXNpemVfdCBjb3VudDsKKwlzdHJ1Y3QgaXBfZndfcmV3cml0ZSAqcmV3cml0ZTsKKworCWNv
dW50ID0gc2l6ZW9mKHJld3JpdGVzKSAvIHNpemVvZihzdHJ1Y3QgaXBfZndfcmV3cml0ZSk7
CisKKwlyZXdyaXRlID0gKHN0cnVjdCBpcF9md19yZXdyaXRlICopYnNlYXJjaCgmb3Bjb2Rl
LCByZXdyaXRlcywKKwkgICAgY291bnQsIHNpemVvZihzdHJ1Y3QgaXBfZndfcmV3cml0ZSks
IHJld3JpdGVfY29tcCk7CisKKwlyZXR1cm4gKHJld3JpdGUpOworfQorCisKKy8qCisgKiBD
aGVja3MgaWYgZ2l2ZW4gb3Bjb2RlIG5lZWRzIHRvIGJlIGNoYW5nZWQuCisgKiBVcGRhdGVz
IEByd2kgYXBwcm9wcmlhdGUgZmllbGRzIGlmIGluc3RydWN0aW9uIG5lZWRzIHRvIGJlCisg
KiBzdGF0ZWxlc3Mvc3RhZnVsbHkgcmV3cml0dGVuIHBvc3NpYmx5IHdpdGggY2hhbmdlZCBz
aXplLgorICovCit2b2lkCitpcGZ3X2NoZWNrX3Jld3JpdGUoc3RydWN0IGlwX2Z3X2NoYWlu
ICpjaGFpbiwgaXBmd19pbnNuICppbnNuLAorICAgIHN0cnVjdCBpcF9md19yd19pbmZvICpy
d2kpCit7CisJc3RydWN0IGlwX2Z3X3Jld3JpdGUgKnJld3JpdGU7CisJaW50IGkgPSAwLCBs
ZW4gPSAwOworCisJaWYgKChyZXdyaXRlID0gaXBmd19maW5kX3Jld3JpdGUoaW5zbi0+b3Bj
b2RlKSkgPT0gTlVMTCkKKwkJaSA9IE5PX1JFV1JJVEU7CisJZWxzZSBpZiAocmV3cml0ZS0+
Y2hlY2sgPT0gTlVMTCkKKwkJaSA9IFNUQVRFTEVTU19SRVdSSVRFOworCWVsc2UKKwkJaSA9
IHJld3JpdGUtPmNoZWNrKGNoYWluLCBpbnNuLCAmbGVuKTsKKworCWlmIChsZW4gIT0gMCkK
KwkJcndpLT5sZW5kaWZmICs9IGxlbjsKKworCWlmIChpID09IFNUQVRFTEVTU19SRVdSSVRF
KQorCQlyd2ktPmNvdW50Kys7CisKKwlpZiAoaSA9PSBTVEFURUZVTF9SRVdSSVRFKSB7CisJ
CXJ3aS0+Y291bnQrKzsKKwkJcndpLT5zdGF0ZXMrKzsKKwl9CisKKwlpZiAoaSAhPSBOT19S
RVdSSVRFKQorCQlDVFI0KEtUUl9ORVQsICJvcGNvZGUgJWQ6IGNvdW50PSVkIHN0YXRlcz0l
ZCBsZW49JWQiLCAKKwkJICAgIGluc24tPm9wY29kZSwgcndpLT5jb3VudCwgcndpLT5zdGF0
ZXMsIHJ3aS0+bGVuZGlmZik7Cit9CisKKy8qCisgKiBDYWxsIG9wY29kZS1kZXBlbmRlbnQg
J3VwZGF0ZScgY2FsbGJhY2suCisgKi8KK3ZvaWQKK2lwZndfdXBkYXRlX3Jld3JpdGUoc3Ry
dWN0IGlwX2Z3X2NoYWluICpjaGFpbiwgaXBmd19pbnNuICppbnNuLAorICAgIHZvaWQgKnN0
YXRlLCB1aW50cHRyX3QgdmFsKQoreworCXN0cnVjdCBpcF9md19yZXdyaXRlICpyZXdyaXRl
OworCisJaWYgKChyZXdyaXRlID0gaXBmd19maW5kX3Jld3JpdGUoaW5zbi0+b3Bjb2RlKSkg
PT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHJld3JpdGUtPnVwZGF0ZSA9PSBOVUxMKQor
CQlyZXR1cm47CisKKwlyZXdyaXRlLT51cGRhdGUoY2hhaW4sIGluc24sIHN0YXRlLCB2YWwp
OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCQkJCQkgICAgKgorICogICAgICAgICAg
T19SRUNWIHwgT19WSUEgfCBPX1hNSVQgcmV3cml0ZSBoYW5kbGluZy4gICAgICAgICAgICAg
ICAqCisgKiAJCQkJCQkJCSAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBDb252ZXJ0
cyBpbnNuc19pZiB0byBtb3JlIGNvbXBhY3QgZm9ybS4gQ3VycmVudGx5IGluc3RydWN0aW9u
CisgKiBpcyB1c2VkIHRvIHNwZWNpZnkKKyAqIDEpIGludGVyZmFjZSBuYW1lICggLT5uYW1l
WzBdICE9ICgnXDAnIHwgJ1wxJykgQU5EIHAuZ2xvYiA9PSAwKQorICogMikgaW50ZXJmYWNl
IHBhdHRlcm4gKCAtPm5hbWVbMF0gIT0gKCdcMCcgfCAnXDEnKSBBTkQgcC5nbG9iICE9IDAp
CisgKiAzKSBlWHRlbmRlZCB0YWJsZSBudW1iZXIgKCAtPm5hbWVbMF0gPT0gJ1wxJykKKyAq
IDQpIGludGVyZmFjZSBhZGRyZXNzICggLT5uYW1lWzBdID09ICdcMCcpCisgKgorICogV2Ug
d2FudCB0byBzYXZlIGlmYWNlIGluZGV4IGluIGNhc2UgMSAoYW5kIHRvIGVsaW1pbmF0ZSBp
bnRlcmZhY2UgbmFtZSBhdCBhbGwpLgorICogR2l2ZW4gdGhhdCwgd2UgZG8gdGhlIGZvbGxv
d2luZzoKKyAqCisgKiBwLmdsb2IgaXMgbm93IHAuaWZfaWR4ICh1X2ludCkgKGdsb2IgaWYg
emVybywgaWZhY2UgaW5kZXggb3RoZXJ3aXNlKQorICogby5hcmcxIHdvcmtzIGxpa2UgLT5u
YW1lWzBdLCBzbzoKKyAqCisgKiAxKSBpbnRlcmZhY2UgbmFtZSAoby5hcmcxID09IDIsIHAu
aWZfaWR4IGNvbnRhaW5zIGluZGV4KQorICogMikgaW50ZXJmYWNlIHBhdHRlcm4gKG8uYXJn
MSA9PSAyLCBwLmlmX2lkeCA9PSAwKQorICogMykgZVh0ZW5kZWQgdGFibGUgbnVtYmVyIChv
LmFyZzEgPT0gMSkKKyAqIDQpIGludGVyZmFjZSBhZGRyZXNzIChvLmFyZzEgPT0gMCkKKyAq
LworCitzdGF0aWMgaW50Citjb252ZXJ0YWJsZV9pbnNuX2lmKHN0cnVjdCBpcF9md19jaGFp
biAqY2hhaW4sIGlwZndfaW5zbiAqaW5zbikKK3sKKwlpcGZ3X2luc25faWYgKmNtZCA9IChp
cGZ3X2luc25faWYgKilpbnNuOworCisJLyogRWl0aGVyIElQdjQgYWRkcmVzcyBvciBleHRl
bmRlZCB0YWJsZSAoMykgYW5kICg0KSAqLworCWlmIChjbWQtPm5hbWVbMF0gPT0gJ1wwJyB8
fCBjbWQtPm5hbWVbMF0gPT0gJ1wxJykKKwkJcmV0dXJuICgwKTsKKworCXJldHVybiAoMSk7
Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrX2luc25faWYoc3RydWN0IGlwX2Z3X2NoYWluICpj
aGFpbiwgaXBmd19pbnNuICppbnNuLCBpbnQgKmxlbl9kaWZmKQoreworCWlwZndfaW5zbl9p
ZiAqY21kID0gKGlwZndfaW5zbl9pZiAqKWluc247CisKKwkqbGVuX2RpZmYgPSAwOworCisJ
aWYgKGNvbnZlcnRhYmxlX2luc25faWYoY2hhaW4sIGluc24pID09IDApCisJCXJldHVybiAo
U1RBVEVMRVNTX1JFV1JJVEUpOworCisJLyogRWl0aGVyIGludGVyZmFjZSBuYW1lICgxKSBv
ciBnbG9iIHBhdHRlcm4gKDIpLiAqLworCisJaWYgKGNtZC0+cC5nbG9iICE9IDApCisJCXJl
dHVybiAoU1RBVEVMRVNTX1JFV1JJVEUpOworCWVsc2UKKwkJcmV0dXJuIChTVEFURUZVTF9S
RVdSSVRFKTsKK30KKworc3RhdGljIGludAorcHJlcGFyZV9pbnNuX2lmKHN0cnVjdCBpcF9m
d19jaGFpbiAqY2hhaW4sIGlwZndfaW5zbiAqaW5zbiwgdm9pZCAqKnBzdGF0ZSkKK3sKKwlz
dHJ1Y3QgaWZhY2VfbWFzayAqaWZtOworCXN0cnVjdCBpcGZ3X2luc25fcHRyICppbnNuX3B0
cjsKKwlpcGZ3X2luc25faWYgKmNtZCA9IChpcGZ3X2luc25faWYgKilpbnNuOworCisJaWYg
KGNvbnZlcnRhYmxlX2luc25faWYoY2hhaW4sIGluc24pID09IDApCisJCXJldHVybiAoU1RB
VEVMRVNTX1JFV1JJVEUpOworCisJaWYgKGNtZC0+cC5nbG9iICE9IDApIHsKKwkJLyogR2xv
YiBwYXR0ZXJuICgyKSwgbm8gc3RhdGUgbmVlZGVkLCAqLworCQlyZXR1cm4gKFNUQVRFTEVT
U19SRVdSSVRFKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBkYXRhIHVzZWQgYnkgY29udmVydCBj
YWxsYmFjayAqLworCWluc25fcHRyID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXBmd19pbnNu
X3B0ciksIE1fSVBGVywKKwkgICAgTV9XQUlUT0sgfCBNX1pFUk8pOworCWlmbSA9IG1hbGxv
YyhzaXplb2Yoc3RydWN0IGlmYWNlX21hc2spLCBNX0lQRlcsIE1fV0FJVE9LIHwgTV9aRVJP
KTsKKworCVRBSUxRX0lOSVQoJmlmbS0+aW5zdHJ1Y3Rpb25zKTsKKwlUQUlMUV9JTlNFUlRf
VEFJTCgmaWZtLT5pbnN0cnVjdGlvbnMsIGluc25fcHRyLCBuZXh0KTsKKworCUNUUjMoS1RS
X05FVCwgInBzdGF0ZSAlcCwgdmFsICVwIGluc25zICVwIiwgcHN0YXRlLCBpZm0sIGluc24p
OworCisJKnBzdGF0ZSA9IGlmbTsKKwlyZXR1cm4gKFNUQVRFRlVMX1JFV1JJVEUpOworfQor
CitzdGF0aWMgaW50Citjb252ZXJ0X2luc25faWYoc3RydWN0IGlwX2Z3X2NoYWluICpjaGFp
biwgaXBmd19pbnNuICpfb2xkLCBpcGZ3X2luc24gKl9uZXcsCisgICAgdm9pZCAqc3RhdGUs
IGludCAqbGVuKQoreworCXN0cnVjdCBpZmFjZV9tYXNrICppZm0sICppZm0yOworCXN0cnVj
dCBpcGZ3X2luc25fcHRyICppbnNuX3B0cjsKKwlpcGZ3X2luc25faWYgKmNtZF9vbGQgPSAo
aXBmd19pbnNuX2lmICopX29sZDsKKwlpcGZ3X2luc25faWYgKmNtZF9uZXcgPSAoaXBmd19p
bnNuX2lmICopX25ldzsKKworCS8qIFNldCBsZW5ndGggYW55d2F5ICovCisJKmxlbiA9IEZf
SU5TTl9TSVpFKGlwZndfaW5zbl9pZik7CisJbWVtY3B5KGNtZF9uZXcsIGNtZF9vbGQsIHNp
emVvZihpcGZ3X2luc25faWYpKTsKKworCWlmIChjb252ZXJ0YWJsZV9pbnNuX2lmKGNoYWlu
LCBfb2xkKSA9PSAwKSB7CisJCS8qCisJCSAqIGNhc2UgKDMsIGVYIHRhYmxlKTogby5hcmcx
ID0gMQorCQkgKiBjYXNlICg0LCBpZmFkZHIpOiBvLmFyZzEgPSAwCisJCSAqLworCisJCWNt
ZF9uZXctPm8uYXJnMSA9IChjbWRfb2xkLT5uYW1lWzBdID09ICdcMScpID8gMSA6IDA7CisK
KwkJcmV0dXJuIChTVEFURUxFU1NfUkVXUklURSk7CisJfQorCisJLyoKKwkgKiBQcmVwYXJl
IGluc3RydWN0aW9uIGZvciBhbHRlcmluZy4KKwkgKiBjYXNlICgxLCBpZm5hbWUpOiBvLmFy
ZzEgPSAyOyBwX2lmX2lkeCA9PSBpbnRlcmZhY2UgaW5kZXgKKwkgKiBjYXNlICgyLCBnbG9i
KTogby5hcmcxID0gMicgcC5pZl9pZHggPSAwCisJICovCisJbWVtY3B5KGNtZF9uZXcsIGNt
ZF9vbGQsIHNpemVvZihpcGZ3X2luc25faWYpKTsKKwljbWRfbmV3LT5vLmFyZzEgPSAyOwor
CisJaWYgKGNtZF9vbGQtPnAuZ2xvYikgeworCQkvKiBJbnRlcmZhY2UgbWFzayAoMikuIENv
cHkgYXMgaXMgYW5kIHNldCBpbmRleCAqLworCQljbWRfbmV3LT5wLmlmX2lkeCA9IDA7CisJ
CXJldHVybiAoU1RBVEVMRVNTX1JFV1JJVEUpOworCX0KKworCS8qIEludGVyZmFjZSBuYW1l
LiAqLworCWlmbSA9IChzdHJ1Y3QgaWZhY2VfbWFzayAqKXN0YXRlOworCWluc25fcHRyID0g
VEFJTFFfRklSU1QoJmlmbS0+aW5zdHJ1Y3Rpb25zKTsKKworCWluc25fcHRyLT5pbnNuID0g
X25ldzsKKworCWlmICgoaWZtMiA9IGlwZndfc2VhcmNoX2lmbmFtZShjaGFpbiwgY21kX29s
ZC0+bmFtZSkpICE9IE5VTEwpIHsKKwkJLyogSW50ZXJmYWNlIGZvdW5kLCBsaW5rIGVudHJ5
IGhlcmUgKi8KKwkJVEFJTFFfSU5TRVJUX1RBSUwoJmlmbTItPmluc3RydWN0aW9ucywgaW5z
bl9wdHIsIG5leHQpOworCQlpZm0yLT5yZWZjb3VudCsrOworCQljbWRfbmV3LT5wLmlmX2lk
eCA9IGlmbTItPmlkeDsKKwkJaWYgKGlmbTItPmZsYWdzICYgSVBGV19JRkxBR19GQUtFKQor
CQkJY21kX25ldy0+cC5pZl9pZHggfD0gSVBGV19GQUtFX0lEWDsKKworCQlmcmVlKGlmbSwg
TV9JUEZXKTsKKwkJcmV0dXJuIChTVEFURUZVTF9SRVdSSVRFKTsKKwl9CisKKwkvKiBJbnRl
cmZhY2Ugbm90IGZvdW5kLCBhZGQgYW5kIG1hcmsgYXMgdW5leGlzdGVudCAqLworCXN0cmxj
cHkoaWZtLT5uYW1lLCBjbWRfb2xkLT5uYW1lLCBJRk5BTVNJWik7CisJaWZtLT5mbGFncyB8
PSBJUEZXX0lGTEFHX0ZBS0U7CisJaWZtLT5yZWZjb3VudCsrOworCWlwZndfYWRkX2lmbmFt
ZShjaGFpbiwgaWZtKTsKKwljbWRfbmV3LT5wLmlmX2lkeCA9IGlmbS0+aWR4IHwgSVBGV19G
QUtFX0lEWDsKKwkvKiBBZGQgaW5zdHJ1Y3Rpb24gYmFjayAoYWRkX2lmbmFtZSByZWluaXRz
IGxpc3QpICovCisJVEFJTFFfSU5TRVJUX1RBSUwoJmlmbS0+aW5zdHJ1Y3Rpb25zLCBpbnNu
X3B0ciwgbmV4dCk7CisKKwlyZXR1cm4gKFNUQVRFRlVMX1JFV1JJVEUpOworfQorCitzdGF0
aWMgdm9pZAorY2xlYXJfaW5zbl9pZihzdHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWluLCBpcGZ3
X2luc24gKl9zcmMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlmYWNlX21hc2sgKmlmbTsK
KwlpcGZ3X2luc25faWYgKmNtZDsKKwlzdHJ1Y3QgaXBmd19pbnNuX3B0ciAqaW5zbl9wdHIg
PSAoc3RydWN0IGlwZndfaW5zbl9wdHIgKilkYXRhOworCisJY21kID0gKGlwZndfaW5zbl9p
ZiAqKV9zcmM7CisKKwkvKiBTdGF0ZSBpcyB1c2VkIGZvciBpbnRlcmZhY2UgbmFtZXMsIHNr
aXAgb3RoZXIgY2FzZXMgKi8KKwlpZiAoY21kLT5vLmFyZzEgIT0gMikKKwkJcmV0dXJuOwor
CisJaWZtID0gaXBmd19zZWFyY2hfaWZpbmRleChjaGFpbiwgY21kLT5wLmlmX2lkeCk7CisJ
S0FTU0VSVChpZm0gIT0gTlVMTCwgKCJubyBpZnAgZm91bmQgZm9yIGluZGV4ICV1IiwgY21k
LT5wLmlmX2lkeCkpOworCisJaWYgKGluc25fcHRyID09IE5VTEwpIHsKKwkJVEFJTFFfRk9S
RUFDSChpbnNuX3B0ciwgJmlmbS0+aW5zdHJ1Y3Rpb25zLCBuZXh0KSB7CisJCQlpZiAoaW5z
bl9wdHItPmluc24gPT0gX3NyYykKKwkJCQlicmVhazsKKwkJfQorCisJCUtBU1NFUlQoaW5z
bl9wdHIgIT0gTlVMTCwgKCJubyBpbnNucyBmb3VuZCIpKTsKKwl9CisKKwkvKiBSZW1vdmUg
aW5zdHJ1Y3Rpb24gZnJvbSBpbnRlcmZhY2UgKi8KKwlUQUlMUV9SRU1PVkUoJmlmbS0+aW5z
dHJ1Y3Rpb25zLCBpbnNuX3B0ciwgbmV4dCk7CisJaWZtLT5yZWZjb3VudC0tOworCisJZnJl
ZShpbnNuX3B0ciwgTV9JUEZXKTsKK30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9pbnNuX2lm
KHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIGlwZndfaW5zbiAqaW5zbiwgdm9pZCAqX2lm
YWNlX21hc2ssCisgICAgdWludHB0cl90IG5ld19pZCkKK3sKKwlzdHJ1Y3QgaXBfZndfaWZf
ZGF0YSAqaWZkOworCWlwZndfaW5zbl9pZiAqY21kOworCisJSVBGV19XTE9DS19BU1NFUlQo
Y2hhaW4pOworCisJaWZkID0gY2hhaW4tPmlmX2RhdGE7CisJY21kID0gKGlwZndfaW5zbl9p
ZiAqKWluc247CisKKwlDVFIyKEtUUl9ORVQsICJ1cGRhdGluZyBpbnNuOiBpZmkgJXUgLT4g
JXUiLAorCSAgICBjbWQtPnAuaWZfaWR4LCAodWludDMyX3QpbmV3X2lkKTsKKworCWNtZC0+
cC5pZl9pZHggPSAodWludDMyX3QpbmV3X2lkOworfQorCitzdGF0aWMgdm9pZAorbW92ZV9p
bnNuX2lmKHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIGlwZndfaW5zbiAqX29sZCwgaXBm
d19pbnNuICpfbmV3KQoreworCXN0cnVjdCBpZmFjZV9tYXNrICppZm07CisJaXBmd19pbnNu
X2lmICpjbWQ7CisJc3RydWN0IGlwZndfaW5zbl9wdHIgKmluc25fcHRyOworCisJY21kID0g
KGlwZndfaW5zbl9pZiAqKV9vbGQ7CisKKwkvKiBTdGF0ZSBpcyB1c2VkIGZvciBpbnRlcmZh
Y2UgbmFtZXMsIHNraXAgb3RoZXIgY2FzZXMgKi8KKwlpZiAoY21kLT5vLmFyZzEgIT0gMikK
KwkJcmV0dXJuOworCisJaWZtID0gaXBmd19zZWFyY2hfaWZpbmRleChjaGFpbiwgY21kLT5w
LmlmX2lkeCk7CisJS0FTU0VSVChpZm0gIT0gTlVMTCwgKCJubyBpZnAgZm91bmQgZm9yIGlu
ZGV4ICV1IiwgY21kLT5wLmlmX2lkeCkpOworCisJVEFJTFFfRk9SRUFDSChpbnNuX3B0ciwg
JmlmbS0+aW5zdHJ1Y3Rpb25zLCBuZXh0KSB7CisJCWlmIChpbnNuX3B0ci0+aW5zbiA9PSBf
b2xkKQorCQkJYnJlYWs7CisJfQorCisJS0FTU0VSVChpbnNuX3B0ciAhPSBOVUxMLCAoIm5v
IGluc25zIGZvdW5kIikpOworCisJaW5zbl9wdHItPmluc24gPSBfbmV3OworfQorCisKLS0t
IC9kZXYvbnVsbAkyMDEzLTA0LTI0IDE3OjIwOjE5LjAwMDAwMDAwMCArMDQwMAorKysgc3lz
L25ldHBmaWwvaXBmdy9pcF9md19pZmFjZS5jCTIwMTMtMDQtMjQgMTc6MTg6MzUuNTQ2MzU3
NTk0ICswNDAwCkBAIC0wLDAgKzEsNDY3IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAx
MyBZYW5kZXggTExDLgorICogQXV0aG9yOiBBbGV4YW5kZXIgVi4gQ2hlcm5pa292IDxtZWxp
ZmFyb0B5YW5kZXgtdGVhbS5ydT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5E
IENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikK
KyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBP
VVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lz
L2NkZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKy8qCisgKiBJbnRlcmZhY2Ug
dHJhY2tpbmcgZm9yIGlwZncuCisgKi8KKworI2luY2x1ZGUgIm9wdF9pcGZ3LmgiCisKKyNp
bmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KKyNpbmNsdWRl
IDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL2tlcm5lbC5oPgorI2luY2x1ZGUgPHN5
cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lzL3J3bG9jay5oPgorI2luY2x1ZGUgPHN5cy9mbnZf
aGFzaC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4K
KyNpbmNsdWRlIDxuZXQvdm5ldC5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2lu
Y2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+IC8qIGhvb2tzICovCisjaW5jbHVkZSA8bmV0aW5l
dC9pcF9mdy5oPgorCisjaW5jbHVkZSA8bmV0cGZpbC9pcGZ3L2lwX2Z3X3ByaXZhdGUuaD4K
KyNpbmNsdWRlIDxuZXRwZmlsL2lwZncvaXBfZndfaWZhY2UuaD4KKworI2RlZmluZQlJUEZX
X0lGSEFTSF9JRFgoaWR4LCBoc2l6ZSkJKChpZHgpICUgKGhzaXplKSkKKyNkZWZpbmUJSVBG
V19JRkhBU0hfTkFNRShuYW1lLCBoc2l6ZSkJKGZudl8zMl9zdHIobmFtZSwgRk5WMV8zMl9J
TklUKSAlIChoc2l6ZSkpCisKK1RBSUxRX0hFQUQoaWZhY2VfbWFza19oZWFkLCBpZmFjZV9t
YXNrKTsKKworc3RydWN0IGlwX2Z3X2lmX2RhdGEgeworCXN0cnVjdCBpZmFjZV9tYXNrX2hl
YWQgKm1hc2tzOyAvKiBJbnRlcmZhY2UgbmFtZSBoYXNoICovCisJc2l6ZV90IG1hc2tzX2Nv
dW50LCBtYXNrc19oc2l6ZTsKKwlzdHJ1Y3QgaWZhY2VfbWFza19oZWFkICpyZWFsX2lmYWNl
czsgLyogJ1JlYWwnIGludGVyZmFjZSBpbmRleCBoYXNoICovCisJc2l6ZV90IHJlYWxfY291
bnQsIHJlYWxfaHNpemU7CisJc3RydWN0IGlmYWNlX21hc2tfaGVhZCAqZmFrZV9pZmFjZXM7
IC8qIE5vbmV4aXN0ZW50IGludGVyZmFjZSBpbmRleCBoYXNoICovCisJc2l6ZV90IGZha2Vf
Y291bnQsIGZha2VfaHNpemU7CisJZXZlbnRoYW5kbGVyX3RhZyBhcnJpdmFsLCBkZXBhcnR1
cmU7CisJdV9zaG9ydCBmYWtlX2lkeDsKK307CisKK3N0YXRpYyB2b2lkIGlwZndfaWZoYXNo
X2luaXRfaW50KHN0cnVjdCBpZmFjZV9tYXNrX2hlYWQgKipwaGFzaCwgc2l6ZV90IGhzaXpl
KTsKK3N0YXRpYyB2b2lkIGlwZndfaWZuZXRfaW5pdChzdHJ1Y3QgaXBfZndfY2hhaW4gKmNo
YWluLCBzdHJ1Y3QgaWZhY2VfbWFzayAqaWZtKTsKKworLyoKKyAqIE1hcHBpbmdzOgorICog
J2lmYWNlX21hc2snIC0+IGlkeAorICogaWZfaW5kZXggLT4gaWZhY2VfbWFzaworICogZmFr
ZV9pbmRleCAtPiBpZmFjZV9tYXNrCisgKgorICogTGlzdCBvZiBtYXNrcworICoKKyAqLwor
c3RhdGljIHZvaWQgaWZuZXRfYXJyaXZhbCh2b2lkICphcmcsIHN0cnVjdCBpZm5ldCAqaWZw
KTsKK3N0YXRpYyB2b2lkIGlmbmV0X2RlcGFydHVyZSh2b2lkICphcmcsIHN0cnVjdCBpZm5l
dCAqaWZwKTsKKworLyoKKyAqIEZpbmQgaW50ZXJmYWNlIHN0cnVjdHVyZSBieSBuYW1lLgor
ICogQ2FsbGVkIHdpdGggZWl0aGVyIFVIIG9yIGNoYWluIHJlYWRsb2NrIGhlbGQuCisgKi8K
K3N0cnVjdCBpZmFjZV9tYXNrICoKK2lwZndfc2VhcmNoX2lmbmFtZShzdHJ1Y3QgaXBfZndf
Y2hhaW4gKmNoYWluLCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpZmFjZV9tYXNrICppZm07
CisJc3RydWN0IGlwX2Z3X2lmX2RhdGEgKmlmZDsKKwlzdHJ1Y3QgaWZhY2VfbWFza19oZWFk
ICppZmg7CisJaW50IGk7CisKKwlpZmQgPSBjaGFpbi0+aWZfZGF0YTsKKworCWkgPSBJUEZX
X0lGSEFTSF9OQU1FKG5hbWUsIGlmZC0+bWFza3NfaHNpemUpOworCisJaWZoID0gJmlmZC0+
bWFza3NbaV07CisJVEFJTFFfRk9SRUFDSChpZm0sIGlmaCwgbmFtZV9uZXh0KSB7CisJCWlm
IChzdHJjbXAobmFtZSwgaWZtLT5uYW1lKSA9PSAwKQorCQkJcmV0dXJuIChpZm0pOworCX0K
KworCXJldHVybiAoTlVMTCk7Cit9CisKKy8qCisgKiBGaW5kIGludGVyZmFjZSBzdHJ1Y3R1
cmUgYnkgcmVhbCBvciBmYWtlIGlmaW5kZXguCisgKiBDYWxsZWQgd2l0aCBlaXRoZXIgVUgg
b3IgY2hhaW4gcmVhZGxvY2sgaGVsZC4KKyAqLworc3RydWN0IGlmYWNlX21hc2sgKgoraXBm
d19zZWFyY2hfaWZpbmRleChzdHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWluLCB1aW50MzJfdCBp
ZHgpCit7CisJc3RydWN0IGlmYWNlX21hc2sgKmlmbTsKKwlzdHJ1Y3QgaXBfZndfaWZfZGF0
YSAqaWZkOworCXN0cnVjdCBpZmFjZV9tYXNrX2hlYWQgKmlmaDsKKwlpbnQgaTsKKworCWlm
ZCA9IGNoYWluLT5pZl9kYXRhOworCisJaWYgKGlkeCAmIElQRldfRkFLRV9JRFgpIHsKKwkJ
aWR4ICY9IH5JUEZXX0ZBS0VfSURYOworCQlpID0gSVBGV19JRkhBU0hfSURYKGlkeCwgaWZk
LT5mYWtlX2hzaXplKTsKKwkJaWZoID0gJmlmZC0+ZmFrZV9pZmFjZXNbaV07CisJfSBlbHNl
IHsKKwkJaSA9IElQRldfSUZIQVNIX0lEWChpZHgsIGlmZC0+cmVhbF9oc2l6ZSk7CisJCWlm
aCA9ICZpZmQtPnJlYWxfaWZhY2VzW2ldOworCX0KKworCVRBSUxRX0ZPUkVBQ0goaWZtLCBp
ZmgsIGlkeF9uZXh0KSB7CisJCWlmIChpZm0tPmlkeCA9PSBpZHgpCisJCQlyZXR1cm4gKGlm
bSk7CisJfQorCisJcmV0dXJuIChOVUxMKTsKK30KKwordm9pZAoraXBmd19hZGRfaWZuYW1l
KHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIHN0cnVjdCBpZmFjZV9tYXNrICppZm0pCit7
CisJc3RydWN0IGlwX2Z3X2lmX2RhdGEgKmlmZDsKKwlzdHJ1Y3QgaWZhY2VfbWFza19oZWFk
ICppZmg7CisJc3RydWN0IGlmYWNlX21hc2sgKmlmdGVtcDsKKwlpbnQgaTsKKworCWlmZCA9
IGNoYWluLT5pZl9kYXRhOworCisJaXBmd19pZm5ldF9pbml0KGNoYWluLCBpZm0pOworCisJ
LyogQWRkIHRvIG5hbWVkIGhhc2ggKi8KKwlpID0gSVBGV19JRkhBU0hfTkFNRShpZm0tPm5h
bWUsIGlmZC0+bWFza3NfaHNpemUpOworCWlmaCA9ICZpZmQtPm1hc2tzW2ldOworCVRBSUxR
X0lOU0VSVF9UQUlMKGlmaCwgaWZtLCBuYW1lX25leHQpOworCisJaWYgKGlmbS0+ZmxhZ3Mg
JiBJUEZXX0lGTEFHX0ZBS0UpIHsKKwkJLyogQWRkIHRvIGZha2UgaW50ZXJmYWNlcyBoYXNo
ICovCisJCWlmbS0+aWR4ID0gKytpZmQtPmZha2VfaWR4OworCQlpID0gSVBGV19JRkhBU0hf
SURYKGlmbS0+aWR4LCBpZmQtPmZha2VfaHNpemUpOworCQlpZmggPSAmaWZkLT5mYWtlX2lm
YWNlc1tpXTsKKwl9IGVsc2UgeworCQkvKiBBZGQgdG8gcmVhbCBpbnRlcmZhY2VzIGhhc2gg
Ki8KKwkJaSA9IElQRldfSUZIQVNIX0lEWChpZm0tPmlkeCwgaWZkLT5yZWFsX2hzaXplKTsK
KwkJaWZoID0gJmlmZC0+cmVhbF9pZmFjZXNbaV07CisJCisJCS8qIENoZWNrIGluZGV4IGZv
ciBjb25zaXN0ZW5jeSAqLworCQlUQUlMUV9GT1JFQUNIKGlmdGVtcCwgaWZoLCBpZHhfbmV4
dCkgeworCQkJS0FTU0VSVChpZnRlbXAtPmlkeCAhPSBpZm0tPmlkeCwKKwkJCSAgICAoIk5v
bi1mYWtlIGlmICVzIHcgaWR4ICVkIGZvdW5kICglcykhIiwKKwkJCSAgICAgaWZ0ZW1wLT5u
YW1lLCBpZm0tPmlkeCwgaWZtLT5uYW1lKSk7CisJCX0KKwl9CisJCisJVEFJTFFfSU5TRVJU
X1RBSUwoaWZoLCBpZm0sIGlkeF9uZXh0KTsKK30KKworc3RhdGljIHZvaWQKK2lmbmV0X2Fy
cml2YWwodm9pZCAqYXJnLCBzdHJ1Y3QgaWZuZXQgKmlmcCkKK3sKKwlzdHJ1Y3QgaXBfZndf
Y2hhaW4gKmNoYWluID0gKHN0cnVjdCBpcF9md19jaGFpbiAqKWFyZzsKKwlzdHJ1Y3QgaXBf
ZndfaWZfZGF0YSAqaWZkOworCXN0cnVjdCBpZmFjZV9tYXNrICppZnRlbXAsICppZm07CisJ
c3RydWN0IGlmYWNlX21hc2tfaGVhZCAqaWZoOworCXN0cnVjdCBpcGZ3X2luc25fcHRyICpp
bnNuX3B0cjsKKwlpbnQgaTsKKworCWlmdGVtcCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGlm
YWNlX21hc2spLCBNX0lQRlcsIE1fV0FJVE9LIHwgTV9aRVJPKTsKKworCWlmdGVtcC0+aWZw
ID0gaWZwOworCWlmdGVtcC0+aWR4ID0gaWZwLT5pZl9pbmRleDsKKwlzdHJsY3B5KGlmdGVt
cC0+bmFtZSwgaWZwLT5pZl94bmFtZSwgSUZOQU1TSVopOworCisJSVBGV19VSF9XTE9DSyhj
aGFpbik7CisJSVBGV19XTE9DSyhjaGFpbik7CisKKwlpZmQgPSBjaGFpbi0+aWZfZGF0YTsK
KworCWlmIChpZmQgPT0gTlVMTCB8fCBpZmQtPmFycml2YWwgPT0gTlVMTCkgeworCQkvKiBX
ZSdyZSBzaHV0dGluZyBkb3duICovCisJCUlQRldfV1VOTE9DSyhjaGFpbik7CisJCUlQRldf
VUhfV1VOTE9DSyhjaGFpbik7CisJCWZyZWUoaWZ0ZW1wLCBNX0lQRlcpOworCQlyZXR1cm47
CisJfQorCisJaWZtID0gaXBmd19zZWFyY2hfaWZuYW1lKGNoYWluLCBpZnRlbXAtPm5hbWUp
OworCisJaWYgKGlmbSAhPSBOVUxMKSB7CisJCS8qIEZvdW5kLiBMZXQncyB1cGRhdGUgaW5k
ZXggKi8KKwkJS0FTU0VSVChpZm0tPmZsYWdzICYgSVBGV19JRkxBR19GQUtFLAorCQkgICAg
KCJOb24tZmFrZSBpbnRlcmZhY2UgZm91bmQgZm9yICVzIiwgaWZtLT5uYW1lKSk7CisKKwkJ
aWZtLT5mbGFncyAmPSB+SVBGV19JRkxBR19GQUtFOworCQkvKiBSZWxpbmsgdG8gcmVhbCBp
bmRleCAqLworCQlpID0gSVBGV19JRkhBU0hfSURYKGlmbS0+aWR4LCBpZmQtPmZha2VfaHNp
emUpOworCQlpZmggPSAmaWZkLT5mYWtlX2lmYWNlc1tpXTsKKwkJVEFJTFFfUkVNT1ZFKGlm
aCwgaWZtLCBpZHhfbmV4dCk7CisKKwkJaSA9IElQRldfSUZIQVNIX0lEWChpZnRlbXAtPmlk
eCwgaWZkLT5yZWFsX2hzaXplKTsKKwkJaWZoID0gJmlmZC0+cmVhbF9pZmFjZXNbaV07CisJ
CVRBSUxRX0lOU0VSVF9UQUlMKGlmaCwgaWZtLCBpZHhfbmV4dCk7CisKKwkJQ1RSMihLVFJf
TkVULCAiaWZuZXQgdXBncmFkZTogZmFrZSAldSAtPiAldSIsIGlmbS0+aWR4LAorCQkgICAg
aWZ0ZW1wLT5pZHgpOworCQkvKiBOb3RpZnkgY29uc3VtZXJzICovCisJCVRBSUxRX0ZPUkVB
Q0goaW5zbl9wdHIsICZpZm0tPmluc3RydWN0aW9ucywgbmV4dCkKKwkJCWlwZndfdXBkYXRl
X3Jld3JpdGUoY2hhaW4sIGluc25fcHRyLT5pbnNuLCBpZm0sCisJCQkgICAgKHVpbnRwdHJf
dClpZnRlbXAtPmlkeCk7CisKKwkJaWZtLT5pZHggPSBpZnRlbXAtPmlkeDsKKwl9IGVsc2Ug
eworCQkvKiBOb3QgZm91bmQuIEFkZCB0byBsaXN0ICovCisJCWlmbSA9IGlmdGVtcDsKKwkJ
aWZ0ZW1wID0gTlVMTDsKKworCQlpcGZ3X2lmbmV0X2luaXQoY2hhaW4sIGlmbSk7CisKKwkJ
Q1RSMihLVFJfTkVULCAiaWZtcD0lcCB1Yz0ldSIsIGlmbSwgaWZtLT5yZWZjb3VudCk7CisK
KwkJLyogQWRkIHRvIG5hbWVkIGhhc2ggKi8KKwkJaSA9IElQRldfSUZIQVNIX05BTUUoaWZt
LT5uYW1lLCBpZmQtPm1hc2tzX2hzaXplKTsKKwkJaWZoID0gJmlmZC0+bWFza3NbaV07CisJ
CVRBSUxRX0lOU0VSVF9UQUlMKGlmaCwgaWZtLCBuYW1lX25leHQpOworCisJCS8qIEFkZCB0
byByZWFsIGludGVyZmFjZXMgaGFzaCAqLworCQlpID0gSVBGV19JRkhBU0hfSURYKGlmbS0+
aWR4LCBpZmQtPnJlYWxfaHNpemUpOworCQlpZmggPSAmaWZkLT5yZWFsX2lmYWNlc1tpXTsK
KworCQkvKiBDaGVjayBpbmRleCBmb3IgY29uc2lzdGVuY3kgKi8KKwkJVEFJTFFfRk9SRUFD
SChpZnRlbXAsIGlmaCwgaWR4X25leHQpIHsKKwkJCUtBU1NFUlQoaWZ0ZW1wLT5pZHggIT0g
aWZtLT5pZHgsCisJCQkgICAgKCJOb24tZmFrZSBpZiAlcyB3IGlkeCAlZCBmb3VuZCAoJXMp
ISIsCisJCQkgICAgIGlmdGVtcC0+bmFtZSwgaWZtLT5pZHgsIGlmbS0+bmFtZSkpOworCQl9
CisKKwkJVEFJTFFfSU5TRVJUX1RBSUwoaWZoLCBpZm0sIGlkeF9uZXh0KTsKKworCQlDVFIz
KEtUUl9ORVQsICJuZXcgaWZhY2UgJXAsIGlkeCAldSB1Yz0ldSIsIGlmbS0+bmFtZSwKKwkJ
ICAgIGlmbS0+aWR4LCBpZm0tPnJlZmNvdW50KTsKKwl9CisJSVBGV19XVU5MT0NLKGNoYWlu
KTsKKwlJUEZXX1VIX1dVTkxPQ0soY2hhaW4pOworCisJaWYgKGlmdGVtcCAhPSBOVUxMKQor
CQlmcmVlKGlmdGVtcCwgTV9JUEZXKTsKK30KKworc3RhdGljIHZvaWQKK2lmbmV0X2RlcGFy
dHVyZSh2b2lkICphcmcsIHN0cnVjdCBpZm5ldCAqaWZwKQoreworCXN0cnVjdCBpcF9md19j
aGFpbiAqY2hhaW4gPSAoc3RydWN0IGlwX2Z3X2NoYWluICopYXJnOworCXN0cnVjdCBpcF9m
d19pZl9kYXRhICppZmQ7CisJc3RydWN0IGlmYWNlX21hc2sgKmlmbTsKKwlzdHJ1Y3QgaWZh
Y2VfbWFza19oZWFkICppZmg7CisJc3RydWN0IGlwZndfaW5zbl9wdHIgKmluc25fcHRyOwor
CWludCBpOworCisJSVBGV19VSF9XTE9DSyhjaGFpbik7CisJSVBGV19XTE9DSyhjaGFpbik7
CisKKwlpZiAoKGlmZCA9IGNoYWluLT5pZl9kYXRhKSA9PSBOVUxMKSB7CisJCS8qIFdlJ3Jl
IHNodXR0aW5nIGRvd24gKi8KKwkJSVBGV19XVU5MT0NLKGNoYWluKTsKKwkJSVBGV19VSF9X
VU5MT0NLKGNoYWluKTsKKwkJcmV0dXJuOworCX0KKworCWlmbSA9IGlwZndfc2VhcmNoX2lm
bmFtZShjaGFpbiwgaWZwLT5pZl94bmFtZSk7CisKKwlpZiAoaWZtID09IE5VTEwpIHsKKwkJ
SVBGV19XVU5MT0NLKGNoYWluKTsKKwkJSVBGV19VSF9XVU5MT0NLKGNoYWluKTsKKwkJcHJp
bnRmKCJpcGZ3OiB1bmtub3duIGlmYWNlICVzIGRlcGFydHVyZVxuIiwgaWZwLT5pZl94bmFt
ZSk7CisJCXJldHVybjsKKwl9CisKKwlLQVNTRVJUKChpZm0tPmZsYWdzICYgSVBGV19JRkxB
R19GQUtFKSA9PSAwLAorCSAgICAoIkZha2UgaW50ZXJmYWNlIGZvdW5kIGZvciAlcyIsIGlm
bS0+bmFtZSkpOworCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBzYXZlIGdpdmVuIGludGVy
ZmFjZS4gKi8KKwlpZiAoaWZtLT5yZWZjb3VudCA9PSAwKSB7CisJCUNUUjEoS1RSX05FVCwg
IkRlbGV0aW5nIGludGVyZmFjZSAlcCIsIGlmbSk7CisJCS8qIERlbGV0ZSBmcm9tIG5hbWUg
aGFzaCAqLworCQlpID0gSVBGV19JRkhBU0hfTkFNRShpZm0tPm5hbWUsIGlmZC0+bWFza3Nf
aHNpemUpOworCQlpZmggPSAmaWZkLT5tYXNrc1tpXTsKKwkJVEFJTFFfUkVNT1ZFKGlmaCwg
aWZtLCBuYW1lX25leHQpOworCisJCS8qIERlbGV0ZSBmcm9tIHJlYWwgaWZhY2UgaGFzaCAq
LworCQlpID0gSVBGV19JRkhBU0hfSURYKGlmbS0+aWR4LCBpZmQtPnJlYWxfaHNpemUpOwor
CQlpZmggPSAmaWZkLT5yZWFsX2lmYWNlc1tpXTsKKwkJVEFJTFFfUkVNT1ZFKGlmaCwgaWZt
LCBpZHhfbmV4dCk7CisKKwkJSVBGV19XVU5MT0NLKGNoYWluKTsKKwkJSVBGV19VSF9XVU5M
T0NLKGNoYWluKTsKKworCQlmcmVlKGlmbSwgTV9JUEZXKTsKKwkJcmV0dXJuOworCX0KKwor
CUNUUjEoS1RSX05FVCwgIkludGVyZmFjZSB1Yz0ldSIsIGlmbS0+cmVmY291bnQpOworCisJ
LyogSW50ZXJmYWNlIGlzIHVzZWQuIE1vdmUgdG8gZmFrZSBoYXNoICovCisJaWZtLT5mbGFn
cyB8PSBJUEZXX0lGTEFHX0ZBS0U7CisJLyogUmVsaW5rIHRvIGZha2UgaW5kZXggKi8KKwlp
ID0gSVBGV19JRkhBU0hfSURYKGlmbS0+aWR4LCBpZmQtPnJlYWxfaHNpemUpOworCWlmaCA9
ICZpZmQtPnJlYWxfaWZhY2VzW2ldOworCVRBSUxRX1JFTU9WRShpZmgsIGlmbSwgaWR4X25l
eHQpOworCisJLyogQWxsb2MgZmFrZSBpbmRleCAqLworCWlmZC0+ZmFrZV9pZHgrKzsKKwlp
ID0gSVBGV19JRkhBU0hfSURYKGlmZC0+ZmFrZV9pZHgsIGlmZC0+ZmFrZV9oc2l6ZSk7CisJ
aWZoID0gJmlmZC0+ZmFrZV9pZmFjZXNbaV07CisJVEFJTFFfSU5TRVJUX1RBSUwoaWZoLCBp
Zm0sIGlkeF9uZXh0KTsKKworCUNUUjIoS1RSX05FVCwgIkludGVyZmFjZSAlcCBkZXBhcnR1
cmUsIGZha2UgaW5kZXggJXUiLAorCSAgICBpZm0sIGlmZC0+ZmFrZV9pZHgpOworCisJLyog
Tm90aWZ5IGNvbnN1bWVycyAqLworCVRBSUxRX0ZPUkVBQ0goaW5zbl9wdHIsICZpZm0tPmlu
c3RydWN0aW9ucywgbmV4dCkKKwkJaXBmd191cGRhdGVfcmV3cml0ZShjaGFpbiwgaW5zbl9w
dHItPmluc24sIGlmbSwKKwkJICAgICh1aW50cHRyX3QpKGlmZC0+ZmFrZV9pZHggfCBJUEZX
X0ZBS0VfSURYKSk7CisKKwlpZm0tPmlkeCA9IGlmZC0+ZmFrZV9pZHg7CisKKwlJUEZXX1dV
TkxPQ0soY2hhaW4pOworCUlQRldfVUhfV1VOTE9DSyhjaGFpbik7Cit9CisKK3N0YXRpYyB2
b2lkCitpcGZ3X2lmbmV0X2luaXQoc3RydWN0IGlwX2Z3X2NoYWluICpjaGFpbiwgc3RydWN0
IGlmYWNlX21hc2sgKmlmbSkKK3sKKworCVRBSUxRX0lOSVQoJmlmbS0+aW5zdHJ1Y3Rpb25z
KTsKK30KKworCitzdGF0aWMgdm9pZAoraXBmd19pZmhhc2hfaW5pdF9pbnQoc3RydWN0IGlm
YWNlX21hc2tfaGVhZCAqKnBoYXNoLCBzaXplX3QgaHNpemUpCit7CisJc3RydWN0IGlmYWNl
X21hc2tfaGVhZCAqaWZoOworCWludCBpOworCisJaWZoID0gbWFsbG9jKHNpemVvZihzdHJ1
Y3QgaWZhY2VfbWFza19oZWFkKSAqIGhzaXplLCBNX0lQRlcsCisJICAgIE1fV0FJVE9LIHwg
TV9aRVJPKTsKKworCSpwaGFzaCA9IGlmaDsKKworCWZvciAoaSA9IDA7IGkgPCBoc2l6ZTsg
aSsrLCBpZmgrKykKKwkJVEFJTFFfSU5JVChpZmgpOworfQorCit2b2lkCitpcGZ3X2lmaGFz
aF9pbml0KHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4pCit7CisJc3RydWN0IGlwX2Z3X2lm
X2RhdGEgKmlmZDsKKwlzdHJ1Y3QgaWZhY2VfbWFza19oZWFkICppZmg7CisJc3RydWN0IGlm
YWNlX21hc2sgKmlmbTsKKwlzdHJ1Y3QgaWZuZXQgKmlmcDsKKwlpbnQgaTsKKworCWlmZCA9
IG1hbGxvYyhzaXplb2Yoc3RydWN0IGlwX2Z3X2lmX2RhdGEpLCBNX0lQRlcsIE1fV0FJVE9L
IHwgTV9aRVJPKTsKKwljaGFpbi0+aWZfZGF0YSA9IGlmZDsKKworCWlmZC0+bWFza3NfaHNp
emUgPSBpZmQtPnJlYWxfaHNpemUgPSBpZmQtPmZha2VfaHNpemUgPSAzMjsKKworCWlwZndf
aWZoYXNoX2luaXRfaW50KCZpZmQtPm1hc2tzLCBpZmQtPm1hc2tzX2hzaXplKTsKKwlpcGZ3
X2lmaGFzaF9pbml0X2ludCgmaWZkLT5yZWFsX2lmYWNlcywgaWZkLT5mYWtlX2hzaXplKTsK
KwlpcGZ3X2lmaGFzaF9pbml0X2ludCgmaWZkLT5mYWtlX2lmYWNlcywgaWZkLT5yZWFsX2hz
aXplKTsKKworCUlGTkVUX1JMT0NLKCk7CisJVEFJTFFfRk9SRUFDSChpZnAsICZWX2lmbmV0
LCBpZl9saW5rKSB7CisJCWlmbSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGlmYWNlX21hc2sp
LCBNX0lQRlcsIE1fV0FJVE9LIHwgTV9aRVJPKTsKKwkJc3RybGNweShpZm0tPm5hbWUsIGlm
cC0+aWZfeG5hbWUsIElGTkFNU0laKTsKKwkJaWZtLT5pZnAgPSBpZnA7CisJCWlmbS0+aWR4
ID0gaWZwLT5pZl9pbmRleDsKKworCQlpcGZ3X2lmbmV0X2luaXQoY2hhaW4sIGlmbSk7CisK
KwkJaSA9IElQRldfSUZIQVNIX0lEWChpZm0tPmlkeCwgaWZkLT5yZWFsX2hzaXplKTsKKwkJ
aWZoID0gJmlmZC0+cmVhbF9pZmFjZXNbaV07CisJCVRBSUxRX0lOU0VSVF9UQUlMKGlmaCwg
aWZtLCBpZHhfbmV4dCk7CisKKwkJaSA9IElQRldfSUZIQVNIX05BTUUoaWZtLT5uYW1lLCBp
ZmQtPm1hc2tzX2hzaXplKTsKKwkJaWZoID0gJmlmZC0+bWFza3NbaV07CisJCVRBSUxRX0lO
U0VSVF9UQUlMKGlmaCwgaWZtLCBuYW1lX25leHQpOworCisJCUNUUjIoS1RSX05FVCwgImlu
aXQgaWZhY2UgJXAgaWR4ICV1IiwgaWZtLCBpZm0tPmlkeCk7CisKKwl9CisJSUZORVRfUlVO
TE9DSygpOworCisJLyogWFhYOiB0aGVyZSBpcyBhIGdhcCBiZXR3ZWVuIFJVTkxPQ0sgYW5k
IGludGVyZmFjZSByZWdpc3RyYXRpb24gKi8KKworCWlmZC0+YXJyaXZhbCA9IEVWRU5USEFO
RExFUl9SRUdJU1RFUihpZm5ldF9hcnJpdmFsX2V2ZW50LAorCSAgICBpZm5ldF9hcnJpdmFs
LCBjaGFpbiwgRVZFTlRIQU5ETEVSX1BSSV9BTlkpOworCisJaWZkLT5kZXBhcnR1cmUgPSBF
VkVOVEhBTkRMRVJfUkVHSVNURVIoaWZuZXRfZGVwYXJ0dXJlX2V2ZW50LAorCSAgICBpZm5l
dF9kZXBhcnR1cmUsIGNoYWluLCBFVkVOVEhBTkRMRVJfUFJJX0FOWSk7Cit9CisKK3ZvaWQK
K2lwZndfaWZoYXNoX2RldGFjaChzdHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWluKQoreworCXN0
cnVjdCBpcF9md19pZl9kYXRhICppZmQ7CisJCisJaWZkID0gY2hhaW4tPmlmX2RhdGE7CisK
KwlFVkVOVEhBTkRMRVJfREVSRUdJU1RFUihpZm5ldF9hcnJpdmFsX2V2ZW50LCBpZmQtPmFy
cml2YWwpOworCUVWRU5USEFORExFUl9ERVJFR0lTVEVSKGlmbmV0X2RlcGFydHVyZV9ldmVu
dCwgaWZkLT5kZXBhcnR1cmUpOworCisJaWZkLT5hcnJpdmFsID0gTlVMTDsKKwlpZmQtPmRl
cGFydHVyZSA9IE5VTEw7Cit9CisKKwordm9pZAoraXBmd19pZmhhc2hfZnJlZShzdHJ1Y3Qg
aXBfZndfY2hhaW4gKmNoYWluKQoreworCXN0cnVjdCBpcF9md19pZl9kYXRhICppZmQ7CisJ
c3RydWN0IGlmYWNlX21hc2tfaGVhZCAqaWZoOworCXN0cnVjdCBpZmFjZV9tYXNrICppZm0s
ICppZm1fbmV4dDsKKwlpbnQgaTsKKwkKKwlpZmQgPSBjaGFpbi0+aWZfZGF0YTsKKwljaGFp
bi0+aWZfZGF0YSA9IE5VTEw7CisKKwlpZmggPSBpZmQtPm1hc2tzOworCisJZm9yIChpID0g
MDsgaSA8IGlmZC0+bWFza3NfaHNpemU7IGkrKywgaWZoKyspIHsKKwkJVEFJTFFfRk9SRUFD
SF9TQUZFKGlmbSwgaWZoLCBuYW1lX25leHQsIGlmbV9uZXh0KSB7CisJCQkvKgorCQkJICog
QXNzdW1lIGV2ZXJ5IGNvbnN1bWVyIHRvIGZyZWUgaXRzCisJCQkgKiBpZmFjZS1zcGVjaWZp
YyBkYXRhIGJlZm9yZWhhbmQuCisJCQkgKi8KKwkJCWZyZWUoaWZtLCBNX0lQRlcpOworCQl9
CisJfQorCisJZnJlZShpZmQtPm1hc2tzLCBNX0lQRlcpOworCWZyZWUoaWZkLT5yZWFsX2lm
YWNlcywgTV9JUEZXKTsKKwlmcmVlKGlmZC0+ZmFrZV9pZmFjZXMsIE1fSVBGVyk7CisKKwlm
cmVlKGlmZCwgTV9JUEZXKTsKK30KKwotLS0gL2Rldi9udWxsCTIwMTMtMDQtMjQgMTc6MjI6
MDAuMDAwMDAwMDAwICswNDAwCisrKyBzeXMvbmV0cGZpbC9pcGZ3L2lwX2Z3X2lmYWNlLmgJ
MjAxMy0wNC0yMiAxOTowOTo1Ni42MjQ5OTY0OTEgKzA0MDAKQEAgLTAsMCArMSw1NSBAQAor
LyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgWWFuZGV4IExMQy4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisg
KiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJ
VFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAq
CisgKiAkRnJlZUJTRCQKKyAqLworCisjaWZuZGVmIF9JUF9GV19JRkFDRV9IXworI2RlZmlu
ZSBfSVBfRldfSUZBQ0VfSF8KKworc3RydWN0IGlwZndfaW5zbl9wdHIgeworCVRBSUxRX0VO
VFJZKGlwZndfaW5zbl9wdHIpCW5leHQ7CisJaXBmd19pbnNuCSppbnNuOworfTsgCisKK3N0
cnVjdCBpZmFjZV9tYXNrIHsKKwlzdHJ1Y3QgaWZuZXQJKmlmcDsKKwl1aW50MzJfdAlpZHg7
CS8qIFNhdmVkIGludGVyZmFjZSBpbmRleCAqLworCXVpbnQzMl90CWZsYWdzOwkvKiBQYWQg
Ki8KKwl1aW50MzJfdAlyZWZjb3VudDsJLyogVXNhZ2UgY291bnQgKi8KKwljaGFyCQluYW1l
W0lGTkFNU0laXTsJLyogSW50ZXJmYWNlL21hc2sgKi8KKwlUQUlMUV9FTlRSWShpZmFjZV9t
YXNrKQlpZHhfbmV4dDsKKwlUQUlMUV9FTlRSWShpZmFjZV9tYXNrKQluYW1lX25leHQ7CisJ
VEFJTFFfSEVBRChydWxlX2xpc3QsIGlwZndfaW5zbl9wdHIpCWluc3RydWN0aW9uczsJLyog
aW5zdHJ1Y3Rpb25zIHVzaW5nIGdpdmVuIG1hc2sgKi8KK307CisjZGVmaW5lCUlQRldfSUZM
QUdfRkFLRQkweDAxCisKKyNkZWZpbmUJSVBGV19GQUtFX0lEWAkoMSA8PCAzMSkKKworc3Ry
dWN0IGlmYWNlX21hc2sgKmlwZndfc2VhcmNoX2lmbmFtZShzdHJ1Y3QgaXBfZndfY2hhaW4g
KmNoYWluLCBjaGFyICpuYW1lKTsKK3N0cnVjdCBpZmFjZV9tYXNrICppcGZ3X3NlYXJjaF9p
ZmluZGV4KHN0cnVjdCBpcF9md19jaGFpbiAqY2hhaW4sIHVpbnQzMl90IGlkeCk7Cit2b2lk
IGlwZndfYWRkX2lmbmFtZShzdHJ1Y3QgaXBfZndfY2hhaW4gKmNoYWluLCBzdHJ1Y3QgaWZh
Y2VfbWFzayAqaWZtKTsKKworI2VuZGlmCisKCg==
--------------060008050505010104000604--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?517801D3.5040502>