Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 27 Aug 2017 13:51:33 +0000
From:      "iateaca (Teaca)" <phabric-noreply@FreeBSD.org>
To:        freebsd-virtualization@freebsd.org
Subject:   [Differential] D5473: ATA/ATAPI6 device emulation in bhyve
Message-ID:  <20774e3b9cd644f6a8fda9289c7404d7@localhost.localdomain>
In-Reply-To: <differential-rev-PHID-DREV-2t5o3zrdohcj7mowtyki-req@FreeBSD.org>
References:  <differential-rev-PHID-DREV-2t5o3zrdohcj7mowtyki-req@FreeBSD.org>

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

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

aWF0ZWFjYSB1cGRhdGVkIHRoaXMgcmV2aXNpb24gdG8gRGlmZiAzMjQyMi4KaWF0ZWFjYSBhZGRl
ZCBhIGNvbW1lbnQuCgoKICByZW1vdmUgc2VjdG9yc19wZXJfYmxvY2sgZmllbGQgZnJvbSB0aGUg
YXRhIGNoYW5uZWwKICBhbGxvdyBzZWNjb3VudCB0byBiZSBzZXQgc21hbGxlciB0aGFuIEFUQV9T
RUNUT1JTX1BFUl9CTE9DSwoKQ0hBTkdFUyBTSU5DRSBMQVNUIFVQREFURQogIGh0dHBzOi8vcmV2
aWV3cy5mcmVlYnNkLm9yZy9ENTQ3Mz92cz0zMjA4MSZpZD0zMjQyMgoKUkVWSVNJT04gREVUQUlM
CiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0Q1NDczCgpBRkZFQ1RFRCBGSUxFUwogIE1h
a2VmaWxlCiAgYXRhLmMKICBwY2lfbHBjLmMKCkVNQUlMIFBSRUZFUkVOQ0VTCiAgaHR0cHM6Ly9y
ZXZpZXdzLmZyZWVic2Qub3JnL3NldHRpbmdzL3BhbmVsL2VtYWlscHJlZmVyZW5jZXMvCgpUbzog
aWF0ZWFjYSwgZ3JlaGFuLCB0eWNob24sIG5lZWwsIG1hdgpDYzogZWRpdG9yX2NhbGxmb3J0ZXN0
aW5nLm9yZywgZnJlZWJzZC12aXJ0dWFsaXphdGlvbi1saXN0Cg==

--b1_20774e3b9cd644f6a8fda9289c7404d7
Content-Type: text/x-patch; charset=utf-8; name="D5473.32422.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="D5473.32422.patch"

