2015-11-12 03:51:14

by David Lin

[permalink] [raw]
Subject: [PATCH v7] Add new mac80211 driver mwlwifi.

VGhpcyBwYXRjaCBwcm92aWRlcyB0aGUgbXdsd2lmaSBkcml2ZXIgZm9yIE1hcnZlbGwgODg2Mywg
ODg2NCBhbmQgODg5Nw0KY2hpcHNldHMuDQpUaGlzIGRyaXZlciB3YXMgZGV2ZWxvcGVkIGFzIHBh
cnQgb2YgdGhlIG9wZW53cnQub3JnIHByb2plY3QgdG8gc3VwcG9ydA0KTGlua3N5cyBXUlQxOTAw
QUMgYW5kIGlzIG1haW50YWluZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2thbG96L213bHdpZmku
DQoNClRoZSBtd2x3aWZpIGRyaXZlciBkaWZmZXJzIGZyb20gZXhpc3RpbmcgbXdpZmlleCBkcml2
ZXI6DQpvIG13bHdpZmkgaXMgYSAic29mdG1hYyBkcml2ZXIiIHVzaW5nIHRoZSBrZXJuZWw/7qiD
IG1hYzgwMi4xMSBzdWJzeXN0ZW0NCnRvIHByb3ZpZGUgZnVsbCBBUC9XaXJlbGVzcyBCcmlkZ2Ug
ZnVuY3Rpb25hbGl0eSAocm91dGVycykuDQpvIG13aWZpZXggaXMgYSAiZnVsbG1hYyBkcml2ZXIi
IHdoaWNoIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBzZXQgb2YNCmNsaWVudCBmdW5jdGlvbnMg
KGxhcHRvcHMvZW1iZWRkZWQgZGV2aWNlcykNCm8gb25seSBtd2x3aWZpIHN1cHBvcnRzIE1hcnZl
bGwgQVAgY2hpcCA4ODZYIHNlcmllcw0KDQpOT1RFOiBVc2VycyB3aXRoIE1hcnZlbGwgODhXODg5
NyBjaGlwc2V0cyBjdXJyZW50bHkgc2hvdWxkIGVuYWJsZQ0KKENPTkZJRz1ZIG9yIE0pIGVpdGhl
ciBDT05GSUdfTVdJRklFWCBvciBDT05GSUdfTVdMV0lGSSwgTk9UIEJPVEguDQoNCm13bHdpZmkg
ZHJpdmVyIGxldmVyYWdlZCBjb2RlIGZyb20gZXhpc3RpbmcgTVdMOEsgZHJpdmVyIGluIHRoZQ0K
Zm9sbG93aW5nIGFyZWFzOg0KLSA4MDIuMTFuIHNldHRpbmcgZm9yIG1hYzgwMjExDQotIEZ1bmN0
aW9ucyBuZWVkZWQgdG8gaG9vayB1cCB0byBtYWM4MDIxMQ0KLSBJbnRlcmFjdGlvbnMgd2l0aCBt
YWM4MDIxMSB0byBlc3RhYmxpc2ggQkEgc3RyZWFtcw0KLSBQYXJ0aWFsIGZpcm13YXJlIEFQSXMs
IHNvbWUgZGF0YSBmaWVsZHMNCi0gTWV0aG9kIHRvIHBhc3MgUnggcGFja2V0cyB0byBtYWM4MDIx
MSBleGNlcHQgMTFhYyByYXRlcw0KDQpJbiBhZGRpdGlvbiwgbXdsd2lmaSBkcml2ZXIgc3VwcG9y
dHM6DQotIGZ1dHVyZSBzY2FsYWJpbGl0eSBhbmQgZnV0dXJlIGRldmVsb3BtZW50IChyZWZhY3Rv
cmVkIHNvdXJjZSBjb2RlKQ0KLSBNYXJ2ZWxsIDgwMi4xMWFjIGNoaXBzZXRzLCBpbmNsdWRpbmcg
Y29tYm8gQlQgZGV2aWNlcw0KLSA4MDIuMTFhYyByZWxhdGVkIHNldHRpbmdzIGFuZCBmdW5jdGlv
bnMNCi0gY29uY3VycmVudCBBUCtTVEEgZnVuY3Rpb25hbGl0aWVzIHdpdGggc2luZ2xlIGZpcm13
YXJlIHBlciBjaGlwDQotIGZpcm13YXJlIEFQSXMgZm9yIHRoZSBzdXBwb3J0ZWQgY2hpcHNldA0K
LSBjb21tdW5pY2F0aW5nIG5ldyBtYWM4MDIxMSBzZXR0aW5ncyB0byBmaXJtd2FyZQ0KLSBEaWZm
ZXJlbnQgVFgvUlggZGF0YXBhdGggd2hlcmUgYXBwbGljYWJsZQ0KLSBBLU1TRFUgYW5kIEEtTVBE
VQ0KLSBtYWM4MDIxMS1iYXNlZCBNRVNIICh3b3JrIGluIHByb2dyZXNzKQ0KLSBSZWZpbmVkIHRo
ZSBjb2RlIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQoNCk5PVEU6IE1XTFdJRkkgd2lsbCBiZSBv
cmdhbml6ZWQgdW5kZXIgbmV3IHZlbmRvciBzcGVjaWZpYyBmb2xkZXIvbWFydmVsbCwNCmFzIHBl
ciByZXF1ZXN0IG9mIHRoZSBnYXRlIGtlZXBlciBhbmQgY29tbXVuaXR5Lg0KDQpTaWduZWQtb2Zm
LWJ5OiBEYXZpZCBMaW4gPGRsaW5AbWFydmVsbC5jb20+DQotLS0NCiBNQUlOVEFJTkVSUyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDYgKw0KIGRyaXZlcnMvbmV0L3dp
cmVsZXNzL0tjb25maWcgICAgICAgICAgICAgICAgICAgIHwgICAgMSArDQogZHJpdmVycy9uZXQv
d2lyZWxlc3MvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgfCAgICAyICsNCiBkcml2ZXJzL25l
dC93aXJlbGVzcy9tYXJ2ZWxsL0tjb25maWcgICAgICAgICAgICB8ICAgIDggKw0KIGRyaXZlcnMv
bmV0L3dpcmVsZXNzL21hcnZlbGwvTWFrZWZpbGUgICAgICAgICAgIHwgICAgMSArDQogZHJpdmVy
cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL0tjb25maWcgICAgfCAgIDIzICsNCiBkcml2
ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvTWFrZWZpbGUgICB8ICAgMTIgKw0KIGRy
aXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9kZWJ1Z2ZzLmMgIHwgIDQzMyArKysr
DQogZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2RlYnVnZnMuaCAgfCAgIDI0
ICsNCiBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvZGV2LmggICAgICB8ICA0
NzcgKysrKysNCiBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvZndjbWQuYyAg
ICB8IDI0MjEgKysrKysrKysrKysrKysrKysrKysrKysNCiBkcml2ZXJzL25ldC93aXJlbGVzcy9t
YXJ2ZWxsL213bHdpZmkvZndjbWQuaCAgICB8ICAxOTggKysNCiBkcml2ZXJzL25ldC93aXJlbGVz
cy9tYXJ2ZWxsL213bHdpZmkvZndkbC5jICAgICB8ICAxOTkgKysNCiBkcml2ZXJzL25ldC93aXJl
bGVzcy9tYXJ2ZWxsL213bHdpZmkvZndkbC5oICAgICB8ICAgMjUgKw0KIGRyaXZlcnMvbmV0L3dp
cmVsZXNzL21hcnZlbGwvbXdsd2lmaS9ob3N0Y21kLmggIHwgIDc4NiArKysrKysrKw0KIGRyaXZl
cnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9pc3IuYyAgICAgIHwgIDE1MCArKw0KIGRy
aXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9pc3IuaCAgICAgIHwgICAyNiArDQog
ZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL21hYzgwMjExLmMgfCAgNjk5ICsr
KysrKysNCiBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvbWFpbi5jICAgICB8
ICA3MzkgKysrKysrKw0KIGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9yeC5j
ICAgICAgIHwgIDYyNCArKysrKysNCiBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdp
ZmkvcnguaCAgICAgICB8ICAgMjUgKw0KIGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXds
d2lmaS9zeXNhZHB0LmggIHwgICA3MyArDQogZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t
d2x3aWZpL3R4LmMgICAgICAgfCAxMjUxICsrKysrKysrKysrKw0KIGRyaXZlcnMvbmV0L3dpcmVs
ZXNzL21hcnZlbGwvbXdsd2lmaS90eC5oICAgICAgIHwgICAzNiArDQogMjQgZmlsZXMgY2hhbmdl
ZCwgODIzOSBpbnNlcnRpb25zKCspDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dp
cmVsZXNzL21hcnZlbGwvS2NvbmZpZw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL25ldC93
aXJlbGVzcy9tYXJ2ZWxsL01ha2VmaWxlDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0
L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9LY29uZmlnDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRy
aXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9NYWtlZmlsZQ0KIGNyZWF0ZSBtb2Rl
IDEwMDY0NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvZGVidWdmcy5jDQog
Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9k
ZWJ1Z2ZzLmgNCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVs
bC9td2x3aWZpL2Rldi5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dpcmVsZXNz
L21hcnZlbGwvbXdsd2lmaS9md2NtZC5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0
L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9md2NtZC5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRy
aXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9md2RsLmMNCiBjcmVhdGUgbW9kZSAx
MDA2NDQgZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2Z3ZGwuaA0KIGNyZWF0
ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvaG9zdGNt
ZC5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXds
d2lmaS9pc3IuYw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2
ZWxsL213bHdpZmkvaXNyLmgNCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9uZXQvd2lyZWxl
c3MvbWFydmVsbC9td2x3aWZpL21hYzgwMjExLmMNCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy
cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL21haW4uYw0KIGNyZWF0ZSBtb2RlIDEwMDY0
NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvcnguYw0KIGNyZWF0ZSBtb2Rl
IDEwMDY0NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvcnguaA0KIGNyZWF0
ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvc3lzYWRw
dC5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXds
d2lmaS90eC5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl
bGwvbXdsd2lmaS90eC5oDQoNCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJT
DQppbmRleCAyN2IyN2MwLi43YzMyZjBhIDEwMDY0NA0KLS0tIGEvTUFJTlRBSU5FUlMNCisrKyBi
L01BSU5UQUlORVJTDQpAQCAtNjYyOSw2ICs2NjI5LDEyIEBAIEw6CWxpbnV4LXdpcmVsZXNzQHZn
ZXIua2VybmVsLm9yZw0KIFM6CU9kZCBGaXhlcw0KIEY6CWRyaXZlcnMvbmV0L3dpcmVsZXNzL213
bDhrLmMNCiANCitNQVJWRUxMIE1XTFdJRkkgV0lSRUxFU1MgRFJJVkVSDQorTToJRGF2aWQgTGlu
IDxkbGluQG1hcnZlbGwuY29tPg0KK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZw0K
K1M6CU1haW50YWluZWQNCitGOglkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkN
CisNCiBNQVJWRUxMIFNPQyBNTUMvU0QvU0RJTyBDT05UUk9MTEVSIERSSVZFUg0KIE06CU5pY29s
YXMgUGl0cmUgPG5pY29AZmx1eG5pYy5uZXQ+DQogUzoJT2RkIEZpeGVzDQpkaWZmIC0tZ2l0IGEv
ZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25m
aWcNCmluZGV4IGY5Zjk0MjIuLmQ1OTliMzUgMTAwNjQ0DQotLS0gYS9kcml2ZXJzL25ldC93aXJl
bGVzcy9LY29uZmlnDQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnDQpAQCAtMjg1
LDUgKzI4NSw2IEBAIHNvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvS2NvbmZp
ZyINCiBzb3VyY2UgImRyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvS2NvbmZpZyINCiBzb3Vy
Y2UgImRyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC9LY29uZmlnIg0KIHNvdXJjZSAiZHJpdmVy
cy9uZXQvd2lyZWxlc3MvcnNpL0tjb25maWciDQorc291cmNlICJkcml2ZXJzL25ldC93aXJlbGVz
cy9tYXJ2ZWxsL0tjb25maWciDQogDQogZW5kaWYgIyBXTEFODQpkaWZmIC0tZ2l0IGEvZHJpdmVy
cy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQ0K
aW5kZXggNzQwZmRkMy4uNzE1MDRhNyAxMDA2NDQNCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNz
L01ha2VmaWxlDQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQ0KQEAgLTYwLDMg
KzYwLDUgQEAgb2JqLSQoQ09ORklHX0JSQ01TTUFDKQkrPSBicmNtODAyMTEvDQogDQogb2JqLSQo
Q09ORklHX0NXMTIwMCkJKz0gY3cxMjAwLw0KIG9iai0kKENPTkZJR19SU0lfOTFYKQkrPSByc2kv
DQorDQorb2JqLSQoQ09ORklHX1dMX01BUlZFTEwpCSs9IG1hcnZlbGwvDQpkaWZmIC0tZ2l0IGEv
ZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxl
c3MvbWFydmVsbC9LY29uZmlnDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4u
ZDczZTY0Mg0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVs
bC9LY29uZmlnDQpAQCAtMCwwICsxLDggQEANCittZW51Y29uZmlnIFdMX01BUlZFTEwNCisJYm9v
bCAiTWFydmVsbCBXaXJlbGVzcyBMQU4gc3VwcG9ydCINCisJLS0taGVscC0tLQ0KKwkgIEVuYWJs
ZSBjb21tdW5pdHkgZHJpdmVycyBmb3IgTWFydmVsbCBXaS1GaSBkZXZpY2VzLg0KKw0KK2lmIFdM
X01BUlZFTEwNCitzb3VyY2UgImRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9L
Y29uZmlnIg0KK2VuZGlmICMgV0xfTUFSVkVMTA0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dp
cmVsZXNzL21hcnZlbGwvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL01h
a2VmaWxlDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uNzBkMWIzZg0KLS0t
IC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9NYWtlZmlsZQ0K
QEAgLTAsMCArMSBAQA0KK29iai0kKENPTkZJR19NV0xXSUZJKQkrPSBtd2x3aWZpLw0KZGlmZiAt
LWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9LY29uZmlnIGIvZHJp
dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL0tjb25maWcNCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0DQppbmRleCAwMDAwMDAwLi5hOWJjYjljDQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2
ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvS2NvbmZpZw0KQEAgLTAsMCArMSwyMyBA
QA0KK2NvbmZpZyBNV0xXSUZJDQorCXRyaXN0YXRlICJNYXJ2ZWxsIEF2YXN0YXIgODhXODg2NC84
OFc4ODk3IFBDSWUgZHJpdmVyIChtYWM4MDIxMSBjb21wYXRpYmxlKSINCisJZGVwZW5kcyBvbiBQ
Q0kgJiYgTUFDODAyMTENCisJc2VsZWN0IEZXX0xPQURFUg0KKwktLS1oZWxwLS0tDQorCQlTZWxl
Y3QgdG8gYnVpbGQgdGhlIGRyaXZlciBzdXBwb3J0aW5nIHRoZToNCisNCisJCU1hcnZlbGwgV2ly
ZWxlc3MgV2ktRmkgODhXODg2NCBtb2R1bGVzDQorCQlNYXJ2ZWxsIFdpcmVsZXNzIFdpLUZpIDg4
Vzg4OTcgbW9kdWxlcw0KKw0KKwkJVGhpcyBkcml2ZXIgdXNlcyB0aGUga2VybmVsJ3MgbWFjODAy
MTEgc3Vic3lzdGVtLg0KKw0KKwkJSWYgeW91IHdhbnQgdG8gY29tcGlsZSB0aGUgZHJpdmVyIGFz
IGEgbW9kdWxlICg9IGNvZGUgd2hpY2ggY2FuIGJlDQorCQlpbnNlcnRlZCBpbiBhbmQgcmVtb3Zl
ZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCksDQorCQlzYXkgTSBo
ZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4gIFRo
ZQ0KKwkJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG13bHdpZmkuDQorDQorCQlOT1RFOiBTZWxlY3Rp
bmcgdGhpcyBkcml2ZXIgbWF5IGNhdXNlIGNvbmZsaWN0IHdpdGggTVdJRklFWCBkcml2ZXINCisJ
CXRoYXQgYWxzbyBvcGVyYXRlcyBvbiB0aGUgc2FtZSBwYXJ0IG51bWJlciA4OFc4ODk3LiBVc2Vy
cyBzaG91bGQNCisJCXNlbGVjdCBlaXRoZXIgTVdJRklFWCBvciBNV0xXSUZJLCBub3QgYm90aC4g
TVdJRklFWCBpcyBmdWxsbWFjLA0KKwkJc3VwcG9ydGluZyBtb3JlIGNvbXByZWhlbnNpdmUgY2xp
ZW50IGZ1bmN0aW9ucyBmb3IgbGFwdG9wcy9lbWJlZGRlZA0KKwkJZGV2aWNlcy4gTVdMV0lGSSBp
cyBtYWM4MDIxMS1iYXNlZCBmb3IgZnVsbCBBUC9XaXJlbGVzcyBCcmlkZ2UuDQorDQpkaWZmIC0t
Z2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL01ha2VmaWxlIGIvZHJp
dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL01ha2VmaWxlDQpuZXcgZmlsZSBtb2Rl
IDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uODhmN2VmZA0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJp
dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL01ha2VmaWxlDQpAQCAtMCwwICsxLDEy
IEBADQorb2JqLSQoQ09ORklHX01XTFdJRkkpCSs9IG13bHdpZmkubw0KKw0KK213bHdpZmktb2Jq
cwkJKz0gbWFpbi5vDQorbXdsd2lmaS1vYmpzCQkrPSBtYWM4MDIxMS5vDQorbXdsd2lmaS1vYmpz
CQkrPSBmd2RsLm8NCittd2x3aWZpLW9ianMJCSs9IGZ3Y21kLm8NCittd2x3aWZpLW9ianMJCSs9
IHR4Lm8NCittd2x3aWZpLW9ianMJCSs9IHJ4Lm8NCittd2x3aWZpLW9ianMJCSs9IGlzci5vDQor
bXdsd2lmaS0kKENPTkZJR19ERUJVR19GUykgKz0gZGVidWdmcy5vDQorDQorY2NmbGFncy15ICs9
IC1EX19DSEVDS19FTkRJQU5fXw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21h
cnZlbGwvbXdsd2lmaS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213
bHdpZmkvZGVidWdmcy5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uOTk3
NDYxYQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t
d2x3aWZpL2RlYnVnZnMuYw0KQEAgLTAsMCArMSw0MzMgQEANCisvKg0KKyAqIENvcHlyaWdodCAo
QykgMjAwNi0yMDE1LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBz
b2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVy
bmF0aW9uYWwNCisgKiBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZ
b3UgbWF5IHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICog
YWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwg
YSBjb3B5IG9mIHdoaWNoDQorICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVU
RUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFDQorICogQVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2Ug
cHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNj
bGFpbWVyLg0KKyAqLw0KKw0KKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGltcGxlbWVudHMg
ZGVidWcgZnMgcmVsYXRlZCBmdW5jdGlvbnMuICovDQorDQorI2luY2x1ZGUgPGxpbnV4L2RlYnVn
ZnMuaD4NCisNCisjaW5jbHVkZSAic3lzYWRwdC5oIg0KKyNpbmNsdWRlICJkZXYuaCINCisjaW5j
bHVkZSAiaG9zdGNtZC5oIg0KKyNpbmNsdWRlICJmd2NtZC5oIg0KKyNpbmNsdWRlICJkZWJ1Z2Zz
LmgiDQorDQorI2RlZmluZSBNV0xXSUZJX0RFQlVHRlNfQUREX0ZJTEUobmFtZSkgZG8geyBcDQor
CWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgjbmFtZSwgMDY0NCwgcHJpdi0+ZGVidWdmc19waHks
IFwNCisJCQkJIHByaXYsICZtd2xfZGVidWdmc18jI25hbWUjI19mb3BzKSkgXA0KKwkJcmV0dXJu
OyBcDQorfSB3aGlsZSAoMCkNCisNCisjZGVmaW5lIE1XTFdJRklfREVCVUdGU19GSUxFX09QUyhu
YW1lKSBcDQorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbXdsX2RlYnVnZnNf
IyNuYW1lIyNfZm9wcyA9IHsgXA0KKwkucmVhZCA9IG13bF9kZWJ1Z2ZzXyMjbmFtZSMjX3JlYWQs
IFwNCisJLndyaXRlID0gbXdsX2RlYnVnZnNfIyNuYW1lIyNfd3JpdGUsIFwNCisJLm9wZW4gPSBz
aW1wbGVfb3BlbiwgXA0KK30NCisNCisjZGVmaW5lIE1XTFdJRklfREVCVUdGU19GSUxFX1JFQURf
T1BTKG5hbWUpIFwNCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtd2xfZGVi
dWdmc18jI25hbWUjI19mb3BzID0geyBcDQorCS5yZWFkID0gbXdsX2RlYnVnZnNfIyNuYW1lIyNf
cmVhZCwgXA0KKwkub3BlbiA9IHNpbXBsZV9vcGVuLCBcDQorfQ0KKw0KKyNkZWZpbmUgTVdMV0lG
SV9ERUJVR0ZTX0ZJTEVfV1JJVEVfT1BTKG5hbWUpIFwNCitzdGF0aWMgY29uc3Qgc3RydWN0IGZp
bGVfb3BlcmF0aW9ucyBtd2xfZGVidWdmc18jI25hbWUjI19mb3BzID0geyBcDQorCS53cml0ZSA9
IG13bF9kZWJ1Z2ZzXyMjbmFtZSMjX3dyaXRlLCBcDQorCS5vcGVuID0gc2ltcGxlX29wZW4sIFwN
Cit9DQorDQorc3RhdGljIGludCBwcmludF9tYWNfYWRkcihjaGFyICpwLCB1OCAqbWFjX2FkZHIp
DQorew0KKwlpbnQgaTsNCisJY2hhciAqc3RyID0gcDsNCisNCisJc3RyICs9IHNwcmludGYoc3Ry
LCAibWFjIGFkZHJlc3M6ICUwMngiLCBtYWNfYWRkclswXSk7DQorCWZvciAoaSA9IDE7IGkgPCBF
VEhfQUxFTjsgaSsrKQ0KKwkJc3RyICs9IHNwcmludGYoc3RyLCAiOiUwMngiLCBtYWNfYWRkcltp
XSk7DQorCXN0ciArPSBzcHJpbnRmKHN0ciwgIlxuIik7DQorDQorCXJldHVybiAoc3RyIC0gcCk7
DQorfQ0KKw0KK3N0YXRpYyBpbnQgZHVtcF9kYXRhKGNoYXIgKnAsIHU4ICpkYXRhLCBpbnQgbGVu
LCBjaGFyICp0aXRsZSkNCit7DQorCWNoYXIgKnN0ciA9IHA7DQorCWludCBjdXJfYnl0ZSA9IDA7
DQorCWludCBpOw0KKw0KKwlzdHIgKz0gc3ByaW50ZihzdHIsICIlc1xuIiwgdGl0bGUpOw0KKwlm
b3IgKGN1cl9ieXRlID0gMDsgY3VyX2J5dGUgPCBsZW47IGN1cl9ieXRlICs9IDgpIHsNCisJCWlm
ICgoY3VyX2J5dGUgKyA4KSA8IGxlbikgew0KKwkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspDQor
CQkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIjB4JTAyeCAiLA0KKwkJCQkJICAgICAgICooZGF0YSAr
IGN1cl9ieXRlICsgaSkpOw0KKwkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIlxuIik7DQorCQl9IGVs
c2Ugew0KKwkJCWZvciAoaSA9IDA7IGkgPCAobGVuIC0gY3VyX2J5dGUpOyBpKyspDQorCQkJCXN0
ciArPSBzcHJpbnRmKHN0ciwgIjB4JTAyeCAiLA0KKwkJCQkJICAgICAgICooZGF0YSArIGN1cl9i
eXRlICsgaSkpOw0KKwkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIlxuIik7DQorCQkJYnJlYWs7DQor
CQl9DQorCX0NCisNCisJcmV0dXJuIChzdHIgLSBwKTsNCit9DQorDQorc3RhdGljIHNzaXplX3Qg
bXdsX2RlYnVnZnNfaW5mb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1
ZiwNCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykNCit7DQorCXN0cnVjdCBt
d2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgbXdsX3ByaXYgKilmaWxlLT5wcml2YXRlX2RhdGE7DQor
CXVuc2lnbmVkIGxvbmcgcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsNCisJY2hh
ciAqcCA9IChjaGFyICopcGFnZTsNCisJc3NpemVfdCByZXQ7DQorDQorCWlmICghcCkNCisJCXJl
dHVybiAtRU5PTUVNOw0KKw0KKwlwICs9IHNwcmludGYocCwgIlxuIik7DQorCXAgKz0gc3ByaW50
ZihwLCAiZHJpdmVyIG5hbWU6ICVzXG4iLCBNV0xfRFJWX05BTUUpOw0KKwlwICs9IHNwcmludGYo
cCwgImNoaXAgdHlwZTogJXNcbiIsDQorCQkgICAgIChwcml2LT5jaGlwX3R5cGUgPT0gTVdMODg2
NCkgPyAiODhXODg2NCIgOiAiODhXODg5NyIpOw0KKwlwICs9IHNwcmludGYocCwgImh3IHZlcnNp
b246ICVYXG4iLCBwcml2LT5od19kYXRhLmh3X3ZlcnNpb24pOw0KKwlwICs9IHNwcmludGYocCwg
ImRyaXZlciB2ZXJzaW9uOiAlc1xuIiwgTVdMX0RSVl9WRVJTSU9OKTsNCisJcCArPSBzcHJpbnRm
KHAsICJmaXJtd2FyZSB2ZXJzaW9uOiAweCUwOHhcbiIsDQorCQkgICAgIHByaXYtPmh3X2RhdGEu
ZndfcmVsZWFzZV9udW0pOw0KKwlwICs9IHByaW50X21hY19hZGRyKHAsIHByaXYtPmh3X2RhdGEu
bWFjX2FkZHIpOw0KKwlwICs9IHNwcmludGYocCwgIjJnOiAlc1xuIiwgcHJpdi0+ZGlzYWJsZV8y
ZyA/ICJkaXNhYmxlIiA6ICJlbmFibGUiKTsNCisJcCArPSBzcHJpbnRmKHAsICI1ZzogJXNcbiIs
IHByaXYtPmRpc2FibGVfNWcgPyAiZGlzYWJsZSIgOiAiZW5hYmxlIik7DQorCXAgKz0gc3ByaW50
ZihwLCAiYW50ZW5uYTogJWQgJWRcbiIsDQorCQkgICAgIChwcml2LT5hbnRlbm5hX3R4ID09IEFO
VEVOTkFfVFhfNF9BVVRPKSA/IDQgOiAyLA0KKwkJICAgICAocHJpdi0+YW50ZW5uYV9yeCA9PSBB
TlRFTk5BX1RYXzRfQVVUTykgPyA0IDogMik7DQorCXAgKz0gc3ByaW50ZihwLCAiaXJxIG51bWJl
cjogJWRcbiIsIHByaXYtPmlycSk7DQorCXAgKz0gc3ByaW50ZihwLCAiaW9iYXNlMDogJXBcbiIs
IHByaXYtPmlvYmFzZTApOw0KKwlwICs9IHNwcmludGYocCwgImlvYmFzZTE6ICVwXG4iLCBwcml2
LT5pb2Jhc2UxKTsNCisJcCArPSBzcHJpbnRmKHAsICJ0eCBsaW1pdDogJWRcbiIsIHByaXYtPnR4
cV9saW1pdCk7DQorCXAgKz0gc3ByaW50ZihwLCAicnggbGltaXQ6ICVkXG4iLCBwcml2LT5yZWN2
X2xpbWl0KTsNCisJcCArPSBzcHJpbnRmKHAsICJhcCBtYWNpZCBzdXBwb3J0OiAlMDh4XG4iLA0K
KwkJICAgICBwcml2LT5hcF9tYWNpZHNfc3VwcG9ydGVkKTsNCisJcCArPSBzcHJpbnRmKHAsICJz
dGEgbWFjaWQgc3VwcG9ydDogJTA4eFxuIiwNCisJCSAgICAgcHJpdi0+c3RhX21hY2lkc19zdXBw
b3J0ZWQpOw0KKwlwICs9IHNwcmludGYocCwgIm1hY2lkIHVzZWQ6ICUwOHhcbiIsIHByaXYtPm1h
Y2lkc191c2VkKTsNCisJcCArPSBzcHJpbnRmKHAsICJtZmcgbW9kZTogJXNcbiIsIHByaXYtPm1m
Z19tb2RlID8gInRydWUiIDogImZhbHNlIik7DQorCXAgKz0gc3ByaW50ZihwLCAiXG4iKTsNCisN
CisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY291bnQsIHBwb3MsIChjaGFy
ICopcGFnZSwNCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpcCAtIHBhZ2UpOw0KKwlmcmVlX3Bh
Z2UocGFnZSk7DQorDQorCXJldHVybiByZXQ7DQorfQ0KKw0KK3N0YXRpYyBzc2l6ZV90IG13bF9k
ZWJ1Z2ZzX3ZpZl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwNCisJ
CQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQ0KK3sNCisJc3RydWN0IG13bF9wcml2
ICpwcml2ID0gKHN0cnVjdCBtd2xfcHJpdiAqKWZpbGUtPnByaXZhdGVfZGF0YTsNCisJdW5zaWdu
ZWQgbG9uZyBwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOw0KKwljaGFyICpwID0g
KGNoYXIgKilwYWdlOw0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZjsNCisJc3RydWN0IGllZWU4
MDIxMV92aWYgKnZpZjsNCisJY2hhciBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU4gKyAxXTsN
CisJc3NpemVfdCByZXQ7DQorDQorCWlmICghcCkNCisJCXJldHVybiAtRU5PTUVNOw0KKw0KKwlw
ICs9IHNwcmludGYocCwgIlxuIik7DQorCXNwaW5fbG9ja19iaCgmcHJpdi0+dmlmX2xvY2spOw0K
KwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG13bF92aWYsICZwcml2LT52aWZfbGlzdCwgbGlzdCkgew0K
KwkJdmlmID0gY29udGFpbmVyX29mKChjaGFyICopbXdsX3ZpZiwgc3RydWN0IGllZWU4MDIxMV92
aWYsDQorCQkJCSAgIGRydl9wcml2WzBdKTsNCisJCXAgKz0gc3ByaW50ZihwLCAibWFjaWQ6ICVk
XG4iLCBtd2xfdmlmLT5tYWNpZCk7DQorCQlzd2l0Y2ggKHZpZi0+dHlwZSkgew0KKwkJY2FzZSBO
TDgwMjExX0lGVFlQRV9BUDoNCisJCQlwICs9IHNwcmludGYocCwgInR5cGU6IGFwXG4iKTsNCisJ
CQltZW1jcHkoc3NpZCwgdmlmLT5ic3NfY29uZi5zc2lkLA0KKwkJCSAgICAgICB2aWYtPmJzc19j
b25mLnNzaWRfbGVuKTsNCisJCQlzc2lkW3ZpZi0+YnNzX2NvbmYuc3NpZF9sZW5dID0gMDsNCisJ
CQlwICs9IHNwcmludGYocCwgInNzaWQ6ICVzXG4iLCBzc2lkKTsNCisJCQlwICs9IHByaW50X21h
Y19hZGRyKHAsIG13bF92aWYtPmJzc2lkKTsNCisJCQlicmVhazsNCisJCWNhc2UgTkw4MDIxMV9J
RlRZUEVfTUVTSF9QT0lOVDoNCisJCQlwICs9IHNwcmludGYocCwgInR5cGU6IG1lc2hcbiIpOw0K
KwkJCXAgKz0gcHJpbnRfbWFjX2FkZHIocCwgbXdsX3ZpZi0+YnNzaWQpOw0KKwkJCWJyZWFrOw0K
KwkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOg0KKwkJCXAgKz0gc3ByaW50ZihwLCAidHlw
ZTogc3RhXG4iKTsNCisJCQlwICs9IHByaW50X21hY19hZGRyKHAsIG13bF92aWYtPnN0YV9tYWMp
Ow0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlwICs9IHNwcmludGYocCwgInR5cGU6IHVu
a25vd25cbiIpOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJcCArPSBzcHJpbnRmKHAsICJod19jcnlw
dG9fZW5hYmxlZDogJXNcbiIsDQorCQkJICAgICBtd2xfdmlmLT5pc19od19jcnlwdG9fZW5hYmxl
ZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOw0KKwkJcCArPSBzcHJpbnRmKHAsICJrZXkgaWR4OiAlZFxu
IiwgbXdsX3ZpZi0+a2V5aWR4KTsNCisJCXAgKz0gc3ByaW50ZihwLCAiSVY6ICUwOHglMDR4XG4i
LCBtd2xfdmlmLT5pdjMyLCBtd2xfdmlmLT5pdjE2KTsNCisJCXAgKz0gZHVtcF9kYXRhKHAsIG13
bF92aWYtPmJlYWNvbl9pbmZvLmllX3dtbV9wdHIsDQorCQkJICAgICAgIG13bF92aWYtPmJlYWNv
bl9pbmZvLmllX3dtbV9sZW4sICJXTU06Iik7DQorCQlwICs9IGR1bXBfZGF0YShwLCBtd2xfdmlm
LT5iZWFjb25faW5mby5pZV9yc25fcHRyLA0KKwkJCSAgICAgICBtd2xfdmlmLT5iZWFjb25faW5m
by5pZV9yc25fbGVuLCAiUlNOOiIpOw0KKwkJcCArPSBkdW1wX2RhdGEocCwgbXdsX3ZpZi0+YmVh
Y29uX2luZm8uaWVfcnNuNDhfcHRyLA0KKwkJCSAgICAgICBtd2xfdmlmLT5iZWFjb25faW5mby5p
ZV9yc240OF9sZW4sICJSU040ODoiKTsNCisJCXAgKz0gZHVtcF9kYXRhKHAsIG13bF92aWYtPmJl
YWNvbl9pbmZvLmllX2h0X3B0ciwNCisJCQkgICAgICAgbXdsX3ZpZi0+YmVhY29uX2luZm8uaWVf
aHRfbGVuLCAiSFQ6Iik7DQorCQlwICs9IGR1bXBfZGF0YShwLCBtd2xfdmlmLT5iZWFjb25faW5m
by5pZV92aHRfcHRyLA0KKwkJCSAgICAgICBtd2xfdmlmLT5iZWFjb25faW5mby5pZV92aHRfbGVu
LCAiVkhUOiIpOw0KKwkJcCArPSBzcHJpbnRmKHAsICJcbiIpOw0KKwl9DQorCXNwaW5fdW5sb2Nr
X2JoKCZwcml2LT52aWZfbG9jayk7DQorDQorCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVy
KHVidWYsIGNvdW50LCBwcG9zLCAoY2hhciAqKXBhZ2UsDQorCQkJCSAgICAgICh1bnNpZ25lZCBs
b25nKXAgLSBwYWdlKTsNCisJZnJlZV9wYWdlKHBhZ2UpOw0KKw0KKwlyZXR1cm4gcmV0Ow0KK30N
CisNCitzdGF0aWMgc3NpemVfdCBtd2xfZGVidWdmc19zdGFfcmVhZChzdHJ1Y3QgZmlsZSAqZmls
ZSwgY2hhciBfX3VzZXIgKnVidWYsDQorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBv
cykNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgbXdsX3ByaXYgKilmaWxl
LT5wcml2YXRlX2RhdGE7DQorCXVuc2lnbmVkIGxvbmcgcGFnZSA9IGdldF96ZXJvZWRfcGFnZShH
RlBfS0VSTkVMKTsNCisJY2hhciAqcCA9IChjaGFyICopcGFnZTsNCisJc3RydWN0IG13bF9zdGEg
KnN0YV9pbmZvOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOw0KKwlzc2l6ZV90IHJldDsN
CisNCisJaWYgKCFwKQ0KKwkJcmV0dXJuIC1FTk9NRU07DQorDQorCXAgKz0gc3ByaW50ZihwLCAi
XG4iKTsNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5zdGFfbG9jayk7DQorCWxpc3RfZm9yX2VhY2hf
ZW50cnkoc3RhX2luZm8sICZwcml2LT5zdGFfbGlzdCwgbGlzdCkgew0KKwkJc3RhID0gY29udGFp
bmVyX29mKChjaGFyICopc3RhX2luZm8sIHN0cnVjdCBpZWVlODAyMTFfc3RhLA0KKwkJCQkgICBk
cnZfcHJpdlswXSk7DQorCQlwICs9IHByaW50X21hY19hZGRyKHAsIHN0YS0+YWRkcik7DQorCQlw
ICs9IHNwcmludGYocCwgImFpZDogJXVcbiIsIHN0YS0+YWlkKTsNCisJCXAgKz0gc3ByaW50Zihw
LCAiYW1wZHU6ICVzXG4iLA0KKwkJCSAgICAgc3RhX2luZm8tPmlzX2FtcGR1X2FsbG93ZWQgPyAi
dHJ1ZSIgOiAiZmFsc2UiKTsNCisJCXAgKz0gc3ByaW50ZihwLCAiYW1zZHU6ICVzXG4iLA0KKwkJ
CSAgICAgc3RhX2luZm8tPmlzX2Ftc2R1X2FsbG93ZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsNCisJ
CWlmIChzdGFfaW5mby0+aXNfYW1zZHVfYWxsb3dlZCkgew0KKwkJCXAgKz0gc3ByaW50ZihwLCAi
YW1zZHUgY2FwOiAweCUwMnhcbiIsDQorCQkJCSAgICAgc3RhX2luZm8tPmFtc2R1X2N0cmwuY2Fw
KTsNCisJCX0NCisJCXAgKz0gc3ByaW50ZihwLCAiSVY6ICUwOHglMDR4XG4iLA0KKwkJCSAgICAg
c3RhX2luZm8tPml2MzIsIHN0YV9pbmZvLT5pdjE2KTsNCisJCXAgKz0gc3ByaW50ZihwLCAiXG4i
KTsNCisJfQ0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RhX2xvY2spOw0KKw0KKwlyZXQgPSBz
aW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjb3VudCwgcHBvcywgKGNoYXIgKilwYWdlLA0K
KwkJCQkgICAgICAodW5zaWduZWQgbG9uZylwIC0gcGFnZSk7DQorCWZyZWVfcGFnZShwYWdlKTsN
CisNCisJcmV0dXJuIHJldDsNCit9DQorDQorc3RhdGljIHNzaXplX3QgbXdsX2RlYnVnZnNfYW1w
ZHVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsDQorCQkJCSAgICAg
IHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2
ID0gKHN0cnVjdCBtd2xfcHJpdiAqKWZpbGUtPnByaXZhdGVfZGF0YTsNCisJdW5zaWduZWQgbG9u
ZyBwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOw0KKwljaGFyICpwID0gKGNoYXIg
KilwYWdlOw0KKwlzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtOw0KKwlpbnQgaTsNCisJ
c3NpemVfdCByZXQ7DQorDQorCWlmICghcCkNCisJCXJldHVybiAtRU5PTUVNOw0KKw0KKwlwICs9
IHNwcmludGYocCwgIlxuIik7DQorCXNwaW5fbG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0K
Kwlmb3IgKGkgPSAwOyBpIDwgU1lTQURQVF9UWF9BTVBEVV9RVUVVRVM7IGkrKykgew0KKwkJc3Ry
ZWFtID0gJnByaXYtPmFtcGR1W2ldOw0KKwkJcCArPSBzcHJpbnRmKHAsICJzdHJlYW06ICVkXG4i
LCBpKTsNCisJCXAgKz0gc3ByaW50ZihwLCAiaWR4OiAldVxuIiwgc3RyZWFtLT5pZHgpOw0KKwkJ
cCArPSBzcHJpbnRmKHAsICJzdGF0ZTogJXVcbiIsIHN0cmVhbS0+c3RhdGUpOw0KKwkJaWYgKHN0
cmVhbS0+c3RhKSB7DQorCQkJcCArPSBwcmludF9tYWNfYWRkcihwLCBzdHJlYW0tPnN0YS0+YWRk
cik7DQorCQkJcCArPSBzcHJpbnRmKHAsICJ0aWQ6ICV1XG4iLCBzdHJlYW0tPnRpZCk7DQorCQl9
DQorCX0NCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2NrKTsNCisJcCArPSBzcHJp
bnRmKHAsICJcbiIpOw0KKw0KKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBj
b3VudCwgcHBvcywgKGNoYXIgKilwYWdlLA0KKwkJCQkgICAgICAodW5zaWduZWQgbG9uZylwIC0g
cGFnZSk7DQorCWZyZWVfcGFnZShwYWdlKTsNCisNCisJcmV0dXJuIHJldDsNCit9DQorDQorc3Rh
dGljIGludCBtd2xfZGVidWdmc19yZWdfYWNjZXNzKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwgYm9v
bCB3cml0ZSkNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7DQorCXU4
IHNldDsNCisJdTMyICphZGRyX3ZhbDsNCisJaW50IHJldCA9IDA7DQorDQorCXNldCA9IHdyaXRl
ID8gV0xfU0VUIDogV0xfR0VUOw0KKw0KKwlzd2l0Y2ggKHByaXYtPnJlZ190eXBlKSB7DQorCWNh
c2UgTVdMX0FDQ0VTU19BRERSMDoNCisJCWlmIChzZXQgPT0gV0xfR0VUKQ0KKwkJCXByaXYtPnJl
Z192YWx1ZSA9DQorCQkJCXJlYWRsKHByaXYtPmlvYmFzZTAgKyBwcml2LT5yZWdfb2Zmc2V0KTsN
CisJCWVsc2UNCisJCQl3cml0ZWwocHJpdi0+cmVnX3ZhbHVlLA0KKwkJCSAgICAgICBwcml2LT5p
b2Jhc2UwICsgcHJpdi0+cmVnX29mZnNldCk7DQorCQlicmVhazsNCisJY2FzZSBNV0xfQUNDRVNT
X0FERFIxOg0KKwkJaWYgKHNldCA9PSBXTF9HRVQpDQorCQkJcHJpdi0+cmVnX3ZhbHVlID0NCisJ
CQkJcmVhZGwocHJpdi0+aW9iYXNlMSArIHByaXYtPnJlZ19vZmZzZXQpOw0KKwkJZWxzZQ0KKwkJ
CXdyaXRlbChwcml2LT5yZWdfdmFsdWUsDQorCQkJICAgICAgIHByaXYtPmlvYmFzZTEgKyBwcml2
LT5yZWdfb2Zmc2V0KTsNCisJCWJyZWFrOw0KKwljYXNlIE1XTF9BQ0NFU1NfQUREUjoNCisJCWFk
ZHJfdmFsID0ga21hbGxvYyg2NCAqIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsNCisJCWlmIChh
ZGRyX3ZhbCkgew0KKwkJCW1lbXNldChhZGRyX3ZhbCwgMCwgNjQgKiBzaXplb2YodTMyKSk7DQor
CQkJYWRkcl92YWxbMF0gPSBwcml2LT5yZWdfdmFsdWU7DQorCQkJcmV0ID0gbXdsX2Z3Y21kX2dl
dF9hZGRyX3ZhbHVlKGh3LCBwcml2LT5yZWdfb2Zmc2V0LA0KKwkJCQkJCSAgICAgICA0LCBhZGRy
X3ZhbCwgc2V0KTsNCisJCQlpZiAoKCFyZXQpICYmIChzZXQgPT0gV0xfR0VUKSkNCisJCQkJcHJp
di0+cmVnX3ZhbHVlID0gYWRkcl92YWxbMF07DQorCQkJa2ZyZWUoYWRkcl92YWwpOw0KKwkJfSBl
bHNlIHsNCisJCQlyZXQgPSAtRU5PTUVNOw0KKwkJfQ0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQor
CQlyZXQgPSAtRUlOVkFMOw0KKwkJYnJlYWs7DQorCX0NCisNCisJcmV0dXJuIHJldDsNCit9DQor
DQorc3RhdGljIHNzaXplX3QgbXdsX2RlYnVnZnNfcmVncmR3cl9yZWFkKHN0cnVjdCBmaWxlICpm
aWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwNCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9z
KQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gKHN0cnVjdCBtd2xfcHJpdiAqKWZpbGUt
PnByaXZhdGVfZGF0YTsNCisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdG
UF9LRVJORUwpOw0KKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7DQorCWludCBwb3MgPSAwLCBy
ZXQgPSAwOw0KKw0KKwlpZiAoIWJ1ZikNCisJCXJldHVybiAtRU5PTUVNOw0KKw0KKwlpZiAoIXBy
aXYtPnJlZ190eXBlKSB7DQorCQkvKiBObyBjb21tYW5kIGhhcyBiZWVuIGdpdmVuICovDQorCQlw
b3MgKz0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIwIik7DQorCQlnb3RvIG5vbmU7DQorCX0N
CisNCisJLyogU2V0IGNvbW1hbmQgaGFzIGJlZW4gZ2l2ZW4gKi8NCisJaWYgKHByaXYtPnJlZ192
YWx1ZSAhPSBVSU5UX01BWCkgew0KKwkJcmV0ID0gbXdsX2RlYnVnZnNfcmVnX2FjY2Vzcyhwcml2
LCB0cnVlKTsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKwkvKiBHZXQgY29tbWFuZCBoYXMgYmVlbiBn
aXZlbiAqLw0KKwlyZXQgPSBtd2xfZGVidWdmc19yZWdfYWNjZXNzKHByaXYsIGZhbHNlKTsNCisN
Citkb25lOg0KKwlpZiAoIXJldCkNCisJCXBvcyArPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwg
IiV1IDB4JTA4eCAweCUwOHhcbiIsDQorCQkJCXByaXYtPnJlZ190eXBlLCBwcml2LT5yZWdfb2Zm
c2V0LA0KKwkJCQlwcml2LT5yZWdfdmFsdWUpOw0KKwllbHNlDQorCQlwb3MgKz0gc25wcmludGYo
YnVmLCBQQUdFX1NJWkUsICJlcnJvcjogJWQoJXUgMHglMDh4IDB4JTA4eClcbiIsDQorCQkJCXJl
dCwgcHJpdi0+cmVnX3R5cGUsIHByaXYtPnJlZ19vZmZzZXQsDQorCQkJCXByaXYtPnJlZ192YWx1
ZSk7DQorDQorCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNvdW50LCBwcG9z
LCBidWYsIHBvcyk7DQorDQorbm9uZToNCisNCisJZnJlZV9wYWdlKGFkZHIpOw0KKwlyZXR1cm4g
cmV0Ow0KK30NCisNCitzdGF0aWMgc3NpemVfdCBtd2xfZGVidWdmc19yZWdyZHdyX3dyaXRlKHN0
cnVjdCBmaWxlICpmaWxlLA0KKwkJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLA0KKwkJCQkJ
IHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2
ID0gKHN0cnVjdCBtd2xfcHJpdiAqKWZpbGUtPnByaXZhdGVfZGF0YTsNCisJdW5zaWduZWQgbG9u
ZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOw0KKwljaGFyICpidWYgPSAoY2hh
ciAqKWFkZHI7DQorCXNpemVfdCBidWZfc2l6ZSA9IG1pbl90KHNpemVfdCwgY291bnQsIFBBR0Vf
U0laRSAtIDEpOw0KKwlpbnQgcmV0Ow0KKwl1MzIgcmVnX3R5cGUgPSAwLCByZWdfb2Zmc2V0ID0g
MCwgcmVnX3ZhbHVlID0gVUlOVF9NQVg7DQorDQorCWlmICghYnVmKQ0KKwkJcmV0dXJuIC1FTk9N
RU07DQorDQorCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVidWYsIGJ1Zl9zaXplKSkgew0KKwkJ
cmV0ID0gLUVGQVVMVDsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwlyZXQgPSBzc2NhbmYoYnVm
LCAiJXUgJXggJXgiLCAmcmVnX3R5cGUsICZyZWdfb2Zmc2V0LCAmcmVnX3ZhbHVlKTsNCisNCisJ
aWYgKCFyZWdfdHlwZSkgew0KKwkJcmV0ID0gLUVJTlZBTDsNCisJCWdvdG8gZG9uZTsNCisJfSBl
bHNlIHsNCisJCXByaXYtPnJlZ190eXBlID0gcmVnX3R5cGU7DQorCQlwcml2LT5yZWdfb2Zmc2V0
ID0gcmVnX29mZnNldDsNCisJCXByaXYtPnJlZ192YWx1ZSA9IHJlZ192YWx1ZTsNCisJCXJldCA9
IGNvdW50Ow0KKwl9DQorZG9uZToNCisNCisJZnJlZV9wYWdlKGFkZHIpOw0KKwlyZXR1cm4gcmV0
Ow0KK30NCisNCitNV0xXSUZJX0RFQlVHRlNfRklMRV9SRUFEX09QUyhpbmZvKTsNCitNV0xXSUZJ
X0RFQlVHRlNfRklMRV9SRUFEX09QUyh2aWYpOw0KK01XTFdJRklfREVCVUdGU19GSUxFX1JFQURf
T1BTKHN0YSk7DQorTVdMV0lGSV9ERUJVR0ZTX0ZJTEVfUkVBRF9PUFMoYW1wZHUpOw0KK01XTFdJ
RklfREVCVUdGU19GSUxFX09QUyhyZWdyZHdyKTsNCisNCit2b2lkIG13bF9kZWJ1Z2ZzX2luaXQo
c3RydWN0IGllZWU4MDIxMV9odyAqaHcpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBo
dy0+cHJpdjsNCisNCisJaWYgKCFwcml2LT5kZWJ1Z2ZzX3BoeSkNCisJCXByaXYtPmRlYnVnZnNf
cGh5ID0gZGVidWdmc19jcmVhdGVfZGlyKCJtd2x3aWZpIiwNCisJCQkJCQkgICAgICAgaHctPndp
cGh5LT5kZWJ1Z2ZzZGlyKTsNCisNCisJaWYgKCFwcml2LT5kZWJ1Z2ZzX3BoeSkNCisJCXJldHVy
bjsNCisNCisJTVdMV0lGSV9ERUJVR0ZTX0FERF9GSUxFKGluZm8pOw0KKwlNV0xXSUZJX0RFQlVH
RlNfQUREX0ZJTEUodmlmKTsNCisJTVdMV0lGSV9ERUJVR0ZTX0FERF9GSUxFKHN0YSk7DQorCU1X
TFdJRklfREVCVUdGU19BRERfRklMRShhbXBkdSk7DQorCU1XTFdJRklfREVCVUdGU19BRERfRklM
RShyZWdyZHdyKTsNCit9DQorDQordm9pZCBtd2xfZGVidWdmc19yZW1vdmUoc3RydWN0IGllZWU4
MDIxMV9odyAqaHcpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisN
CisJZGVidWdmc19yZW1vdmUocHJpdi0+ZGVidWdmc19waHkpOw0KKwlwcml2LT5kZWJ1Z2ZzX3Bo
eSA9IE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwv
bXdsd2lmaS9kZWJ1Z2ZzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkv
ZGVidWdmcy5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uZGZjMmEzYw0K
LS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZp
L2RlYnVnZnMuaA0KQEAgLTAsMCArMSwyNCBAQA0KKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA2
LTIwMTUsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuDQorICoNCisgKiBUaGlzIHNvZnR3YXJl
IGZpbGUgKHRoZSAiRmlsZSIpIGlzIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgSW50ZXJuYXRpb25h
bA0KKyAqIEx0ZC4gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MQ0KKyAqICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkg
dXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIEZpbGUgaW4NCisgKiBhY2NvcmRh
bmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBMaWNlbnNlLCBhIGNvcHkg
b2Ygd2hpY2gNCisgKiBpcyBhdmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuDQorICoNCisgKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1J
UywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRQ0KKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UNCisgKiBBUkUgRVhQUkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRl
cyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQNCisgKiB0aGlzIHdhcnJhbnR5IGRpc2NsYWltZXIu
DQorICovDQorDQorLyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgZGVmaW5lcyBkZWJ1ZyBmcyBy
ZWxhdGVkIGZ1bmN0aW9ucy4gKi8NCisNCisjaWZuZGVmIF9kZWJ1Z2ZzX2hfDQorI2RlZmluZSBf
ZGVidWdmc19oXw0KKw0KK3ZvaWQgbXdsX2RlYnVnZnNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3
ICpodyk7DQordm9pZCBtd2xfZGVidWdmc19yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcp
Ow0KKw0KKyNlbmRpZiAvKiBfZGVidWdmc19oXyAqLw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0
L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21h
cnZlbGwvbXdsd2lmaS9kZXYuaA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAu
LjM3MGQzYzANCi0tLSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl
bGwvbXdsd2lmaS9kZXYuaA0KQEAgLTAsMCArMSw0NzcgQEANCisvKg0KKyAqIENvcHlyaWdodCAo
QykgMjAwNi0yMDE1LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBz
b2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVy
bmF0aW9uYWwNCisgKiBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZ
b3UgbWF5IHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICog
YWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwg
YSBjb3B5IG9mIHdoaWNoDQorICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVU
RUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFDQorICogQVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2Ug
cHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNj
bGFpbWVyLg0KKyAqLw0KKw0KKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGRlZmluZXMgZGV2
aWNlIHJlbGF0ZWQgaW5mb3JtYXRpb24uICovDQorDQorI2lmbmRlZiBfZGV2X2hfDQorI2RlZmlu
ZSBfZGV2X2hfDQorDQorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4NCisjaW5jbHVkZSA8bGlu
dXgvaW50ZXJydXB0Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPg0KKyNpbmNsdWRlIDxsaW51
eC9maXJtd2FyZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPg0KKyNpbmNsdWRlIDxsaW51
eC9iaXRvcHMuaD4NCisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+DQorDQorI2RlZmluZSBNV0xf
RFJWX05BTUUgICAgIEtCVUlMRF9NT0ROQU1FDQorI2RlZmluZSBNV0xfRFJWX1ZFUlNJT04JICIx
MC4zLjAuMTQiDQorDQorLyogTWFwIHRvIDB4ODAwMDAwMDAgKEJ1cyBjb250cm9sKSBvbiBCQVIw
ICovDQorI2RlZmluZSBNQUNSRUdfUkVHX0gyQV9JTlRFUlJVUFRfRVZFTlRTICAgICAgMHgwMDAw
MEMxOCAvKiAoRnJvbSBob3N0IHRvIEFSTSkgKi8NCisjZGVmaW5lIE1BQ1JFR19SRUdfSDJBX0lO
VEVSUlVQVF9DQVVTRSAgICAgICAweDAwMDAwQzFDIC8qIChGcm9tIGhvc3QgdG8gQVJNKSAqLw0K
KyNkZWZpbmUgTUFDUkVHX1JFR19IMkFfSU5URVJSVVBUX01BU0sgICAgICAgIDB4MDAwMDBDMjAg
LyogKEZyb20gaG9zdCB0byBBUk0pICovDQorI2RlZmluZSBNQUNSRUdfUkVHX0gyQV9JTlRFUlJV
UFRfQ0xFQVJfU0VMICAgMHgwMDAwMEMyNCAvKiAoRnJvbSBob3N0IHRvIEFSTSkgKi8NCisjZGVm
aW5lIE1BQ1JFR19SRUdfSDJBX0lOVEVSUlVQVF9TVEFUVVNfTUFTSyAweDAwMDAwQzI4IC8qIChG
cm9tIGhvc3QgdG8gQVJNKSAqLw0KKw0KKyNkZWZpbmUgTUFDUkVHX1JFR19BMkhfSU5URVJSVVBU
X0VWRU5UUyAgICAgIDB4MDAwMDBDMkMgLyogKEZyb20gQVJNIHRvIGhvc3QpICovDQorI2RlZmlu
ZSBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfQ0FVU0UgICAgICAgMHgwMDAwMEMzMCAvKiAoRnJv
bSBBUk0gdG8gaG9zdCkgKi8NCisjZGVmaW5lIE1BQ1JFR19SRUdfQTJIX0lOVEVSUlVQVF9NQVNL
ICAgICAgICAweDAwMDAwQzM0IC8qIChGcm9tIEFSTSB0byBob3N0KSAqLw0KKyNkZWZpbmUgTUFD
UkVHX1JFR19BMkhfSU5URVJSVVBUX0NMRUFSX1NFTCAgIDB4MDAwMDBDMzggLyogKEZyb20gQVJN
IHRvIGhvc3QpICovDQorI2RlZmluZSBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfU1RBVFVTX01B
U0sgMHgwMDAwMEMzQyAvKiAoRnJvbSBBUk0gdG8gaG9zdCkgKi8NCisNCisvKiBNYXAgdG8gMHg4
MDAwMDAwMCBvbiBCQVIxICovDQorI2RlZmluZSBNQUNSRUdfUkVHX0dFTl9QVFIgICAgICAgICAg
ICAgICAgICAweDAwMDAwQzEwDQorI2RlZmluZSBNQUNSRUdfUkVHX0lOVF9DT0RFICAgICAgICAg
ICAgICAgICAweDAwMDAwQzE0DQorDQorLyogQml0IGRlZmluaXRpb24gZm9yIE1BQ1JFR19SRUdf
QTJIX0lOVEVSUlVQVF9DQVVTRSAoQTJIUklDKSAqLw0KKyNkZWZpbmUgTUFDUkVHX0EySFJJQ19C
SVRfVFhfRE9ORSAgICAgICAgICAgQklUKDApDQorI2RlZmluZSBNQUNSRUdfQTJIUklDX0JJVF9S
WF9SRFkgICAgICAgICAgICBCSVQoMSkNCisjZGVmaW5lIE1BQ1JFR19BMkhSSUNfQklUX09QQ19E
T05FICAgICAgICAgIEJJVCgyKQ0KKyNkZWZpbmUgTUFDUkVHX0EySFJJQ19CSVRfTUFDX0VWRU5U
ICAgICAgICAgQklUKDMpDQorI2RlZmluZSBNQUNSRUdfQTJIUklDX0JJVF9SWF9QUk9CTEVNICAg
ICAgICBCSVQoNCkNCisjZGVmaW5lIE1BQ1JFR19BMkhSSUNfQklUX1JBRElPX09GRiAgICAgICAg
IEJJVCg1KQ0KKyNkZWZpbmUgTUFDUkVHX0EySFJJQ19CSVRfUkFESU9fT04gICAgICAgICAgQklU
KDYpDQorI2RlZmluZSBNQUNSRUdfQTJIUklDX0JJVF9SQURBUl9ERVRFQ1QgICAgICBCSVQoNykN
CisjZGVmaW5lIE1BQ1JFR19BMkhSSUNfQklUX0lDVl9FUlJPUiAgICAgICAgIEJJVCg4KQ0KKyNk
ZWZpbmUgTUFDUkVHX0EySFJJQ19CSVRfV0VBS0lWX0VSUk9SICAgICAgQklUKDkpDQorI2RlZmlu
ZSBNQUNSRUdfQTJIUklDX0JJVF9RVUVfRU1QVFkgICAgICAgICBCSVQoMTApDQorI2RlZmluZSBN
QUNSRUdfQTJIUklDX0JJVF9RVUVfRlVMTCAgICAgICAgICBCSVQoMTEpDQorI2RlZmluZSBNQUNS
RUdfQTJIUklDX0JJVF9DSEFOX1NXSVRDSCAgICAgICBCSVQoMTIpDQorI2RlZmluZSBNQUNSRUdf
QTJIUklDX0JJVF9UWF9XQVRDSERPRyAgICAgICBCSVQoMTMpDQorI2RlZmluZSBNQUNSRUdfQTJI
UklDX0JBX1dBVENIRE9HICAgICAgICAgICBCSVQoMTQpDQorLyogMTUgdGFrZW4gYnkgSVNSX1RY
QUNLICovDQorI2RlZmluZSBNQUNSRUdfQTJIUklDX0JJVF9TU1VfRE9ORSAgICAgICAgICBCSVQo
MTYpDQorI2RlZmluZSBNQUNSRUdfQTJIUklDX0NPTlNFQ19UWEZBSUwgICAgICAgICBCSVQoMTcp
DQorDQorI2RlZmluZSBJU1JfU1JDX0JJVFMgICAgICAgIChNQUNSRUdfQTJIUklDX0JJVF9SWF9S
RFkgfCBcDQorCQkJICAgICBNQUNSRUdfQTJIUklDX0JJVF9UWF9ET05FIHwgXA0KKwkJCSAgICAg
TUFDUkVHX0EySFJJQ19CSVRfT1BDX0RPTkUgfCBcDQorCQkJICAgICBNQUNSRUdfQTJIUklDX0JJ
VF9NQUNfRVZFTlQgfCBcDQorCQkJICAgICBNQUNSRUdfQTJIUklDX0JJVF9XRUFLSVZfRVJST1Ig
fCBcDQorCQkJICAgICBNQUNSRUdfQTJIUklDX0JJVF9JQ1ZfRVJST1IgfCBcDQorCQkJICAgICBN
QUNSRUdfQTJIUklDX0JJVF9TU1VfRE9ORSB8IFwNCisJCQkgICAgIE1BQ1JFR19BMkhSSUNfQklU
X1JBREFSX0RFVEVDVCB8IFwNCisJCQkgICAgIE1BQ1JFR19BMkhSSUNfQklUX0NIQU5fU1dJVENI
IHwgXA0KKwkJCSAgICAgTUFDUkVHX0EySFJJQ19CSVRfVFhfV0FUQ0hET0cgfCBcDQorCQkJICAg
ICBNQUNSRUdfQTJIUklDX0JJVF9RVUVfRU1QVFkgfCBcDQorCQkJICAgICBNQUNSRUdfQTJIUklD
X0JBX1dBVENIRE9HIHwgXA0KKwkJCSAgICAgTUFDUkVHX0EySFJJQ19DT05TRUNfVFhGQUlMKQ0K
Kw0KKyNkZWZpbmUgTUFDUkVHX0EySFJJQ19CSVRfTUFTSyAgICAgIElTUl9TUkNfQklUUw0KKw0K
Ky8qIEJpdCBkZWZpbml0aW9uIGZvciBNQUNSRUdfUkVHX0gyQV9JTlRFUlJVUFRfQ0FVU0UgKEgy
QVJJQykgKi8NCisjZGVmaW5lIE1BQ1JFR19IMkFSSUNfQklUX1BQQV9SRUFEWSAgICAgICAgIEJJ
VCgwKQ0KKyNkZWZpbmUgTUFDUkVHX0gyQVJJQ19CSVRfRE9PUl9CRUxMICAgICAgICAgQklUKDEp
DQorI2RlZmluZSBNQUNSRUdfSDJBUklDX0JJVF9QUyAgICAgICAgICAgICAgICBCSVQoMikNCisj
ZGVmaW5lIE1BQ1JFR19IMkFSSUNfQklUX1BTUE9MTCAgICAgICAgICAgIEJJVCgzKQ0KKyNkZWZp
bmUgSVNSX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDE1KQ0KKyNkZWZpbmUg
SVNSX1JFU0VUX0FQMzMgICAgICAgICAgICAgICAgICAgICAgQklUKDI2KQ0KKw0KKy8qIERhdGEg
ZGVzY3JpcHRvciByZWxhdGVkIGNvbnN0YW50cyAqLw0KKyNkZWZpbmUgRUFHTEVfUlhEX0NUUkxf
RFJJVkVSX09XTiAgICAgICAgICAgMHgwMA0KKyNkZWZpbmUgRUFHTEVfUlhEX0NUUkxfRE1BX09X
TiAgICAgICAgICAgICAgMHg4MA0KKw0KKyNkZWZpbmUgRUFHTEVfUlhEX1NUQVRVU19PSyAgICAg
ICAgICAgICAgICAgMHgwMQ0KKw0KKyNkZWZpbmUgRUFHTEVfVFhEX1NUQVRVU19JRExFICAgICAg
ICAgICAgICAgMHgwMDAwMDAwMA0KKyNkZWZpbmUgRUFHTEVfVFhEX1NUQVRVU19PSyAgICAgICAg
ICAgICAgICAgMHgwMDAwMDAwMQ0KKyNkZWZpbmUgRUFHTEVfVFhEX1NUQVRVU19GV19PV05FRCAg
ICAgICAgICAgMHg4MDAwMDAwMA0KKw0KKy8qIEFudGVubmEgY29udHJvbCAqLw0KKyNkZWZpbmUg
QU5URU5OQV9UWF80X0FVVE8gICAgICAgICAgICAgICAgICAgMA0KKyNkZWZpbmUgQU5URU5OQV9U
WF8yICAgICAgICAgICAgICAgICAgICAgICAgMw0KKyNkZWZpbmUgQU5URU5OQV9SWF80X0FVVE8g
ICAgICAgICAgICAgICAgICAgMA0KKyNkZWZpbmUgQU5URU5OQV9SWF8yICAgICAgICAgICAgICAg
ICAgICAgICAgMg0KKw0KKy8qIEJhbmQgcmVsYXRlZCBjb25zdGFudHMgKi8NCisjZGVmaW5lIEJB
TkRfMjRfQ0hBTk5FTF9OVU0gICAgICAgICAgICAgICAgIDE0DQorI2RlZmluZSBCQU5EXzI0X1JB
VEVfTlVNICAgICAgICAgICAgICAgICAgICAxMw0KKyNkZWZpbmUgQkFORF81MF9DSEFOTkVMX05V
TSAgICAgICAgICAgICAgICAgMjQNCisjZGVmaW5lIEJBTkRfNTBfUkFURV9OVU0gICAgICAgICAg
ICAgICAgICAgIDgNCisNCisvKiB2aWYgYW5kIHN0YXRpb24gKi8NCisjZGVmaW5lIE5VTV9XRVBf
S0VZUyAgICAgICAgICAgICAgICAgICAgICAgIDQNCisjZGVmaW5lIE1XTF9NQVhfVElEICAgICAg
ICAgICAgICAgICAgICAgICAgIDgNCisjZGVmaW5lIE1XTF9BTVNEVV9TSVpFXzRLICAgICAgICAg
ICAgICAgICAgIDANCisjZGVmaW5lIE1XTF9BTVNEVV9TSVpFXzhLICAgICAgICAgICAgICAgICAg
IDENCisNCisvKiBwb3dlciBpbml0ICovDQorI2RlZmluZSBNV0xfUE9XRVJfSU5JVF8xICAgICAg
ICAgICAgICAgICAgICAxDQorI2RlZmluZSBNV0xfUE9XRVJfSU5JVF8yICAgICAgICAgICAgICAg
ICAgICAyDQorDQorZW51bSB7DQorCU1XTDg4NjQgPSAwLA0KKwlNV0w4ODk3LA0KKwlNV0xVTktO
T1dOLA0KK307DQorDQorZW51bSB7DQorCUFQX01PREVfMTFBQyA9IDB4MTAsICAgICAgICAgLyog
Z2VuZXJpYyAxMWFjIGluZGljYXRpb24gbW9kZSAqLw0KKwlBUF9NT0RFXzJfNEdIWl8xMUFDX01J
WEVEID0gMHgxNywNCit9Ow0KKw0KK2VudW0gew0KKwlBTVBEVV9OT19TVFJFQU0sDQorCUFNUERV
X1NUUkVBTV9ORVcsDQorCUFNUERVX1NUUkVBTV9JTl9QUk9HUkVTUywNCisJQU1QRFVfU1RSRUFN
X0FDVElWRSwNCit9Ow0KKw0KK3N0cnVjdCBtd2xfY2hpcF9pbmZvIHsNCisJY29uc3QgY2hhciAq
cGFydF9uYW1lOw0KKwljb25zdCBjaGFyICpmd19pbWFnZTsNCisJaW50IGFudGVubmFfdHg7DQor
CWludCBhbnRlbm5hX3J4Ow0KK307DQorDQorc3RydWN0IG13bF90eF9wd3JfdGJsIHsNCisJdTgg
Y2hhbm5lbDsNCisJdTggc2V0Y2FwOw0KKwl1MTYgdHhhbnRlbm5hMjsNCisJdTE2IHR4X3Bvd2Vy
W1NZU0FEUFRfVFhfUE9XRVJfTEVWRUxfVE9UQUxdOw0KKwlib29sIGNkZDsNCit9Ow0KKw0KK3N0
cnVjdCBtd2xfaHdfZGF0YSB7DQorCXUzMiBmd19yZWxlYXNlX251bTsgICAgICAgICAgLyogTWFq
TmJyOk1pbk5icjpTdWJNaW46UGF0Y2hMZXZlbCAqLw0KKwl1OCBod192ZXJzaW9uOyAgICAgICAg
ICAgICAgIC8qIHBsYWluIG51bWJlciBpbmRpY2F0aW5nIHZlcnNpb24gKi8NCisJdTggaG9zdF9p
bnRlcmZhY2U7ICAgICAgICAgICAvKiBwbGFpbiBudW1iZXIgb2YgaW50ZXJmYWNlICAgICAgICov
DQorCXUxNiBtYXhfbnVtX3R4X2Rlc2M7ICAgICAgICAgLyogbWF4IG51bWJlciBvZiBUWCBkZXNj
cmlwdG9ycyAgICAqLw0KKwl1MTYgbWF4X251bV9tY19hZGRyOyAgICAgICAgIC8qIG1heCBudW1i
ZXIgbXVsdGljYXN0IGFkZHJlc3NlcyAgKi8NCisJdTE2IG51bV9hbnRlbm5hczsgICAgICAgICAg
ICAvKiBudW1iZXIgYW50ZW5uYXMgdXNlZCAgICAgICAgICAgICovDQorCXUxNiByZWdpb25fY29k
ZTsgICAgICAgICAgICAgLyogcmVnaW9uIChlZy4gMHgxMCBmb3IgVVNBIEZDQykgICAqLw0KKwl1
bnNpZ25lZCBjaGFyIG1hY19hZGRyW0VUSF9BTEVOXTsgLyogd2VsbCBrbm93biAtPiBBQTpCQjpD
QzpERDpFRTpGRiAqLw0KK307DQorDQorI2RlZmluZSBNV0xfVFhfUkFURV9GT1JNQVRfTUFTSyAg
ICAgICAweDAwMDAwMDAzDQorI2RlZmluZSBNV0xfVFhfUkFURV9CQU5EV0lEVEhfTUFTSyAgICAw
eDAwMDAwMDMwDQorI2RlZmluZSBNV0xfVFhfUkFURV9CQU5EV0lEVEhfU0hJRlQgICA0DQorI2Rl
ZmluZSBNV0xfVFhfUkFURV9TSE9SVEdJX01BU0sgICAgICAweDAwMDAwMDQwDQorI2RlZmluZSBN
V0xfVFhfUkFURV9TSE9SVEdJX1NISUZUICAgICA2DQorI2RlZmluZSBNV0xfVFhfUkFURV9SQVRF
SURNQ1NfTUFTSyAgICAweDAwMDA3RjAwDQorI2RlZmluZSBNV0xfVFhfUkFURV9SQVRFSURNQ1Nf
U0hJRlQgICA4DQorDQorc3RydWN0IG13bF90eF9kZXNjIHsNCisJdTggZGF0YV9yYXRlOw0KKwl1
OCB0eF9wcmlvcml0eTsNCisJX19sZTE2IHFvc19jdHJsOw0KKwlfX2xlMzIgcGt0X3B0cjsNCisJ
X19sZTE2IHBrdF9sZW47DQorCXU4IGRlc3RfYWRkcltFVEhfQUxFTl07DQorCV9fbGUzMiBwcGh5
c19uZXh0Ow0KKwlfX2xlMzIgc2FwX3BrdF9pbmZvOw0KKwlfX2xlMzIgcmF0ZV9pbmZvOw0KKwl1
OCB0eXBlOw0KKwl1OCB4bWl0X2NvbnRyb2w7ICAgICAvKiBiaXQgMDogdXNlIHJhdGVpbmZvLCBi
aXQgMTogZGlzYWJsZSBhbXBkdSAqLw0KKwlfX2xlMTYgcmVzZXJ2ZWQ7DQorCV9fbGUzMiB0Y3Bh
Y2tfc247DQorCV9fbGUzMiB0Y3BhY2tfc3JjX2RzdDsNCisJX19sZTMyIHJlc2VydmVkMTsNCisJ
X19sZTMyIHJlc2VydmVkMjsNCisJdTggcmVzZXJ2ZWQzWzJdOw0KKwl1OCBwYWNrZXRfaW5mbzsN
CisJdTggcGFja2V0X2lkOw0KKwlfX2xlMTYgcGFja2V0X2xlbl9hbmRfcmV0cnk7DQorCV9fbGUx
NiBwYWNrZXRfcmF0ZV9pbmZvOw0KKwlfX2xlMzIgcmVzZXJ2ZWQ0Ow0KKwlfX2xlMzIgc3RhdHVz
Ow0KK30gX19wYWNrZWQ7DQorDQorc3RydWN0IG13bF90eF9obmRsIHsNCisJc3RydWN0IHNrX2J1
ZmYgKnBza19idWZmOw0KKwlzdHJ1Y3QgbXdsX3R4X2Rlc2MgKnBkZXNjOw0KKwlzdHJ1Y3QgbXds
X3R4X2huZGwgKnBuZXh0Ow0KK307DQorDQorI2RlZmluZSBNV0xfUlhfUkFURV9GT1JNQVRfTUFT
SyAgICAgICAweDAwMDcNCisjZGVmaW5lIE1XTF9SWF9SQVRFX05TU19NQVNLICAgICAgICAgIDB4
MDAxOA0KKyNkZWZpbmUgTVdMX1JYX1JBVEVfTlNTX1NISUZUICAgICAgICAgMw0KKyNkZWZpbmUg
TVdMX1JYX1JBVEVfQldfTUFTSyAgICAgICAgICAgMHgwMDYwDQorI2RlZmluZSBNV0xfUlhfUkFU
RV9CV19TSElGVCAgICAgICAgICA1DQorI2RlZmluZSBNV0xfUlhfUkFURV9HSV9NQVNLICAgICAg
ICAgICAweDAwODANCisjZGVmaW5lIE1XTF9SWF9SQVRFX0dJX1NISUZUICAgICAgICAgIDcNCisj
ZGVmaW5lIE1XTF9SWF9SQVRFX1JUX01BU0sgICAgICAgICAgIDB4RkYwMA0KKyNkZWZpbmUgTVdM
X1JYX1JBVEVfUlRfU0hJRlQgICAgICAgICAgOA0KKw0KK3N0cnVjdCBtd2xfcnhfZGVzYyB7DQor
CV9fbGUxNiBwa3RfbGVuOyAgICAgICAgICAgICAgLyogdG90YWwgbGVuZ3RoIG9mIHJlY2VpdmVk
IGRhdGEgICAgICAqLw0KKwlfX2xlMTYgcmF0ZTsgICAgICAgICAgICAgICAgIC8qIHJlY2VpdmUg
cmF0ZSBpbmZvcm1hdGlvbiAgICAgICAgICAgKi8NCisJX19sZTMyIHBwaHlzX2J1ZmZfZGF0YTsg
ICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHBheWxvYWQgZGF0YSAgICovDQorCV9fbGUzMiBw
cGh5c19uZXh0OyAgICAgICAgICAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBuZXh0IFJYIGRlc2Mg
ICAqLw0KKwlfX2xlMTYgcW9zX2N0cmw7ICAgICAgICAgICAgIC8qIHJlY2VpdmVkIFFvc0N0cmwg
ZmllbGQgdmFyaWFibGUgICAgKi8NCisJX19sZTE2IGh0X3NpZzI7ICAgICAgICAgICAgICAvKiBs
aWtlIG5hbWUgc3RhdGVzICAgICAgICAgICAgICAgICAgICovDQorCV9fbGUzMiBod19yc3NpX2lu
Zm87DQorCV9fbGUzMiBod19ub2lzZV9mbG9vcl9pbmZvOw0KKwl1OCBub2lzZV9mbG9vcjsNCisJ
dTggcmVzZXJ2ZWRbM107DQorCXU4IHJzc2k7ICAgICAgICAgICAgICAgICAgICAgLyogcmVjZWl2
ZWQgc2lnbmFsIHN0cmVuZ3QgaW5kaWNhdGlvbiAqLw0KKwl1OCBzdGF0dXM7ICAgICAgICAgICAg
ICAgICAgIC8qIHN0YXR1cyBmaWVsZCBjb250YWluaW5nIFVTRUQgYml0ICAgKi8NCisJdTggY2hh
bm5lbDsgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIHRoaXMgcGt0IHdhcyByZWNlaXZlZCBv
biAgICovDQorCXU4IHJ4X2NvbnRyb2w7ICAgICAgICAgICAgICAgLyogdGhlIGNvbnRyb2wgZWxl
bWVudCBvZiB0aGUgZGVzYyAgICAqLw0KKwlfX2xlMzIgcmVzZXJ2ZWQxWzNdOw0KK30gX19wYWNr
ZWQ7DQorDQorc3RydWN0IG13bF9yeF9obmRsIHsNCisJc3RydWN0IHNrX2J1ZmYgKnBza19idWZm
OyAgICAvKiBhc3NvY2lhdGVkIHNrX2J1ZmYgZm9yIExpbnV4ICAgICAgICovDQorCXN0cnVjdCBt
d2xfcnhfZGVzYyAqcGRlc2M7DQorCXN0cnVjdCBtd2xfcnhfaG5kbCAqcG5leHQ7DQorfTsNCisN
CitzdHJ1Y3QgbXdsX2Rlc2NfZGF0YSB7DQorCWRtYV9hZGRyX3QgcHBoeXNfdHhfcmluZzsgICAg
ICAgICAgLyogcHRyIHRvIGZpcnN0IFRYIGRlc2MgKHBoeXMuKSAgICAqLw0KKwlzdHJ1Y3QgbXds
X3R4X2Rlc2MgKnB0eF9yaW5nOyAgICAgIC8qIHB0ciB0byBmaXJzdCBUWCBkZXNjICh2aXJ0Likg
ICAgKi8NCisJc3RydWN0IG13bF90eF9obmRsICp0eF9obmRsOw0KKwlzdHJ1Y3QgbXdsX3R4X2hu
ZGwgKnBuZXh0X3R4X2huZGw7IC8qIG5leHQgVFggaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgKi8N
CisJc3RydWN0IG13bF90eF9obmRsICpwc3RhbGVfdHhfaG5kbDsvKiB0aGUgc3RhbGVkIFRYIGhh
bmRsZSAgICAgICAgICAgICovDQorCWRtYV9hZGRyX3QgcHBoeXNfcnhfcmluZzsgICAgICAgICAg
LyogcHRyIHRvIGZpcnN0IFJYIGRlc2MgKHBoeXMuKSAgICAqLw0KKwlzdHJ1Y3QgbXdsX3J4X2Rl
c2MgKnByeF9yaW5nOyAgICAgIC8qIHB0ciB0byBmaXJzdCBSWCBkZXNjICh2aXJ0LikgICAgKi8N
CisJc3RydWN0IG13bF9yeF9obmRsICpyeF9obmRsOw0KKwlzdHJ1Y3QgbXdsX3J4X2huZGwgKnBu
ZXh0X3J4X2huZGw7IC8qIG5leHQgUlggaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgKi8NCisJdTMy
IHdjYl9iYXNlOyAgICAgICAgICAgICAgICAgICAgICAvKiBGVyBiYXNlIG9mZnNldCBmb3IgcmVn
aXN0ZXJzICAgICovDQorCXUzMiByeF9kZXNjX3dyaXRlOyAgICAgICAgICAgICAgICAgLyogRlcg
ZGVzY3JpcHRvciB3cml0ZSBwb3NpdGlvbiAgICAqLw0KKwl1MzIgcnhfZGVzY19yZWFkOyAgICAg
ICAgICAgICAgICAgIC8qIEZXIGRlc2NyaXB0b3IgcmVhZCBwb3NpdGlvbiAgICAgKi8NCisJdTMy
IHJ4X2J1Zl9zaXplOyAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgdGhlIFJYIGJ1ZmZl
cnMgICAgICAgICovDQorfTsNCisNCitzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSB7DQorCXN0cnVj
dCBpZWVlODAyMTFfc3RhICpzdGE7DQorCXU4IHRpZDsNCisJdTggc3RhdGU7DQorCXU4IGlkeDsN
Cit9Ow0KKw0KKyNpZmRlZiBDT05GSUdfREVCVUdfRlMNCisjZGVmaW5lIE1BQ19SRUdfQUREUl9Q
Q0kob2Zmc2V0KSAgICAgICgocHJpdi0+aW9iYXNlMSArIDB4QTAwMCkgKyBvZmZzZXQpDQorDQor
I2RlZmluZSBNV0xfQUNDRVNTX01BQyAgICAgICAgICAgICAgICAxDQorI2RlZmluZSBNV0xfQUND
RVNTX1JGICAgICAgICAgICAgICAgICAyDQorI2RlZmluZSBNV0xfQUNDRVNTX0JCUCAgICAgICAg
ICAgICAgICAzDQorI2RlZmluZSBNV0xfQUNDRVNTX0NBVSAgICAgICAgICAgICAgICA0DQorI2Rl
ZmluZSBNV0xfQUNDRVNTX0FERFIwICAgICAgICAgICAgICA1DQorI2RlZmluZSBNV0xfQUNDRVNT
X0FERFIxICAgICAgICAgICAgICA2DQorI2RlZmluZSBNV0xfQUNDRVNTX0FERFIgICAgICAgICAg
ICAgICA3DQorI2VuZGlmDQorDQorc3RydWN0IG13bF9wcml2IHsNCisJc3RydWN0IGllZWU4MDIx
MV9odyAqaHc7DQorCXN0cnVjdCBmaXJtd2FyZSAqZndfdWNvZGU7DQorCWludCBjaGlwX3R5cGU7
DQorDQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHRfbm9kZTsNCisJc3RydWN0IGRldmljZV9ub2Rl
ICpwd3Jfbm9kZTsNCisJYm9vbCBkaXNhYmxlXzJnOw0KKwlib29sIGRpc2FibGVfNWc7DQorCWlu
dCBhbnRlbm5hX3R4Ow0KKwlpbnQgYW50ZW5uYV9yeDsNCisNCisJc3RydWN0IG13bF90eF9wd3Jf
dGJsIHR4X3B3cl90YmxbU1lTQURQVF9NQVhfTlVNX0NIQU5ORUxTXTsNCisJYm9vbCBjZGQ7DQor
CXUxNiB0eGFudGVubmEyOw0KKwl1OCBwb3dpbml0ZWQ7DQorCXUxNiBtYXhfdHhfcG93W1NZU0FE
UFRfVFhfUE9XRVJfTEVWRUxfVE9UQUxdOyAvKiBtYXggdHggcG93ZXIgKGRCbSkgKi8NCisJdTE2
IHRhcmdldF9wb3dlcnNbU1lTQURQVF9UWF9QT1dFUl9MRVZFTF9UT1RBTF07IC8qIHRhcmdldCBw
b3dlcnMgICAqLw0KKwl1OCBjYWxfdGJsWzIwMF07DQorDQorCXN0cnVjdCBwY2lfZGV2ICpwZGV2
Ow0KKwl2b2lkIF9faW9tZW0gKmlvYmFzZTA7IC8qIE1FTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIg
MCAgKi8NCisJdm9pZCBfX2lvbWVtICppb2Jhc2UxOyAvKiBNRU0gQmFzZSBBZGRyZXNzIFJlZ2lz
dGVyIDEgICovDQorCXUzMiBuZXh0X2Jhcl9udW07DQorDQorCXNwaW5sb2NrX3QgZndjbWRfbG9j
azsgICAgICAgLyogZm9yIGZpcm13YXJlIGNvbW1hbmQgICAgICAgICAqLw0KKwl1bnNpZ25lZCBz
aG9ydCAqcGNtZF9idWY7ICAgIC8qIHBvaW50ZXIgdG8gQ21kQnVmICh2aXJ0dWFsKSAgKi8NCisJ
ZG1hX2FkZHJfdCBwcGh5c19jbWRfYnVmOyAgICAvKiBwb2ludGVyIHRvIENtZEJ1ZiAocGh5c2lj
YWwpICovDQorCWJvb2wgaW5fc2VuZF9jbWQ7DQorDQorCWludCBpcnE7DQorCXN0cnVjdCBtd2xf
aHdfZGF0YSBod19kYXRhOyAgLyogQWRhcHRlciBIVyBzcGVjaWZpYyBpbmZvICAgICAqLw0KKw0K
KwkvKiB2YXJpb3VzIGRlc2NyaXB0b3IgZGF0YSAqLw0KKwlzcGlubG9ja190IHR4X2Rlc2NfbG9j
azsgICAgIC8qIGZvciB0eCBkZXNjcmlwdG9yIGRhdGEgICAgICAgKi8NCisJc3BpbmxvY2tfdCBy
eF9kZXNjX2xvY2s7ICAgICAvKiBmb3IgcnggZGVzY3JpcHRvciBkYXRhICAgICAgICovDQorCXN0
cnVjdCBtd2xfZGVzY19kYXRhIGRlc2NfZGF0YVtTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEFdOw0K
KwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4cVtTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEFdOw0KKwlz
dHJ1Y3Qgc2tfYnVmZl9oZWFkIGRlbGF5X3E7DQorCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBv
d25lZCBieSBmdyBhdCBhbnkgb25lIHRpbWUgKi8NCisJaW50IGZ3X2Rlc2NfY250W1NZU0FEUFRf
TlVNX09GX0RFU0NfREFUQV07DQorDQorCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0eF90YXNrOw0K
KwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnhfdGFzazsNCisJc3RydWN0IHRhc2tsZXRfc3RydWN0
IHFlX3Rhc2s7DQorCWludCB0eHFfbGltaXQ7DQorCWJvb2wgaXNfdHhfc2NoZWR1bGU7DQorCWlu
dCByZWN2X2xpbWl0Ow0KKwlib29sIGlzX3J4X3NjaGVkdWxlOw0KKwlib29sIGlzX3FlX3NjaGVk
dWxlOw0KKwlzOCBub2lzZTsgICAgICAgICAgICAgICAgICAgIC8qIE1vc3QgcmVjZW50bHkgcmVw
b3J0ZWQgbm9pc2UgaW4gZEJtICovDQorCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQg
YmFuZF8yNDsNCisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGNoYW5uZWxzXzI0W0JBTkRfMjRf
Q0hBTk5FTF9OVU1dOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgcmF0ZXNfMjRbQkFORF8yNF9S
QVRFX05VTV07DQorCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZF81MDsNCisJ
c3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGNoYW5uZWxzXzUwW0JBTkRfNTBfQ0hBTk5FTF9OVU1d
Ow0KKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgcmF0ZXNfNTBbQkFORF81MF9SQVRFX05VTV07DQor
DQorCXUzMiBhcF9tYWNpZHNfc3VwcG9ydGVkOw0KKwl1MzIgc3RhX21hY2lkc19zdXBwb3J0ZWQ7
DQorCXUzMiBtYWNpZHNfdXNlZDsNCisJc3BpbmxvY2tfdCB2aWZfbG9jazsgICAgICAgICAvKiBm
b3IgcHJpdmF0ZSBpbnRlcmZhY2UgaW5mbyAgICovDQorCXN0cnVjdCBsaXN0X2hlYWQgdmlmX2xp
c3Q7ICAgLyogTGlzdCBvZiBpbnRlcmZhY2VzLiAgICAgICAgICAqLw0KKwl1MzIgcnVubmluZ19i
c3NlczsgICAgICAgICAgIC8qIGJpdG1hcCBvZiBydW5uaW5nIEJTU2VzICAgICAgKi8NCisNCisJ
c3BpbmxvY2tfdCBzdGFfbG9jazsgICAgICAgICAvKiBmb3IgcHJpdmF0ZSBzdGEgaW5mbyAgICAg
ICAgICovDQorCXN0cnVjdCBsaXN0X2hlYWQgc3RhX2xpc3Q7ICAgLyogTGlzdCBvZiBzdGF0aW9u
cyAgICAgICAgICAgICAqLw0KKw0KKwlib29sIHJhZGlvX29uOw0KKwlib29sIHJhZGlvX3Nob3J0
X3ByZWFtYmxlOw0KKwlib29sIHdtbV9lbmFibGVkOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1
ZXVlX3BhcmFtcyB3bW1fcGFyYW1zW1NZU0FEUFRfVFhfV01NX1FVRVVFU107DQorDQorCS8qIEFt
cGR1IHN0cmVhbSBpbmZvcm1hdGlvbiAqLw0KKwl1OCBudW1fYW1wZHVfcXVldWVzOw0KKwlzcGlu
bG9ja190IHN0cmVhbV9sb2NrOyAgICAgIC8qIGZvciBhbXBkdSBzdHJlYW0gICAgICAgICAgICAg
Ki8NCisJc3RydWN0IG13bF9hbXBkdV9zdHJlYW0gYW1wZHVbU1lTQURQVF9UWF9BTVBEVV9RVUVV
RVNdOw0KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hkb2dfYmFfaGFuZGxlOw0KKw0KKwlib29s
IG1mZ19tb2RlOw0KKw0KKyNpZmRlZiBDT05GSUdfREVCVUdfRlMNCisJc3RydWN0IGRlbnRyeSAq
ZGVidWdmc19waHk7DQorCXUzMiByZWdfdHlwZTsNCisJdTMyIHJlZ19vZmZzZXQ7DQorCXUzMiBy
ZWdfdmFsdWU7DQorI2VuZGlmDQorfTsNCisNCitzdHJ1Y3QgYmVhY29uX2luZm8gew0KKwlib29s
IHZhbGlkOw0KKwl1MTYgY2FwX2luZm87DQorCXU4IGJfcmF0ZV9zZXRbU1lTQURQVF9NQVhfREFU
QV9SQVRFU19HXTsNCisJdTggb3BfcmF0ZV9zZXRbU1lTQURQVF9NQVhfREFUQV9SQVRFU19HXTsN
CisJdTggaWVfbGlzdF9odFsxNDhdOw0KKwl1OCBpZV9saXN0X3ZodFsyNF07DQorCXU4ICppZV93
bW1fcHRyOw0KKwl1OCAqaWVfcnNuX3B0cjsNCisJdTggKmllX3JzbjQ4X3B0cjsNCisJdTggKmll
X2h0X3B0cjsNCisJdTggKmllX3ZodF9wdHI7DQorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNI
DQorCXU4ICppZV9tZXNoaWRfcHRyOw0KKwl1OCAqaWVfbWVzaGNmZ19wdHI7DQorCXU4ICppZV9t
ZXNoY2hzd19wdHI7DQorI2VuZGlmDQorCXU4IGllX3dtbV9sZW47DQorCXU4IGllX3Jzbl9sZW47
DQorCXU4IGllX3JzbjQ4X2xlbjsNCisJdTggaWVfaHRfbGVuOw0KKwl1OCBpZV92aHRfbGVuOw0K
KyNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSA0KKwl1OCBpZV9tZXNoaWRfbGVuOw0KKwl1OCBp
ZV9tZXNoY2ZnX2xlbjsNCisJdTggaWVfbWVzaGNoc3dfbGVuOw0KKyNlbmRpZg0KK307DQorDQor
c3RydWN0IG13bF92aWYgew0KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7DQorCWludCBtYWNpZDsg
ICAgICAgLyogRmlybXdhcmUgbWFjaWQgZm9yIHRoaXMgdmlmLiAgKi8NCisJdTE2IHNlcW5vOyAg
ICAgICAvKiBOb24gQU1QRFUgc2VxdWVuY2UgbnVtYmVyIGFzc2lnbmVkIGJ5IGRyaXZlci4gICov
DQorCXN0cnVjdCB7ICAgICAgICAgLyogU2F2ZWQgV0VQIGtleXMgKi8NCisJCXU4IGVuYWJsZWQ7
DQorCQl1OCBrZXlbc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYpICsgV0xBTl9LRVlf
TEVOX1dFUDEwNF07DQorCX0gd2VwX2tleV9jb25mW05VTV9XRVBfS0VZU107DQorCXU4IGJzc2lk
W0VUSF9BTEVOXTsgICAgICAgICAgLyogQlNTSUQgKi8NCisJdTggc3RhX21hY1tFVEhfQUxFTl07
ICAgICAgICAvKiBTdGF0aW9uIG1hYyBhZGRyZXNzICovDQorCS8qIEEgZmxhZyB0byBpbmRpY2F0
ZSBpcyBIVyBjcnlwdG8gaXMgZW5hYmxlZCBmb3IgdGhpcyBic3NpZCAqLw0KKwlib29sIGlzX2h3
X2NyeXB0b19lbmFibGVkOw0KKwkvKiBJbmRpY2F0ZSBpZiB0aGlzIGlzIHN0YXRpb24gbW9kZSAq
Lw0KKwlzdHJ1Y3QgYmVhY29uX2luZm8gYmVhY29uX2luZm87DQorCXUxNiBpdjE2Ow0KKwl1MzIg
aXYzMjsNCisJczgga2V5aWR4Ow0KK307DQorDQorc3RydWN0IG13bF90eF9pbmZvIHsNCisJdW5z
aWduZWQgbG9uZyBzdGFydF90aW1lOw0KKwl1MzIgcGt0czsNCit9Ow0KKw0KK3N0cnVjdCBtd2xf
YW1zZHVfZnJhZyB7DQorCXN0cnVjdCBza19idWZmICpza2I7DQorCXU4ICpjdXJfcG9zOw0KKwl1
bnNpZ25lZCBsb25nIGppZmZpZXM7DQorCXU4IHBhZDsNCisJdTggbnVtOw0KK307DQorDQorc3Ry
dWN0IG13bF9hbXNkdV9jdHJsIHsNCisJc3RydWN0IG13bF9hbXNkdV9mcmFnIGZyYWdbU1lTQURQ
VF9UWF9XTU1fUVVFVUVTXTsNCisJdTggY2FwOw0KK307DQorDQorc3RydWN0IG13bF9zdGEgew0K
KwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7DQorCWJvb2wgaXNfbWVzaF9ub2RlOw0KKwlib29sIGlz
X2FtcGR1X2FsbG93ZWQ7DQorCXN0cnVjdCBtd2xfdHhfaW5mbyB0eF9zdGF0c1tNV0xfTUFYX1RJ
RF07DQorCWJvb2wgaXNfYW1zZHVfYWxsb3dlZDsNCisJc3BpbmxvY2tfdCBhbXNkdV9sb2NrOyAg
ICAgIC8qIGZvciBhbXNkdSBhZ2dyZWdhdGlvbiAgICAgICAqLw0KKwlzdHJ1Y3QgbXdsX2Ftc2R1
X2N0cmwgYW1zZHVfY3RybDsNCisJdTE2IGl2MTY7DQorCXUzMiBpdjMyOw0KK307DQorDQorLyog
RE1BIGhlYWRlciB1c2VkIGJ5IGZpcm13YXJlIGFuZCBoYXJkd2FyZS4gKi8NCitzdHJ1Y3QgbXds
X2RtYV9kYXRhIHsNCisJX19sZTE2IGZ3bGVuOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciB3aDsN
CisJY2hhciBkYXRhWzBdOw0KK30gX19wYWNrZWQ7DQorDQorLyogVHJhbnNtaXNzaW9uIGluZm9y
bWF0aW9uIHRvIHRyYW5zbWl0IGEgc29ja2V0IGJ1ZmZlci4gKi8NCitzdHJ1Y3QgbXdsX3R4X2N0
cmwgew0KKwl2b2lkICp2aWY7DQorCXZvaWQgKnN0YTsNCisJdm9pZCAqa19jb25mOw0KKwl2b2lk
ICphbXNkdV9wa3RzOw0KKwl1OCB0eF9wcmlvcml0eTsNCisJdTggdHlwZTsNCisJdTE2IHFvc19j
dHJsOw0KKwl1OCB4bWl0X2NvbnRyb2w7DQorfTsNCisNCitzdGF0aWMgaW5saW5lIHN0cnVjdCBt
d2xfdmlmICptd2xfZGV2X2dldF92aWYoY29uc3Qgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikN
Cit7DQorCXJldHVybiAoc3RydWN0IG13bF92aWYgKikmdmlmLT5kcnZfcHJpdjsNCit9DQorDQor
c3RhdGljIGlubGluZSBzdHJ1Y3QgbXdsX3N0YSAqbXdsX2Rldl9nZXRfc3RhKGNvbnN0IHN0cnVj
dCBpZWVlODAyMTFfc3RhICpzdGEpDQorew0KKwlyZXR1cm4gKHN0cnVjdCBtd2xfc3RhICopJnN0
YS0+ZHJ2X3ByaXY7DQorfQ0KKw0KKy8qIERlZmluZWQgaW4gbWFjODAyMTEuYy4gKi8NCitleHRl
cm4gY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgbXdsX21hYzgwMjExX29wczsNCisNCisjZW5k
aWYgLyogX2Rldl9oXyAqLw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl
bGwvbXdsd2lmaS9md2NtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZp
L2Z3Y21kLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi45M2MwYTAzDQot
LS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkv
ZndjbWQuYw0KQEAgLTAsMCArMSwyNDIxIEBADQorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYt
MjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4NCisgKg0KKyAqIFRoaXMgc29mdHdhcmUg
ZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCBJbnRlcm5hdGlvbmFs
DQorICogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxDQorICogKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSB1
c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSBpbg0KKyAqIGFjY29yZGFu
Y2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2UsIGEgY29weSBv
ZiB3aGljaA0KKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqIFRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlT
LCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFDQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRQ0KKyAqIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1FRC4gIFRoZSBMaWNlbnNlIHByb3ZpZGVz
IGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dA0KKyAqIHRoaXMgd2FycmFudHkgZGlzY2xhaW1lci4N
CisgKi8NCisNCisvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZpcm13YXJl
IGhvc3QgY29tbWFuZCByZWxhdGVkDQorICogZnVuY3Rpb25zLg0KKyAqLw0KKw0KKyNpbmNsdWRl
IDxsaW51eC9ldGhlcmRldmljZS5oPg0KKw0KKyNpbmNsdWRlICJzeXNhZHB0LmgiDQorI2luY2x1
ZGUgImRldi5oIg0KKyNpbmNsdWRlICJmd2NtZC5oIg0KKyNpbmNsdWRlICJob3N0Y21kLmgiDQor
DQorI2RlZmluZSBNQVhfV0FJVF9GV19DT01QTEVURV9JVEVSQVRJT05TICAgICAgICAgMjAwMA0K
KyNkZWZpbmUgTUFYX1dBSVRfR0VUX0hXX1NQRUNTX0lURVJBVE9OUyAgICAgICAgIDMNCisNCitz
dHJ1Y3QgY21kX2hlYWRlciB7DQorCV9fbGUxNiBjb21tYW5kOw0KKwlfX2xlMTYgbGVuOw0KK30g
X19wYWNrZWQ7DQorDQorc3RhdGljIGJvb2wgbXdsX2Z3Y21kX2Noa19hZGFwdGVyKHN0cnVjdCBt
d2xfcHJpdiAqcHJpdikNCit7DQorCXUzMiByZWd2YWw7DQorDQorCXJlZ3ZhbCA9IHJlYWRsKHBy
aXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0lOVF9DT0RFKTsNCisNCisJaWYgKHJlZ3ZhbCA9PSAw
eGZmZmZmZmZmKSB7DQorCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiYWRhcHRlciBkb2Vz
IG5vdCBleGlzdFxuIik7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJcmV0dXJuIHRydWU7
DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9md2NtZF9zZW5kX2NtZChzdHJ1Y3QgbXdsX3ByaXYg
KnByaXYpDQorew0KKwlpZiAocHJpdi0+bWZnX21vZGUpIHsNCisJCXN0cnVjdCBjbWRfaGVhZGVy
ICpjbWRfaGRyID0NCisJCQkoc3RydWN0IGNtZF9oZWFkZXIgKikmcHJpdi0+cGNtZF9idWZbMl07
DQorCQl1MTYgbGVuID0gbGUxNl90b19jcHUoY21kX2hkci0+bGVuKTsNCisNCisJCXdyaXRlbChw
cml2LT5wcGh5c19jbWRfYnVmLCBwcml2LT5pb2Jhc2UxICsgMHhjZDApOw0KKwkJd3JpdGVsKDB4
MDAsIHByaXYtPmlvYmFzZTEgKyAweGNkNCk7DQorCQl3cml0ZWwoMHgwMCwgcHJpdi0+aW9iYXNl
MSArIE1BQ1JFR19SRUdfSU5UX0NPREUpOw0KKwkJd3JpdGVsKGxlbiArIDQsIHByaXYtPmlvYmFz
ZTEgKyAweGM0MCk7DQorCX0NCisJd3JpdGVsKHByaXYtPnBwaHlzX2NtZF9idWYsIHByaXYtPmlv
YmFzZTEgKyBNQUNSRUdfUkVHX0dFTl9QVFIpOw0KKwl3cml0ZWwoTUFDUkVHX0gyQVJJQ19CSVRf
RE9PUl9CRUxMLA0KKwkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfSDJBX0lOVEVS
UlVQVF9FVkVOVFMpOw0KK30NCisNCitzdGF0aWMgY2hhciAqbXdsX2Z3Y21kX2dldF9jbWRfc3Ry
aW5nKHVuc2lnbmVkIHNob3J0IGNtZCkNCit7DQorCWludCBtYXhfZW50cmllcyA9IDA7DQorCWlu
dCBjdXJyX2NtZCA9IDA7DQorDQorCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgew0KKwkJdTE2IGNtZDsN
CisJCWNoYXIgKmNtZF9zdHJpbmc7DQorCX0gY21kc1tdID0gew0KKwkJeyBIT1NUQ01EX0NNRF9H
RVRfSFdfU1BFQywgIkdldEh3U3BlY2lmaWNhdGlvbnMiIH0sDQorCQl7IEhPU1RDTURfQ01EX1NF
VF9IV19TUEVDLCAiU2V0SHdTZXBjaWZpY2F0aW9ucyIgfSwNCisJCXsgSE9TVENNRF9DTURfODAy
XzExX0dFVF9TVEFULCAiODAyMTFHZXRTdGF0IiB9LA0KKwkJeyBIT1NUQ01EX0NNRF84MDJfMTFf
UkFESU9fQ09OVFJPTCwgIjgwMjExUmFkaW9Db250cm9sIiB9LA0KKwkJeyBIT1NUQ01EX0NNRF9N
RU1fQUREUl9BQ0NFU1MsICJNRU1BZGRyQWNjZXNzIiB9LA0KKwkJeyBIT1NUQ01EX0NNRF84MDJf
MTFfVFhfUE9XRVIsICI4MDIxMVR4UG93ZXIiIH0sDQorCQl7IEhPU1RDTURfQ01EXzgwMl8xMV9S
Rl9BTlRFTk5BLCAiODAyMTFSZkFudGVubmEiIH0sDQorCQl7IEhPU1RDTURfQ01EX0JST0FEQ0FT
VF9TU0lEX0VOQUJMRSwgImJyb2FkY2FzdF9zc2lkX2VuYWJsZSIgfSwNCisJCXsgSE9TVENNRF9D
TURfU0VUX1JGX0NIQU5ORUwsICJTZXRSZkNoYW5uZWwiIH0sDQorCQl7IEhPU1RDTURfQ01EX1NF
VF9BSUQsICJTZXRBaWQiIH0sDQorCQl7IEhPU1RDTURfQ01EX1NFVF9JTkZSQV9NT0RFLCAiU2V0
SW5mcmFNb2RlIiB9LA0KKwkJeyBIT1NUQ01EX0NNRF84MDJfMTFfUlRTX1RIU0QsICI4MDIxMVJ0
c1RocmVzaG9sZCIgfSwNCisJCXsgSE9TVENNRF9DTURfU0VUX0VEQ0FfUEFSQU1TLCAiU2V0RURD
QVBhcmFtcyIgfSwNCisJCXsgSE9TVENNRF9DTURfU0VUX1dNTV9NT0RFLCAiU2V0V01NTW9kZSIg
fSwNCisJCXsgSE9TVENNRF9DTURfSFRfR1VBUkRfSU5URVJWQUwsICJIdEd1YXJkSW50ZXJ2YWwi
IH0sDQorCQl7IEhPU1RDTURfQ01EX1NFVF9GSVhFRF9SQVRFLCAiU2V0Rml4ZWRSYXRlIiB9LA0K
KwkJeyBIT1NUQ01EX0NNRF9TRVRfSUVTLCAiU2V0SW5mb3JtYXRpb25FbGVtZW50cyIgfSwNCisJ
CXsgSE9TVENNRF9DTURfU0VUX0xJTktBREFQVF9DU19NT0RFLCAiTGlua0FkYXB0Q3NNb2RlIiB9
LA0KKwkJeyBIT1NUQ01EX0NNRF9TRVRfTUFDX0FERFIsICJTZXRNYWNBZGRyIiB9LA0KKwkJeyBI
T1NUQ01EX0NNRF9TRVRfUkFURV9BREFQVF9NT0RFLCAiU2V0UmF0ZUFkYXB0YXRpb25Nb2RlIiB9
LA0KKwkJeyBIT1NUQ01EX0NNRF9HRVRfV0FUQ0hET0dfQklUTUFQLCAiR2V0V2F0Y2hkb2dCaXRN
YXAiIH0sDQorCQl7IEhPU1RDTURfQ01EX0RFTF9NQUNfQUREUiwgIkRlbE1hY0FkZHIiIH0sDQor
CQl7IEhPU1RDTURfQ01EX0JTU19TVEFSVCwgIkJzc1N0YXJ0IiB9LA0KKwkJeyBIT1NUQ01EX0NN
RF9BUF9CRUFDT04sICJTZXRBcEJlYWNvbiIgfSwNCisJCXsgSE9TVENNRF9DTURfU0VUX05FV19T
VE4sICJTZXROZXdTdGF0aW9uIiB9LA0KKwkJeyBIT1NUQ01EX0NNRF9TRVRfQVBNT0RFLCAiU2V0
QXBNb2RlIiB9LA0KKwkJeyBIT1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElPTiwgIlVwZGF0ZUVu
Y3J5cHRpb24iIH0sDQorCQl7IEhPU1RDTURfQ01EX0JBU1RSRUFNLCAiQkFTdHJlYW0iIH0sDQor
CQl7IEhPU1RDTURfQ01EX1NFVF9PUFRJTUlaQVRJT05fTEVWRUwsICJTZXRPcHRpbWl6YXRpb25M
ZXZlbCJ9LA0KKwkJeyBIT1NUQ01EX0NNRF9EV0RTX0VOQUJMRSwgIkR3ZHNFbmFibGUiIH0sDQor
CQl7IEhPU1RDTURfQ01EX0ZXX0ZMVVNIX1RJTUVSLCAiRndGbHVzaFRpbWVyIiB9LA0KKwkJeyBI
T1NUQ01EX0NNRF9TRVRfQ0RELCAiU2V0Q0REIiB9LA0KKwl9Ow0KKw0KKwltYXhfZW50cmllcyA9
IEFSUkFZX1NJWkUoY21kcyk7DQorDQorCWZvciAoY3Vycl9jbWQgPSAwOyBjdXJyX2NtZCA8IG1h
eF9lbnRyaWVzOyBjdXJyX2NtZCsrKQ0KKwkJaWYgKChjbWQgJiAweDdmZmYpID09IGNtZHNbY3Vy
cl9jbWRdLmNtZCkNCisJCQlyZXR1cm4gY21kc1tjdXJyX2NtZF0uY21kX3N0cmluZzsNCisNCisJ
cmV0dXJuICJ1bmtub3duIjsNCit9DQorDQorc3RhdGljIGludCBtd2xfZndjbWRfd2FpdF9jb21w
bGV0ZShzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIHVuc2lnbmVkIHNob3J0IGNtZCkNCit7DQorCXVu
c2lnbmVkIGludCBjdXJyX2l0ZXJhdGlvbiA9IE1BWF9XQUlUX0ZXX0NPTVBMRVRFX0lURVJBVElP
TlM7DQorCXVuc2lnbmVkIHNob3J0IGludF9jb2RlID0gMDsNCisNCisJZG8gew0KKwkJaWYgKHBy
aXYtPm1mZ19tb2RlKQ0KKwkJCWludF9jb2RlID0gbGUxNl90b19jcHUoKigoX19sZTE2ICopJnBy
aXYtPnBjbWRfYnVmWzJdKSk7DQorCQllbHNlDQorCQkJaW50X2NvZGUgPSBsZTE2X3RvX2NwdSgq
KChfX2xlMTYgKikmcHJpdi0+cGNtZF9idWZbMF0pKTsNCisJCW1kZWxheSgxKTsNCisJfSB3aGls
ZSAoKGludF9jb2RlICE9IGNtZCkgJiYgKC0tY3Vycl9pdGVyYXRpb24pKTsNCisNCisJaWYgKGN1
cnJfaXRlcmF0aW9uID09IDApIHsNCisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJjbWQg
MHglMDR4PSVzIHRpbWVkIG91dFxuIiwNCisJCQkgIGNtZCwgbXdsX2Z3Y21kX2dldF9jbWRfc3Ry
aW5nKGNtZCkpOw0KKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgInJldHVybiBjb2RlOiAw
eCUwNHhcbiIsIGludF9jb2RlKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCW1kZWxheSgz
KTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX2Z3Y21kX2V4ZWNfY21k
KHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwgdW5zaWduZWQgc2hvcnQgY21kKQ0KK3sNCisJYm9vbCBi
dXN5ID0gZmFsc2U7DQorDQorCWlmICghbXdsX2Z3Y21kX2Noa19hZGFwdGVyKHByaXYpKSB7DQor
CQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiYWRhcHRlciBkb2VzIG5vdCBleGlzdFxuIik7
DQorCQlwcml2LT5pbl9zZW5kX2NtZCA9IGZhbHNlOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisN
CisJaWYgKCFwcml2LT5pbl9zZW5kX2NtZCkgew0KKwkJcHJpdi0+aW5fc2VuZF9jbWQgPSB0cnVl
Ow0KKwkJbXdsX2Z3Y21kX3NlbmRfY21kKHByaXYpOw0KKwkJaWYgKG13bF9md2NtZF93YWl0X2Nv
bXBsZXRlKHByaXYsIDB4ODAwMCB8IGNtZCkpIHsNCisJCQl3aXBoeV9lcnIocHJpdi0+aHctPndp
cGh5LCAidGltZW91dDogMHglMDR4XG4iLCBjbWQpOw0KKwkJCXByaXYtPmluX3NlbmRfY21kID0g
ZmFsc2U7DQorCQkJcmV0dXJuIC1FSU87DQorCQl9DQorCX0gZWxzZSB7DQorCQl3aXBoeV93YXJu
KHByaXYtPmh3LT53aXBoeSwNCisJCQkgICAicHJldmlvdXMgY29tbWFuZCBpcyBzdGlsbCBydW5u
aW5nXG4iKTsNCisJCWJ1c3kgPSB0cnVlOw0KKwl9DQorDQorCWlmICghYnVzeSkNCisJCXByaXYt
PmluX3NlbmRfY21kID0gZmFsc2U7DQorDQorCXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW50
IG13bF9md2NtZF84MDJfMTFfcmFkaW9fY29udHJvbChzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsDQor
CQkJCQkgIGJvb2wgZW5hYmxlLCBib29sIGZvcmNlKQ0KK3sNCisJc3RydWN0IGhvc3RjbWRfY21k
XzgwMl8xMV9yYWRpb19jb250cm9sICpwY21kOw0KKw0KKwlpZiAoZW5hYmxlID09IHByaXYtPnJh
ZGlvX29uICYmICFmb3JjZSkNCisJCXJldHVybiAwOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0
Y21kX2NtZF84MDJfMTFfcmFkaW9fY29udHJvbCAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJ
c3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAs
IHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RD
TURfQ01EXzgwMl8xMV9SQURJT19DT05UUk9MKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVf
dG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoV0xf
U0VUKTsNCisJcGNtZC0+Y29udHJvbCA9IGNwdV90b19sZTE2KHByaXYtPnJhZGlvX3Nob3J0X3By
ZWFtYmxlID8NCisJCVdMX0FVVE9fUFJFQU1CTEUgOiBXTF9MT05HX1BSRUFNQkxFKTsNCisJcGNt
ZC0+cmFkaW9fb24gPSBjcHVfdG9fbGUxNihlbmFibGUgPyBXTF9FTkFCTEUgOiBXTF9ESVNBQkxF
KTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF84MDJfMTFf
UkFESU9fQ09OVFJPTCkpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsN
CisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJ
CXJldHVybiAtRUlPOw0KKwl9DQorDQorCXByaXYtPnJhZGlvX29uID0gZW5hYmxlOw0KKw0KKwlz
cGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisN
CitzdGF0aWMgaW50IG13bF9md2NtZF9nZXRfdHhfcG93ZXJzKHN0cnVjdCBtd2xfcHJpdiAqcHJp
diwgdTE2ICpwb3dsaXN0LCB1MTYgY2gsDQorCQkJCSAgIHUxNiBiYW5kLCB1MTYgd2lkdGgsIHUx
NiBzdWJfY2gpDQorew0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfODAyXzExX3R4X3Bvd2VyICpwY21k
Ow0KKwlpbnQgaTsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfODAyXzExX3R4X3Bv
d2VyICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21k
X2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQt
PmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfODAyXzExX1RYX1BPV0VSKTsN
CisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNt
ZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoSE9TVENNRF9BQ1RfR0VOX0dFVF9MSVNUKTsNCisJcGNt
ZC0+Y2ggPSBjcHVfdG9fbGUxNihjaCk7DQorCXBjbWQtPmJ3ID0gY3B1X3RvX2xlMTYod2lkdGgp
Ow0KKwlwY21kLT5iYW5kID0gY3B1X3RvX2xlMTYoYmFuZCk7DQorCXBjbWQtPnN1Yl9jaCA9IGNw
dV90b19sZTE2KHN1Yl9jaCk7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9T
VENNRF9DTURfODAyXzExX1RYX1BPV0VSKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3
Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRp
b25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJZm9yIChpID0gMDsgaSA8IFNZU0FE
UFRfVFhfUE9XRVJfTEVWRUxfVE9UQUw7IGkrKykNCisJCXBvd2xpc3RbaV0gPSBsZTE2X3RvX2Nw
dShwY21kLT5wb3dlcl9sZXZlbF9saXN0W2ldKTsNCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYt
PmZ3Y21kX2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGludCBtd2xfZndj
bWRfc2V0X3R4X3Bvd2VycyhzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIHUxNiB0eHBvd1tdLA0KKwkJ
CQkgICB1OCBhY3Rpb24sIHUxNiBjaCwgdTE2IGJhbmQsDQorCQkJCSAgIHUxNiB3aWR0aCwgdTE2
IHN1Yl9jaCkNCit7DQorCXN0cnVjdCBob3N0Y21kX2NtZF84MDJfMTFfdHhfcG93ZXIgKnBjbWQ7
DQorCWludCBpOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF84MDJfMTFfdHhfcG93
ZXIgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+ZndjbWRf
bG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+
Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF84MDJfMTFfVFhfUE9XRVIpOw0K
KwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21k
LT5hY3Rpb24gPSBjcHVfdG9fbGUxNihhY3Rpb24pOw0KKwlwY21kLT5jaCA9IGNwdV90b19sZTE2
KGNoKTsNCisJcGNtZC0+YncgPSBjcHVfdG9fbGUxNih3aWR0aCk7DQorCXBjbWQtPmJhbmQgPSBj
cHVfdG9fbGUxNihiYW5kKTsNCisJcGNtZC0+c3ViX2NoID0gY3B1X3RvX2xlMTYoc3ViX2NoKTsN
CisNCisJZm9yIChpID0gMDsgaSA8IFNZU0FEUFRfVFhfUE9XRVJfTEVWRUxfVE9UQUw7IGkrKykN
CisJCXBjbWQtPnBvd2VyX2xldmVsX2xpc3RbaV0gPSBjcHVfdG9fbGUxNih0eHBvd1tpXSk7DQor
DQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURfODAyXzExX1RYX1BP
V0VSKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlf
ZXJyKHByaXYtPmh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1F
SU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwly
ZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHU4IG13bF9md2NtZF9nZXRfODBtX3ByaV9jaG5sX29m
ZnNldCh1OCBjaGFubmVsKQ0KK3sNCisJdTggYWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFO
XzA7DQorDQorCXN3aXRjaCAoY2hhbm5lbCkgew0KKwljYXNlIDM2Og0KKwkJYWN0X3ByaW1hcnkg
PSBBQ1RfUFJJTUFSWV9DSEFOXzA7DQorCQlicmVhazsNCisJY2FzZSA0MDoNCisJCWFjdF9wcmlt
YXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8xOw0KKwkJYnJlYWs7DQorCWNhc2UgNDQ6DQorCQlhY3Rf
cHJpbWFyeSA9IEFDVF9QUklNQVJZX0NIQU5fMjsNCisJCWJyZWFrOw0KKwljYXNlIDQ4Og0KKwkJ
YWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzM7DQorCQlicmVhazsNCisJY2FzZSA1MjoN
CisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8wOw0KKwkJYnJlYWs7DQorCWNhc2Ug
NTY6DQorCQlhY3RfcHJpbWFyeSA9IEFDVF9QUklNQVJZX0NIQU5fMTsNCisJCWJyZWFrOw0KKwlj
YXNlIDYwOg0KKwkJYWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzI7DQorCQlicmVhazsN
CisJY2FzZSA2NDoNCisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8zOw0KKwkJYnJl
YWs7DQorCWNhc2UgMTAwOg0KKwkJYWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzA7DQor
CQlicmVhazsNCisJY2FzZSAxMDQ6DQorCQlhY3RfcHJpbWFyeSA9IEFDVF9QUklNQVJZX0NIQU5f
MTsNCisJCWJyZWFrOw0KKwljYXNlIDEwODoNCisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllf
Q0hBTl8yOw0KKwkJYnJlYWs7DQorCWNhc2UgMTEyOg0KKwkJYWN0X3ByaW1hcnkgPSBBQ1RfUFJJ
TUFSWV9DSEFOXzM7DQorCQlicmVhazsNCisJY2FzZSAxMTY6DQorCQlhY3RfcHJpbWFyeSA9IEFD
VF9QUklNQVJZX0NIQU5fMDsNCisJCWJyZWFrOw0KKwljYXNlIDEyMDoNCisJCWFjdF9wcmltYXJ5
ID0gQUNUX1BSSU1BUllfQ0hBTl8xOw0KKwkJYnJlYWs7DQorCWNhc2UgMTI0Og0KKwkJYWN0X3By
aW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzI7DQorCQlicmVhazsNCisJY2FzZSAxMjg6DQorCQlh
Y3RfcHJpbWFyeSA9IEFDVF9QUklNQVJZX0NIQU5fMzsNCisJCWJyZWFrOw0KKwljYXNlIDEzMjoN
CisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8wOw0KKwkJYnJlYWs7DQorCWNhc2Ug
MTM2Og0KKwkJYWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzE7DQorCQlicmVhazsNCisJ
Y2FzZSAxNDA6DQorCQlhY3RfcHJpbWFyeSA9IEFDVF9QUklNQVJZX0NIQU5fMjsNCisJCWJyZWFr
Ow0KKwljYXNlIDE0NDoNCisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8zOw0KKwkJ
YnJlYWs7DQorCWNhc2UgMTQ5Og0KKwkJYWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzA7
DQorCQlicmVhazsNCisJY2FzZSAxNTM6DQorCQlhY3RfcHJpbWFyeSA9IEFDVF9QUklNQVJZX0NI
QU5fMTsNCisJCWJyZWFrOw0KKwljYXNlIDE1NzoNCisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1B
UllfQ0hBTl8yOw0KKwkJYnJlYWs7DQorCWNhc2UgMTYxOg0KKwkJYWN0X3ByaW1hcnkgPSBBQ1Rf
UFJJTUFSWV9DSEFOXzM7DQorCQlicmVhazsNCisJfQ0KKw0KKwlyZXR1cm4gYWN0X3ByaW1hcnk7
DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9md2NtZF9wYXJzZV9iZWFjb24oc3RydWN0IG13bF9w
cml2ICpwcml2LA0KKwkJCQkgICBzdHJ1Y3QgbXdsX3ZpZiAqdmlmLCB1OCAqYmVhY29uLCBpbnQg
bGVuKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210Ow0KKwlzdHJ1Y3QgYmVhY29u
X2luZm8gKmJlYWNvbl9pbmZvOw0KKwlpbnQgYmFzZWxlbjsNCisJdTggKnBvczsNCisJc2l6ZV90
IGxlZnQ7DQorCWJvb2wgZWxlbV9wYXJzZV9mYWlsZWQ7DQorDQorCW1nbXQgPSAoc3RydWN0IGll
ZWU4MDIxMV9tZ210ICopYmVhY29uOw0KKw0KKwliYXNlbGVuID0gKHU4ICopbWdtdC0+dS5iZWFj
b24udmFyaWFibGUgLSAodTggKiltZ210Ow0KKwlpZiAoYmFzZWxlbiA+IGxlbikNCisJCXJldHVy
bjsNCisNCisJYmVhY29uX2luZm8gPSAmdmlmLT5iZWFjb25faW5mbzsNCisJbWVtc2V0KGJlYWNv
bl9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlYWNvbl9pbmZvKSk7DQorCWJlYWNvbl9pbmZvLT52
YWxpZCA9IGZhbHNlOw0KKwliZWFjb25faW5mby0+aWVfaHRfcHRyID0gJmJlYWNvbl9pbmZvLT5p
ZV9saXN0X2h0WzBdOw0KKwliZWFjb25faW5mby0+aWVfdmh0X3B0ciA9ICZiZWFjb25faW5mby0+
aWVfbGlzdF92aHRbMF07DQorDQorCWJlYWNvbl9pbmZvLT5jYXBfaW5mbyA9IGxlMTZfdG9fY3B1
KG1nbXQtPnUuYmVhY29uLmNhcGFiX2luZm8pOw0KKw0KKwlwb3MgPSAodTggKiltZ210LT51LmJl
YWNvbi52YXJpYWJsZTsNCisJbGVmdCA9IGxlbiAtIGJhc2VsZW47DQorDQorCWVsZW1fcGFyc2Vf
ZmFpbGVkID0gZmFsc2U7DQorDQorCXdoaWxlIChsZWZ0ID49IDIpIHsNCisJCXU4IGlkLCBlbGVu
Ow0KKw0KKwkJaWQgPSAqcG9zKys7DQorCQllbGVuID0gKnBvcysrOw0KKwkJbGVmdCAtPSAyOw0K
Kw0KKwkJaWYgKGVsZW4gPiBsZWZ0KSB7DQorCQkJZWxlbV9wYXJzZV9mYWlsZWQgPSB0cnVlOw0K
KwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJc3dpdGNoIChpZCkgew0KKwkJY2FzZSBXTEFOX0VJRF9T
VVBQX1JBVEVTOg0KKwkJY2FzZSBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUzoNCisJCQl7DQorCQkJ
aW50IGlkeCwgYmksIG9pOw0KKwkJCXU4IHJhdGU7DQorDQorCQkJZm9yIChiaSA9IDA7IGJpIDwg
U1lTQURQVF9NQVhfREFUQV9SQVRFU19HOw0KKwkJCSAgICAgYmkrKykgew0KKwkJCQlpZiAoYmVh
Y29uX2luZm8tPmJfcmF0ZV9zZXRbYmldID09IDApDQorCQkJCQlicmVhazsNCisJCQl9DQorDQor
CQkJZm9yIChvaSA9IDA7IG9pIDwgU1lTQURQVF9NQVhfREFUQV9SQVRFU19HOw0KKwkJCSAgICAg
b2krKykgew0KKwkJCQlpZiAoYmVhY29uX2luZm8tPm9wX3JhdGVfc2V0W29pXSA9PSAwKQ0KKwkJ
CQkJYnJlYWs7DQorCQkJfQ0KKw0KKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgZWxlbjsgaWR4Kysp
IHsNCisJCQkJcmF0ZSA9IHBvc1tpZHhdOw0KKwkJCQlpZiAoKHJhdGUgJiAweDgwKSAhPSAwKSB7
DQorCQkJCQlpZiAoYmkgPCBTWVNBRFBUX01BWF9EQVRBX1JBVEVTX0cpDQorCQkJCQkJYmVhY29u
X2luZm8tPmJfcmF0ZV9zZXRbYmkrK10NCisJCQkJCQkJPSByYXRlICYgMHg3ZjsNCisJCQkJCWVs
c2Ugew0KKwkJCQkJCWVsZW1fcGFyc2VfZmFpbGVkID0gdHJ1ZTsNCisJCQkJCQlicmVhazsNCisJ
CQkJCX0NCisJCQkJfQ0KKwkJCQlpZiAob2kgPCBTWVNBRFBUX01BWF9EQVRBX1JBVEVTX0cpDQor
CQkJCQliZWFjb25faW5mby0+b3BfcmF0ZV9zZXRbb2krK10gPQ0KKwkJCQkJCXJhdGUgJiAweDdm
Ow0KKwkJCQllbHNlIHsNCisJCQkJCWVsZW1fcGFyc2VfZmFpbGVkID0gdHJ1ZTsNCisJCQkJCWJy
ZWFrOw0KKwkJCQl9DQorCQkJfQ0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgV0xBTl9FSURf
UlNOOg0KKwkJCWJlYWNvbl9pbmZvLT5pZV9yc240OF9sZW4gPSAoZWxlbiArIDIpOw0KKwkJCWJl
YWNvbl9pbmZvLT5pZV9yc240OF9wdHIgPSAocG9zIC0gMik7DQorCQkJYnJlYWs7DQorCQljYXNl
IFdMQU5fRUlEX0hUX0NBUEFCSUxJVFk6DQorCQljYXNlIFdMQU5fRUlEX0hUX09QRVJBVElPTjoN
CisJCWNhc2UgV0xBTl9FSURfT1ZFUkxBUF9CU1NfU0NBTl9QQVJBTToNCisJCWNhc2UgV0xBTl9F
SURfRVhUX0NBUEFCSUxJVFk6DQorCQkJYmVhY29uX2luZm8tPmllX2h0X2xlbiArPSAoZWxlbiAr
IDIpOw0KKwkJCWlmIChiZWFjb25faW5mby0+aWVfaHRfbGVuID4NCisJCQkgICAgc2l6ZW9mKGJl
YWNvbl9pbmZvLT5pZV9saXN0X2h0KSkgew0KKwkJCQllbGVtX3BhcnNlX2ZhaWxlZCA9IHRydWU7
DQorCQkJfSBlbHNlIHsNCisJCQkJKmJlYWNvbl9pbmZvLT5pZV9odF9wdHIrKyA9IGlkOw0KKwkJ
CQkqYmVhY29uX2luZm8tPmllX2h0X3B0cisrID0gZWxlbjsNCisJCQkJbWVtY3B5KGJlYWNvbl9p
bmZvLT5pZV9odF9wdHIsIHBvcywgZWxlbik7DQorCQkJCWJlYWNvbl9pbmZvLT5pZV9odF9wdHIg
Kz0gZWxlbjsNCisJCQl9DQorCQkJYnJlYWs7DQorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNI
DQorCQljYXNlIFdMQU5fRUlEX01FU0hfQ09ORklHOg0KKwkJCWJlYWNvbl9pbmZvLT5pZV9tZXNo
Y2ZnX2xlbiA9IChlbGVuICsgMik7DQorCQkJYmVhY29uX2luZm8tPmllX21lc2hjZmdfcHRyID0g
KHBvcyAtIDIpOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSBXTEFOX0VJRF9NRVNIX0lEOg0KKwkJCWJl
YWNvbl9pbmZvLT5pZV9tZXNoaWRfbGVuID0gKGVsZW4gKyAyKTsNCisJCQliZWFjb25faW5mby0+
aWVfbWVzaGlkX3B0ciA9IChwb3MgLSAyKTsNCisJCQlicmVhazsNCisJCWNhc2UgV0xBTl9FSURf
Q0hBTl9TV0lUQ0hfUEFSQU06DQorCQkJYmVhY29uX2luZm8tPmllX21lc2hjaHN3X2xlbiA9IChl
bGVuICsgMik7DQorCQkJYmVhY29uX2luZm8tPmllX21lc2hjaHN3X3B0ciA9IChwb3MgLSAyKTsN
CisJCQlicmVhazsNCisjZW5kaWYNCisJCWNhc2UgV0xBTl9FSURfVkhUX0NBUEFCSUxJVFk6DQor
CQljYXNlIFdMQU5fRUlEX1ZIVF9PUEVSQVRJT046DQorCQljYXNlIFdMQU5fRUlEX09QTU9ERV9O
T1RJRjoNCisJCQliZWFjb25faW5mby0+aWVfdmh0X2xlbiArPSAoZWxlbiArIDIpOw0KKwkJCWlm
IChiZWFjb25faW5mby0+aWVfdmh0X2xlbiA+DQorCQkJICAgIHNpemVvZihiZWFjb25faW5mby0+
aWVfbGlzdF92aHQpKSB7DQorCQkJCWVsZW1fcGFyc2VfZmFpbGVkID0gdHJ1ZTsNCisJCQl9IGVs
c2Ugew0KKwkJCQkqYmVhY29uX2luZm8tPmllX3ZodF9wdHIrKyA9IGlkOw0KKwkJCQkqYmVhY29u
X2luZm8tPmllX3ZodF9wdHIrKyA9IGVsZW47DQorCQkJCW1lbWNweShiZWFjb25faW5mby0+aWVf
dmh0X3B0ciwgcG9zLCBlbGVuKTsNCisJCQkJYmVhY29uX2luZm8tPmllX3ZodF9wdHIgKz0gZWxl
bjsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoN
CisJCQlpZiAoKHBvc1swXSA9PSAweDAwKSAmJiAocG9zWzFdID09IDB4NTApICYmDQorCQkJICAg
IChwb3NbMl0gPT0gMHhmMikpIHsNCisJCQkJaWYgKHBvc1szXSA9PSAweDAxKSB7DQorCQkJCQli
ZWFjb25faW5mby0+aWVfcnNuX2xlbiA9IChlbGVuICsgMik7DQorCQkJCQliZWFjb25faW5mby0+
aWVfcnNuX3B0ciA9IChwb3MgLSAyKTsNCisJCQkJfQ0KKw0KKwkJCQlpZiAocG9zWzNdID09IDB4
MDIpIHsNCisJCQkJCWJlYWNvbl9pbmZvLT5pZV93bW1fbGVuID0gKGVsZW4gKyAyKTsNCisJCQkJ
CWJlYWNvbl9pbmZvLT5pZV93bW1fcHRyID0gKHBvcyAtIDIpOw0KKwkJCQl9DQorCQkJfQ0KKwkJ
CWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlicmVhazsNCisJCX0NCisNCisJCWxlZnQgLT0gZWxl
bjsNCisJCXBvcyArPSBlbGVuOw0KKwl9DQorDQorCWlmICghZWxlbV9wYXJzZV9mYWlsZWQpIHsN
CisJCWJlYWNvbl9pbmZvLT5pZV9odF9wdHIgPSAmYmVhY29uX2luZm8tPmllX2xpc3RfaHRbMF07
DQorCQliZWFjb25faW5mby0+aWVfdmh0X3B0ciA9ICZiZWFjb25faW5mby0+aWVfbGlzdF92aHRb
MF07DQorCQliZWFjb25faW5mby0+dmFsaWQgPSB0cnVlOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyBp
bnQgbXdsX2Z3Y21kX3NldF9pZXMoc3RydWN0IG13bF9wcml2ICpwcml2LCBzdHJ1Y3QgbXdsX3Zp
ZiAqbXdsX3ZpZikNCit7DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfaWVzICpwY21kOw0KKwlz
dHJ1Y3QgYmVhY29uX2luZm8gKmJlYWNvbiA9ICZtd2xfdmlmLT5iZWFjb25faW5mbzsNCisJdTE2
IGllX2xpc3RfbGVuX3Byb3ByaWV0YXJ5ID0gMDsNCisNCisJaWYgKCFiZWFjb24tPnZhbGlkKQ0K
KwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWlmIChiZWFjb24tPmllX2h0X2xlbiA+IHNpemVvZihw
Y21kLT5pZV9saXN0X2h0KSkNCisJCWdvdG8gZWludmFsOw0KKw0KKwlpZiAoYmVhY29uLT5pZV92
aHRfbGVuID4gc2l6ZW9mKHBjbWQtPmllX2xpc3Rfdmh0KSkNCisJCWdvdG8gZWludmFsOw0KKw0K
KwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRfaWVzICopJnByaXYtPnBjbWRfYnVmWzBd
Ow0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNt
ZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xl
MTYoSE9TVENNRF9DTURfU0VUX0lFUyk7DQorCXBjbWQtPmNtZF9oZHIubGVuID0gY3B1X3RvX2xl
MTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIubWFjaWQgPSBtd2xfdmlmLT5tYWNp
ZDsNCisNCisJcGNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoSE9TVENNRF9BQ1RfR0VOX1NFVCk7
DQorDQorCW1lbWNweShwY21kLT5pZV9saXN0X2h0LCBiZWFjb24tPmllX2h0X3B0ciwgYmVhY29u
LT5pZV9odF9sZW4pOw0KKwlwY21kLT5pZV9saXN0X2xlbl9odCA9IGNwdV90b19sZTE2KGJlYWNv
bi0+aWVfaHRfbGVuKTsNCisNCisJbWVtY3B5KHBjbWQtPmllX2xpc3Rfdmh0LCBiZWFjb24tPmll
X3ZodF9wdHIsIGJlYWNvbi0+aWVfdmh0X2xlbik7DQorCXBjbWQtPmllX2xpc3RfbGVuX3ZodCA9
IGNwdV90b19sZTE2KGJlYWNvbi0+aWVfdmh0X2xlbik7DQorDQorI2lmZGVmIENPTkZJR19NQUM4
MDIxMV9NRVNIDQorCW1lbWNweShwY21kLT5pZV9saXN0X3Byb3ByaWV0YXJ5LCBiZWFjb24tPmll
X21lc2hpZF9wdHIsDQorCSAgICAgICBiZWFjb24tPmllX21lc2hpZF9sZW4pOw0KKwlpZV9saXN0
X2xlbl9wcm9wcmlldGFyeSA9IGJlYWNvbi0+aWVfbWVzaGlkX2xlbjsNCisJbWVtY3B5KHBjbWQt
PmllX2xpc3RfcHJvcHJpZXRhcnkgKyBpZV9saXN0X2xlbl9wcm9wcmlldGFyeSwNCisJICAgICAg
IGJlYWNvbi0+aWVfbWVzaGNmZ19wdHIsIGJlYWNvbi0+aWVfbWVzaGNmZ19sZW4pOw0KKwlpZV9s
aXN0X2xlbl9wcm9wcmlldGFyeSArPSBiZWFjb24tPmllX21lc2hjZmdfbGVuOw0KKwltZW1jcHko
cGNtZC0+aWVfbGlzdF9wcm9wcmlldGFyeSArIGllX2xpc3RfbGVuX3Byb3ByaWV0YXJ5LA0KKwkg
ICAgICAgYmVhY29uLT5pZV9tZXNoY2hzd19wdHIsIGJlYWNvbi0+aWVfbWVzaGNoc3dfbGVuKTsN
CisJaWVfbGlzdF9sZW5fcHJvcHJpZXRhcnkgKz0gYmVhY29uLT5pZV9tZXNoY2hzd19sZW47DQor
I2VuZGlmDQorDQorCWlmIChwcml2LT5jaGlwX3R5cGUgPT0gTVdMODg5Nykgew0KKwkJbWVtY3B5
KHBjbWQtPmllX2xpc3RfcHJvcHJpZXRhcnkgKyBpZV9saXN0X2xlbl9wcm9wcmlldGFyeSwNCisJ
CSAgICAgICBiZWFjb24tPmllX3dtbV9wdHIsIGJlYWNvbi0+aWVfd21tX2xlbik7DQorCQlpZV9s
aXN0X2xlbl9wcm9wcmlldGFyeSArPSBtd2xfdmlmLT5iZWFjb25faW5mby5pZV93bW1fbGVuOw0K
Kwl9DQorDQorCXBjbWQtPmllX2xpc3RfbGVuX3Byb3ByaWV0YXJ5ID0gY3B1X3RvX2xlMTYoaWVf
bGlzdF9sZW5fcHJvcHJpZXRhcnkpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYs
IEhPU1RDTURfQ01EX1NFVF9JRVMpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRf
bG9jayk7DQorCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxu
Iik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+Zndj
bWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KKw0KK2VpbnZhbDoNCisNCisJd2lwaHlfZXJyKHBy
aXYtPmh3LT53aXBoeSwgImxlbmd0aCBvZiBJRSBpcyB0b28gbG9uZ1xuIik7DQorDQorCXJldHVy
biAtRUlOVkFMOw0KK30NCisNCitzdGF0aWMgaW50IG13bF9md2NtZF9zZXRfYXBfYmVhY29uKHN0
cnVjdCBtd2xfcHJpdiAqcHJpdiwNCisJCQkJICAgc3RydWN0IG13bF92aWYgKm13bF92aWYsDQor
CQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mKQ0KK3sNCisJc3RydWN0
IGhvc3RjbWRfY21kX2FwX2JlYWNvbiAqcGNtZDsNCisJc3RydWN0IGRzX3BhcmFtcyAqcGh5X2Rz
X3BhcmFtX3NldDsNCisNCisJaWYgKCFtd2xfdmlmLT5iZWFjb25faW5mby52YWxpZCkNCisJCXJl
dHVybiAtRUlOVkFMOw0KKw0KKwkvKiB3bW0gc3RydWN0dXJlIG9mIHN0YXJ0IGNvbW1hbmQgaXMg
ZGVmaW5lZCBsZXNzIG9uZSBieXRlLA0KKwkgKiBkdWUgdG8gZm9sbG93aW5nIGZpZWxkIGNvdW50
cnkgaXMgbm90IHVzZWQsIGFkZCBieXRlIG9uZQ0KKwkgKiB0byBieXBhc3MgdGhlIGNoZWNrLg0K
KwkgKi8NCisJaWYgKG13bF92aWYtPmJlYWNvbl9pbmZvLmllX3dtbV9sZW4gPg0KKwkgICAgKHNp
emVvZihwY21kLT5zdGFydF9jbWQud21tX3BhcmFtKSArIDEpKQ0KKwkJZ290byBpZWxlbmVycjsN
CisNCisJaWYgKG13bF92aWYtPmJlYWNvbl9pbmZvLmllX3Jzbl9sZW4gPiBzaXplb2YocGNtZC0+
c3RhcnRfY21kLnJzbl9pZSkpDQorCQlnb3RvIGllbGVuZXJyOw0KKw0KKwlpZiAobXdsX3ZpZi0+
YmVhY29uX2luZm8uaWVfcnNuNDhfbGVuID4NCisJICAgIHNpemVvZihwY21kLT5zdGFydF9jbWQu
cnNuNDhfaWUpKQ0KKwkJZ290byBpZWxlbmVycjsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNt
ZF9jbWRfYXBfYmVhY29uICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgo
JnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21k
KSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfQVBfQkVB
Q09OKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsN
CisJcGNtZC0+Y21kX2hkci5tYWNpZCA9IG13bF92aWYtPm1hY2lkOw0KKw0KKwlldGhlcl9hZGRy
X2NvcHkocGNtZC0+c3RhcnRfY21kLnN0YV9tYWNfYWRkciwgbXdsX3ZpZi0+YnNzaWQpOw0KKwlt
ZW1jcHkocGNtZC0+c3RhcnRfY21kLnNzaWQsIGJzc19jb25mLT5zc2lkLCBic3NfY29uZi0+c3Np
ZF9sZW4pOw0KKwlwY21kLT5zdGFydF9jbWQuYnNzX3R5cGUgPSAxOw0KKwlwY21kLT5zdGFydF9j
bWQuYmNuX3BlcmlvZCAgPSBjcHVfdG9fbGUxNihic3NfY29uZi0+YmVhY29uX2ludCk7DQorCXBj
bWQtPnN0YXJ0X2NtZC5kdGltX3BlcmlvZCA9IGJzc19jb25mLT5kdGltX3BlcmlvZDsgLyogOGJp
dCAqLw0KKw0KKwlwaHlfZHNfcGFyYW1fc2V0ID0gJnBjbWQtPnN0YXJ0X2NtZC5waHlfcGFyYW1f
c2V0LmRzX3BhcmFtX3NldDsNCisJcGh5X2RzX3BhcmFtX3NldC0+ZWxlbV9pZCA9IFdMQU5fRUlE
X0RTX1BBUkFNUzsNCisJcGh5X2RzX3BhcmFtX3NldC0+bGVuID0gc2l6ZW9mKHBoeV9kc19wYXJh
bV9zZXQtPmN1cnJlbnRfY2hubCk7DQorCXBoeV9kc19wYXJhbV9zZXQtPmN1cnJlbnRfY2hubCA9
IGJzc19jb25mLT5jaGFuZGVmLmNoYW4tPmh3X3ZhbHVlOw0KKw0KKwlwY21kLT5zdGFydF9jbWQu
cHJvYmVfZGVsYXkgPSBjcHVfdG9fbGUxNigxMCk7DQorCXBjbWQtPnN0YXJ0X2NtZC5jYXBfaW5m
byA9IGNwdV90b19sZTE2KG13bF92aWYtPmJlYWNvbl9pbmZvLmNhcF9pbmZvKTsNCisNCisJbWVt
Y3B5KCZwY21kLT5zdGFydF9jbWQud21tX3BhcmFtLCBtd2xfdmlmLT5iZWFjb25faW5mby5pZV93
bW1fcHRyLA0KKwkgICAgICAgbXdsX3ZpZi0+YmVhY29uX2luZm8uaWVfd21tX2xlbik7DQorDQor
CW1lbWNweSgmcGNtZC0+c3RhcnRfY21kLnJzbl9pZSwgbXdsX3ZpZi0+YmVhY29uX2luZm8uaWVf
cnNuX3B0ciwNCisJICAgICAgIG13bF92aWYtPmJlYWNvbl9pbmZvLmllX3Jzbl9sZW4pOw0KKw0K
KwltZW1jcHkoJnBjbWQtPnN0YXJ0X2NtZC5yc240OF9pZSwgbXdsX3ZpZi0+YmVhY29uX2luZm8u
aWVfcnNuNDhfcHRyLA0KKwkgICAgICAgbXdsX3ZpZi0+YmVhY29uX2luZm8uaWVfcnNuNDhfbGVu
KTsNCisNCisJbWVtY3B5KHBjbWQtPnN0YXJ0X2NtZC5iX3JhdGVfc2V0LCBtd2xfdmlmLT5iZWFj
b25faW5mby5iX3JhdGVfc2V0LA0KKwkgICAgICAgU1lTQURQVF9NQVhfREFUQV9SQVRFU19HKTsN
CisNCisJbWVtY3B5KHBjbWQtPnN0YXJ0X2NtZC5vcF9yYXRlX3NldCwgbXdsX3ZpZi0+YmVhY29u
X2luZm8ub3BfcmF0ZV9zZXQsDQorCSAgICAgICBTWVNBRFBUX01BWF9EQVRBX1JBVEVTX0cpOw0K
Kw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX0FQX0JFQUNPTikp
IHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihw
cml2LT5ody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0K
Kwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJu
IDA7DQorDQoraWVsZW5lcnI6DQorDQorCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJsZW5n
dGggb2YgSUUgaXMgdG9vIGxvbmdcbiIpOw0KKw0KKwlyZXR1cm4gLUVJTlZBTDsNCit9DQorDQor
c3RhdGljIGludCBtd2xfZndjbWRfZW5jcnlwdGlvbl9zZXRfY21kX2luZm8oc3RydWN0IGhvc3Rj
bWRfY21kX3NldF9rZXkgKmNtZCwNCisJCQkJCSAgICAgdTggKmFkZHIsDQorCQkJCQkgICAgIHN0
cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkNCit7DQorCWNtZC0+Y21kX2hkci5jbWQgPSBj
cHVfdG9fbGUxNihIT1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElPTik7DQorCWNtZC0+Y21kX2hk
ci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKmNtZCkpOw0KKwljbWQtPmtleV9wYXJhbS5sZW5n
dGggPSBjcHVfdG9fbGUxNihzaXplb2YoKmNtZCkgLQ0KKwkJb2Zmc2V0b2Yoc3RydWN0IGhvc3Rj
bWRfY21kX3NldF9rZXksIGtleV9wYXJhbSkpOw0KKwljbWQtPmtleV9wYXJhbS5rZXlfaW5kZXgg
PSBjcHVfdG9fbGUzMihrZXktPmtleWlkeCk7DQorCWNtZC0+a2V5X3BhcmFtLmtleV9sZW4gPSBj
cHVfdG9fbGUxNihrZXktPmtleWxlbik7DQorCWV0aGVyX2FkZHJfY29weShjbWQtPmtleV9wYXJh
bS5tYWNfYWRkciwgYWRkcik7DQorDQorCXN3aXRjaCAoa2V5LT5jaXBoZXIpIHsNCisJY2FzZSBX
TEFOX0NJUEhFUl9TVUlURV9XRVA0MDoNCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6
DQorCQljbWQtPmtleV9wYXJhbS5rZXlfdHlwZV9pZCA9IGNwdV90b19sZTE2KEtFWV9UWVBFX0lE
X1dFUCk7DQorCQlpZiAoa2V5LT5rZXlpZHggPT0gMCkNCisJCQljbWQtPmtleV9wYXJhbS5rZXlf
aW5mbyA9DQorCQkJCWNwdV90b19sZTMyKEVOQ1JfS0VZX0ZMQUdfV0VQX1RYS0VZKTsNCisJCWJy
ZWFrOw0KKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6DQorCQljbWQtPmtleV9wYXJhbS5r
ZXlfdHlwZV9pZCA9IGNwdV90b19sZTE2KEtFWV9UWVBFX0lEX1RLSVApOw0KKwkJY21kLT5rZXlf
cGFyYW0ua2V5X2luZm8gPQ0KKwkJCShrZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BB
SVJXSVNFKSA/DQorCQkJY3B1X3RvX2xlMzIoRU5DUl9LRVlfRkxBR19QQUlSV0lTRSkgOg0KKwkJ
CWNwdV90b19sZTMyKEVOQ1JfS0VZX0ZMQUdfVFhHUk9VUEtFWSk7DQorCQljbWQtPmtleV9wYXJh
bS5rZXlfaW5mbyB8PQ0KKwkJCWNwdV90b19sZTMyKEVOQ1JfS0VZX0ZMQUdfTUlDS0VZX1ZBTElE
IHwNCisJCQkJICAgICAgRU5DUl9LRVlfRkxBR19UU0NfVkFMSUQpOw0KKwkJYnJlYWs7DQorCWNh
c2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoNCisJCWNtZC0+a2V5X3BhcmFtLmtleV90eXBlX2lk
ID0gY3B1X3RvX2xlMTYoS0VZX1RZUEVfSURfQUVTKTsNCisJCWNtZC0+a2V5X3BhcmFtLmtleV9p
bmZvID0NCisJCQkoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkgPw0K
KwkJCWNwdV90b19sZTMyKEVOQ1JfS0VZX0ZMQUdfUEFJUldJU0UpIDoNCisJCQljcHVfdG9fbGUz
MihFTkNSX0tFWV9GTEFHX1RYR1JPVVBLRVkpOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQly
ZXR1cm4gLUVOT1RTVVBQOw0KKwl9DQorDQorCXJldHVybiAwOw0KK30NCisNCit2b2lkIG13bF9m
d2NtZF9yZXNldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykNCit7DQorCXN0cnVjdCBtd2xfcHJp
diAqcHJpdiA9IGh3LT5wcml2Ow0KKw0KKwlpZiAobXdsX2Z3Y21kX2Noa19hZGFwdGVyKHByaXYp
KQ0KKwkJd3JpdGVsKElTUl9SRVNFVCwNCisJCSAgICAgICBwcml2LT5pb2Jhc2UxICsgTUFDUkVH
X1JFR19IMkFfSU5URVJSVVBUX0VWRU5UUyk7DQorfQ0KKw0KK3ZvaWQgbXdsX2Z3Y21kX2ludF9l
bmFibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnBy
aXYgPSBody0+cHJpdjsNCisNCisJaWYgKG13bF9md2NtZF9jaGtfYWRhcHRlcihwcml2KSkgew0K
KwkJd3JpdGVsKDB4MDAsDQorCQkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfQTJI
X0lOVEVSUlVQVF9NQVNLKTsNCisJCXdyaXRlbCgoTUFDUkVHX0EySFJJQ19CSVRfTUFTSyksDQor
CQkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfQTJIX0lOVEVSUlVQVF9NQVNLKTsN
CisJfQ0KK30NCisNCit2b2lkIG13bF9md2NtZF9pbnRfZGlzYWJsZShzdHJ1Y3QgaWVlZTgwMjEx
X2h3ICpodykNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKw0KKwlp
ZiAobXdsX2Z3Y21kX2Noa19hZGFwdGVyKHByaXYpKQ0KKwkJd3JpdGVsKDB4MDAsDQorCQkgICAg
ICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfQTJIX0lOVEVSUlVQVF9NQVNLKTsNCit9DQor
DQoraW50IG13bF9md2NtZF9nZXRfaHdfc3BlY3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcpDQor
ew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IGhvc3RjbWRf
Y21kX2dldF9od19zcGVjICpwY21kOw0KKwlpbnQgcmV0cnk7DQorCWludCBpOw0KKw0KKwlpZiAo
cHJpdi0+bWZnX21vZGUpDQorCQlyZXR1cm4gMDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNt
ZF9jbWRfZ2V0X2h3X3NwZWMgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19i
aCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXdpcGh5X2RlYnVnKGh3LT53aXBoeSwgInBjbWQg
PSAlcFxuIiwgcGNtZCk7DQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJ
ZXRoX2Jyb2FkY2FzdF9hZGRyKHBjbWQtPnBlcm1hbmVudF9hZGRyKTsNCisJcGNtZC0+Y21kX2hk
ci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9HRVRfSFdfU1BFQyk7DQorCXBjbWQtPmNt
ZF9oZHIubGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmZ3X2F3YWtl
X2Nvb2tpZSA9IGNwdV90b19sZTMyKHByaXYtPnBwaHlzX2NtZF9idWYgKyAyMDQ4KTsNCisNCisJ
cmV0cnkgPSAwOw0KKwl3aGlsZSAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01E
X0dFVF9IV19TUEVDKSkgew0KKwkJaWYgKHJldHJ5KysgPiBNQVhfV0FJVF9HRVRfSFdfU1BFQ1Nf
SVRFUkFUT05TKSB7DQorCQkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImNhbid0IGdldCBodyBzcGVj
c1xuIik7DQorCQkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJCXJldHVy
biAtRUlPOw0KKwkJfQ0KKw0KKwkJbWRlbGF5KDEwMDApOw0KKwkJd2lwaHlfZGVidWcoaHctPndp
cGh5LA0KKwkJCSAgICAicmVwZWF0IGNvbW1hbmQgPSAlcFxuIiwgcGNtZCk7DQorCX0NCisNCisJ
ZXRoZXJfYWRkcl9jb3B5KCZwcml2LT5od19kYXRhLm1hY19hZGRyWzBdLCBwY21kLT5wZXJtYW5l
bnRfYWRkcik7DQorCXByaXYtPmRlc2NfZGF0YVswXS53Y2JfYmFzZSA9DQorCQlsZTMyX3RvX2Nw
dShwY21kLT53Y2JfYmFzZTApICYgMHgwMDAwZmZmZjsNCisJZm9yIChpID0gMTsgaSA8IFNZU0FE
UFRfVE9UQUxfVFhfUVVFVUVTOyBpKyspDQorCQlwcml2LT5kZXNjX2RhdGFbaV0ud2NiX2Jhc2Ug
PQ0KKwkJCWxlMzJfdG9fY3B1KHBjbWQtPndjYl9iYXNlW2kgLSAxXSkgJiAweDAwMDBmZmZmOw0K
Kwlwcml2LT5kZXNjX2RhdGFbMF0ucnhfZGVzY19yZWFkID0NCisJCWxlMzJfdG9fY3B1KHBjbWQt
PnJ4cGRfcmRfcHRyKSAmIDB4MDAwMGZmZmY7DQorCXByaXYtPmRlc2NfZGF0YVswXS5yeF9kZXNj
X3dyaXRlID0NCisJCWxlMzJfdG9fY3B1KHBjbWQtPnJ4cGRfd3JfcHRyKSAmIDB4MDAwMGZmZmY7
DQorCXByaXYtPmh3X2RhdGEucmVnaW9uX2NvZGUgPSBsZTE2X3RvX2NwdShwY21kLT5yZWdpb25f
Y29kZSkgJiAweDAwZmY7DQorCXByaXYtPmh3X2RhdGEuZndfcmVsZWFzZV9udW0gPSBsZTMyX3Rv
X2NwdShwY21kLT5md19yZWxlYXNlX251bSk7DQorCXByaXYtPmh3X2RhdGEubWF4X251bV90eF9k
ZXNjID0gbGUxNl90b19jcHUocGNtZC0+bnVtX3djYik7DQorCXByaXYtPmh3X2RhdGEubWF4X251
bV9tY19hZGRyID0gbGUxNl90b19jcHUocGNtZC0+bnVtX21jYXN0X2FkZHIpOw0KKwlwcml2LT5o
d19kYXRhLm51bV9hbnRlbm5hcyA9IGxlMTZfdG9fY3B1KHBjbWQtPm51bV9hbnRlbm5hKTsNCisJ
cHJpdi0+aHdfZGF0YS5od192ZXJzaW9uID0gcGNtZC0+dmVyc2lvbjsNCisJcHJpdi0+aHdfZGF0
YS5ob3N0X2ludGVyZmFjZSA9IHBjbWQtPmhvc3RfaWY7DQorDQorCXNwaW5fdW5sb2NrX2JoKCZw
cml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRf
c2V0X2h3X3NwZWNzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQ0KK3sNCisJc3RydWN0IG13bF9w
cml2ICpwcml2ID0gaHctPnByaXY7DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfaHdfc3BlYyAq
cGNtZDsNCisJaW50IGk7DQorDQorCWlmIChwcml2LT5tZmdfbW9kZSkNCisJCXJldHVybiAwOw0K
Kw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRfaHdfc3BlYyAqKSZwcml2LT5wY21k
X2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVt
c2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNw
dV90b19sZTE2KEhPU1RDTURfQ01EX1NFVF9IV19TUEVDKTsNCisJcGNtZC0+Y21kX2hkci5sZW4g
PSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+d2NiX2Jhc2VbMF0gPSBjcHVf
dG9fbGUzMihwcml2LT5kZXNjX2RhdGFbMF0ucHBoeXNfdHhfcmluZyk7DQorCWZvciAoaSA9IDE7
IGkgPCBTWVNBRFBUX1RPVEFMX1RYX1FVRVVFUzsgaSsrKQ0KKwkJcGNtZC0+d2NiX2Jhc2VbaV0g
PQ0KKwkJCWNwdV90b19sZTMyKHByaXYtPmRlc2NfZGF0YVtpXS5wcGh5c190eF9yaW5nKTsNCisJ
cGNtZC0+dHhfd2NiX251bV9wZXJfcXVldWUgPSBjcHVfdG9fbGUzMihTWVNBRFBUX01BWF9OVU1f
VFhfREVTQyk7DQorCXBjbWQtPm51bV90eF9xdWV1ZXMgPSBjcHVfdG9fbGUzMihTWVNBRFBUX05V
TV9PRl9ERVNDX0RBVEEpOw0KKwlwY21kLT50b3RhbF9yeF93Y2IgPSBjcHVfdG9fbGUzMihTWVNB
RFBUX01BWF9OVU1fUlhfREVTQyk7DQorCXBjbWQtPnJ4cGRfd3JfcHRyID0gY3B1X3RvX2xlMzIo
cHJpdi0+ZGVzY19kYXRhWzBdLnBwaHlzX3J4X3JpbmcpOw0KKwlwY21kLT5mZWF0dXJlcyA9IDA7
DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURfU0VUX0hXX1NQ
RUMpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9l
cnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJ
fQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAw
Ow0KK30NCisNCitpbnQgbXdsX2Z3Y21kX2dldF9zdGF0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3
LA0KKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzICpzdGF0cykNCit7
DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9j
bWRfODAyXzExX2dldF9zdGF0ICpwY21kOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2Nt
ZF84MDJfMTFfZ2V0X3N0YXQgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19i
aCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBj
bWQpKTsNCisJcGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF84MDJf
MTFfR0VUX1NUQVQpOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigq
cGNtZCkpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EXzgw
Ml8xMV9HRVRfU1RBVCkpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsN
CisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVy
biAtRUlPOw0KKwl9DQorDQorCXN0YXRzLT5kb3QxMUFDS0ZhaWx1cmVDb3VudCA9DQorCQlsZTMy
X3RvX2NwdShwY21kLT5hY2tfZmFpbHVyZXMpOw0KKwlzdGF0cy0+ZG90MTFSVFNGYWlsdXJlQ291
bnQgPQ0KKwkJbGUzMl90b19jcHUocGNtZC0+cnRzX2ZhaWx1cmVzKTsNCisJc3RhdHMtPmRvdDEx
RkNTRXJyb3JDb3VudCA9DQorCQlsZTMyX3RvX2NwdShwY21kLT5yeF9mY3NfZXJyb3JzKTsNCisJ
c3RhdHMtPmRvdDExUlRTU3VjY2Vzc0NvdW50ID0NCisJCWxlMzJfdG9fY3B1KHBjbWQtPnJ0c19z
dWNjZXNzZXMpOw0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQor
CXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX3JhZGlvX2VuYWJsZShzdHJ1Y3QgaWVl
ZTgwMjExX2h3ICpodykNCit7DQorCXJldHVybiBtd2xfZndjbWRfODAyXzExX3JhZGlvX2NvbnRy
b2woaHctPnByaXYsIHRydWUsIGZhbHNlKTsNCit9DQorDQoraW50IG13bF9md2NtZF9yYWRpb19k
aXNhYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQ0KK3sNCisJcmV0dXJuIG13bF9md2NtZF84
MDJfMTFfcmFkaW9fY29udHJvbChody0+cHJpdiwgZmFsc2UsIGZhbHNlKTsNCit9DQorDQoraW50
IG13bF9md2NtZF9zZXRfcmFkaW9fcHJlYW1ibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJv
b2wgc2hvcnRfcHJlYW1ibGUpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJp
djsNCisJaW50IHJjOw0KKw0KKwlpZiAocHJpdi0+bWZnX21vZGUpDQorCQlyZXR1cm4gMDsNCisN
CisJcHJpdi0+cmFkaW9fc2hvcnRfcHJlYW1ibGUgPSBzaG9ydF9wcmVhbWJsZTsNCisJcmMgPSBt
d2xfZndjbWRfODAyXzExX3JhZGlvX2NvbnRyb2wocHJpdiwgdHJ1ZSwgdHJ1ZSk7DQorDQorCXJl
dHVybiByYzsNCit9DQorDQoraW50IG13bF9md2NtZF9nZXRfYWRkcl92YWx1ZShzdHJ1Y3QgaWVl
ZTgwMjExX2h3ICpodywgdTMyIGFkZHIsIHUzMiBsZW4sDQorCQkJICAgICB1MzIgKnZhbCwgdTE2
IHNldCkNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3Qg
aG9zdGNtZF9jbWRfbWVtX2FkZHJfYWNjZXNzICpwY21kOw0KKwlpbnQgaTsNCisNCisJcGNtZCA9
IChzdHJ1Y3QgaG9zdGNtZF9jbWRfbWVtX2FkZHJfYWNjZXNzICopJnByaXYtPnBjbWRfYnVmWzBd
Ow0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNt
ZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xl
MTYoSE9TVENNRF9DTURfTUVNX0FERFJfQUNDRVNTKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBj
cHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+YWRkcmVzcyA9IGNwdV90b19sZTMy
KGFkZHIpOw0KKwlwY21kLT5sZW5ndGggPSBjcHVfdG9fbGUxNihsZW4pOw0KKwlwY21kLT52YWx1
ZVswXSA9IGNwdV90b19sZTMyKCp2YWwpOw0KKwlwY21kLT5yZXNlcnZlZCA9IGNwdV90b19sZTE2
KHNldCk7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURfTUVN
X0FERFJfQUNDRVNTKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0K
KwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJu
IC1FSU87DQorCX0NCisNCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQ0KKwkJdmFsW2ldID0g
bGUzMl90b19jcHUocGNtZC0+dmFsdWVbaV0pOw0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+
ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX21heF90
eF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjEx
X2NvbmYgKmNvbmYsIHU4IGZyYWN0aW9uKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVs
ICpjaGFubmVsID0gY29uZi0+Y2hhbmRlZi5jaGFuOw0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYg
PSBody0+cHJpdjsNCisJaW50IHJlZHVjZV92YWwgPSAwOw0KKwl1MTYgYmFuZCA9IDAsIHdpZHRo
ID0gMCwgc3ViX2NoID0gMDsNCisJdTE2IG1heHR4cG93W1NZU0FEUFRfVFhfUE9XRVJfTEVWRUxf
VE9UQUxdOw0KKwlpbnQgaSwgdG1wOw0KKwlpbnQgcmM7DQorDQorCXN3aXRjaCAoZnJhY3Rpb24p
IHsNCisJY2FzZSAwOg0KKwkJcmVkdWNlX3ZhbCA9IDA7ICAgIC8qIE1heCAqLw0KKwkJYnJlYWs7
DQorCWNhc2UgMToNCisJCXJlZHVjZV92YWwgPSAyOyAgICAvKiA3NSUgLTEuMjVkYiAqLw0KKwkJ
YnJlYWs7DQorCWNhc2UgMjoNCisJCXJlZHVjZV92YWwgPSAzOyAgICAvKiA1MCUgLTNkYiAqLw0K
KwkJYnJlYWs7DQorCWNhc2UgMzoNCisJCXJlZHVjZV92YWwgPSA2OyAgICAvKiAyNSUgLTZkYiAq
Lw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQkvKiBsYXJnZXIgdGhhbiBjYXNlIDMsICBwQ21k
LT5NYXhQb3dlckxldmVsIGlzIG1pbiAqLw0KKwkJcmVkdWNlX3ZhbCA9IDB4ZmY7DQorCQlicmVh
azsNCisJfQ0KKw0KKwlpZiAoY2hhbm5lbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQ0K
KwkJYmFuZCA9IEZSRVFfQkFORF8yRE9UNEdIWjsNCisJZWxzZSBpZiAoY2hhbm5lbC0+YmFuZCA9
PSBJRUVFODAyMTFfQkFORF81R0haKQ0KKwkJYmFuZCA9IEZSRVFfQkFORF81R0haOw0KKw0KKwlz
d2l0Y2ggKGNvbmYtPmNoYW5kZWYud2lkdGgpIHsNCisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhf
MjBfTk9IVDoNCisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfMjA6DQorCQl3aWR0aCA9IENIXzIw
X01IWl9XSURUSDsNCisJCXN1Yl9jaCA9IE5PX0VYVF9DSEFOTkVMOw0KKwkJYnJlYWs7DQorCWNh
c2UgTkw4MDIxMV9DSEFOX1dJRFRIXzQwOg0KKwkJd2lkdGggPSBDSF80MF9NSFpfV0lEVEg7DQor
CQlpZiAoY29uZi0+Y2hhbmRlZi5jZW50ZXJfZnJlcTEgPiBjaGFubmVsLT5jZW50ZXJfZnJlcSkN
CisJCQlzdWJfY2ggPSBFWFRfQ0hfQUJPVkVfQ1RSTF9DSDsNCisJCWVsc2UNCisJCQlzdWJfY2gg
PSBFWFRfQ0hfQkVMT1dfQ1RSTF9DSDsNCisJCWJyZWFrOw0KKwljYXNlIE5MODAyMTFfQ0hBTl9X
SURUSF84MDoNCisJCXdpZHRoID0gQ0hfODBfTUhaX1dJRFRIOw0KKwkJaWYgKGNvbmYtPmNoYW5k
ZWYuY2VudGVyX2ZyZXExID4gY2hhbm5lbC0+Y2VudGVyX2ZyZXEpDQorCQkJc3ViX2NoID0gRVhU
X0NIX0FCT1ZFX0NUUkxfQ0g7DQorCQllbHNlDQorCQkJc3ViX2NoID0gRVhUX0NIX0JFTE9XX0NU
UkxfQ0g7DQorCQlicmVhazsNCisJZGVmYXVsdDoNCisJCXJldHVybiAtRUlOVkFMOw0KKwl9DQor
DQorCWlmICgocHJpdi0+cG93aW5pdGVkICYgTVdMX1BPV0VSX0lOSVRfMikgPT0gMCkgew0KKwkJ
bXdsX2Z3Y21kX2dldF90eF9wb3dlcnMocHJpdiwgcHJpdi0+bWF4X3R4X3BvdywNCisJCQkJCWNo
YW5uZWwtPmh3X3ZhbHVlLCBiYW5kLCB3aWR0aCwgc3ViX2NoKTsNCisJCXByaXYtPnBvd2luaXRl
ZCB8PSBNV0xfUE9XRVJfSU5JVF8yOw0KKwl9DQorDQorCWlmICgocHJpdi0+cG93aW5pdGVkICYg
TVdMX1BPV0VSX0lOSVRfMSkgPT0gMCkgew0KKwkJbXdsX2Z3Y21kX2dldF90eF9wb3dlcnMocHJp
diwgcHJpdi0+dGFyZ2V0X3Bvd2VycywNCisJCQkJCWNoYW5uZWwtPmh3X3ZhbHVlLCBiYW5kLCB3
aWR0aCwgc3ViX2NoKTsNCisJCXByaXYtPnBvd2luaXRlZCB8PSBNV0xfUE9XRVJfSU5JVF8xOw0K
Kwl9DQorDQorCWZvciAoaSA9IDA7IGkgPCBTWVNBRFBUX1RYX1BPV0VSX0xFVkVMX1RPVEFMOyBp
KyspIHsNCisJCWlmIChwcml2LT50YXJnZXRfcG93ZXJzW2ldID4gcHJpdi0+bWF4X3R4X3Bvd1tp
XSkNCisJCQl0bXAgPSBwcml2LT5tYXhfdHhfcG93W2ldOw0KKwkJZWxzZQ0KKwkJCXRtcCA9IHBy
aXYtPnRhcmdldF9wb3dlcnNbaV07DQorCQltYXh0eHBvd1tpXSA9ICgodG1wIC0gcmVkdWNlX3Zh
bCkgPiAwKSA/ICh0bXAgLSByZWR1Y2VfdmFsKSA6IDA7DQorCX0NCisNCisJcmMgPSBtd2xfZndj
bWRfc2V0X3R4X3Bvd2Vycyhwcml2LCBtYXh0eHBvdywgSE9TVENNRF9BQ1RfR0VOX1NFVCwNCisJ
CQkJICAgICBjaGFubmVsLT5od192YWx1ZSwgYmFuZCwgd2lkdGgsIHN1Yl9jaCk7DQorDQorCXJl
dHVybiByYzsNCit9DQorDQoraW50IG13bF9md2NtZF90eF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjEx
X2h3ICpodywNCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsIHU4IGZyYWN0
aW9uKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gY29uZi0+Y2hh
bmRlZi5jaGFuOw0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJaW50IHJl
ZHVjZV92YWwgPSAwOw0KKwl1MTYgYmFuZCA9IDAsIHdpZHRoID0gMCwgc3ViX2NoID0gMDsNCisJ
dTE2IHR4cG93W1NZU0FEUFRfVFhfUE9XRVJfTEVWRUxfVE9UQUxdOw0KKwlpbnQgaW5kZXgsIGZv
dW5kID0gMDsNCisJaW50IGksIHRtcDsNCisJaW50IHJjOw0KKw0KKwlzd2l0Y2ggKGZyYWN0aW9u
KSB7DQorCWNhc2UgMDoNCisJCXJlZHVjZV92YWwgPSAwOyAgICAvKiBNYXggKi8NCisJCWJyZWFr
Ow0KKwljYXNlIDE6DQorCQlyZWR1Y2VfdmFsID0gMjsgICAgLyogNzUlIC0xLjI1ZGIgKi8NCisJ
CWJyZWFrOw0KKwljYXNlIDI6DQorCQlyZWR1Y2VfdmFsID0gMzsgICAgLyogNTAlIC0zZGIgKi8N
CisJCWJyZWFrOw0KKwljYXNlIDM6DQorCQlyZWR1Y2VfdmFsID0gNjsgICAgLyogMjUlIC02ZGIg
Ki8NCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJLyogbGFyZ2VyIHRoYW4gY2FzZSAzLCAgcENt
ZC0+TWF4UG93ZXJMZXZlbCBpcyBtaW4gKi8NCisJCXJlZHVjZV92YWwgPSAweGZmOw0KKwkJYnJl
YWs7DQorCX0NCisNCisJaWYgKGNoYW5uZWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikN
CisJCWJhbmQgPSBGUkVRX0JBTkRfMkRPVDRHSFo7DQorCWVsc2UgaWYgKGNoYW5uZWwtPmJhbmQg
PT0gSUVFRTgwMjExX0JBTkRfNUdIWikNCisJCWJhbmQgPSBGUkVRX0JBTkRfNUdIWjsNCisNCisJ
c3dpdGNoIChjb25mLT5jaGFuZGVmLndpZHRoKSB7DQorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRI
XzIwX05PSFQ6DQorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzIwOg0KKwkJd2lkdGggPSBDSF8y
MF9NSFpfV0lEVEg7DQorCQlzdWJfY2ggPSBOT19FWFRfQ0hBTk5FTDsNCisJCWJyZWFrOw0KKwlj
YXNlIE5MODAyMTFfQ0hBTl9XSURUSF80MDoNCisJCXdpZHRoID0gQ0hfNDBfTUhaX1dJRFRIOw0K
KwkJaWYgKGNvbmYtPmNoYW5kZWYuY2VudGVyX2ZyZXExID4gY2hhbm5lbC0+Y2VudGVyX2ZyZXEp
DQorCQkJc3ViX2NoID0gRVhUX0NIX0FCT1ZFX0NUUkxfQ0g7DQorCQllbHNlDQorCQkJc3ViX2No
ID0gRVhUX0NIX0JFTE9XX0NUUkxfQ0g7DQorCQlicmVhazsNCisJY2FzZSBOTDgwMjExX0NIQU5f
V0lEVEhfODA6DQorCQl3aWR0aCA9IENIXzgwX01IWl9XSURUSDsNCisJCWlmIChjb25mLT5jaGFu
ZGVmLmNlbnRlcl9mcmVxMSA+IGNoYW5uZWwtPmNlbnRlcl9mcmVxKQ0KKwkJCXN1Yl9jaCA9IEVY
VF9DSF9BQk9WRV9DVFJMX0NIOw0KKwkJZWxzZQ0KKwkJCXN1Yl9jaCA9IEVYVF9DSF9CRUxPV19D
VFJMX0NIOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQlyZXR1cm4gLUVJTlZBTDsNCisJfQ0K
Kw0KKwkvKiBzZWFyY2ggdHggcG93ZXIgdGFibGUgaWYgZXhpc3QgKi8NCisJZm9yIChpbmRleCA9
IDA7IGluZGV4IDwgU1lTQURQVF9NQVhfTlVNX0NIQU5ORUxTOyBpbmRleCsrKSB7DQorCQlzdHJ1
Y3QgbXdsX3R4X3B3cl90YmwgKnR4X3B3cjsNCisNCisJCXR4X3B3ciA9ICZwcml2LT50eF9wd3Jf
dGJsW2luZGV4XTsNCisNCisJCS8qIGRvIG5vdGhpbmcgaWYgdGFibGUgaXMgbm90IGxvYWRlZCAq
Lw0KKwkJaWYgKHR4X3B3ci0+Y2hhbm5lbCA9PSAwKQ0KKwkJCWJyZWFrOw0KKw0KKwkJaWYgKHR4
X3B3ci0+Y2hhbm5lbCA9PSBjaGFubmVsLT5od192YWx1ZSkgew0KKwkJCXByaXYtPmNkZCA9IHR4
X3B3ci0+Y2RkOw0KKwkJCXByaXYtPnR4YW50ZW5uYTIgPSB0eF9wd3ItPnR4YW50ZW5uYTI7DQor
DQorCQkJaWYgKHR4X3B3ci0+c2V0Y2FwKQ0KKwkJCQlwcml2LT5wb3dpbml0ZWQgPSBNV0xfUE9X
RVJfSU5JVF8xOw0KKwkJCWVsc2UNCisJCQkJcHJpdi0+cG93aW5pdGVkID0gTVdMX1BPV0VSX0lO
SVRfMjsNCisNCisJCQlmb3IgKGkgPSAwOyBpIDwgU1lTQURQVF9UWF9QT1dFUl9MRVZFTF9UT1RB
TDsgaSsrKSB7DQorCQkJCWlmICh0eF9wd3ItPnNldGNhcCkNCisJCQkJCXByaXYtPm1heF90eF9w
b3dbaV0gPQ0KKwkJCQkJCXR4X3B3ci0+dHhfcG93ZXJbaV07DQorCQkJCWVsc2UNCisJCQkJCXBy
aXYtPnRhcmdldF9wb3dlcnNbaV0gPQ0KKwkJCQkJCXR4X3B3ci0+dHhfcG93ZXJbaV07DQorCQkJ
fQ0KKw0KKwkJCWZvdW5kID0gMTsNCisJCQlicmVhazsNCisJCX0NCisJfQ0KKw0KKwlpZiAoKHBy
aXYtPnBvd2luaXRlZCAmIE1XTF9QT1dFUl9JTklUXzIpID09IDApIHsNCisJCW13bF9md2NtZF9n
ZXRfdHhfcG93ZXJzKHByaXYsIHByaXYtPm1heF90eF9wb3csDQorCQkJCQljaGFubmVsLT5od192
YWx1ZSwgYmFuZCwgd2lkdGgsIHN1Yl9jaCk7DQorDQorCQlwcml2LT5wb3dpbml0ZWQgfD0gTVdM
X1BPV0VSX0lOSVRfMjsNCisJfQ0KKw0KKwlpZiAoKHByaXYtPnBvd2luaXRlZCAmIE1XTF9QT1dF
Ul9JTklUXzEpID09IDApIHsNCisJCW13bF9md2NtZF9nZXRfdHhfcG93ZXJzKHByaXYsIHByaXYt
PnRhcmdldF9wb3dlcnMsDQorCQkJCQljaGFubmVsLT5od192YWx1ZSwgYmFuZCwgd2lkdGgsIHN1
Yl9jaCk7DQorDQorCQlwcml2LT5wb3dpbml0ZWQgfD0gTVdMX1BPV0VSX0lOSVRfMTsNCisJfQ0K
Kw0KKwlmb3IgKGkgPSAwOyBpIDwgU1lTQURQVF9UWF9QT1dFUl9MRVZFTF9UT1RBTDsgaSsrKSB7
DQorCQlpZiAoZm91bmQpIHsNCisJCQlpZiAoKHByaXYtPnR4X3B3cl90YmxbaW5kZXhdLnNldGNh
cCkgJiYNCisJCQkgICAgKHByaXYtPnR4X3B3cl90YmxbaW5kZXhdLnR4X3Bvd2VyW2ldID4NCisJ
CQkgICAgcHJpdi0+bWF4X3R4X3Bvd1tpXSkpDQorCQkJCXRtcCA9IHByaXYtPm1heF90eF9wb3db
aV07DQorCQkJZWxzZQ0KKwkJCQl0bXAgPSBwcml2LT50eF9wd3JfdGJsW2luZGV4XS50eF9wb3dl
cltpXTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKHByaXYtPnRhcmdldF9wb3dlcnNbaV0gPiBwcml2
LT5tYXhfdHhfcG93W2ldKQ0KKwkJCQl0bXAgPSBwcml2LT5tYXhfdHhfcG93W2ldOw0KKwkJCWVs
c2UNCisJCQkJdG1wID0gcHJpdi0+dGFyZ2V0X3Bvd2Vyc1tpXTsNCisJCX0NCisNCisJCXR4cG93
W2ldID0gKCh0bXAgLSByZWR1Y2VfdmFsKSA+IDApID8gKHRtcCAtIHJlZHVjZV92YWwpIDogMDsN
CisJfQ0KKw0KKwlyYyA9IG13bF9md2NtZF9zZXRfdHhfcG93ZXJzKHByaXYsIHR4cG93LCBIT1NU
Q01EX0FDVF9HRU5fU0VUX0xJU1QsDQorCQkJCSAgICAgY2hhbm5lbC0+aHdfdmFsdWUsIGJhbmQs
IHdpZHRoLCBzdWJfY2gpOw0KKw0KKwlyZXR1cm4gcmM7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRf
cmZfYW50ZW5uYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IGRpciwgaW50IGFudGVubmEp
DQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IGhvc3Rj
bWRfY21kXzgwMl8xMV9yZl9hbnRlbm5hICpwY21kOw0KKw0KKwlpZiAocHJpdi0+bWZnX21vZGUp
DQorCQlyZXR1cm4gMDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfODAyXzExX3Jm
X2FudGVubmEgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+
ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJ
cGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF84MDJfMTFfUkZfQU5U
RU5OQSk7DQorCXBjbWQtPmNtZF9oZHIubGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21kKSk7
DQorDQorCXBjbWQtPmFjdGlvbiA9IGNwdV90b19sZTE2KGRpcik7DQorDQorCWlmIChkaXIgPT0g
V0xfQU5URU5OQVRZUEVfUlgpIHsNCisJCXU4IHJ4X2FudGVubmEgPSA0OyAvKiBpZiBhdXRvLCBz
ZXQgNCByeCBhbnRlbm5hcyBpbiBTQzIgKi8NCisNCisJCWlmIChhbnRlbm5hICE9IDApDQorCQkJ
cGNtZC0+YW50ZW5uYV9tb2RlID0gY3B1X3RvX2xlMTYoYW50ZW5uYSk7DQorCQllbHNlDQorCQkJ
cGNtZC0+YW50ZW5uYV9tb2RlID0gY3B1X3RvX2xlMTYocnhfYW50ZW5uYSk7DQorCX0gZWxzZSB7
DQorCQl1OCB0eF9hbnRlbm5hID0gMHhmOyAvKiBpZiBhdXRvLCBzZXQgNCB0eCBhbnRlbm5hcyBp
biBTQzIgKi8NCisNCisJCWlmIChhbnRlbm5hICE9IDApDQorCQkJcGNtZC0+YW50ZW5uYV9tb2Rl
ID0gY3B1X3RvX2xlMTYoYW50ZW5uYSk7DQorCQllbHNlDQorCQkJcGNtZC0+YW50ZW5uYV9tb2Rl
ID0gY3B1X3RvX2xlMTYodHhfYW50ZW5uYSk7DQorCX0NCisNCisJaWYgKG13bF9md2NtZF9leGVj
X2NtZChwcml2LCBIT1NUQ01EX0NNRF84MDJfMTFfUkZfQU5URU5OQSkpIHsNCisJCXNwaW5fdW5s
b2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWls
ZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5sb2Nr
X2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xf
ZndjbWRfYnJvYWRjYXN0X3NzaWRfZW5hYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJ
CQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgYm9vbCBlbmFibGUpDQorew0KKwlzdHJ1
Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IG13bF92aWYgKm13bF92aWY7
DQorCXN0cnVjdCBob3N0Y21kX2NtZF9icm9hZGNhc3Rfc3NpZF9lbmFibGUgKnBjbWQ7DQorDQor
CW13bF92aWYgPSBtd2xfZGV2X2dldF92aWYodmlmKTsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9z
dGNtZF9jbWRfYnJvYWRjYXN0X3NzaWRfZW5hYmxlICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0K
KwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgw
MCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9T
VENNRF9DTURfQlJPQURDQVNUX1NTSURfRU5BQkxFKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBj
cHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21kX2hkci5tYWNpZCA9IG13bF92
aWYtPm1hY2lkOw0KKwlwY21kLT5lbmFibGUgPSBjcHVfdG9fbGUzMihlbmFibGUpOw0KKw0KKwlp
ZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX0JST0FEQ0FTVF9TU0lEX0VO
QUJMRSkpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5
X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0K
Kwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJu
IDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfc2V0X3JmX2NoYW5uZWwoc3RydWN0IGllZWU4MDIx
MV9odyAqaHcsDQorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYpDQorew0KKwlz
dHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBjb25mLT5jaGFuZGVmLmNoYW47DQor
CXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRf
c2V0X3JmX2NoYW5uZWwgKnBjbWQ7DQorCXUzMiBjaG5sX2ZsYWdzLCBmcmVxX2JhbmQsIGNobmxf
d2lkdGgsIGFjdF9wcmltYXJ5Ow0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRf
cmZfY2hhbm5lbCAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2
LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0K
KwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX1NFVF9SRl9DSEFO
TkVMKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsN
CisJcGNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoV0xfU0VUKTsNCisJcGNtZC0+Y3Vycl9jaG5s
ID0gY2hhbm5lbC0+aHdfdmFsdWU7DQorDQorCWlmIChjaGFubmVsLT5iYW5kID09IElFRUU4MDIx
MV9CQU5EXzJHSFopIHsNCisJCWZyZXFfYmFuZCA9IEZSRVFfQkFORF8yRE9UNEdIWjsNCisJfSBl
bHNlIGlmIChjaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsNCisJCWZyZXFf
YmFuZCA9IEZSRVFfQkFORF81R0haOw0KKwl9IGVsc2Ugew0KKwkJc3Bpbl91bmxvY2tfYmgoJnBy
aXYtPmZ3Y21kX2xvY2spOw0KKwkJcmV0dXJuIC1FSU5WQUw7DQorCX0NCisNCisJc3dpdGNoIChj
b25mLT5jaGFuZGVmLndpZHRoKSB7DQorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzIwX05PSFQ6
DQorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzIwOg0KKwkJY2hubF93aWR0aCA9IENIXzIwX01I
Wl9XSURUSDsNCisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8wOw0KKwkJYnJlYWs7
DQorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzQwOg0KKwkJY2hubF93aWR0aCA9IENIXzQwX01I
Wl9XSURUSDsNCisJCWlmIChjb25mLT5jaGFuZGVmLmNlbnRlcl9mcmVxMSA+IGNoYW5uZWwtPmNl
bnRlcl9mcmVxKQ0KKwkJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8wOw0KKwkJZWxz
ZQ0KKwkJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8xOw0KKwkJYnJlYWs7DQorCWNh
c2UgTkw4MDIxMV9DSEFOX1dJRFRIXzgwOg0KKwkJY2hubF93aWR0aCA9IENIXzgwX01IWl9XSURU
SDsNCisJCWFjdF9wcmltYXJ5ID0NCisJCQltd2xfZndjbWRfZ2V0XzgwbV9wcmlfY2hubF9vZmZz
ZXQocGNtZC0+Y3Vycl9jaG5sKTsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJc3Bpbl91bmxv
Y2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJcmV0dXJuIC1FSU5WQUw7DQorCX0NCisNCisJ
Y2hubF9mbGFncyA9IChmcmVxX2JhbmQgJiBGUkVRX0JBTkRfTUFTSykgfA0KKwkJKChjaG5sX3dp
ZHRoIDw8IENITkxfV0lEVEhfU0hJRlQpICYgQ0hOTF9XSURUSF9NQVNLKSB8DQorCQkoKGFjdF9w
cmltYXJ5IDw8IEFDVF9QUklNQVJZX1NISUZUKSAmIEFDVF9QUklNQVJZX01BU0spOw0KKw0KKwlw
Y21kLT5jaG5sX2ZsYWdzID0gY3B1X3RvX2xlMzIoY2hubF9mbGFncyk7DQorDQorCWlmIChtd2xf
ZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURfU0VUX1JGX0NIQU5ORUwpKSB7DQorCQlz
cGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5
LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGlu
X3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitp
bnQgbXdsX2Z3Y21kX3NldF9haWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkgICAgICBz
dHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1OCAqYnNzaWQsIHUxNiBhaWQpDQorew0KKwlzdHJ1
Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IG13bF92aWYgKm13bF92aWY7
DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfYWlkICpwY21kOw0KKw0KKwltd2xfdmlmID0gbXds
X2Rldl9nZXRfdmlmKHZpZik7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX3NldF9h
aWQgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+ZndjbWRf
bG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+
Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRfQUlEKTsNCisJcGNtZC0+
Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21kX2hk
ci5tYWNpZCA9IG13bF92aWYtPm1hY2lkOw0KKwlwY21kLT5haWQgPSBjcHVfdG9fbGUxNihhaWQp
Ow0KKwlldGhlcl9hZGRyX2NvcHkocGNtZC0+bWFjX2FkZHIsIGJzc2lkKTsNCisNCisJaWYgKG13
bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9TRVRfQUlEKSkgew0KKwkJc3Bpbl91
bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZh
aWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxv
Y2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13
bF9md2NtZF9zZXRfaW5mcmFfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkgICAg
IHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYg
PSBody0+cHJpdjsNCisJc3RydWN0IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVjdCBob3N0Y21k
X2NtZF9zZXRfaW5mcmFfbW9kZSAqcGNtZDsNCisNCisJbXdsX3ZpZiA9IG13bF9kZXZfZ2V0X3Zp
Zih2aWYpOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRfaW5mcmFfbW9kZSAq
KSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2Nr
KTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRf
aGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX1NFVF9JTkZSQV9NT0RFKTsNCisJcGNt
ZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21k
X2hkci5tYWNpZCA9IG13bF92aWYtPm1hY2lkOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21k
KHByaXYsIEhPU1RDTURfQ01EX1NFVF9JTkZSQV9NT0RFKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgo
JnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVj
dXRpb25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnBy
aXYtPmZ3Y21kX2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9z
ZXRfcnRzX3RocmVzaG9sZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IHRocmVzaG9sZCkN
Cit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNt
ZF9jbWRfODAyXzExX3J0c190aHNkICpwY21kOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21k
X2NtZF84MDJfMTFfcnRzX3Roc2QgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9j
a19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2Yo
KnBjbWQpKTsNCisJcGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF84
MDJfMTFfUlRTX1RIU0QpOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVv
ZigqcGNtZCkpOw0KKwlwY21kLT5hY3Rpb24gID0gY3B1X3RvX2xlMTYoV0xfU0VUKTsNCisJcGNt
ZC0+dGhyZXNob2xkID0gY3B1X3RvX2xlMTYodGhyZXNob2xkKTsNCisNCisJaWYgKG13bF9md2Nt
ZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF84MDJfMTFfUlRTX1RIU0QpKSB7DQorCQlzcGlu
X3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAi
ZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGluX3Vu
bG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitpbnQg
bXdsX2Z3Y21kX3NldF9lZGNhX3BhcmFtcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggaW5k
ZXgsDQorCQkJICAgICAgdTE2IGN3X21pbiwgdTE2IGN3X21heCwgdTggYWlmcywgdTE2IHR4b3Ap
DQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IGhvc3Rj
bWRfY21kX3NldF9lZGNhX3BhcmFtcyAqcGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNt
ZF9jbWRfc2V0X2VkY2FfcGFyYW1zICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xv
Y2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9m
KCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURf
U0VUX0VEQ0FfUEFSQU1TKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXpl
b2YoKnBjbWQpKTsNCisNCisJcGNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoMHhmZmZmKTsNCisJ
cGNtZC0+dHhvcCA9IGNwdV90b19sZTE2KHR4b3ApOw0KKwlwY21kLT5jd19tYXggPSBjcHVfdG9f
bGUzMihpbG9nMihjd19tYXggKyAxKSk7DQorCXBjbWQtPmN3X21pbiA9IGNwdV90b19sZTMyKGls
b2cyKGN3X21pbiArIDEpKTsNCisJcGNtZC0+YWlmc24gPSBhaWZzOw0KKwlwY21kLT50eHFfbnVt
ID0gaW5kZXg7DQorDQorCS8qIFRoZSBhcnJheSBpbmRleCBkZWZpbmVkIGluIHFvcy5oIGhhcyBh
IHJldmVyc2VkIGJrIGFuZCBiZS4NCisJICogVGhlIEhXIHF1ZXVlIHdhcyBub3QgdXNlZCB0aGlz
IHdheTsgdGhlIHFvcyBjb2RlIG5lZWRzIHRvDQorCSAqIGJlIGNoYW5nZWQgb3IgY2hlY2tlZA0K
KwkgKi8NCisJaWYgKGluZGV4ID09IDApDQorCQlwY21kLT50eHFfbnVtID0gMTsNCisJZWxzZSBp
ZiAoaW5kZXggPT0gMSkNCisJCXBjbWQtPnR4cV9udW0gPSAwOw0KKw0KKwlpZiAobXdsX2Z3Y21k
X2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX1NFVF9FRENBX1BBUkFNUykpIHsNCisJCXNwaW5f
dW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJm
YWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5s
b2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBt
d2xfZndjbWRfc2V0X3dtbV9tb2RlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGVuYWJs
ZSkNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9z
dGNtZF9jbWRfc2V0X3dtbV9tb2RlICpwY21kOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21k
X2NtZF9zZXRfd21tX21vZGUgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19i
aCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBj
bWQpKTsNCisJcGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRf
V01NX01PREUpOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNt
ZCkpOw0KKwlwY21kLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihlbmFibGUgPyBXTF9FTkFCTEUgOiBX
TF9ESVNBQkxFKTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NN
RF9TRVRfV01NX01PREUpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7
DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1
cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQor
DQorCXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX2h0X2d1YXJkX2ludGVydmFsKHN0
cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgZ2lfdHlwZSkNCit7DQorCXN0cnVjdCBtd2xfcHJp
diAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfaHRfZ3VhcmRfaW50ZXJ2
YWwgKnBjbWQ7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX2h0X2d1YXJkX2ludGVy
dmFsICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21k
X2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQt
PmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfSFRfR1VBUkRfSU5URVJWQUwp
Ow0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlw
Y21kLT5hY3Rpb24gPSBjcHVfdG9fbGUzMihXTF9TRVQpOw0KKwlwY21kLT5naV90eXBlID0gY3B1
X3RvX2xlMzIoZ2lfdHlwZSk7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9T
VENNRF9DTURfSFRfR1VBUkRfSU5URVJWQUwpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+
ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxu
Iik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+Zndj
bWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX3VzZV9maXhl
ZF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgbWNhc3QsIGludCBtZ210KQ0KK3sN
CisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnByaXY7DQorCXN0cnVjdCBob3N0Y21kX2Nt
ZF9zZXRfZml4ZWRfcmF0ZSAqcGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRf
c2V0X2ZpeGVkX3JhdGUgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgm
cHJpdi0+ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQp
KTsNCisJcGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRfRklY
RURfUkFURSk7DQorCXBjbWQtPmNtZF9oZHIubGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21k
KSk7DQorDQorCXBjbWQtPmFjdGlvbiA9IGNwdV90b19sZTMyKEhPU1RDTURfQUNUX05PVF9VU0Vf
RklYRURfUkFURSk7DQorCXBjbWQtPm11bHRpY2FzdF9yYXRlID0gbWNhc3Q7DQorCXBjbWQtPm1h
bmFnZW1lbnRfcmF0ZSA9IG1nbXQ7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwg
SE9TVENNRF9DTURfU0VUX0ZJWEVEX1JBVEUpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+
ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxu
Iik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+Zndj
bWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX3NldF9saW5r
YWRhcHRfY3NfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IGNzX21vZGUpDQorew0K
KwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IGhvc3RjbWRfY21k
X3NldF9saW5rYWRhcHRfY3NfbW9kZSAqcGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNt
ZF9jbWRfc2V0X2xpbmthZGFwdF9jc19tb2RlICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlz
cGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwg
c2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENN
RF9DTURfU0VUX0xJTktBREFQVF9DU19NT0RFKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVf
dG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+YWN0aW9uICA9IGNwdV90b19sZTE2KEhP
U1RDTURfQUNUX0dFTl9TRVQpOw0KKwlwY21kLT5jc19tb2RlID0gY3B1X3RvX2xlMTYoY3NfbW9k
ZSk7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURfU0VUX0xJ
TktBREFQVF9DU19NT0RFKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2sp
Ow0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0
dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0K
Kw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9zZXRfcmF0ZV9hZGFwdF9tb2Rl
KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgbW9kZSkNCit7DQorCXN0cnVjdCBtd2xfcHJp
diAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X3JhdGVfYWRhcHRf
bW9kZSAqcGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X3JhdGVfYWRh
cHRfbW9kZSAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5m
d2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlw
Y21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX1NFVF9SQVRFX0FEQVBU
X01PREUpOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkp
Ow0KKwlwY21kLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihXTF9TRVQpOw0KKwlwY21kLT5yYXRlX2Fk
YXB0X21vZGUgPSBjcHVfdG9fbGUxNihtb2RlKTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2Nt
ZChwcml2LCBIT1NUQ01EX0NNRF9TRVRfUkFURV9BREFQVF9NT0RFKSkgew0KKwkJc3Bpbl91bmxv
Y2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxl
ZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tf
YmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9m
d2NtZF9zZXRfbWFjX2FkZHJfY2xpZW50KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCQkg
IHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHU4ICptYWNfYWRkcikNCit7DQorCXN0cnVjdCBt
d2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZjsNCisJ
c3RydWN0IGhvc3RjbWRfY21kX3NldF9tYWNfYWRkciAqcGNtZDsNCisNCisJbXdsX3ZpZiA9IG13
bF9kZXZfZ2V0X3ZpZih2aWYpOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRf
bWFjX2FkZHIgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+
ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJ
cGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRfTUFDX0FERFIp
Ow0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlw
Y21kLT5jbWRfaGRyLm1hY2lkID0gbXdsX3ZpZi0+bWFjaWQ7DQorCXBjbWQtPm1hY190eXBlID0g
Y3B1X3RvX2xlMTYoV0xfTUFDX1RZUEVfU0VDT05EQVJZX0NMSUVOVCk7DQorCWV0aGVyX2FkZHJf
Y29weShwY21kLT5tYWNfYWRkciwgbWFjX2FkZHIpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNf
Y21kKHByaXYsIEhPU1RDTURfQ01EX1NFVF9NQUNfQUREUikpIHsNCisJCXNwaW5fdW5sb2NrX2Jo
KCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhl
Y3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZw
cml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRf
Z2V0X3dhdGNoZG9nX2JpdG1hcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKmJpdG1hcCkN
Cit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNt
ZF9jbWRfZ2V0X3dhdGNoZG9nX2JpdG1hcCAqcGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9z
dGNtZF9jbWRfZ2V0X3dhdGNoZG9nX2JpdG1hcCAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJ
c3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAs
IHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RD
TURfQ01EX0dFVF9XQVRDSERPR19CSVRNQVApOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90
b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYs
IEhPU1RDTURfQ01EX0dFVF9XQVRDSERPR19CSVRNQVApKSB7DQorCQlzcGluX3VubG9ja19iaCgm
cHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1
dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwkqYml0bWFwID0gcGNtZC0+d2F0
Y2hkb2dfYml0bWFwOw0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQor
DQorCXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX3JlbW92ZV9tYWNfYWRkcihzdHJ1
Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlm
LCB1OCAqbWFjX2FkZHIpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsN
CisJc3RydWN0IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfbWFj
X2FkZHIgKnBjbWQ7DQorDQorCW13bF92aWYgPSBtd2xfZGV2X2dldF92aWYodmlmKTsNCisNCisJ
cGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X21hY19hZGRyICopJnByaXYtPnBjbWRfYnVm
WzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQo
cGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3Rv
X2xlMTYoSE9TVENNRF9DTURfREVMX01BQ19BRERSKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBj
cHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21kX2hkci5tYWNpZCA9IG13bF92
aWYtPm1hY2lkOw0KKwlldGhlcl9hZGRyX2NvcHkocGNtZC0+bWFjX2FkZHIsIG1hY19hZGRyKTsN
CisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9ERUxfTUFDX0FE
RFIpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9l
cnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJ
fQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAw
Ow0KK30NCisNCitpbnQgbXdsX2Z3Y21kX2Jzc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpo
dywNCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29sIGVuYWJsZSkNCit7DQorCXN0
cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3Zp
ZjsNCisJc3RydWN0IGhvc3RjbWRfY21kX2Jzc19zdGFydCAqcGNtZDsNCisNCisJbXdsX3ZpZiA9
IG13bF9kZXZfZ2V0X3ZpZih2aWYpOw0KKw0KKwlpZiAoZW5hYmxlICYmIChwcml2LT5ydW5uaW5n
X2Jzc2VzICYgKDEgPDwgbXdsX3ZpZi0+bWFjaWQpKSkNCisJCXJldHVybiAwOw0KKw0KKwlpZiAo
IWVuYWJsZSAmJiAhKHByaXYtPnJ1bm5pbmdfYnNzZXMgJiAoMSA8PCBtd2xfdmlmLT5tYWNpZCkp
KQ0KKwkJcmV0dXJuIDA7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX2Jzc19zdGFy
dCAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9s
b2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5j
bWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX0JTU19TVEFSVCk7DQorCXBjbWQt
PmNtZF9oZHIubGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9o
ZHIubWFjaWQgPSBtd2xfdmlmLT5tYWNpZDsNCisNCisJaWYgKGVuYWJsZSkgew0KKwkJcGNtZC0+
ZW5hYmxlID0gY3B1X3RvX2xlMzIoV0xfRU5BQkxFKTsNCisJfSBlbHNlIHsNCisJCWlmIChtd2xf
dmlmLT5tYWNpZCA9PSAwKQ0KKwkJCXBjbWQtPmVuYWJsZSA9IGNwdV90b19sZTMyKFdMX0RJU0FC
TEUpOw0KKwkJZWxzZQ0KKwkJCXBjbWQtPmVuYWJsZSA9IGNwdV90b19sZTMyKFdMX0RJU0FCTEVf
Vk1BQyk7DQorCX0NCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NN
RF9CU1NfU1RBUlQpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQor
CQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4g
LUVJTzsNCisJfQ0KKw0KKwlpZiAoZW5hYmxlKQ0KKwkJcHJpdi0+cnVubmluZ19ic3NlcyB8PSAo
MSA8PCBtd2xfdmlmLT5tYWNpZCk7DQorCWVsc2UNCisJCXByaXYtPnJ1bm5pbmdfYnNzZXMgJj0g
figxIDw8IG13bF92aWYtPm1hY2lkKTsNCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21k
X2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9zZXRfYmVhY29u
KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlm
LCB1OCAqYmVhY29uLCBpbnQgbGVuKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHct
PnByaXY7DQorCXN0cnVjdCBtd2xfdmlmICptd2xfdmlmOw0KKw0KKwltd2xfdmlmID0gbXdsX2Rl
dl9nZXRfdmlmKHZpZik7DQorDQorCW13bF9md2NtZF9wYXJzZV9iZWFjb24ocHJpdiwgbXdsX3Zp
ZiwgYmVhY29uLCBsZW4pOw0KKw0KKwlpZiAobXdsX2Z3Y21kX3NldF9pZXMocHJpdiwgbXdsX3Zp
ZikpDQorCQlnb3RvIGVycjsNCisNCisJaWYgKG13bF9md2NtZF9zZXRfYXBfYmVhY29uKHByaXYs
IG13bF92aWYsICZ2aWYtPmJzc19jb25mKSkNCisJCWdvdG8gZXJyOw0KKw0KKwltd2xfdmlmLT5i
ZWFjb25faW5mby52YWxpZCA9IGZhbHNlOw0KKw0KKwlyZXR1cm4gMDsNCisNCitlcnI6DQorDQor
CW13bF92aWYtPmJlYWNvbl9pbmZvLnZhbGlkID0gZmFsc2U7DQorDQorCXJldHVybiAtRUlPOw0K
K30NCisNCitpbnQgbXdsX2Z3Y21kX3NldF9uZXdfc3RuX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3
ICpodywNCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCSAgICAgIHN0
cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBo
dy0+cHJpdjsNCisJc3RydWN0IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVjdCBob3N0Y21kX2Nt
ZF9zZXRfbmV3X3N0biAqcGNtZDsNCisJdTMyIHJhdGVzOw0KKw0KKwltd2xfdmlmID0gbXdsX2Rl
dl9nZXRfdmlmKHZpZik7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX3NldF9uZXdf
c3RuICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21k
X2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQt
PmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfU0VUX05FV19TVE4pOw0KKwlw
Y21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5j
bWRfaGRyLm1hY2lkID0gbXdsX3ZpZi0+bWFjaWQ7DQorDQorCXBjbWQtPmFjdGlvbiA9IGNwdV90
b19sZTE2KEhPU1RDTURfQUNUX1NUQV9BQ1RJT05fQUREKTsNCisJaWYgKHZpZi0+dHlwZSA9PSBO
TDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7DQorCQlwY21kLT5haWQgPSAwOw0KKwkJcGNtZC0+c3Ru
X2lkID0gMDsNCisJfSBlbHNlIHsNCisJCXBjbWQtPmFpZCA9IGNwdV90b19sZTE2KHN0YS0+YWlk
KTsNCisJCXBjbWQtPnN0bl9pZCA9IGNwdV90b19sZTE2KHN0YS0+YWlkKTsNCisJfQ0KKwlldGhl
cl9hZGRyX2NvcHkocGNtZC0+bWFjX2FkZHIsIHN0YS0+YWRkcik7DQorDQorCWlmIChody0+Y29u
Zi5jaGFuZGVmLmNoYW4tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikNCisJCXJhdGVzID0g
c3RhLT5zdXBwX3JhdGVzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOw0KKwllbHNlDQorCQlyYXRlcyA9
IHN0YS0+c3VwcF9yYXRlc1tJRUVFODAyMTFfQkFORF81R0haXSA8PCA1Ow0KKwlwY21kLT5wZWVy
X2luZm8ubGVnYWN5X3JhdGVfYml0bWFwID0gY3B1X3RvX2xlMzIocmF0ZXMpOw0KKw0KKwlpZiAo
c3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKSB7DQorCQlwY21kLT5wZWVyX2luZm8uaHRfcmF0ZXNb
MF0gPSBzdGEtPmh0X2NhcC5tY3MucnhfbWFza1swXTsNCisJCXBjbWQtPnBlZXJfaW5mby5odF9y
YXRlc1sxXSA9IHN0YS0+aHRfY2FwLm1jcy5yeF9tYXNrWzFdOw0KKwkJcGNtZC0+cGVlcl9pbmZv
Lmh0X3JhdGVzWzJdID0gc3RhLT5odF9jYXAubWNzLnJ4X21hc2tbMl07DQorCQlwY21kLT5wZWVy
X2luZm8uaHRfcmF0ZXNbM10gPSBzdGEtPmh0X2NhcC5tY3MucnhfbWFza1szXTsNCisJCXBjbWQt
PnBlZXJfaW5mby5odF9jYXBfaW5mbyA9IGNwdV90b19sZTE2KHN0YS0+aHRfY2FwLmNhcCk7DQor
CQlwY21kLT5wZWVyX2luZm8ubWFjX2h0X3BhcmFtX2luZm8gPQ0KKwkJCShzdGEtPmh0X2NhcC5h
bXBkdV9mYWN0b3IgJiAzKSB8DQorCQkJKChzdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5ICYgNykg
PDwgMik7DQorCX0NCisNCisJaWYgKHN0YS0+dmh0X2NhcC52aHRfc3VwcG9ydGVkKSB7DQorCQlw
Y21kLT5wZWVyX2luZm8udmh0X21heF9yeF9tY3MgPQ0KKwkJCWNwdV90b19sZTMyKCooKHUzMiAq
KQ0KKwkJCSZzdGEtPnZodF9jYXAudmh0X21jcy5yeF9tY3NfbWFwKSk7DQorCQlwY21kLT5wZWVy
X2luZm8udmh0X2NhcCA9IGNwdV90b19sZTMyKHN0YS0+dmh0X2NhcC5jYXApOw0KKwkJcGNtZC0+
cGVlcl9pbmZvLnZodF9yeF9jaGFubmVsX3dpZHRoID0gc3RhLT5iYW5kd2lkdGg7DQorCX0NCisN
CisJcGNtZC0+aXNfcW9zX3N0YSA9IHN0YS0+d21lOw0KKwlwY21kLT5xb3NfaW5mbyA9ICgoc3Rh
LT51YXBzZF9xdWV1ZXMgPDwgNCkgfCAoc3RhLT5tYXhfc3AgPDwgMSkpOw0KKw0KKwlpZiAobXds
X2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX1NFVF9ORVdfU1ROKSkgew0KKwkJc3Bp
bl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwg
ImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJaWYgKHZp
Zi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7DQorCQlldGhlcl9hZGRyX2NvcHko
cGNtZC0+bWFjX2FkZHIsIG13bF92aWYtPnN0YV9tYWMpOw0KKw0KKwkJaWYgKG13bF9md2NtZF9l
eGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9TRVRfTkVXX1NUTikpIHsNCisJCQlzcGluX3VubG9j
a19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxl
ZCBleGVjdXRpb25cbiIpOw0KKwkJCXJldHVybiAtRUlPOw0KKwkJfQ0KKwl9DQorDQorCXNwaW5f
dW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2lu
dCBtd2xfZndjbWRfc2V0X25ld19zdG5fYWRkX3NlbGYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcs
DQorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpDQorew0KKwlzdHJ1Y3QgbXdsX3By
aXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVj
dCBob3N0Y21kX2NtZF9zZXRfbmV3X3N0biAqcGNtZDsNCisNCisJbXdsX3ZpZiA9IG13bF9kZXZf
Z2V0X3ZpZih2aWYpOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRfbmV3X3N0
biAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9s
b2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5j
bWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX1NFVF9ORVdfU1ROKTsNCisJcGNt
ZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21k
X2hkci5tYWNpZCA9IG13bF92aWYtPm1hY2lkOw0KKw0KKwlwY21kLT5hY3Rpb24gPSBjcHVfdG9f
bGUxNihIT1NUQ01EX0FDVF9TVEFfQUNUSU9OX0FERCk7DQorCWV0aGVyX2FkZHJfY29weShwY21k
LT5tYWNfYWRkciwgdmlmLT5hZGRyKTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2
LCBIT1NUQ01EX0NNRF9TRVRfTkVXX1NUTikpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5m
d2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4i
KTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2Nt
ZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfc2V0X25ld19z
dG5fZGVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAgICAgIHN0cnVjdCBpZWVlODAy
MTFfdmlmICp2aWYsIHU4ICphZGRyKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHct
PnByaXY7DQorCXN0cnVjdCBtd2xfdmlmICptd2xfdmlmOw0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRf
c2V0X25ld19zdG4gKnBjbWQ7DQorDQorCW13bF92aWYgPSBtd2xfZGV2X2dldF92aWYodmlmKTsN
CisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X25ld19zdG4gKikmcHJpdi0+cGNt
ZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCW1l
bXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21kX2hkci5jbWQgPSBj
cHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRfTkVXX1NUTik7DQorCXBjbWQtPmNtZF9oZHIubGVu
ID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIubWFjaWQgPSBt
d2xfdmlmLT5tYWNpZDsNCisNCisJcGNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoSE9TVENNRF9B
Q1RfU1RBX0FDVElPTl9SRU1PVkUpOw0KKwlldGhlcl9hZGRyX2NvcHkocGNtZC0+bWFjX2FkZHIs
IGFkZHIpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX1NF
VF9ORVdfU1ROKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJ
d2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1F
SU87DQorCX0NCisNCisJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7
DQorCQlldGhlcl9hZGRyX2NvcHkocGNtZC0+bWFjX2FkZHIsIG13bF92aWYtPnN0YV9tYWMpOw0K
Kw0KKwkJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9TRVRfTkVXX1NU
TikpIHsNCisJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQkJd2lwaHlf
ZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJCXJldHVybiAtRUlPOw0K
KwkJfQ0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJ
cmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfc2V0X2FwbW9kZShzdHJ1Y3QgaWVlZTgw
MjExX2h3ICpodywgdTggYXBtb2RlKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHct
PnByaXY7DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfYXBtb2RlICpwY21kOw0KKw0KKwlwY21k
ID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRfYXBtb2RlICopJnByaXYtPnBjbWRfYnVmWzBdOw0K
Kw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwg
MHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYo
SE9TVENNRF9DTURfU0VUX0FQTU9ERSk7DQorCXBjbWQtPmNtZF9oZHIubGVuID0gY3B1X3RvX2xl
MTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmFwbW9kZSA9IGFwbW9kZTsNCisNCisJaWYgKG13
bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9TRVRfQVBNT0RFKSkgew0KKwkJc3Bp
bl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwg
ImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91
bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50
IG13bF9md2NtZF91cGRhdGVfZW5jcnlwdGlvbl9lbmFibGUoc3RydWN0IGllZWU4MDIxMV9odyAq
aHcsDQorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCQkgICAgICAg
dTggKmFkZHIsIHU4IGVuY3JfdHlwZSkNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3
LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZjsNCisJc3RydWN0IGhvc3RjbWRfY21k
X3VwZGF0ZV9lbmNyeXB0aW9uICpwY21kOw0KKw0KKwltd2xfdmlmID0gbXdsX2Rldl9nZXRfdmlm
KHZpZik7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX3VwZGF0ZV9lbmNyeXB0aW9u
ICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xv
Y2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNt
ZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfVVBEQVRFX0VOQ1JZUFRJT04pOw0K
KwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21k
LT5jbWRfaGRyLm1hY2lkID0gbXdsX3ZpZi0+bWFjaWQ7DQorDQorCXBjbWQtPmFjdGlvbl90eXBl
ID0gY3B1X3RvX2xlMzIoRU5DUl9BQ1RJT05fRU5BQkxFX0hXX0VOQ1IpOw0KKwlldGhlcl9hZGRy
X2NvcHkocGNtZC0+bWFjX2FkZHIsIGFkZHIpOw0KKwlwY21kLT5hY3Rpb25fZGF0YVswXSA9IGVu
Y3JfdHlwZTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9V
UERBVEVfRU5DUllQVElPTikpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2Nr
KTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJl
dHVybiAtRUlPOw0KKwl9DQorDQorCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RB
VElPTikgew0KKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXdsX3ZpZi0+YnNzaWQsIGFkZHIpKQ0K
KwkJCWV0aGVyX2FkZHJfY29weShwY21kLT5tYWNfYWRkciwgbXdsX3ZpZi0+c3RhX21hYyk7DQor
CQllbHNlDQorCQkJZXRoZXJfYWRkcl9jb3B5KHBjbWQtPm1hY19hZGRyLCBtd2xfdmlmLT5ic3Np
ZCk7DQorDQorCQlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX1VQREFU
RV9FTkNSWVBUSU9OKSkgew0KKwkJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsN
CisJCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQkJcmV0
dXJuIC1FSU87DQorCQl9DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xv
Y2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9lbmNyeXB0aW9uX3Nl
dF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3Zp
ZiAqdmlmLCB1OCAqYWRkciwNCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkN
Cit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3Zp
ZiAqbXdsX3ZpZjsNCisJc3RydWN0IGhvc3RjbWRfY21kX3NldF9rZXkgKnBjbWQ7DQorCWludCBy
YzsNCisJaW50IGtleW1sZW47DQorCXUzMiBhY3Rpb247DQorCXU4IGlkeDsNCisNCisJbXdsX3Zp
ZiA9IG13bF9kZXZfZ2V0X3ZpZih2aWYpOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2Nt
ZF9zZXRfa2V5ICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYt
PmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQor
CXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfVVBEQVRFX0VOQ1JZ
UFRJT04pOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkp
Ow0KKwlwY21kLT5jbWRfaGRyLm1hY2lkID0gbXdsX3ZpZi0+bWFjaWQ7DQorDQorCXJjID0gbXds
X2Z3Y21kX2VuY3J5cHRpb25fc2V0X2NtZF9pbmZvKHBjbWQsIGFkZHIsIGtleSk7DQorCWlmIChy
Yykgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJy
KGh3LT53aXBoeSwgImVuY3J5cHRpb24gbm90IHN1cHBvcnRcbiIpOw0KKwkJcmV0dXJuIHJjOw0K
Kwl9DQorDQorCWlkeCA9IGtleS0+a2V5aWR4Ow0KKw0KKwlpZiAoa2V5LT5mbGFncyAmIElFRUU4
MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkNCisJCWFjdGlvbiA9IEVOQ1JfQUNUSU9OX1RZUEVfU0VU
X0tFWTsNCisJZWxzZQ0KKwkJYWN0aW9uID0gRU5DUl9BQ1RJT05fVFlQRV9TRVRfR1JPVVBfS0VZ
Ow0KKw0KKwlzd2l0Y2ggKGtleS0+Y2lwaGVyKSB7DQorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVf
V0VQNDA6DQorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0Og0KKwkJaWYgKCFtd2xfdmlm
LT53ZXBfa2V5X2NvbmZbaWR4XS5lbmFibGVkKSB7DQorCQkJbWVtY3B5KG13bF92aWYtPndlcF9r
ZXlfY29uZltpZHhdLmtleSwga2V5LA0KKwkJCSAgICAgICBzaXplb2YoKmtleSkgKyBrZXktPmtl
eWxlbik7DQorCQkJbXdsX3ZpZi0+d2VwX2tleV9jb25mW2lkeF0uZW5hYmxlZCA9IDE7DQorCQl9
DQorDQorCQlrZXltbGVuID0ga2V5LT5rZXlsZW47DQorCQlhY3Rpb24gPSBFTkNSX0FDVElPTl9U
WVBFX1NFVF9LRVk7DQorCQlicmVhazsNCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOg0K
KwkJa2V5bWxlbiA9IE1BWF9FTkNSX0tFWV9MRU5HVEggKyAyICogTUlDX0tFWV9MRU5HVEg7DQor
CQlicmVhazsNCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOg0KKwkJa2V5bWxlbiA9IGtl
eS0+a2V5bGVuOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQlzcGluX3VubG9ja19iaCgmcHJp
di0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZW5jcnlwdGlvbiBub3Qg
c3VwcG9ydFxuIik7DQorCQlyZXR1cm4gLUVOT1RTVVBQOw0KKwl9DQorDQorCW1lbWNweSgodm9p
ZCAqKSZwY21kLT5rZXlfcGFyYW0ua2V5LCBrZXktPmtleSwga2V5bWxlbik7DQorCXBjbWQtPmFj
dGlvbl90eXBlID0gY3B1X3RvX2xlMzIoYWN0aW9uKTsNCisNCisJaWYgKG13bF9md2NtZF9leGVj
X2NtZChwcml2LCBIT1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElPTikpIHsNCisJCXNwaW5fdW5s
b2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWls
ZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCWlmICh2aWYtPnR5
cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgew0KKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwo
bXdsX3ZpZi0+YnNzaWQsIGFkZHIpKQ0KKwkJCWV0aGVyX2FkZHJfY29weShwY21kLT5rZXlfcGFy
YW0ubWFjX2FkZHIsDQorCQkJCQltd2xfdmlmLT5zdGFfbWFjKTsNCisJCWVsc2UNCisJCQlldGhl
cl9hZGRyX2NvcHkocGNtZC0+a2V5X3BhcmFtLm1hY19hZGRyLA0KKwkJCQkJbXdsX3ZpZi0+YnNz
aWQpOw0KKw0KKwkJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9VUERB
VEVfRU5DUllQVElPTikpIHsNCisJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7
DQorCQkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJCXJl
dHVybiAtRUlPOw0KKwkJfQ0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9s
b2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfZW5jcnlwdGlvbl9y
ZW1vdmVfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCQkgICAgc3RydWN0IGllZWU4
MDIxMV92aWYgKnZpZiwgdTggKmFkZHIsDQorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9j
b25mICprZXkpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3Ry
dWN0IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfa2V5ICpwY21k
Ow0KKwlpbnQgcmM7DQorDQorCW13bF92aWYgPSBtd2xfZGV2X2dldF92aWYodmlmKTsNCisNCisJ
cGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X2tleSAqKSZwcml2LT5wY21kX2J1ZlswXTsN
CisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQs
IDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2
KEhPU1RDTURfQ01EX1VQREFURV9FTkNSWVBUSU9OKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBj
cHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21kX2hkci5tYWNpZCA9IG13bF92
aWYtPm1hY2lkOw0KKw0KKwlyYyA9IG13bF9md2NtZF9lbmNyeXB0aW9uX3NldF9jbWRfaW5mbyhw
Y21kLCBhZGRyLCBrZXkpOw0KKwlpZiAocmMpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5m
d2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJlbmNyeXB0aW9uIG5vdCBzdXBw
b3J0XG4iKTsNCisJCXJldHVybiByYzsNCisJfQ0KKw0KKwlwY21kLT5hY3Rpb25fdHlwZSA9IGNw
dV90b19sZTMyKEVOQ1JfQUNUSU9OX1RZUEVfUkVNT1ZFX0tFWSk7DQorDQorCWlmIChrZXktPmNp
cGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fA0KKwkgICAga2V5LT5jaXBoZXIgPT0g
V0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQ0KKwkJbXdsX3ZpZi0+d2VwX2tleV9jb25mW2tleS0+
a2V5aWR4XS5lbmFibGVkID0gMDsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBI
T1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElPTikpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2
LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9u
XG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5m
d2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfY2hlY2tf
YmEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkgICAgICAgc3RydWN0IG13bF9hbXBkdV9z
dHJlYW0gKnN0cmVhbSwNCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQ0KK3sN
CisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnByaXY7DQorCXN0cnVjdCBtd2xfdmlmICpt
d2xfdmlmOw0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfYmFzdHJlYW0gKnBjbWQ7DQorCXUzMiBiYV9m
bGFncywgYmFfdHlwZSwgYmFfZGlyZWN0aW9uOw0KKw0KKwltd2xfdmlmID0gbXdsX2Rldl9nZXRf
dmlmKHZpZik7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX2Jhc3RyZWFtICopJnBy
aXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0K
Kw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIu
Y21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfQkFTVFJFQU0pOw0KKwlwY21kLT5jbWRfaGRy
LmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLm1hY2lk
ID0gbXdsX3ZpZi0+bWFjaWQ7DQorCXBjbWQtPmNtZF9oZHIucmVzdWx0ID0gY3B1X3RvX2xlMTYo
MHhmZmZmKTsNCisNCisJcGNtZC0+YWN0aW9uX3R5cGUgPSBjcHVfdG9fbGUzMihCQV9DSEVDS19T
VFJFQU0pOw0KKwlldGhlcl9hZGRyX2NvcHkoJnBjbWQtPmJhX2luZm8uY3JlYXRlX3BhcmFtcy5w
ZWVyX21hY19hZGRyWzBdLA0KKwkJCXN0cmVhbS0+c3RhLT5hZGRyKTsNCisJcGNtZC0+YmFfaW5m
by5jcmVhdGVfcGFyYW1zLnRpZCA9IHN0cmVhbS0+dGlkOw0KKwliYV90eXBlID0gQkFTVFJFQU1f
RkxBR19JTU1FRElBVEVfVFlQRTsNCisJYmFfZGlyZWN0aW9uID0gQkFTVFJFQU1fRkxBR19ESVJF
Q1RJT05fVVBTVFJFQU07DQorCWJhX2ZsYWdzID0gKGJhX3R5cGUgJiBCQV9UWVBFX01BU0spIHwN
CisJCSgoYmFfZGlyZWN0aW9uIDw8IEJBX0RJUkVDVElPTl9TSElGVCkgJiBCQV9ESVJFQ1RJT05f
TUFTSyk7DQorCXBjbWQtPmJhX2luZm8uY3JlYXRlX3BhcmFtcy5mbGFncyA9IGNwdV90b19sZTMy
KGJhX2ZsYWdzKTsNCisJcGNtZC0+YmFfaW5mby5jcmVhdGVfcGFyYW1zLnF1ZXVlX2lkID0gc3Ry
ZWFtLT5pZHg7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURf
QkFTVFJFQU0pKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3
aXBoeV9lcnIoaHctPndpcGh5LCAiY2hlY2sgYmEgZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQly
ZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlpZiAocGNtZC0+Y21kX2hkci5yZXN1bHQgIT0gMCkgew0K
KwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53
aXBoeSwgImNoZWNrIGJhIHJlc3VsdCBlcnJvciAlZFxuIiwNCisJCQkgIGxlMTZfdG9fY3B1KHBj
bWQtPmNtZF9oZHIucmVzdWx0KSk7DQorCQlyZXR1cm4gLUVJTlZBTDsNCisJfQ0KKw0KKwlzcGlu
X3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitp
bnQgbXdsX2Z3Y21kX2NyZWF0ZV9iYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQlzdHJ1
Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtLA0KKwkJCXU4IGJ1Zl9zaXplLCBzdHJ1Y3QgaWVl
ZTgwMjExX3ZpZiAqdmlmKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnByaXY7
DQorCXN0cnVjdCBtd2xfdmlmICptd2xfdmlmOw0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfYmFzdHJl
YW0gKnBjbWQ7DQorCXUzMiBiYV9mbGFncywgYmFfdHlwZSwgYmFfZGlyZWN0aW9uOw0KKw0KKwlt
d2xfdmlmID0gbXdsX2Rldl9nZXRfdmlmKHZpZik7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3Rj
bWRfY21kX2Jhc3RyZWFtICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgo
JnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21k
KSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfQkFTVFJF
QU0pOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0K
KwlwY21kLT5jbWRfaGRyLm1hY2lkID0gbXdsX3ZpZi0+bWFjaWQ7DQorCXBjbWQtPmNtZF9oZHIu
cmVzdWx0ID0gY3B1X3RvX2xlMTYoMHhmZmZmKTsNCisNCisJcGNtZC0+YWN0aW9uX3R5cGUgPSBj
cHVfdG9fbGUzMihCQV9DUkVBVEVfU1RSRUFNKTsNCisJcGNtZC0+YmFfaW5mby5jcmVhdGVfcGFy
YW1zLmJhcl90aHJzID0gY3B1X3RvX2xlMzIoYnVmX3NpemUpOw0KKwlwY21kLT5iYV9pbmZvLmNy
ZWF0ZV9wYXJhbXMud2luZG93X3NpemUgPSBjcHVfdG9fbGUzMihidWZfc2l6ZSk7DQorCWV0aGVy
X2FkZHJfY29weSgmcGNtZC0+YmFfaW5mby5jcmVhdGVfcGFyYW1zLnBlZXJfbWFjX2FkZHJbMF0s
DQorCQkJc3RyZWFtLT5zdGEtPmFkZHIpOw0KKwlwY21kLT5iYV9pbmZvLmNyZWF0ZV9wYXJhbXMu
dGlkID0gc3RyZWFtLT50aWQ7DQorCWJhX3R5cGUgPSBCQVNUUkVBTV9GTEFHX0lNTUVESUFURV9U
WVBFOw0KKwliYV9kaXJlY3Rpb24gPSBCQVNUUkVBTV9GTEFHX0RJUkVDVElPTl9VUFNUUkVBTTsN
CisJYmFfZmxhZ3MgPSAoYmFfdHlwZSAmIEJBX1RZUEVfTUFTSykgfA0KKwkJKChiYV9kaXJlY3Rp
b24gPDwgQkFfRElSRUNUSU9OX1NISUZUKSAmIEJBX0RJUkVDVElPTl9NQVNLKTsNCisJcGNtZC0+
YmFfaW5mby5jcmVhdGVfcGFyYW1zLmZsYWdzID0gY3B1X3RvX2xlMzIoYmFfZmxhZ3MpOw0KKwlw
Y21kLT5iYV9pbmZvLmNyZWF0ZV9wYXJhbXMucXVldWVfaWQgPSBzdHJlYW0tPmlkeDsNCisJcGNt
ZC0+YmFfaW5mby5jcmVhdGVfcGFyYW1zLnBhcmFtX2luZm8gPQ0KKwkJKHN0cmVhbS0+c3RhLT5o
dF9jYXAuYW1wZHVfZmFjdG9yICYNCisJCSBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1Ip
IHwNCisJCSgoc3RyZWFtLT5zdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5IDw8IDIpICYNCisJCSBJ
RUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZKTsNCisJcGNtZC0+YmFfaW5mby5jcmVhdGVf
cGFyYW1zLnJlc2V0X3NlcV9ubyA9IDE7DQorCXBjbWQtPmJhX2luZm8uY3JlYXRlX3BhcmFtcy5j
dXJyZW50X3NlcSA9IGNwdV90b19sZTE2KDApOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21k
KHByaXYsIEhPU1RDTURfQ01EX0JBU1RSRUFNKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYt
PmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImNyZWF0ZSBiYSBmYWlsZWQg
ZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCWlmIChwY21kLT5jbWRf
aGRyLnJlc3VsdCAhPSAwKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7
DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiY3JlYXRlIGJhIHJlc3VsdCBlcnJvciAlZFxuIiwN
CisJCQkgIGxlMTZfdG9fY3B1KHBjbWQtPmNtZF9oZHIucmVzdWx0KSk7DQorCQlyZXR1cm4gLUVJ
TlZBTDsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQor
CXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX2Rlc3Ryb3lfYmEoc3RydWN0IGllZWU4
MDIxMV9odyAqaHcsDQorCQkJIHU4IGlkeCkNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9
IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfYmFzdHJlYW0gKnBjbWQ7DQorCXUzMiBi
YV9mbGFncywgYmFfdHlwZSwgYmFfZGlyZWN0aW9uOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0
Y21kX2NtZF9iYXN0cmVhbSAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2Jo
KCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNt
ZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX0JBU1RS
RUFNKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsN
CisNCisJcGNtZC0+YWN0aW9uX3R5cGUgPSBjcHVfdG9fbGUzMihCQV9ERVNUUk9ZX1NUUkVBTSk7
DQorCWJhX3R5cGUgPSBCQVNUUkVBTV9GTEFHX0lNTUVESUFURV9UWVBFOw0KKwliYV9kaXJlY3Rp
b24gPSBCQVNUUkVBTV9GTEFHX0RJUkVDVElPTl9VUFNUUkVBTTsNCisJYmFfZmxhZ3MgPSAoYmFf
dHlwZSAmIEJBX1RZUEVfTUFTSykgfA0KKwkJKChiYV9kaXJlY3Rpb24gPDwgQkFfRElSRUNUSU9O
X1NISUZUKSAmIEJBX0RJUkVDVElPTl9NQVNLKTsNCisJcGNtZC0+YmFfaW5mby5kZXN0cm95X3Bh
cmFtcy5mbGFncyA9IGNwdV90b19sZTMyKGJhX2ZsYWdzKTsNCisJcGNtZC0+YmFfaW5mby5kZXN0
cm95X3BhcmFtcy5md19iYV9jb250ZXh0LmNvbnRleHQgPSBjcHVfdG9fbGUzMihpZHgpOw0KKw0K
KwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX0JBU1RSRUFNKSkgew0K
KwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53
aXBoeSwgImRlc3Ryb3kgYmEgZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsN
CisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVy
biAwOw0KK30NCisNCisvKiBjYWxsZXIgbXVzdCBob2xkIHByaXYtPnN0cmVhbV9sb2NrIHdoZW4g
Y2FsbGluZyB0aGUgc3RyZWFtIGZ1bmN0aW9ucyAqLw0KK3N0cnVjdCBtd2xfYW1wZHVfc3RyZWFt
ICptd2xfZndjbWRfYWRkX3N0cmVhbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJCSAg
ICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsDQorCQkJCQkgICAgICB1OCB0aWQpDQorew0K
KwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IG13bF9hbXBkdV9z
dHJlYW0gKnN0cmVhbTsNCisJaW50IGk7DQorDQorCWZvciAoaSA9IDA7IGkgPCBTWVNBRFBUX1RY
X0FNUERVX1FVRVVFUzsgaSsrKSB7DQorCQlzdHJlYW0gPSAmcHJpdi0+YW1wZHVbaV07DQorDQor
CQlpZiAoc3RyZWFtLT5zdGF0ZSA9PSBBTVBEVV9OT19TVFJFQU0pIHsNCisJCQlzdHJlYW0tPnN0
YSA9IHN0YTsNCisJCQlzdHJlYW0tPnN0YXRlID0gQU1QRFVfU1RSRUFNX05FVzsNCisJCQlzdHJl
YW0tPnRpZCA9IHRpZDsNCisJCQlzdHJlYW0tPmlkeCA9IGk7DQorCQkJcmV0dXJuIHN0cmVhbTsN
CisJCX0NCisJfQ0KKw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQordm9pZCBtd2xfZndjbWRfZGVs
X3N0YV9zdHJlYW1zKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAgICAgICBzdHJ1Y3Qg
aWVlZTgwMjExX3N0YSAqc3RhKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnBy
aXY7DQorCXN0cnVjdCBtd2xfYW1wZHVfc3RyZWFtICpzdHJlYW07DQorCWludCBpOw0KKw0KKwlm
b3IgKGkgPSAwOyBpIDwgU1lTQURQVF9UWF9BTVBEVV9RVUVVRVM7IGkrKykgew0KKwkJc3RyZWFt
ID0gJnByaXYtPmFtcGR1W2ldOw0KKw0KKwkJaWYgKHN0cmVhbS0+c3RhID09IHN0YSkgew0KKwkJ
CW13bF9md2NtZF9kZXN0cm95X2JhKGh3LCBzdHJlYW0tPmlkeCk7DQorCQkJbXdsX2Z3Y21kX3Jl
bW92ZV9zdHJlYW0oaHcsIHN0cmVhbSk7DQorCQl9DQorCX0NCit9DQorDQoraW50IG13bF9md2Nt
ZF9zdGFydF9zdHJlYW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJICAgc3RydWN0IG13
bF9hbXBkdV9zdHJlYW0gKnN0cmVhbSkNCit7DQorCS8qIGlmIHRoZSBzdHJlYW0gaGFzIGFscmVh
ZHkgYmVlbiBzdGFydGVkLCBkb24ndCBzdGFydCBpdCBhZ2FpbiAqLw0KKwlpZiAoc3RyZWFtLT5z
dGF0ZSAhPSBBTVBEVV9TVFJFQU1fTkVXKQ0KKwkJcmV0dXJuIDA7DQorDQorCXJldHVybiBpZWVl
ODAyMTFfc3RhcnRfdHhfYmFfc2Vzc2lvbihzdHJlYW0tPnN0YSwgc3RyZWFtLT50aWQsIDApOw0K
K30NCisNCit2b2lkIG13bF9md2NtZF9yZW1vdmVfc3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfaHcg
Kmh3LA0KKwkJCSAgICAgc3RydWN0IG13bF9hbXBkdV9zdHJlYW0gKnN0cmVhbSkNCit7DQorCW1l
bXNldChzdHJlYW0sIDAsIHNpemVvZigqc3RyZWFtKSk7DQorfQ0KKw0KK3N0cnVjdCBtd2xfYW1w
ZHVfc3RyZWFtICptd2xfZndjbWRfbG9va3VwX3N0cmVhbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpo
dywNCisJCQkJCQkgdTggKmFkZHIsIHU4IHRpZCkNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJp
diA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtOw0KKwlpbnQg
aTsNCisNCisJZm9yIChpID0gMDsgaSA8IFNZU0FEUFRfVFhfQU1QRFVfUVVFVUVTOyBpKyspIHsN
CisJCXN0cmVhbSA9ICZwcml2LT5hbXBkdVtpXTsNCisNCisJCWlmIChzdHJlYW0tPnN0YXRlID09
IEFNUERVX05PX1NUUkVBTSkNCisJCQljb250aW51ZTsNCisNCisJCWlmIChldGhlcl9hZGRyX2Vx
dWFsKHN0cmVhbS0+c3RhLT5hZGRyLCBhZGRyKSAmJg0KKwkJICAgIHN0cmVhbS0+dGlkID09IHRp
ZCkNCisJCQlyZXR1cm4gc3RyZWFtOw0KKwl9DQorDQorCXJldHVybiBOVUxMOw0KK30NCisNCiti
b29sIG13bF9md2NtZF9hbXBkdV9hbGxvd2VkKHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4
IHRpZCkNCit7DQorCXN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbzsNCisJc3RydWN0IG13bF90eF9p
bmZvICp0eF9zdGF0czsNCisNCisJaWYgKFdBUk5fT04odGlkID49IFNZU0FEUFRfTUFYX1RJRCkp
DQorCQlyZXR1cm4gZmFsc2U7DQorDQorCXN0YV9pbmZvID0gbXdsX2Rldl9nZXRfc3RhKHN0YSk7
DQorDQorCXR4X3N0YXRzID0gJnN0YV9pbmZvLT50eF9zdGF0c1t0aWRdOw0KKw0KKwlyZXR1cm4g
KHN0YV9pbmZvLT5pc19hbXBkdV9hbGxvd2VkICYmDQorCQl0eF9zdGF0cy0+cGt0cyA+IFNZU0FE
UFRfQU1QRFVfUEFDS0VUX1RIUkVTSE9MRCk7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfc2V0X29w
dGltaXphdGlvbl9sZXZlbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggb3B0X2xldmVsKQ0K
K3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnByaXY7DQorCXN0cnVjdCBob3N0Y21k
X2NtZF9zZXRfb3B0aW1pemF0aW9uX2xldmVsICpwY21kOw0KKw0KKwlwY21kID0gKHN0cnVjdCBo
b3N0Y21kX2NtZF9zZXRfb3B0aW1pemF0aW9uX2xldmVsICopJnByaXYtPnBjbWRfYnVmWzBdOw0K
Kw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwg
MHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYo
SE9TVENNRF9DTURfU0VUX09QVElNSVpBVElPTl9MRVZFTCk7DQorCXBjbWQtPmNtZF9oZHIubGVu
ID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPm9wdF9sZXZlbCA9IG9wdF9s
ZXZlbDsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9TRVRf
T1BUSU1JWkFUSU9OX0xFVkVMKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xv
Y2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJ
cmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2sp
Ow0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9zZXRfZHdkc19zdGFtb2Rl
KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGVuYWJsZSkNCit7DQorCXN0cnVjdCBtd2xf
cHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfZHdkc19lbmFibGUg
KnBjbWQ7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX2R3ZHNfZW5hYmxlICopJnBy
aXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0K
Kw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIu
Y21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfRFdEU19FTkFCTEUpOw0KKwlwY21kLT5jbWRf
aGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5lbmFibGUgPSBj
cHVfdG9fbGUzMihlbmFibGUpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhP
U1RDTURfQ01EX0RXRFNfRU5BQkxFKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21k
X2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0K
KwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xv
Y2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9zZXRfZndfZmx1c2hf
dGltZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB2YWx1ZSkNCit7DQorCXN0cnVjdCBt
d2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfZndfZmx1c2hf
dGltZXIgKnBjbWQ7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX2Z3X2ZsdXNoX3Rp
bWVyICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21k
X2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQt
PmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfRldfRkxVU0hfVElNRVIpOw0K
KwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21k
LT52YWx1ZSA9IGNwdV90b19sZTMyKHZhbHVlKTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2Nt
ZChwcml2LCBIT1NUQ01EX0NNRF9GV19GTFVTSF9USU1FUikpIHsNCisJCXNwaW5fdW5sb2NrX2Jo
KCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhl
Y3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZw
cml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRf
c2V0X2NkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAq
cHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X2NkZCAqcGNtZDsNCisN
CisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X2NkZCAqKSZwcml2LT5wY21kX2J1Zlsw
XTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBj
bWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19s
ZTE2KEhPU1RDTURfQ01EX1NFVF9DREQpOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19s
ZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5lbmFibGUgPSBjcHVfdG9fbGUzMihwcml2LT5j
ZGQpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX1NFVF9D
REQpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9l
cnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJ
fQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAw
Ow0KK30NCisNCitpbnQgbXdsX2Z3Y21kX3NlbmRfbWZnX2NtZChzdHJ1Y3QgbXdsX3ByaXYgKnBy
aXYsIGNoYXIgKm1mZ2NtZCkNCit7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciAqcGNtZDsNCisJ
c3RydWN0IGNtZF9oZWFkZXIgKmNtZF9oZCA9IChzdHJ1Y3QgY21kX2hlYWRlciAqKShtZmdjbWQg
KyA0KTsNCisJdTE2IGxlbjsNCisJdTE2IGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNt
ZF9oZWFkZXIgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+
ZndjbWRfbG9jayk7DQorDQorCWxlbiA9IGxlMTZfdG9fY3B1KGNtZF9oZC0+bGVuKTsNCisJbWVt
c2V0KHBjbWQsIDB4MDAsIGxlbiArIDQpOw0KKwltZW1jcHkoKGNoYXIgKilwY21kLCBtZmdjbWQs
IGxlbiArIDQpOw0KKwljbWQgPSBsZTE2X3RvX2NwdShjbWRfaGQtPmNvbW1hbmQpOw0KKwlpZiAo
bXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIGNtZCkpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2
LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJmYWlsZWQgZXhl
Y3V0aW9uIik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKwljbWRfaGQgPSAoc3RydWN0IGNtZF9o
ZWFkZXIgKikmcHJpdi0+cGNtZF9idWZbMl07DQorCWxlbiA9IGxlMTZfdG9fY3B1KGNtZF9oZC0+
bGVuKTsNCisJbWVtY3B5KG1mZ2NtZCwgKGNoYXIgKikmcHJpdi0+cGNtZF9idWZbMl0sIGxlbik7
DQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQor
fQ0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9md2Nt
ZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2Z3Y21kLmgNCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi43MjZiMTY5DQotLS0gL2Rldi9udWxsDQor
KysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvZndjbWQuaA0KQEAgLTAs
MCArMSwxOTggQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDE1LCBNYXJ2ZWxsIElu
dGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUi
KSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwNCisgKiBMdGQuIHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBK
dW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0cmlidXRl
IGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICogYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJt
cyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdoaWNoDQorICogaXMg
YXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
Lg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFO
VFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorICogQVJFIEVY
UFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRh
aWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0KKyAqLw0KKw0KKy8qIERl
c2NyaXB0aW9uOiAgVGhpcyBmaWxlIGRlZmluZXMgZmlybXdhcmUgaG9zdCBjb21tYW5kIHJlbGF0
ZWQNCisgKiBmdW5jdGlvbnMuDQorICovDQorDQorI2lmbmRlZiBfZndjbWRfaF8NCisjZGVmaW5l
IF9md2NtZF9oXw0KKw0KKy8qICBEZWZpbmUgT3BNb2RlIGZvciBTb2Z0QVAvU3RhdGlvbiBtb2Rl
DQorICoNCisgKiAgVGhlIGZvbGxvd2luZyBtb2RlIHNpZ25hdHVyZSBoYXMgdG8gYmUgd3JpdHRl
biB0byBQQ0kgc2NyYXRjaCByZWdpc3RlciMwDQorICogIHJpZ2h0IGFmdGVyIHN1Y2Nlc3NmdWxs
eSBkb3dubG9hZGluZyB0aGUgbGFzdCBibG9jayBvZiBmaXJtd2FyZSBhbmQNCisgKiAgYmVmb3Jl
IHdhaXRpbmcgZm9yIGZpcm13YXJlIHJlYWR5IHNpZ25hdHVyZQ0KKyAqLw0KKw0KKyNkZWZpbmUg
SE9TVENNRF9TVEFfTU9ERSAgICAgICAgICAgICAgICAweDVBDQorI2RlZmluZSBIT1NUQ01EX1NP
RlRBUF9NT0RFICAgICAgICAgICAgIDB4QTUNCisNCisjZGVmaW5lIEhPU1RDTURfU1RBX0ZXUkRZ
X1NJR05BVFVSRSAgICAgMHhGMEYxRjJGNA0KKyNkZWZpbmUgSE9TVENNRF9TT0ZUQVBfRldSRFlf
U0lHTkFUVVJFICAweEYxRjJGNEE1DQorDQorI2RlZmluZSBHVUFSRF9JTlRFUlZBTF9TVEFOREFS
RCAgICAgICAgIDENCisjZGVmaW5lIEdVQVJEX0lOVEVSVkFMX1NIT1JUICAgICAgICAgICAgMg0K
KyNkZWZpbmUgR1VBUkRfSU5URVJWQUxfQVVUTyAgICAgICAgICAgICAzDQorDQorI2RlZmluZQlM
SU5LX0NTX1NUQVRFX0NPTlNFUlYgICAgICAgICAgIDANCisjZGVmaW5lCUxJTktfQ1NfU1RBVEVf
QUdHUiAgICAgICAgICAgICAgMQ0KKyNkZWZpbmUJTElOS19DU19TVEFURV9BVVRPICAgICAgICAg
ICAgICAyDQorI2RlZmluZQlMSU5LX0NTX1NUQVRFX0FVVE9fRElTQUJMRUQgICAgIDMNCisNCitl
bnVtIHsNCisJV0xfQU5URU5OQVRZUEVfUlggPSAxLA0KKwlXTF9BTlRFTk5BVFlQRV9UWCA9IDIs
DQorfTsNCisNCitlbnVtIGVuY3JfdHlwZSB7DQorCUVOQ1JfVFlQRV9XRVAgPSAwLA0KKwlFTkNS
X1RZUEVfRElTQUJMRSA9IDEsDQorCUVOQ1JfVFlQRV9US0lQID0gNCwNCisJRU5DUl9UWVBFX0FF
UyA9IDYsDQorCUVOQ1JfVFlQRV9NSVggPSA3LA0KK307DQorDQordm9pZCBtd2xfZndjbWRfcmVz
ZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOw0KKw0KK3ZvaWQgbXdsX2Z3Y21kX2ludF9lbmFi
bGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOw0KKw0KK3ZvaWQgbXdsX2Z3Y21kX2ludF9kaXNh
YmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsNCisNCitpbnQgbXdsX2Z3Y21kX2dldF9od19z
cGVjcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7DQorDQoraW50IG13bF9md2NtZF9zZXRfaHdf
c3BlY3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOw0KKw0KK2ludCBtd2xfZndjbWRfZ2V0X3N0
YXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9s
b3dfbGV2ZWxfc3RhdHMgKnN0YXRzKTsNCisNCitpbnQgbXdsX2Z3Y21kX3JhZGlvX2VuYWJsZShz
dHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7DQorDQoraW50IG13bF9md2NtZF9yYWRpb19kaXNhYmxl
KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsNCisNCitpbnQgbXdsX2Z3Y21kX3NldF9yYWRpb19w
cmVhbWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJIGJvb2wgc2hvcnRfcHJlYW1i
bGUpOw0KKw0KK2ludCBtd2xfZndjbWRfZ2V0X2FkZHJfdmFsdWUoc3RydWN0IGllZWU4MDIxMV9o
dyAqaHcsIHUzMiBhZGRyLCB1MzIgbGVuLA0KKwkJCSAgICAgdTMyICp2YWwsIHUxNiBzZXQpOw0K
Kw0KK2ludCBtd2xfZndjbWRfbWF4X3R4X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0K
KwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwgdTggZnJhY3Rpb24pOw0KKw0KK2lu
dCBtd2xfZndjbWRfdHhfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkgICAgICAg
c3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLCB1OCBmcmFjdGlvbik7DQorDQoraW50IG13bF9m
d2NtZF9yZl9hbnRlbm5hKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgZGlyLCBpbnQgYW50
ZW5uYSk7DQorDQoraW50IG13bF9md2NtZF9icm9hZGNhc3Rfc3NpZF9lbmFibGUoc3RydWN0IGll
ZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29s
IGVuYWJsZSk7DQorDQoraW50IG13bF9md2NtZF9zZXRfcmZfY2hhbm5lbChzdHJ1Y3QgaWVlZTgw
MjExX2h3ICpodywNCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZik7DQorDQor
aW50IG13bF9md2NtZF9zZXRfYWlkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJICAgICAg
c3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTggKmJzc2lkLCB1MTYgYWlkKTsNCisNCitpbnQg
bXdsX2Z3Y21kX3NldF9pbmZyYV9tb2RlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAg
ICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7DQorDQoraW50IG13bF9md2NtZF9zZXRfcnRz
X3RocmVzaG9sZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJaW50IHRocmVzaG9sZCk7
DQorDQoraW50IG13bF9md2NtZF9zZXRfZWRjYV9wYXJhbXMoc3RydWN0IGllZWU4MDIxMV9odyAq
aHcsIHU4IGluZGV4LA0KKwkJCSAgICAgIHUxNiBjd19taW4sIHUxNiBjd19tYXgsIHU4IGFpZnMs
IHUxNiB0eG9wKTsNCisNCitpbnQgbXdsX2Z3Y21kX3NldF93bW1fbW9kZShzdHJ1Y3QgaWVlZTgw
MjExX2h3ICpodywgYm9vbCBlbmFibGUpOw0KKw0KK2ludCBtd2xfZndjbWRfaHRfZ3VhcmRfaW50
ZXJ2YWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBnaV90eXBlKTsNCisNCitpbnQgbXds
X2Z3Y21kX3VzZV9maXhlZF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAgICAg
aW50IG1jYXN0LCBpbnQgbWdtdCk7DQorDQoraW50IG13bF9md2NtZF9zZXRfbGlua2FkYXB0X2Nz
X21vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgICB1MTYgY3NfbW9kZSk7DQor
DQoraW50IG13bF9md2NtZF9zZXRfcmF0ZV9hZGFwdF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfaHcg
Kmh3LA0KKwkJCQkgIHUxNiBtb2RlKTsNCisNCitpbnQgbXdsX2Z3Y21kX3NldF9tYWNfYWRkcl9j
bGllbnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgc3RydWN0IGllZWU4MDIxMV92
aWYgKnZpZiwgdTggKm1hY19hZGRyKTsNCisNCitpbnQgbXdsX2Z3Y21kX2dldF93YXRjaGRvZ19i
aXRtYXAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgdTggKmJpdG1hcCk7DQorDQor
aW50IG13bF9md2NtZF9yZW1vdmVfbWFjX2FkZHIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQor
CQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTggKm1hY19hZGRyKTsNCisNCitp
bnQgbXdsX2Z3Y21kX2Jzc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQlzdHJ1
Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29sIGVuYWJsZSk7DQorDQoraW50IG13bF9md2NtZF9z
ZXRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSBzdHJ1Y3QgaWVlZTgwMjEx
X3ZpZiAqdmlmLCB1OCAqYmVhY29uLCBpbnQgbGVuKTsNCisNCitpbnQgbXdsX2Z3Y21kX3NldF9u
ZXdfc3RuX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkgICAgICBzdHJ1Y3QgaWVl
ZTgwMjExX3ZpZiAqdmlmLA0KKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOw0K
Kw0KK2ludCBtd2xfZndjbWRfc2V0X25ld19zdG5fYWRkX3NlbGYoc3RydWN0IGllZWU4MDIxMV9o
dyAqaHcsDQorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOw0KKw0KK2ludCBtd2xf
ZndjbWRfc2V0X25ld19zdG5fZGVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAgICAg
IHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHU4ICphZGRyKTsNCisNCitpbnQgbXdsX2Z3Y21k
X3NldF9hcG1vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGFwbW9kZSk7DQorDQoraW50
IG13bF9md2NtZF91cGRhdGVfZW5jcnlwdGlvbl9lbmFibGUoc3RydWN0IGllZWU4MDIxMV9odyAq
aHcsDQorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCQkgICAgICAg
dTggKmFkZHIsIHU4IGVuY3JfdHlwZSk7DQorDQoraW50IG13bF9md2NtZF9lbmNyeXB0aW9uX3Nl
dF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3Zp
ZiAqdmlmLCB1OCAqYWRkciwNCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7
DQorDQoraW50IG13bF9md2NtZF9lbmNyeXB0aW9uX3JlbW92ZV9rZXkoc3RydWN0IGllZWU4MDIx
MV9odyAqaHcsDQorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1OCAqYWRkciwN
CisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7DQorDQoraW50IG13bF9m
d2NtZF9jaGVja19iYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCSAgICAgICBzdHJ1Y3Qg
bXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtLA0KKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlm
ICp2aWYpOw0KKw0KK2ludCBtd2xfZndjbWRfY3JlYXRlX2JhKHN0cnVjdCBpZWVlODAyMTFfaHcg
Kmh3LA0KKwkJCXN0cnVjdCBtd2xfYW1wZHVfc3RyZWFtICpzdHJlYW0sDQorCQkJdTggYnVmX3Np
emUsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOw0KKw0KK2ludCBtd2xfZndjbWRfZGVzdHJv
eV9iYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkgdTggaWR4KTsNCisNCitzdHJ1Y3Qg
bXdsX2FtcGR1X3N0cmVhbSAqbXdsX2Z3Y21kX2FkZF9zdHJlYW0oc3RydWN0IGllZWU4MDIxMV9o
dyAqaHcsDQorCQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLA0KKwkJCQkJICAg
ICAgdTggdGlkKTsNCisNCit2b2lkIG13bF9md2NtZF9kZWxfc3RhX3N0cmVhbXMoc3RydWN0IGll
ZWU4MDIxMV9odyAqaHcsDQorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOw0K
Kw0KK2ludCBtd2xfZndjbWRfc3RhcnRfc3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0K
KwkJCSAgIHN0cnVjdCBtd2xfYW1wZHVfc3RyZWFtICpzdHJlYW0pOw0KKw0KK3ZvaWQgbXdsX2Z3
Y21kX3JlbW92ZV9zdHJlYW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJICAgICBzdHJ1
Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtKTsNCisNCitzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVh
bSAqbXdsX2Z3Y21kX2xvb2t1cF9zdHJlYW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJ
CQkJIHU4ICphZGRyLCB1OCB0aWQpOw0KKw0KK2Jvb2wgbXdsX2Z3Y21kX2FtcGR1X2FsbG93ZWQo
c3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggdGlkKTsNCisNCitpbnQgbXdsX2Z3Y21kX3Nl
dF9vcHRpbWl6YXRpb25fbGV2ZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IG9wdF9sZXZl
bCk7DQorDQoraW50IG13bF9md2NtZF9zZXRfZHdkc19zdGFtb2RlKHN0cnVjdCBpZWVlODAyMTFf
aHcgKmh3LCBib29sIGVuYWJsZSk7DQorDQoraW50IG13bF9md2NtZF9zZXRfZndfZmx1c2hfdGlt
ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB2YWx1ZSk7DQorDQoraW50IG13bF9md2Nt
ZF9zZXRfY2RkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsNCisNCitpbnQgbXdsX2Z3Y21kX3Nl
bmRfbWZnX2NtZChzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIGNoYXIgKm1mZ2NtZCk7DQorDQorI2Vu
ZGlmIC8qIF9md2NtZF9oXyAqLw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21h
cnZlbGwvbXdsd2lmaS9md2RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdp
ZmkvZndkbC5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uZWM0NGFhNA0K
LS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZp
L2Z3ZGwuYw0KQEAgLTAsMCArMSwxOTkgQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0y
MDE1LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBm
aWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwN
CisgKiBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgVmVyc2lvbiAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVz
ZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICogYWNjb3JkYW5j
ZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9m
IHdoaWNoDQorICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMs
IFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFDQorICogQVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMg
YWRkaXRpb25hbCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0K
KyAqLw0KKw0KKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGltcGxlbWVudHMgZmlybXdhcmUg
ZG93bmxvYWQgcmVsYXRlZA0KKyAqIGZ1bmN0aW9ucy4NCisgKi8NCisNCisjaW5jbHVkZSA8bGlu
dXgvaW8uaD4NCisNCisjaW5jbHVkZSAic3lzYWRwdC5oIg0KKyNpbmNsdWRlICJkZXYuaCINCisj
aW5jbHVkZSAiZndjbWQuaCINCisjaWZkZWYgQ09ORklHX1NVUFBPUlRfTUZHDQorI2luY2x1ZGUg
Im1mZy5oIg0KKyNlbmRpZg0KKyNpbmNsdWRlICJmd2RsLmgiDQorDQorI2RlZmluZSBGV19ET1dO
TE9BRF9CTE9DS19TSVpFICAgICAgICAgIDI1Ng0KKyNkZWZpbmUgRldfQ0hFQ0tfTVNFQ1MgICAg
ICAgICAgICAgICAgICAzDQorDQorI2RlZmluZSBGV19NQVhfTlVNX0NIRUNLUyAgICAgICAgICAg
ICAgIDB4ZmZmZg0KKw0KK3N0YXRpYyB2b2lkIG13bF9md2RsX3RyaWdfcGNpY21kKHN0cnVjdCBt
d2xfcHJpdiAqcHJpdikNCit7DQorCXdyaXRlbChwcml2LT5wcGh5c19jbWRfYnVmLCBwcml2LT5p
b2Jhc2UxICsgTUFDUkVHX1JFR19HRU5fUFRSKTsNCisNCisJd3JpdGVsKDB4MDAsIHByaXYtPmlv
YmFzZTEgKyBNQUNSRUdfUkVHX0lOVF9DT0RFKTsNCisNCisJd3JpdGVsKE1BQ1JFR19IMkFSSUNf
QklUX0RPT1JfQkVMTCwNCisJICAgICAgIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0gyQV9J
TlRFUlJVUFRfRVZFTlRTKTsNCit9DQorDQorc3RhdGljIHZvaWQgbXdsX2Z3ZGxfdHJpZ19wY2lj
bWRfYm9vdGNvZGUoc3RydWN0IG13bF9wcml2ICpwcml2KQ0KK3sNCisJd3JpdGVsKHByaXYtPnBw
aHlzX2NtZF9idWYsIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0dFTl9QVFIpOw0KKw0KKwl3
cml0ZWwoMHgwMCwgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfSU5UX0NPREUpOw0KKw0KKwl3
cml0ZWwoTUFDUkVHX0gyQVJJQ19CSVRfRE9PUl9CRUxMLA0KKwkgICAgICAgcHJpdi0+aW9iYXNl
MSArIE1BQ1JFR19SRUdfSDJBX0lOVEVSUlVQVF9FVkVOVFMpOw0KK30NCisNCitpbnQgbXdsX2Z3
ZGxfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpDQorew0KKwlzdHJ1
Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpm
dzsNCisJdTMyIGN1cnJfaXRlcmF0aW9uID0gMDsNCisJdTMyIHNpemVfZndfZG93bmxvYWRlZCA9
IDA7DQorCXUzMiBpbnRfY29kZSA9IDA7DQorCXUzMiBsZW4gPSAwOw0KKyNpZmRlZiBDT05GSUdf
U1VQUE9SVF9NRkcNCisJdTMyIGZ3cmVhZHlzaWduYXR1cmUgPSBwcml2LT5tZmdfbW9kZSA/DQor
CQlNRkdfRldfUkVBRFlfU0lHTkFUVVJFIDogSE9TVENNRF9TT0ZUQVBfRldSRFlfU0lHTkFUVVJF
Ow0KKyNlbHNlDQorCXUzMiBmd3JlYWR5c2lnbmF0dXJlID0gSE9TVENNRF9TT0ZUQVBfRldSRFlf
U0lHTkFUVVJFOw0KKyNlbmRpZg0KKw0KKwlmdyA9IHByaXYtPmZ3X3Vjb2RlOw0KKw0KKwltd2xf
ZndjbWRfcmVzZXQoaHcpOw0KKw0KKwkvKiBGVyBiZWZvcmUganVtcGluZyB0byBib290IHJvbSwg
aXQgd2lsbCBlbmFibGUgUENJZSB0cmFuc2FjdGlvbiByZXRyeSwNCisJICogd2FpdCBmb3IgYm9v
dCBjb2RlIHRvIHN0b3AgaXQuDQorCSAqLw0KKwltZGVsYXkoRldfQ0hFQ0tfTVNFQ1MpOw0KKw0K
Kwl3cml0ZWwoTUFDUkVHX0EySFJJQ19CSVRfTUFTSywNCisJICAgICAgIHByaXYtPmlvYmFzZTEg
KyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfQ0xFQVJfU0VMKTsNCisJd3JpdGVsKDB4MDAsIHBy
aXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfQ0FVU0UpOw0KKwl3cml0ZWwo
MHgwMCwgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfQTJIX0lOVEVSUlVQVF9NQVNLKTsNCisJ
d3JpdGVsKE1BQ1JFR19BMkhSSUNfQklUX01BU0ssDQorCSAgICAgICBwcml2LT5pb2Jhc2UxICsg
TUFDUkVHX1JFR19BMkhfSU5URVJSVVBUX1NUQVRVU19NQVNLKTsNCisNCisJLyogdGhpcyByb3V0
aW5lIGludGVyYWN0cyB3aXRoIFNDMiBib290cm9tIHRvIGRvd25sb2FkIGZpcm13YXJlIGJpbmFy
eQ0KKwkgKiB0byB0aGUgZGV2aWNlLiBBZnRlciBETUEnZCB0byBTQzIsIHRoZSBmaXJtd2FyZSBj
b3VsZCBiZSBkZWZsYXRlZCB0bw0KKwkgKiByZXNpZGUgb24gaXRzIHJlc3BlY3RpdmUgYmxvY2tz
IHN1Y2ggYXMgSVRDTSwgRFRDTSwgU1FSQU0sDQorCSAqIChvciBldmVuIEREUiwgQUZURVIgRERS
IGlzIGluaXQnZCBiZWZvcmUgZncgZG93bmxvYWQNCisJICovDQorCXdpcGh5X2luZm8oaHctPndp
cGh5LCAiZncgZG93bmxvYWQgc3RhcnQgODhcbiIpOw0KKw0KKwkvKiBEaXNhYmxlIFBGVSBiZWZv
cmUgRldETCAqLw0KKwl3cml0ZWwoMHgxMDAsIHByaXYtPmlvYmFzZTEgKyAweEUwRTQpOw0KKw0K
KwkvKiBtYWtlIHN1cmUgU0NSQVRDSDIgQzQwIGlzIGNsZWFyLCBpbiBjYXNlIHdlIGFyZSB0b28g
cXVpY2sgKi8NCisJd2hpbGUgKHJlYWRsKHByaXYtPmlvYmFzZTEgKyAweGM0MCkgPT0gMCkNCisJ
CTsNCisNCisJd2hpbGUgKHNpemVfZndfZG93bmxvYWRlZCA8IGZ3LT5zaXplKSB7DQorCQlsZW4g
PSByZWFkbChwcml2LT5pb2Jhc2UxICsgMHhjNDApOw0KKw0KKwkJaWYgKCFsZW4pDQorCQkJYnJl
YWs7DQorDQorCQkvKiB0aGlzIGNvcGllcyB0aGUgbmV4dCBjaHVuayBvZiBmdyBiaW5hcnkgdG8g
YmUgZGVsaXZlcmVkICovDQorCQltZW1jcHkoKGNoYXIgKikmcHJpdi0+cGNtZF9idWZbMF0sDQor
CQkgICAgICAgKGZ3LT5kYXRhICsgc2l6ZV9md19kb3dubG9hZGVkKSwgbGVuKTsNCisNCisJCS8q
IHRoaXMgZnVuY3Rpb24gd3JpdGVzIHBkYXRhIHRvIGMxMCwgdGhlbiB3cml0ZSAyIHRvIGMxOCAq
Lw0KKwkJbXdsX2Z3ZGxfdHJpZ19wY2ljbWRfYm9vdGNvZGUocHJpdik7DQorDQorCQkvKiB0aGlz
IGlzIGFyYml0cmFyeSBwZXIgeW91ciBwbGF0Zm9ybTsgd2UgdXNlIDB4ZmZmZiAqLw0KKwkJY3Vy
cl9pdGVyYXRpb24gPSBGV19NQVhfTlVNX0NIRUNLUzsNCisNCisJCS8qIE5PVEU6IHRoZSBmb2xs
b3dpbmcgYmFjayB0byBiYWNrIGNoZWNrcyBvbiBDMUMgaXMgdGltZQ0KKwkJICogc2Vuc2l0aXZl
LCBoZW5jZSBtYXkgbmVlZCB0byBiZSB0d2Vha2VkIGRlcGVuZGVudCBvbiBob3N0DQorCQkgKiBw
cm9jZXNzb3IuIFRpbWUgZm9yIFNDMiB0byBnbyBmcm9tIHRoZSB3cml0ZSBvZiBldmVudCAyIHRv
DQorCQkgKiBDMUMgPT0gMiBpcyB+MTMwMCBuU2VjLiBIZW5jZSB0aGUgY2hlY2tpbmdzIG9uIGhv
c3QgaGFzIHRvDQorCQkgKiBjb25zaWRlciBob3cgZWZmaWNpZW50IHlvdXIgY29kZSBjYW4gYmUg
dG8gbWVldCB0aGlzIHRpbWluZywNCisJCSAqIG9yIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSB0d2Vh
ayB0aGlzIHJvdXRpbmVzIHRvIGZpdCB5b3VyDQorCQkgKiBwbGF0Zm9ybQ0KKwkJICovDQorCQlk
byB7DQorCQkJaW50X2NvZGUgPSByZWFkbChwcml2LT5pb2Jhc2UxICsgMHhjMWMpOw0KKwkJCWlm
IChpbnRfY29kZSAhPSAwKQ0KKwkJCQlicmVhazsNCisJCQljdXJyX2l0ZXJhdGlvbi0tOw0KKwkJ
fSB3aGlsZSAoY3Vycl9pdGVyYXRpb24pOw0KKw0KKwkJZG8gew0KKwkJCWludF9jb2RlID0gcmVh
ZGwocHJpdi0+aW9iYXNlMSArIDB4YzFjKTsNCisJCQlpZiAoKGludF9jb2RlICYgTUFDUkVHX0gy
QVJJQ19CSVRfRE9PUl9CRUxMKSAhPQ0KKwkJCSAgICBNQUNSRUdfSDJBUklDX0JJVF9ET09SX0JF
TEwpDQorCQkJCWJyZWFrOw0KKwkJCWN1cnJfaXRlcmF0aW9uLS07DQorCQl9IHdoaWxlIChjdXJy
X2l0ZXJhdGlvbik7DQorDQorCQlpZiAoY3Vycl9pdGVyYXRpb24gPT0gMCkgew0KKwkJCS8qIFRo
aXMgbGltaXRlZCBsb29wIGNoZWNrIGFsbG93cyB5b3UgdG8gZXhpdCBncmFjZWZ1bGx5DQorCQkJ
ICogd2l0aG91dCBsb2NraW5nIHVwIHlvdXIgZW50aXJlIHN5c3RlbSBqdXN0IGJlY2F1c2UgZncN
CisJCQkgKiBkb3dubG9hZCBmYWlsZWQNCisJCQkgKi8NCisJCQl3aXBoeV9lcnIoaHctPndpcGh5
LA0KKwkJCQkgICJFeGhhdXN0ZWQgY3Vycl9pdGVyYXRpb24gZm9yIGZ3IGRvd25sb2FkXG4iKTsN
CisJCQlnb3RvIGVycl9kb3dubG9hZDsNCisJCX0NCisNCisJCXNpemVfZndfZG93bmxvYWRlZCAr
PSBsZW47DQorCX0NCisNCisJd2lwaHlfaW5mbyhody0+d2lwaHksDQorCQkgICAiRndTaXplID0g
JWQgZG93bmxvYWRlZCBTaXplID0gJWQgY3Vycl9pdGVyYXRpb24gJWRcbiIsDQorCQkgICAoaW50
KWZ3LT5zaXplLCBzaXplX2Z3X2Rvd25sb2FkZWQsIGN1cnJfaXRlcmF0aW9uKTsNCisNCisJLyog
Tm93IGZpcndhcmUgaXMgZG93bmxvYWRlZCBzdWNjZXNzZnVsbHksIHNvIHRoaXMgcGFydCBpcyB0
byBjaGVjaw0KKwkgKiB3aGV0aGVyIGZ3IGNhbiBwcm9wZXJseSBleGVjdXRlIHRvIGFuIGV4dGVu
dCB0aGF0IHdyaXRlIGJhY2sNCisJICogc2lnbmF0dXJlIHRvIGluZGljYXRlIGl0cyByZWFkaW5l
c3MgdG8gdGhlIGhvc3QuIE5PVEU6IGlmIHlvdXINCisJICogZG93bmxvYWRlZCBmdyBjcmFzaGVz
LCB0aGlzIHNpZ25hdHVyZSBjaGVja2luZyB3aWxsIGZhaWwuIFRoaXMNCisJICogcGFydCBpcyBz
aW1pbGFyIGFzIFNDMQ0KKwkgKi8NCisJKigodTMyICopJnByaXYtPnBjbWRfYnVmWzFdKSA9IDA7
DQorCW13bF9md2RsX3RyaWdfcGNpY21kKHByaXYpOw0KKwljdXJyX2l0ZXJhdGlvbiA9IEZXX01B
WF9OVU1fQ0hFQ0tTOw0KKwlpZiAocHJpdi0+bWZnX21vZGUpDQorCQl3cml0ZWwoZndyZWFkeXNp
Z25hdHVyZSwgcHJpdi0+aW9iYXNlMSArIDB4Y2YwKTsNCisJZG8gew0KKwkJY3Vycl9pdGVyYXRp
b24tLTsNCisJCWlmICghcHJpdi0+bWZnX21vZGUpIHsNCisJCQl3cml0ZWwoSE9TVENNRF9TT0ZU
QVBfTU9ERSwNCisJCQkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfR0VOX1BUUik7
DQorCQkJbWRlbGF5KEZXX0NIRUNLX01TRUNTKTsNCisJCQlpbnRfY29kZSA9IHJlYWRsKHByaXYt
PmlvYmFzZTEgKyBNQUNSRUdfUkVHX0lOVF9DT0RFKTsNCisJCX0gZWxzZSB7DQorCQkJbWRlbGF5
KEZXX0NIRUNLX01TRUNTKTsNCisJCQlpbnRfY29kZSA9IHJlYWRsKHByaXYtPmlvYmFzZTEgKyAw
eGM0NCk7DQorCQl9DQorCQlpZiAoIShjdXJyX2l0ZXJhdGlvbiAlIDB4ZmYpKQ0KKwkJCXdpcGh5
X2Vycihody0+d2lwaHksICIleDsiLCBpbnRfY29kZSk7DQorCX0gd2hpbGUgKChjdXJyX2l0ZXJh
dGlvbikgJiYNCisJCSAoaW50X2NvZGUgIT0gZndyZWFkeXNpZ25hdHVyZSkpOw0KKw0KKwlpZiAo
Y3Vycl9pdGVyYXRpb24gPT0gMCkgew0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwNCisJCQkgICJF
eGhhdXN0ZWQgY3Vycl9pdGVyYXRpb24gZm9yIGZ3IHNpZ25hdHVyZVxuIik7DQorCQlnb3RvIGVy
cl9kb3dubG9hZDsNCisJfQ0KKw0KKwl3aXBoeV9pbmZvKGh3LT53aXBoeSwgImNvbXBsZXRlXG4i
KTsNCisJd3JpdGVsKDB4MDAsIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0lOVF9DT0RFKTsN
CisNCisJcmV0dXJuIDA7DQorDQorZXJyX2Rvd25sb2FkOg0KKw0KKwltd2xfZndjbWRfcmVzZXQo
aHcpOw0KKw0KKwlyZXR1cm4gLUVJTzsNCit9DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ly
ZWxlc3MvbWFydmVsbC9td2x3aWZpL2Z3ZGwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl
bGwvbXdsd2lmaS9md2RsLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi5i
MTE3MTQyDQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxs
L213bHdpZmkvZndkbC5oDQpAQCAtMCwwICsxLDI1IEBADQorLyoNCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYtMjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4NCisgKg0KKyAqIFRoaXMgc29m
dHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCBJbnRlcm5h
dGlvbmFsDQorICogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxDQorICogKHRoZSAiTGljZW5zZSIpLiAgWW91
IG1heSB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSBpbg0KKyAqIGFj
Y29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2UsIGEg
Y29weSBvZiB3aGljaA0KKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqIFRIRSBGSUxFIElTIERJU1RSSUJVVEVE
IEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFDQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRQ0KKyAqIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1FRC4gIFRoZSBMaWNlbnNlIHBy
b3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dA0KKyAqIHRoaXMgd2FycmFudHkgZGlzY2xh
aW1lci4NCisgKi8NCisNCisvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBkZWZpbmVzIGZpcm13
YXJlIGRvd25sb2FkIHJlbGF0ZWQNCisgKiBmdW5jdGlvbnMuDQorICovDQorDQorI2lmbmRlZiBf
ZndkbF9oXw0KKyNkZWZpbmUgX2Z3ZGxfaF8NCisNCitpbnQgbXdsX2Z3ZGxfZG93bmxvYWRfZmly
bXdhcmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOw0KKw0KKyNlbmRpZiAvKiBfZndkbF9oXyAq
Lw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9ob3N0
Y21kLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvaG9zdGNtZC5oDQpu
ZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uMWZkNGJkZg0KLS0tIC9kZXYvbnVs
bA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2hvc3RjbWQuaA0K
QEAgLTAsMCArMSw3ODYgQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDE1LCBNYXJ2
ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUg
IkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwNCisgKiBMdGQu
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lv
biAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0
cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICogYWNjb3JkYW5jZSB3aXRoIHRo
ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdoaWNoDQor
ICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQg
V0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorICog
QVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25h
bCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0KKyAqLw0KKw0K
Ky8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGRlZmluZXMgZmlybXdhcmUgaG9zdCBjb21tYW5k
IHJlbGF0ZWQNCisgKiBzdHJ1Y3R1cmUuDQorICovDQorDQorI2lmbmRlZiBfaG9zdGNtZF9oXw0K
KyNkZWZpbmUgX2hvc3RjbWRfaF8NCisNCisvKiAxNiBiaXQgaG9zdCBjb21tYW5kIGNvZGUgKi8N
CisjZGVmaW5lIEhPU1RDTURfQ01EX0dFVF9IV19TUEVDICAgICAgICAgICAgICAgICAweDAwMDMN
CisjZGVmaW5lIEhPU1RDTURfQ01EX1NFVF9IV19TUEVDICAgICAgICAgICAgICAgICAweDAwMDQN
CisjZGVmaW5lIEhPU1RDTURfQ01EXzgwMl8xMV9HRVRfU1RBVCAgICAgICAgICAgICAweDAwMTQN
CisjZGVmaW5lIEhPU1RDTURfQ01EXzgwMl8xMV9SQURJT19DT05UUk9MICAgICAgICAweDAwMWMN
CisjZGVmaW5lIEhPU1RDTURfQ01EX01FTV9BRERSX0FDQ0VTUyAgICAgICAgICAgICAweDAwMWQN
CisjZGVmaW5lIEhPU1RDTURfQ01EXzgwMl8xMV9UWF9QT1dFUiAgICAgICAgICAgICAweDAwMWYN
CisjZGVmaW5lIEhPU1RDTURfQ01EXzgwMl8xMV9SRl9BTlRFTk5BICAgICAgICAgICAweDAwMjAN
CisjZGVmaW5lIEhPU1RDTURfQ01EX0JST0FEQ0FTVF9TU0lEX0VOQUJMRSAgICAgICAweDAwNTAg
LyogcGVyLXZpZiAqLw0KKyNkZWZpbmUgSE9TVENNRF9DTURfU0VUX1JGX0NIQU5ORUwgICAgICAg
ICAgICAgIDB4MDEwYQ0KKyNkZWZpbmUgSE9TVENNRF9DTURfU0VUX0FJRCAgICAgICAgICAgICAg
ICAgICAgIDB4MDEwZCAvKiBwZXItdmlmICovDQorI2RlZmluZSBIT1NUQ01EX0NNRF9TRVRfSU5G
UkFfTU9ERSAgICAgICAgICAgICAgMHgwMTBlIC8qIHBlci12aWYgKi8NCisjZGVmaW5lIEhPU1RD
TURfQ01EXzgwMl8xMV9SVFNfVEhTRCAgICAgICAgICAgICAweDAxMTMNCisjZGVmaW5lIEhPU1RD
TURfQ01EX1NFVF9FRENBX1BBUkFNUyAgICAgICAgICAgICAweDAxMTUNCisjZGVmaW5lIEhPU1RD
TURfQ01EX1NFVF9XTU1fTU9ERSAgICAgICAgICAgICAgICAweDAxMjMNCisjZGVmaW5lIEhPU1RD
TURfQ01EX0hUX0dVQVJEX0lOVEVSVkFMICAgICAgICAgICAweDAxMjQNCisjZGVmaW5lIEhPU1RD
TURfQ01EX1NFVF9GSVhFRF9SQVRFICAgICAgICAgICAgICAweDAxMjYNCisjZGVmaW5lIEhPU1RD
TURfQ01EX1NFVF9JRVMgICAgICAgICAgICAgICAgICAgICAweDAxMjcNCisjZGVmaW5lIEhPU1RD
TURfQ01EX1NFVF9MSU5LQURBUFRfQ1NfTU9ERSAgICAgICAweDAxMjkNCisjZGVmaW5lIEhPU1RD
TURfQ01EX1NFVF9NQUNfQUREUiAgICAgICAgICAgICAgICAweDAyMDIgLyogcGVyLXZpZiAqLw0K
KyNkZWZpbmUgSE9TVENNRF9DTURfU0VUX1JBVEVfQURBUFRfTU9ERSAgICAgICAgIDB4MDIwMw0K
KyNkZWZpbmUgSE9TVENNRF9DTURfR0VUX1dBVENIRE9HX0JJVE1BUCAgICAgICAgIDB4MDIwNQ0K
KyNkZWZpbmUgSE9TVENNRF9DTURfREVMX01BQ19BRERSICAgICAgICAgICAgICAgIDB4MDIwNiAv
KiBwZXItdmlmICovDQorI2RlZmluZSBIT1NUQ01EX0NNRF9CU1NfU1RBUlQgICAgICAgICAgICAg
ICAgICAgMHgxMTAwIC8qIHBlci12aWYgKi8NCisjZGVmaW5lIEhPU1RDTURfQ01EX0FQX0JFQUNP
TiAgICAgICAgICAgICAgICAgICAweDExMDEgLyogcGVyLXZpZiAqLw0KKyNkZWZpbmUgSE9TVENN
RF9DTURfU0VUX05FV19TVE4gICAgICAgICAgICAgICAgIDB4MTExMSAvKiBwZXItdmlmICovDQor
I2RlZmluZSBIT1NUQ01EX0NNRF9TRVRfQVBNT0RFICAgICAgICAgICAgICAgICAgMHgxMTE0DQor
I2RlZmluZSBIT1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElPTiAgICAgICAgICAgMHgxMTIyIC8q
IHBlci12aWYgKi8NCisjZGVmaW5lIEhPU1RDTURfQ01EX0JBU1RSRUFNICAgICAgICAgICAgICAg
ICAgICAweDExMjUNCisjZGVmaW5lIEhPU1RDTURfQ01EX1NFVF9PUFRJTUlaQVRJT05fTEVWRUwg
ICAgICAweDExMzMNCisjZGVmaW5lIEhPU1RDTURfQ01EX0RXRFNfRU5BQkxFICAgICAgICAgICAg
ICAgICAweDExNDQNCisjZGVmaW5lIEhPU1RDTURfQ01EX0ZXX0ZMVVNIX1RJTUVSICAgICAgICAg
ICAgICAweDExNDgNCisjZGVmaW5lIEhPU1RDTURfQ01EX1NFVF9DREQgICAgICAgICAgICAgICAg
ICAgICAweDExNTANCisNCisvKiBEZWZpbmUgZ2VuZXJhbCByZXN1bHQgY29kZSBmb3IgZWFjaCBj
b21tYW5kICovDQorI2RlZmluZSBIT1NUQ01EX1JFU1VMVF9PSyAgICAgICAgICAgICAgICAgICAg
ICAgMHgwMDAwDQorLyogR2VuZXJhbCBlcnJvciAqLw0KKyNkZWZpbmUgSE9TVENNRF9SRVNVTFRf
RVJST1IgICAgICAgICAgICAgICAgICAgIDB4MDAwMQ0KKy8qIENvbW1hbmQgaXMgbm90IHZhbGlk
ICovDQorI2RlZmluZSBIT1NUQ01EX1JFU1VMVF9OT1RfU1VQUE9SVCAgICAgICAgICAgICAgMHgw
MDAyDQorLyogQ29tbWFuZCBpcyBwZW5kaW5nICh3aWxsIGJlIHByb2Nlc3NlZCkgKi8NCisjZGVm
aW5lIEhPU1RDTURfUkVTVUxUX1BFTkRJTkcgICAgICAgICAgICAgICAgICAweDAwMDMNCisvKiBT
eXN0ZW0gaXMgYnVzeSAoY29tbWFuZCBpZ25vcmVkKSAqLw0KKyNkZWZpbmUgSE9TVENNRF9SRVNV
TFRfQlVTWSAgICAgICAgICAgICAgICAgICAgIDB4MDAwNA0KKy8qIERhdGEgYnVmZmVyIGlzIG5v
dCBiaWcgZW5vdWdoICovDQorI2RlZmluZSBIT1NUQ01EX1JFU1VMVF9QQVJUSUFMX0RBVEEgICAg
ICAgICAgICAgMHgwMDA1DQorDQorLyogRGVmaW5lIGNoYW5uZWwgcmVsYXRlZCBjb25zdGFudHMg
Ki8NCisjZGVmaW5lIEZSRVFfQkFORF8yRE9UNEdIWiAgICAgICAgICAgICAgICAgICAgICAweDEN
CisjZGVmaW5lIEZSRVFfQkFORF80RE9UOUdIWiAgICAgICAgICAgICAgICAgICAgICAweDINCisj
ZGVmaW5lIEZSRVFfQkFORF81R0haICAgICAgICAgICAgICAgICAgICAgICAgICAweDQNCisjZGVm
aW5lIEZSRVFfQkFORF81RE9UMkdIWiAgICAgICAgICAgICAgICAgICAgICAweDgNCisjZGVmaW5l
IENIX0FVVE9fV0lEVEgJICAgICAgICAgICAgICAgICAgICAgICAgMA0KKyNkZWZpbmUgQ0hfMTBf
TUhaX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQ0KKyNkZWZpbmUgQ0hfMjBfTUha
X1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDB4Mg0KKyNkZWZpbmUgQ0hfNDBfTUhaX1dJ
RFRIICAgICAgICAgICAgICAgICAgICAgICAgIDB4NA0KKyNkZWZpbmUgQ0hfODBfTUhaX1dJRFRI
ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQ0KKyNkZWZpbmUgRVhUX0NIX0FCT1ZFX0NUUkxf
Q0ggICAgICAgICAgICAgICAgICAgIDB4MQ0KKyNkZWZpbmUgRVhUX0NIX0FVVE8gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIDB4Mg0KKyNkZWZpbmUgRVhUX0NIX0JFTE9XX0NUUkxfQ0ggICAg
ICAgICAgICAgICAgICAgIDB4Mw0KKyNkZWZpbmUgTk9fRVhUX0NIQU5ORUwgICAgICAgICAgICAg
ICAgICAgICAgICAgIDB4MA0KKw0KKyNkZWZpbmUgQUNUX1BSSU1BUllfQ0hBTl8wICAgICAgICAg
ICAgICAgICAgICAgIDANCisjZGVmaW5lIEFDVF9QUklNQVJZX0NIQU5fMSAgICAgICAgICAgICAg
ICAgICAgICAxDQorI2RlZmluZSBBQ1RfUFJJTUFSWV9DSEFOXzIgICAgICAgICAgICAgICAgICAg
ICAgMg0KKyNkZWZpbmUgQUNUX1BSSU1BUllfQ0hBTl8zICAgICAgICAgICAgICAgICAgICAgIDMN
CisNCisvKiBEZWZpbmUgcmF0ZSByZWxhdGVkIGNvbnN0YW50cyAqLw0KKyNkZWZpbmUgSE9TVENN
RF9BQ1RfTk9UX1VTRV9GSVhFRF9SQVRFICAgICAgICAgIDB4MDAwMg0KKw0KKy8qIERlZmluZSBz
dGF0aW9uIHJlbGF0ZWQgY29uc3RhbnRzICovDQorI2RlZmluZSBIT1NUQ01EX0FDVF9TVEFfQUNU
SU9OX0FERCAgICAgICAgICAgICAgMA0KKyNkZWZpbmUgSE9TVENNRF9BQ1RfU1RBX0FDVElPTl9S
RU1PVkUgICAgICAgICAgIDINCisNCisvKiBEZWZpbmUga2V5IHJlbGF0ZWQgY29uc3RhbnRzICov
DQorI2RlZmluZSBNQVhfRU5DUl9LRVlfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgMTYNCisj
ZGVmaW5lIE1JQ19LRVlfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICA4DQorDQorI2Rl
ZmluZSBLRVlfVFlQRV9JRF9XRVAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMA0KKyNkZWZp
bmUgS0VZX1RZUEVfSURfVEtJUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDENCisjZGVmaW5l
IEtFWV9UWVBFX0lEX0FFUwkgICAgICAgICAgICAgICAgICAgICAgICAweDAyDQorDQorI2RlZmlu
ZSBFTkNSX0tFWV9GTEFHX1RYR1JPVVBLRVkgICAgICAgICAgICAgICAgMHgwMDAwMDAwNA0KKyNk
ZWZpbmUgRU5DUl9LRVlfRkxBR19QQUlSV0lTRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgN
CisjZGVmaW5lIEVOQ1JfS0VZX0ZMQUdfVFNDX1ZBTElEICAgICAgICAgICAgICAgICAweDAwMDAw
MDQwDQorI2RlZmluZSBFTkNSX0tFWV9GTEFHX1dFUF9UWEtFWSAgICAgICAgICAgICAgICAgMHgw
MTAwMDAwMA0KKyNkZWZpbmUgRU5DUl9LRVlfRkxBR19NSUNLRVlfVkFMSUQgICAgICAgICAgICAg
IDB4MDIwMDAwMDANCisNCisvKiBEZWZpbmUgYmxvY2sgYWNrIHJlbGF0ZWQgY29uc3RhbnRzICov
DQorI2RlZmluZSBCQVNUUkVBTV9GTEFHX0lNTUVESUFURV9UWVBFICAgICAgICAgICAgMQ0KKyNk
ZWZpbmUgQkFTVFJFQU1fRkxBR19ESVJFQ1RJT05fVVBTVFJFQU0gICAgICAgIDANCisNCisvKiBE
ZWZpbmUgZ2VuZXJhbCBwdXJwb3NlIGFjdGlvbiAqLw0KKyNkZWZpbmUgSE9TVENNRF9BQ1RfR0VO
X1NFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQ0KKyNkZWZpbmUgSE9TVENNRF9BQ1RfR0VO
X1NFVF9MSVNUICAgICAgICAgICAgICAgIDB4MDAwMg0KKyNkZWZpbmUgSE9TVENNRF9BQ1RfR0VO
X0dFVF9MSVNUICAgICAgICAgICAgICAgIDB4MDAwMw0KKw0KKy8qIE1pc2MgKi8NCisjZGVmaW5l
IE1BWF9FTkNSX0tFWV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAxNg0KKyNkZWZpbmUgTUlD
X0tFWV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgIDgNCisNCitlbnVtIHsNCisJV0xf
RElTQUJMRSA9IDAsDQorCVdMX0VOQUJMRSA9IDEsDQorCVdMX0RJU0FCTEVfVk1BQyA9IDB4ODAs
DQorfTsNCisNCitlbnVtIHsNCisJV0xfR0VUID0gMCwNCisJV0xfU0VUID0gMSwNCisJV0xfUkVT
RVQgPSAyLA0KK307DQorDQorZW51bSB7DQorCVdMX0xPTkdfUFJFQU1CTEUgPSAxLA0KKwlXTF9T
SE9SVF9QUkVBTUJMRSA9IDMsDQorCVdMX0FVVE9fUFJFQU1CTEUgPSA1LA0KK307DQorDQorZW51
bSBlbmNyX2FjdGlvbl90eXBlIHsNCisJLyogcmVxdWVzdCB0byBlbmFibGUvZGlzYWJsZSBIVyBl
bmNyeXB0aW9uICovDQorCUVOQ1JfQUNUSU9OX0VOQUJMRV9IV19FTkNSLA0KKwkvKiByZXF1ZXN0
IHRvIHNldCBlbmNyeXB0aW9uIGtleSAqLw0KKwlFTkNSX0FDVElPTl9UWVBFX1NFVF9LRVksDQor
CS8qIHJlcXVlc3QgdG8gcmVtb3ZlIG9uZSBvciBtb3JlIGtleXMgKi8NCisJRU5DUl9BQ1RJT05f
VFlQRV9SRU1PVkVfS0VZLA0KKwlFTkNSX0FDVElPTl9UWVBFX1NFVF9HUk9VUF9LRVksDQorfTsN
CisNCitlbnVtIGJhX2FjdGlvbl90eXBlIHsNCisJQkFfQ1JFQVRFX1NUUkVBTSwNCisJQkFfVVBE
QVRFX1NUUkVBTSwNCisJQkFfREVTVFJPWV9TVFJFQU0sDQorCUJBX0ZMVVNIX1NUUkVBTSwNCisJ
QkFfQ0hFQ0tfU1RSRUFNLA0KK307DQorDQorZW51bSBtYWNfdHlwZSB7DQorCVdMX01BQ19UWVBF
X1BSSU1BUllfQ0xJRU5ULA0KKwlXTF9NQUNfVFlQRV9TRUNPTkRBUllfQ0xJRU5ULA0KKwlXTF9N
QUNfVFlQRV9QUklNQVJZX0FQLA0KKwlXTF9NQUNfVFlQRV9TRUNPTkRBUllfQVAsDQorfTsNCisN
CisvKiBHZW5lcmFsIGhvc3QgY29tbWFuZCBoZWFkZXIgKi8NCitzdHJ1Y3QgaG9zdGNtZF9oZWFk
ZXIgew0KKwlfX2xlMTYgY21kOw0KKwlfX2xlMTYgbGVuOw0KKwl1OCBzZXFfbnVtOw0KKwl1OCBt
YWNpZDsNCisJX19sZTE2IHJlc3VsdDsNCit9IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01E
X0dFVF9IV19TUEVDICovDQorc3RydWN0IGhvc3RjbWRfY21kX2dldF9od19zcGVjIHsNCisJc3Ry
dWN0IGhvc3RjbWRfaGVhZGVyIGNtZF9oZHI7DQorCXU4IHZlcnNpb247ICAgICAgICAgICAgICAg
ICAgLyogdmVyc2lvbiBvZiB0aGUgSFcgICAgICAgICAgICAgICAgICAgICovDQorCXU4IGhvc3Rf
aWY7ICAgICAgICAgICAgICAgICAgLyogaG9zdCBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAg
ICAgICovDQorCV9fbGUxNiBudW1fd2NiOyAgICAgICAgICAgICAgLyogTWF4LiBudW1iZXIgb2Yg
V0NCIEZXIGNhbiBoYW5kbGUgICAgICovDQorCV9fbGUxNiBudW1fbWNhc3RfYWRkcjsgICAgICAg
LyogTWF4TmJyIG9mIE1DIGFkZHJlc3NlcyBGVyBjYW4gaGFuZGxlICovDQorCXU4IHBlcm1hbmVu
dF9hZGRyW0VUSF9BTEVOXTsgLyogTUFDIGFkZHJlc3MgcHJvZ3JhbW1lZCBpbiBIVyAgICAgICAg
ICovDQorCV9fbGUxNiByZWdpb25fY29kZTsNCisJX19sZTE2IG51bV9hbnRlbm5hOyAgICAgICAg
ICAvKiBOdW1iZXIgb2YgYW50ZW5uYSB1c2VkICAgICAgKi8NCisJX19sZTMyIGZ3X3JlbGVhc2Vf
bnVtOyAgICAgICAvKiA0IGJ5dGUgb2YgRlcgcmVsZWFzZSBudW1iZXIgKi8NCisJX19sZTMyIHdj
Yl9iYXNlMDsNCisJX19sZTMyIHJ4cGRfd3JfcHRyOw0KKwlfX2xlMzIgcnhwZF9yZF9wdHI7DQor
CV9fbGUzMiBmd19hd2FrZV9jb29raWU7DQorCV9fbGUzMiB3Y2JfYmFzZVtTWVNBRFBUX1RPVEFM
X1RYX1FVRVVFUyAtIDFdOw0KK30gX19wYWNrZWQ7DQorDQorLyogSE9TVENNRF9DTURfU0VUX0hX
X1NQRUMgKi8NCitzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X2h3X3NwZWMgew0KKwlzdHJ1Y3QgaG9z
dGNtZF9oZWFkZXIgY21kX2hkcjsNCisJLyogSFcgcmV2aXNpb24gKi8NCisJdTggdmVyc2lvbjsN
CisJLyogSG9zdCBpbnRlcmZhY2UgKi8NCisJdTggaG9zdF9pZjsNCisJLyogTWF4LiBudW1iZXIg
b2YgTXVsdGljYXN0IGFkZHJlc3MgRlcgY2FuIGhhbmRsZSAqLw0KKwlfX2xlMTYgbnVtX21jYXN0
X2FkZHI7DQorCS8qIE1BQyBhZGRyZXNzICovDQorCXU4IHBlcm1hbmVudF9hZGRyW0VUSF9BTEVO
XTsNCisJLyogUmVnaW9uIENvZGUgKi8NCisJX19sZTE2IHJlZ2lvbl9jb2RlOw0KKwkvKiA0IGJ5
dGUgb2YgRlcgcmVsZWFzZSBudW1iZXIsIGV4YW1wbGUgMHgxMjM0PTEuMi4zLjQgKi8NCisJX19s
ZTMyIGZ3X3JlbGVhc2VfbnVtOw0KKwkvKiBGaXJtd2FyZSBhd2FrZSBjb29raWUgLSB1c2VkIHRv
IGVuc3VyZSB0aGF0IHRoZSBkZXZpY2UNCisJICogaXMgbm90IGluIHNsZWVwIG1vZGUNCisJICov
DQorCV9fbGUzMiBmd19hd2FrZV9jb29raWU7DQorCS8qIERldmljZSBjYXBhYmlsaXRpZXMgKHNl
ZSBhYm92ZSkgKi8NCisJX19sZTMyIGRldmljZV9jYXBzOw0KKwkvKiBSeCBzaGFyZWQgbWVtb3J5
IHF1ZXVlICovDQorCV9fbGUzMiByeHBkX3dyX3B0cjsNCisJLyogQWN0dWFsIG51bWJlciBvZiBU
WCBxdWV1ZXMgaW4gV2NiQmFzZSBhcnJheSAqLw0KKwlfX2xlMzIgbnVtX3R4X3F1ZXVlczsNCisJ
LyogVFggV0NCIFJpbmdzICovDQorCV9fbGUzMiB3Y2JfYmFzZVtTWVNBRFBUX05VTV9PRl9ERVND
X0RBVEFdOw0KKwkvKiBNYXggQU1TRFUgc2l6ZSAoMDAgLSBBTVNEVSBEaXNhYmxlZCwNCisJICog
MDEgLSA0SywgMTAgLSA4SywgMTEgLSBub3QgZGVmaW5lZCkNCisJICovDQorCV9fbGUzMiBmZWF0
dXJlczsNCisJX19sZTMyIHR4X3djYl9udW1fcGVyX3F1ZXVlOw0KKwlfX2xlMzIgdG90YWxfcnhf
d2NiOw0KK30gX19wYWNrZWQ7DQorDQorLyogSE9TVENNRF9DTURfODAyXzExX0dFVF9TVEFUICov
DQorc3RydWN0IGhvc3RjbWRfY21kXzgwMl8xMV9nZXRfc3RhdCB7DQorCXN0cnVjdCBob3N0Y21k
X2hlYWRlciBjbWRfaGRyOw0KKwlfX2xlMzIgdHhfcmV0cnlfc3VjY2Vzc2VzOw0KKwlfX2xlMzIg
dHhfbXVsdGlwbGVfcmV0cnlfc3VjY2Vzc2VzOw0KKwlfX2xlMzIgdHhfZmFpbHVyZXM7DQorCV9f
bGUzMiBydHNfc3VjY2Vzc2VzOw0KKwlfX2xlMzIgcnRzX2ZhaWx1cmVzOw0KKwlfX2xlMzIgYWNr
X2ZhaWx1cmVzOw0KKwlfX2xlMzIgcnhfZHVwbGljYXRlX2ZyYW1lczsNCisJX19sZTMyIHJ4X2Zj
c19lcnJvcnM7DQorCV9fbGUzMiB0eF93YXRjaGRvZ190aW1lb3V0czsNCisJX19sZTMyIHJ4X292
ZXJmbG93czsNCisJX19sZTMyIHJ4X2ZyYWdfZXJyb3JzOw0KKwlfX2xlMzIgcnhfbWVtX2Vycm9y
czsNCisJX19sZTMyIHBvaW50ZXJfZXJyb3JzOw0KKwlfX2xlMzIgdHhfdW5kZXJmbG93czsNCisJ
X19sZTMyIHR4X2RvbmU7DQorCV9fbGUzMiB0eF9kb25lX2J1Zl90cnlfcHV0Ow0KKwlfX2xlMzIg
dHhfZG9uZV9idWZfcHV0Ow0KKwkvKiBQdXQgc2l6ZSBvZiByZXF1ZXN0ZWQgYnVmZmVyIGluIGhl
cmUgKi8NCisJX19sZTMyIHdhaXRfZm9yX3R4X2J1ZjsNCisJX19sZTMyIHR4X2F0dGVtcHRzOw0K
KwlfX2xlMzIgdHhfc3VjY2Vzc2VzOw0KKwlfX2xlMzIgdHhfZnJhZ21lbnRzOw0KKwlfX2xlMzIg
dHhfbXVsdGljYXN0czsNCisJX19sZTMyIHJ4X25vbl9jdGxfcGt0czsNCisJX19sZTMyIHJ4X211
bHRpY2FzdHM7DQorCV9fbGUzMiByeF91bmRlY3J5cHRhYmxlX2ZyYW1lczsNCisJX19sZTMyIHJ4
X2ljdl9lcnJvcnM7DQorCV9fbGUzMiByeF9leGNsdWRlZF9mcmFtZXM7DQorCV9fbGUzMiByeF93
ZWFrX2l2X2NvdW50Ow0KKwlfX2xlMzIgcnhfdW5pY2FzdHM7DQorCV9fbGUzMiByeF9ieXRlczsN
CisJX19sZTMyIHJ4X2Vycm9yczsNCisJX19sZTMyIHJ4X3J0c19jb3VudDsNCisJX19sZTMyIHR4
X2N0c19jb3VudDsNCit9IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EXzgwMl8xMV9SQURJ
T19DT05UUk9MICovDQorc3RydWN0IGhvc3RjbWRfY21kXzgwMl8xMV9yYWRpb19jb250cm9sIHsN
CisJc3RydWN0IGhvc3RjbWRfaGVhZGVyIGNtZF9oZHI7DQorCV9fbGUxNiBhY3Rpb247DQorCS8q
IEBiaXQwOiAxLzAsb24vb2ZmLCBAYml0MTogMS8wLCBsb25nL3Nob3J0IEBiaXQyOiAxLzAsYXV0
by9maXggKi8NCisJX19sZTE2IGNvbnRyb2w7DQorCV9fbGUxNiByYWRpb19vbjsNCit9IF9fcGFj
a2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EX01FTV9BRERSX0FDQ0VTUyAqLw0KK3N0cnVjdCBob3N0
Y21kX2NtZF9tZW1fYWRkcl9hY2Nlc3Mgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hk
cjsNCisJX19sZTMyIGFkZHJlc3M7DQorCV9fbGUxNiBsZW5ndGg7DQorCV9fbGUxNiByZXNlcnZl
ZDsNCisJX19sZTMyIHZhbHVlWzY0XTsNCit9IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01E
XzgwMl8xMV9UWF9QT1dFUiAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF84MDJfMTFfdHhfcG93ZXIg
ew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJX19sZTE2IGFjdGlvbjsNCisJ
X19sZTE2IGJhbmQ7DQorCV9fbGUxNiBjaDsNCisJX19sZTE2IGJ3Ow0KKwlfX2xlMTYgc3ViX2No
Ow0KKwlfX2xlMTYgcG93ZXJfbGV2ZWxfbGlzdFtTWVNBRFBUX1RYX1BPV0VSX0xFVkVMX1RPVEFM
XTsNCit9IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EXzgwMl8xMV9SRl9BTlRFTk5BICov
DQorc3RydWN0IGhvc3RjbWRfY21kXzgwMl8xMV9yZl9hbnRlbm5hIHsNCisJc3RydWN0IGhvc3Rj
bWRfaGVhZGVyIGNtZF9oZHI7DQorCV9fbGUxNiBhY3Rpb247DQorCV9fbGUxNiBhbnRlbm5hX21v
ZGU7ICAgICAvKiBOdW1iZXIgb2YgYW50ZW5uYXMgb3IgMHhmZmZmKGRpdmVyc2l0eSkgKi8NCit9
IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EX0JST0FEQ0FTVF9TU0lEX0VOQUJMRSAqLw0K
K3N0cnVjdCBob3N0Y21kX2NtZF9icm9hZGNhc3Rfc3NpZF9lbmFibGUgew0KKwlzdHJ1Y3QgaG9z
dGNtZF9oZWFkZXIgY21kX2hkcjsNCisJX19sZTMyIGVuYWJsZTsNCit9IF9fcGFja2VkOw0KKw0K
Ky8qIEhPU1RDTURfQ01EX1NFVF9SRl9DSEFOTkVMICovDQorI2RlZmluZSBGUkVRX0JBTkRfTUFT
SyAgICAgMHgwMDAwMDAzZg0KKyNkZWZpbmUgQ0hOTF9XSURUSF9NQVNLICAgIDB4MDAwMDA3YzAN
CisjZGVmaW5lIENITkxfV0lEVEhfU0hJRlQgICA2DQorI2RlZmluZSBBQ1RfUFJJTUFSWV9NQVNL
ICAgMHgwMDAwMzgwMA0KKyNkZWZpbmUgQUNUX1BSSU1BUllfU0hJRlQgIDExDQorDQorc3RydWN0
IGhvc3RjbWRfY21kX3NldF9yZl9jaGFubmVsIHsNCisJc3RydWN0IGhvc3RjbWRfaGVhZGVyIGNt
ZF9oZHI7DQorCV9fbGUxNiBhY3Rpb247DQorCXU4IGN1cnJfY2hubDsNCisJX19sZTMyIGNobmxf
ZmxhZ3M7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9TRVRfQUlEICovDQorc3Ry
dWN0IGhvc3RjbWRfY21kX3NldF9haWQgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hk
cjsNCisJX19sZTE2IGFpZDsNCisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOyAgICAgICAvKiBBUCdz
IE1hYyBBZGRyZXNzKEJTU0lEKSAqLw0KKwlfX2xlMzIgZ3Byb3RlY3Q7DQorCXU4IGFwX3JhdGVz
W1NZU0FEUFRfTUFYX0RBVEFfUkFURVNfR107DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01E
X0NNRF9TRVRfSU5GUkFfTU9ERSAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF9zZXRfaW5mcmFfbW9k
ZSB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KK30gX19wYWNrZWQ7DQorDQor
LyogSE9TVENNRF9DTURfODAyXzExX1JUU19USFNEICovDQorc3RydWN0IGhvc3RjbWRfY21kXzgw
Ml8xMV9ydHNfdGhzZCB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwlfX2xl
MTYgYWN0aW9uOw0KKwlfX2xlMTYJdGhyZXNob2xkOw0KK30gX19wYWNrZWQ7DQorDQorLyogSE9T
VENNRF9DTURfU0VUX0VEQ0FfUEFSQU1TICovDQorc3RydWN0IGhvc3RjbWRfY21kX3NldF9lZGNh
X3BhcmFtcyB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwkvKiAwID0gZ2V0
IGFsbCwgMHgxID1zZXQgQ1dNaW4vTWF4LCAgMHgyID0gc2V0IFRYT1AgLCAweDQgPXNldCBBSUZT
TiAqLw0KKwlfX2xlMTYgYWN0aW9uOw0KKwlfX2xlMTYgdHhvcDsgICAgICAgICAgICAgICAgIC8q
IGluIHVuaXQgb2YgMzIgdXMgKi8NCisJX19sZTMyIGN3X21heDsgICAgICAgICAgICAgICAvKiAw
fjE1ICovDQorCV9fbGUzMiBjd19taW47ICAgICAgICAgICAgICAgLyogMH4xNSAqLw0KKwl1OCBh
aWZzbjsNCisJdTggdHhxX251bTsgICAgICAgICAgICAgICAgICAvKiBUeCBRdWV1ZSBudW1iZXIu
ICovDQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9TRVRfV01NX01PREUgKi8NCitz
dHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X3dtbV9tb2RlIHsNCisJc3RydWN0IGhvc3RjbWRfaGVhZGVy
IGNtZF9oZHI7DQorCV9fbGUxNiBhY3Rpb247ICAgICAgICAgICAgICAgLyogMC0+dW5zZXQsIDEt
PnNldCAqLw0KK30gX19wYWNrZWQ7DQorDQorLyogSE9TVENNRF9DTURfSFRfR1VBUkRfSU5URVJW
QUwgKi8NCitzdHJ1Y3QgaG9zdGNtZF9jbWRfaHRfZ3VhcmRfaW50ZXJ2YWwgew0KKwlzdHJ1Y3Qg
aG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJX19sZTMyIGFjdGlvbjsNCisJX19sZTMyIGdpX3R5
cGU7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9TRVRfRklYRURfUkFURSAqLw0K
K3N0cnVjdCBmaXhfcmF0ZV9mbGFnIHsgICAgICAgICAgIC8qIGxvd2VyIHJhdGUgYWZ0ZXIgdGhl
IHJldHJ5IGNvdW50ICovDQorCS8qIDA6IGxlZ2FjeSwgMTogSFQgKi8NCisJX19sZTMyIGZpeF9y
YXRlX3R5cGU7DQorCS8qIDA6IHJldHJ5IGNvdW50IGlzIG5vdCB2YWxpZCwgMTogdXNlIHJldHJ5
IGNvdW50IHNwZWNpZmllZCAqLw0KKwlfX2xlMzIgcmV0cnlfY291bnRfdmFsaWQ7DQorfSBfX3Bh
Y2tlZDsNCisNCitzdHJ1Y3QgZml4X3JhdGVfZW50cnkgew0KKwlzdHJ1Y3QgZml4X3JhdGVfZmxh
ZyBmaXhfcmF0ZV90eXBlX2ZsYWdzOw0KKwkvKiBkZXBlbmRpbmcgb24gdGhlIGZsYWdzIGFib3Zl
LCB0aGlzIGNhbiBiZSBlaXRoZXIgYSBsZWdhY3kNCisJICogcmF0ZShub3QgaW5kZXgpIG9yIGFu
IE1DUyBjb2RlLg0KKwkgKi8NCisJX19sZTMyIGZpeGVkX3JhdGU7DQorCV9fbGUzMiByZXRyeV9j
b3VudDsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBob3N0Y21kX2NtZF9zZXRfZml4ZWRfcmF0
ZSB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwkvKiBIT1NUQ01EX0FDVF9O
T1RfVVNFX0ZJWEVEX1JBVEUgMHgwMDAyICovDQorCV9fbGUzMiBhY3Rpb247DQorCS8qIHVzZSBm
aXhlZCByYXRlIHNwZWNpZmllZCBidXQgZmlybXdhcmUgY2FuIGRyb3AgdG8gKi8NCisJX19sZTMy
IGFsbG93X3JhdGVfZHJvcDsNCisJX19sZTMyIGVudHJ5X2NvdW50Ow0KKwlzdHJ1Y3QgZml4X3Jh
dGVfZW50cnkgZml4ZWRfcmF0ZV90YWJsZVs0XTsNCisJdTggbXVsdGljYXN0X3JhdGU7DQorCXU4
IG11bHRpX3JhdGVfdHhfdHlwZTsNCisJdTggbWFuYWdlbWVudF9yYXRlOw0KK30gX19wYWNrZWQ7
DQorDQorLyogSE9TVENNRF9DTURfU0VUX0lFUyAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF9zZXRf
aWVzIHsNCisJc3RydWN0IGhvc3RjbWRfaGVhZGVyIGNtZF9oZHI7DQorCV9fbGUxNiBhY3Rpb247
ICAgICAgICAgICAgICAgLyogMC0+dW5zZXQsIDEtPnNldCAqLw0KKwlfX2xlMTYgaWVfbGlzdF9s
ZW5faHQ7DQorCV9fbGUxNiBpZV9saXN0X2xlbl92aHQ7DQorCV9fbGUxNiBpZV9saXN0X2xlbl9w
cm9wcmlldGFyeTsNCisJLypCdWZmZXIgc2l6ZSBzYW1lIGFzIEdlbmVyaWNfQmVhY29uKi8NCisJ
dTggaWVfbGlzdF9odFsxNDhdOw0KKwl1OCBpZV9saXN0X3ZodFsyNF07DQorCXU4IGllX2xpc3Rf
cHJvcHJpZXRhcnlbMTEyXTsNCit9IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EX1NFVF9M
SU5LQURBUFRfQ1NfTU9ERSAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF9zZXRfbGlua2FkYXB0X2Nz
X21vZGUgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJX19sZTE2IGFjdGlv
bjsNCisJX19sZTE2IGNzX21vZGU7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9T
RVRfTUFDX0FERFIsIEhPU1RDTURfQ01EX0RFTF9NQUNfQUREUiAqLw0KK3N0cnVjdCBob3N0Y21k
X2NtZF9zZXRfbWFjX2FkZHIgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJ
X19sZTE2IG1hY190eXBlOw0KKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07DQorfSBfX3BhY2tlZDsN
CisNCisvKiBIT1NUQ01EX0NNRF9TRVRfUkFURV9BREFQVF9NT0RFICovDQorc3RydWN0IGhvc3Rj
bWRfY21kX3NldF9yYXRlX2FkYXB0X21vZGUgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21k
X2hkcjsNCisJX19sZTE2IGFjdGlvbjsNCisJX19sZTE2IHJhdGVfYWRhcHRfbW9kZTsgICAgICAv
KiAwOkluZG9vciwgMTpPdXRkb29yICovDQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NN
RF9HRVRfV0FUQ0hET0dfQklUTUFQICovDQorc3RydWN0IGhvc3RjbWRfY21kX2dldF93YXRjaGRv
Z19iaXRtYXAgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJdTggd2F0Y2hk
b2dfYml0bWFwOyAgICAgICAgICAvKiBmb3IgU1cvQkEgKi8NCit9IF9fcGFja2VkOw0KKw0KKy8q
IEhPU1RDTURfQ01EX0JTU19TVEFSVCAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF9ic3Nfc3RhcnQg
ew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJX19sZTMyIGVuYWJsZTsgICAg
ICAgICAgICAgICAgICAvKiBGQUxTRTogRGlzYWJsZSBvciBUUlVFOiBFbmFibGUgKi8NCit9IF9f
cGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EX0FQX0JFQUNPTiAqLw0KK3N0cnVjdCBjZl9wYXJh
bXMgew0KKwl1OCBlbGVtX2lkOw0KKwl1OCBsZW47DQorCXU4IGNmcF9jbnQ7DQorCXU4IGNmcF9w
ZXJpb2Q7DQorCV9fbGUxNiBjZnBfbWF4X2R1cmF0aW9uOw0KKwlfX2xlMTYgY2ZwX2R1cmF0aW9u
X3JlbWFpbmluZzsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBpYnNzX3BhcmFtcyB7DQorCXU4
IGVsZW1faWQ7DQorCXU4IGxlbjsNCisJX19sZTE2CWF0aW1fd2luZG93Ow0KK30gX19wYWNrZWQ7
DQorDQordW5pb24gc3NfcGFyYW1zIHsNCisJc3RydWN0IGNmX3BhcmFtcyBjZl9wYXJhbV9zZXQ7
DQorCXN0cnVjdCBpYnNzX3BhcmFtcyBpYnNzX3BhcmFtX3NldDsNCit9IF9fcGFja2VkOw0KKw0K
K3N0cnVjdCBmaF9wYXJhbXMgew0KKwl1OCBlbGVtX2lkOw0KKwl1OCBsZW47DQorCV9fbGUxNiBk
d2VsbF90aW1lOw0KKwl1OCBob3Bfc2V0Ow0KKwl1OCBob3BfcGF0dGVybjsNCisJdTggaG9wX2lu
ZGV4Ow0KK30gX19wYWNrZWQ7DQorDQorc3RydWN0IGRzX3BhcmFtcyB7DQorCXU4IGVsZW1faWQ7
DQorCXU4IGxlbjsNCisJdTggY3VycmVudF9jaG5sOw0KK30gX19wYWNrZWQ7DQorDQordW5pb24g
cGh5X3BhcmFtcyB7DQorCXN0cnVjdCBmaF9wYXJhbXMgZmhfcGFyYW1fc2V0Ow0KKwlzdHJ1Y3Qg
ZHNfcGFyYW1zIGRzX3BhcmFtX3NldDsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCByc25faWUg
ew0KKwl1OCBlbGVtX2lkOw0KKwl1OCBsZW47DQorCXU4IG91aV90eXBlWzRdOyAgICAgICAgICAg
ICAgLyogMDA6NTA6ZjI6MDEgKi8NCisJdTggdmVyWzJdOw0KKwl1OCBncnBfa2V5X2NpcGhlcls0
XTsNCisJdTggcHdzX2tleV9jbnRbMl07DQorCXU4IHB3c19rZXlfY2lwaGVyX2xpc3RbNF07DQor
CXU4IGF1dGhfa2V5X2NudFsyXTsNCisJdTggYXV0aF9rZXlfbGlzdFs0XTsNCit9IF9fcGFja2Vk
Ow0KKw0KK3N0cnVjdCByc240OF9pZSB7DQorCXU4IGVsZW1faWQ7DQorCXU4IGxlbjsNCisJdTgg
dmVyWzJdOw0KKwl1OCBncnBfa2V5X2NpcGhlcls0XTsNCisJdTggcHdzX2tleV9jbnRbMl07DQor
CXU4IHB3c19rZXlfY2lwaGVyX2xpc3RbNF07DQorCXU4IGF1dGhfa2V5X2NudFsyXTsNCisJdTgg
YXV0aF9rZXlfbGlzdFs0XTsNCisJdTggcnNuX2NhcFsyXTsNCisJdTggcG1rX2lkX2NudFsyXTsN
CisJdTggcG1rX2lkX2xpc3RbMTZdOyAgICAgICAgICAvKiBTaG91bGQgbW9kaWZ5IHRvIDE2ICog
UyAqLw0KKwl1OCByZXNlcnZlZFs4XTsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBhY19wYXJh
bV9yY2Qgew0KKwl1OCBhY2lfYWlmc247DQorCXU4IGVjd19taW5fbWF4Ow0KKwlfX2xlMTYgdHhv
cF9saW07DQorfSBfX3BhY2tlZDsNCisNCitzdHJ1Y3Qgd21tX3BhcmFtX2VsZW0gew0KKwl1OCBl
bGVtX2lkOw0KKwl1OCBsZW47DQorCXU4IG91aVszXTsNCisJdTggdHlwZTsNCisJdTggc3ViX3R5
cGU7DQorCXU4IHZlcnNpb247DQorCXU4IHJzdmQ7DQorCXN0cnVjdCBhY19wYXJhbV9yY2QgYWNf
YmU7DQorCXN0cnVjdCBhY19wYXJhbV9yY2QgYWNfYms7DQorCXN0cnVjdCBhY19wYXJhbV9yY2Qg
YWNfdmk7DQorCXN0cnVjdCBhY19wYXJhbV9yY2QgYWNfdm87DQorfSBfX3BhY2tlZDsNCisNCitz
dHJ1Y3QgY2hhbm5lbF9pbmZvIHsNCisJdTggZmlyc3RfY2hhbm5lbF9udW07DQorCXU4IG51bV9j
aGFubmVsczsNCisJdTggbWF4X3R4X3B3cl9sZXZlbDsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVj
dCBjb3VudHJ5IHsNCisJdTggZWxlbV9pZDsNCisJdTggbGVuOw0KKwl1OCBjb3VudHJ5X3N0clsz
XTsNCisJc3RydWN0IGNoYW5uZWxfaW5mbyBjaGFubmVsX2luZm9bNDBdOw0KK30gX19wYWNrZWQ7
DQorDQorc3RydWN0IHN0YXJ0X2NtZCB7DQorCXU4IHN0YV9tYWNfYWRkcltFVEhfQUxFTl07DQor
CXU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07DQorCXU4IGJzc190eXBlOw0KKwlfX2xl
MTYgYmNuX3BlcmlvZDsNCisJdTggZHRpbV9wZXJpb2Q7DQorCXVuaW9uIHNzX3BhcmFtcyBzc19w
YXJhbV9zZXQ7DQorCXVuaW9uIHBoeV9wYXJhbXMgcGh5X3BhcmFtX3NldDsNCisJX19sZTE2IHBy
b2JlX2RlbGF5Ow0KKwlfX2xlMTYgY2FwX2luZm87DQorCXU4IGJfcmF0ZV9zZXRbU1lTQURQVF9N
QVhfREFUQV9SQVRFU19HXTsNCisJdTggb3BfcmF0ZV9zZXRbU1lTQURQVF9NQVhfREFUQV9SQVRF
U19HXTsNCisJc3RydWN0IHJzbl9pZSByc25faWU7DQorCXN0cnVjdCByc240OF9pZSByc240OF9p
ZTsNCisJc3RydWN0IHdtbV9wYXJhbV9lbGVtIHdtbV9wYXJhbTsNCisJc3RydWN0IGNvdW50cnkg
Y291bnRyeTsNCisJX19sZTMyIGFwX3JmX3R5cGU7ICAgICAgICAgICAvKiAwLT5CLCAxLT5HLCAy
LT5NaXhlZCwgMy0+QSwgNC0+MTFKICovDQorfSBfX3BhY2tlZDsNCisNCitzdHJ1Y3QgaG9zdGNt
ZF9jbWRfYXBfYmVhY29uIHsNCisJc3RydWN0IGhvc3RjbWRfaGVhZGVyIGNtZF9oZHI7DQorCXN0
cnVjdCBzdGFydF9jbWQgc3RhcnRfY21kOw0KK30gX19wYWNrZWQ7DQorDQorLyogSE9TVENNRF9D
TURfU0VUX05FV19TVE4gKi8NCitzdHJ1Y3QgYWRkX2h0X2luZm8gew0KKwl1OCBjb250cm9sX2No
bmw7DQorCXU4IGFkZF9jaG5sOw0KKwlfX2xlMTYgb3BfbW9kZTsNCisJX19sZTE2IHN0YmM7DQor
fSBfX3BhY2tlZDsNCisNCitzdHJ1Y3QgcGVlcl9pbmZvIHsNCisJX19sZTMyIGxlZ2FjeV9yYXRl
X2JpdG1hcDsNCisJdTggaHRfcmF0ZXNbNF07DQorCV9fbGUxNiBjYXBfaW5mbzsNCisJX19sZTE2
IGh0X2NhcF9pbmZvOw0KKwl1OCBtYWNfaHRfcGFyYW1faW5mbzsNCisJdTggbXJ2bF9zdGE7DQor
CXN0cnVjdCBhZGRfaHRfaW5mbyBhZGRfaHRfaW5mbzsNCisJX19sZTMyIHR4X2JmX2NhcGFiaWxp
dGllczsgICAvKiBFWEJGX1NVUFBPUlQgKi8NCisJX19sZTMyIHZodF9tYXhfcnhfbWNzOw0KKwlf
X2xlMzIgdmh0X2NhcDsNCisJLyogMDoyME1oeiwgMTo0ME1oeiwgMjo4ME1oeiwgMzoxNjAgb3Ig
ODArODBNaHogKi8NCisJdTggdmh0X3J4X2NoYW5uZWxfd2lkdGg7DQorfSBfX3BhY2tlZDsNCisN
CitzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X25ld19zdG4gew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFk
ZXIgY21kX2hkcjsNCisJX19sZTE2IGFpZDsNCisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOw0KKwlf
X2xlMTYgc3RuX2lkOw0KKwlfX2xlMTYgYWN0aW9uOw0KKwlfX2xlMTYgcmVzZXJ2ZWQ7DQorCXN0
cnVjdCBwZWVyX2luZm8gcGVlcl9pbmZvOw0KKwkvKiBVQVBTRF9TVVBQT1JUICovDQorCXU4IHFv
c19pbmZvOw0KKwl1OCBpc19xb3Nfc3RhOw0KKwlfX2xlMzIgZndfc3RhX3B0cjsNCit9IF9fcGFj
a2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EX1NFVF9BUE1PREUgKi8NCitzdHJ1Y3QgaG9zdGNtZF9j
bWRfc2V0X2FwbW9kZSB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwl1OCBh
cG1vZGU7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElP
TiAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF91cGRhdGVfZW5jcnlwdGlvbiB7DQorCXN0cnVjdCBo
b3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwkvKiBBY3Rpb24gdHlwZSAtIHNlZSBlbmNyX2FjdGlv
bl90eXBlICovDQorCV9fbGUzMiBhY3Rpb25fdHlwZTsgICAgICAgICAgLyogZW5jcl9hY3Rpb25f
dHlwZSAqLw0KKwkvKiBzaXplIG9mIHRoZSBkYXRhIGJ1ZmZlciBhdHRhY2hlZC4gKi8NCisJX19s
ZTMyIGRhdGFfbGVuZ3RoOw0KKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07DQorCXU4IGFjdGlvbl9k
YXRhWzFdOw0KK30gX19wYWNrZWQ7DQorDQorc3RydWN0IHdlcF90eXBlX2tleSB7DQorCS8qIFdF
UCBrZXkgbWF0ZXJpYWwgKG1heCAxMjhiaXQpICovDQorCXU4IGtleV9tYXRlcmlhbFtNQVhfRU5D
Ul9LRVlfTEVOR1RIXTsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBlbmNyX3RraXBfc2VxY250
IHsNCisJX19sZTE2IGxvdzsNCisJX19sZTMyIGhpZ2g7DQorfSBfX3BhY2tlZDsNCisNCitzdHJ1
Y3QgdGtpcF90eXBlX2tleSB7DQorCS8qIFRLSVAgS2V5IG1hdGVyaWFsLiBLZXkgdHlwZSAoZ3Jv
dXAgb3IgcGFpcndpc2Uga2V5KSBpcw0KKwkgKiBkZXRlcm1pbmVkIGJ5IGZsYWdzDQorCSAqLw0K
KwkvKiBpbiBLRVlfUEFSQU1fU0VUIHN0cnVjdHVyZS4gKi8NCisJdTgga2V5X21hdGVyaWFsW01B
WF9FTkNSX0tFWV9MRU5HVEhdOw0KKwkvKiBNSUMga2V5cyAqLw0KKwl1OCB0a2lwX3R4X21pY19r
ZXlbTUlDX0tFWV9MRU5HVEhdOw0KKwl1OCB0a2lwX3J4X21pY19rZXlbTUlDX0tFWV9MRU5HVEhd
Ow0KKwlzdHJ1Y3QgZW5jcl90a2lwX3NlcWNudAl0a2lwX3JzYzsNCisJc3RydWN0IGVuY3JfdGtp
cF9zZXFjbnQJdGtpcF90c2M7DQorfSBfX3BhY2tlZDsNCisNCitzdHJ1Y3QgYWVzX3R5cGVfa2V5
IHsNCisJLyogQUVTIEtleSBtYXRlcmlhbCAqLw0KKwl1OCBrZXlfbWF0ZXJpYWxbTUFYX0VOQ1Jf
S0VZX0xFTkdUSF07DQorfSBfX3BhY2tlZDsNCisNCit1bmlvbiBtd2xfa2V5X3R5cGUgew0KKwlz
dHJ1Y3Qgd2VwX3R5cGVfa2V5ICB3ZXBfa2V5Ow0KKwlzdHJ1Y3QgdGtpcF90eXBlX2tleSB0a2lw
X2tleTsNCisJc3RydWN0IGFlc190eXBlX2tleSAgYWVzX2tleTsNCit9IF9fcGFja2VkOw0KKw0K
K3N0cnVjdCBrZXlfcGFyYW1fc2V0IHsNCisJLyogVG90YWwgbGVuZ3RoIG9mIHRoaXMgc3RydWN0
dXJlIChLZXkgaXMgdmFyaWFibGUgc2l6ZSBhcnJheSkgKi8NCisJX19sZTE2IGxlbmd0aDsNCisJ
LyogS2V5IHR5cGUgLSBXRVAsIFRLSVAgb3IgQUVTLUNDTVAuICovDQorCS8qIFNlZSBkZWZpbml0
aW9ucyBhYm92ZSAqLw0KKwlfX2xlMTYga2V5X3R5cGVfaWQ7DQorCS8qIGtleSBmbGFncyAoRU5D
Ul9LRVlfRkxBR19YWFhfICovDQorCV9fbGUzMiBrZXlfaW5mbzsNCisJLyogRm9yIFdFUCBvbmx5
IC0gYWN0dWFsIGtleSBpbmRleCAqLw0KKwlfX2xlMzIga2V5X2luZGV4Ow0KKwkvKiBTaXplIG9m
IHRoZSBrZXkgKi8NCisJX19sZTE2IGtleV9sZW47DQorCS8qIEtleSBtYXRlcmlhbCAodmFyaWFi
bGUgc2l6ZSBhcnJheSkgKi8NCisJdW5pb24gbXdsX2tleV90eXBlIGtleTsNCisJdTggbWFjX2Fk
ZHJbRVRIX0FMRU5dOw0KK30gX19wYWNrZWQ7DQorDQorc3RydWN0IGhvc3RjbWRfY21kX3NldF9r
ZXkgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJLyogQWN0aW9uIHR5cGUg
LSBzZWUgZW5jcl9hY3Rpb25fdHlwZSAqLw0KKwlfX2xlMzIgYWN0aW9uX3R5cGU7ICAgICAgICAg
IC8qIGVuY3JfYWN0aW9uX3R5cGUgKi8NCisJLyogc2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIgYXR0
YWNoZWQuICovDQorCV9fbGUzMiBkYXRhX2xlbmd0aDsNCisJLyogZGF0YSBidWZmZXIgLSBtYXBz
IHRvIG9uZSBLRVlfUEFSQU1fU0VUIHN0cnVjdHVyZSAqLw0KKwlzdHJ1Y3Qga2V5X3BhcmFtX3Nl
dCBrZXlfcGFyYW07DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9CQVNUUkVBTSAq
Lw0KKyNkZWZpbmUgQkFfVFlQRV9NQVNLICAgICAgIDB4MDAwMDAwMDENCisjZGVmaW5lIEJBX0RJ
UkVDVElPTl9NQVNLICAweDAwMDAwMDA2DQorI2RlZmluZSBCQV9ESVJFQ1RJT05fU0hJRlQgMQ0K
Kw0KK3N0cnVjdCBiYV9jb250ZXh0IHsNCisJX19sZTMyIGNvbnRleHQ7DQorfSBfX3BhY2tlZDsN
CisNCisvKiBwYXJhbWV0ZXJzIGZvciBibG9jayBhY2sgY3JlYXRpb24gKi8NCitzdHJ1Y3QgY3Jl
YXRlX2JhX3BhcmFtcyB7DQorCS8qIEJBIENyZWF0aW9uIGZsYWdzIC0gc2VlIGFib3ZlICovDQor
CV9fbGUzMiBmbGFnczsNCisJLyogaWRsZSB0aHJlc2hvbGQgKi8NCisJX19sZTMyIGlkbGVfdGhy
czsNCisJLyogYmxvY2sgYWNrIHRyYW5zbWl0IHRocmVzaG9sZCAoYWZ0ZXIgaG93IG1hbnkgcGt0
cyBzaG91bGQgd2UNCisJICogc2VuZCBCQVI/KQ0KKwkgKi8NCisJX19sZTMyIGJhcl90aHJzOw0K
KwkvKiByZWNlaXZlciB3aW5kb3cgc2l6ZSAqLw0KKwlfX2xlMzIgd2luZG93X3NpemU7DQorCS8q
IE1BQyBBZGRyZXNzIG9mIHRoZSBCQSBwYXJ0bmVyICovDQorCXU4IHBlZXJfbWFjX2FkZHJbRVRI
X0FMRU5dOw0KKwkvKiBEaWFsb2cgVG9rZW4gKi8NCisJdTggZGlhbG9nX3Rva2VuOw0KKwkvKiBU
SUQgZm9yIHRoZSB0cmFmZmljIHN0cmVhbSBpbiB0aGlzIEJBICovDQorCXU4IHRpZDsNCisJLyog
c2hhcmVkIG1lbW9yeSBxdWV1ZSBJRCAobm90IHN1cmUgaWYgdGhpcyBpcyByZXF1aXJlZCkgKi8N
CisJdTggcXVldWVfaWQ7DQorCXU4IHBhcmFtX2luZm87DQorCS8qIHJldHVybmVkIGJ5IGZpcm13
YXJlIC0gZmlybXdhcmUgY29udGV4dCBwb2ludGVyLiAqLw0KKwkvKiB0aGlzIGNvbnRleHQgcG9p
bnRlciB3aWxsIGJlIHBhc3NlZCB0byBmaXJtd2FyZSBmb3IgYWxsDQorCSAqIGZ1dHVyZSBjb21t
YW5kcy4NCisJICovDQorCXN0cnVjdCBiYV9jb250ZXh0IGZ3X2JhX2NvbnRleHQ7DQorCXU4IHJl
c2V0X3NlcV9ubzsgICAgICAgICAgICAgLyoqIDAgb3IgMSoqLw0KKwlfX2xlMTYgY3VycmVudF9z
ZXE7DQorCS8qIFRoaXMgaXMgZm9yIHZpcnR1YWwgc3RhdGlvbiBpbiBTdGEgcHJveHkgbW9kZSBm
b3IgVjZGVyAqLw0KKwl1OCBzdGFfc3JjX21hY19hZGRyW0VUSF9BTEVOXTsNCit9IF9fcGFja2Vk
Ow0KKw0KKy8qIG5ldyB0cmFuc21pdCBzZXF1ZW5jZSBudW1iZXIgaW5mb3JtYXRpb24gKi8NCitz
dHJ1Y3QgYmFfdXBkYXRlX3NlcV9udW0gew0KKwkvKiBCQSBmbGFncyAtIHNlZSBhYm92ZSAqLw0K
KwlfX2xlMzIgZmxhZ3M7DQorCS8qIHJldHVybmVkIGJ5IGZpcm13YXJlIGluIHRoZSBjcmVhdGUg
YmEgc3RyZWFtIHJlc3BvbnNlICovDQorCXN0cnVjdCBiYV9jb250ZXh0IGZ3X2JhX2NvbnRleHQ7
DQorCS8qIG5ldyBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoaXMgYmxvY2sgYWNrIHN0cmVhbSAqLw0K
KwlfX2xlMTYgYmFfc2VxX251bTsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBiYV9zdHJlYW1f
Y29udGV4dCB7DQorCS8qIEJBIFN0cmVhbSBmbGFncyAqLw0KKwlfX2xlMzIgZmxhZ3M7DQorCS8q
IHJldHVybmVkIGJ5IGZpcm13YXJlIGluIHRoZSBjcmVhdGUgYmEgc3RyZWFtIHJlc3BvbnNlICov
DQorCXN0cnVjdCBiYV9jb250ZXh0IGZ3X2JhX2NvbnRleHQ7DQorfSBfX3BhY2tlZDsNCisNCit1
bmlvbiBiYV9pbmZvIHsNCisJLyogaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gY3JlYXRlIEJBIFN0
cmVhbS4uLiAqLw0KKwlzdHJ1Y3QgY3JlYXRlX2JhX3BhcmFtcwljcmVhdGVfcGFyYW1zOw0KKwkv
KiB1cGRhdGUgc3RhcnRpbmcvbmV3IHNlcXVlbmNlIG51bWJlciBldGMuICovDQorCXN0cnVjdCBi
YV91cGRhdGVfc2VxX251bSB1cGR0X3NlcV9udW07DQorCS8qIGRlc3Ryb3kgYW4gZXhpc3Rpbmcg
c3RyZWFtLi4uICovDQorCXN0cnVjdCBiYV9zdHJlYW1fY29udGV4dCBkZXN0cm95X3BhcmFtczsN
CisJLyogZGVzdHJveSBhbiBleGlzdGluZyBzdHJlYW0uLi4gKi8NCisJc3RydWN0IGJhX3N0cmVh
bV9jb250ZXh0IGZsdXNoX3BhcmFtczsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBob3N0Y21k
X2NtZF9iYXN0cmVhbSB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwlfX2xl
MzIgYWN0aW9uX3R5cGU7DQorCXVuaW9uIGJhX2luZm8gYmFfaW5mbzsNCit9IF9fcGFja2VkOw0K
Kw0KKy8qIEhPU1RDTURfQ01EX1NFVF9PUFRJTUlaQVRJT05fTEVWRUwgKi8NCitzdHJ1Y3QgaG9z
dGNtZF9jbWRfc2V0X29wdGltaXphdGlvbl9sZXZlbCB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRl
ciBjbWRfaGRyOw0KKwl1OCBvcHRfbGV2ZWw7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01E
X0NNRF9EV0RTX0VOQUJMRSAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF9kd2RzX2VuYWJsZSB7DQor
CXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwlfX2xlMzIgZW5hYmxlOyAgICAgICAg
ICAgICAgIC8qIDAgLS0gRGlzYWJsZS4gb3IgMSAtLSBFbmFibGUuICovDQorfSBfX3BhY2tlZDsN
CisNCisvKiBIT1NUQ01EX0NNRF9GV19GTFVTSF9USU1FUiAqLw0KK3N0cnVjdCBob3N0Y21kX2Nt
ZF9md19mbHVzaF90aW1lciB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwkv
KiAwIC0tIERpc2FibGUuID4gMCAtLSBob2xkcyB0aW1lIHZhbHVlIGluIHVzZWNzLiAqLw0KKwlf
X2xlMzIgdmFsdWU7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9TRVRfQ0REICov
DQorc3RydWN0IGhvc3RjbWRfY21kX3NldF9jZGQgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIg
Y21kX2hkcjsNCisJX19sZTMyIGVuYWJsZTsNCit9IF9fcGFja2VkOw0KKw0KKyNlbmRpZiAvKiBf
aG9zdGNtZF9oXyAqLw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwv
bXdsd2lmaS9pc3IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9pc3Iu
Yw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjIwYjYwODgNCi0tLSAvZGV2
L251bGwNCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9pc3IuYw0K
QEAgLTAsMCArMSwxNTAgQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDE1LCBNYXJ2
ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUg
IkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwNCisgKiBMdGQu
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lv
biAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0
cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICogYWNjb3JkYW5jZSB3aXRoIHRo
ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdoaWNoDQor
ICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQg
V0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorICog
QVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25h
bCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0KKyAqLw0KKw0K
Ky8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGltcGxlbWVudHMgaW50ZXJydXB0IHJlbGF0ZWQg
ZnVuY3Rpb25zLiAqLw0KKw0KKyNpbmNsdWRlICJzeXNhZHB0LmgiDQorI2luY2x1ZGUgImRldi5o
Ig0KKyNpbmNsdWRlICJmd2NtZC5oIg0KKyNpbmNsdWRlICJpc3IuaCINCisNCisjZGVmaW5lIElO
VkFMSURfV0FUQ0hET0cgMHhBQQ0KKw0KK2lycXJldHVybl90IG13bF9pc3IoaW50IGlycSwgdm9p
ZCAqZGV2X2lkKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBkZXZfaWQ7DQorCXN0
cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwl2b2lkIF9faW9tZW0gKmludF9zdGF0
dXNfbWFzazsNCisJdW5zaWduZWQgaW50IGludF9zdGF0dXMsIGNscl9zdGF0dXM7DQorCXUzMiBz
dGF0dXM7DQorDQorCWludF9zdGF0dXNfbWFzayA9IHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVH
X0EySF9JTlRFUlJVUFRfU1RBVFVTX01BU0s7DQorDQorCWludF9zdGF0dXMgPSByZWFkbChwcml2
LT5pb2Jhc2UxICsgTUFDUkVHX1JFR19BMkhfSU5URVJSVVBUX0NBVVNFKTsNCisNCisJaWYgKGlu
dF9zdGF0dXMgPT0gMHgwMDAwMDAwMCkNCisJCXJldHVybiBJUlFfTk9ORTsNCisNCisJaWYgKGlu
dF9zdGF0dXMgPT0gMHhmZmZmZmZmZikgew0KKwkJd2lwaHlfd2Fybihody0+d2lwaHksICJjYXJk
IHVucGx1Z2dlZD9cbiIpOw0KKwl9IGVsc2Ugew0KKwkJY2xyX3N0YXR1cyA9IGludF9zdGF0dXM7
DQorDQorCQlpZiAoaW50X3N0YXR1cyAmIE1BQ1JFR19BMkhSSUNfQklUX1RYX0RPTkUpIHsNCisJ
CQlpbnRfc3RhdHVzICY9IH5NQUNSRUdfQTJIUklDX0JJVF9UWF9ET05FOw0KKw0KKwkJCWlmICgh
cHJpdi0+aXNfdHhfc2NoZWR1bGUpIHsNCisJCQkJc3RhdHVzID0gcmVhZGwoaW50X3N0YXR1c19t
YXNrKTsNCisJCQkJd3JpdGVsKChzdGF0dXMgJiB+TUFDUkVHX0EySFJJQ19CSVRfVFhfRE9ORSks
DQorCQkJCSAgICAgICBpbnRfc3RhdHVzX21hc2spOw0KKwkJCQl0YXNrbGV0X3NjaGVkdWxlKCZw
cml2LT50eF90YXNrKTsNCisJCQkJcHJpdi0+aXNfdHhfc2NoZWR1bGUgPSB0cnVlOw0KKwkJCX0N
CisJCX0NCisNCisJCWlmIChpbnRfc3RhdHVzICYgTUFDUkVHX0EySFJJQ19CSVRfUlhfUkRZKSB7
DQorCQkJaW50X3N0YXR1cyAmPSB+TUFDUkVHX0EySFJJQ19CSVRfUlhfUkRZOw0KKw0KKwkJCWlm
ICghcHJpdi0+aXNfcnhfc2NoZWR1bGUpIHsNCisJCQkJc3RhdHVzID0gcmVhZGwoaW50X3N0YXR1
c19tYXNrKTsNCisJCQkJd3JpdGVsKChzdGF0dXMgJiB+TUFDUkVHX0EySFJJQ19CSVRfUlhfUkRZ
KSwNCisJCQkJICAgICAgIGludF9zdGF0dXNfbWFzayk7DQorCQkJCXRhc2tsZXRfc2NoZWR1bGUo
JnByaXYtPnJ4X3Rhc2spOw0KKwkJCQlwcml2LT5pc19yeF9zY2hlZHVsZSA9IHRydWU7DQorCQkJ
fQ0KKwkJfQ0KKw0KKwkJaWYgKGludF9zdGF0dXMgJiBNQUNSRUdfQTJIUklDX0JJVF9RVUVfRU1Q
VFkpIHsNCisJCQlpbnRfc3RhdHVzICY9IH5NQUNSRUdfQTJIUklDX0JJVF9RVUVfRU1QVFk7DQor
DQorCQkJaWYgKCFwcml2LT5pc19xZV9zY2hlZHVsZSkgew0KKwkJCQlzdGF0dXMgPSByZWFkbChp
bnRfc3RhdHVzX21hc2spOw0KKwkJCQl3cml0ZWwoKHN0YXR1cyAmIH5NQUNSRUdfQTJIUklDX0JJ
VF9RVUVfRU1QVFkpLA0KKwkJCQkgICAgICAgaW50X3N0YXR1c19tYXNrKTsNCisJCQkJdGFza2xl
dF9zY2hlZHVsZSgmcHJpdi0+cWVfdGFzayk7DQorCQkJCXByaXYtPmlzX3FlX3NjaGVkdWxlID0g
dHJ1ZTsNCisJCQl9DQorCQl9DQorDQorCQlpZiAoaW50X3N0YXR1cyAmIE1BQ1JFR19BMkhSSUNf
QkFfV0FUQ0hET0cpIHsNCisJCQlzdGF0dXMgPSByZWFkbChpbnRfc3RhdHVzX21hc2spOw0KKwkJ
CXdyaXRlbCgoc3RhdHVzICYgfk1BQ1JFR19BMkhSSUNfQkFfV0FUQ0hET0cpLA0KKwkJCSAgICAg
ICBpbnRfc3RhdHVzX21hc2spOw0KKwkJCWludF9zdGF0dXMgJj0gfk1BQ1JFR19BMkhSSUNfQkFf
V0FUQ0hET0c7DQorCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoaHcsICZwcml2LT53YXRjaGRvZ19i
YV9oYW5kbGUpOw0KKwkJfQ0KKw0KKwkJd3JpdGVsKH5jbHJfc3RhdHVzLA0KKwkJICAgICAgIHBy
aXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfQ0FVU0UpOw0KKwl9DQorDQor
CXJldHVybiBJUlFfSEFORExFRDsNCit9DQorDQordm9pZCBtd2xfd2F0Y2hkb2dfYmFfZXZlbnRz
KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykNCit7DQorCWludCByYzsNCisJdTggYml0bWFwID0g
MCwgc3RyZWFtX2luZGV4Ow0KKwlzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtczsNCisJ
c3RydWN0IG13bF9wcml2ICpwcml2ID0NCisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXds
X3ByaXYsIHdhdGNoZG9nX2JhX2hhbmRsZSk7DQorCXUzMiBzdGF0dXM7DQorDQorCXJjID0gbXds
X2Z3Y21kX2dldF93YXRjaGRvZ19iaXRtYXAocHJpdi0+aHcsICZiaXRtYXApOw0KKw0KKwlpZiAo
cmMpDQorCQlnb3RvIGRvbmU7DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2sp
Ow0KKw0KKwkvKiB0aGUgYml0bWFwIGlzIHRoZSBodyBxdWV1ZSBudW1iZXIuICBNYXAgaXQgdG8g
dGhlIGFtcGR1IHF1ZXVlLiAqLw0KKwlpZiAoYml0bWFwICE9IElOVkFMSURfV0FUQ0hET0cpIHsN
CisJCWlmIChiaXRtYXAgPT0gU1lTQURQVF9UWF9BTVBEVV9RVUVVRVMpDQorCQkJc3RyZWFtX2lu
ZGV4ID0gMDsNCisJCWVsc2UgaWYgKGJpdG1hcCA+IFNZU0FEUFRfVFhfQU1QRFVfUVVFVUVTKQ0K
KwkJCXN0cmVhbV9pbmRleCA9IGJpdG1hcCAtIFNZU0FEUFRfVFhfQU1QRFVfUVVFVUVTOw0KKwkJ
ZWxzZQ0KKwkJCXN0cmVhbV9pbmRleCA9IGJpdG1hcCArIDM7IC8qKiBxdWV1ZSAwIGlzIHN0cmVh
bSAzKi8NCisNCisJCWlmIChiaXRtYXAgIT0gMHhGRikgew0KKwkJCS8qIENoZWNrIGlmIHRoZSBz
dHJlYW0gaXMgaW4gdXNlIGJlZm9yZSBkaXNhYmxpbmcgaXQgKi8NCisJCQlzdHJlYW1zID0gJnBy
aXYtPmFtcGR1W3N0cmVhbV9pbmRleF07DQorDQorCQkJaWYgKHN0cmVhbXMtPnN0YXRlID09IEFN
UERVX1NUUkVBTV9BQ1RJVkUpDQorCQkJCWllZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oc3Ry
ZWFtcy0+c3RhLA0KKwkJCQkJCQkgICAgIHN0cmVhbXMtPnRpZCk7DQorCQl9IGVsc2Ugew0KKwkJ
CWZvciAoc3RyZWFtX2luZGV4ID0gMDsNCisJCQkgICAgIHN0cmVhbV9pbmRleCA8IFNZU0FEUFRf
VFhfQU1QRFVfUVVFVUVTOw0KKwkJCSAgICAgc3RyZWFtX2luZGV4KyspIHsNCisJCQkJc3RyZWFt
cyA9ICZwcml2LT5hbXBkdVtzdHJlYW1faW5kZXhdOw0KKw0KKwkJCQlpZiAoc3RyZWFtcy0+c3Rh
dGUgIT0gQU1QRFVfU1RSRUFNX0FDVElWRSkNCisJCQkJCWNvbnRpbnVlOw0KKw0KKwkJCQlpZWVl
ODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0cmVhbXMtPnN0YSwNCisJCQkJCQkJICAgICBzdHJl
YW1zLT50aWQpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+
c3RyZWFtX2xvY2spOw0KKw0KK2RvbmU6DQorDQorCXN0YXR1cyA9IHJlYWRsKHByaXYtPmlvYmFz
ZTEgKyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfU1RBVFVTX01BU0spOw0KKwl3cml0ZWwoc3Rh
dHVzIHwgTUFDUkVHX0EySFJJQ19CQV9XQVRDSERPRywNCisJICAgICAgIHByaXYtPmlvYmFzZTEg
KyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfU1RBVFVTX01BU0spOw0KK30NCmRpZmYgLS1naXQg
YS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvaXNyLmggYi9kcml2ZXJzL25l
dC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvaXNyLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQpp
bmRleCAwMDAwMDAwLi4yNTk4MTE1DQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL25ldC93
aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvaXNyLmgNCkBAIC0wLDAgKzEsMjYgQEANCisvKg0KKyAq
IENvcHlyaWdodCAoQykgMjAwNi0yMDE1LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAq
DQorICogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBN
YXJ2ZWxsIEludGVybmF0aW9uYWwNCisgKiBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTENCisgKiAodGhlICJM
aWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBG
aWxlIGluDQorICogYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0
aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdoaWNoDQorICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcg
dG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUg
SVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBU
SEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorICogQVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAg
VGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3
YXJyYW50eSBkaXNjbGFpbWVyLg0KKyAqLw0KKw0KKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxl
IGRlZmluZXMgaW50ZXJydXB0IHJlbGF0ZWQgZnVuY3Rpb25zLiAqLw0KKw0KKyNpZm5kZWYgX2lz
cl9oXw0KKyNkZWZpbmUgX2lzcl9oXw0KKw0KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4N
CisNCitpcnFyZXR1cm5fdCBtd2xfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7DQordm9pZCBt
d2xfd2F0Y2hkb2dfYmFfZXZlbnRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7DQorDQorI2Vu
ZGlmIC8qIF9pc3JfaF8gKi8NCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2
ZWxsL213bHdpZmkvbWFjODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXds
d2lmaS9tYWM4MDIxMS5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uZmY5
MzM1Nw0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t
d2x3aWZpL21hYzgwMjExLmMNCkBAIC0wLDAgKzEsNjk5IEBADQorLyoNCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDYtMjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4NCisgKg0KKyAqIFRoaXMg
c29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCBJbnRl
cm5hdGlvbmFsDQorICogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxDQorICogKHRoZSAiTGljZW5zZSIpLiAg
WW91IG1heSB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSBpbg0KKyAq
IGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2Us
IGEgY29weSBvZiB3aGljaA0KKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0aW5nIHRvIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqIFRIRSBGSUxFIElTIERJU1RSSUJV
VEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFDQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRQ0KKyAqIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1FRC4gIFRoZSBMaWNlbnNl
IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dA0KKyAqIHRoaXMgd2FycmFudHkgZGlz
Y2xhaW1lci4NCisgKi8NCisNCisvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbXBsZW1lbnRz
IG1hYzgwMjExIHJlbGF0ZWQgZnVuY3Rpb25zLiAqLw0KKw0KKyNpbmNsdWRlIDxsaW51eC9ldGhl
cmRldmljZS5oPg0KKw0KKyNpbmNsdWRlICJzeXNhZHB0LmgiDQorI2luY2x1ZGUgImRldi5oIg0K
KyNpbmNsdWRlICJmd2NtZC5oIg0KKyNpbmNsdWRlICJ0eC5oIg0KKw0KKyNkZWZpbmUgTVdMX0RS
Vl9OQU1FICAgICAgICBLQlVJTERfTU9ETkFNRQ0KKw0KKyNkZWZpbmUgTUFYX0FNUERVX0FUVEVN
UFRTICA1DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBtd2xfcmF0ZXNf
MjRbXSA9IHsNCisJeyAuYml0cmF0ZSA9IDEwLCAuaHdfdmFsdWUgPSAyLCB9LA0KKwl7IC5iaXRy
YXRlID0gMjAsIC5od192YWx1ZSA9IDQsIH0sDQorCXsgLmJpdHJhdGUgPSA1NSwgLmh3X3ZhbHVl
ID0gMTEsIH0sDQorCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IDIyLCB9LA0KKwl7IC5i
aXRyYXRlID0gMjIwLCAuaHdfdmFsdWUgPSA0NCwgfSwNCisJeyAuYml0cmF0ZSA9IDYwLCAuaHdf
dmFsdWUgPSAxMiwgfSwNCisJeyAuYml0cmF0ZSA9IDkwLCAuaHdfdmFsdWUgPSAxOCwgfSwNCisJ
eyAuYml0cmF0ZSA9IDEyMCwgLmh3X3ZhbHVlID0gMjQsIH0sDQorCXsgLmJpdHJhdGUgPSAxODAs
IC5od192YWx1ZSA9IDM2LCB9LA0KKwl7IC5iaXRyYXRlID0gMjQwLCAuaHdfdmFsdWUgPSA0OCwg
fSwNCisJeyAuYml0cmF0ZSA9IDM2MCwgLmh3X3ZhbHVlID0gNzIsIH0sDQorCXsgLmJpdHJhdGUg
PSA0ODAsIC5od192YWx1ZSA9IDk2LCB9LA0KKwl7IC5iaXRyYXRlID0gNTQwLCAuaHdfdmFsdWUg
PSAxMDgsIH0sDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlIG13
bF9yYXRlc181MFtdID0gew0KKwl7IC5iaXRyYXRlID0gNjAsIC5od192YWx1ZSA9IDEyLCB9LA0K
Kwl7IC5iaXRyYXRlID0gOTAsIC5od192YWx1ZSA9IDE4LCB9LA0KKwl7IC5iaXRyYXRlID0gMTIw
LCAuaHdfdmFsdWUgPSAyNCwgfSwNCisJeyAuYml0cmF0ZSA9IDE4MCwgLmh3X3ZhbHVlID0gMzYs
IH0sDQorCXsgLmJpdHJhdGUgPSAyNDAsIC5od192YWx1ZSA9IDQ4LCB9LA0KKwl7IC5iaXRyYXRl
ID0gMzYwLCAuaHdfdmFsdWUgPSA3MiwgfSwNCisJeyAuYml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVl
ID0gOTYsIH0sDQorCXsgLmJpdHJhdGUgPSA1NDAsIC5od192YWx1ZSA9IDEwOCwgfSwNCit9Ow0K
Kw0KK3N0YXRpYyB2b2lkIG13bF9tYWM4MDIxMV90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywN
CisJCQkgICAgc3RydWN0IGllZWU4MDIxMV90eF9jb250cm9sICpjb250cm9sLA0KKwkJCSAgICBz
dHJ1Y3Qgc2tfYnVmZiAqc2tiKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnBy
aXY7DQorDQorCWlmICghcHJpdi0+cmFkaW9fb24pIHsNCisJCXdpcGh5X3dhcm4oaHctPndpcGh5
LA0KKwkJCSAgICJkcm9wcGVkIFRYIGZyYW1lIHNpbmNlIHJhZGlvIGlzIGRpc2FibGVkXG4iKTsN
CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7DQorCQlyZXR1cm47DQorCX0NCisNCisJbXdsX3R4
X3htaXQoaHcsIGNvbnRyb2wsIHNrYik7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX21hYzgwMjEx
X3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpw
cml2ID0gaHctPnByaXY7DQorCWludCByYzsNCisNCisJLyogRW5hYmxlIFRYIHJlY2xhaW0gYW5k
IFJYIHRhc2tsZXRzLiAqLw0KKwl0YXNrbGV0X2VuYWJsZSgmcHJpdi0+dHhfdGFzayk7DQorCXRh
c2tsZXRfZW5hYmxlKCZwcml2LT5yeF90YXNrKTsNCisJdGFza2xldF9lbmFibGUoJnByaXYtPnFl
X3Rhc2spOw0KKw0KKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLw0KKwltd2xfZndjbWRfaW50X2Vu
YWJsZShodyk7DQorDQorCXJjID0gbXdsX2Z3Y21kX3JhZGlvX2VuYWJsZShodyk7DQorCWlmIChy
YykNCisJCWdvdG8gZndjbWRfZmFpbDsNCisJcmMgPSBtd2xfZndjbWRfc2V0X3JhdGVfYWRhcHRf
bW9kZShodywgMCk7DQorCWlmIChyYykNCisJCWdvdG8gZndjbWRfZmFpbDsNCisJcmMgPSBtd2xf
ZndjbWRfc2V0X3dtbV9tb2RlKGh3LCB0cnVlKTsNCisJaWYgKHJjKQ0KKwkJZ290byBmd2NtZF9m
YWlsOw0KKwlyYyA9IG13bF9md2NtZF9odF9ndWFyZF9pbnRlcnZhbChodywgR1VBUkRfSU5URVJW
QUxfQVVUTyk7DQorCWlmIChyYykNCisJCWdvdG8gZndjbWRfZmFpbDsNCisJcmMgPSBtd2xfZndj
bWRfc2V0X2R3ZHNfc3RhbW9kZShodywgdHJ1ZSk7DQorCWlmIChyYykNCisJCWdvdG8gZndjbWRf
ZmFpbDsNCisJcmMgPSBtd2xfZndjbWRfc2V0X2Z3X2ZsdXNoX3RpbWVyKGh3LCBTWVNBRFBUX0FN
U0RVX0ZMVVNIX1RJTUUpOw0KKwlpZiAocmMpDQorCQlnb3RvIGZ3Y21kX2ZhaWw7DQorCXJjID0g
bXdsX2Z3Y21kX3NldF9vcHRpbWl6YXRpb25fbGV2ZWwoaHcsIDEpOw0KKwlpZiAocmMpDQorCQln
b3RvIGZ3Y21kX2ZhaWw7DQorDQorCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7DQorCXJldHVy
biAwOw0KKw0KK2Z3Y21kX2ZhaWw6DQorCW13bF9md2NtZF9pbnRfZGlzYWJsZShodyk7DQorCXRh
c2tsZXRfZGlzYWJsZSgmcHJpdi0+dHhfdGFzayk7DQorCXRhc2tsZXRfZGlzYWJsZSgmcHJpdi0+
cnhfdGFzayk7DQorCXRhc2tsZXRfZGlzYWJsZSgmcHJpdi0+cWVfdGFzayk7DQorDQorCXJldHVy
biByYzsNCit9DQorDQorc3RhdGljIHZvaWQgbXdsX21hYzgwMjExX3N0b3Aoc3RydWN0IGllZWU4
MDIxMV9odyAqaHcpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisN
CisJbXdsX2Z3Y21kX3JhZGlvX2Rpc2FibGUoaHcpOw0KKw0KKwlpZWVlODAyMTFfc3RvcF9xdWV1
ZXMoaHcpOw0KKw0KKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8NCisJbXdsX2Z3Y21kX2ludF9k
aXNhYmxlKGh3KTsNCisNCisJLyogRGlzYWJsZSBUWCByZWNsYWltIGFuZCBSWCB0YXNrbGV0cy4g
Ki8NCisJdGFza2xldF9kaXNhYmxlKCZwcml2LT50eF90YXNrKTsNCisJdGFza2xldF9kaXNhYmxl
KCZwcml2LT5yeF90YXNrKTsNCisJdGFza2xldF9kaXNhYmxlKCZwcml2LT5xZV90YXNrKTsNCisN
CisJLyogUmV0dXJuIGFsbCBza2JzIHRvIG1hYzgwMjExICovDQorCW13bF90eF9kb25lKCh1bnNp
Z25lZCBsb25nKWh3KTsNCit9DQorDQorc3RhdGljIGludCBtd2xfbWFjODAyMTFfYWRkX2ludGVy
ZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIx
MV92aWYgKnZpZikNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlz
dHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZjsNCisJdTMyIG1hY2lkc19zdXBwb3J0ZWQ7DQorCWludCBt
YWNpZDsNCisNCisJc3dpdGNoICh2aWYtPnR5cGUpIHsNCisJY2FzZSBOTDgwMjExX0lGVFlQRV9B
UDoNCisJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOg0KKwkJbWFjaWRzX3N1cHBvcnRl
ZCA9IHByaXYtPmFwX21hY2lkc19zdXBwb3J0ZWQ7DQorCQlicmVhazsNCisJY2FzZSBOTDgwMjEx
X0lGVFlQRV9TVEFUSU9OOg0KKwkJbWFjaWRzX3N1cHBvcnRlZCA9IHByaXYtPnN0YV9tYWNpZHNf
c3VwcG9ydGVkOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQlyZXR1cm4gLUVJTlZBTDsNCisJ
fQ0KKw0KKwltYWNpZCA9IGZmcyhtYWNpZHNfc3VwcG9ydGVkICYgfnByaXYtPm1hY2lkc191c2Vk
KTsNCisNCisJaWYgKCFtYWNpZCkgew0KKwkJd2lwaHlfd2Fybihody0+d2lwaHksICJubyBtYWNp
ZCBjYW4gYmUgYWxsb2NhdGVkXG4iKTsNCisJCXJldHVybiAtRUJVU1k7DQorCX0NCisJbWFjaWQt
LTsNCisNCisJLyogU2V0dXAgZHJpdmVyIHByaXZhdGUgYXJlYS4gKi8NCisJbXdsX3ZpZiA9IG13
bF9kZXZfZ2V0X3ZpZih2aWYpOw0KKwltZW1zZXQobXdsX3ZpZiwgMCwgc2l6ZW9mKCptd2xfdmlm
KSk7DQorCW13bF92aWYtPm1hY2lkID0gbWFjaWQ7DQorCW13bF92aWYtPnNlcW5vID0gMDsNCisJ
bXdsX3ZpZi0+aXNfaHdfY3J5cHRvX2VuYWJsZWQgPSBmYWxzZTsNCisJbXdsX3ZpZi0+YmVhY29u
X2luZm8udmFsaWQgPSBmYWxzZTsNCisJbXdsX3ZpZi0+aXYxNiA9IDE7DQorCW13bF92aWYtPml2
MzIgPSAwOw0KKwltd2xfdmlmLT5rZXlpZHggPSAwOw0KKw0KKwlzd2l0Y2ggKHZpZi0+dHlwZSkg
ew0KKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOg0KKwkJZXRoZXJfYWRkcl9jb3B5KG13bF92aWYt
PmJzc2lkLCB2aWYtPmFkZHIpOw0KKwkJbXdsX2Z3Y21kX3NldF9uZXdfc3RuX2FkZF9zZWxmKGh3
LCB2aWYpOw0KKwkJYnJlYWs7DQorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoNCisJ
CWV0aGVyX2FkZHJfY29weShtd2xfdmlmLT5ic3NpZCwgdmlmLT5hZGRyKTsNCisJCW13bF9md2Nt
ZF9zZXRfbmV3X3N0bl9hZGRfc2VsZihodywgdmlmKTsNCisJCWJyZWFrOw0KKwljYXNlIE5MODAy
MTFfSUZUWVBFX1NUQVRJT046DQorCQlldGhlcl9hZGRyX2NvcHkobXdsX3ZpZi0+c3RhX21hYywg
dmlmLT5hZGRyKTsNCisJCW13bF9md2NtZF9ic3Nfc3RhcnQoaHcsIHZpZiwgdHJ1ZSk7DQorCQlt
d2xfZndjbWRfc2V0X2luZnJhX21vZGUoaHcsIHZpZik7DQorCQltd2xfZndjbWRfc2V0X21hY19h
ZGRyX2NsaWVudChodywgdmlmLCB2aWYtPmFkZHIpOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQor
CQlyZXR1cm4gLUVJTlZBTDsNCisJfQ0KKw0KKwlwcml2LT5tYWNpZHNfdXNlZCB8PSAxIDw8IG13
bF92aWYtPm1hY2lkOw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPnZpZl9sb2NrKTsNCisJbGlzdF9h
ZGRfdGFpbCgmbXdsX3ZpZi0+bGlzdCwgJnByaXYtPnZpZl9saXN0KTsNCisJc3Bpbl91bmxvY2tf
YmgoJnByaXYtPnZpZl9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyB2b2lk
IG13bF9tYWM4MDIxMV9yZW1vdmVfdmlmKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwNCisJCQkJICAg
IHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpDQorew0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3Zp
ZiA9IG13bF9kZXZfZ2V0X3ZpZih2aWYpOw0KKw0KKwlpZiAoIXByaXYtPm1hY2lkc191c2VkKQ0K
KwkJcmV0dXJuOw0KKw0KKwltd2xfdHhfZGVsX3BrdHNfdmlhX3ZpZihwcml2LT5odywgdmlmKTsN
CisNCisJcHJpdi0+bWFjaWRzX3VzZWQgJj0gfigxIDw8IG13bF92aWYtPm1hY2lkKTsNCisJc3Bp
bl9sb2NrX2JoKCZwcml2LT52aWZfbG9jayk7DQorCWxpc3RfZGVsKCZtd2xfdmlmLT5saXN0KTsN
CisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnZpZl9sb2NrKTsNCit9DQorDQorc3RhdGljIHZvaWQg
bXdsX21hYzgwMjExX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQor
CQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYg
KnByaXYgPSBody0+cHJpdjsNCisNCisJc3dpdGNoICh2aWYtPnR5cGUpIHsNCisJY2FzZSBOTDgw
MjExX0lGVFlQRV9BUDoNCisJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOg0KKwkJbXds
X2Z3Y21kX3NldF9uZXdfc3RuX2RlbChodywgdmlmLCB2aWYtPmFkZHIpOw0KKwkJYnJlYWs7DQor
CWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoNCisJCW13bF9md2NtZF9yZW1vdmVfbWFjX2Fk
ZHIoaHcsIHZpZiwgdmlmLT5hZGRyKTsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJYnJlYWs7
DQorCX0NCisNCisJbXdsX21hYzgwMjExX3JlbW92ZV92aWYocHJpdiwgdmlmKTsNCit9DQorDQor
c3RhdGljIGludCBtd2xfbWFjODAyMTFfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0K
KwkJCSAgICAgICB1MzIgY2hhbmdlZCkNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29u
ZiA9ICZody0+Y29uZjsNCisJaW50IHJjOw0KKw0KKwl3aXBoeV9kZWJ1Zyhody0+d2lwaHksICJj
aGFuZ2U6IDB4JXhcbiIsIGNoYW5nZWQpOw0KKw0KKwlpZiAoY29uZi0+ZmxhZ3MgJiBJRUVFODAy
MTFfQ09ORl9JRExFKQ0KKwkJcmMgPSBtd2xfZndjbWRfcmFkaW9fZGlzYWJsZShodyk7DQorCWVs
c2UNCisJCXJjID0gbXdsX2Z3Y21kX3JhZGlvX2VuYWJsZShodyk7DQorDQorCWlmIChyYykNCisJ
CWdvdG8gb3V0Ow0KKw0KKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFO
TkVMKSB7DQorCQlpbnQgcmF0ZSA9IDA7DQorDQorCQlpZiAoY29uZi0+Y2hhbmRlZi5jaGFuLT5i
YW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsNCisJCQltd2xfZndjbWRfc2V0X2FwbW9kZSho
dywgQVBfTU9ERV8yXzRHSFpfMTFBQ19NSVhFRCk7DQorCQkJbXdsX2Z3Y21kX3NldF9saW5rYWRh
cHRfY3NfbW9kZShodywNCisJCQkJCQkJTElOS19DU19TVEFURV9DT05TRVJWKTsNCisJCQlyYXRl
ID0gbXdsX3JhdGVzXzI0WzBdLmh3X3ZhbHVlOw0KKwkJfSBlbHNlIGlmIChjb25mLT5jaGFuZGVm
LmNoYW4tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgew0KKwkJCW13bF9md2NtZF9zZXRf
YXBtb2RlKGh3LCBBUF9NT0RFXzExQUMpOw0KKwkJCW13bF9md2NtZF9zZXRfbGlua2FkYXB0X2Nz
X21vZGUoaHcsDQorCQkJCQkJCUxJTktfQ1NfU1RBVEVfQVVUTyk7DQorCQkJcmF0ZSA9IG13bF9y
YXRlc181MFswXS5od192YWx1ZTsNCisJCX0NCisNCisJCXJjID0gbXdsX2Z3Y21kX3NldF9yZl9j
aGFubmVsKGh3LCBjb25mKTsNCisJCWlmIChyYykNCisJCQlnb3RvIG91dDsNCisJCXJjID0gbXds
X2Z3Y21kX3VzZV9maXhlZF9yYXRlKGh3LCByYXRlLCByYXRlKTsNCisJCWlmIChyYykNCisJCQln
b3RvIG91dDsNCisJCXJjID0gbXdsX2Z3Y21kX21heF90eF9wb3dlcihodywgY29uZiwgMCk7DQor
CQlpZiAocmMpDQorCQkJZ290byBvdXQ7DQorCQlyYyA9IG13bF9md2NtZF90eF9wb3dlcihodywg
Y29uZiwgMCk7DQorCQlpZiAocmMpDQorCQkJZ290byBvdXQ7DQorCQlyYyA9IG13bF9md2NtZF9z
ZXRfY2RkKGh3KTsNCisJfQ0KKw0KK291dDoNCisNCisJcmV0dXJuIHJjOw0KK30NCisNCitzdGF0
aWMgdm9pZCBtd2xfbWFjODAyMTFfYnNzX2luZm9fY2hhbmdlZF9zdGEoc3RydWN0IGllZWU4MDIx
MV9odyAqaHcsDQorCQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCQkJ
ICAgICAgc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqaW5mbywNCisJCQkJCSAgICAgIHUzMiBj
aGFuZ2VkKQ0KK3sNCisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9FUlBfUFJFQU1CTEUpDQor
CQltd2xfZndjbWRfc2V0X3JhZGlvX3ByZWFtYmxlKGh3LA0KKwkJCQkJICAgICB2aWYtPmJzc19j
b25mLnVzZV9zaG9ydF9wcmVhbWJsZSk7DQorDQorCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VE
X0FTU09DKSAmJiB2aWYtPmJzc19jb25mLmFzc29jKQ0KKwkJbXdsX2Z3Y21kX3NldF9haWQoaHcs
IHZpZiwgKHU4ICopdmlmLT5ic3NfY29uZi5ic3NpZCwNCisJCQkJICB2aWYtPmJzc19jb25mLmFp
ZCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9tYWM4MDIxMV9ic3NfaW5mb19jaGFuZ2VkX2Fw
KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Zp
ZiAqdmlmLA0KKwkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICppbmZvLA0KKwkJ
CQkJICAgICB1MzIgY2hhbmdlZCkNCit7DQorCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQ
X1BSRUFNQkxFKQ0KKwkJbXdsX2Z3Y21kX3NldF9yYWRpb19wcmVhbWJsZShodywNCisJCQkJCSAg
ICAgdmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpOw0KKw0KKwlpZiAoY2hhbmdlZCAm
IEJTU19DSEFOR0VEX0JBU0lDX1JBVEVTKSB7DQorCQlpbnQgaWR4Ow0KKwkJaW50IHJhdGU7DQor
DQorCQkvKiBVc2UgbG93ZXN0IHN1cHBvcnRlZCBiYXNpYyByYXRlIGZvciBtdWx0aWNhc3RzDQor
CQkgKiBhbmQgbWFuYWdlbWVudCBmcmFtZXMgKHN1Y2ggYXMgcHJvYmUgcmVzcG9uc2VzIC0tDQor
CQkgKiBiZWFjb25zIHdpbGwgYWx3YXlzIGdvIG91dCBhdCAxIE1iL3MpLg0KKwkJICovDQorCQlp
ZHggPSBmZnModmlmLT5ic3NfY29uZi5iYXNpY19yYXRlcyk7DQorCQlpZiAoaWR4KQ0KKwkJCWlk
eC0tOw0KKw0KKwkJaWYgKGh3LT5jb25mLmNoYW5kZWYuY2hhbi0+YmFuZCA9PSBJRUVFODAyMTFf
QkFORF8yR0haKQ0KKwkJCXJhdGUgPSBtd2xfcmF0ZXNfMjRbaWR4XS5od192YWx1ZTsNCisJCWVs
c2UNCisJCQlyYXRlID0gbXdsX3JhdGVzXzUwW2lkeF0uaHdfdmFsdWU7DQorDQorCQltd2xfZndj
bWRfdXNlX2ZpeGVkX3JhdGUoaHcsIHJhdGUsIHJhdGUpOw0KKwl9DQorDQorCWlmIChjaGFuZ2Vk
ICYgKEJTU19DSEFOR0VEX0JFQUNPTl9JTlQgfCBCU1NfQ0hBTkdFRF9CRUFDT04pKSB7DQorCQlz
dHJ1Y3Qgc2tfYnVmZiAqc2tiOw0KKw0KKwkJc2tiID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcs
IHZpZik7DQorDQorCQlpZiAoc2tiKSB7DQorCQkJbXdsX2Z3Y21kX3NldF9iZWFjb24oaHcsIHZp
Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7DQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsNCisJ
CX0NCisNCisJCWlmICgoaW5mby0+c3NpZFswXSAhPSAnXDAnKSAmJg0KKwkJICAgIChpbmZvLT5z
c2lkX2xlbiAhPSAwKSAmJg0KKwkJICAgICghaW5mby0+aGlkZGVuX3NzaWQpKQ0KKwkJCW13bF9m
d2NtZF9icm9hZGNhc3Rfc3NpZF9lbmFibGUoaHcsIHZpZiwgdHJ1ZSk7DQorCQllbHNlDQorCQkJ
bXdsX2Z3Y21kX2Jyb2FkY2FzdF9zc2lkX2VuYWJsZShodywgdmlmLCBmYWxzZSk7DQorCX0NCisN
CisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCkNCisJCW13bF9md2Nt
ZF9ic3Nfc3RhcnQoaHcsIHZpZiwgaW5mby0+ZW5hYmxlX2JlYWNvbik7DQorfQ0KKw0KK3N0YXRp
YyB2b2lkIG13bF9tYWM4MDIxMV9ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcg
Kmh3LA0KKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCQkJICBzdHJ1Y3Qg
aWVlZTgwMjExX2Jzc19jb25mICppbmZvLA0KKwkJCQkJICB1MzIgY2hhbmdlZCkNCit7DQorCXN3
aXRjaCAodmlmLT50eXBlKSB7DQorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6DQorCWNhc2UgTkw4
MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoNCisJCW13bF9tYWM4MDIxMV9ic3NfaW5mb19jaGFuZ2Vk
X2FwKGh3LCB2aWYsIGluZm8sIGNoYW5nZWQpOw0KKwkJYnJlYWs7DQorCWNhc2UgTkw4MDIxMV9J
RlRZUEVfU1RBVElPTjoNCisJCW13bF9tYWM4MDIxMV9ic3NfaW5mb19jaGFuZ2VkX3N0YShodywg
dmlmLCBpbmZvLCBjaGFuZ2VkKTsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJYnJlYWs7DQor
CX0NCit9DQorDQorc3RhdGljIHZvaWQgbXdsX21hYzgwMjExX2NvbmZpZ3VyZV9maWx0ZXIoc3Ry
dWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCQkgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdz
LA0KKwkJCQkJICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLA0KKwkJCQkJICB1NjQgbXVsdGlj
YXN0KQ0KK3sNCisJLyogQVAgZmlybXdhcmUgZG9lc24ndCBhbGxvdyBmaW5lLWdyYWluZWQgY29u
dHJvbCBvdmVyDQorCSAqIHRoZSByZWNlaXZlIGZpbHRlci4NCisJICovDQorCSp0b3RhbF9mbGFn
cyAmPSBGSUZfQUxMTVVMVEkgfCBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQzsNCit9DQorDQorc3Rh
dGljIGludCBtd2xfbWFjODAyMTFfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJ
CQkJZW51bSBzZXRfa2V5X2NtZCBjbWRfcGFyYW0sDQorCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlm
ICp2aWYsDQorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsDQorCQkJCXN0cnVjdCBpZWVl
ODAyMTFfa2V5X2NvbmYgKmtleSkNCit7DQorCXN0cnVjdCBtd2xfdmlmICptd2xfdmlmOw0KKwlp
bnQgcmMgPSAwOw0KKwl1OCBlbmNyX3R5cGU7DQorCXU4ICphZGRyOw0KKw0KKwltd2xfdmlmID0g
bXdsX2Rldl9nZXRfdmlmKHZpZik7DQorDQorCWlmICghc3RhKSB7DQorCQlhZGRyID0gdmlmLT5h
ZGRyOw0KKwl9IGVsc2Ugew0KKwkJYWRkciA9IHN0YS0+YWRkcjsNCisJCWlmICh2aWYtPnR5cGUg
PT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikNCisJCQlldGhlcl9hZGRyX2NvcHkobXdsX3ZpZi0+
YnNzaWQsIGFkZHIpOw0KKwl9DQorDQorCWlmIChjbWRfcGFyYW0gPT0gU0VUX0tFWSkgew0KKwkJ
cmMgPSBtd2xfZndjbWRfZW5jcnlwdGlvbl9zZXRfa2V5KGh3LCB2aWYsIGFkZHIsIGtleSk7DQor
DQorCQlpZiAocmMpDQorCQkJZ290byBvdXQ7DQorDQorCQlpZiAoKGtleS0+Y2lwaGVyID09IFdM
QU5fQ0lQSEVSX1NVSVRFX1dFUDQwKSB8fA0KKwkJICAgIChrZXktPmNpcGhlciA9PSBXTEFOX0NJ
UEhFUl9TVUlURV9XRVAxMDQpKSB7DQorCQkJZW5jcl90eXBlID0gRU5DUl9UWVBFX1dFUDsNCisJ
CX0gZWxzZSBpZiAoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkgew0KKwkJ
CWVuY3JfdHlwZSA9IEVOQ1JfVFlQRV9BRVM7DQorCQkJaWYgKChrZXktPmZsYWdzICYgSUVFRTgw
MjExX0tFWV9GTEFHX1BBSVJXSVNFKSA9PSAwKSB7DQorCQkJCWlmICh2aWYtPnR5cGUgIT0gTkw4
MDIxMV9JRlRZUEVfU1RBVElPTikNCisJCQkJCW13bF92aWYtPmtleWlkeCA9IGtleS0+a2V5aWR4
Ow0KKwkJCX0NCisJCX0gZWxzZSBpZiAoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVf
VEtJUCkgew0KKwkJCWVuY3JfdHlwZSA9IEVOQ1JfVFlQRV9US0lQOw0KKwkJfSBlbHNlIHsNCisJ
CQllbmNyX3R5cGUgPSBFTkNSX1RZUEVfRElTQUJMRTsNCisJCX0NCisNCisJCXJjID0gbXdsX2Z3
Y21kX3VwZGF0ZV9lbmNyeXB0aW9uX2VuYWJsZShodywgdmlmLCBhZGRyLA0KKwkJCQkJCQllbmNy
X3R5cGUpOw0KKwkJaWYgKHJjKQ0KKwkJCWdvdG8gb3V0Ow0KKw0KKwkJbXdsX3ZpZi0+aXNfaHdf
Y3J5cHRvX2VuYWJsZWQgPSB0cnVlOw0KKwl9IGVsc2Ugew0KKwkJcmMgPSBtd2xfZndjbWRfZW5j
cnlwdGlvbl9yZW1vdmVfa2V5KGh3LCB2aWYsIGFkZHIsIGtleSk7DQorCQlpZiAocmMpDQorCQkJ
Z290byBvdXQ7DQorCX0NCisNCitvdXQ6DQorDQorCXJldHVybiByYzsNCit9DQorDQorc3RhdGlj
IGludCBtd2xfbWFjODAyMTFfc2V0X3J0c190aHJlc2hvbGQoc3RydWN0IGllZWU4MDIxMV9odyAq
aHcsDQorCQkJCQkgIHUzMiB2YWx1ZSkNCit7DQorCXJldHVybiBtd2xfZndjbWRfc2V0X3J0c190
aHJlc2hvbGQoaHcsIHZhbHVlKTsNCit9DQorDQorc3RhdGljIGludCBtd2xfbWFjODAyMTFfc3Rh
X2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJc3RydWN0IGllZWU4MDIxMV92aWYg
KnZpZiwNCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkNCit7DQorCXN0cnVjdCBtd2xf
cHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZjsNCisJc3Ry
dWN0IG13bF9zdGEgKnN0YV9pbmZvOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXk7
DQorCWludCByYzsNCisJaW50IGk7DQorDQorCW13bF92aWYgPSBtd2xfZGV2X2dldF92aWYodmlm
KTsNCisJc3RhX2luZm8gPSBtd2xfZGV2X2dldF9zdGEoc3RhKTsNCisNCisJbWVtc2V0KHN0YV9p
bmZvLCAwLCBzaXplb2YoKnN0YV9pbmZvKSk7DQorCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9J
RlRZUEVfTUVTSF9QT0lOVCkNCisJCXN0YV9pbmZvLT5pc19tZXNoX25vZGUgPSB0cnVlOw0KKwlp
ZiAoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKSB7DQorCQlzdGFfaW5mby0+aXNfYW1wZHVfYWxs
b3dlZCA9IHRydWU7DQorCQlzdGFfaW5mby0+aXNfYW1zZHVfYWxsb3dlZCA9IGZhbHNlOw0KKwkJ
aWYgKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVKQ0KKwkJCXN0
YV9pbmZvLT5hbXNkdV9jdHJsLmNhcCA9IE1XTF9BTVNEVV9TSVpFXzhLOw0KKwkJZWxzZQ0KKwkJ
CXN0YV9pbmZvLT5hbXNkdV9jdHJsLmNhcCA9IE1XTF9BTVNEVV9TSVpFXzRLOw0KKwl9DQorCXN0
YV9pbmZvLT5pdjE2ID0gMTsNCisJc3RhX2luZm8tPml2MzIgPSAwOw0KKwlzcGluX2xvY2tfaW5p
dCgmc3RhX2luZm8tPmFtc2R1X2xvY2spOw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPnN0YV9sb2Nr
KTsNCisJbGlzdF9hZGRfdGFpbCgmc3RhX2luZm8tPmxpc3QsICZwcml2LT5zdGFfbGlzdCk7DQor
CXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdGFfbG9jayk7DQorDQorCWlmICh2aWYtPnR5cGUgPT0g
Tkw4MDIxMV9JRlRZUEVfU1RBVElPTikNCisJCW13bF9md2NtZF9zZXRfbmV3X3N0bl9kZWwoaHcs
IHZpZiwgc3RhLT5hZGRyKTsNCisNCisJcmMgPSBtd2xfZndjbWRfc2V0X25ld19zdG5fYWRkKGh3
LCB2aWYsIHN0YSk7DQorDQorCWZvciAoaSA9IDA7IGkgPCBOVU1fV0VQX0tFWVM7IGkrKykgew0K
KwkJa2V5ID0gKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKiltd2xfdmlmLT53ZXBfa2V5X2Nv
bmZbaV0ua2V5Ow0KKw0KKwkJaWYgKG13bF92aWYtPndlcF9rZXlfY29uZltpXS5lbmFibGVkKQ0K
KwkJCW13bF9tYWM4MDIxMV9zZXRfa2V5KGh3LCBTRVRfS0VZLCB2aWYsIHN0YSwga2V5KTsNCisJ
fQ0KKw0KKwlyZXR1cm4gcmM7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX21hYzgwMjExX3N0YV9y
ZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFf
dmlmICp2aWYsDQorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpDQorew0KKwlzdHJ1
Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJaW50IHJjOw0KKwlzdHJ1Y3QgbXdsX3N0
YSAqc3RhX2luZm8gPSBtd2xfZGV2X2dldF9zdGEoc3RhKTsNCisNCisJbXdsX3R4X2RlbF9zdGFf
YW1zZHVfcGt0cyhzdGEpOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2NrKTsN
CisJbXdsX2Z3Y21kX2RlbF9zdGFfc3RyZWFtcyhodywgc3RhKTsNCisJc3Bpbl91bmxvY2tfYmgo
JnByaXYtPnN0cmVhbV9sb2NrKTsNCisNCisJbXdsX3R4X2RlbF9wa3RzX3ZpYV9zdGEoaHcsIHN0
YSk7DQorDQorCXJjID0gbXdsX2Z3Y21kX3NldF9uZXdfc3RuX2RlbChodywgdmlmLCBzdGEtPmFk
ZHIpOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsNCisJbGlzdF9kZWwoJnN0
YV9pbmZvLT5saXN0KTsNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsNCisNCisJ
cmV0dXJuIHJjOw0KK30NCisNCitzdGF0aWMgaW50IG13bF9tYWM4MDIxMV9jb25mX3R4KHN0cnVj
dCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJ
CQl1MTYgcXVldWUsDQorCQkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1z
ICpwYXJhbXMpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJaW50
IHJjID0gMDsNCisNCisJaWYgKFdBUk5fT04ocXVldWUgPiBTWVNBRFBUX1RYX1dNTV9RVUVVRVMg
LSAxKSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwltZW1jcHkoJnByaXYtPndtbV9wYXJhbXNb
cXVldWVdLCBwYXJhbXMsIHNpemVvZigqcGFyYW1zKSk7DQorDQorCWlmICghcHJpdi0+d21tX2Vu
YWJsZWQpIHsNCisJCXJjID0gbXdsX2Z3Y21kX3NldF93bW1fbW9kZShodywgdHJ1ZSk7DQorCQlw
cml2LT53bW1fZW5hYmxlZCA9IHRydWU7DQorCX0NCisNCisJaWYgKCFyYykgew0KKwkJaW50IHEg
PSBTWVNBRFBUX1RYX1dNTV9RVUVVRVMgLSAxIC0gcXVldWU7DQorDQorCQlyYyA9IG13bF9md2Nt
ZF9zZXRfZWRjYV9wYXJhbXMoaHcsIHEsDQorCQkJCQkgICAgICAgcGFyYW1zLT5jd19taW4sIHBh
cmFtcy0+Y3dfbWF4LA0KKwkJCQkJICAgICAgIHBhcmFtcy0+YWlmcywgcGFyYW1zLT50eG9wKTsN
CisJfQ0KKw0KKwlyZXR1cm4gcmM7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX21hYzgwMjExX2dl
dF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjEx
X2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpDQorew0KKwlyZXR1cm4gbXdsX2Z3Y21kX2dldF9zdGF0
KGh3LCBzdGF0cyk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX21hYzgwMjExX2dldF9zdXJ2ZXko
c3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgIGludCBpZHgsDQorCQkJCSAgIHN0cnVj
dCBzdXJ2ZXlfaW5mbyAqc3VydmV5KQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHct
PnByaXY7DQorCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsNCisNCisJ
aWYgKGlkeCAhPSAwKQ0KKwkJcmV0dXJuIC1FTk9FTlQ7DQorDQorCXN1cnZleS0+Y2hhbm5lbCA9
IGNvbmYtPmNoYW5kZWYuY2hhbjsNCisJc3VydmV5LT5maWxsZWQgPSBTVVJWRVlfSU5GT19OT0lT
RV9EQk07DQorCXN1cnZleS0+bm9pc2UgPSBwcml2LT5ub2lzZTsNCisNCisJcmV0dXJuIDA7DQor
fQ0KKw0KK3N0YXRpYyBpbnQgbXdsX21hYzgwMjExX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgw
MjExX2h3ICpodywNCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCQkg
ICAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwNCisJCQkJICAgICBz
dHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLA0KKwkJCQkgICAgIHUxNiB0aWQsIHUxNiAqc3NuLCB1
OCBidWZfc2l6ZSwgYm9vbCBhbXNkdSkNCit7DQorCWludCByYyA9IDA7DQorCXN0cnVjdCBtd2xf
cHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFt
Ow0KKwl1OCAqYWRkciA9IHN0YS0+YWRkciwgaWR4Ow0KKwlzdHJ1Y3QgbXdsX3N0YSAqc3RhX2lu
Zm87DQorDQorCXN0YV9pbmZvID0gbXdsX2Rldl9nZXRfc3RhKHN0YSk7DQorDQorCXNwaW5fbG9j
a19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KKw0KKwlzdHJlYW0gPSBtd2xfZndjbWRfbG9va3Vw
X3N0cmVhbShodywgYWRkciwgdGlkKTsNCisNCisJc3dpdGNoIChhY3Rpb24pIHsNCisJY2FzZSBJ
RUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6DQorCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6
DQorCQlicmVhazsNCisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6DQorCQlpZiAoIXN0
YV9pbmZvLT5pc19hbXBkdV9hbGxvd2VkKSB7DQorCQkJd2lwaHlfd2Fybihody0+d2lwaHksICJh
bXBkdSBub3QgYWxsb3dlZFxuIik7DQorCQkJcmMgPSAtRVBFUk07DQorCQkJYnJlYWs7DQorCQl9
DQorDQorCQlpZiAoIXN0cmVhbSkgew0KKwkJCXN0cmVhbSA9IG13bF9md2NtZF9hZGRfc3RyZWFt
KGh3LCBzdGEsIHRpZCk7DQorCQkJaWYgKCFzdHJlYW0pIHsNCisJCQkJd2lwaHlfd2Fybihody0+
d2lwaHksICJubyBzdHJlYW0gZm91bmRcbiIpOw0KKwkJCQlyYyA9IC1FUEVSTTsNCisJCQkJYnJl
YWs7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2Nr
KTsNCisJCXJjID0gbXdsX2Z3Y21kX2NoZWNrX2JhKGh3LCBzdHJlYW0sIHZpZik7DQorCQlzcGlu
X2xvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2NrKTsNCisJCWlmIChyYykgew0KKwkJCW13bF9md2Nt
ZF9yZW1vdmVfc3RyZWFtKGh3LCBzdHJlYW0pOw0KKwkJCXdpcGh5X2Vycihody0+d2lwaHksDQor
CQkJCSAgImFtcGR1IHN0YXJ0IGVycm9yIGNvZGU6ICVkXG4iLCByYyk7DQorCQkJcmMgPSAtRVBF
Uk07DQorCQkJYnJlYWs7DQorCQl9DQorCQlzdHJlYW0tPnN0YXRlID0gQU1QRFVfU1RSRUFNX0lO
X1BST0dSRVNTOw0KKwkJKnNzbiA9IDA7DQorCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJx
c2FmZSh2aWYsIGFkZHIsIHRpZCk7DQorCQlicmVhazsNCisJY2FzZSBJRUVFODAyMTFfQU1QRFVf
VFhfU1RPUF9DT05UOg0KKwljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIOg0KKwlj
YXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIX0NPTlQ6DQorCQlpZiAoc3RyZWFtKSB7
DQorCQkJaWYgKHN0cmVhbS0+c3RhdGUgPT0gQU1QRFVfU1RSRUFNX0FDVElWRSkgew0KKwkJCQlt
d2xfdHhfZGVsX2FtcGR1X3BrdHMoaHcsIHN0YSwgdGlkKTsNCisJCQkJaWR4ID0gc3RyZWFtLT5p
ZHg7DQorCQkJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdHJlYW1fbG9jayk7DQorCQkJCW13bF9m
d2NtZF9kZXN0cm95X2JhKGh3LCBpZHgpOw0KKwkJCQlzcGluX2xvY2tfYmgoJnByaXYtPnN0cmVh
bV9sb2NrKTsNCisJCQl9DQorDQorCQkJbXdsX2Z3Y21kX3JlbW92ZV9zdHJlYW0oaHcsIHN0cmVh
bSk7DQorCQkJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIGFkZHIsIHRpZCk7
DQorCQl9IGVsc2Ugew0KKwkJCXJjID0gLUVQRVJNOw0KKwkJfQ0KKwkJYnJlYWs7DQorCWNhc2Ug
SUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOg0KKwkJaWYgKHN0cmVhbSkgew0KKwkJCWlm
IChXQVJOX09OKHN0cmVhbS0+c3RhdGUgIT0NCisJCQkJICAgIEFNUERVX1NUUkVBTV9JTl9QUk9H
UkVTUykpIHsNCisJCQkJcmMgPSAtRVBFUk07DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCQlzcGlu
X3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KKwkJCXJjID0gbXdsX2Z3Y21kX2NyZWF0
ZV9iYShodywgc3RyZWFtLCBidWZfc2l6ZSwgdmlmKTsNCisJCQlzcGluX2xvY2tfYmgoJnByaXYt
PnN0cmVhbV9sb2NrKTsNCisNCisJCQlpZiAoIXJjKSB7DQorCQkJCXN0cmVhbS0+c3RhdGUgPSBB
TVBEVV9TVFJFQU1fQUNUSVZFOw0KKwkJCX0gZWxzZSB7DQorCQkJCWlkeCA9IHN0cmVhbS0+aWR4
Ow0KKwkJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KKwkJCQltd2xfZndj
bWRfZGVzdHJveV9iYShodywgaWR4KTsNCisJCQkJc3Bpbl9sb2NrX2JoKCZwcml2LT5zdHJlYW1f
bG9jayk7DQorCQkJCW13bF9md2NtZF9yZW1vdmVfc3RyZWFtKGh3LCBzdHJlYW0pOw0KKwkJCQl3
aXBoeV9lcnIoaHctPndpcGh5LA0KKwkJCQkJICAiYW1wZHUgb3BlcmF0aW9uIGVycm9yIGNvZGU6
ICVkXG4iLA0KKwkJCQkJICByYyk7DQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlyYyA9IC1FUEVS
TTsNCisJCX0NCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJcmMgPSAtRU5PVFNVUFA7DQorCQli
cmVhazsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KKw0K
KwlyZXR1cm4gcmM7DQorfQ0KKw0KK2NvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIG13bF9tYWM4
MDIxMV9vcHMgPSB7DQorCS50eCAgICAgICAgICAgICAgICAgPSBtd2xfbWFjODAyMTFfdHgsDQor
CS5zdGFydCAgICAgICAgICAgICAgPSBtd2xfbWFjODAyMTFfc3RhcnQsDQorCS5zdG9wICAgICAg
ICAgICAgICAgPSBtd2xfbWFjODAyMTFfc3RvcCwNCisJLmFkZF9pbnRlcmZhY2UgICAgICA9IG13
bF9tYWM4MDIxMV9hZGRfaW50ZXJmYWNlLA0KKwkucmVtb3ZlX2ludGVyZmFjZSAgID0gbXdsX21h
YzgwMjExX3JlbW92ZV9pbnRlcmZhY2UsDQorCS5jb25maWcgICAgICAgICAgICAgPSBtd2xfbWFj
ODAyMTFfY29uZmlnLA0KKwkuYnNzX2luZm9fY2hhbmdlZCAgID0gbXdsX21hYzgwMjExX2Jzc19p
bmZvX2NoYW5nZWQsDQorCS5jb25maWd1cmVfZmlsdGVyICAgPSBtd2xfbWFjODAyMTFfY29uZmln
dXJlX2ZpbHRlciwNCisJLnNldF9rZXkgICAgICAgICAgICA9IG13bF9tYWM4MDIxMV9zZXRfa2V5
LA0KKwkuc2V0X3J0c190aHJlc2hvbGQgID0gbXdsX21hYzgwMjExX3NldF9ydHNfdGhyZXNob2xk
LA0KKwkuc3RhX2FkZCAgICAgICAgICAgID0gbXdsX21hYzgwMjExX3N0YV9hZGQsDQorCS5zdGFf
cmVtb3ZlICAgICAgICAgPSBtd2xfbWFjODAyMTFfc3RhX3JlbW92ZSwNCisJLmNvbmZfdHggICAg
ICAgICAgICA9IG13bF9tYWM4MDIxMV9jb25mX3R4LA0KKwkuZ2V0X3N0YXRzICAgICAgICAgID0g
bXdsX21hYzgwMjExX2dldF9zdGF0cywNCisJLmdldF9zdXJ2ZXkgICAgICAgICA9IG13bF9tYWM4
MDIxMV9nZXRfc3VydmV5LA0KKwkuYW1wZHVfYWN0aW9uICAgICAgID0gbXdsX21hYzgwMjExX2Ft
cGR1X2FjdGlvbiwNCit9Ow0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl
bGwvbXdsd2lmaS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkv
bWFpbi5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uZGM3NTlkMw0KLS0t
IC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL21h
aW4uYw0KQEAgLTAsMCArMSw3MzkgQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDE1
LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBmaWxl
ICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwNCisg
KiBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
VmVyc2lvbiAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwg
cmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICogYWNjb3JkYW5jZSB3
aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdo
aWNoDQorICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJ
VEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
DQorICogQVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRk
aXRpb25hbCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0KKyAq
Lw0KKw0KKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGltcGxlbWVudHMgbWFpbiBmdW5jdGlv
bnMgb2YgdGhpcyBtb2R1bGUuICovDQorDQorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KKyNp
ZmRlZiBDT05GSUdfT0YNCisjaW5jbHVkZSA8bGludXgvb2YuaD4NCisjZW5kaWYNCisNCisjaW5j
bHVkZSAic3lzYWRwdC5oIg0KKyNpbmNsdWRlICJkZXYuaCINCisjaW5jbHVkZSAiZndkbC5oIg0K
KyNpbmNsdWRlICJmd2NtZC5oIg0KKyNpbmNsdWRlICJ0eC5oIg0KKyNpbmNsdWRlICJyeC5oIg0K
KyNpbmNsdWRlICJpc3IuaCINCisjaWZkZWYgQ09ORklHX1NVUFBPUlRfTUZHDQorI2luY2x1ZGUg
Im1mZy5oIg0KKyNlbmRpZg0KKyNpZmRlZiBDT05GSUdfREVCVUdfRlMNCisjaW5jbHVkZSAiZGVi
dWdmcy5oIg0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgTVdMX0RFU0MgICAgICAgICAiTWFydmVsbCA4
MDIuMTFhYyBXaXJlbGVzcyBOZXR3b3JrIERyaXZlciINCisjZGVmaW5lIE1XTF9ERVZfTkFNRSAg
ICAgIk1hcnZlbGwgODAyLjExYWMgQWRhcHRlciINCisNCisjZGVmaW5lIEZJTEVfUEFUSF9MRU4g
ICAgNjQNCisjZGVmaW5lIENNRF9CVUZfU0laRSAgICAgMHg0MDAwDQorDQorc3RhdGljIHN0cnVj
dCBwY2lfZGV2aWNlX2lkIG13bF9wY2lfaWRfdGJsW10gPSB7DQorCXsgUENJX1ZERVZJQ0UoTUFS
VkVMTCwgMHgyYTU1KSwgLmRyaXZlcl9kYXRhID0gTVdMODg2NCwgfSwNCisJeyBQQ0lfVkRFVklD
RShNQVJWRUxMLCAweDJiMzgpLCAuZHJpdmVyX2RhdGEgPSBNV0w4ODk3LCB9LA0KKwl7IH0sDQor
fTsNCisNCitzdGF0aWMgc3RydWN0IG13bF9jaGlwX2luZm8gbXdsX2NoaXBfdGJsW10gPSB7DQor
CVtNV0w4ODY0XSA9IHsNCisJCS5wYXJ0X25hbWUJPSAiODhXODg2NCIsDQorCQkuZndfaW1hZ2UJ
PSAibXdsd2lmaS84OFc4ODY0LmJpbiIsDQorCQkuYW50ZW5uYV90eAk9IEFOVEVOTkFfVFhfNF9B
VVRPLA0KKwkJLmFudGVubmFfcngJPSBBTlRFTk5BX1JYXzRfQVVUTywNCisJfSwNCisJW01XTDg4
OTddID0gew0KKwkJLnBhcnRfbmFtZQk9ICI4OFc4ODk3IiwNCisJCS5md19pbWFnZQk9ICJtd2x3
aWZpLzg4Vzg4OTcuYmluIiwNCisJCS5hbnRlbm5hX3R4CT0gQU5URU5OQV9UWF8yLA0KKwkJLmFu
dGVubmFfcngJPSBBTlRFTk5BX1JYXzIsDQorCX0sDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3Ry
dWN0IGllZWU4MDIxMV9jaGFubmVsIG13bF9jaGFubmVsc18yNFtdID0gew0KKwl7IC5iYW5kID0g
SUVFRTgwMjExX0JBTkRfMkdIWiwgLmNlbnRlcl9mcmVxID0gMjQxMiwgLmh3X3ZhbHVlID0gMSwg
fSwNCisJeyAuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFosIC5jZW50ZXJfZnJlcSA9IDI0MTcs
IC5od192YWx1ZSA9IDIsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haLCAuY2Vu
dGVyX2ZyZXEgPSAyNDIyLCAuaHdfdmFsdWUgPSAzLCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjEx
X0JBTkRfMkdIWiwgLmNlbnRlcl9mcmVxID0gMjQyNywgLmh3X3ZhbHVlID0gNCwgfSwNCisJeyAu
YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFosIC5jZW50ZXJfZnJlcSA9IDI0MzIsIC5od192YWx1
ZSA9IDUsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haLCAuY2VudGVyX2ZyZXEg
PSAyNDM3LCAuaHdfdmFsdWUgPSA2LCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdI
WiwgLmNlbnRlcl9mcmVxID0gMjQ0MiwgLmh3X3ZhbHVlID0gNywgfSwNCisJeyAuYmFuZCA9IElF
RUU4MDIxMV9CQU5EXzJHSFosIC5jZW50ZXJfZnJlcSA9IDI0NDcsIC5od192YWx1ZSA9IDgsIH0s
DQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haLCAuY2VudGVyX2ZyZXEgPSAyNDUyLCAu
aHdfdmFsdWUgPSA5LCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWiwgLmNlbnRl
cl9mcmVxID0gMjQ1NywgLmh3X3ZhbHVlID0gMTAsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFf
QkFORF8yR0haLCAuY2VudGVyX2ZyZXEgPSAyNDYyLCAuaHdfdmFsdWUgPSAxMSwgfSwNCisJeyAu
YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFosIC5jZW50ZXJfZnJlcSA9IDI0NjcsIC5od192YWx1
ZSA9IDEyLCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWiwgLmNlbnRlcl9mcmVx
ID0gMjQ3MiwgLmh3X3ZhbHVlID0gMTMsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF8y
R0haLCAuY2VudGVyX2ZyZXEgPSAyNDg0LCAuaHdfdmFsdWUgPSAxNCwgfSwNCit9Ow0KKw0KK3N0
YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgbXdsX3JhdGVzXzI0W10gPSB7DQorCXsg
LmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gMiwgfSwNCisJeyAuYml0cmF0ZSA9IDIwLCAuaHdf
dmFsdWUgPSA0LCB9LA0KKwl7IC5iaXRyYXRlID0gNTUsIC5od192YWx1ZSA9IDExLCB9LA0KKwl7
IC5iaXRyYXRlID0gMTEwLCAuaHdfdmFsdWUgPSAyMiwgfSwNCisJeyAuYml0cmF0ZSA9IDIyMCwg
Lmh3X3ZhbHVlID0gNDQsIH0sDQorCXsgLmJpdHJhdGUgPSA2MCwgLmh3X3ZhbHVlID0gMTIsIH0s
DQorCXsgLmJpdHJhdGUgPSA5MCwgLmh3X3ZhbHVlID0gMTgsIH0sDQorCXsgLmJpdHJhdGUgPSAx
MjAsIC5od192YWx1ZSA9IDI0LCB9LA0KKwl7IC5iaXRyYXRlID0gMTgwLCAuaHdfdmFsdWUgPSAz
NiwgfSwNCisJeyAuYml0cmF0ZSA9IDI0MCwgLmh3X3ZhbHVlID0gNDgsIH0sDQorCXsgLmJpdHJh
dGUgPSAzNjAsIC5od192YWx1ZSA9IDcyLCB9LA0KKwl7IC5iaXRyYXRlID0gNDgwLCAuaHdfdmFs
dWUgPSA5NiwgfSwNCisJeyAuYml0cmF0ZSA9IDU0MCwgLmh3X3ZhbHVlID0gMTA4LCB9LA0KK307
DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBtd2xfY2hhbm5lbHNf
NTBbXSA9IHsNCisJeyAuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFosIC5jZW50ZXJfZnJlcSA9
IDUxODAsIC5od192YWx1ZSA9IDM2LCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfNUdI
WiwgLmNlbnRlcl9mcmVxID0gNTIwMCwgLmh3X3ZhbHVlID0gNDAsIH0sDQorCXsgLmJhbmQgPSBJ
RUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1MjIwLCAuaHdfdmFsdWUgPSA0NCwg
fSwNCisJeyAuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFosIC5jZW50ZXJfZnJlcSA9IDUyNDAs
IC5od192YWx1ZSA9IDQ4LCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfNUdIWiwgLmNl
bnRlcl9mcmVxID0gNTI2MCwgLmh3X3ZhbHVlID0gNTIsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAy
MTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1MjgwLCAuaHdfdmFsdWUgPSA1NiwgfSwNCisJ
eyAuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFosIC5jZW50ZXJfZnJlcSA9IDUzMDAsIC5od192
YWx1ZSA9IDYwLCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfNUdIWiwgLmNlbnRlcl9m
cmVxID0gNTMyMCwgLmh3X3ZhbHVlID0gNjQsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFO
RF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NTAwLCAuaHdfdmFsdWUgPSAxMDAsIH0sDQorCXsgLmJh
bmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NTIwLCAuaHdfdmFsdWUg
PSAxMDQsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEg
PSA1NTQwLCAuaHdfdmFsdWUgPSAxMDgsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81
R0haLCAuY2VudGVyX2ZyZXEgPSA1NTYwLCAuaHdfdmFsdWUgPSAxMTIsIH0sDQorCXsgLmJhbmQg
PSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NTgwLCAuaHdfdmFsdWUgPSAx
MTYsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1
NjAwLCAuaHdfdmFsdWUgPSAxMjAsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0ha
LCAuY2VudGVyX2ZyZXEgPSA1NjIwLCAuaHdfdmFsdWUgPSAxMjQsIH0sDQorCXsgLmJhbmQgPSBJ
RUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NjQwLCAuaHdfdmFsdWUgPSAxMjgs
IH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NjYw
LCAuaHdfdmFsdWUgPSAxMzIsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAu
Y2VudGVyX2ZyZXEgPSA1NjgwLCAuaHdfdmFsdWUgPSAxMzYsIH0sDQorCXsgLmJhbmQgPSBJRUVF
ODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NzAwLCAuaHdfdmFsdWUgPSAxNDAsIH0s
DQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NzIwLCAu
aHdfdmFsdWUgPSAxNDQsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2Vu
dGVyX2ZyZXEgPSA1NzQ1LCAuaHdfdmFsdWUgPSAxNDksIH0sDQorCXsgLmJhbmQgPSBJRUVFODAy
MTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NzY1LCAuaHdfdmFsdWUgPSAxNTMsIH0sDQor
CXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1Nzg1LCAuaHdf
dmFsdWUgPSAxNTcsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVy
X2ZyZXEgPSA1ODA1LCAuaHdfdmFsdWUgPSAxNjEsIH0sDQorfTsNCisNCitzdGF0aWMgY29uc3Qg
c3RydWN0IGllZWU4MDIxMV9yYXRlIG13bF9yYXRlc181MFtdID0gew0KKwl7IC5iaXRyYXRlID0g
NjAsIC5od192YWx1ZSA9IDEyLCB9LA0KKwl7IC5iaXRyYXRlID0gOTAsIC5od192YWx1ZSA9IDE4
LCB9LA0KKwl7IC5iaXRyYXRlID0gMTIwLCAuaHdfdmFsdWUgPSAyNCwgfSwNCisJeyAuYml0cmF0
ZSA9IDE4MCwgLmh3X3ZhbHVlID0gMzYsIH0sDQorCXsgLmJpdHJhdGUgPSAyNDAsIC5od192YWx1
ZSA9IDQ4LCB9LA0KKwl7IC5iaXRyYXRlID0gMzYwLCAuaHdfdmFsdWUgPSA3MiwgfSwNCisJeyAu
Yml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVlID0gOTYsIH0sDQorCXsgLmJpdHJhdGUgPSA1NDAsIC5o
d192YWx1ZSA9IDEwOCwgfSwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx
X2lmYWNlX2xpbWl0IGFwX2lmX2xpbWl0c1tdID0gew0KKwl7IC5tYXggPSBTWVNBRFBUX05VTV9P
Rl9BUCwJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX0FQKSB9LA0KKyNpZmRlZiBDT05GSUdf
TUFDODAyMTFfTUVTSA0KKwl7IC5tYXggPSAxLAkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVf
TUVTSF9QT0lOVCkgfSwNCisjZW5kaWYNCisJeyAubWF4ID0gMSwJLnR5cGVzID0gQklUKE5MODAy
MTFfSUZUWVBFX1NUQVRJT04pIH0sDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4
MDIxMV9pZmFjZV9jb21iaW5hdGlvbiBhcF9pZl9jb21iID0gew0KKwkubGltaXRzID0gYXBfaWZf
bGltaXRzLA0KKwkubl9saW1pdHMgPSBBUlJBWV9TSVpFKGFwX2lmX2xpbWl0cyksDQorCS5tYXhf
aW50ZXJmYWNlcyA9IFNZU0FEUFRfTlVNX09GX0FQLA0KKwkubnVtX2RpZmZlcmVudF9jaGFubmVs
cyA9IDEsDQorfTsNCisNCitzdGF0aWMgaW50IG13bF9hbGxvY19wY2lfcmVzb3VyY2Uoc3RydWN0
IG13bF9wcml2ICpwcml2KQ0KK3sNCisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwcml2LT5wZGV2
Ow0KKwl2b2lkIF9faW9tZW0gKmFkZHI7DQorDQorCXByaXYtPm5leHRfYmFyX251bSA9IDE7CS8q
IDMyLWJpdCAqLw0KKwlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgMHgwNCkNCisJ
CXByaXYtPm5leHRfYmFyX251bSA9IDI7CS8qIDY0LWJpdCAqLw0KKw0KKwlhZGRyID0gZGV2bV9p
b3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsICZwZGV2LT5yZXNvdXJjZVswXSk7DQorCWlmIChJ
U19FUlIoYWRkcikpIHsNCisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksDQorCQkJICAiJXM6
IGNhbm5vdCByZXNlcnZlIFBDSSBtZW1vcnkgcmVnaW9uIDBcbiIsDQorCQkJICBNV0xfRFJWX05B
TUUpOw0KKwkJZ290byBlcnI7DQorCX0NCisJcHJpdi0+aW9iYXNlMCA9IGFkZHI7DQorCXdpcGh5
X2RlYnVnKHByaXYtPmh3LT53aXBoeSwgInByaXYtPmlvYmFzZTAgPSAlcFxuIiwgcHJpdi0+aW9i
YXNlMCk7DQorDQorCWFkZHIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwNCisJ
CQkJICAgICAmcGRldi0+cmVzb3VyY2VbcHJpdi0+bmV4dF9iYXJfbnVtXSk7DQorCWlmIChJU19F
UlIoYWRkcikpIHsNCisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksDQorCQkJICAiJXM6IGNh
bm5vdCByZXNlcnZlIFBDSSBtZW1vcnkgcmVnaW9uIDFcbiIsDQorCQkJICBNV0xfRFJWX05BTUUp
Ow0KKwkJZ290byBlcnI7DQorCX0NCisJcHJpdi0+aW9iYXNlMSA9IGFkZHI7DQorCXdpcGh5X2Rl
YnVnKHByaXYtPmh3LT53aXBoeSwgInByaXYtPmlvYmFzZTEgPSAlcFxuIiwgcHJpdi0+aW9iYXNl
MSk7DQorDQorCXByaXYtPnBjbWRfYnVmID0NCisJCSh1bnNpZ25lZCBzaG9ydCAqKWRtYW1fYWxs
b2NfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwNCisJCQkJCQkgICAgICBDTURfQlVGX1NJWkUs
DQorCQkJCQkJICAgICAgJnByaXYtPnBwaHlzX2NtZF9idWYsDQorCQkJCQkJICAgICAgR0ZQX0tF
Uk5FTCk7DQorCWlmICghcHJpdi0+cGNtZF9idWYpIHsNCisJCXdpcGh5X2Vycihwcml2LT5ody0+
d2lwaHksDQorCQkJICAiJXM6IGNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIGNvbW1hbmQgYnVmZmVy
XG4iLA0KKwkJCSAgTVdMX0RSVl9OQU1FKTsNCisJCWdvdG8gZXJyOw0KKwl9DQorCXdpcGh5X2Rl
YnVnKHByaXYtPmh3LT53aXBoeSwNCisJCSAgICAicHJpdi0+cGNtZF9idWYgPSAlcCAgcHJpdi0+
cHBoeXNfY21kX2J1ZiA9ICVwXG4iLA0KKwkJICAgIHByaXYtPnBjbWRfYnVmLA0KKwkJICAgICh2
b2lkICopcHJpdi0+cHBoeXNfY21kX2J1Zik7DQorCW1lbXNldChwcml2LT5wY21kX2J1ZiwgMHgw
MCwgQ01EX0JVRl9TSVpFKTsNCisNCisJcmV0dXJuIDA7DQorDQorZXJyOg0KKwl3aXBoeV9lcnIo
cHJpdi0+aHctPndpcGh5LCAicGNpIGFsbG9jIGZhaWxcbiIpOw0KKw0KKwlyZXR1cm4gLUVJTzsN
Cit9DQorDQorc3RhdGljIGludCBtd2xfaW5pdF9maXJtd2FyZShzdHJ1Y3QgbXdsX3ByaXYgKnBy
aXYsIGNvbnN0IGNoYXIgKmZ3X25hbWUpDQorew0KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsNCisJ
aW50IHJjID0gMDsNCisNCisJcGRldiA9IHByaXYtPnBkZXY7DQorDQorI2lmZGVmIENPTkZJR19T
VVBQT1JUX01GRw0KKwlpZiAocHJpdi0+bWZnX21vZGUpDQorCQlyYyA9IG13bF9tZmdfcmVxdWVz
dF9maXJtd2FyZShwcml2KTsNCisJZWxzZQ0KKyNlbmRpZg0KKwkJcmMgPSByZXF1ZXN0X2Zpcm13
YXJlKChjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKiopJnByaXYtPmZ3X3Vjb2RlLA0KKwkJCQkgICAg
ICBmd19uYW1lLCAmcHJpdi0+cGRldi0+ZGV2KTsNCisNCisJaWYgKHJjKSB7DQorCQlpZiAocHJp
di0+bWZnX21vZGUpDQorCQkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgImNhbm5vdCBmaW5k
IGZpcm13YXJlXG4iKTsNCisJCWVsc2UNCisJCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LA0K
KwkJCQkgICIlczogY2Fubm90IGZpbmQgZmlybXdhcmUgaW1hZ2UgPCVzPlxuIiwNCisJCQkJICBN
V0xfRFJWX05BTUUsIGZ3X25hbWUpOw0KKwkJZ290byBlcnJfbG9hZF9mdzsNCisJfQ0KKw0KKwly
YyA9IG13bF9md2RsX2Rvd25sb2FkX2Zpcm13YXJlKHByaXYtPmh3KTsNCisJaWYgKHJjKSB7DQor
CQlpZiAocHJpdi0+bWZnX21vZGUpDQorCQkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgImRv
d25sb2FkIGZpcm13YXJlIGZhaWxcbiIpOw0KKwkJZWxzZQ0KKwkJCXdpcGh5X2Vycihwcml2LT5o
dy0+d2lwaHksDQorCQkJCSAgIiVzOiBjYW5ub3QgZG93bmxvYWQgZmlybXdhcmUgaW1hZ2UgPCVz
PlxuIiwNCisJCQkJICBNV0xfRFJWX05BTUUsIGZ3X25hbWUpOw0KKwkJZ290byBlcnJfZG93bmxv
YWRfZnc7DQorCX0NCisNCisJcmV0dXJuIHJjOw0KKw0KK2Vycl9kb3dubG9hZF9mdzoNCisNCisj
aWZkZWYgQ09ORklHX1NVUFBPUlRfTUZHDQorCWlmIChwcml2LT5tZmdfbW9kZSkNCisJCW13bF9t
ZmdfcmVsZWFzZV9maXJtd2FyZShwcml2KTsNCisJZWxzZQ0KKyNlbmRpZg0KKwkJcmVsZWFzZV9m
aXJtd2FyZShwcml2LT5md191Y29kZSk7DQorDQorZXJyX2xvYWRfZnc6DQorDQorCXdpcGh5X2Vy
cihwcml2LT5ody0+d2lwaHksICJmaXJtd2FyZSBpbml0IGZhaWxcbiIpOw0KKw0KKwlyZXR1cm4g
cmM7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9wcm9jZXNzX29mX2R0cyhzdHJ1Y3QgbXdsX3By
aXYgKnByaXYpDQorew0KKyNpZmRlZiBDT05GSUdfT0YNCisJc3RydWN0IHByb3BlcnR5ICpwcm9w
Ow0KKwl1MzIgcHJvcF92YWx1ZTsNCisNCisJcHJpdi0+ZHRfbm9kZSA9DQorCQlvZl9maW5kX25v
ZGVfYnlfbmFtZShwY2lfYnVzX3RvX09GX25vZGUocHJpdi0+cGRldi0+YnVzKSwNCisJCQkJICAg
ICAibXdsd2lmaSIpOw0KKwlpZiAoIXByaXYtPmR0X25vZGUpDQorCQlyZXR1cm47DQorDQorCS8q
IGxvb2sgZm9yIGFsbCBtYXRjaGluZyBwcm9wZXJ0eSBuYW1lcyAqLw0KKwlmb3JfZWFjaF9wcm9w
ZXJ0eV9vZl9ub2RlKHByaXYtPmR0X25vZGUsIHByb3ApIHsNCisJCWlmIChzdHJjbXAocHJvcC0+
bmFtZSwgIm1hcnZlbGwsMmdoeiIpID09IDApDQorCQkJcHJpdi0+ZGlzYWJsZV8yZyA9IHRydWU7
DQorCQlpZiAoc3RyY21wKHByb3AtPm5hbWUsICJtYXJ2ZWxsLDVnaHoiKSA9PSAwKQ0KKwkJCXBy
aXYtPmRpc2FibGVfNWcgPSB0cnVlOw0KKwkJaWYgKHN0cmNtcChwcm9wLT5uYW1lLCAibWFydmVs
bCxjaGFpbm1hc2siKSA9PSAwKSB7DQorCQkJcHJvcF92YWx1ZSA9IGJlMzJfdG9fY3B1KCooKF9f
YmUzMiAqKXByb3AtPnZhbHVlKSk7DQorCQkJaWYgKHByb3BfdmFsdWUgPT0gMikNCisJCQkJcHJp
di0+YW50ZW5uYV90eCA9IEFOVEVOTkFfVFhfMjsNCisNCisJCQlwcm9wX3ZhbHVlID0gYmUzMl90
b19jcHUoKigoX19iZTMyICopDQorCQkJCQkJIChwcm9wLT52YWx1ZSArIDQpKSk7DQorCQkJaWYg
KHByb3BfdmFsdWUgPT0gMikNCisJCQkJcHJpdi0+YW50ZW5uYV9yeCA9IEFOVEVOTkFfUlhfMjsN
CisJCX0NCisJfQ0KKw0KKwlwcml2LT5wd3Jfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHBy
aXYtPmR0X25vZGUsDQorCQkJCQkgICAgICAibWFydmVsbCxwb3dlcnRhYmxlIik7DQorI2VuZGlm
DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9zZXRfaHRfY2FwcyhzdHJ1Y3QgbXdsX3ByaXYgKnBy
aXYsDQorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmJhbmQpDQorew0K
KwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsNCisNCisJaHcgPSBwcml2LT5odzsNCisNCisJYmFu
ZC0+aHRfY2FwLmh0X3N1cHBvcnRlZCA9IDE7DQorDQorCWJhbmQtPmh0X2NhcC5jYXAgfD0gSUVF
RTgwMjExX0hUX0NBUF9MRFBDX0NPRElORzsNCisJYmFuZC0+aHRfY2FwLmNhcCB8PSBJRUVFODAy
MTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MDsNCisJYmFuZC0+aHRfY2FwLmNhcCB8PSBJRUVFODAy
MTFfSFRfQ0FQX1NNX1BTOw0KKwliYW5kLT5odF9jYXAuY2FwIHw9IElFRUU4MDIxMV9IVF9DQVBf
U0dJXzIwOw0KKwliYW5kLT5odF9jYXAuY2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwOw0K
Kw0KKwlpZWVlODAyMTFfaHdfc2V0KGh3LCBBTVBEVV9BR0dSRUdBVElPTik7DQorCWJhbmQtPmh0
X2NhcC5hbXBkdV9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SzsNCisJYmFuZC0+
aHRfY2FwLmFtcGR1X2RlbnNpdHkgPSBJRUVFODAyMTFfSFRfTVBEVV9ERU5TSVRZXzQ7DQorDQor
CWJhbmQtPmh0X2NhcC5tY3MucnhfbWFza1swXSA9IDB4ZmY7DQorCWJhbmQtPmh0X2NhcC5tY3Mu
cnhfbWFza1sxXSA9IDB4ZmY7DQorCWlmIChwcml2LT5hbnRlbm5hX3J4ID09IEFOVEVOTkFfUlhf
NF9BVVRPKQ0KKwkJYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrWzJdID0gMHhmZjsNCisJYmFuZC0+
aHRfY2FwLm1jcy5yeF9tYXNrWzRdID0gMHgwMTsNCisNCisJYmFuZC0+aHRfY2FwLm1jcy50eF9w
YXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUQ7DQorfQ0KKw0KK3N0YXRpYyB2b2lk
IG13bF9zZXRfdmh0X2NhcHMoc3RydWN0IG13bF9wcml2ICpwcml2LA0KKwkJCSAgICAgc3RydWN0
IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqYmFuZCkNCit7DQorCWJhbmQtPnZodF9jYXAudmh0
X3N1cHBvcnRlZCA9IDE7DQorDQorCWJhbmQtPnZodF9jYXAuY2FwIHw9IElFRUU4MDIxMV9WSFRf
Q0FQX01BWF9NUERVX0xFTkdUSF83OTkxOw0KKwliYW5kLT52aHRfY2FwLmNhcCB8PSBJRUVFODAy
MTFfVkhUX0NBUF9SWExEUEM7DQorCWJhbmQtPnZodF9jYXAuY2FwIHw9IElFRUU4MDIxMV9WSFRf
Q0FQX1NIT1JUX0dJXzgwOw0KKwliYW5kLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NB
UF9SWFNUQkNfMTsNCisJYmFuZC0+dmh0X2NhcC5jYXAgfD0gSUVFRTgwMjExX1ZIVF9DQVBfU1Vf
QkVBTUZPUk1FUl9DQVBBQkxFOw0KKwliYW5kLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhU
X0NBUF9TVV9CRUFNRk9STUVFX0NBUEFCTEU7DQorCWJhbmQtPnZodF9jYXAuY2FwIHw9IElFRUU4
MDIxMV9WSFRfQ0FQX01BWF9BX01QRFVfTEVOR1RIX0VYUE9ORU5UX01BU0s7DQorCWJhbmQtPnZo
dF9jYXAuY2FwIHw9IElFRUU4MDIxMV9WSFRfQ0FQX1JYX0FOVEVOTkFfUEFUVEVSTjsNCisJYmFu
ZC0+dmh0X2NhcC5jYXAgfD0gSUVFRTgwMjExX1ZIVF9DQVBfVFhfQU5URU5OQV9QQVRURVJOOw0K
Kw0KKwlpZiAocHJpdi0+YW50ZW5uYV9yeCA9PSBBTlRFTk5BX1JYXzIpDQorCQliYW5kLT52aHRf
Y2FwLnZodF9tY3MucnhfbWNzX21hcCA9IGNwdV90b19sZTE2KDB4ZmZmYSk7DQorCWVsc2UNCisJ
CWJhbmQtPnZodF9jYXAudmh0X21jcy5yeF9tY3NfbWFwID0gY3B1X3RvX2xlMTYoMHhmZmVhKTsN
CisNCisJaWYgKHByaXYtPmFudGVubmFfdHggPT0gQU5URU5OQV9UWF8yKQ0KKwkJYmFuZC0+dmh0
X2NhcC52aHRfbWNzLnR4X21jc19tYXAgPSBjcHVfdG9fbGUxNigweGZmZmEpOw0KKwllbHNlDQor
CQliYW5kLT52aHRfY2FwLnZodF9tY3MudHhfbWNzX21hcCA9IGNwdV90b19sZTE2KDB4ZmZlYSk7
DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9zZXRfY2FwcyhzdHJ1Y3QgbXdsX3ByaXYgKnByaXYp
DQorew0KKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsNCisNCisJaHcgPSBwcml2LT5odzsNCisN
CisJLyogc2V0IHVwIGJhbmQgaW5mb3JtYXRpb24gZm9yIDIuNEcgKi8NCisJaWYgKCFwcml2LT5k
aXNhYmxlXzJnKSB7DQorCQlCVUlMRF9CVUdfT04oc2l6ZW9mKHByaXYtPmNoYW5uZWxzXzI0KSAh
PQ0KKwkJCSAgICAgc2l6ZW9mKG13bF9jaGFubmVsc18yNCkpOw0KKwkJbWVtY3B5KHByaXYtPmNo
YW5uZWxzXzI0LCBtd2xfY2hhbm5lbHNfMjQsDQorCQkgICAgICAgc2l6ZW9mKG13bF9jaGFubmVs
c18yNCkpOw0KKw0KKwkJQlVJTERfQlVHX09OKHNpemVvZihwcml2LT5yYXRlc18yNCkgIT0gc2l6
ZW9mKG13bF9yYXRlc18yNCkpOw0KKwkJbWVtY3B5KHByaXYtPnJhdGVzXzI0LCBtd2xfcmF0ZXNf
MjQsIHNpemVvZihtd2xfcmF0ZXNfMjQpKTsNCisNCisJCXByaXYtPmJhbmRfMjQuYmFuZCA9IElF
RUU4MDIxMV9CQU5EXzJHSFo7DQorCQlwcml2LT5iYW5kXzI0LmNoYW5uZWxzID0gcHJpdi0+Y2hh
bm5lbHNfMjQ7DQorCQlwcml2LT5iYW5kXzI0Lm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKG13bF9j
aGFubmVsc18yNCk7DQorCQlwcml2LT5iYW5kXzI0LmJpdHJhdGVzID0gcHJpdi0+cmF0ZXNfMjQ7
DQorCQlwcml2LT5iYW5kXzI0Lm5fYml0cmF0ZXMgPSBBUlJBWV9TSVpFKG13bF9yYXRlc18yNCk7
DQorDQorCQltd2xfc2V0X2h0X2NhcHMocHJpdiwgJnByaXYtPmJhbmRfMjQpOw0KKwkJbXdsX3Nl
dF92aHRfY2Fwcyhwcml2LCAmcHJpdi0+YmFuZF8yNCk7DQorDQorCQlody0+d2lwaHktPmJhbmRz
W0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJnByaXYtPmJhbmRfMjQ7DQorCX0NCisNCisJLyogc2V0
IHVwIGJhbmQgaW5mb3JtYXRpb24gZm9yIDVHICovDQorCWlmICghcHJpdi0+ZGlzYWJsZV81Zykg
ew0KKwkJQlVJTERfQlVHX09OKHNpemVvZihwcml2LT5jaGFubmVsc181MCkgIT0NCisJCQkgICAg
IHNpemVvZihtd2xfY2hhbm5lbHNfNTApKTsNCisJCW1lbWNweShwcml2LT5jaGFubmVsc181MCwg
bXdsX2NoYW5uZWxzXzUwLA0KKwkJICAgICAgIHNpemVvZihtd2xfY2hhbm5lbHNfNTApKTsNCisN
CisJCUJVSUxEX0JVR19PTihzaXplb2YocHJpdi0+cmF0ZXNfNTApICE9IHNpemVvZihtd2xfcmF0
ZXNfNTApKTsNCisJCW1lbWNweShwcml2LT5yYXRlc181MCwgbXdsX3JhdGVzXzUwLCBzaXplb2Yo
bXdsX3JhdGVzXzUwKSk7DQorDQorCQlwcml2LT5iYW5kXzUwLmJhbmQgPSBJRUVFODAyMTFfQkFO
RF81R0haOw0KKwkJcHJpdi0+YmFuZF81MC5jaGFubmVscyA9IHByaXYtPmNoYW5uZWxzXzUwOw0K
KwkJcHJpdi0+YmFuZF81MC5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShtd2xfY2hhbm5lbHNfNTAp
Ow0KKwkJcHJpdi0+YmFuZF81MC5iaXRyYXRlcyA9IHByaXYtPnJhdGVzXzUwOw0KKwkJcHJpdi0+
YmFuZF81MC5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShtd2xfcmF0ZXNfNTApOw0KKw0KKwkJbXds
X3NldF9odF9jYXBzKHByaXYsICZwcml2LT5iYW5kXzUwKTsNCisJCW13bF9zZXRfdmh0X2NhcHMo
cHJpdiwgJnByaXYtPmJhbmRfNTApOw0KKw0KKwkJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFf
QkFORF81R0haXSA9ICZwcml2LT5iYW5kXzUwOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXds
X3dsX2luaXQoc3RydWN0IG13bF9wcml2ICpwcml2KQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9o
dyAqaHc7DQorCWludCByYzsNCisJaW50IGk7DQorDQorCWh3ID0gcHJpdi0+aHc7DQorDQorCWh3
LT5leHRyYV90eF9oZWFkcm9vbSA9IFNZU0FEUFRfTUlOX0JZVEVTX0hFQURST09NOw0KKwlody0+
cXVldWVzID0gU1lTQURQVF9UWF9XTU1fUVVFVUVTOw0KKw0KKwkvKiBTZXQgcnNzaSB2YWx1ZXMg
dG8gZEJtICovDQorCWllZWU4MDIxMV9od19zZXQoaHcsIFNJR05BTF9EQk0pOw0KKwlpZWVlODAy
MTFfaHdfc2V0KGh3LCBIQVNfUkFURV9DT05UUk9MKTsNCisNCisJLyogQXNrIG1hYzgwMjExIG5v
dCB0byB0cmlnZ2VyIFBTIG1vZGUNCisJICogYmFzZWQgb24gUE0gYml0IG9mIGluY29taW5nIGZy
YW1lcy4NCisJICovDQorCWllZWU4MDIxMV9od19zZXQoaHcsIEFQX0xJTktfUFMpOw0KKw0KKwlo
dy0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbXdsX3ZpZik7DQorCWh3LT5zdGFfZGF0
YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBtd2xfc3RhKTsNCisNCisJcHJpdi0+YXBfbWFjaWRzX3N1
cHBvcnRlZCA9IDB4MDAwMGZmZmY7DQorCXByaXYtPnN0YV9tYWNpZHNfc3VwcG9ydGVkID0gMHgw
MDAxMDAwMDsNCisJcHJpdi0+bWFjaWRzX3VzZWQgPSAwOw0KKwlJTklUX0xJU1RfSEVBRCgmcHJp
di0+dmlmX2xpc3QpOw0KKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+c3RhX2xpc3QpOw0KKw0KKwkv
KiBTZXQgZGVmYXVsdCByYWRpbyBzdGF0ZSwgcHJlYW1ibGUgYW5kIHdtbSAqLw0KKwlwcml2LT5y
YWRpb19vbiA9IGZhbHNlOw0KKwlwcml2LT5yYWRpb19zaG9ydF9wcmVhbWJsZSA9IGZhbHNlOw0K
Kwlwcml2LT53bW1fZW5hYmxlZCA9IGZhbHNlOw0KKw0KKwlwcml2LT5wb3dpbml0ZWQgPSAwOw0K
Kw0KKwkvKiBIYW5kbGUgd2F0Y2hkb2cgYmEgZXZlbnRzICovDQorCUlOSVRfV09SSygmcHJpdi0+
d2F0Y2hkb2dfYmFfaGFuZGxlLCBtd2xfd2F0Y2hkb2dfYmFfZXZlbnRzKTsNCisNCisJdGFza2xl
dF9pbml0KCZwcml2LT50eF90YXNrLCAodm9pZCAqKW13bF90eF9kb25lLCAodW5zaWduZWQgbG9u
Zylodyk7DQorCXRhc2tsZXRfZGlzYWJsZSgmcHJpdi0+dHhfdGFzayk7DQorCXRhc2tsZXRfaW5p
dCgmcHJpdi0+cnhfdGFzaywgKHZvaWQgKiltd2xfcnhfcmVjdiwgKHVuc2lnbmVkIGxvbmcpaHcp
Ow0KKwl0YXNrbGV0X2Rpc2FibGUoJnByaXYtPnJ4X3Rhc2spOw0KKwl0YXNrbGV0X2luaXQoJnBy
aXYtPnFlX3Rhc2ssDQorCQkgICAgICh2b2lkICopbXdsX3R4X2ZsdXNoX2Ftc2R1LCAodW5zaWdu
ZWQgbG9uZylodyk7DQorCXRhc2tsZXRfZGlzYWJsZSgmcHJpdi0+cWVfdGFzayk7DQorCXByaXYt
PnR4cV9saW1pdCA9IFNZU0FEUFRfVFhfUVVFVUVfTElNSVQ7DQorCXByaXYtPmlzX3R4X3NjaGVk
dWxlID0gZmFsc2U7DQorCXByaXYtPnJlY3ZfbGltaXQgPSBTWVNBRFBUX1JFQ0VJVkVfTElNSVQ7
DQorCXByaXYtPmlzX3J4X3NjaGVkdWxlID0gZmFsc2U7DQorCXByaXYtPmlzX3FlX3NjaGVkdWxl
ID0gZmFsc2U7DQorDQorCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9kZXNjX2xvY2spOw0KKwlz
cGluX2xvY2tfaW5pdCgmcHJpdi0+cnhfZGVzY19sb2NrKTsNCisJc3Bpbl9sb2NrX2luaXQoJnBy
aXYtPmZ3Y21kX2xvY2spOw0KKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dmlmX2xvY2spOw0KKwlz
cGluX2xvY2tfaW5pdCgmcHJpdi0+c3RhX2xvY2spOw0KKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+
c3RyZWFtX2xvY2spOw0KKw0KKwlyYyA9IG13bF90eF9pbml0KGh3KTsNCisJaWYgKHJjKSB7DQor
CQl3aXBoeV9lcnIoaHctPndpcGh5LCAiJXM6IGZhaWwgdG8gaW5pdGlhbGl6ZSBUWFxuIiwNCisJ
CQkgIE1XTF9EUlZfTkFNRSk7DQorCQlnb3RvIGVycl9td2xfdHhfaW5pdDsNCisJfQ0KKw0KKwly
YyA9IG13bF9yeF9pbml0KGh3KTsNCisJaWYgKHJjKSB7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5
LCAiJXM6IGZhaWwgdG8gaW5pdGlhbGl6ZSBSWFxuIiwNCisJCQkgIE1XTF9EUlZfTkFNRSk7DQor
CQlnb3RvIGVycl9td2xfcnhfaW5pdDsNCisJfQ0KKw0KKwlyYyA9IG13bF9md2NtZF9nZXRfaHdf
c3BlY3MoaHcpOw0KKwlpZiAocmMpIHsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICIlczogZmFp
bCB0byBnZXQgSFcgc3BlY2lmaWNhdGlvbnNcbiIsDQorCQkJICBNV0xfRFJWX05BTUUpOw0KKwkJ
Z290byBlcnJfZ2V0X2h3X3NwZWNzOw0KKwl9DQorDQorCVNFVF9JRUVFODAyMTFfUEVSTV9BRERS
KGh3LCBwcml2LT5od19kYXRhLm1hY19hZGRyKTsNCisNCisJd3JpdGVsKHByaXYtPmRlc2NfZGF0
YVswXS5wcGh5c190eF9yaW5nLA0KKwkgICAgICAgcHJpdi0+aW9iYXNlMCArIHByaXYtPmRlc2Nf
ZGF0YVswXS53Y2JfYmFzZSk7DQorCWZvciAoaSA9IDE7IGkgPCBTWVNBRFBUX1RPVEFMX1RYX1FV
RVVFUzsgaSsrKQ0KKwkJd3JpdGVsKHByaXYtPmRlc2NfZGF0YVtpXS5wcGh5c190eF9yaW5nLA0K
KwkJICAgICAgIHByaXYtPmlvYmFzZTAgKyBwcml2LT5kZXNjX2RhdGFbaV0ud2NiX2Jhc2UpOw0K
Kwl3cml0ZWwocHJpdi0+ZGVzY19kYXRhWzBdLnBwaHlzX3J4X3JpbmcsDQorCSAgICAgICBwcml2
LT5pb2Jhc2UwICsgcHJpdi0+ZGVzY19kYXRhWzBdLnJ4X2Rlc2NfcmVhZCk7DQorCXdyaXRlbChw
cml2LT5kZXNjX2RhdGFbMF0ucHBoeXNfcnhfcmluZywNCisJICAgICAgIHByaXYtPmlvYmFzZTAg
KyBwcml2LT5kZXNjX2RhdGFbMF0ucnhfZGVzY193cml0ZSk7DQorDQorCXJjID0gbXdsX2Z3Y21k
X3NldF9od19zcGVjcyhodyk7DQorCWlmIChyYykgew0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwg
IiVzOiBmYWlsIHRvIHNldCBIVyBzcGVjaWZpY2F0aW9uc1xuIiwNCisJCQkgIE1XTF9EUlZfTkFN
RSk7DQorCQlnb3RvIGVycl9zZXRfaHdfc3BlY3M7DQorCX0NCisNCisJd2lwaHlfaW5mbyhody0+
d2lwaHksDQorCQkgICAiZmlybXdhcmUgdmVyc2lvbjogMHgleFxuIiwgcHJpdi0+aHdfZGF0YS5m
d19yZWxlYXNlX251bSk7DQorDQorCW13bF9md2NtZF9yYWRpb19kaXNhYmxlKGh3KTsNCisNCisJ
bXdsX2Z3Y21kX3JmX2FudGVubmEoaHcsIFdMX0FOVEVOTkFUWVBFX1RYLCBwcml2LT5hbnRlbm5h
X3R4KTsNCisNCisJbXdsX2Z3Y21kX3JmX2FudGVubmEoaHcsIFdMX0FOVEVOTkFUWVBFX1JYLCBw
cml2LT5hbnRlbm5hX3J4KTsNCisNCisJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSAwOw0K
Kwlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApOw0K
KyNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSA0KKwlody0+d2lwaHktPmludGVyZmFjZV9tb2Rl
cyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCk7DQorI2VuZGlmDQorCWh3LT53aXBo
eS0+aW50ZXJmYWNlX21vZGVzIHw9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKTsNCisJaHct
PndpcGh5LT5pZmFjZV9jb21iaW5hdGlvbnMgPSAmYXBfaWZfY29tYjsNCisJaHctPndpcGh5LT5u
X2lmYWNlX2NvbWJpbmF0aW9ucyA9IDE7DQorDQorCW13bF9zZXRfY2Fwcyhwcml2KTsNCisNCisJ
cmMgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoaHcpOw0KKwlpZiAocmMpIHsNCisJCXdpcGh5X2Vy
cihody0+d2lwaHksICIlczogZmFpbCB0byByZWdpc3RlciBkZXZpY2VcbiIsDQorCQkJICBNV0xf
RFJWX05BTUUpOw0KKwkJZ290byBlcnJfcmVnaXN0ZXJfaHc7DQorCX0NCisNCisJcmMgPSByZXF1
ZXN0X2lycShwcml2LT5wZGV2LT5pcnEsIG13bF9pc3IsDQorCQkJIElSUUZfU0hBUkVELCBNV0xf
RFJWX05BTUUsIGh3KTsNCisJaWYgKHJjKSB7DQorCQlwcml2LT5pcnEgPSAtMTsNCisJCXdpcGh5
X2Vycihody0+d2lwaHksICJmYWlsIHRvIHJlZ2lzdGVyIElSUSBoYW5kbGVyXG4iKTsNCisJCWdv
dG8gZXJyX3JlZ2lzdGVyX2lycTsNCisJfQ0KKwlwcml2LT5pcnEgPSBwcml2LT5wZGV2LT5pcnE7
DQorDQorCXJldHVybiByYzsNCisNCitlcnJfcmVnaXN0ZXJfaXJxOg0KK2Vycl9yZWdpc3Rlcl9o
dzoNCitlcnJfc2V0X2h3X3NwZWNzOg0KK2Vycl9nZXRfaHdfc3BlY3M6DQorDQorCW13bF9yeF9k
ZWluaXQoaHcpOw0KKw0KK2Vycl9td2xfcnhfaW5pdDoNCisNCisJbXdsX3R4X2RlaW5pdChodyk7
DQorDQorZXJyX213bF90eF9pbml0Og0KKw0KKwl3aXBoeV9lcnIoaHctPndpcGh5LCAiaW5pdCBm
YWlsXG4iKTsNCisNCisJcmV0dXJuIHJjOw0KK30NCisNCitzdGF0aWMgdm9pZCBtd2xfd2xfZGVp
bml0KHN0cnVjdCBtd2xfcHJpdiAqcHJpdikNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3
Ow0KKw0KKwlodyA9IHByaXYtPmh3Ow0KKw0KKwlpZiAocHJpdi0+aXJxICE9IC0xKSB7DQorCQlm
cmVlX2lycShwcml2LT5wZGV2LT5pcnEsIGh3KTsNCisJCXByaXYtPmlycSA9IC0xOw0KKwl9DQor
DQorCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGh3KTsNCisJbXdsX3J4X2RlaW5pdChodyk7DQor
CW13bF90eF9kZWluaXQoaHcpOw0KKwl0YXNrbGV0X2tpbGwoJnByaXYtPnFlX3Rhc2spOw0KKwl0
YXNrbGV0X2tpbGwoJnByaXYtPnJ4X3Rhc2spOw0KKwl0YXNrbGV0X2tpbGwoJnByaXYtPnR4X3Rh
c2spOw0KKwljYW5jZWxfd29ya19zeW5jKCZwcml2LT53YXRjaGRvZ19iYV9oYW5kbGUpOw0KKwlt
d2xfZndjbWRfcmVzZXQoaHcpOw0KK30NCisNCitzdGF0aWMgaW50IG13bF9wcm9iZShzdHJ1Y3Qg
cGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQ0KK3sNCisJc3Rh
dGljIGJvb2wgcHJpbnRlZF92ZXJzaW9uOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsNCisJ
c3RydWN0IG13bF9wcml2ICpwcml2Ow0KKwljb25zdCBjaGFyICpmd19uYW1lOw0KKwlpbnQgcmMg
PSAwOw0KKw0KKwlpZiAoaWQtPmRyaXZlcl9kYXRhID49IE1XTFVOS05PV04pDQorCQlyZXR1cm4g
LUVOT0RFVjsNCisNCisJaWYgKCFwcmludGVkX3ZlcnNpb24pIHsNCisJCXByX2luZm8oIjw8JXMg
dmVyc2lvbiAlcz4+IiwNCisJCQlNV0xfREVTQywgTVdMX0RSVl9WRVJTSU9OKTsNCisJCXByaW50
ZWRfdmVyc2lvbiA9IHRydWU7DQorCX0NCisNCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2
KTsNCisJaWYgKHJjKSB7DQorCQlwcl9lcnIoIiVzOiBjYW5ub3QgZW5hYmxlIG5ldyBQQ0kgZGV2
aWNlIiwNCisJCSAgICAgICBNV0xfRFJWX05BTUUpOw0KKwkJcmV0dXJuIHJjOw0KKwl9DQorDQor
CXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsNCisJaWYgKHJj
KSB7DQorCQlwcl9lcnIoIiVzOiAzMi1iaXQgUENJIERNQSBub3Qgc3VwcG9ydGVkIiwNCisJCSAg
ICAgICBNV0xfRFJWX05BTUUpOw0KKwkJZ290byBlcnJfcGNpX2Rpc2FibGVfZGV2aWNlOw0KKwl9
DQorDQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOw0KKw0KKwlodyA9IGllZWU4MDIxMV9hbGxvY19o
dyhzaXplb2YoKnByaXYpLCAmbXdsX21hYzgwMjExX29wcyk7DQorCWlmICghaHcpIHsNCisJCXBy
X2VycigiJXM6IGllZWU4MDIxMSBhbGxvYyBmYWlsZWQiLA0KKwkJICAgICAgIE1XTF9EUlZfTkFN
RSk7DQorCQlyYyA9IC1FTk9NRU07DQorCQlnb3RvIGVycl9wY2lfZGlzYWJsZV9kZXZpY2U7DQor
CX0NCisNCisJU0VUX0lFRUU4MDIxMV9ERVYoaHcsICZwZGV2LT5kZXYpOw0KKwlwY2lfc2V0X2Ry
dmRhdGEocGRldiwgaHcpOw0KKw0KKwlwcml2ID0gaHctPnByaXY7DQorCXByaXYtPmh3ID0gaHc7
DQorCXByaXYtPnBkZXYgPSBwZGV2Ow0KKwlwcml2LT5jaGlwX3R5cGUgPSBpZC0+ZHJpdmVyX2Rh
dGE7DQorCXByaXYtPmRpc2FibGVfMmcgPSBmYWxzZTsNCisJcHJpdi0+ZGlzYWJsZV81ZyA9IGZh
bHNlOw0KKwlwcml2LT5hbnRlbm5hX3R4ID0gbXdsX2NoaXBfdGJsW3ByaXYtPmNoaXBfdHlwZV0u
YW50ZW5uYV90eDsNCisJcHJpdi0+YW50ZW5uYV9yeCA9IG13bF9jaGlwX3RibFtwcml2LT5jaGlw
X3R5cGVdLmFudGVubmFfcng7DQorDQorCXJjID0gbXdsX2FsbG9jX3BjaV9yZXNvdXJjZShwcml2
KTsNCisJaWYgKHJjKQ0KKwkJZ290byBlcnJfYWxsb2NfcGNpX3Jlc291cmNlOw0KKw0KKwlmd19u
YW1lID0gbXdsX2NoaXBfdGJsW3ByaXYtPmNoaXBfdHlwZV0uZndfaW1hZ2U7DQorDQorI2lmZGVm
IENPTkZJR19TVVBQT1JUX01GRw0KKwlpZiAobWZnX21vZGUpDQorCQltd2xfbWZnX2hhbmRsZXJf
aW5pdChwcml2KTsNCisjZW5kaWYNCisNCisJcmMgPSBtd2xfaW5pdF9maXJtd2FyZShwcml2LCBm
d19uYW1lKTsNCisNCisJaWYgKHJjKSB7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiJXM6IGZh
aWwgdG8gaW5pdGlhbGl6ZSBmaXJtd2FyZVxuIiwNCisJCQkgIE1XTF9EUlZfTkFNRSk7DQorCQln
b3RvIGVycl9pbml0X2Zpcm13YXJlOw0KKwl9DQorDQorCS8qIGZpcm13YXJlIGlzIGxvYWRlZCB0
byBIL1csIGl0IGNhbiBiZSByZWxlYXNlZCBub3cgKi8NCisjaWZkZWYgQ09ORklHX1NVUFBPUlRf
TUZHDQorCWlmIChwcml2LT5tZmdfbW9kZSkNCisJCW13bF9tZmdfcmVsZWFzZV9maXJtd2FyZShw
cml2KTsNCisJZWxzZQ0KKyNlbmRpZg0KKwkJcmVsZWFzZV9maXJtd2FyZShwcml2LT5md191Y29k
ZSk7DQorDQorCW13bF9wcm9jZXNzX29mX2R0cyhwcml2KTsNCisNCisJcmMgPSBtd2xfd2xfaW5p
dChwcml2KTsNCisJaWYgKHJjKSB7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiJXM6IGZhaWwg
dG8gaW5pdGlhbGl6ZSB3aXJlbGVzcyBsYW5cbiIsDQorCQkJICBNV0xfRFJWX05BTUUpOw0KKwkJ
Z290byBlcnJfd2xfaW5pdDsNCisJfQ0KKw0KKwl3aXBoeV9pbmZvKHByaXYtPmh3LT53aXBoeSwN
CisJCSAgICIyRzogJXNcbiIsIHByaXYtPmRpc2FibGVfMmcgPyAiZGlzYWJsZSIgOiAiZW5hYmxl
Iik7DQorCXdpcGh5X2luZm8ocHJpdi0+aHctPndpcGh5LA0KKwkJICAgIjVHOiAlc1xuIiwgcHJp
di0+ZGlzYWJsZV81ZyA/ICJkaXNhYmxlIiA6ICJlbmFibGUiKTsNCisNCisJaWYgKHByaXYtPmFu
dGVubmFfdHggPT0gQU5URU5OQV9UWF80X0FVVE8pDQorCQl3aXBoeV9pbmZvKHByaXYtPmh3LT53
aXBoeSwgIlRYOiA0IGFudGVubmFzXG4iKTsNCisJZWxzZSBpZiAocHJpdi0+YW50ZW5uYV90eCA9
PSBBTlRFTk5BX1RYXzIpDQorCQl3aXBoeV9pbmZvKHByaXYtPmh3LT53aXBoeSwgIlRYOiAyIGFu
dGVubmFzXG4iKTsNCisJZWxzZQ0KKwkJd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksICJUWDog
dW5rbm93blxuIik7DQorCWlmIChwcml2LT5hbnRlbm5hX3J4ID09IEFOVEVOTkFfUlhfNF9BVVRP
KQ0KKwkJd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksICJSWDogNCBhbnRlbm5hc1xuIik7DQor
CWVsc2UgaWYgKHByaXYtPmFudGVubmFfcnggPT0gQU5URU5OQV9SWF8yKQ0KKwkJd2lwaHlfaW5m
byhwcml2LT5ody0+d2lwaHksICJSWDogMiBhbnRlbm5hc1xuIik7DQorCWVsc2UNCisJCXdpcGh5
X2luZm8ocHJpdi0+aHctPndpcGh5LCAiUlg6IHVua25vd25cbiIpOw0KKw0KKyNpZmRlZiBDT05G
SUdfREVCVUdfRlMNCisJbXdsX2RlYnVnZnNfaW5pdChodyk7DQorI2VuZGlmDQorDQorCXJldHVy
biByYzsNCisNCitlcnJfd2xfaW5pdDoNCitlcnJfaW5pdF9maXJtd2FyZToNCisNCisJbXdsX2Z3
Y21kX3Jlc2V0KGh3KTsNCisNCitlcnJfYWxsb2NfcGNpX3Jlc291cmNlOg0KKw0KKwlwY2lfc2V0
X2RydmRhdGEocGRldiwgTlVMTCk7DQorCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsNCisNCitlcnJf
cGNpX2Rpc2FibGVfZGV2aWNlOg0KKw0KKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7DQorDQor
CXJldHVybiByYzsNCit9DQorDQorc3RhdGljIHZvaWQgbXdsX3JlbW92ZShzdHJ1Y3QgcGNpX2Rl
diAqcGRldikNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcGNpX2dldF9kcnZkYXRh
KHBkZXYpOw0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXY7DQorDQorCWlmICghaHcpDQorCQlyZXR1
cm47DQorDQorCXByaXYgPSBody0+cHJpdjsNCisNCisJbXdsX3dsX2RlaW5pdChwcml2KTsNCisJ
cGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOw0KKwlpZWVlODAyMTFfZnJlZV9odyhodyk7DQor
CXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsNCisNCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTDQor
CW13bF9kZWJ1Z2ZzX3JlbW92ZShodyk7DQorI2VuZGlmDQorfQ0KKw0KK3N0YXRpYyBzdHJ1Y3Qg
cGNpX2RyaXZlciBtd2xfcGNpX2RyaXZlciA9IHsNCisJLm5hbWUgICAgID0gTVdMX0RSVl9OQU1F
LA0KKwkuaWRfdGFibGUgPSBtd2xfcGNpX2lkX3RibCwNCisJLnByb2JlICAgID0gbXdsX3Byb2Jl
LA0KKwkucmVtb3ZlICAgPSBtd2xfcmVtb3ZlDQorfTsNCisNCittb2R1bGVfcGNpX2RyaXZlciht
d2xfcGNpX2RyaXZlcik7DQorDQorTU9EVUxFX0RFU0NSSVBUSU9OKE1XTF9ERVNDKTsNCitNT0RV
TEVfVkVSU0lPTihNV0xfRFJWX1ZFUlNJT04pOw0KK01PRFVMRV9BVVRIT1IoIk1hcnZlbGwgU2Vt
aWNvbmR1Y3RvciwgSW5jLiIpOw0KK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsNCitNT0RVTEVf
U1VQUE9SVEVEX0RFVklDRShNV0xfREVWX05BTUUpOw0KK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNp
LCBtd2xfcGNpX2lkX3RibCk7DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFy
dmVsbC9td2x3aWZpL3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkv
cnguYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjQzMDgxMDcNCi0tLSAv
ZGV2L251bGwNCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9yeC5j
DQpAQCAtMCwwICsxLDYyNCBAQA0KKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUsIE1h
cnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuDQorICoNCisgKiBUaGlzIHNvZnR3YXJlIGZpbGUgKHRo
ZSAiRmlsZSIpIGlzIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgSW50ZXJuYXRpb25hbA0KKyAqIEx0
ZC4gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJz
aW9uIDIsIEp1bmUgMTk5MQ0KKyAqICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgdXNlLCByZWRp
c3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIEZpbGUgaW4NCisgKiBhY2NvcmRhbmNlIHdpdGgg
dGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBMaWNlbnNlLCBhIGNvcHkgb2Ygd2hpY2gN
CisgKiBpcyBhdmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uLCBJbmMuDQorICoNCisgKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9V
VCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UNCisg
KiBBUkUgRVhQUkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlv
bmFsIGRldGFpbHMgYWJvdXQNCisgKiB0aGlzIHdhcnJhbnR5IGRpc2NsYWltZXIuDQorICovDQor
DQorLyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW1wbGVtZW50cyByZWNlaXZlIHJlbGF0ZWQg
ZnVuY3Rpb25zLiAqLw0KKw0KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPg0KKyNpbmNs
dWRlIDxsaW51eC9za2J1ZmYuaD4NCisNCisjaW5jbHVkZSAic3lzYWRwdC5oIg0KKyNpbmNsdWRl
ICJkZXYuaCINCisjaW5jbHVkZSAicnguaCINCisNCisjZGVmaW5lIE1BWF9OVU1fUlhfUklOR19C
WVRFUyAgKFNZU0FEUFRfTUFYX05VTV9SWF9ERVNDICogXA0KKwkJCQlzaXplb2Yoc3RydWN0IG13
bF9yeF9kZXNjKSkNCisNCisjZGVmaW5lIE1BWF9OVU1fUlhfSE5ETF9CWVRFUyAgKFNZU0FEUFRf
TUFYX05VTV9SWF9ERVNDICogXA0KKwkJCQlzaXplb2Yoc3RydWN0IG13bF9yeF9obmRsKSkNCisN
CisjZGVmaW5lIERFQ1JZUFRfRVJSX01BU0sgICAgICAgIDB4ODANCisjZGVmaW5lIEdFTkVSQUxf
REVDUllQVF9FUlIgICAgIDB4RkYNCisjZGVmaW5lIFRLSVBfREVDUllQVF9NSUNfRVJSICAgIDB4
MDINCisjZGVmaW5lIFdFUF9ERUNSWVBUX0lDVl9FUlIgICAgIDB4MDQNCisjZGVmaW5lIFRLSVBf
REVDUllQVF9JQ1ZfRVJSICAgIDB4MDgNCisNCisjZGVmaW5lIFc4MzZYX1JTU0lfT0ZGU0VUICAg
ICAgIDgNCisNCisvKiBSZWNlaXZlIHJhdGUgaW5mb3JtYXRpb24gY29uc3RhbnRzICovDQorI2Rl
ZmluZSBSWF9SQVRFX0lORk9fRk9STUFUXzExQSAgICAgICAwDQorI2RlZmluZSBSWF9SQVRFX0lO
Rk9fRk9STUFUXzExQiAgICAgICAxDQorI2RlZmluZSBSWF9SQVRFX0lORk9fRk9STUFUXzExTiAg
ICAgICAyDQorI2RlZmluZSBSWF9SQVRFX0lORk9fRk9STUFUXzExQUMgICAgICA0DQorDQorI2Rl
ZmluZSBSWF9SQVRFX0lORk9fSFQyMCAgICAgICAgICAgICAwDQorI2RlZmluZSBSWF9SQVRFX0lO
Rk9fSFQ0MCAgICAgICAgICAgICAxDQorI2RlZmluZSBSWF9SQVRFX0lORk9fSFQ4MCAgICAgICAg
ICAgICAyDQorDQorI2RlZmluZSBSWF9SQVRFX0lORk9fTE9OR19JTlRFUlZBTCAgICAwDQorI2Rl
ZmluZSBSWF9SQVRFX0lORk9fU0hPUlRfSU5URVJWQUwgICAxDQorDQorc3RhdGljIGludCBtd2xf
cnhfcmluZ19hbGxvYyhzdHJ1Y3QgbXdsX3ByaXYgKnByaXYpDQorew0KKwlzdHJ1Y3QgbXdsX2Rl
c2NfZGF0YSAqZGVzYzsNCisNCisJZGVzYyA9ICZwcml2LT5kZXNjX2RhdGFbMF07DQorDQorCWRl
c2MtPnByeF9yaW5nID0gKHN0cnVjdCBtd2xfcnhfZGVzYyAqKQ0KKwkJZG1hX2FsbG9jX2NvaGVy
ZW50KCZwcml2LT5wZGV2LT5kZXYsDQorCQkJCSAgIE1BWF9OVU1fUlhfUklOR19CWVRFUywNCisJ
CQkJICAgJmRlc2MtPnBwaHlzX3J4X3JpbmcsDQorCQkJCSAgIEdGUF9LRVJORUwpOw0KKw0KKwlp
ZiAoIWRlc2MtPnByeF9yaW5nKSB7DQorCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiY2Fu
bm90IGFsbG9jIG1lbVxuIik7DQorCQlyZXR1cm4gLUVOT01FTTsNCisJfQ0KKw0KKwltZW1zZXQo
ZGVzYy0+cHJ4X3JpbmcsIDB4MDAsIE1BWF9OVU1fUlhfUklOR19CWVRFUyk7DQorDQorCWRlc2Mt
PnJ4X2huZGwgPSBrbWFsbG9jKE1BWF9OVU1fUlhfSE5ETF9CWVRFUywgR0ZQX0tFUk5FTCk7DQor
DQorCWlmICghZGVzYy0+cnhfaG5kbCkgew0KKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBk
ZXYtPmRldiwNCisJCQkJICBNQVhfTlVNX1JYX1JJTkdfQllURVMsDQorCQkJCSAgZGVzYy0+cHJ4
X3JpbmcsDQorCQkJCSAgZGVzYy0+cHBoeXNfcnhfcmluZyk7DQorCQlyZXR1cm4gLUVOT01FTTsN
CisJfQ0KKw0KKwltZW1zZXQoZGVzYy0+cnhfaG5kbCwgMHgwMCwgTUFYX05VTV9SWF9ITkRMX0JZ
VEVTKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX3J4X3JpbmdfaW5p
dChzdHJ1Y3QgbXdsX3ByaXYgKnByaXYpDQorew0KKwlzdHJ1Y3QgbXdsX2Rlc2NfZGF0YSAqZGVz
YzsNCisJaW50IGk7DQorCXN0cnVjdCBtd2xfcnhfaG5kbCAqcnhfaG5kbDsNCisJZG1hX2FkZHJf
dCBkbWE7DQorCXUzMiB2YWw7DQorDQorCWRlc2MgPSAmcHJpdi0+ZGVzY19kYXRhWzBdOw0KKw0K
KwlpZiAoZGVzYy0+cHJ4X3JpbmcpIHsNCisJCWRlc2MtPnJ4X2J1Zl9zaXplID0gU1lTQURQVF9N
QVhfQUdHUl9TSVpFOw0KKw0KKwkJZm9yIChpID0gMDsgaSA8IFNZU0FEUFRfTUFYX05VTV9SWF9E
RVNDOyBpKyspIHsNCisJCQlyeF9obmRsID0gJmRlc2MtPnJ4X2huZGxbaV07DQorCQkJcnhfaG5k
bC0+cHNrX2J1ZmYgPQ0KKwkJCQlkZXZfYWxsb2Nfc2tiKGRlc2MtPnJ4X2J1Zl9zaXplKTsNCisN
CisJCQlpZiAoIXJ4X2huZGwtPnBza19idWZmKSB7DQorCQkJCXdpcGh5X2Vycihwcml2LT5ody0+
d2lwaHksDQorCQkJCQkgICJyeGRlc2MgJWk6IG5vIHNrYnVmZiBhdmFpbGFibGVcbiIsDQorCQkJ
CQkgIGkpOw0KKwkJCQlyZXR1cm4gLUVOT01FTTsNCisJCQl9DQorDQorCQkJc2tiX3Jlc2VydmUo
cnhfaG5kbC0+cHNrX2J1ZmYsDQorCQkJCSAgICBTWVNBRFBUX01JTl9CWVRFU19IRUFEUk9PTSk7
DQorCQkJZGVzYy0+cHJ4X3JpbmdbaV0ucnhfY29udHJvbCA9DQorCQkJCUVBR0xFX1JYRF9DVFJM
X0RSSVZFUl9PV047DQorCQkJZGVzYy0+cHJ4X3JpbmdbaV0uc3RhdHVzID0gRUFHTEVfUlhEX1NU
QVRVU19PSzsNCisJCQlkZXNjLT5wcnhfcmluZ1tpXS5xb3NfY3RybCA9IDB4MDAwMDsNCisJCQlk
ZXNjLT5wcnhfcmluZ1tpXS5jaGFubmVsID0gMHgwMDsNCisJCQlkZXNjLT5wcnhfcmluZ1tpXS5y
c3NpID0gMHgwMDsNCisJCQlkZXNjLT5wcnhfcmluZ1tpXS5wa3RfbGVuID0NCisJCQkJY3B1X3Rv
X2xlMTYoU1lTQURQVF9NQVhfQUdHUl9TSVpFKTsNCisJCQlkbWEgPSBwY2lfbWFwX3NpbmdsZShw
cml2LT5wZGV2LA0KKwkJCQkJICAgICByeF9obmRsLT5wc2tfYnVmZi0+ZGF0YSwNCisJCQkJCSAg
ICAgZGVzYy0+cnhfYnVmX3NpemUsDQorCQkJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7DQor
CQkJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihwcml2LT5wZGV2LCBkbWEpKSB7DQorCQkJCXdp
cGh5X2Vycihwcml2LT5ody0+d2lwaHksDQorCQkJCQkgICJmYWlsZWQgdG8gbWFwIHBjaSBtZW1v
cnkhXG4iKTsNCisJCQkJcmV0dXJuIC1FTk9NRU07DQorCQkJfQ0KKwkJCWRlc2MtPnByeF9yaW5n
W2ldLnBwaHlzX2J1ZmZfZGF0YSA9IGNwdV90b19sZTMyKGRtYSk7DQorCQkJdmFsID0gKHUzMilk
ZXNjLT5wcGh5c19yeF9yaW5nICsNCisJCQkgICAgICAoKGkgKyAxKSAqIHNpemVvZihzdHJ1Y3Qg
bXdsX3J4X2Rlc2MpKTsNCisJCQlkZXNjLT5wcnhfcmluZ1tpXS5wcGh5c19uZXh0ID0gY3B1X3Rv
X2xlMzIodmFsKTsNCisJCQlyeF9obmRsLT5wZGVzYyA9ICZkZXNjLT5wcnhfcmluZ1tpXTsNCisJ
CQlpZiAoaSA8IChTWVNBRFBUX01BWF9OVU1fUlhfREVTQyAtIDEpKQ0KKwkJCQlyeF9obmRsLT5w
bmV4dCA9ICZkZXNjLT5yeF9obmRsW2kgKyAxXTsNCisJCX0NCisJCWRlc2MtPnByeF9yaW5nW1NZ
U0FEUFRfTUFYX05VTV9SWF9ERVNDIC0gMV0ucHBoeXNfbmV4dCA9DQorCQkJY3B1X3RvX2xlMzIo
KHUzMilkZXNjLT5wcGh5c19yeF9yaW5nKTsNCisJCWRlc2MtPnJ4X2huZGxbU1lTQURQVF9NQVhf
TlVNX1JYX0RFU0MgLSAxXS5wbmV4dCA9DQorCQkJJmRlc2MtPnJ4X2huZGxbMF07DQorCQlkZXNj
LT5wbmV4dF9yeF9obmRsID0gJmRlc2MtPnJ4X2huZGxbMF07DQorDQorCQlyZXR1cm4gMDsNCisJ
fQ0KKw0KKwl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAibm8gdmFsaWQgUlggbWVtXG4iKTsN
CisNCisJcmV0dXJuIC1FTk9NRU07DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9yeF9yaW5nX2Ns
ZWFudXAoc3RydWN0IG13bF9wcml2ICpwcml2KQ0KK3sNCisJc3RydWN0IG13bF9kZXNjX2RhdGEg
KmRlc2M7DQorCWludCBpOw0KKwlzdHJ1Y3QgbXdsX3J4X2huZGwgKnJ4X2huZGw7DQorDQorCWRl
c2MgPSAmcHJpdi0+ZGVzY19kYXRhWzBdOw0KKw0KKwlpZiAoZGVzYy0+cHJ4X3JpbmcpIHsNCisJ
CWZvciAoaSA9IDA7IGkgPCBTWVNBRFBUX01BWF9OVU1fUlhfREVTQzsgaSsrKSB7DQorCQkJcnhf
aG5kbCA9ICZkZXNjLT5yeF9obmRsW2ldOw0KKwkJCWlmICghcnhfaG5kbC0+cHNrX2J1ZmYpDQor
CQkJCWNvbnRpbnVlOw0KKw0KKwkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwNCisJCQkJ
CSBsZTMyX3RvX2NwdQ0KKwkJCQkJIChyeF9obmRsLT5wZGVzYy0+cHBoeXNfYnVmZl9kYXRhKSwN
CisJCQkJCSBkZXNjLT5yeF9idWZfc2l6ZSwNCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOw0K
Kw0KKwkJCWRldl9rZnJlZV9za2JfYW55KHJ4X2huZGwtPnBza19idWZmKTsNCisNCisJCQl3aXBo
eV9pbmZvKHByaXYtPmh3LT53aXBoeSwNCisJCQkJICAgInVubWFwcGVkK2ZyZWUnZCAlaSAweCVw
IDB4JXggJWlcbiIsDQorCQkJCSAgIGksIHJ4X2huZGwtPnBza19idWZmLT5kYXRhLA0KKwkJCQkg
ICBsZTMyX3RvX2NwdShyeF9obmRsLT5wZGVzYy0+cHBoeXNfYnVmZl9kYXRhKSwNCisJCQkJICAg
ZGVzYy0+cnhfYnVmX3NpemUpOw0KKw0KKwkJCXJ4X2huZGwtPnBza19idWZmID0gTlVMTDsNCisJ
CX0NCisJfQ0KK30NCisNCitzdGF0aWMgdm9pZCBtd2xfcnhfcmluZ19mcmVlKHN0cnVjdCBtd2xf
cHJpdiAqcHJpdikNCit7DQorCXN0cnVjdCBtd2xfZGVzY19kYXRhICpkZXNjOw0KKw0KKwlkZXNj
ID0gJnByaXYtPmRlc2NfZGF0YVswXTsNCisNCisJaWYgKGRlc2MtPnByeF9yaW5nKSB7DQorCQlt
d2xfcnhfcmluZ19jbGVhbnVwKHByaXYpOw0KKw0KKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYt
PnBkZXYtPmRldiwNCisJCQkJICBNQVhfTlVNX1JYX1JJTkdfQllURVMsDQorCQkJCSAgZGVzYy0+
cHJ4X3JpbmcsDQorCQkJCSAgZGVzYy0+cHBoeXNfcnhfcmluZyk7DQorDQorCQlkZXNjLT5wcnhf
cmluZyA9IE5VTEw7DQorCX0NCisNCisJa2ZyZWUoZGVzYy0+cnhfaG5kbCk7DQorDQorCWRlc2Mt
PnBuZXh0X3J4X2huZGwgPSBOVUxMOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXdsX3J4
X3ByZXBhcmVfc3RhdHVzKHN0cnVjdCBtd2xfcnhfZGVzYyAqcGRlc2MsDQorCQkJCQkgc3RydWN0
IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cykNCit7DQorCXUxNiByYXRlLCBmb3JtYXQsIG5z
cywgYncsIGdpLCBydDsNCisNCisJbWVtc2V0KHN0YXR1cywgMCwgc2l6ZW9mKCpzdGF0dXMpKTsN
CisNCisJc3RhdHVzLT5zaWduYWwgPSAtKHBkZXNjLT5yc3NpICsgVzgzNlhfUlNTSV9PRkZTRVQp
Ow0KKw0KKwlyYXRlID0gbGUxNl90b19jcHUocGRlc2MtPnJhdGUpOw0KKwlmb3JtYXQgPSByYXRl
ICYgTVdMX1JYX1JBVEVfRk9STUFUX01BU0s7DQorCW5zcyA9IChyYXRlICYgTVdMX1JYX1JBVEVf
TlNTX01BU0spID4+IE1XTF9SWF9SQVRFX05TU19TSElGVDsNCisJYncgPSAocmF0ZSAmIE1XTF9S
WF9SQVRFX0JXX01BU0spID4+IE1XTF9SWF9SQVRFX0JXX1NISUZUOw0KKwlnaSA9IChyYXRlICYg
TVdMX1JYX1JBVEVfR0lfTUFTSykgPj4gTVdMX1JYX1JBVEVfR0lfU0hJRlQ7DQorCXJ0ID0gKHJh
dGUgJiBNV0xfUlhfUkFURV9SVF9NQVNLKSA+PiBNV0xfUlhfUkFURV9SVF9TSElGVDsNCisNCisJ
c3dpdGNoIChmb3JtYXQpIHsNCisJY2FzZSBSWF9SQVRFX0lORk9fRk9STUFUXzExTjoNCisJCXN0
YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX0hUOw0KKwkJaWYgKGJ3ID09IFJYX1JBVEVfSU5GT19IVDQw
KQ0KKwkJCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHXzQwTUhaOw0KKwkJaWYgKGdpID09IFJYX1JB
VEVfSU5GT19TSE9SVF9JTlRFUlZBTCkNCisJCQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19TSE9S
VF9HSTsNCisJCWJyZWFrOw0KKwljYXNlIFJYX1JBVEVfSU5GT19GT1JNQVRfMTFBQzoNCisJCXN0
YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX1ZIVDsNCisJCWlmIChidyA9PSBSWF9SQVRFX0lORk9fSFQ0
MCkNCisJCQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR180ME1IWjsNCisJCWlmIChidyA9PSBSWF9S
QVRFX0lORk9fSFQ4MCkNCisJCQlzdGF0dXMtPnZodF9mbGFnIHw9IFJYX1ZIVF9GTEFHXzgwTUha
Ow0KKwkJaWYgKGdpID09IFJYX1JBVEVfSU5GT19TSE9SVF9JTlRFUlZBTCkNCisJCQlzdGF0dXMt
PmZsYWcgfD0gUlhfRkxBR19TSE9SVF9HSTsNCisJCXN0YXR1cy0+dmh0X25zcyA9IChuc3MgKyAx
KTsNCisJCWJyZWFrOw0KKwl9DQorDQorCXN0YXR1cy0+cmF0ZV9pZHggPSBydDsNCisNCisJaWYg
KHBkZXNjLT5jaGFubmVsID4gQkFORF8yNF9DSEFOTkVMX05VTSkgew0KKwkJc3RhdHVzLT5iYW5k
ID0gSUVFRTgwMjExX0JBTkRfNUdIWjsNCisJCWlmICgoIShzdGF0dXMtPmZsYWcgJiBSWF9GTEFH
X0hUKSkgJiYNCisJCSAgICAoIShzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX1ZIVCkpKSB7DQorCQkJ
c3RhdHVzLT5yYXRlX2lkeCAtPSA1Ow0KKwkJCWlmIChzdGF0dXMtPnJhdGVfaWR4ID49IEJBTkRf
NTBfUkFURV9OVU0pDQorCQkJCXN0YXR1cy0+cmF0ZV9pZHggPSBCQU5EXzUwX1JBVEVfTlVNIC0g
MTsNCisJCX0NCisJfSBlbHNlIHsNCisJCXN0YXR1cy0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJH
SFo7DQorCQlpZiAoKCEoc3RhdHVzLT5mbGFnICYgUlhfRkxBR19IVCkpICYmDQorCQkgICAgKCEo
c3RhdHVzLT5mbGFnICYgUlhfRkxBR19WSFQpKSkgew0KKwkJCWlmIChzdGF0dXMtPnJhdGVfaWR4
ID49IEJBTkRfMjRfUkFURV9OVU0pDQorCQkJCXN0YXR1cy0+cmF0ZV9pZHggPSBCQU5EXzI0X1JB
VEVfTlVNIC0gMTsNCisJCX0NCisJfQ0KKw0KKwlzdGF0dXMtPmZyZXEgPSBpZWVlODAyMTFfY2hh
bm5lbF90b19mcmVxdWVuY3kocGRlc2MtPmNoYW5uZWwsDQorCQkJCQkJICAgICAgc3RhdHVzLT5i
YW5kKTsNCisNCisJLyogY2hlY2sgaWYgc3RhdHVzIGhhcyBhIHNwZWNpZmljIGVycm9yIGJpdCAo
Yml0IDcpIHNldCBvciBpbmRpY2F0ZXMNCisJICogYSBnZW5lcmFsIGRlY3J5cHQgZXJyb3INCisJ
ICovDQorCWlmICgocGRlc2MtPnN0YXR1cyA9PSBHRU5FUkFMX0RFQ1JZUFRfRVJSKSB8fA0KKwkg
ICAgKHBkZXNjLT5zdGF0dXMgJiBERUNSWVBUX0VSUl9NQVNLKSkgew0KKwkJLyogY2hlY2sgaWYg
c3RhdHVzIGlzIG5vdCBlcXVhbCB0byAweEZGDQorCQkgKiB0aGUgMHhGRiBjaGVjayBpcyBmb3Ig
YmFja3dhcmQgY29tcGF0aWJpbGl0eQ0KKwkJICovDQorCQlpZiAocGRlc2MtPnN0YXR1cyAhPSBH
RU5FUkFMX0RFQ1JZUFRfRVJSKSB7DQorCQkJaWYgKCgocGRlc2MtPnN0YXR1cyAmICh+REVDUllQ
VF9FUlJfTUFTSykpICYNCisJCQkgICAgVEtJUF9ERUNSWVBUX01JQ19FUlIpICYmICEoKHBkZXNj
LT5zdGF0dXMgJg0KKwkJCSAgICAoV0VQX0RFQ1JZUFRfSUNWX0VSUiB8IFRLSVBfREVDUllQVF9J
Q1ZfRVJSKSkpKSB7DQorCQkJCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX01NSUNfRVJST1I7DQor
CQkJfQ0KKwkJfQ0KKwl9DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xfcnhfZW5hYmxl
X3N0YV9hbXNkdShzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsDQorCQkJCQkgICB1OCAqc3RhX2FkZHIp
DQorew0KKwlzdHJ1Y3QgbXdsX3N0YSAqc3RhX2luZm87DQorCXN0cnVjdCBpZWVlODAyMTFfc3Rh
ICpzdGE7DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+c3RhX2xvY2spOw0KKwlsaXN0X2Zvcl9l
YWNoX2VudHJ5KHN0YV9pbmZvLCAmcHJpdi0+c3RhX2xpc3QsIGxpc3QpIHsNCisJCXN0YSA9IGNv
bnRhaW5lcl9vZigoY2hhciAqKXN0YV9pbmZvLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSwNCisJCQkJ
ICAgZHJ2X3ByaXZbMF0pOw0KKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwoc3RhLT5hZGRyLCBzdGFf
YWRkcikpIHsNCisJCQlzdGFfaW5mby0+aXNfYW1zZHVfYWxsb3dlZCA9IHRydWU7DQorCQkJYnJl
YWs7DQorCQl9DQorCX0NCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsNCit9DQor
DQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3J4X2ZpbmRfdmlmX2JzcyhzdHJ1
Y3QgbXdsX3ByaXYgKnByaXYsDQorCQkJCQkJICB1OCAqYnNzaWQpDQorew0KKwlzdHJ1Y3QgbXds
X3ZpZiAqbXdsX3ZpZjsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT52aWZfbG9jayk7DQorCWxp
c3RfZm9yX2VhY2hfZW50cnkobXdsX3ZpZiwgJnByaXYtPnZpZl9saXN0LCBsaXN0KSB7DQorCQlp
ZiAoZXRoZXJfYWRkcl9lcXVhbChic3NpZCwgbXdsX3ZpZi0+YnNzaWQpKSB7DQorCQkJc3Bpbl91
bmxvY2tfYmgoJnByaXYtPnZpZl9sb2NrKTsNCisJCQlyZXR1cm4gbXdsX3ZpZjsNCisJCX0NCisJ
fQ0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+dmlmX2xvY2spOw0KKw0KKwlyZXR1cm4gTlVMTDsN
Cit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG13bF9yeF9yZW1vdmVfZG1hX2hlYWRlcihzdHJ1
Y3Qgc2tfYnVmZiAqc2tiLCBfX2xlMTYgcW9zKQ0KK3sNCisJc3RydWN0IG13bF9kbWFfZGF0YSAq
dHI7DQorCWludCBoZHJsZW47DQorDQorCXRyID0gKHN0cnVjdCBtd2xfZG1hX2RhdGEgKilza2It
PmRhdGE7DQorCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4odHItPndoLmZyYW1lX2NvbnRyb2wp
Ow0KKw0KKwlpZiAoaGRybGVuICE9IHNpemVvZih0ci0+d2gpKSB7DQorCQlpZiAoaWVlZTgwMjEx
X2lzX2RhdGFfcW9zKHRyLT53aC5mcmFtZV9jb250cm9sKSkgew0KKwkJCW1lbW1vdmUodHItPmRh
dGEgLSBoZHJsZW4sICZ0ci0+d2gsIGhkcmxlbiAtIDIpOw0KKwkJCSooKF9fbGUxNiAqKSh0ci0+
ZGF0YSAtIDIpKSA9IHFvczsNCisJCX0gZWxzZSB7DQorCQkJbWVtbW92ZSh0ci0+ZGF0YSAtIGhk
cmxlbiwgJnRyLT53aCwgaGRybGVuKTsNCisJCX0NCisJfQ0KKw0KKwlpZiAoaGRybGVuICE9IHNp
emVvZigqdHIpKQ0KKwkJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnRyKSAtIGhkcmxlbik7DQorfQ0K
Kw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtd2xfcnhfcHJvY2Vzc19tZXNoX2Ftc2R1KHN0cnVjdCBt
d2xfcHJpdiAqcHJpdiwNCisJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwNCisJCQkJCSAg
ICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cykNCit7DQorCXN0cnVjdCBpZWVl
ODAyMTFfaGRyICp3aDsNCisJc3RydWN0IG13bF9zdGEgKnN0YV9pbmZvOw0KKwlzdHJ1Y3QgaWVl
ZTgwMjExX3N0YSAqc3RhOw0KKwl1OCAqcWM7DQorCWludCB3aF9sZW47DQorCWludCBsZW47DQor
CXU4IHBhZDsNCisJdTggKmRhdGE7DQorCXUxNiBmcmFtZV9sZW47DQorCXN0cnVjdCBza19idWZm
ICpuZXdza2I7DQorDQorCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOw0K
Kw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsNCisJbGlzdF9mb3JfZWFjaF9lbnRy
eShzdGFfaW5mbywgJnByaXYtPnN0YV9saXN0LCBsaXN0KSB7DQorCQlzdGEgPSBjb250YWluZXJf
b2YoKGNoYXIgKilzdGFfaW5mbywgc3RydWN0IGllZWU4MDIxMV9zdGEsDQorCQkJCSAgIGRydl9w
cml2WzBdKTsNCisJCWlmIChldGhlcl9hZGRyX2VxdWFsKHN0YS0+YWRkciwgd2gtPmFkZHIyKSkg
ew0KKwkJCWlmICghc3RhX2luZm8tPmlzX21lc2hfbm9kZSkgew0KKwkJCQlzcGluX3VubG9ja19i
aCgmcHJpdi0+c3RhX2xvY2spOw0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJfQ0KKwl9
DQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdGFfbG9jayk7DQorDQorCXFjID0gaWVlZTgwMjEx
X2dldF9xb3NfY3RsKHdoKTsNCisJKnFjICY9IH5JRUVFODAyMTFfUU9TX0NUTF9BX01TRFVfUFJF
U0VOVDsNCisNCisJd2hfbGVuID0gaWVlZTgwMjExX2hkcmxlbih3aC0+ZnJhbWVfY29udHJvbCk7
DQorCWxlbiA9IHdoX2xlbjsNCisJZGF0YSA9IHNrYi0+ZGF0YTsNCisNCisJd2hpbGUgKGxlbiA8
IHNrYi0+bGVuKSB7DQorCQlmcmFtZV9sZW4gPSAqKHU4ICopKGRhdGEgKyBsZW4gKyBFVEhfSExF
TiAtIDEpIHwNCisJCQkoKih1OCAqKShkYXRhICsgbGVuICsgRVRIX0hMRU4gLSAyKSA8PCA4KTsN
CisNCisJCWlmICgobGVuICsgRVRIX0hMRU4gKyBmcmFtZV9sZW4pID4gc2tiLT5sZW4pDQorCQkJ
YnJlYWs7DQorDQorCQluZXdza2IgPSBkZXZfYWxsb2Nfc2tiKHdoX2xlbiArIGZyYW1lX2xlbik7
DQorCQlpZiAoIW5ld3NrYikNCisJCQlicmVhazsNCisNCisJCWV0aGVyX2FkZHJfY29weSh3aC0+
YWRkcjMsIGRhdGEgKyBsZW4pOw0KKwkJZXRoZXJfYWRkcl9jb3B5KHdoLT5hZGRyNCwgZGF0YSAr
IGxlbiArIEVUSF9BTEVOKTsNCisJCW1lbWNweShuZXdza2ItPmRhdGEsIHdoLCB3aF9sZW4pOw0K
KwkJbWVtY3B5KG5ld3NrYi0+ZGF0YSArIHdoX2xlbiwgZGF0YSArIGxlbiArIEVUSF9ITEVOLCBm
cmFtZV9sZW4pOw0KKwkJc2tiX3B1dChuZXdza2IsIHdoX2xlbiArIGZyYW1lX2xlbik7DQorDQor
CQlwYWQgPSAoKEVUSF9ITEVOICsgZnJhbWVfbGVuKSAlIDQpID8NCisJCQkoNCAtIChFVEhfSExF
TiArIGZyYW1lX2xlbikgJSA0KSA6IDA7DQorCQlsZW4gKz0gKEVUSF9ITEVOICsgZnJhbWVfbGVu
ICsgcGFkKTsNCisJCWlmIChsZW4gPCBza2ItPmxlbikNCisJCQlzdGF0dXMtPmZsYWcgfD0gUlhf
RkxBR19BTVNEVV9NT1JFOw0KKwkJZWxzZQ0KKwkJCXN0YXR1cy0+ZmxhZyAmPSB+UlhfRkxBR19B
TVNEVV9NT1JFOw0KKwkJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihuZXdza2IpLCBzdGF0dXMs
IHNpemVvZigqc3RhdHVzKSk7DQorCQlpZWVlODAyMTFfcngocHJpdi0+aHcsIG5ld3NrYik7DQor
CX0NCisNCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsNCisNCisJcmV0dXJuIHRydWU7DQorfQ0K
Kw0KK3N0YXRpYyBpbnQgbXdsX3J4X3JlZmlsbChzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIHN0cnVj
dCBtd2xfcnhfaG5kbCAqcnhfaG5kbCkNCit7DQorCXN0cnVjdCBtd2xfZGVzY19kYXRhICpkZXNj
Ow0KKwlkbWFfYWRkcl90IGRtYTsNCisNCisJZGVzYyA9ICZwcml2LT5kZXNjX2RhdGFbMF07DQor
DQorCXJ4X2huZGwtPnBza19idWZmID0gZGV2X2FsbG9jX3NrYihkZXNjLT5yeF9idWZfc2l6ZSk7
DQorDQorCWlmICghcnhfaG5kbC0+cHNrX2J1ZmYpDQorCQlyZXR1cm4gLUVOT01FTTsNCisNCisJ
c2tiX3Jlc2VydmUocnhfaG5kbC0+cHNrX2J1ZmYsIFNZU0FEUFRfTUlOX0JZVEVTX0hFQURST09N
KTsNCisNCisJcnhfaG5kbC0+cGRlc2MtPnN0YXR1cyA9IEVBR0xFX1JYRF9TVEFUVVNfT0s7DQor
CXJ4X2huZGwtPnBkZXNjLT5xb3NfY3RybCA9IDB4MDAwMDsNCisJcnhfaG5kbC0+cGRlc2MtPmNo
YW5uZWwgPSAweDAwOw0KKwlyeF9obmRsLT5wZGVzYy0+cnNzaSA9IDB4MDA7DQorCXJ4X2huZGwt
PnBkZXNjLT5wa3RfbGVuID0gY3B1X3RvX2xlMTYoZGVzYy0+cnhfYnVmX3NpemUpOw0KKw0KKwlk
bWEgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LA0KKwkJCSAgICAgcnhfaG5kbC0+cHNrX2J1
ZmYtPmRhdGEsDQorCQkJICAgICBkZXNjLT5yeF9idWZfc2l6ZSwNCisJCQkgICAgIFBDSV9ETUFf
RlJPTURFVklDRSk7DQorCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+cGRldiwgZG1h
KSkgew0KKwkJZGV2X2tmcmVlX3NrYl9hbnkocnhfaG5kbC0+cHNrX2J1ZmYpOw0KKwkJd2lwaHlf
ZXJyKHByaXYtPmh3LT53aXBoeSwNCisJCQkgICJmYWlsZWQgdG8gbWFwIHBjaSBtZW1vcnkhXG4i
KTsNCisJCXJldHVybiAtRU5PTUVNOw0KKwl9DQorDQorCXJ4X2huZGwtPnBkZXNjLT5wcGh5c19i
dWZmX2RhdGEgPSBjcHVfdG9fbGUzMihkbWEpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50
IG13bF9yeF9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQ0KK3sNCisJc3RydWN0IG13bF9w
cml2ICpwcml2ID0gaHctPnByaXY7DQorCWludCByYzsNCisNCisJcmMgPSBtd2xfcnhfcmluZ19h
bGxvYyhwcml2KTsNCisJaWYgKHJjKSB7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiYWxsb2Nh
dGluZyBSWCByaW5nIGZhaWxlZFxuIik7DQorCQlyZXR1cm4gcmM7DQorCX0NCisNCisJcmMgPSBt
d2xfcnhfcmluZ19pbml0KHByaXYpOw0KKwlpZiAocmMpIHsNCisJCW13bF9yeF9yaW5nX2ZyZWUo
cHJpdik7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LA0KKwkJCSAgImluaXRpYWxpemluZyBSWCBy
aW5nIGZhaWxlZFxuIik7DQorCQlyZXR1cm4gcmM7DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0K
Kw0KK3ZvaWQgbXdsX3J4X2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykNCit7DQorCXN0
cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKw0KKwltd2xfcnhfcmluZ19jbGVhbnVw
KHByaXYpOw0KKwltd2xfcnhfcmluZ19mcmVlKHByaXYpOw0KK30NCisNCit2b2lkIG13bF9yeF9y
ZWN2KHVuc2lnbmVkIGxvbmcgZGF0YSkNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0g
KHN0cnVjdCBpZWVlODAyMTFfaHcgKilkYXRhOw0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBo
dy0+cHJpdjsNCisJc3RydWN0IG13bF9kZXNjX2RhdGEgKmRlc2M7DQorCXN0cnVjdCBtd2xfcnhf
aG5kbCAqY3Vycl9obmRsOw0KKwlpbnQgd29ya19kb25lID0gMDsNCisJc3RydWN0IHNrX2J1ZmYg
KnByeF9za2IgPSBOVUxMOw0KKwlpbnQgcGt0X2xlbjsNCisJc3RydWN0IGllZWU4MDIxMV9yeF9z
dGF0dXMgc3RhdHVzOw0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZiA9IE5VTEw7DQorCXN0cnVj
dCBpZWVlODAyMTFfaGRyICp3aDsNCisJdTMyIHN0YXR1c19tYXNrOw0KKw0KKwlzcGluX2xvY2so
JnByaXYtPnJ4X2Rlc2NfbG9jayk7DQorCWRlc2MgPSAmcHJpdi0+ZGVzY19kYXRhWzBdOw0KKwlj
dXJyX2huZGwgPSBkZXNjLT5wbmV4dF9yeF9obmRsOw0KKw0KKwlpZiAoIWN1cnJfaG5kbCkgew0K
KwkJc3RhdHVzX21hc2sgPSByZWFkbChwcml2LT5pb2Jhc2UxICsNCisJCQkJICAgIE1BQ1JFR19S
RUdfQTJIX0lOVEVSUlVQVF9TVEFUVVNfTUFTSyk7DQorCQl3cml0ZWwoc3RhdHVzX21hc2sgfCBN
QUNSRUdfQTJIUklDX0JJVF9SWF9SRFksDQorCQkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JF
R19SRUdfQTJIX0lOVEVSUlVQVF9TVEFUVVNfTUFTSyk7DQorDQorCQlwcml2LT5pc19yeF9zY2hl
ZHVsZSA9IGZhbHNlOw0KKwkJd2lwaHlfd2Fybihody0+d2lwaHksICJidXN5IG9yIG5vIHJlY2Vp
dmluZyBwYWNrZXRzXG4iKTsNCisJCXNwaW5fdW5sb2NrKCZwcml2LT5yeF9kZXNjX2xvY2spOw0K
KwkJcmV0dXJuOw0KKwl9DQorDQorCXdoaWxlICgoY3Vycl9obmRsLT5wZGVzYy0+cnhfY29udHJv
bCA9PSBFQUdMRV9SWERfQ1RSTF9ETUFfT1dOKSAmJg0KKwkgICAgICAgKHdvcmtfZG9uZSA8IHBy
aXYtPnJlY3ZfbGltaXQpKSB7DQorCQlwcnhfc2tiID0gY3Vycl9obmRsLT5wc2tfYnVmZjsNCisJ
CWlmICghcHJ4X3NrYikNCisJCQlnb3RvIG91dDsNCisJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+
cGRldiwNCisJCQkJIGxlMzJfdG9fY3B1KGN1cnJfaG5kbC0+cGRlc2MtPnBwaHlzX2J1ZmZfZGF0
YSksDQorCQkJCSBkZXNjLT5yeF9idWZfc2l6ZSwNCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7
DQorCQlwa3RfbGVuID0gbGUxNl90b19jcHUoY3Vycl9obmRsLT5wZGVzYy0+cGt0X2xlbik7DQor
DQorCQlpZiAoc2tiX3RhaWxyb29tKHByeF9za2IpIDwgcGt0X2xlbikgew0KKwkJCWRldl9rZnJl
ZV9za2JfYW55KHByeF9za2IpOw0KKwkJCWdvdG8gb3V0Ow0KKwkJfQ0KKw0KKwkJaWYgKGN1cnJf
aG5kbC0+cGRlc2MtPmNoYW5uZWwgIT0NCisJCSAgICBody0+Y29uZi5jaGFuZGVmLmNoYW4tPmh3
X3ZhbHVlKSB7DQorCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJ4X3NrYik7DQorCQkJZ290byBvdXQ7
DQorCQl9DQorDQorCQltd2xfcnhfcHJlcGFyZV9zdGF0dXMoY3Vycl9obmRsLT5wZGVzYywgJnN0
YXR1cyk7DQorDQorCQlwcml2LT5ub2lzZSA9IC1jdXJyX2huZGwtPnBkZXNjLT5ub2lzZV9mbG9v
cjsNCisNCisJCXdoID0gJigoc3RydWN0IG13bF9kbWFfZGF0YSAqKXByeF9za2ItPmRhdGEpLT53
aDsNCisNCisJCWlmIChpZWVlODAyMTFfaGFzX3Byb3RlY3RlZCh3aC0+ZnJhbWVfY29udHJvbCkp
IHsNCisJCQkvKiBDaGVjayBpZiBodyBjcnlwdG8gaGFzIGJlZW4gZW5hYmxlZCBmb3INCisJCQkg
KiB0aGlzIGJzcy4gSWYgeWVzLCBzZXQgdGhlIHN0YXR1cyBmbGFncw0KKwkJCSAqIGFjY29yZGlu
Z2x5DQorCQkJICovDQorCQkJaWYgKGllZWU4MDIxMV9oYXNfdG9kcyh3aC0+ZnJhbWVfY29udHJv
bCkpDQorCQkJCW13bF92aWYgPSBtd2xfcnhfZmluZF92aWZfYnNzKHByaXYsIHdoLT5hZGRyMSk7
DQorCQkJZWxzZQ0KKwkJCQltd2xfdmlmID0gbXdsX3J4X2ZpbmRfdmlmX2Jzcyhwcml2LCB3aC0+
YWRkcjIpOw0KKw0KKwkJCWlmIChtd2xfdmlmICYmIG13bF92aWYtPmlzX2h3X2NyeXB0b19lbmFi
bGVkKSB7DQorCQkJCS8qIFdoZW4gTU1JQyBFUlJPUiBpcyBlbmNvdW50ZXJlZA0KKwkJCQkgKiBi
eSB0aGUgZmlybXdhcmUsIHBheWxvYWQgaXMNCisJCQkJICogZHJvcHBlZCBhbmQgb25seSAzMiBi
eXRlcyBvZg0KKwkJCQkgKiBtd2x3aWZpIEZpcm13YXJlIGhlYWRlciBpcyBzZW50DQorCQkJCSAq
IHRvIHRoZSBob3N0Lg0KKwkJCQkgKg0KKwkJCQkgKiBXZSBuZWVkIHRvIGFkZCBmb3VyIGJ5dGVz
IG9mDQorCQkJCSAqIGtleSBpbmZvcm1hdGlvbi4gIEluIGl0DQorCQkJCSAqIE1BQzgwMjExIGV4
cGVjdHMga2V5aWR4IHNldCB0bw0KKwkJCQkgKiAwIGZvciB0cmlnZ2VyaW5nIENvdW50ZXINCisJ
CQkJICogTWVhc3VyZSBvZiBNTUlDIGZhaWx1cmUuDQorCQkJCSAqLw0KKwkJCQlpZiAoc3RhdHVz
LmZsYWcgJiBSWF9GTEFHX01NSUNfRVJST1IpIHsNCisJCQkJCXN0cnVjdCBtd2xfZG1hX2RhdGEg
KnRyOw0KKw0KKwkJCQkJdHIgPSAoc3RydWN0IG13bF9kbWFfZGF0YSAqKQ0KKwkJCQkJICAgICBw
cnhfc2tiLT5kYXRhOw0KKwkJCQkJbWVtc2V0KCh2b2lkICopJnRyLT5kYXRhLCAwLCA0KTsNCisJ
CQkJCXBrdF9sZW4gKz0gNDsNCisJCQkJfQ0KKw0KKwkJCQlpZiAoIWllZWU4MDIxMV9pc19hdXRo
KHdoLT5mcmFtZV9jb250cm9sKSkNCisJCQkJCXN0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSVZfU1RS
SVBQRUQgfA0KKwkJCQkJCSAgICAgICBSWF9GTEFHX0RFQ1JZUFRFRCB8DQorCQkJCQkJICAgICAg
IFJYX0ZMQUdfTU1JQ19TVFJJUFBFRDsNCisJCQl9DQorCQl9DQorDQorCQlza2JfcHV0KHByeF9z
a2IsIHBrdF9sZW4pOw0KKwkJbXdsX3J4X3JlbW92ZV9kbWFfaGVhZGVyKHByeF9za2IsIGN1cnJf
aG5kbC0+cGRlc2MtPnFvc19jdHJsKTsNCisNCisJCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRy
ICopcHJ4X3NrYi0+ZGF0YTsNCisNCisJCWlmIChpZWVlODAyMTFfaXNfbWdtdCh3aC0+ZnJhbWVf
Y29udHJvbCkpIHsNCisJCQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7DQorCQkJX19sZTE2
IGNhcGFiOw0KKw0KKwkJCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopcHJ4X3NrYi0+
ZGF0YTsNCisNCisJCQlpZiAodW5saWtlbHkoaWVlZTgwMjExX2lzX2FjdGlvbih3aC0+ZnJhbWVf
Y29udHJvbCkgJiYNCisJCQkJICAgICBtZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9PQ0KKwkJCQkg
ICAgIFdMQU5fQ0FURUdPUllfQkFDSyAmJg0KKwkJCQkgICAgIG1nbXQtPnUuYWN0aW9uLnUuYWRk
YmFfcmVzcC5hY3Rpb25fY29kZSA9PQ0KKwkJCQkgICAgIFdMQU5fQUNUSU9OX0FEREJBX1JFU1Ap
KSB7DQorCQkJCWNhcGFiID0gbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmNhcGFiOw0KKwkJ
CQlpZiAobGUxNl90b19jcHUoY2FwYWIpICYgMSkNCisJCQkJCW13bF9yeF9lbmFibGVfc3RhX2Ft
c2R1KHByaXYsIG1nbXQtPnNhKTsNCisJCQl9DQorCQl9DQorDQorCQlpZiAoaWVlZTgwMjExX2lz
X2RhdGFfcW9zKHdoLT5mcmFtZV9jb250cm9sKSAmJg0KKwkJICAgIGllZWU4MDIxMV9oYXNfYTQo
d2gtPmZyYW1lX2NvbnRyb2wpKSB7DQorCQkJdTggKnFjID0gaWVlZTgwMjExX2dldF9xb3NfY3Rs
KHdoKTsNCisNCisJCQlpZiAoKnFjICYgSUVFRTgwMjExX1FPU19DVExfQV9NU0RVX1BSRVNFTlQp
DQorCQkJCWlmIChtd2xfcnhfcHJvY2Vzc19tZXNoX2Ftc2R1KHByaXYsIHByeF9za2IsDQorCQkJ
CQkJCSAgICAgICZzdGF0dXMpKQ0KKwkJCQkJZ290byBvdXQ7DQorCQl9DQorDQorCQltZW1jcHko
SUVFRTgwMjExX1NLQl9SWENCKHByeF9za2IpLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7DQor
CQlpZWVlODAyMTFfcngoaHcsIHByeF9za2IpOw0KK291dDoNCisJCW13bF9yeF9yZWZpbGwocHJp
diwgY3Vycl9obmRsKTsNCisJCWN1cnJfaG5kbC0+cGRlc2MtPnJ4X2NvbnRyb2wgPSBFQUdMRV9S
WERfQ1RSTF9EUklWRVJfT1dOOw0KKwkJY3Vycl9obmRsLT5wZGVzYy0+cW9zX2N0cmwgPSAwOw0K
KwkJY3Vycl9obmRsID0gY3Vycl9obmRsLT5wbmV4dDsNCisJCXdvcmtfZG9uZSsrOw0KKwl9DQor
DQorCWRlc2MtPnBuZXh0X3J4X2huZGwgPSBjdXJyX2huZGw7DQorDQorCXN0YXR1c19tYXNrID0g
cmVhZGwocHJpdi0+aW9iYXNlMSArDQorCQkJICAgIE1BQ1JFR19SRUdfQTJIX0lOVEVSUlVQVF9T
VEFUVVNfTUFTSyk7DQorCXdyaXRlbChzdGF0dXNfbWFzayB8IE1BQ1JFR19BMkhSSUNfQklUX1JY
X1JEWSwNCisJICAgICAgIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRf
U1RBVFVTX01BU0spOw0KKw0KKwlwcml2LT5pc19yeF9zY2hlZHVsZSA9IGZhbHNlOw0KKw0KKwlz
cGluX3VubG9jaygmcHJpdi0+cnhfZGVzY19sb2NrKTsNCit9DQpkaWZmIC0tZ2l0IGEvZHJpdmVy
cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL3J4LmggYi9kcml2ZXJzL25ldC93aXJlbGVz
cy9tYXJ2ZWxsL213bHdpZmkvcnguaA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAw
MDAuLmQzMmM1NTgNCi0tLSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21h
cnZlbGwvbXdsd2lmaS9yeC5oDQpAQCAtMCwwICsxLDI1IEBADQorLyoNCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDYtMjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4NCisgKg0KKyAqIFRoaXMg
c29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCBJbnRl
cm5hdGlvbmFsDQorICogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxDQorICogKHRoZSAiTGljZW5zZSIpLiAg
WW91IG1heSB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSBpbg0KKyAq
IGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2Us
IGEgY29weSBvZiB3aGljaA0KKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0aW5nIHRvIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqIFRIRSBGSUxFIElTIERJU1RSSUJV
VEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFDQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRQ0KKyAqIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1FRC4gIFRoZSBMaWNlbnNl
IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dA0KKyAqIHRoaXMgd2FycmFudHkgZGlz
Y2xhaW1lci4NCisgKi8NCisNCisvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBkZWZpbmVzIHJl
Y2VpdmUgcmVsYXRlZCBmdW5jdGlvbnMuICovDQorDQorI2lmbmRlZiBfcnhfaF8NCisjZGVmaW5l
IF9yeF9oXw0KKw0KK2ludCBtd2xfcnhfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7DQor
dm9pZCBtd2xfcnhfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsNCit2b2lkIG13bF9y
eF9yZWN2KHVuc2lnbmVkIGxvbmcgZGF0YSk7DQorDQorI2VuZGlmIC8qIF9yeF9oXyAqLw0KZGlm
ZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9zeXNhZHB0Lmgg
Yi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvc3lzYWRwdC5oDQpuZXcgZmls
ZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uOGExNzA2YQ0KLS0tIC9kZXYvbnVsbA0KKysr
IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL3N5c2FkcHQuaA0KQEAgLTAs
MCArMSw3MyBAQA0KKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUsIE1hcnZlbGwgSW50
ZXJuYXRpb25hbCBMdGQuDQorICoNCisgKiBUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIp
IGlzIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgSW50ZXJuYXRpb25hbA0KKyAqIEx0ZC4gdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1
bmUgMTk5MQ0KKyAqICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgdXNlLCByZWRpc3RyaWJ1dGUg
YW5kL29yIG1vZGlmeSB0aGlzIEZpbGUgaW4NCisgKiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1z
IGFuZCBjb25kaXRpb25zIG9mIHRoZSBMaWNlbnNlLCBhIGNvcHkgb2Ygd2hpY2gNCisgKiBpcyBh
dmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
DQorICoNCisgKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5U
WSBPRiBBTlkgS0lORCwgQU5EIFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UNCisgKiBBUkUgRVhQ
UkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFp
bHMgYWJvdXQNCisgKiB0aGlzIHdhcnJhbnR5IGRpc2NsYWltZXIuDQorICovDQorDQorLyogRGVz
Y3JpcHRpb246ICBUaGlzIGZpbGUgZGVmaW5lcyBzeXN0ZW0gYWRhcHRhdGlvbiByZWxhdGVkIGlu
Zm9ybWF0aW9uLiAqLw0KKw0KKyNpZm5kZWYgX213bF9zeXNhZHB0X2hfDQorI2RlZmluZSBfbXds
X3N5c2FkcHRfaF8NCisNCisjZGVmaW5lIFNZU0FEUFRfTUFYX05VTV9DSEFOTkVMUyAgICAgICA2
NA0KKw0KKyNkZWZpbmUgU1lTQURQVF9NQVhfREFUQV9SQVRFU19HICAgICAgIDE0DQorDQorI2Rl
ZmluZSBTWVNBRFBUX1RYX1BPV0VSX0xFVkVMX1RPVEFMICAgMTYNCisNCisjZGVmaW5lIFNZU0FE
UFRfVFhfV01NX1FVRVVFUyAgICAgICAgICA0DQorDQorI2RlZmluZSBTWVNBRFBUX1RYX0FNUERV
X1FVRVVFUyAgICAgICAgNA0KKw0KKyNkZWZpbmUgU1lTQURQVF9OVU1fT0ZfQVAgICAgICAgICAg
ICAgIDE2DQorDQorI2RlZmluZSBTWVNBRFBUX1RPVEFMX1RYX1FVRVVFUyAgICAgICAgKFNZU0FE
UFRfVFhfV01NX1FVRVVFUyArIFwNCisJCQkJCVNZU0FEUFRfTlVNX09GX0FQKQ0KKw0KKyNkZWZp
bmUgU1lTQURQVF9UT1RBTF9IV19RVUVVRVMgICAgICAgIChTWVNBRFBUX1RYX1dNTV9RVUVVRVMg
KyBcDQorCQkJCQlTWVNBRFBUX1RYX0FNUERVX1FVRVVFUykNCisNCisjZGVmaW5lIFNZU0FEUFRf
TlVNX09GX0RFU0NfREFUQSAgICAgICAoNCArIFNZU0FEUFRfTlVNX09GX0FQKQ0KKw0KKyNkZWZp
bmUgU1lTQURQVF9NQVhfTlVNX1RYX0RFU0MgICAgICAgIDI1Ng0KKw0KKyNkZWZpbmUgU1lTQURQ
VF9UWF9RVUVVRV9MSU1JVCAgICAgICAgICgzICogU1lTQURQVF9NQVhfTlVNX1RYX0RFU0MpDQor
DQorI2RlZmluZSBTWVNBRFBUX1RYX1dBS0VfUV9USFJFU0hPTEQgICAgKDIgKiBTWVNBRFBUX01B
WF9OVU1fVFhfREVTQykNCisNCisjZGVmaW5lIFNZU0FEUFRfREVMQVlfRlJFRV9RX0xJTUlUICAg
ICBTWVNBRFBUX01BWF9OVU1fVFhfREVTQw0KKw0KKyNkZWZpbmUgU1lTQURQVF9NQVhfTlVNX1JY
X0RFU0MgICAgICAgIDI1Ng0KKw0KKyNkZWZpbmUgU1lTQURQVF9SRUNFSVZFX0xJTUlUICAgICAg
ICAgIDY0DQorDQorI2RlZmluZSBTWVNBRFBUX01BWF9BR0dSX1NJWkUgICAgICAgICAgODE5Mg0K
Kw0KKyNkZWZpbmUgU1lTQURQVF9NSU5fQllURVNfSEVBRFJPT00gICAgIDY0DQorDQorI2RlZmlu
ZSBTWVNBRFBUX0FNUERVX1BBQ0tFVF9USFJFU0hPTEQgNjQNCisNCisjZGVmaW5lIFNZU0FEUFRf
QU1TRFVfRldfTUFYX1NJWkUgICAgICAzMzAwDQorDQorI2RlZmluZSBTWVNBRFBUX0FNU0RVXzRL
X01BWF9TSVpFICAgICAgU1lTQURQVF9BTVNEVV9GV19NQVhfU0laRQ0KKw0KKyNkZWZpbmUgU1lT
QURQVF9BTVNEVV84S19NQVhfU0laRSAgICAgIFNZU0FEUFRfQU1TRFVfRldfTUFYX1NJWkUNCisN
CisjZGVmaW5lIFNZU0FEUFRfQU1TRFVfQUxMT1dfU0laRSAgICAgICAxNjAwDQorDQorI2RlZmlu
ZSBTWVNBRFBUX0FNU0RVX0ZMVVNIX1RJTUUgICAgICAgNTAwDQorDQorI2RlZmluZSBTWVNBRFBU
X0FNU0RVX1BBQ0tFVF9USFJFU0hPTEQgMTANCisNCisjZGVmaW5lIFNZU0FEUFRfTUFYX1RJRCAg
ICAgICAgICAgICAgICA4DQorDQorI2VuZGlmIC8qIF9td2xfc3lzYWRwdF9oXyAqLw0KZGlmZiAt
LWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS90eC5jIGIvZHJpdmVy
cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL3R4LmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
DQppbmRleCAwMDAwMDAwLi42OGE5OTRkDQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL25l
dC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvdHguYw0KQEAgLTAsMCArMSwxMjUxIEBADQorLyoN
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4N
CisgKg0KKyAqIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQg
YnkgTWFydmVsbCBJbnRlcm5hdGlvbmFsDQorICogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxDQorICogKHRo
ZSAiTGljZW5zZSIpLiAgWW91IG1heSB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRo
aXMgRmlsZSBpbg0KKyAqIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMg
b2YgdGhlIExpY2Vuc2UsIGEgY29weSBvZiB3aGljaA0KKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0
aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqIFRIRSBG
SUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBB
TkQgVEhFDQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQ0KKyAqIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1F
RC4gIFRoZSBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dA0KKyAqIHRo
aXMgd2FycmFudHkgZGlzY2xhaW1lci4NCisgKi8NCisNCisvKiBEZXNjcmlwdGlvbjogIFRoaXMg
ZmlsZSBpbXBsZW1lbnRzIHRyYW5zbWl0IHJlbGF0ZWQgZnVuY3Rpb25zLiAqLw0KKw0KKyNpbmNs
dWRlIDxsaW51eC9ldGhlcmRldmljZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4NCisN
CisjaW5jbHVkZSAic3lzYWRwdC5oIg0KKyNpbmNsdWRlICJkZXYuaCINCisjaW5jbHVkZSAiZndj
bWQuaCINCisjaW5jbHVkZSAidHguaCINCisNCisjZGVmaW5lIE1BWF9OVU1fVFhfUklOR19CWVRF
UyAgKFNZU0FEUFRfTUFYX05VTV9UWF9ERVNDICogXA0KKwkJCQlzaXplb2Yoc3RydWN0IG13bF90
eF9kZXNjKSkNCisNCisjZGVmaW5lIE1BWF9OVU1fVFhfSE5ETF9CWVRFUyAgIChTWVNBRFBUX01B
WF9OVU1fVFhfREVTQyAqIFwNCisJCQkJc2l6ZW9mKHN0cnVjdCBtd2xfdHhfaG5kbCkpDQorDQor
I2RlZmluZSBFQUdMRV9UWERfWE1JVENUUkxfVVNFX01DX1JBVEUgICAgIDB4OCAgICAgLyogVXNl
IG11bHRpY2FzdCBkYXRhIHJhdGUgKi8NCisNCisjZGVmaW5lIE1XTF9RT1NfQUNLX1BPTElDWV9N
QVNLCSAgICAgICAgICAgMHgwMDYwDQorI2RlZmluZSBNV0xfUU9TX0FDS19QT0xJQ1lfTk9STUFM
ICAgICAgICAgIDB4MDAwMA0KKyNkZWZpbmUgTVdMX1FPU19BQ0tfUE9MSUNZX0JMT0NLQUNLICAg
ICAgICAweDAwNjANCisNCisjZGVmaW5lIEVYVF9JViAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgMHgyMA0KKyNkZWZpbmUgSU5DUkVBU0VfSVYoaXYxNiwgaXYzMikgXA0KK3sgXA0KKwkoaXYx
NikrKzsgXA0KKwlpZiAoKGl2MTYpID09IDApIFwNCisJCShpdjMyKSsrOyBcDQorfQ0KKw0KKy8q
IFRyYW5zbWl0IHJhdGUgaW5mb3JtYXRpb24gY29uc3RhbnRzICovDQorI2RlZmluZSBUWF9SQVRF
X0ZPUk1BVF9MRUdBQ1kgICAgICAgICAwDQorI2RlZmluZSBUWF9SQVRFX0ZPUk1BVF8xMU4gICAg
ICAgICAgICAxDQorI2RlZmluZSBUWF9SQVRFX0ZPUk1BVF8xMUFDICAgICAgICAgICAyDQorDQor
I2RlZmluZSBUWF9SQVRFX0JBTkRXSURUSF8yMCAgICAgICAgICAwDQorI2RlZmluZSBUWF9SQVRF
X0JBTkRXSURUSF80MCAgICAgICAgICAxDQorI2RlZmluZSBUWF9SQVRFX0JBTkRXSURUSF84MCAg
ICAgICAgICAyDQorDQorI2RlZmluZSBUWF9SQVRFX0lORk9fU1REX0dJICAgICAgICAgICAwDQor
I2RlZmluZSBUWF9SQVRFX0lORk9fU0hPUlRfR0kgICAgICAgICAxDQorDQorZW51bSB7DQorCUlF
RUVfVFlQRV9NQU5BR0VNRU5UID0gMCwNCisJSUVFRV9UWVBFX0NPTlRST0wsDQorCUlFRUVfVFlQ
RV9EQVRBDQorfTsNCisNCitzdHJ1Y3QgY2NtcF9oZHIgew0KKwlfX2xlMTYgaXYxNjsNCisJdTgg
cnN2ZDsNCisJdTgga2V5X2lkOw0KKwlfX2xlMzIgaXYzMjsNCit9IF9fcGFja2VkOw0KKw0KK3N0
YXRpYyBpbnQgbXdsX3R4X3JpbmdfYWxsb2Moc3RydWN0IG13bF9wcml2ICpwcml2KQ0KK3sNCisJ
c3RydWN0IG13bF9kZXNjX2RhdGEgKmRlc2M7DQorCWludCBudW07DQorCXU4ICptZW07DQorDQor
CWRlc2MgPSAmcHJpdi0+ZGVzY19kYXRhWzBdOw0KKw0KKwltZW0gPSBkbWFfYWxsb2NfY29oZXJl
bnQoJnByaXYtPnBkZXYtPmRldiwNCisJCQkJIE1BWF9OVU1fVFhfUklOR19CWVRFUyAqDQorCQkJ
CSBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEEsDQorCQkJCSAmZGVzYy0+cHBoeXNfdHhfcmluZywN
CisJCQkJIEdGUF9LRVJORUwpOw0KKw0KKwlpZiAoIW1lbSkgew0KKwkJd2lwaHlfZXJyKHByaXYt
Pmh3LT53aXBoeSwgImNhbm5vdCBhbGxvYyBtZW1cbiIpOw0KKwkJcmV0dXJuIC1FTk9NRU07DQor
CX0NCisNCisJZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEE7IG51
bSsrKSB7DQorCQlkZXNjID0gJnByaXYtPmRlc2NfZGF0YVtudW1dOw0KKw0KKwkJZGVzYy0+cHR4
X3JpbmcgPSAoc3RydWN0IG13bF90eF9kZXNjICopDQorCQkJKG1lbSArIG51bSAqIE1BWF9OVU1f
VFhfUklOR19CWVRFUyk7DQorDQorCQlkZXNjLT5wcGh5c190eF9yaW5nID0gKGRtYV9hZGRyX3Qp
DQorCQkJKCh1MzIpcHJpdi0+ZGVzY19kYXRhWzBdLnBwaHlzX3R4X3JpbmcgKw0KKwkJCW51bSAq
IE1BWF9OVU1fVFhfUklOR19CWVRFUyk7DQorDQorCQltZW1zZXQoZGVzYy0+cHR4X3JpbmcsIDB4
MDAsDQorCQkgICAgICAgTUFYX05VTV9UWF9SSU5HX0JZVEVTKTsNCisJfQ0KKw0KKwltZW0gPSBr
bWFsbG9jKE1BWF9OVU1fVFhfSE5ETF9CWVRFUyAqIFNZU0FEUFRfTlVNX09GX0RFU0NfREFUQSwN
CisJCSAgICAgIEdGUF9LRVJORUwpOw0KKw0KKwlpZiAoIW1lbSkgew0KKwkJd2lwaHlfZXJyKHBy
aXYtPmh3LT53aXBoeSwgImNhbm5vdCBhbGxvYyBtZW1cbiIpOw0KKwkJZG1hX2ZyZWVfY29oZXJl
bnQoJnByaXYtPnBkZXYtPmRldiwNCisJCQkJICBNQVhfTlVNX1RYX1JJTkdfQllURVMgKg0KKwkJ
CQkgIFNZU0FEUFRfTlVNX09GX0RFU0NfREFUQSwNCisJCQkJICBwcml2LT5kZXNjX2RhdGFbMF0u
cHR4X3JpbmcsDQorCQkJCSAgcHJpdi0+ZGVzY19kYXRhWzBdLnBwaHlzX3R4X3JpbmcpOw0KKwkJ
cmV0dXJuIC1FTk9NRU07DQorCX0NCisNCisJZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05V
TV9PRl9ERVNDX0RBVEE7IG51bSsrKSB7DQorCQlkZXNjID0gJnByaXYtPmRlc2NfZGF0YVtudW1d
Ow0KKw0KKwkJZGVzYy0+dHhfaG5kbCA9IChzdHJ1Y3QgbXdsX3R4X2huZGwgKikNCisJCQkobWVt
ICsgbnVtICogTUFYX05VTV9UWF9ITkRMX0JZVEVTKTsNCisNCisJCW1lbXNldChkZXNjLT50eF9o
bmRsLCAweDAwLA0KKwkJICAgICAgIE1BWF9OVU1fVFhfSE5ETF9CWVRFUyk7DQorCX0NCisNCisJ
cmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX3R4X3JpbmdfaW5pdChzdHJ1Y3QgbXds
X3ByaXYgKnByaXYpDQorew0KKwlpbnQgbnVtLCBpOw0KKwlzdHJ1Y3QgbXdsX2Rlc2NfZGF0YSAq
ZGVzYzsNCisNCisJZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEE7
IG51bSsrKSB7DQorCQlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT50eHFbbnVtXSk7DQorCQlw
cml2LT5md19kZXNjX2NudFtudW1dID0gMDsNCisNCisJCWRlc2MgPSAmcHJpdi0+ZGVzY19kYXRh
W251bV07DQorDQorCQlpZiAoZGVzYy0+cHR4X3JpbmcpIHsNCisJCQlmb3IgKGkgPSAwOyBpIDwg
U1lTQURQVF9NQVhfTlVNX1RYX0RFU0M7IGkrKykgew0KKwkJCQlkZXNjLT5wdHhfcmluZ1tpXS5z
dGF0dXMgPQ0KKwkJCQkJY3B1X3RvX2xlMzIoRUFHTEVfVFhEX1NUQVRVU19JRExFKTsNCisJCQkJ
ZGVzYy0+cHR4X3JpbmdbaV0ucHBoeXNfbmV4dCA9DQorCQkJCQljcHVfdG9fbGUzMigodTMyKWRl
c2MtPnBwaHlzX3R4X3JpbmcgKw0KKwkJCQkJKChpICsgMSkgKiBzaXplb2Yoc3RydWN0IG13bF90
eF9kZXNjKSkpOw0KKwkJCQlkZXNjLT50eF9obmRsW2ldLnBkZXNjID0NCisJCQkJCSZkZXNjLT5w
dHhfcmluZ1tpXTsNCisJCQkJaWYgKGkgPCBTWVNBRFBUX01BWF9OVU1fVFhfREVTQyAtIDEpDQor
CQkJCQlkZXNjLT50eF9obmRsW2ldLnBuZXh0ID0NCisJCQkJCQkmZGVzYy0+dHhfaG5kbFtpICsg
MV07DQorCQkJfQ0KKwkJCWRlc2MtPnB0eF9yaW5nW1NZU0FEUFRfTUFYX05VTV9UWF9ERVNDIC0g
MV0ucHBoeXNfbmV4dCA9DQorCQkJCWNwdV90b19sZTMyKCh1MzIpZGVzYy0+cHBoeXNfdHhfcmlu
Zyk7DQorCQkJZGVzYy0+dHhfaG5kbFtTWVNBRFBUX01BWF9OVU1fVFhfREVTQyAtIDFdLnBuZXh0
ID0NCisJCQkJJmRlc2MtPnR4X2huZGxbMF07DQorDQorCQkJZGVzYy0+cHN0YWxlX3R4X2huZGwg
PSAmZGVzYy0+dHhfaG5kbFswXTsNCisJCQlkZXNjLT5wbmV4dF90eF9obmRsICA9ICZkZXNjLT50
eF9obmRsWzBdOw0KKwkJfSBlbHNlIHsNCisJCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAi
bm8gdmFsaWQgVFggbWVtXG4iKTsNCisJCQlyZXR1cm4gLUVOT01FTTsNCisJCX0NCisJfQ0KKw0K
KwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHZvaWQgbXdsX3R4X3JpbmdfY2xlYW51cChzdHJ1
Y3QgbXdsX3ByaXYgKnByaXYpDQorew0KKwlpbnQgY2xlYW5lZF90eF9kZXNjID0gMDsNCisJaW50
IG51bSwgaTsNCisJc3RydWN0IG13bF9kZXNjX2RhdGEgKmRlc2M7DQorDQorCWZvciAobnVtID0g
MDsgbnVtIDwgU1lTQURQVF9OVU1fT0ZfREVTQ19EQVRBOyBudW0rKykgew0KKwkJc2tiX3F1ZXVl
X3B1cmdlKCZwcml2LT50eHFbbnVtXSk7DQorCQlwcml2LT5md19kZXNjX2NudFtudW1dID0gMDsN
CisNCisJCWRlc2MgPSAmcHJpdi0+ZGVzY19kYXRhW251bV07DQorDQorCQlpZiAoZGVzYy0+cHR4
X3JpbmcpIHsNCisJCQlmb3IgKGkgPSAwOyBpIDwgU1lTQURQVF9NQVhfTlVNX1RYX0RFU0M7IGkr
Kykgew0KKwkJCQlpZiAoIWRlc2MtPnR4X2huZGxbaV0ucHNrX2J1ZmYpDQorCQkJCQljb250aW51
ZTsNCisNCisJCQkJd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksDQorCQkJCQkgICAidW5tYXBw
ZWQgYW5kIGZyZWUnZCAlaSAweCVwIDB4JXhcbiIsDQorCQkJCQkgICBpLA0KKwkJCQkJICAgZGVz
Yy0+dHhfaG5kbFtpXS5wc2tfYnVmZi0+ZGF0YSwNCisJCQkJCSAgIGxlMzJfdG9fY3B1KA0KKwkJ
CQkJICAgZGVzYy0+cHR4X3JpbmdbaV0ucGt0X3B0cikpOw0KKwkJCQlwY2lfdW5tYXBfc2luZ2xl
KHByaXYtPnBkZXYsDQorCQkJCQkJIGxlMzJfdG9fY3B1KA0KKwkJCQkJCSBkZXNjLT5wdHhfcmlu
Z1tpXS5wa3RfcHRyKSwNCisJCQkJCQkgZGVzYy0+dHhfaG5kbFtpXS5wc2tfYnVmZi0+bGVuLA0K
KwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsNCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoZGVzYy0+
dHhfaG5kbFtpXS5wc2tfYnVmZik7DQorCQkJCWRlc2MtPnB0eF9yaW5nW2ldLnN0YXR1cyA9DQor
CQkJCQljcHVfdG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0lETEUpOw0KKwkJCQlkZXNjLT5wdHhf
cmluZ1tpXS5wa3RfcHRyID0gMDsNCisJCQkJZGVzYy0+cHR4X3JpbmdbaV0ucGt0X2xlbiA9IDA7
DQorCQkJCWRlc2MtPnR4X2huZGxbaV0ucHNrX2J1ZmYgPSBOVUxMOw0KKwkJCQljbGVhbmVkX3R4
X2Rlc2MrKzsNCisJCQl9DQorCQl9DQorCX0NCisNCisJd2lwaHlfaW5mbyhwcml2LT5ody0+d2lw
aHksICJjbGVhbmVkICVpIFRYIGRlc2NyXG4iLCBjbGVhbmVkX3R4X2Rlc2MpOw0KK30NCisNCitz
dGF0aWMgdm9pZCBtd2xfdHhfcmluZ19mcmVlKHN0cnVjdCBtd2xfcHJpdiAqcHJpdikNCit7DQor
CWludCBudW07DQorDQorCWlmIChwcml2LT5kZXNjX2RhdGFbMF0ucHR4X3JpbmcpIHsNCisJCWRt
YV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsDQorCQkJCSAgTUFYX05VTV9UWF9SSU5H
X0JZVEVTICoNCisJCQkJICBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEEsDQorCQkJCSAgcHJpdi0+
ZGVzY19kYXRhWzBdLnB0eF9yaW5nLA0KKwkJCQkgIHByaXYtPmRlc2NfZGF0YVswXS5wcGh5c190
eF9yaW5nKTsNCisJfQ0KKw0KKwlmb3IgKG51bSA9IDA7IG51bSA8IFNZU0FEUFRfTlVNX09GX0RF
U0NfREFUQTsgbnVtKyspIHsNCisJCWlmIChwcml2LT5kZXNjX2RhdGFbbnVtXS5wdHhfcmluZykN
CisJCQlwcml2LT5kZXNjX2RhdGFbbnVtXS5wdHhfcmluZyA9IE5VTEw7DQorCQlwcml2LT5kZXNj
X2RhdGFbbnVtXS5wc3RhbGVfdHhfaG5kbCA9IE5VTEw7DQorCQlwcml2LT5kZXNjX2RhdGFbbnVt
XS5wbmV4dF90eF9obmRsID0gTlVMTDsNCisJfQ0KKw0KKwlrZnJlZShwcml2LT5kZXNjX2RhdGFb
MF0udHhfaG5kbCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xfdHhfYWRkX2RtYV9o
ZWFkZXIoc3RydWN0IG13bF9wcml2ICpwcml2LA0KKwkJCQkJIHN0cnVjdCBza19idWZmICpza2Is
DQorCQkJCQkgaW50IGhlYWRfcGFkLA0KKwkJCQkJIGludCB0YWlsX3BhZCkNCit7DQorCXN0cnVj
dCBpZWVlODAyMTFfaGRyICp3aDsNCisJaW50IGhkcmxlbjsNCisJaW50IHJlcWRfaGRybGVuOw0K
KwlzdHJ1Y3QgbXdsX2RtYV9kYXRhICp0cjsNCisNCisJLyogQWRkIGEgZmlybXdhcmUgRE1BIGhl
YWRlcjsgdGhlIGZpcm13YXJlIHJlcXVpcmVzIHRoYXQgd2UNCisJICogcHJlc2VudCBhIDItYnl0
ZSBwYXlsb2FkIGxlbmd0aCBmb2xsb3dlZCBieSBhIDQtYWRkcmVzcw0KKwkgKiBoZWFkZXIgKHdp
dGhvdXQgUW9TIGZpZWxkKSwgZm9sbG93ZWQgKG9wdGlvbmFsbHkpIGJ5IGFueQ0KKwkgKiBXRVAv
RXh0SVYgaGVhZGVyIChidXQgb25seSBmaWxsZWQgaW4gZm9yIENDTVApLg0KKwkgKi8NCisJd2gg
PSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7DQorDQorCWhkcmxlbiA9IGllZWU4
MDIxMV9oZHJsZW4od2gtPmZyYW1lX2NvbnRyb2wpOw0KKw0KKwlyZXFkX2hkcmxlbiA9IHNpemVv
ZigqdHIpICsgaGVhZF9wYWQ7DQorDQorCWlmIChoZHJsZW4gIT0gcmVxZF9oZHJsZW4pDQorCQlz
a2JfcHVzaChza2IsIHJlcWRfaGRybGVuIC0gaGRybGVuKTsNCisNCisJaWYgKGllZWU4MDIxMV9p
c19kYXRhX3Fvcyh3aC0+ZnJhbWVfY29udHJvbCkpDQorCQloZHJsZW4gLT0gSUVFRTgwMjExX1FP
U19DVExfTEVOOw0KKw0KKwl0ciA9IChzdHJ1Y3QgbXdsX2RtYV9kYXRhICopc2tiLT5kYXRhOw0K
Kw0KKwlpZiAod2ggIT0gJnRyLT53aCkNCisJCW1lbW1vdmUoJnRyLT53aCwgd2gsIGhkcmxlbik7
DQorDQorCWlmIChoZHJsZW4gIT0gc2l6ZW9mKHRyLT53aCkpDQorCQltZW1zZXQoKCh2b2lkICop
JnRyLT53aCkgKyBoZHJsZW4sIDAsIHNpemVvZih0ci0+d2gpIC0gaGRybGVuKTsNCisNCisJLyog
RmlybXdhcmUgbGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGZ1bGx5IGZvcm1lZCAiODAyLjEx
DQorCSAqIHBheWxvYWQiLiAgVGhhdCBpcywgZXZlcnl0aGluZyBleGNlcHQgZm9yIHRoZSA4MDIu
MTEgaGVhZGVyLg0KKwkgKiBUaGlzIGluY2x1ZGVzIGFsbCBjcnlwdG8gbWF0ZXJpYWwgaW5jbHVk
aW5nIHRoZSBNSUMuDQorCSAqLw0KKwl0ci0+ZndsZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbiAt
IHNpemVvZigqdHIpICsgdGFpbF9wYWQpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXds
X3R4X2VuY2Fwc3VsYXRlX2ZyYW1lKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwNCisJCQkJCSAgICBz
dHJ1Y3Qgc2tfYnVmZiAqc2tiLA0KKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYg
KmtfY29uZiwNCisJCQkJCSAgICBib29sICpjY21wKQ0KK3sNCisJaW50IGhlYWRfcGFkID0gMDsN
CisJaW50IGRhdGFfcGFkID0gMDsNCisNCisJLyogTWFrZSBzdXJlIHRoZSBwYWNrZXQgaGVhZGVy
IGlzIGluIHRoZSBETUEgaGVhZGVyIGZvcm1hdCAoNC1hZGRyZXNzDQorCSAqIHdpdGhvdXQgUW9T
KSwgYW5kIGFkZCBoZWFkICYgdGFpbCBwYWRkaW5nIHdoZW4gSFcgY3J5cHRvIGlzIGVuYWJsZWQu
DQorCSAqDQorCSAqIFdlIGhhdmUgdGhlIGZvbGxvd2luZyB0cmFpbGVyIHBhZGRpbmcgcmVxdWly
ZW1lbnRzOg0KKwkgKiAtIFdFUDogNCB0cmFpbGVyIGJ5dGVzIChJQ1YpDQorCSAqIC0gVEtJUDog
MTIgdHJhaWxlciBieXRlcyAoOCBNSUMgKyA0IElDVikNCisJICogLSBDQ01QOiA4IHRyYWlsZXIg
Ynl0ZXMgKE1JQykNCisJICovDQorDQorCWlmIChrX2NvbmYpIHsNCisJCWhlYWRfcGFkID0ga19j
b25mLT5pdl9sZW47DQorDQorCQlzd2l0Y2ggKGtfY29uZi0+Y2lwaGVyKSB7DQorCQljYXNlIFdM
QU5fQ0lQSEVSX1NVSVRFX1dFUDQwOg0KKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6
DQorCQkJZGF0YV9wYWQgPSA0Ow0KKwkJCWJyZWFrOw0KKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlU
RV9US0lQOg0KKwkJCWRhdGFfcGFkID0gMTI7DQorCQkJYnJlYWs7DQorCQljYXNlIFdMQU5fQ0lQ
SEVSX1NVSVRFX0NDTVA6DQorCQkJZGF0YV9wYWQgPSA4Ow0KKwkJCSpjY21wID0gdHJ1ZTsNCisJ
CQlicmVhazsNCisJCX0NCisJfQ0KKw0KKwltd2xfdHhfYWRkX2RtYV9oZWFkZXIocHJpdiwgc2ti
LCBoZWFkX3BhZCwgZGF0YV9wYWQpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXdsX3R4
X2luc2VydF9jY21wX2hkcih1OCAqcGNjbXBfaGRyLA0KKwkJCQkJICB1OCBrZXlfaWQsIHUxNiBp
djE2LCB1MzIgaXYzMikNCit7DQorCXN0cnVjdCBjY21wX2hkciAqY2NtcF9oID0gKHN0cnVjdCBj
Y21wX2hkciAqKXBjY21wX2hkcjsNCisNCisJY2NtcF9oLT5pdjE2ID0gY3B1X3RvX2xlMTYoaXYx
Nik7DQorCWNjbXBfaC0+cnN2ZCA9IDA7DQorCWNjbXBfaC0+a2V5X2lkID0gRVhUX0lWIHwgKGtl
eV9pZCA8PCA2KTsNCisJY2NtcF9oLT5pdjMyID0gY3B1X3RvX2xlMzIoaXYzMik7DQorfQ0KKw0K
K3N0YXRpYyBpbmxpbmUgaW50IG13bF90eF90aWRfcXVldWVfbWFwcGluZyh1OCB0aWQpDQorew0K
Kwlzd2l0Y2ggKHRpZCkgew0KKwljYXNlIDA6DQorCWNhc2UgMzoNCisJCXJldHVybiBJRUVFODAy
MTFfQUNfQkU7DQorCWNhc2UgMToNCisJY2FzZSAyOg0KKwkJcmV0dXJuIElFRUU4MDIxMV9BQ19C
SzsNCisJY2FzZSA0Og0KKwljYXNlIDU6DQorCQlyZXR1cm4gSUVFRTgwMjExX0FDX1ZJOw0KKwlj
YXNlIDY6DQorCWNhc2UgNzoNCisJCXJldHVybiBJRUVFODAyMTFfQUNfVk87DQorCWRlZmF1bHQ6
DQorCQlicmVhazsNCisJfQ0KKw0KKwlyZXR1cm4gLTE7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUg
dm9pZCBtd2xfdHhfY291bnRfcGFja2V0KHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHRp
ZCkNCit7DQorCXN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbzsNCisJc3RydWN0IG13bF90eF9pbmZv
ICp0eF9zdGF0czsNCisNCisJaWYgKFdBUk5fT04odGlkID49IFNZU0FEUFRfTUFYX1RJRCkpDQor
CQlyZXR1cm47DQorDQorCXN0YV9pbmZvID0gbXdsX2Rldl9nZXRfc3RhKHN0YSk7DQorDQorCXR4
X3N0YXRzID0gJnN0YV9pbmZvLT50eF9zdGF0c1t0aWRdOw0KKw0KKwlpZiAodHhfc3RhdHMtPnN0
YXJ0X3RpbWUgPT0gMCkNCisJCXR4X3N0YXRzLT5zdGFydF90aW1lID0gamlmZmllczsNCisNCisJ
LyogcmVzZXQgdGhlIHBhY2tldCBjb3VudCBhZnRlciBlYWNoIHNlY29uZCBlbGFwc2VzLiAgSWYg
dGhlIG51bWJlciBvZg0KKwkgKiBwYWNrZXRzIGV2ZXIgZXhjZWVkcyB0aGUgYW1wZHVfbWluX3Ry
YWZmaWMgdGhyZXNob2xkLCB3ZSB3aWxsIGFsbG93DQorCSAqIGFuIGFtcGR1IHN0cmVhbSB0byBi
ZSBzdGFydGVkLg0KKwkgKi8NCisJaWYgKGppZmZpZXMgLSB0eF9zdGF0cy0+c3RhcnRfdGltZSA+
IEhaKSB7DQorCQl0eF9zdGF0cy0+cGt0cyA9IDA7DQorCQl0eF9zdGF0cy0+c3RhcnRfdGltZSA9
IDA7DQorCX0gZWxzZSB7DQorCQl0eF9zdGF0cy0+cGt0cysrOw0KKwl9DQorfQ0KKw0KK3N0YXRp
YyBpbmxpbmUgYm9vbCBtd2xfdHhfYXZhaWxhYmxlKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwgaW50
IGRlc2NfbnVtKQ0KK3sNCisJc3RydWN0IG13bF90eF9obmRsICp0eF9obmRsOw0KKw0KKwl0eF9o
bmRsID0gcHJpdi0+ZGVzY19kYXRhW2Rlc2NfbnVtXS5wbmV4dF90eF9obmRsOw0KKw0KKwlpZiAo
IXR4X2huZGwtPnBkZXNjKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwlpZiAodHhfaG5kbC0+cGRl
c2MtPnN0YXR1cyAhPSBFQUdMRV9UWERfU1RBVFVTX0lETEUpIHsNCisJCS8qIEludGVycnVwdCBG
L1cgYW55d2F5ICovDQorCQlpZiAodHhfaG5kbC0+cGRlc2MtPnN0YXR1cyAmDQorCQkgICAgY3B1
X3RvX2xlMzIoRUFHTEVfVFhEX1NUQVRVU19GV19PV05FRCkpDQorCQkJd3JpdGVsKE1BQ1JFR19I
MkFSSUNfQklUX1BQQV9SRUFEWSwNCisJCQkgICAgICAgcHJpdi0+aW9iYXNlMSArDQorCQkJICAg
ICAgIE1BQ1JFR19SRUdfSDJBX0lOVEVSUlVQVF9FVkVOVFMpOw0KKwkJcmV0dXJuIGZhbHNlOw0K
Kwl9DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXdsX3R4
X3NrYihzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIGludCBkZXNjX251bSwNCisJCQkgICAgICBzdHJ1
Y3Qgc2tfYnVmZiAqdHhfc2tiKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9p
bmZvOw0KKwlzdHJ1Y3QgbXdsX3R4X2N0cmwgKnR4X2N0cmw7DQorCXN0cnVjdCBtd2xfdHhfaG5k
bCAqdHhfaG5kbDsNCisJc3RydWN0IG13bF90eF9kZXNjICp0eF9kZXNjOw0KKwlzdHJ1Y3QgaWVl
ZTgwMjExX3N0YSAqc3RhOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOw0KKwlzdHJ1Y3Qg
bXdsX3ZpZiAqbXdsX3ZpZjsNCisJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa19jb25mOw0K
Kwlib29sIGNjbXAgPSBmYWxzZTsNCisJc3RydWN0IG13bF9kbWFfZGF0YSAqZG1hX2RhdGE7DQor
CXN0cnVjdCBpZWVlODAyMTFfaGRyICp3aDsNCisJZG1hX2FkZHJfdCBkbWE7DQorDQorCWlmIChX
QVJOX09OKCF0eF9za2IpKQ0KKwkJcmV0dXJuOw0KKw0KKwl0eF9pbmZvID0gSUVFRTgwMjExX1NL
Ql9DQih0eF9za2IpOw0KKwl0eF9jdHJsID0gKHN0cnVjdCBtd2xfdHhfY3RybCAqKSZ0eF9pbmZv
LT5zdGF0dXM7DQorCXN0YSA9IChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqKXR4X2N0cmwtPnN0YTsN
CisJdmlmID0gKHN0cnVjdCBpZWVlODAyMTFfdmlmICopdHhfY3RybC0+dmlmOw0KKwltd2xfdmlm
ID0gbXdsX2Rldl9nZXRfdmlmKHZpZik7DQorCWtfY29uZiA9IChzdHJ1Y3QgaWVlZTgwMjExX2tl
eV9jb25mICopdHhfY3RybC0+a19jb25mOw0KKw0KKwltd2xfdHhfZW5jYXBzdWxhdGVfZnJhbWUo
cHJpdiwgdHhfc2tiLCBrX2NvbmYsICZjY21wKTsNCisNCisJZG1hX2RhdGEgPSAoc3RydWN0IG13
bF9kbWFfZGF0YSAqKXR4X3NrYi0+ZGF0YTsNCisJd2ggPSAmZG1hX2RhdGEtPndoOw0KKw0KKwlp
ZiAoaWVlZTgwMjExX2lzX2RhdGEod2gtPmZyYW1lX2NvbnRyb2wpKSB7DQorCQlpZiAoaXNfbXVs
dGljYXN0X2V0aGVyX2FkZHIod2gtPmFkZHIxKSkgew0KKwkJCWlmIChjY21wKSB7DQorCQkJCW13
bF90eF9pbnNlcnRfY2NtcF9oZHIoZG1hX2RhdGEtPmRhdGEsDQorCQkJCQkJICAgICAgIG13bF92
aWYtPmtleWlkeCwNCisJCQkJCQkgICAgICAgbXdsX3ZpZi0+aXYxNiwNCisJCQkJCQkgICAgICAg
bXdsX3ZpZi0+aXYzMik7DQorCQkJCUlOQ1JFQVNFX0lWKG13bF92aWYtPml2MTYsIG13bF92aWYt
Pml2MzIpOw0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJaWYgKGNjbXApIHsNCisJCQkJaWYgKHZp
Zi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7DQorCQkJCQltd2xfdHhfaW5zZXJ0
X2NjbXBfaGRyKGRtYV9kYXRhLT5kYXRhLA0KKwkJCQkJCQkgICAgICAgbXdsX3ZpZi0+a2V5aWR4
LA0KKwkJCQkJCQkgICAgICAgbXdsX3ZpZi0+aXYxNiwNCisJCQkJCQkJICAgICAgIG13bF92aWYt
Pml2MzIpOw0KKwkJCQkJSU5DUkVBU0VfSVYobXdsX3ZpZi0+aXYxNiwNCisJCQkJCQkgICAgbXds
X3ZpZi0+aXYzMik7DQorCQkJCX0gZWxzZSB7DQorCQkJCQlzdHJ1Y3QgbXdsX3N0YSAqc3RhX2lu
Zm87DQorDQorCQkJCQlzdGFfaW5mbyA9IG13bF9kZXZfZ2V0X3N0YShzdGEpOw0KKw0KKwkJCQkJ
bXdsX3R4X2luc2VydF9jY21wX2hkcihkbWFfZGF0YS0+ZGF0YSwNCisJCQkJCQkJICAgICAgIDAs
DQorCQkJCQkJCSAgICAgICBzdGFfaW5mby0+aXYxNiwNCisJCQkJCQkJICAgICAgIHN0YV9pbmZv
LT5pdjMyKTsNCisJCQkJCUlOQ1JFQVNFX0lWKHN0YV9pbmZvLT5pdjE2LA0KKwkJCQkJCSAgICBz
dGFfaW5mby0+aXYzMik7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisNCisJdHhfaG5kbCA9
IHByaXYtPmRlc2NfZGF0YVtkZXNjX251bV0ucG5leHRfdHhfaG5kbDsNCisJdHhfaG5kbC0+cHNr
X2J1ZmYgPSB0eF9za2I7DQorCXR4X2Rlc2MgPSB0eF9obmRsLT5wZGVzYzsNCisJdHhfZGVzYy0+
dHhfcHJpb3JpdHkgPSB0eF9jdHJsLT50eF9wcmlvcml0eTsNCisJdHhfZGVzYy0+cW9zX2N0cmwg
PSBjcHVfdG9fbGUxNih0eF9jdHJsLT5xb3NfY3RybCk7DQorCXR4X2Rlc2MtPnBrdF9sZW4gPSBj
cHVfdG9fbGUxNih0eF9za2ItPmxlbik7DQorCXR4X2Rlc2MtPnBhY2tldF9pbmZvID0gMDsNCisJ
dHhfZGVzYy0+ZGF0YV9yYXRlID0gMDsNCisJdHhfZGVzYy0+dHlwZSA9IHR4X2N0cmwtPnR5cGU7
DQorCXR4X2Rlc2MtPnhtaXRfY29udHJvbCA9IHR4X2N0cmwtPnhtaXRfY29udHJvbDsNCisJdHhf
ZGVzYy0+c2FwX3BrdF9pbmZvID0gMDsNCisJZG1hID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRl
diwgdHhfc2tiLT5kYXRhLA0KKwkJCSAgICAgdHhfc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0Up
Ow0KKwlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKHByaXYtPnBkZXYsIGRtYSkpIHsNCisJCWRl
dl9rZnJlZV9za2JfYW55KHR4X3NrYik7DQorCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LA0K
KwkJCSAgImZhaWxlZCB0byBtYXAgcGNpIG1lbW9yeSFcbiIpOw0KKwkJcmV0dXJuOw0KKwl9DQor
CXR4X2Rlc2MtPnBrdF9wdHIgPSBjcHVfdG9fbGUzMihkbWEpOw0KKwl0eF9kZXNjLT5zdGF0dXMg
PSBjcHVfdG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0ZXX09XTkVEKTsNCisJLyogbWFrZSBzdXJl
IGFsbCB0aGUgbWVtb3J5IHRyYW5zYWN0aW9ucyBkb25lIGJ5IGNwdSB3ZXJlIGNvbXBsZXRlZCAq
Lw0KKwl3bWIoKTsJLypEYXRhIE1lbW9yeSBCYXJyaWVyKi8NCisJd3JpdGVsKE1BQ1JFR19IMkFS
SUNfQklUX1BQQV9SRUFEWSwNCisJICAgICAgIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0gy
QV9JTlRFUlJVUFRfRVZFTlRTKTsNCisJcHJpdi0+ZGVzY19kYXRhW2Rlc2NfbnVtXS5wbmV4dF90
eF9obmRsID0gdHhfaG5kbC0+cG5leHQ7DQorCXByaXYtPmZ3X2Rlc2NfY250W2Rlc2NfbnVtXSsr
Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICptd2xfdHhfZG9fYW1zZHUo
c3RydWN0IG13bF9wcml2ICpwcml2LA0KKwkJCQkJICAgICAgaW50IGRlc2NfbnVtLA0KKwkJCQkJ
ICAgICAgc3RydWN0IHNrX2J1ZmYgKnR4X3NrYiwNCisJCQkJCSAgICAgIHN0cnVjdCBpZWVlODAy
MTFfdHhfaW5mbyAqdHhfaW5mbykNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7DQor
CXN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbzsNCisJc3RydWN0IG13bF90eF9jdHJsICp0eF9jdHJs
ID0gKHN0cnVjdCBtd2xfdHhfY3RybCAqKSZ0eF9pbmZvLT5zdGF0dXM7DQorCXN0cnVjdCBpZWVl
ODAyMTFfdHhfaW5mbyAqYW1zZHVfaW5mbzsNCisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqYW1zZHVf
cGt0czsNCisJc3RydWN0IG13bF9hbXNkdV9mcmFnICphbXNkdTsNCisJaW50IGFtc2R1X2FsbG93
X3NpemU7DQorCXN0cnVjdCBpZWVlODAyMTFfaGRyICp3aDsNCisJaW50IHdoX2xlbjsNCisJdTE2
IGxlbjsNCisJdTggKmRhdGE7DQorDQorCXN0YSA9IChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqKXR4
X2N0cmwtPnN0YTsNCisJc3RhX2luZm8gPSBtd2xfZGV2X2dldF9zdGEoc3RhKTsNCisNCisJaWYg
KCFzdGFfaW5mby0+aXNfYW1zZHVfYWxsb3dlZCkNCisJCXJldHVybiB0eF9za2I7DQorDQorCXdo
ID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopdHhfc2tiLT5kYXRhOw0KKwlpZiAoc3RhX2luZm8t
PmlzX21lc2hfbm9kZSAmJiBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcih3aC0+YWRkcjMpKQ0KKwkJ
cmV0dXJuIHR4X3NrYjsNCisNCisJaWYgKHN0YV9pbmZvLT5hbXNkdV9jdHJsLmNhcCA9PSBNV0xf
QU1TRFVfU0laRV80SykNCisJCWFtc2R1X2FsbG93X3NpemUgPSBTWVNBRFBUX0FNU0RVXzRLX01B
WF9TSVpFOw0KKwllbHNlIGlmIChzdGFfaW5mby0+YW1zZHVfY3RybC5jYXAgPT0gTVdMX0FNU0RV
X1NJWkVfOEspDQorCQlhbXNkdV9hbGxvd19zaXplID0gU1lTQURQVF9BTVNEVV84S19NQVhfU0la
RTsNCisJZWxzZQ0KKwkJcmV0dXJuIHR4X3NrYjsNCisNCisJc3Bpbl9sb2NrX2JoKCZzdGFfaW5m
by0+YW1zZHVfbG9jayk7DQorCWFtc2R1ID0gJnN0YV9pbmZvLT5hbXNkdV9jdHJsLmZyYWdbZGVz
Y19udW1dOw0KKw0KKwlpZiAodHhfc2tiLT5sZW4gPiBTWVNBRFBUX0FNU0RVX0FMTE9XX1NJWkUp
IHsNCisJCWlmIChhbXNkdS0+bnVtKSB7DQorCQkJbXdsX3R4X3NrYihwcml2LCBkZXNjX251bSwg
YW1zZHUtPnNrYik7DQorCQkJYW1zZHUtPm51bSA9IDA7DQorCQkJYW1zZHUtPmN1cl9wb3MgPSBO
VUxMOw0KKw0KKwkJCWlmICghbXdsX3R4X2F2YWlsYWJsZShwcml2LCBkZXNjX251bSkpIHsNCisJ
CQkJc2tiX3F1ZXVlX2hlYWQoJnByaXYtPnR4cVtkZXNjX251bV0sIHR4X3NrYik7DQorCQkJCXNw
aW5fdW5sb2NrX2JoKCZzdGFfaW5mby0+YW1zZHVfbG9jayk7DQorCQkJCXJldHVybiBOVUxMOw0K
KwkJCX0NCisJCX0NCisJCXNwaW5fdW5sb2NrX2JoKCZzdGFfaW5mby0+YW1zZHVfbG9jayk7DQor
CQlyZXR1cm4gdHhfc2tiOw0KKwl9DQorDQorCS8qIHBvdGVudGlhbCBhbXNkdSBzaXplLCBzaG91
bGQgYWRkIGFtc2R1IGhlYWRlciAxNCBieXRlcyArDQorCSAqIG1heGltdW0gcGFkZGluZyAzLg0K
KwkgKi8NCisJd2hfbGVuID0gaWVlZTgwMjExX2hkcmxlbih3aC0+ZnJhbWVfY29udHJvbCk7DQor
CWxlbiA9IHR4X3NrYi0+bGVuIC0gd2hfbGVuICsgMTc7DQorDQorCWlmIChhbXNkdS0+bnVtKSB7
DQorCQlpZiAoKGFtc2R1LT5za2ItPmxlbiArIGxlbikgPiBhbXNkdV9hbGxvd19zaXplKSB7DQor
CQkJbXdsX3R4X3NrYihwcml2LCBkZXNjX251bSwgYW1zZHUtPnNrYik7DQorCQkJYW1zZHUtPm51
bSA9IDA7DQorCQkJYW1zZHUtPmN1cl9wb3MgPSBOVUxMOw0KKwkJfQ0KKwl9DQorDQorCWFtc2R1
LT5qaWZmaWVzID0gamlmZmllczsNCisJbGVuID0gdHhfc2tiLT5sZW4gLSB3aF9sZW47DQorDQor
CWlmIChhbXNkdS0+bnVtID09IDApIHsNCisJCXN0cnVjdCBza19idWZmICpuZXdza2I7DQorDQor
CQlhbXNkdV9wa3RzID0gKHN0cnVjdCBza19idWZmX2hlYWQgKikNCisJCQlrbWFsbG9jKHNpemVv
ZigqYW1zZHVfcGt0cyksIEdGUF9LRVJORUwpOw0KKwkJaWYgKCFhbXNkdV9wa3RzKSB7DQorCQkJ
c3Bpbl91bmxvY2tfYmgoJnN0YV9pbmZvLT5hbXNkdV9sb2NrKTsNCisJCQlyZXR1cm4gdHhfc2ti
Ow0KKwkJfQ0KKwkJbmV3c2tiID0gZGV2X2FsbG9jX3NrYihhbXNkdV9hbGxvd19zaXplICsNCisJ
CQkJICAgICAgIFNZU0FEUFRfTUlOX0JZVEVTX0hFQURST09NKTsNCisJCWlmICghbmV3c2tiKSB7
DQorCQkJc3Bpbl91bmxvY2tfYmgoJnN0YV9pbmZvLT5hbXNkdV9sb2NrKTsNCisJCQlrZnJlZShh
bXNkdV9wa3RzKTsNCisJCQlyZXR1cm4gdHhfc2tiOw0KKwkJfQ0KKw0KKwkJZGF0YSA9IG5ld3Nr
Yi0+ZGF0YTsNCisJCW1lbWNweShkYXRhLCB0eF9za2ItPmRhdGEsIHdoX2xlbik7DQorCQlpZiAo
c3RhX2luZm8tPmlzX21lc2hfbm9kZSkgew0KKwkJCWV0aGVyX2FkZHJfY29weShkYXRhICsgd2hf
bGVuLCB3aC0+YWRkcjMpOw0KKwkJCWV0aGVyX2FkZHJfY29weShkYXRhICsgd2hfbGVuICsgRVRI
X0FMRU4sIHdoLT5hZGRyNCk7DQorCQl9IGVsc2Ugew0KKwkJCWV0aGVyX2FkZHJfY29weShkYXRh
ICsgd2hfbGVuLA0KKwkJCQkJaWVlZTgwMjExX2dldF9EQSh3aCkpOw0KKwkJCWV0aGVyX2FkZHJf
Y29weShkYXRhICsgd2hfbGVuICsgRVRIX0FMRU4sDQorCQkJCQlpZWVlODAyMTFfZ2V0X1NBKHdo
KSk7DQorCQl9DQorCQkqKHU4ICopKGRhdGEgKyB3aF9sZW4gKyBFVEhfSExFTiAtIDEpID0gbGVu
ICYgMHhmZjsNCisJCSoodTggKikoZGF0YSArIHdoX2xlbiArIEVUSF9ITEVOIC0gMikgPSAobGVu
ID4+IDgpICYgMHhmZjsNCisJCW1lbWNweShkYXRhICsgd2hfbGVuICsgRVRIX0hMRU4sIHR4X3Nr
Yi0+ZGF0YSArIHdoX2xlbiwgbGVuKTsNCisNCisJCXNrYl9wdXQobmV3c2tiLCB0eF9za2ItPmxl
biArIEVUSF9ITEVOKTsNCisJCXR4X2N0cmwtPnFvc19jdHJsIHw9IElFRUU4MDIxMV9RT1NfQ1RM
X0FfTVNEVV9QUkVTRU5UOw0KKwkJYW1zZHVfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IobmV3c2ti
KTsNCisJCW1lbWNweShhbXNkdV9pbmZvLCB0eF9pbmZvLCBzaXplb2YoKnR4X2luZm8pKTsNCisJ
CXNrYl9xdWV1ZV9oZWFkX2luaXQoYW1zZHVfcGt0cyk7DQorCQkoKHN0cnVjdCBtd2xfdHhfY3Ry
bCAqKSZhbXNkdV9pbmZvLT5zdGF0dXMpLT5hbXNkdV9wa3RzID0NCisJCQkodm9pZCAqKWFtc2R1
X3BrdHM7DQorCQlhbXNkdS0+c2tiID0gbmV3c2tiOw0KKwl9IGVsc2Ugew0KKwkJYW1zZHUtPmN1
cl9wb3MgKz0gYW1zZHUtPnBhZDsNCisJCWRhdGEgPSBhbXNkdS0+Y3VyX3BvczsNCisNCisJCWlm
IChzdGFfaW5mby0+aXNfbWVzaF9ub2RlKSB7DQorCQkJZXRoZXJfYWRkcl9jb3B5KGRhdGEsIHdo
LT5hZGRyMyk7DQorCQkJZXRoZXJfYWRkcl9jb3B5KGRhdGEgKyBFVEhfQUxFTiwgd2gtPmFkZHI0
KTsNCisJCX0gZWxzZSB7DQorCQkJZXRoZXJfYWRkcl9jb3B5KGRhdGEsIGllZWU4MDIxMV9nZXRf
REEod2gpKTsNCisJCQlldGhlcl9hZGRyX2NvcHkoZGF0YSArIEVUSF9BTEVOLCBpZWVlODAyMTFf
Z2V0X1NBKHdoKSk7DQorCQl9DQorCQkqKHU4ICopKGRhdGEgKyBFVEhfSExFTiAtIDEpID0gbGVu
ICYgMHhmZjsNCisJCSoodTggKikoZGF0YSArIEVUSF9ITEVOIC0gMikgPSAobGVuID4+IDgpICYg
MHhmZjsNCisJCW1lbWNweShkYXRhICsgRVRIX0hMRU4sIHR4X3NrYi0+ZGF0YSArIHdoX2xlbiwg
bGVuKTsNCisNCisJCXNrYl9wdXQoYW1zZHUtPnNrYiwgbGVuICsgRVRIX0hMRU4gKyBhbXNkdS0+
cGFkKTsNCisJCWFtc2R1X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKGFtc2R1LT5za2IpOw0KKwkJ
YW1zZHVfcGt0cyA9IChzdHJ1Y3Qgc2tfYnVmZl9oZWFkICopDQorCQkJKChzdHJ1Y3QgbXdsX3R4
X2N0cmwgKikmYW1zZHVfaW5mby0+c3RhdHVzKS0+YW1zZHVfcGt0czsNCisJfQ0KKw0KKwlhbXNk
dS0+bnVtKys7DQorCWFtc2R1LT5wYWQgPSAoKGxlbiArIEVUSF9ITEVOKSAlIDQpID8gKDQgLSAo
bGVuICsgRVRIX0hMRU4pICUgNCkgOiAwOw0KKwlhbXNkdS0+Y3VyX3BvcyA9IGFtc2R1LT5za2It
PmRhdGEgKyBhbXNkdS0+c2tiLT5sZW47DQorCXNrYl9xdWV1ZV90YWlsKGFtc2R1X3BrdHMsIHR4
X3NrYik7DQorDQorCWlmIChhbXNkdS0+bnVtID4gU1lTQURQVF9BTVNEVV9QQUNLRVRfVEhSRVNI
T0xEKSB7DQorCQlhbXNkdS0+bnVtID0gMDsNCisJCWFtc2R1LT5jdXJfcG9zID0gTlVMTDsNCisJ
CXNwaW5fdW5sb2NrX2JoKCZzdGFfaW5mby0+YW1zZHVfbG9jayk7DQorCQlyZXR1cm4gYW1zZHUt
PnNrYjsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmc3RhX2luZm8tPmFtc2R1X2xvY2spOw0K
KwlyZXR1cm4gTlVMTDsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG13bF90eF9za2JzKHN0
cnVjdCBpZWVlODAyMTFfaHcgKmh3KQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHct
PnByaXY7DQorCWludCBudW0gPSBTWVNBRFBUX1RYX1dNTV9RVUVVRVM7DQorCXN0cnVjdCBza19i
dWZmICp0eF9za2I7DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+dHhfZGVzY19sb2NrKTsNCisJ
d2hpbGUgKG51bS0tKSB7DQorCQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcHJpdi0+dHhxW251bV0p
ID4gMCkgew0KKwkJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsNCisJCQlzdHJ1
Y3QgbXdsX3R4X2N0cmwgKnR4X2N0cmw7DQorDQorCQkJaWYgKCFtd2xfdHhfYXZhaWxhYmxlKHBy
aXYsIG51bSkpDQorCQkJCWJyZWFrOw0KKw0KKwkJCXR4X3NrYiA9IHNrYl9kZXF1ZXVlKCZwcml2
LT50eHFbbnVtXSk7DQorCQkJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHhfc2tiKTsNCisJ
CQl0eF9jdHJsID0gKHN0cnVjdCBtd2xfdHhfY3RybCAqKSZ0eF9pbmZvLT5zdGF0dXM7DQorDQor
CQkJaWYgKCh0eF9za2ItPnByb3RvY29sICE9IGNwdV90b19iZTE2KEVUSF9QX1BBRSkpICYmDQor
CQkJICAgICh0eF9jdHJsLT50eF9wcmlvcml0eSA+PSBTWVNBRFBUX1RYX1dNTV9RVUVVRVMpKSB7
DQorCQkJCXR4X3NrYiA9IG13bF90eF9kb19hbXNkdShwcml2LCBudW0sDQorCQkJCQkJCSB0eF9z
a2IsIHR4X2luZm8pOw0KKwkJCX0NCisNCisJCQlpZiAodHhfc2tiKQ0KKwkJCQltd2xfdHhfc2ti
KHByaXYsIG51bSwgdHhfc2tiKTsNCisJCX0NCisNCisJCWlmIChza2JfcXVldWVfbGVuKCZwcml2
LT50eHFbbnVtXSkgPA0KKwkJICAgIFNZU0FEUFRfVFhfV0FLRV9RX1RIUkVTSE9MRCkgew0KKwkJ
CWludCBxdWV1ZTsNCisNCisJCQlxdWV1ZSA9IFNZU0FEUFRfVFhfV01NX1FVRVVFUyAtIG51bSAt
IDE7DQorCQkJaWYgKGllZWU4MDIxMV9xdWV1ZV9zdG9wcGVkKGh3LCBxdWV1ZSkpDQorCQkJCWll
ZWU4MDIxMV93YWtlX3F1ZXVlKGh3LCBxdWV1ZSk7DQorCQl9DQorCX0NCisJc3Bpbl91bmxvY2tf
YmgoJnByaXYtPnR4X2Rlc2NfbG9jayk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xf
dHhfcHJlcGFyZV9pbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgcmF0ZSwNCisJCQkJ
ICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbykNCit7DQorCXUzMiBmb3JtYXQs
IGJhbmR3aWR0aCwgc2hvcnRfZ2ksIHJhdGVfaWQ7DQorDQorCWllZWU4MDIxMV90eF9pbmZvX2Ns
ZWFyX3N0YXR1cyhpbmZvKTsNCisNCisJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeCA9IC0xOw0K
KwlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSAwOw0KKwlpbmZvLT5zdGF0dXMucmF0ZXNb
MF0uZmxhZ3MgPSAwOw0KKw0KKwlpZiAocmF0ZSkgew0KKwkJLyogUHJlcGFyZSByYXRlIGluZm9y
bWF0aW9uICovDQorCQlmb3JtYXQgPSByYXRlICYgTVdMX1RYX1JBVEVfRk9STUFUX01BU0s7DQor
CQliYW5kd2lkdGggPQ0KKwkJCShyYXRlICYgTVdMX1RYX1JBVEVfQkFORFdJRFRIX01BU0spID4+
DQorCQkJTVdMX1RYX1JBVEVfQkFORFdJRFRIX1NISUZUOw0KKwkJc2hvcnRfZ2kgPSAocmF0ZSAm
IE1XTF9UWF9SQVRFX1NIT1JUR0lfTUFTSykgPj4NCisJCQlNV0xfVFhfUkFURV9TSE9SVEdJX1NI
SUZUOw0KKwkJcmF0ZV9pZCA9IChyYXRlICYgTVdMX1RYX1JBVEVfUkFURUlETUNTX01BU0spID4+
DQorCQkJTVdMX1RYX1JBVEVfUkFURUlETUNTX1NISUZUOw0KKw0KKwkJaW5mby0+c3RhdHVzLnJh
dGVzWzBdLmlkeCA9IHJhdGVfaWQ7DQorCQlpZiAoZm9ybWF0ID09IFRYX1JBVEVfRk9STUFUX0xF
R0FDWSkgew0KKwkJCWlmIChody0+Y29uZi5jaGFuZGVmLmNoYW4tPmh3X3ZhbHVlID4NCisJCQkg
ICAgQkFORF8yNF9DSEFOTkVMX05VTSkgew0KKwkJCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uaWR4
IC09IDU7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGZvcm1hdCA9PSBUWF9SQVRFX0ZPUk1BVF8xMU4p
DQorCQkJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmZsYWdzIHw9DQorCQkJCUlFRUU4MDIxMV9UWF9S
Q19NQ1M7DQorCQlpZiAoZm9ybWF0ID09IFRYX1JBVEVfRk9STUFUXzExQUMpDQorCQkJaW5mby0+
c3RhdHVzLnJhdGVzWzBdLmZsYWdzIHw9DQorCQkJCUlFRUU4MDIxMV9UWF9SQ19WSFRfTUNTOw0K
KwkJaWYgKGJhbmR3aWR0aCA9PSBUWF9SQVRFX0JBTkRXSURUSF80MCkNCisJCQlpbmZvLT5zdGF0
dXMucmF0ZXNbMF0uZmxhZ3MgfD0NCisJCQkJSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsN
CisJCWlmIChiYW5kd2lkdGggPT0gVFhfUkFURV9CQU5EV0lEVEhfODApDQorCQkJaW5mby0+c3Rh
dHVzLnJhdGVzWzBdLmZsYWdzIHw9DQorCQkJCUlFRUU4MDIxMV9UWF9SQ184MF9NSFpfV0lEVEg7
DQorCQlpZiAoc2hvcnRfZ2kgPT0gVFhfUkFURV9JTkZPX1NIT1JUX0dJKQ0KKwkJCWluZm8tPnN0
YXR1cy5yYXRlc1swXS5mbGFncyB8PQ0KKwkJCQlJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0k7DQor
CQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSAxOw0KKwkJaW5mby0+c3RhdHVzLnJhdGVz
WzFdLmlkeCA9IC0xOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xfdHhfYWNr
X2Ftc2R1X3BrdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiByYXRlLA0KKwkJCQkJIHN0
cnVjdCBza19idWZmX2hlYWQgKmFtc2R1X3BrdHMpDQorew0KKwlzdHJ1Y3Qgc2tfYnVmZiAqYW1z
ZHVfcGt0Ow0KKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87DQorDQorCXdoaWxlIChz
a2JfcXVldWVfbGVuKGFtc2R1X3BrdHMpID4gMCkgew0KKwkJYW1zZHVfcGt0ID0gc2tiX2RlcXVl
dWUoYW1zZHVfcGt0cyk7DQorCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihhbXNkdV9wa3QpOw0K
KwkJbXdsX3R4X3ByZXBhcmVfaW5mbyhodywgcmF0ZSwgaW5mbyk7DQorCQlpbmZvLT5mbGFncyAm
PSB+SUVFRTgwMjExX1RYX0NUTF9BTVBEVTsNCisJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9U
WF9TVEFUX0FDSzsNCisJCWllZWU4MDIxMV90eF9zdGF0dXMoaHcsIGFtc2R1X3BrdCk7DQorCX0N
CisNCisJa2ZyZWUoYW1zZHVfcGt0cyk7DQorfQ0KKw0KK2ludCBtd2xfdHhfaW5pdChzdHJ1Y3Qg
aWVlZTgwMjExX2h3ICpodykNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2
Ow0KKwlpbnQgcmM7DQorDQorCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPmRlbGF5X3EpOw0K
Kw0KKwlyYyA9IG13bF90eF9yaW5nX2FsbG9jKHByaXYpOw0KKwlpZiAocmMpIHsNCisJCXdpcGh5
X2Vycihody0+d2lwaHksICJhbGxvY2F0aW5nIFRYIHJpbmcgZmFpbGVkXG4iKTsNCisJCXJldHVy
biByYzsNCisJfQ0KKw0KKwlyYyA9IG13bF90eF9yaW5nX2luaXQocHJpdik7DQorCWlmIChyYykg
ew0KKwkJbXdsX3R4X3JpbmdfZnJlZShwcml2KTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJp
bml0aWFsaXppbmcgVFggcmluZyBmYWlsZWRcbiIpOw0KKwkJcmV0dXJuIHJjOw0KKwl9DQorDQor
CXJldHVybiAwOw0KK30NCisNCit2b2lkIG13bF90eF9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9o
dyAqaHcpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisNCisJc2ti
X3F1ZXVlX3B1cmdlKCZwcml2LT5kZWxheV9xKTsNCisNCisJbXdsX3R4X3JpbmdfY2xlYW51cChw
cml2KTsNCisJbXdsX3R4X3JpbmdfZnJlZShwcml2KTsNCit9DQorDQordm9pZCBtd2xfdHhfeG1p
dChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3R4X2NvbnRy
b2wgKmNvbnRyb2wsDQorCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikNCit7DQorCXN0cnVjdCBtd2xf
cHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlpbnQgaW5kZXg7DQorCXN0cnVjdCBpZWVlODAyMTFf
c3RhICpzdGE7DQorCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsNCisJc3RydWN0
IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVjdCBpZWVlODAyMTFfaGRyICp3aDsNCisJdTggeG1p
dGNvbnRyb2w7DQorCXUxNiBxb3M7DQorCWludCB0eHByaW9yaXR5Ow0KKwl1OCB0aWQgPSAwOw0K
KwlzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtID0gTlVMTDsNCisJYm9vbCBzdGFydF9i
YV9zZXNzaW9uID0gZmFsc2U7DQorCWJvb2wgbWdtdGZyYW1lID0gZmFsc2U7DQorCXN0cnVjdCBp
ZWVlODAyMTFfbWdtdCAqbWdtdDsNCisJYm9vbCBlYXBvbF9mcmFtZSA9IGZhbHNlOw0KKwlzdHJ1
Y3QgbXdsX3R4X2N0cmwgKnR4X2N0cmw7DQorCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtf
Y29uZiA9IE5VTEw7DQorDQorCWluZGV4ID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7DQor
CXN0YSA9IGNvbnRyb2wtPnN0YTsNCisNCisJd2ggPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilz
a2ItPmRhdGE7DQorDQorCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3Mod2gtPmZyYW1lX2NvbnRy
b2wpKQ0KKwkJcW9zID0gKigodTE2ICopaWVlZTgwMjExX2dldF9xb3NfY3RsKHdoKSk7DQorCWVs
c2UNCisJCXFvcyA9IDA7DQorDQorCWlmIChza2ItPnByb3RvY29sID09IGNwdV90b19iZTE2KEVU
SF9QX1BBRSkpIHsNCisJCWluZGV4ID0gSUVFRTgwMjExX0FDX1ZPOw0KKwkJZWFwb2xfZnJhbWUg
PSB0cnVlOw0KKwl9DQorDQorCWlmIChpZWVlODAyMTFfaXNfbWdtdCh3aC0+ZnJhbWVfY29udHJv
bCkpIHsNCisJCW1nbXRmcmFtZSA9IHRydWU7DQorCQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFf
bWdtdCAqKXNrYi0+ZGF0YTsNCisJfQ0KKw0KKwl0eF9pbmZvID0gSUVFRTgwMjExX1NLQl9DQihz
a2IpOw0KKwltd2xfdmlmID0gbXdsX2Rldl9nZXRfdmlmKHR4X2luZm8tPmNvbnRyb2wudmlmKTsN
CisNCisJaWYgKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BU1NJR05fU0VRKSB7
DQorCQl3aC0+c2VxX2N0cmwgJj0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NDVExfRlJBRyk7DQor
CQl3aC0+c2VxX2N0cmwgfD0gY3B1X3RvX2xlMTYobXdsX3ZpZi0+c2Vxbm8pOw0KKwkJbXdsX3Zp
Zi0+c2Vxbm8gKz0gMHgxMDsNCisJfQ0KKw0KKwkvKiBTZXR1cCBmaXJtd2FyZSBjb250cm9sIGJp
dCBmaWVsZHMgZm9yIGVhY2ggZnJhbWUgdHlwZS4gKi8NCisJeG1pdGNvbnRyb2wgPSAwOw0KKw0K
KwlpZiAobWdtdGZyYW1lIHx8IGllZWU4MDIxMV9pc19jdGwod2gtPmZyYW1lX2NvbnRyb2wpKSB7
DQorCQlxb3MgPSAwOw0KKwl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19kYXRhKHdoLT5mcmFtZV9j
b250cm9sKSkgew0KKwkJcW9zICY9IH5NV0xfUU9TX0FDS19QT0xJQ1lfTUFTSzsNCisNCisJCWlm
ICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpIHsNCisJCQl4bWl0Y29u
dHJvbCAmPSAweGZiOw0KKwkJCXFvcyB8PSBNV0xfUU9TX0FDS19QT0xJQ1lfQkxPQ0tBQ0s7DQor
CQl9IGVsc2Ugew0KKwkJCXhtaXRjb250cm9sIHw9IDB4NDsNCisJCQlxb3MgfD0gTVdMX1FPU19B
Q0tfUE9MSUNZX05PUk1BTDsNCisJCX0NCisNCisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRk
cih3aC0+YWRkcjEpKQ0KKwkJCXhtaXRjb250cm9sIHw9IEVBR0xFX1RYRF9YTUlUQ1RSTF9VU0Vf
TUNfUkFURTsNCisNCisJCWtfY29uZiA9IHR4X2luZm8tPmNvbnRyb2wuaHdfa2V5Ow0KKwl9DQor
DQorCS8qIFF1ZXVlIEFEREJBIHJlcXVlc3QgaW4gdGhlIHJlc3BlY3RpdmUgZGF0YSBxdWV1ZS4g
IFdoaWxlIHNldHRpbmcgdXANCisJICogdGhlIGFtcGR1IHN0cmVhbSwgbWFjODAyMTEgcXVldWVz
IGZ1cnRoZXIgcGFja2V0cyBmb3IgdGhhdA0KKwkgKiBwYXJ0aWN1bGFyIHJhL3RpZCBwYWlyLiAg
SG93ZXZlciwgcGFja2V0cyBwaWxlZCB1cCBpbiB0aGUgaGFyZHdhcmUNCisJICogZm9yIHRoYXQg
cmEvdGlkIHBhaXIgd2lsbCBzdGlsbCBnbyBvdXQuIEFEREJBIHJlcXVlc3QgYW5kIHRoZQ0KKwkg
KiByZWxhdGVkIGRhdGEgcGFja2V0cyBnb2luZyBvdXQgZnJvbSBkaWZmZXJlbnQgcXVldWVzIGFz
eW5jaHJvbm91c2x5DQorCSAqIHdpbGwgY2F1c2UgYSBzaGlmdCBpbiB0aGUgcmVjZWl2ZXIgd2lu
ZG93IHdoaWNoIG1pZ2h0IHJlc3VsdCBpbg0KKwkgKiBhbXBkdSBwYWNrZXRzIGdldHRpbmcgZHJv
cHBlZCBhdCB0aGUgcmVjZWl2ZXIgYWZ0ZXIgdGhlIHN0cmVhbSBoYXMNCisJICogYmVlbiBzZXR1
cC4NCisJICovDQorCWlmIChtZ210ZnJhbWUpIHsNCisJCXUxNiBjYXBhYjsNCisNCisJCWlmICh1
bmxpa2VseShpZWVlODAyMTFfaXNfYWN0aW9uKHdoLT5mcmFtZV9jb250cm9sKSAmJg0KKwkJCSAg
ICAgbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPT0gV0xBTl9DQVRFR09SWV9CQUNLICYmDQorCQkJ
ICAgICBtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5hY3Rpb25fY29kZSA9PQ0KKwkJCSAgICAg
V0xBTl9BQ1RJT05fQUREQkFfUkVRKSkgew0KKwkJCWNhcGFiID0gbGUxNl90b19jcHUobWdtdC0+
dS5hY3Rpb24udS5hZGRiYV9yZXEuY2FwYWIpOw0KKwkJCXRpZCA9IChjYXBhYiAmIElFRUU4MDIx
MV9BRERCQV9QQVJBTV9USURfTUFTSykgPj4gMjsNCisJCQlpbmRleCA9IG13bF90eF90aWRfcXVl
dWVfbWFwcGluZyh0aWQpOw0KKwkJCWNhcGFiIHw9IDE7DQorCQkJbWdtdC0+dS5hY3Rpb24udS5h
ZGRiYV9yZXEuY2FwYWIgPSBjcHVfdG9fbGUxNihjYXBhYik7DQorCQl9DQorDQorCQlpZiAodW5s
aWtlbHkoaWVlZTgwMjExX2lzX2FjdGlvbih3aC0+ZnJhbWVfY29udHJvbCkgJiYNCisJCQkgICAg
IG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID09IFdMQU5fQ0FURUdPUllfQkFDSyAmJg0KKwkJCSAg
ICAgbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmFjdGlvbl9jb2RlID09DQorCQkJICAgICBX
TEFOX0FDVElPTl9BRERCQV9SRVNQKSkgew0KKwkJCWNhcGFiID0gbGUxNl90b19jcHUobWdtdC0+
dS5hY3Rpb24udS5hZGRiYV9yZXNwLmNhcGFiKTsNCisJCQljYXBhYiB8PSAxOw0KKwkJCW1nbXQt
PnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5jYXBhYiA9IGNwdV90b19sZTE2KGNhcGFiKTsNCisJCX0N
CisJfQ0KKw0KKwlpbmRleCA9IFNZU0FEUFRfVFhfV01NX1FVRVVFUyAtIGluZGV4IC0gMTsNCisJ
dHhwcmlvcml0eSA9IGluZGV4Ow0KKw0KKwlpZiAoc3RhICYmIHN0YS0+aHRfY2FwLmh0X3N1cHBv
cnRlZCAmJiAhZWFwb2xfZnJhbWUgJiYNCisJICAgIGllZWU4MDIxMV9pc19kYXRhX3Fvcyh3aC0+
ZnJhbWVfY29udHJvbCkpIHsNCisJCXRpZCA9IHFvcyAmIDB4ZjsNCisJCW13bF90eF9jb3VudF9w
YWNrZXQoc3RhLCB0aWQpOw0KKw0KKwkJc3Bpbl9sb2NrX2JoKCZwcml2LT5zdHJlYW1fbG9jayk7
DQorCQlzdHJlYW0gPSBtd2xfZndjbWRfbG9va3VwX3N0cmVhbShodywgc3RhLT5hZGRyLCB0aWQp
Ow0KKw0KKwkJaWYgKHN0cmVhbSkgew0KKwkJCWlmIChzdHJlYW0tPnN0YXRlID09IEFNUERVX1NU
UkVBTV9BQ1RJVkUpIHsNCisJCQkJaWYgKFdBUk5fT04oIShxb3MgJg0KKwkJCQkJICAgIE1XTF9R
T1NfQUNLX1BPTElDWV9CTE9DS0FDSykpKSB7DQorCQkJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+
c3RyZWFtX2xvY2spOw0KKwkJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsNCisJCQkJCXJldHVy
bjsNCisJCQkJfQ0KKw0KKwkJCQl0eHByaW9yaXR5ID0NCisJCQkJCShTWVNBRFBUX1RYX1dNTV9R
VUVVRVMgKyBzdHJlYW0tPmlkeCkgJQ0KKwkJCQkJU1lTQURQVF9UT1RBTF9IV19RVUVVRVM7DQor
CQkJfSBlbHNlIGlmIChzdHJlYW0tPnN0YXRlID09IEFNUERVX1NUUkVBTV9ORVcpIHsNCisJCQkJ
LyogV2UgZ2V0IGhlcmUgaWYgdGhlIGRyaXZlciBzZW5kcyB1cyBwYWNrZXRzDQorCQkJCSAqIGFm
dGVyIHdlJ3ZlIGluaXRpYXRlZCBhIHN0cmVhbSwgYnV0IGJlZm9yZQ0KKwkJCQkgKiBvdXIgYW1w
ZHVfYWN0aW9uIHJvdXRpbmUgaGFzIGJlZW4gY2FsbGVkDQorCQkJCSAqIHdpdGggSUVFRTgwMjEx
X0FNUERVX1RYX1NUQVJUIHRvIGdldCB0aGUgU1NODQorCQkJCSAqIGZvciB0aGUgQUREQkEgcmVx
dWVzdC4gIFNvIHRoaXMgcGFja2V0IGNhbg0KKwkJCQkgKiBnbyBvdXQgd2l0aCBubyByaXNrIG9m
IHNlcXVlbmNlIG51bWJlcg0KKwkJCQkgKiBtaXNtYXRjaC4gIE5vIHNwZWNpYWwgaGFuZGxpbmcg
aXMgcmVxdWlyZWQuDQorCQkJCSAqLw0KKwkJCX0gZWxzZSB7DQorCQkJCS8qIERyb3AgcGFja2V0
cyB0aGF0IHdvdWxkIGdvIG91dCBhZnRlciB0aGUNCisJCQkJICogQUREQkEgcmVxdWVzdCB3YXMg
c2VudCBidXQgYmVmb3JlIHRoZSBBRERCQQ0KKwkJCQkgKiByZXNwb25zZSBpcyByZWNlaXZlZC4g
IElmIHdlIGRvbid0IGRvIHRoaXMsDQorCQkJCSAqIHRoZSByZWNpcGllbnQgd291bGQgcHJvYmFi
bHkgcmVjZWl2ZSBpdA0KKwkJCQkgKiBhZnRlciB0aGUgQUREQkEgcmVxdWVzdCB3aXRoIFNTTiAw
LiAgVGhpcw0KKwkJCQkgKiB3aWxsIGNhdXNlIHRoZSByZWNpcGllbnQncyBCQSByZWNlaXZlIHdp
bmRvdw0KKwkJCQkgKiB0byBzaGlmdCwgd2hpY2ggd291bGQgY2F1c2UgdGhlIHN1YnNlcXVlbnQN
CisJCQkJICogcGFja2V0cyBpbiB0aGUgQkEgc3RyZWFtIHRvIGJlIGRpc2NhcmRlZC4NCisJCQkJ
ICogbWFjODAyMTEgcXVldWVzIG91ciBwYWNrZXRzIGZvciB1cyBpbiB0aGlzDQorCQkJCSAqIGNh
c2UsIHNvIHRoaXMgaXMgcmVhbGx5IGp1c3QgYSBzYWZldHkgY2hlY2suDQorCQkJCSAqLw0KKwkJ
CQl3aXBoeV93YXJuKGh3LT53aXBoeSwNCisJCQkJCSAgICJjYW4ndCBzZW5kIHBhY2tldCBkdXJp
bmcgQUREQkFcbiIpOw0KKwkJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0K
KwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOw0KKwkJCQlyZXR1cm47DQorCQkJfQ0KKwkJfSBl
bHNlIHsNCisJCQlpZiAobXdsX2Z3Y21kX2FtcGR1X2FsbG93ZWQoc3RhLCB0aWQpKSB7DQorCQkJ
CXN0cmVhbSA9IG13bF9md2NtZF9hZGRfc3RyZWFtKGh3LCBzdGEsIHRpZCk7DQorDQorCQkJCWlm
IChzdHJlYW0pDQorCQkJCQlzdGFydF9iYV9zZXNzaW9uID0gdHJ1ZTsNCisJCQl9DQorCQl9DQor
DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KKwl9IGVsc2Ugew0KKwkJ
cW9zICY9IH5NV0xfUU9TX0FDS19QT0xJQ1lfTUFTSzsNCisJCXFvcyB8PSBNV0xfUU9TX0FDS19Q
T0xJQ1lfTk9STUFMOw0KKwl9DQorDQorCXR4X2N0cmwgPSAoc3RydWN0IG13bF90eF9jdHJsICop
JnR4X2luZm8tPnN0YXR1czsNCisJdHhfY3RybC0+dmlmID0gKHZvaWQgKil0eF9pbmZvLT5jb250
cm9sLnZpZjsNCisJdHhfY3RybC0+c3RhID0gKHZvaWQgKilzdGE7DQorCXR4X2N0cmwtPmtfY29u
ZiA9ICh2b2lkICopa19jb25mOw0KKwl0eF9jdHJsLT5hbXNkdV9wa3RzID0gTlVMTDsNCisJdHhf
Y3RybC0+dHhfcHJpb3JpdHkgPSB0eHByaW9yaXR5Ow0KKwl0eF9jdHJsLT50eXBlID0gKG1nbXRm
cmFtZSA/IElFRUVfVFlQRV9NQU5BR0VNRU5UIDogSUVFRV9UWVBFX0RBVEEpOw0KKwl0eF9jdHJs
LT5xb3NfY3RybCA9IHFvczsNCisJdHhfY3RybC0+eG1pdF9jb250cm9sID0geG1pdGNvbnRyb2w7
DQorDQorCWlmIChza2JfcXVldWVfbGVuKCZwcml2LT50eHFbaW5kZXhdKSA+IHByaXYtPnR4cV9s
aW1pdCkNCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKGh3LCBTWVNBRFBUX1RYX1dNTV9RVUVVRVMg
LSBpbmRleCAtIDEpOw0KKw0KKwlza2JfcXVldWVfdGFpbCgmcHJpdi0+dHhxW2luZGV4XSwgc2ti
KTsNCisNCisJbXdsX3R4X3NrYnMoaHcpOw0KKw0KKwkvKiBJbml0aWF0ZSB0aGUgYW1wZHUgc2Vz
c2lvbiBoZXJlICovDQorCWlmIChzdGFydF9iYV9zZXNzaW9uKSB7DQorCQlzcGluX2xvY2tfYmgo
JnByaXYtPnN0cmVhbV9sb2NrKTsNCisJCWlmIChtd2xfZndjbWRfc3RhcnRfc3RyZWFtKGh3LCBz
dHJlYW0pKQ0KKwkJCW13bF9md2NtZF9yZW1vdmVfc3RyZWFtKGh3LCBzdHJlYW0pOw0KKwkJc3Bp
bl91bmxvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2NrKTsNCisJfQ0KK30NCisNCit2b2lkIG13bF90
eF9kZWxfcGt0c192aWFfdmlmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAgICAgc3Ry
dWN0IGllZWU4MDIxMV92aWYgKnZpZikNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3
LT5wcml2Ow0KKwlpbnQgbnVtOw0KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOw0KKwlzdHJ1
Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm87DQorCXN0cnVjdCBtd2xfdHhfY3RybCAqdHhf
Y3RybDsNCisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqYW1zZHVfcGt0czsNCisNCisJZm9yIChudW0g
PSAxOyBudW0gPCBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEE7IG51bSsrKSB7DQorCQlzcGluX2xv
Y2tfYmgoJnByaXYtPnR4cVtudW1dLmxvY2spOw0KKwkJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmcHJp
di0+dHhxW251bV0sIHNrYiwgdG1wKSB7DQorCQkJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Io
c2tiKTsNCisJCQl0eF9jdHJsID0gKHN0cnVjdCBtd2xfdHhfY3RybCAqKSZ0eF9pbmZvLT5zdGF0
dXM7DQorCQkJaWYgKHR4X2N0cmwtPnZpZiA9PSB2aWYpIHsNCisJCQkJYW1zZHVfcGt0cyA9IChz
dHJ1Y3Qgc2tfYnVmZl9oZWFkICopDQorCQkJCQl0eF9jdHJsLT5hbXNkdV9wa3RzOw0KKwkJCQlp
ZiAoYW1zZHVfcGt0cykgew0KKwkJCQkJc2tiX3F1ZXVlX3B1cmdlKGFtc2R1X3BrdHMpOw0KKwkJ
CQkJa2ZyZWUoYW1zZHVfcGt0cyk7DQorCQkJCX0NCisJCQkJX19za2JfdW5saW5rKHNrYiwgJnBy
aXYtPnR4cVtudW1dKTsNCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsNCisJCQl9DQorCQl9
DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+dHhxW251bV0ubG9jayk7DQorCX0NCit9DQorDQor
dm9pZCBtd2xfdHhfZGVsX3BrdHNfdmlhX3N0YShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJ
CQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYg
KnByaXYgPSBody0+cHJpdjsNCisJaW50IG51bTsNCisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRt
cDsNCisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvOw0KKwlzdHJ1Y3QgbXdsX3R4
X2N0cmwgKnR4X2N0cmw7DQorCXN0cnVjdCBza19idWZmX2hlYWQgKmFtc2R1X3BrdHM7DQorDQor
CWZvciAobnVtID0gMTsgbnVtIDwgU1lTQURQVF9OVU1fT0ZfREVTQ19EQVRBOyBudW0rKykgew0K
KwkJc3Bpbl9sb2NrX2JoKCZwcml2LT50eHFbbnVtXS5sb2NrKTsNCisJCXNrYl9xdWV1ZV93YWxr
X3NhZmUoJnByaXYtPnR4cVtudW1dLCBza2IsIHRtcCkgew0KKwkJCXR4X2luZm8gPSBJRUVFODAy
MTFfU0tCX0NCKHNrYik7DQorCQkJdHhfY3RybCA9IChzdHJ1Y3QgbXdsX3R4X2N0cmwgKikmdHhf
aW5mby0+c3RhdHVzOw0KKwkJCWlmICh0eF9jdHJsLT5zdGEgPT0gc3RhKSB7DQorCQkJCWFtc2R1
X3BrdHMgPSAoc3RydWN0IHNrX2J1ZmZfaGVhZCAqKQ0KKwkJCQkJdHhfY3RybC0+YW1zZHVfcGt0
czsNCisJCQkJaWYgKGFtc2R1X3BrdHMpIHsNCisJCQkJCXNrYl9xdWV1ZV9wdXJnZShhbXNkdV9w
a3RzKTsNCisJCQkJCWtmcmVlKGFtc2R1X3BrdHMpOw0KKwkJCQl9DQorCQkJCV9fc2tiX3VubGlu
ayhza2IsICZwcml2LT50eHFbbnVtXSk7DQorCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7DQor
CQkJfQ0KKwkJfQ0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnR4cVtudW1dLmxvY2spOw0KKwl9
DQorfQ0KKw0KK3ZvaWQgbXdsX3R4X2RlbF9hbXBkdV9wa3RzKHN0cnVjdCBpZWVlODAyMTFfaHcg
Kmh3LA0KKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHRpZCkNCit7DQorCXN0
cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3N0YSAqc3RhX2lu
Zm8gPSBtd2xfZGV2X2dldF9zdGEoc3RhKTsNCisJaW50IGRlc2NfbnVtID0gU1lTQURQVF9UWF9X
TU1fUVVFVUVTIC0gdGlkIC0gMTsNCisJc3RydWN0IG13bF9hbXNkdV9mcmFnICphbXNkdV9mcmFn
Ow0KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2lu
Zm8gKnR4X2luZm87DQorCXN0cnVjdCBtd2xfdHhfY3RybCAqdHhfY3RybDsNCisJc3RydWN0IHNr
X2J1ZmZfaGVhZCAqYW1zZHVfcGt0czsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT50eHFbZGVz
Y19udW1dLmxvY2spOw0KKwlza2JfcXVldWVfd2Fsa19zYWZlKCZwcml2LT50eHFbZGVzY19udW1d
LCBza2IsIHRtcCkgew0KKwkJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsNCisJCXR4
X2N0cmwgPSAoc3RydWN0IG13bF90eF9jdHJsICopJnR4X2luZm8tPnN0YXR1czsNCisJCWlmICh0
eF9jdHJsLT5zdGEgPT0gc3RhKSB7DQorCQkJYW1zZHVfcGt0cyA9IChzdHJ1Y3Qgc2tfYnVmZl9o
ZWFkICopDQorCQkJCXR4X2N0cmwtPmFtc2R1X3BrdHM7DQorCQkJaWYgKGFtc2R1X3BrdHMpIHsN
CisJCQkJc2tiX3F1ZXVlX3B1cmdlKGFtc2R1X3BrdHMpOw0KKwkJCQlrZnJlZShhbXNkdV9wa3Rz
KTsNCisJCQl9DQorCQkJX19za2JfdW5saW5rKHNrYiwgJnByaXYtPnR4cVtkZXNjX251bV0pOw0K
KwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7DQorCQl9DQorCX0NCisJc3Bpbl91bmxvY2tfYmgo
JnByaXYtPnR4cVtkZXNjX251bV0ubG9jayk7DQorDQorCXNwaW5fbG9ja19iaCgmc3RhX2luZm8t
PmFtc2R1X2xvY2spOw0KKwlhbXNkdV9mcmFnID0gJnN0YV9pbmZvLT5hbXNkdV9jdHJsLmZyYWdb
ZGVzY19udW1dOw0KKwlpZiAoYW1zZHVfZnJhZy0+bnVtKSB7DQorCQlhbXNkdV9mcmFnLT5udW0g
PSAwOw0KKwkJYW1zZHVfZnJhZy0+Y3VyX3BvcyA9IE5VTEw7DQorCQlpZiAoYW1zZHVfZnJhZy0+
c2tiKSB7DQorCQkJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IoYW1zZHVfZnJhZy0+c2tiKTsN
CisJCQl0eF9jdHJsID0gKHN0cnVjdCBtd2xfdHhfY3RybCAqKSZ0eF9pbmZvLT5zdGF0dXM7DQor
CQkJYW1zZHVfcGt0cyA9IChzdHJ1Y3Qgc2tfYnVmZl9oZWFkICopDQorCQkJCXR4X2N0cmwtPmFt
c2R1X3BrdHM7DQorCQkJaWYgKGFtc2R1X3BrdHMpIHsNCisJCQkJc2tiX3F1ZXVlX3B1cmdlKGFt
c2R1X3BrdHMpOw0KKwkJCQlrZnJlZShhbXNkdV9wa3RzKTsNCisJCQl9DQorCQkJZGV2X2tmcmVl
X3NrYl9hbnkoYW1zZHVfZnJhZy0+c2tiKTsNCisJCX0NCisJfQ0KKwlzcGluX3VubG9ja19iaCgm
c3RhX2luZm8tPmFtc2R1X2xvY2spOw0KK30NCisNCit2b2lkIG13bF90eF9kb25lKHVuc2lnbmVk
IGxvbmcgZGF0YSkNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gKHN0cnVjdCBpZWVl
ODAyMTFfaHcgKilkYXRhOw0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJ
aW50IG51bTsNCisJc3RydWN0IG13bF9kZXNjX2RhdGEgKmRlc2M7DQorCXN0cnVjdCBtd2xfdHhf
aG5kbCAqdHhfaG5kbDsNCisJc3RydWN0IG13bF90eF9kZXNjICp0eF9kZXNjOw0KKwlzdHJ1Y3Qg
c2tfYnVmZiAqZG9uZV9za2I7DQorCXUzMiByYXRlOw0KKwlzdHJ1Y3QgbXdsX2RtYV9kYXRhICp0
cjsNCisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOw0KKwlzdHJ1Y3QgbXdsX3R4X2N0
cmwgKnR4X2N0cmw7DQorCXN0cnVjdCBza19idWZmX2hlYWQgKmFtc2R1X3BrdHM7DQorCWludCBo
ZHJsZW47DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+dHhfZGVzY19sb2NrKTsNCisJZm9yIChu
dW0gPSAwOyBudW0gPCBTWVNBRFBUX1RYX1dNTV9RVUVVRVM7IG51bSsrKSB7DQorCQlkZXNjID0g
JnByaXYtPmRlc2NfZGF0YVtudW1dOw0KKwkJdHhfaG5kbCA9IGRlc2MtPnBzdGFsZV90eF9obmRs
Ow0KKwkJdHhfZGVzYyA9IHR4X2huZGwtPnBkZXNjOw0KKw0KKwkJd2hpbGUgKHR4X2huZGwgJiYN
CisJCSAgICAgICAodHhfZGVzYy0+c3RhdHVzICYgY3B1X3RvX2xlMzIoRUFHTEVfVFhEX1NUQVRV
U19PSykpICYmDQorCQkgICAgICAgKCEodHhfZGVzYy0+c3RhdHVzICYNCisJCSAgICAgICBjcHVf
dG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0ZXX09XTkVEKSkpKSB7DQorCQkJcGNpX3VubWFwX3Np
bmdsZShwcml2LT5wZGV2LA0KKwkJCQkJIGxlMzJfdG9fY3B1KHR4X2Rlc2MtPnBrdF9wdHIpLA0K
KwkJCQkJIGxlMTZfdG9fY3B1KHR4X2Rlc2MtPnBrdF9sZW4pLA0KKwkJCQkJIFBDSV9ETUFfVE9E
RVZJQ0UpOw0KKwkJCWRvbmVfc2tiID0gdHhfaG5kbC0+cHNrX2J1ZmY7DQorCQkJcmF0ZSA9IGxl
MzJfdG9fY3B1KHR4X2Rlc2MtPnJhdGVfaW5mbyk7DQorCQkJdHhfZGVzYy0+cGt0X2xlbiA9IDA7
DQorCQkJdHhfZGVzYy0+c3RhdHVzID0NCisJCQkJY3B1X3RvX2xlMzIoRUFHTEVfVFhEX1NUQVRV
U19JRExFKTsNCisJCQl0eF9obmRsLT5wc2tfYnVmZiA9IE5VTEw7DQorCQkJd21iKCk7IC8qIG1l
bW9yeSBiYXJyaWVyICovDQorDQorCQkJc2tiX2dldChkb25lX3NrYik7DQorCQkJc2tiX3F1ZXVl
X3RhaWwoJnByaXYtPmRlbGF5X3EsIGRvbmVfc2tiKTsNCisJCQlpZiAoc2tiX3F1ZXVlX2xlbigm
cHJpdi0+ZGVsYXlfcSkgPg0KKwkJCSAgICBTWVNBRFBUX0RFTEFZX0ZSRUVfUV9MSU1JVCkNCisJ
CQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiX2RlcXVldWUoJnByaXYtPmRlbGF5X3EpKTsNCisNCisJ
CQl0ciA9IChzdHJ1Y3QgbXdsX2RtYV9kYXRhICopZG9uZV9za2ItPmRhdGE7DQorCQkJaW5mbyA9
IElFRUU4MDIxMV9TS0JfQ0IoZG9uZV9za2IpOw0KKw0KKwkJCWlmIChpZWVlODAyMTFfaXNfZGF0
YSh0ci0+d2guZnJhbWVfY29udHJvbCkgfHwNCisJCQkgICAgaWVlZTgwMjExX2lzX2RhdGFfcW9z
KHRyLT53aC5mcmFtZV9jb250cm9sKSkgew0KKwkJCQl0eF9jdHJsID0gKHN0cnVjdCBtd2xfdHhf
Y3RybCAqKSZpbmZvLT5zdGF0dXM7DQorCQkJCWFtc2R1X3BrdHMgPSAoc3RydWN0IHNrX2J1ZmZf
aGVhZCAqKQ0KKwkJCQkJdHhfY3RybC0+YW1zZHVfcGt0czsNCisJCQkJaWYgKGFtc2R1X3BrdHMp
IHsNCisJCQkJCW13bF90eF9hY2tfYW1zZHVfcGt0cyhodywgcmF0ZSwNCisJCQkJCQkJICAgICAg
YW1zZHVfcGt0cyk7DQorCQkJCQlkZXZfa2ZyZWVfc2tiX2FueShkb25lX3NrYik7DQorCQkJCQlk
b25lX3NrYiA9IE5VTEw7DQorCQkJCX0gZWxzZSB7DQorCQkJCQltd2xfdHhfcHJlcGFyZV9pbmZv
KGh3LCByYXRlLCBpbmZvKTsNCisJCQkJfQ0KKwkJCX0gZWxzZSB7DQorCQkJCW13bF90eF9wcmVw
YXJlX2luZm8oaHcsIDAsIGluZm8pOw0KKwkJCX0NCisNCisJCQlpZiAoZG9uZV9za2IpIHsNCisJ
CQkJLyogUmVtb3ZlIEgvVyBkbWEgaGVhZGVyICovDQorCQkJCWhkcmxlbiA9IGllZWU4MDIxMV9o
ZHJsZW4odHItPndoLmZyYW1lX2NvbnRyb2wpOw0KKwkJCQltZW1tb3ZlKHRyLT5kYXRhIC0gaGRy
bGVuLCAmdHItPndoLCBoZHJsZW4pOw0KKwkJCQlza2JfcHVsbChkb25lX3NrYiwgc2l6ZW9mKCp0
cikgLSBoZHJsZW4pOw0KKwkJCQlpbmZvLT5mbGFncyAmPSB+SUVFRTgwMjExX1RYX0NUTF9BTVBE
VTsNCisJCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOw0KKwkJCQlpZWVl
ODAyMTFfdHhfc3RhdHVzKGh3LCBkb25lX3NrYik7DQorCQkJfQ0KKw0KKwkJCXR4X2huZGwgPSB0
eF9obmRsLT5wbmV4dDsNCisJCQl0eF9kZXNjID0gdHhfaG5kbC0+cGRlc2M7DQorCQkJcHJpdi0+
ZndfZGVzY19jbnRbbnVtXS0tOw0KKwkJfQ0KKw0KKwkJZGVzYy0+cHN0YWxlX3R4X2huZGwgPSB0
eF9obmRsOw0KKwl9DQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT50eF9kZXNjX2xvY2spOw0KKw0K
KwlpZiAocHJpdi0+aXJxICE9IC0xKSB7DQorCQl1MzIgc3RhdHVzX21hc2s7DQorDQorCQlzdGF0
dXNfbWFzayA9IHJlYWRsKHByaXYtPmlvYmFzZTEgKw0KKwkJCQkgICAgTUFDUkVHX1JFR19BMkhf
SU5URVJSVVBUX1NUQVRVU19NQVNLKTsNCisJCXdyaXRlbChzdGF0dXNfbWFzayB8IE1BQ1JFR19B
MkhSSUNfQklUX1RYX0RPTkUsDQorCQkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdf
QTJIX0lOVEVSUlVQVF9TVEFUVVNfTUFTSyk7DQorDQorCQltd2xfdHhfc2ticyhodyk7DQorCX0N
CisNCisJcHJpdi0+aXNfdHhfc2NoZWR1bGUgPSBmYWxzZTsNCit9DQorDQordm9pZCBtd2xfdHhf
Zmx1c2hfYW1zZHUodW5zaWduZWQgbG9uZyBkYXRhKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9o
dyAqaHcgPSAoc3RydWN0IGllZWU4MDIxMV9odyAqKWRhdGE7DQorCXN0cnVjdCBtd2xfcHJpdiAq
cHJpdiA9IGh3LT5wcml2Ow0KKwl1MzIgc3RhdHVzX21hc2s7DQorCXN0cnVjdCBtd2xfc3RhICpz
dGFfaW5mbzsNCisJaW50IGk7DQorCXN0cnVjdCBtd2xfYW1zZHVfZnJhZyAqYW1zZHVfZnJhZzsN
CisNCisJc3Bpbl9sb2NrKCZwcml2LT5zdGFfbG9jayk7DQorCWxpc3RfZm9yX2VhY2hfZW50cnko
c3RhX2luZm8sICZwcml2LT5zdGFfbGlzdCwgbGlzdCkgew0KKwkJc3Bpbl9sb2NrKCZwcml2LT50
eF9kZXNjX2xvY2spOw0KKwkJc3Bpbl9sb2NrKCZzdGFfaW5mby0+YW1zZHVfbG9jayk7DQorCQlm
b3IgKGkgPSAwOyBpIDwgU1lTQURQVF9UWF9XTU1fUVVFVUVTOyBpKyspIHsNCisJCQlhbXNkdV9m
cmFnID0gJnN0YV9pbmZvLT5hbXNkdV9jdHJsLmZyYWdbaV07DQorCQkJaWYgKGFtc2R1X2ZyYWct
Pm51bSkgew0KKwkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLA0KKwkJCQkJICAgICAgIChhbXNk
dV9mcmFnLT5qaWZmaWVzICsgMSkpKSB7DQorCQkJCQlpZiAobXdsX3R4X2F2YWlsYWJsZShwcml2
LCBpKSkgew0KKwkJCQkJCW13bF90eF9za2IocHJpdiwgaSwNCisJCQkJCQkJICAgYW1zZHVfZnJh
Zy0+c2tiKTsNCisJCQkJCQlhbXNkdV9mcmFnLT5udW0gPSAwOw0KKwkJCQkJCWFtc2R1X2ZyYWct
PmN1cl9wb3MgPSBOVUxMOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3Bpbl91
bmxvY2soJnN0YV9pbmZvLT5hbXNkdV9sb2NrKTsNCisJCXNwaW5fdW5sb2NrKCZwcml2LT50eF9k
ZXNjX2xvY2spOw0KKwl9DQorCXNwaW5fdW5sb2NrKCZwcml2LT5zdGFfbG9jayk7DQorDQorCXN0
YXR1c19tYXNrID0gcmVhZGwocHJpdi0+aW9iYXNlMSArDQorCQkJICAgIE1BQ1JFR19SRUdfQTJI
X0lOVEVSUlVQVF9TVEFUVVNfTUFTSyk7DQorCXdyaXRlbChzdGF0dXNfbWFzayB8IE1BQ1JFR19B
MkhSSUNfQklUX1FVRV9FTVBUWSwNCisJICAgICAgIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVH
X0EySF9JTlRFUlJVUFRfU1RBVFVTX01BU0spOw0KKw0KKwlwcml2LT5pc19xZV9zY2hlZHVsZSA9
IGZhbHNlOw0KK30NCisNCit2b2lkIG13bF90eF9kZWxfc3RhX2Ftc2R1X3BrdHMoc3RydWN0IGll
ZWU4MDIxMV9zdGEgKnN0YSkNCit7DQorCXN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbyA9IG13bF9k
ZXZfZ2V0X3N0YShzdGEpOw0KKwlpbnQgbnVtOw0KKwlzdHJ1Y3QgbXdsX2Ftc2R1X2ZyYWcgKmFt
c2R1X2ZyYWc7DQorCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsNCisJc3RydWN0
IG13bF90eF9jdHJsICp0eF9jdHJsOw0KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICphbXNkdV9wa3Rz
Ow0KKw0KKwlzcGluX2xvY2tfYmgoJnN0YV9pbmZvLT5hbXNkdV9sb2NrKTsNCisJZm9yIChudW0g
PSAwOyBudW0gPCBTWVNBRFBUX1RYX1dNTV9RVUVVRVM7IG51bSsrKSB7DQorCQlhbXNkdV9mcmFn
ID0gJnN0YV9pbmZvLT5hbXNkdV9jdHJsLmZyYWdbbnVtXTsNCisJCWlmIChhbXNkdV9mcmFnLT5u
dW0pIHsNCisJCQlhbXNkdV9mcmFnLT5udW0gPSAwOw0KKwkJCWFtc2R1X2ZyYWctPmN1cl9wb3Mg
PSBOVUxMOw0KKwkJCWlmIChhbXNkdV9mcmFnLT5za2IpIHsNCisJCQkJdHhfaW5mbyA9IElFRUU4
MDIxMV9TS0JfQ0IoYW1zZHVfZnJhZy0+c2tiKTsNCisJCQkJdHhfY3RybCA9IChzdHJ1Y3QgbXds
X3R4X2N0cmwgKikNCisJCQkJCSZ0eF9pbmZvLT5zdGF0dXM7DQorCQkJCWFtc2R1X3BrdHMgPSAo
c3RydWN0IHNrX2J1ZmZfaGVhZCAqKQ0KKwkJCQkJdHhfY3RybC0+YW1zZHVfcGt0czsNCisJCQkJ
aWYgKGFtc2R1X3BrdHMpIHsNCisJCQkJCXNrYl9xdWV1ZV9wdXJnZShhbXNkdV9wa3RzKTsNCisJ
CQkJCWtmcmVlKGFtc2R1X3BrdHMpOw0KKwkJCQl9DQorCQkJCWRldl9rZnJlZV9za2JfYW55KGFt
c2R1X2ZyYWctPnNrYik7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXNwaW5fdW5sb2NrX2JoKCZzdGFf
aW5mby0+YW1zZHVfbG9jayk7DQorfQ0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNz
L21hcnZlbGwvbXdsd2lmaS90eC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3
aWZpL3R4LmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi5lZjFjN2M1DQot
LS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkv
dHguaA0KQEAgLTAsMCArMSwzNiBAQA0KKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUs
IE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuDQorICoNCisgKiBUaGlzIHNvZnR3YXJlIGZpbGUg
KHRoZSAiRmlsZSIpIGlzIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgSW50ZXJuYXRpb25hbA0KKyAq
IEx0ZC4gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBW
ZXJzaW9uIDIsIEp1bmUgMTk5MQ0KKyAqICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgdXNlLCBy
ZWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIEZpbGUgaW4NCisgKiBhY2NvcmRhbmNlIHdp
dGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBMaWNlbnNlLCBhIGNvcHkgb2Ygd2hp
Y2gNCisgKiBpcyBhdmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuDQorICoNCisgKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lU
SE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UN
CisgKiBBUkUgRVhQUkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRp
dGlvbmFsIGRldGFpbHMgYWJvdXQNCisgKiB0aGlzIHdhcnJhbnR5IGRpc2NsYWltZXIuDQorICov
DQorDQorLyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgZGVmaW5lcyB0cmFuc21pdCByZWxhdGVk
IGZ1bmN0aW9ucy4gKi8NCisNCisjaWZuZGVmIF90eF9oXw0KKyNkZWZpbmUgX3R4X2hfDQorDQor
aW50IG13bF90eF9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsNCit2b2lkIG13bF90eF9k
ZWluaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOw0KK3ZvaWQgbXdsX3R4X3htaXQoc3RydWN0
IGllZWU4MDIxMV9odyAqaHcsDQorCQkgc3RydWN0IGllZWU4MDIxMV90eF9jb250cm9sICpjb250
cm9sLA0KKwkJIHN0cnVjdCBza19idWZmICpza2IpOw0KK3ZvaWQgbXdsX3R4X2RlbF9wa3RzX3Zp
YV92aWYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjEx
X3ZpZiAqdmlmKTsNCit2b2lkIG13bF90eF9kZWxfcGt0c192aWFfc3RhKHN0cnVjdCBpZWVlODAy
MTFfaHcgKmh3LA0KKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7DQordm9pZCBt
d2xfdHhfZGVsX2FtcGR1X3BrdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJICAgc3Ry
dWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggdGlkKTsNCit2b2lkIG13bF90eF9kb25lKHVuc2ln
bmVkIGxvbmcgZGF0YSk7DQordm9pZCBtd2xfdHhfZmx1c2hfYW1zZHUodW5zaWduZWQgbG9uZyBk
YXRhKTsNCit2b2lkIG13bF90eF9kZWxfc3RhX2Ftc2R1X3BrdHMoc3RydWN0IGllZWU4MDIxMV9z
dGEgKnN0YSk7DQorDQorI2VuZGlmIC8qIF90eF9oXyAqLw0KLS0gDQoxLjkuMQ0KDQo=


2015-11-26 08:35:06

by David Lin

[permalink] [raw]
Subject: RE: [PATCH v7] Add new mac80211 driver mwlwifi.

PiBPbiBOb3ZlbWJlciAxMywgMjAxNSAzOjQ4IEFNLCBKZXMgU29yZW5zZW4gd3JvdGU6DQo+IA0K
PiBEYXZpZCBMaW4gPGRsaW5AbWFydmVsbC5jb20+IHdyaXRlczoNCj4gPiBUaGlzIHBhdGNoIHBy
b3ZpZGVzIHRoZSBtd2x3aWZpIGRyaXZlciBmb3IgTWFydmVsbCA4ODYzLCA4ODY0IGFuZCA4ODk3
DQo+ID4gY2hpcHNldHMuDQo+ID4gVGhpcyBkcml2ZXIgd2FzIGRldmVsb3BlZCBhcyBwYXJ0IG9m
IHRoZSBvcGVud3J0Lm9yZyBwcm9qZWN0IHRvDQo+ID4gc3VwcG9ydCBMaW5rc3lzIFdSVDE5MDBB
QyBhbmQgaXMgbWFpbnRhaW5lZCBvbg0KPiBodHRwczovL2dpdGh1Yi5jb20va2Fsb3ovbXdsd2lm
aS4NCj4gPg0KPiA+IFRoZSBtd2x3aWZpIGRyaXZlciBkaWZmZXJzIGZyb20gZXhpc3RpbmcgbXdp
ZmlleCBkcml2ZXI6DQo+ID4gbyBtd2x3aWZpIGlzIGEgInNvZnRtYWMgZHJpdmVyIiB1c2luZyB0
aGUga2VybmVsP+6ogyBtYWM4MDIuMTEgc3Vic3lzdGVtDQo+ID4gdG8gcHJvdmlkZSBmdWxsIEFQ
L1dpcmVsZXNzIEJyaWRnZSBmdW5jdGlvbmFsaXR5IChyb3V0ZXJzKS4NCj4gPiBvIG13aWZpZXgg
aXMgYSAiZnVsbG1hYyBkcml2ZXIiIHdoaWNoIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBzZXQg
b2YNCj4gPiBjbGllbnQgZnVuY3Rpb25zIChsYXB0b3BzL2VtYmVkZGVkIGRldmljZXMpIG8gb25s
eSBtd2x3aWZpIHN1cHBvcnRzDQo+ID4gTWFydmVsbCBBUCBjaGlwIDg4Nlggc2VyaWVzDQo+ID4N
Cj4gPiBOT1RFOiBVc2VycyB3aXRoIE1hcnZlbGwgODhXODg5NyBjaGlwc2V0cyBjdXJyZW50bHkg
c2hvdWxkIGVuYWJsZQ0KPiA+IChDT05GSUc9WSBvciBNKSBlaXRoZXIgQ09ORklHX01XSUZJRVgg
b3IgQ09ORklHX01XTFdJRkksIE5PVA0KPiBCT1RILg0KPiANCj4gSSBkaWRuJ3QgZ2V0IHZlcnkg
ZmFyIHJlYWRpbmcgdGhyb3VnaCB0aGlzIC0gYnV0IHRoZXJlIHdhcyBhIGZldyBiaXRzIHRoYXQg
c3Rvb2QNCj4gb3V0IGxpa2UgYSBzb3JlIHRodW1iLg0KPiANCj4gPiBtd2x3aWZpIGRyaXZlciBs
ZXZlcmFnZWQgY29kZSBmcm9tIGV4aXN0aW5nIE1XTDhLIGRyaXZlciBpbiB0aGUNCj4gPiBmb2xs
b3dpbmcgYXJlYXM6DQo+ID4gLSA4MDIuMTFuIHNldHRpbmcgZm9yIG1hYzgwMjExDQo+ID4gLSBG
dW5jdGlvbnMgbmVlZGVkIHRvIGhvb2sgdXAgdG8gbWFjODAyMTENCj4gPiAtIEludGVyYWN0aW9u
cyB3aXRoIG1hYzgwMjExIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQo+ID4gLSBQYXJ0aWFsIGZp
cm13YXJlIEFQSXMsIHNvbWUgZGF0YSBmaWVsZHMNCj4gPiAtIE1ldGhvZCB0byBwYXNzIFJ4IHBh
Y2tldHMgdG8gbWFjODAyMTEgZXhjZXB0IDExYWMgcmF0ZXMNCj4gPg0KPiA+IEluIGFkZGl0aW9u
LCBtd2x3aWZpIGRyaXZlciBzdXBwb3J0czoNCj4gPiAtIGZ1dHVyZSBzY2FsYWJpbGl0eSBhbmQg
ZnV0dXJlIGRldmVsb3BtZW50IChyZWZhY3RvcmVkIHNvdXJjZSBjb2RlKQ0KPiA+IC0gTWFydmVs
bCA4MDIuMTFhYyBjaGlwc2V0cywgaW5jbHVkaW5nIGNvbWJvIEJUIGRldmljZXMNCj4gPiAtIDgw
Mi4xMWFjIHJlbGF0ZWQgc2V0dGluZ3MgYW5kIGZ1bmN0aW9ucw0KPiA+IC0gY29uY3VycmVudCBB
UCtTVEEgZnVuY3Rpb25hbGl0aWVzIHdpdGggc2luZ2xlIGZpcm13YXJlIHBlciBjaGlwDQo+ID4g
LSBmaXJtd2FyZSBBUElzIGZvciB0aGUgc3VwcG9ydGVkIGNoaXBzZXQNCj4gPiAtIGNvbW11bmlj
YXRpbmcgbmV3IG1hYzgwMjExIHNldHRpbmdzIHRvIGZpcm13YXJlDQo+ID4gLSBEaWZmZXJlbnQg
VFgvUlggZGF0YXBhdGggd2hlcmUgYXBwbGljYWJsZQ0KPiA+IC0gQS1NU0RVIGFuZCBBLU1QRFUN
Cj4gPiAtIG1hYzgwMjExLWJhc2VkIE1FU0ggKHdvcmsgaW4gcHJvZ3Jlc3MpDQo+ID4gLSBSZWZp
bmVkIHRoZSBjb2RlIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQo+ID4NCj4gPiBOT1RFOiBNV0xX
SUZJIHdpbGwgYmUgb3JnYW5pemVkIHVuZGVyIG5ldyB2ZW5kb3Igc3BlY2lmaWMNCj4gPiBmb2xk
ZXIvbWFydmVsbCwgYXMgcGVyIHJlcXVlc3Qgb2YgdGhlIGdhdGUga2VlcGVyIGFuZCBjb21tdW5p
dHkuDQo+ID4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBMaW4gPGRsaW5AbWFydmVsbC5jb20+
DQo+ID4gLS0tDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVS
UyBpbmRleCAyN2IyN2MwLi43YzMyZjBhIDEwMDY0NA0KPiA+IC0tLSBhL01BSU5UQUlORVJTDQo+
ID4gKysrIGIvTUFJTlRBSU5FUlMNCj4gPiBAQCAtNjYyOSw2ICs2NjI5LDEyIEBAIEw6CWxpbnV4
LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZw0KPiA+ICBTOglPZGQgRml4ZXMNCj4gPiAgRjoJZHJp
dmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYw0KPiA+DQo+ID4gK01BUlZFTEwgTVdMV0lGSSBXSVJF
TEVTUyBEUklWRVINCj4gPiArTToJRGF2aWQgTGluIDxkbGluQG1hcnZlbGwuY29tPg0KPiA+ICtM
OglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcNCj4gPiArUzoJTWFpbnRhaW5lZA0KPiA+
ICtGOglkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkNCj4gPiArDQo+ID4gIE1B
UlZFTEwgU09DIE1NQy9TRC9TRElPIENPTlRST0xMRVIgRFJJVkVSDQo+ID4gIE06CU5pY29sYXMg
UGl0cmUgPG5pY29AZmx1eG5pYy5uZXQ+DQo+ID4gIFM6CU9kZCBGaXhlcw0KPiA+IGRpZmYgLS1n
aXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnDQo+ID4gYi9kcml2ZXJzL25ldC93aXJl
bGVzcy9LY29uZmlnIGluZGV4IGY5Zjk0MjIuLmQ1OTliMzUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJp
dmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZw0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNz
L0tjb25maWcNCj4gPiBAQCAtMjg1LDUgKzI4NSw2IEBAIHNvdXJjZSAiZHJpdmVycy9uZXQvd2ly
ZWxlc3MvemQxMjExcncvS2NvbmZpZyINCj4gPiAgc291cmNlICJkcml2ZXJzL25ldC93aXJlbGVz
cy9td2lmaWV4L0tjb25maWciDQo+ID4gIHNvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvY3cx
MjAwL0tjb25maWciDQo+ID4gIHNvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvcnNpL0tjb25m
aWciDQo+ID4gK3NvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9LY29uZmlnIg0K
PiA+DQo+ID4gIGVuZGlmICMgV0xBTg0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJl
bGVzcy9NYWtlZmlsZQ0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgaW5kZXgg
NzQwZmRkMy4uNzE1MDRhNyAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9N
YWtlZmlsZQ0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlDQo+ID4gQEAg
LTYwLDMgKzYwLDUgQEAgb2JqLSQoQ09ORklHX0JSQ01TTUFDKQkrPSBicmNtODAyMTEvDQo+ID4N
Cj4gPiAgb2JqLSQoQ09ORklHX0NXMTIwMCkJKz0gY3cxMjAwLw0KPiA+ICBvYmotJChDT05GSUdf
UlNJXzkxWCkJKz0gcnNpLw0KPiA+ICsNCj4gPiArb2JqLSQoQ09ORklHX1dMX01BUlZFTEwpCSs9
IG1hcnZlbGwvDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwv
S2NvbmZpZw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9LY29uZmlnDQo+ID4g
bmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi5kNzNlNjQyDQo+ID4gLS0t
IC9kZXYvbnVsbA0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvS2NvbmZp
Zw0KPiA+IEBAIC0wLDAgKzEsOCBAQA0KPiA+ICttZW51Y29uZmlnIFdMX01BUlZFTEwNCj4gPiAr
CWJvb2wgIk1hcnZlbGwgV2lyZWxlc3MgTEFOIHN1cHBvcnQiDQo+ID4gKwktLS1oZWxwLS0tDQo+
ID4gKwkgIEVuYWJsZSBjb21tdW5pdHkgZHJpdmVycyBmb3IgTWFydmVsbCBXaS1GaSBkZXZpY2Vz
Lg0KPiA+ICsNCj4gPiAraWYgV0xfTUFSVkVMTA0KPiA+ICtzb3VyY2UgImRyaXZlcnMvbmV0L3dp
cmVsZXNzL21hcnZlbGwvbXdsd2lmaS9LY29uZmlnIg0KPiA+ICtlbmRpZiAjIFdMX01BUlZFTEwN
Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9NYWtlZmlsZQ0K
PiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9NYWtlZmlsZQ0KPiA+IG5ldyBmaWxl
IG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4uNzBkMWIzZg0KPiA+IC0tLSAvZGV2L251
bGwNCj4gPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL01ha2VmaWxlDQo+ID4g
QEAgLTAsMCArMSBAQA0KPiA+ICtvYmotJChDT05GSUdfTVdMV0lGSSkJKz0gbXdsd2lmaS8NCj4g
PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL0tjb25m
aWcNCj4gPiBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9LY29uZmlnDQo+
ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi5hOWJjYjljDQo+ID4g
LS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXds
d2lmaS9LY29uZmlnDQo+ID4gQEAgLTAsMCArMSwyMyBAQA0KPiA+ICtjb25maWcgTVdMV0lGSQ0K
PiA+ICsgdHJpc3RhdGUgIk1hcnZlbGwgQXZhc3RhciA4OFc4ODY0Lzg4Vzg4OTcgUENJZSBkcml2
ZXIgKG1hYzgwMjExDQo+ID4gY29tcGF0aWJsZSkiDQo+ID4gKwlkZXBlbmRzIG9uIFBDSSAmJiBN
QUM4MDIxMQ0KPiA+ICsJc2VsZWN0IEZXX0xPQURFUg0KPiA+ICsJLS0taGVscC0tLQ0KPiA+ICsJ
CVNlbGVjdCB0byBidWlsZCB0aGUgZHJpdmVyIHN1cHBvcnRpbmcgdGhlOg0KPiA+ICsNCj4gPiAr
CQlNYXJ2ZWxsIFdpcmVsZXNzIFdpLUZpIDg4Vzg4NjQgbW9kdWxlcw0KPiA+ICsJCU1hcnZlbGwg
V2lyZWxlc3MgV2ktRmkgODhXODg5NyBtb2R1bGVzDQo+ID4gKw0KPiA+ICsJCVRoaXMgZHJpdmVy
IHVzZXMgdGhlIGtlcm5lbCdzIG1hYzgwMjExIHN1YnN5c3RlbS4NCj4gPiArDQo+ID4gKyBJZiB5
b3Ugd2FudCB0byBjb21waWxlIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUgKD0gY29kZSB3aGljaCBj
YW4gYmUNCj4gPiAraW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJu
ZWwgd2hlbmV2ZXIgeW91IHdhbnQpLA0KPiA+ICtzYXkgTSBoZXJlIGFuZCByZWFkIDxmaWxlOkRv
Y3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4gIFRoZQ0KPiA+ICsJCW1vZHVsZSB3aWxs
IGJlIGNhbGxlZCBtd2x3aWZpLg0KPiA+ICsNCj4gPiArIE5PVEU6IFNlbGVjdGluZyB0aGlzIGRy
aXZlciBtYXkgY2F1c2UgY29uZmxpY3Qgd2l0aCBNV0lGSUVYIGRyaXZlcg0KPiA+ICsJCXRoYXQg
YWxzbyBvcGVyYXRlcyBvbiB0aGUgc2FtZSBwYXJ0IG51bWJlciA4OFc4ODk3LiBVc2VycyBzaG91
bGQNCj4gPiArCQlzZWxlY3QgZWl0aGVyIE1XSUZJRVggb3IgTVdMV0lGSSwgbm90IGJvdGguIE1X
SUZJRVggaXMgZnVsbG1hYywNCj4gPiArc3VwcG9ydGluZyBtb3JlIGNvbXByZWhlbnNpdmUgY2xp
ZW50IGZ1bmN0aW9ucyBmb3IgbGFwdG9wcy9lbWJlZGRlZA0KPiA+ICsJCWRldmljZXMuIE1XTFdJ
RkkgaXMgbWFjODAyMTEtYmFzZWQgZm9yIGZ1bGwgQVAvV2lyZWxlc3MgQnJpZGdlLg0KPiA+ICsN
Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL01h
a2VmaWxlDQo+ID4gYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvTWFrZWZp
bGUNCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAuLjg4ZjdlZmQN
Cj4gPiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVs
bC9td2x3aWZpL01ha2VmaWxlDQo+ID4gQEAgLTAsMCArMSwxMiBAQA0KPiA+ICtvYmotJChDT05G
SUdfTVdMV0lGSSkJKz0gbXdsd2lmaS5vDQo+ID4gKw0KPiA+ICttd2x3aWZpLW9ianMJCSs9IG1h
aW4ubw0KPiA+ICttd2x3aWZpLW9ianMJCSs9IG1hYzgwMjExLm8NCj4gPiArbXdsd2lmaS1vYmpz
CQkrPSBmd2RsLm8NCj4gPiArbXdsd2lmaS1vYmpzCQkrPSBmd2NtZC5vDQo+ID4gK213bHdpZmkt
b2JqcwkJKz0gdHgubw0KPiA+ICttd2x3aWZpLW9ianMJCSs9IHJ4Lm8NCj4gPiArbXdsd2lmaS1v
YmpzCQkrPSBpc3Iubw0KPiA+ICttd2x3aWZpLSQoQ09ORklHX0RFQlVHX0ZTKSArPSBkZWJ1Z2Zz
Lm8NCj4gPiArDQo+ID4gK2NjZmxhZ3MteSArPSAtRF9fQ0hFQ0tfRU5ESUFOX18NCj4gPiBkaWZm
IC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2RlYnVnZnMuYw0K
PiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2RlYnVnZnMuYw0KPiA+
IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4uOTk3NDYxYQ0KPiA+IC0t
LSAvZGV2L251bGwNCj4gPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdp
ZmkvZGVidWdmcy5jDQo+ID4gQEAgLTAsMCArMSw0MzMgQEANCj4gPiArLyoNCj4gPiArICogQ29w
eXJpZ2h0IChDKSAyMDA2LTIwMTUsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuDQo+ID4gKyAq
DQo+ID4gKyAqIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQg
YnkgTWFydmVsbA0KPiA+ICtJbnRlcm5hdGlvbmFsDQo+ID4gKyAqIEx0ZC4gdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsDQo+ID4gK0p1
bmUgMTk5MQ0KPiA+ICsgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0cmli
dXRlIGFuZC9vciBtb2RpZnkgdGhpcw0KPiA+ICtGaWxlIGluDQo+ID4gKyAqIGFjY29yZGFuY2Ug
d2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2UsIGEgY29weSBvZg0K
PiA+ICt3aGljaA0KPiA+ICsgKiBpcyBhdmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+ID4gKyAqDQo+ID4gKyAqIFRIRSBGSUxFIElTIERJ
U1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQNCj4gPiAr
VEhFDQo+ID4gKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklU
TkVTUyBGT1IgQQ0KPiBQQVJUSUNVTEFSDQo+ID4gK1BVUlBPU0UNCj4gPiArICogQVJFIEVYUFJF
U1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxz
DQo+ID4gK2Fib3V0DQo+ID4gKyAqIHRoaXMgd2FycmFudHkgZGlzY2xhaW1lci4NCj4gPiArICov
DQo+ID4gKw0KPiA+ICsvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRlYnVn
IGZzIHJlbGF0ZWQgZnVuY3Rpb25zLiAqLw0KPiA+ICsNCj4gPiArI2luY2x1ZGUgPGxpbnV4L2Rl
YnVnZnMuaD4NCj4gPiArDQo+ID4gKyNpbmNsdWRlICJzeXNhZHB0LmgiDQo+ID4gKyNpbmNsdWRl
ICJkZXYuaCINCj4gPiArI2luY2x1ZGUgImhvc3RjbWQuaCINCj4gPiArI2luY2x1ZGUgImZ3Y21k
LmgiDQo+ID4gKyNpbmNsdWRlICJkZWJ1Z2ZzLmgiDQo+ID4gKw0KPiA+ICsjZGVmaW5lIE1XTFdJ
RklfREVCVUdGU19BRERfRklMRShuYW1lKSBkbyB7IFwNCj4gPiArCWlmICghZGVidWdmc19jcmVh
dGVfZmlsZSgjbmFtZSwgMDY0NCwgcHJpdi0+ZGVidWdmc19waHksIFwNCj4gPiArCQkJCSBwcml2
LCAmbXdsX2RlYnVnZnNfIyNuYW1lIyNfZm9wcykpIFwNCj4gPiArCQlyZXR1cm47IFwNCj4gPiAr
fSB3aGlsZSAoMCkNCj4gDQo+IFRoaXMgbWFjcm9zIHJlbGllcyBvbiBpbXBsaWNpdCBhcmd1bWVu
dHMgd2hpY2ggaXMganVzdCBiYWQgYW5kIGRvZXNuJ3QgcmVhbGx5DQo+IGRvIGFueXRoaW5nIGV4
Y2VwdCBmb3Igb2JmdXNjYXRpbmcgdGhlIGNvZGUuDQo+IA0KDQpUaGFua3MgZm9yIGZlZWRiYWNr
LiBUaGVzZSBjb2RlcyBhcmUgbGV2ZXJhZ2VkIGZyb20gZXhpc3RpbmcgbXdpZmlleCBkcml2ZXIg
Zm9yIGNvbnNpc3RlbmN5LiBQbGVhc2Uga2luZGx5IGFjY2VwdCBpdCBhcyBpcyBub3csIGFuZCBJ
IHdpbGwgaW5pdGlhdGUgYSB0YXNrIHRvIGRpc2N1c3Mgd2l0aCBtd2lmaWV4IG1haW50YWluZXIg
YWJvdXQgdGhpcyBjb21tZW50LiBUaGVuIHdlIHdpbGwgY29tZSBiYWNrIHdpdGggc3VnZ2VzdGlv
bi9jaGFuZ2UuDQoNCj4gPiArI2RlZmluZSBNV0xXSUZJX0RFQlVHRlNfRklMRV9PUFMobmFtZSkg
XCBzdGF0aWMgY29uc3Qgc3RydWN0DQo+ID4gK2ZpbGVfb3BlcmF0aW9ucyBtd2xfZGVidWdmc18j
I25hbWUjI19mb3BzID0geyBcDQo+ID4gKwkucmVhZCA9IG13bF9kZWJ1Z2ZzXyMjbmFtZSMjX3Jl
YWQsIFwNCj4gPiArCS53cml0ZSA9IG13bF9kZWJ1Z2ZzXyMjbmFtZSMjX3dyaXRlLCBcDQo+ID4g
Kwkub3BlbiA9IHNpbXBsZV9vcGVuLCBcDQo+ID4gK30NCj4gPiArDQo+ID4gKyNkZWZpbmUgTVdM
V0lGSV9ERUJVR0ZTX0ZJTEVfUkVBRF9PUFMobmFtZSkgXCBzdGF0aWMgY29uc3Qgc3RydWN0DQo+
ID4gK2ZpbGVfb3BlcmF0aW9ucyBtd2xfZGVidWdmc18jI25hbWUjI19mb3BzID0geyBcDQo+ID4g
KwkucmVhZCA9IG13bF9kZWJ1Z2ZzXyMjbmFtZSMjX3JlYWQsIFwNCj4gPiArCS5vcGVuID0gc2lt
cGxlX29wZW4sIFwNCj4gPiArfQ0KPiA+ICsNCj4gPiArI2RlZmluZSBNV0xXSUZJX0RFQlVHRlNf
RklMRV9XUklURV9PUFMobmFtZSkgXCBzdGF0aWMgY29uc3Qgc3RydWN0DQo+ID4gK2ZpbGVfb3Bl
cmF0aW9ucyBtd2xfZGVidWdmc18jI25hbWUjI19mb3BzID0geyBcDQo+ID4gKwkud3JpdGUgPSBt
d2xfZGVidWdmc18jI25hbWUjI193cml0ZSwgXA0KPiA+ICsJLm9wZW4gPSBzaW1wbGVfb3Blbiwg
XA0KPiA+ICt9DQo+IA0KPiBBZ2FpbiBoZXJlIC0geW91IHVzZSB0aGllc2Ugd3JhcHBlcnMgb25j
ZSwganVzdCBkZWNsYXJlIHRoZSBzdHJ1Y3RzIGV4cGxpY2l0bHkNCj4gcmF0aGVyIHRoYW4gdGhp
cyBtYWNybyB3cmFwcGluZyBkYW5jZS4NCj4gDQoNClRoYW5rcyBmb3IgZmVlZGJhY2suIFRoZXNl
IGNvZGVzIGFyZSBsZXZlcmFnZWQgZnJvbSBleGlzdGluZyBtd2lmaWV4IGRyaXZlciBmb3IgY29u
c2lzdGVuY3kuIFBsZWFzZSBraW5kbHkgYWNjZXB0IGl0IGFzIGlzIG5vdywgYW5kIEkgd2lsbCBp
bml0aWF0ZSBhIHRhc2sgdG8gZGlzY3VzcyB3aXRoIG13aWZpZXggbWFpbnRhaW5lciBhYm91dCB0
aGlzIGNvbW1lbnQuIFRoZW4gd2Ugd2lsbCBjb21lIGJhY2sgd2l0aCBzdWdnZXN0aW9uL2NoYW5n
ZS4NCg0KPiA+ICtzdGF0aWMgaW50IHByaW50X21hY19hZGRyKGNoYXIgKnAsIHU4ICptYWNfYWRk
cikgew0KPiA+ICsJaW50IGk7DQo+ID4gKwljaGFyICpzdHIgPSBwOw0KPiA+ICsNCj4gPiArCXN0
ciArPSBzcHJpbnRmKHN0ciwgIm1hYyBhZGRyZXNzOiAlMDJ4IiwgbWFjX2FkZHJbMF0pOw0KPiA+
ICsJZm9yIChpID0gMTsgaSA8IEVUSF9BTEVOOyBpKyspDQo+ID4gKwkJc3RyICs9IHNwcmludGYo
c3RyLCAiOiUwMngiLCBtYWNfYWRkcltpXSk7DQo+ID4gKwlzdHIgKz0gc3ByaW50ZihzdHIsICJc
biIpOw0KPiA+ICsNCj4gPiArCXJldHVybiAoc3RyIC0gcCk7DQo+ID4gK30NCj4gPiArDQo+ID4g
K3N0YXRpYyBpbnQgZHVtcF9kYXRhKGNoYXIgKnAsIHU4ICpkYXRhLCBpbnQgbGVuLCBjaGFyICp0
aXRsZSkgew0KPiA+ICsJY2hhciAqc3RyID0gcDsNCj4gPiArCWludCBjdXJfYnl0ZSA9IDA7DQo+
ID4gKwlpbnQgaTsNCj4gPiArDQo+ID4gKwlzdHIgKz0gc3ByaW50ZihzdHIsICIlc1xuIiwgdGl0
bGUpOw0KPiA+ICsJZm9yIChjdXJfYnl0ZSA9IDA7IGN1cl9ieXRlIDwgbGVuOyBjdXJfYnl0ZSAr
PSA4KSB7DQo+ID4gKwkJaWYgKChjdXJfYnl0ZSArIDgpIDwgbGVuKSB7DQo+ID4gKwkJCWZvciAo
aSA9IDA7IGkgPCA4OyBpKyspDQo+ID4gKwkJCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwMngg
IiwNCj4gPiArCQkJCQkgICAgICAgKihkYXRhICsgY3VyX2J5dGUgKyBpKSk7DQo+ID4gKwkJCXN0
ciArPSBzcHJpbnRmKHN0ciwgIlxuIik7DQo+ID4gKwkJfSBlbHNlIHsNCj4gPiArCQkJZm9yIChp
ID0gMDsgaSA8IChsZW4gLSBjdXJfYnl0ZSk7IGkrKykNCj4gPiArCQkJCXN0ciArPSBzcHJpbnRm
KHN0ciwgIjB4JTAyeCAiLA0KPiA+ICsJCQkJCSAgICAgICAqKGRhdGEgKyBjdXJfYnl0ZSArIGkp
KTsNCj4gPiArCQkJc3RyICs9IHNwcmludGYoc3RyLCAiXG4iKTsNCj4gPiArCQkJYnJlYWs7DQo+
ID4gKwkJfQ0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVybiAoc3RyIC0gcCk7DQo+ID4gK30N
Cj4gPiArDQo+ID4gK3N0YXRpYyBzc2l6ZV90IG13bF9kZWJ1Z2ZzX2luZm9fcmVhZChzdHJ1Y3Qg
ZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gKwkJCQkgICAgIHNpemVfdCBjb3Vu
dCwgbG9mZl90ICpwcG9zKQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSAo
c3RydWN0IG13bF9wcml2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOw0KPiA+ICsJdW5zaWduZWQgbG9u
ZyBwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOw0KPiA+ICsJY2hhciAqcCA9IChj
aGFyICopcGFnZTsNCj4gPiArCXNzaXplX3QgcmV0Ow0KPiA+ICsNCj4gPiArCWlmICghcCkNCj4g
PiArCQlyZXR1cm4gLUVOT01FTTsNCj4gPiArDQo+ID4gKwlwICs9IHNwcmludGYocCwgIlxuIik7
DQo+ID4gKwlwICs9IHNwcmludGYocCwgImRyaXZlciBuYW1lOiAlc1xuIiwgTVdMX0RSVl9OQU1F
KTsNCj4gPiArCXAgKz0gc3ByaW50ZihwLCAiY2hpcCB0eXBlOiAlc1xuIiwNCj4gPiArCQkgICAg
IChwcml2LT5jaGlwX3R5cGUgPT0gTVdMODg2NCkgPyAiODhXODg2NCIgOiAiODhXODg5NyIpOw0K
PiA+ICsJcCArPSBzcHJpbnRmKHAsICJodyB2ZXJzaW9uOiAlWFxuIiwgcHJpdi0+aHdfZGF0YS5o
d192ZXJzaW9uKTsNCj4gPiArCXAgKz0gc3ByaW50ZihwLCAiZHJpdmVyIHZlcnNpb246ICVzXG4i
LCBNV0xfRFJWX1ZFUlNJT04pOw0KPiA+ICsJcCArPSBzcHJpbnRmKHAsICJmaXJtd2FyZSB2ZXJz
aW9uOiAweCUwOHhcbiIsDQo+ID4gKwkJICAgICBwcml2LT5od19kYXRhLmZ3X3JlbGVhc2VfbnVt
KTsNCj4gPiArCXAgKz0gcHJpbnRfbWFjX2FkZHIocCwgcHJpdi0+aHdfZGF0YS5tYWNfYWRkcik7
DQo+ID4gKwlwICs9IHNwcmludGYocCwgIjJnOiAlc1xuIiwgcHJpdi0+ZGlzYWJsZV8yZyA/ICJk
aXNhYmxlIiA6ICJlbmFibGUiKTsNCj4gPiArCXAgKz0gc3ByaW50ZihwLCAiNWc6ICVzXG4iLCBw
cml2LT5kaXNhYmxlXzVnID8gImRpc2FibGUiIDogImVuYWJsZSIpOw0KPiA+ICsJcCArPSBzcHJp
bnRmKHAsICJhbnRlbm5hOiAlZCAlZFxuIiwNCj4gPiArCQkgICAgIChwcml2LT5hbnRlbm5hX3R4
ID09IEFOVEVOTkFfVFhfNF9BVVRPKSA/IDQgOiAyLA0KPiA+ICsJCSAgICAgKHByaXYtPmFudGVu
bmFfcnggPT0gQU5URU5OQV9UWF80X0FVVE8pID8gNCA6IDIpOw0KPiA+ICsJcCArPSBzcHJpbnRm
KHAsICJpcnEgbnVtYmVyOiAlZFxuIiwgcHJpdi0+aXJxKTsNCj4gPiArCXAgKz0gc3ByaW50Zihw
LCAiaW9iYXNlMDogJXBcbiIsIHByaXYtPmlvYmFzZTApOw0KPiA+ICsJcCArPSBzcHJpbnRmKHAs
ICJpb2Jhc2UxOiAlcFxuIiwgcHJpdi0+aW9iYXNlMSk7DQo+ID4gKwlwICs9IHNwcmludGYocCwg
InR4IGxpbWl0OiAlZFxuIiwgcHJpdi0+dHhxX2xpbWl0KTsNCj4gPiArCXAgKz0gc3ByaW50Zihw
LCAicnggbGltaXQ6ICVkXG4iLCBwcml2LT5yZWN2X2xpbWl0KTsNCj4gPiArCXAgKz0gc3ByaW50
ZihwLCAiYXAgbWFjaWQgc3VwcG9ydDogJTA4eFxuIiwNCj4gPiArCQkgICAgIHByaXYtPmFwX21h
Y2lkc19zdXBwb3J0ZWQpOw0KPiA+ICsJcCArPSBzcHJpbnRmKHAsICJzdGEgbWFjaWQgc3VwcG9y
dDogJTA4eFxuIiwNCj4gPiArCQkgICAgIHByaXYtPnN0YV9tYWNpZHNfc3VwcG9ydGVkKTsNCj4g
PiArCXAgKz0gc3ByaW50ZihwLCAibWFjaWQgdXNlZDogJTA4eFxuIiwgcHJpdi0+bWFjaWRzX3Vz
ZWQpOw0KPiA+ICsJcCArPSBzcHJpbnRmKHAsICJtZmcgbW9kZTogJXNcbiIsIHByaXYtPm1mZ19t
b2RlID8gInRydWUiIDogImZhbHNlIik7DQo+ID4gKwlwICs9IHNwcmludGYocCwgIlxuIik7DQo+
ID4gKw0KPiA+ICsJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY291bnQsIHBw
b3MsIChjaGFyICopcGFnZSwNCj4gPiArCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKXAgLSBwYWdl
KTsNCj4gPiArCWZyZWVfcGFnZShwYWdlKTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gcmV0Ow0KPiA+
ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgc3NpemVfdCBtd2xfZGVidWdmc192aWZfcmVhZChzdHJ1
Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gKwkJCQkgICAgc2l6ZV90IGNv
dW50LCBsb2ZmX3QgKnBwb3MpDQo+ID4gK3sNCj4gPiArCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9
IChzdHJ1Y3QgbXdsX3ByaXYgKilmaWxlLT5wcml2YXRlX2RhdGE7DQo+ID4gKwl1bnNpZ25lZCBs
b25nIHBhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7DQo+ID4gKwljaGFyICpwID0g
KGNoYXIgKilwYWdlOw0KPiA+ICsJc3RydWN0IG13bF92aWYgKm13bF92aWY7DQo+ID4gKwlzdHJ1
Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOw0KPiA+ICsJY2hhciBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJ
RF9MRU4gKyAxXTsNCj4gPiArCXNzaXplX3QgcmV0Ow0KPiA+ICsNCj4gPiArCWlmICghcCkNCj4g
PiArCQlyZXR1cm4gLUVOT01FTTsNCj4gPiArDQo+ID4gKwlwICs9IHNwcmludGYocCwgIlxuIik7
DQo+ID4gKwlzcGluX2xvY2tfYmgoJnByaXYtPnZpZl9sb2NrKTsNCj4gPiArCWxpc3RfZm9yX2Vh
Y2hfZW50cnkobXdsX3ZpZiwgJnByaXYtPnZpZl9saXN0LCBsaXN0KSB7DQo+ID4gKwkJdmlmID0g
Y29udGFpbmVyX29mKChjaGFyICopbXdsX3ZpZiwgc3RydWN0IGllZWU4MDIxMV92aWYsDQo+ID4g
KwkJCQkgICBkcnZfcHJpdlswXSk7DQo+ID4gKwkJcCArPSBzcHJpbnRmKHAsICJtYWNpZDogJWRc
biIsIG13bF92aWYtPm1hY2lkKTsNCj4gPiArCQlzd2l0Y2ggKHZpZi0+dHlwZSkgew0KPiA+ICsJ
CWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6DQo+ID4gKwkJCXAgKz0gc3ByaW50ZihwLCAidHlwZTog
YXBcbiIpOw0KPiA+ICsJCQltZW1jcHkoc3NpZCwgdmlmLT5ic3NfY29uZi5zc2lkLA0KPiA+ICsJ
CQkgICAgICAgdmlmLT5ic3NfY29uZi5zc2lkX2xlbik7DQo+ID4gKwkJCXNzaWRbdmlmLT5ic3Nf
Y29uZi5zc2lkX2xlbl0gPSAwOw0KPiA+ICsJCQlwICs9IHNwcmludGYocCwgInNzaWQ6ICVzXG4i
LCBzc2lkKTsNCj4gPiArCQkJcCArPSBwcmludF9tYWNfYWRkcihwLCBtd2xfdmlmLT5ic3NpZCk7
DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoN
Cj4gPiArCQkJcCArPSBzcHJpbnRmKHAsICJ0eXBlOiBtZXNoXG4iKTsNCj4gPiArCQkJcCArPSBw
cmludF9tYWNfYWRkcihwLCBtd2xfdmlmLT5ic3NpZCk7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJ
CWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoNCj4gPiArCQkJcCArPSBzcHJpbnRmKHAsICJ0
eXBlOiBzdGFcbiIpOw0KPiA+ICsJCQlwICs9IHByaW50X21hY19hZGRyKHAsIG13bF92aWYtPnN0
YV9tYWMpOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQlkZWZhdWx0Og0KPiA+ICsJCQlwICs9IHNw
cmludGYocCwgInR5cGU6IHVua25vd25cbiIpOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQl9DQo+
ID4gKwkJcCArPSBzcHJpbnRmKHAsICJod19jcnlwdG9fZW5hYmxlZDogJXNcbiIsDQo+ID4gKwkJ
CSAgICAgbXdsX3ZpZi0+aXNfaHdfY3J5cHRvX2VuYWJsZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsN
Cj4gPiArCQlwICs9IHNwcmludGYocCwgImtleSBpZHg6ICVkXG4iLCBtd2xfdmlmLT5rZXlpZHgp
Ow0KPiA+ICsJCXAgKz0gc3ByaW50ZihwLCAiSVY6ICUwOHglMDR4XG4iLCBtd2xfdmlmLT5pdjMy
LCBtd2xfdmlmLT5pdjE2KTsNCj4gPiArCQlwICs9IGR1bXBfZGF0YShwLCBtd2xfdmlmLT5iZWFj
b25faW5mby5pZV93bW1fcHRyLA0KPiA+ICsJCQkgICAgICAgbXdsX3ZpZi0+YmVhY29uX2luZm8u
aWVfd21tX2xlbiwgIldNTToiKTsNCj4gPiArCQlwICs9IGR1bXBfZGF0YShwLCBtd2xfdmlmLT5i
ZWFjb25faW5mby5pZV9yc25fcHRyLA0KPiA+ICsJCQkgICAgICAgbXdsX3ZpZi0+YmVhY29uX2lu
Zm8uaWVfcnNuX2xlbiwgIlJTTjoiKTsNCj4gPiArCQlwICs9IGR1bXBfZGF0YShwLCBtd2xfdmlm
LT5iZWFjb25faW5mby5pZV9yc240OF9wdHIsDQo+ID4gKwkJCSAgICAgICBtd2xfdmlmLT5iZWFj
b25faW5mby5pZV9yc240OF9sZW4sICJSU040ODoiKTsNCj4gPiArCQlwICs9IGR1bXBfZGF0YShw
LCBtd2xfdmlmLT5iZWFjb25faW5mby5pZV9odF9wdHIsDQo+ID4gKwkJCSAgICAgICBtd2xfdmlm
LT5iZWFjb25faW5mby5pZV9odF9sZW4sICJIVDoiKTsNCj4gPiArCQlwICs9IGR1bXBfZGF0YShw
LCBtd2xfdmlmLT5iZWFjb25faW5mby5pZV92aHRfcHRyLA0KPiA+ICsJCQkgICAgICAgbXdsX3Zp
Zi0+YmVhY29uX2luZm8uaWVfdmh0X2xlbiwgIlZIVDoiKTsNCj4gPiArCQlwICs9IHNwcmludGYo
cCwgIlxuIik7DQo+ID4gKwl9DQo+ID4gKwlzcGluX3VubG9ja19iaCgmcHJpdi0+dmlmX2xvY2sp
Ow0KPiANCj4gSSBob3BlIHRoZXJlIGlzIG5vIHdheSB0aGF0IHRoZSBudW1iZXIgb2YgdmlmcyBj
YW4gZ2V0IHRvIHRoZSBwb2ludCB3aGVyZSB5b3UNCj4gb3ZlcmZsb3cgdGhlIHBhZ2UgYWxsb2Nh
dGVkIHNpbmNlIHRoZXJlIGlzIG5vIGNhcCBvbiB0aGUNCj4gc3ByaW50ZigpIHVzYWdlIGluIGR1
bXBfZGF0YSgpLg0KPiANCg0KSSB3aWxsIG1vZGlmeSBpdC4NCg0KPiA+ICsNCj4gPiArTVdMV0lG
SV9ERUJVR0ZTX0ZJTEVfUkVBRF9PUFMoaW5mbyk7DQo+ID4gK01XTFdJRklfREVCVUdGU19GSUxF
X1JFQURfT1BTKHZpZik7DQo+ID4gK01XTFdJRklfREVCVUdGU19GSUxFX1JFQURfT1BTKHN0YSk7
DQo+ID4gK01XTFdJRklfREVCVUdGU19GSUxFX1JFQURfT1BTKGFtcGR1KTsNCj4gPiArTVdMV0lG
SV9ERUJVR0ZTX0ZJTEVfT1BTKHJlZ3Jkd3IpOw0KPiA+ICsNCj4gPiArdm9pZCBtd2xfZGVidWdm
c19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KSB7DQo+ID4gKwlzdHJ1Y3QgbXdsX3ByaXYg
KnByaXYgPSBody0+cHJpdjsNCj4gPiArDQo+ID4gKwlpZiAoIXByaXYtPmRlYnVnZnNfcGh5KQ0K
PiA+ICsJCXByaXYtPmRlYnVnZnNfcGh5ID0gZGVidWdmc19jcmVhdGVfZGlyKCJtd2x3aWZpIiwN
Cj4gPiArCQkJCQkJICAgICAgIGh3LT53aXBoeS0+ZGVidWdmc2Rpcik7DQo+ID4gKw0KPiA+ICsJ
aWYgKCFwcml2LT5kZWJ1Z2ZzX3BoeSkNCj4gPiArCQlyZXR1cm47DQo+ID4gKw0KPiA+ICsJTVdM
V0lGSV9ERUJVR0ZTX0FERF9GSUxFKGluZm8pOw0KPiA+ICsJTVdMV0lGSV9ERUJVR0ZTX0FERF9G
SUxFKHZpZik7DQo+ID4gKwlNV0xXSUZJX0RFQlVHRlNfQUREX0ZJTEUoc3RhKTsNCj4gPiArCU1X
TFdJRklfREVCVUdGU19BRERfRklMRShhbXBkdSk7DQo+ID4gKwlNV0xXSUZJX0RFQlVHRlNfQURE
X0ZJTEUocmVncmR3cik7DQo+ID4gK30NCj4gPiArDQo+ID4gK3ZvaWQgbXdsX2RlYnVnZnNfcmVt
b3ZlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KSB7DQo+ID4gKwlzdHJ1Y3QgbXdsX3ByaXYgKnBy
aXYgPSBody0+cHJpdjsNCj4gPiArDQo+ID4gKwlkZWJ1Z2ZzX3JlbW92ZShwcml2LT5kZWJ1Z2Zz
X3BoeSk7DQo+ID4gKwlwcml2LT5kZWJ1Z2ZzX3BoeSA9IE5VTEw7DQo+ID4gK30NCj4gPiBkaWZm
IC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2RlYnVnZnMuaA0K
PiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2RlYnVnZnMuaA0KPiA+
IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4uZGZjMmEzYw0KPiA+IC0t
LSAvZGV2L251bGwNCj4gPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdp
ZmkvZGVidWdmcy5oDQo+ID4gQEAgLTAsMCArMSwyNCBAQA0KPiA+ICsvKg0KPiA+ICsgKiBDb3B5
cmlnaHQgKEMpIDIwMDYtMjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4NCj4gPiArICoN
Cj4gPiArICogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBi
eSBNYXJ2ZWxsDQo+ID4gK0ludGVybmF0aW9uYWwNCj4gPiArICogTHRkLiB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwNCj4gPiArSnVu
ZSAxOTkxDQo+ID4gKyAqICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgdXNlLCByZWRpc3RyaWJ1
dGUgYW5kL29yIG1vZGlmeSB0aGlzDQo+ID4gK0ZpbGUgaW4NCj4gPiArICogYWNjb3JkYW5jZSB3
aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mDQo+
ID4gK3doaWNoDQo+ID4gKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCj4gPiArICoNCj4gPiArICogVEhFIEZJTEUgSVMgRElT
VFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORA0KPiA+ICtU
SEUNCj4gPiArICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRO
RVNTIEZPUiBBDQo+IFBBUlRJQ1VMQVINCj4gPiArUFVSUE9TRQ0KPiA+ICsgKiBBUkUgRVhQUkVT
U0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMN
Cj4gPiArYWJvdXQNCj4gPiArICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0KPiA+ICsgKi8N
Cj4gPiArDQo+ID4gKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGRlZmluZXMgZGVidWcgZnMg
cmVsYXRlZCBmdW5jdGlvbnMuICovDQo+ID4gKw0KPiA+ICsjaWZuZGVmIF9kZWJ1Z2ZzX2hfDQo+
ID4gKyNkZWZpbmUgX2RlYnVnZnNfaF8NCj4gDQo+IFRoZSBnZW5lcmFsIGNvbnZlbnRpb24gaXMg
dG8gdXNlciB1cHBlci1jYXNlIGZvciB0aGUgdGhlc2UgLSBub3QgYSBiaWdnaWUNCj4gdGhvdWdo
Lg0KPiANCg0KSSB3aWxsIG1vZGlmeSBpdC4NCg0KPiA+ICtzdHJ1Y3QgbXdsX3ByaXYgew0KPiA+
ICsJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7DQo+ID4gKwlzdHJ1Y3QgZmlybXdhcmUgKmZ3X3Vj
b2RlOw0KPiA+ICsJaW50IGNoaXBfdHlwZTsNCj4gPiArDQo+ID4gKwlzdHJ1Y3QgZGV2aWNlX25v
ZGUgKmR0X25vZGU7DQo+ID4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnB3cl9ub2RlOw0KPiA+ICsJ
Ym9vbCBkaXNhYmxlXzJnOw0KPiA+ICsJYm9vbCBkaXNhYmxlXzVnOw0KPiA+ICsJaW50IGFudGVu
bmFfdHg7DQo+ID4gKwlpbnQgYW50ZW5uYV9yeDsNCj4gPiArDQo+ID4gKwlzdHJ1Y3QgbXdsX3R4
X3B3cl90YmwgdHhfcHdyX3RibFtTWVNBRFBUX01BWF9OVU1fQ0hBTk5FTFNdOw0KPiA+ICsJYm9v
bCBjZGQ7DQo+ID4gKwl1MTYgdHhhbnRlbm5hMjsNCj4gPiArCXU4IHBvd2luaXRlZDsNCj4gPiAr
CXUxNiBtYXhfdHhfcG93W1NZU0FEUFRfVFhfUE9XRVJfTEVWRUxfVE9UQUxdOyAvKiBtYXggdHgg
cG93ZXINCj4gKGRCbSkgKi8NCj4gPiArCXUxNiB0YXJnZXRfcG93ZXJzW1NZU0FEUFRfVFhfUE9X
RVJfTEVWRUxfVE9UQUxdOyAvKiB0YXJnZXQNCj4gcG93ZXJzICAgKi8NCj4gPiArCXU4IGNhbF90
YmxbMjAwXTsNCj4gPiArDQo+ID4gKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsNCj4gPiArCXZvaWQg
X19pb21lbSAqaW9iYXNlMDsgLyogTUVNIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAwICAqLw0KPiA+
ICsJdm9pZCBfX2lvbWVtICppb2Jhc2UxOyAvKiBNRU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDEg
ICovDQo+ID4gKwl1MzIgbmV4dF9iYXJfbnVtOw0KPiA+ICsNCj4gPiArCXNwaW5sb2NrX3QgZndj
bWRfbG9jazsgICAgICAgLyogZm9yIGZpcm13YXJlIGNvbW1hbmQgICAgICAgICAqLw0KPiA+ICsJ
dW5zaWduZWQgc2hvcnQgKnBjbWRfYnVmOyAgICAvKiBwb2ludGVyIHRvIENtZEJ1ZiAodmlydHVh
bCkgICovDQo+ID4gKwlkbWFfYWRkcl90IHBwaHlzX2NtZF9idWY7ICAgIC8qIHBvaW50ZXIgdG8g
Q21kQnVmIChwaHlzaWNhbCkgKi8NCj4gPiArCWJvb2wgaW5fc2VuZF9jbWQ7DQo+ID4gKw0KPiA+
ICsJaW50IGlycTsNCj4gPiArCXN0cnVjdCBtd2xfaHdfZGF0YSBod19kYXRhOyAgLyogQWRhcHRl
ciBIVyBzcGVjaWZpYyBpbmZvICAgICAqLw0KPiA+ICsNCj4gPiArCS8qIHZhcmlvdXMgZGVzY3Jp
cHRvciBkYXRhICovDQo+ID4gKwlzcGlubG9ja190IHR4X2Rlc2NfbG9jazsgICAgIC8qIGZvciB0
eCBkZXNjcmlwdG9yIGRhdGEgICAgICAgKi8NCj4gPiArCXNwaW5sb2NrX3QgcnhfZGVzY19sb2Nr
OyAgICAgLyogZm9yIHJ4IGRlc2NyaXB0b3IgZGF0YSAgICAgICAqLw0KPiANCj4gWW91IHByb2Jh
Ymx5IGRvbid0IHdhbnQgdG8gZGVjbGFyZSB0aGVzZSB0d28gcmlnaHQgbmV4dCB0byBlYWNoIG90
aGVyLCBpZiB5b3UNCj4gZXhwZWN0IHRoZSBSWCBhbmQgVFggcGF0aHMgb2YgdGhlIGNvZGUgdG8g
YmUgYWJsZSB0byBydW4gaW4gcGFyYWxsZWwuDQo+IA0KPiBTcGluIGxvY2tzIGFyZSBub3QgZ3Vh
cmFudGVlZCB0byBiZSBjYWNoZSBsaW5lIGFsaWduZWQgb3IgY2FjaGUgbGluZSBzaXplZCwgc28N
Cj4geW91IGNhbiBlbmQgdXAgd2l0aCBjYWNoZSBsaW5lIHBpbmcgcG9uZ3MgYmV0d2VlbiBDUFVz
IGluIHRoaXMgY2FzZS4NCj4gDQoNCkkgd2lsbCBjaGVjayBhbmQgbW9kaWZ5IGl0Lg0KDQo+ID4g
KwlzdHJ1Y3QgbXdsX2Rlc2NfZGF0YSBkZXNjX2RhdGFbU1lTQURQVF9OVU1fT0ZfREVTQ19EQVRB
XTsNCj4gPiArCXN0cnVjdCBza19idWZmX2hlYWQgdHhxW1NZU0FEUFRfTlVNX09GX0RFU0NfREFU
QV07DQo+ID4gKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGRlbGF5X3E7DQo+ID4gKwkvKiBudW1iZXIg
b2YgZGVzY3JpcHRvcnMgb3duZWQgYnkgZncgYXQgYW55IG9uZSB0aW1lICovDQo+ID4gKwlpbnQg
ZndfZGVzY19jbnRbU1lTQURQVF9OVU1fT0ZfREVTQ19EQVRBXTsNCj4gPiArDQo+ID4gKwlzdHJ1
Y3QgdGFza2xldF9zdHJ1Y3QgdHhfdGFzazsNCj4gPiArCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBy
eF90YXNrOw0KPiA+ICsJc3RydWN0IHRhc2tsZXRfc3RydWN0IHFlX3Rhc2s7DQo+ID4gKwlpbnQg
dHhxX2xpbWl0Ow0KPiA+ICsJYm9vbCBpc190eF9zY2hlZHVsZTsNCj4gPiArCWludCByZWN2X2xp
bWl0Ow0KPiA+ICsJYm9vbCBpc19yeF9zY2hlZHVsZTsNCj4gPiArCWJvb2wgaXNfcWVfc2NoZWR1
bGU7DQo+ID4gKwlzOCBub2lzZTsgICAgICAgICAgICAgICAgICAgIC8qIE1vc3QgcmVjZW50bHkg
cmVwb3J0ZWQgbm9pc2UgaW4gZEJtDQo+ICovDQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBv
cnRlZF9iYW5kIGJhbmRfMjQ7DQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgY2hhbm5l
bHNfMjRbQkFORF8yNF9DSEFOTkVMX05VTV07DQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUg
cmF0ZXNfMjRbQkFORF8yNF9SQVRFX05VTV07DQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBv
cnRlZF9iYW5kIGJhbmRfNTA7DQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgY2hhbm5l
bHNfNTBbQkFORF81MF9DSEFOTkVMX05VTV07DQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUg
cmF0ZXNfNTBbQkFORF81MF9SQVRFX05VTV07DQo+ID4gKw0KPiA+ICsJdTMyIGFwX21hY2lkc19z
dXBwb3J0ZWQ7DQo+ID4gKwl1MzIgc3RhX21hY2lkc19zdXBwb3J0ZWQ7DQo+ID4gKwl1MzIgbWFj
aWRzX3VzZWQ7DQo+ID4gKwlzcGlubG9ja190IHZpZl9sb2NrOyAgICAgICAgIC8qIGZvciBwcml2
YXRlIGludGVyZmFjZSBpbmZvICAgKi8NCj4gPiArCXN0cnVjdCBsaXN0X2hlYWQgdmlmX2xpc3Q7
ICAgLyogTGlzdCBvZiBpbnRlcmZhY2VzLiAgICAgICAgICAqLw0KPiA+ICsJdTMyIHJ1bm5pbmdf
YnNzZXM7ICAgICAgICAgICAvKiBiaXRtYXAgb2YgcnVubmluZyBCU1NlcyAgICAgICovDQo+ID4g
Kw0KPiA+ICsJc3BpbmxvY2tfdCBzdGFfbG9jazsgICAgICAgICAvKiBmb3IgcHJpdmF0ZSBzdGEg
aW5mbyAgICAgICAgICovDQo+ID4gKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0YV9saXN0OyAgIC8qIExp
c3Qgb2Ygc3RhdGlvbnMgICAgICAgICAgICAgKi8NCj4gDQo+IFRoZXNlIHR3byBhcmUgYXdmdWxs
eSBjbG9zZSB0b2dldGhlciB0b28uIFlvdSBtaWdodCBqdXN0IGdldCBhd2F5IHdpdGggaXQgb24N
Cj4geDg2XzY0LCBnaXZlbiBsaXN0X2hlYWQgaXMgMTYgYnl0ZXMsIGJ1dCB0aGUgeDg2XzY0IHBh
Y2tpbmcgcnVsZXMgYXJlIG9kZCwgc28gSQ0KPiBhbSBuZXZlciBxdWl0ZSBzdXJlLiBPbiB4ODZf
MzIgaXQgd2lsbCBjZXJ0YWlubHkgYml0ZSB5b3UNCj4gLSBwcm92aWRlZCB2aWZfbG9jayBhbmQg
c3RhX2xvY2sgY2FuIGdldCB0YWtlbiBmcm9tIHR3byBkaWZmZXJlbnQgcGF0aHMuDQo+IA0KDQpJ
IHdpbGwgY2hlY2sgYW5kIG1vZGlmeSBpdC4NCg0KPiA+ICsNCj4gPiArCWJvb2wgcmFkaW9fb247
DQo+ID4gKwlib29sIHJhZGlvX3Nob3J0X3ByZWFtYmxlOw0KPiA+ICsJYm9vbCB3bW1fZW5hYmxl
ZDsNCj4gPiArCXN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zDQo+IHdtbV9wYXJhbXNb
U1lTQURQVF9UWF9XTU1fUVVFVUVTXTsNCj4gPiArDQo+ID4gKwkvKiBBbXBkdSBzdHJlYW0gaW5m
b3JtYXRpb24gKi8NCj4gPiArCXU4IG51bV9hbXBkdV9xdWV1ZXM7DQo+ID4gKwlzcGlubG9ja190
IHN0cmVhbV9sb2NrOyAgICAgIC8qIGZvciBhbXBkdSBzdHJlYW0gICAgICAgICAgICAgKi8NCj4g
PiArCXN0cnVjdCBtd2xfYW1wZHVfc3RyZWFtIGFtcGR1W1NZU0FEUFRfVFhfQU1QRFVfUVVFVUVT
XTsNCj4gPiArCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaGRvZ19iYV9oYW5kbGU7DQo+ID4gKw0K
PiA+ICsJYm9vbCBtZmdfbW9kZTsNCj4gPiArDQo+ID4gKyNpZmRlZiBDT05GSUdfREVCVUdfRlMN
Cj4gPiArCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcGh5Ow0KPiA+ICsJdTMyIHJlZ190eXBlOw0K
PiA+ICsJdTMyIHJlZ19vZmZzZXQ7DQo+ID4gKwl1MzIgcmVnX3ZhbHVlOw0KPiA+ICsjZW5kaWYN
Cj4gPiArfTsNCj4gW3NuaXBdDQo+IA0KPiA+ICtzdGF0aWMgdm9pZCBtd2xfZndjbWRfcGFyc2Vf
YmVhY29uKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwNCj4gPiArCQkJCSAgIHN0cnVjdCBtd2xfdmlm
ICp2aWYsIHU4ICpiZWFjb24sIGludCBsZW4pIHsNCj4gPiArCXN0cnVjdCBpZWVlODAyMTFfbWdt
dCAqbWdtdDsNCj4gPiArCXN0cnVjdCBiZWFjb25faW5mbyAqYmVhY29uX2luZm87DQo+ID4gKwlp
bnQgYmFzZWxlbjsNCj4gPiArCXU4ICpwb3M7DQo+ID4gKwlzaXplX3QgbGVmdDsNCj4gPiArCWJv
b2wgZWxlbV9wYXJzZV9mYWlsZWQ7DQo+ID4gKw0KPiA+ICsJbWdtdCA9IChzdHJ1Y3QgaWVlZTgw
MjExX21nbXQgKiliZWFjb247DQo+ID4gKw0KPiA+ICsJYmFzZWxlbiA9ICh1OCAqKW1nbXQtPnUu
YmVhY29uLnZhcmlhYmxlIC0gKHU4ICopbWdtdDsNCj4gPiArCWlmIChiYXNlbGVuID4gbGVuKQ0K
PiA+ICsJCXJldHVybjsNCj4gPiArDQo+ID4gKwliZWFjb25faW5mbyA9ICZ2aWYtPmJlYWNvbl9p
bmZvOw0KPiA+ICsJbWVtc2V0KGJlYWNvbl9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlYWNvbl9p
bmZvKSk7DQo+ID4gKwliZWFjb25faW5mby0+dmFsaWQgPSBmYWxzZTsNCj4gPiArCWJlYWNvbl9p
bmZvLT5pZV9odF9wdHIgPSAmYmVhY29uX2luZm8tPmllX2xpc3RfaHRbMF07DQo+ID4gKwliZWFj
b25faW5mby0+aWVfdmh0X3B0ciA9ICZiZWFjb25faW5mby0+aWVfbGlzdF92aHRbMF07DQo+ID4g
Kw0KPiA+ICsJYmVhY29uX2luZm8tPmNhcF9pbmZvID0gbGUxNl90b19jcHUobWdtdC0+dS5iZWFj
b24uY2FwYWJfaW5mbyk7DQo+ID4gKw0KPiA+ICsJcG9zID0gKHU4ICopbWdtdC0+dS5iZWFjb24u
dmFyaWFibGU7DQo+ID4gKwlsZWZ0ID0gbGVuIC0gYmFzZWxlbjsNCj4gPiArDQo+ID4gKwllbGVt
X3BhcnNlX2ZhaWxlZCA9IGZhbHNlOw0KPiA+ICsNCj4gPiArCXdoaWxlIChsZWZ0ID49IDIpIHsN
Cj4gPiArCQl1OCBpZCwgZWxlbjsNCj4gPiArDQo+ID4gKwkJaWQgPSAqcG9zKys7DQo+ID4gKwkJ
ZWxlbiA9ICpwb3MrKzsNCj4gPiArCQlsZWZ0IC09IDI7DQo+ID4gKw0KPiA+ICsJCWlmIChlbGVu
ID4gbGVmdCkgew0KPiA+ICsJCQllbGVtX3BhcnNlX2ZhaWxlZCA9IHRydWU7DQo+ID4gKwkJCWJy
ZWFrOw0KPiA+ICsJCX0NCj4gPiArDQo+ID4gKwkJc3dpdGNoIChpZCkgew0KPiA+ICsJCWNhc2Ug
V0xBTl9FSURfU1VQUF9SQVRFUzoNCj4gPiArCQljYXNlIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVT
Og0KPiA+ICsJCQl7DQo+ID4gKwkJCWludCBpZHgsIGJpLCBvaTsNCj4gPiArCQkJdTggcmF0ZTsN
Cj4gPiArDQo+ID4gKwkJCWZvciAoYmkgPSAwOyBiaSA8IFNZU0FEUFRfTUFYX0RBVEFfUkFURVNf
RzsNCj4gPiArCQkJICAgICBiaSsrKSB7DQo+ID4gKwkJCQlpZiAoYmVhY29uX2luZm8tPmJfcmF0
ZV9zZXRbYmldID09IDApDQo+ID4gKwkJCQkJYnJlYWs7DQo+ID4gKwkJCX0NCj4gPiArDQo+ID4g
KwkJCWZvciAob2kgPSAwOyBvaSA8IFNZU0FEUFRfTUFYX0RBVEFfUkFURVNfRzsNCj4gPiArCQkJ
ICAgICBvaSsrKSB7DQo+ID4gKwkJCQlpZiAoYmVhY29uX2luZm8tPm9wX3JhdGVfc2V0W29pXSA9
PSAwKQ0KPiA+ICsJCQkJCWJyZWFrOw0KPiA+ICsJCQl9DQo+ID4gKw0KPiA+ICsJCQlmb3IgKGlk
eCA9IDA7IGlkeCA8IGVsZW47IGlkeCsrKSB7DQo+ID4gKwkJCQlyYXRlID0gcG9zW2lkeF07DQo+
ID4gKwkJCQlpZiAoKHJhdGUgJiAweDgwKSAhPSAwKSB7DQo+ID4gKwkJCQkJaWYgKGJpIDwgU1lT
QURQVF9NQVhfREFUQV9SQVRFU19HKQ0KPiA+ICsJCQkJCQliZWFjb25faW5mby0+Yl9yYXRlX3Nl
dFtiaSsrXQ0KPiA+ICsJCQkJCQkJPSByYXRlICYgMHg3ZjsNCj4gPiArCQkJCQllbHNlIHsNCj4g
PiArCQkJCQkJZWxlbV9wYXJzZV9mYWlsZWQgPSB0cnVlOw0KPiA+ICsJCQkJCQlicmVhazsNCj4g
PiArCQkJCQl9DQo+ID4gKwkJCQl9DQo+ID4gKwkJCQlpZiAob2kgPCBTWVNBRFBUX01BWF9EQVRB
X1JBVEVTX0cpDQo+ID4gKwkJCQkJYmVhY29uX2luZm8tPm9wX3JhdGVfc2V0W29pKytdID0NCj4g
PiArCQkJCQkJcmF0ZSAmIDB4N2Y7DQo+ID4gKwkJCQllbHNlIHsNCj4gPiArCQkJCQllbGVtX3Bh
cnNlX2ZhaWxlZCA9IHRydWU7DQo+ID4gKwkJCQkJYnJlYWs7DQo+ID4gKwkJCQl9DQo+ID4gKwkJ
CX0NCj4gPiArCQkJfQ0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIFdMQU5fRUlEX1JTTjoN
Cj4gPiArCQkJYmVhY29uX2luZm8tPmllX3JzbjQ4X2xlbiA9IChlbGVuICsgMik7DQo+ID4gKwkJ
CWJlYWNvbl9pbmZvLT5pZV9yc240OF9wdHIgPSAocG9zIC0gMik7DQo+ID4gKwkJCWJyZWFrOw0K
PiA+ICsJCWNhc2UgV0xBTl9FSURfSFRfQ0FQQUJJTElUWToNCj4gPiArCQljYXNlIFdMQU5fRUlE
X0hUX09QRVJBVElPTjoNCj4gPiArCQljYXNlIFdMQU5fRUlEX09WRVJMQVBfQlNTX1NDQU5fUEFS
QU06DQo+ID4gKwkJY2FzZSBXTEFOX0VJRF9FWFRfQ0FQQUJJTElUWToNCj4gPiArCQkJYmVhY29u
X2luZm8tPmllX2h0X2xlbiArPSAoZWxlbiArIDIpOw0KPiA+ICsJCQlpZiAoYmVhY29uX2luZm8t
PmllX2h0X2xlbiA+DQo+ID4gKwkJCSAgICBzaXplb2YoYmVhY29uX2luZm8tPmllX2xpc3RfaHQp
KSB7DQo+ID4gKwkJCQllbGVtX3BhcnNlX2ZhaWxlZCA9IHRydWU7DQo+ID4gKwkJCX0gZWxzZSB7
DQo+ID4gKwkJCQkqYmVhY29uX2luZm8tPmllX2h0X3B0cisrID0gaWQ7DQo+ID4gKwkJCQkqYmVh
Y29uX2luZm8tPmllX2h0X3B0cisrID0gZWxlbjsNCj4gPiArCQkJCW1lbWNweShiZWFjb25faW5m
by0+aWVfaHRfcHRyLCBwb3MsIGVsZW4pOw0KPiA+ICsJCQkJYmVhY29uX2luZm8tPmllX2h0X3B0
ciArPSBlbGVuOw0KPiA+ICsJCQl9DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsjaWZkZWYgQ09ORklH
X01BQzgwMjExX01FU0gNCj4gPiArCQljYXNlIFdMQU5fRUlEX01FU0hfQ09ORklHOg0KPiA+ICsJ
CQliZWFjb25faW5mby0+aWVfbWVzaGNmZ19sZW4gPSAoZWxlbiArIDIpOw0KPiA+ICsJCQliZWFj
b25faW5mby0+aWVfbWVzaGNmZ19wdHIgPSAocG9zIC0gMik7DQo+ID4gKwkJCWJyZWFrOw0KPiA+
ICsJCWNhc2UgV0xBTl9FSURfTUVTSF9JRDoNCj4gPiArCQkJYmVhY29uX2luZm8tPmllX21lc2hp
ZF9sZW4gPSAoZWxlbiArIDIpOw0KPiA+ICsJCQliZWFjb25faW5mby0+aWVfbWVzaGlkX3B0ciA9
IChwb3MgLSAyKTsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBXTEFOX0VJRF9DSEFOX1NX
SVRDSF9QQVJBTToNCj4gPiArCQkJYmVhY29uX2luZm8tPmllX21lc2hjaHN3X2xlbiA9IChlbGVu
ICsgMik7DQo+ID4gKwkJCWJlYWNvbl9pbmZvLT5pZV9tZXNoY2hzd19wdHIgPSAocG9zIC0gMik7
DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsjZW5kaWYNCj4gPiArCQljYXNlIFdMQU5fRUlEX1ZIVF9D
QVBBQklMSVRZOg0KPiA+ICsJCWNhc2UgV0xBTl9FSURfVkhUX09QRVJBVElPTjoNCj4gPiArCQlj
YXNlIFdMQU5fRUlEX09QTU9ERV9OT1RJRjoNCj4gPiArCQkJYmVhY29uX2luZm8tPmllX3ZodF9s
ZW4gKz0gKGVsZW4gKyAyKTsNCj4gPiArCQkJaWYgKGJlYWNvbl9pbmZvLT5pZV92aHRfbGVuID4N
Cj4gPiArCQkJICAgIHNpemVvZihiZWFjb25faW5mby0+aWVfbGlzdF92aHQpKSB7DQo+ID4gKwkJ
CQllbGVtX3BhcnNlX2ZhaWxlZCA9IHRydWU7DQo+ID4gKwkJCX0gZWxzZSB7DQo+ID4gKwkJCQkq
YmVhY29uX2luZm8tPmllX3ZodF9wdHIrKyA9IGlkOw0KPiA+ICsJCQkJKmJlYWNvbl9pbmZvLT5p
ZV92aHRfcHRyKysgPSBlbGVuOw0KPiA+ICsJCQkJbWVtY3B5KGJlYWNvbl9pbmZvLT5pZV92aHRf
cHRyLCBwb3MsIGVsZW4pOw0KPiA+ICsJCQkJYmVhY29uX2luZm8tPmllX3ZodF9wdHIgKz0gZWxl
bjsNCj4gPiArCQkJfQ0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIFdMQU5fRUlEX1ZFTkRP
Ul9TUEVDSUZJQzoNCj4gPiArCQkJaWYgKChwb3NbMF0gPT0gMHgwMCkgJiYgKHBvc1sxXSA9PSAw
eDUwKSAmJg0KPiA+ICsJCQkgICAgKHBvc1syXSA9PSAweGYyKSkgew0KPiA+ICsJCQkJaWYgKHBv
c1szXSA9PSAweDAxKSB7DQo+ID4gKwkJCQkJYmVhY29uX2luZm8tPmllX3Jzbl9sZW4gPSAoZWxl
biArIDIpOw0KPiA+ICsJCQkJCWJlYWNvbl9pbmZvLT5pZV9yc25fcHRyID0gKHBvcyAtIDIpOw0K
PiA+ICsJCQkJfQ0KPiA+ICsNCj4gPiArCQkJCWlmIChwb3NbM10gPT0gMHgwMikgew0KPiA+ICsJ
CQkJCWJlYWNvbl9pbmZvLT5pZV93bW1fbGVuID0gKGVsZW4gKyAyKTsNCj4gPiArCQkJCQliZWFj
b25faW5mby0+aWVfd21tX3B0ciA9IChwb3MgLSAyKTsNCj4gPiArCQkJCX0NCj4gPiArCQkJfQ0K
PiA+ICsJCQlicmVhazsNCj4gPiArCQlkZWZhdWx0Og0KPiA+ICsJCQlicmVhazsNCj4gPiArCQl9
DQo+ID4gKw0KPiA+ICsJCWxlZnQgLT0gZWxlbjsNCj4gPiArCQlwb3MgKz0gZWxlbjsNCj4gPiAr
CX0NCj4gPiArDQo+ID4gKwlpZiAoIWVsZW1fcGFyc2VfZmFpbGVkKSB7DQo+ID4gKwkJYmVhY29u
X2luZm8tPmllX2h0X3B0ciA9ICZiZWFjb25faW5mby0+aWVfbGlzdF9odFswXTsNCj4gPiArCQli
ZWFjb25faW5mby0+aWVfdmh0X3B0ciA9ICZiZWFjb25faW5mby0+aWVfbGlzdF92aHRbMF07DQo+
ID4gKwkJYmVhY29uX2luZm8tPnZhbGlkID0gdHJ1ZTsNCj4gPiArCX0NCj4gPiArfQ0KPiANCj4g
QW55IHJlYXNvbiB5b3UncmUgbm90IHVzaW5nIGNmZzgwMjExX2ZpbmRfaWUoKSBoZXJlPyBTZWVt
cyB0byBiZQ0KPiByZS1pbnZlbnRpbmcgdGhlIHdoZWVsIHRvIG1lLg0KPiANCg0KSXQgaXMgYmV0
dGVyIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHBhcnNlIGJlYWNvbiBvbmUgdGltZSBhbmQgZ2V0
IGFsbCBJRXMgd2UgbmVlZC4gSXQgaXMgbm90IGEgZ29vZCBpZGVhIHRvIHVzZSBjZmc4MDIxMV9m
aW5kX2llKCkgdG8gZmluZCBJRXMgd2UgbmVlZCBvbmUgYnkgb25lLg0KDQo+ID4gK3ZvaWQgbXds
X2Z3Y21kX3Jlc2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KSB7DQo+ID4gKwlzdHJ1Y3QgbXds
X3ByaXYgKnByaXYgPSBody0+cHJpdjsNCj4gPiArDQo+ID4gKwlpZiAobXdsX2Z3Y21kX2Noa19h
ZGFwdGVyKHByaXYpKQ0KPiA+ICsJCXdyaXRlbChJU1JfUkVTRVQsDQo+ID4gKwkJICAgICAgIHBy
aXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0gyQV9JTlRFUlJVUFRfRVZFTlRTKTsgfQ0KPiA+ICsN
Cj4gPiArdm9pZCBtd2xfZndjbWRfaW50X2VuYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykg
ew0KPiA+ICsJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnByaXY7DQo+ID4gKw0KPiA+ICsJ
aWYgKG13bF9md2NtZF9jaGtfYWRhcHRlcihwcml2KSkgew0KPiA+ICsJCXdyaXRlbCgweDAwLA0K
PiA+ICsJCSAgICAgICBwcml2LT5pb2Jhc2UxICsgTUFDUkVHX1JFR19BMkhfSU5URVJSVVBUX01B
U0spOw0KPiA+ICsJCXdyaXRlbCgoTUFDUkVHX0EySFJJQ19CSVRfTUFTSyksDQo+ID4gKwkJICAg
ICAgIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfTUFTSyk7DQo+IA0K
PiBQbGVhc2UgYXZvaWQgc3VwZXJmbHVvdXMgdXNlIG9mIHBhcmVudGhlc2VzLg0KPiANCg0KSSB3
aWxsIG1vZGlmeSBpdC4NCg0KPiA+ICtpbnQgbXdsX2Z3Y21kX2dldF9od19zcGVjcyhzdHJ1Y3Qg
aWVlZTgwMjExX2h3ICpodykgew0KPiA+ICsJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnBy
aXY7DQo+ID4gKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfZ2V0X2h3X3NwZWMgKnBjbWQ7DQo+ID4gKwlp
bnQgcmV0cnk7DQo+ID4gKwlpbnQgaTsNCj4gPiArDQo+ID4gKwlpZiAocHJpdi0+bWZnX21vZGUp
DQo+ID4gKwkJcmV0dXJuIDA7DQo+ID4gKw0KPiA+ICsJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9j
bWRfZ2V0X2h3X3NwZWMgKikmcHJpdi0+cGNtZF9idWZbMF07DQo+ID4gKw0KPiA+ICsJc3Bpbl9s
b2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCj4gPiArDQo+ID4gKwl3aXBoeV9kZWJ1Zyhody0+
d2lwaHksICJwY21kID0gJXBcbiIsIHBjbWQpOw0KPiA+ICsJbWVtc2V0KHBjbWQsIDB4MDAsIHNp
emVvZigqcGNtZCkpOw0KPiA+ICsJZXRoX2Jyb2FkY2FzdF9hZGRyKHBjbWQtPnBlcm1hbmVudF9h
ZGRyKTsNCj4gPiArCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURf
R0VUX0hXX1NQRUMpOw0KPiA+ICsJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXpl
b2YoKnBjbWQpKTsNCj4gPiArCXBjbWQtPmZ3X2F3YWtlX2Nvb2tpZSA9IGNwdV90b19sZTMyKHBy
aXYtPnBwaHlzX2NtZF9idWYgKyAyMDQ4KTsNCj4gPiArDQo+ID4gKwlyZXRyeSA9IDA7DQo+ID4g
Kwl3aGlsZSAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX0dFVF9IV19TUEVD
KSkgew0KPiA+ICsJCWlmIChyZXRyeSsrID4gTUFYX1dBSVRfR0VUX0hXX1NQRUNTX0lURVJBVE9O
Uykgew0KPiA+ICsJCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiY2FuJ3QgZ2V0IGh3IHNwZWNzXG4i
KTsNCj4gPiArCQkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KPiA+ICsJCQly
ZXR1cm4gLUVJTzsNCj4gPiArCQl9DQo+ID4gKw0KPiA+ICsJCW1kZWxheSgxMDAwKTsNCj4gPiAr
CQl3aXBoeV9kZWJ1Zyhody0+d2lwaHksDQo+ID4gKwkJCSAgICAicmVwZWF0IGNvbW1hbmQgPSAl
cFxuIiwgcGNtZCk7DQo+ID4gKwl9DQo+IA0KPiAqY291Z2gqIG1kZWxheSgxMDAwKSB3aGlsZSBo
b2xkaW5nIGEgc3BpbiBsb2NrIGFuZCB3aXRoaW4gaW4gYSB3aGlsZSgpICpsb29wPw0KPiAqY291
Z2gqDQo+IA0KPiBUaGlzIG5lZWRzIGEgbGl0dGxlIGNsZWFuaW5nIHVwLiBQbGVhc2UgaGF2ZSBh
IGxvb2sgYXQNCj4gRG9jdW1lbnRhdGlvbi90aW1lcnMvdGltZXJzLWhvd3RvLnR4dA0KPiANCg0K
SSB3aWxsIHRyeSB0byB1c2UgbXV0ZXggYW5kIG1zbGVlcCgpLg0KDQo+ID4gKw0KPiA+ICsJZXRo
ZXJfYWRkcl9jb3B5KCZwcml2LT5od19kYXRhLm1hY19hZGRyWzBdLA0KPiBwY21kLT5wZXJtYW5l
bnRfYWRkcik7DQo+ID4gKwlwcml2LT5kZXNjX2RhdGFbMF0ud2NiX2Jhc2UgPQ0KPiA+ICsJCWxl
MzJfdG9fY3B1KHBjbWQtPndjYl9iYXNlMCkgJiAweDAwMDBmZmZmOw0KPiA+ICsJZm9yIChpID0g
MTsgaSA8IFNZU0FEUFRfVE9UQUxfVFhfUVVFVUVTOyBpKyspDQo+ID4gKwkJcHJpdi0+ZGVzY19k
YXRhW2ldLndjYl9iYXNlID0NCj4gPiArCQkJbGUzMl90b19jcHUocGNtZC0+d2NiX2Jhc2VbaSAt
IDFdKSAmIDB4MDAwMGZmZmY7DQo+ID4gKwlwcml2LT5kZXNjX2RhdGFbMF0ucnhfZGVzY19yZWFk
ID0NCj4gPiArCQlsZTMyX3RvX2NwdShwY21kLT5yeHBkX3JkX3B0cikgJiAweDAwMDBmZmZmOw0K
PiA+ICsJcHJpdi0+ZGVzY19kYXRhWzBdLnJ4X2Rlc2Nfd3JpdGUgPQ0KPiA+ICsJCWxlMzJfdG9f
Y3B1KHBjbWQtPnJ4cGRfd3JfcHRyKSAmIDB4MDAwMGZmZmY7DQo+ID4gKwlwcml2LT5od19kYXRh
LnJlZ2lvbl9jb2RlID0gbGUxNl90b19jcHUocGNtZC0+cmVnaW9uX2NvZGUpICYgMHgwMGZmOw0K
PiA+ICsJcHJpdi0+aHdfZGF0YS5md19yZWxlYXNlX251bSA9IGxlMzJfdG9fY3B1KHBjbWQtPmZ3
X3JlbGVhc2VfbnVtKTsNCj4gPiArCXByaXYtPmh3X2RhdGEubWF4X251bV90eF9kZXNjID0gbGUx
Nl90b19jcHUocGNtZC0+bnVtX3djYik7DQo+ID4gKwlwcml2LT5od19kYXRhLm1heF9udW1fbWNf
YWRkciA9DQo+IGxlMTZfdG9fY3B1KHBjbWQtPm51bV9tY2FzdF9hZGRyKTsNCj4gPiArCXByaXYt
Pmh3X2RhdGEubnVtX2FudGVubmFzID0gbGUxNl90b19jcHUocGNtZC0+bnVtX2FudGVubmEpOw0K
PiA+ICsJcHJpdi0+aHdfZGF0YS5od192ZXJzaW9uID0gcGNtZC0+dmVyc2lvbjsNCj4gPiArCXBy
aXYtPmh3X2RhdGEuaG9zdF9pbnRlcmZhY2UgPSBwY21kLT5ob3N0X2lmOw0KPiA+ICsNCj4gPiAr
CXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCj4gPiArDQo+ID4gKwlyZXR1cm4g
MDsNCj4gPiArfQ0KPiA+ICsNCj4gPiAraW50IG13bF9md2NtZF9zZXRfaHdfc3BlY3Moc3RydWN0
IGllZWU4MDIxMV9odyAqaHcpIHsNCj4gPiArCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5w
cml2Ow0KPiA+ICsJc3RydWN0IGhvc3RjbWRfY21kX3NldF9od19zcGVjICpwY21kOw0KPiA+ICsJ
aW50IGk7DQo+ID4gKw0KPiA+ICsJaWYgKHByaXYtPm1mZ19tb2RlKQ0KPiA+ICsJCXJldHVybiAw
Ow0KPiA+ICsNCj4gPiArCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX3NldF9od19zcGVjICop
JnByaXYtPnBjbWRfYnVmWzBdOw0KPiA+ICsNCj4gPiArCXNwaW5fbG9ja19iaCgmcHJpdi0+Zndj
bWRfbG9jayk7DQo+ID4gKw0KPiA+ICsJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkp
Ow0KPiA+ICsJcGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRf
SFdfU1BFQyk7DQo+ID4gKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigq
cGNtZCkpOw0KPiA+ICsJcGNtZC0+d2NiX2Jhc2VbMF0gPSBjcHVfdG9fbGUzMihwcml2LT5kZXNj
X2RhdGFbMF0ucHBoeXNfdHhfcmluZyk7DQo+ID4gKwlmb3IgKGkgPSAxOyBpIDwgU1lTQURQVF9U
T1RBTF9UWF9RVUVVRVM7IGkrKykNCj4gPiArCQlwY21kLT53Y2JfYmFzZVtpXSA9DQo+ID4gKwkJ
CWNwdV90b19sZTMyKHByaXYtPmRlc2NfZGF0YVtpXS5wcGh5c190eF9yaW5nKTsNCj4gPiArCXBj
bWQtPnR4X3djYl9udW1fcGVyX3F1ZXVlID0NCj4gY3B1X3RvX2xlMzIoU1lTQURQVF9NQVhfTlVN
X1RYX0RFU0MpOw0KPiA+ICsJcGNtZC0+bnVtX3R4X3F1ZXVlcyA9IGNwdV90b19sZTMyKFNZU0FE
UFRfTlVNX09GX0RFU0NfREFUQSk7DQo+ID4gKwlwY21kLT50b3RhbF9yeF93Y2IgPSBjcHVfdG9f
bGUzMihTWVNBRFBUX01BWF9OVU1fUlhfREVTQyk7DQo+ID4gKwlwY21kLT5yeHBkX3dyX3B0ciA9
IGNwdV90b19sZTMyKHByaXYtPmRlc2NfZGF0YVswXS5wcGh5c19yeF9yaW5nKTsNCj4gPiArCXBj
bWQtPmZlYXR1cmVzID0gMDsNCj4gPiArDQo+ID4gKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHBy
aXYsIEhPU1RDTURfQ01EX1NFVF9IV19TUEVDKSkgew0KPiA+ICsJCXNwaW5fdW5sb2NrX2JoKCZw
cml2LT5md2NtZF9sb2NrKTsNCj4gPiArCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4
ZWN1dGlvblxuIik7DQo+ID4gKwkJcmV0dXJuIC1FSU87DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJ
c3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KPiA+ICsNCj4gPiArCXJldHVybiAw
Ow0KPiA+ICt9DQo+IA0KPiBJdCBsb29rcyBsaWtlIGZ3Y21kX2xvY2soKSBpcyB1c2VkIGluIHRo
aXMgd2F5IGluIGV2ZXJ5IGluc3RhbmNlLiBDb3VsZCB5b3Ugbm90DQo+IGFsbG9jYXRlIGEgcG9v
bCBvZiBjb21tYW5kIGJ1ZmZlcnMsIHB1dCB0aGVtIG9uIGEgbGlzdCwgYW5kIG9ubHkgdGFrZSB0
aGUgbG9jaw0KPiB3aGlsZSB5b3UgcHVsbCB0aGVtIG91dCBhbmQgcmVpbnNlcnQgdGhlbSBiYWNr
IGludG8gdGhlIGxpc3Q/DQo+IA0KPiBJZiB5b3UgbmVlZCB0byBob2xkIGEgbG9jayBkdXJpbmcg
ZmlybXdhcmUgY29tbWFuZCBleGVjdXRpb24sIHlvdSBwcm9iYWJseQ0KPiBzaG91bGQgc3dpdGNo
IHRvIGEgbXV0ZXggbWVjaGFuaXNtIHJhdGhlciB0aGFuIHNwaW4gbG9ja3MuDQo+IA0KDQpJIHdp
bGwgdHJ5IHRvIHVzZSBtdXRleC4NCg0KPiA+ICsNCj4gPiAraW50IG13bF9md2NtZF9nZXRfc3Rh
dChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCj4gPiArCQkgICAgICAgc3RydWN0IGllZWU4MDIx
MV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKSB7DQo+ID4gKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYg
PSBody0+cHJpdjsNCj4gPiArCXN0cnVjdCBob3N0Y21kX2NtZF84MDJfMTFfZ2V0X3N0YXQgKnBj
bWQ7DQo+ID4gKw0KPiA+ICsJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfODAyXzExX2dldF9z
dGF0ICopJnByaXYtPnBjbWRfYnVmWzBdOw0KPiA+ICsNCj4gPiArCXNwaW5fbG9ja19iaCgmcHJp
di0+ZndjbWRfbG9jayk7DQo+ID4gKw0KPiA+ICsJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigq
cGNtZCkpOw0KPiA+ICsJcGNtZC0+Y21kX2hkci5jbWQgPQ0KPiBjcHVfdG9fbGUxNihIT1NUQ01E
X0NNRF84MDJfMTFfR0VUX1NUQVQpOw0KPiA+ICsJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9f
bGUxNihzaXplb2YoKnBjbWQpKTsNCj4gPiArDQo+ID4gKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21k
KHByaXYsIEhPU1RDTURfQ01EXzgwMl8xMV9HRVRfU1RBVCkpIHsNCj4gPiArCQlzcGluX3VubG9j
a19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQo+ID4gKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZh
aWxlZCBleGVjdXRpb25cbiIpOw0KPiA+ICsJCXJldHVybiAtRUlPOw0KPiA+ICsJfQ0KPiA+ICsN
Cj4gPiArCXN0YXRzLT5kb3QxMUFDS0ZhaWx1cmVDb3VudCA9DQo+ID4gKwkJbGUzMl90b19jcHUo
cGNtZC0+YWNrX2ZhaWx1cmVzKTsNCj4gPiArCXN0YXRzLT5kb3QxMVJUU0ZhaWx1cmVDb3VudCA9
DQo+ID4gKwkJbGUzMl90b19jcHUocGNtZC0+cnRzX2ZhaWx1cmVzKTsNCj4gPiArCXN0YXRzLT5k
b3QxMUZDU0Vycm9yQ291bnQgPQ0KPiA+ICsJCWxlMzJfdG9fY3B1KHBjbWQtPnJ4X2Zjc19lcnJv
cnMpOw0KPiA+ICsJc3RhdHMtPmRvdDExUlRTU3VjY2Vzc0NvdW50ID0NCj4gPiArCQlsZTMyX3Rv
X2NwdShwY21kLT5ydHNfc3VjY2Vzc2VzKTsNCj4gPiArDQo+ID4gKwlzcGluX3VubG9ja19iaCgm
cHJpdi0+ZndjbWRfbG9jayk7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gK30NCj4gPiAr
DQo+ID4gK2ludCBtd2xfZndjbWRfcmFkaW9fZW5hYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3
KSB7DQo+ID4gKwlyZXR1cm4gbXdsX2Z3Y21kXzgwMl8xMV9yYWRpb19jb250cm9sKGh3LT5wcml2
LCB0cnVlLCBmYWxzZSk7IH0NCj4gPiArDQo+ID4gK2ludCBtd2xfZndjbWRfcmFkaW9fZGlzYWJs
ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykgew0KPiA+ICsJcmV0dXJuIG13bF9md2NtZF84MDJf
MTFfcmFkaW9fY29udHJvbChody0+cHJpdiwgZmFsc2UsIGZhbHNlKTsgfQ0KPiANCj4gVGhlc2Ug
bGFzdCB0d28gbWFrZXMgbWUgdGhpbmsgeW91IG9ubHkgdXNlIHRoZSBzcGluIGxvY2sgZm9yIGJ1
ZmZlcg0KPiBtYW5hZ2VtZW50IGFuZCBub3QgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIGl0c2VsZj8N
Cj4gDQo+IEkgYW0gb3V0IG9mIHRpbWUgZm9yIHRvZGF5LCBJJ2xsIHRyeSB0byBzZWUgaWYgSSBj
YW4gZmluZCBtb3JlIHRpbWUgbGF0ZXIgLSBwbGVhc2UNCj4gbG9vayBpbnRvIGZpeGluZyB0aGUg
YWJvdmUuDQo+IA0KPiBKZXMNCg==

2015-11-27 02:00:08

by David Lin

[permalink] [raw]
Subject: RE: [PATCH v7] Add new mac80211 driver mwlwifi.

PiBPbiBOb3ZlbWJlciAyNiwgMjAxNSA1OjQwIFBNLCBKb2hhbm5lcyBCZXJnIHdyb3RlOg0KPiAN
Cj4gT24gVGh1LCAyMDE1LTExLTI2IGF0IDA4OjI3ICswMDAwLCBEYXZpZCBMaW4gd3JvdGU6DQo+
IA0KPiA+ID4gU2luY2UgeW91IGRvIHRoaXMgaW4gLnByb2JlLCB5b3Ugc2hvdWxkIGNvbnNpZGVy
IGxvYWRpbmcgdGhlDQo+ID4gPiBmaXJtd2FyZSBhc3luY2hyb25vdXNseS4NCj4gPiA+DQo+ID4N
Cj4gPiBJIGhvcGUgSSBjYW4gcG9zdHBvbmUgdGhpcyBtb2RpZmljYXRpb24gbGF0ZXIuDQo+IA0K
PiBJIGRvbid0IGZlZWwgc3Ryb25nbHkgYWJvdXQgdGhpcyBvbmUgLSBvdG9oIGl0J3Mgbm90IHJl
YWxseSBjb21wbGljYXRlZC4NCj4gDQoNClRoYW5rcy4NCg0KPiA+ID4gPiArI2lmZGVmIENPTkZJ
R19TVVBQT1JUX01GRw0KPiA+ID4NCj4gPiA+IFRoaXMgS2NvbmZpZyB2YXJpYWJsZSBkb2Vzbid0
IGV4aXN0Lg0KPiA+ID4NCj4gPg0KPiA+IFRoZSBjb21waWxlIHZhcmlhYmxlIGlzIHVzZWQgcHJp
dmF0ZWx5IGJ5IE1hcnZlbGwgYW5kIG91ciBjdXN0b21lcnMgaW4NCj4gPiBwcm9kdWN0aW9uIGxp
bmUuDQo+IA0KPiBZZWFoLCBzdGlsbC4gTWFrZSBpdCBhIHByb3BlciBLY29uZmlnIHZhcmlhYmxl
LCBkZWZhdWx0aW5nIHRvIG9mZiBhbmQgaGlkZGVuDQo+IHVuZGVyIHNvbWV0aGluZywgb3IgcmVt
b3ZlIGl0LiBJdCdzIGV4dHJlbWVseSBtaXNsZWFkaW5nIHRvIGhhdmUgc29tZXRoaW5nDQo+IGNh
bGxlZCBDT05GSUdfKiB3aGVuIGl0J3Mgbm90IGEgS2NvbmZpZyB2YXJpYWJsZS4NCj4gDQoNCkkg
d2lsbCBjaGFuZ2UgdGhpcyBjb21waWxlIHZhcmlhYmxlIGZyb20gIkNPTkZJR19TVVBQT1JUX01G
RyIgdG8gIlNVUFBPUlRfTUZHIi4NCg0KPiA+IE1hYzgwMjExIGRvZXMgbm90IHN1cHBvcnQgbWVz
aCBBTVNEVSBub3csIHdlIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uDQo+ID4gaW4gbXdsd2lmaSBk
cml2ZXIgZm9yIHRoZSB0aW1lIGJlaW5nLiBFeGNlcHQgZm9yIG1lc2ggQU1TRFUsIHdlIHN0aWxs
DQo+ID4gbGV2ZXJhZ2UgbWFjODAyMTEgdG8gaGFuZGxlIGRhdGEgQU1TRFUuDQo+IA0KPiBZb3Un
cmUgYWxsb3dlZCB0byBtb2RpZnkgbWFjODAyMTEuDQo+IA0KPiA+ID4gV2hhdCdzIGdvaW5nIG9u
IGhlcmU/IFdoeSBhcmUgeW91IG1vZGlmeWluZyB0aGUgYWN0aW9uIGZyYW1lcyBvbiB0aGUNCj4g
PiA+IGZseT8/IQ0KPiA+ID4NCj4gPg0KPiA+IER1ZSB0byBtd2x3aWZpIHN1cHBvcnRzIFR4L1J4
IEFNU0RVLCB0aGVzZSBmcmFtZXMgYXJlIG1vZGlmaWVkIHRvDQo+ID4gaW5mb3JtIGNsaWVudCB0
aGF0IHdlIHN1cHBvcnQgQU1TRFUuDQo+ID4NCj4gDQo+IERpdHRvIC0geW91J3JlIGFsbG93ZWQg
dG8gbW9kaWZ5IG1hYzgwMjExLiBXZSBhY3R1YWxseSBoYXZlIGEgcGF0Y2ggbGlrZSB0aGlzDQo+
IGFscmVhZHk6DQo+IGh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvY2dpdC9saW51eC9rZXJuZWwvZ2l0
L2piZXJnL21hYzgwMjExLQ0KPiBuZXh0LmdpdC9jb21taXQvP2lkPTk5ZTdjYTQ0YmI5MTBmMGNi
ZmRhNWQ5MDA4ZTg1MTdkZjBlYmM5MzkNCj4gDQoNCk9uY2UgaWYgdGhpcyBwYXRjaCBpcyByZWFk
eSwgSSB3aWxsIG1vZGlmeSBtd2x3aWZpIHRvIHVzZSBpdC4gVGhhbmtzLg0KDQo+IGpvaGFubmVz
DQo+IC0tDQo+IFRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1
bnN1YnNjcmliZSBsaW51eC13aXJlbGVzcyIgaW4gdGhlDQo+IGJvZHkgb2YgYSBtZXNzYWdlIHRv
IG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcgTW9yZSBtYWpvcmRvbW8gaW5mbyBhdA0KPiBodHRw
Oi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwNCg==

2015-11-26 09:40:08

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

On Thu, 2015-11-26 at 08:27 +0000, David Lin wrote:

> > Since you do this in .probe, you should consider loading the
> > firmware asynchronously.
> >
>
> I hope I can postpone this modification later.

I don't feel strongly about this one - otoh it's not really
complicated.

> > > +#ifdef CONFIG_SUPPORT_MFG
> >
> > This Kconfig variable doesn't exist.
> >
>
> The compile variable is used privately by Marvell and our customers
> in production line.

Yeah, still. Make it a proper Kconfig variable, defaulting to off and
hidden under something, or remove it. It's extremely misleading to have
something called CONFIG_* when it's not a Kconfig variable.

> Mac80211 does not support mesh AMSDU now, we implement this function
> in mwlwifi driver for the time being. Except for mesh AMSDU, we still
> leverage mac80211 to handle data AMSDU.

You're allowed to modify mac80211.

> > What's going on here? Why are you modifying the action frames on
> > the fly??!
> >
>
> Due to mwlwifi supports Tx/Rx AMSDU, these frames are modified to
> inform client that we support AMSDU.
>

Ditto - you're allowed to modify mac80211. We actually have a patch
like this already:
https://git.kernel.org/cgit/linux/kernel/git/jberg/mac80211-
next.git/commit/?id=99e7ca44bb910f0cbfda5d9008e8517df0ebc939

johannes

2015-11-12 19:47:41

by Jes Sorensen

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

David Lin <[email protected]> writes:
> This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897
> chipsets.
> This driver was developed as part of the openwrt.org project to support
> Linksys WRT1900AC and is maintained on https://github.com/kaloz/mwlwifi.
>
> The mwlwifi driver differs from existing mwifiex driver:
> o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem
> to provide full AP/Wireless Bridge functionality (routers).
> o mwifiex is a "fullmac driver" which provides a comprehensive set of
> client functions (laptops/embedded devices)
> o only mwlwifi supports Marvell AP chip 886X series
>
> NOTE: Users with Marvell 88W8897 chipsets currently should enable
> (CONFIG=Y or M) either CONFIG_MWIFIEX or CONFIG_MWLWIFI, NOT BOTH.

I didn't get very far reading through this - but there was a few bits
that stood out like a sore thumb.

> mwlwifi driver leveraged code from existing MWL8K driver in the
> following areas:
> - 802.11n setting for mac80211
> - Functions needed to hook up to mac80211
> - Interactions with mac80211 to establish BA streams
> - Partial firmware APIs, some data fields
> - Method to pass Rx packets to mac80211 except 11ac rates
>
> In addition, mwlwifi driver supports:
> - future scalability and future development (refactored source code)
> - Marvell 802.11ac chipsets, including combo BT devices
> - 802.11ac related settings and functions
> - concurrent AP+STA functionalities with single firmware per chip
> - firmware APIs for the supported chipset
> - communicating new mac80211 settings to firmware
> - Different TX/RX datapath where applicable
> - A-MSDU and A-MPDU
> - mac80211-based MESH (work in progress)
> - Refined the code to establish BA streams
>
> NOTE: MWLWIFI will be organized under new vendor specific folder/marvell,
> as per request of the gate keeper and community.
>
> Signed-off-by: David Lin <[email protected]>
> ---
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 27b27c0..7c32f0a 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -6629,6 +6629,12 @@ L: [email protected]
> S: Odd Fixes
> F: drivers/net/wireless/mwl8k.c
>
> +MARVELL MWLWIFI WIRELESS DRIVER
> +M: David Lin <[email protected]>
> +L: [email protected]
> +S: Maintained
> +F: drivers/net/wireless/marvell/mwlwifi
> +
> MARVELL SOC MMC/SD/SDIO CONTROLLER DRIVER
> M: Nicolas Pitre <[email protected]>
> S: Odd Fixes
> diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig
> index f9f9422..d599b35 100644
> --- a/drivers/net/wireless/Kconfig
> +++ b/drivers/net/wireless/Kconfig
> @@ -285,5 +285,6 @@ source "drivers/net/wireless/zd1211rw/Kconfig"
> source "drivers/net/wireless/mwifiex/Kconfig"
> source "drivers/net/wireless/cw1200/Kconfig"
> source "drivers/net/wireless/rsi/Kconfig"
> +source "drivers/net/wireless/marvell/Kconfig"
>
> endif # WLAN
> diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile
> index 740fdd3..71504a7 100644
> --- a/drivers/net/wireless/Makefile
> +++ b/drivers/net/wireless/Makefile
> @@ -60,3 +60,5 @@ obj-$(CONFIG_BRCMSMAC) += brcm80211/
>
> obj-$(CONFIG_CW1200) += cw1200/
> obj-$(CONFIG_RSI_91X) += rsi/
> +
> +obj-$(CONFIG_WL_MARVELL) += marvell/
> diff --git a/drivers/net/wireless/marvell/Kconfig
> b/drivers/net/wireless/marvell/Kconfig
> new file mode 100644
> index 0000000..d73e642
> --- /dev/null
> +++ b/drivers/net/wireless/marvell/Kconfig
> @@ -0,0 +1,8 @@
> +menuconfig WL_MARVELL
> + bool "Marvell Wireless LAN support"
> + ---help---
> + Enable community drivers for Marvell Wi-Fi devices.
> +
> +if WL_MARVELL
> +source "drivers/net/wireless/marvell/mwlwifi/Kconfig"
> +endif # WL_MARVELL
> diff --git a/drivers/net/wireless/marvell/Makefile
> b/drivers/net/wireless/marvell/Makefile
> new file mode 100644
> index 0000000..70d1b3f
> --- /dev/null
> +++ b/drivers/net/wireless/marvell/Makefile
> @@ -0,0 +1 @@
> +obj-$(CONFIG_MWLWIFI) += mwlwifi/
> diff --git a/drivers/net/wireless/marvell/mwlwifi/Kconfig
> b/drivers/net/wireless/marvell/mwlwifi/Kconfig
> new file mode 100644
> index 0000000..a9bcb9c
> --- /dev/null
> +++ b/drivers/net/wireless/marvell/mwlwifi/Kconfig
> @@ -0,0 +1,23 @@
> +config MWLWIFI
> + tristate "Marvell Avastar 88W8864/88W8897 PCIe driver (mac80211
> compatible)"
> + depends on PCI && MAC80211
> + select FW_LOADER
> + ---help---
> + Select to build the driver supporting the:
> +
> + Marvell Wireless Wi-Fi 88W8864 modules
> + Marvell Wireless Wi-Fi 88W8897 modules
> +
> + This driver uses the kernel's mac80211 subsystem.
> +
> + If you want to compile the driver as a module (= code which can be
> + inserted in and removed from the running kernel whenever you want),
> + say M here and read <file:Documentation/kbuild/modules.txt>. The
> + module will be called mwlwifi.
> +
> + NOTE: Selecting this driver may cause conflict with MWIFIEX driver
> + that also operates on the same part number 88W8897. Users should
> + select either MWIFIEX or MWLWIFI, not both. MWIFIEX is fullmac,
> + supporting more comprehensive client functions for laptops/embedded
> + devices. MWLWIFI is mac80211-based for full AP/Wireless Bridge.
> +
> diff --git a/drivers/net/wireless/marvell/mwlwifi/Makefile
> b/drivers/net/wireless/marvell/mwlwifi/Makefile
> new file mode 100644
> index 0000000..88f7efd
> --- /dev/null
> +++ b/drivers/net/wireless/marvell/mwlwifi/Makefile
> @@ -0,0 +1,12 @@
> +obj-$(CONFIG_MWLWIFI) += mwlwifi.o
> +
> +mwlwifi-objs += main.o
> +mwlwifi-objs += mac80211.o
> +mwlwifi-objs += fwdl.o
> +mwlwifi-objs += fwcmd.o
> +mwlwifi-objs += tx.o
> +mwlwifi-objs += rx.o
> +mwlwifi-objs += isr.o
> +mwlwifi-$(CONFIG_DEBUG_FS) += debugfs.o
> +
> +ccflags-y += -D__CHECK_ENDIAN__
> diff --git a/drivers/net/wireless/marvell/mwlwifi/debugfs.c
> b/drivers/net/wireless/marvell/mwlwifi/debugfs.c
> new file mode 100644
> index 0000000..997461a
> --- /dev/null
> +++ b/drivers/net/wireless/marvell/mwlwifi/debugfs.c
> @@ -0,0 +1,433 @@
> +/*
> + * Copyright (C) 2006-2015, Marvell International Ltd.
> + *
> + * This software file (the "File") is distributed by Marvell International
> + * Ltd. under the terms of the GNU General Public License Version 2, June 1991
> + * (the "License"). You may use, redistribute and/or modify this File in
> + * accordance with the terms and conditions of the License, a copy of which
> + * is available by writing to the Free Software Foundation, Inc.
> + *
> + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
> + * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
> + * this warranty disclaimer.
> + */
> +
> +/* Description: This file implements debug fs related functions. */
> +
> +#include <linux/debugfs.h>
> +
> +#include "sysadpt.h"
> +#include "dev.h"
> +#include "hostcmd.h"
> +#include "fwcmd.h"
> +#include "debugfs.h"
> +
> +#define MWLWIFI_DEBUGFS_ADD_FILE(name) do { \
> + if (!debugfs_create_file(#name, 0644, priv->debugfs_phy, \
> + priv, &mwl_debugfs_##name##_fops)) \
> + return; \
> +} while (0)

This macros relies on implicit arguments which is just bad and doesn't
really do anything except for obfuscating the code.

> +#define MWLWIFI_DEBUGFS_FILE_OPS(name) \
> +static const struct file_operations mwl_debugfs_##name##_fops = { \
> + .read = mwl_debugfs_##name##_read, \
> + .write = mwl_debugfs_##name##_write, \
> + .open = simple_open, \
> +}
> +
> +#define MWLWIFI_DEBUGFS_FILE_READ_OPS(name) \
> +static const struct file_operations mwl_debugfs_##name##_fops = { \
> + .read = mwl_debugfs_##name##_read, \
> + .open = simple_open, \
> +}
> +
> +#define MWLWIFI_DEBUGFS_FILE_WRITE_OPS(name) \
> +static const struct file_operations mwl_debugfs_##name##_fops = { \
> + .write = mwl_debugfs_##name##_write, \
> + .open = simple_open, \
> +}

Again here - you use thiese wrappers once, just declare the structs
explicitly rather than this macro wrapping dance.

> +static int print_mac_addr(char *p, u8 *mac_addr)
> +{
> + int i;
> + char *str = p;
> +
> + str += sprintf(str, "mac address: %02x", mac_addr[0]);
> + for (i = 1; i < ETH_ALEN; i++)
> + str += sprintf(str, ":%02x", mac_addr[i]);
> + str += sprintf(str, "\n");
> +
> + return (str - p);
> +}
> +
> +static int dump_data(char *p, u8 *data, int len, char *title)
> +{
> + char *str = p;
> + int cur_byte = 0;
> + int i;
> +
> + str += sprintf(str, "%s\n", title);
> + for (cur_byte = 0; cur_byte < len; cur_byte += 8) {
> + if ((cur_byte + 8) < len) {
> + for (i = 0; i < 8; i++)
> + str += sprintf(str, "0x%02x ",
> + *(data + cur_byte + i));
> + str += sprintf(str, "\n");
> + } else {
> + for (i = 0; i < (len - cur_byte); i++)
> + str += sprintf(str, "0x%02x ",
> + *(data + cur_byte + i));
> + str += sprintf(str, "\n");
> + break;
> + }
> + }
> +
> + return (str - p);
> +}
> +
> +static ssize_t mwl_debugfs_info_read(struct file *file, char __user *ubuf,
> + size_t count, loff_t *ppos)
> +{
> + struct mwl_priv *priv = (struct mwl_priv *)file->private_data;
> + unsigned long page = get_zeroed_page(GFP_KERNEL);
> + char *p = (char *)page;
> + ssize_t ret;
> +
> + if (!p)
> + return -ENOMEM;
> +
> + p += sprintf(p, "\n");
> + p += sprintf(p, "driver name: %s\n", MWL_DRV_NAME);
> + p += sprintf(p, "chip type: %s\n",
> + (priv->chip_type == MWL8864) ? "88W8864" : "88W8897");
> + p += sprintf(p, "hw version: %X\n", priv->hw_data.hw_version);
> + p += sprintf(p, "driver version: %s\n", MWL_DRV_VERSION);
> + p += sprintf(p, "firmware version: 0x%08x\n",
> + priv->hw_data.fw_release_num);
> + p += print_mac_addr(p, priv->hw_data.mac_addr);
> + p += sprintf(p, "2g: %s\n", priv->disable_2g ? "disable" : "enable");
> + p += sprintf(p, "5g: %s\n", priv->disable_5g ? "disable" : "enable");
> + p += sprintf(p, "antenna: %d %d\n",
> + (priv->antenna_tx == ANTENNA_TX_4_AUTO) ? 4 : 2,
> + (priv->antenna_rx == ANTENNA_TX_4_AUTO) ? 4 : 2);
> + p += sprintf(p, "irq number: %d\n", priv->irq);
> + p += sprintf(p, "iobase0: %p\n", priv->iobase0);
> + p += sprintf(p, "iobase1: %p\n", priv->iobase1);
> + p += sprintf(p, "tx limit: %d\n", priv->txq_limit);
> + p += sprintf(p, "rx limit: %d\n", priv->recv_limit);
> + p += sprintf(p, "ap macid support: %08x\n",
> + priv->ap_macids_supported);
> + p += sprintf(p, "sta macid support: %08x\n",
> + priv->sta_macids_supported);
> + p += sprintf(p, "macid used: %08x\n", priv->macids_used);
> + p += sprintf(p, "mfg mode: %s\n", priv->mfg_mode ? "true" : "false");
> + p += sprintf(p, "\n");
> +
> + ret = simple_read_from_buffer(ubuf, count, ppos, (char *)page,
> + (unsigned long)p - page);
> + free_page(page);
> +
> + return ret;
> +}
> +
> +static ssize_t mwl_debugfs_vif_read(struct file *file, char __user *ubuf,
> + size_t count, loff_t *ppos)
> +{
> + struct mwl_priv *priv = (struct mwl_priv *)file->private_data;
> + unsigned long page = get_zeroed_page(GFP_KERNEL);
> + char *p = (char *)page;
> + struct mwl_vif *mwl_vif;
> + struct ieee80211_vif *vif;
> + char ssid[IEEE80211_MAX_SSID_LEN + 1];
> + ssize_t ret;
> +
> + if (!p)
> + return -ENOMEM;
> +
> + p += sprintf(p, "\n");
> + spin_lock_bh(&priv->vif_lock);
> + list_for_each_entry(mwl_vif, &priv->vif_list, list) {
> + vif = container_of((char *)mwl_vif, struct ieee80211_vif,
> + drv_priv[0]);
> + p += sprintf(p, "macid: %d\n", mwl_vif->macid);
> + switch (vif->type) {
> + case NL80211_IFTYPE_AP:
> + p += sprintf(p, "type: ap\n");
> + memcpy(ssid, vif->bss_conf.ssid,
> + vif->bss_conf.ssid_len);
> + ssid[vif->bss_conf.ssid_len] = 0;
> + p += sprintf(p, "ssid: %s\n", ssid);
> + p += print_mac_addr(p, mwl_vif->bssid);
> + break;
> + case NL80211_IFTYPE_MESH_POINT:
> + p += sprintf(p, "type: mesh\n");
> + p += print_mac_addr(p, mwl_vif->bssid);
> + break;
> + case NL80211_IFTYPE_STATION:
> + p += sprintf(p, "type: sta\n");
> + p += print_mac_addr(p, mwl_vif->sta_mac);
> + break;
> + default:
> + p += sprintf(p, "type: unknown\n");
> + break;
> + }
> + p += sprintf(p, "hw_crypto_enabled: %s\n",
> + mwl_vif->is_hw_crypto_enabled ? "true" : "false");
> + p += sprintf(p, "key idx: %d\n", mwl_vif->keyidx);
> + p += sprintf(p, "IV: %08x%04x\n", mwl_vif->iv32, mwl_vif->iv16);
> + p += dump_data(p, mwl_vif->beacon_info.ie_wmm_ptr,
> + mwl_vif->beacon_info.ie_wmm_len, "WMM:");
> + p += dump_data(p, mwl_vif->beacon_info.ie_rsn_ptr,
> + mwl_vif->beacon_info.ie_rsn_len, "RSN:");
> + p += dump_data(p, mwl_vif->beacon_info.ie_rsn48_ptr,
> + mwl_vif->beacon_info.ie_rsn48_len, "RSN48:");
> + p += dump_data(p, mwl_vif->beacon_info.ie_ht_ptr,
> + mwl_vif->beacon_info.ie_ht_len, "HT:");
> + p += dump_data(p, mwl_vif->beacon_info.ie_vht_ptr,
> + mwl_vif->beacon_info.ie_vht_len, "VHT:");
> + p += sprintf(p, "\n");
> + }
> + spin_unlock_bh(&priv->vif_lock);

I hope there is no way that the number of vifs can get to the point
where you overflow the page allocated since there is no cap on the
sprintf() usage in dump_data().

> +
> +MWLWIFI_DEBUGFS_FILE_READ_OPS(info);
> +MWLWIFI_DEBUGFS_FILE_READ_OPS(vif);
> +MWLWIFI_DEBUGFS_FILE_READ_OPS(sta);
> +MWLWIFI_DEBUGFS_FILE_READ_OPS(ampdu);
> +MWLWIFI_DEBUGFS_FILE_OPS(regrdwr);
> +
> +void mwl_debugfs_init(struct ieee80211_hw *hw)
> +{
> + struct mwl_priv *priv = hw->priv;
> +
> + if (!priv->debugfs_phy)
> + priv->debugfs_phy = debugfs_create_dir("mwlwifi",
> + hw->wiphy->debugfsdir);
> +
> + if (!priv->debugfs_phy)
> + return;
> +
> + MWLWIFI_DEBUGFS_ADD_FILE(info);
> + MWLWIFI_DEBUGFS_ADD_FILE(vif);
> + MWLWIFI_DEBUGFS_ADD_FILE(sta);
> + MWLWIFI_DEBUGFS_ADD_FILE(ampdu);
> + MWLWIFI_DEBUGFS_ADD_FILE(regrdwr);
> +}
> +
> +void mwl_debugfs_remove(struct ieee80211_hw *hw)
> +{
> + struct mwl_priv *priv = hw->priv;
> +
> + debugfs_remove(priv->debugfs_phy);
> + priv->debugfs_phy = NULL;
> +}
> diff --git a/drivers/net/wireless/marvell/mwlwifi/debugfs.h
> b/drivers/net/wireless/marvell/mwlwifi/debugfs.h
> new file mode 100644
> index 0000000..dfc2a3c
> --- /dev/null
> +++ b/drivers/net/wireless/marvell/mwlwifi/debugfs.h
> @@ -0,0 +1,24 @@
> +/*
> + * Copyright (C) 2006-2015, Marvell International Ltd.
> + *
> + * This software file (the "File") is distributed by Marvell International
> + * Ltd. under the terms of the GNU General Public License Version 2, June 1991
> + * (the "License"). You may use, redistribute and/or modify this File in
> + * accordance with the terms and conditions of the License, a copy of which
> + * is available by writing to the Free Software Foundation, Inc.
> + *
> + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
> + * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
> + * this warranty disclaimer.
> + */
> +
> +/* Description: This file defines debug fs related functions. */
> +
> +#ifndef _debugfs_h_
> +#define _debugfs_h_

The general convention is to user upper-case for the these - not a
biggie though.

> +struct mwl_priv {
> + struct ieee80211_hw *hw;
> + struct firmware *fw_ucode;
> + int chip_type;
> +
> + struct device_node *dt_node;
> + struct device_node *pwr_node;
> + bool disable_2g;
> + bool disable_5g;
> + int antenna_tx;
> + int antenna_rx;
> +
> + struct mwl_tx_pwr_tbl tx_pwr_tbl[SYSADPT_MAX_NUM_CHANNELS];
> + bool cdd;
> + u16 txantenna2;
> + u8 powinited;
> + u16 max_tx_pow[SYSADPT_TX_POWER_LEVEL_TOTAL]; /* max tx power (dBm) */
> + u16 target_powers[SYSADPT_TX_POWER_LEVEL_TOTAL]; /* target powers */
> + u8 cal_tbl[200];
> +
> + struct pci_dev *pdev;
> + void __iomem *iobase0; /* MEM Base Address Register 0 */
> + void __iomem *iobase1; /* MEM Base Address Register 1 */
> + u32 next_bar_num;
> +
> + spinlock_t fwcmd_lock; /* for firmware command */
> + unsigned short *pcmd_buf; /* pointer to CmdBuf (virtual) */
> + dma_addr_t pphys_cmd_buf; /* pointer to CmdBuf (physical) */
> + bool in_send_cmd;
> +
> + int irq;
> + struct mwl_hw_data hw_data; /* Adapter HW specific info */
> +
> + /* various descriptor data */
> + spinlock_t tx_desc_lock; /* for tx descriptor data */
> + spinlock_t rx_desc_lock; /* for rx descriptor data */

You probably don't want to declare these two right next to each other,
if you expect the RX and TX paths of the code to be able to run in
parallel.

Spin locks are not guaranteed to be cache line aligned or cache line
sized, so you can end up with cache line ping pongs between CPUs in this
case.

> + struct mwl_desc_data desc_data[SYSADPT_NUM_OF_DESC_DATA];
> + struct sk_buff_head txq[SYSADPT_NUM_OF_DESC_DATA];
> + struct sk_buff_head delay_q;
> + /* number of descriptors owned by fw at any one time */
> + int fw_desc_cnt[SYSADPT_NUM_OF_DESC_DATA];
> +
> + struct tasklet_struct tx_task;
> + struct tasklet_struct rx_task;
> + struct tasklet_struct qe_task;
> + int txq_limit;
> + bool is_tx_schedule;
> + int recv_limit;
> + bool is_rx_schedule;
> + bool is_qe_schedule;
> + s8 noise; /* Most recently reported noise in dBm */
> + struct ieee80211_supported_band band_24;
> + struct ieee80211_channel channels_24[BAND_24_CHANNEL_NUM];
> + struct ieee80211_rate rates_24[BAND_24_RATE_NUM];
> + struct ieee80211_supported_band band_50;
> + struct ieee80211_channel channels_50[BAND_50_CHANNEL_NUM];
> + struct ieee80211_rate rates_50[BAND_50_RATE_NUM];
> +
> + u32 ap_macids_supported;
> + u32 sta_macids_supported;
> + u32 macids_used;
> + spinlock_t vif_lock; /* for private interface info */
> + struct list_head vif_list; /* List of interfaces. */
> + u32 running_bsses; /* bitmap of running BSSes */
> +
> + spinlock_t sta_lock; /* for private sta info */
> + struct list_head sta_list; /* List of stations */

These two are awfully close together too. You might just get away with
it on x86_64, given list_head is 16 bytes, but the x86_64 packing rules
are odd, so I am never quite sure. On x86_32 it will certainly bite you
- provided vif_lock and sta_lock can get taken from two different paths.

> +
> + bool radio_on;
> + bool radio_short_preamble;
> + bool wmm_enabled;
> + struct ieee80211_tx_queue_params wmm_params[SYSADPT_TX_WMM_QUEUES];
> +
> + /* Ampdu stream information */
> + u8 num_ampdu_queues;
> + spinlock_t stream_lock; /* for ampdu stream */
> + struct mwl_ampdu_stream ampdu[SYSADPT_TX_AMPDU_QUEUES];
> + struct work_struct watchdog_ba_handle;
> +
> + bool mfg_mode;
> +
> +#ifdef CONFIG_DEBUG_FS
> + struct dentry *debugfs_phy;
> + u32 reg_type;
> + u32 reg_offset;
> + u32 reg_value;
> +#endif
> +};
[snip]

> +static void mwl_fwcmd_parse_beacon(struct mwl_priv *priv,
> + struct mwl_vif *vif, u8 *beacon, int len)
> +{
> + struct ieee80211_mgmt *mgmt;
> + struct beacon_info *beacon_info;
> + int baselen;
> + u8 *pos;
> + size_t left;
> + bool elem_parse_failed;
> +
> + mgmt = (struct ieee80211_mgmt *)beacon;
> +
> + baselen = (u8 *)mgmt->u.beacon.variable - (u8 *)mgmt;
> + if (baselen > len)
> + return;
> +
> + beacon_info = &vif->beacon_info;
> + memset(beacon_info, 0, sizeof(struct beacon_info));
> + beacon_info->valid = false;
> + beacon_info->ie_ht_ptr = &beacon_info->ie_list_ht[0];
> + beacon_info->ie_vht_ptr = &beacon_info->ie_list_vht[0];
> +
> + beacon_info->cap_info = le16_to_cpu(mgmt->u.beacon.capab_info);
> +
> + pos = (u8 *)mgmt->u.beacon.variable;
> + left = len - baselen;
> +
> + elem_parse_failed = false;
> +
> + while (left >= 2) {
> + u8 id, elen;
> +
> + id = *pos++;
> + elen = *pos++;
> + left -= 2;
> +
> + if (elen > left) {
> + elem_parse_failed = true;
> + break;
> + }
> +
> + switch (id) {
> + case WLAN_EID_SUPP_RATES:
> + case WLAN_EID_EXT_SUPP_RATES:
> + {
> + int idx, bi, oi;
> + u8 rate;
> +
> + for (bi = 0; bi < SYSADPT_MAX_DATA_RATES_G;
> + bi++) {
> + if (beacon_info->b_rate_set[bi] == 0)
> + break;
> + }
> +
> + for (oi = 0; oi < SYSADPT_MAX_DATA_RATES_G;
> + oi++) {
> + if (beacon_info->op_rate_set[oi] == 0)
> + break;
> + }
> +
> + for (idx = 0; idx < elen; idx++) {
> + rate = pos[idx];
> + if ((rate & 0x80) != 0) {
> + if (bi < SYSADPT_MAX_DATA_RATES_G)
> + beacon_info->b_rate_set[bi++]
> + = rate & 0x7f;
> + else {
> + elem_parse_failed = true;
> + break;
> + }
> + }
> + if (oi < SYSADPT_MAX_DATA_RATES_G)
> + beacon_info->op_rate_set[oi++] =
> + rate & 0x7f;
> + else {
> + elem_parse_failed = true;
> + break;
> + }
> + }
> + }
> + break;
> + case WLAN_EID_RSN:
> + beacon_info->ie_rsn48_len = (elen + 2);
> + beacon_info->ie_rsn48_ptr = (pos - 2);
> + break;
> + case WLAN_EID_HT_CAPABILITY:
> + case WLAN_EID_HT_OPERATION:
> + case WLAN_EID_OVERLAP_BSS_SCAN_PARAM:
> + case WLAN_EID_EXT_CAPABILITY:
> + beacon_info->ie_ht_len += (elen + 2);
> + if (beacon_info->ie_ht_len >
> + sizeof(beacon_info->ie_list_ht)) {
> + elem_parse_failed = true;
> + } else {
> + *beacon_info->ie_ht_ptr++ = id;
> + *beacon_info->ie_ht_ptr++ = elen;
> + memcpy(beacon_info->ie_ht_ptr, pos, elen);
> + beacon_info->ie_ht_ptr += elen;
> + }
> + break;
> +#ifdef CONFIG_MAC80211_MESH
> + case WLAN_EID_MESH_CONFIG:
> + beacon_info->ie_meshcfg_len = (elen + 2);
> + beacon_info->ie_meshcfg_ptr = (pos - 2);
> + break;
> + case WLAN_EID_MESH_ID:
> + beacon_info->ie_meshid_len = (elen + 2);
> + beacon_info->ie_meshid_ptr = (pos - 2);
> + break;
> + case WLAN_EID_CHAN_SWITCH_PARAM:
> + beacon_info->ie_meshchsw_len = (elen + 2);
> + beacon_info->ie_meshchsw_ptr = (pos - 2);
> + break;
> +#endif
> + case WLAN_EID_VHT_CAPABILITY:
> + case WLAN_EID_VHT_OPERATION:
> + case WLAN_EID_OPMODE_NOTIF:
> + beacon_info->ie_vht_len += (elen + 2);
> + if (beacon_info->ie_vht_len >
> + sizeof(beacon_info->ie_list_vht)) {
> + elem_parse_failed = true;
> + } else {
> + *beacon_info->ie_vht_ptr++ = id;
> + *beacon_info->ie_vht_ptr++ = elen;
> + memcpy(beacon_info->ie_vht_ptr, pos, elen);
> + beacon_info->ie_vht_ptr += elen;
> + }
> + break;
> + case WLAN_EID_VENDOR_SPECIFIC:
> + if ((pos[0] == 0x00) && (pos[1] == 0x50) &&
> + (pos[2] == 0xf2)) {
> + if (pos[3] == 0x01) {
> + beacon_info->ie_rsn_len = (elen + 2);
> + beacon_info->ie_rsn_ptr = (pos - 2);
> + }
> +
> + if (pos[3] == 0x02) {
> + beacon_info->ie_wmm_len = (elen + 2);
> + beacon_info->ie_wmm_ptr = (pos - 2);
> + }
> + }
> + break;
> + default:
> + break;
> + }
> +
> + left -= elen;
> + pos += elen;
> + }
> +
> + if (!elem_parse_failed) {
> + beacon_info->ie_ht_ptr = &beacon_info->ie_list_ht[0];
> + beacon_info->ie_vht_ptr = &beacon_info->ie_list_vht[0];
> + beacon_info->valid = true;
> + }
> +}

Any reason you're not using cfg80211_find_ie() here? Seems to be
re-inventing the wheel to me.

> +void mwl_fwcmd_reset(struct ieee80211_hw *hw)
> +{
> + struct mwl_priv *priv = hw->priv;
> +
> + if (mwl_fwcmd_chk_adapter(priv))
> + writel(ISR_RESET,
> + priv->iobase1 + MACREG_REG_H2A_INTERRUPT_EVENTS);
> +}
> +
> +void mwl_fwcmd_int_enable(struct ieee80211_hw *hw)
> +{
> + struct mwl_priv *priv = hw->priv;
> +
> + if (mwl_fwcmd_chk_adapter(priv)) {
> + writel(0x00,
> + priv->iobase1 + MACREG_REG_A2H_INTERRUPT_MASK);
> + writel((MACREG_A2HRIC_BIT_MASK),
> + priv->iobase1 + MACREG_REG_A2H_INTERRUPT_MASK);

Please avoid superfluous use of parentheses.

> +int mwl_fwcmd_get_hw_specs(struct ieee80211_hw *hw)
> +{
> + struct mwl_priv *priv = hw->priv;
> + struct hostcmd_cmd_get_hw_spec *pcmd;
> + int retry;
> + int i;
> +
> + if (priv->mfg_mode)
> + return 0;
> +
> + pcmd = (struct hostcmd_cmd_get_hw_spec *)&priv->pcmd_buf[0];
> +
> + spin_lock_bh(&priv->fwcmd_lock);
> +
> + wiphy_debug(hw->wiphy, "pcmd = %p\n", pcmd);
> + memset(pcmd, 0x00, sizeof(*pcmd));
> + eth_broadcast_addr(pcmd->permanent_addr);
> + pcmd->cmd_hdr.cmd = cpu_to_le16(HOSTCMD_CMD_GET_HW_SPEC);
> + pcmd->cmd_hdr.len = cpu_to_le16(sizeof(*pcmd));
> + pcmd->fw_awake_cookie = cpu_to_le32(priv->pphys_cmd_buf + 2048);
> +
> + retry = 0;
> + while (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_GET_HW_SPEC)) {
> + if (retry++ > MAX_WAIT_GET_HW_SPECS_ITERATONS) {
> + wiphy_err(hw->wiphy, "can't get hw specs\n");
> + spin_unlock_bh(&priv->fwcmd_lock);
> + return -EIO;
> + }
> +
> + mdelay(1000);
> + wiphy_debug(hw->wiphy,
> + "repeat command = %p\n", pcmd);
> + }

*cough* mdelay(1000) while holding a spin lock and within in a while()
*loop? *cough*

This needs a little cleaning up. Please have a look at
Documentation/timers/timers-howto.txt

> +
> + ether_addr_copy(&priv->hw_data.mac_addr[0], pcmd->permanent_addr);
> + priv->desc_data[0].wcb_base =
> + le32_to_cpu(pcmd->wcb_base0) & 0x0000ffff;
> + for (i = 1; i < SYSADPT_TOTAL_TX_QUEUES; i++)
> + priv->desc_data[i].wcb_base =
> + le32_to_cpu(pcmd->wcb_base[i - 1]) & 0x0000ffff;
> + priv->desc_data[0].rx_desc_read =
> + le32_to_cpu(pcmd->rxpd_rd_ptr) & 0x0000ffff;
> + priv->desc_data[0].rx_desc_write =
> + le32_to_cpu(pcmd->rxpd_wr_ptr) & 0x0000ffff;
> + priv->hw_data.region_code = le16_to_cpu(pcmd->region_code) & 0x00ff;
> + priv->hw_data.fw_release_num = le32_to_cpu(pcmd->fw_release_num);
> + priv->hw_data.max_num_tx_desc = le16_to_cpu(pcmd->num_wcb);
> + priv->hw_data.max_num_mc_addr = le16_to_cpu(pcmd->num_mcast_addr);
> + priv->hw_data.num_antennas = le16_to_cpu(pcmd->num_antenna);
> + priv->hw_data.hw_version = pcmd->version;
> + priv->hw_data.host_interface = pcmd->host_if;
> +
> + spin_unlock_bh(&priv->fwcmd_lock);
> +
> + return 0;
> +}
> +
> +int mwl_fwcmd_set_hw_specs(struct ieee80211_hw *hw)
> +{
> + struct mwl_priv *priv = hw->priv;
> + struct hostcmd_cmd_set_hw_spec *pcmd;
> + int i;
> +
> + if (priv->mfg_mode)
> + return 0;
> +
> + pcmd = (struct hostcmd_cmd_set_hw_spec *)&priv->pcmd_buf[0];
> +
> + spin_lock_bh(&priv->fwcmd_lock);
> +
> + memset(pcmd, 0x00, sizeof(*pcmd));
> + pcmd->cmd_hdr.cmd = cpu_to_le16(HOSTCMD_CMD_SET_HW_SPEC);
> + pcmd->cmd_hdr.len = cpu_to_le16(sizeof(*pcmd));
> + pcmd->wcb_base[0] = cpu_to_le32(priv->desc_data[0].pphys_tx_ring);
> + for (i = 1; i < SYSADPT_TOTAL_TX_QUEUES; i++)
> + pcmd->wcb_base[i] =
> + cpu_to_le32(priv->desc_data[i].pphys_tx_ring);
> + pcmd->tx_wcb_num_per_queue = cpu_to_le32(SYSADPT_MAX_NUM_TX_DESC);
> + pcmd->num_tx_queues = cpu_to_le32(SYSADPT_NUM_OF_DESC_DATA);
> + pcmd->total_rx_wcb = cpu_to_le32(SYSADPT_MAX_NUM_RX_DESC);
> + pcmd->rxpd_wr_ptr = cpu_to_le32(priv->desc_data[0].pphys_rx_ring);
> + pcmd->features = 0;
> +
> + if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_HW_SPEC)) {
> + spin_unlock_bh(&priv->fwcmd_lock);
> + wiphy_err(hw->wiphy, "failed execution\n");
> + return -EIO;
> + }
> +
> + spin_unlock_bh(&priv->fwcmd_lock);
> +
> + return 0;
> +}

It looks like fwcmd_lock() is used in this way in every instance. Could
you not allocate a pool of command buffers, put them on a list, and
only take the lock while you pull them out and reinsert them back into
the list?

If you need to hold a lock during firmware command execution, you
probably should switch to a mutex mechanism rather than spin locks.

> +
> +int mwl_fwcmd_get_stat(struct ieee80211_hw *hw,
> + struct ieee80211_low_level_stats *stats)
> +{
> + struct mwl_priv *priv = hw->priv;
> + struct hostcmd_cmd_802_11_get_stat *pcmd;
> +
> + pcmd = (struct hostcmd_cmd_802_11_get_stat *)&priv->pcmd_buf[0];
> +
> + spin_lock_bh(&priv->fwcmd_lock);
> +
> + memset(pcmd, 0x00, sizeof(*pcmd));
> + pcmd->cmd_hdr.cmd = cpu_to_le16(HOSTCMD_CMD_802_11_GET_STAT);
> + pcmd->cmd_hdr.len = cpu_to_le16(sizeof(*pcmd));
> +
> + if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_802_11_GET_STAT)) {
> + spin_unlock_bh(&priv->fwcmd_lock);
> + wiphy_err(hw->wiphy, "failed execution\n");
> + return -EIO;
> + }
> +
> + stats->dot11ACKFailureCount =
> + le32_to_cpu(pcmd->ack_failures);
> + stats->dot11RTSFailureCount =
> + le32_to_cpu(pcmd->rts_failures);
> + stats->dot11FCSErrorCount =
> + le32_to_cpu(pcmd->rx_fcs_errors);
> + stats->dot11RTSSuccessCount =
> + le32_to_cpu(pcmd->rts_successes);
> +
> + spin_unlock_bh(&priv->fwcmd_lock);
> +
> + return 0;
> +}
> +
> +int mwl_fwcmd_radio_enable(struct ieee80211_hw *hw)
> +{
> + return mwl_fwcmd_802_11_radio_control(hw->priv, true, false);
> +}
> +
> +int mwl_fwcmd_radio_disable(struct ieee80211_hw *hw)
> +{
> + return mwl_fwcmd_802_11_radio_control(hw->priv, false, false);
> +}

These last two makes me think you only use the spin lock for buffer
management and not the command execution itself?

I am out of time for today, I'll try to see if I can find more time
later - please look into fixing the above.

Jes

2015-11-26 08:27:13

by David Lin

[permalink] [raw]
Subject: RE: [PATCH v7] Add new mac80211 driver mwlwifi.

PiBPbiBOb3ZlbWJlciAyMCwgMjAxNSA3OjIyIFBNLCBKb2hhbm5lcyBCZXJnIHdyb3RlOg0KPiAN
Cj4gT24gVGh1LCAyMDE1LTExLTEyIGF0IDAzOjUxICswMDAwLCBEYXZpZCBMaW4gd3JvdGU6DQo+
ID4NCj4gPiArc3RhdGljIGludCBwcmludF9tYWNfYWRkcihjaGFyICpwLCB1OCAqbWFjX2FkZHIp
IHsNCj4gPiArCWludCBpOw0KPiA+ICsJY2hhciAqc3RyID0gcDsNCj4gPiArDQo+ID4gKwlzdHIg
Kz0gc3ByaW50ZihzdHIsICJtYWMgYWRkcmVzczogJTAyeCIsIG1hY19hZGRyWzBdKTsNCj4gPiAr
CWZvciAoaSA9IDE7IGkgPCBFVEhfQUxFTjsgaSsrKQ0KPiA+ICsJCXN0ciArPSBzcHJpbnRmKHN0
ciwgIjolMDJ4IiwgbWFjX2FkZHJbaV0pOw0KPiA+ICsJc3RyICs9IHNwcmludGYoc3RyLCAiXG4i
KTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gKHN0ciAtIHApOw0KPiA+ICt9DQo+IA0KPiBZb3UgY2Fu
IHVzZSAlcE0gaGVyZSAoYW5kIHBlcmhhcHMgZ2V0IHJpZCBvZiB0aGUgZnVuY3Rpb24gdGhlbikN
Cj4gDQoNCkkgd2lsbCBtb2RpZnkgaXQuDQoNCj4gPiArdm9pZCBtd2xfZGVidWdmc19yZW1vdmUo
c3RydWN0IGllZWU4MDIxMV9odyAqaHcpIHsNCj4gPiArCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9
IGh3LT5wcml2Ow0KPiA+ICsNCj4gPiArCWRlYnVnZnNfcmVtb3ZlKHByaXYtPmRlYnVnZnNfcGh5
KTsNCj4gDQo+IGRvZXNuJ3QgdGhhdCBoYXZlIHRvIGJlIF9yZWN1cnNpdmUoKT8NCj4gDQo+ID4g
KyNkZWZpbmUgTVdMX0RSVl9OQU1FwqDCoMKgwqDCoEtCVUlMRF9NT0ROQU1FDQo+ID4gKyNkZWZp
bmUgTVdMX0RSVl9WRVJTSU9OCcKgIjEwLjMuMC4xNCINCj4gDQo+IHZlcnNpb25zIGxpa2UgdGhh
dCBhcmUgZ2VuZXJhbGx5IGZhaXJseSB1c2VsZXNzIHNpbmNlIHlvdSBkb24ndCB1cGRhdGUgdGhl
bSBmb3INCj4gZXZlcnkgY29tbWl0IC4uLg0KPiANCg0KV2Ugc3RpbGwgbmVlZCB2ZXJzaW9uIGlu
Zm9ybWF0aW9uIGZvciBmb3JtYWwgcmVsZWFzZS4NCg0KPiA+ICtzdHJ1Y3QgbXdsX3R4X2Rlc2Mg
ew0KPiA+ICsJdTggZGF0YV9yYXRlOw0KPiA+ICsJdTggdHhfcHJpb3JpdHk7DQo+ID4gKwlfX2xl
MTYgcW9zX2N0cmw7DQo+IFsuLi5dDQo+IA0KPiBJIHN0aWxsIHdvdWxkbid0IG1peCBkZXZpY2Uv
ZmlybXdhcmUgQVBJIHdpdGggZHJpdmVyLXVzZSBzdHJ1Y3R1cmVzIGluIHRoZSBzYW1lDQo+IGZp
bGUsIGl0IGdldHMgY29uZnVzaW5nLiBJdCdzIHlvdXIgZHJpdmVyIHRob3VnaCwgc28gaWYgeW91
IHJlYWxseSB3YW50IHRvIGNvbmZ1c2UNCj4geW91cnNlbHZlcyAuLi4gYXNzdW1pbmcgeW91J3Jl
IGdvaW5nIHRvIG1haW50YWluIGl0IDopDQo+DQoNClRoZXNlIGZpZWxkcyBhcmUgZmlybXdhcmUg
QVBJLiBZZXMsIHdlIHdpbGwgbWFpbnRhaW4gaXQuDQoNCj4gPiArc3RydWN0IG13bF9zdGEgew0K
PiA+ICsJc3RydWN0IGxpc3RfaGVhZCBsaXN0Ow0KPiA+ICsJYm9vbCBpc19tZXNoX25vZGU7DQo+
ID4gKwlib29sIGlzX2FtcGR1X2FsbG93ZWQ7DQo+ID4gKwlzdHJ1Y3QgbXdsX3R4X2luZm8gdHhf
c3RhdHNbTVdMX01BWF9USURdOw0KPiA+ICsJYm9vbCBpc19hbXNkdV9hbGxvd2VkOw0KPiA+ICsJ
c3BpbmxvY2tfdCBhbXNkdV9sb2NrO8KgwqDCoMKgwqDCoC8qIGZvciBhbXNkdQ0KPiA+IGFnZ3Jl
Z2F0aW9uwqDCoMKgwqDCoMKgwqAqLw0KPiA+ICsJc3RydWN0IG13bF9hbXNkdV9jdHJsIGFtc2R1
X2N0cmw7DQo+ID4gKwl1MTYgaXYxNjsNCj4gPiArCXUzMiBpdjMyOw0KPiA+ICt9Ow0KPiANCj4g
SSBzdGlsbCBkb24ndCBzZWUgaG93IHRoaXMgaXYgc3R1ZmYgaW4gdGhlICpzdGF0aW9uKiBjYW4g
cG9zc2libHkgYmUgcmlnaHQuIEkgdGhpbmsgSQ0KPiBhbHNvIHBvaW50ZWQgb3V0IGVhcmxpZXIg
dGhhdCB5b3UgY2FuIGp1c3QgbGV0DQo+IG1hYzgwMjExIGFzc2lnbiB0aGUgUE4vSVYuDQo+IA0K
DQpJIHdpbGwgdHJ5IHRvIG1vZGlmeSB0aGUgY29kZSB0byByZW1vdmUgdGhlbS4NCg0KPiA+ICtz
dGF0aWMgaW50IG13bF9md2NtZF93YWl0X2NvbXBsZXRlKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwg
dW5zaWduZWQNCj4gPiBzaG9ydCBjbWQpDQo+ID4gK3sNCj4gPg0KPiBbLi4uXQ0KPiA+ICsJbWRl
bGF5KDMpOw0KPiA+ICsNCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0
aWMgaW50IG13bF9md2NtZF9leGVjX2NtZChzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIHVuc2lnbmVk
IHNob3J0DQo+ID4gY21kKQ0KPiA+ICt7DQo+IFsuLi5dDQo+ID4gKwkJaWYgKG13bF9md2NtZF93
YWl0X2NvbXBsZXRlKHByaXYsIDB4ODAwMCB8IGNtZCkpIHsNCj4gWy4uLl0NCj4gPiArfQ0KPiA+
ICsNCj4gPiArc3RhdGljIGludCBtd2xfZndjbWRfODAyXzExX3JhZGlvX2NvbnRyb2woc3RydWN0
IG13bF9wcml2ICpwcml2LA0KPiA+ICsJCQkJCcKgwqBib29sIGVuYWJsZSwgYm9vbCBmb3JjZSkN
Cj4gPiArew0KPiBbLi4uXQ0KPiA+ICsJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsN
Cj4gWy4uLl0NCj4gPiArCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwNCj4gPiBIT1NUQ01E
X0NNRF84MDJfMTFfUkFESU9fQ09OVFJPTCkpIHsNCj4gPiArCQlzcGluX3VubG9ja19iaCgmcHJp
di0+ZndjbWRfbG9jayk7DQo+IA0KPiBUaGlzIHNlZW1zIGxpa2UgYSB0ZXJyaWJsZSBpZGVhLiBT
cGlubmluZyBmb3IgMyBtaWxsaXNlY29uZHMgKGFuZCBtb3JlKSB3aGlsZQ0KPiBibG9ja2luZyBs
b2NhbCBzb2Z0LWlycXMgaXMgcmVhbGx5IGJhZCBmb3IgZ2VuZXJhbCBsYXRlbmN5IG9uIHRoZSBz
eXN0ZW0uIEkgZG9uJ3QNCj4gbGlrZSBpdCBhdCBhbGwuDQo+IA0KPiBBbmQgdGhlcmUgZG9lc24n
dCByZWFsbHkgc2VlbSB0byBiZSBtdWNoIHJlYXNvbiBmb3IgaXQgZWl0aGVyIGFzIGZhciBhcyBJ
IGNhbg0KPiB0ZWxsIC0gYWxtb3N0IGFsbCBwbGFjZXMgY2FuIChhcyBJIHBvaW50ZWQgb3V0IGJl
Zm9yZSkgbGl2ZSB3aXRoIHRoaXMgYmVpbmcgYQ0KPiBtdXRleCwgeW91IGp1c3QgbmVlZCBzcGVj
aWFsIGhhbmRsaW5nIGluIHZlcnkgZmV3IHBsYWNlcyB0aGF0IHJlYWxseSBkbyB3YW50IHRvDQo+
IHNlbmQgYSBjb21tYW5kIHdoaWxlIG5vdCBiZWluZyBhYmxlIHRvIHNsZWVwLg0KPiANCg0KSSB3
aWxsIHRyeSB0byB1c2UgbXV0ZXggaW4gbmV4dCBwYXRjaCBzb29uLg0KDQo+ID4gKysrIGIvZHJp
dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2hvc3RjbWQuaA0KPiANCj4gVGhpcyBs
b29rcyBsaWtlIHlvdSBkbyBoYXZlIGEgZmlsZSBmb3IgY29tbWFuZHMgLSBtYXliZSBtb3ZlIHRo
YXQgVFggdGhpbmcNCj4gYWJvdmUgaGVyZT8NCj4gDQoNCkl0IGlzIGJldHRlciB0byBrZWVwIGN1
cnJlbnQgZmlsZSBzdHJ1Y3R1cmUgKGVhc2llciBmb3Igb3VyIGludGVybmFsIG1haW50ZW5hbmNl
IHN5bmNpbmcgb3RoZXIgZmlsZXMpDQoNCj4gPiArY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMg
bXdsX21hYzgwMjExX29wcyA9IHsNCj4gPiArCS50eMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgwqA9IG13bF9tYWM4MDIxMV90eCwNCj4gPiArCS5zdGFydMKgwqDCoMKgwqDCoMKgwqDC
oMKgwqDCoMKgwqA9IG13bF9tYWM4MDIxMV9zdGFydCwNCj4gPiArCS5zdG9wwqDCoMKgwqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgPSBtd2xfbWFjODAyMTFfc3RvcCwNCj4gPiArCS5hZGRfaW50ZXJm
YWNlwqDCoMKgwqDCoMKgPSBtd2xfbWFjODAyMTFfYWRkX2ludGVyZmFjZSwNCj4gPiArCS5yZW1v
dmVfaW50ZXJmYWNlwqDCoMKgPSBtd2xfbWFjODAyMTFfcmVtb3ZlX2ludGVyZmFjZSwNCj4gPiAr
CS5jb25maWfCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gbXdsX21hYzgwMjExX2NvbmZpZywN
Cj4gPiArCS5ic3NfaW5mb19jaGFuZ2VkwqDCoMKgPSBtd2xfbWFjODAyMTFfYnNzX2luZm9fY2hh
bmdlZCwNCj4gPiArCS5jb25maWd1cmVfZmlsdGVywqDCoMKgPSBtd2xfbWFjODAyMTFfY29uZmln
dXJlX2ZpbHRlciwNCj4gPiArCS5zZXRfa2V5wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSBtd2xf
bWFjODAyMTFfc2V0X2tleSwNCj4gPiArCS5zZXRfcnRzX3RocmVzaG9sZMKgwqA9IG13bF9tYWM4
MDIxMV9zZXRfcnRzX3RocmVzaG9sZCwNCj4gPiArCS5zdGFfYWRkwqDCoMKgwqDCoMKgwqDCoMKg
wqDCoMKgPSBtd2xfbWFjODAyMTFfc3RhX2FkZCwNCj4gPiArCS5zdGFfcmVtb3ZlwqDCoMKgwqDC
oMKgwqDCoMKgPSBtd2xfbWFjODAyMTFfc3RhX3JlbW92ZSwNCj4gPiArCS5jb25mX3R4wqDCoMKg
wqDCoMKgwqDCoMKgwqDCoMKgPSBtd2xfbWFjODAyMTFfY29uZl90eCwNCj4gPiArCS5nZXRfc3Rh
dHPCoMKgwqDCoMKgwqDCoMKgwqDCoD0gbXdsX21hYzgwMjExX2dldF9zdGF0cywNCj4gPiArCS5n
ZXRfc3VydmV5wqDCoMKgwqDCoMKgwqDCoMKgPSBtd2xfbWFjODAyMTFfZ2V0X3N1cnZleSwNCj4g
PiArCS5hbXBkdV9hY3Rpb27CoMKgwqDCoMKgwqDCoD0gbXdsX21hYzgwMjExX2FtcGR1X2FjdGlv
biwgfTsNCj4gDQo+IEFwYXJ0IGZyb20gLnR4IGFuZCAuY29uZmlndXJlX2ZpbHRlciwgYWxsIG9m
IHRoZXNlIGNhbiBzbGVlcCBJIHRoaW5rLg0KPiANCj4gPiArCXJjID0gbXdsX2luaXRfZmlybXdh
cmUocHJpdiwgZndfbmFtZSk7DQo+ID4NCj4gU2luY2UgeW91IGRvIHRoaXMgaW4gLnByb2JlLCB5
b3Ugc2hvdWxkIGNvbnNpZGVyIGxvYWRpbmcgdGhlIGZpcm13YXJlDQo+IGFzeW5jaHJvbm91c2x5
Lg0KPiANCg0KSSBob3BlIEkgY2FuIHBvc3Rwb25lIHRoaXMgbW9kaWZpY2F0aW9uIGxhdGVyLg0K
DQo+ID4gKyNpZmRlZiBDT05GSUdfU1VQUE9SVF9NRkcNCj4gDQo+IFRoaXMgS2NvbmZpZyB2YXJp
YWJsZSBkb2Vzbid0IGV4aXN0Lg0KPiANCg0KVGhlIGNvbXBpbGUgdmFyaWFibGUgaXMgdXNlZCBw
cml2YXRlbHkgYnkgTWFydmVsbCBhbmQgb3VyIGN1c3RvbWVycyBpbiBwcm9kdWN0aW9uIGxpbmUu
DQoNCj4gPiArc3RhdGljIGlubGluZSBib29sIG13bF9yeF9wcm9jZXNzX21lc2hfYW1zZHUoc3Ry
dWN0IG13bF9wcml2ICpwcml2LA0KPiA+ICsJCQkJCcKgwqDCoMKgwqBzdHJ1Y3Qgc2tfYnVmZiAq
c2tiLA0KPiANCj4gDQo+IA0KPiANCj4gUGxlYXNlIGluc3RlYWQgdGVhY2ggbWFjODAyMTEgdG8g
ZG8gaXQgcmlnaHQuDQo+IA0KDQpNYWM4MDIxMSBkb2VzIG5vdCBzdXBwb3J0IG1lc2ggQU1TRFUg
bm93LCB3ZSBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBpbiBtd2x3aWZpIGRyaXZlciBmb3IgdGhl
IHRpbWUgYmVpbmcuIEV4Y2VwdCBmb3IgbWVzaCBBTVNEVSwgd2Ugc3RpbGwgbGV2ZXJhZ2UgbWFj
ODAyMTEgdG8gaGFuZGxlIGRhdGEgQU1TRFUuDQoNCj4gPiArCWlmIChpZWVlODAyMTFfaXNfZGF0
YSh3aC0+ZnJhbWVfY29udHJvbCkpIHsNCj4gPiArCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2Fk
ZHIod2gtPmFkZHIxKSkgew0KPiA+ICsJCQlpZiAoY2NtcCkgew0KPiA+ICsJCQkJbXdsX3R4X2lu
c2VydF9jY21wX2hkcihkbWFfZGF0YS0NCj4gPiA+ZGF0YSwNCj4gPiArCQkJCQkJwqDCoMKgwqDC
oMKgwqBtd2xfdmlmLQ0KPiA+ID5rZXlpZHgsDQo+ID4gKwkJCQkJCcKgwqDCoMKgwqDCoMKgbXds
X3ZpZi0NCj4gPiA+aXYxNiwNCj4gPiArCQkJCQkJwqDCoMKgwqDCoMKgwqBtd2xfdmlmLQ0KPiA+
ID5pdjMyKTsNCj4gPiArCQkJCUlOQ1JFQVNFX0lWKG13bF92aWYtPml2MTYsIG13bF92aWYtDQo+
ID4gPml2MzIpOw0KPiA+ICsJCQl9DQo+IA0KPiBDYW4ndCB5b3UgbGV0IG1hYzgwMjExIGRlYWwg
d2l0aCB0aGlzPw0KPiANCj4gTm93IEkgYWN0dWFsbHkgYW0gYmVnaW5uaW5nIHRvIHVuZGVyc3Rh
bmQgLSB5b3UgbmVlZCB0aGlzIGZvciBHVEsgb25seSwgc28gaXQNCj4gbWlnaHQgZXZlbiB3b3Jr
IGluIHRoZSBzdGF0aW9uIC4uLiBidXQgc3RpbGwsIGRvbid0IGRvIGl0LCBzZXQgdGhlIGZsYWcg
dG8gbWFrZQ0KPiBtYWM4MDIxMSBkbyBpdCBvbiB0aGUgR1RLLg0KPiANCg0KSSB3aWxsIGNoZWNr
IG1hYzgwMjExIHRvIHNlZSBpZiBJIGNhbiBsZXQgbWFjODAyMTEgZG8gaXQuDQoNCj4gPiArCWlm
IChtZ210ZnJhbWUpIHsNCj4gPiArCQl1MTYgY2FwYWI7DQo+ID4gKw0KPiA+ICsJCWlmICh1bmxp
a2VseShpZWVlODAyMTFfaXNfYWN0aW9uKHdoLT5mcmFtZV9jb250cm9sKQ0KPiA+ICYmDQo+ID4g
KwkJCcKgwqDCoMKgwqBtZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9PQ0KPiA+IFdMQU5fQ0FURUdP
UllfQkFDSyAmJg0KPiA+ICsJCQnCoMKgwqDCoMKgbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEu
YWN0aW9uX2NvZGUNCj4gPiA9PQ0KPiA+ICsJCQnCoMKgwqDCoMKgV0xBTl9BQ1RJT05fQUREQkFf
UkVRKSkgew0KPiA+ICsJCQljYXBhYiA9IGxlMTZfdG9fY3B1KG1nbXQtDQo+ID4gPnUuYWN0aW9u
LnUuYWRkYmFfcmVxLmNhcGFiKTsNCj4gPiArCQkJdGlkID0gKGNhcGFiICYNCj4gPiBJRUVFODAy
MTFfQUREQkFfUEFSQU1fVElEX01BU0spID4+IDI7DQo+ID4gKwkJCWluZGV4ID0gbXdsX3R4X3Rp
ZF9xdWV1ZV9tYXBwaW5nKHRpZCk7DQo+ID4gKwkJCWNhcGFiIHw9IDE7DQo+ID4gKwkJCW1nbXQt
PnUuYWN0aW9uLnUuYWRkYmFfcmVxLmNhcGFiID0NCj4gPiBjcHVfdG9fbGUxNihjYXBhYik7DQo+
ID4gKwkJfQ0KPiANCj4gV2hhdCdzIGdvaW5nIG9uIGhlcmU/IFdoeSBhcmUgeW91IG1vZGlmeWlu
ZyB0aGUgYWN0aW9uIGZyYW1lcyBvbiB0aGUgZmx5Pz8hDQo+IA0KDQpEdWUgdG8gbXdsd2lmaSBz
dXBwb3J0cyBUeC9SeCBBTVNEVSwgdGhlc2UgZnJhbWVzIGFyZSBtb2RpZmllZCB0byBpbmZvcm0g
Y2xpZW50IHRoYXQgd2Ugc3VwcG9ydCBBTVNEVS4NCkZvciBSeCBBTVNEVSwgbXdsd2lmaSBoYW5k
bGVkIG1lc2ggQU1TRFUgYW5kIGxldCBtYWM4MDIxMSBoYW5kbGUgZGF0YSBBTVNEVS4NCg0KPiBq
b2hhbm5lcw0K

2015-11-20 11:22:16

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

On Thu, 2015-11-12 at 03:51 +0000, David Lin wrote:

> +static int print_mac_addr(char *p, u8 *mac_addr)
> +{
> + int i;
> + char *str = p;
> +
> + str += sprintf(str, "mac address: %02x", mac_addr[0]);
> + for (i = 1; i < ETH_ALEN; i++)
> + str += sprintf(str, ":%02x", mac_addr[i]);
> + str += sprintf(str, "\n");
> +
> + return (str - p);
> +}

You can use %pM here (and perhaps get rid of the function then)

> +void mwl_debugfs_remove(struct ieee80211_hw *hw)
> +{
> + struct mwl_priv *priv = hw->priv;
> +
> + debugfs_remove(priv->debugfs_phy);

doesn't that have to be _recursive()?

> +#define MWL_DRV_NAME     KBUILD_MODNAME
> +#define MWL_DRV_VERSION  "10.3.0.14"

versions like that are generally fairly useless since you don't update
them for every commit ...

> +struct mwl_tx_desc {
> + u8 data_rate;
> + u8 tx_priority;
> + __le16 qos_ctrl;
[...]

I still wouldn't mix device/firmware API with driver-use structures in
the same file, it gets confusing. It's your driver though, so if you
really want to confuse yourselves ... assuming you're going to maintain
it :)

> +struct mwl_sta {
> + struct list_head list;
> + bool is_mesh_node;
> + bool is_ampdu_allowed;
> + struct mwl_tx_info tx_stats[MWL_MAX_TID];
> + bool is_amsdu_allowed;
> + spinlock_t amsdu_lock;      /* for amsdu
> aggregation       */
> + struct mwl_amsdu_ctrl amsdu_ctrl;
> + u16 iv16;
> + u32 iv32;
> +};

I still don't see how this iv stuff in the *station* can possibly be
right. I think I also pointed out earlier that you can just let
mac80211 assign the PN/IV.

> +static int mwl_fwcmd_wait_complete(struct mwl_priv *priv, unsigned
> short cmd)
> +{
>
[...]
> + mdelay(3);
> +
> + return 0;
> +}
> +
> +static int mwl_fwcmd_exec_cmd(struct mwl_priv *priv, unsigned short
> cmd)
> +{
[...]
> + if (mwl_fwcmd_wait_complete(priv, 0x8000 | cmd)) {
[...]
> +}
> +
> +static int mwl_fwcmd_802_11_radio_control(struct mwl_priv *priv,
> +   bool enable, bool force)
> +{
[...]
> + spin_lock_bh(&priv->fwcmd_lock);
[...]
> + if (mwl_fwcmd_exec_cmd(priv,
> HOSTCMD_CMD_802_11_RADIO_CONTROL)) {
> + spin_unlock_bh(&priv->fwcmd_lock);

This seems like a terrible idea. Spinning for 3 milliseconds (and more)
while blocking local soft-irqs is really bad for general latency on the
system. I don't like it at all.

And there doesn't really seem to be much reason for it either as far as
I can tell - almost all places can (as I pointed out before) live with
this being a mutex, you just need special handling in very few places
that really do want to send a command while not being able to sleep.

> +++ b/drivers/net/wireless/marvell/mwlwifi/hostcmd.h

This looks like you do have a file for commands - maybe move that TX
thing above here?

> +const struct ieee80211_ops mwl_mac80211_ops = {
> + .tx                 = mwl_mac80211_tx,
> + .start              = mwl_mac80211_start,
> + .stop               = mwl_mac80211_stop,
> + .add_interface      = mwl_mac80211_add_interface,
> + .remove_interface   = mwl_mac80211_remove_interface,
> + .config             = mwl_mac80211_config,
> + .bss_info_changed   = mwl_mac80211_bss_info_changed,
> + .configure_filter   = mwl_mac80211_configure_filter,
> + .set_key            = mwl_mac80211_set_key,
> + .set_rts_threshold  = mwl_mac80211_set_rts_threshold,
> + .sta_add            = mwl_mac80211_sta_add,
> + .sta_remove         = mwl_mac80211_sta_remove,
> + .conf_tx            = mwl_mac80211_conf_tx,
> + .get_stats          = mwl_mac80211_get_stats,
> + .get_survey         = mwl_mac80211_get_survey,
> + .ampdu_action       = mwl_mac80211_ampdu_action,
> +};

Apart from .tx and .configure_filter, all of these can sleep I think.

> + rc = mwl_init_firmware(priv, fw_name);
>
Since you do this in .probe, you should consider loading the firmware
asynchronously.

> +#ifdef CONFIG_SUPPORT_MFG

This Kconfig variable doesn't exist.

> +static inline bool mwl_rx_process_mesh_amsdu(struct mwl_priv *priv,
> +      struct sk_buff *skb,




Please instead teach mac80211 to do it right.

> + if (ieee80211_is_data(wh->frame_control)) {
> + if (is_multicast_ether_addr(wh->addr1)) {
> + if (ccmp) {
> + mwl_tx_insert_ccmp_hdr(dma_data-
> >data,
> +        mwl_vif-
> >keyidx,
> +        mwl_vif-
> >iv16,
> +        mwl_vif-
> >iv32);
> + INCREASE_IV(mwl_vif->iv16, mwl_vif-
> >iv32);
> + }

Can't you let mac80211 deal with this?

Now I actually am beginning to understand - you need this for GTK only,
so it might even work in the station ... but still, don't do it, set
the flag to make mac80211 do it on the GTK.

> + if (mgmtframe) {
> + u16 capab;
> +
> + if (unlikely(ieee80211_is_action(wh->frame_control)
> &&
> +      mgmt->u.action.category ==
> WLAN_CATEGORY_BACK &&
> +      mgmt->u.action.u.addba_req.action_code
> ==
> +      WLAN_ACTION_ADDBA_REQ)) {
> + capab = le16_to_cpu(mgmt-
> >u.action.u.addba_req.capab);
> + tid = (capab &
> IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
> + index = mwl_tx_tid_queue_mapping(tid);
> + capab |= 1;
> + mgmt->u.action.u.addba_req.capab =
> cpu_to_le16(capab);
> + }

What's going on here? Why are you modifying the action frames on the
fly??!

johannes

2015-11-27 08:27:26

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

On Fri, 2015-11-27 at 02:00 +0000, David Lin wrote:
> > Ditto - you're allowed to modify mac80211. We actually have a patch
> > like this
> > already:
> > https://git.kernel.org/cgit/linux/kernel/git/jberg/mac80211-
> > next.git/commit/?id=99e7ca44bb910f0cbfda5d9008e8517df0ebc939
> >
>
> Once if this patch is ready, I will modify mwlwifi to use it. Thanks.

The patch is ready now and in the tree, but that wasn't my point. My
point is that you shouldn't try to hack around mac80211 like with the
action frame interception and the mesh-amsdu-reimplementation, but
actually go fix it.

If you have issues with mac80211 like this you can ask how to fix them,
or just fix them and suggest changes/patches, but just working around
it in the driver isn't the right approach.

johannes

2015-12-15 07:40:28

by Emmanuel Grumbach

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

Hi,

I was interested in the checking the A-MSDU implementation only, so I
reviewed only that.

I am not sure I really followed your implementation though.
In iwlwifi I chose the LSO mechanism to implement A-MSDU. I understand that for
an AP it makes less sense since you don't really have locally generated traffic
and LSO won't work well with packets forwarded by the IP layer.
So you seem to have added a timeout mechanism inside the driver that accumulates
the packet for a certain period of time and send them all when the max number of
packets has been reached?
But I didn't see any timer there, so that if you start an A-MSDU and
then suddenly
stop receiving packets for transmission, the packet already in the
buffer will stay
stale?

A few more comments below.

On Thu, Nov 12, 2015 at 5:51 AM, David Lin <[email protected]> wrote:
> This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897
> chipsets.
> This driver was developed as part of the openwrt.org project to support
> Linksys WRT1900AC and is maintained on https://github.com/kaloz/mwlwifi.
>
> The mwlwifi driver differs from existing mwifiex driver:
> o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem
> to provide full AP/Wireless Bridge functionality (routers).
> o mwifiex is a "fullmac driver" which provides a comprehensive set of
> client functions (laptops/embedded devices)
> o only mwlwifi supports Marvell AP chip 886X series
>

[snip]

> +
> +static int mwl_mac80211_ampdu_action(struct ieee80211_hw *hw,
> + struct ieee80211_vif *vif,
> + enum ieee80211_ampdu_mlme_action action,
> + struct ieee80211_sta *sta,
> + u16 tid, u16 *ssn, u8 buf_size, bool amsdu)
> +{
> + int rc = 0;
> + struct mwl_priv *priv = hw->priv;
> + struct mwl_ampdu_stream *stream;
> + u8 *addr = sta->addr, idx;
> + struct mwl_sta *sta_info;
> +
> + sta_info = mwl_dev_get_sta(sta);
> +
> + spin_lock_bh(&priv->stream_lock);
> +
> + stream = mwl_fwcmd_lookup_stream(hw, addr, tid);
> +
> + switch (action) {
> + case IEEE80211_AMPDU_RX_START:
> + case IEEE80211_AMPDU_RX_STOP:
> + break;
> + case IEEE80211_AMPDU_TX_START:
> + if (!sta_info->is_ampdu_allowed) {
> + wiphy_warn(hw->wiphy, "ampdu not allowed\n");
> + rc = -EPERM;
> + break;
> + }
> +
> + if (!stream) {
> + stream = mwl_fwcmd_add_stream(hw, sta, tid);
> + if (!stream) {
> + wiphy_warn(hw->wiphy, "no stream found\n");
> + rc = -EPERM;
> + break;
> + }
> + }
> +
> + spin_unlock_bh(&priv->stream_lock);
> + rc = mwl_fwcmd_check_ba(hw, stream, vif);
> + spin_lock_bh(&priv->stream_lock);
> + if (rc) {
> + mwl_fwcmd_remove_stream(hw, stream);
> + wiphy_err(hw->wiphy,
> + "ampdu start error code: %d\n", rc);
> + rc = -EPERM;
> + break;
> + }
> + stream->state = AMPDU_STREAM_IN_PROGRESS;
> + *ssn = 0;
> + ieee80211_start_tx_ba_cb_irqsafe(vif, addr, tid);

This is why you have the race you mention below. What you should really
be doing is to wait until the all the packets for that RA / TID are sent
from all the HW Tx queues (only one realistically), and only then call the
_cb. This will allow you to send the ADDBA req on the VO queue as it should
be according to spec.

[snip]

> +
> +void mwl_rx_recv(unsigned long data)
> +{

[snip]

> +
> + if (unlikely(ieee80211_is_action(wh->frame_control) &&
> + mgmt->u.action.category ==
> + WLAN_CATEGORY_BACK &&
> + mgmt->u.action.u.addba_resp.action_code ==
> + WLAN_ACTION_ADDBA_RESP)) {
> + capab = mgmt->u.action.u.addba_resp.capab;
> + if (le16_to_cpu(capab) & 1)
> + mwl_rx_enable_sta_amsdu(priv, mgmt->sa);

err... no. mac80211 knows how to do that today. Johannes already
reported a similar issue somewhere else in your code.

> + }
> + }
> +
> + if (ieee80211_is_data_qos(wh->frame_control) &&
> + ieee80211_has_a4(wh->frame_control)) {
> + u8 *qc = ieee80211_get_qos_ctl(wh);
> +
> + if (*qc & IEEE80211_QOS_CTL_A_MSDU_PRESENT)
> + if (mwl_rx_process_mesh_amsdu(priv, prx_skb,
> + &status))

This sounds to be something you want to teach mac80211 about.

[snip]

> +
> +#define SYSADPT_AMSDU_FW_MAX_SIZE 3300
> +
> +#define SYSADPT_AMSDU_4K_MAX_SIZE SYSADPT_AMSDU_FW_MAX_SIZE
> +
> +#define SYSADPT_AMSDU_8K_MAX_SIZE SYSADPT_AMSDU_FW_MAX_SIZE

In case the FW will grow later?

> +
> +#define SYSADPT_AMSDU_ALLOW_SIZE 1600
> +
> +#define SYSADPT_AMSDU_FLUSH_TIME 500
> +
> +#define SYSADPT_AMSDU_PACKET_THRESHOLD 10
> +
> +#define SYSADPT_MAX_TID 8
> +
> +#endif /* _mwl_sysadpt_h_ */
> diff --git a/drivers/net/wireless/marvell/mwlwifi/tx.c b/drivers/net/wireless/marvell/mwlwifi/tx.c
> new file mode 100644
> index 0000000..68a994d
> --- /dev/null
> +++ b/drivers/net/wireless/marvell/mwlwifi/tx.c
> @@ -0,0 +1,1251 @@
> +/*
> + * Copyright (C) 2006-2015, Marvell International Ltd.
> + *
> + * This software file (the "File") is distributed by Marvell International
> + * Ltd. under the terms of the GNU General Public License Version 2, June 1991
> + * (the "License"). You may use, redistribute and/or modify this File in
> + * accordance with the terms and conditions of the License, a copy of which
> + * is available by writing to the Free Software Foundation, Inc.
> + *
> + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
> + * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
> + * this warranty disclaimer.
> + */
> +
> +/* Description: This file implements transmit related functions. */
> +
> +#include <linux/etherdevice.h>
> +#include <linux/skbuff.h>
> +
> +#include "sysadpt.h"
> +#include "dev.h"
> +#include "fwcmd.h"
> +#include "tx.h"
> +
> +#define MAX_NUM_TX_RING_BYTES (SYSADPT_MAX_NUM_TX_DESC * \
> + sizeof(struct mwl_tx_desc))
> +
> +#define MAX_NUM_TX_HNDL_BYTES (SYSADPT_MAX_NUM_TX_DESC * \
> + sizeof(struct mwl_tx_hndl))
> +
> +#define EAGLE_TXD_XMITCTRL_USE_MC_RATE 0x8 /* Use multicast data rate */
> +
> +#define MWL_QOS_ACK_POLICY_MASK 0x0060
> +#define MWL_QOS_ACK_POLICY_NORMAL 0x0000
> +#define MWL_QOS_ACK_POLICY_BLOCKACK 0x0060
> +
> +#define EXT_IV 0x20
> +#define INCREASE_IV(iv16, iv32) \
> +{ \
> + (iv16)++; \
> + if ((iv16) == 0) \
> + (iv32)++; \
> +}
> +
> +/* Transmit rate information constants */
> +#define TX_RATE_FORMAT_LEGACY 0
> +#define TX_RATE_FORMAT_11N 1
> +#define TX_RATE_FORMAT_11AC 2
> +
> +#define TX_RATE_BANDWIDTH_20 0
> +#define TX_RATE_BANDWIDTH_40 1
> +#define TX_RATE_BANDWIDTH_80 2
> +
> +#define TX_RATE_INFO_STD_GI 0
> +#define TX_RATE_INFO_SHORT_GI 1
> +
> +enum {
> + IEEE_TYPE_MANAGEMENT = 0,
> + IEEE_TYPE_CONTROL,
> + IEEE_TYPE_DATA
> +};
> +
> +struct ccmp_hdr {
> + __le16 iv16;
> + u8 rsvd;
> + u8 key_id;
> + __le32 iv32;
> +} __packed;
> +
> +static int mwl_tx_ring_alloc(struct mwl_priv *priv)
> +{
> + struct mwl_desc_data *desc;
> + int num;
> + u8 *mem;
> +
> + desc = &priv->desc_data[0];
> +
> + mem = dma_alloc_coherent(&priv->pdev->dev,
> + MAX_NUM_TX_RING_BYTES *
> + SYSADPT_NUM_OF_DESC_DATA,
> + &desc->pphys_tx_ring,
> + GFP_KERNEL);
> +
> + if (!mem) {
> + wiphy_err(priv->hw->wiphy, "cannot alloc mem\n");
> + return -ENOMEM;
> + }
> +
> + for (num = 0; num < SYSADPT_NUM_OF_DESC_DATA; num++) {
> + desc = &priv->desc_data[num];
> +
> + desc->ptx_ring = (struct mwl_tx_desc *)
> + (mem + num * MAX_NUM_TX_RING_BYTES);
> +
> + desc->pphys_tx_ring = (dma_addr_t)
> + ((u32)priv->desc_data[0].pphys_tx_ring +
> + num * MAX_NUM_TX_RING_BYTES);
> +
> + memset(desc->ptx_ring, 0x00,
> + MAX_NUM_TX_RING_BYTES);
> + }
> +
> + mem = kmalloc(MAX_NUM_TX_HNDL_BYTES * SYSADPT_NUM_OF_DESC_DATA,
> + GFP_KERNEL);
> +
> + if (!mem) {
> + wiphy_err(priv->hw->wiphy, "cannot alloc mem\n");
> + dma_free_coherent(&priv->pdev->dev,
> + MAX_NUM_TX_RING_BYTES *
> + SYSADPT_NUM_OF_DESC_DATA,
> + priv->desc_data[0].ptx_ring,
> + priv->desc_data[0].pphys_tx_ring);
> + return -ENOMEM;
> + }
> +
> + for (num = 0; num < SYSADPT_NUM_OF_DESC_DATA; num++) {
> + desc = &priv->desc_data[num];
> +
> + desc->tx_hndl = (struct mwl_tx_hndl *)
> + (mem + num * MAX_NUM_TX_HNDL_BYTES);
> +
> + memset(desc->tx_hndl, 0x00,
> + MAX_NUM_TX_HNDL_BYTES);
> + }
> +
> + return 0;
> +}
> +
> +static int mwl_tx_ring_init(struct mwl_priv *priv)
> +{
> + int num, i;
> + struct mwl_desc_data *desc;
> +
> + for (num = 0; num < SYSADPT_NUM_OF_DESC_DATA; num++) {
> + skb_queue_head_init(&priv->txq[num]);
> + priv->fw_desc_cnt[num] = 0;
> +
> + desc = &priv->desc_data[num];
> +
> + if (desc->ptx_ring) {
> + for (i = 0; i < SYSADPT_MAX_NUM_TX_DESC; i++) {
> + desc->ptx_ring[i].status =
> + cpu_to_le32(EAGLE_TXD_STATUS_IDLE);
> + desc->ptx_ring[i].pphys_next =
> + cpu_to_le32((u32)desc->pphys_tx_ring +
> + ((i + 1) * sizeof(struct mwl_tx_desc)));
> + desc->tx_hndl[i].pdesc =
> + &desc->ptx_ring[i];
> + if (i < SYSADPT_MAX_NUM_TX_DESC - 1)
> + desc->tx_hndl[i].pnext =
> + &desc->tx_hndl[i + 1];
> + }
> + desc->ptx_ring[SYSADPT_MAX_NUM_TX_DESC - 1].pphys_next =
> + cpu_to_le32((u32)desc->pphys_tx_ring);
> + desc->tx_hndl[SYSADPT_MAX_NUM_TX_DESC - 1].pnext =
> + &desc->tx_hndl[0];
> +
> + desc->pstale_tx_hndl = &desc->tx_hndl[0];
> + desc->pnext_tx_hndl = &desc->tx_hndl[0];
> + } else {
> + wiphy_err(priv->hw->wiphy, "no valid TX mem\n");
> + return -ENOMEM;
> + }
> + }
> +
> + return 0;
> +}
> +
> +static void mwl_tx_ring_cleanup(struct mwl_priv *priv)
> +{
> + int cleaned_tx_desc = 0;
> + int num, i;
> + struct mwl_desc_data *desc;
> +
> + for (num = 0; num < SYSADPT_NUM_OF_DESC_DATA; num++) {
> + skb_queue_purge(&priv->txq[num]);
> + priv->fw_desc_cnt[num] = 0;
> +
> + desc = &priv->desc_data[num];
> +
> + if (desc->ptx_ring) {
> + for (i = 0; i < SYSADPT_MAX_NUM_TX_DESC; i++) {
> + if (!desc->tx_hndl[i].psk_buff)
> + continue;
> +
> + wiphy_info(priv->hw->wiphy,
> + "unmapped and free'd %i 0x%p 0x%x\n",
> + i,
> + desc->tx_hndl[i].psk_buff->data,
> + le32_to_cpu(
> + desc->ptx_ring[i].pkt_ptr));
> + pci_unmap_single(priv->pdev,
> + le32_to_cpu(
> + desc->ptx_ring[i].pkt_ptr),
> + desc->tx_hndl[i].psk_buff->len,
> + PCI_DMA_TODEVICE);
> + dev_kfree_skb_any(desc->tx_hndl[i].psk_buff);
> + desc->ptx_ring[i].status =
> + cpu_to_le32(EAGLE_TXD_STATUS_IDLE);
> + desc->ptx_ring[i].pkt_ptr = 0;
> + desc->ptx_ring[i].pkt_len = 0;
> + desc->tx_hndl[i].psk_buff = NULL;
> + cleaned_tx_desc++;
> + }
> + }
> + }
> +
> + wiphy_info(priv->hw->wiphy, "cleaned %i TX descr\n", cleaned_tx_desc);
> +}
> +
> +static void mwl_tx_ring_free(struct mwl_priv *priv)
> +{
> + int num;
> +
> + if (priv->desc_data[0].ptx_ring) {
> + dma_free_coherent(&priv->pdev->dev,
> + MAX_NUM_TX_RING_BYTES *
> + SYSADPT_NUM_OF_DESC_DATA,
> + priv->desc_data[0].ptx_ring,
> + priv->desc_data[0].pphys_tx_ring);
> + }
> +
> + for (num = 0; num < SYSADPT_NUM_OF_DESC_DATA; num++) {
> + if (priv->desc_data[num].ptx_ring)
> + priv->desc_data[num].ptx_ring = NULL;
> + priv->desc_data[num].pstale_tx_hndl = NULL;
> + priv->desc_data[num].pnext_tx_hndl = NULL;
> + }
> +
> + kfree(priv->desc_data[0].tx_hndl);
> +}
> +
> +static inline void mwl_tx_add_dma_header(struct mwl_priv *priv,
> + struct sk_buff *skb,
> + int head_pad,
> + int tail_pad)
> +{
> + struct ieee80211_hdr *wh;
> + int hdrlen;
> + int reqd_hdrlen;
> + struct mwl_dma_data *tr;
> +
> + /* Add a firmware DMA header; the firmware requires that we
> + * present a 2-byte payload length followed by a 4-address
> + * header (without QoS field), followed (optionally) by any
> + * WEP/ExtIV header (but only filled in for CCMP).
> + */
> + wh = (struct ieee80211_hdr *)skb->data;
> +
> + hdrlen = ieee80211_hdrlen(wh->frame_control);
> +
> + reqd_hdrlen = sizeof(*tr) + head_pad;
> +
> + if (hdrlen != reqd_hdrlen)
> + skb_push(skb, reqd_hdrlen - hdrlen);
> +
> + if (ieee80211_is_data_qos(wh->frame_control))
> + hdrlen -= IEEE80211_QOS_CTL_LEN;
> +
> + tr = (struct mwl_dma_data *)skb->data;
> +
> + if (wh != &tr->wh)
> + memmove(&tr->wh, wh, hdrlen);
> +
> + if (hdrlen != sizeof(tr->wh))
> + memset(((void *)&tr->wh) + hdrlen, 0, sizeof(tr->wh) - hdrlen);
> +
> + /* Firmware length is the length of the fully formed "802.11
> + * payload". That is, everything except for the 802.11 header.
> + * This includes all crypto material including the MIC.
> + */
> + tr->fwlen = cpu_to_le16(skb->len - sizeof(*tr) + tail_pad);
> +}
> +
> +static inline void mwl_tx_encapsulate_frame(struct mwl_priv *priv,
> + struct sk_buff *skb,
> + struct ieee80211_key_conf *k_conf,
> + bool *ccmp)
> +{
> + int head_pad = 0;
> + int data_pad = 0;
> +
> + /* Make sure the packet header is in the DMA header format (4-address
> + * without QoS), and add head & tail padding when HW crypto is enabled.
> + *
> + * We have the following trailer padding requirements:
> + * - WEP: 4 trailer bytes (ICV)
> + * - TKIP: 12 trailer bytes (8 MIC + 4 ICV)
> + * - CCMP: 8 trailer bytes (MIC)
> + */
> +
> + if (k_conf) {
> + head_pad = k_conf->iv_len;
> +
> + switch (k_conf->cipher) {
> + case WLAN_CIPHER_SUITE_WEP40:
> + case WLAN_CIPHER_SUITE_WEP104:
> + data_pad = 4;
> + break;
> + case WLAN_CIPHER_SUITE_TKIP:
> + data_pad = 12;
> + break;
> + case WLAN_CIPHER_SUITE_CCMP:
> + data_pad = 8;
> + *ccmp = true;
> + break;
> + }
> + }
> +
> + mwl_tx_add_dma_header(priv, skb, head_pad, data_pad);
> +}
> +
> +static inline void mwl_tx_insert_ccmp_hdr(u8 *pccmp_hdr,
> + u8 key_id, u16 iv16, u32 iv32)
> +{
> + struct ccmp_hdr *ccmp_h = (struct ccmp_hdr *)pccmp_hdr;
> +
> + ccmp_h->iv16 = cpu_to_le16(iv16);
> + ccmp_h->rsvd = 0;
> + ccmp_h->key_id = EXT_IV | (key_id << 6);
> + ccmp_h->iv32 = cpu_to_le32(iv32);
> +}
> +
> +static inline int mwl_tx_tid_queue_mapping(u8 tid)
> +{
> + switch (tid) {
> + case 0:
> + case 3:
> + return IEEE80211_AC_BE;
> + case 1:
> + case 2:
> + return IEEE80211_AC_BK;
> + case 4:
> + case 5:
> + return IEEE80211_AC_VI;
> + case 6:
> + case 7:
> + return IEEE80211_AC_VO;
> + default:
> + break;
> + }
> +
> + return -1;
> +}
> +
> +static inline void mwl_tx_count_packet(struct ieee80211_sta *sta, u8 tid)
> +{
> + struct mwl_sta *sta_info;
> + struct mwl_tx_info *tx_stats;
> +
> + if (WARN_ON(tid >= SYSADPT_MAX_TID))
> + return;
> +
> + sta_info = mwl_dev_get_sta(sta);
> +
> + tx_stats = &sta_info->tx_stats[tid];
> +
> + if (tx_stats->start_time == 0)
> + tx_stats->start_time = jiffies;
> +
> + /* reset the packet count after each second elapses. If the number of
> + * packets ever exceeds the ampdu_min_traffic threshold, we will allow
> + * an ampdu stream to be started.
> + */
> + if (jiffies - tx_stats->start_time > HZ) {
> + tx_stats->pkts = 0;
> + tx_stats->start_time = 0;
> + } else {
> + tx_stats->pkts++;
> + }
> +}
> +
> +static inline bool mwl_tx_available(struct mwl_priv *priv, int desc_num)
> +{
> + struct mwl_tx_hndl *tx_hndl;
> +
> + tx_hndl = priv->desc_data[desc_num].pnext_tx_hndl;
> +
> + if (!tx_hndl->pdesc)
> + return false;
> +
> + if (tx_hndl->pdesc->status != EAGLE_TXD_STATUS_IDLE) {
> + /* Interrupt F/W anyway */
> + if (tx_hndl->pdesc->status &
> + cpu_to_le32(EAGLE_TXD_STATUS_FW_OWNED))
> + writel(MACREG_H2ARIC_BIT_PPA_READY,
> + priv->iobase1 +
> + MACREG_REG_H2A_INTERRUPT_EVENTS);
> + return false;
> + }
> +
> + return true;
> +}
> +
> +static inline void mwl_tx_skb(struct mwl_priv *priv, int desc_num,
> + struct sk_buff *tx_skb)
> +{
> + struct ieee80211_tx_info *tx_info;
> + struct mwl_tx_ctrl *tx_ctrl;
> + struct mwl_tx_hndl *tx_hndl;
> + struct mwl_tx_desc *tx_desc;
> + struct ieee80211_sta *sta;
> + struct ieee80211_vif *vif;
> + struct mwl_vif *mwl_vif;
> + struct ieee80211_key_conf *k_conf;
> + bool ccmp = false;
> + struct mwl_dma_data *dma_data;
> + struct ieee80211_hdr *wh;
> + dma_addr_t dma;
> +
> + if (WARN_ON(!tx_skb))
> + return;
> +
> + tx_info = IEEE80211_SKB_CB(tx_skb);
> + tx_ctrl = (struct mwl_tx_ctrl *)&tx_info->status;
> + sta = (struct ieee80211_sta *)tx_ctrl->sta;
> + vif = (struct ieee80211_vif *)tx_ctrl->vif;
> + mwl_vif = mwl_dev_get_vif(vif);
> + k_conf = (struct ieee80211_key_conf *)tx_ctrl->k_conf;
> +
> + mwl_tx_encapsulate_frame(priv, tx_skb, k_conf, &ccmp);
> +
> + dma_data = (struct mwl_dma_data *)tx_skb->data;
> + wh = &dma_data->wh;
> +
> + if (ieee80211_is_data(wh->frame_control)) {
> + if (is_multicast_ether_addr(wh->addr1)) {
> + if (ccmp) {
> + mwl_tx_insert_ccmp_hdr(dma_data->data,
> + mwl_vif->keyidx,
> + mwl_vif->iv16,
> + mwl_vif->iv32);
> + INCREASE_IV(mwl_vif->iv16, mwl_vif->iv32);
> + }
> + } else {
> + if (ccmp) {
> + if (vif->type == NL80211_IFTYPE_STATION) {
> + mwl_tx_insert_ccmp_hdr(dma_data->data,
> + mwl_vif->keyidx,
> + mwl_vif->iv16,
> + mwl_vif->iv32);
> + INCREASE_IV(mwl_vif->iv16,
> + mwl_vif->iv32);
> + } else {
> + struct mwl_sta *sta_info;
> +
> + sta_info = mwl_dev_get_sta(sta);
> +
> + mwl_tx_insert_ccmp_hdr(dma_data->data,
> + 0,
> + sta_info->iv16,
> + sta_info->iv32);
> + INCREASE_IV(sta_info->iv16,
> + sta_info->iv32);
> + }
> + }
> + }
> + }
> +
> + tx_hndl = priv->desc_data[desc_num].pnext_tx_hndl;
> + tx_hndl->psk_buff = tx_skb;
> + tx_desc = tx_hndl->pdesc;
> + tx_desc->tx_priority = tx_ctrl->tx_priority;
> + tx_desc->qos_ctrl = cpu_to_le16(tx_ctrl->qos_ctrl);
> + tx_desc->pkt_len = cpu_to_le16(tx_skb->len);
> + tx_desc->packet_info = 0;
> + tx_desc->data_rate = 0;
> + tx_desc->type = tx_ctrl->type;
> + tx_desc->xmit_control = tx_ctrl->xmit_control;
> + tx_desc->sap_pkt_info = 0;
> + dma = pci_map_single(priv->pdev, tx_skb->data,
> + tx_skb->len, PCI_DMA_TODEVICE);
> + if (pci_dma_mapping_error(priv->pdev, dma)) {
> + dev_kfree_skb_any(tx_skb);
> + wiphy_err(priv->hw->wiphy,
> + "failed to map pci memory!\n");
> + return;
> + }
> + tx_desc->pkt_ptr = cpu_to_le32(dma);
> + tx_desc->status = cpu_to_le32(EAGLE_TXD_STATUS_FW_OWNED);
> + /* make sure all the memory transactions done by cpu were completed */
> + wmb(); /*Data Memory Barrier*/
> + writel(MACREG_H2ARIC_BIT_PPA_READY,
> + priv->iobase1 + MACREG_REG_H2A_INTERRUPT_EVENTS);
> + priv->desc_data[desc_num].pnext_tx_hndl = tx_hndl->pnext;
> + priv->fw_desc_cnt[desc_num]++;
> +}
> +
> +static inline struct sk_buff *mwl_tx_do_amsdu(struct mwl_priv *priv,
> + int desc_num,
> + struct sk_buff *tx_skb,
> + struct ieee80211_tx_info *tx_info)
> +{
> + struct ieee80211_sta *sta;
> + struct mwl_sta *sta_info;
> + struct mwl_tx_ctrl *tx_ctrl = (struct mwl_tx_ctrl *)&tx_info->status;
> + struct ieee80211_tx_info *amsdu_info;
> + struct sk_buff_head *amsdu_pkts;
> + struct mwl_amsdu_frag *amsdu;
> + int amsdu_allow_size;
> + struct ieee80211_hdr *wh;
> + int wh_len;
> + u16 len;
> + u8 *data;
> +
> + sta = (struct ieee80211_sta *)tx_ctrl->sta;
> + sta_info = mwl_dev_get_sta(sta);
> +
> + if (!sta_info->is_amsdu_allowed)
> + return tx_skb;
> +
> + wh = (struct ieee80211_hdr *)tx_skb->data;
> + if (sta_info->is_mesh_node && is_multicast_ether_addr(wh->addr3))
> + return tx_skb;
> +
> + if (sta_info->amsdu_ctrl.cap == MWL_AMSDU_SIZE_4K)
> + amsdu_allow_size = SYSADPT_AMSDU_4K_MAX_SIZE;
> + else if (sta_info->amsdu_ctrl.cap == MWL_AMSDU_SIZE_8K)
> + amsdu_allow_size = SYSADPT_AMSDU_8K_MAX_SIZE;
> + else
> + return tx_skb;
> +
> + spin_lock_bh(&sta_info->amsdu_lock);
> + amsdu = &sta_info->amsdu_ctrl.frag[desc_num];
> +
> + if (tx_skb->len > SYSADPT_AMSDU_ALLOW_SIZE) {
> + if (amsdu->num) {
> + mwl_tx_skb(priv, desc_num, amsdu->skb);
> + amsdu->num = 0;
> + amsdu->cur_pos = NULL;
> +
> + if (!mwl_tx_available(priv, desc_num)) {
> + skb_queue_head(&priv->txq[desc_num], tx_skb);
> + spin_unlock_bh(&sta_info->amsdu_lock);
> + return NULL;
> + }
> + }
> + spin_unlock_bh(&sta_info->amsdu_lock);
> + return tx_skb;
> + }
> +
> + /* potential amsdu size, should add amsdu header 14 bytes +
> + * maximum padding 3.
> + */
> + wh_len = ieee80211_hdrlen(wh->frame_control);
> + len = tx_skb->len - wh_len + 17;
> +
> + if (amsdu->num) {
> + if ((amsdu->skb->len + len) > amsdu_allow_size) {
> + mwl_tx_skb(priv, desc_num, amsdu->skb);
> + amsdu->num = 0;
> + amsdu->cur_pos = NULL;
> + }
> + }
> +
> + amsdu->jiffies = jiffies;
> + len = tx_skb->len - wh_len;
> +
> + if (amsdu->num == 0) {
> + struct sk_buff *newskb;
> +
> + amsdu_pkts = (struct sk_buff_head *)
> + kmalloc(sizeof(*amsdu_pkts), GFP_KERNEL);
> + if (!amsdu_pkts) {
> + spin_unlock_bh(&sta_info->amsdu_lock);
> + return tx_skb;
> + }
> + newskb = dev_alloc_skb(amsdu_allow_size +
> + SYSADPT_MIN_BYTES_HEADROOM);
> + if (!newskb) {
> + spin_unlock_bh(&sta_info->amsdu_lock);
> + kfree(amsdu_pkts);
> + return tx_skb;
> + }
> +
> + data = newskb->data;
> + memcpy(data, tx_skb->data, wh_len);
> + if (sta_info->is_mesh_node) {
> + ether_addr_copy(data + wh_len, wh->addr3);
> + ether_addr_copy(data + wh_len + ETH_ALEN, wh->addr4);
> + } else {
> + ether_addr_copy(data + wh_len,
> + ieee80211_get_DA(wh));
> + ether_addr_copy(data + wh_len + ETH_ALEN,
> + ieee80211_get_SA(wh));
> + }
> + *(u8 *)(data + wh_len + ETH_HLEN - 1) = len & 0xff;
> + *(u8 *)(data + wh_len + ETH_HLEN - 2) = (len >> 8) & 0xff;

These bit oeprations are not needed. The pointer must be WORD aligned, right?
This is why you have padding after all, unless you have some weird DMA games?
You seem to be assuming this alignment anyway because you use
ether_addr_copy above.

> +
> + /* Queue ADDBA request in the respective data queue. While setting up
> + * the ampdu stream, mac80211 queues further packets for that
> + * particular ra/tid pair. However, packets piled up in the hardware
> + * for that ra/tid pair will still go out. ADDBA request and the
> + * related data packets going out from different queues asynchronously
> + * will cause a shift in the receiver window which might result in
> + * ampdu packets getting dropped at the receiver after the stream has
> + * been setup.
> + */

Here is the race you are facing and that race can be avoided by the proper usage
of the _cb

> + if (mgmtframe) {
> + u16 capab;
> +
> + if (unlikely(ieee80211_is_action(wh->frame_control) &&
> + mgmt->u.action.category == WLAN_CATEGORY_BACK &&
> + mgmt->u.action.u.addba_req.action_code ==
> + WLAN_ACTION_ADDBA_REQ)) {
> + capab = le16_to_cpu(mgmt->u.action.u.addba_req.capab);
> + tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
> + index = mwl_tx_tid_queue_mapping(tid);
> + capab |= 1;
> + mgmt->u.action.u.addba_req.capab = cpu_to_le16(capab);
> + }
> +
> + if (unlikely(ieee80211_is_action(wh->frame_control) &&
> + mgmt->u.action.category == WLAN_CATEGORY_BACK &&
> + mgmt->u.action.u.addba_resp.action_code ==
> + WLAN_ACTION_ADDBA_RESP)) {
> + capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab);
> + capab |= 1;
> + mgmt->u.action.u.addba_resp.capab = cpu_to_le16(capab);
> + }
> + }
> +
> + index = SYSADPT_TX_WMM_QUEUES - index - 1;
> + txpriority = index;
> +
> + if (sta && sta->ht_cap.ht_supported && !eapol_frame &&
> + ieee80211_is_data_qos(wh->frame_control)) {
> + tid = qos & 0xf;
> + mwl_tx_count_packet(sta, tid);
> +
> + spin_lock_bh(&priv->stream_lock);
> + stream = mwl_fwcmd_lookup_stream(hw, sta->addr, tid);
> +
> + if (stream) {
> + if (stream->state == AMPDU_STREAM_ACTIVE) {
> + if (WARN_ON(!(qos &
> + MWL_QOS_ACK_POLICY_BLOCKACK))) {
> + spin_unlock_bh(&priv->stream_lock);
> + dev_kfree_skb_any(skb);
> + return;
> + }
> +
> + txpriority =
> + (SYSADPT_TX_WMM_QUEUES + stream->idx) %
> + SYSADPT_TOTAL_HW_QUEUES;
> + } else if (stream->state == AMPDU_STREAM_NEW) {
> + /* We get here if the driver sends us packets
> + * after we've initiated a stream, but before
> + * our ampdu_action routine has been called
> + * with IEEE80211_AMPDU_TX_START to get the SSN
> + * for the ADDBA request. So this packet can
> + * go out with no risk of sequence number
> + * mismatch. No special handling is required.
> + */
> + } else {
> + /* Drop packets that would go out after the
> + * ADDBA request was sent but before the ADDBA
> + * response is received. If we don't do this,
> + * the recipient would probably receive it
> + * after the ADDBA request with SSN 0. This
> + * will cause the recipient's BA receive window
> + * to shift, which would cause the subsequent
> + * packets in the BA stream to be discarded.
> + * mac80211 queues our packets for us in this
> + * case, so this is really just a safety check.
> + */

Well... I think you can really avoid that.

2015-12-10 14:04:05

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

David Lin <[email protected]> writes:

> This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897
> chipsets.
> This driver was developed as part of the openwrt.org project to support
> Linksys WRT1900AC and is maintained on https://github.com/kaloz/mwlwifi.
>
> The mwlwifi driver differs from existing mwifiex driver:
> o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem
> to provide full AP/Wireless Bridge functionality (routers).
> o mwifiex is a "fullmac driver" which provides a comprehensive set of
> client functions (laptops/embedded devices)
> o only mwlwifi supports Marvell AP chip 886X series
>
> NOTE: Users with Marvell 88W8897 chipsets currently should enable
> (CONFIG=Y or M) either CONFIG_MWIFIEX or CONFIG_MWLWIFI, NOT BOTH.
>
> mwlwifi driver leveraged code from existing MWL8K driver in the
> following areas:
> - 802.11n setting for mac80211
> - Functions needed to hook up to mac80211
> - Interactions with mac80211 to establish BA streams
> - Partial firmware APIs, some data fields
> - Method to pass Rx packets to mac80211 except 11ac rates
>
> In addition, mwlwifi driver supports:
> - future scalability and future development (refactored source code)
> - Marvell 802.11ac chipsets, including combo BT devices
> - 802.11ac related settings and functions
> - concurrent AP+STA functionalities with single firmware per chip
> - firmware APIs for the supported chipset
> - communicating new mac80211 settings to firmware
> - Different TX/RX datapath where applicable
> - A-MSDU and A-MPDU
> - mac80211-based MESH (work in progress)
> - Refined the code to establish BA streams
>
> NOTE: MWLWIFI will be organized under new vendor specific folder/marvell,
> as per request of the gate keeper and community.
>
> Signed-off-by: David Lin <[email protected]>

I don't see any changelog, please always provide one. Makes review a lot
easier.

Also I hope you are not adding new features anymore. It's better to
freeze the driver and focus on getting the driver accepted. Once that is
done you can submit new features as separate patches. Otherwise we go
back to square one after every review.

--
Kalle Valo

2015-12-10 14:07:00

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

David Lin <[email protected]> writes:

>> > +#define MWL_DRV_NAME     KBUILD_MODNAME
>> > +#define MWL_DRV_VERSION  "10.3.0.14"
>>
>> versions like that are generally fairly useless since you don't update them for
>> every commit ...
>>
>
> We still need version information for formal release.

Then use git commit ids for tracking the driver version. Using manual
version strings for drivers don't work, it has been tried multiple times
and they are always out of sync.

--
Kalle Valo

2015-12-10 14:39:08

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

David Lin <[email protected]> writes:

> This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897
> chipsets.
> This driver was developed as part of the openwrt.org project to support
> Linksys WRT1900AC and is maintained on https://github.com/kaloz/mwlwifi.
>
> The mwlwifi driver differs from existing mwifiex driver:
> o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem
> to provide full AP/Wireless Bridge functionality (routers).
> o mwifiex is a "fullmac driver" which provides a comprehensive set of
> client functions (laptops/embedded devices)
> o only mwlwifi supports Marvell AP chip 886X series
>
> NOTE: Users with Marvell 88W8897 chipsets currently should enable
> (CONFIG=Y or M) either CONFIG_MWIFIEX or CONFIG_MWLWIFI, NOT BOTH.
>
> mwlwifi driver leveraged code from existing MWL8K driver in the
> following areas:
> - 802.11n setting for mac80211
> - Functions needed to hook up to mac80211
> - Interactions with mac80211 to establish BA streams
> - Partial firmware APIs, some data fields
> - Method to pass Rx packets to mac80211 except 11ac rates
>
> In addition, mwlwifi driver supports:
> - future scalability and future development (refactored source code)
> - Marvell 802.11ac chipsets, including combo BT devices
> - 802.11ac related settings and functions
> - concurrent AP+STA functionalities with single firmware per chip
> - firmware APIs for the supported chipset
> - communicating new mac80211 settings to firmware
> - Different TX/RX datapath where applicable
> - A-MSDU and A-MPDU
> - mac80211-based MESH (work in progress)
> - Refined the code to establish BA streams
>
> NOTE: MWLWIFI will be organized under new vendor specific folder/marvell,
> as per request of the gate keeper and community.
>
> Signed-off-by: David Lin <[email protected]>

This seems to use base64 encoding, how did you submit this? 'git
send-email' tool is strongly preferred.

Content-Transfer-Encoding: base64

I applied this to pending branch and saw few easy conflicts with Kconfig
files and Makefiles, I guess you submitted this patch before I added the
vendor directories. Let's see what kbuild finds but I already saw two
warnings:

drivers/net/wireless/marvell/mwlwifi/main.c:160:20: warning: incorrect type in argument 1 (different address spaces)
drivers/net/wireless/marvell/mwlwifi/main.c:160:20: expected void const *ptr
drivers/net/wireless/marvell/mwlwifi/main.c:160:20: got void [noderef] <asn:2>*[assigned] addr
drivers/net/wireless/marvell/mwlwifi/main.c:171:20: warning: incorrect type in argument 1 (different address spaces)
drivers/net/wireless/marvell/mwlwifi/main.c:171:20: expected void const *ptr
drivers/net/wireless/marvell/mwlwifi/main.c:171:20: got void [noderef] <asn:2>*[assigned] addr

--
Kalle Valo

2015-12-15 05:47:48

by David Lin

[permalink] [raw]
Subject: RE: [PATCH v7] Add new mac80211 driver mwlwifi.

> Kan Yan writes:
>
> David Lin <dlin@...> writes:
>
> > +static inline struct sk_buff *mwl_tx_do_amsdu(struct mwl_priv *priv,
> > + int desc_num,
> > ...
> > + amsdu_pkts = (struct sk_buff_head *)
> > + kmalloc(sizeof(*amsdu_pkts), GFP_KERNEL);
> > + if (!amsdu_pkts) {
>
> Should GFP_ATOMIC be used here instead of GFP_KERNEL? This function could
> be called in interrupt context.
>

Thanks. I will fix it.

> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the
> body of a message to [email protected] More majordomo info at
> http://vger.kernel.org/majordomo-info.html

2015-12-15 07:56:08

by David Lin

[permalink] [raw]
Subject: RE: [PATCH v7] Add new mac80211 driver mwlwifi.

PiBLYWxsZSBWYWxvIFttYWlsdG86a3ZhbG9AY29kZWF1cm9yYS5vcmddIHdyb3RlOg0KPiANCj4g
RGF2aWQgTGluIDxkbGluQG1hcnZlbGwuY29tPiB3cml0ZXM6DQo+IA0KPiA+IFRoaXMgcGF0Y2gg
cHJvdmlkZXMgdGhlIG13bHdpZmkgZHJpdmVyIGZvciBNYXJ2ZWxsIDg4NjMsIDg4NjQgYW5kIDg4
OTcNCj4gPiBjaGlwc2V0cy4NCj4gPiBUaGlzIGRyaXZlciB3YXMgZGV2ZWxvcGVkIGFzIHBhcnQg
b2YgdGhlIG9wZW53cnQub3JnIHByb2plY3QgdG8NCj4gPiBzdXBwb3J0IExpbmtzeXMgV1JUMTkw
MEFDIGFuZCBpcyBtYWludGFpbmVkIG9uDQo+IGh0dHBzOi8vZ2l0aHViLmNvbS9rYWxvei9td2x3
aWZpLg0KPiA+DQo+ID4gVGhlIG13bHdpZmkgZHJpdmVyIGRpZmZlcnMgZnJvbSBleGlzdGluZyBt
d2lmaWV4IGRyaXZlcjoNCj4gPiBvIG13bHdpZmkgaXMgYSAic29mdG1hYyBkcml2ZXIiIHVzaW5n
IHRoZSBrZXJuZWw/7qiDIG1hYzgwMi4xMSBzdWJzeXN0ZW0NCj4gPiB0byBwcm92aWRlIGZ1bGwg
QVAvV2lyZWxlc3MgQnJpZGdlIGZ1bmN0aW9uYWxpdHkgKHJvdXRlcnMpLg0KPiA+IG8gbXdpZmll
eCBpcyBhICJmdWxsbWFjIGRyaXZlciIgd2hpY2ggcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIHNl
dCBvZg0KPiA+IGNsaWVudCBmdW5jdGlvbnMgKGxhcHRvcHMvZW1iZWRkZWQgZGV2aWNlcykgbyBv
bmx5IG13bHdpZmkgc3VwcG9ydHMNCj4gPiBNYXJ2ZWxsIEFQIGNoaXAgODg2WCBzZXJpZXMNCj4g
Pg0KPiA+IE5PVEU6IFVzZXJzIHdpdGggTWFydmVsbCA4OFc4ODk3IGNoaXBzZXRzIGN1cnJlbnRs
eSBzaG91bGQgZW5hYmxlDQo+ID4gKENPTkZJRz1ZIG9yIE0pIGVpdGhlciBDT05GSUdfTVdJRklF
WCBvciBDT05GSUdfTVdMV0lGSSwgTk9UDQo+IEJPVEguDQo+ID4NCj4gPiBtd2x3aWZpIGRyaXZl
ciBsZXZlcmFnZWQgY29kZSBmcm9tIGV4aXN0aW5nIE1XTDhLIGRyaXZlciBpbiB0aGUNCj4gPiBm
b2xsb3dpbmcgYXJlYXM6DQo+ID4gLSA4MDIuMTFuIHNldHRpbmcgZm9yIG1hYzgwMjExDQo+ID4g
LSBGdW5jdGlvbnMgbmVlZGVkIHRvIGhvb2sgdXAgdG8gbWFjODAyMTENCj4gPiAtIEludGVyYWN0
aW9ucyB3aXRoIG1hYzgwMjExIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQo+ID4gLSBQYXJ0aWFs
IGZpcm13YXJlIEFQSXMsIHNvbWUgZGF0YSBmaWVsZHMNCj4gPiAtIE1ldGhvZCB0byBwYXNzIFJ4
IHBhY2tldHMgdG8gbWFjODAyMTEgZXhjZXB0IDExYWMgcmF0ZXMNCj4gPg0KPiA+IEluIGFkZGl0
aW9uLCBtd2x3aWZpIGRyaXZlciBzdXBwb3J0czoNCj4gPiAtIGZ1dHVyZSBzY2FsYWJpbGl0eSBh
bmQgZnV0dXJlIGRldmVsb3BtZW50IChyZWZhY3RvcmVkIHNvdXJjZSBjb2RlKQ0KPiA+IC0gTWFy
dmVsbCA4MDIuMTFhYyBjaGlwc2V0cywgaW5jbHVkaW5nIGNvbWJvIEJUIGRldmljZXMNCj4gPiAt
IDgwMi4xMWFjIHJlbGF0ZWQgc2V0dGluZ3MgYW5kIGZ1bmN0aW9ucw0KPiA+IC0gY29uY3VycmVu
dCBBUCtTVEEgZnVuY3Rpb25hbGl0aWVzIHdpdGggc2luZ2xlIGZpcm13YXJlIHBlciBjaGlwDQo+
ID4gLSBmaXJtd2FyZSBBUElzIGZvciB0aGUgc3VwcG9ydGVkIGNoaXBzZXQNCj4gPiAtIGNvbW11
bmljYXRpbmcgbmV3IG1hYzgwMjExIHNldHRpbmdzIHRvIGZpcm13YXJlDQo+ID4gLSBEaWZmZXJl
bnQgVFgvUlggZGF0YXBhdGggd2hlcmUgYXBwbGljYWJsZQ0KPiA+IC0gQS1NU0RVIGFuZCBBLU1Q
RFUNCj4gPiAtIG1hYzgwMjExLWJhc2VkIE1FU0ggKHdvcmsgaW4gcHJvZ3Jlc3MpDQo+ID4gLSBS
ZWZpbmVkIHRoZSBjb2RlIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQo+ID4NCj4gPiBOT1RFOiBN
V0xXSUZJIHdpbGwgYmUgb3JnYW5pemVkIHVuZGVyIG5ldyB2ZW5kb3Igc3BlY2lmaWMNCj4gPiBm
b2xkZXIvbWFydmVsbCwgYXMgcGVyIHJlcXVlc3Qgb2YgdGhlIGdhdGUga2VlcGVyIGFuZCBjb21t
dW5pdHkuDQo+ID4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBMaW4gPGRsaW5AbWFydmVsbC5j
b20+DQo+IA0KPiBUaGlzIHNlZW1zIHRvIHVzZSBiYXNlNjQgZW5jb2RpbmcsIGhvdyBkaWQgeW91
IHN1Ym1pdCB0aGlzPyAnZ2l0IHNlbmQtZW1haWwnDQo+IHRvb2wgaXMgc3Ryb25nbHkgcHJlZmVy
cmVkLg0KPiANCj4gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQo+IA0KPiBJIGFw
cGxpZWQgdGhpcyB0byBwZW5kaW5nIGJyYW5jaCBhbmQgc2F3IGZldyBlYXN5IGNvbmZsaWN0cyB3
aXRoIEtjb25maWcgZmlsZXMNCj4gYW5kIE1ha2VmaWxlcywgSSBndWVzcyB5b3Ugc3VibWl0dGVk
IHRoaXMgcGF0Y2ggYmVmb3JlIEkgYWRkZWQgdGhlIHZlbmRvcg0KPiBkaXJlY3Rvcmllcy4gTGV0
J3Mgc2VlIHdoYXQga2J1aWxkIGZpbmRzIGJ1dCBJIGFscmVhZHkgc2F3IHR3bw0KPiB3YXJuaW5n
czoNCj4gDQo+IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9tYWluLmM6MTYw
OjIwOiB3YXJuaW5nOiBpbmNvcnJlY3QgdHlwZQ0KPiBpbiBhcmd1bWVudCAxIChkaWZmZXJlbnQg
YWRkcmVzcyBzcGFjZXMpDQo+IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9t
YWluLmM6MTYwOjIwOiAgICBleHBlY3RlZCB2b2lkIGNvbnN0DQo+ICpwdHINCj4gZHJpdmVycy9u
ZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL21haW4uYzoxNjA6MjA6ICAgIGdvdCB2b2lkIFtu
b2RlcmVmXQ0KPiA8YXNuOjI+Klthc3NpZ25lZF0gYWRkcg0KPiBkcml2ZXJzL25ldC93aXJlbGVz
cy9tYXJ2ZWxsL213bHdpZmkvbWFpbi5jOjE3MToyMDogd2FybmluZzogaW5jb3JyZWN0IHR5cGUN
Cj4gaW4gYXJndW1lbnQgMSAoZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2VzKQ0KPiBkcml2ZXJzL25l
dC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvbWFpbi5jOjE3MToyMDogICAgZXhwZWN0ZWQgdm9p
ZCBjb25zdA0KPiAqcHRyDQo+IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9t
YWluLmM6MTcxOjIwOiAgICBnb3Qgdm9pZCBbbm9kZXJlZl0NCj4gPGFzbjoyPipbYXNzaWduZWRd
IGFkZHINCj4NCg0KSSB3aWxsIGZpeCBpdC4NCg0KPiAtLQ0KPiBLYWxsZSBWYWxvDQo=

2015-12-15 07:53:13

by David Lin

[permalink] [raw]
Subject: RE: [PATCH v7] Add new mac80211 driver mwlwifi.

PiBFbW1hbnVlbCBHcnVtYmFjaCBbbWFpbHRvOmVncnVtYmFjaEBnbWFpbC5jb21dIHdyb3RlOg0K
PiANCj4gSGksDQo+IA0KPiBJIHdhcyBpbnRlcmVzdGVkIGluIHRoZSBjaGVja2luZyB0aGUgQS1N
U0RVIGltcGxlbWVudGF0aW9uIG9ubHksIHNvIEkNCj4gcmV2aWV3ZWQgb25seSB0aGF0Lg0KPiAN
Cj4gSSBhbSBub3Qgc3VyZSBJIHJlYWxseSBmb2xsb3dlZCB5b3VyIGltcGxlbWVudGF0aW9uIHRo
b3VnaC4NCj4gSW4gaXdsd2lmaSBJIGNob3NlIHRoZSBMU08gbWVjaGFuaXNtIHRvIGltcGxlbWVu
dCBBLU1TRFUuIEkgdW5kZXJzdGFuZCB0aGF0DQo+IGZvciBhbiBBUCBpdCBtYWtlcyBsZXNzIHNl
bnNlIHNpbmNlIHlvdSBkb24ndCByZWFsbHkgaGF2ZSBsb2NhbGx5IGdlbmVyYXRlZA0KPiB0cmFm
ZmljIGFuZCBMU08gd29uJ3Qgd29yayB3ZWxsIHdpdGggcGFja2V0cyBmb3J3YXJkZWQgYnkgdGhl
IElQIGxheWVyLg0KPiBTbyB5b3Ugc2VlbSB0byBoYXZlIGFkZGVkIGEgdGltZW91dCBtZWNoYW5p
c20gaW5zaWRlIHRoZSBkcml2ZXIgdGhhdA0KPiBhY2N1bXVsYXRlcyB0aGUgcGFja2V0IGZvciBh
IGNlcnRhaW4gcGVyaW9kIG9mIHRpbWUgYW5kIHNlbmQgdGhlbSBhbGwgd2hlbg0KPiB0aGUgbWF4
IG51bWJlciBvZiBwYWNrZXRzIGhhcyBiZWVuIHJlYWNoZWQ/DQo+IEJ1dCBJIGRpZG4ndCBzZWUg
YW55IHRpbWVyIHRoZXJlLCBzbyB0aGF0IGlmIHlvdSBzdGFydCBhbiBBLU1TRFUgYW5kIHRoZW4N
Cj4gc3VkZGVubHkgc3RvcCByZWNlaXZpbmcgcGFja2V0cyBmb3IgdHJhbnNtaXNzaW9uLCB0aGUg
cGFja2V0IGFscmVhZHkgaW4gdGhlDQo+IGJ1ZmZlciB3aWxsIHN0YXkgc3RhbGU/DQo+DQoNClRo
ZSBmbHVzaCBtZWNoYW5pc20gaXMgaG9va2VkIG9uIHF1ZXVlIGVtcHR5IGludGVycnVwdC4NCg0K
PiBBIGZldyBtb3JlIGNvbW1lbnRzIGJlbG93Lg0KPiANCj4gT24gVGh1LCBOb3YgMTIsIDIwMTUg
YXQgNTo1MSBBTSwgRGF2aWQgTGluIDxkbGluQG1hcnZlbGwuY29tPiB3cm90ZToNCj4gPiBUaGlz
IHBhdGNoIHByb3ZpZGVzIHRoZSBtd2x3aWZpIGRyaXZlciBmb3IgTWFydmVsbCA4ODYzLCA4ODY0
IGFuZCA4ODk3DQo+ID4gY2hpcHNldHMuDQo+ID4gVGhpcyBkcml2ZXIgd2FzIGRldmVsb3BlZCBh
cyBwYXJ0IG9mIHRoZSBvcGVud3J0Lm9yZyBwcm9qZWN0IHRvDQo+ID4gc3VwcG9ydCBMaW5rc3lz
IFdSVDE5MDBBQyBhbmQgaXMgbWFpbnRhaW5lZCBvbg0KPiBodHRwczovL2dpdGh1Yi5jb20va2Fs
b3ovbXdsd2lmaS4NCj4gPg0KPiA+IFRoZSBtd2x3aWZpIGRyaXZlciBkaWZmZXJzIGZyb20gZXhp
c3RpbmcgbXdpZmlleCBkcml2ZXI6DQo+ID4gbyBtd2x3aWZpIGlzIGEgInNvZnRtYWMgZHJpdmVy
IiB1c2luZyB0aGUga2VybmVsP+6ogyBtYWM4MDIuMTEgc3Vic3lzdGVtDQo+ID4gdG8gcHJvdmlk
ZSBmdWxsIEFQL1dpcmVsZXNzIEJyaWRnZSBmdW5jdGlvbmFsaXR5IChyb3V0ZXJzKS4NCj4gPiBv
IG13aWZpZXggaXMgYSAiZnVsbG1hYyBkcml2ZXIiIHdoaWNoIHByb3ZpZGVzIGEgY29tcHJlaGVu
c2l2ZSBzZXQgb2YNCj4gPiBjbGllbnQgZnVuY3Rpb25zIChsYXB0b3BzL2VtYmVkZGVkIGRldmlj
ZXMpIG8gb25seSBtd2x3aWZpIHN1cHBvcnRzDQo+ID4gTWFydmVsbCBBUCBjaGlwIDg4Nlggc2Vy
aWVzDQo+ID4NCj4gDQo+IFtzbmlwXQ0KPiANCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgbXdsX21h
YzgwMjExX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCj4gPiArICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwN
Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bQ0KPiBpZWVlODAy
MTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLA0KPiA+ICsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgdGlkLCB1MTYgKnNzbiwgdTggYnVmX3NpemUs
DQo+ID4gK2Jvb2wgYW1zZHUpIHsNCj4gPiArICAgICAgIGludCByYyA9IDA7DQo+ID4gKyAgICAg
ICBzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCj4gPiArICAgICAgIHN0cnVjdCBt
d2xfYW1wZHVfc3RyZWFtICpzdHJlYW07DQo+ID4gKyAgICAgICB1OCAqYWRkciA9IHN0YS0+YWRk
ciwgaWR4Ow0KPiA+ICsgICAgICAgc3RydWN0IG13bF9zdGEgKnN0YV9pbmZvOw0KPiA+ICsNCj4g
PiArICAgICAgIHN0YV9pbmZvID0gbXdsX2Rldl9nZXRfc3RhKHN0YSk7DQo+ID4gKw0KPiA+ICsg
ICAgICAgc3Bpbl9sb2NrX2JoKCZwcml2LT5zdHJlYW1fbG9jayk7DQo+ID4gKw0KPiA+ICsgICAg
ICAgc3RyZWFtID0gbXdsX2Z3Y21kX2xvb2t1cF9zdHJlYW0oaHcsIGFkZHIsIHRpZCk7DQo+ID4g
Kw0KPiA+ICsgICAgICAgc3dpdGNoIChhY3Rpb24pIHsNCj4gPiArICAgICAgIGNhc2UgSUVFRTgw
MjExX0FNUERVX1JYX1NUQVJUOg0KPiA+ICsgICAgICAgY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhf
U1RPUDoNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICBjYXNlIElFRUU4
MDIxMV9BTVBEVV9UWF9TVEFSVDoNCj4gPiArICAgICAgICAgICAgICAgaWYgKCFzdGFfaW5mby0+
aXNfYW1wZHVfYWxsb3dlZCkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHdpcGh5X3dh
cm4oaHctPndpcGh5LCAiYW1wZHUgbm90DQo+IGFsbG93ZWRcbiIpOw0KPiA+ICsgICAgICAgICAg
ICAgICAgICAgICAgIHJjID0gLUVQRVJNOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOw0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBp
ZiAoIXN0cmVhbSkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG13bF9m
d2NtZF9hZGRfc3RyZWFtKGh3LCBzdGEsDQo+IHRpZCk7DQo+ID4gKyAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKCFzdHJlYW0pIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHdpcGh5X3dhcm4oaHctPndpcGh5LCAibm8gc3RyZWFtDQo+IGZvdW5kXG4iKTsNCj4gPiArICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLUVQRVJNOw0KPiA+ICsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg
fQ0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBzcGlu
X3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KPiA+ICsgICAgICAgICAgICAgICByYyA9
IG13bF9md2NtZF9jaGVja19iYShodywgc3RyZWFtLCB2aWYpOw0KPiA+ICsgICAgICAgICAgICAg
ICBzcGluX2xvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2NrKTsNCj4gPiArICAgICAgICAgICAgICAg
aWYgKHJjKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgbXdsX2Z3Y21kX3JlbW92ZV9z
dHJlYW0oaHcsIHN0cmVhbSk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgd2lwaHlfZXJy
KGh3LT53aXBoeSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFtcGR1
IHN0YXJ0IGVycm9yIGNvZGU6ICVkXG4iLA0KPiByYyk7DQo+ID4gKyAgICAgICAgICAgICAgICAg
ICAgICAgcmMgPSAtRVBFUk07DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+
ID4gKyAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICAgICAgc3RyZWFtLT5zdGF0ZSA9
IEFNUERVX1NUUkVBTV9JTl9QUk9HUkVTUzsNCj4gPiArICAgICAgICAgICAgICAgKnNzbiA9IDA7
DQo+ID4gKyAgICAgICAgICAgICAgIGllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKHZp
ZiwgYWRkciwgdGlkKTsNCj4gDQo+IFRoaXMgaXMgd2h5IHlvdSBoYXZlIHRoZSByYWNlIHlvdSBt
ZW50aW9uIGJlbG93LiBXaGF0IHlvdSBzaG91bGQgcmVhbGx5IGJlDQo+IGRvaW5nIGlzIHRvIHdh
aXQgdW50aWwgdGhlIGFsbCB0aGUgcGFja2V0cyBmb3IgdGhhdCBSQSAvIFRJRCBhcmUgc2VudCBm
cm9tIGFsbCB0aGUNCj4gSFcgVHggcXVldWVzIChvbmx5IG9uZSByZWFsaXN0aWNhbGx5KSwgYW5k
IG9ubHkgdGhlbiBjYWxsIHRoZSBfY2IuIFRoaXMgd2lsbA0KPiBhbGxvdyB5b3UgdG8gc2VuZCB0
aGUgQUREQkEgcmVxIG9uIHRoZSBWTyBxdWV1ZSBhcyBpdCBzaG91bGQgYmUgYWNjb3JkaW5nIHRv
DQo+IHNwZWMuDQo+IA0KPiBbc25pcF0NCj4gDQo+ID4gKw0KPiA+ICt2b2lkIG13bF9yeF9yZWN2
KHVuc2lnbmVkIGxvbmcgZGF0YSkNCj4gPiArew0KPiANCj4gW3NuaXBdDQo+IA0KPiA+ICsNCj4g
PiArICAgICAgICAgICAgICAgICAgICAgICBpZg0KPiAodW5saWtlbHkoaWVlZTgwMjExX2lzX2Fj
dGlvbih3aC0+ZnJhbWVfY29udHJvbCkgJiYNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPT0NCj4gPiArICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9DQVRFR09SWV9CQUNLICYmDQo+ID4gKw0KPiBt
Z210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuYWN0aW9uX2NvZGUgPT0NCj4gPiArICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9BQ1RJT05fQUREQkFfUkVTUCkpDQo+IHsN
Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiID0NCj4gbWdtdC0+dS5h
Y3Rpb24udS5hZGRiYV9yZXNwLmNhcGFiOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWYgKGxlMTZfdG9fY3B1KGNhcGFiKSAmIDEpDQo+ID4gKw0KPiBtd2xfcnhfZW5hYmxl
X3N0YV9hbXNkdShwcml2LA0KPiA+ICsgbWdtdC0+c2EpOw0KPiANCj4gZXJyLi4uIG5vLiBtYWM4
MDIxMSBrbm93cyBob3cgdG8gZG8gdGhhdCB0b2RheS4gSm9oYW5uZXMgYWxyZWFkeSByZXBvcnRl
ZCBhDQo+IHNpbWlsYXIgaXNzdWUgc29tZXdoZXJlIGVsc2UgaW4geW91ciBjb2RlLg0KDQpZZXMu
IFRoZSBwYXRjaCBpcyByZWFkeSBvbiAyMDE1LzkuDQoNCj4gDQo+ID4gKyAgICAgICAgICAgICAg
ICAgICAgICAgfQ0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAg
ICAgICBpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKHdoLT5mcmFtZV9jb250cm9sKSAmJg0KPiA+
ICsgICAgICAgICAgICAgICAgICAgaWVlZTgwMjExX2hhc19hNCh3aC0+ZnJhbWVfY29udHJvbCkp
IHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fv
c19jdGwod2gpOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnFjICYN
Cj4gSUVFRTgwMjExX1FPU19DVExfQV9NU0RVX1BSRVNFTlQpDQo+ID4gKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZg0KPiAobXdsX3J4X3Byb2Nlc3NfbWVzaF9hbXNkdShwcml2LCBw
cnhfc2tiLA0KPiA+ICsNCj4gPiArICZzdGF0dXMpKQ0KPiANCj4gVGhpcyBzb3VuZHMgdG8gYmUg
c29tZXRoaW5nIHlvdSB3YW50IHRvIHRlYWNoIG1hYzgwMjExIGFib3V0Lg0KPiANCj4gW3NuaXBd
DQo+IA0KPiA+ICsNCj4gPiArI2RlZmluZSBTWVNBRFBUX0FNU0RVX0ZXX01BWF9TSVpFICAgICAg
MzMwMA0KPiA+ICsNCj4gPiArI2RlZmluZSBTWVNBRFBUX0FNU0RVXzRLX01BWF9TSVpFDQo+IFNZ
U0FEUFRfQU1TRFVfRldfTUFYX1NJWkUNCj4gPiArDQo+ID4gKyNkZWZpbmUgU1lTQURQVF9BTVNE
VV84S19NQVhfU0laRQ0KPiBTWVNBRFBUX0FNU0RVX0ZXX01BWF9TSVpFDQo+IA0KPiBJbiBjYXNl
IHRoZSBGVyB3aWxsIGdyb3cgbGF0ZXI/DQo+IA0KPiA+ICsNCj4gPiArI2RlZmluZSBTWVNBRFBU
X0FNU0RVX0FMTE9XX1NJWkUgICAgICAgMTYwMA0KPiA+ICsNCj4gPiArI2RlZmluZSBTWVNBRFBU
X0FNU0RVX0ZMVVNIX1RJTUUgICAgICAgNTAwDQo+ID4gKw0KPiA+ICsjZGVmaW5lIFNZU0FEUFRf
QU1TRFVfUEFDS0VUX1RIUkVTSE9MRCAxMA0KPiA+ICsNCj4gPiArI2RlZmluZSBTWVNBRFBUX01B
WF9USUQgICAgICAgICAgICAgICAgOA0KPiA+ICsNCj4gPiArI2VuZGlmIC8qIF9td2xfc3lzYWRw
dF9oXyAqLw0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213
bHdpZmkvdHguYw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL3R4
LmMNCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAuLjY4YTk5NGQN
Cj4gPiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVs
bC9td2x3aWZpL3R4LmMNCj4gPiBAQCAtMCwwICsxLDEyNTEgQEANCj4gPiArLyoNCj4gPiArICog
Q29weXJpZ2h0IChDKSAyMDA2LTIwMTUsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuDQo+ID4g
KyAqDQo+ID4gKyAqIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0
ZWQgYnkgTWFydmVsbA0KPiA+ICtJbnRlcm5hdGlvbmFsDQo+ID4gKyAqIEx0ZC4gdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsDQo+ID4g
K0p1bmUgMTk5MQ0KPiA+ICsgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0
cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcw0KPiA+ICtGaWxlIGluDQo+ID4gKyAqIGFjY29yZGFu
Y2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2UsIGEgY29weSBv
Zg0KPiA+ICt3aGljaA0KPiA+ICsgKiBpcyBhdmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+ID4gKyAqDQo+ID4gKyAqIFRIRSBGSUxFIElT
IERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQNCj4g
PiArVEhFDQo+ID4gKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1Ig
RklUTkVTUyBGT1IgQQ0KPiBQQVJUSUNVTEFSDQo+ID4gK1BVUlBPU0UNCj4gPiArICogQVJFIEVY
UFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRh
aWxzDQo+ID4gK2Fib3V0DQo+ID4gKyAqIHRoaXMgd2FycmFudHkgZGlzY2xhaW1lci4NCj4gPiAr
ICovDQo+ID4gKw0KPiA+ICsvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRy
YW5zbWl0IHJlbGF0ZWQgZnVuY3Rpb25zLiAqLw0KPiA+ICsNCj4gPiArI2luY2x1ZGUgPGxpbnV4
L2V0aGVyZGV2aWNlLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4NCj4gPiArDQo+
ID4gKyNpbmNsdWRlICJzeXNhZHB0LmgiDQo+ID4gKyNpbmNsdWRlICJkZXYuaCINCj4gPiArI2lu
Y2x1ZGUgImZ3Y21kLmgiDQo+ID4gKyNpbmNsdWRlICJ0eC5oIg0KPiA+ICsNCj4gPiArI2RlZmlu
ZSBNQVhfTlVNX1RYX1JJTkdfQllURVMgIChTWVNBRFBUX01BWF9OVU1fVFhfREVTQyAqIFwNCj4g
PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXdsX3R4X2Rl
c2MpKQ0KPiA+ICsNCj4gPiArI2RlZmluZSBNQVhfTlVNX1RYX0hORExfQllURVMgICAoU1lTQURQ
VF9NQVhfTlVNX1RYX0RFU0MgKg0KPiBcDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzaXplb2Yoc3RydWN0IG13bF90eF9obmRsKSkNCj4gPiArDQo+ID4gKyNkZWZpbmUgRUFH
TEVfVFhEX1hNSVRDVFJMX1VTRV9NQ19SQVRFICAgICAweDggICAgIC8qIFVzZQ0KPiBtdWx0aWNh
c3QgZGF0YSByYXRlICovDQo+ID4gKw0KPiA+ICsjZGVmaW5lIE1XTF9RT1NfQUNLX1BPTElDWV9N
QVNLICAgICAgICAgICAgICAgICAgIDB4MDA2MA0KPiA+ICsjZGVmaW5lIE1XTF9RT1NfQUNLX1BP
TElDWV9OT1JNQUwgICAgICAgICAgMHgwMDAwDQo+ID4gKyNkZWZpbmUgTVdMX1FPU19BQ0tfUE9M
SUNZX0JMT0NLQUNLICAgICAgICAweDAwNjANCj4gPiArDQo+ID4gKyNkZWZpbmUgRVhUX0lWICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwDQo+ID4gKyNkZWZpbmUgSU5DUkVBU0VfSVYo
aXYxNiwgaXYzMikgXA0KPiA+ICt7IFwNCj4gPiArICAgICAgIChpdjE2KSsrOyBcDQo+ID4gKyAg
ICAgICBpZiAoKGl2MTYpID09IDApIFwNCj4gPiArICAgICAgICAgICAgICAgKGl2MzIpKys7IFwN
Cj4gPiArfQ0KPiA+ICsNCj4gPiArLyogVHJhbnNtaXQgcmF0ZSBpbmZvcm1hdGlvbiBjb25zdGFu
dHMgKi8NCj4gPiArI2RlZmluZSBUWF9SQVRFX0ZPUk1BVF9MRUdBQ1kgICAgICAgICAwDQo+ID4g
KyNkZWZpbmUgVFhfUkFURV9GT1JNQVRfMTFOICAgICAgICAgICAgMQ0KPiA+ICsjZGVmaW5lIFRY
X1JBVEVfRk9STUFUXzExQUMgICAgICAgICAgIDINCj4gPiArDQo+ID4gKyNkZWZpbmUgVFhfUkFU
RV9CQU5EV0lEVEhfMjAgICAgICAgICAgMA0KPiA+ICsjZGVmaW5lIFRYX1JBVEVfQkFORFdJRFRI
XzQwICAgICAgICAgIDENCj4gPiArI2RlZmluZSBUWF9SQVRFX0JBTkRXSURUSF84MCAgICAgICAg
ICAyDQo+ID4gKw0KPiA+ICsjZGVmaW5lIFRYX1JBVEVfSU5GT19TVERfR0kgICAgICAgICAgIDAN
Cj4gPiArI2RlZmluZSBUWF9SQVRFX0lORk9fU0hPUlRfR0kgICAgICAgICAxDQo+ID4gKw0KPiA+
ICtlbnVtIHsNCj4gPiArICAgICAgIElFRUVfVFlQRV9NQU5BR0VNRU5UID0gMCwNCj4gPiArICAg
ICAgIElFRUVfVFlQRV9DT05UUk9MLA0KPiA+ICsgICAgICAgSUVFRV9UWVBFX0RBVEENCj4gPiAr
fTsNCj4gPiArDQo+ID4gK3N0cnVjdCBjY21wX2hkciB7DQo+ID4gKyAgICAgICBfX2xlMTYgaXYx
NjsNCj4gPiArICAgICAgIHU4IHJzdmQ7DQo+ID4gKyAgICAgICB1OCBrZXlfaWQ7DQo+ID4gKyAg
ICAgICBfX2xlMzIgaXYzMjsNCj4gPiArfSBfX3BhY2tlZDsNCj4gPiArDQo+ID4gK3N0YXRpYyBp
bnQgbXdsX3R4X3JpbmdfYWxsb2Moc3RydWN0IG13bF9wcml2ICpwcml2KSB7DQo+ID4gKyAgICAg
ICBzdHJ1Y3QgbXdsX2Rlc2NfZGF0YSAqZGVzYzsNCj4gPiArICAgICAgIGludCBudW07DQo+ID4g
KyAgICAgICB1OCAqbWVtOw0KPiA+ICsNCj4gPiArICAgICAgIGRlc2MgPSAmcHJpdi0+ZGVzY19k
YXRhWzBdOw0KPiA+ICsNCj4gPiArICAgICAgIG1lbSA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJp
di0+cGRldi0+ZGV2LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9O
VU1fVFhfUklOR19CWVRFUyAqDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
U1lTQURQVF9OVU1fT0ZfREVTQ19EQVRBLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICZkZXNjLT5wcGh5c190eF9yaW5nLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIEdGUF9LRVJORUwpOw0KPiA+ICsNCj4gPiArICAgICAgIGlmICghbWVtKSB7DQo+
ID4gKyAgICAgICAgICAgICAgIHdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJjYW5ub3QgYWxs
b2MgbWVtXG4iKTsNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07DQo+ID4gKyAg
ICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05V
TV9PRl9ERVNDX0RBVEE7IG51bSsrKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGRlc2MgPSAmcHJp
di0+ZGVzY19kYXRhW251bV07DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBkZXNjLT5wdHhf
cmluZyA9IChzdHJ1Y3QgbXdsX3R4X2Rlc2MgKikNCj4gPiArICAgICAgICAgICAgICAgICAgICAg
ICAobWVtICsgbnVtICogTUFYX05VTV9UWF9SSU5HX0JZVEVTKTsNCj4gPiArDQo+ID4gKyAgICAg
ICAgICAgICAgIGRlc2MtPnBwaHlzX3R4X3JpbmcgPSAoZG1hX2FkZHJfdCkNCj4gPiArICAgICAg
ICAgICAgICAgICAgICAgICAoKHUzMilwcml2LT5kZXNjX2RhdGFbMF0ucHBoeXNfdHhfcmluZyAr
DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgbnVtICogTUFYX05VTV9UWF9SSU5HX0JZVEVT
KTsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgIG1lbXNldChkZXNjLT5wdHhfcmluZywgMHgw
MCwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgIE1BWF9OVU1fVFhfUklOR19CWVRFUyk7DQo+
ID4gKyAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgbWVtID0ga21hbGxvYyhNQVhfTlVNX1RY
X0hORExfQllURVMgKg0KPiBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEEsDQo+ID4gKyAgICAgICAg
ICAgICAgICAgICAgIEdGUF9LRVJORUwpOw0KPiA+ICsNCj4gPiArICAgICAgIGlmICghbWVtKSB7
DQo+ID4gKyAgICAgICAgICAgICAgIHdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJjYW5ub3Qg
YWxsb2MgbWVtXG4iKTsNCj4gPiArICAgICAgICAgICAgICAgZG1hX2ZyZWVfY29oZXJlbnQoJnBy
aXYtPnBkZXYtPmRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFY
X05VTV9UWF9SSU5HX0JZVEVTICoNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgU1lTQURQVF9OVU1fT0ZfREVTQ19EQVRBLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBwcml2LT5kZXNjX2RhdGFbMF0ucHR4X3JpbmcsDQo+ID4gKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmRlc2NfZGF0YVswXS5wcGh5c190eF9yaW5nKTsN
Cj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07DQo+ID4gKyAgICAgICB9DQo+ID4g
Kw0KPiA+ICsgICAgICAgZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05VTV9PRl9ERVNDX0RB
VEE7IG51bSsrKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGRlc2MgPSAmcHJpdi0+ZGVzY19kYXRh
W251bV07DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBkZXNjLT50eF9obmRsID0gKHN0cnVj
dCBtd2xfdHhfaG5kbCAqKQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIChtZW0gKyBudW0g
KiBNQVhfTlVNX1RYX0hORExfQllURVMpOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgbWVt
c2V0KGRlc2MtPnR4X2huZGwsIDB4MDAsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICBNQVhf
TlVNX1RYX0hORExfQllURVMpOw0KPiA+ICsgICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgIHJl
dHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IG13bF90eF9yaW5nX2luaXQo
c3RydWN0IG13bF9wcml2ICpwcml2KSB7DQo+ID4gKyAgICAgICBpbnQgbnVtLCBpOw0KPiA+ICsg
ICAgICAgc3RydWN0IG13bF9kZXNjX2RhdGEgKmRlc2M7DQo+ID4gKw0KPiA+ICsgICAgICAgZm9y
IChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEE7IG51bSsrKSB7DQo+ID4g
KyAgICAgICAgICAgICAgIHNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPnR4cVtudW1dKTsNCj4g
PiArICAgICAgICAgICAgICAgcHJpdi0+ZndfZGVzY19jbnRbbnVtXSA9IDA7DQo+ID4gKw0KPiA+
ICsgICAgICAgICAgICAgICBkZXNjID0gJnByaXYtPmRlc2NfZGF0YVtudW1dOw0KPiA+ICsNCj4g
PiArICAgICAgICAgICAgICAgaWYgKGRlc2MtPnB0eF9yaW5nKSB7DQo+ID4gKyAgICAgICAgICAg
ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNZU0FEUFRfTUFYX05VTV9UWF9ERVNDOw0KPiBp
KyspIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPnB0eF9yaW5n
W2ldLnN0YXR1cyA9DQo+ID4gKw0KPiBjcHVfdG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0lETEUp
Ow0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+cHR4X3JpbmdbaV0u
cHBoeXNfbmV4dCA9DQo+ID4gKw0KPiBjcHVfdG9fbGUzMigodTMyKWRlc2MtPnBwaHlzX3R4X3Jp
bmcgKw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGkgKyAx
KSAqIHNpemVvZihzdHJ1Y3QNCj4gbXdsX3R4X2Rlc2MpKSk7DQo+ID4gKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkZXNjLT50eF9obmRsW2ldLnBkZXNjID0NCj4gPiArICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPnB0eF9yaW5nW2ldOw0KPiA+ICsg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBTWVNBRFBUX01BWF9OVU1fVFhf
REVTQw0KPiAtIDEpDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlc2MtPnR4X2huZGxbaV0ucG5leHQgPQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT50eF9obmRsW2kNCj4gKyAxXTsNCj4gPiArICAg
ICAgICAgICAgICAgICAgICAgICB9DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+
cHR4X3JpbmdbU1lTQURQVF9NQVhfTlVNX1RYX0RFU0MNCj4gLSAxXS5wcGh5c19uZXh0ID0NCj4g
PiArDQo+IGNwdV90b19sZTMyKCh1MzIpZGVzYy0+cHBoeXNfdHhfcmluZyk7DQo+ID4gKyAgICAg
ICAgICAgICAgICAgICAgICAgZGVzYy0+dHhfaG5kbFtTWVNBRFBUX01BWF9OVU1fVFhfREVTQyAt
DQo+IDFdLnBuZXh0ID0NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNj
LT50eF9obmRsWzBdOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5w
c3RhbGVfdHhfaG5kbCA9ICZkZXNjLT50eF9obmRsWzBdOw0KPiA+ICsgICAgICAgICAgICAgICAg
ICAgICAgIGRlc2MtPnBuZXh0X3R4X2huZGwgID0gJmRlc2MtPnR4X2huZGxbMF07DQo+ID4gKyAg
ICAgICAgICAgICAgIH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgd2lwaHlf
ZXJyKHByaXYtPmh3LT53aXBoeSwgIm5vIHZhbGlkIFRYDQo+IG1lbVxuIik7DQo+ID4gKyAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07DQo+ID4gKyAgICAgICAgICAgICAgIH0N
Cj4gPiArICAgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICByZXR1cm4gMDsNCj4gPiArfQ0KPiA+
ICsNCj4gPiArc3RhdGljIHZvaWQgbXdsX3R4X3JpbmdfY2xlYW51cChzdHJ1Y3QgbXdsX3ByaXYg
KnByaXYpIHsNCj4gPiArICAgICAgIGludCBjbGVhbmVkX3R4X2Rlc2MgPSAwOw0KPiA+ICsgICAg
ICAgaW50IG51bSwgaTsNCj4gPiArICAgICAgIHN0cnVjdCBtd2xfZGVzY19kYXRhICpkZXNjOw0K
PiA+ICsNCj4gPiArICAgICAgIGZvciAobnVtID0gMDsgbnVtIDwgU1lTQURQVF9OVU1fT0ZfREVT
Q19EQVRBOyBudW0rKykgew0KPiA+ICsgICAgICAgICAgICAgICBza2JfcXVldWVfcHVyZ2UoJnBy
aXYtPnR4cVtudW1dKTsNCj4gPiArICAgICAgICAgICAgICAgcHJpdi0+ZndfZGVzY19jbnRbbnVt
XSA9IDA7DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBkZXNjID0gJnByaXYtPmRlc2NfZGF0
YVtudW1dOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgaWYgKGRlc2MtPnB0eF9yaW5nKSB7
DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNZU0FEUFRfTUFY
X05VTV9UWF9ERVNDOw0KPiBpKyspIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICghZGVzYy0+dHhfaG5kbFtpXS5wc2tfYnVmZikNCj4gPiArICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQo+ID4gKw0KPiA+ICsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksDQo+ID4gKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bm1hcHBlZCBhbmQgZnJl
ZSdkDQo+ICVpIDB4JXAgMHgleFxuIiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgaSwNCj4gPiArDQo+IGRlc2MtPnR4X2huZGxbaV0ucHNrX2J1ZmYtPmRh
dGEsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJf
dG9fY3B1KA0KPiA+ICsNCj4gZGVzYy0+cHR4X3JpbmdbaV0ucGt0X3B0cikpOw0KPiA+ICsgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LA0K
PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZTMy
X3RvX2NwdSgNCj4gPiArDQo+IGRlc2MtPnB0eF9yaW5nW2ldLnBrdF9wdHIpLA0KPiA+ICsNCj4g
ZGVzYy0+dHhfaG5kbFtpXS5wc2tfYnVmZi0+bGVuLA0KPiA+ICsNCj4gUENJX0RNQV9UT0RFVklD
RSk7DQo+ID4gKw0KPiBkZXZfa2ZyZWVfc2tiX2FueShkZXNjLT50eF9obmRsW2ldLnBza19idWZm
KTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPnB0eF9yaW5nW2ld
LnN0YXR1cyA9DQo+ID4gKw0KPiBjcHVfdG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0lETEUpOw0K
PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+cHR4X3JpbmdbaV0ucGt0
X3B0ciA9IDA7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5wdHhf
cmluZ1tpXS5wa3RfbGVuID0gMDsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlc2MtPnR4X2huZGxbaV0ucHNrX2J1ZmYgPSBOVUxMOw0KPiA+ICsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY2xlYW5lZF90eF9kZXNjKys7DQo+ID4gKyAgICAgICAgICAgICAgICAg
ICAgICAgfQ0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKyAgICAgICB9DQo+ID4gKw0KPiA+
ICsgICAgICAgd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksICJjbGVhbmVkICVpIFRYIGRlc2Ny
XG4iLA0KPiA+ICtjbGVhbmVkX3R4X2Rlc2MpOyB9DQo+ID4gKw0KPiA+ICtzdGF0aWMgdm9pZCBt
d2xfdHhfcmluZ19mcmVlKHN0cnVjdCBtd2xfcHJpdiAqcHJpdikgew0KPiA+ICsgICAgICAgaW50
IG51bTsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAocHJpdi0+ZGVzY19kYXRhWzBdLnB0eF9yaW5n
KSB7DQo+ID4gKyAgICAgICAgICAgICAgIGRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5k
ZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9OVU1fVFhfUklO
R19CWVRFUyAqDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0FEUFRf
TlVNX09GX0RFU0NfREFUQSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cHJpdi0+ZGVzY19kYXRhWzBdLnB0eF9yaW5nLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBwcml2LT5kZXNjX2RhdGFbMF0ucHBoeXNfdHhfcmluZyk7DQo+ID4gKyAgICAg
ICB9DQo+ID4gKw0KPiA+ICsgICAgICAgZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05VTV9P
Rl9ERVNDX0RBVEE7IG51bSsrKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGlmIChwcml2LT5kZXNj
X2RhdGFbbnVtXS5wdHhfcmluZykNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5k
ZXNjX2RhdGFbbnVtXS5wdHhfcmluZyA9IE5VTEw7DQo+ID4gKyAgICAgICAgICAgICAgIHByaXYt
PmRlc2NfZGF0YVtudW1dLnBzdGFsZV90eF9obmRsID0gTlVMTDsNCj4gPiArICAgICAgICAgICAg
ICAgcHJpdi0+ZGVzY19kYXRhW251bV0ucG5leHRfdHhfaG5kbCA9IE5VTEw7DQo+ID4gKyAgICAg
ICB9DQo+ID4gKw0KPiA+ICsgICAgICAga2ZyZWUocHJpdi0+ZGVzY19kYXRhWzBdLnR4X2huZGwp
Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgbXdsX3R4X2FkZF9kbWFf
aGVhZGVyKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsDQo+ID4gKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZF9wYWQsDQo+ID4gKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFpbF9wYWQpIHsNCj4gPiArICAg
ICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICp3aDsNCj4gPiArICAgICAgIGludCBoZHJsZW47DQo+
ID4gKyAgICAgICBpbnQgcmVxZF9oZHJsZW47DQo+ID4gKyAgICAgICBzdHJ1Y3QgbXdsX2RtYV9k
YXRhICp0cjsNCj4gPiArDQo+ID4gKyAgICAgICAvKiBBZGQgYSBmaXJtd2FyZSBETUEgaGVhZGVy
OyB0aGUgZmlybXdhcmUgcmVxdWlyZXMgdGhhdCB3ZQ0KPiA+ICsgICAgICAgICogcHJlc2VudCBh
IDItYnl0ZSBwYXlsb2FkIGxlbmd0aCBmb2xsb3dlZCBieSBhIDQtYWRkcmVzcw0KPiA+ICsgICAg
ICAgICogaGVhZGVyICh3aXRob3V0IFFvUyBmaWVsZCksIGZvbGxvd2VkIChvcHRpb25hbGx5KSBi
eSBhbnkNCj4gPiArICAgICAgICAqIFdFUC9FeHRJViBoZWFkZXIgKGJ1dCBvbmx5IGZpbGxlZCBp
biBmb3IgQ0NNUCkuDQo+ID4gKyAgICAgICAgKi8NCj4gPiArICAgICAgIHdoID0gKHN0cnVjdCBp
ZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOw0KPiA+ICsNCj4gPiArICAgICAgIGhkcmxlbiA9IGll
ZWU4MDIxMV9oZHJsZW4od2gtPmZyYW1lX2NvbnRyb2wpOw0KPiA+ICsNCj4gPiArICAgICAgIHJl
cWRfaGRybGVuID0gc2l6ZW9mKCp0cikgKyBoZWFkX3BhZDsNCj4gPiArDQo+ID4gKyAgICAgICBp
ZiAoaGRybGVuICE9IHJlcWRfaGRybGVuKQ0KPiA+ICsgICAgICAgICAgICAgICBza2JfcHVzaChz
a2IsIHJlcWRfaGRybGVuIC0gaGRybGVuKTsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAoaWVlZTgw
MjExX2lzX2RhdGFfcW9zKHdoLT5mcmFtZV9jb250cm9sKSkNCj4gPiArICAgICAgICAgICAgICAg
aGRybGVuIC09IElFRUU4MDIxMV9RT1NfQ1RMX0xFTjsNCj4gPiArDQo+ID4gKyAgICAgICB0ciA9
IChzdHJ1Y3QgbXdsX2RtYV9kYXRhICopc2tiLT5kYXRhOw0KPiA+ICsNCj4gPiArICAgICAgIGlm
ICh3aCAhPSAmdHItPndoKQ0KPiA+ICsgICAgICAgICAgICAgICBtZW1tb3ZlKCZ0ci0+d2gsIHdo
LCBoZHJsZW4pOw0KPiA+ICsNCj4gPiArICAgICAgIGlmIChoZHJsZW4gIT0gc2l6ZW9mKHRyLT53
aCkpDQo+ID4gKyAgICAgICAgICAgICAgIG1lbXNldCgoKHZvaWQgKikmdHItPndoKSArIGhkcmxl
biwgMCwgc2l6ZW9mKHRyLT53aCkgLQ0KPiA+ICsgaGRybGVuKTsNCj4gPiArDQo+ID4gKyAgICAg
ICAvKiBGaXJtd2FyZSBsZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgZnVsbHkgZm9ybWVkICI4
MDIuMTENCj4gPiArICAgICAgICAqIHBheWxvYWQiLiAgVGhhdCBpcywgZXZlcnl0aGluZyBleGNl
cHQgZm9yIHRoZSA4MDIuMTEgaGVhZGVyLg0KPiA+ICsgICAgICAgICogVGhpcyBpbmNsdWRlcyBh
bGwgY3J5cHRvIG1hdGVyaWFsIGluY2x1ZGluZyB0aGUgTUlDLg0KPiA+ICsgICAgICAgICovDQo+
ID4gKyAgICAgICB0ci0+ZndsZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbiAtIHNpemVvZigqdHIp
ICsgdGFpbF9wYWQpOyB9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgbXdsX3R4X2Vu
Y2Fwc3VsYXRlX2ZyYW1lKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwNCj4gPiArICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsDQo+ID4g
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QNCj4gaWVl
ZTgwMjExX2tleV9jb25mICprX2NvbmYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBib29sICpjY21wKSB7DQo+ID4gKyAgICAgICBpbnQgaGVhZF9wYWQg
PSAwOw0KPiA+ICsgICAgICAgaW50IGRhdGFfcGFkID0gMDsNCj4gPiArDQo+ID4gKyAgICAgICAv
KiBNYWtlIHN1cmUgdGhlIHBhY2tldCBoZWFkZXIgaXMgaW4gdGhlIERNQSBoZWFkZXIgZm9ybWF0
DQo+ICg0LWFkZHJlc3MNCj4gPiArICAgICAgICAqIHdpdGhvdXQgUW9TKSwgYW5kIGFkZCBoZWFk
ICYgdGFpbCBwYWRkaW5nIHdoZW4gSFcgY3J5cHRvIGlzDQo+IGVuYWJsZWQuDQo+ID4gKyAgICAg
ICAgKg0KPiA+ICsgICAgICAgICogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIHRyYWlsZXIgcGFkZGlu
ZyByZXF1aXJlbWVudHM6DQo+ID4gKyAgICAgICAgKiAtIFdFUDogNCB0cmFpbGVyIGJ5dGVzIChJ
Q1YpDQo+ID4gKyAgICAgICAgKiAtIFRLSVA6IDEyIHRyYWlsZXIgYnl0ZXMgKDggTUlDICsgNCBJ
Q1YpDQo+ID4gKyAgICAgICAgKiAtIENDTVA6IDggdHJhaWxlciBieXRlcyAoTUlDKQ0KPiA+ICsg
ICAgICAgICovDQo+ID4gKw0KPiA+ICsgICAgICAgaWYgKGtfY29uZikgew0KPiA+ICsgICAgICAg
ICAgICAgICBoZWFkX3BhZCA9IGtfY29uZi0+aXZfbGVuOw0KPiA+ICsNCj4gPiArICAgICAgICAg
ICAgICAgc3dpdGNoIChrX2NvbmYtPmNpcGhlcikgew0KPiA+ICsgICAgICAgICAgICAgICBjYXNl
IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOg0KPiA+ICsgICAgICAgICAgICAgICBjYXNlIFdMQU5f
Q0lQSEVSX1NVSVRFX1dFUDEwNDoNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3Bh
ZCA9IDQ7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICAg
ICAgICAgIGNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoNCj4gPiArICAgICAgICAgICAgICAg
ICAgICAgICBkYXRhX3BhZCA9IDEyOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
Ow0KPiA+ICsgICAgICAgICAgICAgICBjYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6DQo+ID4g
KyAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wYWQgPSA4Ow0KPiA+ICsgICAgICAgICAgICAg
ICAgICAgICAgICpjY21wID0gdHJ1ZTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsNCj4gPiArICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAgfQ0KPiA+ICsNCj4gPiArICAg
ICAgIG13bF90eF9hZGRfZG1hX2hlYWRlcihwcml2LCBza2IsIGhlYWRfcGFkLCBkYXRhX3BhZCk7
IH0NCj4gPiArDQo+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xfdHhfaW5zZXJ0X2NjbXBfaGRy
KHU4ICpwY2NtcF9oZHIsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdTgga2V5X2lkLCB1MTYgaXYxNiwgdTMyDQo+ID4gK2l2MzIpIHsNCj4gPiArICAgICAg
IHN0cnVjdCBjY21wX2hkciAqY2NtcF9oID0gKHN0cnVjdCBjY21wX2hkciAqKXBjY21wX2hkcjsN
Cj4gPiArDQo+ID4gKyAgICAgICBjY21wX2gtPml2MTYgPSBjcHVfdG9fbGUxNihpdjE2KTsNCj4g
PiArICAgICAgIGNjbXBfaC0+cnN2ZCA9IDA7DQo+ID4gKyAgICAgICBjY21wX2gtPmtleV9pZCA9
IEVYVF9JViB8IChrZXlfaWQgPDwgNik7DQo+ID4gKyAgICAgICBjY21wX2gtPml2MzIgPSBjcHVf
dG9fbGUzMihpdjMyKTsgfQ0KPiA+ICsNCj4gPiArc3RhdGljIGlubGluZSBpbnQgbXdsX3R4X3Rp
ZF9xdWV1ZV9tYXBwaW5nKHU4IHRpZCkgew0KPiA+ICsgICAgICAgc3dpdGNoICh0aWQpIHsNCj4g
PiArICAgICAgIGNhc2UgMDoNCj4gPiArICAgICAgIGNhc2UgMzoNCj4gPiArICAgICAgICAgICAg
ICAgcmV0dXJuIElFRUU4MDIxMV9BQ19CRTsNCj4gPiArICAgICAgIGNhc2UgMToNCj4gPiArICAg
ICAgIGNhc2UgMjoNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIElFRUU4MDIxMV9BQ19CSzsN
Cj4gPiArICAgICAgIGNhc2UgNDoNCj4gPiArICAgICAgIGNhc2UgNToNCj4gPiArICAgICAgICAg
ICAgICAgcmV0dXJuIElFRUU4MDIxMV9BQ19WSTsNCj4gPiArICAgICAgIGNhc2UgNjoNCj4gPiAr
ICAgICAgIGNhc2UgNzoNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIElFRUU4MDIxMV9BQ19W
TzsNCj4gPiArICAgICAgIGRlZmF1bHQ6DQo+ID4gKyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+
ICsgICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgIHJldHVybiAtMTsNCj4gPiArfQ0KPiA+ICsN
Cj4gPiArc3RhdGljIGlubGluZSB2b2lkIG13bF90eF9jb3VudF9wYWNrZXQoc3RydWN0IGllZWU4
MDIxMV9zdGEgKnN0YSwgdTgNCj4gPiArdGlkKSB7DQo+ID4gKyAgICAgICBzdHJ1Y3QgbXdsX3N0
YSAqc3RhX2luZm87DQo+ID4gKyAgICAgICBzdHJ1Y3QgbXdsX3R4X2luZm8gKnR4X3N0YXRzOw0K
PiA+ICsNCj4gPiArICAgICAgIGlmIChXQVJOX09OKHRpZCA+PSBTWVNBRFBUX01BWF9USUQpKQ0K
PiA+ICsgICAgICAgICAgICAgICByZXR1cm47DQo+ID4gKw0KPiA+ICsgICAgICAgc3RhX2luZm8g
PSBtd2xfZGV2X2dldF9zdGEoc3RhKTsNCj4gPiArDQo+ID4gKyAgICAgICB0eF9zdGF0cyA9ICZz
dGFfaW5mby0+dHhfc3RhdHNbdGlkXTsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAodHhfc3RhdHMt
PnN0YXJ0X3RpbWUgPT0gMCkNCj4gPiArICAgICAgICAgICAgICAgdHhfc3RhdHMtPnN0YXJ0X3Rp
bWUgPSBqaWZmaWVzOw0KPiA+ICsNCj4gPiArICAgICAgIC8qIHJlc2V0IHRoZSBwYWNrZXQgY291
bnQgYWZ0ZXIgZWFjaCBzZWNvbmQgZWxhcHNlcy4gIElmIHRoZQ0KPiBudW1iZXIgb2YNCj4gPiAr
ICAgICAgICAqIHBhY2tldHMgZXZlciBleGNlZWRzIHRoZSBhbXBkdV9taW5fdHJhZmZpYyB0aHJl
c2hvbGQsIHdlIHdpbGwNCj4gYWxsb3cNCj4gPiArICAgICAgICAqIGFuIGFtcGR1IHN0cmVhbSB0
byBiZSBzdGFydGVkLg0KPiA+ICsgICAgICAgICovDQo+ID4gKyAgICAgICBpZiAoamlmZmllcyAt
IHR4X3N0YXRzLT5zdGFydF90aW1lID4gSFopIHsNCj4gPiArICAgICAgICAgICAgICAgdHhfc3Rh
dHMtPnBrdHMgPSAwOw0KPiA+ICsgICAgICAgICAgICAgICB0eF9zdGF0cy0+c3RhcnRfdGltZSA9
IDA7DQo+ID4gKyAgICAgICB9IGVsc2Ugew0KPiA+ICsgICAgICAgICAgICAgICB0eF9zdGF0cy0+
cGt0cysrOw0KPiA+ICsgICAgICAgfQ0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW5saW5l
IGJvb2wgbXdsX3R4X2F2YWlsYWJsZShzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIGludA0KPiA+ICtk
ZXNjX251bSkgew0KPiA+ICsgICAgICAgc3RydWN0IG13bF90eF9obmRsICp0eF9obmRsOw0KPiA+
ICsNCj4gPiArICAgICAgIHR4X2huZGwgPSBwcml2LT5kZXNjX2RhdGFbZGVzY19udW1dLnBuZXh0
X3R4X2huZGw7DQo+ID4gKw0KPiA+ICsgICAgICAgaWYgKCF0eF9obmRsLT5wZGVzYykNCj4gPiAr
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArICAgICAgIGlmICh0eF9o
bmRsLT5wZGVzYy0+c3RhdHVzICE9IEVBR0xFX1RYRF9TVEFUVVNfSURMRSkgew0KPiA+ICsgICAg
ICAgICAgICAgICAvKiBJbnRlcnJ1cHQgRi9XIGFueXdheSAqLw0KPiA+ICsgICAgICAgICAgICAg
ICBpZiAodHhfaG5kbC0+cGRlc2MtPnN0YXR1cyAmDQo+ID4gKyAgICAgICAgICAgICAgICAgICBj
cHVfdG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0ZXX09XTkVEKSkNCj4gPiArICAgICAgICAgICAg
ICAgICAgICAgICB3cml0ZWwoTUFDUkVHX0gyQVJJQ19CSVRfUFBBX1JFQURZLA0KPiA+ICsgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5pb2Jhc2UxICsNCj4gPiArDQo+IE1BQ1JF
R19SRUdfSDJBX0lOVEVSUlVQVF9FVkVOVFMpOw0KPiA+ICsgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7DQo+ID4gKyAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgcmV0dXJuIHRydWU7DQo+
ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xfdHhfc2tiKHN0cnVjdCBt
d2xfcHJpdiAqcHJpdiwgaW50IGRlc2NfbnVtLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0cnVjdCBza19idWZmICp0eF9za2IpIHsNCj4gPiArICAgICAgIHN0cnVjdCBpZWVl
ODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsNCj4gPiArICAgICAgIHN0cnVjdCBtd2xfdHhfY3RybCAq
dHhfY3RybDsNCj4gPiArICAgICAgIHN0cnVjdCBtd2xfdHhfaG5kbCAqdHhfaG5kbDsNCj4gPiAr
ICAgICAgIHN0cnVjdCBtd2xfdHhfZGVzYyAqdHhfZGVzYzsNCj4gPiArICAgICAgIHN0cnVjdCBp
ZWVlODAyMTFfc3RhICpzdGE7DQo+ID4gKyAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlm
Ow0KPiA+ICsgICAgICAgc3RydWN0IG13bF92aWYgKm13bF92aWY7DQo+ID4gKyAgICAgICBzdHJ1
Y3QgaWVlZTgwMjExX2tleV9jb25mICprX2NvbmY7DQo+ID4gKyAgICAgICBib29sIGNjbXAgPSBm
YWxzZTsNCj4gPiArICAgICAgIHN0cnVjdCBtd2xfZG1hX2RhdGEgKmRtYV9kYXRhOw0KPiA+ICsg
ICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKndoOw0KPiA+ICsgICAgICAgZG1hX2FkZHJfdCBk
bWE7DQo+ID4gKw0KPiA+ICsgICAgICAgaWYgKFdBUk5fT04oIXR4X3NrYikpDQo+ID4gKyAgICAg
ICAgICAgICAgIHJldHVybjsNCj4gPiArDQo+ID4gKyAgICAgICB0eF9pbmZvID0gSUVFRTgwMjEx
X1NLQl9DQih0eF9za2IpOw0KPiA+ICsgICAgICAgdHhfY3RybCA9IChzdHJ1Y3QgbXdsX3R4X2N0
cmwgKikmdHhfaW5mby0+c3RhdHVzOw0KPiA+ICsgICAgICAgc3RhID0gKHN0cnVjdCBpZWVlODAy
MTFfc3RhICopdHhfY3RybC0+c3RhOw0KPiA+ICsgICAgICAgdmlmID0gKHN0cnVjdCBpZWVlODAy
MTFfdmlmICopdHhfY3RybC0+dmlmOw0KPiA+ICsgICAgICAgbXdsX3ZpZiA9IG13bF9kZXZfZ2V0
X3ZpZih2aWYpOw0KPiA+ICsgICAgICAga19jb25mID0gKHN0cnVjdCBpZWVlODAyMTFfa2V5X2Nv
bmYgKil0eF9jdHJsLT5rX2NvbmY7DQo+ID4gKw0KPiA+ICsgICAgICAgbXdsX3R4X2VuY2Fwc3Vs
YXRlX2ZyYW1lKHByaXYsIHR4X3NrYiwga19jb25mLCAmY2NtcCk7DQo+ID4gKw0KPiA+ICsgICAg
ICAgZG1hX2RhdGEgPSAoc3RydWN0IG13bF9kbWFfZGF0YSAqKXR4X3NrYi0+ZGF0YTsNCj4gPiAr
ICAgICAgIHdoID0gJmRtYV9kYXRhLT53aDsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAoaWVlZTgw
MjExX2lzX2RhdGEod2gtPmZyYW1lX2NvbnRyb2wpKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGlm
IChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcih3aC0+YWRkcjEpKSB7DQo+ID4gKyAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGNjbXApIHsNCj4gPiArDQo+IG13bF90eF9pbnNlcnRfY2NtcF9oZHIo
ZG1hX2RhdGEtPmRhdGEsDQo+ID4gKw0KPiBtd2xfdmlmLT5rZXlpZHgsDQo+ID4gKw0KPiBtd2xf
dmlmLT5pdjE2LA0KPiA+ICsNCj4gbXdsX3ZpZi0+aXYzMik7DQo+ID4gKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBJTkNSRUFTRV9JVihtd2xfdmlmLT5pdjE2LA0KPiBtd2xfdmlmLT5p
djMyKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB9DQo+ID4gKyAgICAgICAgICAgICAg
IH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjbXApIHsNCj4gPiAr
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWYtPnR5cGUgPT0NCj4gTkw4MDIx
MV9JRlRZUEVfU1RBVElPTikgew0KPiA+ICsNCj4gbXdsX3R4X2luc2VydF9jY21wX2hkcihkbWFf
ZGF0YS0+ZGF0YSwNCj4gPiArDQo+IG13bF92aWYtPmtleWlkeCwNCj4gPiArDQo+IG13bF92aWYt
Pml2MTYsDQo+ID4gKw0KPiBtd2xfdmlmLT5pdjMyKTsNCj4gPiArDQo+IElOQ1JFQVNFX0lWKG13
bF92aWYtPml2MTYsDQo+ID4gKw0KPiBtd2xfdmlmLT5pdjMyKTsNCj4gPiArICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbzsNCj4gPiArDQo+ID4gKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YV9pbmZvID0NCj4gPiArIG13
bF9kZXZfZ2V0X3N0YShzdGEpOw0KPiA+ICsNCj4gPiArDQo+IG13bF90eF9pbnNlcnRfY2NtcF9o
ZHIoZG1hX2RhdGEtPmRhdGEsDQo+ID4gKw0KPiAwLA0KPiA+ICsNCj4gc3RhX2luZm8tPml2MTYs
DQo+ID4gKw0KPiBzdGFfaW5mby0+aXYzMik7DQo+ID4gKw0KPiBJTkNSRUFTRV9JVihzdGFfaW5m
by0+aXYxNiwNCj4gPiArDQo+IHN0YV9pbmZvLT5pdjMyKTsNCj4gPiArICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB9DQo+ID4gKyAg
ICAgICAgICAgICAgIH0NCj4gPiArICAgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICB0eF9obmRs
ID0gcHJpdi0+ZGVzY19kYXRhW2Rlc2NfbnVtXS5wbmV4dF90eF9obmRsOw0KPiA+ICsgICAgICAg
dHhfaG5kbC0+cHNrX2J1ZmYgPSB0eF9za2I7DQo+ID4gKyAgICAgICB0eF9kZXNjID0gdHhfaG5k
bC0+cGRlc2M7DQo+ID4gKyAgICAgICB0eF9kZXNjLT50eF9wcmlvcml0eSA9IHR4X2N0cmwtPnR4
X3ByaW9yaXR5Ow0KPiA+ICsgICAgICAgdHhfZGVzYy0+cW9zX2N0cmwgPSBjcHVfdG9fbGUxNih0
eF9jdHJsLT5xb3NfY3RybCk7DQo+ID4gKyAgICAgICB0eF9kZXNjLT5wa3RfbGVuID0gY3B1X3Rv
X2xlMTYodHhfc2tiLT5sZW4pOw0KPiA+ICsgICAgICAgdHhfZGVzYy0+cGFja2V0X2luZm8gPSAw
Ow0KPiA+ICsgICAgICAgdHhfZGVzYy0+ZGF0YV9yYXRlID0gMDsNCj4gPiArICAgICAgIHR4X2Rl
c2MtPnR5cGUgPSB0eF9jdHJsLT50eXBlOw0KPiA+ICsgICAgICAgdHhfZGVzYy0+eG1pdF9jb250
cm9sID0gdHhfY3RybC0+eG1pdF9jb250cm9sOw0KPiA+ICsgICAgICAgdHhfZGVzYy0+c2FwX3Br
dF9pbmZvID0gMDsNCj4gPiArICAgICAgIGRtYSA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYs
IHR4X3NrYi0+ZGF0YSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NrYi0+
bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsNCj4gPiArICAgICAgIGlmIChwY2lfZG1hX21hcHBpbmdf
ZXJyb3IocHJpdi0+cGRldiwgZG1hKSkgew0KPiA+ICsgICAgICAgICAgICAgICBkZXZfa2ZyZWVf
c2tiX2FueSh0eF9za2IpOw0KPiA+ICsgICAgICAgICAgICAgICB3aXBoeV9lcnIocHJpdi0+aHct
PndpcGh5LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBtYXAgcGNp
IG1lbW9yeSFcbiIpOw0KPiA+ICsgICAgICAgICAgICAgICByZXR1cm47DQo+ID4gKyAgICAgICB9
DQo+ID4gKyAgICAgICB0eF9kZXNjLT5wa3RfcHRyID0gY3B1X3RvX2xlMzIoZG1hKTsNCj4gPiAr
ICAgICAgIHR4X2Rlc2MtPnN0YXR1cyA9IGNwdV90b19sZTMyKEVBR0xFX1RYRF9TVEFUVVNfRldf
T1dORUQpOw0KPiA+ICsgICAgICAgLyogbWFrZSBzdXJlIGFsbCB0aGUgbWVtb3J5IHRyYW5zYWN0
aW9ucyBkb25lIGJ5IGNwdSB3ZXJlDQo+IGNvbXBsZXRlZCAqLw0KPiA+ICsgICAgICAgd21iKCk7
ICAvKkRhdGEgTWVtb3J5IEJhcnJpZXIqLw0KPiA+ICsgICAgICAgd3JpdGVsKE1BQ1JFR19IMkFS
SUNfQklUX1BQQV9SRUFEWSwNCj4gPiArICAgICAgICAgICAgICBwcml2LT5pb2Jhc2UxICsNCj4g
TUFDUkVHX1JFR19IMkFfSU5URVJSVVBUX0VWRU5UUyk7DQo+ID4gKyAgICAgICBwcml2LT5kZXNj
X2RhdGFbZGVzY19udW1dLnBuZXh0X3R4X2huZGwgPSB0eF9obmRsLT5wbmV4dDsNCj4gPiArICAg
ICAgIHByaXYtPmZ3X2Rlc2NfY250W2Rlc2NfbnVtXSsrOyB9DQo+ID4gKw0KPiA+ICtzdGF0aWMg
aW5saW5lIHN0cnVjdCBza19idWZmICptd2xfdHhfZG9fYW1zZHUoc3RydWN0IG13bF9wcml2ICpw
cml2LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
bnQgZGVzY19udW0sDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0cnVjdCBza19idWZmDQo+ICp0eF9za2IsDQo+ID4gKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdA0KPiBpZWVlODAyMTFfdHhfaW5mbw0K
PiA+ICsqdHhfaW5mbykgew0KPiA+ICsgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsN
Cj4gPiArICAgICAgIHN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbzsNCj4gPiArICAgICAgIHN0cnVj
dCBtd2xfdHhfY3RybCAqdHhfY3RybCA9IChzdHJ1Y3QgbXdsX3R4X2N0cmwNCj4gKikmdHhfaW5m
by0+c3RhdHVzOw0KPiA+ICsgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICphbXNkdV9p
bmZvOw0KPiA+ICsgICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqYW1zZHVfcGt0czsNCj4gPiAr
ICAgICAgIHN0cnVjdCBtd2xfYW1zZHVfZnJhZyAqYW1zZHU7DQo+ID4gKyAgICAgICBpbnQgYW1z
ZHVfYWxsb3dfc2l6ZTsNCj4gPiArICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICp3aDsNCj4g
PiArICAgICAgIGludCB3aF9sZW47DQo+ID4gKyAgICAgICB1MTYgbGVuOw0KPiA+ICsgICAgICAg
dTggKmRhdGE7DQo+ID4gKw0KPiA+ICsgICAgICAgc3RhID0gKHN0cnVjdCBpZWVlODAyMTFfc3Rh
ICopdHhfY3RybC0+c3RhOw0KPiA+ICsgICAgICAgc3RhX2luZm8gPSBtd2xfZGV2X2dldF9zdGEo
c3RhKTsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAoIXN0YV9pbmZvLT5pc19hbXNkdV9hbGxvd2Vk
KQ0KPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gdHhfc2tiOw0KPiA+ICsNCj4gPiArICAgICAg
IHdoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopdHhfc2tiLT5kYXRhOw0KPiA+ICsgICAgICAg
aWYgKHN0YV9pbmZvLT5pc19tZXNoX25vZGUgJiYNCj4gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIo
d2gtPmFkZHIzKSkNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIHR4X3NrYjsNCj4gPiArDQo+
ID4gKyAgICAgICBpZiAoc3RhX2luZm8tPmFtc2R1X2N0cmwuY2FwID09IE1XTF9BTVNEVV9TSVpF
XzRLKQ0KPiA+ICsgICAgICAgICAgICAgICBhbXNkdV9hbGxvd19zaXplID0gU1lTQURQVF9BTVNE
VV80S19NQVhfU0laRTsNCj4gPiArICAgICAgIGVsc2UgaWYgKHN0YV9pbmZvLT5hbXNkdV9jdHJs
LmNhcCA9PSBNV0xfQU1TRFVfU0laRV84SykNCj4gPiArICAgICAgICAgICAgICAgYW1zZHVfYWxs
b3dfc2l6ZSA9IFNZU0FEUFRfQU1TRFVfOEtfTUFYX1NJWkU7DQo+ID4gKyAgICAgICBlbHNlDQo+
ID4gKyAgICAgICAgICAgICAgIHJldHVybiB0eF9za2I7DQo+ID4gKw0KPiA+ICsgICAgICAgc3Bp
bl9sb2NrX2JoKCZzdGFfaW5mby0+YW1zZHVfbG9jayk7DQo+ID4gKyAgICAgICBhbXNkdSA9ICZz
dGFfaW5mby0+YW1zZHVfY3RybC5mcmFnW2Rlc2NfbnVtXTsNCj4gPiArDQo+ID4gKyAgICAgICBp
ZiAodHhfc2tiLT5sZW4gPiBTWVNBRFBUX0FNU0RVX0FMTE9XX1NJWkUpIHsNCj4gPiArICAgICAg
ICAgICAgICAgaWYgKGFtc2R1LT5udW0pIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBt
d2xfdHhfc2tiKHByaXYsIGRlc2NfbnVtLCBhbXNkdS0+c2tiKTsNCj4gPiArICAgICAgICAgICAg
ICAgICAgICAgICBhbXNkdS0+bnVtID0gMDsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBh
bXNkdS0+Y3VyX3BvcyA9IE5VTEw7DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg
IGlmICghbXdsX3R4X2F2YWlsYWJsZShwcml2LCBkZXNjX251bSkpIHsNCj4gPiArDQo+IHNrYl9x
dWV1ZV9oZWFkKCZwcml2LT50eHFbZGVzY19udW1dLCB0eF9za2IpOw0KPiA+ICsNCj4gc3Bpbl91
bmxvY2tfYmgoJnN0YV9pbmZvLT5hbXNkdV9sb2NrKTsNCj4gPiArICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIH0N
Cj4gPiArICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAgICAgICAgICBzcGluX3VubG9ja19i
aCgmc3RhX2luZm8tPmFtc2R1X2xvY2spOw0KPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gdHhf
c2tiOw0KPiA+ICsgICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgIC8qIHBvdGVudGlhbCBhbXNk
dSBzaXplLCBzaG91bGQgYWRkIGFtc2R1IGhlYWRlciAxNCBieXRlcyArDQo+ID4gKyAgICAgICAg
KiBtYXhpbXVtIHBhZGRpbmcgMy4NCj4gPiArICAgICAgICAqLw0KPiA+ICsgICAgICAgd2hfbGVu
ID0gaWVlZTgwMjExX2hkcmxlbih3aC0+ZnJhbWVfY29udHJvbCk7DQo+ID4gKyAgICAgICBsZW4g
PSB0eF9za2ItPmxlbiAtIHdoX2xlbiArIDE3Ow0KPiA+ICsNCj4gPiArICAgICAgIGlmIChhbXNk
dS0+bnVtKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGlmICgoYW1zZHUtPnNrYi0+bGVuICsgbGVu
KSA+IGFtc2R1X2FsbG93X3NpemUpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBtd2xf
dHhfc2tiKHByaXYsIGRlc2NfbnVtLCBhbXNkdS0+c2tiKTsNCj4gPiArICAgICAgICAgICAgICAg
ICAgICAgICBhbXNkdS0+bnVtID0gMDsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBhbXNk
dS0+Y3VyX3BvcyA9IE5VTEw7DQo+ID4gKyAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgIH0N
Cj4gPiArDQo+ID4gKyAgICAgICBhbXNkdS0+amlmZmllcyA9IGppZmZpZXM7DQo+ID4gKyAgICAg
ICBsZW4gPSB0eF9za2ItPmxlbiAtIHdoX2xlbjsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAoYW1z
ZHUtPm51bSA9PSAwKSB7DQo+ID4gKyAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpuZXdz
a2I7DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBhbXNkdV9wa3RzID0gKHN0cnVjdCBza19i
dWZmX2hlYWQgKikNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBrbWFsbG9jKHNpemVvZigq
YW1zZHVfcGt0cyksIEdGUF9LRVJORUwpOw0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIWFtc2R1
X3BrdHMpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19iaCgmc3Rh
X2luZm8tPmFtc2R1X2xvY2spOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0
eF9za2I7DQo+ID4gKyAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICAgICAgbmV3c2ti
ID0gZGV2X2FsbG9jX3NrYihhbXNkdV9hbGxvd19zaXplICsNCj4gPiArDQo+IFNZU0FEUFRfTUlO
X0JZVEVTX0hFQURST09NKTsNCj4gPiArICAgICAgICAgICAgICAgaWYgKCFuZXdza2IpIHsNCj4g
PiArICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19iaCgmc3RhX2luZm8tPmFtc2R1
X2xvY2spOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGFtc2R1X3BrdHMpOw0K
PiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eF9za2I7DQo+ID4gKyAgICAgICAg
ICAgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgIGRhdGEgPSBuZXdza2ItPmRhdGE7
DQo+ID4gKyAgICAgICAgICAgICAgIG1lbWNweShkYXRhLCB0eF9za2ItPmRhdGEsIHdoX2xlbik7
DQo+ID4gKyAgICAgICAgICAgICAgIGlmIChzdGFfaW5mby0+aXNfbWVzaF9ub2RlKSB7DQo+ID4g
KyAgICAgICAgICAgICAgICAgICAgICAgZXRoZXJfYWRkcl9jb3B5KGRhdGEgKyB3aF9sZW4sIHdo
LT5hZGRyMyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZXRoZXJfYWRkcl9jb3B5KGRh
dGEgKyB3aF9sZW4gKyBFVEhfQUxFTiwNCj4gd2gtPmFkZHI0KTsNCj4gPiArICAgICAgICAgICAg
ICAgfSBlbHNlIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBldGhlcl9hZGRyX2NvcHko
ZGF0YSArIHdoX2xlbiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWVlZTgwMjExX2dldF9EQSh3aCkpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGV0
aGVyX2FkZHJfY29weShkYXRhICsgd2hfbGVuICsgRVRIX0FMRU4sDQo+ID4gKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWU4MDIxMV9nZXRfU0Eod2gpKTsNCj4gPiAr
ICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAgICAgICAgICAqKHU4ICopKGRhdGEgKyB3aF9s
ZW4gKyBFVEhfSExFTiAtIDEpID0gbGVuICYgMHhmZjsNCj4gPiArICAgICAgICAgICAgICAgKih1
OCAqKShkYXRhICsgd2hfbGVuICsgRVRIX0hMRU4gLSAyKSA9IChsZW4gPj4gOCkgJg0KPiA+ICsg
MHhmZjsNCj4gDQo+IFRoZXNlIGJpdCBvZXByYXRpb25zIGFyZSBub3QgbmVlZGVkLiBUaGUgcG9p
bnRlciBtdXN0IGJlIFdPUkQgYWxpZ25lZCwNCj4gcmlnaHQ/DQo+IFRoaXMgaXMgd2h5IHlvdSBo
YXZlIHBhZGRpbmcgYWZ0ZXIgYWxsLCB1bmxlc3MgeW91IGhhdmUgc29tZSB3ZWlyZCBETUENCj4g
Z2FtZXM/DQo+IFlvdSBzZWVtIHRvIGJlIGFzc3VtaW5nIHRoaXMgYWxpZ25tZW50IGFueXdheSBi
ZWNhdXNlIHlvdSB1c2UNCj4gZXRoZXJfYWRkcl9jb3B5IGFib3ZlLg0KPiANCj4gPiArDQo+ID4g
KyAgICAgICAvKiBRdWV1ZSBBRERCQSByZXF1ZXN0IGluIHRoZSByZXNwZWN0aXZlIGRhdGEgcXVl
dWUuICBXaGlsZQ0KPiBzZXR0aW5nIHVwDQo+ID4gKyAgICAgICAgKiB0aGUgYW1wZHUgc3RyZWFt
LCBtYWM4MDIxMSBxdWV1ZXMgZnVydGhlciBwYWNrZXRzIGZvciB0aGF0DQo+ID4gKyAgICAgICAg
KiBwYXJ0aWN1bGFyIHJhL3RpZCBwYWlyLiAgSG93ZXZlciwgcGFja2V0cyBwaWxlZCB1cCBpbiB0
aGUNCj4gaGFyZHdhcmUNCj4gPiArICAgICAgICAqIGZvciB0aGF0IHJhL3RpZCBwYWlyIHdpbGwg
c3RpbGwgZ28gb3V0LiBBRERCQSByZXF1ZXN0IGFuZCB0aGUNCj4gPiArICAgICAgICAqIHJlbGF0
ZWQgZGF0YSBwYWNrZXRzIGdvaW5nIG91dCBmcm9tIGRpZmZlcmVudCBxdWV1ZXMNCj4gYXN5bmNo
cm9ub3VzbHkNCj4gPiArICAgICAgICAqIHdpbGwgY2F1c2UgYSBzaGlmdCBpbiB0aGUgcmVjZWl2
ZXIgd2luZG93IHdoaWNoIG1pZ2h0IHJlc3VsdCBpbg0KPiA+ICsgICAgICAgICogYW1wZHUgcGFj
a2V0cyBnZXR0aW5nIGRyb3BwZWQgYXQgdGhlIHJlY2VpdmVyIGFmdGVyIHRoZSBzdHJlYW0NCj4g
aGFzDQo+ID4gKyAgICAgICAgKiBiZWVuIHNldHVwLg0KPiA+ICsgICAgICAgICovDQo+IA0KPiBI
ZXJlIGlzIHRoZSByYWNlIHlvdSBhcmUgZmFjaW5nIGFuZCB0aGF0IHJhY2UgY2FuIGJlIGF2b2lk
ZWQgYnkgdGhlIHByb3Blcg0KPiB1c2FnZSBvZiB0aGUgX2NiDQo+IA0KPiA+ICsgICAgICAgaWYg
KG1nbXRmcmFtZSkgew0KPiA+ICsgICAgICAgICAgICAgICB1MTYgY2FwYWI7DQo+ID4gKw0KPiA+
ICsgICAgICAgICAgICAgICBpZiAodW5saWtlbHkoaWVlZTgwMjExX2lzX2FjdGlvbih3aC0+ZnJh
bWVfY29udHJvbCkgJiYNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nbXQtPnUu
YWN0aW9uLmNhdGVnb3J5ID09DQo+IFdMQU5fQ0FURUdPUllfQkFDSyAmJg0KPiA+ICsNCj4gbWdt
dC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuYWN0aW9uX2NvZGUgPT0NCj4gPiArICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIFdMQU5fQUNUSU9OX0FEREJBX1JFUSkpIHsNCj4gPiArICAgICAgICAg
ICAgICAgICAgICAgICBjYXBhYiA9DQo+IGxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuYWRk
YmFfcmVxLmNhcGFiKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB0aWQgPSAoY2FwYWIg
Jg0KPiBJRUVFODAyMTFfQUREQkFfUEFSQU1fVElEX01BU0spID4+IDI7DQo+ID4gKyAgICAgICAg
ICAgICAgICAgICAgICAgaW5kZXggPSBtd2xfdHhfdGlkX3F1ZXVlX21hcHBpbmcodGlkKTsNCj4g
PiArICAgICAgICAgICAgICAgICAgICAgICBjYXBhYiB8PSAxOw0KPiA+ICsgICAgICAgICAgICAg
ICAgICAgICAgIG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLmNhcGFiID0NCj4gY3B1X3RvX2xl
MTYoY2FwYWIpOw0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAg
ICAgICBpZiAodW5saWtlbHkoaWVlZTgwMjExX2lzX2FjdGlvbih3aC0+ZnJhbWVfY29udHJvbCkg
JiYNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nbXQtPnUuYWN0aW9uLmNhdGVn
b3J5ID09DQo+IFdMQU5fQ0FURUdPUllfQkFDSyAmJg0KPiA+ICsNCj4gbWdtdC0+dS5hY3Rpb24u
dS5hZGRiYV9yZXNwLmFjdGlvbl9jb2RlID09DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBXTEFOX0FDVElPTl9BRERCQV9SRVNQKSkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAg
ICAgIGNhcGFiID0NCj4gbGUxNl90b19jcHUobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmNh
cGFiKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBjYXBhYiB8PSAxOw0KPiA+ICsgICAg
ICAgICAgICAgICAgICAgICAgIG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5jYXBhYiA9DQo+
IGNwdV90b19sZTE2KGNhcGFiKTsNCj4gPiArICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAg
fQ0KPiA+ICsNCj4gPiArICAgICAgIGluZGV4ID0gU1lTQURQVF9UWF9XTU1fUVVFVUVTIC0gaW5k
ZXggLSAxOw0KPiA+ICsgICAgICAgdHhwcmlvcml0eSA9IGluZGV4Ow0KPiA+ICsNCj4gPiArICAg
ICAgIGlmIChzdGEgJiYgc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkICYmICFlYXBvbF9mcmFtZSAm
Jg0KPiA+ICsgICAgICAgICAgIGllZWU4MDIxMV9pc19kYXRhX3Fvcyh3aC0+ZnJhbWVfY29udHJv
bCkpIHsNCj4gPiArICAgICAgICAgICAgICAgdGlkID0gcW9zICYgMHhmOw0KPiA+ICsgICAgICAg
ICAgICAgICBtd2xfdHhfY291bnRfcGFja2V0KHN0YSwgdGlkKTsNCj4gPiArDQo+ID4gKyAgICAg
ICAgICAgICAgIHNwaW5fbG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KPiA+ICsgICAgICAg
ICAgICAgICBzdHJlYW0gPSBtd2xfZndjbWRfbG9va3VwX3N0cmVhbShodywgc3RhLT5hZGRyLCB0
aWQpOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgaWYgKHN0cmVhbSkgew0KPiA+ICsgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0tPnN0YXRlID09IEFNUERVX1NUUkVBTV9BQ1RJ
VkUpDQo+IHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXQVJOX09O
KCEocW9zICYNCj4gPiArDQo+IE1XTF9RT1NfQUNLX1BPTElDWV9CTE9DS0FDSykpKSB7DQo+ID4g
Kw0KPiBzcGluX3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KPiA+ICsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOw0KPiA+
ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQo+ID4gKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHhwcmlvcml0eSA9DQo+ID4gKw0KPiAoU1lTQURQVF9UWF9XTU1f
UVVFVUVTICsgc3RyZWFtLT5pZHgpICUNCj4gPiArDQo+IFNZU0FEUFRfVE9UQUxfSFdfUVVFVUVT
Ow0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5zdGF0ZSA9
PQ0KPiBBTVBEVV9TVFJFQU1fTkVXKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvKiBXZSBnZXQgaGVyZSBpZiB0aGUgZHJpdmVyIHNlbmRzIHVzDQo+IHBhY2tldHMNCj4g
PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFmdGVyIHdlJ3ZlIGluaXRpYXRl
ZCBhIHN0cmVhbSwgYnV0DQo+IGJlZm9yZQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICogb3VyIGFtcGR1X2FjdGlvbiByb3V0aW5lIGhhcw0KPiBiZWVuIGNhbGxlZA0KPiA+
ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aA0KPiBJRUVFODAyMTFfQU1Q
RFVfVFhfU1RBUlQgdG8gZ2V0IHRoZSBTU04NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAqIGZvciB0aGUgQUREQkEgcmVxdWVzdC4gIFNvIHRoaXMNCj4gcGFja2V0IGNhbg0K
PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZ28gb3V0IHdpdGggbm8gcmlz
ayBvZiBzZXF1ZW5jZQ0KPiBudW1iZXINCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAqIG1pc21hdGNoLiAgTm8gc3BlY2lhbCBoYW5kbGluZyBpcw0KPiByZXF1aXJlZC4NCj4g
PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KPiA+ICsgICAgICAgICAgICAg
ICAgICAgICAgIH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv
KiBEcm9wIHBhY2tldHMgdGhhdCB3b3VsZCBnbyBvdXQNCj4gYWZ0ZXIgdGhlDQo+ID4gKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBRERCQSByZXF1ZXN0IHdhcyBzZW50IGJ1dA0K
PiBiZWZvcmUgdGhlIEFEREJBDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KiByZXNwb25zZSBpcyByZWNlaXZlZC4gIElmIHdlIGRvbid0DQo+IGRvIHRoaXMsDQo+ID4gKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcmVjaXBpZW50IHdvdWxkIHByb2Jh
Ymx5DQo+IHJlY2VpdmUgaXQNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq
IGFmdGVyIHRoZSBBRERCQSByZXF1ZXN0IHdpdGggU1NODQo+IDAuICBUaGlzDQo+ID4gKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aWxsIGNhdXNlIHRoZSByZWNpcGllbnQncyBC
QQ0KPiByZWNlaXZlIHdpbmRvdw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICogdG8gc2hpZnQsIHdoaWNoIHdvdWxkIGNhdXNlIHRoZQ0KPiBzdWJzZXF1ZW50DQo+ID4gKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYWNrZXRzIGluIHRoZSBCQSBzdHJlYW0g
dG8gYmUNCj4gZGlzY2FyZGVkLg0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICogbWFjODAyMTEgcXVldWVzIG91ciBwYWNrZXRzIGZvcg0KPiB1cyBpbiB0aGlzDQo+ID4gKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXNlLCBzbyB0aGlzIGlzIHJlYWxseSBq
dXN0IGEgc2FmZXR5DQo+IGNoZWNrLg0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICovDQo+IA0KPiBXZWxsLi4uIEkgdGhpbmsgeW91IGNhbiByZWFsbHkgYXZvaWQgdGhhdC4N
Cg0KQU1QRFUgcmVsYXRlZCBjb2RlIHdpbGwgYmUgY2hlY2tlZCBiYXNlZCBvbiB5b3VyIHN1Z2dl
c3Rpb25zIGxhdGVyLg0K

2015-12-15 07:54:44

by David Lin

[permalink] [raw]
Subject: RE: [PATCH v7] Add new mac80211 driver mwlwifi.

> Kalle Valo [mailto:[email protected]] wrote:
>
> David Lin <[email protected]> writes:
>
> > On November 26, 2015 5:40 PM, Johannes Berg wrote:
> >> On Thu, 2015-11-26 at 08:27 +0000, David Lin wrote:
> >>
> >> > > > +#ifdef CONFIG_SUPPORT_MFG
> >> > >
> >> > > This Kconfig variable doesn't exist.
> >> > >
> >> >
> >> > The compile variable is used privately by Marvell and our customers
> >> > in production line.
> >>
> >> Yeah, still. Make it a proper Kconfig variable, defaulting to off and
> >> hidden under something, or remove it. It's extremely misleading to
> >> have something called CONFIG_* when it's not a Kconfig variable.
> >>
> >
> > I will change this compile variable from "CONFIG_SUPPORT_MFG" to
> > "SUPPORT_MFG".
>
> Then it's still dead code which won't ever get compiled in upstream.
> Please follow what Johannes suggested.
>

The code will be removed.

> --
> Kalle Valo

2015-12-14 21:35:08

by Kan Yan

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

David Lin <dlin@...> writes:

> +static inline struct sk_buff *mwl_tx_do_amsdu(struct mwl_priv *priv,
> + int desc_num,
> ...
> + amsdu_pkts = (struct sk_buff_head *)
> + kmalloc(sizeof(*amsdu_pkts), GFP_KERNEL);
> + if (!amsdu_pkts) {

Should GFP_ATOMIC be used here instead of GFP_KERNEL? This function could be
called in interrupt context.


2015-12-14 11:48:04

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

Grant Grundler <[email protected]> writes:

> Sorry for the late response...just one point below
>
> On Fri, Nov 20, 2015 at 3:22 AM, Johannes Berg <[email protected]>
> wrote:
>
> > +#define MWL_DRV_NAME     KBUILD_MODNAME
> > +#define MWL_DRV_VERSION       "10.3.0.14"
>
> versions like that are generally fairly useless since you don't update
> them for every commit ...
>
>
> When backporting to other kernel trees, it's extremely handy to have a
> DRV_VERSION.
>
> Checking if a particular kernel build has the expected driver version trivial.
>  "mod_info" dumps the driver version for modules (which this will usually be
> too).
>
> And yes, it won't get updated for every commit only because other version
> control might encapsulate those changes. Not every distro makes their build
> versioning accessible to outsiders. So it's still helpful even if not perfect.
>
> Marvell can update this every time they resync with their own internal
> versions.

But the problem is that you cannot really trust this driver version
string. I found a perfect example from another Marvell driver:

5e6e3a92b9a4c drivers/net/wireless/mwifiex/main.c (Bing Zhao 2011-03-21 18:00:50 -0700 25) #define VERSION "1.0"

So nobody has updated that version string since the initial commit from
2011 and that driver has had over 900 non-merge commits after that.
Because of bad cases like this I think having a driver specific versions
in in-tree drivers are just noise and unnecessary extra work. When
porting a driver to another tree git commit ids, release tag names or
git-describe output are much better ways to identify the driver version.

--
Kalle Valo

2015-12-12 00:47:18

by Grant Grundler

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

[resending as plain text....gmail...grrrh.]

On Fri, Dec 11, 2015 at 4:46 PM, Grant Grundler <[email protected]> wrote:
> Sorry for the late response...just one point below
>
> On Fri, Nov 20, 2015 at 3:22 AM, Johannes Berg <[email protected]>
> wrote:
>>
>> > +#define MWL_DRV_NAME KBUILD_MODNAME
>> > +#define MWL_DRV_VERSION "10.3.0.14"
>>
>> versions like that are generally fairly useless since you don't update
>> them for every commit ...
>
>
> When backporting to other kernel trees, it's extremely handy to have a
> DRV_VERSION.
>
> Checking if a particular kernel build has the expected driver version
> trivial. "mod_info" dumps the driver version for modules (which this will
> usually be too).
>
> And yes, it won't get updated for every commit only because other version
> control might encapsulate those changes. Not every distro makes their build
> versioning accessible to outsiders. So it's still helpful even if not
> perfect.
>
> Marvell can update this every time they resync with their own internal
> versions.
>
> cheers,
> grant

2015-12-10 14:58:06

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

David Lin <[email protected]> writes:

> On November 26, 2015 5:40 PM, Johannes Berg wrote:
>> On Thu, 2015-11-26 at 08:27 +0000, David Lin wrote:
>>
>> > > > +#ifdef CONFIG_SUPPORT_MFG
>> > >
>> > > This Kconfig variable doesn't exist.
>> > >
>> >
>> > The compile variable is used privately by Marvell and our customers in
>> > production line.
>>
>> Yeah, still. Make it a proper Kconfig variable, defaulting to off and hidden
>> under something, or remove it. It's extremely misleading to have something
>> called CONFIG_* when it's not a Kconfig variable.
>>
>
> I will change this compile variable from "CONFIG_SUPPORT_MFG" to
> "SUPPORT_MFG".

Then it's still dead code which won't ever get compiled in upstream.
Please follow what Johannes suggested.

--
Kalle Valo

2016-03-17 01:23:53

by David Lin

[permalink] [raw]
Subject: RE: [PATCH v7] Add new mac80211 driver mwlwifi.

PiBGcm9tOiBKdWxpYW4gQ2FsYWJ5IFttYWlsdG86anVsaWFuLmNhbGFieUBnbWFpbC5jb21dIFRo
dXJzZGF5LCBNYXJjaCAxNywgMjAxNiA3OjI0IEFNDQo+IA0KPiBIaSBEYXZpZCwNCj4gDQo+IE9u
IFRodSwgTm92IDEyLCAyMDE1IGF0IDI6NTEgUE0sIERhdmlkIExpbiA8ZGxpbkBtYXJ2ZWxsLmNv
bT4gd3JvdGU6DQo+ID4gVGhpcyBwYXRjaCBwcm92aWRlcyB0aGUgbXdsd2lmaSBkcml2ZXIgZm9y
IE1hcnZlbGwgODg2MywgODg2NCBhbmQgODg5Nw0KPiA+IGNoaXBzZXRzLg0KPiA+IFRoaXMgZHJp
dmVyIHdhcyBkZXZlbG9wZWQgYXMgcGFydCBvZiB0aGUgb3BlbndydC5vcmcgcHJvamVjdCB0bw0K
PiA+IHN1cHBvcnQgTGlua3N5cyBXUlQxOTAwQUMgYW5kIGlzIG1haW50YWluZWQgb24NCj4gaHR0
cHM6Ly9naXRodWIuY29tL2thbG96L213bHdpZmkuDQo+ID4NCj4gPiBUaGUgbXdsd2lmaSBkcml2
ZXIgZGlmZmVycyBmcm9tIGV4aXN0aW5nIG13aWZpZXggZHJpdmVyOg0KPiA+IG8gbXdsd2lmaSBp
cyBhICJzb2Z0bWFjIGRyaXZlciIgdXNpbmcgdGhlIGtlcm5lbD/uqIMgbWFjODAyLjExIHN1YnN5
c3RlbQ0KPiA+IHRvIHByb3ZpZGUgZnVsbCBBUC9XaXJlbGVzcyBCcmlkZ2UgZnVuY3Rpb25hbGl0
eSAocm91dGVycykuDQo+ID4gbyBtd2lmaWV4IGlzIGEgImZ1bGxtYWMgZHJpdmVyIiB3aGljaCBw
cm92aWRlcyBhIGNvbXByZWhlbnNpdmUgc2V0IG9mDQo+ID4gY2xpZW50IGZ1bmN0aW9ucyAobGFw
dG9wcy9lbWJlZGRlZCBkZXZpY2VzKSBvIG9ubHkgbXdsd2lmaSBzdXBwb3J0cw0KPiA+IE1hcnZl
bGwgQVAgY2hpcCA4ODZYIHNlcmllcw0KPiA+DQo+ID4gTk9URTogVXNlcnMgd2l0aCBNYXJ2ZWxs
IDg4Vzg4OTcgY2hpcHNldHMgY3VycmVudGx5IHNob3VsZCBlbmFibGUNCj4gPiAoQ09ORklHPVkg
b3IgTSkgZWl0aGVyIENPTkZJR19NV0lGSUVYIG9yIENPTkZJR19NV0xXSUZJLCBOT1QNCj4gQk9U
SC4NCj4gPg0KPiA+IG13bHdpZmkgZHJpdmVyIGxldmVyYWdlZCBjb2RlIGZyb20gZXhpc3Rpbmcg
TVdMOEsgZHJpdmVyIGluIHRoZQ0KPiA+IGZvbGxvd2luZyBhcmVhczoNCj4gPiAtIDgwMi4xMW4g
c2V0dGluZyBmb3IgbWFjODAyMTENCj4gPiAtIEZ1bmN0aW9ucyBuZWVkZWQgdG8gaG9vayB1cCB0
byBtYWM4MDIxMQ0KPiA+IC0gSW50ZXJhY3Rpb25zIHdpdGggbWFjODAyMTEgdG8gZXN0YWJsaXNo
IEJBIHN0cmVhbXMNCj4gPiAtIFBhcnRpYWwgZmlybXdhcmUgQVBJcywgc29tZSBkYXRhIGZpZWxk
cw0KPiA+IC0gTWV0aG9kIHRvIHBhc3MgUnggcGFja2V0cyB0byBtYWM4MDIxMSBleGNlcHQgMTFh
YyByYXRlcw0KPiA+DQo+ID4gSW4gYWRkaXRpb24sIG13bHdpZmkgZHJpdmVyIHN1cHBvcnRzOg0K
PiA+IC0gZnV0dXJlIHNjYWxhYmlsaXR5IGFuZCBmdXR1cmUgZGV2ZWxvcG1lbnQgKHJlZmFjdG9y
ZWQgc291cmNlIGNvZGUpDQo+ID4gLSBNYXJ2ZWxsIDgwMi4xMWFjIGNoaXBzZXRzLCBpbmNsdWRp
bmcgY29tYm8gQlQgZGV2aWNlcw0KPiA+IC0gODAyLjExYWMgcmVsYXRlZCBzZXR0aW5ncyBhbmQg
ZnVuY3Rpb25zDQo+ID4gLSBjb25jdXJyZW50IEFQK1NUQSBmdW5jdGlvbmFsaXRpZXMgd2l0aCBz
aW5nbGUgZmlybXdhcmUgcGVyIGNoaXANCj4gPiAtIGZpcm13YXJlIEFQSXMgZm9yIHRoZSBzdXBw
b3J0ZWQgY2hpcHNldA0KPiA+IC0gY29tbXVuaWNhdGluZyBuZXcgbWFjODAyMTEgc2V0dGluZ3Mg
dG8gZmlybXdhcmUNCj4gPiAtIERpZmZlcmVudCBUWC9SWCBkYXRhcGF0aCB3aGVyZSBhcHBsaWNh
YmxlDQo+ID4gLSBBLU1TRFUgYW5kIEEtTVBEVQ0KPiA+IC0gbWFjODAyMTEtYmFzZWQgTUVTSCAo
d29yayBpbiBwcm9ncmVzcykNCj4gPiAtIFJlZmluZWQgdGhlIGNvZGUgdG8gZXN0YWJsaXNoIEJB
IHN0cmVhbXMNCj4gPg0KPiA+IE5PVEU6IE1XTFdJRkkgd2lsbCBiZSBvcmdhbml6ZWQgdW5kZXIg
bmV3IHZlbmRvciBzcGVjaWZpYw0KPiA+IGZvbGRlci9tYXJ2ZWxsLCBhcyBwZXIgcmVxdWVzdCBv
ZiB0aGUgZ2F0ZSBrZWVwZXIgYW5kIGNvbW11bml0eS4NCj4gPg0KPiA+IFNpZ25lZC1vZmYtYnk6
IERhdmlkIExpbiA8ZGxpbkBtYXJ2ZWxsLmNvbT4NCj4gDQo+IEl0J3MgYmVlbiBxdWl0ZSBhIHdo
aWxlIHNpbmNlIHRoaXMgd2FzIHJldmlld2VkLiBEbyB5b3UgaGF2ZSBhIG5ldyB2ZXJzaW9uIG9m
DQo+IHRoZSBkcml2ZXI/DQo+IA0KDQpZZXMgd2UgaGF2ZSBzb21lIHVwZGF0ZXMsIGFuZCBjb250
aW51ZSB3b3JraW5nIG9uIGl0LiBCdXQgd2UgZmVsdCB0aGF0IGNvbW11bml0eSBkb2VzIG5vdCBz
ZWVtIHRvIGJlIHZlcnkgaW50ZXJlc3RlZCBpbiB0aGlzIGRyaXZlciwgc28gd2UgaGF2ZSBub3Qg
YmVlbiB1cGRhdGluZyB0aGUgd2lyZWxlc3Mgb3JnLiBMZXQgdXMga25vdyBpZiB5b3UgYXJlIHN1
cHBvcnRpdmUgYW5kIHdhaXRpbmcgZm9yIGl0Lg0KDQpUaGFua3MsDQpEYXZpZA0KDQo+DQo+IFRo
YW5rcywNCj4NCj4gLS0NCj4gSnVsaWFuIENhbGFieQ0KPiANCj4gRW1haWw6IGp1bGlhbi5jYWxh
YnlAZ21haWwuY29tDQo+IFByb2ZpbGU6IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9wcm9maWxlcy9q
dWxpYW4uY2FsYWJ5Lw0K

2016-03-17 01:32:32

by Julian Calaby

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

Hi David,

On Thu, Mar 17, 2016 at 12:23 PM, David Lin <[email protected]> wrote:
>> From: Julian Calaby [mailto:[email protected]] Thursday, March 17, 2016 7:24 AM
>>
>> Hi David,
>>
>> On Thu, Nov 12, 2015 at 2:51 PM, David Lin <[email protected]> wrote:
>> > This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897
>> > chipsets.
>> > This driver was developed as part of the openwrt.org project to
>> > support Linksys WRT1900AC and is maintained on
>> https://github.com/kaloz/mwlwifi.
>> >
>> > The mwlwifi driver differs from existing mwifiex driver:
>> > o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem
>> > to provide full AP/Wireless Bridge functionality (routers).
>> > o mwifiex is a "fullmac driver" which provides a comprehensive set of
>> > client functions (laptops/embedded devices) o only mwlwifi supports
>> > Marvell AP chip 886X series
>> >
>> > NOTE: Users with Marvell 88W8897 chipsets currently should enable
>> > (CONFIG=Y or M) either CONFIG_MWIFIEX or CONFIG_MWLWIFI, NOT
>> BOTH.
>> >
>> > mwlwifi driver leveraged code from existing MWL8K driver in the
>> > following areas:
>> > - 802.11n setting for mac80211
>> > - Functions needed to hook up to mac80211
>> > - Interactions with mac80211 to establish BA streams
>> > - Partial firmware APIs, some data fields
>> > - Method to pass Rx packets to mac80211 except 11ac rates
>> >
>> > In addition, mwlwifi driver supports:
>> > - future scalability and future development (refactored source code)
>> > - Marvell 802.11ac chipsets, including combo BT devices
>> > - 802.11ac related settings and functions
>> > - concurrent AP+STA functionalities with single firmware per chip
>> > - firmware APIs for the supported chipset
>> > - communicating new mac80211 settings to firmware
>> > - Different TX/RX datapath where applicable
>> > - A-MSDU and A-MPDU
>> > - mac80211-based MESH (work in progress)
>> > - Refined the code to establish BA streams
>> >
>> > NOTE: MWLWIFI will be organized under new vendor specific
>> > folder/marvell, as per request of the gate keeper and community.
>> >
>> > Signed-off-by: David Lin <[email protected]>
>>
>> It's been quite a while since this was reviewed. Do you have a new version of
>> the driver?
>>
>
> Yes we have some updates, and continue working on it. But we felt that community does not seem to be very interested in this driver, so we have not been updating the wireless org. Let us know if you are supportive and waiting for it.

My understanding was that we'd very much like the driver to be sent
upstream. From my perspective, it looked like you'd lost interest, not
us.

Thanks,

--
Julian Calaby

Email: [email protected]
Profile: http://www.google.com/profiles/julian.calaby/

2016-03-16 23:24:31

by Julian Calaby

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

Hi David,

On Thu, Nov 12, 2015 at 2:51 PM, David Lin <[email protected]> wrote:
> This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897
> chipsets.
> This driver was developed as part of the openwrt.org project to support
> Linksys WRT1900AC and is maintained on https://github.com/kaloz/mwlwifi.
>
> The mwlwifi driver differs from existing mwifiex driver:
> o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem
> to provide full AP/Wireless Bridge functionality (routers).
> o mwifiex is a "fullmac driver" which provides a comprehensive set of
> client functions (laptops/embedded devices)
> o only mwlwifi supports Marvell AP chip 886X series
>
> NOTE: Users with Marvell 88W8897 chipsets currently should enable
> (CONFIG=Y or M) either CONFIG_MWIFIEX or CONFIG_MWLWIFI, NOT BOTH.
>
> mwlwifi driver leveraged code from existing MWL8K driver in the
> following areas:
> - 802.11n setting for mac80211
> - Functions needed to hook up to mac80211
> - Interactions with mac80211 to establish BA streams
> - Partial firmware APIs, some data fields
> - Method to pass Rx packets to mac80211 except 11ac rates
>
> In addition, mwlwifi driver supports:
> - future scalability and future development (refactored source code)
> - Marvell 802.11ac chipsets, including combo BT devices
> - 802.11ac related settings and functions
> - concurrent AP+STA functionalities with single firmware per chip
> - firmware APIs for the supported chipset
> - communicating new mac80211 settings to firmware
> - Different TX/RX datapath where applicable
> - A-MSDU and A-MPDU
> - mac80211-based MESH (work in progress)
> - Refined the code to establish BA streams
>
> NOTE: MWLWIFI will be organized under new vendor specific folder/marvell,
> as per request of the gate keeper and community.
>
> Signed-off-by: David Lin <[email protected]>

It's been quite a while since this was reviewed. Do you have a new
version of the driver?

Thanks,

--
Julian Calaby

Email: [email protected]
Profile: http://www.google.com/profiles/julian.calaby/

2016-03-17 02:10:48

by David Lin

[permalink] [raw]
Subject: RE: [PATCH v7] Add new mac80211 driver mwlwifi.

PiBGcm9tOiBKdWxpYW4gQ2FsYWJ5IFttYWlsdG86anVsaWFuLmNhbGFieUBnbWFpbC5jb21dIFRo
dXJzZGF5LCBNYXJjaCAxNywgMjAxNiA5OjMyIEFNPiANCj4gSGkgRGF2aWQsDQo+IA0KPiBPbiBU
aHUsIE1hciAxNywgMjAxNiBhdCAxMjoyMyBQTSwgRGF2aWQgTGluIDxkbGluQG1hcnZlbGwuY29t
PiB3cm90ZToNCj4gPj4gRnJvbTogSnVsaWFuIENhbGFieSBbbWFpbHRvOmp1bGlhbi5jYWxhYnlA
Z21haWwuY29tXSBUaHVyc2RheSwgTWFyY2gNCj4gPj4gMTcsIDIwMTYgNzoyNCBBTQ0KPiA+Pg0K
PiA+PiBIaSBEYXZpZCwNCj4gPj4NCj4gPj4gT24gVGh1LCBOb3YgMTIsIDIwMTUgYXQgMjo1MSBQ
TSwgRGF2aWQgTGluIDxkbGluQG1hcnZlbGwuY29tPiB3cm90ZToNCj4gPj4gPiBUaGlzIHBhdGNo
IHByb3ZpZGVzIHRoZSBtd2x3aWZpIGRyaXZlciBmb3IgTWFydmVsbCA4ODYzLCA4ODY0IGFuZA0K
PiA+PiA+IDg4OTcgY2hpcHNldHMuDQo+ID4+ID4gVGhpcyBkcml2ZXIgd2FzIGRldmVsb3BlZCBh
cyBwYXJ0IG9mIHRoZSBvcGVud3J0Lm9yZyBwcm9qZWN0IHRvDQo+ID4+ID4gc3VwcG9ydCBMaW5r
c3lzIFdSVDE5MDBBQyBhbmQgaXMgbWFpbnRhaW5lZCBvbg0KPiA+PiBodHRwczovL2dpdGh1Yi5j
b20va2Fsb3ovbXdsd2lmaS4NCj4gPj4gPg0KPiA+PiA+IFRoZSBtd2x3aWZpIGRyaXZlciBkaWZm
ZXJzIGZyb20gZXhpc3RpbmcgbXdpZmlleCBkcml2ZXI6DQo+ID4+ID4gbyBtd2x3aWZpIGlzIGEg
InNvZnRtYWMgZHJpdmVyIiB1c2luZyB0aGUga2VybmVsP+6ogyBtYWM4MDIuMTENCj4gPj4gPiBz
dWJzeXN0ZW0gdG8gcHJvdmlkZSBmdWxsIEFQL1dpcmVsZXNzIEJyaWRnZSBmdW5jdGlvbmFsaXR5
IChyb3V0ZXJzKS4NCj4gPj4gPiBvIG13aWZpZXggaXMgYSAiZnVsbG1hYyBkcml2ZXIiIHdoaWNo
IHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBzZXQNCj4gPj4gPiBvZiBjbGllbnQgZnVuY3Rpb25z
IChsYXB0b3BzL2VtYmVkZGVkIGRldmljZXMpIG8gb25seSBtd2x3aWZpDQo+ID4+ID4gc3VwcG9y
dHMgTWFydmVsbCBBUCBjaGlwIDg4Nlggc2VyaWVzDQo+ID4+ID4NCj4gPj4gPiBOT1RFOiBVc2Vy
cyB3aXRoIE1hcnZlbGwgODhXODg5NyBjaGlwc2V0cyBjdXJyZW50bHkgc2hvdWxkIGVuYWJsZQ0K
PiA+PiA+IChDT05GSUc9WSBvciBNKSBlaXRoZXIgQ09ORklHX01XSUZJRVggb3IgQ09ORklHX01X
TFdJRkksIE5PVA0KPiA+PiBCT1RILg0KPiA+PiA+DQo+ID4+ID4gbXdsd2lmaSBkcml2ZXIgbGV2
ZXJhZ2VkIGNvZGUgZnJvbSBleGlzdGluZyBNV0w4SyBkcml2ZXIgaW4gdGhlDQo+ID4+ID4gZm9s
bG93aW5nIGFyZWFzOg0KPiA+PiA+IC0gODAyLjExbiBzZXR0aW5nIGZvciBtYWM4MDIxMQ0KPiA+
PiA+IC0gRnVuY3Rpb25zIG5lZWRlZCB0byBob29rIHVwIHRvIG1hYzgwMjExDQo+ID4+ID4gLSBJ
bnRlcmFjdGlvbnMgd2l0aCBtYWM4MDIxMSB0byBlc3RhYmxpc2ggQkEgc3RyZWFtcw0KPiA+PiA+
IC0gUGFydGlhbCBmaXJtd2FyZSBBUElzLCBzb21lIGRhdGEgZmllbGRzDQo+ID4+ID4gLSBNZXRo
b2QgdG8gcGFzcyBSeCBwYWNrZXRzIHRvIG1hYzgwMjExIGV4Y2VwdCAxMWFjIHJhdGVzDQo+ID4+
ID4NCj4gPj4gPiBJbiBhZGRpdGlvbiwgbXdsd2lmaSBkcml2ZXIgc3VwcG9ydHM6DQo+ID4+ID4g
LSBmdXR1cmUgc2NhbGFiaWxpdHkgYW5kIGZ1dHVyZSBkZXZlbG9wbWVudCAocmVmYWN0b3JlZCBz
b3VyY2UNCj4gPj4gPiBjb2RlKQ0KPiA+PiA+IC0gTWFydmVsbCA4MDIuMTFhYyBjaGlwc2V0cywg
aW5jbHVkaW5nIGNvbWJvIEJUIGRldmljZXMNCj4gPj4gPiAtIDgwMi4xMWFjIHJlbGF0ZWQgc2V0
dGluZ3MgYW5kIGZ1bmN0aW9ucw0KPiA+PiA+IC0gY29uY3VycmVudCBBUCtTVEEgZnVuY3Rpb25h
bGl0aWVzIHdpdGggc2luZ2xlIGZpcm13YXJlIHBlciBjaGlwDQo+ID4+ID4gLSBmaXJtd2FyZSBB
UElzIGZvciB0aGUgc3VwcG9ydGVkIGNoaXBzZXQNCj4gPj4gPiAtIGNvbW11bmljYXRpbmcgbmV3
IG1hYzgwMjExIHNldHRpbmdzIHRvIGZpcm13YXJlDQo+ID4+ID4gLSBEaWZmZXJlbnQgVFgvUlgg
ZGF0YXBhdGggd2hlcmUgYXBwbGljYWJsZQ0KPiA+PiA+IC0gQS1NU0RVIGFuZCBBLU1QRFUNCj4g
Pj4gPiAtIG1hYzgwMjExLWJhc2VkIE1FU0ggKHdvcmsgaW4gcHJvZ3Jlc3MpDQo+ID4+ID4gLSBS
ZWZpbmVkIHRoZSBjb2RlIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQo+ID4+ID4NCj4gPj4gPiBO
T1RFOiBNV0xXSUZJIHdpbGwgYmUgb3JnYW5pemVkIHVuZGVyIG5ldyB2ZW5kb3Igc3BlY2lmaWMN
Cj4gPj4gPiBmb2xkZXIvbWFydmVsbCwgYXMgcGVyIHJlcXVlc3Qgb2YgdGhlIGdhdGUga2VlcGVy
IGFuZCBjb21tdW5pdHkuDQo+ID4+ID4NCj4gPj4gPiBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBMaW4g
PGRsaW5AbWFydmVsbC5jb20+DQo+ID4+DQo+ID4+IEl0J3MgYmVlbiBxdWl0ZSBhIHdoaWxlIHNp
bmNlIHRoaXMgd2FzIHJldmlld2VkLiBEbyB5b3UgaGF2ZSBhIG5ldw0KPiA+PiB2ZXJzaW9uIG9m
IHRoZSBkcml2ZXI/DQo+ID4+DQo+ID4NCj4gPiBZZXMgd2UgaGF2ZSBzb21lIHVwZGF0ZXMsIGFu
ZCBjb250aW51ZSB3b3JraW5nIG9uIGl0LiBCdXQgd2UgZmVsdCB0aGF0DQo+IGNvbW11bml0eSBk
b2VzIG5vdCBzZWVtIHRvIGJlIHZlcnkgaW50ZXJlc3RlZCBpbiB0aGlzIGRyaXZlciwgc28gd2Ug
aGF2ZSBub3QNCj4gYmVlbiB1cGRhdGluZyB0aGUgd2lyZWxlc3Mgb3JnLiBMZXQgdXMga25vdyBp
ZiB5b3UgYXJlIHN1cHBvcnRpdmUgYW5kIHdhaXRpbmcNCj4gZm9yIGl0Lg0KPiANCj4gTXkgdW5k
ZXJzdGFuZGluZyB3YXMgdGhhdCB3ZSdkIHZlcnkgbXVjaCBsaWtlIHRoZSBkcml2ZXIgdG8gYmUg
c2VudCB1cHN0cmVhbS4NCj4gRnJvbSBteSBwZXJzcGVjdGl2ZSwgaXQgbG9va2VkIGxpa2UgeW91
J2QgbG9zdCBpbnRlcmVzdCwgbm90IHVzLg0KPiANCg0KV2UgZmVsdCBzb21lIHJlc2lzdGFuY2Ug
ZnJvbSB2YXJpb3VzIHBlb3BsZSwgYW5kIGdldCBkaXNjb3VyYWdlZC4gVGhvdWdoIHdlIGNvbnRp
bnVlIHRvIHdvcmsgb24gaXQgaW50ZXJuYWxseSwgd2Ugd2VyZSBqdXN0IGtlZXBpbmcgZnVydGhl
ciBzdWJtaXNzaW9uIGF0IHRoZSBiYWNrIG9mIG91ciBtaW5kLiBXZSBkbyBrZWVwIHRoZSBmZWVk
YmFjayBmcm9tIGNvbW11bml0eSBhbmQgd2lsbCB3b3JrIG9uIGNvbXBsaWFuY3kgd2hlcmUgYXBw
bGljYWJsZSBhbmQgcG9zc2libGUuDQoNCk5leHQsIHdlIHdpbGwgcHJlcGFyZSBhIHBhdGNoOCBm
b3Igc3VibWlzc2lvbiBsYXRlci4NCg0KPg0KPiBUaGFua3MsDQo+IA0KPiAtLQ0KPiBKdWxpYW4g
Q2FsYWJ5DQo+IA0KPiBFbWFpbDoganVsaWFuLmNhbGFieUBnbWFpbC5jb20NCj4gUHJvZmlsZTog
aHR0cDovL3d3dy5nb29nbGUuY29tL3Byb2ZpbGVzL2p1bGlhbi5jYWxhYnkvDQo=

2016-04-03 12:06:13

by Bjørn Mork

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

David Lin <[email protected]> writes:

> We felt some resistance from various people, and get discouraged.

Sorry to hear that. I believe this is a misunderstanding. I am
convinced that *everyone* who commented on the driver did so with the
intention to help getting it merged.

I for one would very much like to see this driver in mainline. But for
that to happen, you wil have to:
1) create a feature frozen branch for mainline submission
2) respond relatively quickly to comments received, posting new
versions of the patch set if necessary

The main issue preventing this driver from being merged so far, in my
view, is that you have continued to add features between each attemt to
get it merged. Adding new features is of course not bad, but you should
do that in another branch *until* the initial version is accepted.

Let me know if there is anything I can do to help getting this into mainline

Bjørn

2016-04-15 12:40:52

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH v7] Add new mac80211 driver mwlwifi.

Bjørn Mork <[email protected]> writes:

> David Lin <[email protected]> writes:
>
>> We felt some resistance from various people, and get discouraged.
>
> Sorry to hear that. I believe this is a misunderstanding. I am
> convinced that *everyone* who commented on the driver did so with the
> intention to help getting it merged.

Exactly. Why would we otherwise spend so much time reviewing the driver
if we would not want it included?

> I for one would very much like to see this driver in mainline. But for
> that to happen, you wil have to:
> 1) create a feature frozen branch for mainline submission
> 2) respond relatively quickly to comments received, posting new
> versions of the patch set if necessary
>
> The main issue preventing this driver from being merged so far, in my
> view, is that you have continued to add features between each attemt to
> get it merged. Adding new features is of course not bad, but you should
> do that in another branch *until* the initial version is accepted.

Thanks for the good summary, I think we should even add that to our wiki
as a guideline for new drivers. Then submitting a new driver (or normal
patches for that matter) you really want to optimise the use of
reviewer's time. Just fix the issues pointed out in the review, don't do
anything extra as the chances are that it just slows down everything.

--
Kalle Valo