Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Sep 2016 19:03:00 +0000
From:      "sbruno (Sean Bruno)" <phabric-noreply@FreeBSD.org>
To:        freebsd-mips@freebsd.org
Subject:   [Differential] D2535: New, experimental PMAP implementation for MIPS64
Message-ID:  <17227ff5cee59ab31c13030b2aea797d@localhost.localdomain>
In-Reply-To: <differential-rev-PHID-DREV-5xurf3bsmfb7qsmjczka-req@FreeBSD.org>
References:  <differential-rev-PHID-DREV-5xurf3bsmfb7qsmjczka-req@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--b1_17227ff5cee59ab31c13030b2aea797d
Content-Type: text/plain; charset = "utf-8"
Content-Transfer-Encoding: base64

c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzkwLgpzYnJ1bm8gYWRkZWQg
YSBjb21tZW50LgoKCiAgUHVsbCBpbiBDSEVSSSBjaGFuZ2UgdG8gZml4IGNvbXBpbGUgdGltZSBl
cnJvcnMuICBVcGRhdGUgYW5kIGNvbXBpbGUKICB0ZXN0ZWQgd29ybGQva2VybmVsIHZpYSBtaXBz
NjQgdGFyZ2V0IGFuZCBNQUxUQTY0IHVuZGVyIHFlbXUuCiAgCiAgcmVmOgogIGh0dHBzOi8vZ2l0
aHViLmNvbS9DVFNSRC1DSEVSSS9jaGVyaWJzZC9jb21taXQvY2E4OTI0NTQ2ZmFmZjQxMWQyNTM5
YzRjZDMwYmQxNWFhYTIzMjgyNCNkaWZmLTFmMzdhNmY4YjY5Njc4Yjc3MDBhYmNjZjBkNTFmYWNi
CgpSRVBPU0lUT1JZCiAgclMgRnJlZUJTRCBzcmMgcmVwb3NpdG9yeQoKQ0hBTkdFUyBTSU5DRSBM
QVNUIFVQREFURQogIGh0dHBzOi8vcmV2aWV3cy5mcmVlYnNkLm9yZy9EMjUzNT92cz0yMDM4NyZp
ZD0yMDM5MAoKUkVWSVNJT04gREVUQUlMCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0Qy
NTM1CgpBRkZFQ1RFRCBGSUxFUwogIGxpYi9saWJrdm0va3ZtX21pcHMuaAogIHN5cy9jb25mL2Zp
bGVzLm1pcHMKICBzeXMvY29uZi9vcHRpb25zLm1pcHMKICBzeXMvbWlwcy9pbmNsdWRlL3BhcmFt
LmgKICBzeXMvbWlwcy9pbmNsdWRlL3BtYXAuaAogIHN5cy9taXBzL2luY2x1ZGUvcHRlLmgKICBz
eXMvbWlwcy9pbmNsdWRlL3ZtcGFyYW0uaAogIHN5cy9taXBzL21pcHMvY3B1LmMKICBzeXMvbWlw
cy9taXBzL2V4Y2VwdGlvbi5TCiAgc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCiAgc3lzL21pcHMv
bWlwcy9tYWNoZGVwLmMKICBzeXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYwogIHN5cy9t
aXBzL21pcHMvcG1hcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCiAgc3lzL21pcHMv
bWlwcy9zd3RjaC5TCiAgc3lzL21pcHMvbWlwcy90bGIuYwogIHN5cy9taXBzL21pcHMvdHJhcC5j
CiAgc3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy92bV9tYWNoZGVw
LmMKICBzeXMvdm0vdm1fZ2x1ZS5jCgpFTUFJTCBQUkVGRVJFTkNFUwogIGh0dHBzOi8vcmV2aWV3
cy5mcmVlYnNkLm9yZy9zZXR0aW5ncy9wYW5lbC9lbWFpbHByZWZlcmVuY2VzLwoKVG86IHNicnVu
bywgc3NvbgpDYzogc2JydW5vLCByd2F0c29uLCBlbWFzdGUsIGltcCwgZnJlZWJzZC1taXBzLWxp
c3QsIGRuZWxzb25fMTkwMV95YWhvby5jb20sIG1pemhrYV9nbWFpbC5jb20K

--b1_17227ff5cee59ab31c13030b2aea797d
Content-Type: text/x-patch; charset=utf-8; name="D2535.20390.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="D2535.20390.patch"

ZGlmZiAtLWdpdCBhL3N5cy92bS92bV9nbHVlLmMgYi9zeXMvdm0vdm1fZ2x1ZS5jCi0tLSBhL3N5
cy92bS92bV9nbHVlLmMKKysrIGIvc3lzL3ZtL3ZtX2dsdWUuYwpAQCAtMzEyLDYgKzMxMiwxNjEg
QEAKICNkZWZpbmUgS1NUQUNLX01BWF9QQUdFUyAzMgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9f
bWlwc19fKQorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz
KQoreworCXZtX29mZnNldF90IGtzOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGFsaWduIHRoZSBr
c3RhY2sncyBtYXBwZWQgYWRkcmVzcyB0byBmaXQgd2l0aGluCisJICogYSBzaW5nbGUgVExCIGVu
dHJ5LgorCSAqLworCWlmICh2bWVtX3hhbGxvYyhrZXJuZWxfYXJlbmEsCisJICAgIChwYWdlcyAr
IEtTVEFDS19HVUFSRF9QQUdFUykgKiBQQUdFX1NJWkUsCisJICAgIEtTVEFDS19QQUdFX1NJWkUg
KiAyLCAwLCAwLCBWTUVNX0FERFJfTUlOLCBWTUVNX0FERFJfTUFYLAorCSAgICBNX0JFU1RGSVQg
fCBNX05PV0FJVCwgJmtzKSkgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoa3MpOwor
fQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKworI2RlZmluZQlLU1RBQ0tfT0JKVAkJT0JK
VF9QSFlTCisKK3N0YXRpYyBpbnQKK3ZtX2tzdGFja19wYWxsb2Modm1fb2JqZWN0X3Qga3NvYmos
IHZtX29mZnNldF90IGtzLCBpbnQgYWxsb2NmbGFncywgaW50IHBhZ2VzLAorICAgIHZtX3BhZ2Vf
dCBtYVtdKQoreworCXZtX3BhZ2VfdCBtLCBlbmRfbTsKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtz
b2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOwor
CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9j
ZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3Ig
KGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworcmV0cnlsb29rdXA6CisJCWlmICgobSA9IHZtX3Bh
Z2VfbG9va3VwKGtzb2JqLCBpKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAodm1fcGFnZV9i
dXNpZWQobSkpIHsKKwkJCS8qCisJCQkgKiBSZWZlcmVuY2UgdGhlIHBhZ2UgYmVmb3JlIHVubG9j
a2luZyBhbmQKKwkJCSAqIHNsZWVwaW5nIHNvIHRoYXQgdGhlIHBhZ2UgZGFlbW9uIGlzIGxlc3MK
KwkJCSAqIGxpa2VseSB0byByZWNsYWltIGl0LgorCQkJICovCisJCQl2bV9wYWdlX2FmbGFnX3Nl
dChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQl2bV9wYWdlX2xvY2sobSk7CisJCQlWTV9PQkpFQ1Rf
V1VOTE9DSyhrc29iaik7CisJCQl2bV9wYWdlX2J1c3lfc2xlZXAobSwgInBncmJ3dCIpOworCQkJ
Vk1fT0JKRUNUX1dMT0NLKGtzb2JqKTsKKwkJCWdvdG8gcmV0cnlsb29rdXA7CisJCX0gZWxzZSB7
CisJCQlpZiAoKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19XSVJFRCkgIT0gMCkgeworCQkJCXZtX3Bh
Z2VfbG9jayhtKTsKKwkJCQl2bV9wYWdlX3dpcmUobSk7CisJCQkJdm1fcGFnZV91bmxvY2sobSk7
CisJCQl9CisJCQltYVtpXSA9IG07CisJCX0KKwl9CisJaWYgKGkgPT0gcGFnZXMpCisJCXJldHVy
biAoaSk7CisKKwlLQVNTRVJUKChpID09IDApLCAoInZtX2tzdGFja19wYWxsb2M6IGtzb2JqIGFs
cmVhZHkgaGFzIGtzdGFjayBwYWdlcyIpKTsKKworCWZvciAoOzspIHsKKwkJbSA9IHZtX3BhZ2Vf
YWxsb2NfY29udGlnKGtzb2JqLCAwLCBhbGxvY2ZsYWdzLAorCQkgICAgYXRvcChLU1RBQ0tfUEFH
RV9TSVpFKSwgMHVsLCB+MHVsLCBLU1RBQ0tfUEFHRV9TSVpFICogMiwgMCwKKwkJICAgIFZNX01F
TUFUVFJfREVGQVVMVCk7CisJCWlmIChtICE9IE5VTEwpCisJCQlicmVhazsKKwkJVk1fT0JKRUNU
X1dVTkxPQ0soa3NvYmopOworCQlWTV9XQUlUOworCQlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwor
CX0KKwllbmRfbSA9IG0gKyBhdG9wKEtTVEFDS19QQUdFX1NJWkUpOworCWZvciAoaSA9IDA7IG0g
PCBlbmRfbTsgbSsrKSB7CisJCW0tPnBpbmRleCA9ICh2bV9waW5kZXhfdClpOworCQlpZiAoKGFs
bG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kpICE9IDApCisJCQltLT52YWxpZCA9IFZNX1BBR0Vf
QklUU19BTEw7CisJCW1hW2ldID0gbTsKKwkJaSsrOworCX0KKwlyZXR1cm4gKGkpOworfQorCisj
ZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9C
SlRfREVGQVVMVAorCitzdGF0aWMgaW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtz
b2JqLCB2bV9vZmZzZXRfdCBrcywgaW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9w
YWdlX3QgbWFbXSkKK3sKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZt
X2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRf
V0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0Nf
Q0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7
IGkrKykgeworCQkvKgorCQkgKiBHZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1h
W2ldID0gdm1fcGFnZV9ncmFiKGtzb2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxh
Z3MgJiBWTV9BTExPQ19OT0JVU1kpCisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxM
OworCX0KKworCXJldHVybiAoaSk7Cit9CisjZW5kaWYgLyogISBLU1RBQ0tfTEFSR0VfUEFHRSAq
LworCisjZWxzZSAvKiAhIF9fbWlwc19fICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9CSlRf
REVGQVVMVAorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz
KQoreworCXZtX29mZnNldF90IGtzOworCisJa3MgPSBrdmFfYWxsb2MoKHBhZ2VzICsgS1NUQUNL
X0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7CisKKwlyZXR1cm4oa3MpOworfQorCitzdGF0aWMg
aW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtzb2JqLCB2bV9vZmZzZXRfdCBrcywg
aW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9wYWdlX3QgbWFbXSkKK3sKKwlpbnQg
aTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFs
aWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlh
bGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExP
Q19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkvKgorCQkgKiBH
ZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1hW2ldID0gdm1fcGFnZV9ncmFiKGtz
b2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kp
CisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxMOworCX0KKworCXJldHVybiAoaSk7
Cit9CisjZW5kaWYgLyogISBfX21pcHNfXyAqLworCisKIC8qCiAgKiBDcmVhdGUgdGhlIGtlcm5l
bCBzdGFjayAoaW5jbHVkaW5nIHBjYiBmb3IgaTM4NikgZm9yIGEgbmV3IHRocmVhZC4KICAqIFRo
aXMgcm91dGluZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBmb3JrIHBlcmYgZm9yIGEgcHJvY2VzcyBh
bmQKQEAgLTMyMiw5ICs0NzcsOCBAQAogewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX29mZnNl
dF90IGtzOwotCXZtX3BhZ2VfdCBtLCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsKKwl2bV9wYWdlX3Qg
bWFbS1NUQUNLX01BWF9QQUdFU107CiAJc3RydWN0IGtzdGFja19jYWNoZV9lbnRyeSAqa3NfY2U7
Ci0JaW50IGk7CiAKIAkvKiBCb3VuZHMgY2hlY2sgKi8KIAlpZiAocGFnZXMgPD0gMSkKQEAgLTM1
MCwyNCArNTA0LDEyIEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBhbiBvYmplY3QgZm9yIHRoZSBrc3Rh
Y2suCiAJICovCi0Ja3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoT0JKVF9ERUZBVUxULCBwYWdl
cyk7Ci0JCisJa3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoS1NUQUNLX09CSlQsIHBhZ2VzKTsK
KwogCS8qCiAJICogR2V0IGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhpcyB0aHJlYWQn
cyBrc3RhY2suCiAJICovCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLQkvKgotCSAqIFdlIG5lZWQg
dG8gYWxpZ24gdGhlIGtzdGFjaydzIG1hcHBlZCBhZGRyZXNzIHRvIGZpdCB3aXRoaW4KLQkgKiBh
IHNpbmdsZSBUTEIgZW50cnkuCi0JICovCi0JaWYgKHZtZW1feGFsbG9jKGtlcm5lbF9hcmVuYSwg
KHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSwKLQkgICAgUEFHRV9TSVpF
ICogMiwgMCwgMCwgVk1FTV9BRERSX01JTiwgVk1FTV9BRERSX01BWCwKLQkgICAgTV9CRVNURklU
IHwgTV9OT1dBSVQsICZrcykpIHsKLQkJa3MgPSAwOwotCX0KLSNlbHNlCi0Ja3MgPSBrdmFfYWxs
b2MoKHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7Ci0jZW5kaWYKKwlr
cyA9IHZtX2tzdGFja192YWxsb2MocGFnZXMpOwogCWlmIChrcyA9PSAwKSB7CiAJCXByaW50Zigi
dm1fdGhyZWFkX25ldzoga3N0YWNrIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJdm1fb2JqZWN0
X2RlYWxsb2NhdGUoa3NvYmopOwpAQCAtMzg2LDIxICs1MjgsMTUgQEAKIAkgKiB3YW50IHRvIGRl
YWxsb2NhdGUgdGhlbS4KIAkgKi8KIAl0ZC0+dGRfa3N0YWNrX3BhZ2VzID0gcGFnZXM7Ci0JLyog
Ci0JICogRm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrLCBsaW5rIGluIGEgcmVhbCBwYWdlIG9m
IHJhbSBmb3IgZWFjaAotCSAqIHBhZ2Ugb2Ygc3RhY2suCi0JICovCisKIAlWTV9PQkpFQ1RfV0xP
Q0soa3NvYmopOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7Ci0JCS8qCi0JCSAqIEdl
dCBhIGtlcm5lbCBzdGFjayBwYWdlLgotCQkgKi8KLQkJbSA9IHZtX3BhZ2VfZ3JhYihrc29iaiwg
aSwgVk1fQUxMT0NfTk9CVVNZIHwKLQkJICAgIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX1dJ
UkVEKTsKLQkJbWFbaV0gPSBtOwotCQltLT52YWxpZCA9IFZNX1BBR0VfQklUU19BTEw7Ci0JfQor
CXBhZ2VzID0gdm1fa3N0YWNrX3BhbGxvYyhrc29iaiwga3MsIChWTV9BTExPQ19OT0JVU1kgfCBW
TV9BTExPQ19XSVJFRCksCisJICAgIHBhZ2VzLCBtYSk7CiAJVk1fT0JKRUNUX1dVTkxPQ0soa3Nv
YmopOworCWlmIChwYWdlcyA9PSAwKSB7CisJCXByaW50Zigidm1fdGhyZWFkX25ldzogdm1fa3N0
YWNrX3BhbGxvYygpIGZhaWxlZFxuIik7CisJCXJldHVybiAoMCk7CisJfQogCXBtYXBfcWVudGVy
KGtzLCBtYSwgcGFnZXMpOwogCXJldHVybiAoMSk7CiB9CkBAIC01NjgsMTQgKzcwNCwxNCBAQAog
ewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX3BhZ2VfdCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsK
LQlpbnQgcGFnZXM7CisJaW50IHBhZ2VzLCBydjsKIAogCXBhZ2VzID0gdGQtPnRkX2tzdGFja19w
YWdlczsKIAlrc29iaiA9IHRkLT50ZF9rc3RhY2tfb2JqOwogCVZNX09CSkVDVF9XTE9DSyhrc29i
aik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczsgaSsrKQotCQltYVtpXSA9IHZtX3BhZ2Vf
Z3JhYihrc29iaiwgaSwgVk1fQUxMT0NfTk9STUFMIHwKLQkJICAgIFZNX0FMTE9DX1dJUkVEKTsK
KwlydiA9IHZtX2tzdGFja19wYWxsb2Moa3NvYmosIHRkLT50ZF9rc3RhY2ssIChWTV9BTExPQ19O
T1JNQUwgfAorCSAgICBWTV9BTExPQ19XSVJFRCksIHBhZ2VzLCBtYSk7CisJS0FTU0VSVChydiAh
PSAwLCAoInZtX3RocmVhZF9zd2FwaW46IHZtX2tzdGFja19wYWxsb2MoKSBmYWlsZWQiKSk7CiAJ
Zm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczspIHsKIAkJaW50IGosIGEsIGNvdW50LCBydjsKIApk
aWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3Zt
X21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYworKysgYi9zeXMvbWlw
cy9taXBzL3ZtX21hY2hkZXAuYwpAQCAtMjUxLDE4ICsyNTEsMjggQEAKIGNwdV90aHJlYWRfc3dh
cGluKHN0cnVjdCB0aHJlYWQgKnRkKQogewogCXB0X2VudHJ5X3QgKnB0ZTsKLQlpbnQgaTsKIAog
CS8qCiAJICogVGhlIGtzdGFjayBtYXkgYmUgYXQgYSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVz
cyBub3cuCiAJICogQ2FjaGUgdGhlIFBURXMgZm9yIHRoZSBLZXJuZWwgc3RhY2sgaW4gdGhlIG1h
Y2hpbmUgZGVwZW5kZW50CiAJICogcGFydCBvZiB0aGUgdGhyZWFkIHN0cnVjdCBzbyBjcHVfc3dp
dGNoKCkgY2FuIHF1aWNrbHkgbWFwIGluCiAJICogdGhlIHBjYiBzdHJ1Y3QgYW5kIGtlcm5lbCBz
dGFjay4KIAkgKi8KKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCS8qIEp1c3Qgb25lIGVudHJ5
IGZvciBvbmUgbGFyZ2Uga2VybmVsIHBhZ2UuICovCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3Bt
YXAsIHRkLT50ZF9rc3RhY2spOworCXRkLT50ZF9tZC5tZF91cHRlWzBdID0gKnB0ZSAmIH5UTEJM
T19TV0JJVFNfTUFTSzsKKwl0ZC0+dGRfbWQubWRfdXB0ZVsxXSA9IDE7CisKKyNlbHNlCisKKwlp
bnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBLU1RBQ0tfUEFHRVM7IGkrKykgewogCQlwdGUgPSBw
bWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayArIGkgKiBQQUdFX1NJWkUpOwogCQl0
ZC0+dGRfbWQubWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CiAJfQorI2Vu
ZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIH0KIAogdm9pZApAQCAtMjc0LDE3ICsyODQs
MzEgQEAKIGNwdV90aHJlYWRfYWxsb2Moc3RydWN0IHRocmVhZCAqdGQpCiB7CiAJcHRfZW50cnlf
dCAqcHRlOwotCWludCBpOwogCi0JS0FTU0VSVCgodGQtPnRkX2tzdGFjayAmICgxIDw8IFBBR0Vf
U0hJRlQpKSA9PSAwLCAoImtlcm5lbCBzdGFjayBtdXN0IGJlIGFsaWduZWQuIikpOworCUtBU1NF
UlQoKHRkLT50ZF9rc3RhY2sgJiAoKEtTVEFDS19QQUdFX1NJWkUgKiAyKSAtIDEpICkgPT0gMCwK
KwkgICAgKCJrZXJuZWwgc3RhY2sgbXVzdCBiZSBhbGlnbmVkLiIpKTsKIAl0ZC0+dGRfcGNiID0g
KHN0cnVjdCBwY2IgKikodGQtPnRkX2tzdGFjayArCiAJICAgIHRkLT50ZF9rc3RhY2tfcGFnZXMg
KiBQQUdFX1NJWkUpIC0gMTsKIAl0ZC0+dGRfZnJhbWUgPSAmdGQtPnRkX3BjYi0+cGNiX3JlZ3M7
CiAKLQlmb3IgKGkgPSAwOyBpIDwgS1NUQUNLX1BBR0VTOyBpKyspIHsKLQkJcHRlID0gcG1hcF9w
dGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sgKyBpICogUEFHRV9TSVpFKTsKLQkJdGQtPnRk
X21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworI2lmZGVmIEtTVEFD
S19MQVJHRV9QQUdFCisJLyogSnVzdCBvbmUgZW50cnkgZm9yIG9uZSBsYXJnZSBrZXJuZWwgcGFn
ZS4gKi8KKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayk7CisJdGQt
PnRkX21kLm1kX3VwdGVbMF0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworCXRkLT50ZF9t
ZC5tZF91cHRlWzFdID0gMTsKKworI2Vsc2UKKworCXsKKwkJaW50IGk7CisKKwkJZm9yIChpID0g
MDsgaSA8IEtTVEFDS19QQUdFUzsgaSsrKSB7CisJCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h
cCwgdGQtPnRkX2tzdGFjayArIGkgKgorCQkJICAgIFBBR0VfU0laRSk7CisJCQl0ZC0+dGRfbWQu
bWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CisJCX0KIAl9CisjZW5kaWYg
LyogISBLU1RBQ0tfTEFSR0VfUEFHRSAqLwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9zeXMvbWlw
cy9taXBzL3VtYV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMKLS0tIGEv
c3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdW1hX21hY2hk
ZXAuYwpAQCAtNTIsNyArNTIsMTEgQEAKIAlwZmxhZ3MgPSBtYWxsb2Mydm1fZmxhZ3Mod2FpdCkg
fCBWTV9BTExPQ19XSVJFRDsKIAogCWZvciAoOzspIHsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAK
KwkJbSA9IHZtX3BhZ2VfYWxsb2MoTlVMTCwgMCwgcGZsYWdzIHwgVk1fQUxMT0NfTk9PQkopOwor
I2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIAkJbSA9IHZtX3BhZ2VfYWxsb2NfZnJlZWxp
c3QoVk1fRlJFRUxJU1RfRElSRUNULCBwZmxhZ3MpOworI2VuZGlmIC8qICEgTUlQUzY0X05FV19Q
TUFQICovCiAjaWZuZGVmIF9fbWlwc19uNjQKIAkJaWYgKG0gPT0gTlVMTCAmJiB2bV9wYWdlX3Jl
Y2xhaW1fY29udGlnKHBmbGFncywgMSwKIAkJICAgIDAsIE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlT
LCBQQUdFX1NJWkUsIDApKQpAQCAtNjIsMTIgKzY2LDE4IEBACiAJCQlpZiAod2FpdCAmIE1fTk9X
QUlUKQogCQkJCXJldHVybiAoTlVMTCk7CiAJCQllbHNlCisjaWZkZWYgTUlQUzY0X05FV19QTUFQ
CisJCQkJcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKCk7CisjZWxzZSAvKiAhIE1JUFM2NF9O
RVdfUE1BUCAqLwogCQkJCVZNX1dBSVQ7CisjZW5kaWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8K
IAkJfSBlbHNlCiAJCQlicmVhazsKIAl9CiAKIAlwYSA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKwlp
ZiAoKHdhaXQgJiBNX05PRFVNUCkgPT0gMCkKKwkJZHVtcF9hZGRfcGFnZShwYSk7CiAJdmEgPSAo
dm9pZCAqKU1JUFNfUEhZU19UT19ESVJFQ1QocGEpOwogCWlmICgod2FpdCAmIE1fWkVSTykgJiYg
KG0tPmZsYWdzICYgUEdfWkVSTykgPT0gMCkKIAkJYnplcm8odmEsIFBBR0VfU0laRSk7CmRpZmYg
LS1naXQgYS9zeXMvbWlwcy9taXBzL3RyYXAuYyBiL3N5cy9taXBzL21pcHMvdHJhcC5jCi0tLSBh
L3N5cy9taXBzL21pcHMvdHJhcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdHJhcC5jCkBAIC04MSw2
ICs4MSw3IEBACiAjaW5jbHVkZSA8bWFjaGluZS9taXBzX29wY29kZS5oPgogI2luY2x1ZGUgPG1h
Y2hpbmUvZnJhbWUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3JlZ251bS5oPgorI2luY2x1ZGUgPG1h
Y2hpbmUvdGxiLmg+CiAjaW5jbHVkZSA8bWFjaGluZS90bHMuaD4KIAogI2lmZGVmIEREQgpAQCAt
MjY0LDcgKzI2NSw3IEBACiAJInJlc2VydmVkIDIxIiwKIAkicmVzZXJ2ZWQgMjIiLAogCSJ3YXRj
aCIsCi0JInJlc2VydmVkIDI0IiwKKwkibWFjaGluZSBjaGVjayIsCiAJInJlc2VydmVkIDI1IiwK
IAkicmVzZXJ2ZWQgMjYiLAogCSJyZXNlcnZlZCAyNyIsCkBAIC02MzIsNiArNjMzLDMzIEBACiAj
ZW5kaWYKIAkJcGFuaWMoIk1DSEVDS1xuIik7CiAJCWJyZWFrOworCWNhc2UgVF9NQ0hFQ0sgKyBU
X1VTRVI6CisJCXsKKwkJCXVpbnQzMl90IHN0YXR1cyA9IG1pcHNfcmRfc3RhdHVzKCk7CisKKwkJ
CWlmIChzdGF0dXMgJiBNSVBTX1NSX1RTKSB7CisJCQkJLyoKKwkJCQkgKiBNYWNoaW5lIENoZWNr
IGV4Y2VwdGlvbiBjYXVzZWQgYnkgVExCCisJCQkJICogZGV0ZWN0aW5nIGEgbWF0Y2ggZm9yIG11
bHRpcGxlIGVudHJpZXMuCisJCQkJICoKKwkJCQkgKiBBdHRlbXB0IHRvIHJlY292ZXIgYnkgZmx1
c2hpbmcgdGhlIHVzZXIgVExCCisJCQkJICogYW5kIHJlc2V0dGluZyB0aGUgc3RhdHVzIGJpdC4K
KwkJCQkgKi8KKwkJCQlwcmludGYoIk1hY2hpbmUgQ2hlY2sgaW4gVXNlciAtIER1cCBUTEIgZW50
cnkuICIKKwkJCQkgICAgIlJlY292ZXJpbmcuLi5cbiIpOworCQkJCXBtYXAgPSAmcC0+cF92bXNw
YWNlLT52bV9wbWFwOworCQkJCXRsYl9pbnZhbGlkYXRlX2FsbF91c2VyKHBtYXApOworCQkJCW1p
cHNfd3Jfc3RhdHVzKHN0YXR1cyAmIH5NSVBTX1NSX1RTKTsKKworCQkJCXJldHVybiAodHJhcGZy
YW1lLT5wYyk7CisJCQl9IGVsc2UgeworI2lmZGVmIEREQgorCQkJCWtkYl90cmFwKHR5cGUsIDAs
IHRyYXBmcmFtZSk7CisjZW5kaWYKKwkJCQlwYW5pYygiTUNIRUNLXG4iKTsKKwkJCX0KKwkJfQor
CQlicmVhazsKIAljYXNlIFRfVExCX01PRDoKIAkJLyogY2hlY2sgZm9yIGtlcm5lbCBhZGRyZXNz
ICovCiAJCWlmIChLRVJOTEFORCh0cmFwZnJhbWUtPmJhZHZhZGRyKSkgewpAQCAtNjk0LDEwICs3
MjIsMjMgQEAKIAogCWNhc2UgVF9UTEJfTERfTUlTUyArIFRfVVNFUjoKIAkJZnR5cGUgPSBWTV9Q
Uk9UX1JFQUQ7Ci0JCWdvdG8gZG9mYXVsdDsKKwkJZ290byBjaGVja3JlZmJpdDsKIAogCWNhc2Ug
VF9UTEJfU1RfTUlTUyArIFRfVVNFUjoKIAkJZnR5cGUgPSBWTV9QUk9UX1dSSVRFOworCitjaGVj
a3JlZmJpdDoKKwkJLyoKKwkJICogV2FzIHRoaXMgdHJhcCBjYXVzZWQgYnkgdGhlIFBURV9WUiBi
aXQgbm90IGJlaW5nIHNldD8KKwkJICovCisJCWlmIChwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZCgm
cC0+cF92bXNwYWNlLT52bV9wbWFwLAorCQkgICAgdHJhcGZyYW1lLT5iYWR2YWRkcikgPT0gMCkg
eworCQkJaWYgKCF1c2VybW9kZSkgeworCQkJCXJldHVybiAodHJhcGZyYW1lLT5wYyk7CisJCQl9
CisJCQlnb3RvIG91dDsKKwkJfQorCiBkb2ZhdWx0OgogCQl7CiAJCQl2bV9vZmZzZXRfdCB2YTsK
QEAgLTE0MTEsOSArMTQ1MiwxNiBAQAogCXN0cnVjdCBwcm9jICpwID0gY3VycHJvYzsKIAogCXBk
ZXAgPSAoJihwLT5wX3Ztc3BhY2UtPnZtX3BtYXAucG1fc2VndGFiWyh2YSA+PiBTRUdTSElGVCkg
JiAoTlBERVBHIC0gMSldKSk7Ci0JaWYgKCpwZGVwKQotCQlwdGVwID0gcG1hcF9wdGUoJnAtPnBf
dm1zcGFjZS0+dm1fcG1hcCwgdmEpOwotCWVsc2UKKwlpZiAoKnBkZXApIHsKKyNpZiBWTV9OUkVT
RVJWTEVWRUwgPiAwCisJCXBkX2VudHJ5X3QgKnBkZSA9ICZwZGVwWyh2YSA+PiBQRFJTSElGVCkg
JiAoTlBERVBHIC0gMSldOworCisJCWlmIChwZGVfaXNfc3VwZXJwYWdlKHBkZSkpCisJCQlwdGVw
ID0gKHB0X2VudHJ5X3QgKilwZGU7CisJCWVsc2UKKyNlbmRpZiAvKiBWTV9OUkVTRVJWTEVWRUwg
PiAwICovCisJCQlwdGVwID0gcG1hcF9wdGUoJnAtPnBfdm1zcGFjZS0+dm1fcG1hcCwgdmEpOwor
CX0gZWxzZQogCQlwdGVwID0gKHB0X2VudHJ5X3QgKikwOwogCiAJKnBkZXBwID0gcGRlcDsKZGlm
ZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdGxiLmMgYi9zeXMvbWlwcy9taXBzL3RsYi5jCi0tLSBh
L3N5cy9taXBzL21pcHMvdGxiLmMKKysrIGIvc3lzL21pcHMvbWlwcy90bGIuYwpAQCAtNDAsMTAg
KzQwLDE0IEBACiAjaW5jbHVkZSA8bWFjaGluZS9wdGUuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3Rs
Yi5oPgogCisjaW5jbHVkZSAib3B0X3ZtLmgiCisKICNpZiBkZWZpbmVkKENQVV9DTk1JUFMpCiAj
ZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTEyOAogI2VsaWYgZGVmaW5lZChDUFVfTkxNKQog
I2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkoMjA0OCArIDEyOCkKKyNlbGlmIGRlZmluZWQo
Q1BVX0NIRVJJKQorI2RlZmluZQlNSVBTX01BWF9UTEJfRU5UUklFUwkxNDQKICNlbHNlCiAjZGVm
aW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTY0CiAjZW5kaWYKQEAgLTEwMiwyMCArMTA2LDMxIEBA
CiB7CiAJcmVnaXN0ZXJfdCBhc2lkOwogCXJlZ2lzdGVyX3QgczsKKwl1aW50MzJfdCBwYWdlbWFz
azsKKwl1bnNpZ25lZCBsb25nIG1hc2ssIHNpemU7CiAKLQl2YSAmPSB+UEFHRV9NQVNLOworCUtB
U1NFUlQoKFRMQkxPX1BURV9UT19JRFgocHRlMCkgPT0gVExCTE9fUFRFX1RPX0lEWChwdGUxKSks
CisJICAgICgiJXM6IHB0ZTAgYW5kIHB0ZTEgcGFnZSBzaXplcyBkb24ndCBtYXRjaCIsIF9fZnVu
Y19fKSk7CisKKwkvKiBDb21wdXRlIHRoZSBwYWdlIG1hc2sgYW5kIHNpemUuICovCisJcGFnZW1h
c2sgPSBUTEJMT19QVEVfVE9fTUFTSyhwdGUwKTsKKwltYXNrID0gKHVuc2lnbmVkIGxvbmcpcGFn
ZW1hc2sgfCBQQUdFX01BU0s7IC8qIE9SIGl0IHdpdGggbG93ZXIgMTIgYml0cyAqLworCXNpemUg
PSBtYXNrICsgMTsKKworCXZhICY9IH5tYXNrOwogCiAJcyA9IGludHJfZGlzYWJsZSgpOwogCWFz
aWQgPSBtaXBzX3JkX2VudHJ5aGkoKSAmIFRMQkhJX0FTSURfTUFTSzsKIAogCW1pcHNfd3JfaW5k
ZXgoaSk7Ci0JbWlwc193cl9wYWdlbWFzaygwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKHBhZ2VtYXNr
KTsKIAltaXBzX3dyX2VudHJ5aGkoVExCSElfRU5UUlkodmEsIDApKTsKIAltaXBzX3dyX2VudHJ5
bG8wKHB0ZTApOwogCW1pcHNfd3JfZW50cnlsbzEocHRlMSk7CiAJdGxiX3dyaXRlX2luZGV4ZWQo
KTsKIAogCW1pcHNfd3JfZW50cnloaShhc2lkKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOwogCWlu
dHJfcmVzdG9yZShzKTsKIH0KIApAQCAtMTM3LDcgKzE1Miw2IEBACiAJaSA9IG1pcHNfcmRfaW5k
ZXgoKTsKIAlpZiAoaSA+PSAwKQogCQl0bGJfaW52YWxpZGF0ZV9vbmUoaSk7Ci0KIAltaXBzX3dy
X2VudHJ5aGkoYXNpZCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQpAQCAtMjk4LDI5ICszMTIsNTMg
QEAKIAlyZWdpc3Rlcl90IGFzaWQ7CiAJcmVnaXN0ZXJfdCBzOwogCWludCBpOworCXVpbnQzMl90
IHBhZ2VtYXNrOworCXVuc2lnbmVkIGxvbmcgbWFzaywgc2l6ZTsKKwlwdF9lbnRyeV90IHB0ZTAs
IHB0ZTE7CisKKwkvKiBDb21wdXRlIHRoZSBwYWdlIG1hc2sgYW5kIHNpemUuICovCisJcGFnZW1h
c2sgPSBUTEJMT19QVEVfVE9fTUFTSyhwdGUpOworCW1hc2sgPSAodW5zaWduZWQgbG9uZylwYWdl
bWFzayB8IFBBR0VfTUFTSzsgLyogT1IgaXQgd2l0aCBsb3dlciAxMiBiaXRzICovCisJc2l6ZSA9
IG1hc2sgKyAxOwogCi0JdmEgJj0gflBBR0VfTUFTSzsKKwl2YSAmPSB+bWFzazsKIAlwdGUgJj0g
flRMQkxPX1NXQklUU19NQVNLOwogCiAJcyA9IGludHJfZGlzYWJsZSgpOwogCWFzaWQgPSBtaXBz
X3JkX2VudHJ5aGkoKSAmIFRMQkhJX0FTSURfTUFTSzsKIAotCW1pcHNfd3JfcGFnZW1hc2soMCk7
CisJbWlwc193cl9wYWdlbWFzayhwYWdlbWFzayk7CiAJbWlwc193cl9lbnRyeWhpKFRMQkhJX0VO
VFJZKHZhLCBwbWFwX2FzaWQocG1hcCkpKTsKIAl0bGJfcHJvYmUoKTsKIAlpID0gbWlwc19yZF9p
bmRleCgpOwogCWlmIChpID49IDApIHsKIAkJdGxiX3JlYWQoKTsKKwkJcHRlMCA9IG1pcHNfcmRf
ZW50cnlsbzAoKTsKKwkJcHRlMSA9IG1pcHNfcmRfZW50cnlsbzEoKTsKKwkJS0FTU0VSVCgoVExC
TE9fUFRFX1RPX0lEWChwdGUpID09IFRMQkxPX1BURV9UT19JRFgocHRlMCkgJiYKKwkJICAgIFRM
QkxPX1BURV9UT19JRFgocHRlKSA9PSBUTEJMT19QVEVfVE9fSURYKHB0ZTEpKSwKKwkJCSgiJXM6
IHB0ZSwgcHRlMCBhbmQgcHRlMSBwYWdlIHNpemVzIGRvbid0IG1hdGNoIiwgX19mdW5jX18pKTsK
IAotCQlpZiAoKHZhICYgUEFHRV9TSVpFKSA9PSAwKSB7CisJCWlmICgodmEgJiBzaXplKSA9PSAw
KSB7CiAJCQltaXBzX3dyX2VudHJ5bG8wKHB0ZSk7CisJCQlpZiAocGFnZW1hc2sgJiB+UEFHRV9N
QVNLKSB7CisJCQkJLyogU3VwZXJwYWdlICovCisJCQkJcHRlMSA9IChwdGUxICYgfihQVEVfVlIg
fCBQVEVfRCkpIHwgKHB0ZSAmIChQVEVfVlIgfCBQVEVfRCkpOworCQkJCW1pcHNfd3JfZW50cnls
bzEocHRlMSk7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQltaXBzX3dyX2VudHJ5bG8xKHB0ZSk7CisJ
CQlpZiAocGFnZW1hc2sgJiB+UEFHRV9NQVNLKSB7CisJCQkJLyogU3VwZXJwYWdlICovCisJCQkJ
cHRlMCA9IChwdGUwICYgfihQVEVfVlIgfCBQVEVfRCkpIHwgKHB0ZSAmIChQVEVfVlIgfCBQVEVf
RCkpOworCQkJCW1pcHNfd3JfZW50cnlsbzAocHRlMCk7CisJCQl9CiAJCX0KIAkJdGxiX3dyaXRl
X2luZGV4ZWQoKTsKIAl9CiAKIAltaXBzX3dyX2VudHJ5aGkoYXNpZCk7CisJbWlwc193cl9wYWdl
bWFzaygwKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CiAKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21p
cHMvc3d0Y2guUyBiL3N5cy9taXBzL21pcHMvc3d0Y2guUwotLS0gYS9zeXMvbWlwcy9taXBzL3N3
dGNoLlMKKysrIGIvc3lzL21pcHMvbWlwcy9zd3RjaC5TCkBAIC0zMTUsMzYgKzMxNSw5MSBAQAog
ICogTk9URTogVGhpcyBpcyBoYXJkIGNvZGVkIHRvIFVQQUdFUyA9PSAyLgogICogQWxzbywgdGhl
cmUgc2hvdWxkIGJlIG5vIFRMQiBmYXVsdHMgYXQgdGhpcyBwb2ludC4KICAqLwotCU1UQzAJdjAs
IE1JUFNfQ09QXzBfVExCX0hJCQkjIFZQTiA9IHZhCisJTVRDMAkJdjAsIE1JUFNfQ09QXzBfVExC
X0hJCSMgVlBOID0gdmEKIAlIQVpBUkRfREVMQVkKIAl0bGJwCQkJCQkjIHByb2JlIFZQTgogCUhB
WkFSRF9ERUxBWQotCW1mYzAJczAsIE1JUFNfQ09QXzBfVExCX0lOREVYCisJbWZjMAkJczAsIE1J
UFNfQ09QXzBfVExCX0lOREVYCiAJSEFaQVJEX0RFTEFZCiAKLQlQVFJfTEkJdDEsIE1JUFNfS1NF
RzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIgZW50cnkKLQlibHR6CXMwLCBlbnRyeTBzZXQKKwkj
IE1JUFNfS1NFRzBfU1RBUlQgKyAoMiAqIGluZGV4ICogUEFHRV9TSVpFKSAtPiBNSVBTX0NPUF8w
X1RMQl9ISQorCVBUUl9MSQkJdDEsIE1JUFNfS1NFRzBfU1RBUlQJCSMgaW52YWxpZGF0ZSB0bGIg
ZW50cnkKKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCWJsdHoJCXMwLCBpbnZhbF9ueHQxCisj
ZWxzZQorCWJsdHoJCXMwLCBlbnRyeTBzZXQKKyNlbmRpZgogCW5vcAotCXNsbAlzMCwgUEFHRV9T
SElGVCArIDEKLQlhZGR1CXQxLCBzMAotCU1UQzAJdDEsIE1JUFNfQ09QXzBfVExCX0hJCisJc2xs
CQlzMCwgUEFHRV9TSElGVCArIDEKKwlQVFJfQUREVQl0MSwgczAKKwlNVEMwCQl0MSwgTUlQU19D
T1BfMF9UTEJfSEkKIAlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzAKIAlQVEVfTVRD
MAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9MTzEKKwlNVEMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9Q
R19NQVNLCiAJSEFaQVJEX0RFTEFZCiAJdGxid2kKIAlIQVpBUkRfREVMQVkKLQlNVEMwCXYwLCBN
SVBTX0NPUF8wX1RMQl9ISQkJIyBzZXQgVlBOIGFnYWluCisKKyNpZmRlZiBLU1RBQ0tfTEFSR0Vf
UEFHRQorLyoKKyAqIFdpdGggYSBLU1RBQ0tfUEFHRV9TSVpFIG9mIDE2SyBhbmQgUEFHRV9TSVpF
IG9mIDRLIGl0IGlzIHBvc3NpYmxlIHRoYXQKKyAqIGEgc2Vjb25kIFRMQiBlbnRyeSBpcyBjdXJy
ZW50bHkgbWFwcGluZyB0aGUga2VybmVsIHRocmVhZCBzdGFjayBhcyBhCisgKiByZWd1bGFyIDRL
IHNpemVkIHBhZ2UocykuIENoZWNrIGZvciB0aGlzIGNhc2UgYW5kLCBpZiBzbywgaW52YWxpZGF0
ZQorICogdGhhdCBUTEIgZW50cnkgYXMgd2VsbC4KKyAqLworI2lmIChQQUdFX1NJWkUgIT0gNDA5
NikgJiYgKEtTVEFDS19QQUdFX1NJWkUgIT0gMTYzODQpCisjZXJyb3IgUEFHRV9TSVpFIGlzIG5v
dCA0SyBvciBLU1RBQ0tfUEFHRV9TSVpFIGlzIG5vdCAxNksuCisjZW5kaWYKK2ludmFsX254dDE6
CisJbW92ZQkJdjEsIHYwCisJUFRSX0FERFUJdjEsIFBBR0VfU0laRSAqIDIKKwlNVEMwCQl2MSwg
TUlQU19DT1BfMF9UTEJfSEkJCSMgVlBOID0gdmEKKwlIQVpBUkRfREVMQVkKKwl0bGJwCQkJCQkJ
IyBwcm9iZSBWUE4KKwlIQVpBUkRfREVMQVkKKwltZmMwCQlzMCwgTUlQU19DT1BfMF9UTEJfSU5E
RVgKKwlIQVpBUkRfREVMQVkKKworCSMgTUlQU19LU0VHMF9TVEFSVCArICgyICogaW5kZXggKiBQ
QUdFX1NJWkUpIC0+IE1JUFNfQ09QXzBfVExCX0hJCisJUFRSX0xJCQl0MSwgTUlQU19LU0VHMF9T
VEFSVAkJIyBpbnZhbGlkYXRlIHRsYiBlbnRyeQorCWJsdHoJCXMwLCBlbnRyeTBzZXQKKwlub3AK
KwlzbGwJCXMwLCBQQUdFX1NISUZUICsgMQorCVBUUl9BRERVCXQxLCBzMAorCU1UQzAJCXQxLCBN
SVBTX0NPUF8wX1RMQl9ISQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMAorCVBU
RV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMQorCU1UQzAJCXplcm8sIE1JUFNfQ09QXzBf
VExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKwl0bGJ3aQorCUhBWkFSRF9ERUxBWQorI2VuZGlm
CS8qIEtTVEFDS19MQVJHRV9QQUdFICovCiAKIGVudHJ5MHNldDoKKwlNVEMwCQl2MCwgTUlQU19D
T1BfMF9UTEJfSEkJCSMgc2V0IFZQTiBhZ2FpbgorCUhBWkFSRF9ERUxBWQogLyogU01QISEgLSBX
b3JrcyBvbmx5IGZvciAgdW5zaGFyZWQgVExCIGNhc2UgLSBpLmUuIG5vIHYtY3B1cyAqLwotCW10
YzAJemVybywgTUlQU19DT1BfMF9UTEJfSU5ERVgJCSMgVExCIGVudHJ5ICMwCisJbXRjMAkJemVy
bywgTUlQU19DT1BfMF9UTEJfSU5ERVgJIyBUTEIgZW50cnkgIzAKIAlIQVpBUkRfREVMQVkKIAlQ
VEVfTVRDMAlhMSwgTUlQU19DT1BfMF9UTEJfTE8wCQkjIHVwdGVbMF0KIAlIQVpBUkRfREVMQVkK
IAlQVEVfTVRDMAlhMiwgTUlQU19DT1BfMF9UTEJfTE8xCQkjIHVwdGVbMV0KKyNpZmRlZiBLU1RB
Q0tfTEFSR0VfUEFHRQorCUhBWkFSRF9ERUxBWQorCWxpCQl0MSwgS1NUQUNLX1RMQk1BU0tfTUFT
SworCU1UQzAJCXQxLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCiAJSEFaQVJEX0RFTEFZCisjZWxz
ZQorCU1UQzAJCXplcm8sIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKKwlIQVpBUkRfREVMQVkKKyNl
bmRpZgogCXRsYndpCQkJCQkjIHNldCBUTEIgZW50cnkgIzAKIAlIQVpBUkRfREVMQVkKKworI2lm
ZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJTVRDMAkJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFT
SworCUhBWkFSRF9ERUxBWQorI2VuZGlmCiAvKgogICogTm93IHJ1bm5pbmcgb24gbmV3IHUgc3Ry
dWN0LgogICovCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMgYi9zeXMv
bWlwcy9taXBzL3BtYXBfbWlwczY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYvbnVs
bAorKysgYi9zeXMvbWlwcy9taXBzL3BtYXBfbWlwczY0LmMKQEAgLTAsMCArMSw1NTI0IEBACisv
KgorICogQ29weXJpZ2h0IChjKSAxOTkxIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2Fs
aWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQg
Sm9obiBTLiBEeXNvbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykg
MTk5NCBEYXZpZCBHcmVlbm1hbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoYykgMjAwMyBQZXRlciBXZW1tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChjKSAyMDA1LTIwMTAgQWxhbiBMLiBDb3ggPGFsY0Bjcy5yaWNlLmVkdT4KKyAqIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgU3RhY2V5IEQuIFNvbiA8c3Nv
bkAuLi4+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJp
dmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIHRoZSBTeXN0
ZW1zIFByb2dyYW1taW5nIEdyb3VwIG9mIHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggQ29tcHV0ZXIK
KyAqIFNjaWVuY2UgRGVwYXJ0bWVudCBhbmQgV2lsbGlhbSBKb2xpdHogb2YgVVVORVQgVGVjaG5v
bG9naWVzIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZl
cnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdh
cmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJV
VE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
CisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJZnJvbToJ
QCgjKXBtYXAuYwk3LjcgKEJlcmtlbGV5KQk1LzEyLzkxCisgKglmcm9tOiBzcmMvc3lzL2kzODYv
aTM4Ni9wbWFwLmMsdiAxLjI1MC4yLjggMjAwMC8xMS8yMSAwMDowOToxNCBwcworICoJSk5QUjog
cG1hcC5jLHYgMS4xMS4yLjEgMjAwNy8wOC8xNiAxMTo1MTowNiBnaXJpc2gKKyAqLworCisvKgor
ICoJTWFuYWdlcyBwaHlzaWNhbCBhZGRyZXNzIG1hcHMuCisgKgorICoJU2luY2UgdGhlIGluZm9y
bWF0aW9uIG1hbmFnZWQgYnkgdGhpcyBtb2R1bGUgaXMKKyAqCWFsc28gc3RvcmVkIGJ5IHRoZSBs
b2dpY2FsIGFkZHJlc3MgbWFwcGluZyBtb2R1bGUsCisgKgl0aGlzIG1vZHVsZSBtYXkgdGhyb3cg
YXdheSB2YWxpZCB2aXJ0dWFsLXRvLXBoeXNpY2FsCisgKgltYXBwaW5ncyBhdCBhbG1vc3QgYW55
IHRpbWUuICBIb3dldmVyLCBpbnZhbGlkYXRpb25zCisgKglvZiB2aXJ0dWFsLXRvLXBoeXNpY2Fs
IG1hcHBpbmdzIG11c3QgYmUgZG9uZSBhcworICoJcmVxdWVzdGVkLgorICoKKyAqCUluIG9yZGVy
IHRvIGNvcGUgd2l0aCBoYXJkd2FyZSBhcmNoaXRlY3R1cmVzIHdoaWNoCisgKgltYWtlIHZpcnR1
YWwtdG8tcGh5c2ljYWwgbWFwIGludmFsaWRhdGVzIGV4cGVuc2l2ZSwKKyAqCXRoaXMgbW9kdWxl
IG1heSBkZWxheSBpbnZhbGlkYXRlIG9yIHJlZHVjZWQgcHJvdGVjdGlvbgorICoJb3BlcmF0aW9u
cyB1bnRpbCBzdWNoIHRpbWUgYXMgdGhleSBhcmUgYWN0dWFsbHkKKyAqCW5lY2Vzc2FyeS4gIFRo
aXMgbW9kdWxlIGlzIGdpdmVuIGZ1bGwgaW5mb3JtYXRpb24gYXMKKyAqCXRvIHdoaWNoIHByb2Nl
c3NvcnMgYXJlIGN1cnJlbnRseSB1c2luZyB3aGljaCBtYXBzLAorICoJYW5kIHRvIHdoZW4gcGh5
c2ljYWwgbWFwcyBtdXN0IGJlIG1hZGUgY29ycmVjdC4KKyAqLworCisjaW5jbHVkZSA8c3lzL2Nk
ZWZzLmg+CitfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlICJvcHRfZGRiLmgiCisj
aW5jbHVkZSAib3B0X3BtYXAuaCIKKyNpbmNsdWRlICJvcHRfdm0uaCIKKworI2luY2x1ZGUgPHN5
cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2luY2x1ZGUgPHN5cy9rdHIuaD4K
KyNpbmNsdWRlIDxzeXMvbG9jay5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8
c3lzL21zZ2J1Zi5oPgorI2luY2x1ZGUgPHN5cy9tdXRleC5oPgorI2luY2x1ZGUgPHN5cy9wY3B1
Lmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNpbmNsdWRlIDxzeXMvcndsb2NrLmg+CisjaW5j
bHVkZSA8c3lzL3NjaGVkLmg+CisjaWZkZWYgU01QCisjaW5jbHVkZSA8c3lzL3NtcC5oPgorI2Vs
c2UKKyNpbmNsdWRlIDxzeXMvY3B1c2V0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc3lzY3Rs
Lmg+CisjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4KKworI2lmZGVmIEREQgorI2luY2x1ZGUgPGRk
Yi9kZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2bS92bV9w
YXJhbS5oPgorI2luY2x1ZGUgPHZtL3ZtX2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlLmg+
CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+CisjaW5j
bHVkZSA8dm0vdm1fZXh0ZXJuLmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZW91dC5oPgorI2luY2x1
ZGUgPHZtL3ZtX3BhZ2VyLmg+CisjaW5jbHVkZSA8dm0vdm1fcmFkaXguaD4KKyNpbmNsdWRlIDx2
bS92bV9yZXNlcnYuaD4KKyNpbmNsdWRlIDx2bS91bWEuaD4KKworI2luY2x1ZGUgPG1hY2hpbmUv
Y2FjaGUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgorI2luY2x1ZGUgPG1hY2hpbmUv
dGxiLmg+CisKKyN1bmRlZiBQTUFQX0RFQlVHCisKKyNpZiAhZGVmaW5lZChESUFHTk9TVElDKQor
I2RlZmluZQlQTUFQX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyNkZWZpbmUJUE1BUF9JTkxJTkUK
KyNlbmRpZgorCisvLyAjZGVmaW5lIFBWX1NUQVRTCisjaWZkZWYgUFZfU1RBVFMKKyNkZWZpbmUg
UFZfU1RBVCh4KQlkbyB7IHggOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFZfU1RBVCh4
KQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZQlwYV9pbmRleChwYSkJKChwYSkg
Pj4gUERSU0hJRlQpCisjZGVmaW5lCXBhX3RvX3B2aChwYSkJKCZwdl90YWJsZVtwYV9pbmRleChw
YSldKQorCisjZGVmaW5lCU5QVl9MSVNUX0xPQ0tTCU1BWENQVQorCisjZGVmaW5lCVBIWVNfVE9f
UFZfTElTVF9MT0NLKHBhKQlcCisJCSgmcHZfbGlzdF9sb2Nrc1twYV9pbmRleChwYSkgJSBOUFZf
TElTVF9MT0NLU10pCisKKyNkZWZpbmUJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2tw
LCBwYSkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9IChsb2NrcCk7CQlcCisJc3Ry
dWN0IHJ3bG9jayAqX25ld19sb2NrOwkJCVwKKwkJCQkJCQlcCisJX25ld19sb2NrID0gUEhZU19U
T19QVl9MSVNUX0xPQ0socGEpOwkJXAorCWlmIChfbmV3X2xvY2sgIT0gKl9sb2NrcCkgewkJCVwK
KwkJaWYgKCpfbG9ja3AgIT0gTlVMTCkJCQlcCisJCQlyd193dW5sb2NrKCpfbG9ja3ApOwkJXAor
CQkqX2xvY2twID0gX25ld19sb2NrOwkJCVwKKwkJIHJ3X3dsb2NrKCpfbG9ja3ApOwkJCVwKKwl9
CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZN
X1BBR0UobG9ja3AsIG0pCVwKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBW
TV9QQUdFX1RPX1BIWVMobSkpCisKKyNkZWZpbmUJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9ja3Ap
CQlkbyB7CVwKKwlzdHJ1Y3Qgcndsb2NrICoqX2xvY2twID0gKGxvY2twKTsJCVwKKwkJCQkJCQlc
CisJaWYgKCpfbG9ja3AgIT0gTlVMTCkgewkJCQlcCisJCXJ3X3d1bmxvY2soKl9sb2NrcCk7CQkJ
XAorCQkqX2xvY2twID0gTlVMTDsJCQkJXAorCX0JCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVm
aW5lCVZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pCVwKKwkJUEhZU19UT19QVl9MSVNUX0xPQ0so
Vk1fUEFHRV9UT19QSFlTKG0pKQorCisvKgorICogR2V0IFBERXMgYW5kIFBURXMgZm9yIHVzZXIv
a2VybmVsIGFkZHJlc3Mgc3BhY2UKKyAqLworI2RlZmluZQlwbWFwX3NlZ19pbmRleCh2KQkoKCh2
KSA+PiBTRUdTSElGVCkgJiAoTlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcGRlX2luZGV4KHYp
CSgoKHYpID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKSkKKyNkZWZpbmUJcG1hcF9wdGVfaW5k
ZXgodikJKCgodikgPj4gUEFHRV9TSElGVCkgJiAoTlBURVBHIC0gMSkpCisjZGVmaW5lCXBtYXBf
cGRlX3BpbmRleCh2KQkoKHYpID4+IFBEUlNISUZUKQorCisjZGVmaW5lCU5VUERFCQkJKE5QREVQ
RyAqIE5QREVQRykKKyNkZWZpbmUJTlVTRVJQR1RCTFMJCShOVVBERSArIE5QREVQRykKKworI2Rl
ZmluZQlpc19rZXJuZWxfcG1hcCh4KQkoKHgpID09IGtlcm5lbF9wbWFwKQorCitzdHJ1Y3QgcG1h
cCBrZXJuZWxfcG1hcF9zdG9yZTsKK3BkX2VudHJ5X3QgKmtlcm5lbF9zZWdtYXA7CisKK3ZtX29m
ZnNldF90IHZpcnR1YWxfYXZhaWw7CS8qIFZBIG9mIGZpcnN0IGF2YWlsIHBhZ2UgKGFmdGVyIGtl
cm5lbCBic3MpICovCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2VuZDsJLyogVkEgb2YgbGFzdCBhdmFp
bCBwYWdlIChlbmQgb2Yga2VybmVsIEFTKSAqLworCitzdGF0aWMgaW50IG5rcHQ7Cit1bnNpZ25l
ZCBwbWFwX21heF9hc2lkOwkJLyogbWF4IEFTSUQgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gKi8K
Kworc3RhdGljIFNZU0NUTF9OT0RFKF92bSwgT0lEX0FVVE8sIHBtYXAsIENUTEZMQUdfUkQsIDAs
ICJWTS9wbWFwIHBhcmFtZXRlcnMiKTsKK3N0YXRpYyBpbnQgcGdfc3BfZW5hYmxlZCA9IDA7CitT
WVNDVExfSU5UKF92bV9wbWFwLCBPSURfQVVUTywgcGdfcHNfZW5hYmxlZCwgQ1RMRkxBR19SRFRV
TiB8IENUTEZMQUdfTk9GRVRDSCwKKyAgICAmcGdfc3BfZW5hYmxlZCwgMCwgIkFyZSBsYXJnZSBw
YWdlIG1hcHBpbmdzIGVuYWJsZWQ/Iik7CisKKyNkZWZpbmUJUE1BUF9BU0lEX1JFU0VSVkVECTAK
Kwordm1fb2Zmc2V0X3Qga2VybmVsX3ZtX2VuZCA9IFZNX01JTl9LRVJORUxfQUREUkVTUzsKKwor
c3RhdGljIHZvaWQgcG1hcF9hc2lkX2FsbG9jKHBtYXBfdCBwbWFwKTsKKworc3RhdGljIHN0cnVj
dCByd2xvY2tfcGFkYWxpZ24gcHZoX2dsb2JhbF9sb2NrOworCisvKgorICogRGF0YSBmb3IgdGhl
IHB2IGVudHJ5IGFsbG9jYXRpb24gbWVjaGFuaXNtCisgKi8KK3N0YXRpYyBUQUlMUV9IRUFEKHBj
aCwgcHZfY2h1bmspIHB2X2NodW5rcyA9IFRBSUxRX0hFQURfSU5JVElBTElaRVIocHZfY2h1bmtz
KTsKK3N0YXRpYyBzdHJ1Y3QgbXR4IHB2X2NodW5rc19tdXRleDsKK3N0YXRpYyBzdHJ1Y3Qgcnds
b2NrIHB2X2xpc3RfbG9ja3NbTlBWX0xJU1RfTE9DS1NdOworc3RhdGljIHN0cnVjdCBtZF9wYWdl
ICpwdl90YWJsZTsKKworc3RhdGljIHZvaWQgZnJlZV9wdl9jaHVuayhzdHJ1Y3QgcHZfY2h1bmsg
KnBjKTsKK3N0YXRpYyB2b2lkIGZyZWVfcHZfZW50cnkocG1hcF90IHBtYXAsIHB2X2VudHJ5X3Qg
cHYpOworc3RhdGljIHB2X2VudHJ5X3QgZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qg
cndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCByZWNsYWltX3B2X2NodW5rKHBtYXBf
dCBsb2NrZWRfcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBf
cHZoX2ZyZWUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZh
KTsKK3N0YXRpYyBwdl9lbnRyeV90IHBtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFnZSAqcHZo
LCBwbWFwX3QgcG1hcCwKKyAgICB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm1fcGFnZV90IHBt
YXBfYWxsb2NfZGlyZWN0X3BhZ2UodW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmVxKTsKK3N0YXRp
YyB2bV9wYWdlX3QgcG1hcF9lbnRlcl9xdWlja19sb2NrZWQocG1hcF90IHBtYXAsIHZtX29mZnNl
dF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwgdm1fcGFnZV90IG1wdGUs
ICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcmVzZXJ2ZV9wdl9lbnRyaWVz
KHBtYXBfdCBwbWFwLCBpbnQgbmVlZGVkLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7Citz
dGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq
cGRlLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZV9s
b2NrZWQocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwKKyAgICB2bV9vZmZzZXRfdCB2YSwg
c3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxvY3BkZShw
bWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsK
K3N0YXRpYyBib29sZWFuX3QgcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90
IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3QgcHJvdCwgc3RydWN0IHJ3bG9jayAqKmxv
Y2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zm
c2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0
YXRpYyBib29sZWFuX3QgcG1hcF9wdl9pbnNlcnRfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRf
dCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGlj
IHZvaWQgcG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZt
X3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBt
YXBfZmlsbF9wdHAocHRfZW50cnlfdCAqZmlyc3RwdGUsIHB0X2VudHJ5X3QgbmV3cHRlKTsKK3N0
YXRpYyBfX2lubGluZSBpbnQgcG1hcF9pbnNlcnRfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fcGFn
ZV90IG1wdGUpOworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdCBwbWFwX2xvb2t1cF9wdF9wYWdl
KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBwbWFwX3Byb21vdGVf
cGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAorICAgIHN0
cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3ZlX3BkZShwbWFwX3Qg
cG1hcCwgcGRfZW50cnlfdCAqcGRxLCB2bV9vZmZzZXRfdCBzdmEsCisgICAgc3RydWN0IHNwZ2xp
c3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3Zl
X3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRfZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRfdCB2YSwK
KyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xv
Y2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBwbWFwICpw
bWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSk7CitzdGF0aWMg
Ym9vbGVhbl90IHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEsCisgICAgdm1fcGFnZV90IG0sIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMg
dm9pZCBwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcHRfZW50
cnlfdCBwdGUpOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCk7
CitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEpOworc3RhdGljIHZvaWQgX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwgdm1fb2Zm
c2V0X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKTsKKworc3Rh
dGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwK
KyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCBfcG1hcF9hbGxv
Y3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRlcGluZGV4LAorICAgIHN0cnVjdCByd2xvY2sg
Kipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfdW51c2VfcHQocG1hcF90LCB2bV9vZmZzZXRfdCwg
cGRfZW50cnlfdCwgc3RydWN0IHNwZ2xpc3QgKik7CitzdGF0aWMgcHRfZW50cnlfdCBpbml0X3B0
ZV9wcm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJvdCk7CisK
K3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpOworc3Rh
dGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcpOworc3RhdGlj
IHZvaWQgcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsKKworLyoKKyAqIFBhZ2Ug
dGFibGUgZW50cnkgbG9va3VwIHJvdXRpbmVzLgorICovCisKKy8qIFJldHVybiBhIHNlZ21lbnQg
ZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMgX19pbmxp
bmUgcGRfZW50cnlfdCAqCitwbWFwX3NlZ21hcChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp
Cit7CisKKwlyZXR1cm4gKCZwbWFwLT5wbV9zZWd0YWJbcG1hcF9zZWdfaW5kZXgodmEpXSk7Cit9
CisKKy8qIFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBzZWdtZW50IHRh
YmxlICYgdmlydHVhbCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5X3QgKgor
cG1hcF9wZHBlX3RvX3BkZShwZF9lbnRyeV90ICpwZHBlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlw
ZF9lbnRyeV90ICpwZGU7CisKKwlwZGUgPSAocGRfZW50cnlfdCAqKSpwZHBlOworCXJldHVybiAo
JnBkZVtwbWFwX3BkZV9pbmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSBkaXJlY3Rv
cnkgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMgX19p
bmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp
Cit7CisJcGRfZW50cnlfdCAqcGRwZTsKKworCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCB2YSk7
CisJaWYgKCpwZHBlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXR1cm4gKHBtYXBf
cGRwZV90b19wZGUocGRwZSwgdmEpKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJsZSBlbnRy
eSBmb3IgZ2l2ZW4gcGFnZSBkaXJlY3RvcnkgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMg
X19pbmxpbmUgcHRfZW50cnlfdCAqCitwbWFwX3BkZV90b19wdGUocGRfZW50cnlfdCAqcGRlLCB2
bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlwdGUgPSAocHRfZW50cnlf
dCAqKSpwZGU7CisJcmV0dXJuICgmcHRlW3BtYXBfcHRlX2luZGV4KHZhKV0pOworfQorCisvKiBS
ZXR1cm4gYSBwYWdlIHRhYmxlIGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBhZGRyZXNz
LiAqLworcHRfZW50cnlfdCAqCitwbWFwX3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEp
Cit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlm
IChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJaWYgKHBk
ZV9pc19zdXBlcnBhZ2UocGRlKSkgeworCQlyZXR1cm4gKChwdF9lbnRyeV90ICopcGRlKTsKKwl9
IGVsc2UKKwkJcmV0dXJuIChwbWFwX3BkZV90b19wdGUocGRlLCB2YSkpOworfQorCitzdGF0aWMg
X19pbmxpbmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcF90IHBtYXAsIGludCBj
b3VudCkKK3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXBtYXAtPnBt
X3N0YXRzLnJlc2lkZW50X2NvdW50ICs9IGNvdW50OworfQorCitzdGF0aWMgX19pbmxpbmUgdm9p
ZAorcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcF90IHBtYXAsIGludCBjb3VudCkKK3sKKwor
CVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQocG1hcC0+cG1fc3Rh
dHMucmVzaWRlbnRfY291bnQgPj0gY291bnQsCisJICAgICgicG1hcCAlcCByZXNpZGVudCBjb3Vu
dCB1bmRlcmZsb3cgJWxkICVkIiwgcG1hcCwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRf
Y291bnQsIGNvdW50KSk7CisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgLT0gY291bnQ7
Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBzb21lIHdpcmVkIG1lbW9yeSBiZWZvcmUgdGhlIHZpcnR1
YWwgbWVtb3J5IHN5c3RlbSBpcworICogYm9vdHN0cmFwcGVkLgorICovCit2bV9vZmZzZXRfdAor
cG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpCit7CisJdm1fcGFkZHJfdCBiYW5rX3Np
emUsIHBhOworCXZtX29mZnNldF90IHZhOworCisJc2l6ZSA9IHJvdW5kX3BhZ2Uoc2l6ZSk7CisJ
YmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJd2hpbGUgKHNpemUg
PiBiYW5rX3NpemUpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsg
Ml07IGkgKz0gMikgeworCQkJcGh5c19hdmFpbFtpXSA9IHBoeXNfYXZhaWxbaSArIDJdOworCQkJ
cGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kgKyAzXTsKKwkJfQorCQlwaHlzX2F2YWls
W2ldID0gMDsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSAwOworCQlpZiAoIXBoeXNfYXZhaWxbMF0p
CisJCQlwYW5pYygicG1hcF9zdGVhbF9tZW1vcnk6IG91dCBvZiBtZW1vcnkiKTsKKwkJYmFua19z
aXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJfQorCisJcGEgPSBwaHlzX2F2
YWlsWzBdOworCXBoeXNfYXZhaWxbMF0gKz0gc2l6ZTsKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJF
Q1QocGEpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBzaXplKTsKKwlyZXR1cm4gKHZhKTsKK30KKwor
LyoKKyAqIEJvb3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0dWFsIG1l
bW9yeS4gIFRoaXMKKyAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBoYXMgYmVl
biBpbml0aWFsaXplZC4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfY3JlYXRlX2tlcm5lbF9wYWdl
dGFibGUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwl2bV9vZmZzZXRfdCBwdGFkZHI7CisJcHRfZW50
cnlfdCAqcHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCBwZGFkZHI7CisJaW50
IG5wdCwgbnBkZTsKKworCS8qCisJICogQWxsb2NhdGUgc2VnbWVudCB0YWJsZSBmb3IgdGhlIGtl
cm5lbAorCSAqLworCWtlcm5lbF9zZWdtYXAgPSAocGRfZW50cnlfdCAqKXBtYXBfc3RlYWxfbWVt
b3J5KFBBR0VfU0laRSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNlY29uZCBsZXZlbCBwYWdlIHRh
YmxlcyBmb3IgdGhlIGtlcm5lbAorCSAqLworCW5wZGUgPSBob3dtYW55KE5LUFQsIE5QREVQRyk7
CisJcGRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbnBkZSk7CisJbmtwdCA9
IE5LUFQ7CisJcHRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbmtwdCk7CisK
KwkvKgorCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2Jh
bCBiaXQgaW4gdGhlCisJICogdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlciBmb3IgZWFjaCAy
IHBhZ2UgZW50cnkuIFRodXMgaW52YWxpZAorCSAqIGVudHJ5cyBtdXN0IGhhdmUgdGhlIEdsb2Jh
bCBiaXQgc2V0IHNvIHdoZW4gRW50cnkgTE8gYW5kIEVudHJ5IEhJCisJICogRyBiaXRzIGFyZSBh
bmRlZCB0b2dldGhlciB0aGV5IHdpbGwgcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUKKwkg
KiBpbiB0aGUgdGxiLgorCSAqLworCWZvciAoaSA9IDAsIHB0ZSA9IChwdF9lbnRyeV90ICopcHRh
ZGRyOyBpIDwgKG5rcHQgKiBOUFRFUEcpOyBpKyssIHB0ZSsrKQorCQkqcHRlID0gUFRFX0c7CisK
Kwlmb3IgKGkgPSAwLCAgbnB0ID0gbmtwdDsgbnB0ID4gMDsgaSsrKSB7CisJCWtlcm5lbF9zZWdt
YXBbaV0gPSAocGRfZW50cnlfdCkocGRhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJCXBkZSA9IChw
ZF9lbnRyeV90ICopa2VybmVsX3NlZ21hcFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgTlBERVBH
ICYmIG5wdCA+IDA7IGorKywgbnB0LS0pCisJCQlwZGVbal0gPSAocGRfZW50cnlfdCkocHRhZGRy
ICsgKGkgKiBOUERFUEcgKyBqKSAqCisJCQkgICAgUEFHRV9TSVpFKTsKKwl9CisKKwlQTUFQX0xP
Q0tfSU5JVChrZXJuZWxfcG1hcCk7CisJa2VybmVsX3BtYXAtPnBtX3NlZ3RhYiA9IGtlcm5lbF9z
ZWdtYXA7CisJQ1BVX0ZJTEwoJmtlcm5lbF9wbWFwLT5wbV9hY3RpdmUpOworCVRBSUxRX0lOSVQo
Jmtlcm5lbF9wbWFwLT5wbV9wdmNodW5rKTsKKwlrZXJuZWxfcG1hcC0+cG1fYXNpZFswXS5hc2lk
ID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFwLT5wbV9hc2lkWzBdLmdlbiA9IDA7
CisJa2VybmVsX3ZtX2VuZCArPSBua3B0ICogTlBURVBHICogUEFHRV9TSVpFOworfQorCit2b2lk
CitwbWFwX2Jvb3RzdHJhcCh2b2lkKQoreworCWludCBpOworCisJLyogU29ydC4gKi8KK2FnYWlu
OgorCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgeworCQkvKgor
CQkgKiBLZWVwIHRoZSBtZW1vcnkgYWxpZ25lZCBvbiBwYWdlIGJvdW5kYXJ5LgorCQkgKi8KKwkJ
cGh5c19hdmFpbFtpXSA9IHJvdW5kX3BhZ2UocGh5c19hdmFpbFtpXSk7CisJCXBoeXNfYXZhaWxb
aSArIDFdID0gdHJ1bmNfcGFnZShwaHlzX2F2YWlsW2kgKyAxXSk7CisKKwkJaWYgKGkgPCAyKQor
CQkJY29udGludWU7CisJCWlmIChwaHlzX2F2YWlsW2kgLSAyXSA+IHBoeXNfYXZhaWxbaV0pIHsK
KwkJCXZtX3BhZGRyX3QgcHRlbXBbMl07CisKKwkJCXB0ZW1wWzBdID0gcGh5c19hdmFpbFtpICsg
MF07CisJCQlwdGVtcFsxXSA9IHBoeXNfYXZhaWxbaSArIDFdOworCisJCQlwaHlzX2F2YWlsW2kg
KyAwXSA9IHBoeXNfYXZhaWxbaSAtIDJdOworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2
YWlsW2kgLSAxXTsKKworCQkJcGh5c19hdmFpbFtpIC0gMl0gPSBwdGVtcFswXTsKKwkJCXBoeXNf
YXZhaWxbaSAtIDFdID0gcHRlbXBbMV07CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJLyoK
KwkgKiBDb3B5IHRoZSBwaHlzX2F2YWlsW10gYXJyYXkgYmVmb3JlIHdlIHN0YXJ0IHN0ZWFsaW5n
IG1lbW9yeSBmcm9tIGl0LgorCSAqLworCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9
IDA7IGkgKz0gMikgeworCQlwaHlzbWVtX2Rlc2NbaV0gPSBwaHlzX2F2YWlsW2ldOworCQlwaHlz
bWVtX2Rlc2NbaSArIDFdID0gcGh5c19hdmFpbFtpICsgMV07CisJfQorCisJTWF4bWVtID0gYXRv
cChwaHlzX2F2YWlsW2kgLSAxXSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJpbnRmKCJQ
aHlzaWNhbCBtZW1vcnkgY2h1bmsocyk6XG4iKTsKKwkJZm9yIChpID0gMDsgcGh5c19hdmFpbFtp
ICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCQl2bV9wYWRkcl90IHNpemU7CisKKwkJCXNpemUgPSBw
aHlzX2F2YWlsW2kgKyAxXSAtIHBoeXNfYXZhaWxbaV07CisJCQlwcmludGYoIiUjMDhqeCAtICUj
MDhqeCwgJWp1IGJ5dGVzICglanUgcGFnZXMpXG4iLAorCQkJICAgICh1aW50bWF4X3QpIHBoeXNf
YXZhaWxbaV0sCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5c19hdmFpbFtpICsgMV0gLSAxLAorCQkJ
ICAgICh1aW50bWF4X3QpIHNpemUsICh1aW50bWF4X3QpIHNpemUgLyBQQUdFX1NJWkUpOworCQl9
CisJCXByaW50ZigiTWF4bWVtIGlzIDB4JTBqeFxuIiwgcHRvYSgodWludG1heF90KU1heG1lbSkp
OworCX0KKwkvKgorCSAqIFN0ZWFsIHRoZSBtZXNzYWdlIGJ1ZmZlciBmcm9tIHRoZSBiZWdpbm5p
bmcgb2YgbWVtb3J5LgorCSAqLworCW1zZ2J1ZnAgPSAoc3RydWN0IG1zZ2J1ZiAqKXBtYXBfc3Rl
YWxfbWVtb3J5KG1zZ2J1ZnNpemUpOworCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNnYnVmc2l6ZSk7
CisKKwkvKgorCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLiBUaGlzIG11c3QgYmUgYWxpZ25lZCB0
bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBhIHNpbmds
ZSBUTEIgZW50cnkuCisJICoKKwkgKi8KKwlrc3RhY2swID0gcG1hcF9zdGVhbF9tZW1vcnkoKEtT
VEFDS19QQUdFUyAgKyBLU1RBQ0tfR1VBUkRfUEFHRVMpIDw8CisJICAgIFBBR0VfU0hJRlQpOwor
CWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNLX1BBR0VfU0laRSAqIDIpKTsKKwor
CXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisJdmlydHVhbF9lbmQgPSBW
TV9NQVhfS0VSTkVMX0FERFJFU1M7CisKKyNpZmRlZiBTTVAKKwkvKgorCSAqIFN0ZWFsIHNvbWUg
dmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIG1hcCB0aGUgcGNwdSBhcmVhLgorCSAqLworCXZpcnR1
YWxfYXZhaWwgPSByb3VuZHVwMih2aXJ0dWFsX2F2YWlsLCBQQUdFX1NJWkUgKiAyKTsKKwlwY3B1
cCA9IChzdHJ1Y3QgcGNwdSAqKXZpcnR1YWxfYXZhaWw7CisJdmlydHVhbF9hdmFpbCArPSBQQUdF
X1NJWkUgKiAyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB3aXJlZCBUTEIgZW50cnkgbWFw
cGluZyB0aGUgcGNwdSByZWdpb24gZm9yCisJICogdGhlIEJTUCBhdCAncGNwdXAnLiBVcCB1bnRp
bCB0aGlzIHBvaW50IHdlIHdlcmUgb3BlcmF0aW5nCisJICogd2l0aCB0aGUgJ3BjcHVwJyBmb3Ig
dGhlIEJTUCBwb2ludGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcworCSAqIGluIEtTRUcwIHNvIHRo
ZXJlIHdhcyBubyBuZWVkIGZvciBhIFRMQiBtYXBwaW5nLgorCSAqLworCW1pcHNfcGNwdV90bGJf
aW5pdChQQ1BVX0FERFIoMCkpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYoInBjcHUg
aXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBjcHVwKTsKKyNlbmRpZgor
CisJcG1hcF9jcmVhdGVfa2VybmVsX3BhZ2V0YWJsZSgpOworCXBtYXBfbWF4X2FzaWQgPSBWTU5V
TV9QSURTOworCW1pcHNfd3JfZW50cnloaSgwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOworCisJ
LyoKKwkgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHYgbGlzdCBsb2NrLgorCSAqLworCXJ3X2lu
aXQoJnB2aF9nbG9iYWxfbG9jaywgInBtYXAgcHYgZ2xvYmFsIik7Cit9CisKKy8qCisgKiBJbml0
aWFsaXplIGEgdm1fcGFnZSdzIG1hY2hpbmUtZGVwZW5kZW50IGZpZWxkcy4KKyAqLwordm9pZAor
cG1hcF9wYWdlX2luaXQodm1fcGFnZV90IG0pCit7CisKKwlUQUlMUV9JTklUKCZtLT5tZC5wdl9s
aXN0KTsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOworfQorCisvKgor
ICoJSW5pdGlhbGl6ZSB0aGUgcG1hcCBtb2R1bGUuCisgKglDYWxsZWQgYnkgdm1faW5pdCwgdG8g
aW5pdGlhbGl6ZSBhbnkgc3RydWN0dXJlcyB0aGF0IHRoZSBwbWFwCisgKglzeXN0ZW0gbmVlZHMg
dG8gbWFwIHZpcnR1YWwgbWVtb3J5LgorICovCit2b2lkCitwbWFwX2luaXQodm9pZCkKK3sKKwlp
bnQgaTsKKwl2bV9zaXplX3QgczsKKwlpbnQgcHZfbnBnOworCisJLyoKKwkgKiBJbml0aWFsaXpl
IHRoZSBwdiBjaHVuayBsaXN0IG11dGV4LgorCSAqLworCW10eF9pbml0KCZwdl9jaHVua3NfbXV0
ZXgsICJwbWFwIHB2IGNodW5rIGxpc3QiLCBOVUxMLCBNVFhfREVGKTsKKworCS8qCisJICogSW5p
dGlhbGl6ZSB0aGUgcG9vbCBvZiBwdiBsaXN0IGxvY2tzLgorCSAqLworCWZvciAoaSA9IDA7IGkg
PCBOUFZfTElTVF9MT0NLUzsgaSsrKQorCQlyd19pbml0KCZwdl9saXN0X2xvY2tzW2ldLCAicHYg
bGlzdCIpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHB2IGhlYWQgdGFi
bGUgZm9yIHN1cGVycGFnZXMuCisJICovCisJZm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsgMV07
IGkgKz0gMik7CisJcHZfbnBnID0gcm91bmRfMm1wYWdlKHBoeXNfYXZhaWxbKGkgLSAyKSArIDFd
KSAvIE5CUERSOworCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwdiBoZWFkIHRh
YmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCXMgPSAodm1fc2l6ZV90KShwdl9ucGcgKiBzaXpl
b2Yoc3RydWN0IG1kX3BhZ2UpKTsKKwlzID0gcm91bmRfcGFnZShzKTsKKwlwdl90YWJsZSA9IChz
dHJ1Y3QgbWRfcGFnZSAqKWttZW1fbWFsbG9jKGtlcm5lbF9hcmVuYSwgcywKKwkgICAgTV9XQUlU
T0sgfCBNX1pFUk8pOworCWZvciAoaSA9IDA7IGkgPCBwdl9ucGc7IGkrKykKKwkJVEFJTFFfSU5J
VCgmcHZfdGFibGVbaV0ucHZfbGlzdCk7Cit9CisKK3N0YXRpYyBTWVNDVExfTk9ERShfdm1fcG1h
cCwgT0lEX0FVVE8sIHBkZSwgQ1RMRkxBR19SRCwgMCwKKyAgICAiMk1CIHBhZ2UgbWFwcGluZyBj
b3VudGVycyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBfcGRlX2RlbW90aW9uczsKK1NZU0NUTF9V
TE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBkZW1vdGlvbnMsIENUTEZMQUdfUkQsCisgICAg
JnBtYXBfcGRlX2RlbW90aW9ucywgMCwgIjJNQiBwYWdlIGRlbW90aW9ucyIpOworCitzdGF0aWMg
dV9sb25nIHBtYXBfcGRlX21hcHBpbmdzOworU1lTQ1RMX1VMT05HKF92bV9wbWFwX3BkZSwgT0lE
X0FVVE8sIG1hcHBpbmdzLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9tYXBwaW5ncywgMCwg
IjJNQiBwYWdlIG1hcHBpbmdzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcF9mYWlsdXJl
czsKK1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwX2ZhaWx1cmVzLCBDVExG
TEFHX1JELAorICAgICZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9u
IGZhaWx1cmVzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcHJvbW90aW9uczsKK1NZU0NU
TF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwcm9tb3Rpb25zLCBDVExGTEFHX1JELAor
ICAgICZwbWFwX3BkZV9wcm9tb3Rpb25zLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9ucyIpOworCisv
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBM
b3cgbGV2ZWwgaGVscGVyIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglTTVAKK3N0YXRpYyBfX2lubGlu
ZSB2b2lkCitwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcF90IHBtYXAsIHZvaWQgKCpmbiko
dm9pZCAqKSwgdm9pZCAqYXJnKQoreworCWludAljcHVpZCwgY3B1LCBzZWxmOworCWNwdXNldF90
IGFjdGl2ZV9jcHVzOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXAp
KSB7CisJCXNtcF9yZW5kZXp2b3VzKE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCQlnb3RvIG91dDsK
Kwl9CisJLyogRm9yY2UgQVNJRCB1cGRhdGUgb24gaW5hY3RpdmUgQ1BVcyAqLworCUNQVV9GT1JF
QUNIKGNwdSkgeworCQlpZiAoIUNQVV9JU1NFVChjcHUsICZwbWFwLT5wbV9hY3RpdmUpKQorCQkJ
cG1hcC0+cG1fYXNpZFtjcHVdLmdlbiA9IDA7CisJfQorCWNwdWlkID0gUENQVV9HRVQoY3B1aWQp
OworCS8qCisJICogWFhYOiBiYXJyaWVyL2xvY2tpbmcgZm9yIGFjdGl2ZT8KKwkgKgorCSAqIFRh
a2UgYSBzbmFwc2hvdCBvZiBhY3RpdmUgaGVyZSwgYW55IGZ1cnRoZXIgY2hhbmdlcyBhcmUgaWdu
b3JlZC4KKwkgKiB0bGIgdXBkYXRlL2ludmFsaWRhdGUgc2hvdWxkIGJlIGhhcm1sZXNzIG9uIGlu
YWN0aXZlIENQVXMKKwkgKi8KKwlhY3RpdmVfY3B1cyA9IHBtYXAtPnBtX2FjdGl2ZTsKKwlzZWxm
ID0gQ1BVX0lTU0VUKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCUNQVV9DTFIoY3B1aWQsICZhY3Rp
dmVfY3B1cyk7CisJLyogT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoaXMgY3B1IGlzIHRo
ZSBvbmx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAoQ1BVX0VNUFRZKCZhY3RpdmVfY3B1cykpIHsKKwkJ
aWYgKHNlbGYpCisJCQlmbihhcmcpOworCX0gZWxzZSB7CisJCWlmIChzZWxmKQorCQkJQ1BVX1NF
VChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsKKwkJc21wX3JlbmRlenZvdXNfY3B1cyhhY3RpdmVfY3B1
cywgTlVMTCwgZm4sIE5VTEwsIGFyZyk7CisJfQorb3V0OgorCXNjaGVkX3VucGluKCk7Cit9Cisj
ZWxzZSAvKiAhU01QICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29uX2FjdGl2
ZV9jcHVzKHBtYXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlp
bnQJY3B1aWQ7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJZm4oYXJnKTsKKwkJ
cmV0dXJuOworCX0KKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwlpZiAoIUNQVV9JU1NFVChj
cHVpZCwgJnBtYXAtPnBtX2FjdGl2ZSkpCisJCXBtYXAtPnBtX2FzaWRbY3B1aWRdLmdlbiA9IDA7
CisJZWxzZQorCQlmbihhcmcpOworfQorI2VuZGlmIC8qIFNNUCAqLworCitzdGF0aWMgdm9pZAor
cG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCkKK3sKKworCXBtYXBfY2FsbF9vbl9hY3Rp
dmVfY3B1cyhwbWFwLAorCSAgICAodm9pZCAoKikodm9pZCAqKSl0bGJfaW52YWxpZGF0ZV9hbGxf
dXNlciwgcG1hcCk7Cit9CisKK3N0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgeworCXBt
YXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworfTsKKworc3RhdGljIHZvaWQKK3BtYXBfaW52
YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpCit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0
ZV9wYWdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX2FkZHJlc3MocC0+cG1hcCwg
cC0+dmEpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcF90IHBt
YXAsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcg
YXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52YSA9IHZhOworCXBtYXBfY2FsbF9vbl9h
Y3RpdmVfY3B1cyhwbWFwLCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24sICZhcmcpOworfQor
CitzdHJ1Y3QgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1f
b2Zmc2V0X3Qgc3ZhOworCXZtX29mZnNldF90IGV2YTsKK307CisKK3N0YXRpYyB2b2lkCitwbWFw
X2ludmFsaWRhdGVfcmFuZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1hcF9pbnZh
bGlkYXRlX3JhbmdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHAtPnBt
YXAsIHAtPnN2YSwgcC0+ZXZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9y
YW5nZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEpCit7CisJ
c3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFw
OworCWFyZy5zdmEgPSBzdmE7CisJYXJnLmV2YSA9IGV2YTsKKwlwbWFwX2NhbGxfb25fYWN0aXZl
X2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbiwgJmFyZyk7Cit9CisKK3N0
cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1fb2Zmc2V0X3Qg
dmE7CisJcHRfZW50cnlfdCBwdGU7Cit9OworCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGFn
ZV9hY3Rpb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyAqcCA9
IGFyZzsKKworCXRsYl91cGRhdGUocC0+cG1hcCwgcC0+dmEsIHAtPnB0ZSk7Cit9CisKK3N0YXRp
YyB2b2lkCitwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcHRf
ZW50cnlfdCBwdGUpCit7CisJc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnIGFyZzsKKworCWFy
Zy5wbWFwID0gcG1hcDsKKwlhcmcudmEgPSB2YTsKKwlhcmcucHRlID0gcHRlOworCXBtYXBfY2Fs
bF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbiwgJmFyZyk7Cit9
CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfaW52YWxpZGF0ZShwbWFwX3QgcG1hcCwg
dm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgbmV3cGRlKQoreworCisJaWYgKCFwdGVfaXNfMW1f
c3VwZXJwYWdlKCZuZXdwZGUpKSB7CisJCS8qIERlbW90aW9uOiBmbHVzaCBhIHNwZWNpZmljIDJt
YiBwYWdlIG1hcHBpbmcuICovCisJCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsICh2YSAmIH5Q
RFJNQVNLKSwKKwkJICAgICh2YSAmIH5QRFJNQVNLKSArIE5CUERSKTsKKwl9IGVsc2UgaWYgKCFw
dGVfdGVzdCgmbmV3cGRlLCBQVEVfRykpIHsKKwkJLyoKKwkJICogUHJvbW90aW9uOiBmbHVzaCBl
dmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRMQgorCQkgKiBiZWNhdXNlIHRoZXJlIGFy
ZSB0b28gbWFueSB0byBmbHVzaCBpbmRpdmlkdWFsbHkuCisJCSAqLworCQl0bGJfaW52YWxpZGF0
ZV9hbGxfdXNlcihwbWFwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBQcm9tb3Rpb246IGZsdXNo
IGV2ZXJ5IDRLQiBwYWdlIG1hcHBpbmcgZnJvbSB0aGUgVExCLAorCQkgKiBpbmNsdWRpbmcgYW55
IGdsb2JhbCAoUFRFX0cpIG1hcHBpbmdzLgorCQkgKi8KKwkJdGxiX2ludmFsaWRhdGVfYWxsKCk7
CisJfQorfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJ
dm1fb2Zmc2V0X3QgdmE7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgbmV3cGRlOwor
fTsKKworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9hY3Rpb24odm9pZCAqYWN0KQorewor
CXN0cnVjdCBwbWFwX3VwZGF0ZV9wZGVfYXJnICphcmcgPSBhY3Q7CisKKwlwbWFwX3VwZGF0ZV9w
ZGVfaW52YWxpZGF0ZShhcmctPnBtYXAsIGFyZy0+dmEsIGFyZy0+bmV3cGRlKTsKK30KKworc3Rh
dGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9zdG9yZShwbWFwX3QgcG1hcCwgcGRfZW50cnlfdCAq
cGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKworCXBkZV9zdG9yZShwZGUsIG5ld3BkZSk7Cit9
CisKKworLyoKKyAqIENoYW5nZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgc3BlY2lmaWVkIHZpcnR1
YWwgYWRkcmVzcyBpbiBhIHdheSB0aGF0CisgKiBwcmV2ZW50cyBhbnkgcG9zc2liaWxpdHkgb2Yg
dGhlIFRMQiBldmVyIGhhdmluZyB0d28gZW50cmllcyB0aGF0IG1hcCB0aGUKKyAqIHNhbWUgdmly
dHVhbCBhZGRyZXNzIHVzaW5nIGRpZmZlcmVudCBwYWdlIHNpemVzLgorICovCitzdGF0aWMgdm9p
ZAorcG1hcF91cGRhdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlf
dCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2Fy
ZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJnLnBkZSA9IHBk
ZTsKKwlhcmcubmV3cGRlID0gbmV3cGRlOworCisJcG1hcF91cGRhdGVfcGRlX3N0b3JlKHBtYXAs
IHBkZSwgbmV3cGRlKTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1hcF91cGRh
dGVfcGRlX2FjdGlvbiwgJmFyZyk7Cit9CisKKy8qIC0tLSAqLworCisvKgorICoJUm91dGluZToJ
cG1hcF9leHRyYWN0CisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0IHRoZSBwaHlzaWNhbCBwYWdl
IGFkZHJlc3MgYXNzb2NpYXRlZAorICoJCXdpdGggdGhlIGdpdmVuIG1hcC92aXJ0dWFsX2FkZHJl
c3MgcGFpci4KKyAqLwordm1fcGFkZHJfdAorcG1hcF9leHRyYWN0KHBtYXBfdCBwbWFwLCB2bV9v
ZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCXZt
X29mZnNldF90IHBhOworCisJcGEgPSAwOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFw
X3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQlwYSA9
IFRMQkxPX1BERV9UT19QQSgqcGRlKSB8ICh2YSAmIFBEUk1BU0spOworCX0gZWxzZSB7CisJCXB0
ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwkJaWYgKHB0ZSkKKwkJCXBhID0gVExCTE9f
UFRFX1RPX1BBKCpwdGUpIHwgKHZhICYgUEFHRV9NQVNLKTsKKwl9CisJUE1BUF9VTkxPQ0socG1h
cCk7CisJcmV0dXJuIChwYSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX2V4dHJhY3RfYW5k
X2hvbGQKKyAqCUZ1bmN0aW9uOgorICoJCUF0b21pY2FsbHkgZXh0cmFjdCBhbmQgaG9sZCB0aGUg
cGh5c2ljYWwgcGFnZQorICoJCXdpdGggdGhlIGdpdmVuIHBtYXAgYW5kIHZpcnR1YWwgYWRkcmVz
cyBwYWlyCisgKgkJaWYgdGhhdCBtYXBwaW5nIHBlcm1pdHMgdGhlIGdpdmVuIHByb3RlY3Rpb24u
CisgKi8KK3ZtX3BhZ2VfdAorcG1hcF9leHRyYWN0X2FuZF9ob2xkKHBtYXBfdCBwbWFwLCB2bV9v
ZmZzZXRfdCB2YSwgdm1fcHJvdF90IHByb3QpCit7CisJcGRfZW50cnlfdCAqcGRlcDsKKwlwdF9l
bnRyeV90IHB0ZSwgKnB0ZXA7CisJdm1fcGFkZHJfdCBwYSwgcHRlX3BhOworCXZtX3BhZ2VfdCBt
OworCXZtX3BhZGRyX3QgcGRlX3BhOworCisJcGEgPSAwOworCW0gPSBOVUxMOworCVBNQVBfTE9D
SyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZXAg
IT0gTlVMTCAmJiAqcGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBk
ZXApKSB7CisJCQlpZiAoIXBkZV90ZXN0KHBkZXAsIFBURV9STykgfHwKKwkJCSAgICAocHJvdCAm
IFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJCQlwZGVfcGEgPSBUTEJMT19QREVfVE9fUEEoKnBk
ZXApIHwKKwkJCQkgICAgKHZhICYgUERSTUFTSyk7CisJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVs
b2NrKHBtYXAsIHBkZV9wYSwgJnBhKSkKKwkJCQkJZ290byByZXRyeTsKKwkJCQltID0gUEhZU19U
T19WTV9QQUdFKHBkZV9wYSk7CisJCQkJdm1fcGFnZV9ob2xkKG0pOworCQkJfQorCQl9IGVsc2Ug
eworCQkJcHRlcCA9IHBtYXBfcGRlX3RvX3B0ZShwZGVwLCB2YSk7CisJCQlpZiAocHRlcCAhPSBO
VUxMKSB7CisJCQkJcHRlID0gKnB0ZXA7CisJCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRlKSAmJgor
CQkJCSAgICAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJCQkgICAgKHByb3QgJiBWTV9Q
Uk9UX1dSSVRFKSA9PSAwKSkgeworCQkJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsK
KwkJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwKKwkJCQkJICAgICZw
YSkpCisJCQkJCQlnb3RvIHJldHJ5OworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHB0ZV9wYSk7
CisJCQkJCXZtX3BhZ2VfaG9sZChtKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJUEFfVU5MT0NL
X0NPTkQocGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAobSk7Cit9CisKKy8qLQor
ICoJUm91dGluZToJcG1hcF9rZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0cmFjdCB0aGUg
cGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl2aXJ0dWFsIGFkZHJlc3MuCisg
Ki8KK3ZtX3BhZGRyX3QKK3BtYXBfa2V4dHJhY3Qodm1fb2Zmc2V0X3QgdmEpCit7CisJaW50IG1h
cHBlZDsKKworCS8qCisJICogRmlyc3QsIHRoZSBkaXJlY3QtbWFwcGVkIHJlZ2lvbnMuCisJICov
CisJaWYgKHZhID49IE1JUFNfWEtQSFlTX1NUQVJUICYmIHZhIDwgTUlQU19YS1BIWVNfRU5EKQor
CQlyZXR1cm4gKE1JUFNfWEtQSFlTX1RPX1BIWVModmEpKTsKKworCWlmICh2YSA+PSBNSVBTX0tT
RUcwX1NUQVJUICYmIHZhIDwgTUlQU19LU0VHMF9FTkQpCisJCXJldHVybiAoTUlQU19LU0VHMF9U
T19QSFlTKHZhKSk7CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMV9TVEFSVCAmJiB2YSA8IE1JUFNf
S1NFRzFfRU5EKQorCQlyZXR1cm4gKE1JUFNfS1NFRzFfVE9fUEhZUyh2YSkpOworCisJLyoKKwkg
KiBVc2VyIHZpcnR1YWwgYWRkcmVzc2VzLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQURE
UkVTUykgeworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCWlm
IChjdXJwcm9jICYmIGN1cnByb2MtPnBfdm1zcGFjZSkgeworCQkJcGRlcCA9IHBtYXBfcGRlKCZj
dXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09IE5VTEwgfHwg
KnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18xbV9zdXBlcnBh
Z2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJCXJldHVybiAo
VExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spKTsKKwkJCX0K
KwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0ZXApIHsKKwkJ
CQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEgJiBQQUdFX01B
U0spKTsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNob3VsZCBi
ZSBrZXJuZWwgdmlydHVhbCBoZXJlLCBvdGhlcndpc2UgZmFpbAorCSAqLworCW1hcHBlZCA9ICh2
YSA+PSBNSVBTX0tTRUcyX1NUQVJUIHx8IHZhIDwgTUlQU19LU0VHMl9FTkQpOworCW1hcHBlZCA9
IG1hcHBlZCB8fCAodmEgPj0gTUlQU19YS1NFR19TVEFSVCB8fCB2YSA8IE1JUFNfWEtTRUdfRU5E
KTsKKwkvKgorCSAqIEtlcm5lbCB2aXJ0dWFsLgorCSAqLworCisJaWYgKG1hcHBlZCkgeworCQlw
ZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCS8qIElzIHRoZSBrZXJu
ZWwgcG1hcCBpbml0aWFsaXplZD8gKi8KKwkJaWYgKCFDUFVfRU1QVFkoJmtlcm5lbF9wbWFwLT5w
bV9hY3RpdmUpKSB7CisJCQkvKiBJdCdzIGluc2lkZSB0aGUgdmlydHVhbCBhZGRyZXNzIHJhbmdl
ICovCisJCQlwZGVwID0gcG1hcF9wZGUoa2VybmVsX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09
IE5VTEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18x
bV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJ
CXJldHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0sp
KTsKKwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0
ZXApIHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEg
JiBQQUdFX01BU0spKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKDApOworCX0KKworCXBhbmljKCIl
cyBmb3IgdW5rbm93biBhZGRyZXNzIHNwYWNlICVwLiIsIF9fZnVuY19fLCAodm9pZCAqKXZhKTsK
K30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KgorICogTG93IGxldmVsIG1hcHBpbmcgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotCisgKiBhZGQgYSB3aXJl
ZCBwYWdlIHRvIHRoZSBrdmEKKyAqLwordm9pZAorcG1hcF9rZW50ZXJfYXR0cih2bV9vZmZzZXRf
dCB2YSwgdm1fcGFkZHJfdCBwYSwgaW50IGF0dHIpCit7CisJcHRfZW50cnlfdCAqcHRlOworCXB0
X2VudHJ5X3Qgb3B0ZSwgbnB0ZTsKKworI2lmZGVmIFBNQVBfREVCVUcKKwlwcmludGYoInBtYXBf
a2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZvaWQgKilwYSk7Cisj
ZW5kaWYKKworCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJb3B0ZSA9ICpwdGU7
CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVfUkVGIHwg
UFRFX1ZBTElEIHwgUFRFX0c7CisJcHRlX3N0b3JlKHB0ZSwgbnB0ZSk7CisJaWYgKHB0ZV9pc192
YWxpZCgmb3B0ZSkgJiYgb3B0ZSAhPSBucHRlKQorCQlwbWFwX3VwZGF0ZV9wYWdlKGtlcm5lbF9w
bWFwLCB2YSwgbnB0ZSk7Cit9CisKK3ZvaWQKK3BtYXBfa2VudGVyKHZtX29mZnNldF90IHZhLCB2
bV9wYWRkcl90IHBhKQoreworCisJS0FTU0VSVChpc19jYWNoZWFibGVfbWVtKHBhKSwKKwkJKCJw
bWFwX2tlbnRlcjogbWVtb3J5IGF0IDB4JWx4IGlzIG5vdCBjYWNoZWFibGUiLCAodV9sb25nKXBh
KSk7CisKKwlwbWFwX2tlbnRlcl9hdHRyKHZhLCBwYSwgUFRFX0NfQ0FDSEUpOworfQorCisvKi0K
KyAqIHJlbW92ZSBhIHBhZ2UgZnJvbSB0aGUga2VybmVsIHBhZ2V0YWJsZXMKKyAqLworIC8qIFBN
QVBfSU5MSU5FICovIHZvaWQKK3BtYXBfa3JlbW92ZSh2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9l
bnRyeV90ICpwdGU7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNhY2hlcyBmcm9tIHRoZSBw
YWdlIGJlaW5nIGRlc3Ryb3llZAorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4
KHZhLCBQQUdFX1NJWkUpOworCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKKwlw
dGVfc3RvcmUocHRlLCBQVEVfRyk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2Uoa2VybmVsX3BtYXAs
IHZhKTsKK30KKworLyoKKyAqCVVzZWQgdG8gbWFwIGEgcmFuZ2Ugb2YgcGh5c2ljYWwgYWRkcmVz
c2VzIGludG8ga2VybmVsCisgKgl2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJVGhlIHZh
bHVlIHBhc3NlZCBpbiAnKnZpcnQnIGlzIGEgc3VnZ2VzdGVkIHZpcnR1YWwgYWRkcmVzcyBmb3IK
KyAqCXRoZSBtYXBwaW5nLiBBcmNoaXRlY3R1cmVzIHdoaWNoIGNhbiBzdXBwb3J0IGEgZGlyZWN0
LW1hcHBlZAorICoJcGh5c2ljYWwgdG8gdmlydHVhbCByZWdpb24gY2FuIHJldHVybiB0aGUgYXBw
cm9wcmlhdGUgYWRkcmVzcworICoJd2l0aGluIHRoYXQgcmVnaW9uLCBsZWF2aW5nICcqdmlydCcg
dW5jaGFuZ2VkLiBPdGhlcgorICoJYXJjaGl0ZWN0dXJlcyBzaG91bGQgbWFwIHRoZSBwYWdlcyBz
dGFydGluZyBhdCAnKnZpcnQnIGFuZAorICoJdXBkYXRlICcqdmlydCcgd2l0aCB0aGUgZmlyc3Qg
dXNhYmxlIGFkZHJlc3MgYWZ0ZXIgdGhlIG1hcHBlZAorICoJcmVnaW9uLgorICoKKyAqCVVzZSBY
S1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfbWFwKHZtX29mZnNldF90
ICp2aXJ0LCB2bV9wYWRkcl90IHN0YXJ0LCB2bV9wYWRkcl90IGVuZCwgaW50IHByb3QpCit7CisK
KwlyZXR1cm4gKE1JUFNfUEhZU19UT19ESVJFQ1Qoc3RhcnQpKTsKK30KKworLyotCisgKiBBZGQg
YSBsaXN0IG9mIHdpcmVkIHBhZ2VzIHRvIHRoZSBrdmEKKyAqIHRoaXMgcm91dGluZSBpcyBvbmx5
IHVzZWQgZm9yIHRlbXBvcmFyeQorICoga2VybmVsIG1hcHBpbmdzIHRoYXQgZG8gbm90IG5lZWQg
dG8gaGF2ZQorICogcGFnZSBtb2RpZmljYXRpb24gb3IgcmVmZXJlbmNlcyByZWNvcmRlZC4KKyAq
IE5vdGUgdGhhdCBvbGQgbWFwcGluZ3MgYXJlIHNpbXBseSB3cml0dGVuCisgKiBvdmVyLiAgVGhl
IHBhZ2UgKm11c3QqIGJlIHdpcmVkLgorICovCit2b2lkCitwbWFwX3FlbnRlcih2bV9vZmZzZXRf
dCB2YSwgdm1fcGFnZV90ICptLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdm1fb2Zmc2V0X3Qg
b3JpZ3ZhID0gdmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwbWFwX2Zs
dXNoX3B2Y2FjaGUobVtpXSk7CisJCXBtYXBfa2VudGVyKHZhLCBWTV9QQUdFX1RPX1BIWVMobVtp
XSkpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2Vf
aW5kZXgob3JpZ3ZhLCBQQUdFX1NJWkUqY291bnQpOworfQorCisvKi0KKyAqIFRoaXMgcm91dGlu
ZSBqZXJrcyBwYWdlIG1hcHBpbmdzIGZyb20gdGhlCisgKiBrZXJuZWwgLS0gaXQgaXMgbWVhbnQg
b25seSBmb3IgdGVtcG9yYXJ5IG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3FyZW1vdmUodm1f
b2Zmc2V0X3QgdmEsIGludCBjb3VudCkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1fb2Zmc2V0
X3Qgb3JpZ3ZhOworCisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuOworCW1pcHNfZGNhY2hlX3di
aW52X3JhbmdlX2luZGV4KHZhLCBQQUdFX1NJWkUgKiBjb3VudCk7CisJb3JpZ3ZhID0gdmE7CisJ
ZG8geworCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOworCQlwdGVfc3RvcmUocHRl
LCBQVEVfRyk7CisJCXZhICs9IFBBR0VfU0laRTsKKwl9IHdoaWxlICgtLWNvdW50ID4gMCk7CisJ
cG1hcF9pbnZhbGlkYXRlX3JhbmdlKGtlcm5lbF9wbWFwLCBvcmlndmEsIHZhKTsKK30KKworLyoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGFn
ZSB0YWJsZSBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSB2b2lk
CitwbWFwX2ZyZWVfemVyb19wYWdlcyhzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwl2bV9wYWdl
X3QgbTsKKworCXdoaWxlICgobSA9IFNMSVNUX0ZJUlNUKGZyZWUpKSAhPSBOVUxMKSB7CisJCVNM
SVNUX1JFTU9WRV9IRUFEKGZyZWUsIHBsaW5rcy5zLnNzKTsKKwkJLyogUHJlc2VydmUgdGhlIHBh
Z2UncyBQR19aRVJPIHNldHRpbmcuICovCisJCXZtX3BhZ2VfZnJlZV90b3EobSk7CisJfQorfQor
CisvKi0KKyAqIFNjaGVkdWxlIHRoZSBzcGVjaWZpZWQgdW51c2VkIHBhZ2UgdGFibGUgcGFnZSB0
byBiZSBmcmVlZC4gIFNwZWNpZmljYWxseQorICogYWRkIHRoZSBwYWdlIHRvIHRoZSBzcGVjaWZp
ZWQgbGlzdCBvZiBwYWdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlCisgKiBwaHlzaWNh
bCBtZW1vcnkgbWFuYWdlciBhZnRlciB0aGUgVExCIGhhcyBiZWVuIHVwZGF0ZWQuCisgKi8KK3N0
YXRpYyBfX2lubGluZSB2b2lkCitwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdCh2bV9wYWdlX3Qg
bSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsCisgICAgYm9vbGVhbl90IHNldF9QR19aRVJPKQorewor
CisJaWYgKHNldF9QR19aRVJPKQorCQltLT5mbGFncyB8PSBQR19aRVJPOworCWVsc2UKKwkJbS0+
ZmxhZ3MgJj0gflBHX1pFUk87CisJU0xJU1RfSU5TRVJUX0hFQUQoZnJlZSwgbSwgcGxpbmtzLnMu
c3MpOworfQorCisvKgorICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBp
bnRvIHRoZSBzcGVjaWZpZWQgcG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJs
ZSBwYWdlcy4gIEVhY2ggb2YgYSBwbWFwJ3MgcGFnZSB0YWJsZSBwYWdlcyBpcyByZXNwb25zaWJs
ZQorICogZm9yIG1hcHBpbmcgYSBkaXN0aW5jdCByYW5nZSBvZiB2aXJ0dWFsIGFkZHJlc3Nlcy4g
IFRoZSBwbWFwJ3MgY29sbGVjdGlvbiBpcworICogb3JkZXJlZCBieSB0aGlzIHZpcnR1YWwgYWRk
cmVzcyByYW5nZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcG1hcF9pbnNlcnRfcHRfcGFn
ZShwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG1wdGUpCit7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBt
YXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2luc2VydCgmcG1hcC0+cG1fcm9vdCwg
bXB0ZSkpOworfQorCisvKgorICogTG9va3MgZm9yIGEgcGFnZSB0YWJsZSBwYWdlIG1hcHBpbmcg
dGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlCisgKiBzcGVjaWZpZWQgcG1hcCdz
IGNvbGxlY3Rpb24gb2YgaWRsZSBwYWdlIHRhYmxlIHBhZ2VzLiAgUmV0dXJucyBOVUxMIGlmIHRo
ZXJlCisgKiBpcyBubyBwYWdlIHRhYmxlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lm
aWVkIHZpcnR1YWwgYWRkcmVzcy4KKyAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdAorcG1h
cF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisKKwlQTUFQ
X0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2xvb2t1cCgm
cG1hcC0+cG1fcm9vdCwgcG1hcF9wZGVfcGluZGV4KHZhKSkpOworfQorCisvKgorICogUmVtb3Zl
cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBmcm9tIHRoZSBzcGVjaWZpZWQgcG1hcCdz
IGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdlcy4gIFRoZSBzcGVjaWZpZWQg
cGFnZSB0YWJsZSBwYWdlIG11c3QgYmUgYSBtZW1iZXIgb2YKKyAqIHRoZSBwbWFwJ3MgY29sbGVj
dGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVtb3ZlX3B0X3BhZ2UocG1h
cF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBN
QV9PV05FRCk7CisJdm1fcmFkaXhfcmVtb3ZlKCZwbWFwLT5wbV9yb290LCBtcHRlLT5waW5kZXgp
OworfQorCisvKgorICogRGVjcmVtZW50cyBhIHBhZ2UgdGFibGUgcGFnZSdzIHdpcmUgY291bnQs
IHdoaWNoIGlzIHVzZWQgdG8gcmVjb3JkIHRoZQorICogbnVtYmVyIG9mIHZhbGlkIHBhZ2UgdGFi
bGUgZW50cmllcyB3aXRoaW4gdGhlIHBhZ2UuICBJZiB0aGUgd2lyZSBjb3VudAorICogZHJvcHMg
dG8gemVybywgdGhlbiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIHVubWFwcGVkLiAgUmV0dXJucyBU
UlVFIGlmIHRoZQorICogcGFnZSB0YWJsZSBwYWdlIHdhcyB1bm1hcHBlZCBhbmQgRkFMU0Ugb3Ro
ZXJ3aXNlLgorICovCitzdGF0aWMgUE1BUF9JTkxJTkUgYm9vbGVhbl90CitwbWFwX3Vud2lyZV9w
dHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgc3RydWN0IHNwZ2xp
c3QgKmZyZWUpCit7CisKKwktLW0tPndpcmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291bnQgPT0g
MCkgeworCQlfcG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtLCBmcmVlKTsKKwkJcmV0dXJuIChU
UlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkCitfcG1h
cF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHN0
cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcDsKKwl2bV9wYWdl
X3QgcGRwZzsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCS8qCisJICog
dW5tYXAgdGhlIHBhZ2UgdGFibGUgcGFnZQorCSAqLworCWlmIChtLT5waW5kZXggPCBOVVBERSkg
eworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFwX3Jlc2lk
ZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBkZWNyZW1l
bnQgbmV4dCBsZXZlbCBwYWdldGFibGUgcmVmY291bnQKKwkJICovCisJCXBkcCA9IChwZF9lbnRy
eV90ICopKnBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJcGRwZyA9IFBIWVNfVE9fVk1fUEFHRShN
SVBTX0RJUkVDVF9UT19QSFlTKHBkcCkpOworCQlwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEsIHBk
cGcsIGZyZWUpOworCX0gZWxzZSB7CisJCXBkZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJ
KnBkZSA9IDA7CisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCX0KKworCS8q
CisJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1wbHkgZnJlZSBpdC4KKwkg
KiBUaGlzIGlzIGEgcmVsZWFzZSBzdG9yZSBzbyB0aGF0IHRoZSBvcmRpbmFyeSBzdG9yZSB1bm1h
cHBpbmcKKwkgKiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIGdsb2JhbGx5IHBlcmZvcm1lZCBiZWZv
cmUgVExCIHNob290LQorCSAqIGRvd24gaXMgYmVndW4uCisJICovCisJYXRvbWljX3N1YnRyYWN0
X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisKKwkvKgorCSAqIFB1dCBwYWdlIG9uIGEg
bGlzdCBzbyB0aGF0IGl0IGlzIHJlbGVhc2VkIGFmdGVyCisJICogKkFMTCogVExCIHNob290ZG93
biBpcyBkb25lLgorCSAqLworCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG0sIGZyZWUsIFRS
VUUpOworfQorCisvKgorICogQWZ0ZXIgcmVtb3ZpbmcgYSBwYWdlIHRhYmxlIGVudHJ5LCB0aGlz
IHJvdXRpbmUgaXMgdXNlZCB0bworICogY29uZGl0aW9uYWxseSBmcmVlIHRoZSBwYWdlLCBhbmQg
bWFuYWdlIHRoZSBob2xkL3dpcmUgY291bnRzLgorICovCitzdGF0aWMgaW50CitwbWFwX3VudXNl
X3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlfdCBwdGVwZGUsCisgICAg
c3RydWN0IHNwZ2xpc3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG1wdGU7CisKKwlpZiAodmEgPj0g
Vk1fTUFYVVNFUl9BRERSRVNTKQorCQlyZXR1cm4gKDApOworCUtBU1NFUlQocHRlcGRlICE9IDAs
ICgicG1hcF91bnVzZV9wdDogcHRlcGRlICE9IDAiKSk7CisJbXB0ZSA9IFBIWVNfVE9fVk1fUEFH
RShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZXBkZSkpOworCXJldHVybiAocG1hcF91bndpcmVfcHRw
KHBtYXAsIHZhLCBtcHRlLCBmcmVlKSk7Cit9CisKK3ZvaWQKK3BtYXBfcGluaXQwKHBtYXBfdCBw
bWFwKQoreworCWludCBpOworCisJUE1BUF9MT0NLX0lOSVQocG1hcCk7CisJcG1hcC0+cG1fc2Vn
dGFiID0ga2VybmVsX3NlZ21hcDsKKwlDUFVfWkVSTygmcG1hcC0+cG1fYWN0aXZlKTsKKwlmb3Ig
KGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNpZFtpXS5hc2lkID0gUE1B
UF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9IDA7CisJfQorCVBDUFVf
U0VUKGN1cnBtYXAsIHBtYXApOworCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2Y2h1bmspOworCWJ6
ZXJvKCZwbWFwLT5wbV9zdGF0cywgc2l6ZW9mIHBtYXAtPnBtX3N0YXRzKTsKK30KKwordm9pZAor
cG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKCkKK3sKKworCXZtX3BhZ2VvdXRfZ3Jvd19jYWNo
ZSgzLCAwLCBNSVBTX1hLUEhZU19MQVJHRVNUX1BIWVMpOworfQorCitzdGF0aWMgdm1fcGFnZV90
CitwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJlcSkKK3sK
Kwl2bV9wYWdlX3QgbTsKKworCW0gPSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZSRUVMSVNU
X0RJUkVDVCwgcmVxIHwgVk1fQUxMT0NfV0lSRUQgfAorCSAgICBWTV9BTExPQ19aRVJPKTsKKwlp
ZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKChtLT5mbGFncyAmIFBHX1pF
Uk8pID09IDApCisJCXBtYXBfemVyb19wYWdlKG0pOworCisJbS0+cGluZGV4ID0gaW5kZXg7CisJ
cmV0dXJuIChtKTsKK30KKworLyotCisgKiBJbml0aWFsaXplIGEgcHJlYWxsb2NhdGVkIGFuZCB6
ZXJvZWQgcG1hcCBzdHJ1Y3R1cmUsCisgKiBzdWNoIGFzIG9uZSBpbiBhIHZtc3BhY2Ugc3RydWN0
dXJlLgorICovCitpbnQKK3BtYXBfcGluaXQocG1hcF90IHBtYXApCit7CisJdm1fb2Zmc2V0X3Qg
cHRkdmE7CisJdm1fcGFnZV90IHB0ZHBnOworCWludCBpOworCisJLyoKKwkgKiBhbGxvY2F0ZSB0
aGUgcGFnZSBkaXJlY3RvcnkgcGFnZQorCSAqLworCXdoaWxlICgocHRkcGcgPSBwbWFwX2FsbG9j
X2RpcmVjdF9wYWdlKE5VU0VSUEdUQkxTLCBWTV9BTExPQ19OT09CSiB8CisJICAgIFZNX0FMTE9D
X05PUk1BTCkpID09IE5VTEwpIHsKKwkgICAgICAgcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hl
KCk7CisJfQorCisJcHRkdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyhw
dGRwZykpOworCXBtYXAtPnBtX3NlZ3RhYiA9IChwZF9lbnRyeV90ICopcHRkdmE7CisJQ1BVX1pF
Uk8oJnBtYXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJ
CXBtYXAtPnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1f
YXNpZFtpXS5nZW4gPSAwOworCX0KKwlUQUlMUV9JTklUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwli
emVybygmcG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5wbV9zdGF0cyk7CisKKwlyZXR1cm4g
KDEpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgZGVzaXJlZCBw
YWdlIHRhYmxlIHBhZ2UgZG9lcyBub3QgZXhpc3QuCisgKi8KK3N0YXRpYyB2bV9wYWdlX3QKK19w
bWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIHN0cnVjdCByd2xv
Y2sgKipsb2NrcCkKK3sKKwl2bV9vZmZzZXRfdCBwYWdldmE7CisJdm1fcGFnZV90IG07CisKKwlQ
TUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKworCS8qCisJICogRmluZCBvciBmYWJy
aWNhdGUgYSBuZXcgcGFnZXRhYmxlIHBhZ2UKKwkgKi8KKwlpZiAoKG0gPSB2bV9wYWdlX2FsbG9j
KE5VTEwsIHB0ZXBpbmRleCwgVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfTk9PQkog
fCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pKSA9PSBOVUxMKSB7CisJCWlmIChsb2Nr
cCAhPSBOVUxMKSB7CisJCQlSRUxFQVNFX1BWX0xJU1RfTE9DSyhsb2NrcCk7CisJCQlQTUFQX1VO
TE9DSyhwbWFwKTsKKwkJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlWTV9XQUlU
OworCQkJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJ
CX0KKworCQkvKgorCQkgKiBJbmRpY2F0ZSB0aGUgbmVlZCB0byByZXRyeS4JV2hpbGUgd2FpdGlu
ZywgdGhlIHBhZ2UKKwkJICogdGFibGUgcGFnZSBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKwkJ
ICovCisJCXJldHVybiAoTlVMTCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAw
KQorCQlwbWFwX3plcm9fcGFnZShtKTsKKworCS8qCisJICogTWFwIHRoZSBwYWdldGFibGUgcGFn
ZSBpbnRvIHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UsIGlmIGl0CisJICogaXNuJ3QgYWxyZWFk
eSB0aGVyZS4KKwkgKi8KKwlwYWdldmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9f
UEhZUyhtKSk7CisKKwlpZiAocHRlcGluZGV4ID49IE5VUERFKSB7CisJCXBtYXAtPnBtX3NlZ3Rh
YltwdGVwaW5kZXggLSBOVVBERV0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfSBlbHNlIHsKKwkJ
cGRfZW50cnlfdCAqcGRlcCwgKnBkZTsKKwkJaW50IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChT
RUdTSElGVCAtIFBEUlNISUZUKTsKKwkJaW50IHBkZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQ
RyAtIDEpOworCQl2bV9wYWdlX3QgcGc7CisKKwkJcGRlcCA9ICZwbWFwLT5wbV9zZWd0YWJbc2Vn
aW5kZXhdOworCQlpZiAoKnBkZXAgPT0gTlVMTCkgeworCQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBh
IG5ldyBwZCwgcmVjdXJzZSAqLworCQkJaWYgKF9wbWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsg
c2VnaW5kZXgsCisJCQkgICAgbG9ja3ApID09IE5VTEwpIHsKKwkJCQkvKiBhbGxvYyBmYWlsZWQs
IHJlbGVhc2UgY3VycmVudCAqLworCQkJCS0tbS0+d2lyZV9jb3VudDsKKwkJCQlhdG9taWNfc3Vi
dHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJCQl2bV9wYWdlX2ZyZWVfemVy
byhtKTsKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQWRkIHJl
ZmVyZW5jZSB0byB0aGUgcGQgcGFnZSAqLworCQkJcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19E
SVJFQ1RfVE9fUEhZUygqcGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkvKiBO
ZXh0IGxldmVsIGVudHJ5ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBkZVtw
ZGVpbmRleF0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfQorCisJcG1hcF9yZXNpZGVudF9jb3Vu
dF9pbmMocG1hcCwgMSk7CisKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgdm1fcGFnZV90Citw
bWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0IHJ3bG9jayAq
KmxvY2twKQoreworCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwlwZF9lbnRyeV90ICpwZDsKKwl2bV9w
YWdlX3QgbTsKKworCS8qCisJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CisJICov
CisJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKK3JldHJ5OgorCS8qCisJICogR2V0
IHRoZSBwYWdlIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCXBkID0gcG1hcF9wZGUocG1hcCwgdmEp
OworCisJLyoKKwkgKiBUaGlzIHN1cHBvcnRzIHN3aXRjaGluZyBmcm9tIGEgMk1CIHBhZ2UgdG8g
YQorCSAqIG5vcm1hbCA0SyBwYWdlLgorCSAqLworCWlmIChwZCAhPSBOVUxMICYmIChwZGVfaXNf
MW1fc3VwZXJwYWdlKHBkKSAmJgorCSAgICBwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZCkp
KSB7CisJCSBpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGQsIHZhLCBsb2NrcCkp
IHsKKwkJCSAvKgorCQkJICAqIEludmFsaWRhdGlvbiBvZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBt
YXkgaGF2ZSBjYXVzZWQKKwkJCSAgKiB0aGUgZGVhbGxvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5n
IFBEIHBhZ2UuCisJCQkgICovCisJCQkgcGQgPSBOVUxMOworCQkgfQorCX0KKworCS8qCisJICog
SWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QgaW5jcmVtZW50IHRoZSBo
b2xkCisJICogY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkgKi8KKwlpZiAocGQgIT0gTlVMTCAm
JiAqcGQgIT0gTlVMTCkgeworCQltID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BI
WVMoKHB0X2VudHJ5X3QpKnBkKSk7CisJCW0tPndpcmVfY291bnQrKzsKKwl9IGVsc2UgeworCQkv
KgorCQkgKiBIZXJlIGlmIHRoZSBwdGUgcGFnZSBpc24ndCBtYXBwZWQsIG9yIGlmIGl0IGhhcyBi
ZWVuCisJCSAqIGRlYWxsb2NhdGVkLgorCQkgKi8KKwkJbSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAs
IHB0ZXBpbmRleCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMICYmIGxvY2twICE9IE5VTEwpCisJ
CQlnb3RvIHJldHJ5OworCX0KKwlyZXR1cm4gKG0pOworfQorCisvKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbWFwIGFsbG9jYXRpb24vZGVh
bGxvY2F0aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKi8KKworLyotCisgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgaGVsZCBi
eSB0aGUgZ2l2ZW4gcGh5c2ljYWwgbWFwLgorICogQ2FsbGVkIHdoZW4gYSBwbWFwIGluaXRpYWxp
emVkIGJ5IHBtYXBfcGluaXQgaXMgYmVpbmcgcmVsZWFzZWQuCisgKiBTaG91bGQgb25seSBiZSBj
YWxsZWQgaWYgdGhlIG1hcCBjb250YWlucyBubyB2YWxpZCBtYXBwaW5ncy4KKyAqLwordm9pZAor
cG1hcF9yZWxlYXNlKHBtYXBfdCBwbWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3Bh
Z2VfdCBwdGRwZzsKKworCUtBU1NFUlQocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPT0g
MCwKKwkgICAgKCJwbWFwX3JlbGVhc2U6IHBtYXAgcmVzaWRlbnQgY291bnQgJWxkICE9IDAiLAor
CSAgICBwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCkpOworCisJLyoKKwkgKiBJbnZhbGlk
YXRlIGFueSBsZWZ0IFRMQiBlbnRyaWVzLCB0byBhbGxvdyB0aGUgcmV1c2UKKwkgKiBvZiB0aGUg
YXNpZC4KKwkgKi8KKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCisJcHRkdmEgPSAodm1f
b2Zmc2V0X3QpcG1hcC0+cG1fc2VndGFiOworCXB0ZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNf
RElSRUNUX1RPX1BIWVMocHRkdmEpKTsKKworCXB0ZHBnLT53aXJlX2NvdW50LS07CisJYXRvbWlj
X3N1YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJdm1fcGFnZV9mcmVlX3pl
cm8ocHRkcGcpOworfQorCisvKi0KKyAqIGdyb3cgdGhlIG51bWJlciBvZiBrZXJuZWwgcGFnZSB0
YWJsZSBlbnRyaWVzLCBpZiBuZWVkZWQKKyAqLwordm9pZAorcG1hcF9ncm93a2VybmVsKHZtX29m
ZnNldF90IGFkZHIpCit7CisJdm1fcGFnZV90IG5rcGc7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRw
ZTsKKwlwdF9lbnRyeV90ICpwdGU7CisJaW50IGk7CisKKwltdHhfYXNzZXJ0KCZrZXJuZWxfbWFw
LT5zeXN0ZW1fbXR4LCBNQV9PV05FRCk7CisJYWRkciA9IHJvdW5kdXAyKGFkZHIsIE5CU0VHKTsK
KwlpZiAoYWRkciAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkKKwkJYWRkciA9IGtlcm5l
bF9tYXAtPm1heF9vZmZzZXQ7CisJd2hpbGUgKGtlcm5lbF92bV9lbmQgPCBhZGRyKSB7CisJCXBk
cGUgPSBwbWFwX3NlZ21hcChrZXJuZWxfcG1hcCwga2VybmVsX3ZtX2VuZCk7CisJCWlmICgqcGRw
ZSA9PSAwKSB7CisJCQkvKiBuZXcgaW50ZXJtZWRpYXRlIHBhZ2UgdGFibGUgZW50cnkgKi8KKwkJ
CW5rcGcgPSB2bV9wYWdlX2FsbG9jKE5VTEwsIG5rcHQsIFZNX0FMTE9DX0lOVEVSUlVQVCB8CisJ
CQkgICAgVk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOwor
CQkJaWYgKG5rcGcgPT0gTlVMTCkKKwkJCQlwYW5pYygiJXM6IG5vIG1lbW9yeSB0byBncm93IGtl
cm5lbCIsIF9fZnVuY19fKTsKKwkJCSpwZHBlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJ
UkVDVCgKKwkJCSAgICBWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCQkJY29udGludWU7IC8qIHRy
eSBhZ2FpbiAqLworCQl9CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwga2VybmVsX3Zt
X2VuZCk7CisJCWlmICgqcGRlICE9IDApIHsKKwkJCWtlcm5lbF92bV9lbmQgPSAoa2VybmVsX3Zt
X2VuZCArIE5CUERSKSAmIH5QRFJNQVNLOworCQkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtl
cm5lbF9tYXAtPm1heF9vZmZzZXQpIHsKKwkJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+
bWF4X29mZnNldDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoK
KwkJICogVGhpcyBpbmRleCBpcyBib2d1cywgYnV0IG91dCBvZiB0aGUgd2F5CisJCSAqLworCQlu
a3BnID0gdm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQgfAorCQkg
ICAgVk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQlp
ZiAoIW5rcGcpCisJCQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8gZ3JvdyBr
ZXJuZWwiKTsKKwkJbmtwdCsrOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJ
UkVDVChWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCisJCS8qCisJCSAqIFRoZSBSWzQtN10/MDAg
c3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2JhbCBiaXQgaW4KKwkJICogdGhlIHRyYW5z
bGF0aW9uIGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LgorCQkgKiBUaHVz
IGludmFsaWQgZW50cnlzIG11c3QgaGF2ZSB0aGUgR2xvYmFsIGJpdCBzZXQgc28gd2hlbgorCQkg
KiBFbnRyeSBMTyBhbmQgRW50cnkgSEkgRyBiaXRzIGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdp
bGwKKwkJICogcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUgaW4gdGhlIHRsYi4KKwkJICov
CisJCXB0ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwkJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsg
aSsrKQorCQkJcHRlW2ldID0gUFRFX0c7CisKKwkJa2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1f
ZW5kICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmIChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJu
ZWxfbWFwLT5tYXhfb2Zmc2V0KSB7CisJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4
X29mZnNldDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYWdlIG1hbmFnZW1lbnQgcm91dGlu
ZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
LworCitDVEFTU0VSVChzaXplb2Yoc3RydWN0IHB2X2NodW5rKSA9PSBQQUdFX1NJWkUpOworQ1RB
U1NFUlQoX05QQ00gPT0gMyk7CitDVEFTU0VSVChfTlBDUFYgPT0gMTY4KTsKKworc3RhdGljIF9f
aW5saW5lIHN0cnVjdCBwdl9jaHVuayAqCitwdl90b19jaHVuayhwdl9lbnRyeV90IHB2KQorewor
CisJcmV0dXJuICgoc3RydWN0IHB2X2NodW5rICopKCh1aW50cHRyX3QpcHYgJiB+KHVpbnRwdHJf
dClQQUdFX01BU0spKTsKK30KKworI2RlZmluZSBQVl9QTUFQKHB2KSAocHZfdG9fY2h1bmsocHYp
LT5wY19wbWFwKQorCisjZGVmaW5lCVBDX0ZSRUUwCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVm
aW5lCVBDX0ZSRUUxCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBDX0ZSRUUyCTB4MDAw
MDAwZmZmZmZmZmZmZnVsCisKK3N0YXRpYyBjb25zdCB1X2xvbmcgcGNfZnJlZW1hc2tbX05QQ01d
ID0geyBQQ19GUkVFMCwgUENfRlJFRTEsIFBDX0ZSRUUyIH07CisKKyNpZmRlZiBQVl9TVEFUUwor
c3RhdGljIGludCBwY19jaHVua19jb3VudCwgcGNfY2h1bmtfYWxsb2NzLCBwY19jaHVua19mcmVl
cywgcGNfY2h1bmtfdHJ5ZmFpbDsKKworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBj
X2NodW5rX2NvdW50LCBDVExGTEFHX1JELCAmcGNfY2h1bmtfY291bnQsIDAsCisgICAgIkN1cnJl
bnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5rcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lE
X0FVVE8sIHBjX2NodW5rX2FsbG9jcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2FsbG9jcywgMCwK
KyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkgY2h1bmtzIGFsbG9jYXRlZCIpOworU1lT
Q1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX2ZyZWVzLCBDVExGTEFHX1JELCAm
cGNfY2h1bmtfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5r
cyBmcmVlcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX3RyeWZh
aWwsIENUTEZMQUdfUkQsICZwY19jaHVua190cnlmYWlsLCAwLAorICAgICJOdW1iZXIgb2YgdGlt
ZXMgdHJpZWQgdG8gZ2V0IGEgY2h1bmsgcGFnZSBidXQgZmFpbGVkLiIpOworCitzdGF0aWMgbG9u
ZyBwdl9lbnRyeV9jb3VudCwgcHZfZW50cnlfZnJlZXMsIHB2X2VudHJ5X2FsbG9jczsKK3N0YXRp
YyBpbnQgcHZfZW50cnlfc3BhcmU7CisKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVUTywg
cHZfZW50cnlfZnJlZXMsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9mcmVlcywgMCwKKyAgICAiQ3Vy
cmVudCBudW1iZXIgb2YgcHYgZW50cnkgZnJlZXMiKTsKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBP
SURfQVVUTywgcHZfZW50cnlfYWxsb2NzLCBDVExGTEFHX1JELCAmcHZfZW50cnlfYWxsb2NzLCAw
LAorICAgICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBhbGxvY3MiKTsKK1NZU0NUTF9MT05H
KF92bV9wbWFwLCBPSURfQVVUTywgcHZfZW50cnlfY291bnQsIENUTEZMQUdfUkQsICZwdl9lbnRy
eV9jb3VudCwgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cmllcyIpOworU1lTQ1RM
X0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X3NwYXJlLCBDVExGTEFHX1JELCAmcHZf
ZW50cnlfc3BhcmUsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHNwYXJlIHB2IGVudHJpZXMi
KTsKKyNlbmRpZgorCisvKgorICogV2UgYXJlIGluIGEgc2VyaW91cyBsb3cgbWVtb3J5IGNvbmRp
dGlvbi4gIFJlc29ydCB0bworICogZHJhc3RpYyBtZWFzdXJlcyB0byBmcmVlIHNvbWUgcGFnZXMg
c28gd2UgY2FuIGFsbG9jYXRlCisgKiBhbm90aGVyIHB2IGVudHJ5IGNodW5rLgorICoKKyAqIFJl
dHVybnMgTlVMTCBpZiBQViBlbnRyaWVzIHdlcmUgcmVjbGFpbWVkIGZyb20gdGhlIHNwZWNpZmll
ZCBwbWFwLgorICoKKyAqIFdlIGRvIG5vdCwgaG93ZXZlciwgdW5tYXAgMm1wYWdlcyBiZWNhdXNl
IHN1YnNlcXVlbnQgYWNjZXNzIHdpbGwKKyAqIGFsbG9jYXRlIHBlci1wYWdlIHB2IGVudHJpZXMg
dW50aWwgcmVwcm9tb3Rpb24gb2NjdXJzLCB0aGVyZWJ5CisgKiBleGFjZXJiYXRpbmcgdGhlIHNo
b3J0YWdlIG9mIGZyZWUgcHYgZW50cmllcy4KKyAqLworc3RhdGljIHZtX3BhZ2VfdAorcmVjbGFp
bV9wdl9jaHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sK
KwlzdHJ1Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJcGRfZW50cnlf
dCAqcGRlOworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgb2xkcHRlOworCXB2X2Vu
dHJ5X3QgcHY7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFnZV90IG0sIG1fcGM7CisJc3RydWN0
IHNwZ2xpc3QgZnJlZTsKKwl1aW50NjRfdCBpbnVzZTsKKwlpbnQgYml0LCBmaWVsZCwgZnJlZWQs
IGlkeDsKKworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBf
TE9DS19BU1NFUlQobG9ja2VkX3BtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2twICE9IE5V
TEwsICgicmVjbGFpbV9wdl9jaHVuazogbG9ja3AgaXMgTlVMTCIpKTsKKwlwbWFwID0gTlVMTDsK
KwltX3BjID0gTlVMTDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlUQUlMUV9JTklUKCZuZXdfdGFp
bCk7CisJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJd2hpbGUgKChwYyA9IFRBSUxRX0ZJ
UlNUKCZwdl9jaHVua3MpKSAhPSBOVUxMICYmIFNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQlUQUlM
UV9SRU1PVkUoJnB2X2NodW5rcywgcGMsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2X2NodW5r
c19tdXRleCk7CisJCWlmIChwbWFwICE9IHBjLT5wY19wbWFwKSB7CisJCQlpZiAocG1hcCAhPSBO
VUxMKSB7CisJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQlpZiAocG1hcCAhPSBs
b2NrZWRfcG1hcCkKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQl9CisJCQlwbWFwID0gcGMt
PnBjX3BtYXA7CisJCQkvKiBBdm9pZCBkZWFkbG9jayBhbmQgbG9jayByZWN1cnNpb24uICovCisJ
CQlpZiAocG1hcCA+IGxvY2tlZF9wbWFwKSB7CisJCQkJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9j
a3ApOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCX0gZWxzZSBpZiAocG1hcCAhPSBsb2NrZWRf
cG1hcCAmJiAhUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJcG1hcCA9IE5VTEw7CisJCQkJVEFJ
TFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJCQltdHhfbG9jaygmcHZf
Y2h1bmtzX211dGV4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERl
c3Ryb3kgZXZlcnkgbm9uLXdpcmVkLCA0IEtCIHBhZ2UgbWFwcGluZyBpbiB0aGUgY2h1bmsuCisJ
CSAqLworCQlmcmVlZCA9IDA7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVs
ZCsrKSB7CisJCQlmb3IgKGludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tb
ZmllbGRdOworCQkJICAgIGludXNlICE9IDA7IGludXNlICY9IH4oMVVMIDw8IGJpdCkpIHsKKwkJ
CQliaXQgPSBmZnNsKGludXNlKSAtIDE7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2YoaW51c2Up
ICogTkJCWSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJCXZhID0g
cHYtPnB2X3ZhOworCQkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJCQlLQVNTRVJUKHBk
ZSAhPSBOVUxMICYmICpwZGUgIT0gMCwKKwkJCQkgICAgKCIlczogcGRlIiwgX19mdW5jX18pKTsK
KwkJCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlw
dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQlp
ZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoaXNf
a2VybmVsX3BtYXAocG1hcCkpCisJCQkJCSpwdGUgPSBQVEVfRzsKKwkJCQllbHNlCisJCQkJCSpw
dGUgPSAwOworCQkJCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRykpCisJCQkJCXBtYXBfaW52
YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BU
RV9UT19QQShvbGRwdGUpKTsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJ
CQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJCQl2
bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZt
LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJaWYg
KFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCSAgICAobS0+ZmxhZ3MgJiBQR19G
SUNUSVRJT1VTKSA9PSAwKSB7CisJCQkJCXN0cnVjdCBtZF9wYWdlICpwdmggPQorCQkJCQkgICAg
cGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZo
LT5wdl9saXN0KSkgeworCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLAorCQkJCQkJICAgIFBH
QV9XUklURUFCTEUpOworCQkJCQl9CisJCQkJfQorCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFV
TCA8PCBiaXQ7CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCB2YSwgKnBkZSwgJmZyZWUpOworCQkJ
CWZyZWVkKys7CisJCQl9CisJCX0KKwkJaWYgKGZyZWVkID09IDApIHsKKwkJCVRBSUxRX0lOU0VS
VF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211
dGV4KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEV2ZXJ5IGZyZWVkIG1hcHBpbmcgaXMgZm9y
IGEgNCBLQiBwYWdlLiAqLworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBmcmVlZCk7
CisJCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJ
UFZfU1RBVChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NU
QVQoYXRvbWljX3N1YnRyYWN0X2xvbmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlUQUlM
UV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJaWYgKHBjLT5wY19t
YXBbMF0gPT0gUENfRlJFRTAgJiYgcGMtPnBjX21hcFsxXSA9PSBQQ19GUkVFMSAmJgorCQkgICAg
cGMtPnBjX21hcFsyXSA9PSBQQ19GUkVFMikgeworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3Rf
aW50KCZwdl9lbnRyeV9zcGFyZSwgX05QQ1BWKSk7CisJCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFj
dF9pbnQoJnBjX2NodW5rX2NvdW50LCAxKSk7CisJCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZw
Y19jaHVua19mcmVlcywgMSkpOworCQkJLyogRW50aXJlIGNodW5rIGlzIGZyZWU7IHJldHVybiBp
dC4gKi8KKwkJCW1fcGMgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygKKwkJ
CSAgICAodm1fb2Zmc2V0X3QpcGMpKTsKKwkJCWR1bXBfZHJvcF9wYWdlKG1fcGMtPnBoeXNfYWRk
cik7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJCWJyZWFrOworCQl9CisJCVRB
SUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxR
X0lOU0VSVF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCW10eF9sb2NrKCZwdl9jaHVu
a3NfbXV0ZXgpOworCQkvKiBPbmUgZnJlZWQgcHYgZW50cnkgaW4gbG9ja2VkX3BtYXAgaXMgc3Vm
ZmljaWVudC4gKi8KKwkJaWYgKHBtYXAgPT0gbG9ja2VkX3BtYXApCisJCQlicmVhazsKKwl9CisJ
VEFJTFFfQ09OQ0FUKCZwdl9jaHVua3MsICZuZXdfdGFpbCwgcGNfbHJ1KTsKKwltdHhfdW5sb2Nr
KCZwdl9jaHVua3NfbXV0ZXgpOworCWlmIChwbWFwICE9IE5VTEwpIHsKKwkJcG1hcF9pbnZhbGlk
YXRlX2FsbChwbWFwKTsKKwkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQlQTUFQX1VOTE9D
SyhwbWFwKTsKKwl9CisJaWYgKG1fcGMgPT0gTlVMTCAmJiAhU0xJU1RfRU1QVFkoJmZyZWUpKSB7
CisJCW1fcGMgPSBTTElTVF9GSVJTVCgmZnJlZSk7CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZmcmVl
LCBwbGlua3Mucy5zcyk7CisJCS8qIFJlY3ljbGUgYSBmcmVlZCBwYWdlIHRhYmxlIHBhZ2UuICov
CisJCW1fcGMtPndpcmVfY291bnQgPSAxOworCQlhdG9taWNfYWRkX2ludCgmdm1fY250LnZfd2ly
ZV9jb3VudCwgMSk7CisJfQorCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwlyZXR1cm4g
KG1fcGMpOworfQorCisvKgorICogZnJlZSB0aGUgcHZfZW50cnkgYmFjayB0byB0aGUgZnJlZSBs
aXN0CisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBwdl9lbnRy
eV90IHB2KQoreworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJaW50IGJpdCwgZmllbGQsIGlkeDsK
KworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19B
U1NFUlQocG1hcCwgTUFfT1dORUQpOworCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRy
eV9mcmVlcywgMSkpOworCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCAx
KSk7CisJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsK
KwlwYyA9IHB2X3RvX2NodW5rKHB2KTsKKwlpZHggPSBwdiAtICZwYy0+cGNfcHZlbnRyeVswXTsK
KwlmaWVsZCA9IGlkeCAvIChzaXplb2YodV9sb25nKSAqIE5CQlkpOworCWJpdCA9IGlkeCAlIChz
aXplb2YodV9sb25nKSAqIE5CQlkpOworCXBjLT5wY19tYXBbZmllbGRdIHw9IDF1bCA8PCBiaXQ7
CisJaWYgKHBjLT5wY19tYXBbMF0gIT0gUENfRlJFRTAgfHwgcGMtPnBjX21hcFsxXSAhPSBQQ19G
UkVFMSB8fAorCSAgICBwYy0+cGNfbWFwWzJdICE9IFBDX0ZSRUUyKSB7CisJCS8qIDk4JSBvZiB0
aGUgdGltZSwgcGMgaXMgYWxyZWFkeSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKwkJaWYg
KF9fcHJlZGljdF9mYWxzZShwYyAhPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuaykpKSB7
CisJCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCVRB
SUxRX0lOU0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCX0KKwkJ
cmV0dXJuOworCX0KKwlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0
KTsKKwlmcmVlX3B2X2NodW5rKHBjKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcHZfY2h1bmso
c3RydWN0IHB2X2NodW5rICpwYykKK3sKKwl2bV9wYWdlX3QgbTsKKworCW10eF9sb2NrKCZwdl9j
aHVua3NfbXV0ZXgpOworCVRBSUxRX1JFTU9WRSgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwlt
dHhfdW5sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2lu
dCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2lu
dCgmcGNfY2h1bmtfY291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVu
a19mcmVlcywgMSkpOworCS8qIGVudGlyZSBjaHVuayBpcyBmcmVlLCByZXR1cm4gaXQgKi8KKwlt
ID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHZtX29mZnNldF90KXBjKSk7
CisJZHVtcF9kcm9wX3BhZ2UobS0+cGh5c19hZGRyKTsKKwl2bV9wYWdlX3Vud2lyZShtLCBQUV9J
TkFDVElWRSk7CisJdm1fcGFnZV9mcmVlKG0pOworfQorCisvKgorICogUmV0dXJucyBhIG5ldyBQ
ViBlbnRyeSwgYWxsb2NhdGluZyBhIG5ldyBQViBjaHVuayBmcm9tIHRoZSBzeXN0ZW0gd2hlbgor
ICogbmVlZGVkLiAgSWYgdGhpcyBQViBjaHVuayBhbGxvY2F0aW9uIGZhaWxzIGFuZCBhIFBWIGxp
c3QgbG9jayBwb2ludGVyIHdhcworICogZ2l2ZW4sIGEgUFYgY2h1bmsgaXMgcmVjbGFpbWVkIGZy
b20gYW4gYXJiaXRyYXJ5IHBtYXAuICBPdGhlcndpc2UsIE5VTEwgaXMKKyAqIHJldHVybmVkLgor
ICoKKyAqIFRoZSBnaXZlbiBQViBsaXN0IGxvY2sgbWF5IGJlIHJlbGVhc2VkLgorICovCitzdGF0
aWMgcHZfZW50cnlfdAorZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qgcndsb2NrICoq
bG9ja3ApCit7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVj
dCBwdl9jaHVuayAqcGM7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxf
bG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQ
Vl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfYWxsb2NzLCAxKSk7CityZXRyeToKKwlw
YyA9IFRBSUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwlpZiAocGMgIT0gTlVMTCkgewor
CQlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaWYgKHBjLT5w
Y19tYXBbZmllbGRdKSB7CisJCQkJYml0ID0gZmZzbChwYy0+cGNfbWFwW2ZpZWxkXSkgLSAxOwor
CQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChmaWVsZCA8IF9OUENNKSB7CisJCQlpZHggPSBm
aWVsZCAqIHNpemVvZihwYy0+cGNfbWFwW2ZpZWxkXSkgKiBOQkJZICsgYml0OworCQkJcHYgPSAm
cGMtPnBjX3B2ZW50cnlbaWR4XTsKKwkJCXBjLT5wY19tYXBbZmllbGRdICY9IH4oMXVsIDw8IGJp
dCk7CisJCQkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBpdGVtLCBtb3ZlIGl0IHRvIHRhaWwgKi8K
KwkJCWlmIChwYy0+cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmCisJCQkg
ICAgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNo
dW5rLCBwYywgcGNfbGlzdCk7CisJCQkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1
bmssIHBjLAorCQkJCSAgICBwY19saXN0KTsKKwkJCX0KKwkJCVBWX1NUQVQoYXRvbWljX2FkZF9s
b25nKCZwdl9lbnRyeV9jb3VudCwgMSkpOworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50
KCZwdl9lbnRyeV9zcGFyZSwgMSkpOworCQkJcmV0dXJuIChwdik7CisJCX0KKwl9CisJLyogTm8g
ZnJlZSBpdGVtcywgYWxsb2NhdGUgYW5vdGhlciBjaHVuayAqLworCW0gPSB2bV9wYWdlX2FsbG9j
KE5VTEwsIDAsIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX05PT0JKIHwKKwkgICAgVk1fQUxM
T0NfV0lSRUQpOworCWlmIChtID09IE5VTEwpIHsKKwkJaWYgKGxvY2twID09IE5VTEwpIHsKKwkJ
CVBWX1NUQVQocGNfY2h1bmtfdHJ5ZmFpbCsrKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJ
bSA9IHJlY2xhaW1fcHZfY2h1bmsocG1hcCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMKQorCQkJ
Z290byByZXRyeTsKKwl9CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQs
IDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwlk
dW1wX2FkZF9wYWdlKG0tPnBoeXNfYWRkcik7CisJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQ
U19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCXBjLT5wY19wbWFwID0gcG1h
cDsKKwlwYy0+cGNfbWFwWzBdID0gUENfRlJFRTAgJiB+MXVsOwkvKiBwcmVhbGxvY2F0ZWQgYml0
IDAgKi8KKwlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJcGMtPnBjX21hcFsyXSA9IFBDX0ZS
RUUyOworCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZw
dl9jaHVua3MsIHBjLCBwY19scnUpOworCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRleCk7CisJ
cHYgPSAmcGMtPnBjX3B2ZW50cnlbMF07CisJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2
Y2h1bmssIHBjLCBwY19saXN0KTsKKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlf
Y291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRyeV9zcGFyZSwgX05Q
Q1BWIC0gMSkpOworCXJldHVybiAocHYpOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVy
IG9mIG9uZSBiaXRzIHdpdGhpbiB0aGUgZ2l2ZW4gUFYgY2h1bmsgbWFwIGVsZW1lbnQuCisgKi8K
K3N0YXRpYyBpbmxpbmUgaW50Citwb3Bjb3VudF9wY19tYXBfZWxlbSh1aW50NjRfdCBlbGVtKQor
eworCWludCBjb3VudDsKKworCS8qCisJICogVGhpcyBzaW1wbGUgbWV0aG9kIG9mIGNvdW50aW5n
IHRoZSBvbmUgYml0cyBwZXJmb3JtcyB3ZWxsIGJlY2F1c2UKKwkgKiB0aGUgZ2l2ZW4gZWxlbWVu
dCB0eXBpY2FsbHkgY29udGFpbnMgbW9yZSB6ZXJvIGJpdHMgdGhhbiBvbmUgYml0cy4KKwkgKi8K
Kwljb3VudCA9IDA7CisJZm9yICg7IGVsZW0gIT0gMDsgZWxlbSAmPSBlbGVtIC0gMSkKKwkJY291
bnQrKzsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBudW1i
ZXIgb2Ygc3BhcmUgUFYgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIHBtYXAgbWVldHMgb3IKKyAq
IGV4Y2VlZHMgdGhlIGdpdmVuIGNvdW50LCAibmVlZGVkIi4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYg
bGlzdCBsb2NrIG1heSBiZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3Jlc2VydmVfcHZf
ZW50cmllcyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQor
eworCXN0cnVjdCBwY2ggbmV3X3RhaWw7CisJc3RydWN0IHB2X2NodW5rICpwYzsKKwlpbnQgYXZh
aWwsIGZyZWU7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg
UkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJU
KGxvY2twICE9IE5VTEwsICgiJXM6IGxvY2twIGlzIE5VTEwiLCBfX2Z1bmNfXykpOworCisJLyoK
KwkgKiBOZXdseSBhbGxvY2F0ZWQgUFYgY2h1bmtzIG11c3QgYmUgc3RvcmVkIGluIGEgcHJpdmF0
ZSBsaXN0IHVudGlsCisJICogdGhlIHJlcXVpcmVkIG51bWJlciBvZiBQViBjaHVua3MgaGF2ZSBi
ZWVuIGFsbG9jYXRlZC4gIE90aGVyd2lzZSwKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgY291bGQg
cmVjeWNsZSBvbmUgb2YgdGhlc2UgY2h1bmtzLiAgSW4KKwkgKiBjb250cmFzdCwgdGhlc2UgY2h1
bmtzIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBtYXAgdXBvbiBhbGxvY2F0aW9uLgorCSAqLworCVRB
SUxRX0lOSVQoJm5ld190YWlsKTsKK3JldHJ5OgorCWF2YWlsID0gMDsKKwlUQUlMUV9GT1JFQUNI
KHBjLCAmcG1hcC0+cG1fcHZjaHVuaywgcGNfbGlzdCkgeworCQlmcmVlID0gcG9wY291bnRfcGNf
bWFwX2VsZW0ocGMtPnBjX21hcFswXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0o
cGMtPnBjX21hcFsxXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBjX21h
cFsyXSk7CisJCWlmIChmcmVlID09IDApCisJCQlicmVhazsKKwkJYXZhaWwgKz0gZnJlZTsKKwkJ
aWYgKGF2YWlsID49IG5lZWRlZCkKKwkJCWJyZWFrOworCX0KKwlmb3IgKDsgYXZhaWwgPCBuZWVk
ZWQ7IGF2YWlsICs9IF9OUENQVikgeworCQltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9B
TExPQ19OT1JNQUwgfCBWTV9BTExPQ19OT09CSiB8CisJCSAgICBWTV9BTExPQ19XSVJFRCk7CisJ
CWlmIChtID09IE5VTEwpIHsKKwkJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsK
KwkJCWlmIChtID09IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCQlQVl9TVEFUKGF0b21p
Y19hZGRfaW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50
KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwkJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOwor
CQlwYyA9IChzdHJ1Y3QgcHZfY2h1bmsgKilNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9f
UEhZUyhtKSk7CisJCXBjLT5wY19wbWFwID0gcG1hcDsKKwkJcGMtPnBjX21hcFswXSA9IFBDX0ZS
RUUwOworCQlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJCXBjLT5wY19tYXBbMl0gPSBQQ19G
UkVFMjsKKwkJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0
KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJUFZfU1RB
VChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCX0KKwlpZiAoIVRB
SUxRX0VNUFRZKCZuZXdfdGFpbCkpIHsKKwkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJ
CVRBSUxRX0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWwsIHBjX2xydSk7CisJCW10eF91bmxv
Y2soJnB2X2NodW5rc19tdXRleCk7CisJfQorfQorCisvKgorICogRmlyc3QgZmluZCBhbmQgdGhl
biByZW1vdmUgdGhlIHB2IGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIHBtYXAgYW5kIHZpcnR1YWwK
KyAqIGFkZHJlc3MgZnJvbSB0aGUgc3BlY2lmaWVkIHB2IGxpc3QuICBSZXR1cm5zIHRoZSBwdiBl
bnRyeSBpZiBmb3VuZCBhbmQgTlVMTAorICogb3RoZXJ3aXNlLiAgVGhpcyBvcGVyYXRpb24gY2Fu
IGJlIHBlcmZvcm1lZCBvbiBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvcgorICogMk1CIHBhZ2Ug
bWFwcGluZ3MuCisgKi8KK3N0YXRpYyBwdl9lbnRyeV90CitwbWFwX3B2aF9yZW1vdmUoc3RydWN0
IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXB2X2VudHJ5
X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlUQUlM
UV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCWlmIChwbWFwID09IFBW
X1BNQVAocHYpICYmIHZhID09IHB2LT5wdl92YSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2
X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCXB2aC0+cHZfZ2VuKys7CisJCQlicmVhazsKKwkJfQor
CX0KKwlyZXR1cm4gKHB2KTsKK30KKworLyoKKyAqIEFmdGVyIGRlbW90aW9uIGZyb20gYSAyTUIg
cGFnZSBtYXBwaW5nIHRvIDUxMiA0S0IgcGFnZSBtYXBwaW5ncywKKyAqIGRlc3Ryb3kgdGhlIHB2
IGVudHJ5IGZvciB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQgcmVpbnN0YW50aWF0ZSB0aGUgcHYK
KyAqIGVudHJpZXMgZm9yIGVhY2ggb2YgdGhlIDRLQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0
aWMgdm9pZAorcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg
dm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1k
X3BhZ2UgKnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXB2X2VudHJ5X3QgcHY7CisJdm1f
b2Zmc2V0X3QgdmFfbGFzdDsKKwl2bV9wYWdlX3QgbTsKKwlpbnQgYml0LCBmaWVsZDsKKworCXJ3
X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQo
cG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQoKHBhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCIl
czogcGEgaXMgbm90IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlDSEFOR0VfUFZfTElT
VF9MT0NLX1RPX1BIWVMobG9ja3AsIHBhKTsKKworCS8qCisJICogVHJhbnNmZXIgdGhlIDJtcGFn
ZSdzIHB2IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhlIGZpcnN0CisJICogcGFnZSdzIHB2
IGxpc3QuICBPbmNlIHRoaXMgdHJhbnNmZXIgYmVnaW5zLCB0aGUgcHYgbGlzdCBsb2NrCisJICog
bXVzdCBub3QgYmUgcmVsZWFzZWQgdW50aWwgdGhlIGxhc3QgcHYgZW50cnkgaXMgcmVpbnN0YW50
aWF0ZWQuCisJICovCisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwl2YSA9IHRydW5jXzJtcGFnZSh2
YSk7CisJcHYgPSBwbWFwX3B2aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAh
PSBOVUxMLCAoIiVzOiBwdiBub3QgZm91bmQiLCBfX2Z1bmNfXykpOworCW0gPSBQSFlTX1RPX1ZN
X1BBR0UocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4
dCk7CisJbS0+bWQucHZfZ2VuKys7CisJLyogSW5zdGFudGlhdGUgdGhlIHJlbWFpbmluZyBOUFRF
UEcgLSAxIHB2IGVudHJpZXMuICovCisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5
X2FsbG9jcywgTlBURVBHIC0gMSkpOworCXZhX2xhc3QgPSB2YSArIE5CUERSIC0gUEFHRV9TSVpF
OworCWZvciAoOzspIHsKKwkJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7CisJ
CUtBU1NFUlQocGMtPnBjX21hcFswXSAhPSAwIHx8IHBjLT5wY19tYXBbMV0gIT0gMCB8fAorCQkg
ICAgcGMtPnBjX21hcFsyXSAhPSAwLCAoIiVzOiBtaXNzaW5nIHNwYXJlIiwgX19mdW5jX18pKTsK
KwkJZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZpZWxkKyspIHsKKwkJCXdoaWxlIChw
Yy0+cGNfbWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMtPnBjX21hcFtmaWVsZF0pIC0g
MTsKKwkJCQlwYy0+cGNfbWFwW2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJCXB2ID0gJnBj
LT5wY19wdmVudHJ5W2ZpZWxkICogNjQgKyBiaXRdOworCQkJCXZhICs9IFBBR0VfU0laRTsKKwkJ
CQlwdi0+cHZfdmEgPSB2YTsKKwkJCQltKys7CisJCQkJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBP
X1VOTUFOQUdFRCkgPT0gMCwKKwkJCQkgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwg
X19mdW5jX18sIG0pKTsKKwkJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYs
IHB2X25leHQpOworCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCWlmICh2YSA9PSB2YV9sYXN0KQor
CQkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1
bmssIHBjLCBwY19saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmss
IHBjLCBwY19saXN0KTsKKwl9CitvdXQ6CisJaWYgKHBjLT5wY19tYXBbMF0gPT0gMCAmJiBwYy0+
cGNfbWFwWzFdID09IDAgJiYgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCVRBSUxRX1JFTU9WRSgm
cG1hcC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmcG1h
cC0+cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCX0KKwlQVl9TVEFUKGF0b21pY19hZGRfbG9u
ZygmcHZfZW50cnlfY291bnQsIE5QVEVQRyAtIDEpKTsKKwlQVl9TVEFUKGF0b21pY19zdWJ0cmFj
dF9pbnQoJnB2X2VudHJ5X3NwYXJlLCBOUFRFUEcgLSAxKSk7Cit9CisKKy8qCisgKiBBZnRlciBw
cm9tb3Rpb24gZnJvbSA1MTIgNEtCIHBhZ2UgbWFwcGluZ3MgdG8gYSBzaW5nbGUgMk1CIHBhZ2Ug
bWFwcGluZywKKyAqIHJlcGxhY2UgdGhlIG1hbnkgcHYgZW50cmllcyBmb3IgdGhlIDRLQiBwYWdl
IG1hcHBpbmdzIGJ5IGEgc2luZ2xlIHB2IGVudHJ5CisgKiBmb3IgdGhlIDJNQiBwYWdlIG1hcHBp
bmcuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCB2
bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3Ap
Cit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90
IHZhX2xhc3Q7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg
UkFfTE9DS0VEKTsKKwlLQVNTRVJUKChwYSAmIFBEUk1BU0spID09IDAsCisJICAgICgiJXM6IHBh
IGlzIG5vdCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9D
S19UT19QSFlTKGxvY2twLCBwYSk7CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSBmaXJzdCBwYWdl
J3MgcHYgZW50cnkgZm9yIHRoaXMgbWFwcGluZyB0byB0aGUgMm1wYWdlJ3MKKwkgKiBwdiBsaXN0
LiAgQXNpZGUgZnJvbSBhdm9pZGluZyB0aGUgY29zdCBvZiBhIGNhbGwgdG8gZ2V0X3B2X2VudHJ5
KCksCisJICogYSB0cmFuc2ZlciBhdm9pZHMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgZ2V0X3B2X2Vu
dHJ5KCkgY2FsbHMKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgYW5kIHRoYXQgcmVjbGFpbV9wdl9j
aHVuaygpIHJlbW92ZXMgb25lIG9mIHRoZQorCSAqIG1hcHBpbmdzIHRoYXQgaXMgYmVpbmcgcHJv
bW90ZWQuCisJICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJdmEgPSB0cnVuY18ybXBh
Z2UodmEpOworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKCZtLT5tZCwgcG1hcCwgdmEpOworCUtBU1NF
UlQocHYgIT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5jX18pKTsKKwlwdmggPSBw
YV90b19wdmgocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9u
ZXh0KTsKKwlwdmgtPnB2X2dlbisrOworCS8qIEZyZWUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAx
IHB2IGVudHJpZXMuICovCisJdmFfbGFzdCA9IHZhICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZG8g
eworCQltKys7CisJCXZhICs9IFBBR0VfU0laRTsKKwkJcG1hcF9wdmhfZnJlZSgmbS0+bWQsIHBt
YXAsIHZhKTsKKwl9IHdoaWxlICh2YSA8IHZhX2xhc3QpOworfQorCisvKgorICogRmlyc3QgZmlu
ZCBhbmQgdGhlbiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBwbWFwIGFu
ZCB2aXJ0dWFsCisgKiBhZGRyZXNzLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBv
biBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvciAyTUIKKyAqIHBhZ2UgbWFwcGluZ3MuCisgKi8K
K3N0YXRpYyB2b2lkCitwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBw
bWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcHYgPSBwbWFwX3B2
aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxMLCAoInBtYXBfcHZo
X2ZyZWU6IHB2IG5vdCBmb3VuZCwgcGEgJWx4IHZhICVseCIsCisJICAgICAodV9sb25nKVZNX1BB
R0VfVE9fUEhZUyhfX2NvbnRhaW5lcm9mKHB2aCwgc3RydWN0IHZtX3BhZ2UsIG1kKSksCisJICAg
ICAodV9sb25nKXZhKSk7CisJZnJlZV9wdl9lbnRyeShwbWFwLCBwdik7Cit9CisKKy8qCisgKiBD
b25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgcHYgZW50cnkgZm9yIGEgNEtCIHBhZ2UgbWFwcGluZyBp
ZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzdG9y
dGluZyB0byByZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF90cnlfaW5z
ZXJ0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisg
ICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3Nl
cnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAs
IE1BX09XTkVEKTsKKwlpZiAoKHB2ID0gZ2V0X3B2X2VudHJ5KHBtYXAsIE5VTEwpKSAhPSBOVUxM
KSB7CisJCXB2LT5wdl92YSA9IHZhOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0Uo
bG9ja3AsIG0pOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25l
eHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0
dXJuIChGQUxTRSk7Cit9CisKKy8qCisgKiBDb25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgUFYgZW50
cnkgZm9yIGEgMk1CIHBhZ2UgbWFwcGluZyBpZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4g
YmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHJlY2xhbWF0aW9uLgorICovCitzdGF0
aWMgYm9vbGVhbl90CitwbWFwX3B2X2luc2VydF9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90
IHZhLCB2bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1
Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9i
YWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK
KwkvKiBQYXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgbG9jayBwb2ludGVyIHRvIGRpc2FibGUgcmVj
bGFtYXRpb24uICovCisJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBOVUxMKSkgIT0gTlVM
TCkgeworCQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxv
Y2twLCBwYSk7CisJCXB2aCA9IHBhX3RvX3B2aChwYSk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZw
dmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJcHZoLT5wdl9nZW4rKzsKKwkJcmV0dXJuIChU
UlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKKworLyoKKyAqIEZpbGxzIGEg
cGFnZSB0YWJsZSBwYWdlIHdpdGggbWFwcGluZ3MgdG8gY29uc2VjdXRpdmUgcGh5c2ljYWwgcGFn
ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRl
LCBwdF9lbnRyeV90IG5ld3B0ZSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlmb3IgKHB0ZSA9
IGZpcnN0cHRlOyBwdGUgPCBmaXJzdHB0ZSArIE5QVEVQRzsgcHRlKyspIHsKKwkJKnB0ZSA9IG5l
d3B0ZTsKKwkJbmV3cHRlICs9IChQQUdFX1NJWkUgPj4gVExCTE9fUEZOX1NISUZUKTsKKwl9Cit9
CisKKy8qCisgKiBUcmllcyB0byBkZW1vdGUgYSAyTUIgcGFnZSBtYXBwaW5nLiAgSWYgZGVtb3Rp
b24gZmFpbHMsIHRoZSAyTUIgcGFnZQorICogbWFwcGluZyBpcyBpbnZhbGlkYXRlZC4KKyAqLwor
c3RhdGljIGJvb2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90
ICpwZGUsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJYm9vbGVh
bl90IHJ2OworCisJbG9jayA9IE5VTEw7CisJcnYgPSBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBt
YXAsIHBkZSwgdmEsICZsb2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxv
Y2spOworCXJldHVybiAocnYpOworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2RlbW90ZV9w
ZGVfbG9ja2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAor
ICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwkgcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBk
ZTsKKwkgcHRfZW50cnlfdCBvbGRwdGUsICpmaXJzdHB0ZSwgbmV3cHRlOworCSB2bV9wYWRkcl90
IG1wdGVwYTsKKwkgdm1fcGFnZV90IG1wdGU7CisJIHN0cnVjdCBzcGdsaXN0IGZyZWU7CisKKwkg
UE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJIG9sZHBkZSA9ICpwZGU7CisJIG9s
ZHB0ZSA9IChwdF9lbnRyeV90KW9sZHBkZTsKKwkgS0FTU0VSVChwdGVfaXNfMW1fc3VwZXJwYWdl
KCZvbGRwdGUpICYmIHB0ZV9pc192YWxpZCgmb2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHBkZSBp
cyBub3Qgc3VwZXJwYWdlIGFuZC9vciB2YWxpZC4iLCBfX2Z1bmNfXykpOworCSBpZiAocHRlX2lz
X3JlZigmb2xkcHRlKSAmJiAobXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgdmEpKSAh
PQorCSAgICAgTlVMTCkKKwkJIHBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJIGVs
c2UgeworCQkgS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpLAorCQkgICAgICgiJXM6
IHBhZ2UgdGFibGUgcGFnZSBmb3IgYSB3aXJlZCBtYXBwaW5nIGlzIG1pc3NpbmciLAorCQkgICAg
IF9fZnVuY19fKSk7CisJCSAvKgorCQkgICogSW52YWxpZGF0ZSB0aGUgMk1CIHBhZ2UgbWFwcGlu
ZyBhbmQgcmV0dXJuICJmYWlsdXJlIiBpZiB0aGUKKwkJICAqIG1hcHBpbmcgd2FzIG5ldmVyIGFj
Y2Vzc2VkIG9yIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBuZXcKKwkJICAqIHBhZ2UgdGFibGUgcGFn
ZSBmYWlscy4gIElmIHRoZSAyTUIgcGFnZSBtYXBwaW5nIGJlbG9uZ3MgdG8KKwkJICAqIHRoZSBk
aXJlY3QgbWFwIHJlZ2lvbiBvZiB0aGUga2VybmVsJ3MgYWRkcmVzcyBzcGFjZSwgdGhlbgorCQkg
ICogdGhlIHBhZ2UgYWxsb2NhdGlvbiByZXF1ZXN0IHNwZWNpZmllcyB0aGUgaGlnaGVzdCBwb3Nz
aWJsZQorCQkgICogcHJpb3JpdHkgKFZNX0FMTE9DX0lOVEVSUlVQVCkuICBPdGhlcndpc2UsIHRo
ZSBwcmlvcml0eSBpcworCQkgICogbm9ybWFsLiAgUGFnZSB0YWJsZSBwYWdlcyBhcmUgcHJlYWxs
b2NhdGVkIGZvciBldmVyeSBvdGhlcgorCQkgICogcGFydCBvZiB0aGUga2VybmVsIGFkZHJlc3Mg
c3BhY2UsIHNvIHRoZSBkaXJlY3QgbWFwIHJlZ2lvbgorCQkgICogaXMgdGhlIG9ubHkgcGFydCBv
ZiB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UgdGhhdCBtdXN0IGJlCisJCSAgKiBoYW5kbGVkIGhl
cmUuCisJCSAgKi8KKwkJIGlmICghcHRlX2lzX3JlZigmb2xkcHRlKSB8fCAobXB0ZSA9IHZtX3Bh
Z2VfYWxsb2MoTlVMTCwKKwkJICAgICBwbWFwX3BkZV9waW5kZXgodmEpLCAodmEgPj0gVk1fTUlO
X0tFUk5FTF9BRERSRVNTICYmIHZhIDwKKwkJICAgICBWTV9NQVhfQUREUkVTUyA/IFZNX0FMTE9D
X0lOVEVSUlVQVCA6IFZNX0FMTE9DX05PUk1BTCkgfAorCQkgICAgIFZNX0FMTE9DX05PT0JKIHwg
Vk1fQUxMT0NfV0lSRUQpKSA9PSBOVUxMKSB7CisJCQkgU0xJU1RfSU5JVCgmZnJlZSk7CisJCQkg
cG1hcF9yZW1vdmVfcGRlKHBtYXAsIHBkZSwgdHJ1bmNfMm1wYWdlKHZhKSwgJmZyZWUsCisJCQkg
ICAgIGxvY2twKTsKKwkJCSBwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwKKwkJCSAgICAgKHZt
X29mZnNldF90KSh2YSAmIH5QRFJNQVNLKSwKKwkJCSAgICAgKHZtX29mZnNldF90KSh2YSAmIH5Q
RFJNQVNLKSArIE5CUERSKTsKKwkJCSBwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkg
Q1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJ
ICAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQkJIHJldHVybiAoRkFMU0UpOworCQkgfQorCQkg
aWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJIHBtYXBfcmVzaWRlbnRfY291bnRfaW5j
KHBtYXAsIDEpOworCSB9CisJIG1wdGVwYSA9IFZNX1BBR0VfVE9fUEhZUyhtcHRlKTsKKwkgbmV3
cGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChtcHRlcGEpOworCSBmaXJzdHB0
ZSA9IG5ld3BkZTsKKwkgS0FTU0VSVChwdGVfaXNfcmVmKCZvbGRwdGUpLAorCSAgICAgKCIlczog
b2xkcHRlIGlzIG5vdCByZWZlcmVuY2VkIiwgX19mdW5jX18pKTsKKwkgS0FTU0VSVCghcHRlX3Rl
c3QoJm9sZHB0ZSwgUFRFX1JPKSAmJiBwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRCksCisJICAgICAo
IiVzOiBvbGRwdGUgaXMgbWlzc2luZyBQVEVfRCIsIF9fZnVuY19fKSk7CisJIG5ld3B0ZSA9IG9s
ZHB0ZSAmIH5QVEVfUFNfSURYX01BU0s7CisKKwkgLyoKKwkgICogSWYgdGhlIHBhZ2UgdGFibGUg
cGFnZSBpcyBuZXcsIGluaXRpYWxpemUgaXQuCisJICAqLworCSBpZiAobXB0ZS0+d2lyZV9jb3Vu
dCA9PSAxKSB7CisJCSBtcHRlLT53aXJlX2NvdW50ID0gTlBURVBHOworCQkgcG1hcF9maWxsX3B0
cChmaXJzdHB0ZSwgbmV3cHRlKTsKKwkgfQorCSBLQVNTRVJUKFRMQkxPX1BURV9UT19QQSgqZmly
c3RwdGUpID09IFRMQkxPX1BURV9UT19QQShuZXdwdGUpLAorCSAgICAgKCIlczogZmlyc3RwdGUg
YW5kIG5ld3B0ZSBtYXAgZGlmZmVyZW50IHBoeXNpY2FsIGFkZHJlc3NlcyIsCisJICAgICBfX2Z1
bmNfXykpOworCisJIC8qCisJICAqIElmIHRoZSBtYXBwaW5nIGhhcyBjaGFuZ2VkIGF0dHJpYnV0
ZXMsIHVwZGF0ZSB0aGUgcGFnZSB0YWJsZQorCSAgKiBlbnRyaWVzLgorCSAgKi8KKwkgaWYgKCgq
Zmlyc3RwdGUgJiBQR19QUk9NT1RFX01BU0spICE9IChuZXdwdGUgJiBQR19QUk9NT1RFX01BU0sp
KQorCQkgcG1hcF9maWxsX3B0cChmaXJzdHB0ZSwgbmV3cHRlKTsKKworCisJIC8qCisJICAqIFRo
ZSBzcGFyZSBQViBlbnRyaWVzIG11c3QgYmUgcmVzZXJ2ZWQgcHJpb3IgdG8gZGVtb3RpbmcgdGhl
CisJICAqIG1hcHBpbmcsIHRoYXQgaXMsIHByaW9yIHRvIGNoYW5naW5nIHRoZSBQREUuICBPdGhl
cndpc2UsIHRoZSBzdGF0ZQorCSAgKiBvZiB0aGUgUERFIGFuZCB0aGUgUFYgbGlzdHMgd2lsbCBi
ZSBpbmNvbnNpc3RlbnQsIHdoaWNoIGNhbiByZXN1bHQKKwkgICogaW4gcmVjbGFpbV9wdl9jaHVu
aygpIGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGEgUFYgZW50cnkgZnJvbSB0aGUKKwkgICogd3Jvbmcg
UFYgbGlzdCBhbmQgcG1hcF9wdl9kZW1vdGVfcGRlKCkgZmFpbGluZyB0byBmaW5kIHRoZSBleHBl
Y3RlZAorCSAgKiBQViBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgdGhhdCBpcyBiZWlu
ZyBkZW1vdGVkLgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkK
KwkJIHJlc2VydmVfcHZfZW50cmllcyhwbWFwLCBOUFRFUEcgLSAxLCBsb2NrcCk7CisKKwkgLyoK
KwkgICogRGVtb3RlIHRoZSBtYXBwaW5nLiAgVGhpcyBwbWFwIGlzIGxvY2tlZC4gIFRoZSBvbGQg
UERFIGhhcworCSAgKiBQVEVfUkVGIHNldC4gIElmIHRoZSBvbGQgUERFIGhhcyBQVEVfUk8gY2xl
YXIsIGl0IGFsc28gaGFzCisJICAqIFBURV9EIHNldC4gIFRodXMsIHRoZXJlIGlzIG5vIGRhbmdl
ciBvZiBhIHJhY2Ugd2l0aCBhbm90aGVyCisJICAqIHByb2Nlc3NvciBjaGFuZ2luZyB0aGUgc2V0
dGluZyBvZiBQVEVfUkVGIGFuZC9vciBQVEVfRCBiZXR3ZWVuCisJICAqIHRoZSByZWFkIGFib3Zl
IGFuZCB0aGUgc3RvcmUgYmVsb3cuCisJICAqLworCSBwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEs
IHBkZSwgKHB0X2VudHJ5X3QpbmV3cGRlKTsKKworCSAvKgorCSAgKiBJbnZhbGlkYXRlIGEgc3Rh
bGUgcmVjdXJzaXZlIG1hcHBpbmcgb2YgdGhlIHBhZ2UgdGFibGUgcGFnZS4KKwkgICovCisJIGlm
ICh2YSA+PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJCSBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFw
LCAodm1fb2Zmc2V0X3QpcG1hcF9wdGUocG1hcCwgdmEpKTsKKworCSAvKgorCSAgKiBEZW1vdGUg
dGhlIFBWIGVudHJ5LgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VE
KSkgeworCQkgcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXAsIHZhLCBUTEJMT19QREVfVE9fUEEob2xk
cGRlKSwgbG9ja3ApOworCSB9CisJIGF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfZGVtb3Rpb25z
LCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAg
JXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKworCSByZXR1cm4gKFRSVUUpOworfQor
CisvKgorICogcG1hcF9yZW1vdmVfa2VybmVsX3BkZTogUmVtb3ZlIGEga2VybmVsIHN1cGVycGFn
ZSBtYXBwaW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFw
X3QgcG1hcCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwkvKiBYWFggTm90
IGRvaW5nIGtlcm5lbCBzdXBlcnBhZ2VzIHlldC4gKi8KKwlwYW5pYygicG1hcF9yZW1vdmVfa2Vy
bmVsX3BkZToga2VybmVsIHN1cGVycGFnZSIpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcGRl
OiBkbyB0aGUgdGhpbmdzIHRvIHVubWFwIGEgc3VwZXJwYWdlIGluIGEgcHJvY2VzcworICovCitz
dGF0aWMgaW50CitwbWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwg
dm1fb2Zmc2V0X3Qgc3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2Nr
ICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwZF9lbnRyeV90IG9sZHBkZTsK
Kwl2bV9vZmZzZXRfdCBldmEsIHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCisJLyoKKwkgKiBX
cml0ZSBiYWNrIGFsbCBjYWNoZSBsaW5lcyBmcm9tIHRoZSBzdXBlcnBhZ2UgYmVpbmcgdW5tYXBw
ZWQuCisJICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgoKHN2YSAmIH5QRFJNQVNL
KSwgTkJQRFIpOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VS
VCgoc3ZhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9wZGU6IHN2YSBpcyBu
b3QgMm1wYWdlIGFsaWduZWQiKSk7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisJCW9s
ZHBkZSA9IHBkZV9sb2FkX3N0b3JlKHBkcSwgUFRFX0cpOworCWVsc2UKKwkJb2xkcGRlID0gcGRl
X2xvYWRfc3RvcmUocGRxLCAwKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1cpKQorCQlw
bWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKworCWlmIChw
ZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKGtlcm5lbF9w
bWFwLCBzdmEpOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgTkJQRFIgLyBQQUdF
X1NJWkUpOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkgICAgQ0hB
TkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7
CisJICAgIHB2aCA9IHBhX3RvX3B2aChUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAgIHBt
YXBfcHZoX2ZyZWUocHZoLCBwbWFwLCBzdmEpOworCSAgICBldmEgPSBzdmEgKyBOQlBEUjsKKwkg
ICAgZm9yICh2YSA9IHN2YSwgbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QREVfVE9fUEEob2xk
cGRlKSk7CisJCXZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykgeworCQkgICAgaWYgKHBk
ZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAmJiAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JPKSkKKwkJ
CSAgICB2bV9wYWdlX2RpcnR5KG0pOworCQkgICAgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9S
RUYpKQorCQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQkgICAgaWYg
KFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJVEFJTFFfRU1QVFkoJnB2aC0+cHZf
bGlzdCkpCisJCQkgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkg
ICAgfQorCX0KKwlpZiAocG1hcCA9PSBrZXJuZWxfcG1hcCkgeworCQlwbWFwX3JlbW92ZV9rZXJu
ZWxfcGRlKHBtYXAsIHBkcSwgc3ZhKTsKKwl9IGVsc2UgeworCQltcHRlID0gcG1hcF9sb29rdXBf
cHRfcGFnZShwbWFwLCBzdmEpOworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlwbWFwX3JlbW92
ZV9wdF9wYWdlKHBtYXAsIG1wdGUpOworCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwg
MSk7CisJCQlLQVNTRVJUKG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJICAgICgicG1h
cF9yZW1vdmVfcGRlOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIikpOworCQkJbXB0ZS0+d2ly
ZV9jb3VudCA9IDA7CisJCQlwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdChtcHRlLCBmcmVlLCBG
QUxTRSk7CisJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsK
KwkJfQorCX0KKwlyZXR1cm4gKHBtYXBfdW51c2VfcHQocG1hcCwgc3ZhLCAqcG1hcF9zZWdtYXAo
cG1hcCwgc3ZhKSwgZnJlZSkpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcHRlOiBkbyB0aGUg
dGhpbmdzIHRvIHVubWFwIGEgcGFnZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1h
cF9yZW1vdmVfcHRlKHN0cnVjdCBwbWFwICpwbWFwLCBwdF9lbnRyeV90ICpwdHEsIHZtX29mZnNl
dF90IHZhLAorICAgIHBkX2VudHJ5X3QgcHRlcGRlLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSwgc3Ry
dWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHRfZW50cnlf
dCBvbGRwdGU7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09X
TkVEKTsKKworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUgcGFn
ZSBiZWluZyB1bm1hcHBlZC4KKwkgKi8KKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2
YSwgUEFHRV9TSVpFKTsKKworCW9sZHB0ZSA9ICpwdHE7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBt
YXApKQorCQkqcHRxID0gUFRFX0c7CisJZWxzZQorCQkqcHRxID0gMDsKKworCWlmIChwdGVfdGVz
dCgmb2xkcHRlLCBQVEVfVykpCisJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50IC09IDE7CisK
KwlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwlpZiAocHRlX3Rlc3QoJm9sZHB0
ZSwgUFRFX01BTkFHRUQpKSB7CisJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRFX1RPX1BB
KG9sZHB0ZSkpOworCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJU
KCFwdGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pLAorCQkJICAgKCIlczogbW9kaWZpZWQgcGFnZSBu
b3Qgd3JpdGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IiwKKwkJCSAgICBfX2Z1bmNfXywgKHZvaWQg
Kil2YSwgKHVpbnRtYXhfdClvbGRwdGUpKTsKKwkJCXZtX3BhZ2VfZGlydHkobSk7CisJCX0KKwkJ
aWYgKHB0ZV9pc19yZWYoJm9sZHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVG
RVJFTkNFRCk7CisJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRShsb2NrcCwgbSk7CisJ
CXBtYXBfcHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJCWlmIChUQUlMUV9FTVBUWSgmbS0+
bWQucHZfbGlzdCkgJiYKKwkJICAgIChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsK
KwkJCXB2aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJaWYgKFRBSUxRX0VN
UFRZKCZwdmgtPnB2X2xpc3QpKQorCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRF
QUJMRSk7CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBwdGVwZGUs
IGZyZWUpKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIHNpbmdsZSBwYWdlIGZyb20gYSBwcm9jZXNz
IGFkZHJlc3Mgc3BhY2UKKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0
IHBtYXAgKnBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlz
dHJ1Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7
CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlwZGUgPSBwbWFwX3BkZShw
bWFwLCB2YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gMCkKKwkJcmV0dXJuOworCXB0
ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8g
cHRlIGZvciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKKwkgKi8KKwlpZiAoIXB0ZV9pc192
YWxpZChwdGUpKQorCQlyZXR1cm47CisKKwlsb2NrID0gTlVMTDsKKwkodm9pZClwbWFwX3JlbW92
ZV9wdGUocG1hcCwgcHRlLCB2YSwgKnBkZSwgZnJlZSwgJmxvY2spOworCWlmIChsb2NrICE9IE5V
TEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEp
OworfQorCisvKgorICoJUmVtb3ZlIHRoZSBnaXZlbiByYW5nZSBvZiBhZGRyZXNzZXMgZnJvbSB0
aGUgc3BlY2lmaWVkIG1hcC4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHN0YXJ0IGFu
ZCBlbmQgYXJlIHByb3Blcmx5CisgKglyb3VuZGVkIHRvIHRoZSBwYWdlIHNpemUuCisgKi8KK3Zv
aWQKK3BtYXBfcmVtb3ZlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90
IGV2YSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhLCB2YV9uZXh0
OworCXBkX2VudHJ5X3QgcHRwYWRkciwgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOwor
CXN0cnVjdCBzcGdsaXN0IGZyZWU7CisJaW50IGFueXZhbGlkOworCisJLyoKKwkgKiBQZXJmb3Jt
IGFuIHVuc3luY2hyb25pemVkIHJlYWQuICBUaGlzIGlzLCBob3dldmVyLCBzYWZlLgorCSAqLwor
CWlmIChwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlh
bnl2YWxpZCA9IDA7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisKKwlyd19ybG9jaygmcHZoX2dsb2Jh
bF9sb2NrKTsKKwlQTUFQX0xPQ0socG1hcCk7CisKKwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcg
b2YgcmVtb3Zpbmcgb25lIHBhZ2UuICBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBl
YXN5IHRvIHNob3J0IGNpcmN1aXQgc29tZSBjb2RlLgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9T
SVpFKSA9PSBldmEpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgc3ZhKTsKKwkJaWYgKCFwZGVf
aXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJCXBtYXBfcmVtb3ZlX3BhZ2UocG1hcCwgc3ZhLCAm
ZnJlZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWxvY2sgPSBOVUxMOworCWZvciAoOyBz
dmEgPCBldmE7IHN2YSA9IHZhX25leHQpIHsKKwkJaWYgKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50
X2NvdW50ID09IDApCisJCQlicmVhazsKKworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3Zh
KTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNF
R01BU0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29u
dGludWU7CisJCX0KKwkJLyoKKwkJICogQ2FsY3VsYXRlIGluZGV4IGZvciBuZXh0IHBhZ2UgdGFi
bGUuCisJCSAqLworCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAo
dmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3Rv
X3BkZShwZHBlLCBzdmEpOworCQlwdHBhZGRyID0gKnBkZTsKKworCQkvKgorCQkgKiBXZWVkIG91
dCBpbnZhbGlkIG1hcHBpbmdzLgorCQkgKi8KKwkJaWYgKHB0cGFkZHIgPT0gTlVMTCkKKwkJCWNv
bnRpbnVlOworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBk
ZV9pc18xbV9zdXBlcnBhZ2UoJnB0cGFkZHIpKSB7CisJCQkvKgorCQkJICogQXJlIHdlIHJlbW92
aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyAgSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBw
aW5nIGFuZCBmYWxsIHRocm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9u
ZXh0ICYmIGV2YSA+PSB2YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZv
ciBhIFBURV9HIG1hcHBpbmcgaXMKKwkJCQkgKiBpbnZhbGlkYXRlZCBieSBwbWFwX3JlbW92ZV9w
ZGUoKS4KKwkJCQkgKi8KKwkJCQlpZiAoIXBkZV90ZXN0KCZwdHBhZGRyLCBQVEVfRykpCisJCQkJ
CWFueXZhbGlkID0gVFJVRTsKKwkJCQlwbWFwX3JlbW92ZV9wZGUocG1hcCwgcGRlLCBzdmEsICZm
cmVlLCAmbG9jayk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFwbWFwX2RlbW90ZV9w
ZGVfbG9ja2VkKHBtYXAsIHBkZSwgc3ZhLAorCQkJICAgICZsb2NrKSkgeworCQkJCS8qIFRoZSBz
dXBlcnBhZ2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLiAqLworCQkJCWNvbnRpbnVlOworCQkJfSBl
bHNlIHsKKwkJCQlwdHBhZGRyID0gKnBkZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIExpbWl0
IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBi
eSB0aGUgY3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAq
IHJhbmdlIGJlaW5nIHJlbW92ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZh
X25leHQgPSBldmE7CisKKwkJdmEgPSB2YV9uZXh0OworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3Rv
X3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdF
X1NJWkUpIHsKKwkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJCQlpZiAodmEgIT0gdmFf
bmV4dCkgeworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJCQkJ
CXZhID0gdmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXB0ZV90
ZXN0KHB0ZSwgUFRFX0cpKQorCQkJCWFueXZhbGlkID0gVFJVRTsKKwkJCWlmICh2YSA9PSB2YV9u
ZXh0KQorCQkJCXZhID0gc3ZhOworCQkJaWYgKHBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2
YSwgcHRwYWRkciwgJmZyZWUsCisJCQkgICAgJmxvY2spKSB7CisJCQkJc3ZhICs9IFBBR0VfU0la
RTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJCXBtYXBf
aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkK
KwkJcndfd3VubG9jayhsb2NrKTsKK291dDoKKwlpZiAoYW55dmFsaWQpCisJCXBtYXBfaW52YWxp
ZGF0ZV9hbGwocG1hcCk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VO
TE9DSyhwbWFwKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKglS
b3V0aW5lOglwbWFwX3JlbW92ZV9hbGwKKyAqCUZ1bmN0aW9uOgorICoJCVJlbW92ZXMgdGhpcyBw
aHlzaWNhbCBwYWdlIGZyb20KKyAqCQlhbGwgcGh5c2ljYWwgbWFwcyBpbiB3aGljaCBpdCByZXNp
ZGVzLgorICoJCVJlZmxlY3RzIGJhY2sgbW9kaWZ5IGJpdHMgdG8gdGhlIHBhZ2VyLgorICoKKyAq
CU5vdGVzOgorICoJCU9yaWdpbmFsIHZlcnNpb25zIG9mIHRoaXMgcm91dGluZSB3ZXJlIHZlcnkK
KyAqCQlpbmVmZmljaWVudCBiZWNhdXNlIHRoZXkgaXRlcmF0aXZlbHkgY2FsbGVkCisgKgkJcG1h
cF9yZW1vdmUgKHNsb3cuLi4pCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX2FsbCh2bV9wYWdlX3Qg
bSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBt
YXA7CisJcHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZz
ZXRfdCB2YTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYg
VlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9hbGw6IHBhZ2UgJXAgaXMg
bm90IG1hbmFnZWQiLCBtKSk7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfd2xvY2soJnB2aF9n
bG9iYWxfbG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdv
dG8gc21hbGxfbWFwcGluZ3M7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7
CisJd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJ
CXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NLKHBtYXApOworCQl2YSA9IHB2LT5wdl92
YTsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkodm9pZClwbWFwX2RlbW90ZV9wZGUo
cG1hcCwgcGRlLCB2YSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdz
OgorCXdoaWxlICgocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkpICE9IE5VTEwpIHsK
KwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlQTUFQX0xPQ0socG1hcCk7CisKKwkJLyoKKwkJICog
SWYgaXQncyBsYXN0IG1hcHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbQorCQkgKiB0aGUg
cGFnZSBiZWluZyBkZXN0cm95ZWQKKwkJICovCisJCWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0
KSA9PSBOVUxMKQorCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQ
QUdFX1NJWkUpOworCisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQlwZGUg
PSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHBkZSAhPSBOVUxMICYmICpw
ZGUgIT0gMCwgKCJwbWFwX3JlbW92ZV9hbGw6IHBkZSIpKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1
cGVycGFnZShwZGUpLCAoInBtYXBfcmVtb3ZlX2FsbDogZm91bmQiCisJCSAgICAiIGEgc3VwZXJw
YWdlIGluIHBhZ2UgJXAgJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRl
KHBkZSwgcHYtPnB2X3ZhKTsKKworCQl0cHRlID0gKnB0ZTsKKwkJcHRlX3N0b3JlKHB0ZSwgaXNf
a2VybmVsX3BtYXAocG1hcCkgPyBQVEVfRyA6IDApOworCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwg
UFRFX1cpKQorCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKworCQkvKgorCQkgKiBV
cGRhdGUgdGhlIHZtX3BhZ2VfdCBkaXJ0eSBhbmQgcmVmZXJlbmNlIGJpdHMuCisJCSAqLworCQlp
ZiAocHRlX2lzX3JlZigmdHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJF
TkNFRCk7CisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVf
dGVzdCgmdHB0ZSwgUFRFX1JPKSwKKwkJCSAgICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0
YWJsZTogdmE6ICVwLCBwdGU6ICUjangiCisJCQkgICAgLCBfX2Z1bmNfXywgKHZvaWQgKilwdi0+
cHZfdmEsICh1aW50bWF4X3QpdHB0ZSkpOworCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJfQorCQlw
bWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSwgJmZyZWUpOworCQlwbWFwX2ludmFs
aWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZf
bGlzdCwgcHYsIHB2X25leHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJZnJlZV9wdl9lbnRyeShw
bWFwLCBwdik7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKworCXZtX3BhZ2VfYWZsYWdfY2xl
YXIobSwgUEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlw
bWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKiBwbWFwX3Byb3RlY3RfcGRl
OiBkbyB0aGUgdGhpbmdzIHRvIHByb3RlY3QgYSBzdXBlcnBhZ2UgaW4gYSBwcm9jZXNzCisgKi8K
K3N0YXRpYyBib29sZWFuX3QKK3BtYXBfcHJvdGVjdF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5
X3QgKnBkZSwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlwZF9lbnRyeV90
IG5ld3BkZSwgb2xkcGRlOworCXZtX29mZnNldF90IGV2YSwgdmE7CisJdm1fcGFnZV90IG07CisJ
Ym9vbGVhbl90IGFueWNoYW5nZWQ7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVE
KTsKKwlLQVNTRVJUKChzdmEgJiBQRFJNQVNLKSA9PSAwLAorCSAgICAoIiVzOiBzdmEgaXMgbm90
IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlhbnljaGFuZ2VkID0gRkFMU0U7CityZXRy
eToKKwlvbGRwZGUgPSBuZXdwZGUgPSAqcGRlOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVf
TUFOQUdFRCkpIHsKKwkJZXZhID0gc3ZhICsgTkJQRFI7CisJCWZvciAodmEgPSBzdmEsIG0gPSBQ
SFlTX1RPX1ZNX1BBR0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQkgICAgdmEgPCBldmE7
IHZhICs9IFBBR0VfU0laRSwgbSsrKQorCQkJaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAm
JgorCQkJICAgICFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfUk8pKQorCQkJCXZtX3BhZ2VfZGlydHko
bSk7CisJfQorCWlmICgocHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJcGRlX3NldCgm
bmV3cGRlLCBQVEVfUk8pOworCQlwZGVfY2xlYXIoJm5ld3BkZSwgUFRFX0QpOworCX0KKwlpZiAo
bmV3cGRlICE9IG9sZHBkZSkgeworCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZygocHRfZW50cnlf
dCAqKXBkZSwgKHB0X2VudHJ5X3Qpb2xkcGRlLAorCQkgICAgKHB0X2VudHJ5X3QpbmV3cGRlKSkK
KwkJCWdvdG8gcmV0cnk7CisJCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCQlwbWFw
X2ludmFsaWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQllbHNlCisJCQlhbnljaGFuZ2VkID0gVFJV
RTsKKwl9CisJcmV0dXJuIChhbnljaGFuZ2VkKTsKK30KKworLyotCisgKglTZXQgdGhlIHBoeXNp
Y2FsIHByb3RlY3Rpb24gb24gdGhlCisgKglzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhpcyBtYXAgYXMg
cmVxdWVzdGVkLgorICovCit2b2lkCitwbWFwX3Byb3RlY3QocG1hcF90IHBtYXAsIHZtX29mZnNl
dF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwl2bV9vZmZzZXRf
dCB2YSwgdmFfbmV4dDsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0
ZTsKKwlib29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlzdHNfbG9ja2VkOworCisJaWYgKChwcm90
ICYgVk1fUFJPVF9SRUFEKSA9PSBWTV9QUk9UX05PTkUpIHsKKwkJcG1hcF9yZW1vdmUocG1hcCwg
c3ZhLCBldmEpOworCQlyZXR1cm47CisJfQorCWlmIChwcm90ICYgVk1fUFJPVF9XUklURSkKKwkJ
cmV0dXJuOworCisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdl
ZCA9IEZBTFNFOworCisJUE1BUF9MT0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9
IHZhX25leHQpIHsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRw
ZSA9PSAwKSB7CisJCQl2YV9uZXh0ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYg
KHZhX25leHQgPCBzdmEpCisJCQkJdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJ
CXZhX25leHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3Zh
KQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2
YSk7CisKKwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlm
ICgqcGRlID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDaGVjayBmb3Igc3Vw
ZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJLyoK
KwkJCSAqIEFyZSB3ZSBwcm90ZWN0aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJ
CQkgKiBkZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYg
KHN2YSArIE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQkvKgorCQkJ
CSAqIFRoZSBUTEIgZW50cnkgZm9yIGEgUEdfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxpZGF0
ZWQgYnkgcG1hcF9wcm90ZWN0X3BkZSgpLgorCQkJCSAqLworCQkJCWlmIChwbWFwX3Byb3RlY3Rf
cGRlKHBtYXAsIHBkZSwgc3ZhLCBwcm90KSkKKwkJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCQkJ
Y29udGludWU7CisJCQl9IGVsc2UgeworCQkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7CisJCQkJ
CXB2X2xpc3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xv
YmFsX2xvY2spKSB7CisJCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCQlwbWFwX2ludmFsaWRh
dGVfYWxsKAorCQkJCQkJCSAgICBwbWFwKTsKKwkJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ
CQkJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQkJ
fQorCQkJCX0KKwkJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZShwbWFwLCBwZGUsIHN2YSkpIHsKKwkJ
CQkJLyoKKwkJCQkJICogVGhlIHN1cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJ
CSAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyoKKwkJICogTGltaXQg
b3VyIHNjYW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZhIHJlcHJlc2VudGVkCisJCSAqIGJ5
IHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUKKwkJICog
cmFuZ2UgYmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8KKwkJaWYgKHZhX25leHQgPiBldmEp
CisJCQl2YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJZm9yIChwdGUgPSBwbWFw
X3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEg
Kz0gUEFHRV9TSVpFKSB7CisJCQlwdF9lbnRyeV90IHBiaXRzOworCQkJdm1fcGFnZV90IG07CisJ
CQl2bV9wYWRkcl90IHBhOworCisJCQlwYml0cyA9ICpwdGU7CisJCQlpZiAoIXB0ZV9pc192YWxp
ZCgmcGJpdHMpIHx8IHB0ZV90ZXN0KCZwYml0cywgUFRFX1JPKSkgeworCQkJCWlmICh2YSAhPSB2
YV9uZXh0KSB7CisJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJ
CQkJdmEgPSB2YV9uZXh0OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXB0ZV9zZXQo
JnBiaXRzLCBQVEVfUk8pOworCQkJaWYgKHB0ZV90ZXN0KCZwYml0cywgUFRFX0QpKSB7CisJCQkJ
cHRlX2NsZWFyKCZwYml0cywgUFRFX0QpOworCQkJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9N
QU5BR0VEKSkgeworCQkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwYml0cyk7CisJCQkJCW0gPSBQ
SFlTX1RPX1ZNX1BBR0UocGEpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlp
ZiAodmEgPT0gdmFfbmV4dCkKKwkJCQkJdmEgPSBzdmE7CisJCQl9IGVsc2UgeworCQkJCS8qCisJ
CQkJICogVW5sZXNzIFBURV9EIGlzIHNldCwgYW55IFRMQiBlbnRyaWVzCisJCQkJICogbWFwcGlu
ZyAic3ZhIiBkb24ndCBhbGxvdyB3cml0ZSBhY2Nlc3MsIHNvCisJCQkJICogdGhleSBuZWVkbid0
IGJlIGludmFsaWRhdGVkLgorCQkJCSAqLworCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CisJCQkJ
CXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEgPSB2YV9uZXh0
OworCQkJCX0KKwkJCX0KKwkJCSpwdGUgPSBwYml0czsKKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4
dCkKKwkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGFu
eWNoYW5nZWQpCisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xv
Y2tlZCkgeworCQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9D
SyhwbWFwKTsKK30KKworLyotCisgKiBUcmllcyB0byBwcm9tb3RlIHRoZSA1MTIsIGNvbnRpZ3Vv
dXMgNEtCIHBhZ2UgbWFwcGluZ3MgdGhhdCBhcmUgd2l0aGluIGEKKyAqIHNpbmdsZSBwYWdlIHRh
YmxlIHBhZ2UgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGluZy4gIEZvciBwcm9tb3Rpb24gdG8K
KyAqIG9jY3VyLCB0d28gY29uZGl0aW9ucyBtdXN0IGJlIG1ldDogKDEpIHRoZSA0S0IgcGFnZSBt
YXBwaW5ncyBtdXN0IG1hcAorICogYWxpZ25lZCwgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkg
YW5kICgyKSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBoYXZlCisgKiBpZGVudGljYWwgY2hh
cmFjdGVyaXN0aWNzLgorICoKKyAqIE9uIE1JUFM2NCBwcm9tb3Rpb25zIGFyZSBhY3R1YWxseSBk
b25lIGluIHBhaXJzIG9mIHR3byAxTUIgc3VwZXJwYWdlcworICogYmVjYXVzZSBvZiB0aGUgaGFy
ZHdhcmUgYXJjaGl0ZWN0dXJlICh0d28gcGh5c2ljYWwgcGFnZXMgYXJlIGluIGEgc2luZ2xlCisg
KiBUTEIgZW50cnkpIGV2ZW4gdGhvdWdoIFZNIGxheWVyIGlzIHVuZGVyIHRoZSBpbXByZXNzaW9u
IHRoYXQgdGhlIHN1cGVycGFnZQorICogc2l6ZSBpcyBhY3R1YWxseSAyTUIuCisgKi8KK3N0YXRp
YyB2b2lkCitwbWFwX3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZt
X29mZnNldF90IHZhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRyeV90
IG5ld3BkZTsKKwlwdF9lbnRyeV90ICpmaXJzdHB0ZSwgb2xkcHRlLCBwYSwgKnB0ZTsKKwl2bV9v
ZmZzZXRfdCBvbGRwdGV2YTsKKwl2bV9wYWdlX3QgbXB0ZTsKKworCVBNQVBfTE9DS19BU1NFUlQo
cG1hcCwgTUFfT1dORUQpOworCS8qCisJICogRXhhbWluZSB0aGUgZmlyc3QgUFRFIGluIHRoZSBz
cGVjaWZpZWQgUFRQLiAgQWJvcnQgaWYgdGhpcyBQVEUgaXMKKwkgKiBlaXRoZXIgaW52YWxpZCwg
dW51c2VkLCBvciBkb2VzIG5vdCBtYXAgdGhlIGZpcnN0IDRLQiBwaHlzaWNhbCBwYWdlCisJICog
d2l0aGluIGEgMk1CIHBhZ2UuCisJICovCisJZmlyc3RwdGUgPSBwbWFwX3B0ZShwbWFwLCB0cnVu
Y18ybXBhZ2UodmEpKTsKK3NldHBkZToKKwluZXdwZGUgPSAqZmlyc3RwdGU7CisJaWYgKGlzX2tl
cm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIFhYWCBub3QgZG9pbmcga2VybmVsIHBtYXAgeWV0ICov
CisJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RS
X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVu
Y19fLCB2YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfaXNfdmFsaWQoJm5ld3Bk
ZSkgfHwgIXB0ZV9pc19yZWYoJm5ld3BkZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3Bk
ZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAl
I2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOwor
CX0KKwlpZiAoIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm5ld3BkZSwg
UFRFX1JPKSkgeworCQkvKgorCQkgKiBXaGVuIFBURV9EIGlzIGFscmVhZHkgY2xlYXIsIFBURV9S
TyBjYW4gYmUgc2V0IHdpdGhvdXQKKwkJICogYSBUTEIgaW52YWxpZGF0aW9uLgorCQkgKi8KKwkJ
aWYgKCFhdG9taWNfY21wc2V0X2xvbmcoKHVfbG9uZyAqKWZpcnN0cHRlLCBuZXdwZGUsIG5ld3Bk
ZSB8CisJCSAgICBQVEVfUk8pKQorCQkJZ290byBzZXRwZGU7CisJCW5ld3BkZSB8PSBQVEVfUk87
CisJfQorCisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggb2YgdGhlIG90aGVyIFBURXMgaW4gdGhlIHNw
ZWNpZmllZCBQVFAuICBBYm9ydCBpZiB0aGlzCisJICogUFRFIG1hcHMgYW4gdW5leHBlY3RlZCA0
S0IgcGh5c2ljYWwgcGFnZSBvciBkb2VzIG5vdCBoYXZlIGlkZW50aWNhbAorCSAqIGNoYXJhY3Rl
cmlzdGljcyB0byB0aGUgZmlyc3QgUFRFLgorCSAqLworCXBhID0gVExCTE9fUFRFX1RPX1BBKG5l
d3BkZSkgKyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKHB0ZSA9IGZpcnN0cHRlICsgTlBURVBH
IC0gMTsgcHRlID4gZmlyc3RwdGU7IHB0ZS0tKSB7CitzZXRwdGU6CisJCW9sZHB0ZSA9ICpwdGU7
CisJCWlmIChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAhPSBwYSkgeworCQkJYXRvbWljX2FkZF9s
b25nKCZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJCUNUUjMoS1RSX1BNQVAsICIlczogZmFp
bHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXAp
OworCQkJcmV0dXJuOworCQl9CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpICYmICFw
dGVfdGVzdCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhw
dGUsIG9sZHB0ZSwgb2xkcHRlIHwgUFRFX1JPKSkKKwkJCQlnb3RvIHNldHB0ZTsKKwkJCW9sZHB0
ZSB8PSBQVEVfUk87CisJCQlvbGRwdGV2YSA9ICh2YSAmIH5QRFJNQVNLKSB8CisJCQkgICAgKFRM
QkxPX1BURV9UT19QQShvbGRwdGUpICYgUERSTUFTSyk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6
IHByb3RlY3QgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIG9sZHB0
ZXZhLCBwbWFwKTsKKwkJfQorCQlpZiAoKG9sZHB0ZSAmIFBHX1BST01PVEVfTUFTSykgIT0gKG5l
d3BkZSAmIFBHX1BST01PVEVfTUFTSykpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVf
cF9mYWlsdXJlcywgMSk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUj
bHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsK
KwkJfQorCQlwYSAtPSBQQUdFX1NJWkU7CisJfQorCisJLyoKKwkgKiBTYXZlIHRoZSBwYWdlIHRh
YmxlIHBhZ2UgaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgdGhlIFBERQorCSAqIG1hcHBpbmcg
dGhlIHN1cGVycGFnZSBpcyBkZW1vdGVkIGJ5IHBtYXBfZGVtb3RlX3BkZSgpIG9yCisJICogZGVz
dHJveWVkIGJ5IHBtYXBfcmVtb3ZlX3BkZSgpLgorCSAqLworCW1wdGUgPSBQSFlTX1RPX1ZNX1BB
R0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJS0FTU0VSVChtcHRlID49IHZtX3BhZ2Vf
YXJyYXkgJiYKKwkgICAgbXB0ZSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0s
CisJICAgICgiJXM6IHBhZ2UgdGFibGUgcGFnZSBpcyBvdXQgb2YgcmFuZ2UiLCBfX2Z1bmNfXykp
OworCUtBU1NFUlQobXB0ZS0+cGluZGV4ID09IHBtYXBfcGRlX3BpbmRleCh2YSksCisJICAgICgi
JXM6IHBhZ2UgdGFibGUgcGFnZSdzIHBpbmRleCBpcyB3cm9uZyIsIF9fZnVuY19fKSk7CisJaWYg
KHBtYXBfaW5zZXJ0X3B0X3BhZ2UocG1hcCwgbXB0ZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZw
bWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZv
ciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0
dXJuOworCX0KKworCS8qCisJICogUHJvbW90ZSB0aGUgcHYgZW50cmllcy4KKwkgKi8KKwlpZiAo
cHRlX3Rlc3QoJm5ld3BkZSwgUFRFX01BTkFHRUQpKQorCQlwbWFwX3B2X3Byb21vdGVfcGRlKHBt
YXAsIHZhLCBUTEJMT19QVEVfVE9fUEEobmV3cGRlKSwgbG9ja3ApOworCisJLyoKKwkgKiBNYXAg
dGhlIHN1cGVycGFnZS4KKwkgKi8KKwlwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwgbmV3
cGRlIHwgUFRFX1BTXzFNKTsKKworCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcHJvbW90aW9u
cywgMSk7CisJQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAg
JXAiLCBfX2Z1bmNfXywgdmEsCisJICAgIHBtYXApOworfQorCisvKgorICoJSW5zZXJ0IHRoZSBn
aXZlbiBwaHlzaWNhbCBwYWdlIChwKSBhdAorICoJdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJl
c3MgKHYpIGluIHRoZQorICoJdGFyZ2V0IHBoeXNpY2FsIG1hcCB3aXRoIHRoZSBwcm90ZWN0aW9u
IHJlcXVlc3RlZC4KKyAqCisgKglJZiBzcGVjaWZpZWQsIHRoZSBwYWdlIHdpbGwgYmUgd2lyZWQg
ZG93biwgbWVhbmluZworICoJdGhhdCB0aGUgcmVsYXRlZCBwdGUgY2FuIG5vdCBiZSByZWNsYWlt
ZWQuCisgKgorICoJTkI6ICBUaGlzIGlzIHRoZSBvbmx5IHJvdXRpbmUgd2hpY2ggTUFZIE5PVCBs
YXp5LWV2YWx1YXRlCisgKglvciBsb3NlIGluZm9ybWF0aW9uLiAgVGhhdCBpcywgdGhpcyByb3V0
aW5lIG11c3QgYWN0dWFsbHkKKyAqCWluc2VydCB0aGlzIHBhZ2UgaW50byB0aGUgZ2l2ZW4gbWFw
IE5PVy4KKyAqLworaW50CitwbWFwX2VudGVyKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg
dm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90LAorICAgIHVfaW50IGZsYWdzLCBpbnQ4X3QgcHNp
bmQgX191bnVzZWQpCit7CisgICAgICAgIHN0cnVjdCByd2xvY2sgKmxvY2s7CisgICAgICAgIHZt
X3BhZGRyX3QgcGEsIG9wYTsKKyAgICAgICAgcGRfZW50cnlfdCAqcGRlOworICAgICAgICBwdF9l
bnRyeV90ICpwdGU7CisgICAgICAgIHB0X2VudHJ5X3Qgb3JpZ3B0ZSwgbmV3cHRlOworICAgICAg
ICBwdl9lbnRyeV90IHB2OworICAgICAgICB2bV9wYWdlX3QgbXB0ZSwgb207CisgICAgICAgIGJv
b2xlYW5fdCBub3NsZWVwOworCisgICAgICAgIHZhID0gdHJ1bmNfcGFnZSh2YSk7CisgICAgICAg
IEtBU1NFUlQodmEgPD0gVk1fTUFYX0tFUk5FTF9BRERSRVNTLCAoInBtYXBfZW50ZXI6IHRvb2Jp
ZyIpKTsKKyAgICAgICAgS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCB8
fCB2YSA8IGttaS5jbGVhbl9zdmEgfHwKKyAgICAgICAgICAgIHZhID49IGttaS5jbGVhbl9ldmEs
CisgICAgICAgICAgICAoInBtYXBfZW50ZXI6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNs
ZWFuIHN1Ym1hcCIpKTsKKyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9
PSAwICYmICF2bV9wYWdlX3hidXNpZWQobSkpCisgICAgICAgICAgICAgICAgVk1fT0JKRUNUX0FT
U0VSVF9MT0NLRUQobS0+b2JqZWN0KTsKKworICAgICAgICBtcHRlID0gTlVMTDsKKworICAgICAg
ICBsb2NrID0gTlVMTDsKKyAgICAgICAgcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAg
ICAgIFBNQVBfTE9DSyhwbWFwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbiB0aGUgY2Fz
ZSB0aGF0IGEgcGFnZSB0YWJsZSBwYWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisgICAgICAg
ICAqIGNyZWF0aW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCWlmICh2YSA8IFZNX01BWFVTRVJf
QUREUkVTUykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSGVyZSBp
ZiB0aGUgcHRlIHBhZ2UgaXNuJ3QgbWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorICAgICAgICAg
ICAgICAgICAqIGRlYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAg
ICAgIG5vc2xlZXAgPSAoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU0xFRVApICE9IDA7CisgICAgICAg
ICAgICAgICAgbXB0ZSA9IHBtYXBfYWxsb2NwdGUocG1hcCwgdmEsIG5vc2xlZXAgPyBOVUxMIDog
JmxvY2spOworICAgICAgICAgICAgICAgIGlmIChtcHRlID09IE5VTEwpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIEtBU1NFUlQobm9zbGVlcCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICgicG1hcF9hbGxvY3B0ZSBmYWlsZWQgd2l0aCBzbGVlcCBhbGxvd2VkIikpOworICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcndfd3VubG9jayhsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IHJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBQ
TUFQX1VOTE9DSyhwbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoS0VSTl9S
RVNPVVJDRV9TSE9SVEFHRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcGRlID0g
cG1hcF9wZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJ
cGFuaWMoIiVzOiBhdHRlbXB0ZWQgcG1hcF9lbnRlciBvbiBzdXBlcnBhZ2UiLCBfX2Z1bmNfXyk7
CisJfQorCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworICAgICAgICAvKgorICAg
ICAgICAgKiAgUGFnZSBEaXJlY3RvcnkgdGFibGUgZW50cnkgbm90IHZhbGlkLCB3ZSBuZWVkIGEg
bmV3IFBUIHBhZ2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGUgPT0gTlVMTCkgeworICAg
ICAgICAgICAgICAgIHBhbmljKCJwbWFwX2VudGVyOiBpbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LCBw
ZGlyPSVwLCB2YT0lcCIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopcG1hcC0+cG1fc2Vn
dGFiLCAodm9pZCAqKXZhKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19Q
SFlTKG0pOworICAgICAgICBvbSA9IE5VTEw7CisgICAgICAgIG9yaWdwdGUgPSAqcHRlOworCW9w
YSA9IFRMQkxPX1BURV9UT19QQShvcmlncHRlKTsKKworICAgICAgICBuZXdwdGUgPSBUTEJMT19Q
QV9UT19QRk4ocGEpIHwgaW5pdF9wdGVfcHJvdChtLCBmbGFncywgcHJvdCk7CisgICAgICAgIC8q
CisgICAgICAgICAqIHBtYXBfZW50ZXIoKSBpcyBjYWxsZWQgZHVyaW5nIGEgZmF1bHQgb3Igc2lt
dWxhdGVkIGZhdWx0IHNvCisgICAgICAgICAqIHNldCB0aGUgcmVmZXJlbmNlIGJpdCBub3cgdG8g
YXZvaWQgYSBmYXVsdC4KKyAgICAgICAgICovCisgICAgICAgIHB0ZV9yZWZfc2V0KCZuZXdwdGUp
OworICAgICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9XSVJFRCkgIT0gMCkKKyAgICAgICAg
ICAgICAgICBuZXdwdGUgfD0gUFRFX1c7CisgICAgICAgIGlmIChpc19rZXJuZWxfcG1hcChwbWFw
KSkKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX0c7CisgICAgICAgIGlmIChpc19jYWNo
ZWFibGVfbWVtKHBhKSkgeworICAgICAgICAgICAgICAgIGlmIChtLT5tZC5wdl9tZW1hdHRyID09
IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdwdGUg
fD0gUFRFX0NfVU5DQUNIRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
ICAgICAgICAgbmV3cHRlIHw9IFBURV9DX0NBQ0hFOworICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgICAgICBuZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisjaWZkZWYgQ1BVX0NIRVJJCisgICAg
ICAgIGlmICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PTE9BRFRBR1MpICE9IDApCisgICAgICAgICAg
ICAgICAgbmV3cHRlIHw9IFBURV9MQzsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJf
Tk9TVE9SRVRBR1MpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9TQzsKKyNl
bmRpZgorCisJLyoKKwkgKiBTZXQgbW9kaWZpZWQgYml0IGdyYXR1aXRvdXNseSBmb3Igd3JpdGVh
YmxlIG1hcHBpbmdzIGlmCisJICogdGhlIHBhZ2UgaXMgdW5tYW5hZ2VkLiBXZSBkbyBub3Qgd2Fu
dCB0byB0YWtlIGEgZmF1bHQKKwkgKiB0byBkbyB0aGUgZGlydHkgYml0IGVtdWxhdGlvbiBmb3Ig
dGhlc2UgbWFwcGluZ3MuCisJICovCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAh
PSAwKSB7CisJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCW5ld3B0ZSB8PSBQ
VEVfRDsKKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgbm90IGNoYW5n
ZWQsIG11c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgorICAgICAgICAgKi8KKyAg
ICAgICAgaWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkgJiYgb3BhID09IHBhKSB7CisgICAgICAg
ICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0
ZSBzdGF0cy4gV2UgZG9uJ3Qgd29ycnkgYWJvdXQKKyAgICAgICAgICAgICAgICAgKiB3aXJpbmcg
UFQgcGFnZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9uZyBhcyB0aGVyZQorICAgICAg
ICAgICAgICAgICAqIGFyZSB2YWxpZCBtYXBwaW5ncyBpbiB0aGVtLiBIZW5jZSwgaWYgYSB1c2Vy
IHBhZ2UgaXMKKyAgICAgICAgICAgICAgICAgKiB3aXJlZCwgdGhlIFBUIHBhZ2Ugd2lsbCBiZSBh
bHNvLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgm
bmV3cHRlLCBQVEVfVykgJiYgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVykpCisgICAgICAgICAg
ICAgICAgICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworICAgICAgICAgICAg
ICAgIGVsc2UgaWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfVykgJiYgcHRlX3Rlc3QoJm9yaWdw
dGUsCisgICAgICAgICAgICAgICAgICAgIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAg
IHBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBLQVNTRVJU
KCFwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX0QgfCBQVEVfUk8pLAorICAgICAgICAgICAgICAgICAg
ICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6ICVwLCBwdGU6ICUjangiLAor
ICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClvcmln
cHRlKSk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJlbW92ZSB0
aGUgZXh0cmEgUFQgcGFnZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAg
ICAgICAgICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcHRl
LT53aXJlX2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG1wdGUtPndp
cmVfY291bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicG1hcF9lbnRlcjog
bWlzc2luZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIiB2YTogMHglbHgiLCB2YSkpOworICAgICAgICAgICAgICAgIH0KKwkJaWYg
KHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJCW9tID0gbTsKKwkJCW5ld3B0
ZSB8PSBQVEVfTUFOQUdFRDsKKwkJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJ
CQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKKwkJfQorCQlnb3RvIHZhbGlk
YXRlOworCX0KKworCXB2ID0gTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYXBwaW5n
IGhhcyBjaGFuZ2VkLCBpbnZhbGlkYXRlIG9sZCByYW5nZSBhbmQgZmFsbCB0aHJvdWdoIHRvCisg
ICAgICAgICAqIGhhbmRsZSB2YWxpZGF0aW5nIG5ldyBtYXBwaW5nLgorICAgICAgICAgKi8KKyAg
ICAgICAgaWYgKG9wYSkgeworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwg
UFRFX1cpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRfY291
bnQtLTsKKworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFH
RUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbSA9IFBIWVNfVE9fVk1fUEFHRShvcGEp
OworICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdF
KCZsb2NrLCBvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdiA9IHBtYXBfcHZoX3JlbW92
ZSgmb20tPm1kLCBwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IGlmIChtcHRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wdGUtPndpcmVf
Y291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBU1NFUlQobXB0ZS0+d2lyZV9jb3Vu
dCA+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtaXNzaW5n
IHJlZmVyZW5jZSB0byBwYWdlIHRhYmxlIHBhZ2UsIgorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICIgdmE6ICVwIiwgKHZvaWQgKil2YSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
fSBlbHNlCisgICAgICAgICAgICAgICAgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgMSk7
CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRW50ZXIgb24gdGhlIFBWIGxpc3QgaWYgcGFydCBv
ZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG0tPm9mbGFn
cyAmIFZQT19VTk1BTkFHRUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRF
X01BTkFHRUQ7CisJCS8qIEluc2VydCBFbnRyeSAqLworCQlpZiAocHYgPT0gTlVMTCkKKwkJCXB2
ID0gZ2V0X3B2X2VudHJ5KHBtYXAsICZsb2NrKTsKKyAgICAgICAgICAgICAgICBwdi0+cHZfdmEg
PSB2YTsKKyAgICAgICAgICAgICAgICBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1BIWVMoJmxvY2ss
IHBhKTsKKyAgICAgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwg
cHYsIHB2X25leHQpOworICAgICAgICAgICAgICAgIG0tPm1kLnB2X2dlbisrOworICAgICAgICAg
ICAgICAgIGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOworICAgICAgICB9IGVs
c2UgaWYgKHB2ICE9IE5VTEwpCisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCisKKyAgICAg
ICAgLyoKKyAgICAgICAgICogSW5jcmVtZW50IGNvdW50ZXJzCisgICAgICAgICAqLworICAgICAg
ICBpZiAocHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgIHBtYXAtPnBt
X3N0YXRzLndpcmVkX2NvdW50Kys7CisKK3ZhbGlkYXRlOgorI2lmZGVmIFBNQVBfREVCVUcKKyAg
ICAgICAgcHJpbnRmKCJwbWFwX2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2
YSwgKHZvaWQgKilwYSk7CisjZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgdGhlIG1h
cHBpbmcgb3IgcGVybWlzc2lvbiBiaXRzIGFyZSBkaWZmZXJlbnQsIHdlIG5lZWQgdG8KKyAgICAg
ICAgICogdXBkYXRlIHRoZSBwdGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG9yaWdwdGUg
JiB+IChQVEVfRHxQVEVfUkVGKSkgIT0gbmV3cHRlKSB7CisgICAgICAgICAgICAgICAgbmV3cHRl
IHw9IFBURV9WUjsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgVk1fUFJPVF9XUklURSkg
IT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfRDsKKyAgICAgICAg
ICAgICAgICBpZiAocHRlX2lzX3ZhbGlkKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgYm9vbGVhbl90IGludmx2YSA9IEZBTFNFOworCisJCQlvcmlncHRlID0gcHRlX2xvYWRf
c3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc19y
ZWYoJm9yaWdwdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVf
dGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG9tLCBQR0FfUkVGRVJFTkNFRCk7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGEgIT0gcGEpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52bHZhID0gVFJVRTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0
ZSwgUFRFX0QpICYmCisJCQkgICAgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfUk8pKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01B
TkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2Vf
ZGlydHkob20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3QgJiBW
TV9QUk9UX1dSSVRFKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGludmx2YSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJgorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIFRBSUxRX0VNUFRZKCZvbS0+bWQucHZfbGlzdCkgJiYK
KwkJCSAgICAoKG9tLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkJCSAgICBUQUlM
UV9FTVBUWSgmcGFfdG9fcHZoKG9wYSktPnB2X2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihvbSwgUEdBX1dSSVRFQUJMRSk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoaW52bHZhKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAg
fSBlbHNlCisJCQlwdGVfc3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICB9CisKKyAgICAgICAg
LyoKKyAgICAgICAgICogIElmIGJvdGggdGhlIHBhZ2UgdGFibGUgcGFnZSBhbmQgdGhlIHJlc2Vy
dmF0aW9uIGFyZSBmdWxseQorICAgICAgICAgKiAgcG9wdWxhdGVkLCB0aGVuIGF0dGVtcHQgcHJv
bW90aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChtcHRlID09IE5VTEwgfHwgbXB0ZS0+
d2lyZV9jb3VudCA9PSBOUFRFUEcpICYmCisgICAgICAgICAgICAobS0+ZmxhZ3MgJiBQR19GSUNU
SVRJT1VTKSA9PSAwICYmCisgICAgICAgICAgICBwZ19zcF9lbmFibGVkICYmIHZtX3Jlc2Vydl9s
ZXZlbF9pZmZ1bGxwb3AobSkgPT0gMCkKKyAgICAgICAgICAgICAgICBwbWFwX3Byb21vdGVfcGRl
KHBtYXAsIHBkZSwgdmEsICZsb2NrKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTeW5jIEkg
JiBEIGNhY2hlcyBmb3IgZXhlY3V0YWJsZSBwYWdlcy4gIERvIHRoaXMgb25seSBpZiB0aGUKKyAg
ICAgICAgICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3Ro
ZXJ3aXNlLCBhbgorICAgICAgICAgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgor
ICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFpc19rZXJuZWxfcG1hcChwbWFwKSAmJiAocG1hcCA9
PSAmY3VycHJvYy0+cF92bXNwYWNlLT52bV9wbWFwKSAmJgorICAgICAgICAgICAgKHByb3QgJiBW
TV9QUk9UX0VYRUNVVEUpKSB7CisgICAgICAgICAgICAgICAgbWlwc19pY2FjaGVfc3luY19yYW5n
ZSh2YSwgUEFHRV9TSVpFKTsKKyAgICAgICAgICAgICAgICBtaXBzX2RjYWNoZV93Ymludl9yYW5n
ZSh2YSwgUEFHRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jayAhPSBOVUxMKQor
ICAgICAgICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7CisgICAgICAgIHJ3X3J1bmxvY2soJnB2
aF9nbG9iYWxfbG9jayk7CisgICAgICAgIFBNQVBfVU5MT0NLKHBtYXApOworICAgICAgICByZXR1
cm4gKEtFUk5fU1VDQ0VTUyk7Cit9CisKKy8qCisgKiB0aGlzIGNvZGUgbWFrZXMgc29tZSAqTUFK
T1IqIGFzc3VtcHRpb25zOgorICogMS4gQ3VycmVudCBwbWFwICYgcG1hcCBleGlzdHMuCisgKiAy
LiBOb3Qgd2lyZWQuCisgKiAzLiBSZWFkIGFjY2Vzcy4KKyAqIDQuIE5vIHBhZ2UgdGFibGUgcGFn
ZXMuCisgKiBidXQgaXMgKk1VQ0gqIGZhc3RlciB0aGFuIHBtYXBfZW50ZXIuLi4KKyAqLwordm9p
ZAorcG1hcF9lbnRlcl9xdWljayhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2Vf
dCBtLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCisJbG9jayA9
IE5VTEw7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOwor
CSh2b2lkKXBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LCBOVUxMLCAm
bG9jayk7CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5s
b2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCitzdGF0aWMg
dm1fcGFnZV90CitwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdlX3QgbXB0ZSwg
c3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB0X2VudHJ5X3QgKnB0ZSwgbmV3cHRlOworCXZt
X3BhZGRyX3QgcGE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKworCUtBU1NFUlQodmEgPCBrbWku
Y2xlYW5fc3ZhIHx8IHZhID49IGttaS5jbGVhbl9ldmEgfHwKKwkgICAgKG0tPm9mbGFncyAmIFZQ
T19VTk1BTkFHRUQpICE9IDAsCisJICAgICgiJXM6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhl
IGNsZWFuIHN1Ym1hcCIsIF9fZnVuY19fKSk7CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ss
IFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgor
CSAqIEluIHRoZSBjYXNlIHRoYXQgYSBwYWdlIHRhYmxlIHBhZ2UgaXMgbm90IHJlc2lkZW50LCB3
ZSBhcmUKKwkgKiBjcmVhdGluZyBpdCBoZXJlLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJf
QUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGU7CisJCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwor
CQkvKgorCQkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXgKKwkJICovCisJCXB0ZXBp
bmRleCA9IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlmIChtcHRlICYmIChtcHRlLT5waW5kZXgg
PT0gcHRlcGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJ
LyoKKwkJCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkJCSAqLworCQkJcGRlID0g
cG1hcF9wZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFn
ZSBpcyBtYXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudCwgYW5k
IGFjdGl2YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRlICYmICpwZGUgIT0gMCkgeworCQkJCWlm
IChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJbXB0
ZSA9IFBIWVNfVE9fVk1fUEFHRSgKKwkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7
CisJCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFBh
c3MgTlVMTCBpbnN0ZWFkIG9mIHRoZSBQViBsaXN0IGxvY2sKKwkJCQkgKiBwb2ludGVyLCBiZWNh
dXNlIHdlIGRvbid0IGludGVuZCB0byBzbGVlcC4KKwkJCQkgKi8KKwkJCQltcHRlID0gX3BtYXBf
YWxsb2NwdGUocG1hcCwgcHRlcGluZGV4LCBOVUxMKTsKKwkJCQlpZiAobXB0ZSA9PSBOVUxMKQor
CQkJCQlyZXR1cm4gKG1wdGUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbXB0ZSA9IE5VTEw7
CisJfQorCisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCWlmIChwdGVfaXNfdmFsaWQocHRl
KSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQltcHRlLT53aXJlX2NvdW50LS07CisJCQlt
cHRlID0gTlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJICogRW50ZXIg
b24gdGhlIFBWIGxpc3QgaWYgcGFydCBvZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisJICovCisJaWYg
KChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYmCisJICAgICFwbWFwX3RyeV9pbnNl
cnRfcHZfZW50cnkocG1hcCwgdmEsIG0sIGxvY2twKSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7
CisJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCWlmIChwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEs
IG1wdGUsICZmcmVlKSkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJ
CQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQl9CisKKwkJCW1wdGUgPSBOVUxMOwor
CQl9CisJCXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMK
KwkgKi8KKwlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKworCXBhID0gVk1fUEFH
RV9UT19QSFlTKG0pOworCisJLyoKKwkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHBy
b3RlY3Rpb24KKwkgKi8KKwluZXdwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwg
UFRFX1ZBTElEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKKwkJbmV3
cHRlIHw9IFBURV9NQU5BR0VEOworCisJaWYgKGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlm
IChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwdGUg
fD0gUFRFX0NfVU5DQUNIRUQ7CisJCWVsc2UKKwkJCW5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKwl9
IGVsc2UKKwkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCisJc2NoZWRfcGluKCk7CisJaWYg
KGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCW5ld3B0ZSB8PSBQVEVfRzsKKwkJcHRlX3JlZl9z
ZXQoJm5ld3B0ZSk7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJfSBlbHNlIHsKKwkJcHRl
X3N0b3JlKHB0ZSwgbmV3cHRlKTsKKwkJLyoKKwkJICogU3luYyBJICYgRCBjYWNoZXMuICBEbyB0
aGlzIG9ubHkgaWYgdGhlIHRhcmdldCBwbWFwCisJCSAqIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQg
cHJvY2Vzcy4gIE90aGVyd2lzZSwgYW4KKwkJICogdW5yZXNvbHZhYmxlIFRMQiBtaXNzIG1heSBv
Y2N1ci4KKwkJICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAp
IHsKKwkJCXZhICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBQ
QUdFX1NJWkUpOworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJ
CX0KKwl9CisJc2NoZWRfdW5waW4oKTsKKworCXJldHVybiAobXB0ZSk7Cit9CisKKy8qCisgKiBN
YWtlIGEgdGVtcG9yYXJ5IG1hcHBpbmcgZm9yIGEgcGh5c2ljYWwgYWRkcmVzcy4gIFRoaXMgaXMg
b25seSBpbnRlbmRlZAorICogdG8gYmUgdXNlZCBmb3IgcGFuaWMgZHVtcHMuCisgKgorICogVXNl
IFhLUEhZUyBmb3IgNjQgYml0LgorICovCit2b2lkICoKK3BtYXBfa2VudGVyX3RlbXBvcmFyeSh2
bV9wYWRkcl90IHBhLCBpbnQgaSkKK3sKKworCWlmIChpICE9IDApCisJCXByaW50ZigiJXM6IEVS
Uk9SISEhIE1vcmUgdGhhbiBvbmUgcGFnZSBvZiB2aXJ0dWFsIGFkZHJlc3MgIgorCQkgICAgIm1h
cHBpbmcgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuICgodm9pZCAqKU1J
UFNfUEhZU19UT19ESVJFQ1QocGEpKTsKK30KKwordm9pZAorcG1hcF9rZW50ZXJfdGVtcG9yYXJ5
X2ZyZWUodm1fcGFkZHJfdCBwYSkKK3sKKworCS8qIG5vdGhpbmcgdG8gZG8gZm9yIG1pcHM2NCAq
LworCXJldHVybjsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3BkZShwbWFwX3Qg
cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl2bV9waW5k
ZXhfdCBwZHBpbmRleCwgcHRlcGluZGV4OworCXBkX2VudHJ5X3QgKnBkcGU7CisJdm1fcGFnZV90
IG1wdGUgPSBOVUxMOworCisJaWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CityZXRyeToK
KwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJaWYgKHBkcGUgIT0gTlVMTCAmJiAo
KnBkcGUgIT0gTlVMTCkpIHsKKwkJCS8qIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcGQgcGFnZS4g
Ki8KKwkJCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRwZSkp
OworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyogQWxsb2NhdGUgYSBw
ZCBwYWdlLiAqLworCisJCQkvKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXguICovCisJ
CQlwdGVwaW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQkJcGRwaW5kZXggPSBwdGVwaW5k
ZXggPj4gTlBERVBHU0hJRlQ7ICAvKiBYWFggKi8KKwkJCW1wdGUgPSBfcG1hcF9hbGxvY3B0ZShw
bWFwLCBOVVBERSArIHBkcGluZGV4LCBsb2NrcCk7CisJCQlpZiAobXB0ZSA9PSBOVUxMICYmIGxv
Y2twICE9IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKG1wdGUpOwor
fQorCisvKgorICogVHJpZXMgdG8gY3JlYXRlIGEgMk1CIHBhZ2UgbWFwcGluZy4gIFJldHVybnMg
VFJVRSBpZiBzdWNjZXNzZnVsIGFuZCBGQUxTRQorICogb3RoZXJ3aXNlLiAgRmFpbHMgaWYgKDEp
IGEgcGFnZSB0YWJsZSBwYWdlIGNhbm5vdCBiZSBhbGxvY2F0ZWQgd2l0aG91dAorICogYmxvY2tp
bmcsICgyKSBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHNwZWNpZmllZCB2aXJ0dWFs
IGFkZHJlc3MsIG9yCisgKiAoMykgYSBwdiBlbnRyeSBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhv
dXQgcmVjbGFpbWluZyBhbm90aGVyIHB2IGVudHJ5LgorICovCitzdGF0aWMgYm9vbGVhbl90Citw
bWFwX2VudGVyX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2
bV9wcm90X3QgcHJvdCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJcGRfZW50cnlf
dCAqcGRlOworCXB0X2VudHJ5X3QgbmV3cGRlOworCXZtX3BhZ2VfdCBtcGRlOworCXN0cnVjdCBz
cGdsaXN0IGZyZWU7CisJdm1fcGFkZHJfdCBwYTsKKworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFs
X2xvY2ssIFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisK
KwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJLyogTm90IGRvaW5nIHRoZSBrZXJuZWwg
cG1hcCBmb3Igbm93ICovCisJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNs
eCBpbiBwbWFwICVwOiBrZXJuZWwgbWFwIiwKKwkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJ
CXJldHVybiAoRkFMU0UpOworCX0KKwlpZiAoKG1wZGUgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIHZh
LCBOVUxMKSkgPT0gTlVMTCkgeworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZh
ICUjbHggaW4gcG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4g
KEZBTFNFKTsKKwl9CisJLyogcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOyAqLworCXBkZSA9IChw
ZF9lbnRyeV90ICopTUlQU19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobXBkZSkpOwor
CXBkZSA9ICZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXTsKKwlpZiAocGRlID09IE5VTEwpIHsKKwkJ
S0FTU0VSVChtcGRlLT53aXJlX2NvdW50ID4gMSwKKwkJICAgICgiJXM6IG1wZGUncyB3aXJlIGNv
dW50IGlzIHRvbyBsb3ciLCBfX2Z1bmNfXykpOworCQltcGRlLT53aXJlX2NvdW50LS07CisJCUNU
UjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5j
X18sCisJCSAgICB2YSwgcG1hcCk7CisJCXJldHVybiAoRkFMU0UpOworCX0KKwlwYSA9IFZNX1BB
R0VfVE9fUEhZUyhtKTsKKyAgICAgICAgbmV3cGRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZO
KHBhKSB8IFBURV9WQUxJRCB8IFBURV9QU18xTTsKKwlpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkp
IHsKKwkJaWYgKG0tPm1kLnB2X21lbWF0dHIgPT0gVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJ
CW5ld3BkZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJZWxzZQorCQkJbmV3cGRlIHw9IFBURV9DX0NB
Q0hFOworCX0gZWxzZQorCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJaWYgKChtLT5vZmxh
Z3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJCW5ld3BkZSB8PSBQVEVfTUFOQUdFRDsKKwor
CQkvKgorCQkgKiBBYm9ydCB0aGlzIG1hcHBpbmcgaWYgaXRzIFBWIGVudHJ5IGNvdWxkIG5vdCBi
ZSBjcmVhdGVkLgorCQkgKi8KKwkJaWYgKCFwbWFwX3B2X2luc2VydF9wZGUocG1hcCwgdmEsIFZN
X1BBR0VfVE9fUEhZUyhtKSwKKwkJICAgIGxvY2twKSkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7
CisJCQlpZiAocG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcGRlLCAmZnJlZSkpIHsKKwkJCQlw
bWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMo
JmZyZWUpOworCQkJfQorCQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4
IGluIHBtYXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCQlyZXR1cm4gKEZB
TFNFKTsKKwkJfQorCX0KKworCS8qCisJICogSW5jcmVtZW50IGNvdW50ZXJzLgorCSAqLworCSBw
bWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisKKwkgLyoK
KwkgICogTWFwIHRoZSBzdXBlcnBhZ2UuCisJICAqLworCSBzY2hlZF9waW4oKTsKKwkgcGRlX3N0
b3JlKHBkZSwgbmV3cGRlKTsKKworCS8qCisJICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1
dGFibGUgcGFnZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlCisJICogdGFyZ2V0IHBtYXAgYmVsb25n
cyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBhbgorCSAqIHVucmVzb2x2YWJs
ZSBUTEIgbWlzcyBtYXkgb2NjdXIuCisJICovCisJIGlmICghaXNfa2VybmVsX3BtYXAocG1hcCkg
JiYgKHBtYXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYKKwkgICAgIChwcm90
ICYgVk1fUFJPVF9FWEVDVVRFKSkgeworCQkJIHZhICY9IH5QRFJNQVNLOworCQkJIG1pcHNfaWNh
Y2hlX3N5bmNfcmFuZ2UodmEsIE5CUERSKTsKKwkJCSBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2
YSwgTkJQRFIpOworCisJIH0KKwkgc2NoZWRfdW5waW4oKTsKKworCSBhdG9taWNfYWRkX2xvbmco
JnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZv
ciB2YSAlI2x4IGluIHBtYXAgJXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKwkgcmV0
dXJuIChUUlVFKTsKK30KKworLyoKKyAqIE1hcHMgYSBzZXF1ZW5jZSBvZiByZXNpZGVudCBwYWdl
cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgb2JqZWN0LgorICogVGhlIHNlcXVlbmNlIGJlZ2lucyB3
aXRoIHRoZSBnaXZlbiBwYWdlIG1fc3RhcnQuICBUaGlzIHBhZ2UgaXMKKyAqIG1hcHBlZCBhdCB0
aGUgZ2l2ZW4gdmlydHVhbCBhZGRyZXNzIHN0YXJ0LiAgRWFjaCBzdWJzZXF1ZW50IHBhZ2UgaXMK
KyAqIG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyB0aGF0IGlzIG9mZnNldCBmcm9tIHN0YXJ0
IGJ5IHRoZSBzYW1lCisgKiBhbW91bnQgYXMgdGhlIHBhZ2UgaXMgb2Zmc2V0IGZyb20gbV9zdGFy
dCB3aXRoaW4gdGhlIG9iamVjdC4gIFRoZQorICogbGFzdCBwYWdlIGluIHRoZSBzZXF1ZW5jZSBp
cyB0aGUgcGFnZSB3aXRoIHRoZSBsYXJnZXN0IG9mZnNldCBmcm9tCisgKiBtX3N0YXJ0IHRoYXQg
Y2FuIGJlIG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyBsZXNzIHRoYW4gdGhlIGdpdmVuCisg
KiB2aXJ0dWFsIGFkZHJlc3MgZW5kLiAgTm90IGV2ZXJ5IHZpcnR1YWwgcGFnZSBiZXR3ZWVuIHN0
YXJ0IGFuZCBlbmQKKyAqIGlzIG1hcHBlZDsgb25seSB0aG9zZSBmb3Igd2hpY2ggYSByZXNpZGVu
dCBwYWdlIGV4aXN0cyB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyBvZmZzZXQgZnJvbSBtX3N0
YXJ0IGFyZSBtYXBwZWQuCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfb2JqZWN0KHBtYXBfdCBwbWFw
LCB2bV9vZmZzZXRfdCBzdGFydCwgdm1fb2Zmc2V0X3QgZW5kLAorICAgIHZtX3BhZ2VfdCBtX3N0
YXJ0LCB2bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNl
dF90IHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCXZtX3BpbmRleF90IGRpZmYsIHBzaXplOwor
CisJVk1fT0JKRUNUX0FTU0VSVF9MT0NLRUQobV9zdGFydC0+b2JqZWN0KTsKKworCXBzaXplID0g
YXRvcChlbmQgLSBzdGFydCk7CisJbXB0ZSA9IE5VTEw7CisJbSA9IG1fc3RhcnQ7CisJbG9jayA9
IE5VTEw7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOwor
CXdoaWxlIChtICE9IE5VTEwgJiYgKGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5waW5kZXgp
IDwgcHNpemUpIHsKKwkJdmEgPSBzdGFydCArIHB0b2EoZGlmZik7CisJCWlmICgodmEgJiBQRFJN
QVNLKSA9PSAwICYmIHZhICsgTkJQRFIgPD0gZW5kICYmCisJCSAgICBtLT5wc2luZCA9PSAxICYm
IHBnX3NwX2VuYWJsZWQgJiYKKwkJICAgIHBtYXBfZW50ZXJfcGRlKHBtYXAsIHZhLCBtLCBwcm90
LCAmbG9jaykpCisJCQltID0gJm1bTkJQRFIgLyBQQUdFX1NJWkUgLSAxXTsKKwkJZWxzZQorCQkJ
bXB0ZSA9IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LAorCQkJICAg
IG1wdGUsICZsb2NrKTsKKwkJbSA9IFRBSUxRX05FWFQobSwgbGlzdHEpOworCX0KKwlpZiAobG9j
ayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxf
bG9jayk7CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKiBwbWFwX29iamVjdF9pbml0
X3B0IHByZWxvYWRzIHRoZSBwdGVzIGZvciBhIGdpdmVuIG9iamVjdAorICogaW50byB0aGUgc3Bl
Y2lmaWVkIHBtYXAuICBUaGlzIGVsaW1pbmF0ZXMgdGhlIGJsYXN0IG9mIHNvZnQKKyAqIGZhdWx0
cyBvbiBwcm9jZXNzIHN0YXJ0dXAgYW5kIGltbWVkaWF0ZWx5IGFmdGVyIGEgbW1hcCgpLgorICoK
KyAqIFRoaXMgY29kZSBtYXBzIGxhcmdlIHBoeXNpY2FsIG1tYXAgcmVnaW9ucyBpbnRvIHRoZQor
ICogcHJvY2Vzc29yIGFkZHJlc3Mgc3BhY2UuIE5vdGUgdGhhdCBzb21lIHNob3J0Y3V0cworICog
YXJlIHRha2VuLCBidXQgdGhlIGNvZGUgd29ya3MuCisgKi8KK3ZvaWQKK3BtYXBfb2JqZWN0X2lu
aXRfcHQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX29iamVjdF90IG9iamVjdCwK
KyAgICB2bV9waW5kZXhfdCBwaW5kZXgsIHZtX3NpemVfdCBzaXplKQoreworCXBkX2VudHJ5X3Qg
KnBkZTsKKwl2bV9wYWRkcl90IHBhLCBwdGVwYTsKKwl2bV9wYWdlX3QgcCwgcGRwZzsKKwl2bV9t
ZW1hdHRyX3QgbWVtYXR0cjsKKworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChvYmplY3QpOwor
CUtBU1NFUlQob2JqZWN0LT50eXBlID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+dHlwZSA9PSBP
QkpUX1NHLAorCSAgICAoInBtYXBfb2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ugb2JqZWN0Iikp
OworCisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIE5vdCBkb2luZyB0aGUga2Vy
bmVsIHBtYXAgZm9yIG5vdy4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgoYWRkciAmIChOQlBE
UiAtIDEpKSA9PSAwICYmIChzaXplICYgKE5CUERSIC0gMSkpID09IDApIHsKKwkJaWYgKCFwZ19z
cF9lbmFibGVkKQorCQkJcmV0dXJuOworCQlpZiAoIXZtX29iamVjdF9wb3B1bGF0ZShvYmplY3Qs
IHBpbmRleCwgcGluZGV4ICsgYXRvcChzaXplKSkpCisJCQlyZXR1cm47CisJCXAgPSB2bV9wYWdl
X2xvb2t1cChvYmplY3QsIHBpbmRleCk7CisJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9C
SVRTX0FMTCwKKwkJICAgICgiJXM6IGludmFsaWQgcGFnZSAlcCIsIF9fZnVuY19fLCBwKSk7CisJ
CW1lbWF0dHIgPSBwLT5tZC5wdl9tZW1hdHRyOworCisJCS8qCisJCSAqIEFib3J0IHRoZSBtYXBw
aW5nIGlmIHRoZSBmaXJzdCBwYWdlIGlzIG5vdCBwaHlzaWNhbGx5CisJCSAqIGFsaWduZWQgdG8g
YSAyTUIgcGFnZSBib3VuZGFyeS4KKwkJICovCisJCXB0ZXBhID0gVk1fUEFHRV9UT19QSFlTKHAp
OworCQlpZiAocHRlcGEgJiAoTkJQRFIgLSAxKSkKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBT
a2lwIHRoZSBmaXJzdCBwYWdlLiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgcmVzdCBvZgorCQkg
KiB0aGUgcGFnZXMgYXJlIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgb3IgaGF2ZSBkaWZmZXJp
bmcKKwkJICogbWVtb3J5IGF0dHJpYnV0ZXMuCisJCSAqLworCQlwID0gVEFJTFFfTkVYVChwLCBs
aXN0cSk7CisJCWZvciAocGEgPSBwdGVwYSArIFBBR0VfU0laRTsgcGEgPCBwdGVwYSArIHNpemU7
CisJCSAgICBwYSArPSBQQUdFX1NJWkUpIHsKKwkJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFH
RV9CSVRTX0FMTCwKKwkJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2UgJXAiLCBfX2Z1bmNfXywgcCkp
OworCQkJaWYgKHBhICE9IFZNX1BBR0VfVE9fUEhZUyhwKSB8fAorCQkJICAgIG1lbWF0dHIgIT0g
cC0+bWQucHZfbWVtYXR0cikKKwkJCQlyZXR1cm47CisJCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0
cSk7CisJCX0KKworCQkvKgorCQkgKiBNYXAgdXNpbmcgMk1CIHBhZ2VzLiAgInB0ZXBhIiBpcyAy
TSBhbGlnbmVkIGFuZCAic2l6ZSIKKwkJICogaXMgYSBtdWx0aXBsZSBvZiAyTS4KKwkJICovCisJ
CVBNQVBfTE9DSyhwbWFwKTsKKwkJZm9yIChwYSA9IHB0ZXBhOyBwYSA8IHB0ZXBhICsgc2l6ZTsg
cGEgKz0gTkJQRFIpIHsKKwkJCXBkcGcgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIGFkZHIsIE5VTEwp
OworCQkJaWYgKHBkcGcgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogVGhlIGNyZWF0aW9uIG9m
IG1hcHBpbmdzIGJlbG93IGlzIG9ubHkgYW4KKwkJCQkgKiBvcHRpbWl6YXRpb24uICBJZiBhIHBh
Z2UgZGlyZWN0b3J5IHBhZ2UKKwkJCQkgKiBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgYmxv
Y2tpbmcsCisJCQkJICogY29udGludWUgb24gdG8gdGhlIG5leHQgbWFwcGluZyByYXRoZXIgdGhh
bgorCQkJCSAqIGJsb2NraW5nLgorCQkJCSAqLworCQkJCWFkZHIgKz0gTkJQRFI7CisJCQkJY29u
dGludWU7CisJCQl9CisJCQlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1Qo
CisJCQkgICAgVk1fUEFHRV9UT19QSFlTKHBkcGcpKTsKKwkJCXBkZSA9ICZwZGVbcG1hcF9wZGVf
aW5kZXgoYWRkcildOworCQkJaWYgKCFwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZGUpKSB7
CisJCQkJcHRfZW50cnlfdCBuZXdwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwKKwkJCQkgICAg
UFRFX1BTXzFNIHwgUFRFX0QgfCBQVEVfUkVGIHwgUFRFX1ZBTElEOworCisJCQkJaWYgKGlzX2Nh
Y2hlYWJsZV9tZW0ocGEpKSB7CisJCQkJCWlmIChwZHBnLT5tZC5wdl9tZW1hdHRyID09CisJCQkJ
CSAgICBWTV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorCQkJCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FD
SEVEOworCQkJCQllbHNlCisJCQkJCQluZXdwdGUgfD0gUFRFX0NfQ0FDSEU7CisJCQkJfSBlbHNl
CisJCQkJCW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKworCQkJCXBkZV9zdG9yZShwZGUsIG5l
d3B0ZSk7CisJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIvUEFHRV9TSVpF
KTsKKwkJCQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkJCX0gZWxz
ZSB7CisJCQkJLyogQ29udGludWUgb24gaWYgdGhlIFBERSBpcyBhbHJlYWR5IHZhbGlkLiAqLwor
CQkJCXBkcGctPndpcmVfY291bnQtLTsKKwkJCQlLQVNTRVJUKHBkcGctPndpcmVfY291bnQgPiAw
LAorCQkJCSAgICAoIiVzOiBtaXNzaW5nIHJlZmVyZW5jZSB0byBwYWdlIGRpcmVjdG9yeSAiCisJ
CQkJICAgICJwYWdlLCB2YTogMHglbHgiLCBfX2Z1bmNfXywgYWRkcikpOworCQkJfQorCQkJYWRk
ciArPSBOQlBEUjsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9Cit9CisKKy8qCisgKglD
bGVhciB0aGUgd2lyZWQgYXR0cmlidXRlIGZyb20gdGhlIG1hcHBpbmdzIGZvciB0aGUgc3BlY2lm
aWVkIHJhbmdlIG9mCisgKglhZGRyZXNzZXMgaW4gdGhlIGdpdmVuIHBtYXAuICBFdmVyeSB2YWxp
ZCBtYXBwaW5nIHdpdGhpbiB0aGF0IHJhbmdlCisgKgltdXN0IGhhdmUgdGhlIHdpcmVkIGF0dHJp
YnV0ZSBzZXQuICBJbiBjb250cmFzdCwgaW52YWxpZCBtYXBwaW5ncworICoJY2Fubm90IGhhdmUg
dGhlIHdpcmVkIGF0dHJpYnV0ZSBzZXQsIHNvIHRoZXkgYXJlIGlnbm9yZWQuCisgKgorICoJVGhl
IHdpcmVkIGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyeSBpcyBub3QgYSBoYXJkd2Fy
ZSBmZWF0dXJlLAorICoJc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIGFueSBUTEIg
ZW50cmllcy4KKyAqLwordm9pZAorcG1hcF91bndpcmUocG1hcF90IHBtYXAsIHZtX29mZnNldF90
IHN2YSwgdm1fb2Zmc2V0X3QgZXZhKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRf
ZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJYm9vbGVhbl90IHB2X2xpc3Rz
X2xvY2tlZDsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1lOgorCVBNQVBfTE9D
SyhwbWFwKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBw
bWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gTlVMTCkgeworCQkJdmFfbmV4
dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJ
CXZhX25leHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5C
UERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7
CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJaWYgKCpwZGUgPT0gTlVM
TCkKKwkJCWNvbnRpbnVlOworCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlp
ZiAoIXBkZV90ZXN0KHBkZSwgUFRFX1cpKQorCQkJCXBhbmljKCJwbWFwX3Vud2lyZTogcGRlICUj
anggaXMgbWlzc2luZyBQVEVfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnBkZSk7CisJCQkvKgor
CQkJICogQXJlIHdlIHVud2lyaW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkg
KiBkZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2
YSArIE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQlhdG9taWNfY2xl
YXJfbG9uZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1cpOworCQkJCXBtYXAtPnBtX3N0YXRzLndp
cmVkX2NvdW50IC09IE5CUERSIC8gUEFHRV9TSVpFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNl
IHsKKwkJCQlpZiAoIXB2X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBU
UlVFOworCQkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJ
IFBNQVBfVU5MT0NLKHBtYXApOworCQkJCQkJIHJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwor
CQkJCQkJIC8qIFJlcGVhdCBzdmEuICovCisJCQkJCQkgZ290byByZXN1bWU7CisJCQkJCX0KKwkJ
CQl9CisJCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUocG1hcCwgcGRlLCBzdmEpKQorCQkJCQlwYW5p
YygicG1hcF91bndpcmU6IGRlbW90aW9uIGZhaWxlZCIpOworCQkJfQorCQl9CisJCWlmICh2YV9u
ZXh0ID4gZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19w
dGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9T
SVpFKSB7CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYg
KCFwdGVfdGVzdChwdGUsIFBURV9XKSkKKwkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4
IGlzIG1pc3NpbmcgUEdfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnB0ZSk7CisJCQkvKgorCQkJ
ICogUFRFX1cgbXVzdCBiZSBjbGVhcmVkIGF0b21pY2FsbHkuICBBbHRob3VnaCB0aGUgcG1hcAor
CQkJICogbG9jayBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIFBURV9XLCBhbm90aGVyIHByb2Nlc3Nv
cgorCQkJICogY291bGQgYmUgc2V0dGluZyBQVEVfRCBhbmQvb3IgUFRFX1JFRiBjb25jdXJyZW50
bHkuCisJCQkgKi8KKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfVyk7CisJCQlwbWFwLT5w
bV9zdGF0cy53aXJlZF9jb3VudC0tOworCQl9CisJfQorCWlmIChwdl9saXN0c19sb2NrZWQpIHsK
KwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7
Cit9CisKKy8qCisgKglDb3B5IHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgc3JjX2FkZHIvbGVuCisg
Kglmcm9tIHRoZSBzb3VyY2UgbWFwIHRvIHRoZSByYW5nZSBkc3RfYWRkci9sZW4KKyAqCWluIHRo
ZSBkZXN0aW5hdGlvbiBtYXAuCisgKgorICoJVGhpcyByb3V0aW5lIGlzIG9ubHkgYWR2aXNvcnkg
YW5kIG5lZWQgbm90IGRvIGFueXRoaW5nLgorICovCisKK3ZvaWQKK3BtYXBfY29weShwbWFwX3Qg
ZHN0X3BtYXAsIHBtYXBfdCBzcmNfcG1hcCwgdm1fb2Zmc2V0X3QgZHN0X2FkZHIsCisgICAgdm1f
c2l6ZV90IGxlbiwgdm1fb2Zmc2V0X3Qgc3JjX2FkZHIpCit7CisjaWYgMAorLyoKKyAqIFhYWCBU
aGlzIGRvZXNuJ3QgaGVscCB3aXRoIGZvcmsoKSBwZXJmb3JtYW5jZSBhbmQKKyAqIGFkZHMgbW9y
ZSBvdmVyaGVhZC4gIE1heWJlIHRoZSByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorICogaXMgY2F1
c2luZyBmYXVsdC1saWtlIG92ZXJoZWFkIGFueXdheT8KKyAqLworCisJc3RydWN0IHJ3bG9jayAq
bG9jazsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX29mZnNldF90IGFkZHIsIGVuZF9hZGRy
LCB2YV9uZXh0OworCisJaWYgKGRzdF9hZGRyICE9IHNyY19hZGRyKQorCQlyZXR1cm47CisKKwlp
ZiAoUENQVV9HRVQoY3VycG1hcCkgIT0gc3JjX3BtYXApCisJCXJldHVybjsKKworCWVuZF9hZGRy
ID0gc3JjX2FkZHIgKyBsZW47CisKKwlsb2NrID0gTlVMTDsKKwlyd19ybG9jaygmcHZoX2dsb2Jh
bF9sb2NrKTsKKwkvKiBMb2NrIHRoZSBwbWFwcyBpbiB0aGUgc2FtZSBvcmRlciB0byBhdm9pZCBk
ZWFkbG9jay4gKi8KKwlpZiAoZHN0X3BtYXAgPCBzcmNfcG1hcCkgeworCQlQTUFQX0xPQ0soZHN0
X3BtYXApOworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCX0gZWxzZSB7CisJCVBNQVBfTE9DSyhz
cmNfcG1hcCk7CisJCVBNQVBfTE9DSyhkc3RfcG1hcCk7CisJfQorCisJZm9yIChhZGRyID0gc3Jj
X2FkZHI7IGFkZHIgPCBlbmRfYWRkcjsgYWRkciA9IHZhX25leHQpIHsKKwkJcHRfZW50cnlfdCAq
c3JjX3B0ZSwgKmRzdF9wdGU7CisJCXZtX3BhZ2VfdCBkc3RtcGRlLCBkc3RtcHRlLCBzcmNtcHRl
OworCQlwZF9lbnRyeV90ICpzcmNfcGRwZSwgKnNyY19wZGUsICpkc3RfcGRlOworCQlwdF9lbnRy
eV90IHNyY3B0ZTsKKwkJdm1fcGFkZHJfdCBzcmNwYWRkcjsKKwkJdm1fcGFnZV90IG07CisKKwor
CQlzcmNfcGRwZSA9IHBtYXBfc2VnbWFwKHNyY19wbWFwLCBhZGRyKTsKKwkJaWYgKHNyY19wZHBl
ID09IE5VTEwgfHwgKnNyY19wZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoYWRkciArIE5CU0VH
KSAmIH5TRUdNQVNLOworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IHZhIGlzIG91dCBvZiB0aGUg
Y29weSByYW5nZSB0aGVuIHNldAorCQkJICogaXQgdG8gZW5kX2FkZHIgaW4gb3JkZXIgdG8gY29w
eSBhbGwgbWFwcGluZ3MgdW50aWwKKwkJCSAqIGdpdmVuIGxpbWl0LgorCQkJICovCisJCQlpZiAo
dmFfbmV4dCA8IGFkZHIpCisJCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCQkJY29udGludWU7CisJ
CX0KKworCQl2YV9uZXh0ID0gKGFkZHIgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25l
eHQgPCBhZGRyKQorCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCisJCXNyY19wZGUgPSBwbWFwX3Bk
cGVfdG9fcGRlKHNyY19wZHBlLCBhZGRyKTsKKwkJaWYgKHNyY19wZGUgPT0gTlVMTCB8fCAqc3Jj
X3BkZSA9PSAwKQorCQkJY29udGludWU7CisJCXNyY3B0ZSA9IChwdF9lbnRyeV90KSpzcmNfcGRl
OworCisJCWlmIChwdGVfaXNfMW1fc3VwZXJwYWdlKCZzcmNwdGUpKSB7CisJCQkvKiBDb3B5IHN1
cGVycGFnZSBwZGUuICovCisJCQlpZiAoKGFkZHIgJiBQRFJNQVNLKSAhPSAwIHx8IGFkZHIgKyBO
QlBEUiA+IGVuZF9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJZHN0bXBkZSA9IHBtYXBfYWxsb2Nw
ZGUoZHN0X3BtYXAsIGFkZHIsIE5VTEwpOworCQkJaWYgKGRzdG1wZGUgPT0gTlVMTCkKKwkJCQli
cmVhazsKKworCQkJLyogZHN0X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsgKi8KKwkJ
CWRzdF9wZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1f
UEFHRV9UT19QSFlTKGRzdG1wZGUpKTsKKwkJCWRzdF9wZGUgPSAmZHN0X3BkZVtwbWFwX3BkZV9p
bmRleChhZGRyKV07CisKKwkJCWlmICgqZHN0X3BkZSA9PSAwICYmCisJCQkgICAgKCFwdGVfdGVz
dCgmc3JjcHRlLCBQVEVfTUFOQUdFRCkgfHwKKwkJCSAgICBwbWFwX3B2X2luc2VydF9wZGUoZHN0
X3BtYXAsIGFkZHIsCisJCQkgICAgVExCTE9fUFRFX1RPX1BBKHNyY3B0ZSksICZsb2NrKSkpIHsK
KwkJCQkqZHN0X3BkZSA9IChwZF9lbnRyeV90KShzcmNwdGUgJiB+UFRFX1cpOworCQkJCXBtYXBf
cmVzaWRlbnRfY291bnRfaW5jKGRzdF9wbWFwLCBOQlBEUiAvCisJCQkJICAgIFBBR0VfU0laRSk7
CisJCQl9IGVsc2UKKwkJCQlkc3RtcGRlLT53aXJlX2NvdW50LS07CisJCQljb250aW51ZTsKKwkJ
fQorCisJCXNyY3BhZGRyID0gTUlQU19ESVJFQ1RfVE9fUEhZUygqc3JjX3BkZSk7CisJCXNyY21w
dGUgPSBQSFlTX1RPX1ZNX1BBR0Uoc3JjcGFkZHIpOworCQlLQVNTRVJUKHNyY21wdGUtPndpcmVf
Y291bnQgPiAwLAorCQkgICAgKCJwbWFwX2NvcHk6IHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UgaXMg
dW51c2VkIikpOworCisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5k
IG9mIHRoZSB2YWRkciByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgc291cmNlIHBhZ2UgdGFibGUg
cGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UKKwkJICogYmVpbmcgY29waWVkLgorCQkg
Ki8KKwkJaWYgKHZhX25leHQgPiBlbmRfYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsKKwor
CQkvKgorCQkgKiBXYWxrIHRoZSBzb3VyY2UgcGFnZSB0YWJsZSBlbnRyaWVzIGFuZCBjb3B5IHRo
ZSBtYW5hZ2VkCisJCSAqIGVudHJpZXMuCisJCSAqLworCisJCS8qIHNyY19wdGUgPSBwbWFwX3Bk
ZV90b19wdGUoc3JjX3BkZSwgYWRkcik7ICovCisJCXNyY19wdGUgPSAocHRfZW50cnlfdCAqKU1J
UFNfUEhZU19UT19ESVJFQ1Qoc3JjcGFkZHIpOworCQlzcmNfcHRlID0gJnNyY19wdGVbcG1hcF9w
dGVfaW5kZXgoYWRkcildOworCisJCWlmIChzcmNfcHRlID09IE5VTEwgfHwgKnNyY19wdGUgPT0g
MCkKKwkJCWNvbnRpbnVlOworCisJCWRzdG1wdGUgPSBOVUxMOworCQl3aGlsZSAoYWRkciA8IHZh
X25leHQpIHsKKwkJCXVuc2lnbmVkIHBkZXBpbmRleDsKKwkJCXB0X2VudHJ5X3QgcHRldGVtcDsK
KworCisJCQlwdGV0ZW1wID0gKnNyY19wdGU7CisKKwkJCS8qCisJCQkgKiB3ZSBvbmx5IHZpcnR1
YWwgY29weSBtYW5hZ2VkIHBhZ2VzCisJCQkgKi8KKwkJCWlmIChwdGVfdGVzdCgmcHRldGVtcCwg
UFRFX01BTkFHRUQpKSB7CisJCQkJLyogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4ICov
CisJCQkJcGRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KGFkZHIpOworCisJCQkJLyogR2V0IHRo
ZSBwYWdlIGRpcmVjdG9yeSBlbnRyeS4gKi8KKwkJCQlkc3RfcGRlID0gcG1hcF9wZGUoZHN0X3Bt
YXAsIGFkZHIpOworCisJCQkJaWYgKGRzdF9wZGUgIT0gTlVMTCAmJiAqZHN0X3BkZSAhPSAwKSB7
CisJCQkJCWRzdG1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBNSVBTX0RJUkVDVF9U
T19QSFlTKCpkc3RfcGRlKSk7CisJCQkJfSBlbHNlCisJCQkJCWRzdG1wdGUgPSBOVUxMOworCisJ
CQkJaWYgKGRzdG1wdGUgIT0gTlVMTCAmJgorCQkJCSAgICBkc3RtcHRlLT5waW5kZXggPT0gcGRl
cGluZGV4KSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBwYWdlIHRhYmxlIGlzIG1hcHBlZCBzbyBq
dXN0CisJCQkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudC4KKwkJCQkJICovCisJCQkJCWRz
dG1wdGUtPndpcmVfY291bnQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBUaGUg
cGFnZSB0YWJsZSBpc24ndCBtYXBwZWQsIG9yIGl0CisJCQkJCSAqIGhhcyBiZWVuIGRlYWxsb2Nh
dGVkLgorCQkJCQkgKi8KKwkJCQkJZHN0bXB0ZSA9IHBtYXBfYWxsb2NwdGUoZHN0X3BtYXAsCisJ
CQkJCSAgICBhZGRyLCBOVUxMKTsKKworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBhcmUgaGF2aW5n
IG1lbW9yeSBhbGxvYyBpc3N1ZXMKKwkJCQkJICogdGhlbiBhYmFuZG9uIHRyeWluZyB0byBjb3B5
IHRoZSBwYWdlCisJCQkJCSAqIHRhYmxlcy4KKwkJCQkJICovCisJCQkJCWlmIChkc3RtcHRlID09
IE5VTEwpCisJCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBOb3cgdGhhdCB3
ZSBoYXZlIGEgcGFnZSBkaXJlY3RvcnksIGdldCB0aGUKKwkJCQkgKiBwdGUuCisJCQkJICovCisK
KwkJCQkvKiBkc3RfcHRlID0gcG1hcF9wdGUoZHN0X3BtYXAsIGFkZHIpOyAqLworCQkJCWRzdF9w
dGUgPSAocHRfZW50cnlfdCAqKQorCQkJCSAgICBNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJCQlW
TV9QQUdFX1RPX1BIWVMoZHN0bXB0ZSkpOworCQkJCWRzdF9wdGUgPSAmZHN0X3B0ZVtwbWFwX3B0
ZV9pbmRleChhZGRyKV07CisKKwkJCQkvKiBUcnkgYW5kIGluc2VydCB0aGUgcHZfZW50cnkuICov
CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEocHRldGVtcCkpOworCQkJ
CWlmICgqZHN0X3B0ZSA9PSAwICYmCisJCQkJICAgIHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShk
c3RfcG1hcCwgYWRkciwgbSwKKwkJCQkgICAgJmxvY2spKSB7CisJCQkJCS8qCisJCQkJCSAqIFBv
cHVsYXRlIHRoZSBlbnRyeS4KKwkJCQkJICoKKwkJCQkJICogQ2xlYXIgdGhlIHdpcmVkLCBtb2Rp
ZmllZCwgYW5kCisJCQkJCSAqIGFjY2Vzc2VkIChyZWZlcmVuY2VkKSBiaXRzCisJCQkJCSAqIGR1
cmluZyB0aGUgY29weS4KKwkJCQkJICovCisJCQkJCXB0ZV9jbGVhcigmcHRldGVtcCwgUFRFX1cg
fCBQVEVfRCB8CisJCQkJCSAgICBQVEVfUkVGKTsKKwkJCQkJKmRzdF9wdGUgPSBwdGV0ZW1wOwor
CQkJCQkvKiBVcGRhdGUgc3RhdHMuICovCisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKGRz
dF9wbWFwLCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCQkJ
aWYgKHBtYXBfdW53aXJlX3B0cChkc3RfcG1hcCwgYWRkciwKKwkJCQkJICAgIGRzdG1wdGUsICZm
cmVlKSkgeworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UoZHN0X3BtYXAsCisJCQkJCQkgICAg
YWRkcik7CisJCQkJCQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkJCX0KKwkJCQkJ
Z290byBvdXQ7CisJCQkJfQorCQkJCS8qIENoZWNrIHRoZSB3aXJlX2NvdW50IHRvIHNlZSBpZiB3
ZSdyZSBkb25lLiAqLworCQkJCWlmIChkc3RtcHRlLT53aXJlX2NvdW50ID49IHNyY21wdGUtPndp
cmVfY291bnQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCQlz
cmNfcHRlKys7CisJCX0KKwl9CitvdXQ6CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9j
ayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHNy
Y19wbWFwKTsKKwlQTUFQX1VOTE9DSyhkc3RfcG1hcCk7CisjZW5kaWYgLyogI2lmIDAgKi8KK30K
KworLyoKKyAqCXBtYXBfemVyb19wYWdlIHplcm9zIHRoZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFn
ZSBieSBtYXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtWTSBhbmQgdXNpbmcgYnplcm8gdG8gY2xl
YXIgaXRzIGNvbnRlbnRzLgorICoKKyAqIAlVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3Zv
aWQKK3BtYXBfemVyb19wYWdlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZt
X3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RP
X0RJUkVDVChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVybygoY2FkZHJfdCl2YSwgUEFHRV9T
SVpFKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwlzY2hlZF91
bnBpbigpOworfQorCisvKgorICoJcG1hcF96ZXJvX3BhZ2VfYXJlYSB6ZXJvcyB0aGUgc3BlY2lm
aWVkIGhhcmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0gYW5kIHVz
aW5nIGJ6ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKglvZmYgYW5kIHNpemUgbWF5
IG5vdCBjb3ZlciBhbiBhcmVhIGJleW9uZCBhIHNpbmdsZSBoYXJkd2FyZSBwYWdlLgorICovCit2
b2lkCitwbWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2VfdCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkK
K3sKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMo
bSk7CisKKwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJ
Ynplcm8oKGNoYXIgKikoY2FkZHJfdCl2YSArIG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2Jp
bnZfcmFuZ2UodmEgKyBvZmYsIHNpemUpOworCXNjaGVkX3VucGluKCk7Cit9CisKK3ZvaWQKK3Bt
YXBfemVyb19wYWdlX2lkbGUodm1fcGFnZV90IG0pCit7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1f
cGFkZHJfdCBwaHlzID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisJdmEgPSBNSVBTX1BIWVNfVE9f
RElSRUNUKHBoeXMpOworCXNjaGVkX3BpbigpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBQQUdFX1NJ
WkUpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhLCBQQUdFX1NJWkUpOworCXNjaGVkX3Vu
cGluKCk7Cit9CisKKy8qCisgKglwbWFwX2NvcHlfcGFnZSBjb3BpZXMgdGhlIHNwZWNpZmllZCAo
bWFjaGluZSBpbmRlcGVuZGVudCkKKyAqCXBhZ2UgYnkgbWFwcGluZyB0aGUgcGFnZSBpbnRvIHZp
cnR1YWwgbWVtb3J5IGFuZCB1c2luZworICoJYmNvcHkgdG8gY29weSB0aGUgcGFnZSwgb25lIG1h
Y2hpbmUgZGVwZW5kZW50IHBhZ2UgYXQgYQorICoJdGltZS4KKyAqCisgKiAJVXNlIFhLUEhZUyBm
b3IgNjQgYml0LgorICovCisjZGVmaW5lCVBNQVBfQ09QWV9UQUdTCTB4MDAwMDAwMDEKK3N0YXRp
YyB2b2lkCitwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbCh2bV9wYWdlX3Qgc3JjLCB2bV9wYWdlX3Qg
ZHN0LCBpbnQgZmxhZ3MpCit7CisJdm1fb2Zmc2V0X3QgdmFfc3JjLCB2YV9kc3Q7CisJdm1fcGFk
ZHJfdCBwaHlzX3NyYyA9IFZNX1BBR0VfVE9fUEhZUyhzcmMpOworCXZtX3BhZGRyX3QgcGh5c19k
c3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsKKworCS8qIGVhc3kgY2FzZSwgYWxsIGNhbiBiZSBh
Y2Nlc3NlZCB2aWEgS1NFRzAgKi8KKwkvKgorCSAqIEZsdXNoIGFsbCBjYWNoZXMgZm9yIFZBIHRo
YXQgYXJlIG1hcHBlZCB0byB0aGlzIHBhZ2UKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCBkYXRhIGlu
IFNEUkFNIGlzIHVwIHRvIGRhdGUKKwkgKi8KKwlzY2hlZF9waW4oKTsKKwlwbWFwX2ZsdXNoX3B2
Y2FjaGUoc3JjKTsKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChNSVBTX1BIWVNfVE9f
RElSRUNUKHBoeXNfZHN0KSwgUEFHRV9TSVpFKTsKKwl2YV9zcmMgPSBNSVBTX1BIWVNfVE9fRElS
RUNUKHBoeXNfc3JjKTsKKwl2YV9kc3QgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KTsK
KyNpZmRlZiBDUFVfQ0hFUkkKKwlpZiAoZmxhZ3MgJiBQTUFQX0NPUFlfVEFHUykKKwkJY2hlcmlf
YmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisJZWxz
ZQorI2Vsc2UKKwkJYmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0Vf
U0laRSk7CisjZW5kaWYKKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YV9kc3QsIFBBR0VfU0la
RSk7CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqIFdpdGggQ0hFUkksIGl0IGlzIHNvbWV0
aW1lcyBkZXNpcmFibGUgdG8gZXhwbGljaXRseSBwcm9wYWdhdGUgdGFncyBiZXR3ZWVuCisgKiBw
YWdlcyAoZS5nLiwgZHVyaW5nIGNvcHktb24td3JpdGUpLCBidXQgbm90IG90aGVyIHRpbWVzIChl
LmcuLCBjb3B5aW5nIGRhdGEKKyAqIGZyb20gVk0gdG8gYnVmZmVyIGNhY2hlKS4gIFRoZXJlIGlz
IG1vcmUgcGxheWluZyBvdXQgaGVyZSB5ZXQgdG8gZG8gKGUuZy4sCisgKiBpZiBhbnkgZmlsZXN5
c3RlbXMgbGVhcm4gdG8gcHJlc2VydmUgdGFncykgYnV0IHRoZXNlIEtQSXMgYWxsb3cgdXMgdG8K
KyAqIGNhcHR1cmUgdGhhdCBkaWZmZXJlbmNlIGluIHRoZSBtZWFuIHRpbWUuCisgKi8KK3ZvaWQK
K3BtYXBfY29weV9wYWdlKHZtX3BhZ2VfdCBzcmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFw
X2NvcHlfcGFnZV9pbnRlcm5hbChzcmMsIGRzdCwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkK
K3ZvaWQKK3BtYXBfY29weV9wYWdlX3RhZ3Modm1fcGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCkK
K3sKKworCXBtYXBfY29weV9wYWdlX2ludGVybmFsKHNyYywgZHN0LCBQTUFQX0NPUFlfVEFHUyk7
Cit9CisjZW5kaWYKKworaW50IHVubWFwcGVkX2J1Zl9hbGxvd2VkOworCitzdGF0aWMgdm9pZAor
cG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKHZtX3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29m
ZnNldCwgdm1fcGFnZV90IG1iW10sCisgICAgdm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVy
c2l6ZSwgaW50IGZsYWdzKQoreworCWNoYXIgKmFfY3AsICpiX2NwOworCXZtX3BhZ2VfdCBhX20s
IGJfbTsKKwl2bV9vZmZzZXRfdCBhX3BnX29mZnNldCwgYl9wZ19vZmZzZXQ7CisJdm1fcGFkZHJf
dCBhX3BoeXMsIGJfcGh5czsKKwlpbnQgY250OworCisJc2NoZWRfcGluKCk7CisJd2hpbGUgKHhm
ZXJzaXplID4gMCkgeworCQlhX3BnX29mZnNldCA9IGFfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQlj
bnQgPSBtaW4oeGZlcnNpemUsIFBBR0VfU0laRSAtIGFfcGdfb2Zmc2V0KTsKKwkJYV9tID0gbWFb
YV9vZmZzZXQgPj4gUEFHRV9TSElGVF07CisJCWFfcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhhX20p
OworCQliX3BnX29mZnNldCA9IGJfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oY250
LCBQQUdFX1NJWkUgLSBiX3BnX29mZnNldCk7CisJCWJfbSA9IG1iW2Jfb2Zmc2V0ID4+IFBBR0Vf
U0hJRlRdOworCQliX3BoeXMgPSBWTV9QQUdFX1RPX1BIWVMoYl9tKTsKKwkJcG1hcF9mbHVzaF9w
dmNhY2hlKGFfbSk7CisJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZU19U
T19ESVJFQ1QoYl9waHlzKSwKKwkJICAgIFBBR0VfU0laRSk7CisJCWFfY3AgPSAoY2hhciAqKU1J
UFNfUEhZU19UT19ESVJFQ1QoYV9waHlzKSArIGFfcGdfb2Zmc2V0OworCQliX2NwID0gKGNoYXIg
KilNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5cykgKyBiX3BnX29mZnNldDsKKyNpZmRlZiBDUFVf
Q0hFUkkKKwkJaWYgKGZsYWdzICYgUE1BUF9DT1BZX1RBR1MpCisJCQljaGVyaV9iY29weShhX2Nw
LCBiX2NwLCBjbnQpOworCQllbHNlCisjZWxzZQorCQkJYmNvcHkoYV9jcCwgYl9jcCwgY250KTsK
KyNlbmRpZgorCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZSgodm1fb2Zmc2V0X3QpYl9jcCwgY250
KTsKKwkJYV9vZmZzZXQgKz0gY250OworCQliX29mZnNldCArPSBjbnQ7CisJCXhmZXJzaXplIC09
IGNudDsKKwl9CisJc2NoZWRfdW5waW4oKTsKK30KKworLyoKKyAqIEFzIHdpdGggcG1hcF9jb3B5
X3BhZ2UoKSwgQ0hFUkkgcmVxdWlyZXMgdGFnZ2VkIGFuZCBub24tdGFnZ2VkIHZlcnNpb25zCisg
KiBkZXBlbmRpbmcgb24gdGhlIGNpcmN1bXN0YW5jZXMuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9w
YWdlcyh2bV9wYWdlX3QgbWFbXSwgdm1fb2Zmc2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltd
LAorICAgIHZtX29mZnNldF90IGJfb2Zmc2V0LCBpbnQgeGZlcnNpemUpCit7CisKKwlwbWFwX2Nv
cHlfcGFnZXNfaW50ZXJuYWwobWEsIGFfb2Zmc2V0LCBtYiwgYl9vZmZzZXQsIHhmZXJzaXplLCAw
KTsKK30KKworI2lmZGVmIENQVV9DSEVSSQordm9pZAorcG1hcF9jb3B5X3BhZ2VzX3RhZ3Modm1f
cGFnZV90IG1hW10sIHZtX29mZnNldF90IGFfb2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2
bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhmZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2Vz
X2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIsIGJfb2Zmc2V0LCB4ZmVyc2l6ZSwKKwkgICAgUE1B
UF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBt
YXAncyBwdiBpcyBvbmUgb2YgdGhlIGZpcnN0CisgKiAxNiBwdnMgbGlua2VkIHRvIGZyb20gdGhp
cyBwYWdlLiAgVGhpcyBjb3VudCBtYXkKKyAqIGJlIGNoYW5nZWQgdXB3YXJkcyBvciBkb3dud2Fy
ZHMgaW4gdGhlIGZ1dHVyZTsgaXQKKyAqIGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQgdHJ1ZSBiZSBy
ZXR1cm5lZCBmb3IgYSBzbWFsbAorICogc3Vic2V0IG9mIHBtYXBzIGZvciBwcm9wZXIgcGFnZSBh
Z2luZy4KKyAqLworYm9vbGVhbl90CitwbWFwX3BhZ2VfZXhpc3RzX3F1aWNrKHBtYXBfdCBwbWFw
LCB2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXN0cnVjdCByd2xvY2sg
KmxvY2s7CisJcHZfZW50cnlfdCBwdjsKKwlpbnQgbG9vcHMgPSAwOworCWJvb2xlYW5fdCBydjsK
KworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgiJXM6
IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBfX2Z1bmNfXywgbSkpOworCXJ2ID0gRkFMU0U7CisJ
cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M
T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s
aXN0LCBwdl9uZXh0KSB7CisJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CisJCQlydiA9IFRS
VUU7CisJCQlicmVhazsKKwkJfQorCQlsb29wcysrOworCQlpZiAobG9vcHMgPj0gMTYpCisJCQli
cmVhazsKKwl9CisJaWYgKCFydiAmJiBsb29wcyA8IDE2ICYmIChtLT5mbGFncyAmIFBHX0ZJQ1RJ
VElPVVMpID09IDApIHsKKwkJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJ
CVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKKwkJCWlmIChQVl9Q
TUFQKHB2KSA9PSBwbWFwKSB7CisJCQkJcnYgPSBUUlVFOworCQkJCWJyZWFrOworCQkJfQorCQkJ
bG9vcHMrKzsKKwkJCWlmIChsb29wcyA+PSAxNikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyd19y
dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChy
dik7Cit9CisKKy8qCisgKglwbWFwX3BhZ2Vfd2lyZWRfbWFwcGluZ3M6CisgKgorICoJUmV0dXJu
IHRoZSBudW1iZXIgb2YgbWFuYWdlZCBtYXBwaW5ncyB0byB0aGUgZ2l2ZW4gcGh5c2ljYWwgcGFn
ZQorICoJdGhhdCBhcmUgd2lyZWQuCisgKi8KK2ludAorcG1hcF9wYWdlX3dpcmVkX21hcHBpbmdz
KHZtX3BhZ2VfdCBtKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcHZfZW50cnlfdCBwdjsK
KwlwbWFwX3QgcG1hcDsKKwlwdF9lbnRyeV90ICpwdGU7CisJaW50IGNvdW50LCBtZF9nZW47CisK
KwlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9IDApCisJCXJldHVybiAoMCk7CisJ
cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M
T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworcmVzdGFydDoKKwljb3VudCA9IDA7CisJVEFJTFFf
Rk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAo
cHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJbWRfZ2VuID0gbS0+bWQucHZf
Z2VuOworCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3Js
b2NrKGxvY2spOworCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQTUFQX1VO
TE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCX0KKwkJcHRlID0gcG1hcF9w
dGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1cpKQorCQkJY291
bnQrKzsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNU
SVRJT1VTKSA9PSAwKSB7CisJCXN0cnVjdCBtZF9wYWdlICpwdmggPSBwYV90b19wdmgoVk1fUEFH
RV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4
dCkgeworCQkJcG1hcCA9IFBWX1BNQVAocHYpOworCQkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkp
IHsKKwkJCQlpbnQgcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJCW1kX2dlbiA9IG0tPm1kLnB2
X2dlbjsKKwkJCQlyd19ydW5sb2NrKGxvY2spOworCQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCQly
d19ybG9jayhsb2NrKTsKKwkJCQlpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbiB8fAorCQkJCSAg
ICBwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ
CQlnb3RvIHJlc3RhcnQ7CisJCQkJfQorCQkJfQorCQkJcGRfZW50cnlfdCAqcGRlID0gcG1hcF9w
ZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCWlmIChwdGVfdGVzdCgocHRfZW50cnlfdCAqKXBkZSwg
UFRFX1cpKQorCQkJCWNvdW50Kys7CisJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJfQorCX0KKwly
d19ydW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJu
IChjb3VudCk7Cit9CisKKy8qCisgKiAgUmV0dXJucyBUUlVFIGlmIHRoZSBnaXZlbiBwYWdlIGlz
IG1hcHBlZCBpbmRpdmlkdWFsbHkgb3IgYXMgcGFydCBvZgorICogIGEgMm1wYWdlLiBPdGhlcndp
c2UsIHJldHVybnMgRkFMU0UuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2lzX21hcHBlZCh2
bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKwor
CWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuIChGQUxTRSk7
CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElT
VF9MT0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworCXJ2ID0gIVRBSUxRX0VNUFRZKCZtLT5tZC5w
dl9saXN0KSB8fAorCSAgICAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorCQkh
VEFJTFFfRU1QVFkoJnBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpLT5wdl9saXN0KSk7CisJ
cndfcnVubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVy
biAocnYpOworfQorCisvKgorICogRGVzdHJveSBhbGwgbWFuYWdlZCwgbm9uLXdpcmVkIG1hcHBp
bmdzIGluIHRoZSBnaXZlbiB1c2VyLXNwYWNlCisgKiBwbWFwLiAgVGhpcyBwbWFwIGNhbm5vdCBi
ZSBhY3RpdmUgb24gYW55IHByb2Nlc3NvciBiZXNpZGVzIHRoZQorICogY2FsbGVyLgorICoKKyAq
IFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIGtlcm5lbCBwbWFwLiAgTW9y
ZW92ZXIsIGl0CisgKiBpcyBub3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiAgSXQgaXMgb25s
eSB0byBiZSB1c2VkIGR1cmluZworICogcHJvY2VzcyB0ZXJtaW5hdGlvbi4gIENvbnNlcXVlbnRs
eSwgaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHdheXMKKyAqIHRoYXQgbWFrZSBpdCBmYXN0ZXIg
dGhhbiBwbWFwX3JlbW92ZSgpLiAgRmlyc3QsIGl0IGNhbiBtb3JlIHF1aWNrbHkKKyAqIGRlc3Ry
b3kgbWFwcGluZ3MgYnkgaXRlcmF0aW5nIG92ZXIgdGhlIHBtYXAncyBjb2xsZWN0aW9uIG9mIFBW
CisgKiBlbnRyaWVzLCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdGhlIHBhZ2UgdGFibGUuICBTZWNv
bmQsIGl0IGRvZXNuJ3QKKyAqIGhhdmUgdG8gdGVzdCBhbmQgY2xlYXIgdGhlIHBhZ2UgdGFibGUg
ZW50cmllcyBhdG9taWNhbGx5LCBiZWNhdXNlCisgKiBubyBwcm9jZXNzb3IgaXMgY3VycmVudGx5
IGFjY2Vzc2luZyB0aGUgdXNlciBhZGRyZXNzIHNwYWNlLiAgSW4KKyAqIHBhcnRpY3VsYXIsIGEg
cGFnZSB0YWJsZSBlbnRyeSdzIGRpcnR5IGJpdCB3b24ndCBjaGFuZ2Ugc3RhdGUgb25jZQorICog
dGhpcyBmdW5jdGlvbiBzdGFydHMuCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2VzKHBtYXBf
dCBwbWFwKQoreworCXBkX2VudHJ5X3QgcHRlcGRlLCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZSwg
dHB0ZTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX3BhZ2VfdCBtLCBtcHRlLCBtdDsKKwlw
dl9lbnRyeV90IHB2OworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHB2X2NodW5rICpw
YywgKm5wYzsKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCWludCBiaXQ7CisJdWludDY0X3QgaW51
c2UsIGJpdG1hc2s7CisJaW50IGFsbGZyZWUsIGZpZWxkLCBmcmVlZCwgaWR4OworCWJvb2xlYW5f
dCBzdXBlcnBhZ2U7CisJdm1fcGFkZHJfdCBwYTsKKworCS8qCisJICogQXNzZXJ0IHRoYXQgdGhl
IGdpdmVuIHBtYXAgaXMgb25seSBhY3RpdmUgb24gdGhlIGN1cnJlbnQKKwkgKiBDUFUuICBVbmZv
cnR1bmF0ZWx5LCB3ZSBjYW5ub3QgYmxvY2sgYW5vdGhlciBDUFUgZnJvbQorCSAqIGFjdGl2YXRp
bmcgdGhlIHBtYXAgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBleGVjdXRpbmcuCisJICovCisJS0FT
U0VSVChwbWFwID09IHZtc3BhY2VfcG1hcChjdXJ0aHJlYWQtPnRkX3Byb2MtPnBfdm1zcGFjZSks
CisJICAgICgiJXM6IG5vbi1jdXJyZW50IHBtYXAgJXAiLCBfX2Z1bmNfXywgcG1hcCkpOworCisJ
bG9jayA9IE5VTEw7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxf
bG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCVRBSUxRX0ZPUkVBQ0hfU0FGRShwYywgJnBtYXAt
PnBtX3B2Y2h1bmssIHBjX2xpc3QsIG5wYykgeworCQlhbGxmcmVlID0gMTsKKwkJZnJlZWQgPSAw
OworCQlmb3IgKGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaW51c2Ug
PSB+cGMtPnBjX21hcFtmaWVsZF0gJiBwY19mcmVlbWFza1tmaWVsZF07CisJCQl3aGlsZSAoaW51
c2UgIT0gMCkgeworCQkJCWJpdCA9IGZmc2woaW51c2UpIC0gMTsKKwkJCQliaXRtYXNrID0gMVVM
IDw8IGJpdDsKKwkJCQlpZHggPSBmaWVsZCAqIHNpemVvZihpbnVzZSkgKiBOQkJZICsgYml0Owor
CQkJCXB2ID0gJnBjLT5wY19wdmVudHJ5W2lkeF07CisJCQkJaW51c2UgJj0gfmJpdG1hc2s7CisK
KwkJCQlwZGUgPSBwbWFwX3NlZ21hcChwbWFwLCBwdi0+cHZfdmEpOworCQkJCXB0ZXBkZSA9ICpw
ZGU7CisJCQkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShwZGUsIHB2LT5wdl92YSk7CisJCQkJaWYg
KHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJCQlzdXBlcnBhZ2UgPSBUUlVFOworCQkJ
CQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJCQl9IGVsc2UgeworCQkJCQlzdXBlcnBhZ2Ug
PSBGQUxTRTsKKwkJCQkJcHRlcGRlID0gKnBkZTsKKwkJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRl
KHBkZSwgcHYtPnB2X3ZhKTsKKwkJCQl9CisJCQkJdHB0ZSA9ICpwdGU7CisJCQkJaWYgKCFwdGVf
aXNfdmFsaWQocHRlKSkgIHsKKwkJCQkJcGFuaWMoIiVzOiBiYWQgJXMgcHRlIHZhICVseCBwdGUg
JWx4IiwKKwkJCQkJICAgIF9fZnVuY19fLCBzdXBlcnBhZ2UgPyAic3VwZXJwYWdlIiA6CisJCQkJ
CSAgICAiIiwgcHYtPnB2X3ZhLCB0cHRlKTsKKwkJCQl9CisKKy8qCisgKiBXZSBjYW5ub3QgcmVt
b3ZlIHdpcmVkIHBhZ2VzIGZyb20gYSBwcm9jZXNzJyBtYXBwaW5nIGF0IHRoaXMgdGltZQorICov
CisJCQkJaWYgKHB0ZV90ZXN0KCZ0cHRlLCBQVEVfVykpIHsKKwkJCQkJYWxsZnJlZSA9IDA7CisJ
CQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHRwdGUpOwor
CQkJCWlmIChzdXBlcnBhZ2UpCisJCQkJCXBhICY9IH5QRFJNQVNLOworCQkJCW0gPSBQSFlTX1RP
X1ZNX1BBR0UocGEpOworCQkJCUtBU1NFUlQobS0+cGh5c19hZGRyID09IHBhLAorCQkJCSAgICAo
IiVzOiB2bV9wYWdlX3QgJXAgcGh5c19hZGRyIG1pc21hdGNoICIKKwkJCQkgICAgIiUwMTZqeCAl
MDE2angiLCBfX2Z1bmNfXywgbSwKKwkJCQkgICAgKHVpbnRtYXhfdCltLT5waHlzX2FkZHIsICh1
aW50bWF4X3QpdHB0ZSkpOworCisJCQkJS0FTU0VSVCgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT
KSAhPSAwIHx8CisJCQkJICAgIG0gPCAmdm1fcGFnZV9hcnJheVt2bV9wYWdlX2FycmF5X3NpemVd
LAorCQkJCSAgICAoIiVzOiBiYWQgdHB0ZSAlI2p4IiwgX19mdW5jX18sCisJCQkJICAgICh1aW50
bWF4X3QpdHB0ZSkpOworCisJCQkJLyogQ2xlYXIgUFRFICovCisJCQkJaWYgKHN1cGVycGFnZSkK
KwkJCQkJcHRlX3N0b3JlKHB0ZSwgMCk7CisJCQkJZWxzZQorCQkJCQlwdGVfc3RvcmUocHRlLCBp
c19rZXJuZWxfcG1hcChwbWFwKSA/CisJCQkJCSAgICBQVEVfRyA6IDApOworCisJCQkJLyoKKwkJ
CQkgKiBVcGRhdGUgdGhlIHZtX3BhZ2VfdCBjbGVhbiBhbmQgcmVmZXJlbmNlIGJpdHMKKwkJCQkg
Ki8KKwkJCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9EKSAmJgorCQkJCSAgICAhcHRlX3Rlc3Qo
JnRwdGUsIFBURV9STykpIHsKKwkJCQkJaWYgKHN1cGVycGFnZSkgeworCQkJCQkJdm1fcGFnZV90
IG10OworCisJCQkJCQlmb3IgKG10ID0gbTsgbXQgPCAmbVtOQlBEUiAvIFBBR0VfU0laRV07IG10
KyspCisJCQkJCQkJdm1fcGFnZV9kaXJ0eShtdCk7CisJCQkJCX0gZWxzZQorCQkJCQkJdm1fcGFn
ZV9kaXJ0eShtKTsKKwkJCQl9CisKKwkJCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0Uo
JmxvY2ssIG0pOworCisJCQkJLyogTWFyayBmcmVlICovCisJCQkJcGMtPnBjX21hcFtmaWVsZF0g
fD0gYml0bWFzazsKKwkJCQlpZiAoc3VwZXJwYWdlKSB7CisJCQkJCXBtYXBfcmVzaWRlbnRfY291
bnRfZGVjKHBtYXAsIE5CUERSIC8gUEFHRV9TSVpFKTsKKwkJCQkJcHZoID0gcGFfdG9fcHZoKFRM
QkxPX1BURV9UT19QQSh0cHRlKSk7CisJCQkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9saXN0LCBw
diwgcHZfbmV4dCk7CisJCQkJCXB2aC0+cHZfZ2VuKys7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgm
cHZoLT5wdl9saXN0KSkgeworCQkJCQkJZm9yIChtdCA9IG07IG10IDwgJm1bTkJQRFIgLyBQQUdF
X1NJWkVdOyBtdCsrKQorCQkJCQkJCWlmIChUQUlMUV9FTVBUWSgmbXQtPm1kLnB2X2xpc3QpKQor
CQkJCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG10LCBQR0FfV1JJVEVBQkxFKTsKKwkJCQkJfQor
CQkJCQltcHRlID0gcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQkJCQlp
ZiAobXB0ZSAhPSBOVUxMKSB7CisJCQkJCQlwbWFwX3JlbW92ZV9wdF9wYWdlKHBtYXAsIG1wdGUp
OworCQkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisJCQkJCQlLQVNTRVJU
KG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJCQkJICAgICgiJXM6IHB0ZSBwYWdlIHdp
cmUgY291bnQgZXJyb3IiLAorCQkJCQkJICAgIF9fZnVuY19fKSk7CisJCQkJCQltcHRlLT53aXJl
X2NvdW50ID0gMDsKKwkJCQkJCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG1wdGUsICZmcmVl
LCBGQUxTRSk7CisJCQkJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50
LCAxKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVj
KHBtYXAsIDEpOworCQkJCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0
KTsKKwkJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJCWlmICgobS0+YWZsYWdzICYgUEdBX1dSSVRF
QUJMRSkgIT0gMCAmJgorCQkJCQkgICAgVEFJTFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpICYmCisJ
CQkJCSAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCQkJCQlwdmggPSBw
YV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZo
LT5wdl9saXN0KSkKKwkJCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUp
OworCQkJCQl9CisJCQkJfQorCQkJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCBwdGVw
ZGUsICZmcmVlKTsKKwkJCQlmcmVlZCsrOworCQkJfQorCQl9CisJCVBWX1NUQVQoYXRvbWljX2Fk
ZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJUFZfU1RBVChhdG9taWNfYWRkX2lu
dCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2xv
bmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlpZiAoYWxsZnJlZSkgeworCQkJVEFJTFFf
UkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCQlmcmVlX3B2X2NodW5r
KHBjKTsKKwkJfQorCX0KKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOwor
CXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcndfcnVu
bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9
CisKKy8qCisgKiBDbGVhciB0aGUgd3JpdGUgYW5kIG1vZGlmaWVkIGJpdHMgaW4gZWFjaCBvZiB0
aGUgZ2l2ZW4gcGFnZSdzIG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3JlbW92ZV93cml0ZSh2
bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXZtX29mZnNldF90IHZhOwor
CXB2X2VudHJ5X3QgbmV4dF9wdjsKKwlpbnQgcHZoX2dlbjsKKwlwbWFwX3QgcG1hcDsKKwlzdHJ1
Y3Qgcndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90IG9sZHB0ZSwg
KnB0ZTsKKwlwdl9lbnRyeV90IHB2OworCWludCBtZF9nZW47CisKKwlLQVNTRVJUKChtLT5vZmxh
Z3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfcmVtb3ZlX3dyaXRlOiBwYWdl
ICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3Qg
ZXhjbHVzaXZlIGJ1c2llZCwgdGhlbiBQR0FfV1JJVEVBQkxFIGNhbm5vdCBiZQorCSAqIHNldCBi
eSBhbm90aGVyIHRocmVhZCB3aGlsZSB0aGUgb2JqZWN0IGlzIGxvY2tlZC4gIFRodXMsCisJICog
aWYgUEdBX1dSSVRFQUJMRSBpcyBjbGVhciwgbm8gcGFnZSB0YWJsZSBlbnRyaWVzIG5lZWQgdXBk
YXRpbmcuCisJICovCisJVk1fT0JKRUNUX0FTU0VSVF9XTE9DS0VEKG0tPm9iamVjdCk7CisJaWYg
KCF2bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDAp
CisJCXJldHVybjsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlsb2NrID0gVk1fUEFH
RV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyht
KSk7CityZXRyeV9wdl9sb29wOgorCXJ3X3dsb2NrKGxvY2spOworCWlmICgobS0+ZmxhZ3MgJiBQ
R19GSUNUSVRJT1VTKSAhPSAwKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCVRBSUxRX0ZPUkVB
Q0hfU0FGRShwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCwgbmV4dF9wdikgeworCQlwbWFwID0g
UFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0g
cHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOwor
CQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJ
CVBNQVBfVU5MT0NLKHBtYXApOworCQkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQkJZ290byByZXRy
eV9wdl9sb29wOworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3Bk
ZShwbWFwLCB2YSk7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkgJiYgIXBkZV90ZXN0
KHBkZSwgUFRFX1JPKSkKKwkJCSh2b2lkKXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGRl
LCB2YSwgJmxvY2spOworCQlLQVNTRVJUKGxvY2sgPT0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0so
bSksCisJCSAgICAoImluY29uc2lzdGVudCBwdiBsb2NrICVwICVwIGZvciBwYWdlICVwIiwKKwkJ
ICAgIGxvY2ssIFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pLCBtKSk7CisJCVBNQVBfVU5MT0NL
KHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5w
dl9saXN0LCBwdl9uZXh0KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RS
WUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCW1kX2dlbiA9IG0t
Pm1kLnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJ
CQlyd193bG9jayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuIHx8CisJCQkg
ICAgbWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJ
CXJ3X3d1bmxvY2sobG9jayk7CisJCQkJZ290byByZXRyeV9wdl9sb29wOworCQkJfQorCQl9CisJ
CXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBl
cnBhZ2UocGRlKSwKKwkJICAgICgiJXM6IGZvdW5kIGEgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBw
diBsaXN0IiwKKwkJICAgIF9fZnVuY19fLCBtKSk7CisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShw
ZGUsIHB2LT5wdl92YSk7CisJCUtBU1NFUlQocHRlICE9IE5VTEwgJiYgcHRlX2lzX3ZhbGlkKHB0
ZSksCisJCSAgICAoIiVzOnBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIiwgX19mdW5jX18pKTsK
K3JldHJ5OgorCQlvbGRwdGUgPSAqcHRlOworCQlpZiAoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9S
TykpIHsKKwkJCWlmICghYXRvbWljX2NtcHNldF9sb25nKHB0ZSwgb2xkcHRlLAorCQkJICAgICgo
b2xkcHRlICYgflBURV9EKSB8IFBURV9STykpKQorCQkJCWdvdG8gcmV0cnk7CisJCQlpZiAocHRl
X3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQlwbWFwX2lu
dmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQl9CisJCVBNQVBfVU5MT0NLKHBtYXAp
OworCX0KKwl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFCTEUpOworCXJ3X3d1bmxv
Y2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKK30KKworI2RlZmluZQlQ
TUFQX1RTX1JFRkVSRU5DRURfTUFYCTUKKworLyotCisgKglwbWFwX3RzX3JlZmVyZW5jZWQ6Cisg
KgorICogIFJldHVybiBhIGNvdW50IG9mIHBhZ2VzIHRoYXQgaGF2ZSBiZWVuIHJlZmVyZW5jZWQs
IGFuZCByZXNldCB0aGUKKyAqICByZWZlcmVuY2UgYml0LiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBm
b3IgZXZlcnkgcmVmZXJlbmNlIGJpdCB0byBiZQorICogIHJlc2V0LCBidXQgaXQgaXMgbmVjZXNz
YXJ5IHRoYXQgMCBvbmx5IGJlIHJldHVybmVkIHdoZW4gdGhlcmUgYXJlCisgKiAgdHJ1bHkgaGF2
ZSBiZWVuIHBhZ2VzIHJlZmVyZW5jZWQuCisgKgorICogIFhYWDogVGhlIGV4YWN0IG51bWJlciBv
ZiBmbGFncyB0byBjaGVjayBhbmQgcmVzZXQgaXMgYSBtYXR0ZXIgdGhhdAorICogIHNob3VsZCBi
ZSB0ZXN0ZWQgYW5kIHN0YW5kYXJkaXplZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgZm9y
CisgKiAgb3B0aW1hbCBhZ2luZyBvZiBzaGFyZWQgcGFnZXMuCisgKi8KK2ludAorcG1hcF90c19y
ZWZlcmVuY2VkKHZtX3BhZ2VfdCBtKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHZfZW50
cnlfdCBwdiwgcHZmOworCXBtYXBfdCBwbWFwOworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcGRf
ZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YTsKKwl2bV9w
YWRkcl90IHBhOworCWludCBjbGVhcmVkLCBtZF9nZW4sIG5vdF9jbGVhcmVkLCBwdmhfZ2VuOwor
CisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFw
X3RzX3JlZmVyZW5jZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJY2xlYXJlZCA9
IDA7CisJcGEgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisJbG9jayA9IFBIWVNfVE9fUFZfTElTVF9M
T0NLKHBhKTsKKwlwdmggPSBwYV90b19wdmgocGEpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xv
Y2spOworCXJ3X3dsb2NrKGxvY2spOworcmV0cnk6CisJbm90X2NsZWFyZWQgPSAwOworCWlmICgo
bS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSAhPSAwIHx8CisJICAgIChwdmYgPSBUQUlMUV9GSVJT
VCgmcHZoLT5wdl9saXN0KSkgPT0gTlVMTCkKKwkJZ290byBzbWFsbF9tYXBwaW5nczsKKwlwdiA9
IHB2ZjsKKwlkbyB7CisJCWlmIChwdmYgPT0gTlVMTCkKKwkJCXB2ZiA9IHB2OworCQlwbWFwID0g
UFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQlwdmhfZ2VuID0g
cHZoLT5wdl9nZW47CisJCQlyd193dW5sb2NrKGxvY2spOworCQkJUE1BUF9MT0NLKHBtYXApOwor
CQkJcndfd2xvY2sobG9jayk7CisJCQlpZiAocHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJ
CVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKwkJdmEgPSBw
di0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCWlmIChwdGVf
aXNfcmVmKChwdF9lbnRyeV90ICopcGRlKSkgeworCQkJLyoKKwkJCSAqIFNpbmNlIHRoaXMgcmVm
ZXJlbmNlIGJpdCBpcyBzaGFyZWQgYnkgNTEyIDRLQgorCQkJICogcGFnZXMsIGl0IHNob3VsZCBu
b3QgYmUgY2xlYXJlZCBldmVyeSB0aW1lIGl0IGlzCisJCQkgKiB0ZXN0ZWQuICBBcHBseSBhIHNp
bXBsZSAiaGFzaCIgZnVuY3Rpb24gb24gdGhlCisJCQkgKiBwaHlzaWNhbCBwYWdlIG51bWJlciwg
dGhlIHZpcnR1YWwgc3VwZXJwYWdlIG51bWJlciwKKwkJCSAqIGFuZCB0aGUgcG1hcCBhZGRyZXNz
IHRvIHNlbGVjdCBvbmUgNEtCIHBhZ2Ugb3V0IG9mCisJCQkgKiB0aGUgNTEyIG9uIHdoaWNoIHRl
c3RpbmcgdGhlIHJlZmVyZW5jZSBiaXQgd2lsbAorCQkJICogcmVzdWx0IGluIGNsZWFyaW5nIHRo
YXQgcmVmZXJlbmNlIGJpdC4gIFRoaXMKKwkJCSAqIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGF2
b2lkIHRoZSBzZWxlY3Rpb24gb2YgdGhlCisJCQkgKiBzYW1lIDRLQiBwYWdlIGZvciBldmVyeSAy
TUIgcGFnZSBtYXBwaW5nLgorCQkJICoKKwkJCSAqIE9uIGRlbW90aW9uLCBhIG1hcHBpbmcgdGhh
dCBoYXNuJ3QgYmVlbiByZWZlcmVuY2VkCisJCQkgKiBpcyBzaW1wbHkgZGVzdHJveWVkLiAgVG8g
YXZvaWQgdGhlIHBvc3NpYmlsaXR5IG9mIGEKKwkJCSAqIHN1YnNlcXVlbnQgcGFnZSBmYXVsdCBv
biBhIGRlbW90ZWQgd2lyZWQgbWFwcGluZywKKwkJCSAqIGFsd2F5cyBsZWF2ZSBpdHMgcmVmZXJl
bmNlIGJpdCBzZXQuICBNb3Jlb3ZlciwKKwkJCSAqIHNpbmNlIHRoZSBzdXBlcnBhZ2UgaXMgd2ly
ZWQsIHRoZSBjdXJyZW50IHN0YXRlIG9mCisJCQkgKiBpdHMgcmVmZXJlbmNlIGJpdCB3b24ndCBh
ZmZlY3QgcGFnZSByZXBsYWNlbWVudC4KKwkJCSAqLworCQkJaWYgKCgoKHBhID4+IFBBR0VfU0hJ
RlQpIF4gKHB2LT5wdl92YSA+PiBQRFJTSElGVCkgXgorCQkJICAgICh1aW50cHRyX3QpcG1hcCkg
JiAoTlBURVBHIC0gMSkpID09IDAgJiYKKwkJCSAgICAhcGRlX3Rlc3QocGRlLCBQVEVfVykpIHsK
KwkJCQlhdG9taWNfY2xlYXJfbG9uZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1JFRik7CisJCQkJ
cG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCQljbGVhcmVkKys7CisJ
CQl9IGVsc2UKKwkJCQlub3RfY2xlYXJlZCsrOworCisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7
CisJCS8qIFJvdGF0ZSB0aGUgUFYgbGlzdCBpZiBpdCBoYXMgbW9yZSB0aGFuIG9uZSBlbnRyeS4g
Ki8KKwkJaWYgKHB2ICE9IE5VTEwgJiYgVEFJTFFfTkVYVChwdiwgcHZfbmV4dCkgIT0gTlVMTCkg
eworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCVRBSUxR
X0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJfQorCQlpZiAoKGNs
ZWFyZWQgKyBub3RfY2xlYXJlZCkgPj0gUE1BUF9UU19SRUZFUkVOQ0VEX01BWCkKKwkJCWdvdG8g
b3V0OworCX0gd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBwdmYp
Oworc21hbGxfbWFwcGluZ3M6CisJaWYgKChwdmYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlz
dCkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCXB2ID0gcHZmOworCWRvIHsKKwkJaWYgKHB2ZiA9
PSBOVUxMKQorCQkJcHZmID0gcHY7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQ
X1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCW1kX2dlbiA9
IG0tPm1kLnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7
CisJCQlyd193bG9jayhsb2NrKTsKKwkJCWlmICgKKwkJCSAgICBwdmhfZ2VuICE9IHB2aC0+cHZf
Z2VuIHx8CisJCQkgICAgbWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NL
KHBtYXApOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCX0KKworCQlwZGUgPSBwbWFwX3BkZShw
bWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKCFwZGVfaXNfc3VwZXJwYWdlKHBkZSksCisJCSAg
ICAoInBtYXBfdHNfcmVmZXJlbmNlZDogZm91bmQgc3VwZXJwYWdlIGluIHBhZ2UgJXAncyBwdiBs
aXN0IiwKKwkJICAgIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2X3Zh
KTsKKwkJaWYgKHB0ZV9pc19yZWYocHRlKSkgeworCQkJYXRvbWljX2NsZWFyX2xvbmcoKHB0X2Vu
dHJ5X3QgKilwZGUsIFBURV9SRUYpOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYt
PnB2X3ZhKTsKKwkJCWNsZWFyZWQrKzsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJLyog
Um90YXRlIHRoZSBQViBsaXN0IGlmIGl0IGhhcyBtb3JlIHRoYW4gb25lIGVudHJ5LiAqLworCQlp
ZiAocHYgIT0gTlVMTCAmJiBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSAhPSBOVUxMKSB7CisJCQlU
QUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCVRBSUxRX0lOU0VS
VF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQltLT5tZC5wdl9nZW4rKzsK
KwkJfQorCX0gd2hpbGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSkgIT0gcHZm
ICYmIGNsZWFyZWQgKworCSAgICBub3RfY2xlYXJlZCA8IFBNQVBfVFNfUkVGRVJFTkNFRF9NQVgp
Oworb3V0OgorCXJ3X3d1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2Nr
KTsKKwlyZXR1cm4gKGNsZWFyZWQgKyBub3RfY2xlYXJlZCk7Cit9CisKK3N0YXRpYyBib29sZWFu
X3QKK3BtYXBfcGFnZV90ZXN0X21hcHBpbmdzKHZtX3BhZ2VfdCBtLCBib29sZWFuX3QgYWNjZXNz
ZWQsIGJvb2xlYW5fdCBtb2RpZmllZCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXB2X2Vu
dHJ5X3QgcHY7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdF9lbnRyeV90ICpwdGU7CisJcG1h
cF90IHBtYXA7CisJaW50IG1kX2dlbiwgcHZoX2dlbjsKKwlib29sZWFuX3QgcnY7CisKKwlydiA9
IEZBTFNFOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sgPSBWTV9QQUdFX1RP
X1BWX0xJU1RfTE9DSyhtKTsKKwlyd19ybG9jayhsb2NrKTsKK3Jlc3RhcnQ6CisJVEFJTFFfRk9S
RUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYp
OworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJIG1kX2dlbiA9IG0tPm1kLnB2X2dl
bjsKKwkJCSByd19ydW5sb2NrKGxvY2spOworCQkJIFBNQVBfTE9DSyhwbWFwKTsKKwkJCSByd19y
bG9jayhsb2NrKTsKKwkJCSBpZiAobWRfZ2VuICE9IG0tPm1kLnB2X2dlbikgeworCQkJCSBQTUFQ
X1VOTE9DSyhwbWFwKTsKKwkJCQkgZ290byByZXN0YXJ0OworCQkJIH0KKwkJfQorCQlwdGUgPSBw
bWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOworCQlpZiAobW9kaWZpZWQpIHsKKwkJCXJ2ID0gcHRl
X3Rlc3QocHRlLCBQVEVfRCkgJiYgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKTsKKwkJCWlmIChhY2Nl
c3NlZCkKKwkJCQlydiA9IHJ2ICYmIHB0ZV9pc192YWxpZChwdGUpICYmIHB0ZV9pc19yZWYocHRl
KTsKKwkJfSBlbHNlIGlmIChhY2Nlc3NlZCkgeworCQkJcnYgPSBwdGVfaXNfdmFsaWQocHRlKSAm
JiBwdGVfaXNfcmVmKHB0ZSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCWlmIChydikK
KwkJCWdvdG8gb3V0OworCX0KKwlpZiAoKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkg
eworCQlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFD
SChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCkgeworCQkJcG1hcCA9IFBWX1BNQVAocHYpOwor
CQkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47
CisJCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJCXJ3X3J1bmxvY2sobG9jayk7CisJCQkJ
UE1BUF9MT0NLKHBtYXApOworCQkJCXJ3X3Jsb2NrKGxvY2spOworCQkJCWlmIChtZF9nZW4gIT0g
bS0+bWQucHZfZ2VuIHx8CisJCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4pIHsKKwkJCQkJ
UE1BUF9VTkxPQ0socG1hcCk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CisJCQl9CisJCQlw
dGUgPSAocHRfZW50cnlfdCAqKXBtYXBfcGRlKHBtYXAsIHB2LT5wdl92YSk7CisJCQlpZiAobW9k
aWZpZWQpIHsKKwkJCQlydiA9IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmCisJCQkJICAgICFwdGVf
dGVzdChwdGUsIFBURV9STyk7CisJCQkJaWYgKGFjY2Vzc2VkKQorCQkJCQlydiA9IHJ2ICYmIHB0
ZV9pc192YWxpZChwdGUpICYmCisJCQkJCSAgICBwdGVfaXNfcmVmKHB0ZSk7CisJCQl9IGVsc2Ug
aWYgKGFjY2Vzc2VkKSB7CisJCQkJcnYgPSBwdGVfaXNfdmFsaWQocHRlKSAmJgorCQkJCSAgICBw
dGVfaXNfcmVmKHB0ZSk7CisJCQl9CisJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCWlmIChydikK
KwkJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlyd19ydW5sb2NrKGxvY2spOworCXJ3X3J1
bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcmV0dXJuIChydik7Cit9CisKKworLyoKKyAqCXBt
YXBfaXNfbW9kaWZpZWQ6CisgKgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZp
ZWQgcGh5c2ljYWwgcGFnZSB3YXMgbW9kaWZpZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgor
ICovCitib29sZWFuX3QKK3BtYXBfaXNfbW9kaWZpZWQodm1fcGFnZV90IG0pCit7CisKKwlLQVNT
RVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfaXNfbW9k
aWZpZWQ6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisKKwkvKgorCSAqIElmIHRoZSBw
YWdlIGlzIG5vdCBleGNsdXNpdmUgYnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUgY2Fubm90IGJl
CisJICogY29uY3VycmVudGx5IHNldCB3aGlsZSB0aGUgb2JqZWN0IGlzIGxvY2tlZC4gIFRodXMs
IGlmIFBHQV9XUklURUFCTEUKKwkgKiBpcyBjbGVhciwgbm8gUFRFcyBjYW4gaGF2ZSBQVEVfRCBz
ZXQuCisJICovCisJVk1fT0JKRUNUX0FTU0VSVF9XTE9DS0VEKG0tPm9iamVjdCk7CisJaWYgKCF2
bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCisJ
CXJldHVybiAoRkFMU0UpOworCXJldHVybiAocG1hcF9wYWdlX3Rlc3RfbWFwcGluZ3MobSwgRkFM
U0UsIFRSVUUpKTsKK30KKworLyoKKyAqCXBtYXBfaXNfcHJlZmF1bHRhYmxlOgorICoKKyAqCVJl
dHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcyBpcyBlbGdp
YmxlCisgKglmb3IgcHJlZmF1bHQuCisgKi8KK2Jvb2xlYW5fdAorcG1hcF9pc19wcmVmYXVsdGFi
bGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIpCit7CisJcGRfZW50cnlfdCAqcGRlOwor
CXB0X2VudHJ5X3QgKnB0ZTsKKwlib29sZWFuX3QgcnY7CisKKwlydiA9IEZBTFNFOworCVBNQVBf
TE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCBhZGRyKTsKKwlpZiAocGRlICE9IE5V
TEwgJiYgKnBkZSAhPSAwKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQlw
dGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJZWxzZQorCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRl
KHBkZSwgYWRkcik7CisJCXJ2ID0gKCpwdGUgPT0gMCkgfHwgKCpwdGUgPT0gUFRFX0cpOworCX0K
KwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCXBtYXBfaXNf
cmVmZXJlbmNlZDoKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBw
aHlzaWNhbCBwYWdlIHdhcyByZWZlcmVuY2VkCisgKglpbiBhbnkgcGh5c2ljYWwgbWFwcy4KKyAq
LworYm9vbGVhbl90CitwbWFwX2lzX3JlZmVyZW5jZWQodm1fcGFnZV90IG0pCit7CisKKwlLQVNT
RVJUKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfaXNfcmVm
ZXJlbmNlZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlyZXR1cm4gKHBtYXBfcGFn
ZV90ZXN0X21hcHBpbmdzKG0sIFRSVUUsIEZBTFNFKSk7Cit9CisKKy8qCisgKglBcHBseSB0aGUg
Z2l2ZW4gYWR2aWNlIHRvIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgYWRkcmVzc2VzIHdpdGhpbiB0
aGUKKyAqCWdpdmVuIHBtYXAuICBEZXBlbmRpbmcgb24gdGhlIGFkdmljZSwgY2xlYXIgdGhlIHJl
ZmVyZW5jZWQgYW5kL29yCisgKgltb2RpZmllZCBmbGFncyBpbiBlYWNoIG1hcHBpbmcgYW5kIHNl
dCB0aGUgbWFwcGVkIHBhZ2UncyBkaXJ0eSBmaWVsZC4KKyAqLwordm9pZAorcG1hcF9hZHZpc2Uo
cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhLCBpbnQgYWR2aWNl
KQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwZSwgb2xk
cGRlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwl2bV9vZmZzZXRfdCB2YV9uZXh0OworCXZtX3BhZ2Vf
dCBtOworCWJvb2xlYW5fdCBhbnljaGFuZ2VkLCBwdl9saXN0c19sb2NrZWQ7CisKKwlpZiAoYWR2
aWNlICE9IE1BRFZfRE9OVE5FRUQgJiYgYWR2aWNlICE9IE1BRFZfRlJFRSkKKwkJcmV0dXJuOwor
CisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdlZCA9IEZBTFNF
OworCVBNQVBfTE9DSyhwbWFwKTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7
CisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gMCkgewor
CQkJdmFfbmV4dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwg
c3ZhKQorCQkJCXZhX25leHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0g
KHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25l
eHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShwZHBlLCBzdmEpOworCQlvbGRw
ZGUgPSAqcGRlOworCQlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSAwKQorCQkJY29udGludWU7
CisJCWVsc2UgaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJaWYgKCFwZGVfdGVz
dCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpCisJCQkJY29udGludWU7CisJCQlpZiAoIXB2X2xpc3Rz
X2xvY2tlZCkgeworCQkJCXB2X2xpc3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJaWYgKCFyd190cnlf
cmxvY2soJnB2aF9nbG9iYWxfbG9jaykpIHsKKwkJCQkJaWYgKGFueWNoYW5nZWQpCisJCQkJCQlw
bWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCQkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQkJ
cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCWdvdG8gcmVzdW1lOworCQkJCX0KKwkJ
CX0KKwkJCWxvY2sgPSBOVUxMOworCQkJaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAs
IHBkZSwgc3ZhLCAmbG9jaykpIHsKKwkJCQlpZiAobG9jayAhPSBOVUxMKQorCQkJCQlyd193dW5s
b2NrKGxvY2spOworCisJCQkJLyoKKwkJCQkgKiBUaGUgc3VwZXJwYWdlIG1hcHBpbmcgd2FzIGRl
c3Ryb3llZC4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFVu
bGVzcyB0aGUgcGFnZSBtYXBwaW5ncyBhcmUgd2lyZWQsIHJlbW92ZSB0aGUKKwkJCSAqIG1hcHBp
bmcgdG8gYSBzaW5nbGUgcGFnZSBzbyB0aGF0IGEgc3Vic2VxdWVudAorCQkJICogYWNjZXNzIG1h
eSByZXByb21vdGUuICBTaW5jZSB0aGUgdW5kZXJseWluZyBwYWdlCisJCQkgKiB0YWJsZSBwYWdl
IGlzIGZ1bGx5IHBvcHVsYXRlZCwgdGhpcyByZW1vdmFsIG5ldmVyCisJCQkgKiBmcmVlcyBhIHBh
Z2UgdGFibGUgcGFnZS4KKwkJCSAqLworCQkJaWYgKCFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfVykp
IHsKKwkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOworCQkJCUtBU1NFUlQocHRl
X3Rlc3QocHRlLCBQVEVfVkFMSUQpLAorCQkJCSAgICAoInBtYXBfYWR2aXNlOiBpbnZhbGlkIFBU
RSIpKTsKKwkJCQlwbWFwX3JlbW92ZV9wdGUocG1hcCwgcHRlLCBzdmEsICpwZGUsIE5VTEwsCisJ
CQkJICAgICZsb2NrKTsKKwkJCQlhbnljaGFuZ2VkID0gVFJVRTsKKwkJCX0KKwkJCWlmIChsb2Nr
ICE9IE5VTEwpCisJCQkJcndfd3VubG9jayhsb2NrKTsKKwkJfQorCQkvKgorCQkgKiBMaW1pdCBv
dXIgc2NhbiB0byBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgdmEgcmVwcmVzZW50ZWQKKwkJICogYnkg
dGhlIGN1cnJlbnQgcGFnZSB0YWJsZSBwYWdlLCBvciB0byB0aGUgZW5kIG9mIHRoZQorCQkgKiBy
YW5nZSBiZWluZyB3cml0ZSBwcm90ZWN0ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkK
KwkJCXZhX25leHQgPSBldmE7CisKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBz
dmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CisJ
CQlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8ICFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEKSkK
KwkJCQljb250aW51ZTsKKwkJCWVsc2UgaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmCisJCQkg
ICAgIXB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgeworCQkJCWlmIChhZHZpY2UgPT0gTUFEVl9ET05U
TkVFRCkgeworCQkJCQkvKgorCQkJCQkgKiBGdXR1cmUgY2FsbHMgdG8gcG1hcF9pc19tb2RpZmll
ZCgpCisJCQkJCSAqIGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyB0aGUgcGFnZQorCQkJCQkgKiBk
aXJ0eSBub3cuCisJCQkJCSAqLworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKAorCQkJCQkgICAg
VExCTE9fUFRFX1RPX1BBKCpwdGUpKTsKKwkJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCQl9CisJ
CQkJcHRlX2F0b21pY19jbGVhcihwdGUsIFBURV9EIHwgUFRFX1JFRik7CisJCQl9IGVsc2UgaWYg
KHB0ZV9pc19yZWYocHRlKSkKKwkJCQlwdGVfYXRvbWljX2NsZWFyKHB0ZSwgUFRFX1JFRik7CisJ
CQllbHNlCisJCQkJY29udGludWU7CisJCQlpZiAocHRlX3Rlc3QocHRlLCBQVEVfRykpCisJCQkJ
cG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgc3ZhKTsKKwkJCWVsc2UKKwkJCQlhbnljaGFuZ2Vk
ID0gVFJVRTsKKwkJfQorCX0KKwlpZiAoYW55Y2hhbmdlZCkKKwkJcG1hcF9pbnZhbGlkYXRlX2Fs
bChwbWFwKTsKKwlpZiAocHZfbGlzdHNfbG9ja2VkKSB7CisJCXJ3X3J1bmxvY2soJnB2aF9nbG9i
YWxfbG9jayk7CisJfQorCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJQ2xlYXIgdGhl
IG1vZGlmeSBiaXRzIG9uIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZS4KKyAqLwordm9pZAor
cG1hcF9jbGVhcl9tb2RpZnkodm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsK
KwlwbWFwX3QgcG1hcDsKKwlwdl9lbnRyeV90IG5leHRfcHYsIHB2OworCXBkX2VudHJ5X3Qgb2xk
cGRlLCAqcGRlOworCXB0X2VudHJ5X3Qgb2xkcHRlLCAqcHRlOworCXN0cnVjdCByd2xvY2sgKmxv
Y2s7CisJdm1fb2Zmc2V0X3QgdmE7CisJaW50IG1kX2dlbiwgcHZoX2dlbjsKKworCUtBU1NFUlQo
KG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9jbGVhcl9tb2Rp
Znk6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJVk1fT0JKRUNUX0FTU0VSVF9XTE9D
S0VEKG0tPm9iamVjdCk7CisJS0FTU0VSVCghdm1fcGFnZV94YnVzaWVkKG0pLAorCSAgICAoInBt
YXBfY2xlYXJfbW9kaWZ5OiBwYWdlICVwIGlzIGV4Y2x1c2l2ZSBidXNpZWQiLCBtKSk7CisKKwkv
KgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCBQR0FfV1JJVEVBQkxFLCB0aGVuIG5vIFBURXMgY2Fu
IGhhdmUgUFRFX0Qgc2V0LgorCSAqIElmIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgcGFnZSBp
cyBsb2NrZWQgYW5kIHRoZSBwYWdlIGlzIG5vdAorCSAqIHdyaXRlIGJ1c2llZCwgdGhlbiBQR0Ff
V1JJVEVBQkxFIGNhbm5vdCBiZSBjb25jdXJyZW50bHkgc2V0LgorCSAqLworCWlmICgobS0+YWZs
YWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuOworCXB2aCA9IHBhX3RvX3B2aChW
TV9QQUdFX1RPX1BIWVMobSkpOworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sg
PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKTsKKwlyd193bG9jayhsb2NrKTsKK3Jlc3RhcnQ6
CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdvdG8gc21hbGxfbWFw
cGluZ3M7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0LCBu
ZXh0X3B2KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1h
cCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJ
CQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9jayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9
IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJZ290byByZXN0YXJ0
OworCQkJfQorCQl9CisJCXZhID0gcHYtPnB2X3ZhOworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2
YSk7CisJCW9sZHBkZSA9ICpwZGU7CisJCWlmICghcGRlX3Rlc3QocGRlLCBQVEVfUk8pKSB7CisJ
CQlpZiAocG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9jaykpIHsKKwkJ
CQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUsIFBURV9XKSkgeworCQkJCQkvKgorCQkJCQkgKiBXcml0
ZSBwcm90ZWN0IHRoZSBtYXBwaW5nIHRvIGEKKwkJCQkJICogc2luZ2xlIHBhZ2Ugc28gdGhhdCBh
IHN1YnNlcXVlbnQKKwkJCQkJICogd3JpdGUgYWNjZXNzIG1heSByZXByb21vdGUuCisJCQkJCSAq
LworCQkJCQl2YSArPSBWTV9QQUdFX1RPX1BIWVMobSkgLQorCQkJCQkgICBUTEJMT19QREVfVE9f
UEEob2xkcGRlKTsKKwkJCQkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCQkJCQlv
bGRwdGUgPSAqcHRlOworCQkJCQlpZiAoIXB0ZV90ZXN0KCZvbGRwdGUsIFBURV9WQUxJRCkpIHsK
KwkJCQkJCXdoaWxlICghYXRvbWljX2NtcHNldF9sb25nKHB0ZSwKKwkJCQkJCSAgICBvbGRwdGUs
CisJCQkJCQkgICAgKG9sZHB0ZSAmIH5QVEVfRCkgfCBQVEVfUk8pKQorCQkJCQkJCW9sZHB0ZSA9
ICpwdGU7CisJCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3Bh
Z2UocG1hcCwgdmEpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCVBNQVBfVU5MT0NLKHBt
YXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9s
aXN0LCBwdl9uZXh0KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2KTsKKwkJaWYgKCFQTUFQX1RSWUxP
Q0socG1hcCkpIHsKKwkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCXB2aF9nZW4gPSBwdmgt
PnB2X2dlbjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQly
d193bG9jayhsb2NrKTsKKwkJCWlmIChtZF9nZW4gIT0gbS0+bWQucHZfZ2VuIHx8IG1kX2dlbiAh
PSBtLT5tZC5wdl9nZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3Rh
cnQ7CisJCQl9CisJCX0KKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FT
U0VSVCghcGRlX2lzX3N1cGVycGFnZShwZGUpLCAoInBtYXBfY2xlYXJfbW9kaWZ5OiBmb3VuZCIK
KwkJICAgICIgYSBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLCBtKSk7CisJCXB0ZSA9
IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7CisJCWlmIChwdGVfdGVzdChwdGUsIFBU
RV9EKSAmJiAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pKSB7CisJCQlwdGVfYXRvbWljX2NsZWFyKHB0
ZSwgUFRFX0QpOworCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgcHYtPnB2X3ZhKTsKKwkJ
fQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9CisJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5s
b2NrKCZwdmhfZ2xvYmFsX2xvY2spOworfQorCisvKgorICogTWlzY2VsbGFuZW91cyBzdXBwb3J0
IHJvdXRpbmVzIGZvbGxvdworICovCisKKy8qCisgKiBNYXAgYSBzZXQgb2YgcGh5c2ljYWwgbWVt
b3J5IHBhZ2VzIGludG8gdGhlIGtlcm5lbCB2aXJ0dWFsCisgKiBhZGRyZXNzIHNwYWNlLiBSZXR1
cm4gYSBwb2ludGVyIHRvIHdoZXJlIGl0IGlzIG1hcHBlZC4gVGhpcworICogcm91dGluZSBpcyBp
bnRlbmRlZCB0byBiZSB1c2VkIGZvciBtYXBwaW5nIGRldmljZSBtZW1vcnksCisgKiBOT1QgcmVh
bCBtZW1vcnkuCisgKgorICogVXNlIFhLUEhZUyB1bmNhY2hlZCBmb3IgNjQgYml0LgorICovCit2
b2lkICoKK3BtYXBfbWFwZGV2KHZtX3BhZGRyX3QgcGEsIHZtX3NpemVfdCBzaXplKQoreworCisJ
cmV0dXJuICgodm9pZCAqKU1JUFNfUEhZU19UT19ESVJFQ1RfVU5DQUNIRUQocGEpKTsKK30KKwor
dm9pZAorcG1hcF91bm1hcGRldih2bV9vZmZzZXRfdCB2YSwgdm1fc2l6ZV90IHNpemUpCit7CisK
KwkvKiBOb3RoaW5nIHRvIGRvIGZvciBtaXBzNjQuICovCit9CisKKy8qCisgKiBTZXRzIHRoZSBt
ZW1vcnkgYXR0cmlidXRlIGZvciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBf
cGFnZV9zZXRfbWVtYXR0cih2bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQoreworCS8qCisJ
ICogU2V0IHRoZSBtZW1hdHRyIGZpZWxkIHNvIHRoZSBhcHByb3ByaWF0ZSBiaXRzIGFyZSBzZXQg
aW4gdGhlCisJICogUFRFIGFzIG1hcHBpbmdzIGFyZSBjcmVhdGVkLgorCSAqLworCW0tPm1kLnB2
X21lbWF0dHIgPSBtYTsKKworCS8qCisJICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rp
b24gaXMgb25seSBjYWxsZWQgYmVmb3JlIGFueSBtYXBwaW5ncworCSAqIGFyZSBlc3RhYmxpc2hl
ZC4gIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsCisJICog
bmVlZCB0byB3YWxrIHRoZSBwdl9saXN0IGFuZCBtYWtlIGVhY2ggb2YgdGhlIGV4aXN0aW5nIG1h
cHBpbmdzCisJICogdW5jYWNoZWFibGUsIHN5bmMgdGhlIGNhY2hlICh3aXRoIG1pcHNfaWNhY2hl
X3N5bmNfYWxsKCkgYW5kCisJICogbWlwc19kY2FjaGVfd2JpbnZfYWxsKCkpIGFuZCBtb3N0IGxp
a2VseSBpbnZhbGlkYXRlIFRMQiBlbnRyaWVzIGZvcgorCSAqIGFueSBvZiB0aGUgY3VycmVudCBt
YXBwaW5ncyBpdCBtb2RpZmllcy4KKwkgKi8KKwlpZiAoVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xp
c3QpICE9IE5VTEwpCisJCXBhbmljKCJDYW4ndCBjaGFuZ2UgbWVtYXR0ciBvbiBwYWdlIHdpdGgg
ZXhpc3RpbmcgbWFwcGluZ3MiKTsKK30KKworLyoKKyAqIHBlcmZvcm0gdGhlIHBtYXAgd29yayBm
b3IgbWluY29yZQorICovCitpbnQKK3BtYXBfbWluY29yZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0
X3QgYWRkciwgdm1fcGFkZHJfdCAqbG9ja2VkX3BhKQoreworCXBkX2VudHJ5X3QgKnBkZXA7CisJ
cHRfZW50cnlfdCAqcHRlcCwgcHRlOworCXZtX3BhZGRyX3QgcGE7CisJaW50IHZhbDsKKworCVBN
QVBfTE9DSyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCBhZGRyKTsKKwlp
ZiAocGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZXApKSB7CisJ
CQlwdGUgPSAocHRfZW50cnlfdCkqcGRlcDsKKwkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7
CisJCQl2YWwgPSBNSU5DT1JFX1NVUEVSOworCQl9IGVsc2UgeworCQkJcHRlcCA9IHBtYXBfcGRl
X3RvX3B0ZShwZGVwLCBhZGRyKTsKKwkJCXB0ZSA9IChwdGVwICE9IE5VTEwpID8gKnB0ZXAgOiAw
OworCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCXZhbCA9IDA7CisJCX0KKwl9IGVs
c2UgeworCQlwdGUgPSAwOworCQlwYSA9IDA7CisJCXZhbCA9IDA7CisJfQorCWlmIChwdGVfaXNf
dmFsaWQoJnB0ZSkpIHsKKwkJdmFsIHw9IE1JTkNPUkVfSU5DT1JFOworCQlpZiAocHRlX3Rlc3Qo
JnB0ZSwgUFRFX0QpKQorCQkJdmFsIHw9IE1JTkNPUkVfTU9ESUZJRUQgfCBNSU5DT1JFX01PRElG
SUVEX09USEVSOworCQlpZiAocHRlX2lzX3JlZigmcHRlKSkKKwkJCXZhbCB8PSBNSU5DT1JFX1JF
RkVSRU5DRUQgfCBNSU5DT1JFX1JFRkVSRU5DRURfT1RIRVI7CisJfQorCWlmICgodmFsICYgKE1J
TkNPUkVfTU9ESUZJRURfT1RIRVIgfCBNSU5DT1JFX1JFRkVSRU5DRURfT1RIRVIpKSAhPQorCSAg
ICAoTUlOQ09SRV9NT0RJRklFRF9PVEhFUiB8IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikgJiYK
KwkgICAgcHRlX3Rlc3QoJnB0ZSwgUFRFX01BTkFHRUQpKSB7CisJCS8qIEVuc3VyZSB0aGF0ICJQ
SFlTX1RPX1ZNX1BBR0UocGEpLT5vYmplY3QiIGRvZXNuJ3QgY2hhbmdlLiAqLworCQlpZiAodm1f
cGFnZV9wYV90cnlyZWxvY2socG1hcCwgcGEsIGxvY2tlZF9wYSkpCisJCQlnb3RvIHJldHJ5Owor
CX0gZWxzZQorCQlQQV9VTkxPQ0tfQ09ORCgqbG9ja2VkX3BhKTsKKwlQTUFQX1VOTE9DSyhwbWFw
KTsKKwlyZXR1cm4gKHZhbCk7Cit9CisKK3ZvaWQKK3BtYXBfYWN0aXZhdGUoc3RydWN0IHRocmVh
ZCAqdGQpCit7CisJcG1hcF90IHBtYXAsIG9sZHBtYXA7CisJc3RydWN0IHByb2MgKnAgPSB0ZC0+
dGRfcHJvYzsKKwl1X2ludCBjcHVpZDsKKworCWNyaXRpY2FsX2VudGVyKCk7CisKKwlwbWFwID0g
dm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJb2xkcG1hcCA9IFBDUFVfR0VUKGN1cnBtYXAp
OworCWNwdWlkID0gUENQVV9HRVQoY3B1aWQpOworCisJaWYgKG9sZHBtYXApCisJCUNQVV9DTFJf
QVRPTUlDKGNwdWlkLCAmb2xkcG1hcC0+cG1fYWN0aXZlKTsKKwlDUFVfU0VUX0FUT01JQyhjcHVp
ZCwgJnBtYXAtPnBtX2FjdGl2ZSk7CisJcG1hcF9hc2lkX2FsbG9jKHBtYXApOworCWlmICh0ZCA9
PSBjdXJ0aHJlYWQpIHsKKwkJUENQVV9TRVQoc2VnYmFzZSwgcG1hcC0+cG1fc2VndGFiKTsKKwkJ
bWlwc193cl9lbnRyeWhpKHBtYXAtPnBtX2FzaWRbY3B1aWRdLmFzaWQpOworCX0KKworCVBDUFVf
U0VUKGN1cnBtYXAsIHBtYXApOworCWNyaXRpY2FsX2V4aXQoKTsKK30KKwordm9pZAorcG1hcF9z
eW5jX2ljYWNoZShwbWFwX3QgcG0sIHZtX29mZnNldF90IHZhLCB2bV9zaXplX3Qgc3opCit7Cit9
CisKKy8qCisgKglJbmNyZWFzZSB0aGUgc3RhcnRpbmcgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBn
aXZlbiBtYXBwaW5nIGlmIGEKKyAqCWRpZmZlcmVudCBhbGlnbm1lbnQgbWlnaHQgcmVzdWx0IGlu
IG1vcmUgc3VwZXJwYWdlIG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX2FsaWduX3N1cGVycGFn
ZSh2bV9vYmplY3RfdCBvYmplY3QsIHZtX29vZmZzZXRfdCBvZmZzZXQsCisgICAgdm1fb2Zmc2V0
X3QgKmFkZHIsIHZtX3NpemVfdCBzaXplKQoreworCXZtX29mZnNldF90IHN1cGVycGFnZV9vZmZz
ZXQ7CisKKwlpZiAoc2l6ZSA8IE5CU0VHKQorCQlyZXR1cm47CisJaWYgKG9iamVjdCAhPSBOVUxM
ICYmIChvYmplY3QtPmZsYWdzICYgT0JKX0NPTE9SRUQpICE9IDApCisJCW9mZnNldCArPSBwdG9h
KG9iamVjdC0+cGdfY29sb3IpOworCXN1cGVycGFnZV9vZmZzZXQgPSBvZmZzZXQgJiBTRUdNQVNL
OworCWlmIChzaXplIC0gKChOQlNFRyAtIHN1cGVycGFnZV9vZmZzZXQpICYgU0VHTUFTSykgPCBO
QlNFRyB8fAorCSAgICAoKmFkZHIgJiBTRUdNQVNLKSA9PSBzdXBlcnBhZ2Vfb2Zmc2V0KQorCQly
ZXR1cm47CisJaWYgKCgqYWRkciAmIFNFR01BU0spIDwgc3VwZXJwYWdlX29mZnNldCkKKwkJKmFk
ZHIgPSAoKmFkZHIgJiB+U0VHTUFTSykgKyBzdXBlcnBhZ2Vfb2Zmc2V0OworCWVsc2UKKwkJKmFk
ZHIgPSAoKCphZGRyICsgU0VHTUFTSykgJiB+U0VHTUFTSykgKyBzdXBlcnBhZ2Vfb2Zmc2V0Owor
fQorCisjaWZkZWYgRERCCitEQl9TSE9XX0NPTU1BTkQocHRhYmxlLCBkZGJfcGlkX2R1bXApCit7
CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHRocmVhZCAqdGQgPSBOVUxMOworCXN0cnVjdCBwcm9j
ICpwOworCWludCBpLCBqLCBrOworCXZtX3BhZGRyX3QgcGE7CisJdm1fb2Zmc2V0X3QgdmE7CisK
KwlpZiAoaGF2ZV9hZGRyKSB7CisJCXRkID0gZGJfbG9va3VwX3RocmVhZChhZGRyLCBUUlVFKTsK
KwkJaWYgKHRkID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiSW52YWxpZCBwaWQgb3IgdGlkIik7
CisJCQlyZXR1cm47CisJCX0KKwkJcCA9IHRkLT50ZF9wcm9jOworCQlpZiAocC0+cF92bXNwYWNl
ID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiTm8gdm1zcGFjZSBmb3IgcHJvY2VzcyIpOworCQkJ
cmV0dXJuOworCQl9CisJCQlwbWFwID0gdm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJfSBl
bHNlCisJCXBtYXAgPSBrZXJuZWxfcG1hcDsKKworCWRiX3ByaW50ZigicG1hcDolcCBzZWd0YWI6
JXAgYXNpZDoleCBnZW5lcmF0aW9uOiV4XG4iLAorCSAgICBwbWFwLCBwbWFwLT5wbV9zZWd0YWIs
IHBtYXAtPnBtX2FzaWRbMF0uYXNpZCwKKwkgICAgcG1hcC0+cG1fYXNpZFswXS5nZW4pOworCWZv
ciAoaSA9IDA7IGkgPCBOUERFUEc7IGkrKykgeworCQlwZF9lbnRyeV90ICpwZHBlOworCQlwdF9l
bnRyeV90ICpwZGU7CisJCXB0X2VudHJ5X3QgcHRlOworCisJCXBkcGUgPSAocGRfZW50cnlfdCAq
KXBtYXAtPnBtX3NlZ3RhYltpXTsKKwkJaWYgKHBkcGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOwor
CQlkYl9wcmludGYoIlslNGRdICVwXG4iLCBpLCBwZHBlKTsKKwkJZm9yIChqID0gMDsgaiA8IE5Q
REVQRzsgaisrKSB7CisJCQlwZGUgPSAocHRfZW50cnlfdCAqKXBkcGVbal07CisJCQlpZiAocGRl
ID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQlkYl9wcmludGYoIlx0WyU0ZF0gJXBcbiIsIGos
IHBkZSk7CisJCQlmb3IgKGsgPSAwOyBrIDwgTlBURVBHOyBrKyspIHsKKwkJCQlwdGUgPSBwZGVb
a107CisJCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfaXNfdmFsaWQoJnB0ZSkpCisJCQkJCWNvbnRp
bnVlOworCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJCQkJdmEgPSAoKHVfbG9uZylp
IDw8IFNFR1NISUZUKSB8IChqIDw8IFBEUlNISUZUKSB8IChrIDw8IFBBR0VfU0hJRlQpOworCQkJ
CWRiX3ByaW50ZigiXHRcdFslMDRkXSB2YTogJXAgcHRlOiAlOGp4IHBhOiVqeFxuIiwKKwkJCQkg
ICAgICAgaywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClwdGUsICh1aW50bWF4X3QpcGEpOworCQkJ
fQorCQl9CisJfQorfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERFQlVHKQorCitzdGF0aWMgdm9p
ZCBwYWRzKHBtYXBfdCBwbSk7Cit2b2lkIHBtYXBfcHZkdW1wKHZtX29mZnNldF90IHBhKTsKKwor
LyogcHJpbnQgYWRkcmVzcyBzcGFjZSBvZiBwbWFwKi8KK3N0YXRpYyB2b2lkCitwYWRzKHBtYXBf
dCBwbSkKK3sKKwl1bnNpZ25lZCB2YSwgaSwgajsKKwlwdF9lbnRyeV90ICpwdGVwOworCisJaWYg
KHBtID09IGtlcm5lbF9wbWFwKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsg
aSsrKQorCQlpZiAocG0tPnBtX3NlZ3RhYltpXSkKKwkJCWZvciAoaiA9IDA7IGogPCBOUFRFUEc7
IGorKykgeworCQkJCXZhID0gKGkgPDwgU0VHU0hJRlQpICsgKGogPDwgUEFHRV9TSElGVCk7CisJ
CQkJaWYgKHBtID09IGtlcm5lbF9wbWFwICYmIHZhIDwgS0VSTkJBU0UpCisJCQkJCWNvbnRpbnVl
OworCQkJCWlmIChwbSAhPSBrZXJuZWxfcG1hcCAmJgorCQkJCSAgICB2YSA+PSBWTV9NQVhVU0VS
X0FERFJFU1MpCisJCQkJCWNvbnRpbnVlOworCQkJCXB0ZXAgPSBwbWFwX3B0ZShwbSwgdmEpOwor
CQkJCWlmIChwdGVfaXNfdmFsaWQocHRlcCkpCisJCQkJCXByaW50ZigiJXg6JXggIiwgdmEsICoo
aW50ICopcHRlcCk7CisJCQl9CisKK30KKwordm9pZAorcG1hcF9wdmR1bXAodm1fb2Zmc2V0X3Qg
cGEpCit7CisJcmVnaXN0ZXIgcHZfZW50cnlfdCBwdjsKKwl2bV9wYWdlX3QgbTsKKworCXByaW50
ZigicGEgJXgiLCBwYSk7CisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJZm9yIChwdiA9IFRB
SUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7CisJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwg
cHZfbGlzdCkpIHsKKwkJcHJpbnRmKCIgLT4gcG1hcCAlcCwgdmEgJXgiLCAodm9pZCAqKXB2LT5w
dl9wbWFwLCBwdi0+cHZfdmEpOworCQlwYWRzKHB2LT5wdl9wbWFwKTsKKwl9CisJcHJpbnRmKCIg
Iik7Cit9CisKKy8qIE4vQyAqLworI2VuZGlmCisKKworLyoKKyAqIEFsbG9jYXRlIFRMQiBhZGRy
ZXNzIHNwYWNlIHRhZyAoY2FsbGVkIEFTSUQgb3IgVExCUElEKSBhbmQgcmV0dXJuIGl0LgorICog
SXQgdGFrZXMgYWxtb3N0IGFzIG11Y2ggb3IgbW9yZSB0aW1lIHRvIHNlYXJjaCB0aGUgVExCIGZv
ciBhCisgKiBzcGVjaWZpYyBBU0lEIGFuZCBmbHVzaCB0aG9zZSBlbnRyaWVzIGFzIGl0IGRvZXMg
dG8gZmx1c2ggdGhlIGVudGlyZSBUTEIuCisgKiBUaGVyZWZvcmUsIHdoZW4gd2UgYWxsb2NhdGUg
YSBuZXcgQVNJRCwgd2UganVzdCB0YWtlIHRoZSBuZXh0IG51bWJlci4gV2hlbgorICogd2UgcnVu
IG91dCBvZiBudW1iZXJzLCB3ZSBmbHVzaCB0aGUgVExCLCBpbmNyZW1lbnQgdGhlIGdlbmVyYXRp
b24gY291bnQKKyAqIGFuZCBzdGFydCBvdmVyLiBBU0lEIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIGtl
cm5lbCB1c2UuCisgKi8KK3N0YXRpYyB2b2lkCitwbWFwX2FzaWRfYWxsb2MocG1hcCkKKwlwbWFw
X3QgcG1hcDsKK3sKKwlpZiAocG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmFzaWQgIT0g
UE1BUF9BU0lEX1JFU0VSVkVEICYmCisJICAgIHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQp
XS5nZW4gPT0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSk7CisJZWxzZSB7CisJCWlmIChQQ1BV
X0dFVChuZXh0X2FzaWQpID09IHBtYXBfbWF4X2FzaWQpIHsKKwkJCXRsYl9pbnZhbGlkYXRlX2Fs
bF91c2VyKE5VTEwpOworCQkJUENQVV9TRVQoYXNpZF9nZW5lcmF0aW9uLAorCQkJICAgIChQQ1BV
X0dFVChhc2lkX2dlbmVyYXRpb24pICsgMSkgJiBBU0lER0VOX01BU0spOworCQkJaWYgKFBDUFVf
R0VUKGFzaWRfZ2VuZXJhdGlvbikgPT0gMCkgeworCQkJCVBDUFVfU0VUKGFzaWRfZ2VuZXJhdGlv
biwgMSk7CisJCQl9CisJCQlQQ1BVX1NFVChuZXh0X2FzaWQsIDEpOwkvKiAwIG1lYW5zIGludmFs
aWQgKi8KKwkJfQorCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCA9IFBDUFVf
R0VUKG5leHRfYXNpZCk7CisJCXBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5nZW4gPSBQ
Q1BVX0dFVChhc2lkX2dlbmVyYXRpb24pOworCQlQQ1BVX1NFVChuZXh0X2FzaWQsIFBDUFVfR0VU
KG5leHRfYXNpZCkgKyAxKTsKKwl9Cit9CisKK3N0YXRpYyBwdF9lbnRyeV90Citpbml0X3B0ZV9w
cm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlw
dF9lbnRyeV90IHJ3OworCisJaWYgKCEocHJvdCAmIFZNX1BST1RfV1JJVEUpKQorCQlydyA9IFBU
RV9WQUxJRCB8IFBURV9STzsKKwllbHNlIGlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkg
PT0gMCkgeworCQlpZiAoKGFjY2VzcyAmIFZNX1BST1RfV1JJVEUpICE9IDApCisJCQlydyA9IFBU
RV9WQUxJRCB8IFBURV9EOworCQllbHNlCisJCQlydyA9IFBURV9WQUxJRDsKKwl9IGVsc2Ugewor
CQkvKgorCQkgKiBOZWVkbid0IGVtdWxhdGUgYSByZWZlcmVuY2UvbW9kaWZpZWQgYml0IGZvciB1
bm1hbmFnZWQKKwkJICogcGFnZXMuCisJCSAqLworCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwor
CQlwdGVfcmVmX3NldCgmcncpOworCX0KKworCXJldHVybiAocncpOworfQorCisvKgorICogcG1h
cF9lbXVsYXRlX21vZGlmaWVkIDogZG8gZGlydHkgYml0IGVtdWxhdGlvbgorICoKKyAqIE9uIFNN
UCwgdXBkYXRlIGp1c3QgdGhlIGxvY2FsIFRMQiwgb3RoZXIgQ1BVcyB3aWxsIHVwZGF0ZSB0aGVp
cgorICogVExCcyBmcm9tIFBURSBsYXppbHksIGlmIHRoZXkgZ2V0IHRoZSBleGNlcHRpb24uCisg
KiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNlc3MsIDEgaWYgdGhlIHBhZ2UgaXMgcmVhZCBvbmx5
IGFuZCB3ZQorICogbmVlZCB0byBmYXVsdC4KKyAqLworaW50CitwbWFwX2VtdWxhdGVfbW9kaWZp
ZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKwlw
dF9lbnRyeV90ICpwdGU7CisKKwlQTUFQX0xPQ0socG1hcCk7CisJcGRlID0gcG1hcF9wZGUocG1h
cCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCXB0ZSA9IChwdF9lbnRy
eV90ICopcGRlOworCWVsc2UKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCWlm
IChwdGUgPT0gTlVMTCkKKwkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogY2FuJ3QgZmlu
ZCBQVEUiKTsKKyNpZmRlZiBTTVAKKwkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgb3RoZXIg
Q1BVIGNoYW5nZWQgbS1iaXQgKi8KKwlpZiAoIXB0ZV9pc192YWxpZChwdGUpIHx8IHB0ZV90ZXN0
KHB0ZSwgUFRFX0QpKSB7CisJCXRsYl91cGRhdGUocG1hcCwgdmEsICpwdGUpOworCQlQTUFQX1VO
TE9DSyhwbWFwKTsKKwkJcmV0dXJuICgwKTsKKwl9CisjZWxzZQorCWlmICghcHRlX2lzX3ZhbGlk
KHB0ZSkgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpIHsKKwkJdGxiX3VwZGF0ZShwbWFwLCB2YSwg
KnB0ZSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQlyZXR1cm4gKDApOworCX0KKyNlbmRpZgor
CWlmIChwdGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJCXJl
dHVybiAoMSk7CisJfQorCXB0ZV9hdG9taWNfc2V0KHB0ZSwgUFRFX0QpOyAvKiBtYXJrIGl0IHJl
ZmVyZW5jZWQgYW5kIG1vZGlmaWVkICovCisJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSk7CisJdGxi
X3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VE
KSkKKwkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogdW5tYW5hZ2VkIHBhZ2UiKTsKKwlQ
TUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogcG1hcF9lbXVsYXRl
X3JlZmVyZW5jZWQ6IGRvIHJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisgKgorICogUmV0dXJucyAw
IGluIGNhc2Ugb2Ygc3VjY2Vzcy4gIFJldHVybnMgMSBpZiB3ZSBuZWVkIHRvIGZhdWx0LgorICov
CitpbnQKK3BtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2
YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJaWYgKGlzX2tl
cm5lbF9wbWFwKHBtYXApKQorCQlyZXR1cm4gKDEpOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUg
PSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gTlVMTCkg
eworCQkvKiBJbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LiAqLworCQlnb3RvIGRvZmF1bHQ7CisJfQor
CWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJcHRlID0gKHB0X2VudHJ5X3QgKilw
ZGU7CisJfSBlbHNlCisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwlpZiAocHRl
ID09IE5VTEwpIHsKKwkJLyogSW52YWxpZCBwYWdlIHRhYmxlLiAqLworCQlnb3RvIGRvZmF1bHQ7
CisJfQorCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJLyogSW52YWxpZCBQVEUuICovCisJ
CWdvdG8gZG9mYXVsdDsKKwl9CisJLyogQ2hlY2sgdG8gc2VlIGlmIGFscmVhZHkgbWFya2VkIGJ5
IG90aGVyIENQVS4gICovCisJaWYgKCFwdGVfaXNfcmVmKHB0ZSkpCisJCXB0ZV9yZWZfYXRvbWlj
X3NldChwdGUpOworCisJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJUE1BUF9VTkxPQ0so
cG1hcCk7CisKKwlyZXR1cm4gKDApOworCitkb2ZhdWx0OgorCVBNQVBfVU5MT0NLKHBtYXApOwor
CXJldHVybiAoMSk7Cit9CisKK3ZvaWQKK3BtYXBfZmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSkK
K3sKKwlwdl9lbnRyeV90IHB2OworCisJaWYgKG0gIT0gTlVMTCkgeworCQlmb3IgKHB2ID0gVEFJ
TFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsKKwkJICAgIHB2ID0gVEFJTFFfTkVYVChwdiwg
cHZfbmV4dCkpIHsKKwkJCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KHB2LT5wdl92YSwg
UEFHRV9TSVpFKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvcG1hcC5j
IGIvc3lzL21pcHMvbWlwcy9wbWFwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9wbWFwLmMKKysrIGIv
c3lzL21pcHMvbWlwcy9wbWFwLmMKQEAgLTc0LDYgKzc0LDcgQEAKICNpbmNsdWRlIDxzeXMvcHJv
Yy5oPgogI2luY2x1ZGUgPHN5cy9yd2xvY2suaD4KICNpbmNsdWRlIDxzeXMvc2NoZWQuaD4KKyNp
bmNsdWRlIDxzeXMvX3R5cGVzLmg+CiAjaWZkZWYgU01QCiAjaW5jbHVkZSA8c3lzL3NtcC5oPgog
I2Vsc2UKQEAgLTIzMiw3ICsyMzMsNyBAQAogCXN5c20gPSAmc3lzbWFwX2xtZW1bY3B1XTsKIAlz
eXNtLT5zYXZlZF9pbnRyID0gaW50cjsKIAl2YSA9IHN5c20tPmJhc2U7Ci0JbnB0ZSA9IFRMQkxP
X1BBX1RPX1BGTihwaHlzKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HOwor
CW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5cykgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRF
X1ZBTElEIHwgUFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhKTsKIAkqcHRl
ID0gbnB0ZTsKIAlzeXNtLT52YWxpZDEgPSAxOwpAQCAtMjU0LDEwICsyNTUsMTAgQEAKIAlzeXNt
LT5zYXZlZF9pbnRyID0gaW50cjsKIAl2YTEgPSBzeXNtLT5iYXNlOwogCXZhMiA9IHN5c20tPmJh
c2UgKyBQQUdFX1NJWkU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwaHlzMSkgfCBQVEVfQ19D
QUNIRSB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBo
eXMxKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRzsKIAlwdGUgPSBw
bWFwX3B0ZShrZXJuZWxfcG1hcCwgdmExKTsKIAkqcHRlID0gbnB0ZTsKLQlucHRlID0gVExCTE9f
UEFfVE9fUEZOKHBoeXMyKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8IFBURV9HOwor
CW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czIpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBU
RV9WQUxJRCB8IFBURV9HOwogCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YTIpOwogCSpw
dGUgPSBucHRlOwogCXN5c20tPnZhbGlkMSA9IDE7CkBAIC01NTYsOSArNTU3LDE1IEBACiAJbXNn
YnVmaW5pdChtc2didWZwLCBtc2didWZzaXplKTsKIAogCS8qCi0JICogU3RlYWwgdGhyZWFkMCBr
c3RhY2suCisJICogU3RlYWwgdGhyZWFkMCBrc3RhY2suICBUaGlzIG11c3QgYmUgYWxpZ25lZCB0
bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBhIHNpbmds
ZSBUTEIgZW50cnkuCisJICoKKwkgKiBYWFggVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSBv
ZiBnZXR0aW5nIGFsaWduZWQgbWVtb3J5CisJICogd2l0aCBwbWFwX3N0ZWFsX21lbW9yeSgpLgog
CSAqLwotCWtzdGFjazAgPSBwbWFwX3N0ZWFsX21lbW9yeShLU1RBQ0tfUEFHRVMgPDwgUEFHRV9T
SElGVCk7CisJa3N0YWNrMCA9IHBtYXBfc3RlYWxfbWVtb3J5KChLU1RBQ0tfUEFHRVMgKyBLU1RB
Q0tfR1VBUkRfUEFHRVMpIFwKKwkJCQkJPDwgUEFHRV9TSElGVCk7CisJa3N0YWNrMCA9IHJvdW5k
dXAyKGtzdGFjazAsIChLU1RBQ0tfUEFHRV9TSVpFICogMikpOwogCiAJdmlydHVhbF9hdmFpbCA9
IFZNX01JTl9LRVJORUxfQUREUkVTUzsKIAl2aXJ0dWFsX2VuZCA9IFZNX01BWF9LRVJORUxfQURE
UkVTUzsKQEAgLTYwNSw2ICs2MTIsNyBAQAogCiAJVEFJTFFfSU5JVCgmbS0+bWQucHZfbGlzdCk7
CiAJbS0+bWQucHZfZmxhZ3MgPSAwOworCW0tPm1kLnB2X21lbWF0dHIgPSBWTV9NRU1BVFRSX0RF
RkFVTFQ7CiB9CiAKIC8qCkBAIC04MDEsNyArODA5LDcgQEAKIAlwdGVwID0gcG1hcF9wdGUocG1h
cCwgdmEpOwogCWlmIChwdGVwICE9IE5VTEwpIHsKIAkJcHRlID0gKnB0ZXA7Ci0JCWlmIChwdGVf
dGVzdCgmcHRlLCBQVEVfVikgJiYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8CisJCWlmIChw
dGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpICYmICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1JPKSB8fAog
CQkgICAgKHByb3QgJiBWTV9QUk9UX1dSSVRFKSA9PSAwKSkgewogCQkJcHRlX3BhID0gVExCTE9f
UFRFX1RPX1BBKHB0ZSk7CiAJCQlpZiAodm1fcGFnZV9wYV90cnlyZWxvY2socG1hcCwgcHRlX3Bh
LCAmcGEpKQpAQCAtODM0LDkgKzg0Miw5IEBACiAKIAlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h
cCwgdmEpOwogCW9wdGUgPSAqcHRlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0
ciB8IFBURV9EIHwgUFRFX1YgfCBQVEVfRzsKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8
IGF0dHIgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCSpwdGUgPSBucHRlOwotCWlmIChw
dGVfdGVzdCgmb3B0ZSwgUFRFX1YpICYmIG9wdGUgIT0gbnB0ZSkKKwlpZiAocHRlX3Rlc3QoJm9w
dGUsIFBURV9WQUxJRCkgJiYgb3B0ZSAhPSBucHRlKQogCQlwbWFwX3VwZGF0ZV9wYWdlKGtlcm5l
bF9wbWFwLCB2YSwgbnB0ZSk7CiB9CiAKQEAgLTE0NDksNyArMTQ1Nyw3IEBACiAJCQkJaWYgKG0t
Pm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQogCQkJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQ
R0FfUkVGRVJFTkNFRCk7CiAJCQkJbS0+bWQucHZfZmxhZ3MgJj0gflBWX1RBQkxFX1JFRjsKLQkJ
CQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJCQlUQUlMUV9S
RU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJCQlpZiAoVEFJTFFfRU1QVFko
Jm0tPm1kLnB2X2xpc3QpKQogCQkJCQl2bV9wYWdlX2FmbGFnX2NsZWFyKG0sIFBHQV9XUklURUFC
TEUpOwogCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFVTCA8PCBiaXQ7CkBAIC0xNjI3LDkgKzE2
MzUsOSBAQAogCXB2X2VudHJ5X3QgcHY7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg
UkFfV0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbGlzdCkg
eworCVRBSUxRX0ZPUkVBQ0gocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQpIHsKIAkJaWYgKHBt
YXAgPT0gUFZfUE1BUChwdikgJiYgdmEgPT0gcHYtPnB2X3ZhKSB7Ci0JCQlUQUlMUV9SRU1PVkUo
JnB2aC0+cHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xp
c3QsIHB2LCBwdl9uZXh0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTY3MSw3ICsxNjc5LDcg
QEAKIAlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKIAlpZiAoKHB2ID0gZ2V0X3B2
X2VudHJ5KHBtYXAsIFRSVUUpKSAhPSBOVUxMKSB7CiAJCXB2LT5wdl92YSA9IHZhOwotCQlUQUlM
UV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQlUQUlMUV9JTlNF
UlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQlyZXR1cm4gKFRSVUUpOwog
CX0gZWxzZQogCQlyZXR1cm4gKEZBTFNFKTsKQEAgLTE3NDQsNyArMTc1Miw3IEBACiAJLyoKIAkg
KiBJZiB0aGVyZSBpcyBubyBwdGUgZm9yIHRoaXMgYWRkcmVzcywganVzdCBza2lwIGl0IQogCSAq
LwotCWlmICghcHRlX3Rlc3QocHRxLCBQVEVfVikpCisJaWYgKCFwdGVfdGVzdChwdHEsIFBURV9W
QUxJRCkpCiAJCXJldHVybjsKIAogCSh2b2lkKXBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdHEsIHZh
LCAqcGRlKTsKQEAgLTE4MTAsNyArMTgxOCw3IEBACiAJCXZhID0gdmFfbmV4dDsKIAkJZm9yIChw
dGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCiAJ
CSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpKSB7
CisJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkgewogCQkJCWlmICh2YSAhPSB2YV9u
ZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKIAkJCQkJ
dmEgPSB2YV9uZXh0OwpAQCAtMTg2OCw3ICsxODc2LDcgQEAKIAkJICogSWYgaXQncyBsYXN0IG1h
cHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbSAKIAkJICogdGhlIHBhZ2UgYmVpbmcgZGVz
dHJveWVkCiAJIAkgKi8KLQkJaWYgKFRBSUxRX05FWFQocHYsIHB2X2xpc3QpID09IE5VTEwpCisJ
CWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSA9PSBOVUxMKQogCQkJbWlwc19kY2FjaGVfd2Jp
bnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUpOwogCiAJCXBtYXAtPnBtX3N0YXRz
LnJlc2lkZW50X2NvdW50LS07CkBAIC0xODk3LDcgKzE5MDUsNyBAQAogCQl9CiAJCXBtYXBfaW52
YWxpZGF0ZV9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CiAKLQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5w
dl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYs
IHB2X25leHQpOwogCQlwbWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSk7CiAJCWZy
ZWVfcHZfZW50cnkocG1hcCwgcHYpOwogCQlQTUFQX1VOTE9DSyhwbWFwKTsKQEAgLTE5NTksNyAr
MTk2Nyw3IEBACiAJCWZvciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9
IHZhX25leHQ7IHB0ZSsrLAogCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgewogCQkJcGJpdHMgPSAq
cHRlOwotCQkJaWYgKCFwdGVfdGVzdCgmcGJpdHMsIFBURV9WKSB8fCBwdGVfdGVzdCgmcGJpdHMs
CisJCQlpZiAoIXB0ZV90ZXN0KCZwYml0cywgUFRFX1ZBTElEKSB8fCBwdGVfdGVzdCgmcGJpdHMs
CiAJCQkgICAgUFRFX1JPKSkgewogCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBf
aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKQEAgLTIwNzEsNyArMjA3OSw3IEBACiAJ
LyoKIAkgKiBNYXBwaW5nIGhhcyBub3QgY2hhbmdlZCwgbXVzdCBiZSBwcm90ZWN0aW9uIG9yIHdp
cmluZyBjaGFuZ2UuCiAJICovCi0JaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVikgJiYgb3Bh
ID09IHBhKSB7CisJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVkFMSUQpICYmIG9wYSA9PSBw
YSkgewogCQkvKgogCQkgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0ZSBzdGF0cy4gV2UgZG9u
J3Qgd29ycnkgYWJvdXQKIAkJICogd2lyaW5nIFBUIHBhZ2VzIGFzIHRoZXkgcmVtYWluIHJlc2lk
ZW50IGFzIGxvbmcgYXMgdGhlcmUKQEAgLTIxMzUsNyArMjE0Myw3IEBACiAJCWlmIChwdiA9PSBO
VUxMKQogCQkJcHYgPSBnZXRfcHZfZW50cnkocG1hcCwgRkFMU0UpOwogCQlwdi0+cHZfdmEgPSB2
YTsKLQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJ
VEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKIAkJbmV3cHRl
IHw9IFBURV9NQU5BR0VEOwogCQlpZiAoIXB0ZV90ZXN0KCZuZXdwdGUsIFBURV9STykpCiAJCQl2
bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKQEAgLTIxNjAsNyArMjE2OCw3IEBA
CiAJICovCiAJaWYgKG9yaWdwdGUgIT0gbmV3cHRlKSB7CiAJCSpwdGUgPSBuZXdwdGU7Ci0JCWlm
IChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1YpKSB7CisJCWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwg
UFRFX1ZBTElEKSkgewogCQkJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkgJiYg
b3BhICE9IHBhKSB7CiAJCQkJaWYgKG9tLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikKIAkJ
CQkJdm1fcGFnZV9hZmxhZ19zZXQob20sIFBHQV9SRUZFUkVOQ0VEKTsKQEAgLTIyNjgsNyArMjI3
Niw3IEBACiAJfQogCiAJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOwotCWlmIChwdGVfdGVzdChw
dGUsIFBURV9WKSkgeworCWlmIChwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpIHsKIAkJaWYgKG1w
dGUgIT0gTlVMTCkgewogCQkJbXB0ZS0+d2lyZV9jb3VudC0tOwogCQkJbXB0ZSA9IE5VTEw7CkBA
IC0yMjk4LDcgKzIzMDYsNyBAQAogCS8qCiAJICogTm93IHZhbGlkYXRlIG1hcHBpbmcgd2l0aCBS
TyBwcm90ZWN0aW9uCiAJICovCi0JKnB0ZSA9IFBURV9STyB8IFRMQkxPX1BBX1RPX1BGTihwYSkg
fCBQVEVfVjsKKwkqcHRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WQUxJ
RDsKIAlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpID09IDApCiAJCSpwdGUgfD0gUFRF
X01BTkFHRUQ7CiAKQEAgLTIzNTYsNyArMjM2NCw3IEBACiAJCWNwdSA9IFBDUFVfR0VUKGNwdWlk
KTsKIAkJc3lzbSA9ICZzeXNtYXBfbG1lbVtjcHVdOwogCQkvKiBTaW5jZSB0aGlzIGlzIGZvciB0
aGUgZGVidWdnZXIsIG5vIGxvY2tzIG9yIGFueSBvdGhlciBmdW4gKi8KLQkJbnB0ZSA9IFRMQkxP
X1BBX1RPX1BGTihwYSkgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1YgfAorCQlucHRlID0g
VExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfAog
CQkgICAgUFRFX0c7CiAJCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCBzeXNtLT5iYXNlKTsK
IAkJKnB0ZSA9IG5wdGU7CkBAIC0yNDg0LDcgKzI0OTIsNyBAQAogCQkJdmFfbmV4dCA9IGV2YTsK
IAkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsg
cHRlKyssCiAJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7Ci0JCQlpZiAoIXB0ZV90ZXN0KHB0ZSwg
UFRFX1YpKQorCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJY29udGludWU7
CiAJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1cpKQogCQkJCXBhbmljKCJwbWFwX3Vud2lyZTog
cHRlICUjanggaXMgbWlzc2luZyBQR19XIiwKQEAgLTI3MTksNyArMjcyNyw3IEBACiAJICAgICgi
cG1hcF9wYWdlX2V4aXN0c19xdWljazogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKIAly
diA9IEZBTFNFOwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0go
cHYsICZtLT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1k
LnB2X2xpc3QsIHB2X25leHQpIHsKIAkJaWYgKFBWX1BNQVAocHYpID09IHBtYXApIHsKIAkJCXJ2
ID0gVFJVRTsKIAkJCWJyZWFrOwpAQCAtMjc3Miw3ICsyNzgwLDcgQEAKIAkJCQlLQVNTRVJUKHBk
ZSAhPSBOVUxMICYmICpwZGUgIT0gMCwKIAkJCQkgICAgKCJwbWFwX3JlbW92ZV9wYWdlczogcGRl
IikpOwogCQkJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHB2LT5wdl92YSk7Ci0JCQkJaWYg
KCFwdGVfdGVzdChwdGUsIFBURV9WKSkKKwkJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElE
KSkKIAkJCQkJcGFuaWMoInBtYXBfcmVtb3ZlX3BhZ2VzOiBiYWQgcHRlIik7CiAJCQkJdHB0ZSA9
ICpwdGU7CiAKQEAgLTI4MDIsNyArMjgxMCw3IEBACiAJCQkJcHZfZW50cnlfY291bnQtLTsKIAkJ
CQlwYy0+cGNfbWFwW2ZpZWxkXSB8PSBiaXRtYXNrOwogCQkJCXBtYXAtPnBtX3N0YXRzLnJlc2lk
ZW50X2NvdW50LS07Ci0JCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlz
dCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJCQkJ
aWYgKFRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSkKIAkJCQkJdm1fcGFnZV9hZmxhZ19jbGVh
cihtLCBQR0FfV1JJVEVBQkxFKTsKIAkJCQlwbWFwX3VudXNlX3B0KHBtYXAsIHB2LT5wdl92YSwg
KnBkZSk7CkBAIC0yODMzLDcgKzI4NDEsNyBAQAogCQlyZXR1cm4gKHJ2KTsKIAogCXJ3X2Fzc2Vy
dCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9XTE9DS0VEKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+
bWQucHZfbGlzdCwgcHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0
LCBwdl9uZXh0KSB7CiAJCXBtYXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwog
CQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOwpAQCAtMjg2Myw3ICsyODcxLDcgQEAK
IAlpZiAoKG0tPm9mbGFncyAmIFZQT19VTk1BTkFHRUQpICE9IDApCiAJCXJldHVybiAoY291bnQp
OwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5t
ZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3Qs
IHB2X25leHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0socG1hcCk7CiAJ
CXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CkBAIC0yODk3LDExICsyOTA1LDExIEBA
CiAJaWYgKCF2bV9wYWdlX3hidXNpZWQobSkgJiYgKG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUp
ID09IDApCiAJCXJldHVybjsKIAlyd193bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9G
T1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYs
ICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBtYXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1B
UF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOwotCQlLQVNT
RVJUKHB0ZSAhPSBOVUxMICYmIHB0ZV90ZXN0KHB0ZSwgUFRFX1YpLAorCQlLQVNTRVJUKHB0ZSAh
PSBOVUxMICYmIHB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSwKIAkJICAgICgicGFnZSBvbiBwdl9s
aXN0IGhhcyBubyBwdGUiKSk7CiAJCXBiaXRzID0gKnB0ZTsKIAkJaWYgKHB0ZV90ZXN0KCZwYml0
cywgUFRFX0QpKSB7CkBAIC0zMDQwLDcgKzMwNDgsNyBAQAogCQl2YSA9IHZhX25leHQ7CiAJCWZv
ciAocHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgc3ZhKTsgc3ZhICE9IHZhX25leHQ7IHB0ZSsr
LAogCQkgICAgc3ZhICs9IFBBR0VfU0laRSkgewotCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9N
QU5BR0VEIHwgUFRFX1YpKSB7CisJCQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQgfCBQ
VEVfVkFMSUQpKSB7CiAJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKIAkJCQkJcG1hcF9pbnZhbGlk
YXRlX3JhbmdlKHBtYXAsIHZhLCBzdmEpOwogCQkJCQl2YSA9IHZhX25leHQ7CkBAIC0zMTA2LDcg
KzMxMTQsNyBAQAogCWlmICgobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKIAkJcmV0
dXJuOwogCXJ3X3dsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOwotCVRBSUxRX0ZPUkVBQ0gocHYsICZt
LT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xp
c3QsIHB2X25leHQpIHsKIAkJcG1hcCA9IFBWX1BNQVAocHYpOwogCQlQTUFQX0xPQ0socG1hcCk7
CiAJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHB2LT5wdl92YSk7CkBAIC0zMjA4LDcgKzMyMTYsNyBA
QAogcmV0cnk6CiAJcHRlcCA9IHBtYXBfcHRlKHBtYXAsIGFkZHIpOwogCXB0ZSA9IChwdGVwICE9
IE5VTEwpID8gKnB0ZXAgOiAwOwotCWlmICghcHRlX3Rlc3QoJnB0ZSwgUFRFX1YpKSB7CisJaWYg
KCFwdGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpKSB7CiAJCXZhbCA9IDA7CiAJCWdvdG8gb3V0Owog
CX0KQEAgLTMzNDUsNyArMzM1Myw3IEBACiAjZW5kaWYKIAkJCWZvciAoayA9IDA7IGsgPCBOUFRF
UEc7IGsrKykgewogCQkJCXB0ZSA9IHBkZVtrXTsKLQkJCQlpZiAocHRlID09IDAgfHwgIXB0ZV90
ZXN0KCZwdGUsIFBURV9WKSkKKwkJCQlpZiAocHRlID09IDAgfHwgIXB0ZV90ZXN0KCZwdGUsIFBU
RV9WQUxJRCkpCiAJCQkJCWNvbnRpbnVlOwogCQkJCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7
CiAJCQkJdmEgPSAoKHVfbG9uZylpIDw8IFNFR1NISUZUKSB8IChqIDw8IFBEUlNISUZUKSB8IChr
IDw8IFBBR0VfU0hJRlQpOwpAQCAtMzM5MywxNSArMzQwMSwxNSBAQAogCXB0X2VudHJ5X3Qgcnc7
CiAKIAlpZiAoIShwcm90ICYgVk1fUFJPVF9XUklURSkpCi0JCXJ3ID0gUFRFX1YgfCBQVEVfUk87
CisJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX1JPOwogCWVsc2UgaWYgKChtLT5vZmxhZ3MgJiBWUE9f
VU5NQU5BR0VEKSA9PSAwKSB7CiAJCWlmICgoYWNjZXNzICYgVk1fUFJPVF9XUklURSkgIT0gMCkK
LQkJCXJ3ID0gUFRFX1YgfCBQVEVfRDsKKwkJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX0Q7CiAJCWVs
c2UKLQkJCXJ3ID0gUFRFX1Y7CisJCQlydyA9IFBURV9WQUxJRDsKIAl9IGVsc2UKIAkJLyogTmVl
ZG4ndCBlbXVsYXRlIGEgbW9kaWZpZWQgYml0IGZvciB1bm1hbmFnZWQgcGFnZXMuICovCi0JCXJ3
ID0gUFRFX1YgfCBQVEVfRDsKKwkJcncgPSBQVEVfVkFMSUQgfCBQVEVfRDsKIAlyZXR1cm4gKHJ3
KTsKIH0KIApAQCAtMzQyNCwxMyArMzQzMiwxMyBAQAogCQlwYW5pYygicG1hcF9lbXVsYXRlX21v
ZGlmaWVkOiBjYW4ndCBmaW5kIFBURSIpOwogI2lmZGVmIFNNUAogCS8qIEl0IGlzIHBvc3NpYmxl
IHRoYXQgc29tZSBvdGhlciBDUFUgY2hhbmdlZCBtLWJpdCAqLwotCWlmICghcHRlX3Rlc3QocHRl
LCBQVEVfVikgfHwgcHRlX3Rlc3QocHRlLCBQVEVfRCkpIHsKKwlpZiAoIXB0ZV90ZXN0KHB0ZSwg
UFRFX1ZBTElEKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkgewogCQl0bGJfdXBkYXRlKHBtYXAs
IHZhLCAqcHRlKTsKIAkJUE1BUF9VTkxPQ0socG1hcCk7CiAJCXJldHVybiAoMCk7CiAJfQogI2Vs
c2UKLQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKQor
CWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpIHx8IHB0ZV90ZXN0KHB0ZSwgUFRFX0QpKQog
CQlwYW5pYygicG1hcF9lbXVsYXRlX21vZGlmaWVkOiBpbnZhbGlkIHB0ZSIpOwogI2VuZGlmCiAJ
aWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1JPKSkgewpAQCAtMzQ0Niw2ICszNDU0LDE4IEBACiB9CiAK
IC8qCisgKiBwbWFwX2VtdWxhdGVfcmVmZXJlbmNlZAorICoKKyAqIFJlZmVyZW5jZSBiaXQgZW11
bGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbWFwIGltcGxlbWVudGF0aW9uLgorICov
CitpbnQKK3BtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2
YSkKK3sKKworCQlyZXR1cm4gKDEpOworfQorCisvKgogICoJUm91dGluZToJcG1hcF9rZXh0cmFj
dAogICoJRnVuY3Rpb246CiAgKgkJRXh0cmFjdCB0aGUgcGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFz
c29jaWF0ZWQKQEAgLTM1MjIsMTcgKzM1NDIsMjYgQEAKIAogCWlmIChtICE9IE5VTEwpIHsKIAkJ
Zm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7Ci0JCSAgICBwdiA9IFRB
SUxRX05FWFQocHYsIHB2X2xpc3QpKSB7CisJCSAgICBwdiA9IFRBSUxRX05FWFQocHYsIHB2X25l
eHQpKSB7CiAJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChwdi0+cHZfdmEsIFBBR0Vf
U0laRSk7CiAJCX0KIAl9CiB9CiAKKy8qCisgKiBTZXRzIHRoZSBtZW1vcnkgYXR0cmlidXRlIGZv
ciB0aGUgc3BlY2lmaWVkIHBhZ2UuCisgKi8KIHZvaWQKIHBtYXBfcGFnZV9zZXRfbWVtYXR0cih2
bV9wYWdlX3QgbSwgdm1fbWVtYXR0cl90IG1hKQogewogCiAJLyoKKwkgKiBTZXQgdGhlIG1lbWF0
dHIgZmllbGQgc28gdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlIHNldCBpbiB0aGUKKwkgKiBQVEUg
YXMgbWFwcGluZ3MgYXJlIGNyZWF0ZWQuCisJICovCisJbS0+bWQucHZfbWVtYXR0ciA9IG1hOwor
CisJLyoKIAkgKiBJdCBhcHBlYXJzIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxs
ZWQgYmVmb3JlIGFueSBtYXBwaW5ncwogCSAqIGZvciB0aGUgcGFnZSBhcmUgZXN0YWJsaXNoZWQu
ICBJZiB0aGlzIGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwKIAkgKiBuZWVkIHRvIHdhbGsg
dGhlIHB2X2xpc3QgYW5kIG1ha2UgZWFjaCBvZiB0aGUgZXhpc3RpbmcgbWFwcGluZ3MKZGlmZiAt
LWdpdCBhL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jIGIvc3lzL21pcHMvbWlwcy9t
aW5pZHVtcF9tYWNoZGVwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy9taW5pZHVtcF9tYWNoZGVwLmMK
KysrIGIvc3lzL21pcHMvbWlwcy9taW5pZHVtcF9tYWNoZGVwLmMKQEAgLTE3OSw3ICsxNzksNyBA
QAogCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOwogCQlLQVNTRVJUKHB0ZSAhPSBO
VUxMLCAoInB0ZSBmb3IgJWp4IGlzIE5VTEwiLCAodWludG1heF90KXZhKSk7CiAJCWZvciAoaSA9
IDA7IGkgPCBOUFRFUEc7IGkrKykgewotCQkJaWYgKHB0ZV90ZXN0KCZwdGVbaV0sIFBURV9WKSkg
eworCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRlW2ldKSkgewogCQkJCXBhID0gVExCTE9fUFRFX1RP
X1BBKHB0ZVtpXSk7CiAJCQkJaWYgKGlzX2R1bXBhYmxlKHBhKSkKIAkJCQkJZHVtcF9hZGRfcGFn
ZShwYSk7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL21hY2hkZXAuYyBiL3N5cy9taXBzL21p
cHMvbWFjaGRlcC5jCi0tLSBhL3N5cy9taXBzL21pcHMvbWFjaGRlcC5jCisrKyBiL3N5cy9taXBz
L21pcHMvbWFjaGRlcC5jCkBAIC0yODMsOSArMjgzLDkgQEAKICNlbmRpZgogCXByb2NfbGlua3Vw
MCgmcHJvYzAsICZ0aHJlYWQwKTsKIAotCUtBU1NFUlQoKGtzdGFjazAgJiBQQUdFX01BU0spID09
IDAsCi0JCSgia3N0YWNrMCBpcyBub3QgYWxpZ25lZCBvbiBhIHBhZ2UgYm91bmRhcnk6IDB4JTBs
eCIsCi0JCShsb25nKWtzdGFjazApKTsKKwlLQVNTRVJUKChrc3RhY2swICYgKChLU1RBQ0tfUEFH
RV9TSVpFICogMikgLSAxKSkgPT0gMCwKKwkJKCJrc3RhY2swIGlzIG5vdCBhbGlnbmVkIG9uIGEg
cGFnZSAoMHglMGx4KSBib3VuZGFyeTogMHglMGx4IiwKKwkJKGxvbmcpKEtTVEFDS19QQUdFX1NJ
WkUgKiAyKSwgKGxvbmcpa3N0YWNrMCkpOwogCXRocmVhZDAudGRfa3N0YWNrID0ga3N0YWNrMDsK
IAl0aHJlYWQwLnRkX2tzdGFja19wYWdlcyA9IEtTVEFDS19QQUdFUzsKIAkvKiAKQEAgLTQ1OSw3
ICs0NTksNyBAQAogCSAqIFdlIHVzZSBhIHdpcmVkIHRsYiBpbmRleCB0byBkbyB0aGlzIG9uZS10
aW1lIG1hcHBpbmcuCiAJICovCiAJcGEgPSB2dG9waHlzKHBjcHUpOwotCXB0ZSA9IFBURV9EIHwg
UFRFX1YgfCBQVEVfRyB8IFBURV9DX0NBQ0hFOworCXB0ZSA9IFBURV9EIHwgUFRFX1ZBTElEIHwg
UFRFX1JFRiB8IFBURV9HIHwgUFRFX0NfQ0FDSEU7CiAJdGxiX2luc2VydF93aXJlZChQQ1BVX1RM
Ql9FTlRSWSwgKHZtX29mZnNldF90KXBjcHVwLAogCQkJIFRMQkxPX1BBX1RPX1BGTihwYSkgfCBw
dGUsCiAJCQkgVExCTE9fUEFfVE9fUEZOKHBhICsgUEFHRV9TSVpFKSB8IHB0ZSk7CmRpZmYgLS1n
aXQgYS9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMgYi9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMK
LS0tIGEvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCisrKyBiL3N5cy9taXBzL21pcHMvZ2VuYXNz
eW0uYwpAQCAtMTAyLDYgKzEwMiw5IEBACiBBU1NZTShUREZfQVNUUEVORElORywgVERGX0FTVFBF
TkRJTkcpOwogQVNTWU0oTUFYQ09NTEVOLCBNQVhDT01MRU4pOwogQVNTWU0oTURURF9DT1AyVVNF
RCwgTURURF9DT1AyVVNFRCk7CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKK0FTU1lNKEtTVEFD
S19UTEJNQVNLX01BU0ssIEtTVEFDS19UTEJNQVNLX01BU0spOworI2VuZGlmCiAKIEFTU1lNKE1J
UFNfS1NFRzBfU1RBUlQsIE1JUFNfS1NFRzBfU1RBUlQpOwogQVNTWU0oTUlQU19LU0VHMV9TVEFS
VCwgTUlQU19LU0VHMV9TVEFSVCk7CmRpZmYgLS1naXQgYS9zeXMvbWlwcy9taXBzL2V4Y2VwdGlv
bi5TIGIvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUwotLS0gYS9zeXMvbWlwcy9taXBzL2V4Y2Vw
dGlvbi5TCisrKyBiL3N5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMKQEAgLTg1LDYgKzg1LDI4IEBA
CiAgKi8KICNkZWZpbmUJSU5UUkNOVF9DT1VOVAkyNTYKIAorLyoKKyAqIEdlbmVyYWwgTUlQUyBD
UFUgc3RhdGUgZm9yIGV4Y2VwdGlvbnM6CisgKgorICogRVBDIFJlZ2lzdGVyIHdpbGwgcG9pbnQg
dG8gdGhlIGluc3RydWN0aW9uIHRoYXQgY2F1c2VkIGZhdWx0LCB1bmxlc3MgdGhlCisgKiBmYXVs
dGluZyBpbnN0cnVjdGlvbiB3YXMgaW4gYSBicmFuY2ggZGVsYXkgc2xvdC4gIEluIHRoYXQgY2Fz
ZSwgaXQgd2lsbAorICogcG9pbnQgdG8gdGhlIGJyYW5jaCBiZWZvcmUgdGhlIGJyYW5jaCBkZWxh
eSBzbG90IGluc3RydWN0aW9uLgorICoKKyAqIFRoZSBjYXVzZSByZWdpc3RlciB3aWxsIGNvbnRh
aW4gd2hhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiBhbmQgc29tZSBzdGF0ZQorICogYWJvdXQgdGhl
IGludGVycnVwdC4KKyAqCisgKiBUaGUgc3RhdHVzIHJlZ2lzdGVyIGNvbnRhaW5zIGluZm9ybWF0
aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIENQVSBzdWNoCisgKiBhczogS2VybmVsL1VzZXIg
bW9kZSBiaXQsIGludGVycnVwdCBlbmFibGUgYml0LgorICoKKyAqIFRoZSBCYWRWYWRkciByZWdp
c3RlciBjb250YWlucyB0aGUgdmlydHVhbCBhZGRyZXNzIHRoYXQgY2F1c2UgdGhlIGxhc3QKKyAq
IGV4Y2VwdGlvbi4KKyAqCisgKiBUaGUgQ29udGV4dCByZWdpc3RlciBjb250YWlucyB0aGUgbG93
ZXIgMjIgYml0cyBvZiB0aGUgVlBOIChzdGFydGluZyBhdAorICogYml0IDQpIHRoYXQgY2F1c2Ug
dGhlIGxhc3QgZXhjZXB0aW9uIGV4Y2VwdCBiaXQwIGFuZCBiaXQxIGFyZSB6ZXJvLiBUaGUKKyAq
IHVwcGVyIGJpdHMgKGJpdHMgMjMgdG8gMzEgZm9yIE1JUFMzMiBhbmQgYml0cyAyMyB0byA2Mykg
YXJlIHNldCB1bmRlcgorICoga2VybmVsIGNvbnRyb2wgKGkuZS4gcG9pbnQgdG8gdGhlIHBhZ2Ug
dGFibGUpLiBUaGUgQ29udGV4dC9YQ29udGV4dAorICogcmVnaXN0ZXJzIGFyZSBub3QgY3VycmVu
dGx5IHVzZWQgYnkgRnJlZUJTRC4KKyAqLwogCiAvKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBA
IC0xMTAsMTMgKzEzMiwyNyBAQAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICoKLSAqIE1p
cHNEb1RMQk1pc3MgLS0KKyAqIE1pcHNEb1RMQk1pc3MgLS0gIChVVExCIG1pc3MpCiAgKgotICog
VGhpcyBpcyB0aGUgcmVhbCBUTEIgTWlzcyBIYW5kbGVyIGNvZGUuCisgKiBUaGlzIGlzIHRoZSBy
ZWFsIFRMQiBNaXNzIEhhbmRsZXIgY29kZS4gIEEgbWlzcyB3YXMgZ2VuZXJhdGVkIHdoZW4gdGhl
CisgKiBhY2Nlc3MgaXMgdG8ga3VzZWcgYW5kIHRoZXJlIHdhcyBub3QgbWF0Y2hpbmcgbWFwcGlu
ZyBsb2FkZWQgaW50byB0aGUgVExCLgogICogJ3NlZ2Jhc2UnIHBvaW50cyB0byB0aGUgYmFzZSBv
ZiB0aGUgc2VnbWVudCB0YWJsZSBmb3IgdXNlciBwcm9jZXNzZXMuCiAgKgorICogVGhlIENQVSBk
b2VzIHRoZSBmb2xsb3dpbmcgZm9yIGFuIFVUTEIgbWlzczoKKyAqIC0gU2V0cyB0aGUgRVBDIHJl
Z2lzdGVyLgorICogLSBTZXRzIHRoZSBDYXVzZSByZWdpc3Rlci4KKyAqIC0gU2V0cyB0aGUgU3Rh
dHVzIHJlZ2lzdGVyLiBTaGlmdHMgSy9VIGFuZCBJRSBiaXRzIG92ZXIgb25lIGFuZCBjbGVhcnMK
KyAqICAgdGhlIGN1cnJlbnQgS2VybmVsL1VzZXIgYW5kIEludGVycnVwdCBFbmFibGUgYml0cy4g
U28gdGhlIHByb2Nlc3NvcgorICogICBpcyBpbiBrZXJuZWwgbW9kZSB3aXRoIHRoZSBpbnRlcnVw
dHMgdHVybmVkIG9mZi4KKyAqIC0gU2V0cyBCYWRWYWRkciByZWdpc3Rlci4KKyAqIC0gU2V0cyB0
aGUgQ29udGV4dC9YQ29udGV4dCByZWdpc3RlcihzKS4KKyAqIC0gU2V0cyB0aGUgVExCIEVudHJ5
SGkgcmVnaXN0ZXIgdG8gY29udGFpbiBWUE4gb2YgdGhlIGZhdWx0aW5nIGFkZHJlc3MuCisgKgog
ICogRG9uJ3QgY2hlY2sgZm9yIGludmFsaWQgcHRlJ3MgaGVyZS4gV2UgbG9hZCB0aGVtIGFzIHdl
bGwgYW5kCiAgKiBsZXQgdGhlIHByb2Nlc3NvciB0cmFwIHRvIGxvYWQgdGhlIGNvcnJlY3QgdmFs
dWUgYWZ0ZXIgc2VydmljZS4KKyAqCisgKiBYWFggVGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgY2hh
bmdlZCB0byBhIGxpbmVhciBwYWdlIHRhYmxlIGFuZCB1c2UgdGhlCisgKiBDb250ZXh0IGFuZCBY
Q29udGV4dCByZWdpc3RlcnMuICBUaGF0IGlzIHJlYWxseSB3aGF0IGl0IHdhcyBkZXNpZ25lZCBm
b3IuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogIAkuc2V0IHB1c2gKQEAgLTEzNywyNSAr
MTczLDg5IEBACiAjaWZkZWYgX19taXBzX242NAogCVBUUl9TUkwJCWswLCBQRFJTSElGVCAtIFBU
UlNISUZUCQkjIGswPVZQTgogCWFuZGkJCWswLCBrMCwgUERFUFRSTUFTSwkJIyBrMD1wZGUgb2Zm
c2V0Ci0JUFRSX0FERFUJazEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKLQlQVFJf
TAkJazEsIDAoazEpCQkJIyBrMT1wZGUgZW50cnkKLQlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURf
VkFERFIJIyBrMD1iYWQgYWRkcmVzcyAoYWdhaW4pCisJUFRSX0FERFUJazAsIGswLCBrMQkJCSMg
azE9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkK
IAliZXEJCWsxLCB6ZXJvLCAyZgkJCSMgPT0wIC0tIG5vIHBhZ2UgdGFibGUKKwlub3AKKworI2lm
ZGVmIE1JUFM2NF9ORVdfUE1BUAorCSMgQ2hlY2sgZm9yIHN1cGVycGFnZQorCUdFVF9TVVBFUlBB
R0VfSURYKGsxKQkJCQkjIGsxPXN1cGVycGFnZSBpbmRleCBmcm9tIFBURQorCWJlcQkJazEsIHpl
cm8sIG5vdF9zdXBlcnBhZ2UJCSMgPT0wIC0tIG5vdCBzdXBlcnBhZ2UKKwlQVFJfTAkJazEsIDAo
azApCQkJIyBrMT1wZGUgZW50cnkgKGRlbGF5IHNsb3QpCisKKwkjIFNldCB0aGUgcmVmZXJlbmNl
ZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGluZyB0aGUgcmVmZXJl
bmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMgbWF5IG5vdCBiZSBz
YWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQgdG8gc2V0CisJIyB0
aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMSwgazAsIDAsIDEpCisK
KwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhl
IFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9TV0JJVFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNf
Q09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUg
dGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVnaXN0ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8w
KS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4oazEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBw
b3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBmbGFnIGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJ
CSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlHRVRfSFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3
IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsxLCBrMAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJp
dHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExCIExvMSByZWdpc3Rlci4KKwkjQ0xFQVJfUFRFX1NX
QklUUyhrMSkJCQkJIyBObyBTVyBiaXRzIHRvIGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09Q
XzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRM
QiBQYWdlTWFzayBmb3IgMU0gcGFnZXMuCisJZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBh
Z2VNYXNrIGZvciAxTSBQYWdlCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJ
IyBQYWdlTWFzayBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCXRsYndyCQkJCQkJIyB3cml0ZSB0
byB0bGIKKwlIQVpBUkRfREVMQVkKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19N
QVNLCSMgemVybyBvdXQgUGFnZU1hc2sgcmVnCisJQ09QMF9TWU5DCisJZXJldAkJCQkJCSMgcmV0
dXJuIGZyb20gZXhjZXB0aW9uCisKK25vdF9zdXBlcnBhZ2U6CisjZW5kaWYgLyogTUlQUzY0X05F
V19QTUFQICovCiAjZW5kaWYKKwlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1i
YWQgYWRkcmVzcyAoYWdhaW4pCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkj
MGI6IGswPVZQTiAoYWthIHZhPj4xMCkKIAlhbmRpCQlrMCwgazAsIFBURTJNQVNLCQkjMGM6IGsw
PXBhZ2UgdGFiIG9mZnNldAogCVBUUl9BRERVCWsxLCBrMSwgazAJCQkjMGQ6IGsxPXB0ZSBhZGRy
ZXNzCi0JUFRFX0wJCWswLCAwKGsxKQkJCSMwZTogazA9bG8wIHB0ZQotCVBURV9MCQlrMSwgUFRF
U0laRShrMSkJCQkjMGY6IGsxPWxvMCBwdGUKKworCVBURV9MCQlrMCwgMChrMSkJCQkjIGswPWxv
MCBwdGUKKworCSMgU2V0IHRoZSByZWZlcmVuY2VkIGJpdCBpbiB0aGUgUERFIGlmIHZhbGlkLgor
CSMKKwkjIFhYWCBTZXR0aW5nIHRoZSByZWZlcmVuY2VkIGJpdCBoZXJlIHNhdmVzIGEgZmF1bHQg
bGF0ZXIgYnV0IGl0CisJIyBtYXkgbm90IGJlIHNhZmUgdG8gZG8gc28uIFRoZXJlZm9yZSwganVz
dCB0YWtlIHRoZSBmYXVsdCB0byBzZXQKKwkjIHRoZSByZWZlcmVuY2UgYml0LgorIwlJRl9WQUxJ
RF9TRVRfUkVGQklUKGswLCBrMSwgMCwgMikKKwogCUNMRUFSX1BURV9TV0JJVFMoazApCiAJUFRF
X01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAkJIzEyOiBsbzAgaXMgbG9hZGVkCiAJQ09QMF9T
WU5DCi0JQ0xFQVJfUFRFX1NXQklUUyhrMSkKLQlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJf
TE8xCQkjMTU6IGxvMSBpcyBsb2FkZWQKKworCVBURV9MCQlrMCwgUFRFU0laRShrMSkJCQkjIGsw
PWxvMSBwdGUKKworCSMgU2V0IHRoZSByZWZlcmVuY2VkIGJpdCBpbiB0aGUgUERFIGlmIHZhbGlk
LgorCSMKKwkjIFhYWCBTZXR0aW5nIHRoZSByZWZlcmVuY2VkIGJpdCBoZXJlIHNhdmVzIGEgZmF1
bHQgbGF0ZXIgYnV0IGl0CisJIyBtYXkgbm90IGJlIHNhZmUgdG8gZG8gc28uIFRoZXJlZm9yZSwg
anVzdCB0YWtlIHRoZSBmYXVsdCB0byBzZXQKKwkjIHRoZSByZWZlcmVuY2UgYml0LgorIwlJRl9W
QUxJRF9TRVRfUkVGQklUKGswLCBrMSwgMCwgMykKKworCUNMRUFSX1BURV9TV0JJVFMoazApCisJ
UFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMQkJIzE1OiBsbzEgaXMgbG9hZGVkCiAJQ09Q
MF9TWU5DCiAJdGxid3IJCQkJCQkjMWE6IHdyaXRlIHRvIHRsYgogCUhBWkFSRF9ERUxBWQogCWVy
ZXQJCQkJCQkjMWY6IHJldFVybiBmcm9tIGV4Y2VwdGlvbgorCiAxOglqCQlNaXBzVExCTWlzc0V4
Y2VwdGlvbgkJIzIwOiBrZXJuZWwgZXhjZXB0aW9uCiAJbm9wCQkJCQkJIzIxOiBicmFuY2ggZGVs
YXkgc2xvdAogMjoJagkJU2xvd0ZhdWx0CQkJIzIyOiBubyBwYWdlIHRhYmxlIHByZXNlbnQKQEAg
LTI2NSw3ICszNjUsNyBAQAogI2VuZGlmCiAKIC8qCi0gKiBTYXZlIENQVSBhbmQgQ1AwIHJlZ2lz
dGVyIHN0YXRlLgorICogU2F2ZSBDUFUgYW5kIENQMCByZWdpc3RlciBzdGF0ZSB3aGVuIHRha2lu
ZyBhbiBleGNlcHRpb24gaW4ga2VybmVsIG1vZGUuCiAgKgogICogVGhpcyBpcyBzdHJhaWdodGZv
cndhcmQgZXhjZXB0IGZvciBzYXZpbmcgdGhlIGV4Y2VwdGlvbiBwcm9ncmFtCiAgKiBjb3VudGVy
LiBUaGUgZGRiIGJhY2t0cmFjZSBjb2RlIGxvb2tzIGZvciB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24K
QEAgLTQwNiw2ICs1MDYsNyBAQAogCVNBVkVfUkVHKGExLCBTUiwgc3ApCiAJUkVTVE9SRV9DUFUJ
CQkjIHYwIGNvbnRhaW5zIHRoZSByZXR1cm4gYWRkcmVzcy4KIAlzeW5jCisKIAllcmV0CiAJLnNl
dAlhdAogRU5EKE1pcHNLZXJuR2VuRXhjZXB0aW9uKQpAQCAtODg0LDIxICs5ODUsNjAgQEAKIAlQ
VFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1wZGUgb2Zmc2V0IChhbG1vc3Qp
CiAJYmVxCQlrMSwgemVybywgTWlwc0tlcm5HZW5FeGNlcHRpb24JIyA9PTAgLS0gbm8gcGRlIHRh
YgogCWFuZGkJCWswLCBrMCwgUERFUFRSTUFTSwkJIyBrMD1wZGUgb2Zmc2V0Ci0JUFRSX0FERFUJ
azEsIGswLCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKLQlQVFJfTAkJazEsIDAoazEpCQkJ
IyBrMT1wZGUgZW50cnkKKwlQVFJfQUREVQlrMCwgazAsIGsxCQkJIyBrMD1wZGUgZW50cnkgYWRk
cmVzcworCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeQogCiAJLyogVmFsaWRhdGUg
cGRlIHRhYmxlIHBvaW50ZXIuICAqLwogCWJlcXoJCWsxLCAzZgogCW5vcAorCisjaWZkZWYgTUlQ
UzY0X05FV19QTUFQCisJIyBDaGVjayBmb3Igc3VwZXJwYWdlCisJR0VUX1NVUEVSUEFHRV9JRFgo
azEpCQkJCSMgazE9c3VwZXJwYWdlIGluZGV4IGZyb20gUFRFCisJYmVxCQlrMSwgemVybywgbm90
X3NwZwkJIyA9PTAgLS0gbm90IHN1cGVycGFnZQorCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBk
ZSBlbnRyeSAoZGVsYXkgc2xvdCkKKworCS8qIFZhbGlkYXRlIHBhZ2UgdGFibGUgZW50cnkuICAq
LworCWFuZGkJCWsxLCBQVEVfVlIKKwliZXF6CQlrMSwgM2YKKwlub3AKKworCSMgVGhlIFBERSBp
cyBhY3R1YWxseSBhIHN1cGVycGFnZSBQVEUuICBTdG9yZSBpdCBpbiB0aGUgVExCIGxvMCByZWcu
CisJQ0xFQVJfUFRFX1NXQklUUyhrMSkKKwlQVEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8w
CQkjIGxvMCBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgQ29tcHV0ZSB0aGUgUEZOIGZvciB0
aGUgVExCIGxvMSByZWdpc3RlciBmcm9tIGsxKD1QVEUgZm9yIFRMQiBsbzApLgorCUdFVF9PRERf
MU1fUEZOX0ZST01fRVZFTihrMSkJCQkjIGsxPU9kZCBQRk4gaW4gUFRFIHBvc3Rpb24KKworCSMg
R2V0IGhhcmQgVExCIGZsYWcgYml0cy4KKwlQVFJfTAkJazAsIDAoazApCQkJIyBrMD1wZGUgZW50
cnkgKGFnYWluKQorCUdFVF9IV19UTEJfRkxBR1MoazApCQkJCSMgazA9aHcgVExCIGZsYWcgYml0
cworCW9yCQlrMSwgazEsIGswCQkJIyBrMT1QVEU9UEZOIHwgaHdmbGcgYml0cworCSMgTG9hZCBp
dCBpbnRvIHRoZSBUTEIgTG8xIHJlZ2lzdGVyLgorCSMgQ0xFQVJfUFRFX1NXQklUUyhrMSkJCQkJ
IyBObyBTVyBiaXRzIHRvIGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJ
IyBsbzEgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRMQiBQYWdlTWFzayBm
b3IgMU0gcGFnZXMuCisJZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBhZ2VNYXNrIGZvciAx
TSBQYWdlCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyBQYWdlTWFzayBp
cyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCWIJCXRsYl9pbnNlcnRfZW50cnkKKwlub3AKKworbm90
X3NwZzoKKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KICNlbmRpZgogCU1GQzAJCWswLCBN
SVBTX0NPUF8wX0JBRF9WQUREUgkjIGswPWJhZCBhZGRyZXNzIChhZ2FpbikKIAlQVFJfU1JMCQlr
MCwgUEFHRV9TSElGVCAtIFBURVNISUZUCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQVEVNQVNL
CQkJIyBrMD1wYWdlIHRhYiBvZmZzZXQKIAlQVFJfQUREVQlrMSwgazEsIGswCQkJIyBrMT1wdGUg
YWRkcmVzcwogCVBURV9MCQlrMCwgMChrMSkJCQkjIGswPXRoaXMgUFRFCiAKIAkvKiBWYWxpZGF0
ZSBwYWdlIHRhYmxlIGVudHJ5LiAgKi8KLQlhbmRpCQlrMCwgUFRFX1YKKwlhbmRpCQlrMCwgUFRF
X1ZSCiAJYmVxegkJazAsIDNmCiAJbm9wCiAKQEAgLTkwOCwyNSArMTA0OCwzMSBAQAogCW5vcAog
CiAJUFRFX0wJCWswLCAwKGsxKQotCVBURV9MCQlrMSwgUFRFU0laRShrMSkKKwogCUNMRUFSX1BU
RV9TV0JJVFMoazApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xPMAogCUNPUDBfU1lO
QwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xP
MQorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQ
VEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCiAJQ09QMF9TWU5DCiAKIAliCQl0bGJfaW5z
ZXJ0X2VudHJ5CiAJbm9wCiAKIG9kZF9wYWdlOgogCVBURV9MCQlrMCwgLVBURVNJWkUoazEpCi0J
UFRFX0wJCWsxLCAwKGsxKQorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVfTVRDMAlrMCwg
TUlQU19DT1BfMF9UTEJfTE8wCiAJQ09QMF9TWU5DCi0JQ0xFQVJfUFRFX1NXQklUUyhrMSkKLQlQ
VEVfTVRDMAlrMSwgTUlQU19DT1BfMF9UTEJfTE8xCisKKwlQVEVfTAkJazAsIDAoazEpCisKKwlD
TEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzEKIAlD
T1AwX1NZTkMKIAogdGxiX2luc2VydF9lbnRyeToKQEAgLTkzNiwxMSArMTA4MiwxNSBAQAogCWJs
dHoJCWswLCB0bGJfaW5zZXJ0X3JhbmRvbQogCW5vcAogCXRsYndpCisJUFRFX01UQzAJemVybywg
TUlQU19DT1BfMF9UTEJfUEdfTUFTSworCUNPUDBfU1lOQwogCWVyZXQKIAlzc25vcAogCiB0bGJf
aW5zZXJ0X3JhbmRvbToKIAl0bGJ3cgorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BH
X01BU0sKKwlDT1AwX1NZTkMKIAllcmV0CiAJc3Nub3AKIApAQCAtMTA1NCwyMSArMTIwNCw2NyBA
QAogI2lmZGVmIF9fbWlwc19uNjQKIAlQVFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJ
IyBrMD1WUE4KIAlhbmRpCQlrMCwgazAsIFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBU
Ul9BRERVCWsxLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAw
KGsxKQkJCSMgazE9cGRlIGVudHJ5CisJUFRSX0FERFUJazAsIGswLCBrMQkJCSMgazE9cGRlIGVu
dHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkKKworI2lmZGVm
IE1JUFM2NF9ORVdfUE1BUAorCSMgQ2hlY2sgZm9yIHN1cGVycGFnZQorCUdFVF9TVVBFUlBBR0Vf
SURYKGsxKQkJCQkjIGsxPXN1cGVycGFnZSBpbmRleCBmcm9tIFBURQorCWJlcQkJazEsIHplcm8s
IG5vdF9rc3BnCQkjID09MCAtLSBub3Qgc3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMg
azE9cGRlIGVudHJ5IChkZWxheSBzbG90KQorCisJIyBYWFggUmVmZXJlbmNlIGJpdCBlbXVsYXRp
b24KKworCSMgVGhlIFBERSBpcyBhY3R1YWxseSBhIHN1cGVycGFnZSBQVEUuICBTdG9yZSBpdCBp
biB0aGUgVExCIGxvMCByZWcuCisJQ0xFQVJfUFRFX1NXQklUUyhrMSkKKwlQVEVfTVRDMAlrMSwg
TUlQU19DT1BfMF9UTEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgQ29t
cHV0ZSB0aGUgUEZOIGZvciB0aGUgVExCIGxvMSByZWdpc3RlciBmcm9tIGsxKD1QVEUgZm9yIFRM
QiBsbzApLgorCUdFVF9PRERfMU1fUEZOX0ZST01fRVZFTihrMSkJCQkjIGsxPU9kZCBQRk4gaW4g
UFRFIHBvc3Rpb24KKworCSMgR2V0IGhhcmQgVExCIGZsYWcgYml0cy4KKwlQVFJfTAkJazAsIDAo
azApCQkJIyBrMD1wZGUgZW50cnkgKGFnYWluKQorCUdFVF9IV19UTEJfRkxBR1MoazApCQkJCSMg
azA9aHcgVExCIGZsYWcgYml0cworCW9yCQlrMSwgazEsIGswCQkJIyBrMT1QVEU9UEZOIHwgaHdm
bGcgYml0cworCSMgTG9hZCBpdCBpbnRvIHRoZSBUTEIgTG8xIHJlZ2lzdGVyLgorCSNDTEVBUl9Q
VEVfU1dCSVRTKGsxKQkJCQkjIE5vIFNXIEJpdHMgdG8gY2xlYXIKKwlQVEVfTVRDMAlrMSwgTUlQ
U19DT1BfMF9UTEJfTE8xCQkjIGxvMSBpcyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCSMgTG9hZCB0
aGUgVExCIFBhZ2VNYXNrIGZvciAxTSBwYWdlcy4KKwlkbGkJCWswLCBUTEJNQVNLXzFNX1BBR0UJ
CSMgUGFnZU1hc2sgZm9yIDFNIFBhZ2UKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfUEdf
TUFTSwkjIFBhZ2VNYXNrIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJdGxid3IJCQkJCQkjIHdy
aXRlIHRvIHRsYgorCUhBWkFSRF9ERUxBWQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExC
X1BHX01BU0sJIyB6ZXJvIG91dCBQYWdlTWFzayByZWcKKwlDT1AwX1NZTkMKKwllcmV0CQkJCQkJ
IyByZXR1cm4gZnJvbSBleGNlcHRpb24KKworbm90X2tzcGc6CisjZW5kaWYgLyogTUlQUzY0X05F
V19QTUFQICovCisKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1iYWQgYWRk
cmVzcyAoYWdhaW4pCiAgIAliZXEJCWsxLCB6ZXJvLCBNaXBzS2VybkdlbkV4Y2VwdGlvbgkjID09
MCAtLSBubyBwYWdlIHRhYmxlCiAjZW5kaWYKIAlQVFJfU1JMCQlrMCwgUEFHRV9TSElGVCAtIFBU
RVNISUZUCSMgazA9VlBOCiAJYW5kaQkJazAsIGswLCBQVEUyTUFTSwkJIyBrMD1wYWdlIHRhYiBv
ZmZzZXQKIAlQVFJfQUREVQlrMSwgazEsIGswCQkJIyBrMT1wdGUgYWRkcmVzcworCiAJUFRFX0wJ
CWswLCAwKGsxKQkJCSMgazA9bG8wIHB0ZQotCVBURV9MCQlrMSwgUFRFU0laRShrMSkJCQkjIGsx
PWxvMSBwdGUKKworCSMgWFhYIFJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisKIAlDTEVBUl9QVEVf
U1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgbG8wIGlzIGxv
YWRlZAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1J
UFNfQ09QXzBfVExCX0xPMQkJIyBsbzEgaXMgbG9hZGVkCisKKwlQVEVfTAkJazAsIFBURVNJWkUo
azEpCQkJIyBrMD1sbzEgcHRlCisKKwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWsw
LCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAogCUNPUDBfU1lOQwogCXRsYndy
CQkJCQkjIHdyaXRlIHRvIHRsYgogCUhBWkFSRF9ERUxBWQpkaWZmIC0tZ2l0IGEvc3lzL21pcHMv
bWlwcy9jcHUuYyBiL3N5cy9taXBzL21pcHMvY3B1LmMKLS0tIGEvc3lzL21pcHMvbWlwcy9jcHUu
YworKysgYi9zeXMvbWlwcy9taXBzL2NwdS5jCkBAIC0zMTMsNiArMzEzLDI1IEBACiAJY3B1aW5m
by0+bDIuZGNfc2l6ZSA9IGNwdWluZm8tPmwyLmRjX2xpbmVzaXplCiAJICAgICogY3B1aW5mby0+
bDIuZGNfbnNldHMgKiBjcHVpbmZvLT5sMi5kY19ud2F5czsKICNlbmRpZgorCisJLyoKKwkgKiBQ
cm9iZSBQYWdlTWFzayByZWdpc3RlciB0byBzZWUgd2hhdCBzaXplcyBvZiBwYWdlcyBhcmUgc3Vw
cG9ydGVkCisJICogYnkgd3JpdGluZyBhbGwgb25lJ3MgYW5kIHRoZW4gcmVhZGluZyBpdCBiYWNr
LgorCSAqLworCW1pcHNfd3JfcGFnZW1hc2sofjApOworCWNwdWluZm8tPnRsYl9wZ21hc2sgPSBt
aXBzX3JkX3BhZ2VtYXNrKCk7CisJbWlwc193cl9wYWdlbWFzayhNSVBTM19QR01BU0tfNEspOwor
CisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwlpZiAoKGNwdWluZm8tPnRsYl9wZ21hc2sgJiBN
SVBTM19QR01BU0tfMTZLKSA9PSAwKQorCQlwYW5pYygiJXM6IDE2SyBzaXplZCBwYWdlcyBhcmUg
bm90IHN1cHBvcnRlZCBieSB0aGlzIENQVS4iLAorCQkgICAgX19mdW5jX18pOworI2VuZGlmIC8q
IEtTVEFDS19MQVJHRV9QQUdFICovCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisJaWYgKChjcHVp
bmZvLT50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzFNKSA9PSAwKQorCQlwYW5pYygiJXM6IDFN
IHNpemVkIHBhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgQ1BVLiIsCisJCSAgICBfX2Z1
bmNfXyk7CisjZW5kaWYgLyogTUlQUzY0X05FV19QTUFQICovCiB9CiAKIHZvaWQKQEAgLTM4OSw2
ICs0MDgsMzAgQEAKIAkJCXByaW50ZigiRml4ZWQgbWFwcGluZyIpOwogCQl9CiAJCXByaW50Zigi
LCAlZCBlbnRyaWVzICIsIGNwdWluZm8udGxiX25lbnRyaWVzKTsKKwkJaWYgKGNwdWluZm8udGxi
X3BnbWFzaykgeworCQkJcHJpbnRmKCIoIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYg
TUlQUzNfUEdNQVNLX01BU0tYKQorCQkJCXByaW50ZigiMUsgIik7CisJCQlwcmludGYoIjRLICIp
OworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS18xNkspCisJCQkJcHJp
bnRmKCIxNksgIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzY0
SykKKwkJCQlwcmludGYoIjY0SyAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBT
M19QR01BU0tfMjU2SykKKwkJCQlwcmludGYoIjI1NksgIik7CisJCQlpZiAoY3B1aW5mby50bGJf
cGdtYXNrICYgTUlQUzNfUEdNQVNLXzFNKQorCQkJCXByaW50ZigiMU0gIik7CisJCQlpZiAoY3B1
aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzRNKQorCQkJCXByaW50ZigiNE0gIik7CisJ
CQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2TSkKKwkJCQlwcmludGYo
IjE2TSAiKTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfNjRNKQor
CQkJCXByaW50ZigiNjRNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BH
TUFTS18yNTZNKQorCQkJCXByaW50ZigiMjU2TSAiKTsKKwkJCXByaW50ZigicGcgc2l6ZXMpIik7
CisJCX0KKwkJcHJpbnRmKCJcbiIpOwogCX0KIAogCWlmIChjcHVpbmZvLnRsYl9wZ21hc2spIHsK
ZGlmZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oIGIvc3lzL21pcHMvaW5jbHVk
ZS92bXBhcmFtLmgKLS0tIGEvc3lzL21pcHMvaW5jbHVkZS92bXBhcmFtLmgKKysrIGIvc3lzL21p
cHMvaW5jbHVkZS92bXBhcmFtLmgKQEAgLTEwMCwxNSArMTAwLDQ3IEBACiAjZGVmaW5lCUZSRUVC
U0QzMl9VU1JTVEFDSwkoKCh2bV9vZmZzZXRfdCkweDgwMDAwMDAwKSAtIFBBR0VfU0laRSkKICNl
bmRpZgogCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCiAvKgotICogRGlzYWJsZSBzdXBlcnBhZ2Ug
cmVzZXJ2YXRpb25zLiAobm90IHN1cmUgaWYgdGhpcyBpcyByaWdodAotICogSSBjb3BpZWQgaXQg
ZnJvbSBBUk0pCisgKiBFbmFibGUgc3VwZXJwYWdlIHJlc2VydmF0aW9uczogMSBsZXZlbC4KKyAq
CisgKiBWTV9OUkVTRVJWTEVWRUwgc3BlY2lmaWVzIGEgbnVtYmVyIG9mIHByb21vdGlvbiBsZXZl
bHMgZW5hYmxlZC4KKyAqIEN1cnJlbnRseSBtaXBzNjQgb25seSBzdXBwb3J0cyBvbmUgc2l6ZSBv
ciBsZXZlbCAoVk1fTEVWRUxfMF9PUkRFUikgb2YKKyAqIHN1cGVycGFnZXMgKDJNQikKKyAqLwor
I2lmbmRlZglWTV9OUkVTRVJWTEVWRUwKKyNkZWZpbmUJVk1fTlJFU0VSVkxFVkVMCQkJMQorI2Vu
ZGlmCisKKy8qCisgKiBMZXZlbCAwIHJlc2VydmF0aW9ucyBjb25zaXN0IG9mIDUxMiAoMl45KSBw
YWdlcyAoMk1CKS4KKyAqLworI2lmbmRlZglWTV9MRVZFTF8wX09SREVSCisjZGVmaW5lCVZNX0xF
VkVMXzBfT1JERVIJCTkKKyNlbmRpZgorCisvKgorICogVGhlIGxhcmdlc3QgYWxsb2NhdGlvbiBz
aXplIGlzIDRNQi4KKyAqLworI2RlZmluZQlWTV9ORlJFRU9SREVSCQkJMTEKKworI2Vsc2UgLyog
ISBNSVBTNjRfTkVXX1BNQVAgKi8KKworLyoKKyAqIERpc2FibGUgc3VwZXJwYWdlIHJlc2VydmF0
aW9ucy4KICAqLwogI2lmbmRlZglWTV9OUkVTRVJWTEVWRUwKICNkZWZpbmUJVk1fTlJFU0VSVkxF
VkVMCQkwCiAjZW5kaWYKIAogLyoKKyAqIFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyAx
TUIuCisgKi8KKyNkZWZpbmUJVk1fTkZSRUVPUkRFUgkJOQorCisjZW5kaWYgLyogISBNSVBTNjRf
TkVXX1BNQVAgKi8KKworLyoKICAqIEhvdyBtYW55IHBoeXNpY2FsIHBhZ2VzIHBlciBrbWVtIGFy
ZW5hIHZpcnR1YWwgcGFnZS4KICAqLwogI2lmbmRlZiBWTV9LTUVNX1NJWkVfU0NBTEUKQEAgLTE3
NywxMSArMjA5LDYgQEAKICNkZWZpbmUJVk1fTE9XTUVNX0JPVU5EQVJZCSgodm1fcGFkZHJfdCkw
eDIwMDAwMDAwKQogI2VuZGlmCiAKLS8qCi0gKiBUaGUgbGFyZ2VzdCBhbGxvY2F0aW9uIHNpemUg
aXMgMU1CLgotICovCi0jZGVmaW5lCVZNX05GUkVFT1JERVIJCTkKLQogI2RlZmluZQlaRVJPX1JF
R0lPTl9TSVpFCSg2NCAqIDEwMjQpCS8qIDY0S0IgKi8KIAogI2lmbmRlZiBfX21pcHNfbjY0CmRp
ZmYgLS1naXQgYS9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oIGIvc3lzL21pcHMvaW5jbHVkZS9wdGUu
aAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvcHRl
LmgKQEAgLTI5LDYgKzI5LDEwIEBACiAjaWZuZGVmCV9NQUNISU5FX1BURV9IXwogI2RlZmluZQlf
TUFDSElORV9QVEVfSF8KIAorI2lmICFkZWZpbmVkKF9LRVJORUwpCisjaW5jbHVkZSA8bWFjaGlu
ZS9wYXJhbS5oPgorI2VuZGlmCisKICNpZm5kZWYgX0xPQ09SRQogI2lmIGRlZmluZWQoX19taXBz
X242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJfNjRfQklUICovCiB0eXBl
ZGVmCXVpbnQ2NF90IHB0X2VudHJ5X3Q7CkBAIC03MiwyMiArNzYsMjUgQEAKICAqIE5PVEU6IFRo
aXMgbWVhbnMgdGhhdCBmb3IgMzItYml0IHVzZSBvZiBDUDAsIHdlIGFyZW4ndCBhYmxlIHRvIHNl
dCB0aGUgdG9wCiAgKiBiaXQgb2YgUEZOIHRvIGEgbm9uLXplcm8gdmFsdWUsIGFzIHNvZnR3YXJl
IGlzIHVzaW5nIGl0ISAgVGhpcyBwaHlzaWNhbAogICogbWVtb3J5IHNpemUgbGltaXQgbWF5IG5v
dCBiZSBzdWZmaWNpZW50bHkgZW5mb3JjZWQgZWxzZXdoZXJlLgorICoKKyAqIFhYWFJXOiBPbiBD
SEVSSSwgYml0cyA2MyBhbmQgNjIgYXJlIHVzZWQgZm9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMg
dGhhdAorICogcHJldmVudCBsb2FkaW5nIGFuZCBzdG9yaW5nIG9mIGNhcGFiaWxpdGllcywgc28g
d2UgaGF2ZSByZWR1Y2VkIHRoZSA1NS1iaXQKKyAqIHNoaWZ0IHRvIDUzIGJpdHMuCiAgKi8KICNp
ZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyogIFBIWVNBRERS
XzY0X0JJVCAqLwotI2RlZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDU1KQotI2RlZmluZQlUTEJM
T19TV0JJVFNfQ0xFQVJfU0hJRlQJKDkpCi0jZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkweDNGRkZG
RkZDMFVMTAorI2RlZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDUzKQkJLyogWFhYUlc6IFdhcyA1
NS4gKi8KKyNkZWZpbmUJVExCTE9fUkVGX0JJVF9TSElGVAkoNjEpCisjZGVmaW5lCVRMQkxPX1NX
QklUU19DTEVBUl9TSElGVAkoMTEpCS8qIFhYWFNTOiBXYXMgOS4gKi8KKyNkZWZpbmUJVExCTE9f
UEZOX01BU0sJCTB4RkZGRkZGQzBVTEwKKyNkZWZpbmUJVExCXzFNX1NVUEVSUEFHRV9TSElGVAko
UERSU0hJRlQpCisjZGVmaW5lCVRMQkxPX1NXQklUU19NQVNLCSgocHRfZW50cnlfdCkweDdGIDw8
IFRMQkxPX1NXQklUU19TSElGVCkKICNlbHNlCiAjZGVmaW5lCVRMQkxPX1NXQklUU19TSElGVAko
MjkpCiAjZGVmaW5lCVRMQkxPX1NXQklUU19DTEVBUl9TSElGVAkoMykKICNkZWZpbmUJVExCTE9f
UEZOX01BU0sJCSgweDFGRkZGRkMwKQorI2RlZmluZQlUTEJMT19TV0JJVFNfTUFTSwkoKHB0X2Vu
dHJ5X3QpMHg3IDw8IFRMQkxPX1NXQklUU19TSElGVCkKICNlbmRpZgogI2RlZmluZQlUTEJMT19Q
Rk5fU0hJRlQJCSg2KQotI2RlZmluZQlUTEJMT19TV0JJVFNfTUFTSwkoKHB0X2VudHJ5X3QpMHg3
IDw8IFRMQkxPX1NXQklUU19TSElGVCkKLSNkZWZpbmUJVExCTE9fUEFfVE9fUEZOKHBhKQkoKCgo
cGEpID4+IFRMQl9QQUdFX1NISUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYgVExCTE9fUEZOX01B
U0spCi0jZGVmaW5lCVRMQkxPX1BGTl9UT19QQShwZm4pCSgodm1fcGFkZHJfdCkoKHBmbikgPj4g
VExCTE9fUEZOX1NISUZUKSA8PCBUTEJfUEFHRV9TSElGVCkKLSNkZWZpbmUJVExCTE9fUFRFX1RP
X1BGTihwdGUpCSgocHRlKSAmIFRMQkxPX1BGTl9NQVNLKQotI2RlZmluZQlUTEJMT19QVEVfVE9f
UEEocHRlKQkoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19QRk4oKHB0ZSkpKSkKIAogLyoK
ICAqIFhYWCBUaGlzIGNvbW1lbnQgaXMgbm90IGNvcnJlY3QgZm9yIGFueXRoaW5nIG1vcmUgbW9k
ZXJuIHRoYW4gUjRLLgpAQCAtMTIxLDI1ICsxMjgsODMgQEAKICNlbmRpZiAvKiBkZWZpbmVkKF9f
bWlwc19uNjQpICovCiAKIC8qCisgKiBQVEUgSGFyZHdhcmUgQml0cyAoRW50cnlMbzAtMSByZWdp
c3RlciBmaWVsZHMpCisgKgorICogTG93ZXIgYml0cyBvZiBhIDMyIGJpdCBQVEU6CisgKgorICog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjggLS0tLS0tLS0tLS0tLS0tIDYgNSAt
IDMgIDIgICAxICAgMAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfCAgICAgICAgIFBGTiAgICAgICAgfCAgQyAgfCBEIHwgVlJ8IEcgfAorICog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KKyAqCisgKiBMb3dlciBiaXRzIG9mIGEgNjQgYml0IFBURToKKyAqCisg
KiAgNTIgLS0tLS0tLS0tLS0tLS0tLS0tLS0gMzQgIDMzIC0tLS0tLS0tLS0tLS0tLS0tLS0gNiA1
IC0gMyAgMiAgIDEgICAwCisgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICBSZXNlcnZlZCAo
WmVybykgICAgIHwgICAgICAgICAgUEZOICAgICAgICAgICB8ICBDICB8IEQgfCBWUnwgRyB8Cisg
KiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQorICoKICAqIFRMQiBmbGFncyBtYW5hZ2VkIGluIGhhcmR3YXJlOgor
ICogICAgUEZOOglQYWdlIEZyYW1lIE51bWJlci4KICAqIAlDOglDYWNoZSBhdHRyaWJ1dGUuCiAg
KiAJRDoJRGlydHkgYml0LiAgVGhpcyBtZWFucyBhIHBhZ2UgaXMgd3JpdGFibGUuICBJdCBpcyBu
b3QKICAqIAkJc2V0IGF0IGZpcnN0LCBhbmQgYSB3cml0ZSBpcyB0cmFwcGVkLCBhbmQgdGhlIGRp
cnR5CiAgKiAJCWJpdCBpcyBzZXQuICBTZWUgYWxzbyBQVEVfUk8uCi0gKiAJVjoJVmFsaWQgYml0
LiAgT2J2aW91cywgaXNuJ3QgaXQ/CisgKiAJVlI6CVZhbGlkL1JlZmVyZW5jZSBiaXQuIFNlZSBh
bHNvIFBURV9TVi4KICAqIAlHOglHbG9iYWwgYml0LiAgVGhpcyBtZWFucyB0aGF0IHRoaXMgbWFw
cGluZyBpcyBwcmVzZW50CiAgKiAJCWluIEVWRVJZIGFkZHJlc3Mgc3BhY2UsIGFuZCB0byBpZ25v
cmUgdGhlIEFTSUQgd2hlbgogICogCQlpdCBpcyBtYXRjaGVkLgogICovCiAjZGVmaW5lCVBURV9D
KGF0dHIpCQkoKGF0dHIgJiAweDA3KSA8PCAzKQogI2RlZmluZQlQVEVfQ19VTkNBQ0hFRAkJKFBU
RV9DKE1JUFNfQ0NBX1VOQ0FDSEVEKSkKICNkZWZpbmUJUFRFX0NfQ0FDSEUJCShQVEVfQyhNSVBT
X0NDQV9DQUNIRUQpKQogI2RlZmluZQlQVEVfRAkJCTB4MDQKLSNkZWZpbmUJUFRFX1YJCQkweDAy
CisjZGVmaW5lCVBURV9WUgkJCTB4MDIKICNkZWZpbmUJUFRFX0cJCQkweDAxCiAKKyNpZmRlZiBD
UFVfQ0hFUkkKKy8qCisgKiBDSEVSSSBFbnRyeUxvIGV4dGVuc2lvbnMgdGhhdCBsaW1pdCBzdG9y
aW5nIGxvYWRpbmcgYW5kIHN0b3JpbmcgdGFnZ2VkCisgKiB2YWx1ZXMuCisgKi8KKyNkZWZpbmUJ
UFRFX1NDCQkJKDB4MVVMTCA8PCA2MykKKyNkZWZpbmUJUFRFX0xDCQkJKDB4MVVMTCA8PCA2MikK
KyNlbmRpZgorCiAvKgorICogUFRFIFNvZnR3YXJlIEJpdHMKKyAqCisgKiBVcHBlciBiaXRzIG9m
IGEgMzIgYml0IFBURToKKyAqCisgKiAgICAgMzEgICAzMCAgIDI5CisgKiAgICAtLS0tLS0tLS0t
LS0tLQorICogICB8IE1OIHwgVyAgfCBSTyB8CisgKiAgICAtLS0tLS0tLS0tLS0tLQorICoKKyAq
IFVwcGVyIGJpdHMgb2YgYSA2NCBiaXQgUFRFOgorICoKKyAqICAgNjMtNjIgICA2MS02MCAgNTkg
ICA1OCAtLSA1NiAgICA1NSAgIDU0ICAgNTMKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgfCAgUkcgIHwgICAgICB8IFNWIHwgUEcgU1ogSURY
IHwgTU4gfCBXICB8IFJPIHwKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCisgKgogICogVk0gZmxhZ3MgbWFuYWdlZCBpbiBzb2Z0d2FyZToKKyAqCVJH
OglSZWdpb24uCSAoUmVzZXJ2ZWQuIEN1cnJlbnRseSBub3QgdXNlZC4pCisgKglTVjoJU29mdCBW
YWxpZCBiaXQuCisgKglQRyBTWiBJRFg6IFBhZ2UgU2l6ZSBJbmRleCAoMC03KS4KKyAqCQlJbmRl
eAlQYWdlIE1hc2sgKEJpbmFyeSkJSFcgUGFnZSBTaXplCisgKgkJLS0tLS0JLS0tLS0tLS0tLS0t
LS0tLS0tLQktLS0tLS0tLS0tLS0KKyAqCQkwCTAwMDAgMDAwMCAwMDAwIDAwMDAJICA0SworICoJ
CTEJMDAwMCAwMDAwIDAwMDAgMDAxMQkgMTZLCisgKgkJMgkwMDAwIDAwMDAgMDAwMCAxMTExCSA2
NEsKKyAqCQkzCTAwMDAgMDAwMCAwMDExIDExMTEJMjU2SworICoJCTQJMDAwMCAwMDAwIDExMTEg
MTExMQkgIDFNCisgKgkJNQkwMDAwIDAwMTEgMTExMSAxMTExCSAgNE0KKyAqCQk2CTAwMDAgMTEx
MSAxMTExIDExMTEJIDE2TQorICogKE1JUFMgMzopCisgKgkJNwkwMDExIDExMTEgMTExMSAxMTEx
CSA2NE0KKyAqCQk4CTExMTEgMTExMSAxMTExIDExMTEJMjU2TSAoTm90IGN1cnJlbnRseSBzdXBw
b3J0ZWQpCisgKgogICogCVJPOglSZWFkIG9ubHkuICBOZXZlciBzZXQgUFRFX0Qgb24gdGhpcyBw
YWdlLCBhbmQgZG9uJ3QKICAqIAkJbGlzdGVuIHRvIHJlcXVlc3RzIHRvIHdyaXRlIHRvIGl0Lgog
ICogCVc6CVdpcmVkLiAgPz8/CkBAIC0xNTEsMTMgKzIxNiwyOTEgQEAKICNkZWZpbmUJUFRFX1JP
CQkJKChwdF9lbnRyeV90KTB4MDEgPDwgVExCTE9fU1dCSVRTX1NISUZUKQogI2RlZmluZQlQVEVf
VwkJCSgocHRfZW50cnlfdCkweDAyIDw8IFRMQkxPX1NXQklUU19TSElGVCkKICNkZWZpbmUJUFRF
X01BTkFHRUQJCSgocHRfZW50cnlfdCkweDA0IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNpZiBk
ZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgLyogIFBIWVNBRERSXzY0
X0JJVCAqLworI2RlZmluZQlQVEVfUFNfMTZLCQkoKHB0X2VudHJ5X3QpMHgwOCA8PCBUTEJMT19T
V0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU182NEsJCSgocHRfZW50cnlfdCkweDEwIDw8IFRM
QkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzI1NksJCSgocHRfZW50cnlfdCkweDE4
IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzFNCQkoKHB0X2VudHJ5X3Qp
MHgyMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU180TQkJKChwdF9lbnRy
eV90KTB4MjggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfMTZNCQkoKHB0
X2VudHJ5X3QpMHgzMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU182NE0J
CSgocHRfZW50cnlfdCkweDM4IDw8IFRMQkxPX1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BT
X0lEWF9NQVNLCQkoKHB0X2VudHJ5X3QpMHgzOCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVm
aW5lCVBURV9QU0lEWF9OQklUU19UT19MRUZUCQk1CisjZGVmaW5lCVBURV9QU0lEWF9OQklUU19U
T19SSUdIVAk1NgorI2RlZmluZQlQVEVfUEZOX05CSVRTX1RPX0xFRlQJCTExCisjZGVmaW5lCVBU
RV9QRk5fTkJJVFNfVE9fUklHSFQJCTYKKyNkZWZpbmUJUFRFX0hXRkxBR1NfTkJJVFNfVE9fTEVG
VAk1OAorI2RlZmluZQlTV19WQUxJRAkJMHg0MAorI2RlZmluZQlQVEVfU1YJCQkoKHB0X2VudHJ5
X3QpU1dfVkFMSUQgPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2Vsc2UKKyNkZWZpbmUJUFRFX1BT
X0lEWF9NQVNLCQkwCisjZGVmaW5lCVBURV9TVgkJCTAKKyNlbmRpZgorCisvKgorICogUHJvbW90
aW9uIHRvIGEgNE1CIChQREUpIHBhZ2UgbWFwcGluZyByZXF1aXJlcyB0aGF0IHRoZSBjb3JyZXNw
b25kaW5nIDRLQgorICogKFBURSkgcGFnZSBtYXBwaW5ncyBoYXZlIGlkZW50aWNhbCBzZXR0aW5n
cyBmb3IgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisgKi8KKyNkZWZpbmUJUEdfUFJPTU9URV9NQVNL
CShQVEVfRyB8IFBURV9WQUxJRCB8IFBURV9EIHwgUFRFX0NfVU5DQUNIRUQgfCBcCisJCQlQVEVf
Q19DQUNIRSB8IFBURV9STyB8IFBURV9XIHwgUFRFX01BTkFHRUQgfCBcCisJCQlQVEVfUkVGKQor
CisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisjZGVmaW5lCVRMQkxPX1BURV9UT19JRFgocHRlKQko
KChwdGUpICYgUFRFX1BTX0lEWF9NQVNLKSA+PiA1NikKKyNkZWZpbmUJVExCTUFTS19JRFhfVE9f
TUFTSyhpZHgpICgoKDEgPDwgKChpZHgpIDw8IDEpKSAtIDEpIDw8IFRMQk1BU0tfU0hJRlQpCisj
ZGVmaW5lCVRMQkxPX1BURV9UT19NQVNLKHB0ZSkJVExCTUFTS19JRFhfVE9fTUFTSyhUTEJMT19Q
VEVfVE9fSURYKHB0ZSkpCisjZGVmaW5lCVRMQk1BU0tfNEtfUEFHRQkJVExCTUFTS19JRFhfVE9f
TUFTSygwKQorI2RlZmluZQlUTEJNQVNLXzE2S19QQUdFCVRMQk1BU0tfSURYX1RPX01BU0soMSkK
KyNkZWZpbmUJVExCTUFTS182NEtfUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDIpCisjZGVmaW5l
CVRMQk1BU0tfMjU2S19QQUdFCVRMQk1BU0tfSURYX1RPX01BU0soMykKKyNkZWZpbmUJVExCTUFT
S18xTV9QQUdFCQlUTEJNQVNLX0lEWF9UT19NQVNLKDQpCisjZGVmaW5lCVRMQk1BU0tfNE1fUEFH
RQkJVExCTUFTS19JRFhfVE9fTUFTSyg1KQorI2RlZmluZQlUTEJNQVNLXzE2TV9QQUdFCVRMQk1B
U0tfSURYX1RPX01BU0soNikKKyNkZWZpbmUJVExCTUFTS182NE1fUEFHRQlUTEJNQVNLX0lEWF9U
T19NQVNLKDcpCisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworI2RlZmluZQlUTEJMT19Q
VEVfVE9fSURYKHB0ZSkgCTAKKyNkZWZpbmUJVExCTE9fUFRFX1RPX01BU0socHRlKQkwCisjZW5k
aWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIAogLyoKICAqIFBURSBtYW5hZ2VtZW50IGZ1bmN0
aW9ucyBmb3IgYml0cyBkZWZpbmVkIGFib3ZlLgogICovCi0jZGVmaW5lCXB0ZV9jbGVhcihwdGUs
IGJpdCkJKCoocHRlKSAmPSB+KGJpdCkpCi0jZGVmaW5lCXB0ZV9zZXQocHRlLCBiaXQpCSgqKHB0
ZSkgfD0gKGJpdCkpCi0jZGVmaW5lCXB0ZV90ZXN0KHB0ZSwgYml0KQkoKCoocHRlKSAmIChiaXQp
KSA9PSAoYml0KSkKKyNpZm5kZWYgX0xPQ09SRQorc3RhdGljIF9faW5saW5lIHZvaWQKK3B0ZV9j
bGVhcihwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJKnB0ZSAmPSAofmJp
dCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitwdGVfc2V0KHB0X2VudHJ5X3QgKnB0ZSwg
cHRfZW50cnlfdCBiaXQpCit7CisKKwkqcHRlIHw9IGJpdDsKK30KKworc3RhdGljIF9faW5saW5l
IGludAorcHRlX3Rlc3QocHRfZW50cnlfdCAqcHRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCXJl
dHVybiAoKCpwdGUgJiBiaXQpID09IGJpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitw
ZGVfY2xlYXIocGRfZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCSoocHRfZW50
cnlfdCAqKXBkZSAmPSAofmJpdCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitwZGVfc2V0
KHBkX2VudHJ5X3QgKnBkZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwkqKHB0X2VudHJ5X3QgKilw
ZGUgfD0gYml0OworfQorCitzdGF0aWMgX19pbmxpbmUgaW50CitwZGVfdGVzdChwZF9lbnRyeV90
ICpwZGUsIHB0X2VudHJ5X3QgYml0KQoreworCisJcmV0dXJuICgoKihwdF9lbnRyeV90ICopcGRl
ICYgYml0KSA9PSBiaXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgcHRfZW50cnlfdAorVExCTE9f
UEFfVE9fUEZOKHZtX3BhZGRyX3QgcGEpCit7CisKKwlyZXR1cm4gKCgocGEgPj4gVExCX1BBR0Vf
U0hJRlQpIDw8IFRMQkxPX1BGTl9TSElGVCkgJiBUTEJMT19QRk5fTUFTSyk7Cit9CisKK3N0YXRp
YyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19QRk5fVE9fUEEocHRfZW50cnlfdCBwZm4pCit7
CisKKwlyZXR1cm4gKCh2bV9wYWRkcl90KShwZm4gPj4gVExCTE9fUEZOX1NISUZUKSA8PCBUTEJf
UEFHRV9TSElGVCk7Cit9CisKK3N0YXRpYyBfX2lubGluZSBwdF9lbnRyeV90CitUTEJMT19QVEVf
VE9fUEZOKHB0X2VudHJ5X3QgcHRlKQoreworCisJcmV0dXJuIChwdGUgJiBUTEJMT19QRk5fTUFT
Syk7Cit9CisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKworI2RlZmluZQlQVEVfUkVGCQlQVEVf
VlIKKyNkZWZpbmUJUFRFX1ZBTElEIAlQVEVfU1YKKworI2RlZmluZQlwdGVfaXNfcmVmKHB0ZSkJ
CQlwdGVfdGVzdCgocHRlKSwgUFRFX1JFRikKKyNkZWZpbmUJcHRlX3JlZl9jbGVhcihwdGUpCQlw
dGVfY2xlYXIoKHB0ZSksIFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfc2V0KHB0ZSkJCXB0ZV9z
ZXQoKHB0ZSksIFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX2NsZWFyKHB0ZSkJYXRv
bWljX2NsZWFyX2xvbmcoKHB0ZSksIFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX3Nl
dChwdGUpCQlhdG9taWNfc2V0X2xvbmcoKHB0ZSksIFBURV9SRUYpCisKKyNlbHNlIC8qICEgTUlQ
UzY0X05FV19QTUFQICovCisKKyNkZWZpbmUJUFRFX1JFRgkJMAorI2RlZmluZQlQVEVfVkFMSUQJ
UFRFX1ZSCisKKyNkZWZpbmUJcHRlX2lzX3JlZihwdGUpCQkJMAorI2RlZmluZQlwdGVfcmVmX2Ns
ZWFyKHB0ZSkKKyNkZWZpbmUJcHRlX3JlZl9zZXQocHRlKQorI2RlZmluZQlwdGVfcmVmX2F0b21p
Y19jbGVhcihwdGUpCisjZGVmaW5lCXB0ZV9yZWZfYXRvbWljX3NldChwdGUsIGJpdCkKKworI2Vu
ZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKyNkZWZpbmUJcHRlX2lzX3ZhbGlkKHB0ZSkJ
CXB0ZV90ZXN0KChwdGUpLCBQVEVfVkFMSUQpCisKKyNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8
IGRlZmluZWQoX19taXBzX24zMikgLyogIFBIWVNBRERSXzY0X0JJVCAqLworCisjZGVmaW5lCXB0
ZV9hdG9taWNfY2xlYXIocHRlLCBiaXQpCWF0b21pY19jbGVhcl82NCgocHRlKSwgYml0KQorI2Rl
ZmluZQlwdGVfYXRvbWljX3NldChwdGUsIGJpdCkJYXRvbWljX3NldF82NCgocHRlKSwgYml0KQor
I2RlZmluZQlwdGVfbG9hZF9zdG9yZShwdGVwLCBwdGUpCWF0b21pY19yZWFkYW5kc2V0XzY0KHB0
ZXAsIHB0ZSkKKyNkZWZpbmUJcGRlX2xvYWRfc3RvcmUocGRlcCwgcGRlKQkocGRfZW50cnlfdClh
dG9taWNfcmVhZGFuZHNldF82NChcCisJCQkJCQkocHRfZW50cnlfdCAqKXBkZXAsIHBkZSkKKwor
I2RlZmluZQlwdGVfYXRvbWljX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3N0b3JlX3JlbF82NChw
dGVwLCBwdGUpCisjZGVmaW5lIHB0ZV9zdG9yZShwdGVwLCBwdGUpCWRvIHsJCVwKKwkqKHVfbG9u
ZyAqKShwdGVwKSA9ICh1X2xvbmcpKHB0ZSk7CVwKK30gd2hpbGUgKDApCisjZGVmaW5lCXBkZV9z
dG9yZShwZGVwLCBwZGUpCQlwdGVfc3RvcmUocGRlcCwgcGRlKQorCisKKyNlbHNlIC8qICEgUEhZ
U0FERFJfNjRfQklUICovCisKKyNkZWZpbmUJcHRlX2F0b21pY19jbGVhcihwdGUsIGJpdCkJYXRv
bWljX2NsZWFyXzMyKChwdGUpLCBiaXQpCisjZGVmaW5lCXB0ZV9hdG9taWNfc2V0KHB0ZSwgYml0
KQlhdG9taWNfc2V0XzMyKChwdGUpLCBiaXQpCisjZGVmaW5lCXB0ZV9sb2FkX3N0b3JlKHB0ZXAs
IHB0ZSkJYXRvbWljX3JlYWRhbmRzZXRfMzIocHRlcCwgcHRlKQorI2RlZmluZQlwZGVfbG9hZF9z
dG9yZShwZGVwLCBwZGUpCShwZF9lbnRyeV90KWF0b21pY19yZWFkYW5kc2V0XzMyKFwKKwkJCQkJ
CShwdF9lbnRyeV90ICopcGRlcCwgcGRlKQorCisjZGVmaW5lCXB0ZV9hdG9taWNfc3RvcmUocHRl
cCwgcHRlKQlhdG9taWNfc3RvcmVfcmVsXzMyKHB0ZXAsIHB0ZSkKKyNkZWZpbmUgcHRlX3N0b3Jl
KHB0ZXAsIHB0ZSkJZG8gewkJXAorCSoodV9pbnQgKikocHRlcCkgPSAodV9pbnQpKHB0ZSk7CVwK
K30gd2hpbGUgKDApCisjZGVmaW5lCXBkZV9zdG9yZShwZGVwLCBwZGUpCQlwdGVfc3RvcmUocGRl
cCwgcGRlKQorCisjZW5kaWYgLyogISBQSFlTQUREUl82NF9CSVQgKi8KKworI2VuZGlmIC8qICEg
X0xPQ09SRSAqLworCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19u
MzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKworI2lmbmRlZiBfTE9DT1JFCisvKgorICogQ2hl
Y2sgdG8gc2VlIGlmIGEgUERFIGlzIGFjdHVhbGx5IGEgc3VwZXJwYWdlIChQYWdlU2l6ZSA+IDRL
KSBQVEUuCisgKgorICogT24gX19taXBzX242NCB0aGUga2VybmVsIHVzZXMgdGhlIHZpcnR1YWwg
bWVtb3J5IGFkZHJlc3MgcmFuZ2UgZnJvbQorICogVk1fTUlOX0tFUk5FTF9BRERSRVNTICgweGMw
MDAwMDAwMDAwMDAwMDApIHRvIFZNX01BWF9LRVJORUxfQUREUkVTUworICogKDB4YzAwMDAwODAw
MDAwMDAwMCkuIFRoZXJlZm9yZSwgYSB2YWxpZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlIFBERQor
ICogKGEgcG9pbnRlciB0byBhIHBhZ2UgdGFibGUpIHdpbGwgaGF2ZSBiaXRzIDYxIHRvIDQwIHNl
dCB0byB6ZXJvLiBBCisgKiBzdXBlcnBhZ2Ugd2lsbCBoYXZlIG9uZSBvZiB0aGUgc3VwZXJwYWdl
IHNpemUgYml0cyAoYml0cyA1OCB0byA1NikKKyAqIHNldC4KKyAqLworCisvKiBJcyB0aGUgUERF
IGEgc3VwZXJwYWdlIG9mIGFueSBzaXplPyAqLworc3RhdGljIF9faW5saW5lIGludAorcGRlX2lz
X3N1cGVycGFnZShwZF9lbnRyeV90ICpwZGUpCit7CisKKwlyZXR1cm4gKCgocHRfZW50cnlfdCkq
cGRlICYgUFRFX1BTX0lEWF9NQVNLKSAhPSAwKTsKK30KKworLyogSXMgdGhlIFBURSBhIHN1cGVy
cGFnZSBvZiBhbnkgc2l6ZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV9pc19zdXBlcnBh
Z2UocHRfZW50cnlfdCAqcHRlKQoreworCisJcmV0dXJuICgoKnB0ZSAmIFBURV9QU19JRFhfTUFT
SykgIT0gMCk7Cit9CisKKy8qIElzIHRoZSBQREUgYW4gMU1CIHN1cGVycGFnZT8gKi8KK3N0YXRp
YyBfX2lubGluZSBpbnQKK3BkZV9pc18xbV9zdXBlcnBhZ2UocGRfZW50cnlfdCAqcGRlKQorewor
CisJcmV0dXJuICgoKHB0X2VudHJ5X3QpKnBkZSAmIFBURV9QU18xTSkgPT0gUFRFX1BTXzFNKTsK
K30KKworLyogSXMgdGhlIFBURSBhbiAxTUIgc3VwZXJwYWdlPyAqLworc3RhdGljIF9faW5saW5l
IGludAorcHRlX2lzXzFtX3N1cGVycGFnZShwdF9lbnRyeV90ICpwdGUpCit7CisKKwlyZXR1cm4g
KCgqcHRlICYgUFRFX1BTXzFNKSA9PSBQVEVfUFNfMU0pOworfQorCisvKiBQaHlzaWNhbCBBZGRy
ZXNzIHRvIFN1cGVycGFnZSBQaHlzaWNhbCBGcmFtZSBOdW1iZXIuICovCitzdGF0aWMgX19pbmxp
bmUgcHRfZW50cnlfdAorVExCTE9fUEFfVE9fU1BGTih2bV9wYWRkcl90IHBhKQoreworCisJcmV0
dXJuICgoKHBhID4+IFRMQl8xTV9TVVBFUlBBR0VfU0hJRlQpIDw8IFRMQkxPX1BGTl9TSElGVCkg
JgorCSAgICBUTEJMT19QRk5fTUFTSyk7Cit9CisKKy8qIFN1cGVycGFnZSBQaHlzaWNhbCBGcmFt
ZSBOdW1iZXIgdG8gUGh5c2ljYWwgQWRkcmVzcy4gKi8KK3N0YXRpYyBfX2lubGluZSB2bV9wYWRk
cl90CitUTEJMT19TUEZOX1RPX1BBKHB0X2VudHJ5X3Qgc3BmbikKK3sKKworCXJldHVybiAoKHZt
X3BhZGRyX3QpKHNwZm4gPj4gVExCTE9fUEZOX1NISUZUKSA8PAorCSAgICBUTEJfMU1fU1VQRVJQ
QUdFX1NISUZUKTsKK30KKworLyogU3VwZXJwYWdlIFBhZ2UgVGFibGUgRW50cnkgdG8gUGh5c2lj
YWwgQWRkcmVzcy4gKi8KK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19TUFRFX1RP
X1BBKHB0X2VudHJ5X3QgcHRlKQoreworCXJldHVybiAoVExCTE9fU1BGTl9UT19QQShUTEJMT19Q
VEVfVE9fUEZOKHB0ZSkpKTsKK30KKworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxP
X1NQREVfVE9fUEEocGRfZW50cnlfdCBwZGUpCit7CisJcmV0dXJuIChUTEJMT19TUEZOX1RPX1BB
KFRMQkxPX1BURV9UT19QRk4oKHB0X2VudHJ5X3QpcGRlKSkpOworfQorCisKKy8qIEFuIDRLQiBQ
YWdlIFRhYmxlIEVudHJ5IHRvIFBoeXNpY2FsIEFkZHJlc3MuICovCitzdGF0aWMgX19pbmxpbmUg
dm1fcGFkZHJfdAorVExCTE9fUFRFX1RPX1BBKHB0X2VudHJ5X3QgcHRlKQoreworCisJcmV0dXJu
IChUTEJMT19QRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7Cit9CisKK3N0YXRpYyBf
X2lubGluZSB2bV9wYWRkcl90CitUTEJMT19QREVfVE9fUEEocGRfZW50cnlfdCBwZGUpCit7CisK
KwlyZXR1cm4gKFRMQkxPX1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZOKChwdF9lbnRyeV90KXBk
ZSkpKTsKK30KKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKworI2Vsc2UgLyogISBQSFlTQUREUl82
NF9CSVQgKi8KKworI2RlZmluZQlwdGVfaXNfcmVmZXJlbmNlZChwdGUpCQkwCisjZGVmaW5lCXB0
ZV9yZWZlcmVuY2VfcmVzZXQocHRlKQorI2RlZmluZQlwdGVfcmVmZXJlbmNlX3BhZ2UocHRlKQor
I2RlZmluZQlwZGVfaXNfc3VwZXJwYWdlKHBkZSkJCTAKKyNkZWZpbmUJcHRlX2lzX3N1cGVycGFn
ZShwZGUpCQkwCisjZGVmaW5lIHBkZV9pc18xbV9zdXBlcnBhZ2UocHRlKQkwCisjZGVmaW5lIHB0
ZV9pc18xbV9zdXBlcnBhZ2UocHRlKQkwCisKKyNpZm5kZWYgX0xPQ09SRQorc3RhdGljIF9faW5s
aW5lIHZtX3BhZGRyX3QKK1RMQkxPX1BURV9UT19QQShwdF9lbnRyeV90IHB0ZSkKK3sKKworCXJl
dHVybiAoVExCTE9fUEZOX1RPX1BBKFRMQkxPX1BURV9UT19QRk4ocHRlKSkpOworfQorI2VuZGlm
IC8qICEgX0xPQ09SRSAqLworI2VuZGlmIC8qICEgUEhZU0FERFJfNjRfQklUICovCiAKIC8qIEFz
c2VtYmx5IHN1cHBvcnQgZm9yIFBURSBhY2Nlc3MqLwogI2lmZGVmIExPQ09SRQpAQCAtMTY3LDE2
ICs1MTAsMTA0IEBACiAjZGVmaW5lCVBURU1BU0sJCQkweGZmOAogI2RlZmluZQlQVEVTSVpFCQkJ
OAogI2RlZmluZQlQVEVfTAkJCWxkCisjZGVmaW5lCVBURV9TCQkJc2QKICNkZWZpbmUJUFRFX01U
QzAJCWRtdGMwCi0jZGVmaW5lCUNMRUFSX1BURV9TV0JJVFMocHIpCi0jZWxzZQorI2RlZmluZQlD
TEVBUl9QVEVfU1dCSVRTKHIpCisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKworLyogU3VwZXJw
YWdlIGFuZCByZWZlcmVuY2VkIGJpdCBlbXVsYXRpb24gQVNNIG1hY3Jvcy4gKi8KKworLyoKKyAq
IEdFVF9TVVBFUlBBR0VfSURYKHIpCisgKgorICogR2V0IHRoZSBzdXBlcnBhZ2UgaW5kZXggZnJv
bSB0aGUgUFRFIGJ5IHNoaWZ0aW5nIGl0IGxlZnQgYnkKKyAqIFBURV9QU0lEWF9OQklUU19UT19M
RUZUIChjbGVhcmluZyB0aGUgdXBwZXIgc29mdGJpdHMpIGFuZCB0aGVuIGJhY2sgdG8gdGhlCisg
KiByaWdodCBieSAoUFRFX1BTSURYX05CSVRTX1RPX1JJR0hUICsgUFRFX1BTSURYX05CSVRTX1RP
X1JJR0hUKSBjbGVhcmluZworICogYWxsIHRoZSBsb3dlciBiaXRzIGluIHRoZSBwcm9jZXNzLgor
ICovCisjZGVmaW5lIEdFVF9TVVBFUlBBR0VfSURYKHIpCQkJCVwKKwlkc2xsCXIsIChQVEVfUFNJ
RFhfTkJJVFNfVE9fTEVGVCk7CQlcCisJZHNybDMyCXIsIChQVEVfUFNJRFhfTkJJVFNfVE9fUklH
SFQgKyBQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVCAtIDMyKQorCisvKgorICogR0VUX0hXX1RMQl9G
TEFHUyhyKQorICoKKyAqIEdldCB0aGUgbG93ZXIgaGFyZHdhcmUgVExCIGZsYWdzIGJ1dCBzaGlm
dGluZyBsZWZ0IHRoZW4gcmlnaHQuCisgKi8KKyNkZWZpbmUgR0VUX0hXX1RMQl9GTEFHUyhyKQkJ
CQlcCisJZHNsbDMyCXIsIChQVEVfSFdGTEFHU19OQklUU19UT19MRUZUIC0gMzIpOwlcCisJZHNy
bDMyCXIsIChQVEVfSFdGTEFHU19OQklUU19UT19MRUZUIC0gMzIpCisKKy8qCisgKiBHRVRfT0RE
XzFNX1BGTl9GUk9NX0VWRU4ocikKKyAqCisgKiBHZXQgdGhlIG9kZCAxTSBQRk4gKFRMQiBsbzEp
IGZyb20gdGhlIGV2ZW4gMU0gUFRFLiAgRmlyc3QsIG1hc2sgb3V0IHRoZSBQRk4KKyAqIGZyb20g
dGhlIGV2ZW4gUFRFLiBUaGVuIGFkZCAxTSB3b3J0aCBvZiBwYWdlcyB0byBpdCAoMjU2KS4gRmlu
YWxseSwgc2hpZnQgaXQKKyAqIGJhY2sgdG8gaXRzIHBvc2l0aW9uIGluIHRoZSBQVEUuCisgKi8K
KyNkZWZpbmUgR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVOKHIpCQkJXAorCWRzbGwJciwgKFBURV9Q
Rk5fTkJJVFNfVE9fTEVGVCk7CQlcCisJZHNybAlyLCAoUFRFX1BGTl9OQklUU19UT19MRUZUICsg
UFRFX1BGTl9OQklUU19UT19SSUdIVCk7IFwKKwlkYWRkaXUJciwgciwgKDEwMjQgKiAxMDI0IC8g
UEFHRV9TSVpFKTsJXAorCWRzbGwJciwgKFBURV9QRk5fTkJJVFNfVE9fUklHSFQpCisKKy8qCisg
KiBJRl9WQUxJRF9TRVRfUkVGQklUKHIwLCByMSwgb2Zmc2V0LCB1bmlxdWUpCisgKgorICogSWYg
YSBQREUgaXMgdmFsaWQgdGhlbiBzZXQgdGhlIHJlZmVyZW5jZWQgYml0IChQVEVfVlIpLiAgVGhl
IGZpcnN0IHZlcnNpb24KKyAqIGRvZXMgaXQgYXRvbWljYWxseS4KKyAqLworI2RlZmluZSBBVE9N
SUNfUkVGQklUX1VQREFURQorI2lmZGVmIEFUT01JQ19SRUZCSVRfVVBEQVRFCisKKyNkZWZpbmUg
SUZfVkFMSURfU0VUX1JFRkJJVChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQlcCit0cnlfYWdhaW4g
IyMgdW5pcXVlICMjIDogOwkJCQlcCisJZHNybDMyCXIwLCAoVExCTE9fU1dCSVRTX1NISUZUIC0g
MzIpOwkJXAorCWFuZGkJcjAsIHIwLCBTV19WQUxJRDsJCQlcCisJYmVxeglyMCwgbm90X3ZhbGlk
ICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCisJbGxkCXIw
LCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorCW9yaQlyMCwgcjAsIFBURV9WUiA7CQkJXAorCXNjZAly
MCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwliZXF6CXIwLCB0cnlfYWdhaW4gIyMgdW5pcXVlIDsJ
CVwKKwlQVEVfTAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKK25vdF92YWxpZCAjIyB1bmlxdWUg
IyMgOgorCisjZWxzZSAvKiAhIEFUT01JQ19SRUZCSVRfVVBEQVRFICovCisKKyNkZWZpbmUgSUZf
VkFMSURfU0VUX1JFRkJJVChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQlcCit0cnlfYWdhaW4gIyMg
dW5pcXVlICMjIDogOwkJCQlcCisJZHNybDMyCXIwLCAoVExCTE9fU1dCSVRTX1NISUZUIC0gMzIp
IDsJCVwKKwlhbmRpCXIwLCByMCwgU1dfVkFMSUQgOwkJCVwKKwliZXF6CXIwLCBub3RfdmFsaWQg
IyMgdW5pcXVlIDsJCVwKKwlQVEVfTAlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKKwlvcmkJcjAs
IHIwLCBQVEVfVlIgOwkJCVwKKwlQVEVfUwlyMCwgb2Zmc2V0ICMjIChyMSkgOwkJCVwKK25vdF92
YWxpZCAjIyB1bmlxdWUgIyMgOgorI2VuZGlmIC8qICEgQVRPTUlDX1JFRkJJVF9VUERBVEUgKi8K
KworI2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KKworI2RlZmluZQlHRVRfU1VQRVJQQUdF
X0lEWChyKQorI2RlZmluZSBHRVRfSFdfVExCX0ZMQUdTKHIpCisjZGVmaW5lCUlGX1ZBTElEX1NF
VF9SRUZCSVQocjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkKKworI2VuZGlmIC8qICEgTUlQUzY0X05F
V19QTUFQICovCisKKyNlbHNlIC8qICEgTE9DT1JFICovCiAjZGVmaW5lCVBURVNISUZUCQkyCiAj
ZGVmaW5lCVBURTJNQVNLCQkweGZmOAkvKiBmb3IgdGhlIDItcGFnZSBsbzAvbG8xICovCiAjZGVm
aW5lCVBURU1BU0sJCQkweGZmYwogI2RlZmluZQlQVEVTSVpFCQkJNAogI2RlZmluZQlQVEVfTAkJ
CWx3CisjZGVmaW5lCVBURV9TCQkJc3cKICNkZWZpbmUJUFRFX01UQzAJCW10YzAKICNkZWZpbmUJ
Q0xFQVJfUFRFX1NXQklUUyhyKQlMT05HX1NMTCByLCBUTEJMT19TV0JJVFNfQ0xFQVJfU0hJRlQ7
IExPTkdfU1JMIHIsIFRMQkxPX1NXQklUU19DTEVBUl9TSElGVCAvKiByZW1vdmUgc3diaXRzICov
CisKKyNkZWZpbmUJSVNfUFRFX1ZBTElEKHIwLCByMSwgb2Zmc2V0LCBsYWJlbCkKKyNkZWZpbmUJ
U0VUX1JFRl9CSVQocjAsIHIxLCBvZmZzZXQpCisKICNlbmRpZiAvKiBkZWZpbmVkKF9fbWlwc19u
NjQpIHx8IGRlZmluZWQoX19taXBzX24zMikgKi8KIAogI2lmIGRlZmluZWQoX19taXBzX242NCkK
QEAgLTIwMSw0ICs2MzIsMTcgQEAKICNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0TQkweDA3ZmZlMDAw
CiAjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZNCTB4MWZmZmUwMDAKIAorCisvKiBQYWdlTWFzayBS
ZWdpc3RlciAoQ1AwIFJlZ2lzdGVyIDUsIFNlbGVjdCAwKSBWYWx1ZXMgKi8KKyNkZWZpbmUJTUlQ
UzNfUEdNQVNLX01BU0tYCTB4MDAwMDE4MDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzRLCQkweDAw
MDAwMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18xNksJMHgwMDAwNjAwMAorI2RlZmluZQlNSVBT
M19QR01BU0tfNjRLCTB4MDAwMWUwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzI1NksJMHgwMDA3
ZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMU0JCTB4MDAxZmUwMDAKKyNkZWZpbmUJTUlQUzNf
UEdNQVNLXzRNCQkweDAwN2ZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18xNk0JMHgwMWZmZTAw
MAorI2RlZmluZQlNSVBTM19QR01BU0tfNjRNCTB4MDdmZmUwMDAKKyNkZWZpbmUJTUlQUzNfUEdN
QVNLXzI1Nk0JMHgxZmZmZTAwMAorCiAjZW5kaWYgLyogIV9NQUNISU5FX1BURV9IXyAqLwpkaWZm
IC0tZ2l0IGEvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmggYi9zeXMvbWlwcy9pbmNsdWRlL3BtYXAu
aAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3BtYXAuaAorKysgYi9zeXMvbWlwcy9pbmNsdWRlL3Bt
YXAuaApAQCAtNDgsNiArNDgsNyBAQAogCiAjaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+CiAj
aW5jbHVkZSA8bWFjaGluZS9wdGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2lmIGRl
ZmluZWQoX19taXBzX24zMikgfHwgZGVmaW5lZChfX21pcHNfbjY0KSAvKiBQSFlTQUREUl82NEJJ
VCAqLwogI2RlZmluZQlOS1BUCQkyNTYJLyogbWVtID4gNEcsIHZtX3BhZ2Vfc3RhcnR1cCBuZWVk
cyBtb3JlIEtQVHMgKi8KQEAgLTYyLDE1ICs2MywyNCBAQAogI2luY2x1ZGUgPHN5cy9fbG9jay5o
PgogI2luY2x1ZGUgPHN5cy9fbXV0ZXguaD4KIAorI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorI2lu
Y2x1ZGUgPHZtL192bV9yYWRpeC5oPgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLworCiAv
KgogICogUG1hcCBzdHVmZgogICovCiBzdHJ1Y3QgcHZfZW50cnk7CiBzdHJ1Y3QgcHZfY2h1bms7
CiAKIHN0cnVjdCBtZF9wYWdlIHsKLQlpbnQgcHZfZmxhZ3M7CiAJVEFJTFFfSEVBRCgsIHB2X2Vu
dHJ5KSBwdl9saXN0OworCXZtX21lbWF0dHJfdCBwdl9tZW1hdHRyOworI2lmZGVmIE1JUFM2NF9O
RVdfUE1BUAorCWludCBwdl9nZW47CisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCWlu
dCBwdl9mbGFnczsKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLwogfTsKIAogI2RlZmlu
ZQlQVl9UQUJMRV9SRUYJCTB4MDIJLyogcmVmZXJlbmNlZCAqLwpAQCAtODEsMTUgKzkxLDE4IEBA
CiAjZGVmaW5lCUFTSURHRU5fTUFTSwkJKCgxIDw8IEFTSURHRU5fQklUUykgLSAxKQogCiBzdHJ1
Y3QgcG1hcCB7CisJc3RydWN0IG10eCBwbV9tdHg7CiAJcGRfZW50cnlfdCAqcG1fc2VndGFiOwkv
KiBLVkEgb2Ygc2VnbWVudCB0YWJsZSAqLwogCVRBSUxRX0hFQUQoLCBwdl9jaHVuaykJcG1fcHZj
aHVuazsJLyogbGlzdCBvZiBtYXBwaW5ncyBpbiBwbWFwICovCiAJY3B1c2V0X3QJcG1fYWN0aXZl
OwkJLyogYWN0aXZlIG9uIGNwdXMgKi8KIAlzdHJ1Y3QgewogCQl1X2ludDMyX3QgYXNpZDpBU0lE
X0JJVFM7CS8qIFRMQiBhZGRyZXNzIHNwYWNlIHRhZyAqLwogCQl1X2ludDMyX3QgZ2VuOkFTSURH
RU5fQklUUzsJLyogaXRzIGdlbmVyYXRpb24gbnVtYmVyICovCiAJfSAgICAgIHBtX2FzaWRbTUFY
U01QQ1BVXTsKIAlzdHJ1Y3QgcG1hcF9zdGF0aXN0aWNzIHBtX3N0YXRzOwkvKiBwbWFwIHN0YXRp
c3RpY3MgKi8KLQlzdHJ1Y3QgbXR4IHBtX210eDsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwlz
dHJ1Y3Qgdm1fcmFkaXggcG1fcm9vdDsJCS8qIHNwYXJlIHBhZ2UgdGFibGUgcGFnZXMgKi8KKyNl
bmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KIH07CiAKIHR5cGVkZWYgc3RydWN0IHBtYXAgKnBt
YXBfdDsKQEAgLTEyMSw3ICsxMzQsNyBAQAogICovCiB0eXBlZGVmIHN0cnVjdCBwdl9lbnRyeSB7
CiAJdm1fb2Zmc2V0X3QgcHZfdmE7CS8qIHZpcnR1YWwgYWRkcmVzcyBmb3IgbWFwcGluZyAqLwot
CVRBSUxRX0VOVFJZKHB2X2VudHJ5KSBwdl9saXN0OworCVRBSUxRX0VOVFJZKHB2X2VudHJ5KSBw
dl9uZXh0OwogfSAgICAgICAqcHZfZW50cnlfdDsKIAogLyoKQEAgLTE2OSw2ICsxODIsNyBAQAog
CiB2b2lkIHBtYXBfYm9vdHN0cmFwKHZvaWQpOwogdm9pZCAqcG1hcF9tYXBkZXYodm1fcGFkZHJf
dCwgdm1fc2l6ZV90KTsKKy8vYm9vbGVhbl90IHBtYXBfcGFnZV9pc19tYXBwZWQodm1fcGFnZV90
IG0pOwogdm9pZCBwbWFwX3VubWFwZGV2KHZtX29mZnNldF90LCB2bV9zaXplX3QpOwogdm1fb2Zm
c2V0X3QgcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpOwogdm9pZCBwbWFwX2tlbnRl
cih2bV9vZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSk7CkBAIC0xNzgsNiArMTkyLDcgQEAKIHZv
aWQgcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUodm1fcGFkZHJfdCBwYSk7CiB2b2lkIHBtYXBf
Zmx1c2hfcHZjYWNoZSh2bV9wYWdlX3QgbSk7CiBpbnQgcG1hcF9lbXVsYXRlX21vZGlmaWVkKHBt
YXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitpbnQgcG1hcF9lbXVsYXRlX3JlZmVyZW5jZWQo
cG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKTsKIHZvaWQgcG1hcF9wYWdlX3NldF9tZW1hdHRy
KHZtX3BhZ2VfdCwgdm1fbWVtYXR0cl90KTsKIAogI2VuZGlmCQkJCS8qIF9LRVJORUwgKi8KZGlm
ZiAtLWdpdCBhL3N5cy9taXBzL2luY2x1ZGUvcGFyYW0uaCBiL3N5cy9taXBzL2luY2x1ZGUvcGFy
YW0uaAotLS0gYS9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgKKysrIGIvc3lzL21pcHMvaW5jbHVk
ZS9wYXJhbS5oCkBAIC0xNjMsMTcgKzE2MywzOCBAQAogCiAjZGVmaW5lCU1BWERVTVBQR1MJCTEJ
CS8qIHh4eDogd2h5IGlzIHRoaXMgb25seSBvbmU/ICovCiAKKyNpZmRlZiBLU1RBQ0tfTEFSR0Vf
UEFHRQorLyoKKyAqIEZvciBhIGxhcmdlIGtlcm5lbCBzdGFjayBwYWdlIHRoZSBLU1RBQ0tfU0la
RSBuZWVkcyB0byBiZSBhIHBhZ2Ugc2l6ZQorICogc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSAo
ZS5nLiAxNkspLgorICovCisjZGVmaW5lCUtTVEFDS19TSVpFCQkoMSA8PCAxNCkJLyogU2luZ2xl
IDE2SyBwYWdlICovCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJS1NUQUNLX1NJWkUKKyNkZWZp
bmUJS1NUQUNLX1BBR0VfTUFTSwkoS1NUQUNLX1BBR0VfU0laRSAtIDEpCisjZGVmaW5lCUtTVEFD
S19QQUdFUwkJKEtTVEFDS19TSVpFIC8gUEFHRV9TSVpFKQorI2RlZmluZQlLU1RBQ0tfVExCTUFT
S19NQVNLCSgoS1NUQUNLX1BBR0VfTUFTSyA+PiAoVExCTUFTS19TSElGVCAtIDEpKSBcCisJCQkJ
CTw8IFRMQk1BU0tfU0hJRlQpCisjZGVmaW5lCUtTVEFDS19HVUFSRF9QQUdFUwkoKEtTVEFDS19Q
QUdFX1NJWkUgKiAyKSAvIFBBR0VfU0laRSkKKworI2Vsc2UgLyogISBLU1RBQ0tfTEFSR0VfUEFH
RSAqLworCiAvKgogICogVGhlIGtlcm5lbCBzdGFjayBuZWVkcyB0byBiZSBhbGlnbmVkIG9uIGEg
KFBBR0VfU0laRSAqIDIpIGJvdW5kYXJ5LgogICovCiAjZGVmaW5lCUtTVEFDS19QQUdFUwkJMgkv
KiBrZXJuZWwgc3RhY2sgKi8KKyNkZWZpbmUJS1NUQUNLX1NJWkUJCShLU1RBQ0tfUEFHRVMgKiBQ
QUdFX1NJWkUpCisjZGVmaW5lCUtTVEFDS19QQUdFX1NJWkUJUEFHRV9TSVpFCisjZGVmaW5lCUtT
VEFDS19QQUdFX01BU0sJKFBBR0VfU0laRSAtIDEpCiAjZGVmaW5lCUtTVEFDS19HVUFSRF9QQUdF
UwkyCS8qIHBhZ2VzIG9mIGtzdGFjayBndWFyZDsgMCBkaXNhYmxlcyAqLworI2VuZGlmIC8qICEg
S1NUQUNLX0xBUkdFX1BBR0UgKi8KIAogLyoKICAqIE1hY2ggZGVyaXZlZCBjb252ZXJzaW9uIG1h
Y3JvcwogICovCiAjZGVmaW5lCXJvdW5kX3BhZ2UoeCkJCSgoKHgpICsgUEFHRV9NQVNLKSAmIH5Q
QUdFX01BU0spCiAjZGVmaW5lCXRydW5jX3BhZ2UoeCkJCSgoeCkgJiB+UEFHRV9NQVNLKQorI2Rl
ZmluZQlyb3VuZF8ybXBhZ2UoeCkJCSgoKHgpICsgUERSTUFTSykgJiB+UERSTUFTSykKKyNkZWZp
bmUJdHJ1bmNfMm1wYWdlKHgpCQkoKHgpICYgflBEUk1BU0spCiAKICNkZWZpbmUJYXRvcCh4KQkJ
CSgoeCkgPj4gUEFHRV9TSElGVCkKICNkZWZpbmUJcHRvYSh4KQkJCSgoeCkgPDwgUEFHRV9TSElG
VCkKZGlmZiAtLWdpdCBhL3N5cy9jb25mL29wdGlvbnMubWlwcyBiL3N5cy9jb25mL29wdGlvbnMu
bWlwcwotLS0gYS9zeXMvY29uZi9vcHRpb25zLm1pcHMKKysrIGIvc3lzL2NvbmYvb3B0aW9ucy5t
aXBzCkBAIC05NywxMSArOTcsMjQgQEAKIEJFUklfTEFSR0VfVExCCQkJb3B0X2dsb2JhbC5oCiAK
ICMKKyMgVXNlIHRoZSBuZXcgcG1hcCBmb3IgTUlQUzY0IHRoYXQgaW5jbHVkZXMgcmVmZXJlbmNl
IGJpdCBlbXVsYXRpb24KKyMgYW5kIHN1cGVycGFnZSBzdXBwb3J0LgorIworTUlQUzY0X05FV19Q
TUFQCQkJb3B0X2dsb2JhbC5oCisKKyMKICMgT3B0aW9ucyB0aGF0IGNvbnRyb2wgdGhlIE5ldEZQ
R0EtMTBHIEVtYmVkZGVkIENQVSBFdGhlcm5ldCBDb3JlLgogIwogTkYxMEJNQUNfNjRCSVQJCQlv
cHRfbmV0ZnBnYS5oCiAKICMKKyMgT3B0aW9ucyBmb3IgaGFyZHdhcmUgd2l0aCBQYWdlTWFzayBy
ZWdpc3RlciBzdXBwb3J0CisjCisKKyMgVXNlIG9uZSBsYXJnZSBwYWdlIChjdXJyZW50bHkgMTZL
KSBmb3IgdGhlIGtlcm5lbCB0aHJlYWQgc3RhY2sKK0tTVEFDS19MQVJHRV9QQUdFICAgCQlvcHRf
Z2xvYmFsLmgKKworIwogIyBPcHRpb25zIHRoYXQgY29udHJvbCB0aGUgQXRoZXJvcyBTb0MgcGVy
aXBoZXJhbHMKICMKIEFSR0VfREVCVUcJCQlvcHRfYXJnZS5oCmRpZmYgLS1naXQgYS9zeXMvY29u
Zi9maWxlcy5taXBzIGIvc3lzL2NvbmYvZmlsZXMubWlwcwotLS0gYS9zeXMvY29uZi9maWxlcy5t
aXBzCisrKyBiL3N5cy9jb25mL2ZpbGVzLm1pcHMKQEAgLTMxLDcgKzMxLDggQEAKIG1pcHMvbWlw
cy9uZXh1cy5jCQkJc3RhbmRhcmQKIG1pcHMvbWlwcy9vZndfbWFjaGRlcC5jCQkJb3B0aW9uYWwJ
ZmR0CiBtaXBzL21pcHMvcG1fbWFjaGRlcC5jCQkJc3RhbmRhcmQKLW1pcHMvbWlwcy9wbWFwLmMJ
CQlzdGFuZGFyZAorbWlwcy9taXBzL3BtYXAuYwkJCW9wdGlvbmFsCSFtaXBzNjRfbmV3X3BtYXAK
K21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCQkJb3B0aW9uYWwJbWlwczY0X25ld19wbWFwCiBtaXBz
L21pcHMvcHRyYWNlX21hY2hkZXAuYwkJc3RhbmRhcmQKIG1pcHMvbWlwcy9zY19tYWNoZGVwLmMJ
CQlzdGFuZGFyZAogbWlwcy9taXBzL3N0YWNrX21hY2hkZXAuYwkJb3B0aW9uYWwJZGRiIHwgc3Rh
Y2sKZGlmZiAtLWdpdCBhL2xpYi9saWJrdm0va3ZtX21pcHMuaCBiL2xpYi9saWJrdm0va3ZtX21p
cHMuaAotLS0gYS9saWIvbGlia3ZtL2t2bV9taXBzLmgKKysrIGIvbGliL2xpYmt2bS9rdm1fbWlw
cy5oCkBAIC00OSw3ICs0OSw3IEBACiAjZGVmaW5lCU1JUFM2NF9LU0VHMV9FTkQJMHhmZmZmZmZm
ZmJmZmZmZmZmCiAKICNkZWZpbmUJTUlQUzMyX1BGTl9NQVNLCQkoMHgxRkZGRkZDMCkKLSNkZWZp
bmUJTUlQUzY0X1BGTl9NQVNLCQkweDNGRkZGRkZDMAorI2RlZmluZQlNSVBTNjRfUEZOX01BU0sJ
CTB4RkZGRkZGQzAKICNkZWZpbmUJTUlQU19QRk5fU0hJRlQJCSg2KQogCiAjZGVmaW5lCU1JUFNf
UEZOX1RPX1BBKHBmbikJKCgocGZuKSA+PiBNSVBTX1BGTl9TSElGVCkgPDwgTUlQU19QQUdFX1NI
SUZUKQoK


--b1_17227ff5cee59ab31c13030b2aea797d--



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