ZGlmZiAtLWdpdCBhL3BjaV9scGMuYyBiL3BjaV9scGMuYwotLS0gYS9wY2lfbHBjLmMKKysrIGIv
cGNpX2xwYy5jCkBAIC03Myw2ICs3MywxMSBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqbHBjX3Vh
cnRfbmFtZXNbTFBDX1VBUlRfTlVNXSA9IHsgIkNPTTEiLCAiQ09NMiIgfTsKIAorZXh0ZXJuIGlu
dAorbHBjX2F0YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBjb25zdCBjaGFyICpvcHRzKTsKK3N0
YXRpYyBjb25zdCBjaGFyICpscGNfYXRhMF9vcHRzID0gTlVMTDsKK3N0YXRpYyBjb25zdCBjaGFy
ICpscGNfYXRhMV9vcHRzID0gTlVMTDsKKwogLyoKICAqIExQQyBkZXZpY2UgY29uZmlndXJhdGlv
biBpcyBpbiB0aGUgZm9sbG93aW5nIGZvcm06CiAgKiA8bHBjX2RldmljZV9uYW1lPlssPG9wdGlv
bnM+XQpAQCAtOTUsNiArMTAwLDE2IEBACiAJCQkJZ290byBkb25lOwogCQkJfQogCQl9CisKKwkJ
aWYgKHN0cmNhc2VjbXAobHBjZGV2LCAiYXRhLWhkIikgPT0gMCkgeworCQkJaWYgKHN0clswXSA9
PSAnMCcpCisJCQkJbHBjX2F0YTBfb3B0cyA9IHN0cjsKKwkJCWVsc2UgaWYgKHN0clswXSA9PSAn
MScpCisJCQkJbHBjX2F0YTFfb3B0cyA9IHN0cjsKKworCQkJZXJyb3IgPSAwOworCQkJZ290byBk
b25lOworCQl9CiAJfQogCiBkb25lOgpAQCAtMTk3LDYgKzIxMiwxMSBAQAogCQlzYy0+ZW5hYmxl
ZCA9IDE7CiAJfQogCisJaWYgKGxwY19hdGEwX29wdHMpCisJCWxwY19hdGFfaW5pdChscGNfYnJp
ZGdlLT5waV92bWN0eCwgbHBjX2F0YTBfb3B0cyk7CisJaWYgKGxwY19hdGExX29wdHMpCisJCWxw
Y19hdGFfaW5pdChscGNfYnJpZGdlLT5waV92bWN0eCwgbHBjX2F0YTFfb3B0cyk7CisKIAlyZXR1
cm4gKDApOwogfQogCkBAIC0zNzksNiArMzk5LDggQEAKIAkJcmV0dXJuICgtMSk7CiAJfQogCisJ
bHBjX2JyaWRnZSA9IHBpOworCiAJaWYgKGxwY19pbml0KCkgIT0gMCkKIAkJcmV0dXJuICgtMSk7
CiAKQEAgLTM4OCw4ICs0MTAsNiBAQAogCXBjaV9zZXRfY2ZnZGF0YTgocGksIFBDSVJfQ0xBU1Ms
IFBDSUNfQlJJREdFKTsKIAlwY2lfc2V0X2NmZ2RhdGE4KHBpLCBQQ0lSX1NVQkNMQVNTLCBQQ0lT
X0JSSURHRV9JU0EpOwogCi0JbHBjX2JyaWRnZSA9IHBpOwotCiAJcmV0dXJuICgwKTsKIH0KIApk
aWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtl
ZmlsZQpAQCAtMTEsNiArMTEsNyBAQAogU1JDUz0JXAogCWF0a2JkYy5jCQlcCiAJYWNwaS5jCQkJ
XAorCWF0YS5jCQkJXAogCWJoeXZlcnVuLmMJCVwKIAlibG9ja19pZi5jCQlcCiAJY29uc3BvcnQu
YwkJXApkaWZmIC0tZ2l0IGEvYXRhLmMgYi9hdGEuYwotLS0gYS9hdGEuYworKysgYi9hdGEuYwpA
QCAtMCwwICsxLDI2MDMgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE2IEFsZXggVGVhY2Eg
PGlhdGVhY2FAZnJlZWJzZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycg
QU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0
Lmg+CisjaW5jbHVkZSA8c3lzL2F0YS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1
ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4K
KyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8Y2Ft
L3Njc2kvc2NzaV9hbGwuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3ZtbS5oPgorI2luY2x1ZGUgPHZt
bWFwaS5oPgorCisjaW5jbHVkZSAiYmxvY2tfaWYuaCIKKyNpbmNsdWRlICJiaHl2ZXJ1bi5oIgor
I2luY2x1ZGUgInBjaV9lbXVsLmgiCisjaW5jbHVkZSAicGNpX2lycS5oIgorI2luY2x1ZGUgImlu
b3V0LmgiCisKKworLyoKKyAqIEFUQSBEZWJ1ZyBMb2cKKyAqLworI2RlZmluZQlERUJVR19BVEEJ
CQkxCisjaWYgREVCVUdfQVRBID09IDEKKwordHlwZWRlZiBlbnVtIHsKKwlMT0dfREVCVUcgPSAw
LAorCUxPR19FUlIgPSAxLAorfSBMT0dfTEVWRUw7CisKK3N0YXRpYyBGSUxFICpkYmc7CisKK3N0
YXRpYyB2b2lkIGF0YV9vcGVuX2RiZ19maWxlKHZvaWQpCit7CisJZGJnID0gZm9wZW4oIi90bXAv
Ymh5dmVfYXRhLmxvZyIsICJ3KyIpOworCXJldHVybjsKK30KKworI2RlZmluZSBkcHJpbnQobGV2
ZWwsIGZvcm1hdCwgYXJnLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisJZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXAorCQlpZiAobGV2ZWwgPT0gTE9HX0RFQlVHKSB7ZnByaW50Zihk
YmcsIGZvcm1hdCwgIyNhcmcpO30gICAgICAgXAorCQllbHNlIHtmcHJpbnRmKGRiZywgIkxPR19F
UlI6ICJmb3JtYXQsICMjYXJnKTt9ICAgICAgICAgICAgICAgXAorCQlmZmx1c2goZGJnKTsgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX13aGlsZSgw
KQorI2Vsc2UKKyNkZWZpbmUgYXRhX29wZW5fZGJnX2ZpbGUoKQk7CisjZGVmaW5lIGRwcmludChs
ZXZlbCwgZm10LCAuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyoKKyAqIEFUQSBk
ZWZpbmVzCisgKi8KKworI2RlZmluZSBQQ0lfQVRBX0NIX1NFUAkJCSc7JworCisvKiBBVEEgQ2hh
bm5lbHMgKi8KKyNkZWZpbmUgQVRBX0NIQU5ORUxTCQkJMHgwMgorI2RlZmluZQlBVEFfWAkJCQkw
eDAwCisjZGVmaW5lCUFUQV9ZCQkJCTB4MDEKKworI2RlZmluZQlBVEFfRFJJVkVTCQkJMHgwMgor
I2RlZmluZQlBVEFfTUFTVEVSCQkJMHgwMAorI2RlZmluZQlBVEFfU0xBVkUJCQkweDAxCisKKyNk
ZWZpbmUJQVRBX0RSSVZFX0FCU0VOVAkJMHhmOAorCisjZGVmaW5lCUFUQV9ERVYodW5pdCkJCQko
KHVuaXQgPiAwKSA/IDB4MTAgOiAwKQorCisjZGVmaW5lIEFUQV9JT1NJWkUJCQkweDA4CisjZGVm
aW5lIEFUQV9DVExJT1NJWkUJCQkweDAxCisjZGVmaW5lIEFUQV9CTUlPU0laRQkJCTB4MDgKKwor
I2RlZmluZQlBVEFfU0VDVE9SX1NJWkUJCQk1MTIKKyNkZWZpbmUJQVRBX1NFQ1RPUlNfUEVSX0JM
T0NLCQkxMjgKKyNkZWZpbmUJQVRBX01BWF9TRUNfQ09VTlQJCTI1NgorI2RlZmluZQlBVEFfQkxP
Q0tfU0laRQkJCShBVEFfU0VDVE9SU19QRVJfQkxPQ0sgKiBBVEFfU0VDVE9SX1NJWkUpCisjZGVm
aW5lCUFUQV9JTkJVRl9TSVpFCQkJKEFUQV9NQVhfU0VDX0NPVU5UICogQVRBX1NFQ1RPUl9TSVpF
KQorI2RlZmluZQlBVEFfTEJBXzI3XzI0X01BU0sJCTB4MGYKKworI2RlZmluZSBBVEFQSV9QQUNL
RVRfU0laRQkJMTIKKyNkZWZpbmUgQVRBUElfQkxPQ0tfU0laRQkJMjA0OAorCisjZGVmaW5lCUFU
QV9XUklURV9NVUxfQ09NUExFVEUJCTAKKyNkZWZpbmUJQVRBX1JFQURfTVVMX0NPTVBMRVRFCQkw
CisKKyNkZWZpbmUJQVRBX0RNQV9NQVhfUFJEX0NPVU5UCQk2NTUzNgorI2RlZmluZQlBVEFfRE1B
X1BSRFRfU0laRQkJNjU1MzYKKyNkZWZpbmUJQVRBX0RNQV9QUkRUX0VPVAkJMHg4MDAwCisKKyNk
ZWZpbmUJQVRBX0RNQV9SRUFECQkJKDApCisjZGVmaW5lCUFUQV9ETUFfV1JJVEUJCQkoMSkKKwor
I2RlZmluZQlBVEFfV19ETUEyCQkJMHgwNAorI2RlZmluZQlBVEFfTU9ERV9QSU80CQkJMHgwMgor
CisjZGVmaW5lCUFUQV9BVEFQSV82CQkJMHg0MAorCisjZGVmaW5lIEFUQVBJX01BR0lDX0xTQgkJ
CTB4MTQKKyNkZWZpbmUgQVRBUElfTUFHSUNfTVNCCQkJMHhlYgorCisvKiBQQ0kgQkFSUyBpZHgg
Ki8KKyNkZWZpbmUJUENJX0JBUjAJCQkwCisjZGVmaW5lCVBDSV9CQVIxCQkJMQorI2RlZmluZQlQ
Q0lfQkFSMgkJCTIKKyNkZWZpbmUJUENJX0JBUjMJCQkzCisjZGVmaW5lCVBDSV9CQVI0CQkJNAor
CisvKiBBVEEgQnVzIE1hc3RlciBSZWdpc3RlciBPZmZzZXRzIGFuZCBWYWx1ZXMqLworI2RlZmlu
ZQlBVEFfQk1DTURfWF9SRUcJCQkweDAwCisjZGVmaW5lCUFUQV9CTUNNRF9ZX1JFRwkJCTB4MDgK
KyNkZWZpbmUJCUFUQV9CTUNNRF9TVEFSVF9TVE9QCTB4MDEKKyNkZWZpbmUJCUFUQV9CTUNNRF9X
UklURV9SRUFECTB4MDgKKworI2RlZmluZQlBVEFfQk1TVEFUX1hfUkVHCQkweDAyCisjZGVmaW5l
CUFUQV9CTVNUQVRfWV9SRUcJCTB4MEEKKyNkZWZpbmUJCUFUQV9CTVNUQVRfQUNUSVZFCTB4MDEK
KyNkZWZpbmUJCUFUQV9CTVNUQVRfRVJST1IJMHgwMgorI2RlZmluZQkJQVRBX0JNU1RBVF9JTlRF
UlJVUFQJMHgwNAorI2RlZmluZQkJQVRBX0JNU1RBVF9NQVNLCQkweDA3CisjZGVmaW5lCQlBVEFf
Qk1TVEFUX0RNQV9NQVNURVIJMHgyMAorI2RlZmluZQkJQVRBX0JNU1RBVF9ETUFfU0xBVkUJMHg0
MAorI2RlZmluZQkJQVRBX0JNU1RBVF9ETUFfU0lNUExFWAkweDgwCisKKyNkZWZpbmUJQVRBX0JN
UFJEVF9YX1JFRwkJMHgwNAorI2RlZmluZQlBVEFfQk1QUkRUX1lfUkVHCQkweDBDCisKKy8qIFRo
ZSBDb21tYW5kIEJsb2NrIHJlZ2lzdGVycyAqLworI2RlZmluZQlBVEFfREFUQV9SRUcJCQkweDAw
CisjZGVmaW5lCUFUQV9FUlJPUl9SRUcJCQkweDAxCisjZGVmaW5lCQlBVEFfRV9JTEkJCTB4MDEg
ICAgLyogaWxsZWdhbCBsZW5ndGggKi8KKyNkZWZpbmUgICAgICAgICBBVEFfRV9BQk9SVCAgICAg
ICAgICAgICAweDA0ICAgIC8qIGNvbW1hbmQgYWJvcnRlZCAqLworI2RlZmluZQlBVEFfRkVBVFVS
RVNfUkVHCQkweDAxCisjZGVmaW5lCUFUQV9TRUNDT1VOVF9SRUcJCTB4MDIKKyNkZWZpbmUJCUFU
QV9JX0NNRAkJMHgwMSAgICAvKiBjbWQgKDEpIHwgZGF0YSAoMCkgKi8KKyNkZWZpbmUJCUFUQV9J
X0lOCQkweDAyICAgIC8qIHJlYWQgKDEpIHwgd3JpdGUgKDApICovCisjZGVmaW5lCQlBVEFfSV9S
RUxFQVNFCQkweDA0ICAgIC8qIHJlbGVhc2VkIGJ1cyAoMSkgKi8KKyNkZWZpbmUJQVRBX0xCQV9M
T1dfUkVHCQkJMHgwMworI2RlZmluZQlBVEFfTEJBX01JRF9SRUcJCQkweDA0CisjZGVmaW5lCUFU
QV9MQkFfSElHSF9SRUcJCTB4MDUKKyNkZWZpbmUJQVRBX0hEREVWU0VMX1JFRwkJMHgwNgorI2Rl
ZmluZQkJQVRBX0RfTEJBCQkweDQwICAgIC8qIHVzZSBMQkEgYWRkcmVzc2luZyAqLworI2RlZmlu
ZQkJQVRBX0RfSUJNCQkweGEwICAgIC8qIDUxMiBieXRlIHNlY3RvcnMsIEVDQyAqLworI2RlZmlu
ZQlBVEFfQ09NTUFORF9SRUcJCQkweDA3CisjZGVmaW5lCUFUQV9TVEFUVVNfUkVHCQkJMHgwNwor
I2RlZmluZQkJQVRBX1NfQlVTWQkJMHg4MCAgICAvKiBidXN5ICovCisjZGVmaW5lCQlBVEFfU19S
RUFEWQkJMHg0MCAgICAvKiBkcml2ZSByZWFkeSAqLworI2RlZmluZQkJQVRBX1NfRFdGCQkweDIw
ICAgIC8qIGRyaXZlIHdyaXRlIGZhdWx0ICovCisjZGVmaW5lCQlBVEFfU19EUlEJCTB4MDggICAg
LyogZGF0YSByZXF1ZXN0ICovCisjZGVmaW5lCQlBVEFfU19EU0MJCTB4MTAgICAgLyogZHJpdmUg
c2VlayBjb21wbGV0ZWQgKi8KKyNkZWZpbmUJCUFUQV9TX0VSUk9SCQkweDAxICAgIC8qIGVycm9y
ICovCisKKy8qIFRoZSBDb250cm9sIEJsb2NrIHJlZ2lzdGVycyAqLworI2RlZmluZQlBVEFfQ09O
VFJPTF9SRUcJCQkweDBDCisjZGVmaW5lCQlBVEFfQV9JRFMJCTB4MDIgICAgLyogZGlzYWJsZSBp
bnRlcnJ1cHRzICovCisjZGVmaW5lCQlBVEFfQV9SRVNFVAkJMHgwNCAgICAvKiBSRVNFVCBjb250
cm9sbGVyICovCisjZGVmaW5lCUFUQV9BTFRTVEFUVVNfUkVHCQkweDBDCisKKyNkZWZpbmUgUkVB
RF9UT0MJCQkweDQzCisKK3N0cnVjdCBhdGFfY2hhbm5lbDsKKwordHlwZWRlZiB2b2lkICgqYXRh
X2ludHJfZnVuY190KSh2b2lkICphcmcpOwordHlwZWRlZiB2b2lkICgqYXRhX3Bpb19lbmRfdHJh
bnNmZXJfZnVuY190KShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworCit0eXBlZGVmIGVu
dW0geworCUFUQV9IRCwKKwlBVEFQSV9DRCwKKwlBVEFfRFJJVkVfRU1QVFkKK30gYXRhX2RyaXZl
X3R5cGU7CisKKy8qCisgKiBBVEEgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCBhdGFfcGlv
X2J1ZmZlciB7CisJdWludDhfdCAgZGF0YVtBVEFfSU5CVUZfU0laRV07CisJdWludDY0X3QgY3Vy
cmVudF9wb3M7Cit9OworCitzdHJ1Y3QgYXRhX3Bpb19zZXR1cCB7CisJdWludDhfdCB1c2Vfd29y
ZDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgYnJlcTsKKwlzdHJ1Y3QgYXRhX3Bpb19idWZmZXIgcGlv
X2J1ZmZlcjsKKworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJYXRhX3Bpb19lbmRfdHJhbnNm
ZXJfZnVuY190IGVuZF90cmFuc2ZlcjsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWw7Cit9
OworCitzdHJ1Y3QgcHJkX2VudHJ5IHsKKwl1aW50MzJfdCBwcmRfYWRkcmVzczsKKwl1aW50MTZf
dCBieXRlX2NvdW50OworCXVpbnQxNl90IHZlbmRvcl9zcGVjaWZpYzsKK30gX19hdHRyaWJ1dGVf
XygoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNhY3Rpb24geworCXN0
cnVjdCBibG9ja2lmX3JlcSBicmVxOworCXVpbnQ4X3QgaXNfZW90OworCXVpbnQ4X3Qgc3RhcnRl
ZDsKKwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDY0X3QgbmJ5dGVzOworCXVpbnQ4X3QgIG9wX2Rp
cjsKK307CisKK3N0cnVjdCBhdGFfZHJpdmUgeworCS8qIEFUQSBEcml2ZSBSZWdpc3RlcnMgKi8K
KworCS8qIHRoZSBpbyBwb3J0IHJhbmdlIHNpemUgPSAweDA4ICovCisJdWludDhfdCBkYXRhOwor
CXVpbnQ4X3QgZXJyb3I7CisJdWludDhfdCBmZWF0dXJlczsKKwl1aW50OF90IHNlY2NvdW50Owor
CXVpbnQ4X3QgbGJhX2xvdzsKKwl1aW50OF90IGxiYV9taWQ7CisJdWludDhfdCBsYmFfaGlnaDsK
Kwl1aW50OF90IGhkZGV2c2VsOworCXVpbnQ4X3QgY29tbWFuZDsKKwl1aW50OF90IHN0YXR1czsK
KworCS8qIHRoZSBhbHRwb3J0IHJhbmdlIHNpemUgPSAweDAxICovCisJdWludDhfdCBhbHRzdGF0
dXM7CisKKwlhdGFfZHJpdmVfdHlwZSB0eXBlOworCXVpbnQxNl90IGJ5dGVfY291bnQ7CisJdWlu
dDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ4X3QgaXJxX2Rpc2FibGVkOwor
CXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0OworCXN0cnVjdCBhdGFfcGlvX3NldHVwIHBpb19z
ZXR1cDsKK307CisKK3N0cnVjdCBhdGFfY2hhbm5lbCB7CisJLyogQVRBIENoYW5uZWwgU3RhdGUg
VmFyaWFibGVzICovCisJdWludDMyX3Qgc2l6ZTsKKwl1aW50OF90IGludGVyZmFjZTsKKwl1aW50
OF90IGRyaXZlOworCXVpbnQ4X3QgaGFzX3NsYXZlOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90
IHVzZV8xNmJpdDsKKworCXN0cnVjdCBibG9ja2lmX3JlcSBmbHVzaF9icmVxOworCisJc3RydWN0
IGF0YV9kcml2ZSBkcml2ZXNbQVRBX0RSSVZFU107CisKKwlzdHJ1Y3Qgdm1jdHggKnZtX2N0eDsK
Kwl2b2lkICpwcl9zYzsKKworCS8qIEludGVycnVwdHMgY2FsbGJhY2tzIChQQ0kgb3IgTFBDKSAq
LworCWF0YV9pbnRyX2Z1bmNfdCBpbnRyX2Fzc2VydDsKKwlhdGFfaW50cl9mdW5jX3QgaW50cl9k
ZWFzc2VydDsKKwl1aW50OF90IGxpbnRyOworfTsKKworc3RydWN0IHBjaV9hdGFfc29mdGMgewor
CS8qIEFUQSBCdXMgTWFzdGVyIFJlZ2lzdGVyICovCisJdWludDhfdCAgY21kW0FUQV9DSEFOTkVM
U107CisJdWludDhfdCAgc3RhdFtBVEFfQ0hBTk5FTFNdOworCXVpbnQzMl90IHByZHRbQVRBX0NI
QU5ORUxTXTsKKworCXN0cnVjdCBwY2lfYXRhX2RtYV90cmFuc2FjdGlvbiBkbWFfdHJhbnNhY3Rp
b25zW0FUQV9DSEFOTkVMU107CisKKwlzdHJ1Y3QgcGNpX2Rldmluc3QgKmFzY19waTsKKwlzdHJ1
Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWxzW0FUQV9DSEFOTkVMU107Cit9OworCitzdHJ1Y3QgbHBj
X2F0YV9zb2Z0YyB7CisJc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsOworCWludCBpcnE7CisJ
aW50IGJhc2VfYWRkcl9pbzsKKwlpbnQgYmFzZV9hZGRyX2lvY3RsOworCWNvbnN0IGNoYXIgKm5h
bWVfaW87CisJY29uc3QgY2hhciAqbmFtZV9pb2N0bDsKK307CisKKworLyoKKyAqIEFUQSBtb2R1
bGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkCithdGFfaXJxX3JhaXNl
KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2lycV9sb3dl
cihzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworCitzdGF0aWMgYXRhX2RyaXZlX3R5cGUK
K2F0YV9kcml2ZV90eXBlX2J5X25hbWUoY2hhciAqZHJpdmVfbmFtZSk7CitzdGF0aWMgaW50Cith
dGFfcGFyc2VfcGFyYW1zKGNvbnN0IGNoYXIgKm9wdHMsIGludCAqY2hhbm5lbCwgY2hhciAqZGlz
a19tYXN0ZXIsCisJCSBjaGFyICpkaXNrX3NsYXZlLCB1aW50OF90ICpoYXNfc2xhdmUpOworc3Rh
dGljIHN0cnVjdCBhdGFfY2hhbm5lbCAqCithdGFfaW5pdChzdHJ1Y3Qgdm1jdHggKmN0eCwgYXRh
X2ludHJfZnVuY190IGludHJfYXNzZXJ0LCBhdGFfaW50cl9mdW5jX3QgaW50cl9kZWFzc2VydCwg
dm9pZCAqcHJfc2MsCisJIGNvbnN0IGNoYXIgKm9wdHMsIHVpbnQ4X3QgaXNhX2F0KTsKKworc3Rh
dGljIHZvaWQKK2F0YV9zcnN0KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMg
dm9pZAorYXRhX2luaXRpYWxpemVfaWRlbnQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsK
K3N0YXRpYyB2b2lkCithdGFfYXRhcGlfaW5pdGlhbGl6ZV9pZGVudChzdHJ1Y3QgYXRhX2NoYW5u
ZWwgKmNoYW5uZWwpOworCitzdGF0aWMgaW50CithdGFfY2hhbm5lbF9pc19vayhzdHJ1Y3QgYXRh
X2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3QgY2gpOworc3RhdGljIGludAorYXRhX3NlbGVjdF9k
cml2ZV9pc19vayhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0
YV9zZXRfc3RhdHVzX29rKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9p
ZAorYXRhX3NldF9kYXRhX2Jsb2NrX3JlYWR5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7
CitzdGF0aWMgdm9pZAorYXRhX2NvbW1hbmRfYWJvcnRlZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNo
YW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9zZXRfc2lnbmF0dXJlKHN0cnVjdCBhdGFfZHJpdmUg
KmRyaXZlKTsKKworc3RhdGljIHZvaWQKK2F0YV9hZGRyZXNzaW5nX3NlY19jb3VudChzdHJ1Y3Qg
YXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQxNl90ICpwX3NlY3Rvcl9jb3VudCk7CitzdGF0aWMg
dm9pZAorYXRhX2FkZHJlc3NpbmdfMjhfbGJhKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwg
dWludDMyX3QgKnBfbGJhX2FkZHJlc3MpOworCitzdGF0aWMgdm9pZAorYXRhX2luaXRfYmxvY2tf
cmVxdWVzdChzdHJ1Y3QgYmxvY2tpZl9yZXEgKmJyZXEsIHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hh
bm5lbCwKKwkJICAgICAgIHVpbnQ2NF90IG9mZnNldCwgdWludDY0X3QgbmJ5dGVzLCB2b2lkICpi
dWZmZXIpOworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfYmxvY2tfcmVxdWVzdChzdHJ1Y3QgYmxv
Y2tpZl9yZXEgKnJlcSwgaW50IGVycik7CisKK3N0YXRpYyB2b2lkCithdGFfcGlvX2RvX3RyYW5z
ZmVyKHN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAsIHVpbnQ2NF90IHNpemVfdHJhbnNm
ZXIsCisJCSAgICAgYXRhX3Bpb19lbmRfdHJhbnNmZXJfZnVuY190IGVuZF90cmFuc2ZlciwgdWlu
dDhfdCB1c2Vfd29yZCk7CitzdGF0aWMgaW50CithdGFfcGlvX2luX3Byb2dyZXNzKHN0cnVjdCBh
dGFfcGlvX3NldHVwICpwaW9fc2V0dXApOworc3RhdGljIHVpbnQ4X3QgKgorYXRhX3Bpb19nZXRf
YnVmZmVyX2RhdGEoc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCk7CitzdGF0aWMgdm9p
ZAorYXRhX3Bpb19jaGVja19lbmRfdHJhbnNmZXIoc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19z
ZXR1cCk7CitzdGF0aWMgdWludDMyX3QKK2F0YV9waW9fZ2V0X3VpbnQoc3RydWN0IGF0YV9waW9f
c2V0dXAgKnBpb19zZXR1cCk7CitzdGF0aWMgdm9pZAorYXRhX3Bpb19wdXRfdWludChzdHJ1Y3Qg
YXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwLCB1aW50MzJfdCB3cml0ZV92YWx1ZSk7CitzdGF0aWMg
dm9pZAorYXRhX3Bpb19nZW5lcmljX2VuZF90cmFuc2ZlcihzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNo
YW5uZWwpOworCitzdGF0aWMgdm9pZAorYXRhX3JlYWRfbXVsdGlwbGVfYmxvY2tfZG9uZShzdHJ1
Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV93cml0ZV9tdWx0aXBs
ZV9ibG9ja19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyB2b2lk
CithdGFfYXRhcGlfaGFuZGxlX3JlYWRfZG9uZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwp
OworCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9pZGVudGlmeShzdHJ1Y3QgYXRhX2NoYW5uZWwg
KmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfc2V0ZmVhdHVyZXMoc3RydWN0IGF0
YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX3NldF9tdWx0aShz
dHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfcmVh
ZF9tdWx0aXBsZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0
YV9oYW5kbGVfcmVhZF92ZXJpZnkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRp
YyB2b2lkCithdGFfaGFuZGxlX3dyaXRlX211bHRpcGxlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hh
bm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9kbWEoc3RydWN0IGF0YV9jaGFubmVsICpj
aGFubmVsLCB1aW50OF90IG9wX2Rpcik7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9mbHVzaGNh
Y2hlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRs
ZV9zZWVrKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hh
bmRsZV9hdGFwaV9pZGVudGlmeShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGlj
IHZvaWQKK2F0YV9oYW5kbGVfcGFja2V0X2NtZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwp
Oworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfY21kKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l
bCwgdWludDhfdCBjbWQpOworCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2RhdGFfcmVxdWVzdChz
dHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9jbWRf
ZG9uZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9hdGFw
aV9oYW5kbGVfaW5xdWlyeShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3QgKnBh
Y2tldCk7CitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2NhcGFjaXR5KHN0cnVj
dCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KTsKK3N0YXRpYyB2b2lkCith
dGFfYXRhcGlfaGFuZGxlX3JlYWRfdG9jKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWlu
dDhfdCAqcGFja2V0KTsKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfaGFuZGxlX3JlYWQoc3RydWN0
IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50OF90ICpwYWNrZXQpOworc3RhdGljIHZvaWQKK2F0
YV9hdGFwaV9jbWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKKworc3RhdGljIHVpbnQ2
NF90CithdGFfY29tbWFuZF9ibG9ja19yZWFkKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwg
dWludDY0X3Qgb2Zmc2V0KTsKK3N0YXRpYyB2b2lkCithdGFfY29tbWFuZF9ibG9ja193cml0ZShz
dHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsCisJCXVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUs
IHVpbnQ2NF90IHZhbHVlKTsKKworc3RhdGljIHVpbnQ2NF90CithdGFfYWx0c3RhdHVzX3JlYWQo
c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfY29udHJvbF93
cml0ZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsCisJCWludCBzaXplLCB1aW50NjRfdCB2
YWx1ZSk7CisKKy8qCisgKiBQQ0kgQVRBIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworICovCitzdGF0
aWMgdm9pZAorcGNpX2F0YV9pbnRyX2Fzc2VydCh2b2lkICphcmcpOworc3RhdGljIHZvaWQKK3Bj
aV9hdGFfaW50cl9kZWFzc2VydCh2b2lkICphcmcpOworCitzdGF0aWMgaW50CitwY2lfYXRhX3Bh
cnNlX3BhcmFtcyhjb25zdCBjaGFyICpvcHRzLCBjaGFyICpvcHQwLCBjaGFyICpvcHQxLCB1aW50
OF90ICpucl9jaGFubmVscyk7CitzdGF0aWMgaW50CitwY2lfYXRhX2luaXQoc3RydWN0IHZtY3R4
ICpjdHgsIHN0cnVjdCBwY2lfZGV2aW5zdCAqcGksIGNoYXIgKm9wdHMsIGludCBhdGFwaSk7Citz
dGF0aWMgaW50CitwY2lfYXRhX2hkX2luaXQoc3RydWN0IHZtY3R4ICpjdHgsIHN0cnVjdCBwY2lf
ZGV2aW5zdCAqcGksIGNoYXIgKm9wdHMpOworCitzdGF0aWMgdm9pZAorcGNpX2F0YV9kbWFfc3Rh
cnQoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50OF90IGNoKTsKK3N0YXRpYyB2b2lkCitw
Y2lfYXRhX2RtYV9zdG9wKHN0cnVjdCBwY2lfYXRhX3NvZnRjICpzYywgdWludDhfdCBjaCk7Citz
dGF0aWMgdWludDY0X3QKK3BjaV9hdGFfYnVzX21hc3Rlcl9yZWFkKHN0cnVjdCBwY2lfYXRhX3Nv
ZnRjICpzYywgdWludDY0X3Qgb2Zmc2V0KTsKK3N0YXRpYyB2b2lkCitwY2lfYXRhX2J1c19tYXN0
ZXJfd3JpdGUoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLAorCQl1aW50NjRfdCBvZmZzZXQsIGlu
dCBzaXplLCB1aW50NjRfdCB2YWx1ZSk7CisKK3N0YXRpYyB1aW50NjRfdAorcGNpX2F0YV9yZWFk
KHN0cnVjdCB2bWN0eCAqY3R4LCBpbnQgdmNwdSwgc3RydWN0IHBjaV9kZXZpbnN0ICpwaSwgaW50
IGJhcmlkeCwKKwkJdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZAorcGNp
X2F0YV93cml0ZShzdHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsIHN0cnVjdCBwY2lfZGV2aW5z
dCAqcGksCisJCWludCBiYXJpZHgsIHVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUsIHVpbnQ2NF90
IHZhbHVlKTsKKworLyoKKyAqIExQQyBBVEEgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgKi8KK3N0
YXRpYyB2b2lkCitscGNfYXRhX2ludHJfYXNzZXJ0KHZvaWQgKmFyZyk7CitzdGF0aWMgdm9pZAor
bHBjX2F0YV9pbnRyX2RlYXNzZXJ0KHZvaWQgKmFyZyk7CisKK2ludAorbHBjX2F0YV9pbml0KHN0
cnVjdCB2bWN0eCAqY3R4LCBjb25zdCBjaGFyICpvcHRzKTsKKworc3RhdGljIGludAorbHBjX2F0
YV9pb19oYW5kbGVyKHN0cnVjdCB2bWN0eCAqY3R4LCBpbnQgdmNwdSwKKwkJICAgaW50IGluLCBp
bnQgcG9ydCwgaW50IGJ5dGVzLCB1aW50MzJfdCAqZWF4LCB2b2lkICphcmcpOworc3RhdGljIGlu
dAorbHBjX2F0YV9pb2N0bF9oYW5kbGVyKHN0cnVjdCB2bWN0eCAqY3R4LCBpbnQgdmNwdSwKKwkJ
ICAgaW50IGluLCBpbnQgcG9ydCwgaW50IGJ5dGVzLCB1aW50MzJfdCAqZWF4LCB2b2lkICphcmcp
OworCisKKy8qCisgKiBBVEEgZ2xvYmFsIGRhdGEKKyAqLworc3RydWN0IHBjaV9kZXZlbXUgcGNp
X2RlX2F0YV9oZCA9IHsKKwkucGVfZW11ID0JImF0YS1oZCIsCisJLnBlX2luaXQgPQlwY2lfYXRh
X2hkX2luaXQsCisJLnBlX2JhcndyaXRlID0JcGNpX2F0YV93cml0ZSwKKwkucGVfYmFycmVhZCA9
CXBjaV9hdGFfcmVhZAorfTsKK1BDSV9FTVVMX1NFVChwY2lfZGVfYXRhX2hkKTsKKworc3RhdGlj
IHN0cnVjdCBscGNfYXRhX3NvZnRjIGxwY19hdGFfc2NbQVRBX0NIQU5ORUxTXSA9IHsKKwl7TlVM
TCwgMTQsIDB4MWYwLCAweDNmNiwgImF0YTBfaW9wb3J0IiwgImF0YTBfaW9jdGxwb3J0In0sCisJ
e05VTEwsIDE1LCAweDE3MCwgMHgzNzYsICJhdGExX2lvcG9ydCIsICJhdGExX2lvY3RscG9ydCJ9
Cit9OworCisKKy8qCisgKiBBVEEgbW9kdWxlIGZ1bmN0aW9uIGRlZmluaXRpb25zCisgKi8KK3N0
YXRpYyB2b2lkCithdGFfaXJxX3JhaXNlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sK
Kwl1aW50OF90IGlycV9kaXNhYmxlZDsKKworCWlycV9kaXNhYmxlZCA9IGNoYW5uZWwtPmRyaXZl
c1tjaGFubmVsLT5kcml2ZV0uaXJxX2Rpc2FibGVkOworCisJaWYgKCFpcnFfZGlzYWJsZWQgJiYg
IWNoYW5uZWwtPmxpbnRyKSB7CisJCWNoYW5uZWwtPmxpbnRyID0gMTsKKwkJY2hhbm5lbC0+aW50
cl9hc3NlcnQoY2hhbm5lbC0+cHJfc2MpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZv
aWQKK2F0YV9pcnFfbG93ZXIoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCWlmIChj
aGFubmVsLT5saW50cikgeworCQljaGFubmVsLT5saW50ciA9IDA7CisJCWNoYW5uZWwtPmludHJf
ZGVhc3NlcnQoY2hhbm5lbC0+cHJfc2MpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGF0
YV9kcml2ZV90eXBlCithdGFfZHJpdmVfdHlwZV9ieV9uYW1lKGNoYXIgKmRyaXZlX25hbWUpCit7
CisJaW50IGksIGxlbjsKKwljaGFyICpleHQgPSBOVUxMOworCisJaWYgKCFkcml2ZV9uYW1lKQor
CQlyZXR1cm4gQVRBX0RSSVZFX0VNUFRZOworCisJbGVuID0gc3RybGVuKGRyaXZlX25hbWUpOwor
CisJZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKGRyaXZlX25hbWVbaV0g
PT0gJy4nKSB7CisJCQlleHQgPSBkcml2ZV9uYW1lICsgaSArIDE7CisJCQlpZiAoc3RyY21wKGV4
dCwgImlzbyIpID09IDApCisJCQkJcmV0dXJuIEFUQVBJX0NEOworCQkJYnJlYWs7CisJCX0KKwl9
CisKKwlyZXR1cm4gQVRBX0hEOworfQorCitzdGF0aWMgaW50CithdGFfcGFyc2VfcGFyYW1zKGNv
bnN0IGNoYXIgKm9wdHMsIGludCAqY2hhbm5lbCwgY2hhciAqZGlza19tYXN0ZXIsCisJCSBjaGFy
ICpkaXNrX3NsYXZlLCB1aW50OF90ICpoYXNfc2xhdmUpCit7CisJdWludDhfdCBsZW47CisJY2hh
ciBwYXJhbVs2NF07CisJY2hhciAqcGFyYW1zWzNdOworCXVpbnQ4X3QgaSwgajsKKwlpbnQgY2g7
CisKKwlwYXJhbXNbMF0gPSBOVUxMOworCXBhcmFtc1sxXSA9IE5VTEw7CisJcGFyYW1zWzJdID0g
TlVMTDsKKworCWlmICghb3B0cykgeworCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9wYXJzZV9wYXJh
bXM6IG9wdHMgc2hvdWxkIGJlIGxpa2U6IFgsTUFTVEVSWyxTTEFWRV1cbiIpOworCQlyZXR1cm4g
LTE7CisJfQorCisJbGVuID0gc3RybGVuKG9wdHMpOworCWlmIChsZW4gPj0gNjQpIHsKKwkJZHBy
aW50KExPR19FUlIsICJhdGFfcGFyc2VfcGFyYW1zOiBBVEEgc3RyaW5nIHBhcmFtIHRvbyBiaWdc
biIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RyY3B5KHBhcmFtLCBvcHRzKTsKKworCWogPSAw
OworCXBhcmFtc1tqXSA9IHBhcmFtOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlp
ZiAocGFyYW1baV0gPT0gJywnKSB7CisJCQlqKys7CisJCQlpZiAoaiA+IDIpIHsKKwkJCQlkcHJp
bnQoTE9HX0VSUiwgImF0YV9wYXJzZV9wYXJhbXM6IHRvIG1hbnkgcGFyYW1zXG4iKTsKKwkJCQly
ZXR1cm4gLTE7CisJCQl9CisJCQlwYXJhbVtpXSA9ICdcMCc7CisJCQlwYXJhbXNbal0gPSBwYXJh
bSArIGkgKyAxOworCQl9CisJfQorCisJY2ggPSBhdG9pKHBhcmFtc1swXSk7CisJaWYgKGNoICE9
IEFUQV9YICYmIGNoICE9IEFUQV9ZKSB7CisJCWRwcmludChMT0dfRVJSLCAiYXRhX3BhcnNlX3Bh
cmFtczogdGhlIGNoYW5uZWwgc2hvdWxkIGJlIDAgb3IgMVxuIik7CisJCXJldHVybiAtMTsKKwl9
CisJKmNoYW5uZWwgPSBjaDsKKworCWlmIChwYXJhbXNbMV0gPT0gTlVMTCB8fCBzdHJsZW4ocGFy
YW1zWzFdKSA+PSAzMikgeworCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9wYXJzZV9wYXJhbXM6IHRo
ZSBuYW1lIG9mIE1BU1RFUiBzaG91bGQgYmUgZ2l2ZW5cbiIpOworCQlyZXR1cm4gLTE7CisJfQor
CXN0cmNweShkaXNrX21hc3RlciwgcGFyYW1zWzFdKTsKKworCWlmIChwYXJhbXNbMl0gIT0gTlVM
TCAmJiBzdHJsZW4ocGFyYW1zWzJdKSA8IDMyKSB7CisJCXN0cmNweShkaXNrX3NsYXZlLCAgcGFy
YW1zWzJdKTsKKwkJKmhhc19zbGF2ZSA9IDE7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworc3Rh
dGljIHN0cnVjdCBhdGFfY2hhbm5lbCAqCithdGFfaW5pdChzdHJ1Y3Qgdm1jdHggKmN0eCwgYXRh
X2ludHJfZnVuY190IGludHJfYXNzZXJ0LCBhdGFfaW50cl9mdW5jX3QgaW50cl9kZWFzc2VydCwg
dm9pZCAqcHJfc2MsCisJIGNvbnN0IGNoYXIgKm9wdHMsIHVpbnQ4X3QgaXNhX2F0KQoreworCWNo
YXIgYmlkZW50W3NpemVvZigiWFg6WDpYOlgiKV07CisJc3RydWN0IGJsb2NraWZfY3R4dCAqYmN0
eHQgPSBOVUxMLCAqYmN0eHRfcyA9IE5VTEw7CisJc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVs
ID0gTlVMTDsKKwlpbnQgcmV0OworCWludCBjaF9hdGEgPSAtMTsKKwljaGFyIGRpc2tfbWFzdGVy
WzMyXTsKKwljaGFyIGRpc2tfc2xhdmVbMzJdOworCXVpbnQ4X3QgaGFzX3NsYXZlID0gMDsKKwlh
dGFfZHJpdmVfdHlwZSBtYXN0ZXJfdHlwZSA9IEFUQV9EUklWRV9FTVBUWTsKKwlhdGFfZHJpdmVf
dHlwZSBzbGF2ZV90eXBlID0gQVRBX0RSSVZFX0VNUFRZOworCisJcmV0ID0gYXRhX3BhcnNlX3Bh
cmFtcyhvcHRzLCAmY2hfYXRhLCBkaXNrX21hc3RlciwgZGlza19zbGF2ZSwgJmhhc19zbGF2ZSk7
CisJaWYgKHJldCAhPSAwKSB7CisJCWRwcmludChMT0dfRVJSLCAiYXRhX2luaXQ6IHNvbWUgZXJy
b3JzIHdpdGggdGhlIGlucHV0IGNoZWNraW5nXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJ
ZHByaW50KExPR19ERUJVRywgImF0YV9pbml0OiBjaF9hdGE6ICVkXG4iLCBjaF9hdGEpOworCisJ
LyoKKwkgKiBBdHRlbXB0IHRvIG9wZW4gdGhlIGJhY2tpbmcgaW1hZ2VzLiBVc2UgdGhlCisJICog
IlBDSS9JU0E6Y2g6ZHJpdmUiIGZvciB0aGUgaWRlbnRpZmllciBzdHJpbmcuCisJICovCisJc25w
cmludGYoYmlkZW50LCBzaXplb2YoYmlkZW50KSwgIiVkOiVkOiVkIiwgaXNhX2F0LCBjaF9hdGEs
IEFUQV9NQVNURVIpOworCWJjdHh0ID0gYmxvY2tpZl9vcGVuKGRpc2tfbWFzdGVyLCBiaWRlbnQp
OworCWlmIChiY3R4dCA9PSBOVUxMKSB7CisJCWdvdG8gb3Blbl9mYWlsOworCX0KKworCW1hc3Rl
cl90eXBlID0gYXRhX2RyaXZlX3R5cGVfYnlfbmFtZShkaXNrX21hc3Rlcik7CisJZHByaW50KExP
R19ERUJVRywgImF0YV9pbml0OiBkaXNrX21hc3RlcjogJXMgdHlwZTogJXNcbiIsCisJICAgICAg
IGRpc2tfbWFzdGVyLCBtYXN0ZXJfdHlwZSA9PSBBVEFfSEQgPyAiYXRhX2hkIiA6ICJhdGFwaV9j
ZCIpOworCisJaWYgKGhhc19zbGF2ZSkgeworCQlzbnByaW50ZihiaWRlbnQsIHNpemVvZihiaWRl
bnQpLCAiJWQ6JWQ6JWQiLCBpc2FfYXQsIGNoX2F0YSwgQVRBX1NMQVZFKTsKKwkJYmN0eHRfcyA9
IGJsb2NraWZfb3BlbihkaXNrX3NsYXZlLCBiaWRlbnQpOworCQlpZiAoYmN0eHRfcyA9PSBOVUxM
KSB7CisJCQlyZXQgPSAxOworCQkJZ290byBvcGVuX2ZhaWw7CisJCX0KKworCQlzbGF2ZV90eXBl
ID0gYXRhX2RyaXZlX3R5cGVfYnlfbmFtZShkaXNrX3NsYXZlKTsKKwkJZHByaW50KExPR19ERUJV
RywgImF0YV9pbml0OiBkaXNrX3NsYXZlOiAlcyB0eXBlOiAlc1xuIiwKKwkJICAgICAgIGRpc2tf
c2xhdmUsIHNsYXZlX3R5cGUgPT0gQVRBX0hEID8gImF0YV9oZCIgOiAiYXRhcGlfY2QiKTsKKwl9
CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IG9wdHM6ICVzLCBhdGFwaTogJWRcbiIs
IG9wdHMsIDApOworCisJY2hhbm5lbCA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGF0YV9jaGFu
bmVsKSk7CisKKwljaGFubmVsLT52bV9jdHggPSBjdHg7CisJY2hhbm5lbC0+aW50ZXJmYWNlID0g
Y2hfYXRhOworCWNoYW5uZWwtPmhhc19zbGF2ZSA9IGhhc19zbGF2ZTsKKworCWNoYW5uZWwtPmRy
aXZlc1tBVEFfTUFTVEVSXS50eXBlID0gbWFzdGVyX3R5cGU7CisJY2hhbm5lbC0+ZHJpdmVzW0FU
QV9TTEFWRV0udHlwZSA9IHNsYXZlX3R5cGU7CisKKwljaGFubmVsLT5kcml2ZXNbQVRBX01BU1RF
Ul0uYmN0eHQgPSBiY3R4dDsKKwljaGFubmVsLT5kcml2ZXNbQVRBX1NMQVZFXS5iY3R4dCAgPSBi
Y3R4dF9zOworCisJY2hhbm5lbC0+ZHJpdmVzW0FUQV9NQVNURVJdLnBpb19zZXR1cC5jaGFubmVs
ID0gY2hhbm5lbDsKKwljaGFubmVsLT5kcml2ZXNbQVRBX1NMQVZFXS5waW9fc2V0dXAuY2hhbm5l
bCAgPSBjaGFubmVsOworCisJY2hhbm5lbC0+aW50cl9hc3NlcnQgPSBpbnRyX2Fzc2VydDsKKwlj
aGFubmVsLT5pbnRyX2RlYXNzZXJ0ID0gaW50cl9kZWFzc2VydDsKKwljaGFubmVsLT5wcl9zYyA9
IHByX3NjOworCisJcmV0dXJuIGNoYW5uZWw7CisKK29wZW5fZmFpbDoKKwlpZiAocmV0KSB7CisJ
CWJsb2NraWZfY2xvc2UoYmN0eHQpOworCQlpZiAoYmN0eHRfcyAhPSBOVUxMKSB7CisJCQlibG9j
a2lmX2Nsb3NlKGJjdHh0X3MpOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRp
YyB2b2lkCithdGFfc3JzdChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0
IGF0YV9kcml2ZSAqZHJpdmUgPSBOVUxMOworCWludCBkZXY7CisKKwlkcHJpbnQoTE9HX0RFQlVH
LCAiYXRhX3Nyc3Q6IFNvZnR3YXJlIFJlc2V0XG4iKTsKKworCWZvciAoZGV2ID0gMDsgZGV2IDwg
QVRBX0RSSVZFUzsgZGV2KyspIHsKKwkJZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2Rldl07CisK
KwkJaWYgKGRyaXZlLT50eXBlICE9IEFUQV9EUklWRV9FTVBUWSkgeworCisJCQlkcml2ZS0+ZXJy
b3IgID0gQVRBX0VfSUxJOworCQkJZHJpdmUtPnN0YXR1cyA9IEFUQV9TX1JFQURZOworCisJCQlh
dGFfc2V0X3NpZ25hdHVyZShkcml2ZSk7CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRp
YyB2b2lkCithdGFfaW5pdGlhbGl6ZV9pZGVudChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwp
Cit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwt
PmRyaXZlXTsKKwlzdHJ1Y3QgYmxvY2tpZl9jdHh0ICpiY3R4dCA9IE5VTEw7CisJc3RydWN0IGF0
YV9wYXJhbXMgKmlkZW50X2RhdGEgPSBOVUxMOworCXN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9f
c2V0dXAgPSBOVUxMOworCisJdWludDE2X3QgY3lsaW5kZXJzOworCXVpbnQ4X3QgIGhlYWRzOwor
CXVpbnQ4X3QgIHNlY3RvcnM7CisJdWludDMyX3QgdG90YWxfc2VjdG9yczsKKworCWJjdHh0ID0g
ZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWlkZW50X2Rh
dGEgPSAoc3RydWN0IGF0YV9wYXJhbXMgKilhdGFfcGlvX2dldF9idWZmZXJfZGF0YShwaW9fc2V0
dXApOworCisJdG90YWxfc2VjdG9ycyA9IGJsb2NraWZfc2l6ZShiY3R4dCkgLyBBVEFfU0VDVE9S
X1NJWkU7CisKKwltZW1zZXQoaWRlbnRfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBhdGFfcGFyYW1z
KSk7CisKKwkvKiBOdW1iZXIgb2Ygc2VjdG9ycyBwZXIgYmxvY2sgdXNlZCBpbiByZWFkIC8gd3Jp
dGUgbXVsdGkgY29tbWFuZHMgKi8KKwlpZGVudF9kYXRhLT5zZWN0b3JzX2ludHIgfD0gMHg4MCA8
PCA4OworCWlkZW50X2RhdGEtPnNlY3RvcnNfaW50ciB8PSBBVEFfU0VDVE9SU19QRVJfQkxPQ0s7
CisKKwkvKiBVc2UgRE1BMiBtb2RlICovCisJaWRlbnRfZGF0YS0+Y2FwYWJpbGl0aWVzMSB8PSBB
VEFfU1VQUE9SVF9ETUE7CisJaWRlbnRfZGF0YS0+bXdkbWFtb2RlcyB8PSBBVEFfV19ETUEyOwor
CisJLyogVXNlIFBJTzQgbW9kZSAqLworCWlkZW50X2RhdGEtPmF0YXZhbGlkICB8PSBBVEFfRkxB
R182NF83MDsKKwlpZGVudF9kYXRhLT5hcGlvbW9kZXMgfD0gQVRBX01PREVfUElPNDsKKworCS8q
IFdlIHVzZSAyOC1iaXQgTEJBIGFkZHJlc3NpbmcgYmVjYXVzZSBDSFMgYWRkcmVzc2luZyBpcyBv
YnNvbGV0ZSBpbiBBVEEvQVRBUEkgNiAqLworCWlkZW50X2RhdGEtPmNhcGFiaWxpdGllczEgfD0g
QVRBX1NVUFBPUlRfTEJBOworCWlkZW50X2RhdGEtPmxiYV9zaXplXzEgPSB0b3RhbF9zZWN0b3Jz
OworCWlkZW50X2RhdGEtPmxiYV9zaXplXzIgPSB0b3RhbF9zZWN0b3JzID4+IDE2OworCisJLyog
U3VwcG9ydCB3cml0ZS1yZWFkLXZlcmlmeSAqLworCWlkZW50X2RhdGEtPnN1cHBvcnQyIHw9IEFU
QV9TVVBQT1JUX1dSSVRFUkVBRFZFUklGWTsKKwlpZGVudF9kYXRhLT5lbmFibGVkMiB8PSBBVEFf
U1VQUE9SVF9XUklURVJFQURWRVJJRlk7CisKKwkvKiBTdXBwb3J0IEFUQSBGTFVTSENBQ0hFICov
CisJaWRlbnRfZGF0YS0+c3VwcG9ydC5jb21tYW5kMiB8PSBBVEFfU1VQUE9SVF9GTFVTSENBQ0hF
OworCWlkZW50X2RhdGEtPmVuYWJsZWQuY29tbWFuZDIgfD0gQVRBX1NVUFBPUlRfRkxVU0hDQUNI
RTsKKworCS8qIE1ham9yIHZlcnNpb24gbnVtYmVyID0gQVRBL0FUQVBJLTYgKi8KKwlpZGVudF9k
YXRhLT52ZXJzaW9uX21ham9yIHw9IEFUQV9BVEFQSV82OworCisJLyogVGhpcyBpbmZvcm1hdGlv
biBhcmUgdXNlZCBvbmx5IGZvciBwcmludGluZyBwdXJwb3NlcyAqLworCWJsb2NraWZfY2hzKGJj
dHh0LCAmY3lsaW5kZXJzLCAmaGVhZHMsICZzZWN0b3JzKTsKKworCWlkZW50X2RhdGEtPmN5bGlu
ZGVycyA9IGN5bGluZGVyczsKKwlpZGVudF9kYXRhLT5oZWFkcyAgICAgPSBoZWFkczsKKwlpZGVu
dF9kYXRhLT5zZWN0b3JzICAgPSBzZWN0b3JzOworCisJLyogTW9kZWw6IEJIWVZFIEFUQSBJREUg
RElTSyAqLworCW1lbWNweShpZGVudF9kYXRhLT5tb2RlbCwgICAgIkhCVlkgRVRBIEFESSBFSURL
UyAgICAgICAgICAgICAgICAgICAgICAiLCA0MCk7CisJLyogU2VyaWFsIG51bWJlcjogMTIzNDU2
ICovCisJbWVtY3B5KGlkZW50X2RhdGEtPnNlcmlhbCwgICAiMjE0MzY1ICAgICAgICAgICAgICAi
LCAyMCk7CisJLyogRmlybXdhcmUgdmVyc2lvbjogMS4wICovCisJbWVtY3B5KGlkZW50X2RhdGEt
PnJldmlzaW9uLCAiLjEgMCAgICAiLCA4KTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaW5p
dGlhbGl6ZV9pZGVudDogY2hhbm5lbDogJWQsIGRyaXZlOiAlZCBDOiAlZCwgSDogJWQsIFM6ICVk
LCB0b3RhbF9zZWN0b3JzOiAlZFxuIiwKKwkJCWNoYW5uZWwtPmludGVyZmFjZSwgY2hhbm5lbC0+
ZHJpdmUsIGN5bGluZGVycywgaGVhZHMsIHNlY3RvcnMsIHRvdGFsX3NlY3RvcnMpOworCisJYXRh
X3Bpb19kb190cmFuc2ZlcihwaW9fc2V0dXAsIHNpemVvZihzdHJ1Y3QgYXRhX3BhcmFtcyksIGF0
YV9waW9fZ2VuZXJpY19lbmRfdHJhbnNmZXIsIGNoYW5uZWwtPnVzZV8xNmJpdCk7CisKKwlyZXR1
cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfaW5pdGlhbGl6ZV9pZGVudChzdHJ1Y3Qg
YXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hh
bm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYXRhX3BhcmFtcyAqaWRlbnRf
ZGF0YSA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisK
KwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19zZXR1cDsKKwlpZGVudF9kYXRhID0gKHN0cnVjdCBh
dGFfcGFyYW1zICopYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3NldHVwKTsKKworCW1lbXNl
dChpZGVudF9kYXRhLCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wYXJhbXMpKTsKKworCS8qIENEUk9N
IGRldmljZSAqLworCWlkZW50X2RhdGEtPmNvbmZpZyB8PSAoQVRBX1BST1RPX0FUQVBJXzEyIHwg
QVRBX0FUQVBJX1RZUEVfQ0RST00gfCBBVEFfRFJRX0ZBU1QpOworCisJLyogVXNlIERNQTIgbW9k
ZSAqLworCWlkZW50X2RhdGEtPmNhcGFiaWxpdGllczEgfD0gQVRBX1NVUFBPUlRfRE1BOworCWlk
ZW50X2RhdGEtPm13ZG1hbW9kZXMgfD0gQVRBX1dfRE1BMjsKKworCS8qIFVzZSBQSU80IG1vZGUg
Ki8KKwlpZGVudF9kYXRhLT5hdGF2YWxpZCAgfD0gQVRBX0ZMQUdfNjRfNzA7CisJaWRlbnRfZGF0
YS0+YXBpb21vZGVzIHw9IEFUQV9NT0RFX1BJTzQ7CisKKwkvKiBXZSB1c2UgMjgtYml0IExCQSBh
ZGRyZXNzaW5nIGJlY2F1c2UgQ0hTIGFkZHJlc3NpbmcgaXMgb2Jzb2xldGUgaW4gQVRBL0FUQVBJ
IDYgKi8KKwlpZGVudF9kYXRhLT5jYXBhYmlsaXRpZXMxIHw9IEFUQV9TVVBQT1JUX0xCQTsKKwor
CS8qIE1ham9yIHZlcnNpb24gbnVtYmVyID0gQVRBL0FUQVBJLTYgKi8KKwlpZGVudF9kYXRhLT52
ZXJzaW9uX21ham9yIHw9IEFUQV9BVEFQSV82OworCisJLyogTW9kZWw6IEJIWVZFIEFUQVBJIElE
RSBDRFJPTSAqLworCW1lbWNweShpZGVudF9kYXRhLT5tb2RlbCwgICAgIkhCVlkgRVRBUEEgSURJ
IEVEQ09SIE0gICAgICAgICAgICAgICAgICAiLCA0MCk7CisJLyogU2VyaWFsIG51bWJlcjogMTIz
NDU2ICovCisJbWVtY3B5KGlkZW50X2RhdGEtPnNlcmlhbCwgICAiMjE0MzY1ICAgICAgICAgICAg
ICAiLCAyMCk7CisJLyogRmlybXdhcmUgdmVyc2lvbjogMS4wICovCisJbWVtY3B5KGlkZW50X2Rh
dGEtPnJldmlzaW9uLCAiLjEgMCAgICAiLCA4KTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFf
YXRhcGlfaW5pdGlhbGl6ZV9pZGVudDogY2hhbm5lbDogJWQsIGRyaXZlOiAlZFxuIiwKKwkgICAg
ICAgY2hhbm5lbC0+aW50ZXJmYWNlLCBjaGFubmVsLT5kcml2ZSk7CisKKwlhdGFfcGlvX2RvX3Ry
YW5zZmVyKHBpb19zZXR1cCwgc2l6ZW9mKHN0cnVjdCBhdGFfcGFyYW1zKSwgYXRhX3Bpb19nZW5l
cmljX2VuZF90cmFuc2ZlciwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKworCXJldHVybjsKK30KKwor
c3RhdGljIGludAorYXRhX2NoYW5uZWxfaXNfb2soc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVs
LCB1aW50OF90IGNoKQoreworCWlmIChjaGFubmVsLT5pbnRlcmZhY2UgPT0gY2gpCisJCXJldHVy
biAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2F0YV9zZWxlY3RfZHJpdmVfaXNf
b2soc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCWlmIChjaGFubmVsLT5kcml2ZSA9
PSBBVEFfU0xBVkUgJiYgIWNoYW5uZWwtPmhhc19zbGF2ZSkgeworCQlyZXR1cm4gMDsKKwl9CisK
KwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2F0YV9zZXRfc3RhdHVzX29rKHN0cnVjdCBh
dGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFu
bmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCisJZHJpdmUtPnN0YXR1cyAmPSB+QVRBX1Nf
QlVTWTsKKwlkcml2ZS0+c3RhdHVzIHw9IEFUQV9TX1JFQURZOworCWRyaXZlLT5zdGF0dXMgJj0g
fkFUQV9TX0RXRjsKKwlkcml2ZS0+c3RhdHVzICY9IH5BVEFfU19EUlE7CisJZHJpdmUtPnN0YXR1
cyAmPSB+QVRBX1NfRVJST1I7CisKKwlkcml2ZS0+ZXJyb3IgPSAwOworCisJcmV0dXJuOworfQor
CitzdGF0aWMgdm9pZAorYXRhX3NldF9kYXRhX2Jsb2NrX3JlYWR5KHN0cnVjdCBhdGFfY2hhbm5l
bCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2
ZXNbY2hhbm5lbC0+ZHJpdmVdOworCisJZHJpdmUtPmFsdHN0YXR1cyAmPSB+QVRBX1NfQlVTWTsK
Kwlkcml2ZS0+YWx0c3RhdHVzIHw9IEFUQV9TX0RSUTsKKwlkcml2ZS0+YWx0c3RhdHVzIHw9IEFU
QV9TX1JFQURZOworCisJZHJpdmUtPnN0YXR1cyB8PSBBVEFfU19EUlE7CisKKwlyZXR1cm47Cit9
CisKK3N0YXRpYyB2b2lkCithdGFfY29tbWFuZF9hYm9ydGVkKHN0cnVjdCBhdGFfY2hhbm5lbCAq
Y2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNb
Y2hhbm5lbC0+ZHJpdmVdOworCisJZHJpdmUtPnN0YXR1cyAmPSB+QVRBX1NfQlVTWTsKKwlkcml2
ZS0+c3RhdHVzICY9IH5BVEFfU19EUlE7CisJZHJpdmUtPnN0YXR1cyB8PSBBVEFfU19FUlJPUjsK
KworCWRyaXZlLT5lcnJvciB8PSBBVEFfRV9BQk9SVDsKKworCXJldHVybjsKK30KKworc3RhdGlj
IHZvaWQKK2F0YV9zZXRfc2lnbmF0dXJlKHN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlKQoreworCWRy
aXZlLT5zZWNjb3VudCA9IDB4MDE7CisJZHJpdmUtPmxiYV9sb3cgID0gMHgwMTsKKworCWlmIChk
cml2ZS0+dHlwZSA9PSBBVEFfSEQpIHsKKwkJZHJpdmUtPmxiYV9taWQgID0gMHgwMDsKKwkJZHJp
dmUtPmxiYV9oaWdoID0gMHgwMDsKKwkJZHJpdmUtPmhkZGV2c2VsID0gMHgwMDsKKwl9CisJZWxz
ZSBpZiAoZHJpdmUtPnR5cGUgPT0gQVRBUElfQ0QpIHsKKwkJZHJpdmUtPmxiYV9taWQgID0gQVRB
UElfTUFHSUNfTFNCOworCQlkcml2ZS0+bGJhX2hpZ2ggPSBBVEFQSV9NQUdJQ19NU0I7CisJCWRy
aXZlLT5oZGRldnNlbCAmPSAweDEwOworCX0KKwllbHNlCisJCWFzc2VydCgwKTsKKworCXJldHVy
bjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9hZGRyZXNzaW5nX3NlY19jb3VudChzdHJ1Y3QgYXRh
X2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQxNl90ICpwX3NlY3Rvcl9jb3VudCkKK3sKKwlzdHJ1Y3Qg
YXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXVp
bnQxNl90IHNlY3Rvcl9jb3VudDsKKworCXNlY3Rvcl9jb3VudCA9IGRyaXZlLT5zZWNjb3VudCA/
IGRyaXZlLT5zZWNjb3VudCA6IEFUQV9NQVhfU0VDX0NPVU5UOworCSpwX3NlY3Rvcl9jb3VudCA9
IHNlY3Rvcl9jb3VudDsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9hZGRyZXNz
aW5nXzI4X2xiYShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQzMl90ICpwX2xiYV9h
ZGRyZXNzKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tj
aGFubmVsLT5kcml2ZV07CisJdWludDMyX3QgbGJhX2FkZHJlc3MgPSAwOworCisJbGJhX2FkZHJl
c3MgfD0gZHJpdmUtPmxiYV9sb3c7CisJbGJhX2FkZHJlc3MgfD0gZHJpdmUtPmxiYV9taWQgPDwg
ODsKKwlsYmFfYWRkcmVzcyB8PSBkcml2ZS0+bGJhX2hpZ2ggPDwgMTY7CisJbGJhX2FkZHJlc3Mg
fD0gKGRyaXZlLT5oZGRldnNlbCAmIEFUQV9MQkFfMjdfMjRfTUFTSykgPDwgMjQ7CisKKwkqcF9s
YmFfYWRkcmVzcyA9IGxiYV9hZGRyZXNzOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAor
YXRhX2luaXRfYmxvY2tfcmVxdWVzdChzdHJ1Y3QgYmxvY2tpZl9yZXEgKmJyZXEsIHN0cnVjdCBh
dGFfY2hhbm5lbCAqY2hhbm5lbCwKKwkJICAgICAgIHVpbnQ2NF90IG9mZnNldCwgdWludDY0X3Qg
bmJ5dGVzLCB2b2lkICpidWZmZXIpCit7CisJYnJlcS0+YnJfcGFyYW0gPSBjaGFubmVsOworCWJy
ZXEtPmJyX2NhbGxiYWNrID0gYXRhX2hhbmRsZV9ibG9ja19yZXF1ZXN0OworCWJyZXEtPmJyX29m
ZnNldCA9IG9mZnNldDsKKwlicmVxLT5icl9pb3ZjbnQgPSAxOworCWJyZXEtPmJyX2lvdlswXS5p
b3ZfbGVuID0gbmJ5dGVzOworCWJyZXEtPmJyX2lvdlswXS5pb3ZfYmFzZSA9IGJ1ZmZlcjsKKwor
CXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfYmxvY2tfcmVxdWVzdChzdHJ1
Y3QgYmxvY2tpZl9yZXEgKnJlcSwgaW50IGVycikKK3sKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNo
YW5uZWwgPSAoc3RydWN0IGF0YV9jaGFubmVsICopcmVxLT5icl9wYXJhbTsKKworCWF0YV9zZXRf
c3RhdHVzX29rKGNoYW5uZWwpOworCWF0YV9zZXRfZGF0YV9ibG9ja19yZWFkeShjaGFubmVsKTsK
KwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAor
YXRhX3Bpb19kb190cmFuc2ZlcihzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwLCB1aW50
NjRfdCBzaXplX3RyYW5zZmVyLAorCQkgICAgIGF0YV9waW9fZW5kX3RyYW5zZmVyX2Z1bmNfdCBl
bmRfdHJhbnNmZXIsIHVpbnQ4X3QgdXNlX3dvcmQpCit7CisJYXNzZXJ0KHNpemVfdHJhbnNmZXIg
PD0gQVRBX0lOQlVGX1NJWkUpOworCWFzc2VydCghYXRhX3Bpb19pbl9wcm9ncmVzcyhwaW9fc2V0
dXApKTsKKworCXBpb19zZXR1cC0+dXNlX3dvcmQgPSB1c2Vfd29yZDsKKwlwaW9fc2V0dXAtPnBp
b19idWZmZXIuY3VycmVudF9wb3MgPSAwOworCXBpb19zZXR1cC0+c2l6ZV90cmFuc2ZlciA9IHNp
emVfdHJhbnNmZXI7CisJcGlvX3NldHVwLT5lbmRfdHJhbnNmZXIgPSBlbmRfdHJhbnNmZXI7CisK
KwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK2F0YV9waW9faW5fcHJvZ3Jlc3Moc3RydWN0IGF0
YV9waW9fc2V0dXAgKnBpb19zZXR1cCkKK3sKKwlyZXR1cm4gKGludClwaW9fc2V0dXAtPmVuZF90
cmFuc2ZlcjsKK30KKworc3RhdGljIHVpbnQ4X3QgKgorYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEo
c3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCkKK3sKKwlyZXR1cm4gcGlvX3NldHVwLT5w
aW9fYnVmZmVyLmRhdGE7Cit9CisKK3N0YXRpYyB2b2lkCithdGFfcGlvX2NoZWNrX2VuZF90cmFu
c2ZlcihzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKQoreworCXN0cnVjdCBhdGFfY2hh
bm5lbCAqY2hhbm5lbCA9IHBpb19zZXR1cC0+Y2hhbm5lbDsKKwlzdHJ1Y3QgYXRhX3Bpb19idWZm
ZXIgKnBpb19idWZmZXIgPSAmcGlvX3NldHVwLT5waW9fYnVmZmVyOworCWF0YV9waW9fZW5kX3Ry
YW5zZmVyX2Z1bmNfdCBlbmRfdHJhbnNmZXIgPSBwaW9fc2V0dXAtPmVuZF90cmFuc2ZlcjsKKwor
CWlmIChwaW9fYnVmZmVyLT5jdXJyZW50X3BvcyA9PSBwaW9fc2V0dXAtPnNpemVfdHJhbnNmZXIp
IHsKKwkJcGlvX3NldHVwLT5lbmRfdHJhbnNmZXIgPSBOVUxMOworCQllbmRfdHJhbnNmZXIoY2hh
bm5lbCk7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdWludDMyX3QKK2F0YV9waW9fZ2V0
X3VpbnQoc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCkKK3sKKwlzdHJ1Y3QgYXRhX3Bp
b19idWZmZXIgKnBpb19idWZmZXIgPSAmcGlvX3NldHVwLT5waW9fYnVmZmVyOworCXVpbnQzMl90
IHZhbHVlOworCisJYXNzZXJ0KHBpb19idWZmZXItPmN1cnJlbnRfcG9zIDwgcGlvX3NldHVwLT5z
aXplX3RyYW5zZmVyKTsKKworCWlmIChwaW9fc2V0dXAtPnVzZV93b3JkKSB7CisJCXZhbHVlID0g
Kih1aW50MTZfdCAqKShwaW9fYnVmZmVyLT5kYXRhICsgcGlvX2J1ZmZlci0+Y3VycmVudF9wb3Mp
OworCQlwaW9fYnVmZmVyLT5jdXJyZW50X3BvcyArPSBzaXplb2YodWludDE2X3QpOworCX0KKwll
bHNlIHsKKwkJdmFsdWUgPSAqKHVpbnQzMl90ICopKHBpb19idWZmZXItPmRhdGEgKyBwaW9fYnVm
ZmVyLT5jdXJyZW50X3Bvcyk7CisJCXBpb19idWZmZXItPmN1cnJlbnRfcG9zICs9IHNpemVvZih1
aW50MzJfdCk7CisJfQorCisJYXRhX3Bpb19jaGVja19lbmRfdHJhbnNmZXIocGlvX3NldHVwKTsK
KworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQKK2F0YV9waW9fcHV0X3VpbnQoc3Ry
dWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCwgdWludDMyX3Qgd3JpdGVfdmFsdWUpCit7CisJ
c3RydWN0IGF0YV9waW9fYnVmZmVyICpwaW9fYnVmZmVyID0gJnBpb19zZXR1cC0+cGlvX2J1ZmZl
cjsKKworCWFzc2VydChwaW9fYnVmZmVyLT5jdXJyZW50X3BvcyA8IHBpb19zZXR1cC0+c2l6ZV90
cmFuc2Zlcik7CisKKwlpZiAocGlvX3NldHVwLT51c2Vfd29yZCkgeworCQkqKHVpbnQxNl90ICop
KHBpb19idWZmZXItPmRhdGEgKyBwaW9fYnVmZmVyLT5jdXJyZW50X3BvcykgPSAodWludDE2X3Qp
d3JpdGVfdmFsdWU7CisJCXBpb19idWZmZXItPmN1cnJlbnRfcG9zICs9IHNpemVvZih1aW50MTZf
dCk7CisJfQorCWVsc2UgeworCQkqKHVpbnQzMl90ICopKHBpb19idWZmZXItPmRhdGEgKyBwaW9f
YnVmZmVyLT5jdXJyZW50X3BvcykgPSB3cml0ZV92YWx1ZTsKKwkJcGlvX2J1ZmZlci0+Y3VycmVu
dF9wb3MgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwl9CisKKwlhdGFfcGlvX2NoZWNrX2VuZF90cmFu
c2ZlcihwaW9fc2V0dXApOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX3Bpb19n
ZW5lcmljX2VuZF90cmFuc2ZlcihzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJZHBy
aW50KExPR19ERUJVRywgImF0YV9waW9fZ2VuZXJpY19lbmRfdHJhbnNmZXI6IGNoOiAlZCBkcml2
ZTogJWRcbiIsCisJICAgICAgIGNoYW5uZWwtPmludGVyZmFjZSwgY2hhbm5lbC0+ZHJpdmUpOwor
CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX3JlYWRfbXVsdGlwbGVfYmxvY2tfZG9u
ZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJp
dmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYmxvY2tpZl9j
dHh0ICpiY3R4dCA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5V
TEw7CisJc3RydWN0IGJsb2NraWZfcmVxICpicmVxID0gTlVMTDsKKwl1aW50NjRfdCBjb3VudDsK
Kwl1aW50NjRfdCBzaXplX3RyYW5zZmVyOworCWludCBlcnI7CisKKwliY3R4dCA9IGRyaXZlLT5i
Y3R4dDsKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19zZXR1cDsKKwlicmVxID0gJnBpb19zZXR1
cC0+YnJlcTsKKworCWRyaXZlLT5vZmZzZXQgKz0gcGlvX3NldHVwLT5zaXplX3RyYW5zZmVyOwor
CWRyaXZlLT5jb3VudCAtPSBwaW9fc2V0dXAtPnNpemVfdHJhbnNmZXI7CisKKwljb3VudCA9IGRy
aXZlLT5jb3VudDsKKworCWlmIChjb3VudCkgeworCQlzaXplX3RyYW5zZmVyID0gY291bnQgPj0g
QVRBX0JMT0NLX1NJWkUgPyBBVEFfQkxPQ0tfU0laRSA6IGNvdW50OworCQlhdGFfcGlvX2RvX3Ry
YW5zZmVyKHBpb19zZXR1cCwgc2l6ZV90cmFuc2ZlciwgYXRhX3JlYWRfbXVsdGlwbGVfYmxvY2tf
ZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKworCQlhdGFfaW5pdF9ibG9ja19yZXF1ZXN0KGJy
ZXEsIGNoYW5uZWwsIGRyaXZlLT5vZmZzZXQsCisJCQkJICAgICAgIHNpemVfdHJhbnNmZXIsIGF0
YV9waW9fZ2V0X2J1ZmZlcl9kYXRhKHBpb19zZXR1cCkpOworCisJCWVyciA9IGJsb2NraWZfcmVh
ZChiY3R4dCwgYnJlcSk7CisJCWFzc2VydCghZXJyKTsKKwl9CisJZWxzZSB7CisJCWRwcmludChM
T0dfREVCVUcsICJhdGFfcmVhZF9tdWx0aXBsZV9ibG9ja19kb25lOiBBVEFfUkVBRF9NVUwgY29t
cGxldGVkXG4iKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfd3JpdGVf
bXVsdGlwbGVfYmxvY2tfZG9uZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3Ry
dWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsK
KwlzdHJ1Y3QgYmxvY2tpZl9jdHh0ICpiY3R4dCA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9fc2V0
dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJc3RydWN0IGJsb2NraWZfcmVxICpicmVxID0gTlVMTDsK
Kwl1aW50NjRfdCBjb3VudDsKKwl1aW50NjRfdCBzaXplX3RyYW5zZmVyOworCWludCBlcnI7CisK
KwliY3R4dCA9IGRyaXZlLT5iY3R4dDsKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19zZXR1cDsK
KwlicmVxID0gJnBpb19zZXR1cC0+YnJlcTsKKworCWF0YV9pbml0X2Jsb2NrX3JlcXVlc3QoYnJl
cSwgY2hhbm5lbCwgZHJpdmUtPm9mZnNldCwKKwkJCSAgICAgICBwaW9fc2V0dXAtPnNpemVfdHJh
bnNmZXIsIGF0YV9waW9fZ2V0X2J1ZmZlcl9kYXRhKHBpb19zZXR1cCkpOworCisJZHJpdmUtPm9m
ZnNldCArPSBwaW9fc2V0dXAtPnNpemVfdHJhbnNmZXI7CisJZHJpdmUtPmNvdW50IC09IHBpb19z
ZXR1cC0+c2l6ZV90cmFuc2ZlcjsKKworCWNvdW50ID0gZHJpdmUtPmNvdW50OworCisJaWYgKGNv
dW50KSB7CisJCXNpemVfdHJhbnNmZXIgPSBjb3VudCA+PSBBVEFfQkxPQ0tfU0laRSA/IEFUQV9C
TE9DS19TSVpFIDogY291bnQ7CisJCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXpl
X3RyYW5zZmVyLCBhdGFfd3JpdGVfbXVsdGlwbGVfYmxvY2tfZG9uZSwgY2hhbm5lbC0+dXNlXzE2
Yml0KTsKKwl9CisJZWxzZSB7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfd3JpdGVfbXVsdGlw
bGVfYmxvY2tfZG9uZTogQVRBX1dSSVRFX01VTCBjb21wbGV0ZWRcbiIpOworCX0KKworCWVyciA9
IGJsb2NraWZfd3JpdGUoYmN0eHQsIGJyZXEpOworCWFzc2VydCghZXJyKTsKKworCXJldHVybjsK
K30KKworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVfcmVhZF9kb25lKHN0cnVjdCBhdGFf
Y2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVs
LT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0g
TlVMTDsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKwlzdHJ1Y3Qg
YmxvY2tpZl9yZXEgKmJyZXEgPSBOVUxMOworCXVpbnQ2NF90IGNvdW50OworCWludCBlcnI7CisK
KwliY3R4dCA9IGRyaXZlLT5iY3R4dDsKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19zZXR1cDsK
KwlicmVxID0gJnBpb19zZXR1cC0+YnJlcTsKKworCWRyaXZlLT5vZmZzZXQgKz0gQVRBUElfQkxP
Q0tfU0laRTsKKwlkcml2ZS0+Y291bnQgLT0gQVRBUElfQkxPQ0tfU0laRTsKKworCWNvdW50ID0g
ZHJpdmUtPmNvdW50OworCisJaWYgKGNvdW50KSB7CisJCWFzc2VydChjb3VudCA+PSBBVEFQSV9C
TE9DS19TSVpFKTsKKworCQlkcml2ZS0+c2VjY291bnQgPSBBVEFfSV9JTjsKKworCQlhdGFfcGlv
X2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgQVRBUElfQkxPQ0tfU0laRSwgYXRhX2F0YXBpX2hhbmRs
ZV9yZWFkX2RvbmUsIGNoYW5uZWwtPnVzZV8xNmJpdCk7CisKKwkJYXRhX2luaXRfYmxvY2tfcmVx
dWVzdChicmVxLCBjaGFubmVsLCBkcml2ZS0+b2Zmc2V0LAorCQkJCSAgICAgICBBVEFQSV9CTE9D
S19TSVpFLCBhdGFfcGlvX2dldF9idWZmZXJfZGF0YShwaW9fc2V0dXApKTsKKworCQllcnIgPSBi
bG9ja2lmX3JlYWQoYmN0eHQsIGJyZXEpOworCQlhc3NlcnQoIWVycik7CisJfQorCWVsc2Ugewor
CQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2RvbmU6IFJFQUQgY29t
cGxldGVkXG4iKTsKKwkJYXRhX2F0YXBpX2NtZF9kb25lKGNoYW5uZWwpOworCX0KKworCXJldHVy
bjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfaWRlbnRpZnkoc3RydWN0IGF0YV9jaGFu
bmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRy
aXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlpZiAoZHJpdmUtPnR5cGUgPT0gQVRBX0hEKSB7CisJ
CWF0YV9pbml0aWFsaXplX2lkZW50KGNoYW5uZWwpOworCisJCWF0YV9zZXRfZGF0YV9ibG9ja19y
ZWFkeShjaGFubmVsKTsKKwkJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJCWF0YV9pcnFf
cmFpc2UoY2hhbm5lbCk7CisJfQorCWVsc2UgaWYgKGRyaXZlLT50eXBlID09IEFUQVBJX0NEKSB7
CisJCWF0YV9jb21tYW5kX2Fib3J0ZWQoY2hhbm5lbCk7CisJCWF0YV9zZXRfc2lnbmF0dXJlKGRy
aXZlKTsKKwl9CisJZWxzZQorCQlhc3NlcnQoMCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2
b2lkCithdGFfaGFuZGxlX3NldGZlYXR1cmVzKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkK
K3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+
ZHJpdmVdOworCisJc3dpdGNoIChkcml2ZS0+ZmVhdHVyZXMpIHsKKwljYXNlIEFUQV9TRl9TRVRY
RkVSOgorCQljaGFubmVsLT5tb2RlID0gZHJpdmUtPnNlY2NvdW50OworCQlkcHJpbnQoTE9HX0RF
QlVHLCAiYXRhX2hhbmRsZV9zZXRmZWF0dXJlcyBBVEFfU0ZfU0VUWEZFUjogbW9kZTogJWRcbiIs
CisJCSAgICAgICBjaGFubmVsLT5tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRU5BQl9X
Q0FDSEU6CisJCWJyZWFrOworCWNhc2UgQVRBX1NGX0RJU19XQ0FDSEU6CisJCWJyZWFrOworCWNh
c2UgQVRBX1NGX0VOQUJfUFVJUzoKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRElTX1BVSVM6CisJ
CWJyZWFrOworCWNhc2UgQVRBX1NGX1BVSVNfU1BJTlVQOgorCQlicmVhazsKKwljYXNlIEFUQV9T
Rl9FTkFCX1JDQUNIRToKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRElTX1JDQUNIRToKKwkJYnJl
YWs7CisJY2FzZSBBVEFfU0ZfRU5BQl9SRUxJUlE6CisJCWJyZWFrOworCWNhc2UgQVRBX1NGX0RJ
U19SRUxJUlE6CisJCWJyZWFrOworCWNhc2UgQVRBX1NGX0VOQUJfU1JWSVJROgorCQlicmVhazsK
KwljYXNlIEFUQV9TRl9ESVNfU1JWSVJROgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsK
Kwl9CisKKwlhdGFfc2V0X3N0YXR1c19vayhjaGFubmVsKTsKKwlhdGFfaXJxX3JhaXNlKGNoYW5u
ZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9zZXRfbXVsdGko
c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZl
ID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcHJpbnQoTE9HX0RFQlVH
LCAiYXRhX2hhbmRsZV9zZXRfbXVsdGk6IGRyaXZlLT5zZWNjb3VudDogJWRcbiIsCisJICAgICAg
IGRyaXZlLT5zZWNjb3VudCk7CisKKwlhc3NlcnQoZHJpdmUtPnNlY2NvdW50IDw9IEFUQV9TRUNU
T1JTX1BFUl9CTE9DSyk7CisKKwlhdGFfc2V0X3N0YXR1c19vayhjaGFubmVsKTsKKwlhdGFfaXJx
X3JhaXNlKGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRs
ZV9yZWFkX211bHRpcGxlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3Qg
YXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0
cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAq
cGlvX3NldHVwID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgKmJyZXEgPSBOVUxMOworCisJ
dWludDE2X3Qgc2VjdG9yX2NvdW50OworCXVpbnQzMl90IGxiYV9hZGRyZXNzID0gMDsKKwl1aW50
NjRfdCBvZmZzZXQ7CisJdWludDY0X3QgY291bnQ7CisJdWludDY0X3Qgc2l6ZV90cmFuc2ZlcjsK
KwlpbnQgZXJyOworCisJYmN0eHQgPSBkcml2ZS0+YmN0eHQ7CisJcGlvX3NldHVwID0gJmRyaXZl
LT5waW9fc2V0dXA7CisJYnJlcSA9ICZwaW9fc2V0dXAtPmJyZXE7CisKKwlhdGFfYWRkcmVzc2lu
Z19zZWNfY291bnQoY2hhbm5lbCwgJnNlY3Rvcl9jb3VudCk7CisJYXRhX2FkZHJlc3NpbmdfMjhf
bGJhKGNoYW5uZWwsICZsYmFfYWRkcmVzcyk7CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hh
bmRsZV9yZWFkX211bHRpcGxlOiBzZWN0b3JfY291bnQ6ICVkLCBsYmFfYWRkcmVzczogMHgleFxu
IiwKKwkgICAgICAgc2VjdG9yX2NvdW50LCBsYmFfYWRkcmVzcyk7CisKKwlvZmZzZXQgPSAodWlu
dDY0X3QpbGJhX2FkZHJlc3MgKiBBVEFfU0VDVE9SX1NJWkU7CisJY291bnQgPSAodWludDY0X3Qp
c2VjdG9yX2NvdW50ICogQVRBX1NFQ1RPUl9TSVpFOworCisJZHJpdmUtPmNvdW50ID0gY291bnQ7
CisJZHJpdmUtPm9mZnNldCA9IG9mZnNldDsKKworCXNpemVfdHJhbnNmZXIgPSBjb3VudCA+PSBB
VEFfQkxPQ0tfU0laRSA/IEFUQV9CTE9DS19TSVpFIDogY291bnQ7CisJYXRhX3Bpb19kb190cmFu
c2ZlcihwaW9fc2V0dXAsIHNpemVfdHJhbnNmZXIsIGF0YV9yZWFkX211bHRpcGxlX2Jsb2NrX2Rv
bmUsIGNoYW5uZWwtPnVzZV8xNmJpdCk7CisKKwlhdGFfaW5pdF9ibG9ja19yZXF1ZXN0KGJyZXEs
IGNoYW5uZWwsIGRyaXZlLT5vZmZzZXQsCisJCQkgICAgICAgc2l6ZV90cmFuc2ZlciwgYXRhX3Bp
b19nZXRfYnVmZmVyX2RhdGEocGlvX3NldHVwKSk7CisKKwllcnIgPSBibG9ja2lmX3JlYWQoYmN0
eHQsIGJyZXEpOworCWFzc2VydCghZXJyKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQK
K2F0YV9oYW5kbGVfcmVhZF92ZXJpZnkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQorewor
CXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2
ZV07CisJZHByaW50KExPR19ERUJVRywgImF0YV9oYW5kbGVfcmVhZF92ZXJpZnlcbiIpOworCisJ
YXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJZHJpdmUtPmFsdHN0YXR1cyAmPSB+QVRBX1Nf
RFJROworCWF0YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2
b2lkCithdGFfaGFuZGxlX3dyaXRlX211bHRpcGxlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l
bCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5l
bC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3Qg
YXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKworCXVpbnQxNl90IHNlY3Rvcl9jb3Vu
dDsKKwl1aW50MzJfdCBsYmFfYWRkcmVzcyA9IDA7CisJdWludDY0X3Qgb2Zmc2V0OworCXVpbnQ2
NF90IGNvdW50OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisKKwliY3R4dCA9IGRyaXZlLT5i
Y3R4dDsKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19zZXR1cDsKKworCWF0YV9hZGRyZXNzaW5n
X3NlY19jb3VudChjaGFubmVsLCAmc2VjdG9yX2NvdW50KTsKKwlhdGFfYWRkcmVzc2luZ18yOF9s
YmEoY2hhbm5lbCwgJmxiYV9hZGRyZXNzKTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFu
ZGxlX3dyaXRlX211bHRpcGxlOiBzZWN0b3JfY291bnQ6ICVkLCBsYmFfYWRkcmVzczogMHgleFxu
IiwKKwkgICAgICAgc2VjdG9yX2NvdW50LCBsYmFfYWRkcmVzcyk7CisKKwlvZmZzZXQgPSAodWlu
dDY0X3QpbGJhX2FkZHJlc3MgKiBBVEFfU0VDVE9SX1NJWkU7CisJY291bnQgPSAodWludDY0X3Qp
c2VjdG9yX2NvdW50ICogQVRBX1NFQ1RPUl9TSVpFOworCisJZHJpdmUtPm9mZnNldCA9IG9mZnNl
dDsKKwlkcml2ZS0+Y291bnQgPSBjb3VudDsKKworCXNpemVfdHJhbnNmZXIgPSBjb3VudCA+PSBB
VEFfQkxPQ0tfU0laRSA/IEFUQV9CTE9DS19TSVpFIDogY291bnQ7CisJYXRhX3Bpb19kb190cmFu
c2ZlcihwaW9fc2V0dXAsIHNpemVfdHJhbnNmZXIsIGF0YV93cml0ZV9tdWx0aXBsZV9ibG9ja19k
b25lLCBjaGFubmVsLT51c2VfMTZiaXQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAor
YXRhX2hhbmRsZV9kbWEoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50OF90IG9wX2Rp
cikKK3sKKwlzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MgPSBOVUxMOworCXN0cnVjdCBwY2lfYXRh
X2RtYV90cmFuc2FjdGlvbiAqZG1hX3RyYW5zYWN0aW9uID0gTlVMTDsKKworCXVpbnQxNl90IHNl
Y3Rvcl9jb3VudDsKKwl1aW50MzJfdCBsYmFfYWRkcmVzcyA9IDA7CisKKwlzYyA9IGNoYW5uZWwt
PnByX3NjOworCWRtYV90cmFuc2FjdGlvbiA9ICZzYy0+ZG1hX3RyYW5zYWN0aW9uc1tjaGFubmVs
LT5pbnRlcmZhY2VdOworCisJYXNzZXJ0KCFkbWFfdHJhbnNhY3Rpb24tPnN0YXJ0ZWQpOworCisJ
YXRhX2FkZHJlc3Npbmdfc2VjX2NvdW50KGNoYW5uZWwsICZzZWN0b3JfY291bnQpOworCWF0YV9h
ZGRyZXNzaW5nXzI4X2xiYShjaGFubmVsLCAmbGJhX2FkZHJlc3MpOworCisJZHByaW50KExPR19E
RUJVRywgImF0YV9oYW5kbGVfZG1hOiBzZWN0b3JfY291bnQ6ICVkLCBsYmFfYWRkcmVzczogMHgl
eCBESVI6ICVkXG4iLAorCQkJc2VjdG9yX2NvdW50LCBsYmFfYWRkcmVzcywgb3BfZGlyKTsKKwor
CWRtYV90cmFuc2FjdGlvbi0+c3RhcnRlZCA9IDE7CisJZG1hX3RyYW5zYWN0aW9uLT5vZmZzZXQg
PSAodWludDY0X3QpbGJhX2FkZHJlc3MgKiBBVEFfU0VDVE9SX1NJWkU7CisJZG1hX3RyYW5zYWN0
aW9uLT5uYnl0ZXMgPSAodWludDY0X3Qpc2VjdG9yX2NvdW50ICogQVRBX1NFQ1RPUl9TSVpFOwor
CWRtYV90cmFuc2FjdGlvbi0+b3BfZGlyID0gb3BfZGlyOworCisJcmV0dXJuOworfQorCitzdGF0
aWMgdm9pZAorYXRhX2hhbmRsZV9mbHVzaGNhY2hlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l
bCkKK3sKKwlzdHJ1Y3QgYmxvY2tpZl9jdHh0ICpiY3R4dCA9IE5VTEw7CisJc3RydWN0IGJsb2Nr
aWZfcmVxICpicmVxID0gTlVMTDsKKwlpbnQgZXJyOworCisJYmN0eHQgPSBjaGFubmVsLT5kcml2
ZXNbY2hhbm5lbC0+ZHJpdmVdLmJjdHh0OworCWJyZXEgPSAmY2hhbm5lbC0+Zmx1c2hfYnJlcTsK
KworCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX2ZsdXNoY2FjaGVcbiIpOworCisJYXRh
X2luaXRfYmxvY2tfcmVxdWVzdChicmVxLCBjaGFubmVsLCAwLCAwLCBOVUxMKTsKKworCWVyciA9
IGJsb2NraWZfZmx1c2goYmN0eHQsIGJyZXEpOworCWFzc2VydCghZXJyKTsKKworCXJldHVybjsK
K30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfc2VlayhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNo
YW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2No
YW5uZWwtPmRyaXZlXTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3NlZWtcbiIp
OworCisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJZHJpdmUtPnN0YXR1cyB8PSBBVEFf
U19EU0M7CisJYXRhX2lycV9yYWlzZShjaGFubmVsKTsKKworCXJldHVybjsKK30KKworc3RhdGlj
IHZvaWQKK2F0YV9oYW5kbGVfYXRhcGlfaWRlbnRpZnkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFu
bmVsKQoreworCWF0YV9hdGFwaV9pbml0aWFsaXplX2lkZW50KGNoYW5uZWwpOworCisJYXRhX3Nl
dF9kYXRhX2Jsb2NrX3JlYWR5KGNoYW5uZWwpOworCWF0YV9zZXRfc3RhdHVzX29rKGNoYW5uZWwp
OworCWF0YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lk
CithdGFfaGFuZGxlX3BhY2tldF9jbWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQorewor
CXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2
ZV07CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisKKwlwaW9fc2V0
dXAgPSAmZHJpdmUtPnBpb19zZXR1cDsKKworCWRyaXZlLT5ieXRlX2NvdW50ID0gZHJpdmUtPmxi
YV9taWQgfCAoZHJpdmUtPmxiYV9oaWdoIDw8IDgpOworCisJZHByaW50KExPR19ERUJVRywgImF0
YV9oYW5kbGVfcGFja2V0X2NtZDogYnl0ZV9jb3VudDogJWRcbiIsIGRyaXZlLT5ieXRlX2NvdW50
KTsKKworCWF0YV9zZXRfc3RhdHVzX29rKGNoYW5uZWwpOworCWRyaXZlLT5zZWNjb3VudCA9IEFU
QV9JX0NNRDsKKwlkcml2ZS0+c3RhdHVzIHw9IEFUQV9TX0RSUTsKKworCS8qIFRoZSBQYWNrZXQg
Y21kIGlzIHJlY2VpdmVkIGFzIDYgd29yZHMgb24gYm90aCBMUEMgYW5kIFBDSSAqLworCWF0YV9w
aW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBBVEFQSV9QQUNLRVRfU0laRSwgYXRhX2F0YXBpX2Nt
ZCwgMSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX2NtZChzdHJ1
Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3QgY21kKQoreworCXN3aXRjaCAoY21kKSB7
CisJY2FzZSBBVEFfQVRBX0lERU5USUZZOgorCQlhdGFfaGFuZGxlX2lkZW50aWZ5KGNoYW5uZWwp
OworCQlicmVhazsKKwljYXNlIEFUQV9TRVRGRUFUVVJFUzoKKwkJYXRhX2hhbmRsZV9zZXRmZWF0
dXJlcyhjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0VUX01VTFRJOgorCQlhdGFfaGFu
ZGxlX3NldF9tdWx0aShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUkVBRDoKKwljYXNl
IEFUQV9SRUFEX01VTDoKKwkJYXRhX2hhbmRsZV9yZWFkX211bHRpcGxlKGNoYW5uZWwpOworCQli
cmVhazsKKwljYXNlIEFUQV9SRUFEX1ZFUklGWToKKwkJYXRhX2hhbmRsZV9yZWFkX3ZlcmlmeShj
aGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfV1JJVEU6CisJY2FzZSBBVEFfV1JJVEVfTVVM
OgorCQlhdGFfaGFuZGxlX3dyaXRlX211bHRpcGxlKGNoYW5uZWwpOworCQlicmVhazsKKwljYXNl
IEFUQV9SRUFEX0RNQToKKwkJYXRhX2hhbmRsZV9kbWEoY2hhbm5lbCwgQVRBX0RNQV9SRUFEKTsK
KwkJYnJlYWs7CisJY2FzZSBBVEFfV1JJVEVfRE1BOgorCQlhdGFfaGFuZGxlX2RtYShjaGFubmVs
LCBBVEFfRE1BX1dSSVRFKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfRkxVU0hDQUNIRToKKwkJYXRh
X2hhbmRsZV9mbHVzaGNhY2hlKGNoYW5uZWwpOworCQlicmVhazsKKwljYXNlIEFUQV9TRUVLOgor
CQlhdGFfaGFuZGxlX3NlZWsoY2hhbm5lbCk7CisJCWJyZWFrOworCWNhc2UgQVRBX0FUQVBJX0lE
RU5USUZZOgorCQlhdGFfaGFuZGxlX2F0YXBpX2lkZW50aWZ5KGNoYW5uZWwpOworCQlicmVhazsK
KwljYXNlIEFUQV9QQUNLRVRfQ01EOgorCQlhdGFfaGFuZGxlX3BhY2tldF9jbWQoY2hhbm5lbCk7
CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRwcmludChMT0dfRVJSLCAiYXRhX2hhbmRsZV9jbWQ6
IHVuc3VwcG9ydGVkIGNtZDogJTAyeFxuIiwgY21kKTsKKwkJYXNzZXJ0KDApOworCQlicmVhazsK
Kwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBhdGFfY3B1X3RvX2JlMzIgdHJhbnNsYXRlcyBm
cm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVuZGlhbgorICogdGhlIGxpdHRsZSBlbmRpYW4gZm9y
bWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSBpbnRlZ2VyIHZhbHVlIGJlaW5n
IHRyYW5zbGF0ZWQKKyAqIEBidWYgLSB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgcmVzdWx0IGlzIHN0
b3JlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2F0YV9jcHVfdG9fYmUzMih1aW50OF90ICpi
dWYsIHVpbnQzMl90IHZhbCkKK3sKKwlidWZbMF0gPSB2YWwgPj4gMjQ7CisJYnVmWzFdID0gdmFs
ID4+IDE2OworCWJ1ZlsyXSA9IHZhbCA+PiA4OworCWJ1ZlszXSA9IHZhbDsKKworCXJldHVybjsK
K30KKworLyoKKyAqIGF0YV9jcHVfdG9fYmUxNiB0cmFuc2xhdGVzIGZyb20gbGl0dGxlIGVuZGlh
biB0byBiaWcgZW5kaWFuCisgKiB0aGUgbGl0dGxlIGVuZGlhbiBmb3JtYXQgaXMgdXNlZCBieSB0
aGUgY3B1CisgKiBAdmFsIC0gdGhlIHdvcmQgYmVpbmcgdHJhbnNsYXRlZAorICogQGJ1ZiAtIHRo
ZSBhZGRyZXNzIHdoZXJlIHRoZSByZXN1bHQgaXMgc3RvcmVkCisgKi8KK3N0YXRpYyBpbmxpbmUg
dm9pZAorYXRhX2NwdV90b19iZTE2KHVpbnQ4X3QgKmJ1ZiwgdWludDE2X3QgdmFsKQoreworCWJ1
ZlswXSA9IHZhbCA+PiA4OworCWJ1ZlsxXSA9IHZhbDsKKworCXJldHVybjsKK30KKworLyoKKyAq
IGF0YV9iZTMyX3RvX2NwdSB0cmFuc2xhdGVzIGZyb20gYmlnIGVuZGlhbiB0byBsaXR0bGUgZW5k
aWFuCisgKiB0aGUgbGl0dGxlIGVuZGlhbiBmb3JtYXQgaXMgdXNlZCBieSB0aGUgY3B1CisgKiBA
dmFsIC0gdGhlIHJldHVybiBpbnRlZ2VyIHZhbHVlCisgKiBAYnVmIC0gdGhlIGFkZHJlc3Mgb2Yg
dGhlIHZhbHVlIGJlaW5nIHRyYW5zbGF0ZWQKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdAor
YXRhX2JlMzJfdG9fY3B1KHVpbnQ4X3QgKmJ1ZikKK3sKKwl1aW50MzJfdCB2YWwgPSAwOworCisJ
dmFsIHw9IGJ1ZlswXSA8PCAyNDsKKwl2YWwgfD0gYnVmWzFdIDw8IDE2OworCXZhbCB8PSBidWZb
Ml0gPDwgODsKKwl2YWwgfD0gYnVmWzNdOworCisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIGF0
YV9iZTE2X3RvX2NwdSB0cmFuc2xhdGVzIGZyb20gYmlnIGVuZGlhbiB0byBsaXR0bGUgZW5kaWFu
CisgKiB0aGUgbGl0dGxlIGVuZGlhbiBmb3JtYXQgaXMgdXNlZCBieSB0aGUgY3B1CisgKiBAdmFs
IC0gdGhlIHJldHVybiB3b3JkIHZhbHVlCisgKiBAYnVmIC0gdGhlIGFkZHJlc3Mgb2YgdGhlIHZh
bHVlIGJlaW5nIHRyYW5zbGF0ZWQKKyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdAorYXRhX2Jl
MTZfdG9fY3B1KHVpbnQ4X3QgKmJ1ZikKK3sKKwl1aW50MTZfdCB2YWwgPSAwOworCisJdmFsIHw9
IGJ1ZlswXSA8PCA4OworCXZhbCB8PSBidWZbMV07CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0
aWMgdm9pZAorYXRhX2F0YXBpX3ByaW50X3BhY2tldCh1aW50OF90ICpwYWNrZXQpCit7CisJaW50
IGk7CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2F0YXBpX3ByaW50X3BhY2tldCBjbWQ6IDB4
JXggcGFja2V0OiAiLCBwYWNrZXRbMF0pOworCWZvciAoaSA9IDA7IGkgPCBBVEFQSV9QQUNLRVRf
U0laRTsgaSsrKSB7CisJCWRwcmludChMT0dfREVCVUcsICIleCAiLCBwYWNrZXRbaV0pOworCX0K
KwlkcHJpbnQoTE9HX0RFQlVHLCAiXG4iKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQK
K2F0YV9hdGFwaV9kYXRhX3JlcXVlc3Qoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQorewor
CXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2
ZV07CisKKwlhdGFfc2V0X3N0YXR1c19vayhjaGFubmVsKTsKKwlkcml2ZS0+c2VjY291bnQgPSBB
VEFfSV9JTjsKKwlkcml2ZS0+c3RhdHVzIHw9IEFUQV9TX0RSUTsKKworCWF0YV9pcnFfcmFpc2Uo
Y2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfY21kX2Rv
bmUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRy
aXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlhdGFfc2V0X3N0YXR1
c19vayhjaGFubmVsKTsKKwlkcml2ZS0+c2VjY291bnQgPSBBVEFfSV9JTiB8IEFUQV9JX0NNRDsK
KworCWF0YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lk
CithdGFfYXRhcGlfaGFuZGxlX2lucXVpcnkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1
aW50OF90ICpwYWNrZXQpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+
ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVw
ID0gTlVMTDsKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKmlucXVpcnlfZGF0YSA9IChzdHJ1
Y3Qgc2NzaV9pbnF1aXJ5X2RhdGEgKilwYWNrZXQ7CisJdWludDhfdCBtYXhfbGVuID0gMDsKKwor
CXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCisJbWF4X2xlbiA9IHBhY2tldFs0XTsK
Kwlhc3NlcnQobWF4X2xlbiA+PSBTSE9SVF9JTlFVSVJZX0xFTkdUSCk7CisKKwkvKiBmb3Igbm93
IHdlIGltcGxlbWVudCBvbmx5IHRoZSBzaG9ydCBpbnF1aXJ5IGNtZCAqLworCWlmIChwYWNrZXRb
MV0gJiAweDAxKSB7CisJCWFzc2VydCgwKTsKKwl9IGVsc2UgeworCQltZW1zZXQoaW5xdWlyeV9k
YXRhLCAwLCBTSE9SVF9JTlFVSVJZX0xFTkdUSCk7CisKKwkJaW5xdWlyeV9kYXRhLT5kZXZpY2Ug
PSBUX0NEUk9NOworCQlpbnF1aXJ5X2RhdGEtPmRldl9xdWFsMiA9IFNJRF9STUI7CisJCWlucXVp
cnlfZGF0YS0+dmVyc2lvbiA9IFNDU0lfUkVWXzA7CisJCWlucXVpcnlfZGF0YS0+cmVzcG9uc2Vf
Zm9ybWF0ID0gMjsKKwkJaW5xdWlyeV9kYXRhLT5hZGRpdGlvbmFsX2xlbmd0aCA9IFNIT1JUX0lO
UVVJUllfTEVOR1RIIC0gNTsKKworCQltZW1jcHkoaW5xdWlyeV9kYXRhLT52ZW5kb3IsICJCSFlW
RSAgICIsIFNJRF9WRU5ET1JfU0laRSk7CisJCW1lbWNweShpbnF1aXJ5X2RhdGEtPnByb2R1Y3Qs
ICJBVEFQSSBJREUgQ0RST00gIiwgU0lEX1BST0RVQ1RfU0laRSk7CisJCW1lbWNweShpbnF1aXJ5
X2RhdGEtPnJldmlzaW9uLCAiMS4xICIsIFNJRF9SRVZJU0lPTl9TSVpFKTsKKworCQlhdGFfcGlv
X2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgU0hPUlRfSU5RVUlSWV9MRU5HVEgsIGF0YV9hdGFwaV9j
bWRfZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKwkJYXRhX2F0YXBpX2RhdGFfcmVxdWVzdChj
aGFubmVsKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfaGFu
ZGxlX3JlYWRfY2FwYWNpdHkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50OF90ICpw
YWNrZXQpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2No
YW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsK
KwlpbnQgbnNlY3RvcnMgPSBibG9ja2lmX3NpemUoZHJpdmUtPmJjdHh0KSAvIEFUQVBJX0JMT0NL
X1NJWkU7CisKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19zZXR1cDsKKworCWF0YV9jcHVfdG9f
YmUzMihwYWNrZXQsIG5zZWN0b3JzIC0gMSk7CisJYXRhX2NwdV90b19iZTMyKHBhY2tldCArIDQs
IEFUQVBJX0JMT0NLX1NJWkUpOworCisJYXRhX3Bpb19kb190cmFuc2ZlcihwaW9fc2V0dXAsIDgs
IGF0YV9hdGFwaV9jbWRfZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKwlhdGFfYXRhcGlfZGF0
YV9yZXF1ZXN0KGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBsYmFfdG9f
bXNmKHVpbnQ4X3QgKmJ1ZiwgaW50IGxiYSkKK3sKKwlsYmEgKz0gMTUwOworCWJ1ZlswXSA9IChs
YmEgLyA3NSkgLyA2MDsKKwlidWZbMV0gPSAobGJhIC8gNzUpICUgNjA7CisJYnVmWzJdID0gbGJh
ICUgNzU7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfaGFuZGxlX3Jl
YWRfdG9jKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KQorewor
CXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2
ZV07CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJaW50IG5zZWN0
b3JzID0gYmxvY2tpZl9zaXplKGRyaXZlLT5iY3R4dCkgLyBBVEFQSV9CTE9DS19TSVpFOworCisJ
dWludDhfdCBtc2YgPSBwYWNrZXRbMV0gJiAyOworCXVpbnQ4X3QgZm9ybWF0ID0gcGFja2V0WzJd
ICYgMHgwZjsKKwl1aW50OF90IHRyYWNrX251bWJlciA9IHBhY2tldFs2XTsKKwl1aW50MTZfdCBh
bGxvY2F0aW9uX2xlbmd0aCA9IChwYWNrZXRbN10gPDwgOCkgfCBwYWNrZXRbOF07CisKKwl1aW50
MTZfdCBkYXRhX2xlbiA9IDA7CisJdWludDhfdCAqZGF0YV96b25lID0gTlVMTDsKKwl1aW50OF90
ICpsZWFkX291dCA9IE5VTEw7CisKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19zZXR1cDsKKwor
CWFzc2VydCh0cmFja19udW1iZXIgPD0gMSB8fCB0cmFja19udW1iZXIgPT0gMHhhYSk7CisJYXNz
ZXJ0KCFmb3JtYXQpOworCisJcGFja2V0WzJdID0gMTsJCS8qIEZpcnN0IFRyYWNrICovCisJcGFj
a2V0WzNdID0gMTsJCS8qIExhc3QgVHJhY2sgKi8KKworCWxlYWRfb3V0ID0gcGFja2V0ICsgNDsK
KworCWlmICh0cmFja19udW1iZXIgPD0gMSkgeworCQlkYXRhX3pvbmUgPSBwYWNrZXQgKyA0Owor
CQlsZWFkX291dCA9IHBhY2tldCArIDEyOworCisJCWRhdGFfem9uZVswXSA9IDA7CQkvKiBSZXNl
cnZlZCAqLworCQlkYXRhX3pvbmVbMV0gPSAweDE0OwkJLyogQURSLCBjb250cm9sICovCisJCWRh
dGFfem9uZVsyXSA9IDE7CQkvKiB0cmFjayBudW1iZXIgKi8KKwkJZGF0YV96b25lWzNdID0gMDsJ
CS8qIFJlc2VydmVkICovCisJCWlmIChtc2YpIHsKKwkJCWRhdGFfem9uZVs0XSA9IDA7CisJCQls
YmFfdG9fbXNmKGRhdGFfem9uZSArIDUsIDApOworCQl9CisJCWVsc2UgeworCQkJYXRhX2NwdV90
b19iZTMyKGRhdGFfem9uZSArIDQsIDApOworCQl9CisJfQorCisJbGVhZF9vdXRbMF0gPSAwOwkJ
LyogUmVzZXJ2ZWQgKi8KKwlsZWFkX291dFsxXSA9IDB4MTY7CQkvKiBBRFIsIGNvbnRyb2wgKi8K
KwlsZWFkX291dFsyXSA9IDB4YWE7CQkvKiB0cmFjayBudW1iZXIgKi8KKwlsZWFkX291dFszXSA9
IDA7CQkvKiBSZXNlcnZlZCAqLworCWlmIChtc2YpIHsKKwkJbGVhZF9vdXRbNF0gPSAwOworCQls
YmFfdG9fbXNmKGxlYWRfb3V0ICsgNSwgbnNlY3RvcnMpOworCX0KKwllbHNlIHsKKwkJYXRhX2Nw
dV90b19iZTMyKGxlYWRfb3V0ICsgNCwgbnNlY3RvcnMpOworCX0KKworCWRhdGFfbGVuID0gKGxl
YWRfb3V0IC0gcGFja2V0KSArIDg7CisJYXRhX2NwdV90b19iZTE2KHBhY2tldCwgZGF0YV9sZW4g
LSAyKTsKKworCWRhdGFfbGVuID0gKGRhdGFfbGVuIDwgYWxsb2NhdGlvbl9sZW5ndGgpID8gZGF0
YV9sZW4gOiBhbGxvY2F0aW9uX2xlbmd0aDsKKworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3Nl
dHVwLCBkYXRhX2xlbiwgYXRhX2F0YXBpX2NtZF9kb25lLCBjaGFubmVsLT51c2VfMTZiaXQpOwor
CWF0YV9hdGFwaV9kYXRhX3JlcXVlc3QoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRp
YyB2b2lkCithdGFfYXRhcGlfaGFuZGxlX3JlYWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVs
LCB1aW50OF90ICpwYWNrZXQpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5l
bC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYmxvY2tpZl9jdHh0ICpiY3R4dCA9
IE5VTEw7CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJc3RydWN0
IGJsb2NraWZfcmVxICpicmVxID0gTlVMTDsKKworCXVpbnQxNl90IHNlY3Rvcl9jb3VudCA9IDA7
CisJdWludDMyX3QgbGJhX2FkZHJlc3MgPSAwOworCXVpbnQ2NF90IG9mZnNldDsKKwl1aW50NjRf
dCBjb3VudDsKKwlpbnQgZXJyOworCisJYXNzZXJ0KGRyaXZlLT5ieXRlX2NvdW50ID49IEFUQVBJ
X0JMT0NLX1NJWkUpOworCisJYmN0eHQgPSBkcml2ZS0+YmN0eHQ7CisJcGlvX3NldHVwID0gJmRy
aXZlLT5waW9fc2V0dXA7CisJYnJlcSA9ICZwaW9fc2V0dXAtPmJyZXE7CisKKwlsYmFfYWRkcmVz
cyA9IGF0YV9iZTMyX3RvX2NwdShwYWNrZXQgKyAyKTsKKwlzZWN0b3JfY291bnQgPSBhdGFfYmUx
Nl90b19jcHUocGFja2V0ICsgNyk7CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2F0YXBpX2hh
bmRsZV9yZWFkOiBzZWN0b3JfY291bnQ6ICVkLCBsYmFfYWRkcmVzczogMHgleFxuIiwKKwkgICAg
ICAgc2VjdG9yX2NvdW50LCBsYmFfYWRkcmVzcyk7CisKKwlvZmZzZXQgPSAodWludDY0X3QpbGJh
X2FkZHJlc3MgKiBBVEFQSV9CTE9DS19TSVpFOworCWNvdW50ID0gKHVpbnQ2NF90KXNlY3Rvcl9j
b3VudCAqIEFUQVBJX0JMT0NLX1NJWkU7CisKKwlkcml2ZS0+Y291bnQgPSBjb3VudDsKKwlkcml2
ZS0+b2Zmc2V0ID0gb2Zmc2V0OworCisJZHJpdmUtPmxiYV9taWQgPSBBVEFQSV9CTE9DS19TSVpF
ICYgMHhmZjsKKwlkcml2ZS0+bGJhX2hpZ2ggPSAoQVRBUElfQkxPQ0tfU0laRSA+PiA4KSAmIDB4
ZmY7CisKKwlkcml2ZS0+c2VjY291bnQgPSBBVEFfSV9JTjsKKworCWF0YV9waW9fZG9fdHJhbnNm
ZXIocGlvX3NldHVwLCBBVEFQSV9CTE9DS19TSVpFLCBhdGFfYXRhcGlfaGFuZGxlX3JlYWRfZG9u
ZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKworCWF0YV9pbml0X2Jsb2NrX3JlcXVlc3QoYnJlcSwg
Y2hhbm5lbCwgZHJpdmUtPm9mZnNldCwKKwkJCSAgICAgICBBVEFQSV9CTE9DS19TSVpFLCBhdGFf
cGlvX2dldF9idWZmZXJfZGF0YShwaW9fc2V0dXApKTsKKworCWVyciA9IGJsb2NraWZfcmVhZChi
Y3R4dCwgYnJlcSk7CisJYXNzZXJ0KCFlcnIpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9p
ZAorYXRhX2F0YXBpX2NtZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0
IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlz
dHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKwl1aW50OF90ICpwYWNrZXQg
PSBOVUxMOworCXVpbnQ4X3Qgb3BfY29kZSA9IDA7CisKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBp
b19zZXR1cDsKKwlwYWNrZXQgPSBhdGFfcGlvX2dldF9idWZmZXJfZGF0YShwaW9fc2V0dXApOwor
CisJYXRhX2F0YXBpX3ByaW50X3BhY2tldChwYWNrZXQpOworCisJb3BfY29kZSA9IHBhY2tldFsw
XTsKKworCXN3aXRjaCAob3BfY29kZSkgeworCWNhc2UgSU5RVUlSWToKKwkJYXRhX2F0YXBpX2hh
bmRsZV9pbnF1aXJ5KGNoYW5uZWwsIHBhY2tldCk7CisJCWJyZWFrOworCWNhc2UgUkVBRF9DQVBB
Q0lUWToKKwkJYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2NhcGFjaXR5KGNoYW5uZWwsIHBhY2tldCk7
CisJCWJyZWFrOworCWNhc2UgUFJFVkVOVF9BTExPVzoKKwkJYXRhX2F0YXBpX2NtZF9kb25lKGNo
YW5uZWwpOworCQlicmVhazsKKwljYXNlIFJFQURfVE9DOgorCQlhdGFfYXRhcGlfaGFuZGxlX3Jl
YWRfdG9jKGNoYW5uZWwsIHBhY2tldCk7CisJCWJyZWFrOworCWNhc2UgUkVBRF8xMDoKKwkJYXRh
X2F0YXBpX2hhbmRsZV9yZWFkKGNoYW5uZWwsIHBhY2tldCk7CisJCWJyZWFrOworCWNhc2UgVEVT
VF9VTklUX1JFQURZOgorCQlhdGFfYXRhcGlfY21kX2RvbmUoY2hhbm5lbCk7CisJCWJyZWFrOwor
CWRlZmF1bHQ6CisJCWRwcmludChMT0dfRVJSLCAiYXRhX2F0YXBpX2NtZDogdW5zdXBwb3J0ZWQg
Y21kOiAlMDJ4XG4iLCBvcF9jb2RlKTsKKwkJYXNzZXJ0KDApOworCQlicmVhazsKKwl9OworCisJ
cmV0dXJuOworfQorCitzdGF0aWMgdWludDY0X3QKK2F0YV9jb21tYW5kX2Jsb2NrX3JlYWQoc3Ry
dWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50NjRfdCBvZmZzZXQpCit7CisJdWludDY0X3Qg
dmFsdWUgPSAwOworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tj
aGFubmVsLT5kcml2ZV07CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7
CisKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19zZXR1cDsKKworCXN3aXRjaCAob2Zmc2V0KSB7
CisJY2FzZSBBVEFfREFUQV9SRUc6CisJCXZhbHVlID0gYXRhX3Bpb19nZXRfdWludChwaW9fc2V0
dXApOworCQlicmVhazsKKwljYXNlIEFUQV9FUlJPUl9SRUc6CisJCXZhbHVlID0gZHJpdmUtPmVy
cm9yOworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfcmVhZDogQVRBX0VS
Uk9SX1JFRzogJWx4aFxuIiwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9TRUNDT1VOVF9S
RUc6CisJCXZhbHVlID0gZHJpdmUtPnNlY2NvdW50OworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRh
X2NvbW1hbmRfYmxvY2tfcmVhZDogQVRBX1NFQ0NPVU5UX1JFRzogJWx4aFxuIiwgdmFsdWUpOwor
CQlicmVhazsKKwljYXNlIEFUQV9MQkFfTE9XX1JFRzoKKwkJdmFsdWUgPSBkcml2ZS0+bGJhX2xv
dzsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9MQkFf
TE9XX1JFRzogJWx4aFxuIiwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9MQkFfTUlEX1JF
RzoKKwkJdmFsdWUgPSBkcml2ZS0+bGJhX21pZDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9j
b21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9MQkFfTUlEX1JFRzogJWx4aFxuIiwgdmFsdWUpOworCQli
cmVhazsKKwljYXNlIEFUQV9MQkFfSElHSF9SRUc6CisJCXZhbHVlID0gZHJpdmUtPmxiYV9oaWdo
OworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfcmVhZDogQVRBX0xCQV9I
SUdIX1JFRzogJWx4aFxuIiwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9IRERFVlNFTF9S
RUc6CisJCXZhbHVlID0gZHJpdmUtPmhkZGV2c2VsOworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRh
X2NvbW1hbmRfYmxvY2tfcmVhZDogQVRBX0hEREVWU0VMX1JFRzogJWx4aFxuIiwgdmFsdWUpOwor
CQlicmVhazsKKwljYXNlIEFUQV9TVEFUVVNfUkVHOgorCQlhdGFfaXJxX2xvd2VyKGNoYW5uZWwp
OworCisJCXZhbHVlID0gZHJpdmUtPnN0YXR1czsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9j
b21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9TVEFUVVNfUkVHOiAlbHhoXG4iLCB2YWx1ZSk7CisJCWJy
ZWFrOworCWRlZmF1bHQ6CisJCXZhbHVlID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZh
bHVlOworfQorCitzdGF0aWMgdm9pZAorYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGUoc3RydWN0IGF0
YV9jaGFubmVsICpjaGFubmVsLAorCQl1aW50NjRfdCBvZmZzZXQsIGludCBzaXplLCB1aW50NjRf
dCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNb
Y2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlMCA9ICZjaGFubmVsLT5k
cml2ZXNbQVRBX01BU1RFUl07CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUxID0gJmNoYW5uZWwt
PmRyaXZlc1tBVEFfU0xBVkVdOworCXN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBO
VUxMOworCisJdWludDhfdCByZWdfdmFsdWU7CisKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19z
ZXR1cDsKKworCXN3aXRjaCAob2Zmc2V0KSB7CisJY2FzZSBBVEFfREFUQV9SRUc6CisJCWF0YV9w
aW9fcHV0X3VpbnQocGlvX3NldHVwLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0ZFQVRV
UkVTX1JFRzoKKwkJZHJpdmUwLT5mZWF0dXJlcyA9IHZhbHVlOworCQlkcml2ZTEtPmZlYXR1cmVz
ID0gdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja193cml0ZTog
QVRBX0ZFQVRVUkVTX1JFRzogJXhoXG4iLCAodWludDhfdCl2YWx1ZSk7CisJCWJyZWFrOworCWNh
c2UgQVRBX1NFQ0NPVU5UX1JFRzoKKwkJZHJpdmUwLT5zZWNjb3VudCA9IHZhbHVlOworCQlkcml2
ZTEtPnNlY2NvdW50ID0gdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9i
bG9ja193cml0ZTogQVRBX1NFQ0NPVU5UX1JFRzogJXhoXG4iLCAodWludDhfdCl2YWx1ZSk7CisJ
CWJyZWFrOworCWNhc2UgQVRBX0xCQV9MT1dfUkVHOgorCQlkcml2ZTAtPmxiYV9sb3cgPSB2YWx1
ZTsKKwkJZHJpdmUxLT5sYmFfbG93ID0gdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFf
Y29tbWFuZF9ibG9ja193cml0ZTogQVRBX0xCQV9MT1dfUkVHOiAleGhcbiIsICh1aW50OF90KXZh
bHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfTEJBX01JRF9SRUc6CisJCWRyaXZlMC0+bGJhX21p
ZCA9IHZhbHVlOworCQlkcml2ZTEtPmxiYV9taWQgPSB2YWx1ZTsKKwkJZHByaW50KExPR19ERUJV
RywgImF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlOiBBVEFfTEJBX01JRF9SRUc6ICV4aFxuIiwgKHVp
bnQ4X3QpdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9MQkFfSElHSF9SRUc6CisJCWRyaXZl
MC0+bGJhX2hpZ2ggPSB2YWx1ZTsKKwkJZHJpdmUxLT5sYmFfaGlnaCA9IHZhbHVlOworCQlkcHJp
bnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6IEFUQV9MQkFfSElHSF9SRUc6
ICV4aFxuIiwgKHVpbnQ4X3QpdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9IRERFVlNFTF9S
RUc6CisJCXJlZ192YWx1ZSA9IHZhbHVlOworCisJCWRyaXZlMC0+aGRkZXZzZWwgPSB2YWx1ZTsK
KwkJZHJpdmUxLT5oZGRldnNlbCA9IHZhbHVlOworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2Nv
bW1hbmRfYmxvY2tfd3JpdGU6IEFUQV9IRERFVlNFTF9SRUc6ICV4aFxuIiwgcmVnX3ZhbHVlKTsK
KworCQlpZiAocmVnX3ZhbHVlICYgQVRBX0RfSUJNKQorCQkJY2hhbm5lbC0+c2l6ZSA9IEFUQV9T
RUNUT1JfU0laRTsKKwkJaWYgKHJlZ192YWx1ZSAmIEFUQV9ERVYoQVRBX1NMQVZFKSkgeworCQkJ
ZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlOiBzZWxlY3QgQVRBX1NM
QVZFXG4iKTsKKwkJCWNoYW5uZWwtPmRyaXZlID0gQVRBX1NMQVZFOworCQl9CisJCWVsc2Ugewor
CQkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlOiBzZWxlY3QgQVRB
X01BU1RFUlxuIik7CisJCQljaGFubmVsLT5kcml2ZSA9IEFUQV9NQVNURVI7CisJCX0KKwkJaWYg
KCFhdGFfc2VsZWN0X2RyaXZlX2lzX29rKGNoYW5uZWwpKSB7CisJCQlkcml2ZTEtPnN0YXR1cyA9
IEFUQV9EUklWRV9BQlNFTlQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBVEFfQ09NTUFORF9SRUc6
CisJCWRyaXZlMC0+Y29tbWFuZCA9IHZhbHVlOworCQlkcml2ZTEtPmNvbW1hbmQgPSB2YWx1ZTsK
KwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlOiBBVEFfQ09NTUFO
RF9SRUc6ICV4aFxuIiwgKHVpbnQ4X3QpdmFsdWUpOworCQlhdGFfaGFuZGxlX2NtZChjaGFubmVs
LCB2YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRwcmludChMT0dfRVJSLCAiYXRhX2Nv
bW1hbmRfYmxvY2tfd3JpdGU6IHVuc3VwcG9ydGVkIHJlZzolbHhcbiIsIG9mZnNldCk7CisJCWFz
c2VydCgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdWludDY0X3QK
K2F0YV9hbHRzdGF0dXNfcmVhZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3Ry
dWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsK
Kwl1aW50NjRfdCB2YWx1ZSA9IDA7CisKKwl2YWx1ZSA9IGRyaXZlLT5hbHRzdGF0dXM7CisKKwlk
cHJpbnQoTE9HX0RFQlVHLCAiYXRhX2FsdHN0YXR1c19yZWFkOiB2YWx1ZTogJWx1XG4iLCB2YWx1
ZSk7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkCithdGFfY29udHJvbF93cml0
ZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsCisJCWludCBzaXplLCB1aW50NjRfdCB2YWx1
ZSkKK3sKKwl1aW50OF90IHJlZ192YWx1ZTsKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZj
aGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCisJcmVnX3ZhbHVlID0gKHVpbnQ4X3Qp
dmFsdWU7CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbnRyb2xfd3JpdGU6IGlycV9kaXNh
YmxlZDogJWRcbiIsIHJlZ192YWx1ZSAmIEFUQV9BX0lEUyk7CisKKwlpZiAocmVnX3ZhbHVlICYg
QVRBX0FfSURTKQorCQlkcml2ZS0+aXJxX2Rpc2FibGVkID0gMTsKKwllbHNlCisJCWRyaXZlLT5p
cnFfZGlzYWJsZWQgPSAwOworCisJaWYgKHJlZ192YWx1ZSAmIEFUQV9BX1JFU0VUKQorCQlhdGFf
c3JzdChjaGFubmVsKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFBDSSBBVEEgZnVuY3Rpb24g
ZGVmaW5pdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK3BjaV9hdGFfaW50cl9hc3NlcnQodm9pZCAq
YXJnKQoreworCXN0cnVjdCBwY2lfYXRhX3NvZnRjICpzYyA9IChzdHJ1Y3QgcGNpX2F0YV9zb2Z0
YyAqKWFyZzsKKwlzdHJ1Y3QgcGNpX2Rldmluc3QgKnBpID0gc2MtPmFzY19waTsKKworCXBjaV9s
aW50cl9hc3NlcnQocGkpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorcGNpX2F0YV9p
bnRyX2RlYXNzZXJ0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MgPSAo
c3RydWN0IHBjaV9hdGFfc29mdGMgKilhcmc7CisJc3RydWN0IHBjaV9kZXZpbnN0ICpwaSA9IHNj
LT5hc2NfcGk7CisKKwlwY2lfbGludHJfZGVhc3NlcnQocGkpOworCisJcmV0dXJuOworfQorCitz
dGF0aWMgaW50CitwY2lfYXRhX3BhcnNlX3BhcmFtcyhjb25zdCBjaGFyICpvcHRzLCBjaGFyICpv
cHQwLCBjaGFyICpvcHQxLCB1aW50OF90ICpucl9jaGFubmVscykKK3sKKwl1aW50OF90IGxlbjsK
KwljaGFyIHRtcF9vcHRzWzEyOF07CisJY2hhciAqY2gwID0gTlVMTCwgKmNoMSA9IE5VTEw7CisJ
dWludDhfdCBpOworCisJaWYgKCFvcHRzKSB7CisJCWRwcmludChMT0dfRVJSLCAicGNpX2F0YV9w
YXJzZV9wYXJhbXM6IG9wdHMgc2hvdWxkIGJlIGxpa2U6ICVzXG4iLAorCQkgICAgICAgIlgsTUFT
VEVSX1hbLFNMQVZFX1hdWztZLE1BU1RFUl9ZWyxTTEFWRV9ZXV0iKTsKKwkJcmV0dXJuIC0xOwor
CX0KKworCWxlbiA9IHN0cmxlbihvcHRzKTsKKwlpZiAobGVuID49IDEyOCkgeworCQlkcHJpbnQo
TE9HX0VSUiwgInBjaV9hdGFfcGFyc2VfcGFyYW1zOiBQQ0kgQVRBIHN0cmluZyBwYXJhbXMgdG9v
IGJpZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJjcHkodG1wX29wdHMsIG9wdHMpOwor
CisJY2gwID0gdG1wX29wdHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYg
KHRtcF9vcHRzW2ldID09IFBDSV9BVEFfQ0hfU0VQKSB7CisJCQlpZiAoY2gxKSB7CisJCQkJZHBy
aW50KExPR19FUlIsICJwY2lfYXRhX3BhcnNlX3BhcmFtczogdG8gbWFueSBjaGFubmVsc1xuIik7
CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJdG1wX29wdHNbaV0gPSAnXDAnOworCQkJY2gxID0g
dG1wX29wdHMgKyBpICsgMTsKKwkJfQorCX0KKworCWlmIChzdHJsZW4oY2gwKSA+PSA2NCkgewor
CQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfcGFyc2VfcGFyYW1zOiB0aGUgbmFtZSBvZiBBVEFf
WCBjaGFubmVsIHRvbyBiaWdcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXN0cmNweShvcHQwLCBj
aDApOworCSpucl9jaGFubmVscyA9IDE7CisKKwlpZiAoY2gxICE9IE5VTEwgJiYgc3RybGVuKGNo
MSkgPCA2NCkgeworCQlzdHJjcHkob3B0MSwgIGNoMSk7CisJCSpucl9jaGFubmVscyA9IDI7CisJ
fQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BjaV9hdGFfaW5pdChzdHJ1Y3Qgdm1j
dHggKmN0eCwgc3RydWN0IHBjaV9kZXZpbnN0ICpwaSwgY2hhciAqb3B0cywgaW50IGF0YXBpKQor
eworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisJc3RydWN0IHBjaV9hdGFf
c29mdGMgKnBjaV9hdGFfc2MgPSBOVUxMOworCWNoYXIgY2hfb3B0c1syXVs2NF07CisJdWludDhf
dCBucl9jaGFubmVscyA9IDA7CisJaW50IHJldCwgaTsKKworCWF0YV9vcGVuX2RiZ19maWxlKCk7
CisKKwlyZXQgPSBwY2lfYXRhX3BhcnNlX3BhcmFtcyhvcHRzLCBjaF9vcHRzWzBdLCBjaF9vcHRz
WzFdLCAmbnJfY2hhbm5lbHMpOworCWlmIChyZXQpIHsKKwkJZHByaW50KExPR19FUlIsICJwY2lf
YXRhX2luaXQ6IHNvbWUgZXJyb3JzIHdpdGggdGhlIGlucHV0IGNoZWNraW5nXG4iKTsKKwkJcmV0
dXJuIC0xOworCX0KKworCXBjaV9hdGFfc2MgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwY2lf
YXRhX3NvZnRjKSk7CisJaWYgKCFwY2lfYXRhX3NjKQorCQlyZXR1cm4gLTE7CisKKwlwY2lfYXRh
X3NjLT5jaGFubmVsc1tBVEFfWF0gPSBOVUxMOworCXBjaV9hdGFfc2MtPmNoYW5uZWxzW0FUQV9Z
XSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7IGkrKykgeworCQljaGFu
bmVsID0gYXRhX2luaXQoY3R4LCBwY2lfYXRhX2ludHJfYXNzZXJ0LCBwY2lfYXRhX2ludHJfZGVh
c3NlcnQsCisJCQkJICAgcGNpX2F0YV9zYywgY2hfb3B0c1tpXSwgMCk7CisJCWlmICghY2hhbm5l
bCkKKwkJCWNvbnRpbnVlOworCQljaGFubmVsLT51c2VfMTZiaXQgPSAwOworCQlhc3NlcnQoIXBj
aV9hdGFfc2MtPmNoYW5uZWxzW2NoYW5uZWwtPmludGVyZmFjZV0pOworCQlwY2lfYXRhX3NjLT5j
aGFubmVsc1tjaGFubmVsLT5pbnRlcmZhY2VdID0gY2hhbm5lbDsKKwl9CisKKwkvKiBleGl0IGlm
IG5vbmUgb2YgdGhlIGNoYW5uZWxzIGFyZSBpbml0aWFsaXplZCAqLworCWlmICghcGNpX2F0YV9z
Yy0+Y2hhbm5lbHNbQVRBX1hdICYmICFwY2lfYXRhX3NjLT5jaGFubmVsc1tBVEFfWV0pIHsKKwkJ
ZnJlZShwY2lfYXRhX3NjKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXBpLT5waV9hcmcgPSBwY2lf
YXRhX3NjOworCXBjaV9hdGFfc2MtPmFzY19waSA9IHBpOworCisJLyogZ2VuZXJpYyBQQ0kgQVRB
L0FUQVBJIGRldmljZSBBVEFfSVQ4MjExRiAqLworCXBjaV9zZXRfY2ZnZGF0YTE2KHBpLCBQQ0lS
X0RFVklDRSwgMHg4MjExKTsJLyogQVRBL0FUQVBJIENvbnRyb2xsZXIgKi8KKwlwY2lfc2V0X2Nm
Z2RhdGExNihwaSwgUENJUl9WRU5ET1IsIDB4MTI4Myk7CS8qIFdhbGRvICovCisKKwkvKiB0aGlz
IGlzIGEgc3RvcmFnZSBjbGFzcyBkZXZpY2UgKi8KKwlwY2lfc2V0X2NmZ2RhdGE4KHBpLCBQQ0lS
X0NMQVNTLCBQQ0lDX1NUT1JBR0UpOworCS8qIHRoaXMgaXMgYW4gSURFL0FUQSB0eXBlIGRldmlj
ZSAqLworCXBjaV9zZXRfY2ZnZGF0YTgocGksIFBDSVJfU1VCQ0xBU1MsIFBDSVNfU1RPUkFHRV9J
REUpOworCisJcGNpX3NldF9jZmdkYXRhOChwaSwgUENJUl9QUk9HSUYsIFBDSVBfU1RPUkFHRV9J
REVfTUFTVEVSREVWIHwKKwkJCSBQQ0lQX1NUT1JBR0VfSURFX01PREVQUklNIHwgUENJUF9TVE9S
QUdFX0lERV9NT0RFU0VDKTsKKworCXBjaV9lbXVsX2FsbG9jX2JhcihwaSwgUENJX0JBUjAsIFBD
SUJBUl9JTywgQVRBX0lPU0laRSk7CisJcGNpX2VtdWxfYWxsb2NfYmFyKHBpLCBQQ0lfQkFSMSwg
UENJQkFSX0lPLCBBVEFfQ1RMSU9TSVpFKTsKKwlwY2lfZW11bF9hbGxvY19iYXIocGksIFBDSV9C
QVIyLCBQQ0lCQVJfSU8sIEFUQV9JT1NJWkUpOworCXBjaV9lbXVsX2FsbG9jX2JhcihwaSwgUENJ
X0JBUjMsIFBDSUJBUl9JTywgQVRBX0NUTElPU0laRSk7CisJcGNpX2VtdWxfYWxsb2NfYmFyKHBp
LCBQQ0lfQkFSNCwgUENJQkFSX0lPLCBBVEFfQ0hBTk5FTFMgKiBBVEFfQk1JT1NJWkUpOworCisJ
cGNpX2xpbnRyX3JlcXVlc3QocGkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Bj
aV9hdGFfaGRfaW5pdChzdHJ1Y3Qgdm1jdHggKmN0eCwgc3RydWN0IHBjaV9kZXZpbnN0ICpwaSwg
Y2hhciAqb3B0cykKK3sKKwlyZXR1cm4gKHBjaV9hdGFfaW5pdChjdHgsIHBpLCBvcHRzLCAwKSk7
Cit9CisKK3N0YXRpYyB2b2lkCitwY2lfYXRhX2RtYV9zdGFydChzdHJ1Y3QgcGNpX2F0YV9zb2Z0
YyAqc2MsIHVpbnQ4X3QgY2gpCit7CisJc3RydWN0IHZtY3R4ICpjdHggPSBOVUxMOworCXN0cnVj
dCBhdGFfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisJc3RydWN0IGJsb2NraWZfY3R4dCAqYmN0
eHQgPSBOVUxMOworCXN0cnVjdCBwY2lfYXRhX2RtYV90cmFuc2FjdGlvbiAqZG1hX3RyYW5zYWN0
aW9uID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgKmJyZXEgPSBOVUxMOworCisJc3RydWN0
IHByZF9lbnRyeSAqcHJkdCA9IE5VTEw7CisJc3RydWN0IHByZF9lbnRyeSAqZW50cnkgPSBOVUxM
OworCXVpbnQzMl90IHByZHRfYWRkcmVzczsKKwl1aW50MzJfdCBpbmRleDsKKwl1aW50MzJfdCBi
eXRlX2NvdW50OworCXZvaWQgKmVudHJ5X2J1ZmYgPSBOVUxMOworCWludCBlcnI7CisKKwljaGFu
bmVsID0gc2MtPmNoYW5uZWxzW2NoXTsKKworCWN0eCA9IGNoYW5uZWwtPnZtX2N0eDsKKwlhc3Nl
cnQoY3R4ICE9IE5VTEwpOworCisJYmN0eHQgPSBjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJp
dmVdLmJjdHh0OworCWRtYV90cmFuc2FjdGlvbiA9ICZzYy0+ZG1hX3RyYW5zYWN0aW9uc1tjaF07
CisKKwlhc3NlcnQoZG1hX3RyYW5zYWN0aW9uLT5zdGFydGVkKTsKKworCWFzc2VydCgoKHNjLT5j
bWRbY2hdICYgQVRBX0JNQ01EX1dSSVRFX1JFQUQpICYmIGRtYV90cmFuc2FjdGlvbi0+b3BfZGly
ID09IEFUQV9ETUFfUkVBRCkgfHwKKwkJKCEoc2MtPmNtZFtjaF0gJiBBVEFfQk1DTURfV1JJVEVf
UkVBRCkgJiYgZG1hX3RyYW5zYWN0aW9uLT5vcF9kaXIgPT0gQVRBX0RNQV9XUklURSkpOworCisJ
c2MtPnN0YXRbY2hdIHw9IEFUQV9CTVNUQVRfQUNUSVZFOworCisJLyogcHJkdF9hZGRyZXNzIGlz
IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBwcmR0IGluIHRoZSBndWVzdCBtZW1vcnkgKi8K
KwlwcmR0X2FkZHJlc3MgPSBzYy0+cHJkdFtjaF07CisKKwkvKiBtYXAgdGhlIGd1ZXN0IHBoeXNp
Y2FsIGFkZHJlc3MgaW50byB0aGUgaG9zdCB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlwcmR0ID0gcGFk
ZHJfZ3Vlc3QyaG9zdChjdHgsIHByZHRfYWRkcmVzcywgQVRBX0RNQV9QUkRUX1NJWkUpOworCWFz
c2VydChwcmR0ICE9IE5VTEwpOworCisJYnJlcSA9ICZkbWFfdHJhbnNhY3Rpb24tPmJyZXE7CisJ
YnJlcS0+YnJfcGFyYW0gPSBjaGFubmVsOworCWJyZXEtPmJyX2NhbGxiYWNrID0gYXRhX2hhbmRs
ZV9ibG9ja19yZXF1ZXN0OworCWJyZXEtPmJyX29mZnNldCA9IGRtYV90cmFuc2FjdGlvbi0+b2Zm
c2V0OworCisJZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgPSAwOworCWluZGV4ID0gMDsKKwl3aGls
ZSAoIWRtYV90cmFuc2FjdGlvbi0+aXNfZW90ICYmIGRtYV90cmFuc2FjdGlvbi0+bmJ5dGVzID4g
MCkgeworCQllbnRyeSA9IHByZHQgKyBpbmRleDsKKworCQllbnRyeV9idWZmID0gcGFkZHJfZ3Vl
c3QyaG9zdChjdHgsIGVudHJ5LT5wcmRfYWRkcmVzcywgZW50cnktPmJ5dGVfY291bnQpOworCQli
eXRlX2NvdW50ID0gZW50cnktPmJ5dGVfY291bnQgPyBlbnRyeS0+Ynl0ZV9jb3VudCA6IEFUQV9E
TUFfTUFYX1BSRF9DT1VOVDsKKworCQlpZiAoYnl0ZV9jb3VudCA+IGRtYV90cmFuc2FjdGlvbi0+
bmJ5dGVzKSB7CisJCQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfZG1hX3N0YXJ0OiB0aGUgUFJE
IGVudHJ5IGNvbnRhaW5zICVzIiwKKwkJCSAgICAgICAibW9yZSBieXRlcyB0aGFuIHRoZSBBVEEg
dHJhbnNmZXIgc2l6ZVxuIik7CisJCQlieXRlX2NvdW50ID0gZG1hX3RyYW5zYWN0aW9uLT5uYnl0
ZXM7CisJCX0KKworCQlpZiAoaW5kZXggPT0gQkxPQ0tJRl9JT1ZfTUFYKSB7CisJCQlkcHJpbnQo
TE9HX0VSUiwgInBjaV9hdGFfZG1hX3N0YXJ0OiB0aGUgUFJEIFRhYmxlIGNvbnRhaW5zICVzIiwK
KwkJCSAgICAgICAibW9yZSB0aGFuIEJMT0NLSUZfSU9WX01BWCBlbnRyaWVzXG4iKTsKKwkJCWJy
ZWFrOworCQl9CisKKwkJYnJlcS0+YnJfaW92W2luZGV4XS5pb3ZfbGVuID0gYnl0ZV9jb3VudDsK
KwkJYnJlcS0+YnJfaW92W2luZGV4XS5pb3ZfYmFzZSA9IGVudHJ5X2J1ZmY7CisKKwkJZG1hX3Ry
YW5zYWN0aW9uLT5uYnl0ZXMgLT0gYnl0ZV9jb3VudDsKKworCQlpZiAoZW50cnktPnZlbmRvcl9z
cGVjaWZpYyAmIEFUQV9ETUFfUFJEVF9FT1QpCisJCQlkbWFfdHJhbnNhY3Rpb24tPmlzX2VvdCA9
IDE7CisKKwkJaW5kZXgrKzsKKwl9CisKKwlicmVxLT5icl9pb3ZjbnQgPSBpbmRleDsKKworCXNj
LT5zdGF0W2NoXSB8PSBBVEFfQk1TVEFUX0lOVEVSUlVQVDsKKworCS8qCisJICogVXNlIGFzeW5j
aHJvbm91cyBvcGVyYXRpb25zIGZvciByZWFkIC8gd3JpdGUgb24gdGhlIGJsb2NrOworCSAqIHVw
ZGF0ZSB0aGUgc3RhdHVzIHJlZ2lzdGVycyBhbmQgbm90aWZ5IHRoZSBndWVzdCBvcGVyYXRpbmcK
KwkgKiBzeXN0ZW0gdXNpbmcgYW4gaW50ZXJydXB0IGluIHRoZSBhdGFfaGFuZGxlX2Jsb2NrX3Jl
cXVlc3QgY2FsbGJhY2sKKwkgKi8KKwlpZiAoZG1hX3RyYW5zYWN0aW9uLT5vcF9kaXIgPT0gQVRB
X0RNQV9SRUFEKSB7CisJCWVyciA9IGJsb2NraWZfcmVhZChiY3R4dCwgYnJlcSk7CisJfQorCWVs
c2UgaWYgKGRtYV90cmFuc2FjdGlvbi0+b3BfZGlyID09IEFUQV9ETUFfV1JJVEUpIHsKKwkJZXJy
ID0gYmxvY2tpZl93cml0ZShiY3R4dCwgYnJlcSk7CisJfQorCWVsc2UgeworCQlhc3NlcnQoMCk7
CisJfQorCisJYXNzZXJ0KCFlcnIpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorcGNp
X2F0YV9kbWFfc3RvcChzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MsIHVpbnQ4X3QgY2gpCit7CisJ
c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2F0YV9kbWFf
dHJhbnNhY3Rpb24gKmRtYV90cmFuc2FjdGlvbiA9IE5VTEw7CisKKwljaGFubmVsID0gc2MtPmNo
YW5uZWxzW2NoXTsKKwlkbWFfdHJhbnNhY3Rpb24gPSAmc2MtPmRtYV90cmFuc2FjdGlvbnNbY2hd
OworCisJaWYoIWRtYV90cmFuc2FjdGlvbi0+c3RhcnRlZCkgeworCQlyZXR1cm47CisJfQorCisJ
aWYgKGRtYV90cmFuc2FjdGlvbi0+aXNfZW90ICYmIGRtYV90cmFuc2FjdGlvbi0+bmJ5dGVzID09
IDApIHsKKwkJc2MtPnN0YXRbY2hdIHw9IEFUQV9CTVNUQVRfSU5URVJSVVBUOworCQlzYy0+c3Rh
dFtjaF0gJj0gfkFUQV9CTVNUQVRfRVJST1I7CisJCXNjLT5zdGF0W2NoXSAmPSB+QVRBX0JNU1RB
VF9BQ1RJVkU7CisJfQorCWVsc2UgaWYgKCFkbWFfdHJhbnNhY3Rpb24tPmlzX2VvdCAmJiBkbWFf
dHJhbnNhY3Rpb24tPm5ieXRlcyA9PSAwKSB7CisJCXNjLT5zdGF0W2NoXSB8PSBBVEFfQk1TVEFU
X0lOVEVSUlVQVDsKKwkJc2MtPnN0YXRbY2hdICY9IH5BVEFfQk1TVEFUX0VSUk9SOworCQlzYy0+
c3RhdFtjaF0gfD0gQVRBX0JNU1RBVF9BQ1RJVkU7CisJCWRwcmludChMT0dfRVJSLCAicGNpX2F0
YV9kbWFfc3RvcDogRE1BIFBSRFQgdHJhbnNmZXIgd2FzICVzIiwKKwkJICAgICAgICJsYXJnZXIg
dGhhbiB0aGUgQVRBIHRyYW5zZmVyIHNpemVcbiIpOworCX0KKwllbHNlIGlmIChkbWFfdHJhbnNh
Y3Rpb24tPmlzX2VvdCAmJiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcyA+IDApIHsKKwkJc2MtPnN0
YXRbY2hdICY9IH5BVEFfQk1TVEFUX0lOVEVSUlVQVDsKKwkJc2MtPnN0YXRbY2hdICY9IH5BVEFf
Qk1TVEFUX0VSUk9SOworCQlzYy0+c3RhdFtjaF0gJj0gfkFUQV9CTVNUQVRfQUNUSVZFOworCQlk
cHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfZG1hX3N0b3A6IERNQSBQUkRUIHRyYW5zZmVyIHdhcyAl
cyIsCisJCSAgICAgICAic21hbGxlciB0aGFuIHRoZSBBVEEgdHJhbnNmZXIgc2l6ZVxuIik7CisJ
fQorCWVsc2UgaWYgKCFkbWFfdHJhbnNhY3Rpb24tPmlzX2VvdCAmJiBkbWFfdHJhbnNhY3Rpb24t
Pm5ieXRlcyA+IDApIHsKKwkJc2MtPnN0YXRbY2hdIHw9IEFUQV9CTVNUQVRfRVJST1I7CisJCWRw
cmludChMT0dfRVJSLCAicGNpX2F0YV9kbWFfc3RvcDogdGhlIFBSRCBUYWJsZSBjb250YWlucyAl
cyIsCisJCSAgICAgICAibW9yZSB0aGFuIEJMT0NLSUZfSU9WX01BWCBlbnRyaWVzXG4iKTsKKwl9
CisKKwlkbWFfdHJhbnNhY3Rpb24tPnN0YXJ0ZWQgPSAwOworCisJcmV0dXJuOworfQorCitzdGF0
aWMgdWludDY0X3QKK3BjaV9hdGFfYnVzX21hc3Rlcl9yZWFkKHN0cnVjdCBwY2lfYXRhX3NvZnRj
ICpzYywgdWludDY0X3Qgb2Zmc2V0KQoreworCXVpbnQ2NF90IHZhbHVlID0gMDsKKworCXN3aXRj
aCAob2Zmc2V0KSB7CisJY2FzZSBBVEFfQk1DTURfWF9SRUc6CisJCXZhbHVlID0gc2MtPmNtZFtB
VEFfWF07CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRB
X0JNQ01EX1hfUkVHOiAlbHVcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfQk1TVEFU
X1hfUkVHOgorCQl2YWx1ZSA9IHNjLT5zdGF0W0FUQV9YXTsKKwkJZHByaW50KExPR19ERUJVRywg
InBjaV9hdGFfYnVzX21hc3Rlcl9yZWFkOiBBVEFfQk1TVEFUX1hfUkVHOiAlbHVcbiIsIHZhbHVl
KTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfQk1QUkRUX1hfUkVHOgorCQl2YWx1ZSA9IHNjLT5wcmR0
W0FUQV9YXTsKKwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl9yZWFkOiBB
VEFfQk1QUkRUX1hfUkVHOiAlbHVcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfQk1D
TURfWV9SRUc6CisJCXZhbHVlID0gc2MtPmNtZFtBVEFfWV07CisJCWRwcmludChMT0dfREVCVUcs
ICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNQ01EX1lfUkVHOiAlbHVcbiIsIHZhbHVl
KTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfQk1TVEFUX1lfUkVHOgorCQl2YWx1ZSA9IHNjLT5zdGF0
W0FUQV9ZXTsKKwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl9yZWFkOiBB
VEFfQk1TVEFUX1lfUkVHOiAlbHVcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfQk1Q
UkRUX1lfUkVHOgorCQl2YWx1ZSA9IHNjLT5wcmR0W0FUQV9ZXTsKKwkJZHByaW50KExPR19ERUJV
RywgInBjaV9hdGFfYnVzX21hc3Rlcl9yZWFkOiBBVEFfQk1QUkRUX1lfUkVHOiAlbHVcbiIsIHZh
bHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsdWUgPSAwOworCQlicmVhazsKKwl9CisK
KwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkCitwY2lfYXRhX2J1c19tYXN0ZXJfd3Jp
dGUoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLAorCQl1aW50NjRfdCBvZmZzZXQsIGludCBzaXpl
LCB1aW50NjRfdCB2YWx1ZSkKK3sKKworCXVpbnQ4X3QgcmVnX3ZhbHVlOworCisJaWYgKG9mZnNl
dCAhPSBBVEFfQk1QUkRUX1hfUkVHICYmIG9mZnNldCAhPSBBVEFfQk1QUkRUX1lfUkVHICYmIHNp
emUgIT0gMSkKKwkJcmV0dXJuOworCWlmICgob2Zmc2V0ID09IEFUQV9CTVBSRFRfWF9SRUcgfHwg
b2Zmc2V0ID09IEFUQV9CTVBSRFRfWV9SRUcpICYmIHNpemUgIT0gNCkKKwkJcmV0dXJuOworCisJ
c3dpdGNoIChvZmZzZXQpIHsKKwljYXNlIEFUQV9CTUNNRF9YX1JFRzoKKwkJcmVnX3ZhbHVlID0g
c2MtPmNtZFtBVEFfWF0gPSAodWludDhfdCl2YWx1ZTsKKworCQlkcHJpbnQoTE9HX0RFQlVHLCAi
cGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlW1hdOiBBVEFfQk1DTURfU1RBUlRfU1RPUDogJWRcbiIs
CisJCSAgICAgICByZWdfdmFsdWUgJiBBVEFfQk1DTURfU1RBUlRfU1RPUCk7CisJCWlmIChyZWdf
dmFsdWUgJiBBVEFfQk1DTURfU1RBUlRfU1RPUCkgeworCQkJcGNpX2F0YV9kbWFfc3RhcnQoc2Ms
IEFUQV9YKTsKKwkJfQorCQllbHNlIHsKKwkJCXBjaV9hdGFfZG1hX3N0b3Aoc2MsIEFUQV9YKTsK
KwkJfQorCisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfd3JpdGVbWF06
IEFUQV9CTUNNRF9XUklURV9SRUFEOiAlZFxuIiwKKwkJICAgICAgIHJlZ192YWx1ZSAmIEFUQV9C
TUNNRF9XUklURV9SRUFEKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfQk1TVEFUX1hfUkVHOgorCQly
ZWdfdmFsdWUgPSBzYy0+c3RhdFtBVEFfWF0gPSAodWludDhfdCl2YWx1ZTsKKwkJZHByaW50KExP
R19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtYXTogQVRBX0JNU1RBVF9JTlRFUlJV
UFQ6ICVkLCBBVEFfQk1TVEFUX0VSUk9SOiAlZFxuIiwKKwkJCQlyZWdfdmFsdWUgICYgQVRBX0JN
U1RBVF9JTlRFUlJVUFQsIHJlZ192YWx1ZSAmIEFUQV9CTVNUQVRfRVJST1IpOworCQlpZiAocmVn
X3ZhbHVlICYgQVRBX0JNU1RBVF9JTlRFUlJVUFQpCisJCQlzYy0+c3RhdFtBVEFfWF0gJj0gfkFU
QV9CTVNUQVRfSU5URVJSVVBUOworCQlpZiAocmVnX3ZhbHVlICYgQVRBX0JNU1RBVF9FUlJPUikK
KwkJCXNjLT5zdGF0W0FUQV9YXSAmPSB+QVRBX0JNU1RBVF9FUlJPUjsKKwkJYnJlYWs7CisJY2Fz
ZSBBVEFfQk1QUkRUX1hfUkVHOgorCQlkcHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9idXNfbWFz
dGVyX3dyaXRlW1hdOiBBVEFfQk1QUkRUX1hfUkVHOiAweCV4XG4iLCAodWludDMyX3QpdmFsdWUp
OworCQlzYy0+cHJkdFtBVEFfWF0gPSB2YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfQk1DTURf
WV9SRUc6CisJCXJlZ192YWx1ZSA9IHNjLT5jbWRbQVRBX1ldID0gKHVpbnQ4X3QpdmFsdWU7CisK
KwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtZXTogQVRBX0JN
Q01EX1NUQVJUX1NUT1A6ICVkXG4iLAorCQkgICAgICAgcmVnX3ZhbHVlICYgQVRBX0JNQ01EX1NU
QVJUX1NUT1ApOworCQlpZiAocmVnX3ZhbHVlICYgQVRBX0JNQ01EX1NUQVJUX1NUT1ApIHsKKwkJ
CXBjaV9hdGFfZG1hX3N0YXJ0KHNjLCBBVEFfWSk7CisJCX0KKwkJZWxzZSB7CisJCQlwY2lfYXRh
X2RtYV9zdG9wKHNjLCBBVEFfWSk7CisJCX0KKworCQlkcHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0
YV9idXNfbWFzdGVyX3dyaXRlW1ldOiBBVEFfQk1DTURfV1JJVEVfUkVBRDogJWRcbiIsCisJCSAg
ICAgICByZWdfdmFsdWUgJiBBVEFfQk1DTURfV1JJVEVfUkVBRCk7CisJCWJyZWFrOworCWNhc2Ug
QVRBX0JNU1RBVF9ZX1JFRzoKKwkJcmVnX3ZhbHVlID0gc2MtPnN0YXRbQVRBX1ldID0gKHVpbnQ4
X3QpdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfd3JpdGVb
WV06IEFUQV9CTVNUQVRfSU5URVJSVVBUOiAlZCwgQVRBX0JNU1RBVF9FUlJPUjogJWRcbiIsCisJ
CQkJcmVnX3ZhbHVlICAmIEFUQV9CTVNUQVRfSU5URVJSVVBULCByZWdfdmFsdWUgJiBBVEFfQk1T
VEFUX0VSUk9SKTsKKwkJaWYgKHJlZ192YWx1ZSAmIEFUQV9CTVNUQVRfSU5URVJSVVBUKQorCQkJ
c2MtPnN0YXRbQVRBX1ldICY9IH5BVEFfQk1TVEFUX0lOVEVSUlVQVDsKKwkJaWYgKHJlZ192YWx1
ZSAmIEFUQV9CTVNUQVRfRVJST1IpCisJCQlzYy0+c3RhdFtBVEFfWV0gJj0gfkFUQV9CTVNUQVRf
RVJST1I7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJEVF9ZX1JFRzoKKwkJZHByaW50KExPR19E
RUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtZXTogQVRBX0JNUFJEVF9YX1JFRzogMHgl
eFxuIiwgKHVpbnQzMl90KXZhbHVlKTsKKwkJc2MtPnByZHRbQVRBX1ldID0gKHVpbnQzMl90KXZh
bHVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisK
K3N0YXRpYyB1aW50NjRfdAorcGNpX2F0YV9yZWFkKHN0cnVjdCB2bWN0eCAqY3R4LCBpbnQgdmNw
dSwgc3RydWN0IHBjaV9kZXZpbnN0ICpwaSwgaW50IGJhcmlkeCwKKwkJdWludDY0X3Qgb2Zmc2V0
LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MgPSBwaS0+cGlfYXJnOwor
CXVpbnQ2NF90IHZhbHVlID0gMDsKKworCXN3aXRjaCAoYmFyaWR4KSB7CisJY2FzZSBQQ0lfQkFS
MDoKKwkJaWYgKCFzYy0+Y2hhbm5lbHNbQVRBX1hdKQorCQkJYnJlYWs7CisJCWFzc2VydChhdGFf
Y2hhbm5lbF9pc19vayhzYy0+Y2hhbm5lbHNbQVRBX1hdLCBBVEFfWCkpOworCQl2YWx1ZSA9IGF0
YV9jb21tYW5kX2Jsb2NrX3JlYWQoc2MtPmNoYW5uZWxzW0FUQV9YXSwgb2Zmc2V0KTsKKwkJYnJl
YWs7CisJY2FzZSBQQ0lfQkFSMToKKwkJaWYgKCFzYy0+Y2hhbm5lbHNbQVRBX1hdKQorCQkJYnJl
YWs7CisJCWFzc2VydChhdGFfY2hhbm5lbF9pc19vayhzYy0+Y2hhbm5lbHNbQVRBX1hdLCBBVEFf
WCkpOworCQl2YWx1ZSA9IGF0YV9hbHRzdGF0dXNfcmVhZChzYy0+Y2hhbm5lbHNbQVRBX1hdKTsK
KwkJYnJlYWs7CisJY2FzZSBQQ0lfQkFSMjoKKwkJaWYgKCFzYy0+Y2hhbm5lbHNbQVRBX1ldKQor
CQkJYnJlYWs7CisJCWFzc2VydChhdGFfY2hhbm5lbF9pc19vayhzYy0+Y2hhbm5lbHNbQVRBX1ld
LCBBVEFfWSkpOworCQl2YWx1ZSA9IGF0YV9jb21tYW5kX2Jsb2NrX3JlYWQoc2MtPmNoYW5uZWxz
W0FUQV9ZXSwgb2Zmc2V0KTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfQkFSMzoKKwkJaWYgKCFzYy0+
Y2hhbm5lbHNbQVRBX1ldKQorCQkJYnJlYWs7CisJCWFzc2VydChhdGFfY2hhbm5lbF9pc19vayhz
Yy0+Y2hhbm5lbHNbQVRBX1ldLCBBVEFfWSkpOworCQl2YWx1ZSA9IGF0YV9hbHRzdGF0dXNfcmVh
ZChzYy0+Y2hhbm5lbHNbQVRBX1ldKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfQkFSNDoKKwkJdmFs
dWUgPSBwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZChzYywgb2Zmc2V0KTsKKwkJYnJlYWs7CisJZGVm
YXVsdDoKKwkJYXNzZXJ0KDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CisK
K3N0YXRpYyB2b2lkCitwY2lfYXRhX3dyaXRlKHN0cnVjdCB2bWN0eCAqY3R4LCBpbnQgdmNwdSwg
c3RydWN0IHBjaV9kZXZpbnN0ICpwaSwKKwkJaW50IGJhcmlkeCwgdWludDY0X3Qgb2Zmc2V0LCBp
bnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7CisJc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjID0g
cGktPnBpX2FyZzsKKworCXN3aXRjaCAoYmFyaWR4KSB7CisJY2FzZSBQQ0lfQkFSMDoKKwkJaWYg
KCFzYy0+Y2hhbm5lbHNbQVRBX1hdKQorCQkJYnJlYWs7CisJCWFzc2VydChhdGFfY2hhbm5lbF9p
c19vayhzYy0+Y2hhbm5lbHNbQVRBX1hdLCBBVEFfWCkpOworCQlhdGFfY29tbWFuZF9ibG9ja193
cml0ZShzYy0+Y2hhbm5lbHNbQVRBX1hdLCBvZmZzZXQsIHNpemUsIHZhbHVlKTsKKwkJYnJlYWs7
CisJY2FzZSBQQ0lfQkFSMToKKwkJaWYgKCFzYy0+Y2hhbm5lbHNbQVRBX1hdKQorCQkJYnJlYWs7
CisJCWFzc2VydChhdGFfY2hhbm5lbF9pc19vayhzYy0+Y2hhbm5lbHNbQVRBX1hdLCBBVEFfWCkp
OworCQlhdGFfY29udHJvbF93cml0ZShzYy0+Y2hhbm5lbHNbQVRBX1hdLCBzaXplLCB2YWx1ZSk7
CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjI6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9ZXSkK
KwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9Z
XSwgQVRBX1kpKTsKKwkJYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGUoc2MtPmNoYW5uZWxzW0FUQV9Z
XSwgb2Zmc2V0LCBzaXplLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjM6CisJCWlm
ICghc2MtPmNoYW5uZWxzW0FUQV9ZXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxf
aXNfb2soc2MtPmNoYW5uZWxzW0FUQV9ZXSwgQVRBX1kpKTsKKwkJYXRhX2NvbnRyb2xfd3JpdGUo
c2MtPmNoYW5uZWxzW0FUQV9ZXSwgc2l6ZSwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFBDSV9C
QVI0OgorCQlwY2lfYXRhX2J1c19tYXN0ZXJfd3JpdGUoc2MsIG9mZnNldCwgc2l6ZSwgdmFsdWUp
OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhc3NlcnQoMCk7CisJCWJyZWFrOworCX0KKworCXJl
dHVybjsKK30KKworLyoKKyAqIExQQyBBVEEgZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyAqLworc3Rh
dGljIHZvaWQKK2xwY19hdGFfaW50cl9hc3NlcnQodm9pZCAqYXJnKQoreworCXN0cnVjdCBscGNf
YXRhX3NvZnRjICpzY19scGNfYXRhID0gKHN0cnVjdCBscGNfYXRhX3NvZnRjICopYXJnOworCXN0
cnVjdCB2bWN0eCAqbHBjX2N0eCA9IHNjX2xwY19hdGEtPmNoYW5uZWwtPnZtX2N0eDsKKworCXZt
X2lzYV9wdWxzZV9pcnEobHBjX2N0eCwgc2NfbHBjX2F0YS0+aXJxLCBzY19scGNfYXRhLT5pcnEp
OworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorbHBjX2F0YV9pbnRyX2RlYXNzZXJ0KHZv
aWQgKmFyZykKK3sKKwkvKgorCSAqIFRoZSBBVEEgZGV2aWNlcyBvbiB0aGUgTFBDIGJ1cyBnZW5l
cmF0ZSBlZGdlIHRyaWdnZXJlZCBpbnRlcnJ1cHRzCisJICogc28gbm90aGluZyBtb3JlIHRvIGRv
IGhlcmUKKwkgKi8KKworCXJldHVybjsKK30KKworaW50CitscGNfYXRhX2luaXQoc3RydWN0IHZt
Y3R4ICpjdHgsIGNvbnN0IGNoYXIgKm9wdHMpCit7CisJc3RydWN0IGF0YV9jaGFubmVsICpjaGFu
bmVsID0gTlVMTDsKKwlzdHJ1Y3QgaW5vdXRfcG9ydCBpb3AsIGlvY3RscDsKKwlpbnQgY2hfYXRh
ID0gLTE7CisJaW50IGVycjsKKworCWF0YV9vcGVuX2RiZ19maWxlKCk7CisKKwlhc3NlcnQob3B0
c1swXSA9PSAnMCcgfHwgb3B0c1swXSA9PSAnMScpOworCWNoX2F0YSA9IG9wdHNbMF0gLSAnMCc7
CisKKwlpZiAobHBjX2F0YV9zY1tjaF9hdGFdLmNoYW5uZWwpIHsKKwkJZHByaW50KExPR19FUlIs
ICJscGNfYXRhX2luaXQ6IHRoZSBMUEMgYXRhJWQgaXMgaW5pdGlhbGl6ZWRcbiIsIGNoX2F0YSk7
CisJCXJldHVybiAtMTsKKwl9CisKKwljaGFubmVsID0gYXRhX2luaXQoY3R4LCBscGNfYXRhX2lu
dHJfYXNzZXJ0LCBscGNfYXRhX2ludHJfZGVhc3NlcnQsICZscGNfYXRhX3NjW2NoX2F0YV0sIG9w
dHMsIDEpOworCWlmICghY2hhbm5lbCkKKwkJcmV0dXJuIC0xOworCisJYXNzZXJ0KGNoX2F0YSA9
PSBjaGFubmVsLT5pbnRlcmZhY2UpOworCWNoYW5uZWwtPnVzZV8xNmJpdCA9IDE7CisKKwlscGNf
YXRhX3NjW2NoX2F0YV0uY2hhbm5lbCA9IGNoYW5uZWw7CisKKwliemVybygmaW9wLCBzaXplb2Yo
c3RydWN0IGlub3V0X3BvcnQpKTsKKwlpb3AubmFtZSA9IGxwY19hdGFfc2NbY2hfYXRhXS5uYW1l
X2lvOworCWlvcC5wb3J0ID0gbHBjX2F0YV9zY1tjaF9hdGFdLmJhc2VfYWRkcl9pbzsKKwlpb3Au
c2l6ZSA9IEFUQV9JT1NJWkU7CisJaW9wLmZsYWdzID0gSU9QT1JUX0ZfSU5PVVQ7CisJaW9wLmhh
bmRsZXIgPSBscGNfYXRhX2lvX2hhbmRsZXI7CisJaW9wLmFyZyA9ICZscGNfYXRhX3NjW2NoX2F0
YV07CisKKwllcnIgPSByZWdpc3Rlcl9pbm91dCgmaW9wKTsKKwlhc3NlcnQoZXJyID09IDApOwor
CisJYnplcm8oJmlvY3RscCwgc2l6ZW9mKHN0cnVjdCBpbm91dF9wb3J0KSk7CisJaW9jdGxwLm5h
bWUgPSBscGNfYXRhX3NjW2NoX2F0YV0ubmFtZV9pb2N0bDsKKwlpb2N0bHAucG9ydCA9IGxwY19h
dGFfc2NbY2hfYXRhXS5iYXNlX2FkZHJfaW9jdGw7CisJaW9jdGxwLnNpemUgPSBBVEFfQ1RMSU9T
SVpFOworCWlvY3RscC5mbGFncyA9IElPUE9SVF9GX0lOT1VUOworCWlvY3RscC5oYW5kbGVyID0g
bHBjX2F0YV9pb2N0bF9oYW5kbGVyOworCWlvY3RscC5hcmcgPSAmbHBjX2F0YV9zY1tjaF9hdGFd
OworCisJZXJyID0gcmVnaXN0ZXJfaW5vdXQoJmlvY3RscCk7CisJYXNzZXJ0KGVyciA9PSAwKTsK
KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitscGNfYXRhX2lvX2hhbmRsZXIoc3RydWN0
IHZtY3R4ICpjdHgsIGludCB2Y3B1LAorCQkgICBpbnQgaW4sIGludCBwb3J0LCBpbnQgYnl0ZXMs
IHVpbnQzMl90ICplYXgsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbHBjX2F0YV9zb2Z0YyAqbHBj
X3NjID0gKHN0cnVjdCBscGNfYXRhX3NvZnRjICopYXJnOworCXN0cnVjdCBhdGFfY2hhbm5lbCAq
Y2hhbm5lbCA9IE5VTEw7CisJdWludDhfdCBvZmZzZXQgPSAwOworCisJYXNzZXJ0KGxwY19zYyk7
CisJY2hhbm5lbCA9IGxwY19zYy0+Y2hhbm5lbDsKKwlhc3NlcnQoY2hhbm5lbCk7CisKKwlvZmZz
ZXQgPSBwb3J0IC0gbHBjX3NjLT5iYXNlX2FkZHJfaW87CisJYXNzZXJ0KG9mZnNldCA8IEFUQV9J
T1NJWkUpOworCisJaWYgKGluKQorCQkqZWF4ID0gYXRhX2NvbW1hbmRfYmxvY2tfcmVhZChjaGFu
bmVsLCBvZmZzZXQpOworCWVsc2UKKwkJYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGUoY2hhbm5lbCwg
b2Zmc2V0LCBieXRlcywgKmVheCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbHBj
X2F0YV9pb2N0bF9oYW5kbGVyKHN0cnVjdCB2bWN0eCAqY3R4LCBpbnQgdmNwdSwKKwkJICAgaW50
IGluLCBpbnQgcG9ydCwgaW50IGJ5dGVzLCB1aW50MzJfdCAqZWF4LCB2b2lkICphcmcpCit7CisJ
c3RydWN0IGxwY19hdGFfc29mdGMgKmxwY19zYyA9IChzdHJ1Y3QgbHBjX2F0YV9zb2Z0YyAqKWFy
ZzsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCXVpbnQ4X3Qgb2Zmc2V0
ID0gMDsKKworCWFzc2VydChscGNfc2MpOworCWNoYW5uZWwgPSBscGNfc2MtPmNoYW5uZWw7CisJ
YXNzZXJ0KGNoYW5uZWwpOworCisJb2Zmc2V0ID0gcG9ydCAtIGxwY19zYy0+YmFzZV9hZGRyX2lv
Y3RsOworCWFzc2VydChvZmZzZXQgPCBBVEFfQ1RMSU9TSVpFKTsKKworCWlmIChpbikKKwkJKmVh
eCA9IGF0YV9hbHRzdGF0dXNfcmVhZChjaGFubmVsKTsKKwllbHNlCisJCWF0YV9jb250cm9sX3dy
aXRlKGNoYW5uZWwsIGJ5dGVzLCAqZWF4KTsKKworCXJldHVybiAwOworfQorCgo=


--b1_20774e3b9cd644f6a8fda9289c7404d7--



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