[Stk] RtAudio bug fix

Gary Scavone gary@ccrma.Stanford.EDU
Wed, 15 May 2002 11:18:33 -0700 (PDT)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--1084992965-1107128285-1021486713=:6894
Content-Type: TEXT/PLAIN; charset=US-ASCII

Hi all,

If you were using RtAudio with the Linux OSS API and callbacks, there
was a missing mutex in the startStream() function.  The result was an
occasional failure to start the stream (I only noticed it when doing a
lot of stream starts and stops).  I've attached an updated RtAudio.cpp
file.

-------------------------------------------------
Gary Scavone
Center for Computer Research in Music & Acoustics
Stanford University
gary@ccrma.stanford.edu
http://www-ccrma.stanford.edu/~gary/
-------------------------------------------------

--1084992965-1107128285-1021486713=:6894
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="RtAudio.cpp"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.44.0205151118330.6894@cmn24.stanford.edu>
Content-Description: 
Content-Disposition: attachment; filename="RtAudio.cpp"

LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8N
DQovKg0NCiAgUnRBdWRpbyAtIHJlYWx0aW1lIHNvdW5kIEkvTyBDKysgY2xh
c3MNDQogIGJ5IEdhcnkgUC4gU2Nhdm9uZSwgMjAwMS0yMDAyLg0NCiovDQ0K
LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8N
DQoNDQojaW5jbHVkZSAiUnRBdWRpby5oIg0NCiNpbmNsdWRlIDx2ZWN0b3I+
DQ0KI2luY2x1ZGUgPHN0ZGlvLmg+DQ0KDQ0KLy8gU3RhdGljIHZhcmlhYmxl
IGRlZmluaXRpb25zLg0NCmNvbnN0IHVuc2lnbmVkIGludCBSdEF1ZGlvIDo6
IFNBTVBMRV9SQVRFU1tdID0gew0NCiAgNDAwMCwgNTUxMiwgODAwMCwgOTYw
MCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwNDQogIDMyMDAwLCA0NDEwMCwgNDgw
MDAsIDg4MjAwLCA5NjAwMCwgMTc2NDAwLCAxOTIwMDANDQp9Ow0NCmNvbnN0
IFJ0QXVkaW86OlJUQVVESU9fRk9STUFUIFJ0QXVkaW8gOjogUlRBVURJT19T
SU5UOCA9IDE7DQ0KY29uc3QgUnRBdWRpbzo6UlRBVURJT19GT1JNQVQgUnRB
dWRpbyA6OiBSVEFVRElPX1NJTlQxNiA9IDI7DQ0KY29uc3QgUnRBdWRpbzo6
UlRBVURJT19GT1JNQVQgUnRBdWRpbyA6OiBSVEFVRElPX1NJTlQyNCA9IDQ7
DQ0KY29uc3QgUnRBdWRpbzo6UlRBVURJT19GT1JNQVQgUnRBdWRpbyA6OiBS
VEFVRElPX1NJTlQzMiA9IDg7DQ0KY29uc3QgUnRBdWRpbzo6UlRBVURJT19G
T1JNQVQgUnRBdWRpbyA6OiBSVEFVRElPX0ZMT0FUMzIgPSAxNjsNDQpjb25z
dCBSdEF1ZGlvOjpSVEFVRElPX0ZPUk1BVCBSdEF1ZGlvIDo6IFJUQVVESU9f
RkxPQVQ2NCA9IDMyOw0NCg0NCiNpZiBkZWZpbmVkKF9fV0lORE9XU19EU19f
KQ0NCiAgI2RlZmluZSBNVVRFWF9JTklUSUFMSVpFKEEpIEluaXRpYWxpemVD
cml0aWNhbFNlY3Rpb24oQSkNDQogICNkZWZpbmUgTVVURVhfTE9DSyhBKSAg
ICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbihBKQ0NCiAgI2RlZmluZSBNVVRF
WF9VTkxPQ0soQSkgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKEEpDQ0KICB0
eXBlZGVmIHVuc2lnbmVkIFRIUkVBRF9SRVRVUk47DQ0KICB0eXBlZGVmIHVu
c2lnbmVkIChfX3N0ZGNhbGwgVEhSRUFEX0ZVTkNUSU9OKSh2b2lkICopOw0N
CiNlbHNlIC8vIHB0aHJlYWQgQVBJDQ0KICAjZGVmaW5lIE1VVEVYX0lOSVRJ
QUxJWkUoQSkgcHRocmVhZF9tdXRleF9pbml0KEEsIE5VTEwpDQ0KICAjZGVm
aW5lIE1VVEVYX0xPQ0soQSkgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKEEp
DQ0KICAjZGVmaW5lIE1VVEVYX1VOTE9DSyhBKSAgICAgcHRocmVhZF9tdXRl
eF91bmxvY2soQSkNDQogIHR5cGVkZWYgdm9pZCAqIFRIUkVBRF9SRVRVUk47
DQ0KI2VuZGlmDQ0KDQ0KLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqIC8vDQ0KLy8NDQovLyBQdWJsaWMg
Y29tbW9uIChPUy1pbmRlcGVuZGVudCkgbWV0aG9kcy4NDQovLw0NCi8vICoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKiAvLw0NCg0NClJ0QXVkaW8gOjogUnRBdWRpbygpDQ0Kew0NCiAgaW5p
dGlhbGl6ZSgpOw0NCg0NCiAgaWYgKG5EZXZpY2VzIDw9IDApIHsNDQogICAg
c3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogbm8gYXVkaW8gZGV2aWNlcyBm
b3VuZCEiKTsNDQogICAgZXJyb3IoUnRFcnJvcjo6Tk9fREVWSUNFU19GT1VO
RCk7DQ0KIH0NDQp9DQ0KDQ0KUnRBdWRpbyA6OiBSdEF1ZGlvKGludCAqc3Ry
ZWFtSWQsDQ0KICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXREZXZpY2Us
IGludCBvdXRwdXRDaGFubmVscywNDQogICAgICAgICAgICAgICAgICAgaW50
IGlucHV0RGV2aWNlLCBpbnQgaW5wdXRDaGFubmVscywNDQogICAgICAgICAg
ICAgICAgICAgUlRBVURJT19GT1JNQVQgZm9ybWF0LCBpbnQgc2FtcGxlUmF0
ZSwNDQogICAgICAgICAgICAgICAgICAgaW50ICpidWZmZXJTaXplLCBpbnQg
bnVtYmVyT2ZCdWZmZXJzKQ0NCnsNDQogIGluaXRpYWxpemUoKTsNDQoNDQog
IGlmIChuRGV2aWNlcyA8PSAwKSB7DQ0KICAgIHNwcmludGYobWVzc2FnZSwg
IlJ0QXVkaW86IG5vIGF1ZGlvIGRldmljZXMgZm91bmQhIik7DQ0KICAgIGVy
cm9yKFJ0RXJyb3I6Ok5PX0RFVklDRVNfRk9VTkQpOw0NCiAgfQ0NCg0NCiAg
dHJ5IHsNDQogICAgKnN0cmVhbUlkID0gb3BlblN0cmVhbShvdXRwdXREZXZp
Y2UsIG91dHB1dENoYW5uZWxzLCBpbnB1dERldmljZSwgaW5wdXRDaGFubmVs
cywNDQogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHNhbXBs
ZVJhdGUsIGJ1ZmZlclNpemUsIG51bWJlck9mQnVmZmVycyk7DQ0KICB9DQ0K
ICBjYXRjaCAoUnRFcnJvciAmZXhjZXB0aW9uKSB7DQ0KICAgIC8vIGRlYWxs
b2NhdGUgdGhlIFJUQVVESU9fREVWSUNFIHN0cnVjdHVyZXMNDQogICAgaWYg
KGRldmljZXMpIGZyZWUoZGV2aWNlcyk7DQ0KICAgIGVycm9yKGV4Y2VwdGlv
bi5nZXRUeXBlKCkpOw0NCiAgfQ0NCn0NDQoNDQpSdEF1ZGlvIDo6IH5SdEF1
ZGlvKCkNDQp7DQ0KICAvLyBjbG9zZSBhbnkgZXhpc3Rpbmcgc3RyZWFtcw0N
CiAgd2hpbGUgKCBzdHJlYW1zLnNpemUoKSApDQ0KICAgIGNsb3NlU3RyZWFt
KCBzdHJlYW1zLmJlZ2luKCktPmZpcnN0ICk7DQ0KDQ0KICAvLyBkZWFsbG9j
YXRlIHRoZSBSVEFVRElPX0RFVklDRSBzdHJ1Y3R1cmVzDQ0KICBpZiAoZGV2
aWNlcykgZnJlZShkZXZpY2VzKTsNDQp9DQ0KDQ0KaW50IFJ0QXVkaW8gOjog
b3BlblN0cmVhbShpbnQgb3V0cHV0RGV2aWNlLCBpbnQgb3V0cHV0Q2hhbm5l
bHMsDQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXREZXZp
Y2UsIGludCBpbnB1dENoYW5uZWxzLA0NCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgUlRBVURJT19GT1JNQVQgZm9ybWF0LCBpbnQgc2FtcGxlUmF0ZSwN
DQogICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnVmZmVyU2l6ZSwg
aW50IG51bWJlck9mQnVmZmVycykNDQp7DQ0KICBzdGF0aWMgaW50IHN0cmVh
bUtleSA9IDA7IC8vIFVuaXF1ZSBzdHJlYW0gaWRlbnRpZmllciAuLi4gT0sg
Zm9yIG11bHRpcGxlIGluc3RhbmNlcy4NDQoNDQogIGlmIChvdXRwdXRDaGFu
bmVscyA8IDEgJiYgaW5wdXRDaGFubmVscyA8IDEpIHsNDQogICAgc3ByaW50
ZihtZXNzYWdlLCJSdEF1ZGlvOiBvbmUgb3IgYm90aCAnY2hhbm5lbCcgcGFy
YW1ldGVycyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOw0NCiAgICBl
cnJvcihSdEVycm9yOjpJTlZBTElEX1BBUkFNRVRFUik7DQ0KICB9DQ0KDQ0K
ICBpZiAoIGZvcm1hdEJ5dGVzKGZvcm1hdCkgPT0gMCApIHsNDQogICAgc3By
aW50ZihtZXNzYWdlLCJSdEF1ZGlvOiAnZm9ybWF0JyBwYXJhbWV0ZXIgdmFs
dWUgaXMgdW5kZWZpbmVkLiIpOw0NCiAgICBlcnJvcihSdEVycm9yOjpJTlZB
TElEX1BBUkFNRVRFUik7DQ0KICB9DQ0KDQ0KICBpZiAoIG91dHB1dENoYW5u
ZWxzID4gMCApIHsNDQogICAgaWYgKG91dHB1dERldmljZSA+PSBuRGV2aWNl
cyB8fCBvdXRwdXREZXZpY2UgPCAwKSB7DQ0KICAgICAgc3ByaW50ZihtZXNz
YWdlLCJSdEF1ZGlvOiAnb3V0cHV0RGV2aWNlJyBwYXJhbWV0ZXIgdmFsdWUg
KCVkKSBpcyBpbnZhbGlkLiIsIG91dHB1dERldmljZSk7DQ0KICAgICAgZXJy
b3IoUnRFcnJvcjo6SU5WQUxJRF9QQVJBTUVURVIpOw0NCiAgICB9DQ0KICB9
DQ0KDQ0KICBpZiAoIGlucHV0Q2hhbm5lbHMgPiAwICkgew0NCiAgICBpZiAo
aW5wdXREZXZpY2UgPj0gbkRldmljZXMgfHwgaW5wdXREZXZpY2UgPCAwKSB7
DQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCJSdEF1ZGlvOiAnaW5wdXREZXZp
Y2UnIHBhcmFtZXRlciB2YWx1ZSAoJWQpIGlzIGludmFsaWQuIiwgaW5wdXRE
ZXZpY2UpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OklOVkFMSURfUEFSQU1F
VEVSKTsNDQogICAgfQ0NCiAgfQ0NCg0NCiAgLy8gQWxsb2NhdGUgYSBuZXcg
c3RyZWFtIHN0cnVjdHVyZS4NDQogIFJUQVVESU9fU1RSRUFNICpzdHJlYW0g
PSAoUlRBVURJT19TVFJFQU0gKikgY2FsbG9jKDEsIHNpemVvZihSVEFVRElP
X1NUUkVBTSkpOw0NCiAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7DQ0KICAgIHNw
cmludGYobWVzc2FnZSwgIlJ0QXVkaW86IG1lbW9yeSBhbGxvY2F0aW9uIGVy
cm9yISIpOw0NCiAgICBlcnJvcihSdEVycm9yOjpNRU1PUllfRVJST1IpOw0N
CiAgfQ0NCiAgc3RyZWFtc1srK3N0cmVhbUtleV0gPSAodm9pZCAqKSBzdHJl
YW07DQ0KICBzdHJlYW0tPm1vZGUgPSBVTklOSVRJQUxJWkVEOw0NCiAgTVVU
RVhfSU5JVElBTElaRSgmc3RyZWFtLT5tdXRleCk7DQ0KDQ0KICBib29sIHJl
c3VsdCA9IFNVQ0NFU1M7DQ0KICBpbnQgZGV2aWNlOw0NCiAgU1RSRUFNX01P
REUgbW9kZTsNDQogIGludCBjaGFubmVsczsNDQogIGlmICggb3V0cHV0Q2hh
bm5lbHMgPiAwICkgew0NCg0NCiAgICBkZXZpY2UgPSBvdXRwdXREZXZpY2U7
DQ0KICAgIG1vZGUgPSBQTEFZQkFDSzsNDQogICAgY2hhbm5lbHMgPSBvdXRw
dXRDaGFubmVsczsNDQoNDQogICAgaWYgKGRldmljZSA9PSAwKSB7IC8vIFRy
eSBkZWZhdWx0IGRldmljZSBmaXJzdC4NDQogICAgICBmb3IgKGludCBpPTA7
IGk8bkRldmljZXM7IGkrKykgew0NCiAgICAgICAgaWYgKGRldmljZXNbaV0u
cHJvYmVkID09IGZhbHNlKSB7DQ0KICAgICAgICAgIC8vIElmIHRoZSBkZXZp
Y2Ugd2Fzbid0IHN1Y2Nlc3NmdWxseSBwcm9iZWQgYmVmb3JlLCB0cnkgaXQN
DQogICAgICAgICAgLy8gYWdhaW4gbm93Lg0NCiAgICAgICAgICBjbGVhckRl
dmljZUluZm8oJmRldmljZXNbaV0pOw0NCiAgICAgICAgICBwcm9iZURldmlj
ZUluZm8oJmRldmljZXNbaV0pOw0NCiAgICAgICAgICBpZiAoZGV2aWNlc1tp
XS5wcm9iZWQgPT0gZmFsc2UpDQ0KICAgICAgICAgICAgY29udGludWU7DQ0K
ICAgICAgICB9DQ0KICAgICAgICByZXN1bHQgPSBwcm9iZURldmljZU9wZW4o
aSwgc3RyZWFtLCBtb2RlLCBjaGFubmVscywgc2FtcGxlUmF0ZSwNDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlclNp
emUsIG51bWJlck9mQnVmZmVycyk7DQ0KICAgICAgICBpZiAocmVzdWx0ID09
IFNVQ0NFU1MpDQ0KICAgICAgICAgIGJyZWFrOw0NCiAgICAgIH0NDQogICAg
fQ0NCiAgICBlbHNlIHsNDQogICAgICByZXN1bHQgPSBwcm9iZURldmljZU9w
ZW4oZGV2aWNlLCBzdHJlYW0sIG1vZGUsIGNoYW5uZWxzLCBzYW1wbGVSYXRl
LA0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1
ZmZlclNpemUsIG51bWJlck9mQnVmZmVycyk7DQ0KICAgIH0NDQogIH0NDQoN
DQogIGlmICggaW5wdXRDaGFubmVscyA+IDAgJiYgcmVzdWx0ID09IFNVQ0NF
U1MgKSB7DQ0KDQ0KICAgIGRldmljZSA9IGlucHV0RGV2aWNlOw0NCiAgICBt
b2RlID0gUkVDT1JEOw0NCiAgICBjaGFubmVscyA9IGlucHV0Q2hhbm5lbHM7
DQ0KDQ0KICAgIGlmIChkZXZpY2UgPT0gMCkgeyAvLyBUcnkgZGVmYXVsdCBk
ZXZpY2UgZmlyc3QuDQ0KICAgICAgZm9yIChpbnQgaT0wOyBpPG5EZXZpY2Vz
OyBpKyspIHsNDQogICAgICAgIGlmIChkZXZpY2VzW2ldLnByb2JlZCA9PSBm
YWxzZSkgew0NCiAgICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIHdhc24ndCBz
dWNjZXNzZnVsbHkgcHJvYmVkIGJlZm9yZSwgdHJ5IGl0DQ0KICAgICAgICAg
IC8vIGFnYWluIG5vdy4NDQogICAgICAgICAgY2xlYXJEZXZpY2VJbmZvKCZk
ZXZpY2VzW2ldKTsNDQogICAgICAgICAgcHJvYmVEZXZpY2VJbmZvKCZkZXZp
Y2VzW2ldKTsNDQogICAgICAgICAgaWYgKGRldmljZXNbaV0ucHJvYmVkID09
IGZhbHNlKQ0NCiAgICAgICAgICAgIGNvbnRpbnVlOw0NCiAgICAgICAgfQ0N
CiAgICAgICAgcmVzdWx0ID0gcHJvYmVEZXZpY2VPcGVuKGksIHN0cmVhbSwg
bW9kZSwgY2hhbm5lbHMsIHNhbXBsZVJhdGUsDQ0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZm9ybWF0LCBidWZmZXJTaXplLCBudW1iZXJP
ZkJ1ZmZlcnMpOw0NCiAgICAgICAgaWYgKHJlc3VsdCA9PSBTVUNDRVNTKQ0N
CiAgICAgICAgICBicmVhazsNDQogICAgICB9DQ0KICAgIH0NDQogICAgZWxz
ZSB7DQ0KICAgICAgcmVzdWx0ID0gcHJvYmVEZXZpY2VPcGVuKGRldmljZSwg
c3RyZWFtLCBtb2RlLCBjaGFubmVscywgc2FtcGxlUmF0ZSwNDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBidWZmZXJTaXplLCBu
dW1iZXJPZkJ1ZmZlcnMpOw0NCiAgICB9DQ0KICB9DQ0KDQ0KICBpZiAoIHJl
c3VsdCA9PSBTVUNDRVNTICkNDQogICAgcmV0dXJuIHN0cmVhbUtleTsNDQoN
DQogIC8vIElmIHdlIGdldCBoZXJlLCBhbGwgYXR0ZW1wdGVkIHByb2JlcyBm
YWlsZWQuICBDbG9zZSBhbnkgb3BlbmVkDQ0KICAvLyBkZXZpY2VzIGFuZCBk
ZWxldGUgdGhlIGFsbG9jYXRlZCBzdHJlYW0uDQ0KICBjbG9zZVN0cmVhbShz
dHJlYW1LZXkpOw0NCiAgc3ByaW50ZihtZXNzYWdlLCJSdEF1ZGlvOiBubyBk
ZXZpY2VzIGZvdW5kIGZvciBnaXZlbiBwYXJhbWV0ZXJzLiIpOw0NCiAgZXJy
b3IoUnRFcnJvcjo6SU5WQUxJRF9QQVJBTUVURVIpOw0NCg0NCiAgcmV0dXJu
IC0xOw0NCn0NDQoNDQppbnQgUnRBdWRpbyA6OiBnZXREZXZpY2VDb3VudCh2
b2lkKQ0NCnsNDQogIHJldHVybiBuRGV2aWNlczsNDQp9DQ0KDQ0Kdm9pZCBS
dEF1ZGlvIDo6IGdldERldmljZUluZm8oaW50IGRldmljZSwgUlRBVURJT19E
RVZJQ0UgKmluZm8pDQ0Kew0NCiAgaWYgKGRldmljZSA+PSBuRGV2aWNlcyB8
fCBkZXZpY2UgPCAwKSB7DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVk
aW86IGludmFsaWQgZGV2aWNlIHNwZWNpZmllciAoJWQpISIsIGRldmljZSk7
DQ0KICAgIGVycm9yKFJ0RXJyb3I6OklOVkFMSURfREVWSUNFKTsNDQogIH0N
DQoNDQogIC8vIElmIHRoZSBkZXZpY2Ugd2Fzbid0IHN1Y2Nlc3NmdWxseSBw
cm9iZWQgYmVmb3JlLCB0cnkgaXQgYWdhaW4uDQ0KICBpZiAoZGV2aWNlc1tk
ZXZpY2VdLnByb2JlZCA9PSBmYWxzZSkgew0NCiAgICBjbGVhckRldmljZUlu
Zm8oJmRldmljZXNbZGV2aWNlXSk7DQ0KICAgIHByb2JlRGV2aWNlSW5mbygm
ZGV2aWNlc1tkZXZpY2VdKTsNDQogIH0NDQoNDQogIC8vIENsZWFyIHRoZSBp
bmZvIHN0cnVjdHVyZS4NDQogIG1lbXNldChpbmZvLCAwLCBzaXplb2YoUlRB
VURJT19ERVZJQ0UpKTsNDQoNDQogIHN0cm5jcHkoaW5mby0+bmFtZSwgZGV2
aWNlc1tkZXZpY2VdLm5hbWUsIDEyOCk7DQ0KICBpbmZvLT5wcm9iZWQgPSBk
ZXZpY2VzW2RldmljZV0ucHJvYmVkOw0NCiAgaWYgKCBpbmZvLT5wcm9iZWQg
PT0gdHJ1ZSApIHsNDQogICAgaW5mby0+bWF4T3V0cHV0Q2hhbm5lbHMgPSBk
ZXZpY2VzW2RldmljZV0ubWF4T3V0cHV0Q2hhbm5lbHM7DQ0KICAgIGluZm8t
Pm1heElucHV0Q2hhbm5lbHMgPSBkZXZpY2VzW2RldmljZV0ubWF4SW5wdXRD
aGFubmVsczsNDQogICAgaW5mby0+bWF4RHVwbGV4Q2hhbm5lbHMgPSBkZXZp
Y2VzW2RldmljZV0ubWF4RHVwbGV4Q2hhbm5lbHM7DQ0KICAgIGluZm8tPm1p
bk91dHB1dENoYW5uZWxzID0gZGV2aWNlc1tkZXZpY2VdLm1pbk91dHB1dENo
YW5uZWxzOw0NCiAgICBpbmZvLT5taW5JbnB1dENoYW5uZWxzID0gZGV2aWNl
c1tkZXZpY2VdLm1pbklucHV0Q2hhbm5lbHM7DQ0KICAgIGluZm8tPm1pbkR1
cGxleENoYW5uZWxzID0gZGV2aWNlc1tkZXZpY2VdLm1pbkR1cGxleENoYW5u
ZWxzOw0NCiAgICBpbmZvLT5oYXNEdXBsZXhTdXBwb3J0ID0gZGV2aWNlc1tk
ZXZpY2VdLmhhc0R1cGxleFN1cHBvcnQ7DQ0KICAgIGluZm8tPm5TYW1wbGVS
YXRlcyA9IGRldmljZXNbZGV2aWNlXS5uU2FtcGxlUmF0ZXM7DQ0KICAgIGlm
IChpbmZvLT5uU2FtcGxlUmF0ZXMgPT0gLTEpIHsNDQogICAgICBpbmZvLT5z
YW1wbGVSYXRlc1swXSA9IGRldmljZXNbZGV2aWNlXS5zYW1wbGVSYXRlc1sw
XTsNDQogICAgICBpbmZvLT5zYW1wbGVSYXRlc1sxXSA9IGRldmljZXNbZGV2
aWNlXS5zYW1wbGVSYXRlc1sxXTsNDQogICAgfQ0NCiAgICBlbHNlIHsNDQog
ICAgICBmb3IgKGludCBpPTA7IGk8aW5mby0+blNhbXBsZVJhdGVzOyBpKysp
DQ0KICAgICAgICBpbmZvLT5zYW1wbGVSYXRlc1tpXSA9IGRldmljZXNbZGV2
aWNlXS5zYW1wbGVSYXRlc1tpXTsNDQogICAgfQ0NCiAgICBpbmZvLT5uYXRp
dmVGb3JtYXRzID0gZGV2aWNlc1tkZXZpY2VdLm5hdGl2ZUZvcm1hdHM7DQ0K
ICB9DQ0KDQ0KICByZXR1cm47DQ0KfQ0NCg0NCmNoYXIgKiBjb25zdCBSdEF1
ZGlvIDo6IGdldFN0cmVhbUJ1ZmZlcihpbnQgc3RyZWFtSWQpDQ0Kew0NCiAg
UlRBVURJT19TVFJFQU0gKnN0cmVhbSA9IChSVEFVRElPX1NUUkVBTSAqKSB2
ZXJpZnlTdHJlYW0oc3RyZWFtSWQpOw0NCg0NCiAgcmV0dXJuIHN0cmVhbS0+
dXNlckJ1ZmZlcjsNDQp9DQ0KDQ0KLy8gVGhpcyBnbG9iYWwgc3RydWN0dXJl
IGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byB0aGUgdGhyZWFkDQ0K
Ly8gZnVuY3Rpb24uICBJIHRyaWVkIG90aGVyIG1ldGhvZHMgYnV0IGhhZCBp
bnRlcm1pdHRlbnQgZXJyb3JzIGR1ZSB0bw0NCi8vIHZhcmlhYmxlIHBlcnNp
c3RlbmNlIGR1cmluZyB0aHJlYWQgc3RhcnR1cC4NDQpzdHJ1Y3Qgew0NCiAg
UnRBdWRpbyAqb2JqZWN0Ow0NCiAgaW50IHN0cmVhbUlkOw0NCn0gdGhyZWFk
X2luZm87DQ0KDQ0KZXh0ZXJuICJDIiBUSFJFQURfUkVUVVJOIFRIUkVBRF9U
WVBFIGNhbGxiYWNrSGFuZGxlcih2b2lkICogcHRyKTsNDQoNDQp2b2lkIFJ0
QXVkaW8gOjogc2V0U3RyZWFtQ2FsbGJhY2soaW50IHN0cmVhbUlkLCBSVEFV
RElPX0NBTExCQUNLIGNhbGxiYWNrLCB2b2lkICp1c2VyRGF0YSkNDQp7DQ0K
ICBSVEFVRElPX1NUUkVBTSAqc3RyZWFtID0gKFJUQVVESU9fU1RSRUFNICop
IHZlcmlmeVN0cmVhbShzdHJlYW1JZCk7DQ0KDQ0KICBzdHJlYW0tPmNhbGxi
YWNrID0gY2FsbGJhY2s7DQ0KICBzdHJlYW0tPnVzZXJEYXRhID0gdXNlckRh
dGE7DQ0KICBzdHJlYW0tPnVzaW5nQ2FsbGJhY2sgPSB0cnVlOw0NCiAgdGhy
ZWFkX2luZm8ub2JqZWN0ID0gdGhpczsNDQogIHRocmVhZF9pbmZvLnN0cmVh
bUlkID0gc3RyZWFtSWQ7DQ0KDQ0KICBpbnQgZXJyID0gMDsNDQojaWYgZGVm
aW5lZChfX1dJTkRPV1NfRFNfXykNDQogIHVuc2lnbmVkIHRocmVhZF9pZDsN
DQogIHN0cmVhbS0+dGhyZWFkID0gX2JlZ2ludGhyZWFkZXgoTlVMTCwgMCwg
JmNhbGxiYWNrSGFuZGxlciwNDQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJnN0cmVhbS0+dXNpbmdDYWxsYmFjaywgMCwgJnRocmVhZF9p
ZCk7DQ0KICBpZiAoc3RyZWFtLT50aHJlYWQgPT0gMCkgZXJyID0gLTE7DQ0K
ICAvLyBXaGVuIHNwYXduaW5nIG11bHRpcGxlIHRocmVhZHMgaW4gcXVpY2sg
c3VjY2Vzc2lvbiwgaXQgYXBwZWFycyB0byBiZQ0NCiAgLy8gbmVjZXNzYXJ5
IHRvIHdhaXQgYSBiaXQgZm9yIGVhY2ggdG8gaW5pdGlhbGl6ZSAuLi4gYW5v
dGhlciB3aW5kaXNtIQ0NCiAgU2xlZXAoMSk7DQ0KI2Vsc2UNDQogIGVyciA9
IHB0aHJlYWRfY3JlYXRlKCZzdHJlYW0tPnRocmVhZCwgTlVMTCwgY2FsbGJh
Y2tIYW5kbGVyLCAmc3RyZWFtLT51c2luZ0NhbGxiYWNrKTsNDQojZW5kaWYN
DQoNDQogIGlmIChlcnIpIHsNDQogICAgc3RyZWFtLT51c2luZ0NhbGxiYWNr
ID0gZmFsc2U7DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IGVy
cm9yIHN0YXJ0aW5nIGNhbGxiYWNrIHRocmVhZCEiKTsNDQogICAgZXJyb3Io
UnRFcnJvcjo6VEhSRUFEX0VSUk9SKTsNDQogIH0NDQp9DQ0KDQ0KLy8gKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqIC8vDQ0KLy8NDQovLyBPUy9BUEktc3BlY2lmaWMgbWV0aG9kcy4NDQov
Lw0NCi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKiAvLw0NCg0NCiNpZiBkZWZpbmVkKF9fTElOVVhfQUxT
QV9fKQ0NCg0NCiNkZWZpbmUgTUFYX0RFVklDRVMgMTYNDQoNDQp2b2lkIFJ0
QXVkaW8gOjogaW5pdGlhbGl6ZSh2b2lkKQ0NCnsNDQogIGludCBjYXJkLCBy
ZXN1bHQsIGRldmljZTsNDQogIGNoYXIgbmFtZVszMl07DQ0KICBjaGFyIGRl
dmljZU5hbWVzW01BWF9ERVZJQ0VTXVszMl07DQ0KICBzbmRfY3RsX3QgKmhh
bmRsZTsNDQogIHNuZF9jdGxfY2FyZF9pbmZvX3QgKmluZm87DQ0KICBzbmRf
Y3RsX2NhcmRfaW5mb19hbGxvY2EoJmluZm8pOw0NCg0NCiAgLy8gQ291bnQg
Y2FyZHMgYW5kIGRldmljZXMNDQogIG5EZXZpY2VzID0gMDsNDQogIGNhcmQg
PSAtMTsNDQogIHNuZF9jYXJkX25leHQoJmNhcmQpOw0NCiAgd2hpbGUgKCBj
YXJkID49IDAgKSB7DQ0KICAgIHNwcmludGYobmFtZSwgImh3OiVkIiwgY2Fy
ZCk7DQ0KICAgIHJlc3VsdCA9IHNuZF9jdGxfb3BlbigmaGFuZGxlLCBuYW1l
LCAwKTsNDQogICAgaWYgKHJlc3VsdCA8IDApIHsNDQogICAgICBzcHJpbnRm
KG1lc3NhZ2UsICJSdEF1ZGlvOiBBTFNBIGNvbnRyb2wgb3BlbiAoJWkpOiAl
cy4iLCBjYXJkLCBzbmRfc3RyZXJyb3IocmVzdWx0KSk7DQ0KICAgICAgZXJy
b3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAgZ290byBuZXh0X2NhcmQ7
DQ0KCQl9DQ0KICAgIHJlc3VsdCA9IHNuZF9jdGxfY2FyZF9pbmZvKGhhbmRs
ZSwgaW5mbyk7DQ0KCQlpZiAocmVzdWx0IDwgMCkgew0NCiAgICAgIHNwcmlu
dGYobWVzc2FnZSwgIlJ0QXVkaW86IEFMU0EgY29udHJvbCBoYXJkd2FyZSBp
bmZvICglaSk6ICVzLiIsIGNhcmQsIHNuZF9zdHJlcnJvcihyZXN1bHQpKTsN
DQogICAgICBlcnJvcihSdEVycm9yOjpXQVJOSU5HKTsNDQogICAgICBnb3Rv
IG5leHRfY2FyZDsNDQoJCX0NDQoJCWRldmljZSA9IC0xOw0NCgkJd2hpbGUg
KDEpIHsNDQogICAgICByZXN1bHQgPSBzbmRfY3RsX3BjbV9uZXh0X2Rldmlj
ZShoYW5kbGUsICZkZXZpY2UpOw0NCgkJCWlmIChyZXN1bHQgPCAwKSB7DQ0K
ICAgICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBBTFNBIGNvbnRy
b2wgbmV4dCBkZXZpY2UgKCVpKTogJXMuIiwgY2FyZCwgc25kX3N0cmVycm9y
KHJlc3VsdCkpOw0NCiAgICAgICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7
DQ0KICAgICAgICBicmVhazsNDQogICAgICB9DQ0KCQkJaWYgKGRldmljZSA8
IDApDQ0KICAgICAgICBicmVhazsNDQogICAgICBzcHJpbnRmKCBkZXZpY2VO
YW1lc1tuRGV2aWNlcysrXSwgImh3OiVkLCVkIiwgY2FyZCwgZGV2aWNlICk7
DQ0KICAgICAgaWYgKCBuRGV2aWNlcyA+IE1BWF9ERVZJQ0VTICkgYnJlYWs7
DQ0KICAgIH0NDQogICAgaWYgKCBuRGV2aWNlcyA+IE1BWF9ERVZJQ0VTICkg
YnJlYWs7DQ0KICBuZXh0X2NhcmQ6DQ0KICAgIHNuZF9jdGxfY2xvc2UoaGFu
ZGxlKTsNDQogICAgc25kX2NhcmRfbmV4dCgmY2FyZCk7DQ0KICB9DQ0KDQ0K
ICBpZiAobkRldmljZXMgPT0gMCkgcmV0dXJuOw0NCg0NCiAgLy8gIEFsbG9j
YXRlIHRoZSBSVEFVRElPX0RFVklDRSBzdHJ1Y3R1cmVzLg0NCiAgZGV2aWNl
cyA9IChSVEFVRElPX0RFVklDRSAqKSBjYWxsb2MobkRldmljZXMsIHNpemVv
ZihSVEFVRElPX0RFVklDRSkpOw0NCiAgaWYgKGRldmljZXMgPT0gTlVMTCkg
ew0NCiAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBtZW1vcnkgYWxs
b2NhdGlvbiBlcnJvciEiKTsNDQogICAgZXJyb3IoUnRFcnJvcjo6TUVNT1JZ
X0VSUk9SKTsNDQogIH0NDQoNDQogIC8vIFdyaXRlIGRldmljZSBhc2NpaSBp
ZGVudGlmaWVycyB0byBkZXZpY2Ugc3RydWN0dXJlcyBhbmQgdGhlbg0NCiAg
Ly8gcHJvYmUgdGhlIGRldmljZSBjYXBhYmlsaXRpZXMuDQ0KICBmb3IgKGlu
dCBpPTA7IGk8bkRldmljZXM7IGkrKykgew0NCiAgICBzdHJuY3B5KGRldmlj
ZXNbaV0ubmFtZSwgZGV2aWNlTmFtZXNbaV0sIDMyKTsNDQogICAgcHJvYmVE
ZXZpY2VJbmZvKCZkZXZpY2VzW2ldKTsNDQogIH0NDQoNDQogIHJldHVybjsN
DQp9DQ0KDQ0Kdm9pZCBSdEF1ZGlvIDo6IHByb2JlRGV2aWNlSW5mbyhSVEFV
RElPX0RFVklDRSAqaW5mbykNDQp7DQ0KICBpbnQgZXJyOw0NCiAgaW50IG9w
ZW5fbW9kZSA9IFNORF9QQ01fQVNZTkM7DQ0KICBzbmRfcGNtX3QgKmhhbmRs
ZTsNDQogIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtOw0NCg0NCiAgLy8gRmly
c3QgdHJ5IGZvciBwbGF5YmFjaw0NCiAgc3RyZWFtID0gU05EX1BDTV9TVFJF
QU1fUExBWUJBQ0s7DQ0KICBlcnIgPSBzbmRfcGNtX29wZW4oJmhhbmRsZSwg
aW5mby0+bmFtZSwgc3RyZWFtLCBvcGVuX21vZGUpOw0NCiAgaWYgKGVyciA8
IDApIHsNDQogICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQUxTQSBw
Y20gcGxheWJhY2sgb3BlbiAoJXMpOiAlcy4iLA0NCiAgICAgICAgICAgIGlu
Zm8tPm5hbWUsIHNuZF9zdHJlcnJvcihlcnIpKTsNDQogICAgZXJyb3IoUnRF
cnJvcjo6V0FSTklORyk7DQ0KICAgIGdvdG8gY2FwdHVyZV9wcm9iZTsNDQog
IH0NDQoNDQogIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtczsNDQogIHNu
ZF9wY21faHdfcGFyYW1zX2FsbG9jYSgmcGFyYW1zKTsNDQoNDQogIC8vIFdl
IGhhdmUgYW4gb3BlbiBkZXZpY2UgLi4uIGFsbG9jYXRlIHRoZSBwYXJhbWV0
ZXIgc3RydWN0dXJlLg0NCiAgZXJyID0gc25kX3BjbV9od19wYXJhbXNfYW55
KGhhbmRsZSwgcGFyYW1zKTsNDQogIGlmIChlcnIgPCAwKSB7DQ0KICAgIHNu
ZF9wY21fY2xvc2UoaGFuZGxlKTsNDQogICAgc3ByaW50ZihtZXNzYWdlLCAi
UnRBdWRpbzogQUxTQSBoYXJkd2FyZSBwcm9iZSBlcnJvciAoJXMpOiAlcy4i
LA0NCiAgICAgICAgICAgIGluZm8tPm5hbWUsIHNuZF9zdHJlcnJvcihlcnIp
KTsNDQogICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgIGdvdG8g
Y2FwdHVyZV9wcm9iZTsNDQogIH0NDQoNDQogIC8vIEdldCBvdXRwdXQgY2hh
bm5lbCBpbmZvcm1hdGlvbi4NDQogIGluZm8tPm1pbk91dHB1dENoYW5uZWxz
ID0gc25kX3BjbV9od19wYXJhbXNfZ2V0X2NoYW5uZWxzX21pbihwYXJhbXMp
Ow0NCiAgaW5mby0+bWF4T3V0cHV0Q2hhbm5lbHMgPSBzbmRfcGNtX2h3X3Bh
cmFtc19nZXRfY2hhbm5lbHNfbWF4KHBhcmFtcyk7DQ0KDQ0KICBzbmRfcGNt
X2Nsb3NlKGhhbmRsZSk7DQ0KDQ0KIGNhcHR1cmVfcHJvYmU6DQ0KICAvLyBO
b3cgdHJ5IGZvciBjYXB0dXJlDQ0KICBzdHJlYW0gPSBTTkRfUENNX1NUUkVB
TV9DQVBUVVJFOw0NCiAgZXJyID0gc25kX3BjbV9vcGVuKCZoYW5kbGUsIGlu
Zm8tPm5hbWUsIHN0cmVhbSwgb3Blbl9tb2RlKTsNDQogIGlmIChlcnIgPCAw
KSB7DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IEFMU0EgcGNt
IGNhcHR1cmUgb3BlbiAoJXMpOiAlcy4iLA0NCiAgICAgICAgICAgIGluZm8t
Pm5hbWUsIHNuZF9zdHJlcnJvcihlcnIpKTsNDQogICAgZXJyb3IoUnRFcnJv
cjo6V0FSTklORyk7DQ0KICAgIGlmIChpbmZvLT5tYXhPdXRwdXRDaGFubmVs
cyA9PSAwKQ0NCiAgICAgIC8vIGRpZG4ndCBvcGVuIGZvciBwbGF5YmFjayBl
aXRoZXIgLi4uIGRldmljZSBpbnZhbGlkDQ0KICAgICAgcmV0dXJuOw0NCiAg
ICBnb3RvIHByb2JlX3BhcmFtZXRlcnM7DQ0KICB9DQ0KDQ0KICAvLyBXZSBo
YXZlIGFuIG9wZW4gY2FwdHVyZSBkZXZpY2UgLi4uIGFsbG9jYXRlIHRoZSBw
YXJhbWV0ZXIgc3RydWN0dXJlLg0NCiAgZXJyID0gc25kX3BjbV9od19wYXJh
bXNfYW55KGhhbmRsZSwgcGFyYW1zKTsNDQogIGlmIChlcnIgPCAwKSB7DQ0K
ICAgIHNuZF9wY21fY2xvc2UoaGFuZGxlKTsNDQogICAgc3ByaW50ZihtZXNz
YWdlLCAiUnRBdWRpbzogQUxTQSBoYXJkd2FyZSBwcm9iZSBlcnJvciAoJXMp
OiAlcy4iLA0NCiAgICAgICAgICAgIGluZm8tPm5hbWUsIHNuZF9zdHJlcnJv
cihlcnIpKTsNDQogICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAg
IGlmIChpbmZvLT5tYXhPdXRwdXRDaGFubmVscyA+IDApDQ0KICAgICAgZ290
byBwcm9iZV9wYXJhbWV0ZXJzOw0NCiAgICBlbHNlDQ0KICAgICAgcmV0dXJu
Ow0NCiAgfQ0NCg0NCiAgLy8gR2V0IGlucHV0IGNoYW5uZWwgaW5mb3JtYXRp
b24uDQ0KICBpbmZvLT5taW5JbnB1dENoYW5uZWxzID0gc25kX3BjbV9od19w
YXJhbXNfZ2V0X2NoYW5uZWxzX21pbihwYXJhbXMpOw0NCiAgaW5mby0+bWF4
SW5wdXRDaGFubmVscyA9IHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVs
c19tYXgocGFyYW1zKTsNDQoNDQogIC8vIElmIGRldmljZSBvcGVucyBmb3Ig
Ym90aCBwbGF5YmFjayBhbmQgY2FwdHVyZSwgd2UgZGV0ZXJtaW5lIHRoZSBj
aGFubmVscy4NDQogIGlmIChpbmZvLT5tYXhPdXRwdXRDaGFubmVscyA9PSAw
IHx8IGluZm8tPm1heElucHV0Q2hhbm5lbHMgPT0gMCkNDQogICAgZ290byBw
cm9iZV9wYXJhbWV0ZXJzOw0NCg0NCiAgaW5mby0+aGFzRHVwbGV4U3VwcG9y
dCA9IHRydWU7DQ0KICBpbmZvLT5tYXhEdXBsZXhDaGFubmVscyA9IChpbmZv
LT5tYXhPdXRwdXRDaGFubmVscyA+IGluZm8tPm1heElucHV0Q2hhbm5lbHMp
ID8NDQogICAgaW5mby0+bWF4SW5wdXRDaGFubmVscyA6IGluZm8tPm1heE91
dHB1dENoYW5uZWxzOw0NCiAgaW5mby0+bWluRHVwbGV4Q2hhbm5lbHMgPSAo
aW5mby0+bWluT3V0cHV0Q2hhbm5lbHMgPiBpbmZvLT5taW5JbnB1dENoYW5u
ZWxzKSA/DQ0KICAgIGluZm8tPm1pbklucHV0Q2hhbm5lbHMgOiBpbmZvLT5t
aW5PdXRwdXRDaGFubmVsczsNDQoNDQogIHNuZF9wY21fY2xvc2UoaGFuZGxl
KTsNDQoNDQogcHJvYmVfcGFyYW1ldGVyczoNDQogIC8vIEF0IHRoaXMgcG9p
bnQsIHdlIGp1c3QgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBzdXBwb3J0ZWQg
ZGF0YQ0NCiAgLy8gZm9ybWF0cyBhbmQgc2FtcGxlIHJhdGVzLiAgV2UnbGwg
cHJvY2VlZCBieSBvcGVuaW5nIHRoZSBkZXZpY2UgaW4NDQogIC8vIHRoZSBk
aXJlY3Rpb24gd2l0aCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMs
IG9yIHBsYXliYWNrIGlmDQ0KICAvLyB0aGV5IGFyZSBlcXVhbC4gIFRoaXMg
bWlnaHQgbGltaXQgb3VyIHNhbXBsZSByYXRlIG9wdGlvbnMsIGJ1dCBzbw0N
CiAgLy8gYmUgaXQuDQ0KDQ0KICBpZiAoaW5mby0+bWF4T3V0cHV0Q2hhbm5l
bHMgPj0gaW5mby0+bWF4SW5wdXRDaGFubmVscykNDQogICAgc3RyZWFtID0g
U05EX1BDTV9TVFJFQU1fUExBWUJBQ0s7DQ0KICBlbHNlDQ0KICAgIHN0cmVh
bSA9IFNORF9QQ01fU1RSRUFNX0NBUFRVUkU7DQ0KDQ0KICBlcnIgPSBzbmRf
cGNtX29wZW4oJmhhbmRsZSwgaW5mby0+bmFtZSwgc3RyZWFtLCBvcGVuX21v
ZGUpOw0NCiAgaWYgKGVyciA8IDApIHsNDQogICAgc3ByaW50ZihtZXNzYWdl
LCAiUnRBdWRpbzogQUxTQSBwY20gKCVzKSB3b24ndCByZW9wZW4gZHVyaW5n
IHByb2JlOiAlcy4iLA0NCiAgICAgICAgICAgIGluZm8tPm5hbWUsIHNuZF9z
dHJlcnJvcihlcnIpKTsNDQogICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7
DQ0KICAgIHJldHVybjsNDQogIH0NDQoNDQogIC8vIFdlIGhhdmUgYW4gb3Bl
biBkZXZpY2UgLi4uIGFsbG9jYXRlIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJl
Lg0NCiAgZXJyID0gc25kX3BjbV9od19wYXJhbXNfYW55KGhhbmRsZSwgcGFy
YW1zKTsNDQogIGlmIChlcnIgPCAwKSB7DQ0KICAgIHNuZF9wY21fY2xvc2Uo
aGFuZGxlKTsNDQogICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQUxT
QSBoYXJkd2FyZSByZW9wZW4gcHJvYmUgZXJyb3IgKCVzKTogJXMuIiwNDQog
ICAgICAgICAgICBpbmZvLT5uYW1lLCBzbmRfc3RyZXJyb3IoZXJyKSk7DQ0K
ICAgIGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICByZXR1cm47DQ0K
ICB9DQ0KDQ0KICAvLyBUZXN0IGEgbm9uLXN0YW5kYXJkIHNhbXBsZSByYXRl
IHRvIHNlZSBpZiBjb250aW51b3VzIHJhdGUgaXMgc3VwcG9ydGVkLg0NCiAg
aW50IGRpciA9IDA7DQ0KICBpZiAoc25kX3BjbV9od19wYXJhbXNfdGVzdF9y
YXRlKGhhbmRsZSwgcGFyYW1zLCAzNTUwMCwgZGlyKSA9PSAwKSB7DQ0KICAg
IC8vIEl0IGFwcGVhcnMgdGhhdCBjb250aW51b3VzIHNhbXBsZSByYXRlIHN1
cHBvcnQgaXMgYXZhaWxhYmxlLg0NCiAgICBpbmZvLT5uU2FtcGxlUmF0ZXMg
PSAtMTsNDQogICAgaW5mby0+c2FtcGxlUmF0ZXNbMF0gPSBzbmRfcGNtX2h3
X3BhcmFtc19nZXRfcmF0ZV9taW4ocGFyYW1zLCAmZGlyKTsNDQogICAgaW5m
by0+c2FtcGxlUmF0ZXNbMV0gPSBzbmRfcGNtX2h3X3BhcmFtc19nZXRfcmF0
ZV9tYXgocGFyYW1zLCAmZGlyKTsNDQogIH0NDQogIGVsc2Ugew0NCiAgICAv
LyBObyBjb250aW51b3VzIHJhdGUgc3VwcG9ydCAuLi4gdGVzdCBvdXIgZGlz
Y3JldGUgc2V0IG9mIHNhbXBsZSByYXRlIHZhbHVlcy4NDQogICAgaW5mby0+
blNhbXBsZVJhdGVzID0gMDsNDQogICAgZm9yIChpbnQgaT0wOyBpPE1BWF9T
QU1QTEVfUkFURVM7IGkrKykgew0NCiAgICAgIGlmIChzbmRfcGNtX2h3X3Bh
cmFtc190ZXN0X3JhdGUoaGFuZGxlLCBwYXJhbXMsIFNBTVBMRV9SQVRFU1tp
XSwgZGlyKSA9PSAwKSB7DQ0KICAgICAgICBpbmZvLT5zYW1wbGVSYXRlc1tp
bmZvLT5uU2FtcGxlUmF0ZXNdID0gU0FNUExFX1JBVEVTW2ldOw0NCiAgICAg
ICAgaW5mby0+blNhbXBsZVJhdGVzKys7DQ0KICAgICAgfQ0NCiAgICB9DQ0K
ICAgIGlmIChpbmZvLT5uU2FtcGxlUmF0ZXMgPT0gMCkgew0NCiAgICAgIHNu
ZF9wY21fY2xvc2UoaGFuZGxlKTsNDQogICAgICByZXR1cm47DQ0KICAgIH0N
DQogIH0NDQoNDQogIC8vIFByb2JlIHRoZSBzdXBwb3J0ZWQgZGF0YSBmb3Jt
YXRzIC4uLiB3ZSBkb24ndCBjYXJlIGFib3V0IGVuZGlhbi1uZXNzIGp1c3Qg
eWV0DQ0KICBzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdDsNDQogIGluZm8tPm5h
dGl2ZUZvcm1hdHMgPSAwOw0NCiAgZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRf
Uzg7DQ0KICBpZiAoc25kX3BjbV9od19wYXJhbXNfdGVzdF9mb3JtYXQoaGFu
ZGxlLCBwYXJhbXMsIGZvcm1hdCkgPT0gMCkNDQogICAgaW5mby0+bmF0aXZl
Rm9ybWF0cyB8PSBSVEFVRElPX1NJTlQ4Ow0NCiAgZm9ybWF0ID0gU05EX1BD
TV9GT1JNQVRfUzE2Ow0NCiAgaWYgKHNuZF9wY21faHdfcGFyYW1zX3Rlc3Rf
Zm9ybWF0KGhhbmRsZSwgcGFyYW1zLCBmb3JtYXQpID09IDApDQ0KICAgIGlu
Zm8tPm5hdGl2ZUZvcm1hdHMgfD0gUlRBVURJT19TSU5UMTY7DQ0KICBmb3Jt
YXQgPSBTTkRfUENNX0ZPUk1BVF9TMjQ7DQ0KICBpZiAoc25kX3BjbV9od19w
YXJhbXNfdGVzdF9mb3JtYXQoaGFuZGxlLCBwYXJhbXMsIGZvcm1hdCkgPT0g
MCkNDQogICAgaW5mby0+bmF0aXZlRm9ybWF0cyB8PSBSVEFVRElPX1NJTlQy
NDsNDQogIGZvcm1hdCA9IFNORF9QQ01fRk9STUFUX1MzMjsNDQogIGlmIChz
bmRfcGNtX2h3X3BhcmFtc190ZXN0X2Zvcm1hdChoYW5kbGUsIHBhcmFtcywg
Zm9ybWF0KSA9PSAwKQ0NCiAgICBpbmZvLT5uYXRpdmVGb3JtYXRzIHw9IFJU
QVVESU9fU0lOVDMyOw0NCiAgZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRfRkxP
QVQ7DQ0KICBpZiAoc25kX3BjbV9od19wYXJhbXNfdGVzdF9mb3JtYXQoaGFu
ZGxlLCBwYXJhbXMsIGZvcm1hdCkgPT0gMCkNDQogICAgaW5mby0+bmF0aXZl
Rm9ybWF0cyB8PSBSVEFVRElPX0ZMT0FUMzI7DQ0KICBmb3JtYXQgPSBTTkRf
UENNX0ZPUk1BVF9GTE9BVDY0Ow0NCiAgaWYgKHNuZF9wY21faHdfcGFyYW1z
X3Rlc3RfZm9ybWF0KGhhbmRsZSwgcGFyYW1zLCBmb3JtYXQpID09IDApDQ0K
ICAgIGluZm8tPm5hdGl2ZUZvcm1hdHMgfD0gUlRBVURJT19GTE9BVDY0Ow0N
Cg0NCiAgLy8gQ2hlY2sgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBzdXBw
b3J0ZWQgZm9ybWF0DQ0KICBpZiAoaW5mby0+bmF0aXZlRm9ybWF0cyA9PSAw
KSB7DQ0KICAgIHNuZF9wY21fY2xvc2UoaGFuZGxlKTsNDQogICAgc3ByaW50
ZihtZXNzYWdlLCAiUnRBdWRpbzogQUxTQSBQQ00gZGV2aWNlICglcykgZGF0
YSBmb3JtYXQgbm90IHN1cHBvcnRlZCBieSBSdEF1ZGlvLiIsDQ0KICAgICAg
ICAgICAgaW5mby0+bmFtZSk7DQ0KICAgIGVycm9yKFJ0RXJyb3I6OldBUk5J
TkcpOw0NCiAgICByZXR1cm47DQ0KICB9DQ0KDQ0KICAvLyBUaGF0J3MgYWxs
IC4uLiBjbG9zZSB0aGUgZGV2aWNlIGFuZCByZXR1cm4NDQogIHNuZF9wY21f
Y2xvc2UoaGFuZGxlKTsNDQogIGluZm8tPnByb2JlZCA9IHRydWU7DQ0KICBy
ZXR1cm47DQ0KfQ0NCg0NCmJvb2wgUnRBdWRpbyA6OiBwcm9iZURldmljZU9w
ZW4oaW50IGRldmljZSwgUlRBVURJT19TVFJFQU0gKnN0cmVhbSwNDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkVBTV9NT0RFIG1vZGUs
IGludCBjaGFubmVscywgDQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbnQgc2FtcGxlUmF0ZSwgUlRBVURJT19GT1JNQVQgZm9ybWF0LA0N
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpidWZmZXJT
aXplLCBpbnQgbnVtYmVyT2ZCdWZmZXJzKQ0NCnsNDQojaWYgZGVmaW5lZChS
VEFVRElPX0RFQlVHKQ0NCiAgc25kX291dHB1dF90ICpvdXQ7DQ0KICBzbmRf
b3V0cHV0X3N0ZGlvX2F0dGFjaCgmb3V0LCBzdGRlcnIsIDApOw0NCiNlbmRp
Zg0NCg0NCiAgLy8gSSdtIG5vdCB1c2luZyB0aGUgInBsdWciIGludGVyZmFj
ZSAuLi4gdG9vIG11Y2ggaW5jb25zaXN0ZW50IGJlaGF2aW9yLg0NCiAgY29u
c3QgY2hhciAqbmFtZSA9IGRldmljZXNbZGV2aWNlXS5uYW1lOw0NCg0NCiAg
c25kX3BjbV9zdHJlYW1fdCBhbHNhX3N0cmVhbTsNDQogIGlmIChtb2RlID09
IFBMQVlCQUNLKQ0NCiAgICBhbHNhX3N0cmVhbSA9IFNORF9QQ01fU1RSRUFN
X1BMQVlCQUNLOw0NCiAgZWxzZQ0NCiAgICBhbHNhX3N0cmVhbSA9IFNORF9Q
Q01fU1RSRUFNX0NBUFRVUkU7DQ0KDQ0KICBpbnQgZXJyOw0NCiAgc25kX3Bj
bV90ICpoYW5kbGU7DQ0KICBpbnQgYWxzYV9vcGVuX21vZGUgPSBTTkRfUENN
X0FTWU5DOw0NCiAgZXJyID0gc25kX3BjbV9vcGVuKCZoYW5kbGUsIG5hbWUs
IGFsc2Ffc3RyZWFtLCBhbHNhX29wZW5fbW9kZSk7DQ0KICBpZiAoZXJyIDwg
MCkgew0NCiAgICBzcHJpbnRmKG1lc3NhZ2UsIlJ0QXVkaW86IEFMU0EgcGNt
IGRldmljZSAoJXMpIHdvbid0IG9wZW46ICVzLiIsDQ0KICAgICAgICAgICAg
bmFtZSwgc25kX3N0cmVycm9yKGVycikpOw0NCiAgICBlcnJvcihSdEVycm9y
OjpXQVJOSU5HKTsNDQogICAgcmV0dXJuIEZBSUxVUkU7DQ0KICB9DQ0KDQ0K
ICAvLyBGaWxsIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlLg0NCiAgc25kX3Bj
bV9od19wYXJhbXNfdCAqaHdfcGFyYW1zOw0NCiAgc25kX3BjbV9od19wYXJh
bXNfYWxsb2NhKCZod19wYXJhbXMpOw0NCiAgZXJyID0gc25kX3BjbV9od19w
YXJhbXNfYW55KGhhbmRsZSwgaHdfcGFyYW1zKTsNDQogIGlmIChlcnIgPCAw
KSB7DQ0KICAgIHNuZF9wY21fY2xvc2UoaGFuZGxlKTsNDQogICAgc3ByaW50
ZihtZXNzYWdlLCAiUnRBdWRpbzogQUxTQSBlcnJvciBnZXR0aW5nIHBhcmFt
ZXRlciBoYW5kbGUgKCVzKTogJXMuIiwNDQogICAgICAgICAgICBuYW1lLCBz
bmRfc3RyZXJyb3IoZXJyKSk7DQ0KICAgIGVycm9yKFJ0RXJyb3I6OldBUk5J
TkcpOw0NCiAgICByZXR1cm4gRkFJTFVSRTsNDQogIH0NDQoNDQojaWYgZGVm
aW5lZChSVEFVRElPX0RFQlVHKQ0NCiAgZnByaW50ZihzdGRlcnIsICJcblJ0
QXVkaW86IEFMU0EgZHVtcCBoYXJkd2FyZSBwYXJhbXMganVzdCBhZnRlciBk
ZXZpY2Ugb3BlbjpcblxuIik7DQ0KICBzbmRfcGNtX2h3X3BhcmFtc19kdW1w
KGh3X3BhcmFtcywgb3V0KTsNDQojZW5kaWYNDQoNDQogIC8vIFNldCBhY2Nl
c3MgLi4uIHRyeSBpbnRlcmxlYXZlZCBhY2Nlc3MgZmlyc3QsIHRoZW4gbm9u
LWludGVybGVhdmVkDQ0KICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRf
YWNjZXNzKGhhbmRsZSwgaHdfcGFyYW1zLCBTTkRfUENNX0FDQ0VTU19SV19J
TlRFUkxFQVZFRCk7DQ0KICBpZiAoZXJyIDwgMCkgew0NCiAgICAvLyBObyBp
bnRlcmxlYXZlIHN1cHBvcnQgLi4uIHRyeSBub24taW50ZXJsZWF2ZS4NDQoJ
CWVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3MoaGFuZGxlLCBo
d19wYXJhbXMsIFNORF9QQ01fQUNDRVNTX1JXX05PTklOVEVSTEVBVkVEKTsN
DQogICAgaWYgKGVyciA8IDApIHsNDQogICAgICBzbmRfcGNtX2Nsb3NlKGhh
bmRsZSk7DQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQUxT
QSBlcnJvciBzZXR0aW5nIGFjY2VzcyAoICglcyk6ICVzLiIsDQ0KICAgICAg
ICAgICAgICBuYW1lLCBzbmRfc3RyZXJyb3IoZXJyKSk7DQ0KICAgICAgZXJy
b3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAgcmV0dXJuIEZBSUxVUkU7
DQ0KICAgIH0NDQogICAgc3RyZWFtLT5kZUludGVybGVhdmVbbW9kZV0gPSB0
cnVlOw0NCiAgfQ0NCg0NCiAgLy8gRGV0ZXJtaW5lIGhvdyB0byBzZXQgdGhl
IGRldmljZSBmb3JtYXQuDQ0KICBzdHJlYW0tPnVzZXJGb3JtYXQgPSBmb3Jt
YXQ7DQ0KICBzbmRfcGNtX2Zvcm1hdF90IGRldmljZV9mb3JtYXQ7DQ0KDQ0K
ICBpZiAoZm9ybWF0ID09IFJUQVVESU9fU0lOVDgpDQ0KICAgIGRldmljZV9m
b3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9TODsNDQogIGVsc2UgaWYgKGZvcm1h
dCA9PSBSVEFVRElPX1NJTlQxNikNDQogICAgZGV2aWNlX2Zvcm1hdCA9IFNO
RF9QQ01fRk9STUFUX1MxNjsNDQogIGVsc2UgaWYgKGZvcm1hdCA9PSBSVEFV
RElPX1NJTlQyNCkNDQogICAgZGV2aWNlX2Zvcm1hdCA9IFNORF9QQ01fRk9S
TUFUX1MyNDsNDQogIGVsc2UgaWYgKGZvcm1hdCA9PSBSVEFVRElPX1NJTlQz
MikNDQogICAgZGV2aWNlX2Zvcm1hdCA9IFNORF9QQ01fRk9STUFUX1MzMjsN
DQogIGVsc2UgaWYgKGZvcm1hdCA9PSBSVEFVRElPX0ZMT0FUMzIpDQ0KICAg
IGRldmljZV9mb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9GTE9BVDsNDQogIGVs
c2UgaWYgKGZvcm1hdCA9PSBSVEFVRElPX0ZMT0FUNjQpDQ0KICAgIGRldmlj
ZV9mb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9GTE9BVDY0Ow0NCg0NCiAgaWYg
KHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfZm9ybWF0KGhhbmRsZSwgaHdfcGFy
YW1zLCBkZXZpY2VfZm9ybWF0KSA9PSAwKSB7DQ0KICAgIHN0cmVhbS0+ZGV2
aWNlRm9ybWF0W21vZGVdID0gZm9ybWF0Ow0NCiAgICBnb3RvIHNldF9mb3Jt
YXQ7DQ0KICB9DQ0KDQ0KICAvLyBUaGUgdXNlciByZXF1ZXN0ZWQgZm9ybWF0
IGlzIG5vdCBuYXRpdmVseSBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4NDQog
IGRldmljZV9mb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9GTE9BVDY0Ow0NCiAg
aWYgKHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfZm9ybWF0KGhhbmRsZSwgaHdf
cGFyYW1zLCBkZXZpY2VfZm9ybWF0KSA9PSAwKSB7DQ0KICAgIHN0cmVhbS0+
ZGV2aWNlRm9ybWF0W21vZGVdID0gUlRBVURJT19GTE9BVDY0Ow0NCiAgICBn
b3RvIHNldF9mb3JtYXQ7DQ0KICB9DQ0KDQ0KICBkZXZpY2VfZm9ybWF0ID0g
U05EX1BDTV9GT1JNQVRfRkxPQVQ7DQ0KICBpZiAoc25kX3BjbV9od19wYXJh
bXNfdGVzdF9mb3JtYXQoaGFuZGxlLCBod19wYXJhbXMsIGRldmljZV9mb3Jt
YXQpID09IDApIHsNDQogICAgc3RyZWFtLT5kZXZpY2VGb3JtYXRbbW9kZV0g
PSBSVEFVRElPX0ZMT0FUMzI7DQ0KICAgIGdvdG8gc2V0X2Zvcm1hdDsNDQog
IH0NDQoNDQogIGRldmljZV9mb3JtYXQgPSBTTkRfUENNX0ZPUk1BVF9TMzI7
DQ0KICBpZiAoc25kX3BjbV9od19wYXJhbXNfdGVzdF9mb3JtYXQoaGFuZGxl
LCBod19wYXJhbXMsIGRldmljZV9mb3JtYXQpID09IDApIHsNDQogICAgc3Ry
ZWFtLT5kZXZpY2VGb3JtYXRbbW9kZV0gPSBSVEFVRElPX1NJTlQzMjsNDQog
ICAgZ290byBzZXRfZm9ybWF0Ow0NCiAgfQ0NCg0NCiAgZGV2aWNlX2Zvcm1h
dCA9IFNORF9QQ01fRk9STUFUX1MyNDsNDQogIGlmIChzbmRfcGNtX2h3X3Bh
cmFtc190ZXN0X2Zvcm1hdChoYW5kbGUsIGh3X3BhcmFtcywgZGV2aWNlX2Zv
cm1hdCkgPT0gMCkgew0NCiAgICBzdHJlYW0tPmRldmljZUZvcm1hdFttb2Rl
XSA9IFJUQVVESU9fU0lOVDI0Ow0NCiAgICBnb3RvIHNldF9mb3JtYXQ7DQ0K
ICB9DQ0KDQ0KICBkZXZpY2VfZm9ybWF0ID0gU05EX1BDTV9GT1JNQVRfUzE2
Ow0NCiAgaWYgKHNuZF9wY21faHdfcGFyYW1zX3Rlc3RfZm9ybWF0KGhhbmRs
ZSwgaHdfcGFyYW1zLCBkZXZpY2VfZm9ybWF0KSA9PSAwKSB7DQ0KICAgIHN0
cmVhbS0+ZGV2aWNlRm9ybWF0W21vZGVdID0gUlRBVURJT19TSU5UMTY7DQ0K
ICAgIGdvdG8gc2V0X2Zvcm1hdDsNDQogIH0NDQoNDQogIGRldmljZV9mb3Jt
YXQgPSBTTkRfUENNX0ZPUk1BVF9TODsNDQogIGlmIChzbmRfcGNtX2h3X3Bh
cmFtc190ZXN0X2Zvcm1hdChoYW5kbGUsIGh3X3BhcmFtcywgZGV2aWNlX2Zv
cm1hdCkgPT0gMCkgew0NCiAgICBzdHJlYW0tPmRldmljZUZvcm1hdFttb2Rl
XSA9IFJUQVVESU9fU0lOVDg7DQ0KICAgIGdvdG8gc2V0X2Zvcm1hdDsNDQog
IH0NDQoNDQogIC8vIElmIHdlIGdldCBoZXJlLCBubyBzdXBwb3J0ZWQgZm9y
bWF0IHdhcyBmb3VuZC4NDQogIHNwcmludGYobWVzc2FnZSwiUnRBdWRpbzog
QUxTQSBwY20gZGV2aWNlICglcykgZGF0YSBmb3JtYXQgbm90IHN1cHBvcnRl
ZCBieSBSdEF1ZGlvLiIsIG5hbWUpOw0NCiAgc25kX3BjbV9jbG9zZShoYW5k
bGUpOw0NCiAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICByZXR1cm4g
RkFJTFVSRTsNDQoNDQogc2V0X2Zvcm1hdDoNDQogIGVyciA9IHNuZF9wY21f
aHdfcGFyYW1zX3NldF9mb3JtYXQoaGFuZGxlLCBod19wYXJhbXMsIGRldmlj
ZV9mb3JtYXQpOw0NCiAgaWYgKGVyciA8IDApIHsNDQogICAgc25kX3BjbV9j
bG9zZShoYW5kbGUpOw0NCiAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlv
OiBBTFNBIGVycm9yIHNldHRpbmcgZm9ybWF0ICglcyk6ICVzLiIsDQ0KICAg
ICAgICAgICAgbmFtZSwgc25kX3N0cmVycm9yKGVycikpOw0NCiAgICBlcnJv
cihSdEVycm9yOjpXQVJOSU5HKTsNDQogICAgcmV0dXJuIEZBSUxVUkU7DQ0K
ICB9DQ0KDQ0KICAvLyBEZXRlcm1pbmUgd2hldGhlciBieXRlLXN3YXBpbmcg
aXMgbmVjZXNzYXJ5Lg0NCiAgc3RyZWFtLT5kb0J5dGVTd2FwW21vZGVdID0g
ZmFsc2U7DQ0KICBpZiAoZGV2aWNlX2Zvcm1hdCAhPSBTTkRfUENNX0ZPUk1B
VF9TOCkgew0NCiAgICBlcnIgPSBzbmRfcGNtX2Zvcm1hdF9jcHVfZW5kaWFu
KGRldmljZV9mb3JtYXQpOw0NCiAgICBpZiAoZXJyID09IDApDQ0KICAgICAg
c3RyZWFtLT5kb0J5dGVTd2FwW21vZGVdID0gdHJ1ZTsNDQogICAgZWxzZSBp
ZiAoZXJyIDwgMCkgew0NCiAgICAgIHNuZF9wY21fY2xvc2UoaGFuZGxlKTsN
DQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBBTFNBIGVycm9y
IGdldHRpbmcgZm9ybWF0IGVuZGlhbi1uZXNzICglcyk6ICVzLiIsDQ0KICAg
ICAgICAgICAgICBuYW1lLCBzbmRfc3RyZXJyb3IoZXJyKSk7DQ0KICAgICAg
ZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAgcmV0dXJuIEZBSUxV
UkU7DQ0KICAgIH0NDQogIH0NDQoNDQogIC8vIERldGVybWluZSB0aGUgbnVt
YmVyIG9mIGNoYW5uZWxzIGZvciB0aGlzIGRldmljZS4gIFdlIHN1cHBvcnQg
YSBwb3NzaWJsZQ0NCiAgLy8gbWluaW11bSBkZXZpY2UgY2hhbm5lbCBudW1i
ZXIgPiB0aGFuIHRoZSB2YWx1ZSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuDQ0K
ICBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbbW9kZV0gPSBjaGFubmVsczsNDQog
IGludCBkZXZpY2VfY2hhbm5lbHMgPSBzbmRfcGNtX2h3X3BhcmFtc19nZXRf
Y2hhbm5lbHNfbWF4KGh3X3BhcmFtcyk7DQ0KICBpZiAoZGV2aWNlX2NoYW5u
ZWxzIDwgY2hhbm5lbHMpIHsNDQogICAgc25kX3BjbV9jbG9zZShoYW5kbGUp
Ow0NCiAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBjaGFubmVscyAo
JWQpIG5vdCBzdXBwb3J0ZWQgYnkgZGV2aWNlICglcykuIiwNDQogICAgICAg
ICAgICBjaGFubmVscywgbmFtZSk7DQ0KICAgIGVycm9yKFJ0RXJyb3I6OldB
Uk5JTkcpOw0NCiAgICByZXR1cm4gRkFJTFVSRTsNDQogIH0NDQoNDQogIGRl
dmljZV9jaGFubmVscyA9IHNuZF9wY21faHdfcGFyYW1zX2dldF9jaGFubmVs
c19taW4oaHdfcGFyYW1zKTsNDQogIGlmIChkZXZpY2VfY2hhbm5lbHMgPCBj
aGFubmVscykgZGV2aWNlX2NoYW5uZWxzID0gY2hhbm5lbHM7DQ0KICBzdHJl
YW0tPm5EZXZpY2VDaGFubmVsc1ttb2RlXSA9IGRldmljZV9jaGFubmVsczsN
DQoNDQogIC8vIFNldCB0aGUgZGV2aWNlIGNoYW5uZWxzLg0NCiAgZXJyID0g
c25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzKGhhbmRsZSwgaHdfcGFy
YW1zLCBkZXZpY2VfY2hhbm5lbHMpOw0NCiAgaWYgKGVyciA8IDApIHsNDQog
ICAgc25kX3BjbV9jbG9zZShoYW5kbGUpOw0NCiAgICBzcHJpbnRmKG1lc3Nh
Z2UsICJSdEF1ZGlvOiBBTFNBIGVycm9yIHNldHRpbmcgY2hhbm5lbHMgKCVk
KSBvbiBkZXZpY2UgKCVzKTogJXMuIiwNDQogICAgICAgICAgICBkZXZpY2Vf
Y2hhbm5lbHMsIG5hbWUsIHNuZF9zdHJlcnJvcihlcnIpKTsNDQogICAgZXJy
b3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgIHJldHVybiBGQUlMVVJFOw0N
CiAgfQ0NCg0NCiAgLy8gU2V0IHRoZSBzYW1wbGUgcmF0ZS4NDQogIGVyciA9
IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlKGhhbmRsZSwgaHdfcGFyYW1z
LCAodW5zaWduZWQgaW50KXNhbXBsZVJhdGUsIDApOw0NCiAgaWYgKGVyciA8
IDApIHsNDQogICAgc25kX3BjbV9jbG9zZShoYW5kbGUpOw0NCiAgICBzcHJp
bnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBBTFNBIGVycm9yIHNldHRpbmcgc2Ft
cGxlIHJhdGUgKCVkKSBvbiBkZXZpY2UgKCVzKTogJXMuIiwNDQogICAgICAg
ICAgICBzYW1wbGVSYXRlLCBuYW1lLCBzbmRfc3RyZXJyb3IoZXJyKSk7DQ0K
ICAgIGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICByZXR1cm4gRkFJ
TFVSRTsNDQogIH0NDQoNDQogIC8vIFNldCB0aGUgYnVmZmVyIG51bWJlciwg
d2hpY2ggaW4gQUxTQSBpcyByZWZlcnJlZCB0byBhcyB0aGUgInBlcmlvZCIu
DQ0KICBpbnQgZGlyOw0NCiAgaW50IHBlcmlvZHMgPSBudW1iZXJPZkJ1ZmZl
cnM7DQ0KICAvLyBFdmVuIHRob3VnaCB0aGUgaGFyZHdhcmUgbWlnaHQgYWxs
b3cgMSBidWZmZXIsIGl0IHdvbid0IHdvcmsgcmVsaWFibHkuDQ0KICBpZiAo
cGVyaW9kcyA8IDIpIHBlcmlvZHMgPSAyOw0NCiAgZXJyID0gc25kX3BjbV9o
d19wYXJhbXNfZ2V0X3BlcmlvZHNfbWluKGh3X3BhcmFtcywgJmRpcik7DQ0K
ICBpZiAoZXJyID4gcGVyaW9kcykgcGVyaW9kcyA9IGVycjsNDQoNDQogIGVy
ciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RzKGhhbmRsZSwgaHdf
cGFyYW1zLCBwZXJpb2RzLCAwKTsNDQogIGlmIChlcnIgPCAwKSB7DQ0KICAg
IHNuZF9wY21fY2xvc2UoaGFuZGxlKTsNDQogICAgc3ByaW50ZihtZXNzYWdl
LCAiUnRBdWRpbzogQUxTQSBlcnJvciBzZXR0aW5nIHBlcmlvZHMgKCVzKTog
JXMuIiwNDQogICAgICAgICAgICBuYW1lLCBzbmRfc3RyZXJyb3IoZXJyKSk7
DQ0KICAgIGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICByZXR1cm4g
RkFJTFVSRTsNDQogIH0NDQoNDQogIC8vIFNldCB0aGUgYnVmZmVyIChvciBw
ZXJpb2QpIHNpemUuDQ0KICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19nZXRf
cGVyaW9kX3NpemVfbWluKGh3X3BhcmFtcywgJmRpcik7DQ0KICBpZiAoZXJy
ID4gKmJ1ZmZlclNpemUpICpidWZmZXJTaXplID0gZXJyOw0NCg0NCiAgZXJy
ID0gc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplKGhhbmRsZSwg
aHdfcGFyYW1zLCAqYnVmZmVyU2l6ZSwgMCk7DQ0KICBpZiAoZXJyIDwgMCkg
ew0NCiAgICBzbmRfcGNtX2Nsb3NlKGhhbmRsZSk7DQ0KICAgIHNwcmludGYo
bWVzc2FnZSwgIlJ0QXVkaW86IEFMU0EgZXJyb3Igc2V0dGluZyBwZXJpb2Qg
c2l6ZSAoJXMpOiAlcy4iLA0NCiAgICAgICAgICAgIG5hbWUsIHNuZF9zdHJl
cnJvcihlcnIpKTsNDQogICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0K
ICAgIHJldHVybiBGQUlMVVJFOw0NCiAgfQ0NCg0NCiAgc3RyZWFtLT5idWZm
ZXJTaXplID0gKmJ1ZmZlclNpemU7DQ0KDQ0KICAvLyBJbnN0YWxsIHRoZSBo
YXJkd2FyZSBjb25maWd1cmF0aW9uDQ0KICBlcnIgPSBzbmRfcGNtX2h3X3Bh
cmFtcyhoYW5kbGUsIGh3X3BhcmFtcyk7DQ0KICBpZiAoZXJyIDwgMCkgew0N
CiAgICBzbmRfcGNtX2Nsb3NlKGhhbmRsZSk7DQ0KICAgIHNwcmludGYobWVz
c2FnZSwgIlJ0QXVkaW86IEFMU0EgZXJyb3IgaW5zdGFsbGluZyBoYXJkd2Fy
ZSBjb25maWd1cmF0aW9uICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgbmFt
ZSwgc25kX3N0cmVycm9yKGVycikpOw0NCiAgICBlcnJvcihSdEVycm9yOjpX
QVJOSU5HKTsNDQogICAgcmV0dXJuIEZBSUxVUkU7DQ0KICB9DQ0KDQ0KI2lm
IGRlZmluZWQoUlRBVURJT19ERUJVRykNDQogIGZwcmludGYoc3RkZXJyLCAi
XG5SdEF1ZGlvOiBBTFNBIGR1bXAgaGFyZHdhcmUgcGFyYW1zIGFmdGVyIGlu
c3RhbGxhdGlvbjpcblxuIik7DQ0KICBzbmRfcGNtX2h3X3BhcmFtc19kdW1w
KGh3X3BhcmFtcywgb3V0KTsNDQojZW5kaWYNDQoNDQogIC8qDQ0KICAvLyBJ
bnN0YWxsIHRoZSBzb2Z0d2FyZSBjb25maWd1cmF0aW9uDQ0KICBzbmRfcGNt
X3N3X3BhcmFtc190ICpzd19wYXJhbXMgPSBOVUxMOw0NCiAgc25kX3BjbV9z
d19wYXJhbXNfYWxsb2NhKCZzd19wYXJhbXMpOw0NCiAgc25kX3BjbV9zd19w
YXJhbXNfY3VycmVudChoYW5kbGUsIHN3X3BhcmFtcyk7DQ0KICBlcnIgPSBz
bmRfcGNtX3N3X3BhcmFtcyhoYW5kbGUsIHN3X3BhcmFtcyk7DQ0KICBpZiAo
ZXJyIDwgMCkgew0NCiAgICBzbmRfcGNtX2Nsb3NlKGhhbmRsZSk7DQ0KICAg
IHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IEFMU0EgZXJyb3IgaW5zdGFs
bGluZyBzb2Z0d2FyZSBjb25maWd1cmF0aW9uICglcyk6ICVzLiIsDQ0KICAg
ICAgICAgICAgbmFtZSwgc25kX3N0cmVycm9yKGVycikpOw0NCiAgICBlcnJv
cihSdEVycm9yOjpXQVJOSU5HKTsNDQogICAgcmV0dXJuIEZBSUxVUkU7DQ0K
ICB9DQ0KICAqLw0NCg0NCiAgLy8gU2V0IGhhbmRsZSBhbmQgZmxhZ3MgZm9y
IGJ1ZmZlciBjb252ZXJzaW9uDQ0KICBzdHJlYW0tPmhhbmRsZVttb2RlXSA9
IGhhbmRsZTsNDQogIHN0cmVhbS0+ZG9Db252ZXJ0QnVmZmVyW21vZGVdID0g
ZmFsc2U7DQ0KICBpZiAoc3RyZWFtLT51c2VyRm9ybWF0ICE9IHN0cmVhbS0+
ZGV2aWNlRm9ybWF0W21vZGVdKQ0NCiAgICBzdHJlYW0tPmRvQ29udmVydEJ1
ZmZlclttb2RlXSA9IHRydWU7DQ0KICBpZiAoc3RyZWFtLT5uVXNlckNoYW5u
ZWxzW21vZGVdIDwgc3RyZWFtLT5uRGV2aWNlQ2hhbm5lbHNbbW9kZV0pDQ0K
ICAgIHN0cmVhbS0+ZG9Db252ZXJ0QnVmZmVyW21vZGVdID0gdHJ1ZTsNDQog
IGlmIChzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbbW9kZV0gPiAxICYmIHN0cmVh
bS0+ZGVJbnRlcmxlYXZlW21vZGVdKQ0NCiAgICBzdHJlYW0tPmRvQ29udmVy
dEJ1ZmZlclttb2RlXSA9IHRydWU7DQ0KDQ0KICAvLyBBbGxvY2F0ZSBuZWNl
c3NhcnkgaW50ZXJuYWwgYnVmZmVycw0NCiAgaWYgKCBzdHJlYW0tPm5Vc2Vy
Q2hhbm5lbHNbMF0gIT0gc3RyZWFtLT5uVXNlckNoYW5uZWxzWzFdICkgew0N
Cg0NCiAgICBsb25nIGJ1ZmZlcl9ieXRlczsNDQogICAgaWYgKHN0cmVhbS0+
blVzZXJDaGFubmVsc1swXSA+PSBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMV0p
DQ0KICAgICAgYnVmZmVyX2J5dGVzID0gc3RyZWFtLT5uVXNlckNoYW5uZWxz
WzBdOw0NCiAgICBlbHNlDQ0KICAgICAgYnVmZmVyX2J5dGVzID0gc3RyZWFt
LT5uVXNlckNoYW5uZWxzWzFdOw0NCg0NCiAgICBidWZmZXJfYnl0ZXMgKj0g
KmJ1ZmZlclNpemUgKiBmb3JtYXRCeXRlcyhzdHJlYW0tPnVzZXJGb3JtYXQp
Ow0NCiAgICBpZiAoc3RyZWFtLT51c2VyQnVmZmVyKSBmcmVlKHN0cmVhbS0+
dXNlckJ1ZmZlcik7DQ0KICAgIHN0cmVhbS0+dXNlckJ1ZmZlciA9IChjaGFy
ICopIGNhbGxvYyhidWZmZXJfYnl0ZXMsIDEpOw0NCiAgICBpZiAoc3RyZWFt
LT51c2VyQnVmZmVyID09IE5VTEwpDQ0KICAgICAgZ290byBtZW1vcnlfZXJy
b3I7DQ0KICB9DQ0KDQ0KICBpZiAoIHN0cmVhbS0+ZG9Db252ZXJ0QnVmZmVy
W21vZGVdICkgew0NCg0NCiAgICBsb25nIGJ1ZmZlcl9ieXRlczsNDQogICAg
Ym9vbCBtYWtlQnVmZmVyID0gdHJ1ZTsNDQogICAgaWYgKCBtb2RlID09IFBM
QVlCQUNLICkNDQogICAgICBidWZmZXJfYnl0ZXMgPSBzdHJlYW0tPm5EZXZp
Y2VDaGFubmVsc1swXSAqIGZvcm1hdEJ5dGVzKHN0cmVhbS0+ZGV2aWNlRm9y
bWF0WzBdKTsNDQogICAgZWxzZSB7IC8vIG1vZGUgPT0gUkVDT1JEDQ0KICAg
ICAgYnVmZmVyX2J5dGVzID0gc3RyZWFtLT5uRGV2aWNlQ2hhbm5lbHNbMV0g
KiBmb3JtYXRCeXRlcyhzdHJlYW0tPmRldmljZUZvcm1hdFsxXSk7DQ0KICAg
ICAgaWYgKCBzdHJlYW0tPm1vZGUgPT0gUExBWUJBQ0sgKSB7DQ0KICAgICAg
ICBsb25nIGJ5dGVzX291dCA9IHN0cmVhbS0+bkRldmljZUNoYW5uZWxzWzBd
ICogZm9ybWF0Qnl0ZXMoc3RyZWFtLT5kZXZpY2VGb3JtYXRbMF0pOw0NCiAg
ICAgICAgaWYgKCBidWZmZXJfYnl0ZXMgPiBieXRlc19vdXQgKQ0NCiAgICAg
ICAgICBidWZmZXJfYnl0ZXMgPSAoYnVmZmVyX2J5dGVzID4gYnl0ZXNfb3V0
KSA/IGJ1ZmZlcl9ieXRlcyA6IGJ5dGVzX291dDsNDQogICAgICAgIGVsc2UN
DQogICAgICAgICAgbWFrZUJ1ZmZlciA9IGZhbHNlOw0NCiAgICAgIH0NDQog
ICAgfQ0NCg0NCiAgICBpZiAoIG1ha2VCdWZmZXIgKSB7DQ0KICAgICAgYnVm
ZmVyX2J5dGVzICo9ICpidWZmZXJTaXplOw0NCiAgICAgIGlmIChzdHJlYW0t
PmRldmljZUJ1ZmZlcikgZnJlZShzdHJlYW0tPmRldmljZUJ1ZmZlcik7DQ0K
ICAgICAgc3RyZWFtLT5kZXZpY2VCdWZmZXIgPSAoY2hhciAqKSBjYWxsb2Mo
YnVmZmVyX2J5dGVzLCAxKTsNDQogICAgICBpZiAoc3RyZWFtLT5kZXZpY2VC
dWZmZXIgPT0gTlVMTCkNDQogICAgICAgIGdvdG8gbWVtb3J5X2Vycm9yOw0N
CiAgICB9DQ0KICB9DQ0KDQ0KICBzdHJlYW0tPmRldmljZVttb2RlXSA9IGRl
dmljZTsNDQogIHN0cmVhbS0+c3RhdGUgPSBTVFJFQU1fU1RPUFBFRDsNDQog
IGlmICggc3RyZWFtLT5tb2RlID09IFBMQVlCQUNLICYmIG1vZGUgPT0gUkVD
T1JEICkNDQogICAgLy8gV2UgaGFkIGFscmVhZHkgc2V0IHVwIGFuIG91dHB1
dCBzdHJlYW0uDQ0KICAgIHN0cmVhbS0+bW9kZSA9IERVUExFWDsNDQogIGVs
c2UNDQogICAgc3RyZWFtLT5tb2RlID0gbW9kZTsNDQogIHN0cmVhbS0+bkJ1
ZmZlcnMgPSBwZXJpb2RzOw0NCiAgc3RyZWFtLT5zYW1wbGVSYXRlID0gc2Ft
cGxlUmF0ZTsNDQoNDQogIHJldHVybiBTVUNDRVNTOw0NCg0NCiBtZW1vcnlf
ZXJyb3I6DQ0KICBpZiAoc3RyZWFtLT5oYW5kbGVbMF0pIHsNDQogICAgc25k
X3BjbV9jbG9zZShzdHJlYW0tPmhhbmRsZVswXSk7DQ0KICAgIHN0cmVhbS0+
aGFuZGxlWzBdID0gMDsNDQogIH0NDQogIGlmIChzdHJlYW0tPmhhbmRsZVsx
XSkgew0NCiAgICBzbmRfcGNtX2Nsb3NlKHN0cmVhbS0+aGFuZGxlWzFdKTsN
DQogICAgc3RyZWFtLT5oYW5kbGVbMV0gPSAwOw0NCiAgfQ0NCiAgaWYgKHN0
cmVhbS0+dXNlckJ1ZmZlcikgew0NCiAgICBmcmVlKHN0cmVhbS0+dXNlckJ1
ZmZlcik7DQ0KICAgIHN0cmVhbS0+dXNlckJ1ZmZlciA9IDA7DQ0KICB9DQ0K
ICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBBTFNBIGVycm9yIGFsbG9j
YXRpbmcgYnVmZmVyIG1lbW9yeSAoJXMpLiIsIG5hbWUpOw0NCiAgZXJyb3Io
UnRFcnJvcjo6V0FSTklORyk7DQ0KICByZXR1cm4gRkFJTFVSRTsNDQp9DQ0K
DQ0Kdm9pZCBSdEF1ZGlvIDo6IGNhbmNlbFN0cmVhbUNhbGxiYWNrKGludCBz
dHJlYW1JZCkNDQp7DQ0KICBSVEFVRElPX1NUUkVBTSAqc3RyZWFtID0gKFJU
QVVESU9fU1RSRUFNICopIHZlcmlmeVN0cmVhbShzdHJlYW1JZCk7DQ0KDQ0K
ICBpZiAoc3RyZWFtLT51c2luZ0NhbGxiYWNrKSB7DQ0KICAgIHN0cmVhbS0+
dXNpbmdDYWxsYmFjayA9IGZhbHNlOw0NCiAgICBwdGhyZWFkX2NhbmNlbChz
dHJlYW0tPnRocmVhZCk7DQ0KICAgIHB0aHJlYWRfam9pbihzdHJlYW0tPnRo
cmVhZCwgTlVMTCk7DQ0KICAgIHN0cmVhbS0+dGhyZWFkID0gMDsNDQogICAg
c3RyZWFtLT5jYWxsYmFjayA9IE5VTEw7DQ0KICAgIHN0cmVhbS0+dXNlckRh
dGEgPSBOVUxMOw0NCiAgfQ0NCn0NDQoNDQp2b2lkIFJ0QXVkaW8gOjogY2xv
c2VTdHJlYW0oaW50IHN0cmVhbUlkKQ0NCnsNDQogIC8vIFdlIGRvbid0IHdh
bnQgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93biBoZXJlIGJlY2F1c2UgdGhp
cw0NCiAgLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG91ciBjbGFzcyBkZXN0
cnVjdG9yLiAgU28sIGRvIG91ciBvd24NDQogIC8vIHN0cmVhbUlkIGNoZWNr
Lg0NCiAgaWYgKCBzdHJlYW1zLmZpbmQoIHN0cmVhbUlkICkgPT0gc3RyZWFt
cy5lbmQoKSApIHsNDQogICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzog
aW52YWxpZCBzdHJlYW0gaWRlbnRpZmllciEiKTsNDQogICAgZXJyb3IoUnRF
cnJvcjo6V0FSTklORyk7DQ0KICAgIHJldHVybjsNDQogIH0NDQoNDQogIFJU
QVVESU9fU1RSRUFNICpzdHJlYW0gPSAoUlRBVURJT19TVFJFQU0gKikgc3Ry
ZWFtc1tzdHJlYW1JZF07DQ0KDQ0KICBpZiAoc3RyZWFtLT51c2luZ0NhbGxi
YWNrKSB7DQ0KICAgIHB0aHJlYWRfY2FuY2VsKHN0cmVhbS0+dGhyZWFkKTsN
DQogICAgcHRocmVhZF9qb2luKHN0cmVhbS0+dGhyZWFkLCBOVUxMKTsNDQog
IH0NDQoNDQogIGlmIChzdHJlYW0tPnN0YXRlID09IFNUUkVBTV9SVU5OSU5H
KSB7DQ0KICAgIGlmIChzdHJlYW0tPm1vZGUgPT0gUExBWUJBQ0sgfHwgc3Ry
ZWFtLT5tb2RlID09IERVUExFWCkNDQogICAgICBzbmRfcGNtX2Ryb3Aoc3Ry
ZWFtLT5oYW5kbGVbMF0pOw0NCiAgICBpZiAoc3RyZWFtLT5tb2RlID09IFJF
Q09SRCB8fCBzdHJlYW0tPm1vZGUgPT0gRFVQTEVYKQ0NCiAgICAgIHNuZF9w
Y21fZHJvcChzdHJlYW0tPmhhbmRsZVsxXSk7DQ0KICB9DQ0KDQ0KICBwdGhy
ZWFkX211dGV4X2Rlc3Ryb3koJnN0cmVhbS0+bXV0ZXgpOw0NCg0NCiAgaWYg
KHN0cmVhbS0+aGFuZGxlWzBdKQ0NCiAgICBzbmRfcGNtX2Nsb3NlKHN0cmVh
bS0+aGFuZGxlWzBdKTsNDQoNDQogIGlmIChzdHJlYW0tPmhhbmRsZVsxXSkN
DQogICAgc25kX3BjbV9jbG9zZShzdHJlYW0tPmhhbmRsZVsxXSk7DQ0KDQ0K
ICBpZiAoc3RyZWFtLT51c2VyQnVmZmVyKQ0NCiAgICBmcmVlKHN0cmVhbS0+
dXNlckJ1ZmZlcik7DQ0KDQ0KICBpZiAoc3RyZWFtLT5kZXZpY2VCdWZmZXIp
DQ0KICAgIGZyZWUoc3RyZWFtLT5kZXZpY2VCdWZmZXIpOw0NCg0NCiAgZnJl
ZShzdHJlYW0pOw0NCiAgc3RyZWFtcy5lcmFzZShzdHJlYW1JZCk7DQ0KfQ0N
Cg0NCnZvaWQgUnRBdWRpbyA6OiBzdGFydFN0cmVhbShpbnQgc3RyZWFtSWQp
DQ0Kew0NCiAgLy8gVGhpcyBtZXRob2QgY2FsbHMgc25kX3BjbV9wcmVwYXJl
IGlmIHRoZSBkZXZpY2UgaXNuJ3QgYWxyZWFkeSBpbiB0aGF0IHN0YXRlLg0N
Cg0NCiAgUlRBVURJT19TVFJFQU0gKnN0cmVhbSA9IChSVEFVRElPX1NUUkVB
TSAqKSB2ZXJpZnlTdHJlYW0oc3RyZWFtSWQpOw0NCg0NCiAgTVVURVhfTE9D
Sygmc3RyZWFtLT5tdXRleCk7DQ0KDQ0KICBpZiAoc3RyZWFtLT5zdGF0ZSA9
PSBTVFJFQU1fUlVOTklORykNDQogICAgZ290byB1bmxvY2s7DQ0KDQ0KICBp
bnQgZXJyOw0NCiAgc25kX3BjbV9zdGF0ZV90IHN0YXRlOw0NCiAgaWYgKHN0
cmVhbS0+bW9kZSA9PSBQTEFZQkFDSyB8fCBzdHJlYW0tPm1vZGUgPT0gRFVQ
TEVYKSB7DQ0KICAgIHN0YXRlID0gc25kX3BjbV9zdGF0ZShzdHJlYW0tPmhh
bmRsZVswXSk7DQ0KICAgIGlmIChzdGF0ZSAhPSBTTkRfUENNX1NUQVRFX1BS
RVBBUkVEKSB7DQ0KICAgICAgZXJyID0gc25kX3BjbV9wcmVwYXJlKHN0cmVh
bS0+aGFuZGxlWzBdKTsNDQogICAgICBpZiAoZXJyIDwgMCkgew0NCiAgICAg
ICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQUxTQSBlcnJvciBwcmVw
YXJpbmcgcGNtIGRldmljZSAoJXMpOiAlcy4iLA0NCiAgICAgICAgICAgICAg
ICBkZXZpY2VzW3N0cmVhbS0+ZGV2aWNlWzBdXS5uYW1lLCBzbmRfc3RyZXJy
b3IoZXJyKSk7DQ0KICAgICAgICBNVVRFWF9VTkxPQ0soJnN0cmVhbS0+bXV0
ZXgpOw0NCiAgICAgICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVSX0VSUk9SKTsN
DQogICAgICB9DQ0KICAgIH0NDQogIH0NDQoNDQogIGlmIChzdHJlYW0tPm1v
ZGUgPT0gUkVDT1JEIHx8IHN0cmVhbS0+bW9kZSA9PSBEVVBMRVgpIHsNDQog
ICAgc3RhdGUgPSBzbmRfcGNtX3N0YXRlKHN0cmVhbS0+aGFuZGxlWzFdKTsN
DQogICAgaWYgKHN0YXRlICE9IFNORF9QQ01fU1RBVEVfUFJFUEFSRUQpIHsN
DQogICAgICBlcnIgPSBzbmRfcGNtX3ByZXBhcmUoc3RyZWFtLT5oYW5kbGVb
MV0pOw0NCiAgICAgIGlmIChlcnIgPCAwKSB7DQ0KICAgICAgICBzcHJpbnRm
KG1lc3NhZ2UsICJSdEF1ZGlvOiBBTFNBIGVycm9yIHByZXBhcmluZyBwY20g
ZGV2aWNlICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICAgIGRldmljZXNb
c3RyZWFtLT5kZXZpY2VbMV1dLm5hbWUsIHNuZF9zdHJlcnJvcihlcnIpKTsN
DQogICAgICAgIE1VVEVYX1VOTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KICAg
ICAgICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJST1IpOw0NCiAgICAgIH0N
DQogICAgfQ0NCiAgfQ0NCiAgc3RyZWFtLT5zdGF0ZSA9IFNUUkVBTV9SVU5O
SU5HOw0NCg0NCiB1bmxvY2s6DQ0KICBNVVRFWF9VTkxPQ0soJnN0cmVhbS0+
bXV0ZXgpOw0NCn0NDQoNDQp2b2lkIFJ0QXVkaW8gOjogc3RvcFN0cmVhbShp
bnQgc3RyZWFtSWQpDQ0Kew0NCiAgUlRBVURJT19TVFJFQU0gKnN0cmVhbSA9
IChSVEFVRElPX1NUUkVBTSAqKSB2ZXJpZnlTdHJlYW0oc3RyZWFtSWQpOw0N
Cg0NCiAgTVVURVhfTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KDQ0KICBpZiAo
c3RyZWFtLT5zdGF0ZSA9PSBTVFJFQU1fU1RPUFBFRCkNDQogICAgZ290byB1
bmxvY2s7DQ0KDQ0KICBpbnQgZXJyOw0NCiAgaWYgKHN0cmVhbS0+bW9kZSA9
PSBQTEFZQkFDSyB8fCBzdHJlYW0tPm1vZGUgPT0gRFVQTEVYKSB7DQ0KICAg
IGVyciA9IHNuZF9wY21fZHJhaW4oc3RyZWFtLT5oYW5kbGVbMF0pOw0NCiAg
ICBpZiAoZXJyIDwgMCkgew0NCiAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0
QXVkaW86IEFMU0EgZXJyb3IgZHJhaW5pbmcgcGNtIGRldmljZSAoJXMpOiAl
cy4iLA0NCiAgICAgICAgICAgICAgZGV2aWNlc1tzdHJlYW0tPmRldmljZVsw
XV0ubmFtZSwgc25kX3N0cmVycm9yKGVycikpOw0NCiAgICAgIE1VVEVYX1VO
TE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6
RFJJVkVSX0VSUk9SKTsNDQogICAgfQ0NCiAgfQ0NCg0NCiAgaWYgKHN0cmVh
bS0+bW9kZSA9PSBSRUNPUkQgfHwgc3RyZWFtLT5tb2RlID09IERVUExFWCkg
ew0NCiAgICBlcnIgPSBzbmRfcGNtX2RyYWluKHN0cmVhbS0+aGFuZGxlWzFd
KTsNDQogICAgaWYgKGVyciA8IDApIHsNDQogICAgICBzcHJpbnRmKG1lc3Nh
Z2UsICJSdEF1ZGlvOiBBTFNBIGVycm9yIGRyYWluaW5nIHBjbSBkZXZpY2Ug
KCVzKTogJXMuIiwNDQogICAgICAgICAgICAgIGRldmljZXNbc3RyZWFtLT5k
ZXZpY2VbMV1dLm5hbWUsIHNuZF9zdHJlcnJvcihlcnIpKTsNDQogICAgICBN
VVRFWF9VTkxPQ0soJnN0cmVhbS0+bXV0ZXgpOw0NCiAgICAgIGVycm9yKFJ0
RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICAgIH0NDQogIH0NDQogIHN0cmVh
bS0+c3RhdGUgPSBTVFJFQU1fU1RPUFBFRDsNDQoNDQogdW5sb2NrOg0NCiAg
TVVURVhfVU5MT0NLKCZzdHJlYW0tPm11dGV4KTsNDQp9DQ0KDQ0Kdm9pZCBS
dEF1ZGlvIDo6IGFib3J0U3RyZWFtKGludCBzdHJlYW1JZCkNDQp7DQ0KICBS
VEFVRElPX1NUUkVBTSAqc3RyZWFtID0gKFJUQVVESU9fU1RSRUFNICopIHZl
cmlmeVN0cmVhbShzdHJlYW1JZCk7DQ0KDQ0KICBNVVRFWF9MT0NLKCZzdHJl
YW0tPm11dGV4KTsNDQoNDQogIGlmIChzdHJlYW0tPnN0YXRlID09IFNUUkVB
TV9TVE9QUEVEKQ0NCiAgICBnb3RvIHVubG9jazsNDQoNDQogIGludCBlcnI7
DQ0KICBpZiAoc3RyZWFtLT5tb2RlID09IFBMQVlCQUNLIHx8IHN0cmVhbS0+
bW9kZSA9PSBEVVBMRVgpIHsNDQogICAgZXJyID0gc25kX3BjbV9kcm9wKHN0
cmVhbS0+aGFuZGxlWzBdKTsNDQogICAgaWYgKGVyciA8IDApIHsNDQogICAg
ICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBBTFNBIGVycm9yIGRyYWlu
aW5nIHBjbSBkZXZpY2UgKCVzKTogJXMuIiwNDQogICAgICAgICAgICAgIGRl
dmljZXNbc3RyZWFtLT5kZXZpY2VbMF1dLm5hbWUsIHNuZF9zdHJlcnJvcihl
cnIpKTsNDQogICAgICBNVVRFWF9VTkxPQ0soJnN0cmVhbS0+bXV0ZXgpOw0N
CiAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICAgIH0N
DQogIH0NDQoNDQogIGlmIChzdHJlYW0tPm1vZGUgPT0gUkVDT1JEIHx8IHN0
cmVhbS0+bW9kZSA9PSBEVVBMRVgpIHsNDQogICAgZXJyID0gc25kX3BjbV9k
cm9wKHN0cmVhbS0+aGFuZGxlWzFdKTsNDQogICAgaWYgKGVyciA8IDApIHsN
DQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBBTFNBIGVycm9y
IGRyYWluaW5nIHBjbSBkZXZpY2UgKCVzKTogJXMuIiwNDQogICAgICAgICAg
ICAgIGRldmljZXNbc3RyZWFtLT5kZXZpY2VbMV1dLm5hbWUsIHNuZF9zdHJl
cnJvcihlcnIpKTsNDQogICAgICBNVVRFWF9VTkxPQ0soJnN0cmVhbS0+bXV0
ZXgpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0K
ICAgIH0NDQogIH0NDQogIHN0cmVhbS0+c3RhdGUgPSBTVFJFQU1fU1RPUFBF
RDsNDQoNDQogdW5sb2NrOg0NCiAgTVVURVhfVU5MT0NLKCZzdHJlYW0tPm11
dGV4KTsNDQp9DQ0KDQ0KaW50IFJ0QXVkaW8gOjogc3RyZWFtV2lsbEJsb2Nr
KGludCBzdHJlYW1JZCkNDQp7DQ0KICBSVEFVRElPX1NUUkVBTSAqc3RyZWFt
ID0gKFJUQVVESU9fU1RSRUFNICopIHZlcmlmeVN0cmVhbShzdHJlYW1JZCk7
DQ0KDQ0KICBNVVRFWF9MT0NLKCZzdHJlYW0tPm11dGV4KTsNDQoNDQogIGlu
dCBlcnIgPSAwLCBmcmFtZXMgPSAwOw0NCiAgaWYgKHN0cmVhbS0+c3RhdGUg
PT0gU1RSRUFNX1NUT1BQRUQpDQ0KICAgIGdvdG8gdW5sb2NrOw0NCg0NCiAg
aWYgKHN0cmVhbS0+bW9kZSA9PSBQTEFZQkFDSyB8fCBzdHJlYW0tPm1vZGUg
PT0gRFVQTEVYKSB7DQ0KICAgIGVyciA9IHNuZF9wY21fYXZhaWxfdXBkYXRl
KHN0cmVhbS0+aGFuZGxlWzBdKTsNDQogICAgaWYgKGVyciA8IDApIHsNDQog
ICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBBTFNBIGVycm9yIGdl
dHRpbmcgYXZhaWxhYmxlIGZyYW1lcyBmb3IgZGV2aWNlICglcyk6ICVzLiIs
DQ0KICAgICAgICAgICAgICBkZXZpY2VzW3N0cmVhbS0+ZGV2aWNlWzBdXS5u
YW1lLCBzbmRfc3RyZXJyb3IoZXJyKSk7DQ0KICAgICAgTVVURVhfVU5MT0NL
KCZzdHJlYW0tPm11dGV4KTsNDQogICAgICBlcnJvcihSdEVycm9yOjpEUklW
RVJfRVJST1IpOw0NCiAgICB9DQ0KICB9DQ0KDQ0KICBmcmFtZXMgPSBlcnI7
DQ0KDQ0KICBpZiAoc3RyZWFtLT5tb2RlID09IFJFQ09SRCB8fCBzdHJlYW0t
Pm1vZGUgPT0gRFVQTEVYKSB7DQ0KICAgIGVyciA9IHNuZF9wY21fYXZhaWxf
dXBkYXRlKHN0cmVhbS0+aGFuZGxlWzFdKTsNDQogICAgaWYgKGVyciA8IDAp
IHsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBBTFNBIGVy
cm9yIGdldHRpbmcgYXZhaWxhYmxlIGZyYW1lcyBmb3IgZGV2aWNlICglcyk6
ICVzLiIsDQ0KICAgICAgICAgICAgICBkZXZpY2VzW3N0cmVhbS0+ZGV2aWNl
WzFdXS5uYW1lLCBzbmRfc3RyZXJyb3IoZXJyKSk7DQ0KICAgICAgTVVURVhf
VU5MT0NLKCZzdHJlYW0tPm11dGV4KTsNDQogICAgICBlcnJvcihSdEVycm9y
OjpEUklWRVJfRVJST1IpOw0NCiAgICB9DQ0KICAgIGlmIChmcmFtZXMgPiBl
cnIpIGZyYW1lcyA9IGVycjsNDQogIH0NDQoNDQogIGZyYW1lcyA9IHN0cmVh
bS0+YnVmZmVyU2l6ZSAtIGZyYW1lczsNDQogIGlmIChmcmFtZXMgPCAwKSBm
cmFtZXMgPSAwOw0NCg0NCiB1bmxvY2s6DQ0KICBNVVRFWF9VTkxPQ0soJnN0
cmVhbS0+bXV0ZXgpOw0NCiAgcmV0dXJuIGZyYW1lczsNDQp9DQ0KDQ0Kdm9p
ZCBSdEF1ZGlvIDo6IHRpY2tTdHJlYW0oaW50IHN0cmVhbUlkKQ0NCnsNDQog
IFJUQVVESU9fU1RSRUFNICpzdHJlYW0gPSAoUlRBVURJT19TVFJFQU0gKikg
dmVyaWZ5U3RyZWFtKHN0cmVhbUlkKTsNDQoNDQogIGludCBzdG9wU3RyZWFt
ID0gMDsNDQogIGlmIChzdHJlYW0tPnN0YXRlID09IFNUUkVBTV9TVE9QUEVE
KSB7DQ0KICAgIGlmIChzdHJlYW0tPnVzaW5nQ2FsbGJhY2spIHVzbGVlcCg1
MDAwMCk7IC8vIHNsZWVwIDUwIG1pbGxpc2Vjb25kcw0NCiAgICByZXR1cm47
DQ0KICB9DQ0KICBlbHNlIGlmIChzdHJlYW0tPnVzaW5nQ2FsbGJhY2spIHsN
DQogICAgc3RvcFN0cmVhbSA9IHN0cmVhbS0+Y2FsbGJhY2soc3RyZWFtLT51
c2VyQnVmZmVyLCBzdHJlYW0tPmJ1ZmZlclNpemUsIHN0cmVhbS0+dXNlckRh
dGEpOw0NCiAgfQ0NCg0NCiAgTVVURVhfTE9DSygmc3RyZWFtLT5tdXRleCk7
DQ0KDQ0KICAvLyBUaGUgc3RhdGUgbWlnaHQgY2hhbmdlIHdoaWxlIHdhaXRp
bmcgb24gYSBtdXRleC4NDQogIGlmIChzdHJlYW0tPnN0YXRlID09IFNUUkVB
TV9TVE9QUEVEKQ0NCiAgICBnb3RvIHVubG9jazsNDQoNDQogIGludCBlcnI7
DQ0KICBjaGFyICpidWZmZXI7DQ0KICBpbnQgY2hhbm5lbHM7DQ0KICBSVEFV
RElPX0ZPUk1BVCBmb3JtYXQ7DQ0KICBpZiAoc3RyZWFtLT5tb2RlID09IFBM
QVlCQUNLIHx8IHN0cmVhbS0+bW9kZSA9PSBEVVBMRVgpIHsNDQoNDQogICAg
Ly8gU2V0dXAgcGFyYW1ldGVycyBhbmQgZG8gYnVmZmVyIGNvbnZlcnNpb24g
aWYgbmVjZXNzYXJ5Lg0NCiAgICBpZiAoc3RyZWFtLT5kb0NvbnZlcnRCdWZm
ZXJbMF0pIHsNDQogICAgICBjb252ZXJ0U3RyZWFtQnVmZmVyKHN0cmVhbSwg
UExBWUJBQ0spOw0NCiAgICAgIGJ1ZmZlciA9IHN0cmVhbS0+ZGV2aWNlQnVm
ZmVyOw0NCiAgICAgIGNoYW5uZWxzID0gc3RyZWFtLT5uRGV2aWNlQ2hhbm5l
bHNbMF07DQ0KICAgICAgZm9ybWF0ID0gc3RyZWFtLT5kZXZpY2VGb3JtYXRb
MF07DQ0KICAgIH0NDQogICAgZWxzZSB7DQ0KICAgICAgYnVmZmVyID0gc3Ry
ZWFtLT51c2VyQnVmZmVyOw0NCiAgICAgIGNoYW5uZWxzID0gc3RyZWFtLT5u
VXNlckNoYW5uZWxzWzBdOw0NCiAgICAgIGZvcm1hdCA9IHN0cmVhbS0+dXNl
ckZvcm1hdDsNDQogICAgfQ0NCg0NCiAgICAvLyBEbyBieXRlIHN3YXBwaW5n
IGlmIG5lY2Vzc2FyeS4NDQogICAgaWYgKHN0cmVhbS0+ZG9CeXRlU3dhcFsw
XSkNDQogICAgICBieXRlU3dhcEJ1ZmZlcihidWZmZXIsIHN0cmVhbS0+YnVm
ZmVyU2l6ZSAqIGNoYW5uZWxzLCBmb3JtYXQpOw0NCg0NCiAgICAvLyBXcml0
ZSBzYW1wbGVzIHRvIGRldmljZSBpbiBpbnRlcmxlYXZlZC9ub24taW50ZXJs
ZWF2ZWQgZm9ybWF0Lg0NCiAgICBpZiAoc3RyZWFtLT5kZUludGVybGVhdmVb
MF0pIHsNDQogICAgICB2b2lkICpidWZzW2NoYW5uZWxzXTsNDQogICAgICBz
aXplX3Qgb2Zmc2V0ID0gc3RyZWFtLT5idWZmZXJTaXplICogZm9ybWF0Qnl0
ZXMoZm9ybWF0KTsNDQogICAgICBmb3IgKGludCBpPTA7IGk8Y2hhbm5lbHM7
IGkrKykNDQogICAgICAgIGJ1ZnNbaV0gPSAodm9pZCAqKSAoYnVmZmVyICsg
KGkgKiBvZmZzZXQpKTsNDQogICAgICBlcnIgPSBzbmRfcGNtX3dyaXRlbihz
dHJlYW0tPmhhbmRsZVswXSwgYnVmcywgc3RyZWFtLT5idWZmZXJTaXplKTsN
DQogICAgfQ0NCiAgICBlbHNlDQ0KICAgICAgZXJyID0gc25kX3BjbV93cml0
ZWkoc3RyZWFtLT5oYW5kbGVbMF0sIGJ1ZmZlciwgc3RyZWFtLT5idWZmZXJT
aXplKTsNDQoNDQogICAgaWYgKGVyciA8IHN0cmVhbS0+YnVmZmVyU2l6ZSkg
ew0NCiAgICAgIC8vIEVpdGhlciBhbiBlcnJvciBvciB1bmRlcnJ1biBvY2N1
cmVkLg0NCiAgICAgIGlmIChlcnIgPT0gLUVQSVBFKSB7DQ0KICAgICAgICBz
bmRfcGNtX3N0YXRlX3Qgc3RhdGUgPSBzbmRfcGNtX3N0YXRlKHN0cmVhbS0+
aGFuZGxlWzBdKTsNDQogICAgICAgIGlmIChzdGF0ZSA9PSBTTkRfUENNX1NU
QVRFX1hSVU4pIHsNDQogICAgICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRB
dWRpbzogQUxTQSB1bmRlcnJ1biBkZXRlY3RlZC4iKTsNDQogICAgICAgICAg
ZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAgICAgIGVyciA9IHNu
ZF9wY21fcHJlcGFyZShzdHJlYW0tPmhhbmRsZVswXSk7DQ0KICAgICAgICAg
IGlmIChlcnIgPCAwKSB7DQ0KICAgICAgICAgICAgc3ByaW50ZihtZXNzYWdl
LCAiUnRBdWRpbzogQUxTQSBlcnJvciBwcmVwYXJpbmcgaGFuZGxlIGFmdGVy
IHVuZGVycnVuOiAlcy4iLA0NCiAgICAgICAgICAgICAgICAgICAgc25kX3N0
cmVycm9yKGVycikpOw0NCiAgICAgICAgICAgIE1VVEVYX1VOTE9DSygmc3Ry
ZWFtLT5tdXRleCk7DQ0KICAgICAgICAgICAgZXJyb3IoUnRFcnJvcjo6RFJJ
VkVSX0VSUk9SKTsNDQogICAgICAgICAgfQ0NCiAgICAgICAgfQ0NCiAgICAg
ICAgZWxzZSB7DQ0KICAgICAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVk
aW86IEFMU0EgZXJyb3IsIGN1cnJlbnQgc3RhdGUgaXMgJXMuIiwNDQogICAg
ICAgICAgICAgICAgICBzbmRfcGNtX3N0YXRlX25hbWUoc3RhdGUpKTsNDQog
ICAgICAgICAgTVVURVhfVU5MT0NLKCZzdHJlYW0tPm11dGV4KTsNDQogICAg
ICAgICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVSX0VSUk9SKTsNDQogICAgICAg
IH0NDQogICAgICAgIGdvdG8gdW5sb2NrOw0NCiAgICAgIH0NDQogICAgICBl
bHNlIHsNDQogICAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IEFM
U0EgYXVkaW8gd3JpdGUgZXJyb3IgZm9yIGRldmljZSAoJXMpOiAlcy4iLA0N
CiAgICAgICAgICAgICAgICBkZXZpY2VzW3N0cmVhbS0+ZGV2aWNlWzBdXS5u
YW1lLCBzbmRfc3RyZXJyb3IoZXJyKSk7DQ0KICAgICAgICBNVVRFWF9VTkxP
Q0soJnN0cmVhbS0+bXV0ZXgpOw0NCiAgICAgICAgZXJyb3IoUnRFcnJvcjo6
RFJJVkVSX0VSUk9SKTsNDQogICAgICB9DQ0KICAgIH0NDQogIH0NDQoNDQog
IGlmIChzdHJlYW0tPm1vZGUgPT0gUkVDT1JEIHx8IHN0cmVhbS0+bW9kZSA9
PSBEVVBMRVgpIHsNDQoNDQogICAgLy8gU2V0dXAgcGFyYW1ldGVycy4NDQog
ICAgaWYgKHN0cmVhbS0+ZG9Db252ZXJ0QnVmZmVyWzFdKSB7DQ0KICAgICAg
YnVmZmVyID0gc3RyZWFtLT5kZXZpY2VCdWZmZXI7DQ0KICAgICAgY2hhbm5l
bHMgPSBzdHJlYW0tPm5EZXZpY2VDaGFubmVsc1sxXTsNDQogICAgICBmb3Jt
YXQgPSBzdHJlYW0tPmRldmljZUZvcm1hdFsxXTsNDQogICAgfQ0NCiAgICBl
bHNlIHsNDQogICAgICBidWZmZXIgPSBzdHJlYW0tPnVzZXJCdWZmZXI7DQ0K
ICAgICAgY2hhbm5lbHMgPSBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMV07DQ0K
ICAgICAgZm9ybWF0ID0gc3RyZWFtLT51c2VyRm9ybWF0Ow0NCiAgICB9DQ0K
DQ0KICAgIC8vIFJlYWQgc2FtcGxlcyBmcm9tIGRldmljZSBpbiBpbnRlcmxl
YXZlZC9ub24taW50ZXJsZWF2ZWQgZm9ybWF0Lg0NCiAgICBpZiAoc3RyZWFt
LT5kZUludGVybGVhdmVbMV0pIHsNDQogICAgICB2b2lkICpidWZzW2NoYW5u
ZWxzXTsNDQogICAgICBzaXplX3Qgb2Zmc2V0ID0gc3RyZWFtLT5idWZmZXJT
aXplICogZm9ybWF0Qnl0ZXMoZm9ybWF0KTsNDQogICAgICBmb3IgKGludCBp
PTA7IGk8Y2hhbm5lbHM7IGkrKykNDQogICAgICAgIGJ1ZnNbaV0gPSAodm9p
ZCAqKSAoYnVmZmVyICsgKGkgKiBvZmZzZXQpKTsNDQogICAgICBlcnIgPSBz
bmRfcGNtX3JlYWRuKHN0cmVhbS0+aGFuZGxlWzFdLCBidWZzLCBzdHJlYW0t
PmJ1ZmZlclNpemUpOw0NCiAgICB9DQ0KICAgIGVsc2UNDQogICAgICBlcnIg
PSBzbmRfcGNtX3JlYWRpKHN0cmVhbS0+aGFuZGxlWzFdLCBidWZmZXIsIHN0
cmVhbS0+YnVmZmVyU2l6ZSk7DQ0KDQ0KICAgIGlmIChlcnIgPCBzdHJlYW0t
PmJ1ZmZlclNpemUpIHsNDQogICAgICAvLyBFaXRoZXIgYW4gZXJyb3Igb3Ig
dW5kZXJydW4gb2NjdXJlZC4NDQogICAgICBpZiAoZXJyID09IC1FUElQRSkg
ew0NCiAgICAgICAgc25kX3BjbV9zdGF0ZV90IHN0YXRlID0gc25kX3BjbV9z
dGF0ZShzdHJlYW0tPmhhbmRsZVsxXSk7DQ0KICAgICAgICBpZiAoc3RhdGUg
PT0gU05EX1BDTV9TVEFURV9YUlVOKSB7DQ0KICAgICAgICAgIHNwcmludGYo
bWVzc2FnZSwgIlJ0QXVkaW86IEFMU0Egb3ZlcnJ1biBkZXRlY3RlZC4iKTsN
DQogICAgICAgICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAg
ICAgIGVyciA9IHNuZF9wY21fcHJlcGFyZShzdHJlYW0tPmhhbmRsZVsxXSk7
DQ0KICAgICAgICAgIGlmIChlcnIgPCAwKSB7DQ0KICAgICAgICAgICAgc3By
aW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQUxTQSBlcnJvciBwcmVwYXJpbmcg
aGFuZGxlIGFmdGVyIG92ZXJydW46ICVzLiIsDQ0KICAgICAgICAgICAgICAg
ICAgICBzbmRfc3RyZXJyb3IoZXJyKSk7DQ0KICAgICAgICAgICAgTVVURVhf
VU5MT0NLKCZzdHJlYW0tPm11dGV4KTsNDQogICAgICAgICAgICBlcnJvcihS
dEVycm9yOjpEUklWRVJfRVJST1IpOw0NCiAgICAgICAgICB9DQ0KICAgICAg
ICB9DQ0KICAgICAgICBlbHNlIHsNDQogICAgICAgICAgc3ByaW50ZihtZXNz
YWdlLCAiUnRBdWRpbzogQUxTQSBlcnJvciwgY3VycmVudCBzdGF0ZSBpcyAl
cy4iLA0NCiAgICAgICAgICAgICAgICAgIHNuZF9wY21fc3RhdGVfbmFtZShz
dGF0ZSkpOw0NCiAgICAgICAgICBNVVRFWF9VTkxPQ0soJnN0cmVhbS0+bXV0
ZXgpOw0NCiAgICAgICAgICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJST1Ip
Ow0NCiAgICAgICAgfQ0NCiAgICAgICAgZ290byB1bmxvY2s7DQ0KICAgICAg
fQ0NCiAgICAgIGVsc2Ugew0NCiAgICAgICAgc3ByaW50ZihtZXNzYWdlLCAi
UnRBdWRpbzogQUxTQSBhdWRpbyByZWFkIGVycm9yIGZvciBkZXZpY2UgKCVz
KTogJXMuIiwNDQogICAgICAgICAgICAgICAgZGV2aWNlc1tzdHJlYW0tPmRl
dmljZVsxXV0ubmFtZSwgc25kX3N0cmVycm9yKGVycikpOw0NCiAgICAgICAg
TVVURVhfVU5MT0NLKCZzdHJlYW0tPm11dGV4KTsNDQogICAgICAgIGVycm9y
KFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICAgICAgfQ0NCiAgICB9DQ0K
DQ0KICAgIC8vIERvIGJ5dGUgc3dhcHBpbmcgaWYgbmVjZXNzYXJ5Lg0NCiAg
ICBpZiAoc3RyZWFtLT5kb0J5dGVTd2FwWzFdKQ0NCiAgICAgIGJ5dGVTd2Fw
QnVmZmVyKGJ1ZmZlciwgc3RyZWFtLT5idWZmZXJTaXplICogY2hhbm5lbHMs
IGZvcm1hdCk7DQ0KDQ0KICAgIC8vIERvIGJ1ZmZlciBjb252ZXJzaW9uIGlm
IG5lY2Vzc2FyeS4NDQogICAgaWYgKHN0cmVhbS0+ZG9Db252ZXJ0QnVmZmVy
WzFdKQ0NCiAgICAgIGNvbnZlcnRTdHJlYW1CdWZmZXIoc3RyZWFtLCBSRUNP
UkQpOw0NCiAgfQ0NCg0NCiB1bmxvY2s6DQ0KICBNVVRFWF9VTkxPQ0soJnN0
cmVhbS0+bXV0ZXgpOw0NCg0NCiAgaWYgKHN0cmVhbS0+dXNpbmdDYWxsYmFj
ayAmJiBzdG9wU3RyZWFtKQ0NCiAgICB0aGlzLT5zdG9wU3RyZWFtKHN0cmVh
bUlkKTsNDQp9DQ0KDQ0KZXh0ZXJuICJDIiB2b2lkICpjYWxsYmFja0hhbmRs
ZXIodm9pZCAqcHRyKQ0NCnsNDQogIFJ0QXVkaW8gKm9iamVjdCA9IHRocmVh
ZF9pbmZvLm9iamVjdDsNDQogIGludCBzdHJlYW0gPSB0aHJlYWRfaW5mby5z
dHJlYW1JZDsNDQogIGJvb2wgKnVzaW5nQ2FsbGJhY2sgPSAoYm9vbCAqKSBw
dHI7DQ0KDQ0KICB3aGlsZSAoICp1c2luZ0NhbGxiYWNrICkgew0NCiAgICBw
dGhyZWFkX3Rlc3RjYW5jZWwoKTsNDQogICAgdHJ5IHsNDQogICAgICBvYmpl
Y3QtPnRpY2tTdHJlYW0oc3RyZWFtKTsNDQogICAgfQ0NCiAgICBjYXRjaCAo
UnRFcnJvciAmZXhjZXB0aW9uKSB7DQ0KICAgICAgZnByaW50ZihzdGRlcnIs
ICJcbkNhbGxiYWNrIHRocmVhZCBlcnJvciAoJXMpIC4uLiBjbG9zaW5nIHRo
cmVhZC5cblxuIiwNDQogICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNz
YWdlKCkpOw0NCiAgICAgIGJyZWFrOw0NCiAgICB9DQ0KICB9DQ0KDQ0KICBy
ZXR1cm4gMDsNDQp9DQ0KDQ0KLy8qKioqKioqKioqKioqKioqKioqKiBFbmQg
b2YgX19MSU5VWF9BTFNBX18gKioqKioqKioqKioqKioqKioqKioqLy8NDQoN
DQojZWxpZiBkZWZpbmVkKF9fTElOVVhfT1NTX18pDQ0KDQ0KI2luY2x1ZGUg
PHN5cy9zdGF0Lmg+DQ0KI2luY2x1ZGUgPHN5cy90eXBlcy5oPg0NCiNpbmNs
dWRlIDxzeXMvaW9jdGwuaD4NDQojaW5jbHVkZSA8dW5pc3RkLmg+DQ0KI2lu
Y2x1ZGUgPGZjbnRsLmg+DQ0KI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4N
DQojaW5jbHVkZSA8ZXJybm8uaD4NDQojaW5jbHVkZSA8bWF0aC5oPg0NCg0N
CiNkZWZpbmUgREFDX05BTUUgIi9kZXYvZHNwIg0NCiNkZWZpbmUgTUFYX0RF
VklDRVMgMTYNDQojZGVmaW5lIE1BWF9DSEFOTkVMUyAxNg0NCg0NCnZvaWQg
UnRBdWRpbyA6OiBpbml0aWFsaXplKHZvaWQpDQ0Kew0NCiAgLy8gQ291bnQg
Y2FyZHMgYW5kIGRldmljZXMNDQogIG5EZXZpY2VzID0gMDsNDQoNDQogIC8v
IFdlIGNoZWNrIC9kZXYvZHNwIGJlZm9yZSBwcm9iaW5nIGRldmljZXMuICAv
ZGV2L2RzcCBpcyBzdXBwb3NlZCB0bw0NCiAgLy8gYmUgYSBsaW5rIHRvIHRo
ZSAiZGVmYXVsdCIgYXVkaW8gZGV2aWNlLCBvZiB0aGUgZm9ybSAvZGV2L2Rz
cDAsDQ0KICAvLyAvZGV2L2RzcDEsIGV0Yy4uLiAgSG93ZXZlciwgSSd2ZSBz
ZWVuIG9uZSBjYXNlIHdoZXJlIC9kZXYvZHNwIHdhcyBhDQ0KICAvLyByZWFs
IGRldmljZSwgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgdGhhdC4gIEFsc28s
IHNvbWV0aW1lcyB0aGUNDQogIC8vIGxpbmsgaXMgdG8gL2Rldi9kc3B4IGFu
ZCBvdGhlciB0aW1lcyBqdXN0IGRzcHguICBJJ20gbm90IHN1cmUgaG93DQ0K
ICAvLyB0aGUgbGF0dGVyIHdvcmtzLCBidXQgaXQgZG9lcy4NDQogIGNoYXIg
ZGV2aWNlX25hbWVbMTZdOw0NCiAgc3RydWN0IHN0YXQgZHNwc3RhdDsNDQog
IGludCBkc3BsaW5rID0gLTE7DQ0KICBpbnQgaSA9IDA7DQ0KICBpZiAobHN0
YXQoREFDX05BTUUsICZkc3BzdGF0KSA9PSAwKSB7DQ0KICAgIGlmIChTX0lT
TE5LKGRzcHN0YXQuc3RfbW9kZSkpIHsNDQogICAgICBpID0gcmVhZGxpbmso
REFDX05BTUUsIGRldmljZV9uYW1lLCBzaXplb2YoZGV2aWNlX25hbWUpKTsN
DQogICAgICBpZiAoaSA+IDApIHsNDQogICAgICAgIGRldmljZV9uYW1lW2ld
ID0gJ1wwJzsNDQogICAgICAgIGlmIChpID4gOCkgeyAvLyBjaGVjayBmb3Ig
Ii9kZXYvZHNweCINDQogICAgICAgICAgaWYgKCFzdHJuY21wKERBQ19OQU1F
LCBkZXZpY2VfbmFtZSwgOCkpDQ0KICAgICAgICAgICAgZHNwbGluayA9IGF0
b2koJmRldmljZV9uYW1lWzhdKTsNDQogICAgICAgIH0NDQogICAgICAgIGVs
c2UgaWYgKGkgPiAzKSB7IC8vIGNoZWNrIGZvciAiZHNweCINDQogICAgICAg
ICAgaWYgKCFzdHJuY21wKCJkc3AiLCBkZXZpY2VfbmFtZSwgMykpDQ0KICAg
ICAgICAgICAgZHNwbGluayA9IGF0b2koJmRldmljZV9uYW1lWzNdKTsNDQog
ICAgICAgIH0NDQogICAgICB9DQ0KICAgICAgZWxzZSB7DQ0KICAgICAgICBz
cHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBjYW5ub3QgcmVhZCB2YWx1ZSBv
ZiBzeW1ib2xpYyBsaW5rICVzLiIsIERBQ19OQU1FKTsNDQogICAgICAgIGVy
cm9yKFJ0RXJyb3I6OlNZU1RFTV9FUlJPUik7DQ0KICAgICAgfQ0NCiAgICB9
DQ0KICB9DQ0KICBlbHNlIHsNDQogICAgc3ByaW50ZihtZXNzYWdlLCAiUnRB
dWRpbzogY2Fubm90IHN0YXQgJXMuIiwgREFDX05BTUUpOw0NCiAgICBlcnJv
cihSdEVycm9yOjpTWVNURU1fRVJST1IpOw0NCiAgfQ0NCg0NCiAgLy8gVGhl
IE9TUyBBUEkgZG9lc24ndCBwcm92aWRlIGEgcm91dGluZSBmb3IgZGV0ZXJt
aW5pbmcgdGhlIG51bWJlcg0NCiAgLy8gb2YgZGV2aWNlcy4gIFRodXMsIHdl
J2xsIGp1c3QgcHVyc3VlIGEgYnJ1dGUgZm9yY2UgbWV0aG9kLiAgVGhlDQ0K
ICAvLyBpZGVhIGlzIHRvIHN0YXJ0IHdpdGggL2Rldi9kc3AoMCkgYW5kIGNv
bnRpbnVlIHdpdGggaGlnaGVyIGRldmljZQ0NCiAgLy8gbnVtYmVycyB1bnRp
bCB3ZSByZWFjaCBNQVhfRFNQX0RFVklDRVMuICBUaGlzIHNob3VsZCB0ZWxs
IHVzIGhvdw0NCiAgLy8gbWFueSBkZXZpY2VzIHdlIGhhdmUgLi4uIGl0IGlz
IG5vdCBhIGZ1bGxwcm9vZiBzY2hlbWUsIGJ1dCBob3BlZnVsbHkNDQogIC8v
IGl0IHdpbGwgd29yayBtb3N0IG9mIHRoZSB0aW1lLg0NCg0NCiAgaW50IGZk
ID0gMDsNDQogIGNoYXIgbmFtZXNbTUFYX0RFVklDRVNdWzE2XTsNDQogIGZv
ciAoaT0tMTsgaTxNQVhfREVWSUNFUzsgaSsrKSB7DQ0KDQ0KICAgIC8vIFBy
b2JlIC9kZXYvZHNwIGZpcnN0LCBzaW5jZSBpdCBpcyBzdXBwb3NlZCB0byBi
ZSB0aGUgZGVmYXVsdCBkZXZpY2UuDQ0KICAgIGlmIChpID09IC0xKQ0NCiAg
ICAgIHNwcmludGYoZGV2aWNlX25hbWUsICIlcyIsIERBQ19OQU1FKTsNDQog
ICAgZWxzZSBpZiAoaSA9PSBkc3BsaW5rKQ0NCiAgICAgIGNvbnRpbnVlOyAv
LyBXZSd2ZSBhcmVhZHkgcHJvYmVkIHRoaXMgZGV2aWNlIHZpYSAvZGV2L2Rz
cCBsaW5rIC4uLiB0cnkgbmV4dCBkZXZpY2UuDQ0KICAgIGVsc2UNDQogICAg
ICBzcHJpbnRmKGRldmljZV9uYW1lLCAiJXMlZCIsIERBQ19OQU1FLCBpKTsN
DQoNDQogICAgLy8gRmlyc3QgdHJ5IHRvIG9wZW4gdGhlIGRldmljZSBmb3Ig
cGxheWJhY2ssIHRoZW4gcmVjb3JkIG1vZGUuDQ0KICAgIGZkID0gb3Blbihk
ZXZpY2VfbmFtZSwgT19XUk9OTFkgfCBPX05PTkJMT0NLKTsNDQogICAgaWYg
KGZkID09IC0xKSB7DQ0KICAgICAgLy8gT3BlbiBkZXZpY2UgZm9yIHBsYXli
YWNrIGZhaWxlZCAuLi4gZWl0aGVyIGJ1c3kgb3IgZG9lc24ndCBleGlzdC4N
DQogICAgICBpZiAoZXJybm8gIT0gRUJVU1kgJiYgZXJybm8gIT0gRUFHQUlO
KSB7DQ0KICAgICAgICAvLyBUcnkgdG8gb3BlbiBmb3IgY2FwdHVyZQ0NCiAg
ICAgICAgZmQgPSBvcGVuKGRldmljZV9uYW1lLCBPX1JET05MWSB8IE9fTk9O
QkxPQ0spOw0NCiAgICAgICAgaWYgKGZkID09IC0xKSB7DQ0KICAgICAgICAg
IC8vIE9wZW4gZGV2aWNlIGZvciByZWNvcmQgZmFpbGVkLg0NCiAgICAgICAg
ICBpZiAoZXJybm8gIT0gRUJVU1kgJiYgZXJybm8gIT0gRUFHQUlOKQ0NCiAg
ICAgICAgICAgIGNvbnRpbnVlOw0NCiAgICAgICAgICBlbHNlIHsNDQogICAg
ICAgICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBPU1MgcmVjb3Jk
IGRldmljZSAoJXMpIGlzIGJ1c3kuIiwgZGV2aWNlX25hbWUpOw0NCiAgICAg
ICAgICAgIGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICAgICAgICAg
IC8vIHN0aWxsIGNvdW50IGl0IGZvciBub3cNDQogICAgICAgICAgfQ0NCiAg
ICAgICAgfQ0NCiAgICAgIH0NDQogICAgICBlbHNlIHsNDQogICAgICAgIHNw
cmludGYobWVzc2FnZSwgIlJ0QXVkaW86IE9TUyBwbGF5YmFjayBkZXZpY2Ug
KCVzKSBpcyBidXN5LiIsIGRldmljZV9uYW1lKTsNDQogICAgICAgIGVycm9y
KFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICAgICAgLy8gc3RpbGwgY291bnQg
aXQgZm9yIG5vdw0NCiAgICAgIH0NDQogICAgfQ0NCg0NCiAgICBpZiAoZmQg
Pj0gMCkgY2xvc2UoZmQpOw0NCiAgICBzdHJuY3B5KG5hbWVzW25EZXZpY2Vz
XSwgZGV2aWNlX25hbWUsIDE2KTsNDQogICAgbkRldmljZXMrKzsNDQogIH0N
DQoNDQogIGlmIChuRGV2aWNlcyA9PSAwKSByZXR1cm47DQ0KDQ0KICAvLyAg
QWxsb2NhdGUgdGhlIFJUQVVESU9fREVWSUNFIHN0cnVjdHVyZXMuDQ0KICBk
ZXZpY2VzID0gKFJUQVVESU9fREVWSUNFICopIGNhbGxvYyhuRGV2aWNlcywg
c2l6ZW9mKFJUQVVESU9fREVWSUNFKSk7DQ0KICBpZiAoZGV2aWNlcyA9PSBO
VUxMKSB7DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IG1lbW9y
eSBhbGxvY2F0aW9uIGVycm9yISIpOw0NCiAgICBlcnJvcihSdEVycm9yOjpN
RU1PUllfRVJST1IpOw0NCiAgfQ0NCg0NCiAgLy8gV3JpdGUgZGV2aWNlIGFz
Y2lpIGlkZW50aWZpZXJzIHRvIGRldmljZSBjb250cm9sIHN0cnVjdHVyZSBh
bmQgdGhlbiBwcm9iZSBjYXBhYmlsaXRpZXMuDQ0KICBmb3IgKGk9MDsgaTxu
RGV2aWNlczsgaSsrKSB7DQ0KICAgIHN0cm5jcHkoZGV2aWNlc1tpXS5uYW1l
LCBuYW1lc1tpXSwgMTYpOw0NCiAgICBwcm9iZURldmljZUluZm8oJmRldmlj
ZXNbaV0pOw0NCiAgfQ0NCg0NCiAgcmV0dXJuOw0NCn0NDQoNDQp2b2lkIFJ0
QXVkaW8gOjogcHJvYmVEZXZpY2VJbmZvKFJUQVVESU9fREVWSUNFICppbmZv
KQ0NCnsNDQogIGludCBpLCBmZCwgY2hhbm5lbHMsIG1hc2s7DQ0KDQ0KICAv
LyBUaGUgT1NTIEFQSSBkb2Vzbid0IHByb3ZpZGUgYSBtZWFucyBmb3IgcHJv
YmluZyB0aGUgY2FwYWJpbGl0aWVzDQ0KICAvLyBvZiBkZXZpY2VzLiAgVGh1
cywgd2UnbGwganVzdCBwdXJzdWUgYSBicnV0ZSBmb3JjZSBtZXRob2QuDQ0K
DQ0KICAvLyBGaXJzdCB0cnkgZm9yIHBsYXliYWNrDQ0KICBmZCA9IG9wZW4o
aW5mby0+bmFtZSwgT19XUk9OTFkgfCBPX05PTkJMT0NLKTsNDQogIGlmIChm
ZCA9PSAtMSkgew0NCiAgICAvLyBPcGVuIGRldmljZSBmYWlsZWQgLi4uIGVp
dGhlciBidXN5IG9yIGRvZXNuJ3QgZXhpc3QNDQogICAgaWYgKGVycm5vID09
IEVCVVNZIHx8IGVycm5vID09IEVBR0FJTikNDQogICAgICBzcHJpbnRmKG1l
c3NhZ2UsICJSdEF1ZGlvOiBPU1MgcGxheWJhY2sgZGV2aWNlICglcykgaXMg
YnVzeSBhbmQgY2Fubm90IGJlIHByb2JlZC4iLA0NCiAgICAgICAgICAgICAg
aW5mby0+bmFtZSk7DQ0KICAgIGVsc2UNDQogICAgICBzcHJpbnRmKG1lc3Nh
Z2UsICJSdEF1ZGlvOiBPU1MgcGxheWJhY2sgZGV2aWNlICglcykgb3BlbiBl
cnJvci4iLCBpbmZvLT5uYW1lKTsNDQogICAgZXJyb3IoUnRFcnJvcjo6V0FS
TklORyk7DQ0KICAgIGdvdG8gY2FwdHVyZV9wcm9iZTsNDQogIH0NDQoNDQog
IC8vIFdlIGhhdmUgYW4gb3BlbiBkZXZpY2UgLi4uIHNlZSBob3cgbWFueSBj
aGFubmVscyBpdCBjYW4gaGFuZGxlDQ0KICBmb3IgKGk9TUFYX0NIQU5ORUxT
OyBpPjA7IGktLSkgew0NCiAgICBjaGFubmVscyA9IGk7DQ0KICAgIGlmIChp
b2N0bChmZCwgU05EQ1RMX0RTUF9DSEFOTkVMUywgJmNoYW5uZWxzKSA9PSAt
MSkgew0NCiAgICAgIC8vIFRoaXMgd291bGQgbm9ybWFsbHkgaW5kaWNhdGUg
c29tZSBzb3J0IG9mIGhhcmR3YXJlIGVycm9yLCBidXQgdW5kZXIgQUxTQSdz
DQ0KICAgICAgLy8gT1NTIGVtdWxhdGlvbiwgaXQgc29tZXRpbWVzIGluZGlj
YXRlcyBhbiBpbnZhbGlkIGNoYW5uZWwgdmFsdWUuICBGdXJ0aGVyLA0NCiAg
ICAgIC8vIHRoZSByZXR1cm5lZCBjaGFubmVsIHZhbHVlIGlzIG5vdCBjaGFu
Z2VkLiBTbywgd2UnbGwgaWdub3JlIHRoZSBwb3NzaWJsZQ0NCiAgICAgIC8v
IGhhcmR3YXJlIGVycm9yLg0NCiAgICAgIGNvbnRpbnVlOyAvLyB0cnkgbmV4
dCBjaGFubmVsIG51bWJlcg0NCiAgICB9DQ0KICAgIC8vIENoZWNrIHRvIHNl
ZSB3aGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHJlcXVlc3RlZCBu
dW1iZXIgb2YgY2hhbm5lbHMNDQogICAgaWYgKGNoYW5uZWxzICE9IGkgKSBj
b250aW51ZTsgLy8gdHJ5IG5leHQgY2hhbm5lbCBudW1iZXINDQogICAgLy8g
SWYgaGVyZSwgd2UgZm91bmQgdGhlIGxhcmdlc3Qgd29ya2luZyBjaGFubmVs
IHZhbHVlDQ0KICAgIGJyZWFrOw0NCiAgfQ0NCiAgaW5mby0+bWF4T3V0cHV0
Q2hhbm5lbHMgPSBjaGFubmVsczsNDQoNDQogIC8vIE5vdyBmaW5kIHRoZSBt
aW5pbXVtIG51bWJlciBvZiBjaGFubmVscyBpdCBjYW4gaGFuZGxlDQ0KICBm
b3IgKGk9MTsgaTw9aW5mby0+bWF4T3V0cHV0Q2hhbm5lbHM7IGkrKykgew0N
CiAgICBjaGFubmVscyA9IGk7DQ0KICAgIGlmIChpb2N0bChmZCwgU05EQ1RM
X0RTUF9DSEFOTkVMUywgJmNoYW5uZWxzKSA9PSAtMSB8fCBjaGFubmVscyAh
PSBpKQ0NCiAgICAgIGNvbnRpbnVlOyAvLyB0cnkgbmV4dCBjaGFubmVsIG51
bWJlcg0NCiAgICAvLyBJZiBoZXJlLCB3ZSBmb3VuZCB0aGUgc21hbGxlc3Qg
d29ya2luZyBjaGFubmVsIHZhbHVlDQ0KICAgIGJyZWFrOw0NCiAgfQ0NCiAg
aW5mby0+bWluT3V0cHV0Q2hhbm5lbHMgPSBjaGFubmVsczsNDQogIGNsb3Nl
KGZkKTsNDQoNDQogY2FwdHVyZV9wcm9iZToNDQogIC8vIE5vdyB0cnkgZm9y
IGNhcHR1cmUNDQogIGZkID0gb3BlbihpbmZvLT5uYW1lLCBPX1JET05MWSB8
IE9fTk9OQkxPQ0spOw0NCiAgaWYgKGZkID09IC0xKSB7DQ0KICAgIC8vIE9w
ZW4gZGV2aWNlIGZvciBjYXB0dXJlIGZhaWxlZCAuLi4gZWl0aGVyIGJ1c3kg
b3IgZG9lc24ndCBleGlzdA0NCiAgICBpZiAoZXJybm8gPT0gRUJVU1kgfHwg
ZXJybm8gPT0gRUFHQUlOKQ0NCiAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0
QXVkaW86IE9TUyBjYXB0dXJlIGRldmljZSAoJXMpIGlzIGJ1c3kgYW5kIGNh
bm5vdCBiZSBwcm9iZWQuIiwNDQogICAgICAgICAgICAgIGluZm8tPm5hbWUp
Ow0NCiAgICBlbHNlDQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRp
bzogT1NTIGNhcHR1cmUgZGV2aWNlICglcykgb3BlbiBlcnJvci4iLCBpbmZv
LT5uYW1lKTsNDQogICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAg
IGlmIChpbmZvLT5tYXhPdXRwdXRDaGFubmVscyA9PSAwKQ0NCiAgICAgIC8v
IGRpZG4ndCBvcGVuIGZvciBwbGF5YmFjayBlaXRoZXIgLi4uIGRldmljZSBp
bnZhbGlkDQ0KICAgICAgcmV0dXJuOw0NCiAgICBnb3RvIHByb2JlX3BhcmFt
ZXRlcnM7DQ0KICB9DQ0KDQ0KICAvLyBXZSBoYXZlIHRoZSBkZXZpY2Ugb3Bl
biBmb3IgY2FwdHVyZSAuLi4gc2VlIGhvdyBtYW55IGNoYW5uZWxzIGl0IGNh
biBoYW5kbGUNDQogIGZvciAoaT1NQVhfQ0hBTk5FTFM7IGk+MDsgaS0tKSB7
DQ0KICAgIGNoYW5uZWxzID0gaTsNDQogICAgaWYgKGlvY3RsKGZkLCBTTkRD
VExfRFNQX0NIQU5ORUxTLCAmY2hhbm5lbHMpID09IC0xIHx8IGNoYW5uZWxz
ICE9IGkpIHsNDQogICAgICBjb250aW51ZTsgLy8gYXMgYWJvdmUNDQogICAg
fQ0NCiAgICAvLyBJZiBoZXJlLCB3ZSBmb3VuZCBhIHdvcmtpbmcgY2hhbm5l
bCB2YWx1ZQ0NCiAgICBicmVhazsNDQogIH0NDQogIGluZm8tPm1heElucHV0
Q2hhbm5lbHMgPSBjaGFubmVsczsNDQoNDQogIC8vIE5vdyBmaW5kIHRoZSBt
aW5pbXVtIG51bWJlciBvZiBjaGFubmVscyBpdCBjYW4gaGFuZGxlDQ0KICBm
b3IgKGk9MTsgaTw9aW5mby0+bWF4SW5wdXRDaGFubmVsczsgaSsrKSB7DQ0K
ICAgIGNoYW5uZWxzID0gaTsNDQogICAgaWYgKGlvY3RsKGZkLCBTTkRDVExf
RFNQX0NIQU5ORUxTLCAmY2hhbm5lbHMpID09IC0xIHx8IGNoYW5uZWxzICE9
IGkpDQ0KICAgICAgY29udGludWU7IC8vIHRyeSBuZXh0IGNoYW5uZWwgbnVt
YmVyDQ0KICAgIC8vIElmIGhlcmUsIHdlIGZvdW5kIHRoZSBzbWFsbGVzdCB3
b3JraW5nIGNoYW5uZWwgdmFsdWUNDQogICAgYnJlYWs7DQ0KICB9DQ0KICBp
bmZvLT5taW5JbnB1dENoYW5uZWxzID0gY2hhbm5lbHM7DQ0KICBjbG9zZShm
ZCk7DQ0KDQ0KICAvLyBJZiBkZXZpY2Ugb3BlbnMgZm9yIGJvdGggcGxheWJh
Y2sgYW5kIGNhcHR1cmUsIHdlIGRldGVybWluZSB0aGUgY2hhbm5lbHMuDQ0K
ICBpZiAoaW5mby0+bWF4T3V0cHV0Q2hhbm5lbHMgPT0gMCB8fCBpbmZvLT5t
YXhJbnB1dENoYW5uZWxzID09IDApDQ0KICAgIGdvdG8gcHJvYmVfcGFyYW1l
dGVyczsNDQoNDQogIGZkID0gb3BlbihpbmZvLT5uYW1lLCBPX1JEV1IgfCBP
X05PTkJMT0NLKTsNDQogIGlmIChmZCA9PSAtMSkNDQogICAgZ290byBwcm9i
ZV9wYXJhbWV0ZXJzOw0NCg0NCiAgaW9jdGwoZmQsIFNORENUTF9EU1BfU0VU
RFVQTEVYLCAwKTsNDQogIGlvY3RsKGZkLCBTTkRDVExfRFNQX0dFVENBUFMs
ICZtYXNrKTsNDQogIGlmIChtYXNrICYgRFNQX0NBUF9EVVBMRVgpIHsNDQog
ICAgaW5mby0+aGFzRHVwbGV4U3VwcG9ydCA9IHRydWU7DQ0KICAgIC8vIFdl
IGhhdmUgdGhlIGRldmljZSBvcGVuIGZvciBkdXBsZXggLi4uIHNlZSBob3cg
bWFueSBjaGFubmVscyBpdCBjYW4gaGFuZGxlDQ0KICAgIGZvciAoaT1NQVhf
Q0hBTk5FTFM7IGk+MDsgaS0tKSB7DQ0KICAgICAgY2hhbm5lbHMgPSBpOw0N
CiAgICAgIGlmIChpb2N0bChmZCwgU05EQ1RMX0RTUF9DSEFOTkVMUywgJmNo
YW5uZWxzKSA9PSAtMSB8fCBjaGFubmVscyAhPSBpKQ0NCiAgICAgICAgY29u
dGludWU7IC8vIGFzIGFib3ZlDQ0KICAgICAgLy8gSWYgaGVyZSwgd2UgZm91
bmQgYSB3b3JraW5nIGNoYW5uZWwgdmFsdWUNDQogICAgICBicmVhazsNDQog
ICAgfQ0NCiAgICBpbmZvLT5tYXhEdXBsZXhDaGFubmVscyA9IGNoYW5uZWxz
Ow0NCg0NCiAgICAvLyBOb3cgZmluZCB0aGUgbWluaW11bSBudW1iZXIgb2Yg
Y2hhbm5lbHMgaXQgY2FuIGhhbmRsZQ0NCiAgICBmb3IgKGk9MTsgaTw9aW5m
by0+bWF4RHVwbGV4Q2hhbm5lbHM7IGkrKykgew0NCiAgICAgIGNoYW5uZWxz
ID0gaTsNDQogICAgICBpZiAoaW9jdGwoZmQsIFNORENUTF9EU1BfQ0hBTk5F
TFMsICZjaGFubmVscykgPT0gLTEgfHwgY2hhbm5lbHMgIT0gaSkNDQogICAg
ICAgIGNvbnRpbnVlOyAvLyB0cnkgbmV4dCBjaGFubmVsIG51bWJlcg0NCiAg
ICAgIC8vIElmIGhlcmUsIHdlIGZvdW5kIHRoZSBzbWFsbGVzdCB3b3JraW5n
IGNoYW5uZWwgdmFsdWUNDQogICAgICBicmVhazsNDQogICAgfQ0NCiAgICBp
bmZvLT5taW5EdXBsZXhDaGFubmVscyA9IGNoYW5uZWxzOw0NCiAgfQ0NCiAg
Y2xvc2UoZmQpOw0NCg0NCiBwcm9iZV9wYXJhbWV0ZXJzOg0NCiAgLy8gQXQg
dGhpcyBwb2ludCwgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBzdXBwb3J0
ZWQgZGF0YSBmb3JtYXRzDQ0KICAvLyBhbmQgc2FtcGxlIHJhdGVzLiAgV2Un
bGwgcHJvY2VlZCBieSBvcGVubmluZyB0aGUgZGV2aWNlIGluIHRoZQ0NCiAg
Ly8gZGlyZWN0aW9uIHdpdGggdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYW5u
ZWxzLCBvciBwbGF5YmFjayBpZg0NCiAgLy8gdGhleSBhcmUgZXF1YWwuICBU
aGlzIG1pZ2h0IGxpbWl0IG91ciBzYW1wbGUgcmF0ZSBvcHRpb25zLCBidXQg
c28NDQogIC8vIGJlIGl0Lg0NCg0NCiAgaWYgKGluZm8tPm1heE91dHB1dENo
YW5uZWxzID49IGluZm8tPm1heElucHV0Q2hhbm5lbHMpIHsNDQogICAgZmQg
PSBvcGVuKGluZm8tPm5hbWUsIE9fV1JPTkxZIHwgT19OT05CTE9DSyk7DQ0K
ICAgIGNoYW5uZWxzID0gaW5mby0+bWF4T3V0cHV0Q2hhbm5lbHM7DQ0KICB9
DQ0KICBlbHNlIHsNDQogICAgZmQgPSBvcGVuKGluZm8tPm5hbWUsIE9fUkRP
TkxZIHwgT19OT05CTE9DSyk7DQ0KICAgIGNoYW5uZWxzID0gaW5mby0+bWF4
SW5wdXRDaGFubmVsczsNDQogIH0NDQoNDQogIGlmIChmZCA9PSAtMSkgew0N
CiAgICAvLyBXZSd2ZSBnb3Qgc29tZSBzb3J0IG9mIGNvbmZsaWN0IC4uLiBh
Ym9ydA0NCiAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBPU1MgZGV2
aWNlICglcykgd29uJ3QgcmVvcGVuIGR1cmluZyBwcm9iZS4iLA0NCiAgICAg
ICAgICAgIGluZm8tPm5hbWUpOw0NCiAgICBlcnJvcihSdEVycm9yOjpXQVJO
SU5HKTsNDQogICAgcmV0dXJuOw0NCiAgfQ0NCg0NCiAgLy8gV2UgaGF2ZSBh
biBvcGVuIGRldmljZSAuLi4gc2V0IHRvIG1heGltdW0gY2hhbm5lbHMuDQ0K
ICBpID0gY2hhbm5lbHM7DQ0KICBpZiAoaW9jdGwoZmQsIFNORENUTF9EU1Bf
Q0hBTk5FTFMsICZjaGFubmVscykgPT0gLTEgfHwgY2hhbm5lbHMgIT0gaSkg
ew0NCiAgICAvLyBXZSd2ZSBnb3Qgc29tZSBzb3J0IG9mIGNvbmZsaWN0IC4u
LiBhYm9ydA0NCiAgICBjbG9zZShmZCk7DQ0KICAgIHNwcmludGYobWVzc2Fn
ZSwgIlJ0QXVkaW86IE9TUyBkZXZpY2UgKCVzKSB3b24ndCByZXZlcnQgdG8g
cHJldmlvdXMgY2hhbm5lbCBzZXR0aW5nLiIsDQ0KICAgICAgICAgICAgaW5m
by0+bmFtZSk7DQ0KICAgIGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAg
ICByZXR1cm47DQ0KICB9DQ0KDQ0KICBpZiAoaW9jdGwoZmQsIFNORENUTF9E
U1BfR0VURk1UUywgJm1hc2spID09IC0xKSB7DQ0KICAgIGNsb3NlKGZkKTsN
DQogICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogT1NTIGRldmljZSAo
JXMpIGNhbid0IGdldCBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0cy4iLA0NCiAg
ICAgICAgICAgIGluZm8tPm5hbWUpOw0NCiAgICBlcnJvcihSdEVycm9yOjpX
QVJOSU5HKTsNDQogICAgcmV0dXJuOw0NCiAgfQ0NCg0NCiAgLy8gUHJvYmUg
dGhlIHN1cHBvcnRlZCBkYXRhIGZvcm1hdHMgLi4uIHdlIGRvbid0IGNhcmUg
YWJvdXQgZW5kaWFuLW5lc3MganVzdCB5ZXQuDQ0KICBpbnQgZm9ybWF0Ow0N
CiAgaW5mby0+bmF0aXZlRm9ybWF0cyA9IDA7DQ0KI2lmIGRlZmluZWQgKEFG
TVRfUzMyX0JFKQ0NCiAgLy8gVGhpcyBmb3JtYXQgZG9lcyBub3Qgc2VlbSB0
byBiZSBpbiB0aGUgMi40IGtlcm5lbCB2ZXJzaW9uIG9mIE9TUyBzb3VuZGNh
cmQuaA0NCiAgaWYgKG1hc2sgJiBBRk1UX1MzMl9CRSkgew0NCiAgICBmb3Jt
YXQgPSBBRk1UX1MzMl9CRTsNDQogICAgaW5mby0+bmF0aXZlRm9ybWF0cyB8
PSBSVEFVRElPX1NJTlQzMjsNDQogIH0NDQojZW5kaWYNDQojaWYgZGVmaW5l
ZCAoQUZNVF9TMzJfTEUpDQ0KICAvKiBUaGlzIGZvcm1hdCBpcyBub3QgaW4g
dGhlIDIuNC40IGtlcm5lbCB2ZXJzaW9uIG9mIE9TUyBzb3VuZGNhcmQuaCAq
Lw0NCiAgaWYgKG1hc2sgJiBBRk1UX1MzMl9MRSkgew0NCiAgICBmb3JtYXQg
PSBBRk1UX1MzMl9MRTsNDQogICAgaW5mby0+bmF0aXZlRm9ybWF0cyB8PSBS
VEFVRElPX1NJTlQzMjsNDQogIH0NDQojZW5kaWYNDQogIGlmIChtYXNrICYg
QUZNVF9TOCkgew0NCiAgICBmb3JtYXQgPSBBRk1UX1M4Ow0NCiAgICBpbmZv
LT5uYXRpdmVGb3JtYXRzIHw9IFJUQVVESU9fU0lOVDg7DQ0KICB9DQ0KICBp
ZiAobWFzayAmIEFGTVRfUzE2X0JFKSB7DQ0KICAgIGZvcm1hdCA9IEFGTVRf
UzE2X0JFOw0NCiAgICBpbmZvLT5uYXRpdmVGb3JtYXRzIHw9IFJUQVVESU9f
U0lOVDE2Ow0NCiAgfQ0NCiAgaWYgKG1hc2sgJiBBRk1UX1MxNl9MRSkgew0N
CiAgICBmb3JtYXQgPSBBRk1UX1MxNl9MRTsNDQogICAgaW5mby0+bmF0aXZl
Rm9ybWF0cyB8PSBSVEFVRElPX1NJTlQxNjsNDQogIH0NDQoNDQogIC8vIENo
ZWNrIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgc3VwcG9ydGVkIGZvcm1h
dA0NCiAgaWYgKGluZm8tPm5hdGl2ZUZvcm1hdHMgPT0gMCkgew0NCiAgICBj
bG9zZShmZCk7DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IE9T
UyBkZXZpY2UgKCVzKSBkYXRhIGZvcm1hdCBub3Qgc3VwcG9ydGVkIGJ5IFJ0
QXVkaW8uIiwNDQogICAgICAgICAgICBpbmZvLT5uYW1lKTsNDQogICAgZXJy
b3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgIHJldHVybjsNDQogIH0NDQoN
DQogIC8vIFNldCB0aGUgZm9ybWF0DQ0KICBpID0gZm9ybWF0Ow0NCiAgaWYg
KGlvY3RsKGZkLCBTTkRDVExfRFNQX1NFVEZNVCwgJmZvcm1hdCkgPT0gLTEg
fHwgZm9ybWF0ICE9IGkpIHsNDQogICAgY2xvc2UoZmQpOw0NCiAgICBzcHJp
bnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBPU1MgZGV2aWNlICglcykgZXJyb3Ig
c2V0dGluZyBkYXRhIGZvcm1hdC4iLA0NCiAgICAgICAgICAgIGluZm8tPm5h
bWUpOw0NCiAgICBlcnJvcihSdEVycm9yOjpXQVJOSU5HKTsNDQogICAgcmV0
dXJuOw0NCiAgfQ0NCg0NCiAgLy8gUHJvYmUgdGhlIHN1cHBvcnRlZCBzYW1w
bGUgcmF0ZXMgLi4uIGZpcnN0IGdldCBsb3dlciBsaW1pdA0NCiAgaW50IHNw
ZWVkID0gMTsNDQogIGlmIChpb2N0bChmZCwgU05EQ1RMX0RTUF9TUEVFRCwg
JnNwZWVkKSA9PSAtMSkgew0NCiAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgd2Un
cmUgcHJvYmFibHkgdXNpbmcgYW4gQUxTQSBkcml2ZXIgd2l0aCBPU1MtZW11
bGF0aW9uLA0NCiAgICAvLyB3aGljaCBkb2Vzbid0IGNvbmZvcm0gdG8gdGhl
IE9TUyBzcGVjaWZpY2F0aW9uLiAgSW4gdGhpcyBjYXNlLA0NCiAgICAvLyB3
ZSdsbCBwcm9iZSBvdXIgcHJlZGVmaW5lZCBsaXN0IG9mIHNhbXBsZSByYXRl
cyBmb3Igd29ya2luZyB2YWx1ZXMuDQ0KICAgIGluZm8tPm5TYW1wbGVSYXRl
cyA9IDA7DQ0KICAgIGZvciAoaT0wOyBpPE1BWF9TQU1QTEVfUkFURVM7IGkr
Kykgew0NCiAgICAgIHNwZWVkID0gU0FNUExFX1JBVEVTW2ldOw0NCiAgICAg
IGlmIChpb2N0bChmZCwgU05EQ1RMX0RTUF9TUEVFRCwgJnNwZWVkKSAhPSAt
MSkgew0NCiAgICAgICAgaW5mby0+c2FtcGxlUmF0ZXNbaW5mby0+blNhbXBs
ZVJhdGVzXSA9IFNBTVBMRV9SQVRFU1tpXTsNDQogICAgICAgIGluZm8tPm5T
YW1wbGVSYXRlcysrOw0NCiAgICAgIH0NDQogICAgfQ0NCiAgICBpZiAoaW5m
by0+blNhbXBsZVJhdGVzID09IDApIHsNDQogICAgICBjbG9zZShmZCk7DQ0K
ICAgICAgcmV0dXJuOw0NCiAgICB9DQ0KICAgIGdvdG8gZmluaXNoZWQ7DQ0K
ICB9DQ0KICBpbmZvLT5zYW1wbGVSYXRlc1swXSA9IHNwZWVkOw0NCg0NCiAg
Ly8gTm93IGdldCB1cHBlciBsaW1pdA0NCiAgc3BlZWQgPSAxMDAwMDAwOw0N
CiAgaWYgKGlvY3RsKGZkLCBTTkRDVExfRFNQX1NQRUVELCAmc3BlZWQpID09
IC0xKSB7DQ0KICAgIGNsb3NlKGZkKTsNDQogICAgc3ByaW50ZihtZXNzYWdl
LCAiUnRBdWRpbzogT1NTIGRldmljZSAoJXMpIGVycm9yIHNldHRpbmcgc2Ft
cGxlIHJhdGUuIiwNDQogICAgICAgICAgICBpbmZvLT5uYW1lKTsNDQogICAg
ZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgIHJldHVybjsNDQogIH0N
DQogIGluZm8tPnNhbXBsZVJhdGVzWzFdID0gc3BlZWQ7DQ0KICBpbmZvLT5u
U2FtcGxlUmF0ZXMgPSAtMTsNDQoNDQogZmluaXNoZWQ6IC8vIFRoYXQncyBh
bGwgLi4uIGNsb3NlIHRoZSBkZXZpY2UgYW5kIHJldHVybg0NCiAgY2xvc2Uo
ZmQpOw0NCiAgaW5mby0+cHJvYmVkID0gdHJ1ZTsNDQogIHJldHVybjsNDQp9
DQ0KDQ0KYm9vbCBSdEF1ZGlvIDo6IHByb2JlRGV2aWNlT3BlbihpbnQgZGV2
aWNlLCBSVEFVRElPX1NUUkVBTSAqc3RyZWFtLA0NCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgU1RSRUFNX01PREUgbW9kZSwgaW50IGNoYW5u
ZWxzLCANDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBz
YW1wbGVSYXRlLCBSVEFVRElPX0ZPUk1BVCBmb3JtYXQsDQ0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ1ZmZlclNpemUsIGludCBu
dW1iZXJPZkJ1ZmZlcnMpDQ0Kew0NCiAgaW50IGJ1ZmZlcnMsIGJ1ZmZlcl9i
eXRlcywgZGV2aWNlX2NoYW5uZWxzLCBkZXZpY2VfZm9ybWF0Ow0NCiAgaW50
IHNyYXRlLCB0ZW1wLCBmZDsNDQoNDQogIGNvbnN0IGNoYXIgKm5hbWUgPSBk
ZXZpY2VzW2RldmljZV0ubmFtZTsNDQoNDQogIGlmIChtb2RlID09IFBMQVlC
QUNLKQ0NCiAgICBmZCA9IG9wZW4obmFtZSwgT19XUk9OTFkgfCBPX05PTkJM
T0NLKTsNDQogIGVsc2UgeyAvLyBtb2RlID09IFJFQ09SRA0NCiAgICBpZiAo
c3RyZWFtLT5tb2RlID09IFBMQVlCQUNLICYmIHN0cmVhbS0+ZGV2aWNlWzBd
ID09IGRldmljZSkgew0NCiAgICAgIC8vIFdlIGp1c3Qgc2V0IHRoZSBzYW1l
IGRldmljZSBmb3IgcGxheWJhY2sgLi4uIGNsb3NlIGFuZCByZW9wZW4gZm9y
IGR1cGxleCAoT1NTIG9ubHkpLg0NCiAgICAgIGNsb3NlKHN0cmVhbS0+aGFu
ZGxlWzBdKTsNDQogICAgICBzdHJlYW0tPmhhbmRsZVswXSA9IDA7DQ0KICAg
ICAgLy8gRmlyc3QgY2hlY2sgdGhhdCB0aGUgbnVtYmVyIHByZXZpb3VzbHkg
c2V0IGNoYW5uZWxzIGlzIHRoZSBzYW1lLg0NCiAgICAgIGlmIChzdHJlYW0t
Pm5Vc2VyQ2hhbm5lbHNbMF0gIT0gY2hhbm5lbHMpIHsNDQogICAgICAgIHNw
cmludGYobWVzc2FnZSwgIlJ0QXVkaW86IGlucHV0L291dHB1dCBjaGFubmVs
cyBtdXN0IGJlIGVxdWFsIGZvciBPU1MgZHVwbGV4IGRldmljZSAoJXMpLiIs
IG5hbWUpOw0NCiAgICAgICAgZ290byBlcnJvcjsNDQogICAgICB9DQ0KICAg
ICAgZmQgPSBvcGVuKG5hbWUsIE9fUkRXUiB8IE9fTk9OQkxPQ0spOw0NCiAg
ICB9DQ0KICAgIGVsc2UNDQogICAgICBmZCA9IG9wZW4obmFtZSwgT19SRE9O
TFkgfCBPX05PTkJMT0NLKTsNDQogIH0NDQoNDQogIGlmIChmZCA9PSAtMSkg
ew0NCiAgICBpZiAoZXJybm8gPT0gRUJVU1kgfHwgZXJybm8gPT0gRUFHQUlO
KQ0NCiAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IE9TUyBkZXZp
Y2UgKCVzKSBpcyBidXN5IGFuZCBjYW5ub3QgYmUgb3BlbmVkLiIsDQ0KICAg
ICAgICAgICAgICBuYW1lKTsNDQogICAgZWxzZQ0NCiAgICAgIHNwcmludGYo
bWVzc2FnZSwgIlJ0QXVkaW86IE9TUyBkZXZpY2UgKCVzKSBjYW5ub3QgYmUg
b3BlbmVkLiIsIG5hbWUpOw0NCiAgICBnb3RvIGVycm9yOw0NCiAgfQ0NCg0N
CiAgLy8gTm93IHJlb3BlbiBpbiBibG9ja2luZyBtb2RlLg0NCiAgY2xvc2Uo
ZmQpOw0NCiAgaWYgKG1vZGUgPT0gUExBWUJBQ0spDQ0KICAgIGZkID0gb3Bl
bihuYW1lLCBPX1dST05MWSB8IE9fU1lOQyk7DQ0KICBlbHNlIHsgLy8gbW9k
ZSA9PSBSRUNPUkQNDQogICAgaWYgKHN0cmVhbS0+bW9kZSA9PSBQTEFZQkFD
SyAmJiBzdHJlYW0tPmRldmljZVswXSA9PSBkZXZpY2UpDQ0KICAgICAgZmQg
PSBvcGVuKG5hbWUsIE9fUkRXUiB8IE9fU1lOQyk7DQ0KICAgIGVsc2UNDQog
ICAgICBmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkgfCBPX1NZTkMpOw0NCiAg
fQ0NCg0NCiAgaWYgKGZkID09IC0xKSB7DQ0KICAgIHNwcmludGYobWVzc2Fn
ZSwgIlJ0QXVkaW86IE9TUyBkZXZpY2UgKCVzKSBjYW5ub3QgYmUgb3BlbmVk
LiIsIG5hbWUpOw0NCiAgICBnb3RvIGVycm9yOw0NCiAgfQ0NCg0NCiAgLy8g
R2V0IHRoZSBzYW1wbGUgZm9ybWF0IG1hc2sNDQogIGludCBtYXNrOw0NCiAg
aWYgKGlvY3RsKGZkLCBTTkRDVExfRFNQX0dFVEZNVFMsICZtYXNrKSA9PSAt
MSkgew0NCiAgICBjbG9zZShmZCk7DQ0KICAgIHNwcmludGYobWVzc2FnZSwg
IlJ0QXVkaW86IE9TUyBkZXZpY2UgKCVzKSBjYW4ndCBnZXQgc3VwcG9ydGVk
IGF1ZGlvIGZvcm1hdHMuIiwNDQogICAgICAgICAgICBuYW1lKTsNDQogICAg
Z290byBlcnJvcjsNDQogIH0NDQoNDQogIC8vIERldGVybWluZSBob3cgdG8g
c2V0IHRoZSBkZXZpY2UgZm9ybWF0Lg0NCiAgc3RyZWFtLT51c2VyRm9ybWF0
ID0gZm9ybWF0Ow0NCiAgZGV2aWNlX2Zvcm1hdCA9IC0xOw0NCiAgc3RyZWFt
LT5kb0J5dGVTd2FwW21vZGVdID0gZmFsc2U7DQ0KICBpZiAoZm9ybWF0ID09
IFJUQVVESU9fU0lOVDgpIHsNDQogICAgaWYgKG1hc2sgJiBBRk1UX1M4KSB7
DQ0KICAgICAgZGV2aWNlX2Zvcm1hdCA9IEFGTVRfUzg7DQ0KICAgICAgc3Ry
ZWFtLT5kZXZpY2VGb3JtYXRbbW9kZV0gPSBSVEFVRElPX1NJTlQ4Ow0NCiAg
ICB9DQ0KICB9DQ0KICBlbHNlIGlmIChmb3JtYXQgPT0gUlRBVURJT19TSU5U
MTYpIHsNDQogICAgaWYgKG1hc2sgJiBBRk1UX1MxNl9ORSkgew0NCiAgICAg
IGRldmljZV9mb3JtYXQgPSBBRk1UX1MxNl9ORTsNDQogICAgICBzdHJlYW0t
PmRldmljZUZvcm1hdFttb2RlXSA9IFJUQVVESU9fU0lOVDE2Ow0NCiAgICB9
DQ0KI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTg0NCiAgICBlbHNl
IGlmIChtYXNrICYgQUZNVF9TMTZfQkUpIHsNDQogICAgICBkZXZpY2VfZm9y
bWF0ID0gQUZNVF9TMTZfQkU7DQ0KICAgICAgc3RyZWFtLT5kZXZpY2VGb3Jt
YXRbbW9kZV0gPSBSVEFVRElPX1NJTlQxNjsNDQogICAgICBzdHJlYW0tPmRv
Qnl0ZVN3YXBbbW9kZV0gPSB0cnVlOw0NCiAgICB9DQ0KI2Vsc2UNDQogICAg
ZWxzZSBpZiAobWFzayAmIEFGTVRfUzE2X0xFKSB7DQ0KICAgICAgZGV2aWNl
X2Zvcm1hdCA9IEFGTVRfUzE2X0xFOw0NCiAgICAgIHN0cmVhbS0+ZGV2aWNl
Rm9ybWF0W21vZGVdID0gUlRBVURJT19TSU5UMTY7DQ0KICAgICAgc3RyZWFt
LT5kb0J5dGVTd2FwW21vZGVdID0gdHJ1ZTsNDQogICAgfQ0NCiNlbmRpZg0N
CiAgfQ0NCiNpZiBkZWZpbmVkIChBRk1UX1MzMl9ORSkgJiYgZGVmaW5lZCAo
QUZNVF9TMzJfTEUpICYmIGRlZmluZWQgKEFGTVRfUzMyX0JFKQ0NCiAgZWxz
ZSBpZiAoZm9ybWF0ID09IFJUQVVESU9fU0lOVDMyKSB7DQ0KICAgIGlmICht
YXNrICYgQUZNVF9TMzJfTkUpIHsNDQogICAgICBkZXZpY2VfZm9ybWF0ID0g
QUZNVF9TMzJfTkU7DQ0KICAgICAgc3RyZWFtLT5kZXZpY2VGb3JtYXRbbW9k
ZV0gPSBSVEFVRElPX1NJTlQzMjsNDQogICAgfQ0NCiNpZiBCWVRFX09SREVS
ID09IExJVFRMRV9FTkRJQU4NDQogICAgZWxzZSBpZiAobWFzayAmIEFGTVRf
UzMyX0JFKSB7DQ0KICAgICAgZGV2aWNlX2Zvcm1hdCA9IEFGTVRfUzMyX0JF
Ow0NCiAgICAgIHN0cmVhbS0+ZGV2aWNlRm9ybWF0W21vZGVdID0gUlRBVURJ
T19TSU5UMzI7DQ0KICAgICAgc3RyZWFtLT5kb0J5dGVTd2FwW21vZGVdID0g
dHJ1ZTsNDQogICAgfQ0NCiNlbHNlDQ0KICAgIGVsc2UgaWYgKG1hc2sgJiBB
Rk1UX1MzMl9MRSkgew0NCiAgICAgIGRldmljZV9mb3JtYXQgPSBBRk1UX1Mz
Ml9MRTsNDQogICAgICBzdHJlYW0tPmRldmljZUZvcm1hdFttb2RlXSA9IFJU
QVVESU9fU0lOVDMyOw0NCiAgICAgIHN0cmVhbS0+ZG9CeXRlU3dhcFttb2Rl
XSA9IHRydWU7DQ0KICAgIH0NDQojZW5kaWYNDQogIH0NDQojZW5kaWYNDQoN
DQogIGlmIChkZXZpY2VfZm9ybWF0ID09IC0xKSB7DQ0KICAgIC8vIFRoZSB1
c2VyIHJlcXVlc3RlZCBmb3JtYXQgaXMgbm90IG5hdGl2ZWx5IHN1cHBvcnRl
ZCBieSB0aGUgZGV2aWNlLg0NCiAgICBpZiAobWFzayAmIEFGTVRfUzE2X05F
KSB7DQ0KICAgICAgZGV2aWNlX2Zvcm1hdCA9IEFGTVRfUzE2X05FOw0NCiAg
ICAgIHN0cmVhbS0+ZGV2aWNlRm9ybWF0W21vZGVdID0gUlRBVURJT19TSU5U
MTY7DQ0KICAgIH0NDQojaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFO
DQ0KICAgIGVsc2UgaWYgKG1hc2sgJiBBRk1UX1MxNl9CRSkgew0NCiAgICAg
IGRldmljZV9mb3JtYXQgPSBBRk1UX1MxNl9CRTsNDQogICAgICBzdHJlYW0t
PmRldmljZUZvcm1hdFttb2RlXSA9IFJUQVVESU9fU0lOVDE2Ow0NCiAgICAg
IHN0cmVhbS0+ZG9CeXRlU3dhcFttb2RlXSA9IHRydWU7DQ0KICAgIH0NDQoj
ZWxzZQ0NCiAgICBlbHNlIGlmIChtYXNrICYgQUZNVF9TMTZfTEUpIHsNDQog
ICAgICBkZXZpY2VfZm9ybWF0ID0gQUZNVF9TMTZfTEU7DQ0KICAgICAgc3Ry
ZWFtLT5kZXZpY2VGb3JtYXRbbW9kZV0gPSBSVEFVRElPX1NJTlQxNjsNDQog
ICAgICBzdHJlYW0tPmRvQnl0ZVN3YXBbbW9kZV0gPSB0cnVlOw0NCiAgICB9
DQ0KI2VuZGlmDQ0KI2lmIGRlZmluZWQgKEFGTVRfUzMyX05FKSAmJiBkZWZp
bmVkIChBRk1UX1MzMl9MRSkgJiYgZGVmaW5lZCAoQUZNVF9TMzJfQkUpDQ0K
ICAgIGVsc2UgaWYgKG1hc2sgJiBBRk1UX1MzMl9ORSkgew0NCiAgICAgIGRl
dmljZV9mb3JtYXQgPSBBRk1UX1MzMl9ORTsNDQogICAgICBzdHJlYW0tPmRl
dmljZUZvcm1hdFttb2RlXSA9IFJUQVVESU9fU0lOVDMyOw0NCiAgICB9DQ0K
I2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTg0NCiAgICBlbHNlIGlm
IChtYXNrICYgQUZNVF9TMzJfQkUpIHsNDQogICAgICBkZXZpY2VfZm9ybWF0
ID0gQUZNVF9TMzJfQkU7DQ0KICAgICAgc3RyZWFtLT5kZXZpY2VGb3JtYXRb
bW9kZV0gPSBSVEFVRElPX1NJTlQzMjsNDQogICAgICBzdHJlYW0tPmRvQnl0
ZVN3YXBbbW9kZV0gPSB0cnVlOw0NCiAgICB9DQ0KI2Vsc2UNDQogICAgZWxz
ZSBpZiAobWFzayAmIEFGTVRfUzMyX0xFKSB7DQ0KICAgICAgZGV2aWNlX2Zv
cm1hdCA9IEFGTVRfUzMyX0xFOw0NCiAgICAgIHN0cmVhbS0+ZGV2aWNlRm9y
bWF0W21vZGVdID0gUlRBVURJT19TSU5UMzI7DQ0KICAgICAgc3RyZWFtLT5k
b0J5dGVTd2FwW21vZGVdID0gdHJ1ZTsNDQogICAgfQ0NCiNlbmRpZg0NCiNl
bmRpZg0NCiAgICBlbHNlIGlmIChtYXNrICYgQUZNVF9TOCkgew0NCiAgICAg
IGRldmljZV9mb3JtYXQgPSBBRk1UX1M4Ow0NCiAgICAgIHN0cmVhbS0+ZGV2
aWNlRm9ybWF0W21vZGVdID0gUlRBVURJT19TSU5UODsNDQogICAgfQ0NCiAg
fQ0NCg0NCiAgaWYgKHN0cmVhbS0+ZGV2aWNlRm9ybWF0W21vZGVdID09IDAp
IHsNDQogICAgLy8gVGhpcyByZWFsbHkgc2hvdWxkbid0IGhhcHBlbiAuLi4N
DQogICAgY2xvc2UoZmQpOw0NCiAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1
ZGlvOiBPU1MgZGV2aWNlICglcykgZGF0YSBmb3JtYXQgbm90IHN1cHBvcnRl
ZCBieSBSdEF1ZGlvLiIsDQ0KICAgICAgICAgICAgbmFtZSk7DQ0KICAgIGdv
dG8gZXJyb3I7DQ0KICB9DQ0KDQ0KICAvLyBEZXRlcm1pbmUgdGhlIG51bWJl
ciBvZiBjaGFubmVscyBmb3IgdGhpcyBkZXZpY2UuICBOb3RlIHRoYXQgdGhl
DQ0KICAvLyBjaGFubmVsIHZhbHVlIHJlcXVlc3RlZCBieSB0aGUgdXNlciBt
aWdodCBiZSA8IG1pbl9YX0NoYW5uZWxzLg0NCiAgc3RyZWFtLT5uVXNlckNo
YW5uZWxzW21vZGVdID0gY2hhbm5lbHM7DQ0KICBkZXZpY2VfY2hhbm5lbHMg
PSBjaGFubmVsczsNDQogIGlmIChtb2RlID09IFBMQVlCQUNLKSB7DQ0KICAg
IGlmIChjaGFubmVscyA8IGRldmljZXNbZGV2aWNlXS5taW5PdXRwdXRDaGFu
bmVscykNDQogICAgICBkZXZpY2VfY2hhbm5lbHMgPSBkZXZpY2VzW2Rldmlj
ZV0ubWluT3V0cHV0Q2hhbm5lbHM7DQ0KICB9DQ0KICBlbHNlIHsgLy8gbW9k
ZSA9PSBSRUNPUkQNDQogICAgaWYgKHN0cmVhbS0+bW9kZSA9PSBQTEFZQkFD
SyAmJiBzdHJlYW0tPmRldmljZVswXSA9PSBkZXZpY2UpIHsNDQogICAgICAv
LyBXZSdyZSBkb2luZyBkdXBsZXggc2V0dXAgaGVyZS4NDQogICAgICBpZiAo
Y2hhbm5lbHMgPCBkZXZpY2VzW2RldmljZV0ubWluRHVwbGV4Q2hhbm5lbHMp
DQ0KICAgICAgICBkZXZpY2VfY2hhbm5lbHMgPSBkZXZpY2VzW2RldmljZV0u
bWluRHVwbGV4Q2hhbm5lbHM7DQ0KICAgIH0NDQogICAgZWxzZSB7DQ0KICAg
ICAgaWYgKGNoYW5uZWxzIDwgZGV2aWNlc1tkZXZpY2VdLm1pbklucHV0Q2hh
bm5lbHMpDQ0KICAgICAgICBkZXZpY2VfY2hhbm5lbHMgPSBkZXZpY2VzW2Rl
dmljZV0ubWluSW5wdXRDaGFubmVsczsNDQogICAgfQ0NCiAgfQ0NCiAgc3Ry
ZWFtLT5uRGV2aWNlQ2hhbm5lbHNbbW9kZV0gPSBkZXZpY2VfY2hhbm5lbHM7
DQ0KDQ0KICAvLyBBdHRlbXB0IHRvIHNldCB0aGUgYnVmZmVyIHNpemUuICBB
Y2NvcmRpbmcgdG8gT1NTLCB0aGUgbWluaW11bQ0NCiAgLy8gbnVtYmVyIG9m
IGJ1ZmZlcnMgaXMgdHdvLiAgVGhlIHN1cHBvc2VkIG1pbmltdW0gYnVmZmVy
IHNpemUgaXMgMTYNDQogIC8vIGJ5dGVzLCBzbyB0aGF0IHdpbGwgYmUgb3Vy
IGxvd2VyIGJvdW5kLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMNDQogIC8vIGNh
bGwgaXMgaW4gdGhlIGZvcm0gMHhNTU1NU1NTUyAoaGV4KSwgd2hlcmUgdGhl
IGJ1ZmZlciBzaXplIChpbg0NCiAgLy8gYnl0ZXMpIGlzIGdpdmVuIGFzIDJe
U1NTUyBhbmQgdGhlIG51bWJlciBvZiBidWZmZXJzIGFzIDJeTU1NTS4NDQog
IC8vIFdlJ2xsIGNoZWNrIHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBuZWFyIHRo
ZSBlbmQgb2YgdGhlIHNldHVwDQ0KICAvLyBwcm9jZWR1cmUuDQ0KICBidWZm
ZXJfYnl0ZXMgPSAqYnVmZmVyU2l6ZSAqIGZvcm1hdEJ5dGVzKHN0cmVhbS0+
ZGV2aWNlRm9ybWF0W21vZGVdKSAqIGRldmljZV9jaGFubmVsczsNDQogIGlm
IChidWZmZXJfYnl0ZXMgPCAxNikgYnVmZmVyX2J5dGVzID0gMTY7DQ0KICBi
dWZmZXJzID0gbnVtYmVyT2ZCdWZmZXJzOw0NCiAgaWYgKGJ1ZmZlcnMgPCAy
KSBidWZmZXJzID0gMjsNDQogIHRlbXAgPSAoKGludCkgYnVmZmVycyA8PCAx
NikgKyAoaW50KShsb2cxMCgoZG91YmxlKWJ1ZmZlcl9ieXRlcykvbG9nMTAo
Mi4wKSk7DQ0KICBpZiAoaW9jdGwoZmQsIFNORENUTF9EU1BfU0VURlJBR01F
TlQsICZ0ZW1wKSkgew0NCiAgICBjbG9zZShmZCk7DQ0KICAgIHNwcmludGYo
bWVzc2FnZSwgIlJ0QXVkaW86IE9TUyBlcnJvciBzZXR0aW5nIGZyYWdtZW50
IHNpemUgZm9yIGRldmljZSAoJXMpLiIsDQ0KICAgICAgICAgICAgbmFtZSk7
DQ0KICAgIGdvdG8gZXJyb3I7DQ0KICB9DQ0KICBzdHJlYW0tPm5CdWZmZXJz
ID0gYnVmZmVyczsNDQoNDQogIC8vIFNldCB0aGUgZGF0YSBmb3JtYXQuDQ0K
ICB0ZW1wID0gZGV2aWNlX2Zvcm1hdDsNDQogIGlmIChpb2N0bChmZCwgU05E
Q1RMX0RTUF9TRVRGTVQsICZkZXZpY2VfZm9ybWF0KSA9PSAtMSB8fCBkZXZp
Y2VfZm9ybWF0ICE9IHRlbXApIHsNDQogICAgY2xvc2UoZmQpOw0NCiAgICBz
cHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBPU1MgZXJyb3Igc2V0dGluZyBk
YXRhIGZvcm1hdCBmb3IgZGV2aWNlICglcykuIiwNDQogICAgICAgICAgICBu
YW1lKTsNDQogICAgZ290byBlcnJvcjsNDQogIH0NDQoNDQogIC8vIFNldCB0
aGUgbnVtYmVyIG9mIGNoYW5uZWxzLg0NCiAgdGVtcCA9IGRldmljZV9jaGFu
bmVsczsNDQogIGlmIChpb2N0bChmZCwgU05EQ1RMX0RTUF9DSEFOTkVMUywg
JmRldmljZV9jaGFubmVscykgPT0gLTEgfHwgZGV2aWNlX2NoYW5uZWxzICE9
IHRlbXApIHsNDQogICAgY2xvc2UoZmQpOw0NCiAgICBzcHJpbnRmKG1lc3Nh
Z2UsICJSdEF1ZGlvOiBPU1MgZXJyb3Igc2V0dGluZyAlZCBjaGFubmVscyBv
biBkZXZpY2UgKCVzKS4iLA0NCiAgICAgICAgICAgIHRlbXAsIG5hbWUpOw0N
CiAgICBnb3RvIGVycm9yOw0NCiAgfQ0NCg0NCiAgLy8gU2V0IHRoZSBzYW1w
bGUgcmF0ZS4NDQogIHNyYXRlID0gc2FtcGxlUmF0ZTsNDQogIHRlbXAgPSBz
cmF0ZTsNDQogIGlmIChpb2N0bChmZCwgU05EQ1RMX0RTUF9TUEVFRCwgJnNy
YXRlKSA9PSAtMSkgew0NCiAgICBjbG9zZShmZCk7DQ0KICAgIHNwcmludGYo
bWVzc2FnZSwgIlJ0QXVkaW86IE9TUyBlcnJvciBzZXR0aW5nIHNhbXBsZSBy
YXRlID0gJWQgb24gZGV2aWNlICglcykuIiwNDQogICAgICAgICAgICB0ZW1w
LCBuYW1lKTsNDQogICAgZ290byBlcnJvcjsNDQogIH0NDQoNDQogIC8vIFZl
cmlmeSB0aGUgc2FtcGxlIHJhdGUgc2V0dXAgd29ya2VkLg0NCiAgaWYgKGFi
cyhzcmF0ZSAtIHRlbXApID4gMTAwKSB7DQ0KICAgIGNsb3NlKGZkKTsNDQog
ICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogT1NTIGVycm9yIC4uLiBh
dWRpbyBkZXZpY2UgKCVzKSBkb2Vzbid0IHN1cHBvcnQgc2FtcGxlIHJhdGUg
b2YgJWQuIiwNDQogICAgICAgICAgICBuYW1lLCB0ZW1wKTsNDQogICAgZ290
byBlcnJvcjsNDQogIH0NDQogIHN0cmVhbS0+c2FtcGxlUmF0ZSA9IHNhbXBs
ZVJhdGU7DQ0KDQ0KICBpZiAoaW9jdGwoZmQsIFNORENUTF9EU1BfR0VUQkxL
U0laRSwgJmJ1ZmZlcl9ieXRlcykgPT0gLTEpIHsNDQogICAgY2xvc2UoZmQp
Ow0NCiAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBPU1MgZXJyb3Ig
Z2V0dGluZyBidWZmZXIgc2l6ZSBmb3IgZGV2aWNlICglcykuIiwNDQogICAg
ICAgICAgICBuYW1lKTsNDQogICAgZ290byBlcnJvcjsNDQogIH0NDQoNDQog
IC8vIFNhdmUgYnVmZmVyIHNpemUgKGluIHNhbXBsZSBmcmFtZXMpLg0NCiAg
KmJ1ZmZlclNpemUgPSBidWZmZXJfYnl0ZXMgLyAoZm9ybWF0Qnl0ZXMoc3Ry
ZWFtLT5kZXZpY2VGb3JtYXRbbW9kZV0pICogZGV2aWNlX2NoYW5uZWxzKTsN
DQogIHN0cmVhbS0+YnVmZmVyU2l6ZSA9ICpidWZmZXJTaXplOw0NCg0NCiAg
aWYgKG1vZGUgPT0gUkVDT1JEICYmIHN0cmVhbS0+bW9kZSA9PSBQTEFZQkFD
SyAmJg0NCiAgICAgIHN0cmVhbS0+ZGV2aWNlWzBdID09IGRldmljZSkgew0N
CiAgICAvLyBXZSdyZSBkb2luZyBkdXBsZXggc2V0dXAgaGVyZS4NDQogICAg
c3RyZWFtLT5kZXZpY2VGb3JtYXRbMF0gPSBzdHJlYW0tPmRldmljZUZvcm1h
dFsxXTsNDQogICAgc3RyZWFtLT5uRGV2aWNlQ2hhbm5lbHNbMF0gPSBkZXZp
Y2VfY2hhbm5lbHM7DQ0KICB9DQ0KDQ0KICAvLyBTZXQgZmxhZ3MgZm9yIGJ1
ZmZlciBjb252ZXJzaW9uDQ0KICBzdHJlYW0tPmRvQ29udmVydEJ1ZmZlcltt
b2RlXSA9IGZhbHNlOw0NCiAgaWYgKHN0cmVhbS0+dXNlckZvcm1hdCAhPSBz
dHJlYW0tPmRldmljZUZvcm1hdFttb2RlXSkNDQogICAgc3RyZWFtLT5kb0Nv
bnZlcnRCdWZmZXJbbW9kZV0gPSB0cnVlOw0NCiAgaWYgKHN0cmVhbS0+blVz
ZXJDaGFubmVsc1ttb2RlXSA8IHN0cmVhbS0+bkRldmljZUNoYW5uZWxzW21v
ZGVdKQ0NCiAgICBzdHJlYW0tPmRvQ29udmVydEJ1ZmZlclttb2RlXSA9IHRy
dWU7DQ0KDQ0KICAvLyBBbGxvY2F0ZSBuZWNlc3NhcnkgaW50ZXJuYWwgYnVm
ZmVycw0NCiAgaWYgKCBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMF0gIT0gc3Ry
ZWFtLT5uVXNlckNoYW5uZWxzWzFdICkgew0NCg0NCiAgICBsb25nIGJ1ZmZl
cl9ieXRlczsNDQogICAgaWYgKHN0cmVhbS0+blVzZXJDaGFubmVsc1swXSA+
PSBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMV0pDQ0KICAgICAgYnVmZmVyX2J5
dGVzID0gc3RyZWFtLT5uVXNlckNoYW5uZWxzWzBdOw0NCiAgICBlbHNlDQ0K
ICAgICAgYnVmZmVyX2J5dGVzID0gc3RyZWFtLT5uVXNlckNoYW5uZWxzWzFd
Ow0NCg0NCiAgICBidWZmZXJfYnl0ZXMgKj0gKmJ1ZmZlclNpemUgKiBmb3Jt
YXRCeXRlcyhzdHJlYW0tPnVzZXJGb3JtYXQpOw0NCiAgICBpZiAoc3RyZWFt
LT51c2VyQnVmZmVyKSBmcmVlKHN0cmVhbS0+dXNlckJ1ZmZlcik7DQ0KICAg
IHN0cmVhbS0+dXNlckJ1ZmZlciA9IChjaGFyICopIGNhbGxvYyhidWZmZXJf
Ynl0ZXMsIDEpOw0NCiAgICBpZiAoc3RyZWFtLT51c2VyQnVmZmVyID09IE5V
TEwpIHsNDQogICAgICBjbG9zZShmZCk7DQ0KICAgICAgc3ByaW50ZihtZXNz
YWdlLCAiUnRBdWRpbzogT1NTIGVycm9yIGFsbG9jYXRpbmcgdXNlciBidWZm
ZXIgbWVtb3J5ICglcykuIiwNDQogICAgICAgICAgICAgIG5hbWUpOw0NCiAg
ICAgIGdvdG8gZXJyb3I7DQ0KICAgIH0NDQogIH0NDQoNDQogIGlmICggc3Ry
ZWFtLT5kb0NvbnZlcnRCdWZmZXJbbW9kZV0gKSB7DQ0KDQ0KICAgIGxvbmcg
YnVmZmVyX2J5dGVzOw0NCiAgICBib29sIG1ha2VCdWZmZXIgPSB0cnVlOw0N
CiAgICBpZiAoIG1vZGUgPT0gUExBWUJBQ0sgKQ0NCiAgICAgIGJ1ZmZlcl9i
eXRlcyA9IHN0cmVhbS0+bkRldmljZUNoYW5uZWxzWzBdICogZm9ybWF0Qnl0
ZXMoc3RyZWFtLT5kZXZpY2VGb3JtYXRbMF0pOw0NCiAgICBlbHNlIHsgLy8g
bW9kZSA9PSBSRUNPUkQNDQogICAgICBidWZmZXJfYnl0ZXMgPSBzdHJlYW0t
Pm5EZXZpY2VDaGFubmVsc1sxXSAqIGZvcm1hdEJ5dGVzKHN0cmVhbS0+ZGV2
aWNlRm9ybWF0WzFdKTsNDQogICAgICBpZiAoIHN0cmVhbS0+bW9kZSA9PSBQ
TEFZQkFDSyApIHsNDQogICAgICAgIGxvbmcgYnl0ZXNfb3V0ID0gc3RyZWFt
LT5uRGV2aWNlQ2hhbm5lbHNbMF0gKiBmb3JtYXRCeXRlcyhzdHJlYW0tPmRl
dmljZUZvcm1hdFswXSk7DQ0KICAgICAgICBpZiAoIGJ1ZmZlcl9ieXRlcyA+
IGJ5dGVzX291dCApDQ0KICAgICAgICAgIGJ1ZmZlcl9ieXRlcyA9IChidWZm
ZXJfYnl0ZXMgPiBieXRlc19vdXQpID8gYnVmZmVyX2J5dGVzIDogYnl0ZXNf
b3V0Ow0NCiAgICAgICAgZWxzZQ0NCiAgICAgICAgICBtYWtlQnVmZmVyID0g
ZmFsc2U7DQ0KICAgICAgfQ0NCiAgICB9DQ0KDQ0KICAgIGlmICggbWFrZUJ1
ZmZlciApIHsNDQogICAgICBidWZmZXJfYnl0ZXMgKj0gKmJ1ZmZlclNpemU7
DQ0KICAgICAgaWYgKHN0cmVhbS0+ZGV2aWNlQnVmZmVyKSBmcmVlKHN0cmVh
bS0+ZGV2aWNlQnVmZmVyKTsNDQogICAgICBzdHJlYW0tPmRldmljZUJ1ZmZl
ciA9IChjaGFyICopIGNhbGxvYyhidWZmZXJfYnl0ZXMsIDEpOw0NCiAgICAg
IGlmIChzdHJlYW0tPmRldmljZUJ1ZmZlciA9PSBOVUxMKSB7DQ0KICAgICAg
ICBjbG9zZShmZCk7DQ0KICAgICAgICBmcmVlKHN0cmVhbS0+dXNlckJ1ZmZl
cik7DQ0KICAgICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBPU1Mg
ZXJyb3IgYWxsb2NhdGluZyBkZXZpY2UgYnVmZmVyIG1lbW9yeSAoJXMpLiIs
DQ0KICAgICAgICAgICAgICAgIG5hbWUpOw0NCiAgICAgICAgZ290byBlcnJv
cjsNDQogICAgICB9DQ0KICAgIH0NDQogIH0NDQoNDQogIHN0cmVhbS0+ZGV2
aWNlW21vZGVdID0gZGV2aWNlOw0NCiAgc3RyZWFtLT5oYW5kbGVbbW9kZV0g
PSBmZDsNDQogIHN0cmVhbS0+c3RhdGUgPSBTVFJFQU1fU1RPUFBFRDsNDQog
IGlmICggc3RyZWFtLT5tb2RlID09IFBMQVlCQUNLICYmIG1vZGUgPT0gUkVD
T1JEICkgew0NCiAgICBzdHJlYW0tPm1vZGUgPSBEVVBMRVg7DQ0KICAgIGlm
IChzdHJlYW0tPmRldmljZVswXSA9PSBkZXZpY2UpDQ0KICAgICAgc3RyZWFt
LT5oYW5kbGVbMF0gPSBmZDsNDQogIH0NDQogIGVsc2UNDQogICAgc3RyZWFt
LT5tb2RlID0gbW9kZTsNDQoNDQogIHJldHVybiBTVUNDRVNTOw0NCg0NCiBl
cnJvcjoNDQogIGlmIChzdHJlYW0tPmhhbmRsZVswXSkgew0NCiAgICBjbG9z
ZShzdHJlYW0tPmhhbmRsZVswXSk7DQ0KICAgIHN0cmVhbS0+aGFuZGxlWzBd
ID0gMDsNDQogIH0NDQogIGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAg
cmV0dXJuIEZBSUxVUkU7DQ0KfQ0NCg0NCnZvaWQgUnRBdWRpbyA6OiBjYW5j
ZWxTdHJlYW1DYWxsYmFjayhpbnQgc3RyZWFtSWQpDQ0Kew0NCiAgUlRBVURJ
T19TVFJFQU0gKnN0cmVhbSA9IChSVEFVRElPX1NUUkVBTSAqKSB2ZXJpZnlT
dHJlYW0oc3RyZWFtSWQpOw0NCg0NCiAgaWYgKHN0cmVhbS0+dXNpbmdDYWxs
YmFjaykgew0NCiAgICBzdHJlYW0tPnVzaW5nQ2FsbGJhY2sgPSBmYWxzZTsN
DQogICAgcHRocmVhZF9jYW5jZWwoc3RyZWFtLT50aHJlYWQpOw0NCiAgICBw
dGhyZWFkX2pvaW4oc3RyZWFtLT50aHJlYWQsIE5VTEwpOw0NCiAgICBzdHJl
YW0tPnRocmVhZCA9IDA7DQ0KICAgIHN0cmVhbS0+Y2FsbGJhY2sgPSBOVUxM
Ow0NCiAgICBzdHJlYW0tPnVzZXJEYXRhID0gTlVMTDsNDQogIH0NDQp9DQ0K
DQ0Kdm9pZCBSdEF1ZGlvIDo6IGNsb3NlU3RyZWFtKGludCBzdHJlYW1JZCkN
DQp7DQ0KICAvLyBXZSBkb24ndCB3YW50IGFuIGV4Y2VwdGlvbiB0byBiZSB0
aHJvd24gaGVyZSBiZWNhdXNlIHRoaXMNDQogIC8vIGZ1bmN0aW9uIGlzIGNh
bGxlZCBieSBvdXIgY2xhc3MgZGVzdHJ1Y3Rvci4gIFNvLCBkbyBvdXIgb3du
DQ0KICAvLyBzdHJlYW1JZCBjaGVjay4NDQogIGlmICggc3RyZWFtcy5maW5k
KCBzdHJlYW1JZCApID09IHN0cmVhbXMuZW5kKCkgKSB7DQ0KICAgIHNwcmlu
dGYobWVzc2FnZSwgIlJ0QXVkaW86IGludmFsaWQgc3RyZWFtIGlkZW50aWZp
ZXIhIik7DQ0KICAgIGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICBy
ZXR1cm47DQ0KICB9DQ0KDQ0KICBSVEFVRElPX1NUUkVBTSAqc3RyZWFtID0g
KFJUQVVESU9fU1RSRUFNICopIHN0cmVhbXNbc3RyZWFtSWRdOw0NCg0NCiAg
aWYgKHN0cmVhbS0+dXNpbmdDYWxsYmFjaykgew0NCiAgICBwdGhyZWFkX2Nh
bmNlbChzdHJlYW0tPnRocmVhZCk7DQ0KICAgIHB0aHJlYWRfam9pbihzdHJl
YW0tPnRocmVhZCwgTlVMTCk7DQ0KICB9DQ0KDQ0KICBpZiAoc3RyZWFtLT5z
dGF0ZSA9PSBTVFJFQU1fUlVOTklORykgew0NCiAgICBpZiAoc3RyZWFtLT5t
b2RlID09IFBMQVlCQUNLIHx8IHN0cmVhbS0+bW9kZSA9PSBEVVBMRVgpDQ0K
ICAgICAgaW9jdGwoc3RyZWFtLT5oYW5kbGVbMF0sIFNORENUTF9EU1BfUkVT
RVQsIDApOw0NCiAgICBpZiAoc3RyZWFtLT5tb2RlID09IFJFQ09SRCB8fCBz
dHJlYW0tPm1vZGUgPT0gRFVQTEVYKQ0NCiAgICAgIGlvY3RsKHN0cmVhbS0+
aGFuZGxlWzFdLCBTTkRDVExfRFNQX1JFU0VULCAwKTsNDQogIH0NDQoNDQog
IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmc3RyZWFtLT5tdXRleCk7DQ0KDQ0K
ICBpZiAoc3RyZWFtLT5oYW5kbGVbMF0pDQ0KICAgIGNsb3NlKHN0cmVhbS0+
aGFuZGxlWzBdKTsNDQoNDQogIGlmIChzdHJlYW0tPmhhbmRsZVsxXSkNDQog
ICAgY2xvc2Uoc3RyZWFtLT5oYW5kbGVbMV0pOw0NCg0NCiAgaWYgKHN0cmVh
bS0+dXNlckJ1ZmZlcikNDQogICAgZnJlZShzdHJlYW0tPnVzZXJCdWZmZXIp
Ow0NCg0NCiAgaWYgKHN0cmVhbS0+ZGV2aWNlQnVmZmVyKQ0NCiAgICBmcmVl
KHN0cmVhbS0+ZGV2aWNlQnVmZmVyKTsNDQoNDQogIGZyZWUoc3RyZWFtKTsN
DQogIHN0cmVhbXMuZXJhc2Uoc3RyZWFtSWQpOw0NCn0NDQoNDQp2b2lkIFJ0
QXVkaW8gOjogc3RhcnRTdHJlYW0oaW50IHN0cmVhbUlkKQ0NCnsNDQogIFJU
QVVESU9fU1RSRUFNICpzdHJlYW0gPSAoUlRBVURJT19TVFJFQU0gKikgdmVy
aWZ5U3RyZWFtKHN0cmVhbUlkKTsNDQoNDQogIE1VVEVYX0xPQ0soJnN0cmVh
bS0+bXV0ZXgpOw0NCg0NCiAgc3RyZWFtLT5zdGF0ZSA9IFNUUkVBTV9SVU5O
SU5HOw0NCg0NCiAgLy8gTm8gbmVlZCB0byBkbyBhbnl0aGluZyBlbHNlIGhl
cmUgLi4uIE9TUyBhdXRvbWF0aWNhbGx5IHN0YXJ0cw0NCiAgLy8gd2hlbiBm
ZWQgc2FtcGxlcy4NDQoNDQogIE1VVEVYX1VOTE9DSygmc3RyZWFtLT5tdXRl
eCk7DQ0KfQ0NCg0NCnZvaWQgUnRBdWRpbyA6OiBzdG9wU3RyZWFtKGludCBz
dHJlYW1JZCkNDQp7DQ0KICBSVEFVRElPX1NUUkVBTSAqc3RyZWFtID0gKFJU
QVVESU9fU1RSRUFNICopIHZlcmlmeVN0cmVhbShzdHJlYW1JZCk7DQ0KDQ0K
ICBNVVRFWF9MT0NLKCZzdHJlYW0tPm11dGV4KTsNDQoNDQogIGlmIChzdHJl
YW0tPnN0YXRlID09IFNUUkVBTV9TVE9QUEVEKQ0NCiAgICBnb3RvIHVubG9j
azsNDQoNDQogIGludCBlcnI7DQ0KICBpZiAoc3RyZWFtLT5tb2RlID09IFBM
QVlCQUNLIHx8IHN0cmVhbS0+bW9kZSA9PSBEVVBMRVgpIHsNDQogICAgZXJy
ID0gaW9jdGwoc3RyZWFtLT5oYW5kbGVbMF0sIFNORENUTF9EU1BfU1lOQywg
MCk7DQ0KICAgIGlmIChlcnIgPCAtMSkgew0NCiAgICAgIHNwcmludGYobWVz
c2FnZSwgIlJ0QXVkaW86IE9TUyBlcnJvciBzdG9wcGluZyBkZXZpY2UgKCVz
KS4iLA0NCiAgICAgICAgICAgICAgZGV2aWNlc1tzdHJlYW0tPmRldmljZVsw
XV0ubmFtZSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVSX0VSUk9S
KTsNDQogICAgfQ0NCiAgfQ0NCiAgZWxzZSB7DQ0KICAgIGVyciA9IGlvY3Rs
KHN0cmVhbS0+aGFuZGxlWzFdLCBTTkRDVExfRFNQX1NZTkMsIDApOw0NCiAg
ICBpZiAoZXJyIDwgLTEpIHsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJS
dEF1ZGlvOiBPU1MgZXJyb3Igc3RvcHBpbmcgZGV2aWNlICglcykuIiwNDQog
ICAgICAgICAgICAgIGRldmljZXNbc3RyZWFtLT5kZXZpY2VbMV1dLm5hbWUp
Ow0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICAg
IH0NDQogIH0NDQogIHN0cmVhbS0+c3RhdGUgPSBTVFJFQU1fU1RPUFBFRDsN
DQoNDQogdW5sb2NrOg0NCiAgTVVURVhfVU5MT0NLKCZzdHJlYW0tPm11dGV4
KTsNDQp9DQ0KDQ0Kdm9pZCBSdEF1ZGlvIDo6IGFib3J0U3RyZWFtKGludCBz
dHJlYW1JZCkNDQp7DQ0KICBSVEFVRElPX1NUUkVBTSAqc3RyZWFtID0gKFJU
QVVESU9fU1RSRUFNICopIHZlcmlmeVN0cmVhbShzdHJlYW1JZCk7DQ0KDQ0K
ICBNVVRFWF9MT0NLKCZzdHJlYW0tPm11dGV4KTsNDQoNDQogIGlmIChzdHJl
YW0tPnN0YXRlID09IFNUUkVBTV9TVE9QUEVEKQ0NCiAgICBnb3RvIHVubG9j
azsNDQoNDQogIGludCBlcnI7DQ0KICBpZiAoc3RyZWFtLT5tb2RlID09IFBM
QVlCQUNLIHx8IHN0cmVhbS0+bW9kZSA9PSBEVVBMRVgpIHsNDQogICAgZXJy
ID0gaW9jdGwoc3RyZWFtLT5oYW5kbGVbMF0sIFNORENUTF9EU1BfUkVTRVQs
IDApOw0NCiAgICBpZiAoZXJyIDwgLTEpIHsNDQogICAgICBzcHJpbnRmKG1l
c3NhZ2UsICJSdEF1ZGlvOiBPU1MgZXJyb3IgYWJvcnRpbmcgZGV2aWNlICgl
cykuIiwNDQogICAgICAgICAgICAgIGRldmljZXNbc3RyZWFtLT5kZXZpY2Vb
MF1dLm5hbWUpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJP
Uik7DQ0KICAgIH0NDQogIH0NDQogIGVsc2Ugew0NCiAgICBlcnIgPSBpb2N0
bChzdHJlYW0tPmhhbmRsZVsxXSwgU05EQ1RMX0RTUF9SRVNFVCwgMCk7DQ0K
ICAgIGlmIChlcnIgPCAtMSkgew0NCiAgICAgIHNwcmludGYobWVzc2FnZSwg
IlJ0QXVkaW86IE9TUyBlcnJvciBhYm9ydGluZyBkZXZpY2UgKCVzKS4iLA0N
CiAgICAgICAgICAgICAgZGV2aWNlc1tzdHJlYW0tPmRldmljZVsxXV0ubmFt
ZSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVSX0VSUk9SKTsNDQog
ICAgfQ0NCiAgfQ0NCiAgc3RyZWFtLT5zdGF0ZSA9IFNUUkVBTV9TVE9QUEVE
Ow0NCg0NCiB1bmxvY2s6DQ0KICBNVVRFWF9VTkxPQ0soJnN0cmVhbS0+bXV0
ZXgpOw0NCn0NDQoNDQppbnQgUnRBdWRpbyA6OiBzdHJlYW1XaWxsQmxvY2so
aW50IHN0cmVhbUlkKQ0NCnsNDQogIFJUQVVESU9fU1RSRUFNICpzdHJlYW0g
PSAoUlRBVURJT19TVFJFQU0gKikgdmVyaWZ5U3RyZWFtKHN0cmVhbUlkKTsN
DQoNDQogIE1VVEVYX0xPQ0soJnN0cmVhbS0+bXV0ZXgpOw0NCg0NCiAgaW50
IGJ5dGVzID0gMCwgY2hhbm5lbHMgPSAwLCBmcmFtZXMgPSAwOw0NCiAgaWYg
KHN0cmVhbS0+c3RhdGUgPT0gU1RSRUFNX1NUT1BQRUQpDQ0KICAgIGdvdG8g
dW5sb2NrOw0NCg0NCiAgYXVkaW9fYnVmX2luZm8gaW5mbzsNDQogIGlmIChz
dHJlYW0tPm1vZGUgPT0gUExBWUJBQ0sgfHwgc3RyZWFtLT5tb2RlID09IERV
UExFWCkgew0NCiAgICBpb2N0bChzdHJlYW0tPmhhbmRsZVswXSwgU05EQ1RM
X0RTUF9HRVRPU1BBQ0UsICZpbmZvKTsNDQogICAgYnl0ZXMgPSBpbmZvLmJ5
dGVzOw0NCiAgICBjaGFubmVscyA9IHN0cmVhbS0+bkRldmljZUNoYW5uZWxz
WzBdOw0NCiAgfQ0NCg0NCiAgaWYgKHN0cmVhbS0+bW9kZSA9PSBSRUNPUkQg
fHwgc3RyZWFtLT5tb2RlID09IERVUExFWCkgew0NCiAgICBpb2N0bChzdHJl
YW0tPmhhbmRsZVsxXSwgU05EQ1RMX0RTUF9HRVRJU1BBQ0UsICZpbmZvKTsN
DQogICAgaWYgKHN0cmVhbS0+bW9kZSA9PSBEVVBMRVggKSB7DQ0KICAgICAg
Ynl0ZXMgPSAoYnl0ZXMgPCBpbmZvLmJ5dGVzKSA/IGJ5dGVzIDogaW5mby5i
eXRlczsNDQogICAgICBjaGFubmVscyA9IHN0cmVhbS0+bkRldmljZUNoYW5u
ZWxzWzBdOw0NCiAgICB9DQ0KICAgIGVsc2Ugew0NCiAgICAgIGJ5dGVzID0g
aW5mby5ieXRlczsNDQogICAgICBjaGFubmVscyA9IHN0cmVhbS0+bkRldmlj
ZUNoYW5uZWxzWzFdOw0NCiAgICB9DQ0KICB9DQ0KDQ0KICBmcmFtZXMgPSAo
aW50KSAoYnl0ZXMgLyAoY2hhbm5lbHMgKiBmb3JtYXRCeXRlcyhzdHJlYW0t
PmRldmljZUZvcm1hdFswXSkpKTsNDQogIGZyYW1lcyAtPSBzdHJlYW0tPmJ1
ZmZlclNpemU7DQ0KICBpZiAoZnJhbWVzIDwgMCkgZnJhbWVzID0gMDsNDQoN
DQogdW5sb2NrOg0NCiAgTVVURVhfVU5MT0NLKCZzdHJlYW0tPm11dGV4KTsN
DQogIHJldHVybiBmcmFtZXM7DQ0KfQ0NCg0NCnZvaWQgUnRBdWRpbyA6OiB0
aWNrU3RyZWFtKGludCBzdHJlYW1JZCkNDQp7DQ0KICBSVEFVRElPX1NUUkVB
TSAqc3RyZWFtID0gKFJUQVVESU9fU1RSRUFNICopIHZlcmlmeVN0cmVhbShz
dHJlYW1JZCk7DQ0KDQ0KICBpbnQgc3RvcFN0cmVhbSA9IDA7DQ0KICBpZiAo
c3RyZWFtLT5zdGF0ZSA9PSBTVFJFQU1fU1RPUFBFRCkgew0NCiAgICBpZiAo
c3RyZWFtLT51c2luZ0NhbGxiYWNrKSB1c2xlZXAoNTAwMDApOyAvLyBzbGVl
cCA1MCBtaWxsaXNlY29uZHMNDQogICAgcmV0dXJuOw0NCiAgfQ0NCiAgZWxz
ZSBpZiAoc3RyZWFtLT51c2luZ0NhbGxiYWNrKSB7DQ0KICAgIHN0b3BTdHJl
YW0gPSBzdHJlYW0tPmNhbGxiYWNrKHN0cmVhbS0+dXNlckJ1ZmZlciwgc3Ry
ZWFtLT5idWZmZXJTaXplLCBzdHJlYW0tPnVzZXJEYXRhKTsNDQogIH0NDQoN
DQogIE1VVEVYX0xPQ0soJnN0cmVhbS0+bXV0ZXgpOw0NCg0NCiAgLy8gVGhl
IHN0YXRlIG1pZ2h0IGNoYW5nZSB3aGlsZSB3YWl0aW5nIG9uIGEgbXV0ZXgu
DQ0KICBpZiAoc3RyZWFtLT5zdGF0ZSA9PSBTVFJFQU1fU1RPUFBFRCkNDQog
ICAgZ290byB1bmxvY2s7DQ0KDQ0KICBpbnQgcmVzdWx0Ow0NCiAgY2hhciAq
YnVmZmVyOw0NCiAgaW50IHNhbXBsZXM7DQ0KICBSVEFVRElPX0ZPUk1BVCBm
b3JtYXQ7DQ0KICBpZiAoc3RyZWFtLT5tb2RlID09IFBMQVlCQUNLIHx8IHN0
cmVhbS0+bW9kZSA9PSBEVVBMRVgpIHsNDQoNDQogICAgLy8gU2V0dXAgcGFy
YW1ldGVycyBhbmQgZG8gYnVmZmVyIGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5
Lg0NCiAgICBpZiAoc3RyZWFtLT5kb0NvbnZlcnRCdWZmZXJbMF0pIHsNDQog
ICAgICBjb252ZXJ0U3RyZWFtQnVmZmVyKHN0cmVhbSwgUExBWUJBQ0spOw0N
CiAgICAgIGJ1ZmZlciA9IHN0cmVhbS0+ZGV2aWNlQnVmZmVyOw0NCiAgICAg
IHNhbXBsZXMgPSBzdHJlYW0tPmJ1ZmZlclNpemUgKiBzdHJlYW0tPm5EZXZp
Y2VDaGFubmVsc1swXTsNDQogICAgICBmb3JtYXQgPSBzdHJlYW0tPmRldmlj
ZUZvcm1hdFswXTsNDQogICAgfQ0NCiAgICBlbHNlIHsNDQogICAgICBidWZm
ZXIgPSBzdHJlYW0tPnVzZXJCdWZmZXI7DQ0KICAgICAgc2FtcGxlcyA9IHN0
cmVhbS0+YnVmZmVyU2l6ZSAqIHN0cmVhbS0+blVzZXJDaGFubmVsc1swXTsN
DQogICAgICBmb3JtYXQgPSBzdHJlYW0tPnVzZXJGb3JtYXQ7DQ0KICAgIH0N
DQoNDQogICAgLy8gRG8gYnl0ZSBzd2FwcGluZyBpZiBuZWNlc3NhcnkuDQ0K
ICAgIGlmIChzdHJlYW0tPmRvQnl0ZVN3YXBbMF0pDQ0KICAgICAgYnl0ZVN3
YXBCdWZmZXIoYnVmZmVyLCBzYW1wbGVzLCBmb3JtYXQpOw0NCg0NCiAgICAv
LyBXcml0ZSBzYW1wbGVzIHRvIGRldmljZS4NDQogICAgcmVzdWx0ID0gd3Jp
dGUoc3RyZWFtLT5oYW5kbGVbMF0sIGJ1ZmZlciwgc2FtcGxlcyAqIGZvcm1h
dEJ5dGVzKGZvcm1hdCkpOw0NCg0NCiAgICBpZiAocmVzdWx0ID09IC0xKSB7
DQ0KICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhbiB1bmRlcnJ1biwgYnV0IHRo
ZSBiYXNpYyBPU1MgQVBJIGRvZXNuJ3QgcHJvdmlkZSBhIG1lYW5zIGZvciBk
ZXRlcm1pbmluZyB0aGF0Lg0NCiAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0
QXVkaW86IE9TUyBhdWRpbyB3cml0ZSBlcnJvciBmb3IgZGV2aWNlICglcyku
IiwNDQogICAgICAgICAgICAgIGRldmljZXNbc3RyZWFtLT5kZXZpY2VbMF1d
Lm5hbWUpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7
DQ0KICAgIH0NDQogIH0NDQoNDQogIGlmIChzdHJlYW0tPm1vZGUgPT0gUkVD
T1JEIHx8IHN0cmVhbS0+bW9kZSA9PSBEVVBMRVgpIHsNDQoNDQogICAgLy8g
U2V0dXAgcGFyYW1ldGVycy4NDQogICAgaWYgKHN0cmVhbS0+ZG9Db252ZXJ0
QnVmZmVyWzFdKSB7DQ0KICAgICAgYnVmZmVyID0gc3RyZWFtLT5kZXZpY2VC
dWZmZXI7DQ0KICAgICAgc2FtcGxlcyA9IHN0cmVhbS0+YnVmZmVyU2l6ZSAq
IHN0cmVhbS0+bkRldmljZUNoYW5uZWxzWzFdOw0NCiAgICAgIGZvcm1hdCA9
IHN0cmVhbS0+ZGV2aWNlRm9ybWF0WzFdOw0NCiAgICB9DQ0KICAgIGVsc2Ug
ew0NCiAgICAgIGJ1ZmZlciA9IHN0cmVhbS0+dXNlckJ1ZmZlcjsNDQogICAg
ICBzYW1wbGVzID0gc3RyZWFtLT5idWZmZXJTaXplICogc3RyZWFtLT5uVXNl
ckNoYW5uZWxzWzFdOw0NCiAgICAgIGZvcm1hdCA9IHN0cmVhbS0+dXNlckZv
cm1hdDsNDQogICAgfQ0NCg0NCiAgICAvLyBSZWFkIHNhbXBsZXMgZnJvbSBk
ZXZpY2UuDQ0KICAgIHJlc3VsdCA9IHJlYWQoc3RyZWFtLT5oYW5kbGVbMV0s
IGJ1ZmZlciwgc2FtcGxlcyAqIGZvcm1hdEJ5dGVzKGZvcm1hdCkpOw0NCg0N
CiAgICBpZiAocmVzdWx0ID09IC0xKSB7DQ0KICAgICAgLy8gVGhpcyBjb3Vs
ZCBiZSBhbiBvdmVycnVuLCBidXQgdGhlIGJhc2ljIE9TUyBBUEkgZG9lc24n
dCBwcm92aWRlIGEgbWVhbnMgZm9yIGRldGVybWluaW5nIHRoYXQuDQ0KICAg
ICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogT1NTIGF1ZGlvIHJlYWQg
ZXJyb3IgZm9yIGRldmljZSAoJXMpLiIsDQ0KICAgICAgICAgICAgICBkZXZp
Y2VzW3N0cmVhbS0+ZGV2aWNlWzFdXS5uYW1lKTsNDQogICAgICBlcnJvcihS
dEVycm9yOjpEUklWRVJfRVJST1IpOw0NCiAgICB9DQ0KDQ0KICAgIC8vIERv
IGJ5dGUgc3dhcHBpbmcgaWYgbmVjZXNzYXJ5Lg0NCiAgICBpZiAoc3RyZWFt
LT5kb0J5dGVTd2FwWzFdKQ0NCiAgICAgIGJ5dGVTd2FwQnVmZmVyKGJ1ZmZl
ciwgc2FtcGxlcywgZm9ybWF0KTsNDQoNDQogICAgLy8gRG8gYnVmZmVyIGNv
bnZlcnNpb24gaWYgbmVjZXNzYXJ5Lg0NCiAgICBpZiAoc3RyZWFtLT5kb0Nv
bnZlcnRCdWZmZXJbMV0pDQ0KICAgICAgY29udmVydFN0cmVhbUJ1ZmZlcihz
dHJlYW0sIFJFQ09SRCk7DQ0KICB9DQ0KDQ0KIHVubG9jazoNDQogIE1VVEVY
X1VOTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KDQ0KICBpZiAoc3RyZWFtLT51
c2luZ0NhbGxiYWNrICYmIHN0b3BTdHJlYW0pDQ0KICAgIHRoaXMtPnN0b3BT
dHJlYW0oc3RyZWFtSWQpOw0NCn0NDQoNDQpleHRlcm4gIkMiIHZvaWQgKmNh
bGxiYWNrSGFuZGxlcih2b2lkICpwdHIpDQ0Kew0NCiAgUnRBdWRpbyAqb2Jq
ZWN0ID0gdGhyZWFkX2luZm8ub2JqZWN0Ow0NCiAgaW50IHN0cmVhbSA9IHRo
cmVhZF9pbmZvLnN0cmVhbUlkOw0NCiAgYm9vbCAqdXNpbmdDYWxsYmFjayA9
IChib29sICopIHB0cjsNDQoNDQogIHdoaWxlICggKnVzaW5nQ2FsbGJhY2sg
KSB7DQ0KICAgIHB0aHJlYWRfdGVzdGNhbmNlbCgpOw0NCiAgICB0cnkgew0N
CiAgICAgIG9iamVjdC0+dGlja1N0cmVhbShzdHJlYW0pOw0NCiAgICB9DQ0K
ICAgIGNhdGNoIChSdEVycm9yICZleGNlcHRpb24pIHsNDQogICAgICBmcHJp
bnRmKHN0ZGVyciwgIlxuQ2FsbGJhY2sgdGhyZWFkIGVycm9yICglcykgLi4u
IGNsb3NpbmcgdGhyZWFkLlxuXG4iLA0NCiAgICAgICAgICAgICAgZXhjZXB0
aW9uLmdldE1lc3NhZ2UoKSk7DQ0KICAgICAgYnJlYWs7DQ0KICAgIH0NDQog
IH0NDQoNDQogIHJldHVybiAwOw0NCn0NDQoNDQovLyoqKioqKioqKioqKioq
KioqKioqIEVuZCBvZiBfX0xJTlVYX09TU19fICoqKioqKioqKioqKioqKioq
KioqKi8vDQ0KDQ0KI2VsaWYgZGVmaW5lZChfX1dJTkRPV1NfRFNfXykgLy8g
V2luZG93cyBEaXJlY3RTb3VuZCBBUEkNDQoNDQojaW5jbHVkZSA8ZHNvdW5k
Lmg+DQ0KDQ0KLy8gRGVjbGFyYXRpb25zIGZvciB1dGlsaXR5IGZ1bmN0aW9u
cywgY2FsbGJhY2tzLCBhbmQgc3RydWN0dXJlcw0NCi8vIHNwZWNpZmljIHRv
IHRoZSBEaXJlY3RTb3VuZCBpbXBsZW1lbnRhdGlvbi4NDQpzdGF0aWMgYm9v
bCBDQUxMQkFDSyBkZXZpY2VDb3VudENhbGxiYWNrKExQR1VJRCBscGd1aWQs
DQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBM
UENTVFIgbHBjc3RyRGVzY3JpcHRpb24sDQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBjc3RyTW9kdWxlLA0N
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBW
T0lEIGxwQ29udGV4dCk7DQ0KDQ0Kc3RhdGljIGJvb2wgQ0FMTEJBQ0sgZGV2
aWNlSW5mb0NhbGxiYWNrKExQR1VJRCBscGd1aWQsDQ0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscGNzdHJEZXNj
cmlwdGlvbiwNDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgTFBDU1RSIGxwY3N0ck1vZHVsZSwNDQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQ29udGV4dCk7DQ0K
DQ0Kc3RhdGljIGNoYXIqIGdldEVycm9yU3RyaW5nKGludCBjb2RlKTsNDQoN
DQpzdHJ1Y3QgZW51bV9pbmZvIHsNDQogIGNoYXIgbmFtZVs2NF07DQ0KICBM
UEdVSUQgaWQ7DQ0KICBib29sIGlzSW5wdXQ7DQ0KICBib29sIGlzVmFsaWQ7
DQ0KfTsNDQoNDQovLyBSdEF1ZGlvIG1ldGhvZHMgZm9yIERpcmVjdFNvdW5k
IGltcGxlbWVudGF0aW9uLg0NCnZvaWQgUnRBdWRpbyA6OiBpbml0aWFsaXpl
KHZvaWQpDQ0Kew0NCiAgaW50IGksIGlucyA9IDAsIG91dHMgPSAwLCBjb3Vu
dCA9IDA7DQ0KICBpbnQgaW5kZXggPSAwOw0NCiAgSFJFU1VMVCByZXN1bHQ7
DQ0KICBuRGV2aWNlcyA9IDA7DQ0KDQ0KICAvLyBDb3VudCBEaXJlY3RTb3Vu
ZCBkZXZpY2VzLg0NCiAgcmVzdWx0ID0gRGlyZWN0U291bmRFbnVtZXJhdGUo
KExQRFNFTlVNQ0FMTEJBQ0spZGV2aWNlQ291bnRDYWxsYmFjaywgJm91dHMp
Ow0NCiAgaWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgc3ByaW50Ziht
ZXNzYWdlLCAiUnRBdWRpbzogVW5hYmxlIHRvIGVudW1lcmF0ZSB0aHJvdWdo
IHNvdW5kIHBsYXliYWNrIGRldmljZXM6ICVzLiIsDQ0KICAgICAgICAgICAg
Z2V0RXJyb3JTdHJpbmcocmVzdWx0KSk7DQ0KICAgIGVycm9yKFJ0RXJyb3I6
OkRSSVZFUl9FUlJPUik7DQ0KICB9DQ0KDQ0KICAvLyBDb3VudCBEaXJlY3RT
b3VuZENhcHR1cmUgZGV2aWNlcy4NDQogIHJlc3VsdCA9IERpcmVjdFNvdW5k
Q2FwdHVyZUVudW1lcmF0ZSgoTFBEU0VOVU1DQUxMQkFDSylkZXZpY2VDb3Vu
dENhbGxiYWNrLCAmaW5zKTsNDQogIGlmICggRkFJTEVEKHJlc3VsdCkgKSB7
DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IFVuYWJsZSB0byBl
bnVtZXJhdGUgdGhyb3VnaCBzb3VuZCBjYXB0dXJlIGRldmljZXM6ICVzLiIs
DQ0KICAgICAgICAgICAgZ2V0RXJyb3JTdHJpbmcocmVzdWx0KSk7DQ0KICAg
IGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICB9DQ0KDQ0KICBj
b3VudCA9IGlucyArIG91dHM7DQ0KICBpZiAoY291bnQgPT0gMCkgcmV0dXJu
Ow0NCg0NCiAgc3RkOjp2ZWN0b3I8ZW51bV9pbmZvPiBpbmZvKGNvdW50KTsN
DQogIGZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsNDQogICAgaW5mb1tpXS5u
YW1lWzBdID0gJ1wwJzsNDQogICAgaWYgKGkgPCBvdXRzKSBpbmZvW2ldLmlz
SW5wdXQgPSBmYWxzZTsNDQogICAgZWxzZSBpbmZvW2ldLmlzSW5wdXQgPSB0
cnVlOw0NCiAgfQ0NCg0NCiAgLy8gR2V0IHBsYXliYWNrIGRldmljZSBpbmZv
IGFuZCBjaGVjayBjYXBhYmlsaXRpZXMuDQ0KICByZXN1bHQgPSBEaXJlY3RT
b3VuZEVudW1lcmF0ZSgoTFBEU0VOVU1DQUxMQkFDSylkZXZpY2VJbmZvQ2Fs
bGJhY2ssICZpbmZvWzBdKTsNDQogIGlmICggRkFJTEVEKHJlc3VsdCkgKSB7
DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IFVuYWJsZSB0byBl
bnVtZXJhdGUgdGhyb3VnaCBzb3VuZCBwbGF5YmFjayBkZXZpY2VzOiAlcy4i
LA0NCiAgICAgICAgICAgIGdldEVycm9yU3RyaW5nKHJlc3VsdCkpOw0NCiAg
ICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJST1IpOw0NCiAgfQ0NCg0NCiAg
Ly8gR2V0IGNhcHR1cmUgZGV2aWNlIGluZm8gYW5kIGNoZWNrIGNhcGFiaWxp
dGllcy4NDQogIHJlc3VsdCA9IERpcmVjdFNvdW5kQ2FwdHVyZUVudW1lcmF0
ZSgoTFBEU0VOVU1DQUxMQkFDSylkZXZpY2VJbmZvQ2FsbGJhY2ssICZpbmZv
WzBdKTsNDQogIGlmICggRkFJTEVEKHJlc3VsdCkgKSB7DQ0KICAgIHNwcmlu
dGYobWVzc2FnZSwgIlJ0QXVkaW86IFVuYWJsZSB0byBlbnVtZXJhdGUgdGhy
b3VnaCBzb3VuZCBjYXB0dXJlIGRldmljZXM6ICVzLiIsDQ0KICAgICAgICAg
ICAgZ2V0RXJyb3JTdHJpbmcocmVzdWx0KSk7DQ0KICAgIGVycm9yKFJ0RXJy
b3I6OkRSSVZFUl9FUlJPUik7DQ0KICB9DQ0KDQ0KICAvLyBQYXJzZSB0aGUg
ZGV2aWNlcyBhbmQgY2hlY2sgdmFsaWRpdHkuICBEZXZpY2VzIGFyZSBjb25z
aWRlcmVkDQ0KICAvLyBpbnZhbGlkIGlmIHRoZXkgY2Fubm90IGJlIG9wZW5l
ZCwgdGhleSByZXBvcnQgbm8gc3VwcG9ydGVkIGRhdGENDQogIC8vIGZvcm1h
dHMsIG9yIHRoZXkgcmVwb3J0IDwgMSBzdXBwb3J0ZWQgY2hhbm5lbHMuDQ0K
ICBmb3IgKGk9MDsgaTxjb3VudDsgaSsrKSB7DQ0KICAgIGlmIChpbmZvW2ld
LmlzVmFsaWQgJiYgaW5mb1tpXS5pZCA9PSBOVUxMICkgLy8gZGVmYXVsdCBk
ZXZpY2UNDQogICAgICBuRGV2aWNlcysrOw0NCiAgfQ0NCg0NCiAgLy8gV2Ug
Z3JvdXAgdGhlIGRlZmF1bHQgaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIHRv
Z2V0aGVyIChhcyBvbmUNDQogIC8vIGRldmljZSkgLg0NCiAgaWYgKG5EZXZp
Y2VzID4gMCkgew0NCiAgICBuRGV2aWNlcyA9IDE7DQ0KICAgIGluZGV4ID0g
MTsNDQogIH0NDQoNDQogIC8vIE5vbi1kZWZhdWx0IGRldmljZXMgYXJlIGxp
c3RlZCBzZXBhcmF0ZWx5Lg0NCiAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykg
ew0NCiAgICBpZiAoaW5mb1tpXS5pc1ZhbGlkICYmIGluZm9baV0uaWQgIT0g
TlVMTCApDQ0KICAgICAgbkRldmljZXMrKzsNDQogIH0NDQoNDQogIGlmIChu
RGV2aWNlcyA9PSAwKSByZXR1cm47DQ0KDQ0KICAvLyAgQWxsb2NhdGUgdGhl
IFJUQVVESU9fREVWSUNFIHN0cnVjdHVyZXMuDQ0KICBkZXZpY2VzID0gKFJU
QVVESU9fREVWSUNFICopIGNhbGxvYyhuRGV2aWNlcywgc2l6ZW9mKFJUQVVE
SU9fREVWSUNFKSk7DQ0KICBpZiAoZGV2aWNlcyA9PSBOVUxMKSB7DQ0KICAg
IHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IG1lbW9yeSBhbGxvY2F0aW9u
IGVycm9yISIpOw0NCiAgICBlcnJvcihSdEVycm9yOjpNRU1PUllfRVJST1Ip
Ow0NCiAgfQ0NCg0NCiAgLy8gSW5pdGlhbGl6ZSB0aGUgR1VJRHMgdG8gTlVM
TCBmb3IgbGF0ZXIgdmFsaWRhdGlvbi4NDQogIGZvciAoaT0wOyBpPG5EZXZp
Y2VzOyBpKyspIHsNDQogICAgZGV2aWNlc1tpXS5pZFswXSA9IE5VTEw7DQ0K
ICAgIGRldmljZXNbaV0uaWRbMV0gPSBOVUxMOw0NCiAgfQ0NCg0NCiAgLy8g
UmVuYW1lIHRoZSBkZWZhdWx0IGRldmljZShzKS4NDQogIGlmIChpbmRleCkN
DQogICAgc3RyY3B5KGRldmljZXNbMF0ubmFtZSwgIkRlZmF1bHQgSW5wdXQv
T3V0cHV0IERldmljZXMiKTsNDQoNDQogIC8vIENvcHkgdGhlIG5hbWVzIGFu
ZCBHVUlEcyB0byBvdXIgZGV2aWNlcyBzdHJ1Y3R1cmVzLg0NCiAgZm9yIChp
PTA7IGk8Y291bnQ7IGkrKykgew0NCiAgICBpZiAoaW5mb1tpXS5pc1ZhbGlk
ICYmIGluZm9baV0uaWQgIT0gTlVMTCApIHsNDQogICAgICBzdHJuY3B5KGRl
dmljZXNbaW5kZXhdLm5hbWUsIGluZm9baV0ubmFtZSwgNjQpOw0NCiAgICAg
IGlmIChpbmZvW2ldLmlzSW5wdXQpDQ0KICAgICAgICBkZXZpY2VzW2luZGV4
XS5pZFsxXSA9IGluZm9baV0uaWQ7DQ0KICAgICAgZWxzZQ0NCiAgICAgICAg
ZGV2aWNlc1tpbmRleF0uaWRbMF0gPSBpbmZvW2ldLmlkOw0NCiAgICAgIGlu
ZGV4Kys7DQ0KICAgIH0NDQogIH0NDQoNDQogIGZvciAoaT0wO2k8bkRldmlj
ZXM7IGkrKykNDQogICAgcHJvYmVEZXZpY2VJbmZvKCZkZXZpY2VzW2ldKTsN
DQoNDQogIHJldHVybjsNDQp9DQ0KDQ0Kdm9pZCBSdEF1ZGlvIDo6IHByb2Jl
RGV2aWNlSW5mbyhSVEFVRElPX0RFVklDRSAqaW5mbykNDQp7DQ0KICBIUkVT
VUxUIHJlc3VsdDsNDQoNDQogIC8vIEdldCB0aGUgZGV2aWNlIGluZGV4IHNv
IHRoYXQgd2UgY2FuIGNoZWNrIHRoZSBkZXZpY2UgaGFuZGxlLg0NCiAgaW50
IGluZGV4Ow0NCiAgZm9yIChpbmRleD0wOyBpbmRleDxuRGV2aWNlczsgaW5k
ZXgrKykNDQogICAgaWYgKCBpbmZvID09ICZkZXZpY2VzW2luZGV4XSApIGJy
ZWFrOw0NCg0NCiAgaWYgKCBpbmRleCA+PSBuRGV2aWNlcyApIHsNDQogICAg
c3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogZGV2aWNlICglcykgaW5kZXhp
bmcgZXJyb3IgaW4gRGlyZWN0U291bmQgcHJvYmVEZXZpY2VJbmZvKCkuIiwN
DQogICAgICAgICAgICBpbmZvLT5uYW1lKTsNDQogICAgZXJyb3IoUnRFcnJv
cjo6V0FSTklORyk7DQ0KICAgIHJldHVybjsNDQogIH0NDQoNDQogIC8vIERv
IGNhcHR1cmUgcHJvYmUgZmlyc3QuICBJZiB0aGlzIGlzIG5vdCB0aGUgZGVm
YXVsdCBkZXZpY2UgKGluZGV4DQ0KICAvLyA9IDApIF9hbmRfIEdVSUQgPSBO
VUxMLCB0aGVuIHRoZSBjYXB0dXJlIGhhbmRsZSBpcyBpbnZhbGlkLg0NCiAg
aWYgKCBpbmRleCAhPSAwICYmIGluZm8tPmlkWzFdID09IE5VTEwgKQ0NCiAg
ICBnb3RvIHBsYXliYWNrX3Byb2JlOw0NCg0NCiAgTFBESVJFQ1RTT1VORENB
UFRVUkUgIGlucHV0Ow0NCiAgcmVzdWx0ID0gRGlyZWN0U291bmRDYXB0dXJl
Q3JlYXRlKCBpbmZvLT5pZFswXSwgJmlucHV0LCBOVUxMICk7DQ0KICBpZiAo
IEZBSUxFRChyZXN1bHQpICkgew0NCiAgICBzcHJpbnRmKG1lc3NhZ2UsICJS
dEF1ZGlvOiBDb3VsZCBub3QgY3JlYXRlIERpcmVjdFNvdW5kIGNhcHR1cmUg
b2JqZWN0ICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgaW5mby0+bmFtZSwg
Z2V0RXJyb3JTdHJpbmcocmVzdWx0KSk7DQ0KICAgIGVycm9yKFJ0RXJyb3I6
OldBUk5JTkcpOw0NCiAgICBnb3RvIHBsYXliYWNrX3Byb2JlOw0NCiAgfQ0N
Cg0NCiAgRFNDQ0FQUyBpbl9jYXBzOw0NCiAgaW5fY2Fwcy5kd1NpemUgPSBz
aXplb2YoaW5fY2Fwcyk7DQ0KICByZXN1bHQgPSBpbnB1dC0+R2V0Q2Fwcygg
JmluX2NhcHMgKTsNDQogIGlmICggRkFJTEVEKHJlc3VsdCkgKSB7DQ0KICAg
IGlucHV0LT5SZWxlYXNlKCk7DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0
QXVkaW86IENvdWxkIG5vdCBnZXQgRGlyZWN0U291bmQgY2FwdHVyZSBjYXBh
YmlsaXRpZXMgKCVzKTogJXMuIiwNDQogICAgICAgICAgICBpbmZvLT5uYW1l
LCBnZXRFcnJvclN0cmluZyhyZXN1bHQpKTsNDQogICAgZXJyb3IoUnRFcnJv
cjo6V0FSTklORyk7DQ0KICAgIGdvdG8gcGxheWJhY2tfcHJvYmU7DQ0KICB9
DQ0KDQ0KICAvLyBHZXQgaW5wdXQgY2hhbm5lbCBpbmZvcm1hdGlvbi4NDQog
IGluZm8tPm1pbklucHV0Q2hhbm5lbHMgPSAxOw0NCiAgaW5mby0+bWF4SW5w
dXRDaGFubmVscyA9IGluX2NhcHMuZHdDaGFubmVsczsNDQoNDQogIC8vIEdl
dCBzYW1wbGUgcmF0ZSBhbmQgZm9ybWF0IGluZm9ybWF0aW9uLg0NCiAgaWYo
IGluX2NhcHMuZHdDaGFubmVscyA9PSAyICkgew0NCiAgICBpZiggaW5fY2Fw
cy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF8xUzE2ICkgaW5mby0+bmF0aXZl
Rm9ybWF0cyB8PSBSVEFVRElPX1NJTlQxNjsNDQogICAgaWYoIGluX2NhcHMu
ZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfMlMxNiApIGluZm8tPm5hdGl2ZUZv
cm1hdHMgfD0gUlRBVURJT19TSU5UMTY7DQ0KICAgIGlmKCBpbl9jYXBzLmR3
Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzRTMTYgKSBpbmZvLT5uYXRpdmVGb3Jt
YXRzIHw9IFJUQVVESU9fU0lOVDE2Ow0NCiAgICBpZiggaW5fY2Fwcy5kd0Zv
cm1hdHMgJiBXQVZFX0ZPUk1BVF8xUzA4ICkgaW5mby0+bmF0aXZlRm9ybWF0
cyB8PSBSVEFVRElPX1NJTlQ4Ow0NCiAgICBpZiggaW5fY2Fwcy5kd0Zvcm1h
dHMgJiBXQVZFX0ZPUk1BVF8yUzA4ICkgaW5mby0+bmF0aXZlRm9ybWF0cyB8
PSBSVEFVRElPX1NJTlQ4Ow0NCiAgICBpZiggaW5fY2Fwcy5kd0Zvcm1hdHMg
JiBXQVZFX0ZPUk1BVF80UzA4ICkgaW5mby0+bmF0aXZlRm9ybWF0cyB8PSBS
VEFVRElPX1NJTlQ4Ow0NCg0NCiAgICBpZiAoIGluZm8tPm5hdGl2ZUZvcm1h
dHMgJiBSVEFVRElPX1NJTlQxNiApIHsNDQogICAgICBpZiggaW5fY2Fwcy5k
d0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF8xUzE2ICkgaW5mby0+c2FtcGxlUmF0
ZXNbaW5mby0+blNhbXBsZVJhdGVzKytdID0gMTEwMjU7DQ0KICAgICAgaWYo
IGluX2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfMlMxNiApIGluZm8t
PnNhbXBsZVJhdGVzW2luZm8tPm5TYW1wbGVSYXRlcysrXSA9IDIyMDUwOw0N
CiAgICAgIGlmKCBpbl9jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzRT
MTYgKSBpbmZvLT5zYW1wbGVSYXRlc1tpbmZvLT5uU2FtcGxlUmF0ZXMrK10g
PSA0NDEwMDsNDQogICAgfQ0NCiAgICBlbHNlIGlmICggaW5mby0+bmF0aXZl
Rm9ybWF0cyAmIFJUQVVESU9fU0lOVDggKSB7DQ0KICAgICAgaWYoIGluX2Nh
cHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfMVMwOCApIGluZm8tPnNhbXBs
ZVJhdGVzW2luZm8tPm5TYW1wbGVSYXRlcysrXSA9IDExMDI1Ow0NCiAgICAg
IGlmKCBpbl9jYXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzJTMDggKSBp
bmZvLT5zYW1wbGVSYXRlc1tpbmZvLT5uU2FtcGxlUmF0ZXMrK10gPSAyMjA1
MDsNDQogICAgICBpZiggaW5fY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1B
VF80UzA4ICkgaW5mby0+c2FtcGxlUmF0ZXNbaW5mby0+blNhbXBsZVJhdGVz
KytdID0gNDQxMDA7DQ0KICAgIH0NDQogIH0NDQogIGVsc2UgaWYgKCBpbl9j
YXBzLmR3Q2hhbm5lbHMgPT0gMSApIHsNDQogICAgaWYoIGluX2NhcHMuZHdG
b3JtYXRzICYgV0FWRV9GT1JNQVRfMU0xNiApIGluZm8tPm5hdGl2ZUZvcm1h
dHMgfD0gUlRBVURJT19TSU5UMTY7DQ0KICAgIGlmKCBpbl9jYXBzLmR3Rm9y
bWF0cyAmIFdBVkVfRk9STUFUXzJNMTYgKSBpbmZvLT5uYXRpdmVGb3JtYXRz
IHw9IFJUQVVESU9fU0lOVDE2Ow0NCiAgICBpZiggaW5fY2Fwcy5kd0Zvcm1h
dHMgJiBXQVZFX0ZPUk1BVF80TTE2ICkgaW5mby0+bmF0aXZlRm9ybWF0cyB8
PSBSVEFVRElPX1NJTlQxNjsNDQogICAgaWYoIGluX2NhcHMuZHdGb3JtYXRz
ICYgV0FWRV9GT1JNQVRfMU0wOCApIGluZm8tPm5hdGl2ZUZvcm1hdHMgfD0g
UlRBVURJT19TSU5UODsNDQogICAgaWYoIGluX2NhcHMuZHdGb3JtYXRzICYg
V0FWRV9GT1JNQVRfMk0wOCApIGluZm8tPm5hdGl2ZUZvcm1hdHMgfD0gUlRB
VURJT19TSU5UODsNDQogICAgaWYoIGluX2NhcHMuZHdGb3JtYXRzICYgV0FW
RV9GT1JNQVRfNE0wOCApIGluZm8tPm5hdGl2ZUZvcm1hdHMgfD0gUlRBVURJ
T19TSU5UODsNDQoNDQogICAgaWYgKCBpbmZvLT5uYXRpdmVGb3JtYXRzICYg
UlRBVURJT19TSU5UMTYgKSB7DQ0KICAgICAgaWYoIGluX2NhcHMuZHdGb3Jt
YXRzICYgV0FWRV9GT1JNQVRfMU0xNiApIGluZm8tPnNhbXBsZVJhdGVzW2lu
Zm8tPm5TYW1wbGVSYXRlcysrXSA9IDExMDI1Ow0NCiAgICAgIGlmKCBpbl9j
YXBzLmR3Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzJNMTYgKSBpbmZvLT5zYW1w
bGVSYXRlc1tpbmZvLT5uU2FtcGxlUmF0ZXMrK10gPSAyMjA1MDsNDQogICAg
ICBpZiggaW5fY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF80TTE2ICkg
aW5mby0+c2FtcGxlUmF0ZXNbaW5mby0+blNhbXBsZVJhdGVzKytdID0gNDQx
MDA7DQ0KICAgIH0NDQogICAgZWxzZSBpZiAoIGluZm8tPm5hdGl2ZUZvcm1h
dHMgJiBSVEFVRElPX1NJTlQ4ICkgew0NCiAgICAgIGlmKCBpbl9jYXBzLmR3
Rm9ybWF0cyAmIFdBVkVfRk9STUFUXzFNMDggKSBpbmZvLT5zYW1wbGVSYXRl
c1tpbmZvLT5uU2FtcGxlUmF0ZXMrK10gPSAxMTAyNTsNDQogICAgICBpZigg
aW5fY2Fwcy5kd0Zvcm1hdHMgJiBXQVZFX0ZPUk1BVF8yTTA4ICkgaW5mby0+
c2FtcGxlUmF0ZXNbaW5mby0+blNhbXBsZVJhdGVzKytdID0gMjIwNTA7DQ0K
ICAgICAgaWYoIGluX2NhcHMuZHdGb3JtYXRzICYgV0FWRV9GT1JNQVRfNE0w
OCApIGluZm8tPnNhbXBsZVJhdGVzW2luZm8tPm5TYW1wbGVSYXRlcysrXSA9
IDQ0MTAwOw0NCiAgICB9DQ0KICB9DQ0KICBlbHNlIGluZm8tPm1pbklucHV0
Q2hhbm5lbHMgPSAwOyAvLyB0ZWNobmljYWxseSwgdGhpcyB3b3VsZCBiZSBh
biBlcnJvcg0NCg0NCiAgaW5wdXQtPlJlbGVhc2UoKTsNDQoNDQogcGxheWJh
Y2tfcHJvYmU6DQ0KICBMUERJUkVDVFNPVU5EICBvdXRwdXQ7DQ0KICBEU0NB
UFMgb3V0X2NhcHM7DQ0KDQ0KICAvLyBOb3cgZG8gcGxheWJhY2sgcHJvYmUu
ICBJZiB0aGlzIGlzIG5vdCB0aGUgZGVmYXVsdCBkZXZpY2UgKGluZGV4DQ0K
ICAvLyA9IDApIF9hbmRfIEdVSUQgPSBOVUxMLCB0aGVuIHRoZSBwbGF5YmFj
ayBoYW5kbGUgaXMgaW52YWxpZC4NDQogIGlmICggaW5kZXggIT0gMCAmJiBp
bmZvLT5pZFswXSA9PSBOVUxMICkNDQogICAgZ290byBjaGVja19wYXJhbWV0
ZXJzOw0NCg0NCiAgcmVzdWx0ID0gRGlyZWN0U291bmRDcmVhdGUoIGluZm8t
PmlkWzBdLCAmb3V0cHV0LCBOVUxMICk7DQ0KICBpZiAoIEZBSUxFRChyZXN1
bHQpICkgew0NCiAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBDb3Vs
ZCBub3QgY3JlYXRlIERpcmVjdFNvdW5kIHBsYXliYWNrIG9iamVjdCAoJXMp
OiAlcy4iLA0NCiAgICAgICAgICAgIGluZm8tPm5hbWUsIGdldEVycm9yU3Ry
aW5nKHJlc3VsdCkpOw0NCiAgICBlcnJvcihSdEVycm9yOjpXQVJOSU5HKTsN
DQogICAgZ290byBjaGVja19wYXJhbWV0ZXJzOw0NCiAgfQ0NCg0NCiAgb3V0
X2NhcHMuZHdTaXplID0gc2l6ZW9mKG91dF9jYXBzKTsNDQogIHJlc3VsdCA9
IG91dHB1dC0+R2V0Q2FwcyggJm91dF9jYXBzICk7DQ0KICBpZiAoIEZBSUxF
RChyZXN1bHQpICkgew0NCiAgICBvdXRwdXQtPlJlbGVhc2UoKTsNDQogICAg
c3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQ291bGQgbm90IGdldCBEaXJl
Y3RTb3VuZCBwbGF5YmFjayBjYXBhYmlsaXRpZXMgKCVzKTogJXMuIiwNDQog
ICAgICAgICAgICBpbmZvLT5uYW1lLCBnZXRFcnJvclN0cmluZyhyZXN1bHQp
KTsNDQogICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgIGdvdG8g
Y2hlY2tfcGFyYW1ldGVyczsNDQogIH0NDQoNDQogIC8vIEdldCBvdXRwdXQg
Y2hhbm5lbCBpbmZvcm1hdGlvbi4NDQogIGluZm8tPm1pbk91dHB1dENoYW5u
ZWxzID0gMTsNDQogIGluZm8tPm1heE91dHB1dENoYW5uZWxzID0gKCBvdXRf
Y2Fwcy5kd0ZsYWdzICYgRFNDQVBTX1BSSU1BUllTVEVSRU8gKSA/IDIgOiAx
Ow0NCg0NCiAgLy8gR2V0IHNhbXBsZSByYXRlIGluZm9ybWF0aW9uLiAgVXNl
IGNhcHR1cmUgZGV2aWNlIHJhdGUgaW5mb3JtYXRpb24NDQogIC8vIGlmIGl0
IGV4aXN0cy4NDQogIGlmICggaW5mby0+blNhbXBsZVJhdGVzID09IDAgKSB7
DQ0KICAgIGluZm8tPnNhbXBsZVJhdGVzWzBdID0gKGludCkgb3V0X2NhcHMu
ZHdNaW5TZWNvbmRhcnlTYW1wbGVSYXRlOw0NCiAgICBpbmZvLT5zYW1wbGVS
YXRlc1sxXSA9IChpbnQpIG91dF9jYXBzLmR3TWF4U2Vjb25kYXJ5U2FtcGxl
UmF0ZTsNDQogICAgaWYgKCBvdXRfY2Fwcy5kd0ZsYWdzICYgRFNDQVBTX0NP
TlRJTlVPVVNSQVRFICkNDQogICAgICBpbmZvLT5uU2FtcGxlUmF0ZXMgPSAt
MTsNDQogICAgZWxzZSBpZiAoIG91dF9jYXBzLmR3TWluU2Vjb25kYXJ5U2Ft
cGxlUmF0ZSA9PSBvdXRfY2Fwcy5kd01heFNlY29uZGFyeVNhbXBsZVJhdGUg
KSB7DQ0KICAgICAgaWYgKCBvdXRfY2Fwcy5kd01pblNlY29uZGFyeVNhbXBs
ZVJhdGUgPT0gMCApIHsNDQogICAgICAgIC8vIFRoaXMgaXMgYSBib2d1cyBk
cml2ZXIgcmVwb3J0IC4uLiBmYWtlIHRoZSByYW5nZSBhbmQgY3Jvc3MNDQog
ICAgICAgIC8vIHlvdXIgZmluZ2Vycy4NDQogICAgICAgIGluZm8tPnNhbXBs
ZVJhdGVzWzBdID0gMTEwMjU7DQ0KCQkJCWluZm8tPnNhbXBsZVJhdGVzWzFd
ID0gNDgwMDA7DQ0KICAgICAgICBpbmZvLT5uU2FtcGxlUmF0ZXMgPSAtMTsg
LyogY29udGludW91cyByYW5nZSAqLw0NCiAgICAgICAgc3ByaW50ZihtZXNz
YWdlLCAiUnRBdWRpbzogYm9ndXMgc2FtcGxlIHJhdGVzIHJlcG9ydGVkIGJ5
IERpcmVjdFNvdW5kIGRyaXZlciAuLi4gdXNpbmcgZGVmYXVsdHMgKCVzKS4i
LA0NCiAgICAgICAgICAgICAgICBpbmZvLT5uYW1lKTsNDQogICAgICAgIGVy
cm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICAgIH0NDQogICAgICBlbHNl
IHsNDQogICAgICAgIGluZm8tPm5TYW1wbGVSYXRlcyA9IDE7DQ0KCQkJfQ0N
CiAgICB9DQ0KICAgIGVsc2UgaWYgKCAob3V0X2NhcHMuZHdNaW5TZWNvbmRh
cnlTYW1wbGVSYXRlIDwgMTAwMC4wKSAmJg0NCiAgICAgICAgICAgICAgKG91
dF9jYXBzLmR3TWF4U2Vjb25kYXJ5U2FtcGxlUmF0ZSA+IDUwMDAwLjApICkg
ew0NCiAgICAgIC8vIFRoaXMgaXMgYSBib2d1cyBkcml2ZXIgcmVwb3J0IC4u
LiBzdXBwb3J0IGZvciBvbmx5IHR3bw0NCiAgICAgIC8vIGRpc3RhbnQgcmF0
ZXMuICBXZSdsbCBhc3N1bWUgdGhpcyBpcyBhIHJhbmdlLg0NCiAgICAgIGlu
Zm8tPm5TYW1wbGVSYXRlcyA9IC0xOw0NCiAgICAgIHNwcmludGYobWVzc2Fn
ZSwgIlJ0QXVkaW86IGJvZ3VzIHNhbXBsZSByYXRlcyByZXBvcnRlZCBieSBE
aXJlY3RTb3VuZCBkcml2ZXIgLi4uIHVzaW5nIHJhbmdlICglcykuIiwNDQog
ICAgICAgICAgICAgIGluZm8tPm5hbWUpOw0NCiAgICAgIGVycm9yKFJ0RXJy
b3I6OldBUk5JTkcpOw0NCiAgICB9DQ0KICAgIGVsc2UgaW5mby0+blNhbXBs
ZVJhdGVzID0gMjsNDQogIH0NDQogIGVsc2Ugew0NCiAgICAvLyBDaGVjayBp
bnB1dCByYXRlcyBhZ2FpbnN0IG91dHB1dCByYXRlIHJhbmdlDQ0KICAgIGZv
ciAoIGludCBpPWluZm8tPm5TYW1wbGVSYXRlcy0xOyBpPj0wOyBpLS0gKSB7
DQ0KICAgICAgaWYgKCBpbmZvLT5zYW1wbGVSYXRlc1tpXSA8PSBvdXRfY2Fw
cy5kd01heFNlY29uZGFyeVNhbXBsZVJhdGUgKQ0NCiAgICAgICAgYnJlYWs7
DQ0KICAgICAgaW5mby0+blNhbXBsZVJhdGVzLS07DQ0KICAgIH0NDQogICAg
d2hpbGUgKCBpbmZvLT5zYW1wbGVSYXRlc1swXSA8IG91dF9jYXBzLmR3TWlu
U2Vjb25kYXJ5U2FtcGxlUmF0ZSApIHsNDQogICAgICBpbmZvLT5uU2FtcGxl
UmF0ZXMtLTsNDQogICAgICBmb3IgKCBpbnQgaT0wOyBpPGluZm8tPm5TYW1w
bGVSYXRlczsgaSsrKQ0NCiAgICAgICAgaW5mby0+c2FtcGxlUmF0ZXNbaV0g
PSBpbmZvLT5zYW1wbGVSYXRlc1tpKzFdOw0NCiAgICAgIGlmICggaW5mby0+
blNhbXBsZVJhdGVzIDw9IDAgKSBicmVhazsNDQogICAgfQ0NCiAgfQ0NCg0N
CiAgLy8gR2V0IGZvcm1hdCBpbmZvcm1hdGlvbi4NDQogIGlmICggb3V0X2Nh
cHMuZHdGbGFncyAmIERTQ0FQU19QUklNQVJZMTZCSVQgKSBpbmZvLT5uYXRp
dmVGb3JtYXRzIHw9IFJUQVVESU9fU0lOVDE2Ow0NCiAgaWYgKCBvdXRfY2Fw
cy5kd0ZsYWdzICYgRFNDQVBTX1BSSU1BUlk4QklUICkgaW5mby0+bmF0aXZl
Rm9ybWF0cyB8PSBSVEFVRElPX1NJTlQ4Ow0NCg0NCiAgb3V0cHV0LT5SZWxl
YXNlKCk7DQ0KDQ0KIGNoZWNrX3BhcmFtZXRlcnM6DQ0KICBpZiAoIGluZm8t
Pm1heElucHV0Q2hhbm5lbHMgPT0gMCAmJiBpbmZvLT5tYXhPdXRwdXRDaGFu
bmVscyA9PSAwICkNDQogICAgcmV0dXJuOw0NCiAgaWYgKCBpbmZvLT5uU2Ft
cGxlUmF0ZXMgPT0gMCB8fCBpbmZvLT5uYXRpdmVGb3JtYXRzID09IDAgKQ0N
CiAgICByZXR1cm47DQ0KDQ0KICAvLyBEZXRlcm1pbmUgZHVwbGV4IHN0YXR1
cy4NDQogIGlmIChpbmZvLT5tYXhJbnB1dENoYW5uZWxzIDwgaW5mby0+bWF4
T3V0cHV0Q2hhbm5lbHMpDQ0KICAgIGluZm8tPm1heER1cGxleENoYW5uZWxz
ID0gaW5mby0+bWF4SW5wdXRDaGFubmVsczsNDQogIGVsc2UNDQogICAgaW5m
by0+bWF4RHVwbGV4Q2hhbm5lbHMgPSBpbmZvLT5tYXhPdXRwdXRDaGFubmVs
czsNDQogIGlmIChpbmZvLT5taW5JbnB1dENoYW5uZWxzIDwgaW5mby0+bWlu
T3V0cHV0Q2hhbm5lbHMpDQ0KICAgIGluZm8tPm1pbkR1cGxleENoYW5uZWxz
ID0gaW5mby0+bWluSW5wdXRDaGFubmVsczsNDQogIGVsc2UNDQogICAgaW5m
by0+bWluRHVwbGV4Q2hhbm5lbHMgPSBpbmZvLT5taW5PdXRwdXRDaGFubmVs
czsNDQoNDQogIGlmICggaW5mby0+bWF4RHVwbGV4Q2hhbm5lbHMgPiAwICkg
aW5mby0+aGFzRHVwbGV4U3VwcG9ydCA9IHRydWU7DQ0KICBlbHNlIGluZm8t
Pmhhc0R1cGxleFN1cHBvcnQgPSBmYWxzZTsNDQoNDQogIGluZm8tPnByb2Jl
ZCA9IHRydWU7DQ0KDQ0KICByZXR1cm47DQ0KfQ0NCg0NCmJvb2wgUnRBdWRp
byA6OiBwcm9iZURldmljZU9wZW4oaW50IGRldmljZSwgUlRBVURJT19TVFJF
QU0gKnN0cmVhbSwNDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFNUUkVBTV9NT0RFIG1vZGUsIGludCBjaGFubmVscywgDQ0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlUmF0ZSwgUlRBVURJ
T19GT1JNQVQgZm9ybWF0LA0NCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaW50ICpidWZmZXJTaXplLCBpbnQgbnVtYmVyT2ZCdWZmZXJzKQ0N
CnsNDQogIEhSRVNVTFQgcmVzdWx0Ow0NCiAgSFdORCBoV25kID0gR2V0Rm9y
ZWdyb3VuZFdpbmRvdygpOw0NCiAgLy8gQWNjb3JkaW5nIHRvIGEgbm90ZSBp
biBQb3J0QXVkaW8sIHVzaW5nIEdldERlc2t0b3BXaW5kb3coKQ0NCiAgLy8g
aW5zdGVhZCBvZiBHZXRGb3JlZ3JvdW5kV2luZG93KCkgaXMgc3VwcG9zZWQg
dG8gYXZvaWQgcHJvYmxlbXMNDQogIC8vIHRoYXQgb2NjdXIgd2hlbiB0aGUg
YXBwbGljYXRpb24ncyB3aW5kb3cgaXMgbm90IHRoZSBmb3JlZ3JvdW5kDQ0K
ICAvLyB3aW5kb3cuICBBbHNvLCBpZiB0aGUgYXBwbGljYXRpb24gd2luZG93
IGNsb3NlcyBiZWZvcmUgdGhlDQ0KICAvLyBEaXJlY3RTb3VuZCBidWZmZXIs
IERpcmVjdFNvdW5kIGNhbiBjcmFzaC4gIEhvd2V2ZXIsIGZvciBjb25zb2xl
DQ0KICAvLyBhcHBsaWNhdGlvbnMsIG5vIHNvdW5kIHdhcyBwcm9kdWNlZCB3
aGVuIHVzaW5nIEdldERlc2t0b3BXaW5kb3coKS4NDQogIGxvbmcgYnVmZmVy
X3NpemU7DQ0KICBMUFZPSUQgYXVkaW9QdHI7DQ0KICBEV09SRCBkYXRhTGVu
Ow0NCiAgaW50IG5CdWZmZXJzOw0NCg0NCiAgLy8gQ2hlY2sgdGhlIG51bWJl
ck9mQnVmZmVycyBwYXJhbWV0ZXIgYW5kIGxpbWl0IHRoZSBsb3dlc3QgdmFs
dWUgdG8NDQogIC8vIHR3by4gIFRoaXMgaXMgYSBqdWRnZW1lbnQgY2FsbCBh
bmQgYSB2YWx1ZSBvZiB0d28gaXMgcHJvYmFibHkgdG9vDQ0KICAvLyBsb3cg
Zm9yIGNhcHR1cmUsIGJ1dCBpdCBzaG91bGQgd29yayBmb3IgcGxheWJhY2su
DQ0KICBpZiAobnVtYmVyT2ZCdWZmZXJzIDwgMikNDQogICAgbkJ1ZmZlcnMg
PSAyOw0NCiAgZWxzZQ0NCiAgICBuQnVmZmVycyA9IG51bWJlck9mQnVmZmVy
czsNDQoNDQogIC8vIERlZmluZSB0aGUgd2F2ZSBmb3JtYXQgc3RydWN0dXJl
ICgxNi1iaXQgUENNLCBzcmF0ZSwgY2hhbm5lbHMpDQ0KICBXQVZFRk9STUFU
RVggd2F2ZUZvcm1hdDsNDQogIFplcm9NZW1vcnkoJndhdmVGb3JtYXQsIHNp
emVvZihXQVZFRk9STUFURVgpKTsNDQogIHdhdmVGb3JtYXQud0Zvcm1hdFRh
ZyA9IFdBVkVfRk9STUFUX1BDTTsNDQogIHdhdmVGb3JtYXQubkNoYW5uZWxz
ID0gY2hhbm5lbHM7DQ0KICB3YXZlRm9ybWF0Lm5TYW1wbGVzUGVyU2VjID0g
KHVuc2lnbmVkIGxvbmcpIHNhbXBsZVJhdGU7DQ0KDQ0KICAvLyBEZXRlcm1p
bmUgdGhlIGRhdGEgZm9ybWF0Lg0NCiAgaWYgKCBkZXZpY2VzW2RldmljZV0u
bmF0aXZlRm9ybWF0cyApIHsgLy8gOC1iaXQgYW5kL29yIDE2LWJpdCBzdXBw
b3J0DQ0KICAgIGlmICggZm9ybWF0ID09IFJUQVVESU9fU0lOVDggKSB7DQ0K
ICAgICAgaWYgKCBkZXZpY2VzW2RldmljZV0ubmF0aXZlRm9ybWF0cyAmIFJU
QVVESU9fU0lOVDggKQ0NCiAgICAgICAgd2F2ZUZvcm1hdC53Qml0c1BlclNh
bXBsZSA9IDg7DQ0KICAgICAgZWxzZQ0NCiAgICAgICAgd2F2ZUZvcm1hdC53
Qml0c1BlclNhbXBsZSA9IDE2Ow0NCiAgICB9DQ0KICAgIGVsc2Ugew0NCiAg
ICAgIGlmICggZGV2aWNlc1tkZXZpY2VdLm5hdGl2ZUZvcm1hdHMgJiBSVEFV
RElPX1NJTlQxNiApDQ0KICAgICAgICB3YXZlRm9ybWF0LndCaXRzUGVyU2Ft
cGxlID0gMTY7DQ0KICAgICAgZWxzZQ0NCiAgICAgICAgd2F2ZUZvcm1hdC53
Qml0c1BlclNhbXBsZSA9IDg7DQ0KICAgIH0NDQogIH0NDQogIGVsc2Ugew0N
CiAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBubyByZXBvcnRlZCBk
YXRhIGZvcm1hdHMgZm9yIERpcmVjdFNvdW5kIGRldmljZSAoJXMpLiIsDQ0K
ICAgICAgICAgICAgZGV2aWNlc1tkZXZpY2VdLm5hbWUpOw0NCiAgICBlcnJv
cihSdEVycm9yOjpXQVJOSU5HKTsNDQogICAgcmV0dXJuIEZBSUxVUkU7DQ0K
ICB9DQ0KDQ0KICB3YXZlRm9ybWF0Lm5CbG9ja0FsaWduID0gd2F2ZUZvcm1h
dC5uQ2hhbm5lbHMgKiB3YXZlRm9ybWF0LndCaXRzUGVyU2FtcGxlIC8gODsN
DQogIHdhdmVGb3JtYXQubkF2Z0J5dGVzUGVyU2VjID0gd2F2ZUZvcm1hdC5u
U2FtcGxlc1BlclNlYyAqIHdhdmVGb3JtYXQubkJsb2NrQWxpZ247DQ0KDQ0K
ICBpZiAoIG1vZGUgPT0gUExBWUJBQ0sgKSB7DQ0KDQ0KICAgIGlmICggZGV2
aWNlc1tkZXZpY2VdLm1heE91dHB1dENoYW5uZWxzIDwgY2hhbm5lbHMgKQ0N
CiAgICAgIHJldHVybiBGQUlMVVJFOw0NCg0NCiAgICBMUEdVSUQgaWQgPSBk
ZXZpY2VzW2RldmljZV0uaWRbMF07DQ0KICAgIExQRElSRUNUU09VTkQgIG9i
amVjdDsNDQogICAgTFBESVJFQ1RTT1VOREJVRkZFUiBidWZmZXI7DQ0KICAg
IERTQlVGRkVSREVTQyBidWZmZXJEZXNjcmlwdGlvbjsNDQogICAgDQ0KICAg
IHJlc3VsdCA9IERpcmVjdFNvdW5kQ3JlYXRlKCBpZCwgJm9iamVjdCwgTlVM
TCApOw0NCiAgICBpZiAoIEZBSUxFRChyZXN1bHQpICkgew0NCiAgICAgIHNw
cmludGYobWVzc2FnZSwgIlJ0QXVkaW86IENvdWxkIG5vdCBjcmVhdGUgRGly
ZWN0U291bmQgcGxheWJhY2sgb2JqZWN0ICglcyk6ICVzLiIsDQ0KICAgICAg
ICAgICAgICBkZXZpY2VzW2RldmljZV0ubmFtZSwgZ2V0RXJyb3JTdHJpbmco
cmVzdWx0KSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0K
ICAgICAgcmV0dXJuIEZBSUxVUkU7DQ0KICAgIH0NDQoNDQogICAgLy8gU2V0
IGNvb3BlcmF0aXZlIGxldmVsIHRvIERTU0NMX0VYQ0xVU0lWRQ0NCiAgICBy
ZXN1bHQgPSBvYmplY3QtPlNldENvb3BlcmF0aXZlTGV2ZWwoaFduZCwgRFNT
Q0xfRVhDTFVTSVZFKTsNDQogICAgaWYgKCBGQUlMRUQocmVzdWx0KSApIHsN
DQogICAgICBvYmplY3QtPlJlbGVhc2UoKTsNDQogICAgICBzcHJpbnRmKG1l
c3NhZ2UsICJSdEF1ZGlvOiBVbmFibGUgdG8gc2V0IERpcmVjdFNvdW5kIGNv
b3BlcmF0aXZlIGxldmVsICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICBk
ZXZpY2VzW2RldmljZV0ubmFtZSwgZ2V0RXJyb3JTdHJpbmcocmVzdWx0KSk7
DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAgcmV0
dXJuIEZBSUxVUkU7DQ0KICAgIH0NDQoNDQogICAgLy8gRXZlbiB0aG91Z2gg
d2Ugd2lsbCB3cml0ZSB0byB0aGUgc2Vjb25kYXJ5IGJ1ZmZlciwgd2UgbmVl
ZCB0bw0NCiAgICAvLyBhY2Nlc3MgdGhlIHByaW1hcnkgYnVmZmVyIHRvIHNl
dCB0aGUgY29ycmVjdCBvdXRwdXQgZm9ybWF0Lg0NCiAgICAvLyBUaGUgZGVm
YXVsdCBpcyA4LWJpdCwgMjIga0h6IQ0NCiAgICAvLyBTZXR1cCB0aGUgRFMg
cHJpbWFyeSBidWZmZXIgZGVzY3JpcHRpb24uDQ0KICAgIFplcm9NZW1vcnko
JmJ1ZmZlckRlc2NyaXB0aW9uLCBzaXplb2YoRFNCVUZGRVJERVNDKSk7DQ0K
ICAgIGJ1ZmZlckRlc2NyaXB0aW9uLmR3U2l6ZSA9IHNpemVvZihEU0JVRkZF
UkRFU0MpOw0NCiAgICBidWZmZXJEZXNjcmlwdGlvbi5kd0ZsYWdzID0gRFNC
Q0FQU19QUklNQVJZQlVGRkVSOw0NCiAgICAvLyBPYnRhaW4gdGhlIHByaW1h
cnkgYnVmZmVyDQ0KICAgIHJlc3VsdCA9IG9iamVjdC0+Q3JlYXRlU291bmRC
dWZmZXIoJmJ1ZmZlckRlc2NyaXB0aW9uLCAmYnVmZmVyLCBOVUxMKTsNDQog
ICAgaWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgICBvYmplY3QtPlJl
bGVhc2UoKTsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBV
bmFibGUgdG8gYWNjZXNzIERTIHByaW1hcnkgYnVmZmVyICglcyk6ICVzLiIs
DQ0KICAgICAgICAgICAgICBkZXZpY2VzW2RldmljZV0ubmFtZSwgZ2V0RXJy
b3JTdHJpbmcocmVzdWx0KSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6V0FS
TklORyk7DQ0KICAgICAgcmV0dXJuIEZBSUxVUkU7DQ0KICAgIH0NDQoNDQog
ICAgLy8gU2V0IHRoZSBwcmltYXJ5IERTIGJ1ZmZlciBzb3VuZCBmb3JtYXQu
DQ0KICAgIHJlc3VsdCA9IGJ1ZmZlci0+U2V0Rm9ybWF0KCZ3YXZlRm9ybWF0
KTsNDQogICAgaWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgICBvYmpl
Y3QtPlJlbGVhc2UoKTsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1
ZGlvOiBVbmFibGUgdG8gc2V0IERTIHByaW1hcnkgYnVmZmVyIGZvcm1hdCAo
JXMpOiAlcy4iLA0NCiAgICAgICAgICAgICAgZGV2aWNlc1tkZXZpY2VdLm5h
bWUsIGdldEVycm9yU3RyaW5nKHJlc3VsdCkpOw0NCiAgICAgIGVycm9yKFJ0
RXJyb3I6OldBUk5JTkcpOw0NCiAgICAgIHJldHVybiBGQUlMVVJFOw0NCiAg
ICB9DQ0KDQ0KICAgIC8vIFNldHVwIHRoZSBzZWNvbmRhcnkgRFMgYnVmZmVy
IGRlc2NyaXB0aW9uLg0NCiAgICBidWZmZXJfc2l6ZSA9IGNoYW5uZWxzICog
KmJ1ZmZlclNpemUgKiBuQnVmZmVycyAqIHdhdmVGb3JtYXQud0JpdHNQZXJT
YW1wbGUgLyA4Ow0NCiAgICBaZXJvTWVtb3J5KCZidWZmZXJEZXNjcmlwdGlv
biwgc2l6ZW9mKERTQlVGRkVSREVTQykpOw0NCiAgICBidWZmZXJEZXNjcmlw
dGlvbi5kd1NpemUgPSBzaXplb2YoRFNCVUZGRVJERVNDKTsNDQogICAgYnVm
ZmVyRGVzY3JpcHRpb24uZHdGbGFncyA9ICggRFNCQ0FQU19TVElDS1lGT0NV
UyB8DQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTQkNB
UFNfR0VUQ1VSUkVOVFBPU0lUSU9OMiB8DQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIERTQkNBUFNfTE9DSEFSRFdBUkUgKTsgIC8vIEZv
cmNlIGhhcmR3YXJlIG1peGluZw0NCiAgICBidWZmZXJEZXNjcmlwdGlvbi5k
d0J1ZmZlckJ5dGVzID0gYnVmZmVyX3NpemU7DQ0KICAgIGJ1ZmZlckRlc2Ny
aXB0aW9uLmxwd2Z4Rm9ybWF0ID0gJndhdmVGb3JtYXQ7DQ0KDQ0KICAgIC8v
IFRyeSB0byBjcmVhdGUgdGhlIHNlY29uZGFyeSBEUyBidWZmZXIuICBJZiB0
aGF0IGRvZXNuJ3Qgd29yaywNDQogICAgLy8gdHJ5IHRvIHVzZSBzb2Z0d2Fy
ZSBtaXhpbmcuICBPdGhlcndpc2UsIHRoZXJlJ3MgYSBwcm9ibGVtLg0NCiAg
ICByZXN1bHQgPSBvYmplY3QtPkNyZWF0ZVNvdW5kQnVmZmVyKCZidWZmZXJE
ZXNjcmlwdGlvbiwgJmJ1ZmZlciwgTlVMTCk7DQ0KICAgIGlmICggRkFJTEVE
KHJlc3VsdCkgKSB7DQ0KICAgICAgYnVmZmVyRGVzY3JpcHRpb24uZHdGbGFn
cyA9ICggRFNCQ0FQU19TVElDS1lGT0NVUyB8DQ0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgRFNCQ0FQU19HRVRDVVJSRU5UUE9TSVRJ
T04yIHwNDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBE
U0JDQVBTX0xPQ1NPRlRXQVJFICk7ICAvLyBGb3JjZSBzb2Z0d2FyZSBtaXhp
bmcNDQogICAgICByZXN1bHQgPSBvYmplY3QtPkNyZWF0ZVNvdW5kQnVmZmVy
KCZidWZmZXJEZXNjcmlwdGlvbiwgJmJ1ZmZlciwgTlVMTCk7DQ0KICAgICAg
aWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgICAgIG9iamVjdC0+UmVs
ZWFzZSgpOw0NCiAgICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzog
VW5hYmxlIHRvIGNyZWF0ZSBzZWNvbmRhcnkgRFMgYnVmZmVyICglcyk6ICVz
LiIsDQ0KICAgICAgICAgICAgICAgIGRldmljZXNbZGV2aWNlXS5uYW1lLCBn
ZXRFcnJvclN0cmluZyhyZXN1bHQpKTsNDQogICAgICAgIGVycm9yKFJ0RXJy
b3I6OldBUk5JTkcpOw0NCiAgICAgICAgcmV0dXJuIEZBSUxVUkU7DQ0KICAg
ICAgfQ0NCiAgICB9DQ0KDQ0KICAgIC8vIEdldCB0aGUgYnVmZmVyIHNpemUg
Li4uIG1pZ2h0IGJlIGRpZmZlcmVudCBmcm9tIHdoYXQgd2Ugc3BlY2lmaWVk
Lg0NCiAgICBEU0JDQVBTIGRzYmNhcHM7DQ0KICAgIGRzYmNhcHMuZHdTaXpl
ID0gc2l6ZW9mKERTQkNBUFMpOw0NCiAgICBidWZmZXItPkdldENhcHMoJmRz
YmNhcHMpOw0NCiAgICBidWZmZXJfc2l6ZSA9IGRzYmNhcHMuZHdCdWZmZXJC
eXRlczsNDQoNDQogICAgLy8gTG9jayB0aGUgRFMgYnVmZmVyDQ0KICAgIHJl
c3VsdCA9IGJ1ZmZlci0+TG9jaygwLCBidWZmZXJfc2l6ZSwgJmF1ZGlvUHRy
LCAmZGF0YUxlbiwgTlVMTCwgTlVMTCwgMCk7DQ0KICAgIGlmICggRkFJTEVE
KHJlc3VsdCkgKSB7DQ0KICAgICAgb2JqZWN0LT5SZWxlYXNlKCk7DQ0KICAg
ICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5hYmxlIHRvIGxvY2sg
RFMgYnVmZmVyICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICBkZXZpY2Vz
W2RldmljZV0ubmFtZSwgZ2V0RXJyb3JTdHJpbmcocmVzdWx0KSk7DQ0KICAg
ICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAgcmV0dXJuIEZB
SUxVUkU7DQ0KICAgIH0NDQoNDQogICAgLy8gWmVybyB0aGUgRFMgYnVmZmVy
DQ0KICAgIFplcm9NZW1vcnkoYXVkaW9QdHIsIGRhdGFMZW4pOw0NCg0NCiAg
ICAvLyBVbmxvY2sgdGhlIERTIGJ1ZmZlcg0NCiAgICByZXN1bHQgPSBidWZm
ZXItPlVubG9jayhhdWRpb1B0ciwgZGF0YUxlbiwgTlVMTCwgMCk7DQ0KICAg
IGlmICggRkFJTEVEKHJlc3VsdCkgKSB7DQ0KICAgICAgb2JqZWN0LT5SZWxl
YXNlKCk7DQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5h
YmxlIHRvIHVubG9jayBEUyBidWZmZXIoJXMpOiAlcy4iLA0NCiAgICAgICAg
ICAgICAgZGV2aWNlc1tkZXZpY2VdLm5hbWUsIGdldEVycm9yU3RyaW5nKHJl
c3VsdCkpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAg
ICAgIHJldHVybiBGQUlMVVJFOw0NCiAgICB9DQ0KDQ0KICAgIHN0cmVhbS0+
aGFuZGxlWzBdLm9iamVjdCA9ICh2b2lkICopIG9iamVjdDsNDQogICAgc3Ry
ZWFtLT5oYW5kbGVbMF0uYnVmZmVyID0gKHZvaWQgKikgYnVmZmVyOw0NCiAg
ICBzdHJlYW0tPm5EZXZpY2VDaGFubmVsc1swXSA9IGNoYW5uZWxzOw0NCiAg
fQ0NCg0NCiAgaWYgKCBtb2RlID09IFJFQ09SRCApIHsNDQoNDQogICAgaWYg
KCBkZXZpY2VzW2RldmljZV0ubWF4SW5wdXRDaGFubmVscyA8IGNoYW5uZWxz
ICkNDQogICAgICByZXR1cm4gRkFJTFVSRTsNDQoNDQogICAgTFBHVUlEIGlk
ID0gZGV2aWNlc1tkZXZpY2VdLmlkWzFdOw0NCiAgICBMUERJUkVDVFNPVU5E
Q0FQVFVSRSAgb2JqZWN0Ow0NCiAgICBMUERJUkVDVFNPVU5EQ0FQVFVSRUJV
RkZFUiBidWZmZXI7DQ0KICAgIERTQ0JVRkZFUkRFU0MgYnVmZmVyRGVzY3Jp
cHRpb247DQ0KDQ0KICAgIHJlc3VsdCA9IERpcmVjdFNvdW5kQ2FwdHVyZUNy
ZWF0ZSggaWQsICZvYmplY3QsIE5VTEwgKTsNDQogICAgaWYgKCBGQUlMRUQo
cmVzdWx0KSApIHsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlv
OiBDb3VsZCBub3QgY3JlYXRlIERpcmVjdFNvdW5kIGNhcHR1cmUgb2JqZWN0
ICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICBkZXZpY2VzW2RldmljZV0u
bmFtZSwgZ2V0RXJyb3JTdHJpbmcocmVzdWx0KSk7DQ0KICAgICAgZXJyb3Io
UnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAgcmV0dXJuIEZBSUxVUkU7DQ0K
ICAgIH0NDQoNDQogICAgLy8gU2V0dXAgdGhlIHNlY29uZGFyeSBEUyBidWZm
ZXIgZGVzY3JpcHRpb24uDQ0KICAgIGJ1ZmZlcl9zaXplID0gY2hhbm5lbHMg
KiAqYnVmZmVyU2l6ZSAqIG5CdWZmZXJzICogd2F2ZUZvcm1hdC53Qml0c1Bl
clNhbXBsZSAvIDg7DQ0KICAgIFplcm9NZW1vcnkoJmJ1ZmZlckRlc2NyaXB0
aW9uLCBzaXplb2YoRFNDQlVGRkVSREVTQykpOw0NCiAgICBidWZmZXJEZXNj
cmlwdGlvbi5kd1NpemUgPSBzaXplb2YoRFNDQlVGRkVSREVTQyk7DQ0KICAg
IGJ1ZmZlckRlc2NyaXB0aW9uLmR3RmxhZ3MgPSAwOw0NCiAgICBidWZmZXJE
ZXNjcmlwdGlvbi5kd1Jlc2VydmVkID0gMDsNDQogICAgYnVmZmVyRGVzY3Jp
cHRpb24uZHdCdWZmZXJCeXRlcyA9IGJ1ZmZlcl9zaXplOw0NCiAgICBidWZm
ZXJEZXNjcmlwdGlvbi5scHdmeEZvcm1hdCA9ICZ3YXZlRm9ybWF0Ow0NCg0N
CiAgICAvLyBDcmVhdGUgdGhlIGNhcHR1cmUgYnVmZmVyLg0NCiAgICByZXN1
bHQgPSBvYmplY3QtPkNyZWF0ZUNhcHR1cmVCdWZmZXIoJmJ1ZmZlckRlc2Ny
aXB0aW9uLCAmYnVmZmVyLCBOVUxMKTsNDQogICAgaWYgKCBGQUlMRUQocmVz
dWx0KSApIHsNDQogICAgICBvYmplY3QtPlJlbGVhc2UoKTsNDQogICAgICBz
cHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBVbmFibGUgdG8gY3JlYXRlIERT
IGNhcHR1cmUgYnVmZmVyICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICBk
ZXZpY2VzW2RldmljZV0ubmFtZSwgZ2V0RXJyb3JTdHJpbmcocmVzdWx0KSk7
DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAgcmV0
dXJuIEZBSUxVUkU7DQ0KICAgIH0NDQoNDQogICAgLy8gTG9jayB0aGUgY2Fw
dHVyZSBidWZmZXINDQogICAgcmVzdWx0ID0gYnVmZmVyLT5Mb2NrKDAsIGJ1
ZmZlcl9zaXplLCAmYXVkaW9QdHIsICZkYXRhTGVuLCBOVUxMLCBOVUxMLCAw
KTsNDQogICAgaWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgICBvYmpl
Y3QtPlJlbGVhc2UoKTsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1
ZGlvOiBVbmFibGUgdG8gbG9jayBEUyBjYXB0dXJlIGJ1ZmZlciAoJXMpOiAl
cy4iLA0NCiAgICAgICAgICAgICAgZGV2aWNlc1tkZXZpY2VdLm5hbWUsIGdl
dEVycm9yU3RyaW5nKHJlc3VsdCkpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6
OldBUk5JTkcpOw0NCiAgICAgIHJldHVybiBGQUlMVVJFOw0NCiAgICB9DQ0K
DQ0KICAgIC8vIFplcm8gdGhlIGJ1ZmZlcg0NCiAgICBaZXJvTWVtb3J5KGF1
ZGlvUHRyLCBkYXRhTGVuKTsNDQoNDQogICAgLy8gVW5sb2NrIHRoZSBidWZm
ZXINDQogICAgcmVzdWx0ID0gYnVmZmVyLT5VbmxvY2soYXVkaW9QdHIsIGRh
dGFMZW4sIE5VTEwsIDApOw0NCiAgICBpZiAoIEZBSUxFRChyZXN1bHQpICkg
ew0NCiAgICAgIG9iamVjdC0+UmVsZWFzZSgpOw0NCiAgICAgIHNwcmludGYo
bWVzc2FnZSwgIlJ0QXVkaW86IFVuYWJsZSB0byB1bmxvY2sgRFMgY2FwdHVy
ZSBidWZmZXIgKCVzKTogJXMuIiwNDQogICAgICAgICAgICAgIGRldmljZXNb
ZGV2aWNlXS5uYW1lLCBnZXRFcnJvclN0cmluZyhyZXN1bHQpKTsNDQogICAg
ICBlcnJvcihSdEVycm9yOjpXQVJOSU5HKTsNDQogICAgICByZXR1cm4gRkFJ
TFVSRTsNDQogICAgfQ0NCg0NCiAgICBzdHJlYW0tPmhhbmRsZVsxXS5vYmpl
Y3QgPSAodm9pZCAqKSBvYmplY3Q7DQ0KICAgIHN0cmVhbS0+aGFuZGxlWzFd
LmJ1ZmZlciA9ICh2b2lkICopIGJ1ZmZlcjsNDQogICAgc3RyZWFtLT5uRGV2
aWNlQ2hhbm5lbHNbMV0gPSBjaGFubmVsczsNDQogIH0NDQoNDQogIHN0cmVh
bS0+dXNlckZvcm1hdCA9IGZvcm1hdDsNDQogIGlmICggd2F2ZUZvcm1hdC53
Qml0c1BlclNhbXBsZSA9PSA4ICkNDQogICAgc3RyZWFtLT5kZXZpY2VGb3Jt
YXRbbW9kZV0gPSBSVEFVRElPX1NJTlQ4Ow0NCiAgZWxzZQ0NCiAgICBzdHJl
YW0tPmRldmljZUZvcm1hdFttb2RlXSA9IFJUQVVESU9fU0lOVDE2Ow0NCiAg
c3RyZWFtLT5uVXNlckNoYW5uZWxzW21vZGVdID0gY2hhbm5lbHM7DQ0KICAq
YnVmZmVyU2l6ZSA9IGJ1ZmZlcl9zaXplIC8gKGNoYW5uZWxzICogbkJ1ZmZl
cnMgKiB3YXZlRm9ybWF0LndCaXRzUGVyU2FtcGxlIC8gOCk7DQ0KICBzdHJl
YW0tPmJ1ZmZlclNpemUgPSAqYnVmZmVyU2l6ZTsNDQoNDQogIC8vIFNldCBm
bGFncyBmb3IgYnVmZmVyIGNvbnZlcnNpb24NDQogIHN0cmVhbS0+ZG9Db252
ZXJ0QnVmZmVyW21vZGVdID0gZmFsc2U7DQ0KICBpZiAoc3RyZWFtLT51c2Vy
Rm9ybWF0ICE9IHN0cmVhbS0+ZGV2aWNlRm9ybWF0W21vZGVdKQ0NCiAgICBz
dHJlYW0tPmRvQ29udmVydEJ1ZmZlclttb2RlXSA9IHRydWU7DQ0KICBpZiAo
c3RyZWFtLT5uVXNlckNoYW5uZWxzW21vZGVdIDwgc3RyZWFtLT5uRGV2aWNl
Q2hhbm5lbHNbbW9kZV0pDQ0KICAgIHN0cmVhbS0+ZG9Db252ZXJ0QnVmZmVy
W21vZGVdID0gdHJ1ZTsNDQoNDQogIC8vIEFsbG9jYXRlIG5lY2Vzc2FyeSBp
bnRlcm5hbCBidWZmZXJzDQ0KICBpZiAoIHN0cmVhbS0+blVzZXJDaGFubmVs
c1swXSAhPSBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMV0gKSB7DQ0KDQ0KICAg
IGxvbmcgYnVmZmVyX2J5dGVzOw0NCiAgICBpZiAoc3RyZWFtLT5uVXNlckNo
YW5uZWxzWzBdID49IHN0cmVhbS0+blVzZXJDaGFubmVsc1sxXSkNDQogICAg
ICBidWZmZXJfYnl0ZXMgPSBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMF07DQ0K
ICAgIGVsc2UNDQogICAgICBidWZmZXJfYnl0ZXMgPSBzdHJlYW0tPm5Vc2Vy
Q2hhbm5lbHNbMV07DQ0KDQ0KICAgIGJ1ZmZlcl9ieXRlcyAqPSAqYnVmZmVy
U2l6ZSAqIGZvcm1hdEJ5dGVzKHN0cmVhbS0+dXNlckZvcm1hdCk7DQ0KICAg
IGlmIChzdHJlYW0tPnVzZXJCdWZmZXIpIGZyZWUoc3RyZWFtLT51c2VyQnVm
ZmVyKTsNDQogICAgc3RyZWFtLT51c2VyQnVmZmVyID0gKGNoYXIgKikgY2Fs
bG9jKGJ1ZmZlcl9ieXRlcywgMSk7DQ0KICAgIGlmIChzdHJlYW0tPnVzZXJC
dWZmZXIgPT0gTlVMTCkNDQogICAgICBnb3RvIG1lbW9yeV9lcnJvcjsNDQog
IH0NDQoNDQogIGlmICggc3RyZWFtLT5kb0NvbnZlcnRCdWZmZXJbbW9kZV0g
KSB7DQ0KDQ0KICAgIGxvbmcgYnVmZmVyX2J5dGVzOw0NCiAgICBib29sIG1h
a2VCdWZmZXIgPSB0cnVlOw0NCiAgICBpZiAoIG1vZGUgPT0gUExBWUJBQ0sg
KQ0NCiAgICAgIGJ1ZmZlcl9ieXRlcyA9IHN0cmVhbS0+bkRldmljZUNoYW5u
ZWxzWzBdICogZm9ybWF0Qnl0ZXMoc3RyZWFtLT5kZXZpY2VGb3JtYXRbMF0p
Ow0NCiAgICBlbHNlIHsgLy8gbW9kZSA9PSBSRUNPUkQNDQogICAgICBidWZm
ZXJfYnl0ZXMgPSBzdHJlYW0tPm5EZXZpY2VDaGFubmVsc1sxXSAqIGZvcm1h
dEJ5dGVzKHN0cmVhbS0+ZGV2aWNlRm9ybWF0WzFdKTsNDQogICAgICBpZiAo
IHN0cmVhbS0+bW9kZSA9PSBQTEFZQkFDSyApIHsNDQogICAgICAgIGxvbmcg
Ynl0ZXNfb3V0ID0gc3RyZWFtLT5uRGV2aWNlQ2hhbm5lbHNbMF0gKiBmb3Jt
YXRCeXRlcyhzdHJlYW0tPmRldmljZUZvcm1hdFswXSk7DQ0KICAgICAgICBp
ZiAoIGJ1ZmZlcl9ieXRlcyA+IGJ5dGVzX291dCApDQ0KICAgICAgICAgIGJ1
ZmZlcl9ieXRlcyA9IChidWZmZXJfYnl0ZXMgPiBieXRlc19vdXQpID8gYnVm
ZmVyX2J5dGVzIDogYnl0ZXNfb3V0Ow0NCiAgICAgICAgZWxzZQ0NCiAgICAg
ICAgICBtYWtlQnVmZmVyID0gZmFsc2U7DQ0KICAgICAgfQ0NCiAgICB9DQ0K
DQ0KICAgIGlmICggbWFrZUJ1ZmZlciApIHsNDQogICAgICBidWZmZXJfYnl0
ZXMgKj0gKmJ1ZmZlclNpemU7DQ0KICAgICAgaWYgKHN0cmVhbS0+ZGV2aWNl
QnVmZmVyKSBmcmVlKHN0cmVhbS0+ZGV2aWNlQnVmZmVyKTsNDQogICAgICBz
dHJlYW0tPmRldmljZUJ1ZmZlciA9IChjaGFyICopIGNhbGxvYyhidWZmZXJf
Ynl0ZXMsIDEpOw0NCiAgICAgIGlmIChzdHJlYW0tPmRldmljZUJ1ZmZlciA9
PSBOVUxMKQ0NCiAgICAgICAgZ290byBtZW1vcnlfZXJyb3I7DQ0KICAgIH0N
DQogIH0NDQoNDQogIHN0cmVhbS0+ZGV2aWNlW21vZGVdID0gZGV2aWNlOw0N
CiAgc3RyZWFtLT5zdGF0ZSA9IFNUUkVBTV9TVE9QUEVEOw0NCiAgaWYgKCBz
dHJlYW0tPm1vZGUgPT0gUExBWUJBQ0sgJiYgbW9kZSA9PSBSRUNPUkQgKQ0N
CiAgICAvLyBXZSBoYWQgYWxyZWFkeSBzZXQgdXAgYW4gb3V0cHV0IHN0cmVh
bS4NDQogICAgc3RyZWFtLT5tb2RlID0gRFVQTEVYOw0NCiAgZWxzZQ0NCiAg
ICBzdHJlYW0tPm1vZGUgPSBtb2RlOw0NCiAgc3RyZWFtLT5uQnVmZmVycyA9
IG5CdWZmZXJzOw0NCiAgc3RyZWFtLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0
ZTsNDQoNDQogIHJldHVybiBTVUNDRVNTOw0NCg0NCiBtZW1vcnlfZXJyb3I6
DQ0KICBpZiAoc3RyZWFtLT5oYW5kbGVbMF0ub2JqZWN0KSB7DQ0KICAgIExQ
RElSRUNUU09VTkQgb2JqZWN0ID0gKExQRElSRUNUU09VTkQpIHN0cmVhbS0+
aGFuZGxlWzBdLm9iamVjdDsNDQogICAgTFBESVJFQ1RTT1VOREJVRkZFUiBi
dWZmZXIgPSAoTFBESVJFQ1RTT1VOREJVRkZFUikgc3RyZWFtLT5oYW5kbGVb
MF0uYnVmZmVyOw0NCiAgICBpZiAoYnVmZmVyKSB7DQ0KICAgICAgYnVmZmVy
LT5SZWxlYXNlKCk7DQ0KICAgICAgc3RyZWFtLT5oYW5kbGVbMF0uYnVmZmVy
ID0gTlVMTDsNDQogICAgfQ0NCiAgICBvYmplY3QtPlJlbGVhc2UoKTsNDQog
ICAgc3RyZWFtLT5oYW5kbGVbMF0ub2JqZWN0ID0gTlVMTDsNDQogIH0NDQog
IGlmIChzdHJlYW0tPmhhbmRsZVsxXS5vYmplY3QpIHsNDQogICAgTFBESVJF
Q1RTT1VORENBUFRVUkUgb2JqZWN0ID0gKExQRElSRUNUU09VTkRDQVBUVVJF
KSBzdHJlYW0tPmhhbmRsZVsxXS5vYmplY3Q7DQ0KICAgIExQRElSRUNUU09V
TkRDQVBUVVJFQlVGRkVSIGJ1ZmZlciA9IChMUERJUkVDVFNPVU5EQ0FQVFVS
RUJVRkZFUikgc3RyZWFtLT5oYW5kbGVbMV0uYnVmZmVyOw0NCiAgICBpZiAo
YnVmZmVyKSB7DQ0KICAgICAgYnVmZmVyLT5SZWxlYXNlKCk7DQ0KICAgICAg
c3RyZWFtLT5oYW5kbGVbMV0uYnVmZmVyID0gTlVMTDsNDQogICAgfQ0NCiAg
ICBvYmplY3QtPlJlbGVhc2UoKTsNDQogICAgc3RyZWFtLT5oYW5kbGVbMV0u
b2JqZWN0ID0gTlVMTDsNDQogIH0NDQogIGlmIChzdHJlYW0tPnVzZXJCdWZm
ZXIpIHsNDQogICAgZnJlZShzdHJlYW0tPnVzZXJCdWZmZXIpOw0NCiAgICBz
dHJlYW0tPnVzZXJCdWZmZXIgPSAwOw0NCiAgfQ0NCiAgc3ByaW50ZihtZXNz
YWdlLCAiUnRBdWRpbzogZXJyb3IgYWxsb2NhdGluZyBidWZmZXIgbWVtb3J5
ICglcykuIiwNDQogICAgICAgICAgZGV2aWNlc1tkZXZpY2VdLm5hbWUpOw0N
CiAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICByZXR1cm4gRkFJTFVS
RTsNDQp9DQ0KDQ0Kdm9pZCBSdEF1ZGlvIDo6IGNhbmNlbFN0cmVhbUNhbGxi
YWNrKGludCBzdHJlYW1JZCkNDQp7DQ0KICBSVEFVRElPX1NUUkVBTSAqc3Ry
ZWFtID0gKFJUQVVESU9fU1RSRUFNICopIHZlcmlmeVN0cmVhbShzdHJlYW1J
ZCk7DQ0KDQ0KICBpZiAoc3RyZWFtLT51c2luZ0NhbGxiYWNrKSB7DQ0KICAg
IHN0cmVhbS0+dXNpbmdDYWxsYmFjayA9IGZhbHNlOw0NCiAgICBXYWl0Rm9y
U2luZ2xlT2JqZWN0KCAoSEFORExFKXN0cmVhbS0+dGhyZWFkLCBJTkZJTklU
RSApOw0NCiAgICBDbG9zZUhhbmRsZSggKEhBTkRMRSlzdHJlYW0tPnRocmVh
ZCApOw0NCiAgICBzdHJlYW0tPnRocmVhZCA9IDA7DQ0KICAgIHN0cmVhbS0+
Y2FsbGJhY2sgPSBOVUxMOw0NCiAgICBzdHJlYW0tPnVzZXJEYXRhID0gTlVM
TDsNDQogIH0NDQp9DQ0KDQ0Kdm9pZCBSdEF1ZGlvIDo6IGNsb3NlU3RyZWFt
KGludCBzdHJlYW1JZCkNDQp7DQ0KICAvLyBXZSBkb24ndCB3YW50IGFuIGV4
Y2VwdGlvbiB0byBiZSB0aHJvd24gaGVyZSBiZWNhdXNlIHRoaXMNDQogIC8v
IGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBvdXIgY2xhc3MgZGVzdHJ1Y3Rvci4g
IFNvLCBkbyBvdXIgb3duDQ0KICAvLyBzdHJlYW1JZCBjaGVjay4NDQogIGlm
ICggc3RyZWFtcy5maW5kKCBzdHJlYW1JZCApID09IHN0cmVhbXMuZW5kKCkg
KSB7DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IGludmFsaWQg
c3RyZWFtIGlkZW50aWZpZXIhIik7DQ0KICAgIGVycm9yKFJ0RXJyb3I6OldB
Uk5JTkcpOw0NCiAgICByZXR1cm47DQ0KICB9DQ0KDQ0KICBSVEFVRElPX1NU
UkVBTSAqc3RyZWFtID0gKFJUQVVESU9fU1RSRUFNICopIHN0cmVhbXNbc3Ry
ZWFtSWRdOw0NCg0NCiAgaWYgKHN0cmVhbS0+dXNpbmdDYWxsYmFjaykgew0N
CiAgICBzdHJlYW0tPnVzaW5nQ2FsbGJhY2sgPSBmYWxzZTsNDQogICAgV2Fp
dEZvclNpbmdsZU9iamVjdCggKEhBTkRMRSlzdHJlYW0tPnRocmVhZCwgSU5G
SU5JVEUgKTsNDQogICAgQ2xvc2VIYW5kbGUoIChIQU5ETEUpc3RyZWFtLT50
aHJlYWQgKTsNDQogIH0NDQoNDQogIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigm
c3RyZWFtLT5tdXRleCk7DQ0KDQ0KICBpZiAoc3RyZWFtLT5oYW5kbGVbMF0u
b2JqZWN0KSB7DQ0KICAgIExQRElSRUNUU09VTkQgb2JqZWN0ID0gKExQRElS
RUNUU09VTkQpIHN0cmVhbS0+aGFuZGxlWzBdLm9iamVjdDsNDQogICAgTFBE
SVJFQ1RTT1VOREJVRkZFUiBidWZmZXIgPSAoTFBESVJFQ1RTT1VOREJVRkZF
Uikgc3RyZWFtLT5oYW5kbGVbMF0uYnVmZmVyOw0NCiAgICBpZiAoYnVmZmVy
KSB7DQ0KICAgICAgYnVmZmVyLT5TdG9wKCk7DQ0KICAgICAgYnVmZmVyLT5S
ZWxlYXNlKCk7DQ0KICAgIH0NDQogICAgb2JqZWN0LT5SZWxlYXNlKCk7DQ0K
ICB9DQ0KDQ0KICBpZiAoc3RyZWFtLT5oYW5kbGVbMV0ub2JqZWN0KSB7DQ0K
ICAgIExQRElSRUNUU09VTkRDQVBUVVJFIG9iamVjdCA9IChMUERJUkVDVFNP
VU5EQ0FQVFVSRSkgc3RyZWFtLT5oYW5kbGVbMV0ub2JqZWN0Ow0NCiAgICBM
UERJUkVDVFNPVU5EQ0FQVFVSRUJVRkZFUiBidWZmZXIgPSAoTFBESVJFQ1RT
T1VORENBUFRVUkVCVUZGRVIpIHN0cmVhbS0+aGFuZGxlWzFdLmJ1ZmZlcjsN
DQogICAgaWYgKGJ1ZmZlcikgew0NCiAgICAgIGJ1ZmZlci0+U3RvcCgpOw0N
CiAgICAgIGJ1ZmZlci0+UmVsZWFzZSgpOw0NCiAgICB9DQ0KICAgIG9iamVj
dC0+UmVsZWFzZSgpOw0NCiAgfQ0NCg0NCiAgaWYgKHN0cmVhbS0+dXNlckJ1
ZmZlcikNDQogICAgZnJlZShzdHJlYW0tPnVzZXJCdWZmZXIpOw0NCg0NCiAg
aWYgKHN0cmVhbS0+ZGV2aWNlQnVmZmVyKQ0NCiAgICBmcmVlKHN0cmVhbS0+
ZGV2aWNlQnVmZmVyKTsNDQoNDQogIGZyZWUoc3RyZWFtKTsNDQogIHN0cmVh
bXMuZXJhc2Uoc3RyZWFtSWQpOw0NCn0NDQoNDQp2b2lkIFJ0QXVkaW8gOjog
c3RhcnRTdHJlYW0oaW50IHN0cmVhbUlkKQ0NCnsNDQogIFJUQVVESU9fU1RS
RUFNICpzdHJlYW0gPSAoUlRBVURJT19TVFJFQU0gKikgdmVyaWZ5U3RyZWFt
KHN0cmVhbUlkKTsNDQoNDQogIE1VVEVYX0xPQ0soJnN0cmVhbS0+bXV0ZXgp
Ow0NCg0NCiAgaWYgKHN0cmVhbS0+c3RhdGUgPT0gU1RSRUFNX1JVTk5JTkcp
DQ0KICAgIGdvdG8gdW5sb2NrOw0NCg0NCiAgSFJFU1VMVCByZXN1bHQ7DQ0K
ICBpZiAoc3RyZWFtLT5tb2RlID09IFBMQVlCQUNLIHx8IHN0cmVhbS0+bW9k
ZSA9PSBEVVBMRVgpIHsNDQogICAgTFBESVJFQ1RTT1VOREJVRkZFUiBidWZm
ZXIgPSAoTFBESVJFQ1RTT1VOREJVRkZFUikgc3RyZWFtLT5oYW5kbGVbMF0u
YnVmZmVyOw0NCiAgICByZXN1bHQgPSBidWZmZXItPlBsYXkoMCwgMCwgRFNC
UExBWV9MT09QSU5HICk7DQ0KICAgIGlmICggRkFJTEVEKHJlc3VsdCkgKSB7
DQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5hYmxlIHRv
IHN0YXJ0IERTIGJ1ZmZlciAoJXMpOiAlcy4iLA0NCiAgICAgICAgICAgICAg
ZGV2aWNlc1tzdHJlYW0tPmRldmljZVswXV0ubmFtZSwgZ2V0RXJyb3JTdHJp
bmcocmVzdWx0KSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVSX0VS
Uk9SKTsNDQogICAgfQ0NCiAgfQ0NCg0NCiAgaWYgKHN0cmVhbS0+bW9kZSA9
PSBSRUNPUkQgfHwgc3RyZWFtLT5tb2RlID09IERVUExFWCkgew0NCiAgICBM
UERJUkVDVFNPVU5EQ0FQVFVSRUJVRkZFUiBidWZmZXIgPSAoTFBESVJFQ1RT
T1VORENBUFRVUkVCVUZGRVIpIHN0cmVhbS0+aGFuZGxlWzFdLmJ1ZmZlcjsN
DQogICAgcmVzdWx0ID0gYnVmZmVyLT5TdGFydChEU0NCU1RBUlRfTE9PUElO
RyApOw0NCiAgICBpZiAoIEZBSUxFRChyZXN1bHQpICkgew0NCiAgICAgIHNw
cmludGYobWVzc2FnZSwgIlJ0QXVkaW86IFVuYWJsZSB0byBzdGFydCBEUyBj
YXB0dXJlIGJ1ZmZlciAoJXMpOiAlcy4iLA0NCiAgICAgICAgICAgICAgZGV2
aWNlc1tzdHJlYW0tPmRldmljZVsxXV0ubmFtZSwgZ2V0RXJyb3JTdHJpbmco
cmVzdWx0KSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVSX0VSUk9S
KTsNDQogICAgfQ0NCiAgfQ0NCiAgc3RyZWFtLT5zdGF0ZSA9IFNUUkVBTV9S
VU5OSU5HOw0NCg0NCiB1bmxvY2s6DQ0KICBNVVRFWF9VTkxPQ0soJnN0cmVh
bS0+bXV0ZXgpOw0NCn0NDQoNDQp2b2lkIFJ0QXVkaW8gOjogc3RvcFN0cmVh
bShpbnQgc3RyZWFtSWQpDQ0Kew0NCiAgUlRBVURJT19TVFJFQU0gKnN0cmVh
bSA9IChSVEFVRElPX1NUUkVBTSAqKSB2ZXJpZnlTdHJlYW0oc3RyZWFtSWQp
Ow0NCg0NCiAgTVVURVhfTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KDQ0KICBp
ZiAoc3RyZWFtLT5zdGF0ZSA9PSBTVFJFQU1fU1RPUFBFRCkgew0NCiAgICBN
VVRFWF9VTkxPQ0soJnN0cmVhbS0+bXV0ZXgpOw0NCiAgICByZXR1cm47DQ0K
ICB9DQ0KDQ0KICAvLyBUaGVyZSBpcyBubyBzcGVjaWZpYyBEaXJlY3RTb3Vu
ZCBBUEkgY2FsbCB0byAiZHJhaW4iIGEgYnVmZmVyDQ0KICAvLyBiZWZvcmUg
c3RvcHBpbmcuICBXZSBjYW4gaGFjayB0aGlzIGZvciBwbGF5YmFjayBieSB3
cml0aW5nIHplcm9lcw0NCiAgLy8gZm9yIGFub3RoZXIgYnVmZmVyU2l6ZSAq
IG5CdWZmZXJzIGZyYW1lcy4gIEZvciBjYXB0dXJlLCB0aGUNDQogIC8vIGNv
bmNlcHQgaXMgbGVzcyBjbGVhciBzbyB3ZSdsbCByZXBlYXQgd2hhdCB3ZSBk
byBpbiB0aGUNDQogIC8vIGFib3J0U3RyZWFtKCkgY2FzZS4NDQogIEhSRVNV
TFQgcmVzdWx0Ow0NCiAgRFdPUkQgZHNCdWZmZXJTaXplOw0NCiAgTFBWT0lE
IGJ1ZmZlcjEgPSBOVUxMOw0NCiAgTFBWT0lEIGJ1ZmZlcjIgPSBOVUxMOw0N
CiAgRFdPUkQgYnVmZmVyU2l6ZTEgPSAwOw0NCiAgRFdPUkQgYnVmZmVyU2l6
ZTIgPSAwOw0NCiAgaWYgKHN0cmVhbS0+bW9kZSA9PSBQTEFZQkFDSyB8fCBz
dHJlYW0tPm1vZGUgPT0gRFVQTEVYKSB7DQ0KDQ0KICAgIERXT1JEIGN1cnJl
bnRQb3MsIHNhZmVQb3M7DQ0KICAgIGxvbmcgYnVmZmVyX2J5dGVzID0gc3Ry
ZWFtLT5idWZmZXJTaXplICogc3RyZWFtLT5uRGV2aWNlQ2hhbm5lbHNbMF07
DQ0KICAgIGJ1ZmZlcl9ieXRlcyAqPSBmb3JtYXRCeXRlcyhzdHJlYW0tPmRl
dmljZUZvcm1hdFswXSk7DQ0KDQ0KICAgIExQRElSRUNUU09VTkRCVUZGRVIg
ZHNCdWZmZXIgPSAoTFBESVJFQ1RTT1VOREJVRkZFUikgc3RyZWFtLT5oYW5k
bGVbMF0uYnVmZmVyOw0NCiAgICBVSU5UIG5leHRXcml0ZVBvcyA9IHN0cmVh
bS0+aGFuZGxlWzBdLmJ1ZmZlclBvaW50ZXI7DQ0KICAgIGRzQnVmZmVyU2l6
ZSA9IGJ1ZmZlcl9ieXRlcyAqIHN0cmVhbS0+bkJ1ZmZlcnM7DQ0KDQ0KICAg
IC8vIFdyaXRlIHplcm9lcyBmb3IgbkJ1ZmZlciBjb3VudHMuDQ0KICAgIGZv
ciAoaW50IGk9MDsgaTxzdHJlYW0tPm5CdWZmZXJzOyBpKyspIHsNDQoNDQog
ICAgICAvLyBGaW5kIG91dCB3aGVyZSB0aGUgcmVhZCBhbmQgInNhZmUgd3Jp
dGUiIHBvaW50ZXJzIGFyZS4NDQogICAgICByZXN1bHQgPSBkc0J1ZmZlci0+
R2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zLCAmc2FmZVBvcyk7DQ0K
ICAgICAgaWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgICAgIHNwcmlu
dGYobWVzc2FnZSwgIlJ0QXVkaW86IFVuYWJsZSB0byBnZXQgY3VycmVudCBE
UyBwb3NpdGlvbiAoJXMpOiAlcy4iLA0NCiAgICAgICAgICAgICAgICBkZXZp
Y2VzW3N0cmVhbS0+ZGV2aWNlWzBdXS5uYW1lLCBnZXRFcnJvclN0cmluZyhy
ZXN1bHQpKTsNDQogICAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJP
Uik7DQ0KICAgICAgfQ0NCg0NCiAgICAgIGlmICggY3VycmVudFBvcyA8IG5l
eHRXcml0ZVBvcyApIGN1cnJlbnRQb3MgKz0gZHNCdWZmZXJTaXplOyAvLyB1
bndyYXAgb2Zmc2V0DQ0KICAgICAgRFdPUkQgZW5kV3JpdGUgPSBuZXh0V3Jp
dGVQb3MgKyBidWZmZXJfYnl0ZXM7DQ0KDQ0KICAgICAgLy8gQ2hlY2sgd2hl
dGhlciB0aGUgZW50aXJlIHdyaXRlIHJlZ2lvbiBpcyBiZWhpbmQgdGhlIHBs
YXkgcG9pbnRlci4NDQogICAgICB3aGlsZSAoIGN1cnJlbnRQb3MgPCBlbmRX
cml0ZSApIHsNDQogICAgICAgIGZsb2F0IG1pbGxpcyA9IChlbmRXcml0ZSAt
IGN1cnJlbnRQb3MpICogOTAwLjA7DQ0KICAgICAgICBtaWxsaXMgLz0gKCBm
b3JtYXRCeXRlcyhzdHJlYW0tPmRldmljZUZvcm1hdFswXSkgKiBzdHJlYW0t
PnNhbXBsZVJhdGUpOw0NCiAgICAgICAgaWYgKCBtaWxsaXMgPCAxLjAgKSBt
aWxsaXMgPSAxLjA7DQ0KICAgICAgICBTbGVlcCggKERXT1JEKSBtaWxsaXMg
KTsNDQoNDQogICAgICAgIC8vIFdha2UgdXAsIGZpbmQgb3V0IHdoZXJlIHdl
IGFyZSBub3cNDQogICAgICAgIHJlc3VsdCA9IGRzQnVmZmVyLT5HZXRDdXJy
ZW50UG9zaXRpb24oICZjdXJyZW50UG9zLCAmc2FmZVBvcyApOw0NCiAgICAg
ICAgaWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgICAgICAgc3ByaW50
ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5hYmxlIHRvIGdldCBjdXJyZW50IERT
IHBvc2l0aW9uICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICAgICAgZGV2
aWNlc1tzdHJlYW0tPmRldmljZVswXV0ubmFtZSwgZ2V0RXJyb3JTdHJpbmco
cmVzdWx0KSk7DQ0KICAgICAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9F
UlJPUik7DQ0KICAgICAgICB9DQ0KICAgICAgICBpZiAoIGN1cnJlbnRQb3Mg
PCBuZXh0V3JpdGVQb3MgKSBjdXJyZW50UG9zICs9IGRzQnVmZmVyU2l6ZTsg
Ly8gdW53cmFwIG9mZnNldA0NCiAgICAgIH0NDQoNDQogICAgICAvLyBMb2Nr
IGZyZWUgc3BhY2UgaW4gdGhlIGJ1ZmZlcg0NCiAgICAgIHJlc3VsdCA9IGRz
QnVmZmVyLT5Mb2NrIChuZXh0V3JpdGVQb3MsIGJ1ZmZlcl9ieXRlcywgJmJ1
ZmZlcjEsDQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZm
ZXJTaXplMSwgJmJ1ZmZlcjIsICZidWZmZXJTaXplMiwgMCk7DQ0KICAgICAg
aWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgICAgIHNwcmludGYobWVz
c2FnZSwgIlJ0QXVkaW86IFVuYWJsZSB0byBsb2NrIERTIGJ1ZmZlciBkdXJp
bmcgcGxheWJhY2sgKCVzKTogJXMuIiwNDQogICAgICAgICAgICAgICAgZGV2
aWNlc1tzdHJlYW0tPmRldmljZVswXV0ubmFtZSwgZ2V0RXJyb3JTdHJpbmco
cmVzdWx0KSk7DQ0KICAgICAgICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJS
T1IpOw0NCiAgICAgIH0NDQoNDQogICAgICAvLyBaZXJvIHRoZSBmcmVlIHNw
YWNlDQ0KICAgICAgWmVyb01lbW9yeShidWZmZXIxLCBidWZmZXJTaXplMSk7
DQ0KICAgICAgaWYgKGJ1ZmZlcjIgIT0gTlVMTCkgWmVyb01lbW9yeShidWZm
ZXIyLCBidWZmZXJTaXplMik7DQ0KDQ0KICAgICAgLy8gVXBkYXRlIG91ciBi
dWZmZXIgb2Zmc2V0IGFuZCB1bmxvY2sgc291bmQgYnVmZmVyDQ0KICAgICAg
ZHNCdWZmZXItPlVubG9jayAoYnVmZmVyMSwgYnVmZmVyU2l6ZTEsIGJ1ZmZl
cjIsIGJ1ZmZlclNpemUyKTsNDQogICAgICBpZiAoIEZBSUxFRChyZXN1bHQp
ICkgew0NCiAgICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5h
YmxlIHRvIHVubG9jayBEUyBidWZmZXIgZHVyaW5nIHBsYXliYWNrICglcyk6
ICVzLiIsDQ0KICAgICAgICAgICAgICAgIGRldmljZXNbc3RyZWFtLT5kZXZp
Y2VbMF1dLm5hbWUsIGdldEVycm9yU3RyaW5nKHJlc3VsdCkpOw0NCiAgICAg
ICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVSX0VSUk9SKTsNDQogICAgICB9DQ0K
ICAgICAgbmV4dFdyaXRlUG9zID0gKG5leHRXcml0ZVBvcyArIGJ1ZmZlclNp
emUxICsgYnVmZmVyU2l6ZTIpICUgZHNCdWZmZXJTaXplOw0NCiAgICAgIHN0
cmVhbS0+aGFuZGxlWzBdLmJ1ZmZlclBvaW50ZXIgPSBuZXh0V3JpdGVQb3M7
DQ0KICAgIH0NDQoNDQogICAgLy8gSWYgd2UgcGxheSBhZ2Fpbiwgc3RhcnQg
YXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLg0NCiAgICBzdHJlYW0t
PmhhbmRsZVswXS5idWZmZXJQb2ludGVyID0gMDsNDQogIH0NDQoNDQogIGlm
IChzdHJlYW0tPm1vZGUgPT0gUkVDT1JEIHx8IHN0cmVhbS0+bW9kZSA9PSBE
VVBMRVgpIHsNDQogICAgTFBESVJFQ1RTT1VORENBUFRVUkVCVUZGRVIgYnVm
ZmVyID0gKExQRElSRUNUU09VTkRDQVBUVVJFQlVGRkVSKSBzdHJlYW0tPmhh
bmRsZVsxXS5idWZmZXI7DQ0KICAgIGJ1ZmZlcjEgPSBOVUxMOw0NCiAgICBi
dWZmZXJTaXplMSA9IDA7DQ0KDQ0KICAgIHJlc3VsdCA9IGJ1ZmZlci0+U3Rv
cCgpOw0NCiAgICBpZiAoIEZBSUxFRChyZXN1bHQpICkgew0NCiAgICAgIHNw
cmludGYobWVzc2FnZSwgIlJ0QXVkaW86IFVuYWJsZSB0byBzdG9wIERTIGNh
cHR1cmUgYnVmZmVyICglcyk6ICVzIiwNDQogICAgICAgICAgICAgIGRldmlj
ZXNbc3RyZWFtLT5kZXZpY2VbMV1dLm5hbWUsIGdldEVycm9yU3RyaW5nKHJl
c3VsdCkpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7
DQ0KICAgIH0NDQoNDQogICAgZHNCdWZmZXJTaXplID0gc3RyZWFtLT5idWZm
ZXJTaXplICogc3RyZWFtLT5uRGV2aWNlQ2hhbm5lbHNbMV07DQ0KICAgIGRz
QnVmZmVyU2l6ZSAqPSBmb3JtYXRCeXRlcyhzdHJlYW0tPmRldmljZUZvcm1h
dFsxXSkgKiBzdHJlYW0tPm5CdWZmZXJzOw0NCg0NCiAgICAvLyBMb2NrIHRo
ZSBidWZmZXIgYW5kIGNsZWFyIGl0IHNvIHRoYXQgaWYgd2Ugc3RhcnQgdG8g
cGxheSBhZ2FpbiwNDQogICAgLy8gd2Ugd29uJ3QgaGF2ZSBvbGQgZGF0YSBw
bGF5aW5nLg0NCiAgICByZXN1bHQgPSBidWZmZXItPkxvY2soMCwgZHNCdWZm
ZXJTaXplLCAmYnVmZmVyMSwgJmJ1ZmZlclNpemUxLCBOVUxMLCBOVUxMLCAw
KTsNDQogICAgaWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgICBzcHJp
bnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBVbmFibGUgdG8gbG9jayBEUyBjYXB0
dXJlIGJ1ZmZlciAoJXMpOiAlcy4iLA0NCiAgICAgICAgICAgICAgZGV2aWNl
c1tzdHJlYW0tPmRldmljZVsxXV0ubmFtZSwgZ2V0RXJyb3JTdHJpbmcocmVz
dWx0KSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVSX0VSUk9SKTsN
DQogICAgfQ0NCg0NCiAgICAvLyBaZXJvIHRoZSBEUyBidWZmZXINDQogICAg
WmVyb01lbW9yeShidWZmZXIxLCBidWZmZXJTaXplMSk7DQ0KDQ0KICAgIC8v
IFVubG9jayB0aGUgRFMgYnVmZmVyDQ0KICAgIHJlc3VsdCA9IGJ1ZmZlci0+
VW5sb2NrKGJ1ZmZlcjEsIGJ1ZmZlclNpemUxLCBOVUxMLCAwKTsNDQogICAg
aWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgICBzcHJpbnRmKG1lc3Nh
Z2UsICJSdEF1ZGlvOiBVbmFibGUgdG8gdW5sb2NrIERTIGNhcHR1cmUgYnVm
ZmVyICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICBkZXZpY2VzW3N0cmVh
bS0+ZGV2aWNlWzFdXS5uYW1lLCBnZXRFcnJvclN0cmluZyhyZXN1bHQpKTsN
DQogICAgICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJST1IpOw0NCiAgICB9
DQ0KDQ0KICAgIC8vIElmIHdlIHN0YXJ0IHJlY29yZGluZyBhZ2Fpbiwgd2Ug
bXVzdCBiZWdpbiBhdCBiZWdpbm5pbmcgb2YgYnVmZmVyLg0NCiAgICBzdHJl
YW0tPmhhbmRsZVsxXS5idWZmZXJQb2ludGVyID0gMDsNDQogIH0NDQogIHN0
cmVhbS0+c3RhdGUgPSBTVFJFQU1fU1RPUFBFRDsNDQoNDQogIE1VVEVYX1VO
TE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KfQ0NCg0NCnZvaWQgUnRBdWRpbyA6
OiBhYm9ydFN0cmVhbShpbnQgc3RyZWFtSWQpDQ0Kew0NCiAgUlRBVURJT19T
VFJFQU0gKnN0cmVhbSA9IChSVEFVRElPX1NUUkVBTSAqKSB2ZXJpZnlTdHJl
YW0oc3RyZWFtSWQpOw0NCg0NCiAgTVVURVhfTE9DSygmc3RyZWFtLT5tdXRl
eCk7DQ0KDQ0KICBpZiAoc3RyZWFtLT5zdGF0ZSA9PSBTVFJFQU1fU1RPUFBF
RCkNDQogICAgZ290byB1bmxvY2s7DQ0KDQ0KICBIUkVTVUxUIHJlc3VsdDsN
DQogIGxvbmcgZHNCdWZmZXJTaXplOw0NCiAgTFBWT0lEIGF1ZGlvUHRyOw0N
CiAgRFdPUkQgZGF0YUxlbjsNDQogIGlmIChzdHJlYW0tPm1vZGUgPT0gUExB
WUJBQ0sgfHwgc3RyZWFtLT5tb2RlID09IERVUExFWCkgew0NCiAgICBMUERJ
UkVDVFNPVU5EQlVGRkVSIGJ1ZmZlciA9IChMUERJUkVDVFNPVU5EQlVGRkVS
KSBzdHJlYW0tPmhhbmRsZVswXS5idWZmZXI7DQ0KICAgIHJlc3VsdCA9IGJ1
ZmZlci0+U3RvcCgpOw0NCiAgICBpZiAoIEZBSUxFRChyZXN1bHQpICkgew0N
CiAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IFVuYWJsZSB0byBz
dG9wIERTIGJ1ZmZlciAoJXMpOiAlcyIsDQ0KICAgICAgICAgICAgICBkZXZp
Y2VzW3N0cmVhbS0+ZGV2aWNlWzBdXS5uYW1lLCBnZXRFcnJvclN0cmluZyhy
ZXN1bHQpKTsNDQogICAgICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJST1Ip
Ow0NCiAgICB9DQ0KDQ0KICAgIGRzQnVmZmVyU2l6ZSA9IHN0cmVhbS0+YnVm
ZmVyU2l6ZSAqIHN0cmVhbS0+bkRldmljZUNoYW5uZWxzWzBdOw0NCiAgICBk
c0J1ZmZlclNpemUgKj0gZm9ybWF0Qnl0ZXMoc3RyZWFtLT5kZXZpY2VGb3Jt
YXRbMF0pICogc3RyZWFtLT5uQnVmZmVyczsNDQoNDQogICAgLy8gTG9jayB0
aGUgYnVmZmVyIGFuZCBjbGVhciBpdCBzbyB0aGF0IGlmIHdlIHN0YXJ0IHRv
IHBsYXkgYWdhaW4sDQ0KICAgIC8vIHdlIHdvbid0IGhhdmUgb2xkIGRhdGEg
cGxheWluZy4NDQogICAgcmVzdWx0ID0gYnVmZmVyLT5Mb2NrKDAsIGRzQnVm
ZmVyU2l6ZSwgJmF1ZGlvUHRyLCAmZGF0YUxlbiwgTlVMTCwgTlVMTCwgMCk7
DQ0KICAgIGlmICggRkFJTEVEKHJlc3VsdCkgKSB7DQ0KICAgICAgc3ByaW50
ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5hYmxlIHRvIGxvY2sgRFMgYnVmZmVy
ICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICBkZXZpY2VzW3N0cmVhbS0+
ZGV2aWNlWzBdXS5uYW1lLCBnZXRFcnJvclN0cmluZyhyZXN1bHQpKTsNDQog
ICAgICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJST1IpOw0NCiAgICB9DQ0K
DQ0KICAgIC8vIFplcm8gdGhlIERTIGJ1ZmZlcg0NCiAgICBaZXJvTWVtb3J5
KGF1ZGlvUHRyLCBkYXRhTGVuKTsNDQoNDQogICAgLy8gVW5sb2NrIHRoZSBE
UyBidWZmZXINDQogICAgcmVzdWx0ID0gYnVmZmVyLT5VbmxvY2soYXVkaW9Q
dHIsIGRhdGFMZW4sIE5VTEwsIDApOw0NCiAgICBpZiAoIEZBSUxFRChyZXN1
bHQpICkgew0NCiAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IFVu
YWJsZSB0byB1bmxvY2sgRFMgYnVmZmVyICglcyk6ICVzLiIsDQ0KICAgICAg
ICAgICAgICBkZXZpY2VzW3N0cmVhbS0+ZGV2aWNlWzBdXS5uYW1lLCBnZXRF
cnJvclN0cmluZyhyZXN1bHQpKTsNDQogICAgICBlcnJvcihSdEVycm9yOjpE
UklWRVJfRVJST1IpOw0NCiAgICB9DQ0KDQ0KICAgIC8vIElmIHdlIHN0YXJ0
IHBsYXlpbmcgYWdhaW4sIHdlIG11c3QgYmVnaW4gYXQgYmVnaW5uaW5nIG9m
IGJ1ZmZlci4NDQogICAgc3RyZWFtLT5oYW5kbGVbMF0uYnVmZmVyUG9pbnRl
ciA9IDA7DQ0KICB9DQ0KDQ0KICBpZiAoc3RyZWFtLT5tb2RlID09IFJFQ09S
RCB8fCBzdHJlYW0tPm1vZGUgPT0gRFVQTEVYKSB7DQ0KICAgIExQRElSRUNU
U09VTkRDQVBUVVJFQlVGRkVSIGJ1ZmZlciA9IChMUERJUkVDVFNPVU5EQ0FQ
VFVSRUJVRkZFUikgc3RyZWFtLT5oYW5kbGVbMV0uYnVmZmVyOw0NCiAgICBh
dWRpb1B0ciA9IE5VTEw7DQ0KICAgIGRhdGFMZW4gPSAwOw0NCg0NCiAgICBy
ZXN1bHQgPSBidWZmZXItPlN0b3AoKTsNDQogICAgaWYgKCBGQUlMRUQocmVz
dWx0KSApIHsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBV
bmFibGUgdG8gc3RvcCBEUyBjYXB0dXJlIGJ1ZmZlciAoJXMpOiAlcyIsDQ0K
ICAgICAgICAgICAgICBkZXZpY2VzW3N0cmVhbS0+ZGV2aWNlWzFdXS5uYW1l
LCBnZXRFcnJvclN0cmluZyhyZXN1bHQpKTsNDQogICAgICBlcnJvcihSdEVy
cm9yOjpEUklWRVJfRVJST1IpOw0NCiAgICB9DQ0KDQ0KICAgIGRzQnVmZmVy
U2l6ZSA9IHN0cmVhbS0+YnVmZmVyU2l6ZSAqIHN0cmVhbS0+bkRldmljZUNo
YW5uZWxzWzFdOw0NCiAgICBkc0J1ZmZlclNpemUgKj0gZm9ybWF0Qnl0ZXMo
c3RyZWFtLT5kZXZpY2VGb3JtYXRbMV0pICogc3RyZWFtLT5uQnVmZmVyczsN
DQoNDQogICAgLy8gTG9jayB0aGUgYnVmZmVyIGFuZCBjbGVhciBpdCBzbyB0
aGF0IGlmIHdlIHN0YXJ0IHRvIHBsYXkgYWdhaW4sDQ0KICAgIC8vIHdlIHdv
bid0IGhhdmUgb2xkIGRhdGEgcGxheWluZy4NDQogICAgcmVzdWx0ID0gYnVm
ZmVyLT5Mb2NrKDAsIGRzQnVmZmVyU2l6ZSwgJmF1ZGlvUHRyLCAmZGF0YUxl
biwgTlVMTCwgTlVMTCwgMCk7DQ0KICAgIGlmICggRkFJTEVEKHJlc3VsdCkg
KSB7DQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5hYmxl
IHRvIGxvY2sgRFMgY2FwdHVyZSBidWZmZXIgKCVzKTogJXMuIiwNDQogICAg
ICAgICAgICAgIGRldmljZXNbc3RyZWFtLT5kZXZpY2VbMV1dLm5hbWUsIGdl
dEVycm9yU3RyaW5nKHJlc3VsdCkpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6
OkRSSVZFUl9FUlJPUik7DQ0KICAgIH0NDQoNDQogICAgLy8gWmVybyB0aGUg
RFMgYnVmZmVyDQ0KICAgIFplcm9NZW1vcnkoYXVkaW9QdHIsIGRhdGFMZW4p
Ow0NCg0NCiAgICAvLyBVbmxvY2sgdGhlIERTIGJ1ZmZlcg0NCiAgICByZXN1
bHQgPSBidWZmZXItPlVubG9jayhhdWRpb1B0ciwgZGF0YUxlbiwgTlVMTCwg
MCk7DQ0KICAgIGlmICggRkFJTEVEKHJlc3VsdCkgKSB7DQ0KICAgICAgc3By
aW50ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5hYmxlIHRvIHVubG9jayBEUyBj
YXB0dXJlIGJ1ZmZlciAoJXMpOiAlcy4iLA0NCiAgICAgICAgICAgICAgZGV2
aWNlc1tzdHJlYW0tPmRldmljZVsxXV0ubmFtZSwgZ2V0RXJyb3JTdHJpbmco
cmVzdWx0KSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVSX0VSUk9S
KTsNDQogICAgfQ0NCg0NCiAgICAvLyBJZiB3ZSBzdGFydCByZWNvcmRpbmcg
YWdhaW4sIHdlIG11c3QgYmVnaW4gYXQgYmVnaW5uaW5nIG9mIGJ1ZmZlci4N
DQogICAgc3RyZWFtLT5oYW5kbGVbMV0uYnVmZmVyUG9pbnRlciA9IDA7DQ0K
ICB9DQ0KICBzdHJlYW0tPnN0YXRlID0gU1RSRUFNX1NUT1BQRUQ7DQ0KDQ0K
IHVubG9jazoNDQogIE1VVEVYX1VOTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0K
fQ0NCg0NCmludCBSdEF1ZGlvIDo6IHN0cmVhbVdpbGxCbG9jayhpbnQgc3Ry
ZWFtSWQpDQ0Kew0NCiAgUlRBVURJT19TVFJFQU0gKnN0cmVhbSA9IChSVEFV
RElPX1NUUkVBTSAqKSB2ZXJpZnlTdHJlYW0oc3RyZWFtSWQpOw0NCg0NCiAg
TVVURVhfTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KDQ0KICBpbnQgY2hhbm5l
bHM7DQ0KICBpbnQgZnJhbWVzID0gMDsNDQogIGlmIChzdHJlYW0tPnN0YXRl
ID09IFNUUkVBTV9TVE9QUEVEKQ0NCiAgICBnb3RvIHVubG9jazsNDQoNDQog
IEhSRVNVTFQgcmVzdWx0Ow0NCiAgRFdPUkQgY3VycmVudFBvcywgc2FmZVBv
czsNDQogIGNoYW5uZWxzID0gMTsNDQogIGlmIChzdHJlYW0tPm1vZGUgPT0g
UExBWUJBQ0sgfHwgc3RyZWFtLT5tb2RlID09IERVUExFWCkgew0NCg0NCiAg
ICBMUERJUkVDVFNPVU5EQlVGRkVSIGRzQnVmZmVyID0gKExQRElSRUNUU09V
TkRCVUZGRVIpIHN0cmVhbS0+aGFuZGxlWzBdLmJ1ZmZlcjsNDQogICAgVUlO
VCBuZXh0V3JpdGVQb3MgPSBzdHJlYW0tPmhhbmRsZVswXS5idWZmZXJQb2lu
dGVyOw0NCiAgICBjaGFubmVscyA9IHN0cmVhbS0+bkRldmljZUNoYW5uZWxz
WzBdOw0NCiAgICBEV09SRCBkc0J1ZmZlclNpemUgPSBzdHJlYW0tPmJ1ZmZl
clNpemUgKiBjaGFubmVsczsNDQogICAgZHNCdWZmZXJTaXplICo9IGZvcm1h
dEJ5dGVzKHN0cmVhbS0+ZGV2aWNlRm9ybWF0WzBdKSAqIHN0cmVhbS0+bkJ1
ZmZlcnM7DQ0KDQ0KICAgIC8vIEZpbmQgb3V0IHdoZXJlIHRoZSByZWFkIGFu
ZCAic2FmZSB3cml0ZSIgcG9pbnRlcnMgYXJlLg0NCiAgICByZXN1bHQgPSBk
c0J1ZmZlci0+R2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zLCAmc2Fm
ZVBvcyk7DQ0KICAgIGlmICggRkFJTEVEKHJlc3VsdCkgKSB7DQ0KICAgICAg
c3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5hYmxlIHRvIGdldCBjdXJy
ZW50IERTIHBvc2l0aW9uICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICBk
ZXZpY2VzW3N0cmVhbS0+ZGV2aWNlWzBdXS5uYW1lLCBnZXRFcnJvclN0cmlu
ZyhyZXN1bHQpKTsNDQogICAgICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJS
T1IpOw0NCiAgICB9DQ0KDQ0KICAgIGlmICggY3VycmVudFBvcyA8IG5leHRX
cml0ZVBvcyApIGN1cnJlbnRQb3MgKz0gZHNCdWZmZXJTaXplOyAvLyB1bndy
YXAgb2Zmc2V0DQ0KICAgIGZyYW1lcyA9IGN1cnJlbnRQb3MgLSBuZXh0V3Jp
dGVQb3M7DQ0KICAgIGZyYW1lcyAvPSBjaGFubmVscyAqIGZvcm1hdEJ5dGVz
KHN0cmVhbS0+ZGV2aWNlRm9ybWF0WzBdKTsNDQogIH0NDQoNDQogIGlmIChz
dHJlYW0tPm1vZGUgPT0gUkVDT1JEIHx8IHN0cmVhbS0+bW9kZSA9PSBEVVBM
RVgpIHsNDQoNDQogICAgTFBESVJFQ1RTT1VORENBUFRVUkVCVUZGRVIgZHNC
dWZmZXIgPSAoTFBESVJFQ1RTT1VORENBUFRVUkVCVUZGRVIpIHN0cmVhbS0+
aGFuZGxlWzFdLmJ1ZmZlcjsNDQogICAgVUlOVCBuZXh0UmVhZFBvcyA9IHN0
cmVhbS0+aGFuZGxlWzFdLmJ1ZmZlclBvaW50ZXI7DQ0KICAgIGNoYW5uZWxz
ID0gc3RyZWFtLT5uRGV2aWNlQ2hhbm5lbHNbMV07DQ0KICAgIERXT1JEIGRz
QnVmZmVyU2l6ZSA9IHN0cmVhbS0+YnVmZmVyU2l6ZSAqIGNoYW5uZWxzOw0N
CiAgICBkc0J1ZmZlclNpemUgKj0gZm9ybWF0Qnl0ZXMoc3RyZWFtLT5kZXZp
Y2VGb3JtYXRbMV0pICogc3RyZWFtLT5uQnVmZmVyczsNDQoNDQogICAgLy8g
RmluZCBvdXQgd2hlcmUgdGhlIHdyaXRlIGFuZCAic2FmZSByZWFkIiBwb2lu
dGVycyBhcmUuDQ0KICAgIHJlc3VsdCA9IGRzQnVmZmVyLT5HZXRDdXJyZW50
UG9zaXRpb24oJmN1cnJlbnRQb3MsICZzYWZlUG9zKTsNDQogICAgaWYgKCBG
QUlMRUQocmVzdWx0KSApIHsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJS
dEF1ZGlvOiBVbmFibGUgdG8gZ2V0IGN1cnJlbnQgRFMgY2FwdHVyZSBwb3Np
dGlvbiAoJXMpOiAlcy4iLA0NCiAgICAgICAgICAgICAgZGV2aWNlc1tzdHJl
YW0tPmRldmljZVsxXV0ubmFtZSwgZ2V0RXJyb3JTdHJpbmcocmVzdWx0KSk7
DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVSX0VSUk9SKTsNDQogICAg
fQ0NCg0NCiAgICBpZiAoIHNhZmVQb3MgPCBuZXh0UmVhZFBvcyApIHNhZmVQ
b3MgKz0gZHNCdWZmZXJTaXplOyAvLyB1bndyYXAgb2Zmc2V0DQ0KDQ0KICAg
IGlmIChzdHJlYW0tPm1vZGUgPT0gRFVQTEVYICkgew0NCiAgICAgIC8vIFRh
a2UgbGFyZ2VzdCB2YWx1ZSBvZiB0aGUgdHdvLg0NCiAgICAgIGludCB0ZW1w
ID0gc2FmZVBvcyAtIG5leHRSZWFkUG9zOw0NCiAgICAgIHRlbXAgLz0gY2hh
bm5lbHMgKiBmb3JtYXRCeXRlcyhzdHJlYW0tPmRldmljZUZvcm1hdFsxXSk7
DQ0KICAgICAgZnJhbWVzID0gKCB0ZW1wID4gZnJhbWVzICkgPyB0ZW1wIDog
ZnJhbWVzOw0NCiAgICB9DQ0KICAgIGVsc2Ugew0NCiAgICAgIGZyYW1lcyA9
IHNhZmVQb3MgLSBuZXh0UmVhZFBvczsNDQogICAgICBmcmFtZXMgLz0gY2hh
bm5lbHMgKiBmb3JtYXRCeXRlcyhzdHJlYW0tPmRldmljZUZvcm1hdFsxXSk7
DQ0KICAgIH0NDQogIH0NDQoNDQogIGZyYW1lcyA9IHN0cmVhbS0+YnVmZmVy
U2l6ZSAtIGZyYW1lczsNDQogIGlmIChmcmFtZXMgPCAwKSBmcmFtZXMgPSAw
Ow0NCg0NCiB1bmxvY2s6DQ0KICBNVVRFWF9VTkxPQ0soJnN0cmVhbS0+bXV0
ZXgpOw0NCiAgcmV0dXJuIGZyYW1lczsNDQp9DQ0KDQ0Kdm9pZCBSdEF1ZGlv
IDo6IHRpY2tTdHJlYW0oaW50IHN0cmVhbUlkKQ0NCnsNDQogIFJUQVVESU9f
U1RSRUFNICpzdHJlYW0gPSAoUlRBVURJT19TVFJFQU0gKikgdmVyaWZ5U3Ry
ZWFtKHN0cmVhbUlkKTsNDQoNDQogIGludCBzdG9wU3RyZWFtID0gMDsNDQog
IGlmIChzdHJlYW0tPnN0YXRlID09IFNUUkVBTV9TVE9QUEVEKSB7DQ0KICAg
IGlmIChzdHJlYW0tPnVzaW5nQ2FsbGJhY2spIFNsZWVwKDUwKTsgLy8gc2xl
ZXAgNTAgbWlsbGlzZWNvbmRzDQ0KICAgIHJldHVybjsNDQogIH0NDQogIGVs
c2UgaWYgKHN0cmVhbS0+dXNpbmdDYWxsYmFjaykgew0NCiAgICBzdG9wU3Ry
ZWFtID0gc3RyZWFtLT5jYWxsYmFjayhzdHJlYW0tPnVzZXJCdWZmZXIsIHN0
cmVhbS0+YnVmZmVyU2l6ZSwgc3RyZWFtLT51c2VyRGF0YSk7ICAgIA0NCiAg
fQ0NCg0NCiAgTVVURVhfTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KDQ0KICAv
LyBUaGUgc3RhdGUgbWlnaHQgY2hhbmdlIHdoaWxlIHdhaXRpbmcgb24gYSBt
dXRleC4NDQogIGlmIChzdHJlYW0tPnN0YXRlID09IFNUUkVBTV9TVE9QUEVE
KSB7DQ0KICAgIE1VVEVYX1VOTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KICAg
IGlmIChzdHJlYW0tPnVzaW5nQ2FsbGJhY2sgJiYgc3RvcFN0cmVhbSkNDQog
ICAgICB0aGlzLT5zdG9wU3RyZWFtKHN0cmVhbUlkKTsNDQogIH0NDQoNDQog
IEhSRVNVTFQgcmVzdWx0Ow0NCiAgRFdPUkQgY3VycmVudFBvcywgc2FmZVBv
czsNDQogIExQVk9JRCBidWZmZXIxID0gTlVMTDsNDQogIExQVk9JRCBidWZm
ZXIyID0gTlVMTDsNDQogIERXT1JEIGJ1ZmZlclNpemUxID0gMDsNDQogIERX
T1JEIGJ1ZmZlclNpemUyID0gMDsNDQogIGNoYXIgKmJ1ZmZlcjsNDQogIGxv
bmcgYnVmZmVyX2J5dGVzOw0NCiAgaWYgKHN0cmVhbS0+bW9kZSA9PSBQTEFZ
QkFDSyB8fCBzdHJlYW0tPm1vZGUgPT0gRFVQTEVYKSB7DQ0KDQ0KICAgIC8v
IFNldHVwIHBhcmFtZXRlcnMgYW5kIGRvIGJ1ZmZlciBjb252ZXJzaW9uIGlm
IG5lY2Vzc2FyeS4NDQogICAgaWYgKHN0cmVhbS0+ZG9Db252ZXJ0QnVmZmVy
WzBdKSB7DQ0KICAgICAgY29udmVydFN0cmVhbUJ1ZmZlcihzdHJlYW0sIFBM
QVlCQUNLKTsNDQogICAgICBidWZmZXIgPSBzdHJlYW0tPmRldmljZUJ1ZmZl
cjsNDQogICAgICBidWZmZXJfYnl0ZXMgPSBzdHJlYW0tPmJ1ZmZlclNpemUg
KiBzdHJlYW0tPm5EZXZpY2VDaGFubmVsc1swXTsNDQogICAgICBidWZmZXJf
Ynl0ZXMgKj0gZm9ybWF0Qnl0ZXMoc3RyZWFtLT5kZXZpY2VGb3JtYXRbMF0p
Ow0NCiAgICB9DQ0KICAgIGVsc2Ugew0NCiAgICAgIGJ1ZmZlciA9IHN0cmVh
bS0+dXNlckJ1ZmZlcjsNDQogICAgICBidWZmZXJfYnl0ZXMgPSBzdHJlYW0t
PmJ1ZmZlclNpemUgKiBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMF07DQ0KICAg
ICAgYnVmZmVyX2J5dGVzICo9IGZvcm1hdEJ5dGVzKHN0cmVhbS0+dXNlckZv
cm1hdCk7DQ0KICAgIH0NDQoNDQogICAgLy8gTm8gYnl0ZSBzd2FwcGluZyBu
ZWNlc3NhcnkgaW4gRGlyZWN0U291bmQgaW1wbGVtZW50YXRpb24uDQ0KDQ0K
ICAgIExQRElSRUNUU09VTkRCVUZGRVIgZHNCdWZmZXIgPSAoTFBESVJFQ1RT
T1VOREJVRkZFUikgc3RyZWFtLT5oYW5kbGVbMF0uYnVmZmVyOw0NCiAgICBV
SU5UIG5leHRXcml0ZVBvcyA9IHN0cmVhbS0+aGFuZGxlWzBdLmJ1ZmZlclBv
aW50ZXI7DQ0KICAgIERXT1JEIGRzQnVmZmVyU2l6ZSA9IGJ1ZmZlcl9ieXRl
cyAqIHN0cmVhbS0+bkJ1ZmZlcnM7DQ0KDQ0KICAgIC8vIEZpbmQgb3V0IHdo
ZXJlIHRoZSByZWFkIGFuZCAic2FmZSB3cml0ZSIgcG9pbnRlcnMgYXJlLg0N
CiAgICByZXN1bHQgPSBkc0J1ZmZlci0+R2V0Q3VycmVudFBvc2l0aW9uKCZj
dXJyZW50UG9zLCAmc2FmZVBvcyk7DQ0KICAgIGlmICggRkFJTEVEKHJlc3Vs
dCkgKSB7DQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5h
YmxlIHRvIGdldCBjdXJyZW50IERTIHBvc2l0aW9uICglcyk6ICVzLiIsDQ0K
ICAgICAgICAgICAgICBkZXZpY2VzW3N0cmVhbS0+ZGV2aWNlWzBdXS5uYW1l
LCBnZXRFcnJvclN0cmluZyhyZXN1bHQpKTsNDQogICAgICBlcnJvcihSdEVy
cm9yOjpEUklWRVJfRVJST1IpOw0NCiAgICB9DQ0KDQ0KICAgIGlmICggY3Vy
cmVudFBvcyA8IG5leHRXcml0ZVBvcyApIGN1cnJlbnRQb3MgKz0gZHNCdWZm
ZXJTaXplOyAvLyB1bndyYXAgb2Zmc2V0DQ0KICAgIERXT1JEIGVuZFdyaXRl
ID0gbmV4dFdyaXRlUG9zICsgYnVmZmVyX2J5dGVzOw0NCg0NCiAgICAvLyBD
aGVjayB3aGV0aGVyIHRoZSBlbnRpcmUgd3JpdGUgcmVnaW9uIGlzIGJlaGlu
ZCB0aGUgcGxheSBwb2ludGVyLg0NCiAgICB3aGlsZSAoIGN1cnJlbnRQb3Mg
PCBlbmRXcml0ZSApIHsNDQogICAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgdGhl
biB3ZSBtdXN0IHdhaXQgdW50aWwgdGhlIHBsYXkgcG9pbnRlciBnZXRzDQ0K
ICAgICAgLy8gYmV5b25kIHRoZSB3cml0ZSByZWdpb24uICBUaGUgYXBwcm9h
Y2ggaGVyZSBpcyB0byB1c2UgdGhlDQ0KICAgICAgLy8gU2xlZXAoKSBmdW5j
dGlvbiB0byBzdXNwZW5kIG9wZXJhdGlvbiB1bnRpbCBzYWZlUG9zIGNhdGNo
ZXMNDQogICAgICAvLyB1cC4gQ2FsY3VsYXRlIG51bWJlciBvZiBtaWxsaXNl
Y29uZHMgdG8gd2FpdCBhczoNDQogICAgICAvLyAgIHRpbWUgPSBkaXN0YW5j
ZSAqIChtaWxsaXNlY29uZHMvc2Vjb25kKSAqIGZ1ZGdlZmFjdG9yIC8NDQog
ICAgICAvLyAgICAgICAgICAoKGJ5dGVzL3NhbXBsZSkgKiAoc2FtcGxlcy9z
ZWNvbmQpKQ0NCiAgICAgIC8vIEEgImZ1ZGdlZmFjdG9yIiBsZXNzIHRoYW4g
MSBpcyB1c2VkIGJlY2F1c2UgaXQgd2FzIGZvdW5kDQ0KICAgICAgLy8gdGhh
dCBzbGVlcGluZyB0b28gbG9uZyB3YXMgTVVDSCB3b3JzZSB0aGFuIHNsZWVw
aW5nIGZvcg0NCiAgICAgIC8vIHNldmVyYWwgc2hvcnRlciBwZXJpb2RzLg0N
CiAgICAgIGZsb2F0IG1pbGxpcyA9IChlbmRXcml0ZSAtIGN1cnJlbnRQb3Mp
ICogOTAwLjA7DQ0KICAgICAgbWlsbGlzIC89ICggZm9ybWF0Qnl0ZXMoc3Ry
ZWFtLT5kZXZpY2VGb3JtYXRbMF0pICogc3RyZWFtLT5zYW1wbGVSYXRlKTsN
DQogICAgICBpZiAoIG1pbGxpcyA8IDEuMCApIG1pbGxpcyA9IDEuMDsNDQog
ICAgICBTbGVlcCggKERXT1JEKSBtaWxsaXMgKTsNDQoNDQogICAgICAvLyBX
YWtlIHVwLCBmaW5kIG91dCB3aGVyZSB3ZSBhcmUgbm93DQ0KICAgICAgcmVz
dWx0ID0gZHNCdWZmZXItPkdldEN1cnJlbnRQb3NpdGlvbiggJmN1cnJlbnRQ
b3MsICZzYWZlUG9zICk7DQ0KICAgICAgaWYgKCBGQUlMRUQocmVzdWx0KSAp
IHsNDQogICAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IFVuYWJs
ZSB0byBnZXQgY3VycmVudCBEUyBwb3NpdGlvbiAoJXMpOiAlcy4iLA0NCiAg
ICAgICAgICAgICAgZGV2aWNlc1tzdHJlYW0tPmRldmljZVswXV0ubmFtZSwg
Z2V0RXJyb3JTdHJpbmcocmVzdWx0KSk7DQ0KICAgICAgICBlcnJvcihSdEVy
cm9yOjpEUklWRVJfRVJST1IpOw0NCiAgICAgIH0NDQogICAgICBpZiAoIGN1
cnJlbnRQb3MgPCBuZXh0V3JpdGVQb3MgKSBjdXJyZW50UG9zICs9IGRzQnVm
ZmVyU2l6ZTsgLy8gdW53cmFwIG9mZnNldA0NCiAgICB9DQ0KDQ0KICAgIC8v
IExvY2sgZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyDQ0KICAgIHJlc3VsdCA9
IGRzQnVmZmVyLT5Mb2NrIChuZXh0V3JpdGVQb3MsIGJ1ZmZlcl9ieXRlcywg
JmJ1ZmZlcjEsDQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVm
ZmVyU2l6ZTEsICZidWZmZXIyLCAmYnVmZmVyU2l6ZTIsIDApOw0NCiAgICBp
ZiAoIEZBSUxFRChyZXN1bHQpICkgew0NCiAgICAgIHNwcmludGYobWVzc2Fn
ZSwgIlJ0QXVkaW86IFVuYWJsZSB0byBsb2NrIERTIGJ1ZmZlciBkdXJpbmcg
cGxheWJhY2sgKCVzKTogJXMuIiwNDQogICAgICAgICAgICAgIGRldmljZXNb
c3RyZWFtLT5kZXZpY2VbMF1dLm5hbWUsIGdldEVycm9yU3RyaW5nKHJlc3Vs
dCkpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0K
ICAgIH0NDQoNDQogICAgLy8gQ29weSBvdXIgYnVmZmVyIGludG8gdGhlIERT
IGJ1ZmZlcg0NCiAgICBDb3B5TWVtb3J5KGJ1ZmZlcjEsIGJ1ZmZlciwgYnVm
ZmVyU2l6ZTEpOw0NCiAgICBpZiAoYnVmZmVyMiAhPSBOVUxMKSBDb3B5TWVt
b3J5KGJ1ZmZlcjIsIGJ1ZmZlcitidWZmZXJTaXplMSwgYnVmZmVyU2l6ZTIp
Ow0NCg0NCiAgICAvLyBVcGRhdGUgb3VyIGJ1ZmZlciBvZmZzZXQgYW5kIHVu
bG9jayBzb3VuZCBidWZmZXINDQogICAgZHNCdWZmZXItPlVubG9jayAoYnVm
ZmVyMSwgYnVmZmVyU2l6ZTEsIGJ1ZmZlcjIsIGJ1ZmZlclNpemUyKTsNDQog
ICAgaWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQogICAgICBzcHJpbnRmKG1l
c3NhZ2UsICJSdEF1ZGlvOiBVbmFibGUgdG8gdW5sb2NrIERTIGJ1ZmZlciBk
dXJpbmcgcGxheWJhY2sgKCVzKTogJXMuIiwNDQogICAgICAgICAgICAgIGRl
dmljZXNbc3RyZWFtLT5kZXZpY2VbMF1dLm5hbWUsIGdldEVycm9yU3RyaW5n
KHJlc3VsdCkpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJP
Uik7DQ0KICAgIH0NDQogICAgbmV4dFdyaXRlUG9zID0gKG5leHRXcml0ZVBv
cyArIGJ1ZmZlclNpemUxICsgYnVmZmVyU2l6ZTIpICUgZHNCdWZmZXJTaXpl
Ow0NCiAgICBzdHJlYW0tPmhhbmRsZVswXS5idWZmZXJQb2ludGVyID0gbmV4
dFdyaXRlUG9zOw0NCiAgfQ0NCg0NCiAgaWYgKHN0cmVhbS0+bW9kZSA9PSBS
RUNPUkQgfHwgc3RyZWFtLT5tb2RlID09IERVUExFWCkgew0NCg0NCiAgICAv
LyBTZXR1cCBwYXJhbWV0ZXJzLg0NCiAgICBpZiAoc3RyZWFtLT5kb0NvbnZl
cnRCdWZmZXJbMV0pIHsNDQogICAgICBidWZmZXIgPSBzdHJlYW0tPmRldmlj
ZUJ1ZmZlcjsNDQogICAgICBidWZmZXJfYnl0ZXMgPSBzdHJlYW0tPmJ1ZmZl
clNpemUgKiBzdHJlYW0tPm5EZXZpY2VDaGFubmVsc1sxXTsNDQogICAgICBi
dWZmZXJfYnl0ZXMgKj0gZm9ybWF0Qnl0ZXMoc3RyZWFtLT5kZXZpY2VGb3Jt
YXRbMV0pOw0NCiAgICB9DQ0KICAgIGVsc2Ugew0NCiAgICAgIGJ1ZmZlciA9
IHN0cmVhbS0+dXNlckJ1ZmZlcjsNDQogICAgICBidWZmZXJfYnl0ZXMgPSBz
dHJlYW0tPmJ1ZmZlclNpemUgKiBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMV07
DQ0KICAgICAgYnVmZmVyX2J5dGVzICo9IGZvcm1hdEJ5dGVzKHN0cmVhbS0+
dXNlckZvcm1hdCk7DQ0KICAgIH0NDQoNDQogICAgTFBESVJFQ1RTT1VORENB
UFRVUkVCVUZGRVIgZHNCdWZmZXIgPSAoTFBESVJFQ1RTT1VORENBUFRVUkVC
VUZGRVIpIHN0cmVhbS0+aGFuZGxlWzFdLmJ1ZmZlcjsNDQogICAgVUlOVCBu
ZXh0UmVhZFBvcyA9IHN0cmVhbS0+aGFuZGxlWzFdLmJ1ZmZlclBvaW50ZXI7
DQ0KICAgIERXT1JEIGRzQnVmZmVyU2l6ZSA9IGJ1ZmZlcl9ieXRlcyAqIHN0
cmVhbS0+bkJ1ZmZlcnM7DQ0KDQ0KICAgIC8vIEZpbmQgb3V0IHdoZXJlIHRo
ZSB3cml0ZSBhbmQgInNhZmUgcmVhZCIgcG9pbnRlcnMgYXJlLg0NCiAgICBy
ZXN1bHQgPSBkc0J1ZmZlci0+R2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50
UG9zLCAmc2FmZVBvcyk7DQ0KICAgIGlmICggRkFJTEVEKHJlc3VsdCkgKSB7
DQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogVW5hYmxlIHRv
IGdldCBjdXJyZW50IERTIGNhcHR1cmUgcG9zaXRpb24gKCVzKTogJXMuIiwN
DQogICAgICAgICAgICAgIGRldmljZXNbc3RyZWFtLT5kZXZpY2VbMV1dLm5h
bWUsIGdldEVycm9yU3RyaW5nKHJlc3VsdCkpOw0NCiAgICAgIGVycm9yKFJ0
RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICAgIH0NDQoNDQogICAgaWYgKCBz
YWZlUG9zIDwgbmV4dFJlYWRQb3MgKSBzYWZlUG9zICs9IGRzQnVmZmVyU2l6
ZTsgLy8gdW53cmFwIG9mZnNldA0NCiAgICBEV09SRCBlbmRSZWFkID0gbmV4
dFJlYWRQb3MgKyBidWZmZXJfYnl0ZXM7DQ0KDQ0KICAgIC8vIENoZWNrIHdo
ZXRoZXIgdGhlIGVudGlyZSB3cml0ZSByZWdpb24gaXMgYmVoaW5kIHRoZSBw
bGF5IHBvaW50ZXIuDQ0KICAgIHdoaWxlICggc2FmZVBvcyA8IGVuZFJlYWQg
KSB7DQ0KICAgICAgLy8gU2VlIGNvbW1lbnRzIGZvciBwbGF5YmFjay4NDQog
ICAgICBmbG9hdCBtaWxsaXMgPSAoZW5kUmVhZCAtIHNhZmVQb3MpICogOTAw
LjA7DQ0KICAgICAgbWlsbGlzIC89ICggZm9ybWF0Qnl0ZXMoc3RyZWFtLT5k
ZXZpY2VGb3JtYXRbMV0pICogc3RyZWFtLT5zYW1wbGVSYXRlKTsNDQogICAg
ICBpZiAoIG1pbGxpcyA8IDEuMCApIG1pbGxpcyA9IDEuMDsNDQogICAgICBT
bGVlcCggKERXT1JEKSBtaWxsaXMgKTsNDQoNDQogICAgICAvLyBXYWtlIHVw
LCBmaW5kIG91dCB3aGVyZSB3ZSBhcmUgbm93DQ0KICAgICAgcmVzdWx0ID0g
ZHNCdWZmZXItPkdldEN1cnJlbnRQb3NpdGlvbiggJmN1cnJlbnRQb3MsICZz
YWZlUG9zICk7DQ0KICAgICAgaWYgKCBGQUlMRUQocmVzdWx0KSApIHsNDQog
ICAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IFVuYWJsZSB0byBn
ZXQgY3VycmVudCBEUyBjYXB0dXJlIHBvc2l0aW9uICglcyk6ICVzLiIsDQ0K
ICAgICAgICAgICAgICAgIGRldmljZXNbc3RyZWFtLT5kZXZpY2VbMV1dLm5h
bWUsIGdldEVycm9yU3RyaW5nKHJlc3VsdCkpOw0NCiAgICAgICAgZXJyb3Io
UnRFcnJvcjo6RFJJVkVSX0VSUk9SKTsNDQogICAgICB9DQ0KICAgICAgDQ0K
ICAgICAgaWYgKCBzYWZlUG9zIDwgbmV4dFJlYWRQb3MgKSBzYWZlUG9zICs9
IGRzQnVmZmVyU2l6ZTsgLy8gdW53cmFwIG9mZnNldA0NCiAgICB9DQ0KDQ0K
ICAgIC8vIExvY2sgZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyDQ0KICAgIHJl
c3VsdCA9IGRzQnVmZmVyLT5Mb2NrIChuZXh0UmVhZFBvcywgYnVmZmVyX2J5
dGVzLCAmYnVmZmVyMSwNDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICZidWZmZXJTaXplMSwgJmJ1ZmZlcjIsICZidWZmZXJTaXplMiwgMCk7DQ0K
ICAgIGlmICggRkFJTEVEKHJlc3VsdCkgKSB7DQ0KICAgICAgc3ByaW50Ziht
ZXNzYWdlLCAiUnRBdWRpbzogVW5hYmxlIHRvIGxvY2sgRFMgYnVmZmVyIGR1
cmluZyBjYXB0dXJlICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICBkZXZp
Y2VzW3N0cmVhbS0+ZGV2aWNlWzFdXS5uYW1lLCBnZXRFcnJvclN0cmluZyhy
ZXN1bHQpKTsNDQogICAgICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJST1Ip
Ow0NCiAgICB9DQ0KDQ0KICAgIC8vIENvcHkgb3VyIGJ1ZmZlciBpbnRvIHRo
ZSBEUyBidWZmZXINDQogICAgQ29weU1lbW9yeShidWZmZXIsIGJ1ZmZlcjEs
IGJ1ZmZlclNpemUxKTsNDQogICAgaWYgKGJ1ZmZlcjIgIT0gTlVMTCkgQ29w
eU1lbW9yeShidWZmZXIrYnVmZmVyU2l6ZTEsIGJ1ZmZlcjIsIGJ1ZmZlclNp
emUyKTsNDQoNDQogICAgLy8gVXBkYXRlIG91ciBidWZmZXIgb2Zmc2V0IGFu
ZCB1bmxvY2sgc291bmQgYnVmZmVyDQ0KICAgIG5leHRSZWFkUG9zID0gKG5l
eHRSZWFkUG9zICsgYnVmZmVyU2l6ZTEgKyBidWZmZXJTaXplMikgJSBkc0J1
ZmZlclNpemU7DQ0KICAgIGRzQnVmZmVyLT5VbmxvY2sgKGJ1ZmZlcjEsIGJ1
ZmZlclNpemUxLCBidWZmZXIyLCBidWZmZXJTaXplMik7DQ0KICAgIGlmICgg
RkFJTEVEKHJlc3VsdCkgKSB7DQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCAi
UnRBdWRpbzogVW5hYmxlIHRvIHVubG9jayBEUyBidWZmZXIgZHVyaW5nIGNh
cHR1cmUgKCVzKTogJXMuIiwNDQogICAgICAgICAgICAgIGRldmljZXNbc3Ry
ZWFtLT5kZXZpY2VbMV1dLm5hbWUsIGdldEVycm9yU3RyaW5nKHJlc3VsdCkp
Ow0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICAg
IH0NDQogICAgc3RyZWFtLT5oYW5kbGVbMV0uYnVmZmVyUG9pbnRlciA9IG5l
eHRSZWFkUG9zOw0NCg0NCiAgICAvLyBObyBieXRlIHN3YXBwaW5nIG5lY2Vz
c2FyeSBpbiBEaXJlY3RTb3VuZCBpbXBsZW1lbnRhdGlvbi4NDQoNDQogICAg
Ly8gRG8gYnVmZmVyIGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5Lg0NCiAgICBp
ZiAoc3RyZWFtLT5kb0NvbnZlcnRCdWZmZXJbMV0pDQ0KICAgICAgY29udmVy
dFN0cmVhbUJ1ZmZlcihzdHJlYW0sIFJFQ09SRCk7DQ0KICB9DQ0KDQ0KICBN
VVRFWF9VTkxPQ0soJnN0cmVhbS0+bXV0ZXgpOw0NCg0NCiAgaWYgKHN0cmVh
bS0+dXNpbmdDYWxsYmFjayAmJiBzdG9wU3RyZWFtKQ0NCiAgICB0aGlzLT5z
dG9wU3RyZWFtKHN0cmVhbUlkKTsNDQp9DQ0KDQ0KLy8gRGVmaW5pdGlvbnMg
Zm9yIHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBjYWxsYmFja3MNDQovLyBzcGVj
aWZpYyB0byB0aGUgRGlyZWN0U291bmQgaW1wbGVtZW50YXRpb24uDQ0KDQ0K
ZXh0ZXJuICJDIiB1bnNpZ25lZCBfX3N0ZGNhbGwgY2FsbGJhY2tIYW5kbGVy
KHZvaWQgKnB0cikNDQp7DQ0KICBSdEF1ZGlvICpvYmplY3QgPSB0aHJlYWRf
aW5mby5vYmplY3Q7DQ0KICBpbnQgc3RyZWFtID0gdGhyZWFkX2luZm8uc3Ry
ZWFtSWQ7DQ0KICBib29sICp1c2luZ0NhbGxiYWNrID0gKGJvb2wgKikgcHRy
Ow0NCg0NCiAgd2hpbGUgKCAqdXNpbmdDYWxsYmFjayApIHsNDQogICAgdHJ5
IHsNDQogICAgICBvYmplY3QtPnRpY2tTdHJlYW0oc3RyZWFtKTsNDQogICAg
fQ0NCiAgICBjYXRjaCAoUnRFcnJvciAmZXhjZXB0aW9uKSB7DQ0KICAgICAg
ZnByaW50ZihzdGRlcnIsICJcbkNhbGxiYWNrIHRocmVhZCBlcnJvciAoJXMp
IC4uLiBjbG9zaW5nIHRocmVhZC5cblxuIiwNDQogICAgICAgICAgICAgIGV4
Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOw0NCiAgICAgIGJyZWFrOw0NCiAgICB9
DQ0KICB9DQ0KDQ0KICBfZW5kdGhyZWFkZXgoIDAgKTsNDQogIHJldHVybiAw
Ow0NCn0NDQoNDQpzdGF0aWMgYm9vbCBDQUxMQkFDSyBkZXZpY2VDb3VudENh
bGxiYWNrKExQR1VJRCBscGd1aWQsDQ0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBjc3RyRGVzY3JpcHRpb24s
DQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBM
UENTVFIgbHBjc3RyTW9kdWxlLA0NCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQ29udGV4dCkNDQp7DQ0KICBp
bnQgKnBvaW50ZXIgPSAoKGludCAqKSBscENvbnRleHQpOw0NCiAgKCpwb2lu
dGVyKSsrOw0NCg0NCiAgcmV0dXJuIHRydWU7DQ0KfQ0NCg0NCnN0YXRpYyBi
b29sIENBTExCQUNLIGRldmljZUluZm9DYWxsYmFjayhMUEdVSUQgbHBndWlk
LA0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBM
UENTVFIgbHBjc3RyRGVzY3JpcHRpb24sDQ0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscGNzdHJNb2R1bGUsDQ0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9J
RCBscENvbnRleHQpDQ0Kew0NCiAgZW51bV9pbmZvICppbmZvID0gKChlbnVt
X2luZm8gKikgbHBDb250ZXh0KTsNDQogIHdoaWxlIChzdHJsZW4oaW5mby0+
bmFtZSkgPiAwKSBpbmZvKys7DQ0KDQ0KICBzdHJuY3B5KGluZm8tPm5hbWUs
IGxwY3N0ckRlc2NyaXB0aW9uLCA2NCk7DQ0KICBpbmZvLT5pZCA9IGxwZ3Vp
ZDsNDQoNDQoJSFJFU1VMVCAgICBocjsNDQogIGluZm8tPmlzVmFsaWQgPSBm
YWxzZTsNDQogIGlmIChpbmZvLT5pc0lucHV0ID09IHRydWUpIHsNDQogICAg
RFNDQ0FQUyAgICAgICAgICAgICAgIGNhcHM7DQ0KICAgIExQRElSRUNUU09V
TkRDQVBUVVJFICBvYmplY3Q7DQ0KDQ0KICAgIGhyID0gRGlyZWN0U291bmRD
YXB0dXJlQ3JlYXRlKCAgbHBndWlkLCAmb2JqZWN0LCAgIE5VTEwgKTsNDQog
ICAgaWYoIGhyICE9IERTX09LICkgcmV0dXJuIHRydWU7DQ0KDQ0KICAgIGNh
cHMuZHdTaXplID0gc2l6ZW9mKGNhcHMpOw0NCiAgICBociA9IG9iamVjdC0+
R2V0Q2FwcyggJmNhcHMgKTsNDQogICAgaWYoIGhyID09IERTX09LICkgew0N
CiAgICAgIGlmIChjYXBzLmR3Q2hhbm5lbHMgPiAwICYmIGNhcHMuZHdGb3Jt
YXRzID4gMCkNDQogICAgICAgIGluZm8tPmlzVmFsaWQgPSB0cnVlOw0NCiAg
ICB9DQ0KICAgIG9iamVjdC0+UmVsZWFzZSgpOw0NCiAgfQ0NCiAgZWxzZSB7
DQ0KICAgIERTQ0FQUyAgICAgICAgIGNhcHM7DQ0KICAgIExQRElSRUNUU09V
TkQgIG9iamVjdDsNDQogICAgaHIgPSBEaXJlY3RTb3VuZENyZWF0ZSggIGxw
Z3VpZCwgJm9iamVjdCwgICBOVUxMICk7DQ0KICAgIGlmKCBociAhPSBEU19P
SyApIHJldHVybiB0cnVlOw0NCg0NCiAgICBjYXBzLmR3U2l6ZSA9IHNpemVv
ZihjYXBzKTsNDQogICAgaHIgPSBvYmplY3QtPkdldENhcHMoICZjYXBzICk7
DQ0KICAgIGlmKCBociA9PSBEU19PSyApIHsNDQogICAgICBpZiAoIGNhcHMu
ZHdGbGFncyAmIERTQ0FQU19QUklNQVJZTU9OTyB8fCBjYXBzLmR3RmxhZ3Mg
JiBEU0NBUFNfUFJJTUFSWVNURVJFTyApDQ0KICAgICAgICBpbmZvLT5pc1Zh
bGlkID0gdHJ1ZTsNDQogICAgfQ0NCiAgICBvYmplY3QtPlJlbGVhc2UoKTsN
DQogIH0NDQoNDQogIHJldHVybiB0cnVlOw0NCn0NDQoNDQpzdGF0aWMgY2hh
ciogZ2V0RXJyb3JTdHJpbmcoaW50IGNvZGUpDQ0Kew0NCglzd2l0Y2ggKGNv
ZGUpIHsNDQoNDQogIGNhc2UgRFNFUlJfQUxMT0NBVEVEOg0NCiAgICByZXR1
cm4gIkRpcmVjdCBTb3VuZCBhbHJlYWR5IGFsbG9jYXRlZCI7DQ0KDQ0KICBj
YXNlIERTRVJSX0NPTlRST0xVTkFWQUlMOg0NCiAgICByZXR1cm4gIkRpcmVj
dCBTb3VuZCBjb250cm9sIHVuYXZhaWxhYmxlIjsNDQoNDQogIGNhc2UgRFNF
UlJfSU5WQUxJRFBBUkFNOg0NCiAgICByZXR1cm4gIkRpcmVjdCBTb3VuZCBp
bnZhbGlkIHBhcmFtZXRlciI7DQ0KDQ0KICBjYXNlIERTRVJSX0lOVkFMSURD
QUxMOg0NCiAgICByZXR1cm4gIkRpcmVjdCBTb3VuZCBpbnZhbGlkIGNhbGwi
Ow0NCg0NCiAgY2FzZSBEU0VSUl9HRU5FUklDOg0NCiAgICByZXR1cm4gIkRp
cmVjdCBTb3VuZCBnZW5lcmljIGVycm9yIjsNDQoNDQogIGNhc2UgRFNFUlJf
UFJJT0xFVkVMTkVFREVEOg0NCiAgICByZXR1cm4gIkRpcmVjdCBTb3VuZCBQ
cmlvcml0eSBsZXZlbCBuZWVkZWQiOw0NCg0NCiAgY2FzZSBEU0VSUl9PVVRP
Rk1FTU9SWToNDQogICAgcmV0dXJuICJEaXJlY3QgU291bmQgb3V0IG9mIG1l
bW9yeSI7DQ0KDQ0KICBjYXNlIERTRVJSX0JBREZPUk1BVDoNDQogICAgcmV0
dXJuICJEaXJlY3QgU291bmQgYmFkIGZvcm1hdCI7DQ0KDQ0KICBjYXNlIERT
RVJSX1VOU1VQUE9SVEVEOg0NCiAgICByZXR1cm4gIkRpcmVjdCBTb3VuZCB1
bnN1cHBvcnRlZCBlcnJvciI7DQ0KDQ0KICBjYXNlIERTRVJSX05PRFJJVkVS
Og0NCiAgICByZXR1cm4gIkRpcmVjdCBTb3VuZCBubyBkcml2ZXIgZXJyb3Ii
Ow0NCg0NCiAgY2FzZSBEU0VSUl9BTFJFQURZSU5JVElBTElaRUQ6DQ0KICAg
IHJldHVybiAiRGlyZWN0IFNvdW5kIGFscmVhZHkgaW5pdGlhbGl6ZWQiOw0N
Cg0NCiAgY2FzZSBEU0VSUl9OT0FHR1JFR0FUSU9OOg0NCiAgICByZXR1cm4g
IkRpcmVjdCBTb3VuZCBubyBhZ2dyZWdhdGlvbiI7DQ0KDQ0KICBjYXNlIERT
RVJSX0JVRkZFUkxPU1Q6DQ0KICAgIHJldHVybiAiRGlyZWN0IFNvdW5kIGJ1
ZmZlciBsb3N0IjsNDQoNDQogIGNhc2UgRFNFUlJfT1RIRVJBUFBIQVNQUklP
Og0NCiAgICByZXR1cm4gIkRpcmVjdCBTb3VuZCBvdGhlciBhcHAgaGFzIHBy
aW9yaXR5IjsNDQoNDQogIGNhc2UgRFNFUlJfVU5JTklUSUFMSVpFRDoNDQog
ICAgcmV0dXJuICJEaXJlY3QgU291bmQgdW5pbml0aWFsaXplZCI7DQ0KDQ0K
ICBkZWZhdWx0Og0NCiAgICByZXR1cm4gIkRpcmVjdCBTb3VuZCB1bmtub3du
IGVycm9yIjsNDQoJfQ0NCn0NDQoNDQovLyoqKioqKioqKioqKioqKioqKioq
IEVuZCBvZiBfX1dJTkRPV1NfRFNfXyAqKioqKioqKioqKioqKioqKioqKiov
Lw0NCg0NCiNlbGlmIGRlZmluZWQoX19JUklYX0FMX18pIC8vIFNHSSdzIEFM
IEFQSSBmb3IgSVJJWA0NCg0NCiNpbmNsdWRlIDx1bmlzdGQuaD4NDQojaW5j
bHVkZSA8ZXJybm8uaD4NDQoNDQp2b2lkIFJ0QXVkaW8gOjogaW5pdGlhbGl6
ZSh2b2lkKQ0NCnsNDQoNDQogIC8vIENvdW50IGNhcmRzIGFuZCBkZXZpY2Vz
DQ0KICBuRGV2aWNlcyA9IDA7DQ0KDQ0KICAvLyBEZXRlcm1pbmUgdGhlIHRv
dGFsIG51bWJlciBvZiBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMuDQ0KICBu
RGV2aWNlcyA9IGFsUXVlcnlWYWx1ZXMoQUxfU1lTVEVNLCBBTF9ERVZJQ0VT
LCAwLCAwLCAwLCAwKTsNDQogIGlmIChuRGV2aWNlcyA8IDApIHsNDQogICAg
c3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQUwgZXJyb3IgY291bnRpbmcg
ZGV2aWNlczogJXMuIiwNDQogICAgICAgICAgICBhbEdldEVycm9yU3RyaW5n
KG9zZXJyb3IoKSkpOw0NCiAgICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJS
T1IpOw0NCiAgfQ0NCg0NCiAgaWYgKG5EZXZpY2VzIDw9IDApIHJldHVybjsN
DQoNDQogIEFMdmFsdWUgKnZscyA9IChBTHZhbHVlICopIG5ldyBBTHZhbHVl
W25EZXZpY2VzXTsNDQoNDQogIC8vIEFkZCBvbmUgZm9yIG91ciBkZWZhdWx0
IGlucHV0L291dHB1dCBkZXZpY2VzLg0NCiAgbkRldmljZXMrKzsNDQoNDQog
IC8vICBBbGxvY2F0ZSB0aGUgUlRBVURJT19ERVZJQ0Ugc3RydWN0dXJlcy4N
DQogIGRldmljZXMgPSAoUlRBVURJT19ERVZJQ0UgKikgY2FsbG9jKG5EZXZp
Y2VzLCBzaXplb2YoUlRBVURJT19ERVZJQ0UpKTsNDQogIGlmIChkZXZpY2Vz
ID09IE5VTEwpIHsNDQogICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzog
bWVtb3J5IGFsbG9jYXRpb24gZXJyb3IhIik7DQ0KICAgIGVycm9yKFJ0RXJy
b3I6Ok1FTU9SWV9FUlJPUik7DQ0KICB9DQ0KDQ0KICAvLyBXcml0ZSBkZXZp
Y2UgYXNjaWkgaWRlbnRpZmllcnMgdG8gZGV2aWNlIGluZm8gc3RydWN0dXJl
Lg0NCiAgY2hhciBuYW1lWzMyXTsNDQogIGludCBvdXRzLCBpbnMsIGk7DQ0K
ICBBTHB2IHB2c1sxXTsNDQogIHB2c1swXS5wYXJhbSA9IEFMX05BTUU7DQ0K
ICBwdnNbMF0udmFsdWUucHRyID0gbmFtZTsNDQogIHB2c1swXS5zaXplSW4g
PSAzMjsNDQoNDQogIHN0cmNweShkZXZpY2VzWzBdLm5hbWUsICJEZWZhdWx0
IElucHV0L091dHB1dCBEZXZpY2VzIik7DQ0KDQ0KICBvdXRzID0gYWxRdWVy
eVZhbHVlcyhBTF9TWVNURU0sIEFMX0RFRkFVTFRfT1VUUFVULCB2bHMsIG5E
ZXZpY2VzLTEsIDAsIDApOw0NCiAgaWYgKG91dHMgPCAwKSB7DQ0KICAgIHNw
cmludGYobWVzc2FnZSwgIlJ0QXVkaW86IEFMIGVycm9yIGdldHRpbmcgb3V0
cHV0IGRldmljZXM6ICVzLiIsDQ0KICAgICAgICAgICAgYWxHZXRFcnJvclN0
cmluZyhvc2Vycm9yKCkpKTsNDQogICAgZXJyb3IoUnRFcnJvcjo6RFJJVkVS
X0VSUk9SKTsNDQogIH0NDQoNDQogIGZvciAoaT0wOyBpPG91dHM7IGkrKykg
ew0NCiAgICBpZiAoYWxHZXRQYXJhbXModmxzW2ldLmksIHB2cywgMSkgPCAw
KSB7DQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQUwgZXJy
b3IgcXVlcnlpbmcgb3V0cHV0IGRldmljZXM6ICVzLiIsDQ0KICAgICAgICAg
ICAgICBhbEdldEVycm9yU3RyaW5nKG9zZXJyb3IoKSkpOw0NCiAgICAgIGVy
cm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICAgIH0NDQogICAgc3Ry
bmNweShkZXZpY2VzW2krMV0ubmFtZSwgbmFtZSwgMzIpOw0NCiAgICBkZXZp
Y2VzW2krMV0uaWRbMF0gPSB2bHNbaV0uaTsNDQogIH0NDQoNDQogIGlucyA9
IGFsUXVlcnlWYWx1ZXMoQUxfU1lTVEVNLCBBTF9ERUZBVUxUX0lOUFVULCAm
dmxzW291dHNdLCBuRGV2aWNlcy1vdXRzLTEsIDAsIDApOw0NCiAgaWYgKGlu
cyA8IDApIHsNDQogICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQUwg
ZXJyb3IgZ2V0dGluZyBpbnB1dCBkZXZpY2VzOiAlcy4iLA0NCiAgICAgICAg
ICAgIGFsR2V0RXJyb3JTdHJpbmcob3NlcnJvcigpKSk7DQ0KICAgIGVycm9y
KFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICB9DQ0KDQ0KICBmb3IgKGk9
b3V0czsgaTxpbnMrb3V0czsgaSsrKSB7DQ0KICAgIGlmIChhbEdldFBhcmFt
cyh2bHNbaV0uaSwgcHZzLCAxKSA8IDApIHsNDQogICAgICBzcHJpbnRmKG1l
c3NhZ2UsICJSdEF1ZGlvOiBBTCBlcnJvciBxdWVyeWluZyBpbnB1dCBkZXZp
Y2VzOiAlcy4iLA0NCiAgICAgICAgICAgICAgYWxHZXRFcnJvclN0cmluZyhv
c2Vycm9yKCkpKTsNDQogICAgICBlcnJvcihSdEVycm9yOjpEUklWRVJfRVJS
T1IpOw0NCiAgICB9DQ0KICAgIHN0cm5jcHkoZGV2aWNlc1tpKzFdLm5hbWUs
IG5hbWUsIDMyKTsNDQogICAgZGV2aWNlc1tpKzFdLmlkWzFdID0gdmxzW2ld
Lmk7DQ0KICB9DQ0KDQ0KICBkZWxldGUgW10gdmxzOw0NCg0NCiAgcmV0dXJu
Ow0NCn0NDQoNDQp2b2lkIFJ0QXVkaW8gOjogcHJvYmVEZXZpY2VJbmZvKFJU
QVVESU9fREVWSUNFICppbmZvKQ0NCnsNDQogIGludCByZXNvdXJjZSwgcmVz
dWx0LCBpOw0NCiAgQUx2YWx1ZSB2YWx1ZTsNDQogIEFMcGFyYW1JbmZvIHBp
bmZvOw0NCg0NCiAgLy8gR2V0IG91dHB1dCByZXNvdXJjZSBJRCBpZiBpdCBl
eGlzdHMuDQ0KICBpZiAoICFzdHJuY21wKGluZm8tPm5hbWUsICJEZWZhdWx0
IElucHV0L091dHB1dCBEZXZpY2VzIiwgMjgpICkgew0NCiAgICByZXN1bHQg
PSBhbFF1ZXJ5VmFsdWVzKEFMX1NZU1RFTSwgQUxfREVGQVVMVF9PVVRQVVQs
ICZ2YWx1ZSwgMSwgMCwgMCk7DQ0KICAgIGlmIChyZXN1bHQgPCAwKSB7DQ0K
ICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQUwgZXJyb3IgZ2V0
dGluZyBkZWZhdWx0IG91dHB1dCBkZXZpY2UgaWQ6ICVzLiIsDQ0KICAgICAg
ICAgICAgICBhbEdldEVycm9yU3RyaW5nKG9zZXJyb3IoKSkpOw0NCiAgICAg
IGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICB9DQ0KICAgIGVsc2UN
DQogICAgICByZXNvdXJjZSA9IHZhbHVlLmk7DQ0KICB9DQ0KICBlbHNlDQ0K
ICAgIHJlc291cmNlID0gaW5mby0+aWRbMF07DQ0KDQ0KICBpZiAocmVzb3Vy
Y2UgPiAwKSB7DQ0KDQ0KICAgIC8vIFByb2JlIG91dHB1dCBkZXZpY2UgcGFy
YW1ldGVycy4NDQogICAgcmVzdWx0ID0gYWxRdWVyeVZhbHVlcyhyZXNvdXJj
ZSwgQUxfQ0hBTk5FTFMsICZ2YWx1ZSwgMSwgMCwgMCk7DQ0KICAgIGlmIChy
ZXN1bHQgPCAwKSB7DQ0KICAgICAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRp
bzogQUwgZXJyb3IgZ2V0dGluZyBkZXZpY2UgKCVzKSBjaGFubmVsczogJXMu
IiwNDQogICAgICAgICAgICAgIGluZm8tPm5hbWUsIGFsR2V0RXJyb3JTdHJp
bmcob3NlcnJvcigpKSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6V0FSTklO
Ryk7DQ0KICAgIH0NDQogICAgZWxzZSB7DQ0KICAgICAgaW5mby0+bWF4T3V0
cHV0Q2hhbm5lbHMgPSB2YWx1ZS5pOw0NCiAgICAgIGluZm8tPm1pbk91dHB1
dENoYW5uZWxzID0gMTsNDQogICAgfQ0NCg0NCiAgICByZXN1bHQgPSBhbEdl
dFBhcmFtSW5mbyhyZXNvdXJjZSwgQUxfUkFURSwgJnBpbmZvKTsNDQogICAg
aWYgKHJlc3VsdCA8IDApIHsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJS
dEF1ZGlvOiBBTCBlcnJvciBnZXR0aW5nIGRldmljZSAoJXMpIHJhdGVzOiAl
cy4iLA0NCiAgICAgICAgICAgICAgaW5mby0+bmFtZSwgYWxHZXRFcnJvclN0
cmluZyhvc2Vycm9yKCkpKTsNDQogICAgICBlcnJvcihSdEVycm9yOjpXQVJO
SU5HKTsNDQogICAgfQ0NCiAgICBlbHNlIHsNDQogICAgICBpbmZvLT5uU2Ft
cGxlUmF0ZXMgPSAwOw0NCiAgICAgIGZvciAoaT0wOyBpPE1BWF9TQU1QTEVf
UkFURVM7IGkrKykgew0NCiAgICAgICAgaWYgKCBTQU1QTEVfUkFURVNbaV0g
Pj0gcGluZm8ubWluLmkgJiYgU0FNUExFX1JBVEVTW2ldIDw9IHBpbmZvLm1h
eC5pICkgew0NCiAgICAgICAgICBpbmZvLT5zYW1wbGVSYXRlc1tpbmZvLT5u
U2FtcGxlUmF0ZXNdID0gU0FNUExFX1JBVEVTW2ldOw0NCiAgICAgICAgICBp
bmZvLT5uU2FtcGxlUmF0ZXMrKzsNDQogICAgICAgIH0NDQogICAgICB9DQ0K
ICAgIH0NDQoNDQogICAgLy8gVGhlIEFMIGxpYnJhcnkgc3VwcG9ydHMgYWxs
IG91ciBmb3JtYXRzLCBleGNlcHQgMjQtYml0IGFuZCAzMi1iaXQgaW50cy4N
DQogICAgaW5mby0+bmF0aXZlRm9ybWF0cyA9IChSVEFVRElPX0ZPUk1BVCkg
NTE7DQ0KICB9DQ0KDQ0KICAvLyBOb3cgZ2V0IGlucHV0IHJlc291cmNlIElE
IGlmIGl0IGV4aXN0cy4NDQogIGlmICggIXN0cm5jbXAoaW5mby0+bmFtZSwg
IkRlZmF1bHQgSW5wdXQvT3V0cHV0IERldmljZXMiLCAyOCkgKSB7DQ0KICAg
IHJlc3VsdCA9IGFsUXVlcnlWYWx1ZXMoQUxfU1lTVEVNLCBBTF9ERUZBVUxU
X0lOUFVULCAmdmFsdWUsIDEsIDAsIDApOw0NCiAgICBpZiAocmVzdWx0IDwg
MCkgew0NCiAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IEFMIGVy
cm9yIGdldHRpbmcgZGVmYXVsdCBpbnB1dCBkZXZpY2UgaWQ6ICVzLiIsDQ0K
ICAgICAgICAgICAgICBhbEdldEVycm9yU3RyaW5nKG9zZXJyb3IoKSkpOw0N
CiAgICAgIGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICB9DQ0KICAg
IGVsc2UNDQogICAgICByZXNvdXJjZSA9IHZhbHVlLmk7DQ0KICB9DQ0KICBl
bHNlDQ0KICAgIHJlc291cmNlID0gaW5mby0+aWRbMV07DQ0KDQ0KICBpZiAo
cmVzb3VyY2UgPiAwKSB7DQ0KDQ0KICAgIC8vIFByb2JlIGlucHV0IGRldmlj
ZSBwYXJhbWV0ZXJzLg0NCiAgICByZXN1bHQgPSBhbFF1ZXJ5VmFsdWVzKHJl
c291cmNlLCBBTF9DSEFOTkVMUywgJnZhbHVlLCAxLCAwLCAwKTsNDQogICAg
aWYgKHJlc3VsdCA8IDApIHsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJS
dEF1ZGlvOiBBTCBlcnJvciBnZXR0aW5nIGRldmljZSAoJXMpIGNoYW5uZWxz
OiAlcy4iLA0NCiAgICAgICAgICAgICAgaW5mby0+bmFtZSwgYWxHZXRFcnJv
clN0cmluZyhvc2Vycm9yKCkpKTsNDQogICAgICBlcnJvcihSdEVycm9yOjpX
QVJOSU5HKTsNDQogICAgfQ0NCiAgICBlbHNlIHsNDQogICAgICBpbmZvLT5t
YXhJbnB1dENoYW5uZWxzID0gdmFsdWUuaTsNDQogICAgICBpbmZvLT5taW5J
bnB1dENoYW5uZWxzID0gMTsNDQogICAgfQ0NCg0NCiAgICByZXN1bHQgPSBh
bEdldFBhcmFtSW5mbyhyZXNvdXJjZSwgQUxfUkFURSwgJnBpbmZvKTsNDQog
ICAgaWYgKHJlc3VsdCA8IDApIHsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2Us
ICJSdEF1ZGlvOiBBTCBlcnJvciBnZXR0aW5nIGRldmljZSAoJXMpIHJhdGVz
OiAlcy4iLA0NCiAgICAgICAgICAgICAgaW5mby0+bmFtZSwgYWxHZXRFcnJv
clN0cmluZyhvc2Vycm9yKCkpKTsNDQogICAgICBlcnJvcihSdEVycm9yOjpX
QVJOSU5HKTsNDQogICAgfQ0NCiAgICBlbHNlIHsNDQogICAgICAvLyBJbiB0
aGUgY2FzZSBvZiB0aGUgZGVmYXVsdCBkZXZpY2UsIHRoZXNlIHZhbHVlcyB3
aWxsDQ0KICAgICAgLy8gb3ZlcndyaXRlIHRoZSByYXRlcyBkZXRlcm1pbmVk
IGZvciB0aGUgb3V0cHV0IGRldmljZS4gIFNpbmNlDQ0KICAgICAgLy8gdGhl
IGlucHV0IGRldmljZSBpcyBtb3N0IGxpa2VseSB0byBiZSBtb3JlIGxpbWl0
ZWQgdGhhbiB0aGUNDQogICAgICAvLyBvdXRwdXQgZGV2aWNlLCB0aGlzIGlz
IG9rLg0NCiAgICAgIGluZm8tPm5TYW1wbGVSYXRlcyA9IDA7DQ0KICAgICAg
Zm9yIChpPTA7IGk8TUFYX1NBTVBMRV9SQVRFUzsgaSsrKSB7DQ0KICAgICAg
ICBpZiAoIFNBTVBMRV9SQVRFU1tpXSA+PSBwaW5mby5taW4uaSAmJiBTQU1Q
TEVfUkFURVNbaV0gPD0gcGluZm8ubWF4LmkgKSB7DQ0KICAgICAgICAgIGlu
Zm8tPnNhbXBsZVJhdGVzW2luZm8tPm5TYW1wbGVSYXRlc10gPSBTQU1QTEVf
UkFURVNbaV07DQ0KICAgICAgICAgIGluZm8tPm5TYW1wbGVSYXRlcysrOw0N
CiAgICAgICAgfQ0NCiAgICAgIH0NDQogICAgfQ0NCg0NCiAgICAvLyBUaGUg
QUwgbGlicmFyeSBzdXBwb3J0cyBhbGwgb3VyIGZvcm1hdHMsIGV4Y2VwdCAy
NC1iaXQgYW5kIDMyLWJpdCBpbnRzLg0NCiAgICBpbmZvLT5uYXRpdmVGb3Jt
YXRzID0gKFJUQVVESU9fRk9STUFUKSA1MTsNDQogIH0NDQoNDQogIGlmICgg
aW5mby0+bWF4SW5wdXRDaGFubmVscyA9PSAwICYmIGluZm8tPm1heE91dHB1
dENoYW5uZWxzID09IDAgKQ0NCiAgICByZXR1cm47DQ0KICBpZiAoIGluZm8t
Pm5TYW1wbGVSYXRlcyA9PSAwICkNDQogICAgcmV0dXJuOw0NCg0NCiAgLy8g
RGV0ZXJtaW5lIGR1cGxleCBzdGF0dXMuDQ0KICBpZiAoaW5mby0+bWF4SW5w
dXRDaGFubmVscyA8IGluZm8tPm1heE91dHB1dENoYW5uZWxzKQ0NCiAgICBp
bmZvLT5tYXhEdXBsZXhDaGFubmVscyA9IGluZm8tPm1heElucHV0Q2hhbm5l
bHM7DQ0KICBlbHNlDQ0KICAgIGluZm8tPm1heER1cGxleENoYW5uZWxzID0g
aW5mby0+bWF4T3V0cHV0Q2hhbm5lbHM7DQ0KICBpZiAoaW5mby0+bWluSW5w
dXRDaGFubmVscyA8IGluZm8tPm1pbk91dHB1dENoYW5uZWxzKQ0NCiAgICBp
bmZvLT5taW5EdXBsZXhDaGFubmVscyA9IGluZm8tPm1pbklucHV0Q2hhbm5l
bHM7DQ0KICBlbHNlDQ0KICAgIGluZm8tPm1pbkR1cGxleENoYW5uZWxzID0g
aW5mby0+bWluT3V0cHV0Q2hhbm5lbHM7DQ0KDQ0KICBpZiAoIGluZm8tPm1h
eER1cGxleENoYW5uZWxzID4gMCApIGluZm8tPmhhc0R1cGxleFN1cHBvcnQg
PSB0cnVlOw0NCiAgZWxzZSBpbmZvLT5oYXNEdXBsZXhTdXBwb3J0ID0gZmFs
c2U7DQ0KDQ0KICBpbmZvLT5wcm9iZWQgPSB0cnVlOw0NCg0NCiAgcmV0dXJu
Ow0NCn0NDQoNDQpib29sIFJ0QXVkaW8gOjogcHJvYmVEZXZpY2VPcGVuKGlu
dCBkZXZpY2UsIFJUQVVESU9fU1RSRUFNICpzdHJlYW0sDQ0KICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBTVFJFQU1fTU9ERSBtb2RlLCBpbnQg
Y2hhbm5lbHMsIA0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
aW50IHNhbXBsZVJhdGUsIFJUQVVESU9fRk9STUFUIGZvcm1hdCwNDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnVmZmVyU2l6ZSwg
aW50IG51bWJlck9mQnVmZmVycykNDQp7DQ0KICBpbnQgcmVzdWx0LCByZXNv
dXJjZSwgbkJ1ZmZlcnM7DQ0KICBBTGNvbmZpZyBhbF9jb25maWc7DQ0KICBB
THBvcnQgcG9ydDsNDQogIEFMcHYgcHZzWzJdOw0NCg0NCiAgLy8gR2V0IGEg
bmV3IEFMY29uZmlnIHN0cnVjdHVyZS4NDQogIGFsX2NvbmZpZyA9IGFsTmV3
Q29uZmlnKCk7DQ0KICBpZiAoICFhbF9jb25maWcgKSB7DQ0KICAgIHNwcmlu
dGYobWVzc2FnZSwiUnRBdWRpbzogY2FuJ3QgZ2V0IEFMIGNvbmZpZzogJXMu
IiwNDQogICAgICAgICAgICBhbEdldEVycm9yU3RyaW5nKG9zZXJyb3IoKSkp
Ow0NCiAgICBlcnJvcihSdEVycm9yOjpXQVJOSU5HKTsNDQogICAgcmV0dXJu
IEZBSUxVUkU7DQ0KICB9DQ0KDQ0KICAvLyBTZXQgdGhlIGNoYW5uZWxzLg0N
CiAgcmVzdWx0ID0gYWxTZXRDaGFubmVscyhhbF9jb25maWcsIGNoYW5uZWxz
KTsNDQogIGlmICggcmVzdWx0IDwgMCApIHsNDQogICAgc3ByaW50ZihtZXNz
YWdlLCJSdEF1ZGlvOiBjYW4ndCBzZXQgJWQgY2hhbm5lbHMgaW4gQUwgY29u
ZmlnOiAlcy4iLA0NCiAgICAgICAgICAgIGNoYW5uZWxzLCBhbEdldEVycm9y
U3RyaW5nKG9zZXJyb3IoKSkpOw0NCiAgICBlcnJvcihSdEVycm9yOjpXQVJO
SU5HKTsNDQogICAgcmV0dXJuIEZBSUxVUkU7DQ0KICB9DQ0KDQ0KICAvLyBT
ZXQgdGhlIHF1ZXVlIChidWZmZXIpIHNpemUuDQ0KICBpZiAoIG51bWJlck9m
QnVmZmVycyA8IDEgKQ0NCiAgICBuQnVmZmVycyA9IDE7DQ0KICBlbHNlDQ0K
ICAgIG5CdWZmZXJzID0gbnVtYmVyT2ZCdWZmZXJzOw0NCiAgbG9uZyBidWZm
ZXJfc2l6ZSA9ICpidWZmZXJTaXplICogbkJ1ZmZlcnM7DQ0KICByZXN1bHQg
PSBhbFNldFF1ZXVlU2l6ZShhbF9jb25maWcsIGJ1ZmZlcl9zaXplKTsgLy8g
aW4gc2FtcGxlIGZyYW1lcw0NCiAgaWYgKCByZXN1bHQgPCAwICkgew0NCiAg
ICBzcHJpbnRmKG1lc3NhZ2UsIlJ0QXVkaW86IGNhbid0IHNldCBidWZmZXIg
c2l6ZSAoJWxkKSBpbiBBTCBjb25maWc6ICVzLiIsDQ0KICAgICAgICAgICAg
YnVmZmVyX3NpemUsIGFsR2V0RXJyb3JTdHJpbmcob3NlcnJvcigpKSk7DQ0K
ICAgIGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICByZXR1cm4gRkFJ
TFVSRTsNDQogIH0NDQoNDQogIC8vIFNldCB0aGUgZGF0YSBmb3JtYXQuDQ0K
ICBzdHJlYW0tPnVzZXJGb3JtYXQgPSBmb3JtYXQ7DQ0KICBzdHJlYW0tPmRl
dmljZUZvcm1hdFttb2RlXSA9IGZvcm1hdDsNDQogIGlmIChmb3JtYXQgPT0g
UlRBVURJT19TSU5UOCkgew0NCiAgICByZXN1bHQgPSBhbFNldFNhbXBGbXQo
YWxfY29uZmlnLCBBTF9TQU1QRk1UX1RXT1NDT01QKTsNDQogICAgcmVzdWx0
ID0gYWxTZXRXaWR0aChhbF9jb25maWcsIEFMX1NBTVBMRV84KTsNDQogIH0N
DQogIGVsc2UgaWYgKGZvcm1hdCA9PSBSVEFVRElPX1NJTlQxNikgew0NCiAg
ICByZXN1bHQgPSBhbFNldFNhbXBGbXQoYWxfY29uZmlnLCBBTF9TQU1QRk1U
X1RXT1NDT01QKTsNDQogICAgcmVzdWx0ID0gYWxTZXRXaWR0aChhbF9jb25m
aWcsIEFMX1NBTVBMRV8xNik7DQ0KICB9DQ0KICBlbHNlIGlmIChmb3JtYXQg
PT0gUlRBVURJT19TSU5UMjQpIHsNDQogICAgLy8gT3VyIDI0LWJpdCBmb3Jt
YXQgYXNzdW1lcyB0aGUgdXBwZXIgMyBieXRlcyBvZiBhIDQgYnl0ZSB3b3Jk
Lg0NCiAgICAvLyBUaGUgQUwgbGlicmFyeSB1c2VzIHRoZSBsb3dlciAzIGJ5
dGVzLCBzbyB3ZSdsbCBuZWVkIHRvIGRvIG91cg0NCiAgICAvLyBvd24gY29u
dmVyc2lvbi4NDQogICAgcmVzdWx0ID0gYWxTZXRTYW1wRm10KGFsX2NvbmZp
ZywgQUxfU0FNUEZNVF9GTE9BVCk7DQ0KICAgIHN0cmVhbS0+ZGV2aWNlRm9y
bWF0W21vZGVdID0gUlRBVURJT19GTE9BVDMyOw0NCiAgfQ0NCiAgZWxzZSBp
ZiAoZm9ybWF0ID09IFJUQVVESU9fU0lOVDMyKSB7DQ0KICAgIC8vIFRoZSBB
TCBsaWJyYXJ5IGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHRoZSAzMi1iaXQg
aW50ZWdlcg0NCiAgICAvLyBmb3JtYXQsIHNvIHdlJ2xsIG5lZWQgdG8gZG8g
b3VyIG93biBjb252ZXJzaW9uLg0NCiAgICByZXN1bHQgPSBhbFNldFNhbXBG
bXQoYWxfY29uZmlnLCBBTF9TQU1QRk1UX0ZMT0FUKTsNDQogICAgc3RyZWFt
LT5kZXZpY2VGb3JtYXRbbW9kZV0gPSBSVEFVRElPX0ZMT0FUMzI7DQ0KICB9
DQ0KICBlbHNlIGlmIChmb3JtYXQgPT0gUlRBVURJT19GTE9BVDMyKQ0NCiAg
ICByZXN1bHQgPSBhbFNldFNhbXBGbXQoYWxfY29uZmlnLCBBTF9TQU1QRk1U
X0ZMT0FUKTsNDQogIGVsc2UgaWYgKGZvcm1hdCA9PSBSVEFVRElPX0ZMT0FU
NjQpDQ0KICAgIHJlc3VsdCA9IGFsU2V0U2FtcEZtdChhbF9jb25maWcsIEFM
X1NBTVBGTVRfRE9VQkxFKTsNDQoNDQogIGlmICggcmVzdWx0ID09IC0xICkg
ew0NCiAgICBzcHJpbnRmKG1lc3NhZ2UsIlJ0QXVkaW86IEFMIGVycm9yIHNl
dHRpbmcgc2FtcGxlIGZvcm1hdCBpbiBBTCBjb25maWc6ICVzLiIsDQ0KICAg
ICAgICAgICAgYWxHZXRFcnJvclN0cmluZyhvc2Vycm9yKCkpKTsNDQogICAg
ZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgIHJldHVybiBGQUlMVVJF
Ow0NCiAgfQ0NCg0NCiAgaWYgKG1vZGUgPT0gUExBWUJBQ0spIHsNDQoNDQog
ICAgLy8gU2V0IG91ciBkZXZpY2UuDQ0KICAgIGlmIChkZXZpY2UgPT0gMCkN
DQogICAgICByZXNvdXJjZSA9IEFMX0RFRkFVTFRfT1VUUFVUOw0NCiAgICBl
bHNlDQ0KICAgICAgcmVzb3VyY2UgPSBkZXZpY2VzW2RldmljZV0uaWRbMF07
DQ0KICAgIHJlc3VsdCA9IGFsU2V0RGV2aWNlKGFsX2NvbmZpZywgcmVzb3Vy
Y2UpOw0NCiAgICBpZiAoIHJlc3VsdCA9PSAtMSApIHsNDQogICAgICBzcHJp
bnRmKG1lc3NhZ2UsIlJ0QXVkaW86IEFMIGVycm9yIHNldHRpbmcgZGV2aWNl
ICglcykgaW4gQUwgY29uZmlnOiAlcy4iLA0NCiAgICAgICAgICAgICAgZGV2
aWNlc1tkZXZpY2VdLm5hbWUsIGFsR2V0RXJyb3JTdHJpbmcob3NlcnJvcigp
KSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAg
cmV0dXJuIEZBSUxVUkU7DQ0KICAgIH0NDQoNDQogICAgLy8gT3BlbiB0aGUg
cG9ydC4NDQogICAgcG9ydCA9IGFsT3BlblBvcnQoIlJ0QXVkaW8gT3V0cHV0
IFBvcnQiLCAidyIsIGFsX2NvbmZpZyk7DQ0KICAgIGlmKCAhcG9ydCApIHsN
DQogICAgICBzcHJpbnRmKG1lc3NhZ2UsIlJ0QXVkaW86IEFMIGVycm9yIG9w
ZW5pbmcgb3V0cHV0IHBvcnQ6ICVzLiIsDQ0KICAgICAgICAgICAgICBhbEdl
dEVycm9yU3RyaW5nKG9zZXJyb3IoKSkpOw0NCiAgICAgIGVycm9yKFJ0RXJy
b3I6OldBUk5JTkcpOw0NCiAgICAgIHJldHVybiBGQUlMVVJFOw0NCiAgICB9
DQ0KDQ0KICAgIC8vIFNldCB0aGUgc2FtcGxlIHJhdGUNDQogICAgcHZzWzBd
LnBhcmFtID0gQUxfTUFTVEVSX0NMT0NLOw0NCiAgICBwdnNbMF0udmFsdWUu
aSA9IEFMX0NSWVNUQUxfTUNMS19UWVBFOw0NCiAgICBwdnNbMV0ucGFyYW0g
PSBBTF9SQVRFOw0NCiAgICBwdnNbMV0udmFsdWUubGwgPSBhbERvdWJsZVRv
Rml4ZWQoKGRvdWJsZSlzYW1wbGVSYXRlKTsNDQogICAgcmVzdWx0ID0gYWxT
ZXRQYXJhbXMocmVzb3VyY2UsIHB2cywgMik7DQ0KICAgIGlmICggcmVzdWx0
IDwgMCApIHsNDQogICAgICBhbENsb3NlUG9ydChwb3J0KTsNDQogICAgICBz
cHJpbnRmKG1lc3NhZ2UsIlJ0QXVkaW86IEFMIGVycm9yIHNldHRpbmcgc2Ft
cGxlIHJhdGUgKCVkKSBmb3IgZGV2aWNlICglcyk6ICVzLiIsDQ0KICAgICAg
ICAgICAgICBzYW1wbGVSYXRlLCBkZXZpY2VzW2RldmljZV0ubmFtZSwgYWxH
ZXRFcnJvclN0cmluZyhvc2Vycm9yKCkpKTsNDQogICAgICBlcnJvcihSdEVy
cm9yOjpXQVJOSU5HKTsNDQogICAgICByZXR1cm4gRkFJTFVSRTsNDQogICAg
fQ0NCiAgfQ0NCiAgZWxzZSB7IC8vIG1vZGUgPT0gUkVDT1JEDQ0KDQ0KICAg
IC8vIFNldCBvdXIgZGV2aWNlLg0NCiAgICBpZiAoZGV2aWNlID09IDApDQ0K
ICAgICAgcmVzb3VyY2UgPSBBTF9ERUZBVUxUX0lOUFVUOw0NCiAgICBlbHNl
DQ0KICAgICAgcmVzb3VyY2UgPSBkZXZpY2VzW2RldmljZV0uaWRbMV07DQ0K
ICAgIHJlc3VsdCA9IGFsU2V0RGV2aWNlKGFsX2NvbmZpZywgcmVzb3VyY2Up
Ow0NCiAgICBpZiAoIHJlc3VsdCA9PSAtMSApIHsNDQogICAgICBzcHJpbnRm
KG1lc3NhZ2UsIlJ0QXVkaW86IEFMIGVycm9yIHNldHRpbmcgZGV2aWNlICgl
cykgaW4gQUwgY29uZmlnOiAlcy4iLA0NCiAgICAgICAgICAgICAgZGV2aWNl
c1tkZXZpY2VdLm5hbWUsIGFsR2V0RXJyb3JTdHJpbmcob3NlcnJvcigpKSk7
DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6V0FSTklORyk7DQ0KICAgICAgcmV0
dXJuIEZBSUxVUkU7DQ0KICAgIH0NDQoNDQogICAgLy8gT3BlbiB0aGUgcG9y
dC4NDQogICAgcG9ydCA9IGFsT3BlblBvcnQoIlJ0QXVkaW8gT3V0cHV0IFBv
cnQiLCAiciIsIGFsX2NvbmZpZyk7DQ0KICAgIGlmKCAhcG9ydCApIHsNDQog
ICAgICBzcHJpbnRmKG1lc3NhZ2UsIlJ0QXVkaW86IEFMIGVycm9yIG9wZW5p
bmcgaW5wdXQgcG9ydDogJXMuIiwNDQogICAgICAgICAgICAgIGFsR2V0RXJy
b3JTdHJpbmcob3NlcnJvcigpKSk7DQ0KICAgICAgZXJyb3IoUnRFcnJvcjo6
V0FSTklORyk7DQ0KICAgICAgcmV0dXJuIEZBSUxVUkU7DQ0KICAgIH0NDQoN
DQogICAgLy8gU2V0IHRoZSBzYW1wbGUgcmF0ZQ0NCiAgICBwdnNbMF0ucGFy
YW0gPSBBTF9NQVNURVJfQ0xPQ0s7DQ0KICAgIHB2c1swXS52YWx1ZS5pID0g
QUxfQ1JZU1RBTF9NQ0xLX1RZUEU7DQ0KICAgIHB2c1sxXS5wYXJhbSA9IEFM
X1JBVEU7DQ0KICAgIHB2c1sxXS52YWx1ZS5sbCA9IGFsRG91YmxlVG9GaXhl
ZCgoZG91YmxlKXNhbXBsZVJhdGUpOw0NCiAgICByZXN1bHQgPSBhbFNldFBh
cmFtcyhyZXNvdXJjZSwgcHZzLCAyKTsNDQogICAgaWYgKCByZXN1bHQgPCAw
ICkgew0NCiAgICAgIGFsQ2xvc2VQb3J0KHBvcnQpOw0NCiAgICAgIHNwcmlu
dGYobWVzc2FnZSwiUnRBdWRpbzogQUwgZXJyb3Igc2V0dGluZyBzYW1wbGUg
cmF0ZSAoJWQpIGZvciBkZXZpY2UgKCVzKTogJXMuIiwNDQogICAgICAgICAg
ICAgIHNhbXBsZVJhdGUsIGRldmljZXNbZGV2aWNlXS5uYW1lLCBhbEdldEVy
cm9yU3RyaW5nKG9zZXJyb3IoKSkpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6
OldBUk5JTkcpOw0NCiAgICAgIHJldHVybiBGQUlMVVJFOw0NCiAgICB9DQ0K
ICB9DQ0KDQ0KICBhbEZyZWVDb25maWcoYWxfY29uZmlnKTsNDQoNDQogIHN0
cmVhbS0+blVzZXJDaGFubmVsc1ttb2RlXSA9IGNoYW5uZWxzOw0NCiAgc3Ry
ZWFtLT5uRGV2aWNlQ2hhbm5lbHNbbW9kZV0gPSBjaGFubmVsczsNDQoNDQog
IC8vIFNldCBoYW5kbGUgYW5kIGZsYWdzIGZvciBidWZmZXIgY29udmVyc2lv
bg0NCiAgc3RyZWFtLT5oYW5kbGVbbW9kZV0gPSBwb3J0Ow0NCiAgc3RyZWFt
LT5kb0NvbnZlcnRCdWZmZXJbbW9kZV0gPSBmYWxzZTsNDQogIGlmIChzdHJl
YW0tPnVzZXJGb3JtYXQgIT0gc3RyZWFtLT5kZXZpY2VGb3JtYXRbbW9kZV0p
DQ0KICAgIHN0cmVhbS0+ZG9Db252ZXJ0QnVmZmVyW21vZGVdID0gdHJ1ZTsN
DQoNDQogIC8vIEFsbG9jYXRlIG5lY2Vzc2FyeSBpbnRlcm5hbCBidWZmZXJz
DQ0KICBpZiAoIHN0cmVhbS0+blVzZXJDaGFubmVsc1swXSAhPSBzdHJlYW0t
Pm5Vc2VyQ2hhbm5lbHNbMV0gKSB7DQ0KDQ0KICAgIGxvbmcgYnVmZmVyX2J5
dGVzOw0NCiAgICBpZiAoc3RyZWFtLT5uVXNlckNoYW5uZWxzWzBdID49IHN0
cmVhbS0+blVzZXJDaGFubmVsc1sxXSkNDQogICAgICBidWZmZXJfYnl0ZXMg
PSBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMF07DQ0KICAgIGVsc2UNDQogICAg
ICBidWZmZXJfYnl0ZXMgPSBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMV07DQ0K
DQ0KICAgIGJ1ZmZlcl9ieXRlcyAqPSAqYnVmZmVyU2l6ZSAqIGZvcm1hdEJ5
dGVzKHN0cmVhbS0+dXNlckZvcm1hdCk7DQ0KICAgIGlmIChzdHJlYW0tPnVz
ZXJCdWZmZXIpIGZyZWUoc3RyZWFtLT51c2VyQnVmZmVyKTsNDQogICAgc3Ry
ZWFtLT51c2VyQnVmZmVyID0gKGNoYXIgKikgY2FsbG9jKGJ1ZmZlcl9ieXRl
cywgMSk7DQ0KICAgIGlmIChzdHJlYW0tPnVzZXJCdWZmZXIgPT0gTlVMTCkN
DQogICAgICBnb3RvIG1lbW9yeV9lcnJvcjsNDQogIH0NDQoNDQogIGlmICgg
c3RyZWFtLT5kb0NvbnZlcnRCdWZmZXJbbW9kZV0gKSB7DQ0KDQ0KICAgIGxv
bmcgYnVmZmVyX2J5dGVzOw0NCiAgICBib29sIG1ha2VCdWZmZXIgPSB0cnVl
Ow0NCiAgICBpZiAoIG1vZGUgPT0gUExBWUJBQ0sgKQ0NCiAgICAgIGJ1ZmZl
cl9ieXRlcyA9IHN0cmVhbS0+bkRldmljZUNoYW5uZWxzWzBdICogZm9ybWF0
Qnl0ZXMoc3RyZWFtLT5kZXZpY2VGb3JtYXRbMF0pOw0NCiAgICBlbHNlIHsg
Ly8gbW9kZSA9PSBSRUNPUkQNDQogICAgICBidWZmZXJfYnl0ZXMgPSBzdHJl
YW0tPm5EZXZpY2VDaGFubmVsc1sxXSAqIGZvcm1hdEJ5dGVzKHN0cmVhbS0+
ZGV2aWNlRm9ybWF0WzFdKTsNDQogICAgICBpZiAoIHN0cmVhbS0+bW9kZSA9
PSBQTEFZQkFDSyApIHsNDQogICAgICAgIGxvbmcgYnl0ZXNfb3V0ID0gc3Ry
ZWFtLT5uRGV2aWNlQ2hhbm5lbHNbMF0gKiBmb3JtYXRCeXRlcyhzdHJlYW0t
PmRldmljZUZvcm1hdFswXSk7DQ0KICAgICAgICBpZiAoIGJ1ZmZlcl9ieXRl
cyA+IGJ5dGVzX291dCApDQ0KICAgICAgICAgIGJ1ZmZlcl9ieXRlcyA9IChi
dWZmZXJfYnl0ZXMgPiBieXRlc19vdXQpID8gYnVmZmVyX2J5dGVzIDogYnl0
ZXNfb3V0Ow0NCiAgICAgICAgZWxzZQ0NCiAgICAgICAgICBtYWtlQnVmZmVy
ID0gZmFsc2U7DQ0KICAgICAgfQ0NCiAgICB9DQ0KDQ0KICAgIGlmICggbWFr
ZUJ1ZmZlciApIHsNDQogICAgICBidWZmZXJfYnl0ZXMgKj0gKmJ1ZmZlclNp
emU7DQ0KICAgICAgaWYgKHN0cmVhbS0+ZGV2aWNlQnVmZmVyKSBmcmVlKHN0
cmVhbS0+ZGV2aWNlQnVmZmVyKTsNDQogICAgICBzdHJlYW0tPmRldmljZUJ1
ZmZlciA9IChjaGFyICopIGNhbGxvYyhidWZmZXJfYnl0ZXMsIDEpOw0NCiAg
ICAgIGlmIChzdHJlYW0tPmRldmljZUJ1ZmZlciA9PSBOVUxMKQ0NCiAgICAg
ICAgZ290byBtZW1vcnlfZXJyb3I7DQ0KICAgIH0NDQogIH0NDQoNDQogIHN0
cmVhbS0+ZGV2aWNlW21vZGVdID0gZGV2aWNlOw0NCiAgc3RyZWFtLT5zdGF0
ZSA9IFNUUkVBTV9TVE9QUEVEOw0NCiAgaWYgKCBzdHJlYW0tPm1vZGUgPT0g
UExBWUJBQ0sgJiYgbW9kZSA9PSBSRUNPUkQgKQ0NCiAgICAvLyBXZSBoYWQg
YWxyZWFkeSBzZXQgdXAgYW4gb3V0cHV0IHN0cmVhbS4NDQogICAgc3RyZWFt
LT5tb2RlID0gRFVQTEVYOw0NCiAgZWxzZQ0NCiAgICBzdHJlYW0tPm1vZGUg
PSBtb2RlOw0NCiAgc3RyZWFtLT5uQnVmZmVycyA9IG5CdWZmZXJzOw0NCiAg
c3RyZWFtLT5idWZmZXJTaXplID0gKmJ1ZmZlclNpemU7DQ0KICBzdHJlYW0t
PnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOw0NCg0NCiAgcmV0dXJuIFNVQ0NF
U1M7DQ0KDQ0KIG1lbW9yeV9lcnJvcjoNDQogIGlmIChzdHJlYW0tPmhhbmRs
ZVswXSkgew0NCiAgICBhbENsb3NlUG9ydChzdHJlYW0tPmhhbmRsZVswXSk7
DQ0KICAgIHN0cmVhbS0+aGFuZGxlWzBdID0gMDsNDQogIH0NDQogIGlmIChz
dHJlYW0tPmhhbmRsZVsxXSkgew0NCiAgICBhbENsb3NlUG9ydChzdHJlYW0t
PmhhbmRsZVsxXSk7DQ0KICAgIHN0cmVhbS0+aGFuZGxlWzFdID0gMDsNDQog
IH0NDQogIGlmIChzdHJlYW0tPnVzZXJCdWZmZXIpIHsNDQogICAgZnJlZShz
dHJlYW0tPnVzZXJCdWZmZXIpOw0NCiAgICBzdHJlYW0tPnVzZXJCdWZmZXIg
PSAwOw0NCiAgfQ0NCiAgc3ByaW50ZihtZXNzYWdlLCAiUnRBdWRpbzogQUxT
QSBlcnJvciBhbGxvY2F0aW5nIGJ1ZmZlciBtZW1vcnkgZm9yIGRldmljZSAo
JXMpLiIsDQ0KICAgICAgICAgIGRldmljZXNbZGV2aWNlXS5uYW1lKTsNDQog
IGVycm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgcmV0dXJuIEZBSUxVUkU7
DQ0KfQ0NCg0NCnZvaWQgUnRBdWRpbyA6OiBjYW5jZWxTdHJlYW1DYWxsYmFj
ayhpbnQgc3RyZWFtSWQpDQ0Kew0NCiAgUlRBVURJT19TVFJFQU0gKnN0cmVh
bSA9IChSVEFVRElPX1NUUkVBTSAqKSB2ZXJpZnlTdHJlYW0oc3RyZWFtSWQp
Ow0NCg0NCiAgaWYgKHN0cmVhbS0+dXNpbmdDYWxsYmFjaykgew0NCiAgICBz
dHJlYW0tPnVzaW5nQ2FsbGJhY2sgPSBmYWxzZTsNDQogICAgcHRocmVhZF9j
YW5jZWwoc3RyZWFtLT50aHJlYWQpOw0NCiAgICBwdGhyZWFkX2pvaW4oc3Ry
ZWFtLT50aHJlYWQsIE5VTEwpOw0NCiAgICBzdHJlYW0tPnRocmVhZCA9IDA7
DQ0KICAgIHN0cmVhbS0+Y2FsbGJhY2sgPSBOVUxMOw0NCiAgICBzdHJlYW0t
PnVzZXJEYXRhID0gTlVMTDsNDQogIH0NDQp9DQ0KDQ0Kdm9pZCBSdEF1ZGlv
IDo6IGNsb3NlU3RyZWFtKGludCBzdHJlYW1JZCkNDQp7DQ0KICAvLyBXZSBk
b24ndCB3YW50IGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gaGVyZSBiZWNh
dXNlIHRoaXMNDQogIC8vIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBvdXIgY2xh
c3MgZGVzdHJ1Y3Rvci4gIFNvLCBkbyBvdXIgb3duDQ0KICAvLyBzdHJlYW1J
ZCBjaGVjay4NDQogIGlmICggc3RyZWFtcy5maW5kKCBzdHJlYW1JZCApID09
IHN0cmVhbXMuZW5kKCkgKSB7DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0
QXVkaW86IGludmFsaWQgc3RyZWFtIGlkZW50aWZpZXIhIik7DQ0KICAgIGVy
cm9yKFJ0RXJyb3I6OldBUk5JTkcpOw0NCiAgICByZXR1cm47DQ0KICB9DQ0K
DQ0KICBSVEFVRElPX1NUUkVBTSAqc3RyZWFtID0gKFJUQVVESU9fU1RSRUFN
ICopIHN0cmVhbXNbc3RyZWFtSWRdOw0NCg0NCiAgaWYgKHN0cmVhbS0+dXNp
bmdDYWxsYmFjaykgew0NCiAgICBwdGhyZWFkX2NhbmNlbChzdHJlYW0tPnRo
cmVhZCk7DQ0KICAgIHB0aHJlYWRfam9pbihzdHJlYW0tPnRocmVhZCwgTlVM
TCk7DQ0KICB9DQ0KDQ0KICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnN0cmVh
bS0+bXV0ZXgpOw0NCg0NCiAgaWYgKHN0cmVhbS0+aGFuZGxlWzBdKQ0NCiAg
ICBhbENsb3NlUG9ydChzdHJlYW0tPmhhbmRsZVswXSk7DQ0KDQ0KICBpZiAo
c3RyZWFtLT5oYW5kbGVbMV0pDQ0KICAgIGFsQ2xvc2VQb3J0KHN0cmVhbS0+
aGFuZGxlWzFdKTsNDQoNDQogIGlmIChzdHJlYW0tPnVzZXJCdWZmZXIpDQ0K
ICAgIGZyZWUoc3RyZWFtLT51c2VyQnVmZmVyKTsNDQoNDQogIGlmIChzdHJl
YW0tPmRldmljZUJ1ZmZlcikNDQogICAgZnJlZShzdHJlYW0tPmRldmljZUJ1
ZmZlcik7DQ0KDQ0KICBmcmVlKHN0cmVhbSk7DQ0KICBzdHJlYW1zLmVyYXNl
KHN0cmVhbUlkKTsNDQp9DQ0KDQ0Kdm9pZCBSdEF1ZGlvIDo6IHN0YXJ0U3Ry
ZWFtKGludCBzdHJlYW1JZCkNDQp7DQ0KICBSVEFVRElPX1NUUkVBTSAqc3Ry
ZWFtID0gKFJUQVVESU9fU1RSRUFNICopIHZlcmlmeVN0cmVhbShzdHJlYW1J
ZCk7DQ0KDQ0KICBpZiAoc3RyZWFtLT5zdGF0ZSA9PSBTVFJFQU1fUlVOTklO
RykNDQogICAgcmV0dXJuOw0NCg0NCiAgLy8gVGhlIEFMIHBvcnQgaXMgcmVh
ZHkgYXMgc29vbiBhcyBpdCBpcyBvcGVuZWQuDQ0KICBzdHJlYW0tPnN0YXRl
ID0gU1RSRUFNX1JVTk5JTkc7DQ0KfQ0NCg0NCnZvaWQgUnRBdWRpbyA6OiBz
dG9wU3RyZWFtKGludCBzdHJlYW1JZCkNDQp7DQ0KICBSVEFVRElPX1NUUkVB
TSAqc3RyZWFtID0gKFJUQVVESU9fU1RSRUFNICopIHZlcmlmeVN0cmVhbShz
dHJlYW1JZCk7DQ0KDQ0KICBNVVRFWF9MT0NLKCZzdHJlYW0tPm11dGV4KTsN
DQoNDQogIGlmIChzdHJlYW0tPnN0YXRlID09IFNUUkVBTV9TVE9QUEVEKQ0N
CiAgICBnb3RvIHVubG9jazsNDQoNDQogIGludCByZXN1bHQ7DQ0KICBpbnQg
YnVmZmVyX3NpemUgPSBzdHJlYW0tPmJ1ZmZlclNpemUgKiBzdHJlYW0tPm5C
dWZmZXJzOw0NCg0NCiAgaWYgKHN0cmVhbS0+bW9kZSA9PSBQTEFZQkFDSyB8
fCBzdHJlYW0tPm1vZGUgPT0gRFVQTEVYKQ0NCiAgICBhbFplcm9GcmFtZXMo
c3RyZWFtLT5oYW5kbGVbMF0sIGJ1ZmZlcl9zaXplKTsNDQoNDQogIGlmIChz
dHJlYW0tPm1vZGUgPT0gUkVDT1JEIHx8IHN0cmVhbS0+bW9kZSA9PSBEVVBM
RVgpIHsNDQogICAgcmVzdWx0ID0gYWxEaXNjYXJkRnJhbWVzKHN0cmVhbS0+
aGFuZGxlWzFdLCBidWZmZXJfc2l6ZSk7DQ0KICAgIGlmIChyZXN1bHQgPT0g
LTEpIHsNDQogICAgICBzcHJpbnRmKG1lc3NhZ2UsICJSdEF1ZGlvOiBBTCBl
cnJvciBkcmFpbmluZyBzdHJlYW0gZGV2aWNlICglcyk6ICVzLiIsDQ0KICAg
ICAgICAgICAgICBkZXZpY2VzW3N0cmVhbS0+ZGV2aWNlWzFdXS5uYW1lLCBh
bEdldEVycm9yU3RyaW5nKG9zZXJyb3IoKSkpOw0NCiAgICAgIGVycm9yKFJ0
RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICAgIH0NDQogIH0NDQogIHN0cmVh
bS0+c3RhdGUgPSBTVFJFQU1fU1RPUFBFRDsNDQoNDQogdW5sb2NrOg0NCiAg
TVVURVhfVU5MT0NLKCZzdHJlYW0tPm11dGV4KTsNDQp9DQ0KDQ0Kdm9pZCBS
dEF1ZGlvIDo6IGFib3J0U3RyZWFtKGludCBzdHJlYW1JZCkNDQp7DQ0KICBS
VEFVRElPX1NUUkVBTSAqc3RyZWFtID0gKFJUQVVESU9fU1RSRUFNICopIHZl
cmlmeVN0cmVhbShzdHJlYW1JZCk7DQ0KDQ0KICBNVVRFWF9MT0NLKCZzdHJl
YW0tPm11dGV4KTsNDQoNDQogIGlmIChzdHJlYW0tPnN0YXRlID09IFNUUkVB
TV9TVE9QUEVEKQ0NCiAgICBnb3RvIHVubG9jazsNDQoNDQogIGlmIChzdHJl
YW0tPm1vZGUgPT0gUExBWUJBQ0sgfHwgc3RyZWFtLT5tb2RlID09IERVUExF
WCkgew0NCg0NCiAgICBpbnQgYnVmZmVyX3NpemUgPSBzdHJlYW0tPmJ1ZmZl
clNpemUgKiBzdHJlYW0tPm5CdWZmZXJzOw0NCiAgICBpbnQgcmVzdWx0ID0g
YWxEaXNjYXJkRnJhbWVzKHN0cmVhbS0+aGFuZGxlWzBdLCBidWZmZXJfc2l6
ZSk7DQ0KICAgIGlmIChyZXN1bHQgPT0gLTEpIHsNDQogICAgICBzcHJpbnRm
KG1lc3NhZ2UsICJSdEF1ZGlvOiBBTCBlcnJvciBhYm9ydGluZyBzdHJlYW0g
ZGV2aWNlICglcyk6ICVzLiIsDQ0KICAgICAgICAgICAgICBkZXZpY2VzW3N0
cmVhbS0+ZGV2aWNlWzBdXS5uYW1lLCBhbEdldEVycm9yU3RyaW5nKG9zZXJy
b3IoKSkpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7
DQ0KICAgIH0NDQogIH0NDQoNDQogIC8vIFRoZXJlIGlzIG5vIGNsZWFyIGFj
dGlvbiB0byB0YWtlIG9uIHRoZSBpbnB1dCBzdHJlYW0sIHNpbmNlIHRoZQ0N
CiAgLy8gcG9ydCB3aWxsIGNvbnRpbnVlIHRvIHJ1biBpbiBhbnkgZXZlbnQu
DQ0KICBzdHJlYW0tPnN0YXRlID0gU1RSRUFNX1NUT1BQRUQ7DQ0KDQ0KIHVu
bG9jazoNDQogIE1VVEVYX1VOTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KfQ0N
Cg0NCmludCBSdEF1ZGlvIDo6IHN0cmVhbVdpbGxCbG9jayhpbnQgc3RyZWFt
SWQpDQ0Kew0NCiAgUlRBVURJT19TVFJFQU0gKnN0cmVhbSA9IChSVEFVRElP
X1NUUkVBTSAqKSB2ZXJpZnlTdHJlYW0oc3RyZWFtSWQpOw0NCg0NCiAgTVVU
RVhfTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KDQ0KICBpbnQgZnJhbWVzID0g
MDsNDQogIGlmIChzdHJlYW0tPnN0YXRlID09IFNUUkVBTV9TVE9QUEVEKQ0N
CiAgICBnb3RvIHVubG9jazsNDQoNDQogIGludCBlcnIgPSAwOw0NCiAgaWYg
KHN0cmVhbS0+bW9kZSA9PSBQTEFZQkFDSyB8fCBzdHJlYW0tPm1vZGUgPT0g
RFVQTEVYKSB7DQ0KICAgIGVyciA9IGFsR2V0RmlsbGFibGUoc3RyZWFtLT5o
YW5kbGVbMF0pOw0NCiAgICBpZiAoZXJyIDwgMCkgew0NCiAgICAgIHNwcmlu
dGYobWVzc2FnZSwgIlJ0QXVkaW86IEFMIGVycm9yIGdldHRpbmcgYXZhaWxh
YmxlIGZyYW1lcyBmb3Igc3RyZWFtICglcyk6ICVzLiIsDQ0KICAgICAgICAg
ICAgICBkZXZpY2VzW3N0cmVhbS0+ZGV2aWNlWzBdXS5uYW1lLCBhbEdldEVy
cm9yU3RyaW5nKG9zZXJyb3IoKSkpOw0NCiAgICAgIGVycm9yKFJ0RXJyb3I6
OkRSSVZFUl9FUlJPUik7DQ0KICAgIH0NDQogIH0NDQoNDQogIGZyYW1lcyA9
IGVycjsNDQoNDQogIGlmIChzdHJlYW0tPm1vZGUgPT0gUkVDT1JEIHx8IHN0
cmVhbS0+bW9kZSA9PSBEVVBMRVgpIHsNDQogICAgZXJyID0gYWxHZXRGaWxs
ZWQoc3RyZWFtLT5oYW5kbGVbMV0pOw0NCiAgICBpZiAoZXJyIDwgMCkgew0N
CiAgICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IEFMIGVycm9yIGdl
dHRpbmcgYXZhaWxhYmxlIGZyYW1lcyBmb3Igc3RyZWFtICglcyk6ICVzLiIs
DQ0KICAgICAgICAgICAgICBkZXZpY2VzW3N0cmVhbS0+ZGV2aWNlWzFdXS5u
YW1lLCBhbEdldEVycm9yU3RyaW5nKG9zZXJyb3IoKSkpOw0NCiAgICAgIGVy
cm9yKFJ0RXJyb3I6OkRSSVZFUl9FUlJPUik7DQ0KICAgIH0NDQogICAgaWYg
KGZyYW1lcyA+IGVycikgZnJhbWVzID0gZXJyOw0NCiAgfQ0NCg0NCiAgZnJh
bWVzID0gc3RyZWFtLT5idWZmZXJTaXplIC0gZnJhbWVzOw0NCiAgaWYgKGZy
YW1lcyA8IDApIGZyYW1lcyA9IDA7DQ0KDQ0KIHVubG9jazoNDQogIE1VVEVY
X1VOTE9DSygmc3RyZWFtLT5tdXRleCk7DQ0KICByZXR1cm4gZnJhbWVzOw0N
Cn0NDQoNDQp2b2lkIFJ0QXVkaW8gOjogdGlja1N0cmVhbShpbnQgc3RyZWFt
SWQpDQ0Kew0NCiAgUlRBVURJT19TVFJFQU0gKnN0cmVhbSA9IChSVEFVRElP
X1NUUkVBTSAqKSB2ZXJpZnlTdHJlYW0oc3RyZWFtSWQpOw0NCg0NCiAgaW50
IHN0b3BTdHJlYW0gPSAwOw0NCiAgaWYgKHN0cmVhbS0+c3RhdGUgPT0gU1RS
RUFNX1NUT1BQRUQpIHsNDQogICAgaWYgKHN0cmVhbS0+dXNpbmdDYWxsYmFj
aykgdXNsZWVwKDUwMDAwKTsgLy8gc2xlZXAgNTAgbWlsbGlzZWNvbmRzDQ0K
ICAgIHJldHVybjsNDQogIH0NDQogIGVsc2UgaWYgKHN0cmVhbS0+dXNpbmdD
YWxsYmFjaykgew0NCiAgICBzdG9wU3RyZWFtID0gc3RyZWFtLT5jYWxsYmFj
ayhzdHJlYW0tPnVzZXJCdWZmZXIsIHN0cmVhbS0+YnVmZmVyU2l6ZSwgc3Ry
ZWFtLT51c2VyRGF0YSk7ICAgIA0NCiAgfQ0NCg0NCiAgTVVURVhfTE9DSygm
c3RyZWFtLT5tdXRleCk7DQ0KDQ0KICAvLyBUaGUgc3RhdGUgbWlnaHQgY2hh
bmdlIHdoaWxlIHdhaXRpbmcgb24gYSBtdXRleC4NDQogIGlmIChzdHJlYW0t
PnN0YXRlID09IFNUUkVBTV9TVE9QUEVEKQ0NCiAgICBnb3RvIHVubG9jazsN
DQoNDQogIGNoYXIgKmJ1ZmZlcjsNDQogIGludCBjaGFubmVsczsNDQogIFJU
QVVESU9fRk9STUFUIGZvcm1hdDsNDQogIGlmIChzdHJlYW0tPm1vZGUgPT0g
UExBWUJBQ0sgfHwgc3RyZWFtLT5tb2RlID09IERVUExFWCkgew0NCg0NCiAg
ICAvLyBTZXR1cCBwYXJhbWV0ZXJzIGFuZCBkbyBidWZmZXIgY29udmVyc2lv
biBpZiBuZWNlc3NhcnkuDQ0KICAgIGlmIChzdHJlYW0tPmRvQ29udmVydEJ1
ZmZlclswXSkgew0NCiAgICAgIGNvbnZlcnRTdHJlYW1CdWZmZXIoc3RyZWFt
LCBQTEFZQkFDSyk7DQ0KICAgICAgYnVmZmVyID0gc3RyZWFtLT5kZXZpY2VC
dWZmZXI7DQ0KICAgICAgY2hhbm5lbHMgPSBzdHJlYW0tPm5EZXZpY2VDaGFu
bmVsc1swXTsNDQogICAgICBmb3JtYXQgPSBzdHJlYW0tPmRldmljZUZvcm1h
dFswXTsNDQogICAgfQ0NCiAgICBlbHNlIHsNDQogICAgICBidWZmZXIgPSBz
dHJlYW0tPnVzZXJCdWZmZXI7DQ0KICAgICAgY2hhbm5lbHMgPSBzdHJlYW0t
Pm5Vc2VyQ2hhbm5lbHNbMF07DQ0KICAgICAgZm9ybWF0ID0gc3RyZWFtLT51
c2VyRm9ybWF0Ow0NCiAgICB9DQ0KDQ0KICAgIC8vIERvIGJ5dGUgc3dhcHBp
bmcgaWYgbmVjZXNzYXJ5Lg0NCiAgICBpZiAoc3RyZWFtLT5kb0J5dGVTd2Fw
WzBdKQ0NCiAgICAgIGJ5dGVTd2FwQnVmZmVyKGJ1ZmZlciwgc3RyZWFtLT5i
dWZmZXJTaXplICogY2hhbm5lbHMsIGZvcm1hdCk7DQ0KDQ0KICAgIC8vIFdy
aXRlIGludGVybGVhdmVkIHNhbXBsZXMgdG8gZGV2aWNlLg0NCiAgICBhbFdy
aXRlRnJhbWVzKHN0cmVhbS0+aGFuZGxlWzBdLCBidWZmZXIsIHN0cmVhbS0+
YnVmZmVyU2l6ZSk7DQ0KICB9DQ0KDQ0KICBpZiAoc3RyZWFtLT5tb2RlID09
IFJFQ09SRCB8fCBzdHJlYW0tPm1vZGUgPT0gRFVQTEVYKSB7DQ0KDQ0KICAg
IC8vIFNldHVwIHBhcmFtZXRlcnMuDQ0KICAgIGlmIChzdHJlYW0tPmRvQ29u
dmVydEJ1ZmZlclsxXSkgew0NCiAgICAgIGJ1ZmZlciA9IHN0cmVhbS0+ZGV2
aWNlQnVmZmVyOw0NCiAgICAgIGNoYW5uZWxzID0gc3RyZWFtLT5uRGV2aWNl
Q2hhbm5lbHNbMV07DQ0KICAgICAgZm9ybWF0ID0gc3RyZWFtLT5kZXZpY2VG
b3JtYXRbMV07DQ0KICAgIH0NDQogICAgZWxzZSB7DQ0KICAgICAgYnVmZmVy
ID0gc3RyZWFtLT51c2VyQnVmZmVyOw0NCiAgICAgIGNoYW5uZWxzID0gc3Ry
ZWFtLT5uVXNlckNoYW5uZWxzWzFdOw0NCiAgICAgIGZvcm1hdCA9IHN0cmVh
bS0+dXNlckZvcm1hdDsNDQogICAgfQ0NCg0NCiAgICAvLyBSZWFkIGludGVy
bGVhdmVkIHNhbXBsZXMgZnJvbSBkZXZpY2UuDQ0KICAgIGFsUmVhZEZyYW1l
cyhzdHJlYW0tPmhhbmRsZVsxXSwgYnVmZmVyLCBzdHJlYW0tPmJ1ZmZlclNp
emUpOw0NCg0NCiAgICAvLyBEbyBieXRlIHN3YXBwaW5nIGlmIG5lY2Vzc2Fy
eS4NDQogICAgaWYgKHN0cmVhbS0+ZG9CeXRlU3dhcFsxXSkNDQogICAgICBi
eXRlU3dhcEJ1ZmZlcihidWZmZXIsIHN0cmVhbS0+YnVmZmVyU2l6ZSAqIGNo
YW5uZWxzLCBmb3JtYXQpOw0NCg0NCiAgICAvLyBEbyBidWZmZXIgY29udmVy
c2lvbiBpZiBuZWNlc3NhcnkuDQ0KICAgIGlmIChzdHJlYW0tPmRvQ29udmVy
dEJ1ZmZlclsxXSkNDQogICAgICBjb252ZXJ0U3RyZWFtQnVmZmVyKHN0cmVh
bSwgUkVDT1JEKTsNDQogIH0NDQoNDQogdW5sb2NrOg0NCiAgTVVURVhfVU5M
T0NLKCZzdHJlYW0tPm11dGV4KTsNDQoNDQogIGlmIChzdHJlYW0tPnVzaW5n
Q2FsbGJhY2sgJiYgc3RvcFN0cmVhbSkNDQogICAgdGhpcy0+c3RvcFN0cmVh
bShzdHJlYW1JZCk7DQ0KfQ0NCg0NCmV4dGVybiAiQyIgdm9pZCAqY2FsbGJh
Y2tIYW5kbGVyKHZvaWQgKnB0cikNDQp7DQ0KICBSdEF1ZGlvICpvYmplY3Qg
PSB0aHJlYWRfaW5mby5vYmplY3Q7DQ0KICBpbnQgc3RyZWFtID0gdGhyZWFk
X2luZm8uc3RyZWFtSWQ7DQ0KICBib29sICp1c2luZ0NhbGxiYWNrID0gKGJv
b2wgKikgcHRyOw0NCg0NCiAgd2hpbGUgKCAqdXNpbmdDYWxsYmFjayApIHsN
DQogICAgcHRocmVhZF90ZXN0Y2FuY2VsKCk7DQ0KICAgIHRyeSB7DQ0KICAg
ICAgb2JqZWN0LT50aWNrU3RyZWFtKHN0cmVhbSk7DQ0KICAgIH0NDQogICAg
Y2F0Y2ggKFJ0RXJyb3IgJmV4Y2VwdGlvbikgew0NCiAgICAgIGZwcmludGYo
c3RkZXJyLCAiXG5DYWxsYmFjayB0aHJlYWQgZXJyb3IgKCVzKSAuLi4gY2xv
c2luZyB0aHJlYWQuXG5cbiIsDQ0KICAgICAgICAgICAgICBleGNlcHRpb24u
Z2V0TWVzc2FnZSgpKTsNDQogICAgICBicmVhazsNDQogICAgfQ0NCiAgfQ0N
Cg0NCiAgcmV0dXJuIDA7DQ0KfQ0NCg0NCi8vKioqKioqKioqKioqKioqKioq
KiogRW5kIG9mIF9fSVJJWF9BTF9fICoqKioqKioqKioqKioqKioqKioqKi8v
DQ0KDQ0KI2VuZGlmDQ0KDQ0KDQ0KLy8gKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vDQ0KLy8NDQovLyBQ
cml2YXRlIGNvbW1vbiAoT1MtaW5kZXBlbmRlbnQpIFJ0QXVkaW8gbWV0aG9k
cy4NDQovLw0NCi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKiAvLw0NCg0NCi8vIFRoaXMgbWV0aG9kIGNh
biBiZSBtb2RpZmllZCB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiBlcnJv
cg0NCi8vIG1lc3NhZ2UgcmVwb3J0aW5nIGFuZCB0aHJvd2luZy4NDQp2b2lk
IFJ0QXVkaW8gOjogZXJyb3IoUnRFcnJvcjo6VFlQRSB0eXBlKQ0NCnsNDQog
IGlmICh0eXBlID09IFJ0RXJyb3I6OldBUk5JTkcpIHsNDQojaWYgZGVmaW5l
ZChSVEFVRElPX0RFQlVHKQ0NCiAgICBmcHJpbnRmKHN0ZGVyciwgIlxuJXNc
blxuIiwgbWVzc2FnZSk7DQ0KICBlbHNlIGlmICh0eXBlID09IFJ0RXJyb3I6
OkRFQlVHX1dBUk5JTkcpIHsNDQogICAgZnByaW50ZihzdGRlcnIsICJcbiVz
XG5cbiIsIG1lc3NhZ2UpOw0NCiNlbmRpZg0NCiAgfQ0NCiAgZWxzZSB7DQ0K
ICAgIGZwcmludGYoc3RkZXJyLCAiXG4lc1xuXG4iLCBtZXNzYWdlKTsNDQog
ICAgdGhyb3cgUnRFcnJvcihtZXNzYWdlLCB0eXBlKTsNDQogIH0NDQp9DQ0K
DQ0Kdm9pZCAqUnRBdWRpbyA6OiB2ZXJpZnlTdHJlYW0oaW50IHN0cmVhbUlk
KQ0NCnsNDQogIC8vIFZlcmlmeSB0aGUgc3RyZWFtIGtleS4NDQogIGlmICgg
c3RyZWFtcy5maW5kKCBzdHJlYW1JZCApID09IHN0cmVhbXMuZW5kKCkgKSB7
DQ0KICAgIHNwcmludGYobWVzc2FnZSwgIlJ0QXVkaW86IGludmFsaWQgc3Ry
ZWFtIGlkZW50aWZpZXIhIik7DQ0KICAgIGVycm9yKFJ0RXJyb3I6OklOVkFM
SURfU1RSRUFNKTsNDQogIH0NDQoNDQogIHJldHVybiBzdHJlYW1zW3N0cmVh
bUlkXTsNDQp9DQ0KDQ0Kdm9pZCBSdEF1ZGlvIDo6IGNsZWFyRGV2aWNlSW5m
byhSVEFVRElPX0RFVklDRSAqaW5mbykNDQp7DQ0KICAvLyBEb24ndCBjbGVh
ciB0aGUgbmFtZSBvciBERVZJQ0VfSUQgZmllbGRzIGhlcmUgLi4uIHRoZXkg
YXJlDQ0KICAvLyB0eXBpY2FsbHkgc2V0IHByaW9yIHRvIGEgY2FsbCBvZiB0
aGlzIGZ1bmN0aW9uLg0NCiAgaW5mby0+cHJvYmVkID0gZmFsc2U7DQ0KICBp
bmZvLT5tYXhPdXRwdXRDaGFubmVscyA9IDA7DQ0KICBpbmZvLT5tYXhJbnB1
dENoYW5uZWxzID0gMDsNDQogIGluZm8tPm1heER1cGxleENoYW5uZWxzID0g
MDsNDQogIGluZm8tPm1pbk91dHB1dENoYW5uZWxzID0gMDsNDQogIGluZm8t
Pm1pbklucHV0Q2hhbm5lbHMgPSAwOw0NCiAgaW5mby0+bWluRHVwbGV4Q2hh
bm5lbHMgPSAwOw0NCiAgaW5mby0+aGFzRHVwbGV4U3VwcG9ydCA9IGZhbHNl
Ow0NCiAgaW5mby0+blNhbXBsZVJhdGVzID0gMDsNDQogIGZvciAoaW50IGk9
MDsgaTxNQVhfU0FNUExFX1JBVEVTOyBpKyspDQ0KICAgIGluZm8tPnNhbXBs
ZVJhdGVzW2ldID0gMDsNDQogIGluZm8tPm5hdGl2ZUZvcm1hdHMgPSAwOw0N
Cn0NDQoNDQppbnQgUnRBdWRpbyA6OiBmb3JtYXRCeXRlcyhSVEFVRElPX0ZP
Uk1BVCBmb3JtYXQpDQ0Kew0NCiAgaWYgKGZvcm1hdCA9PSBSVEFVRElPX1NJ
TlQxNikNDQogICAgcmV0dXJuIDI7DQ0KICBlbHNlIGlmIChmb3JtYXQgPT0g
UlRBVURJT19TSU5UMjQgfHwgZm9ybWF0ID09IFJUQVVESU9fU0lOVDMyIHx8
DQ0KICAgICAgICAgICBmb3JtYXQgPT0gUlRBVURJT19GTE9BVDMyKQ0NCiAg
ICByZXR1cm4gNDsNDQogIGVsc2UgaWYgKGZvcm1hdCA9PSBSVEFVRElPX0ZM
T0FUNjQpDQ0KICAgIHJldHVybiA4Ow0NCiAgZWxzZSBpZiAoZm9ybWF0ID09
IFJUQVVESU9fU0lOVDgpDQ0KICAgIHJldHVybiAxOw0NCg0NCiAgc3ByaW50
ZihtZXNzYWdlLCJSdEF1ZGlvOiB1bmRlZmluZWQgZm9ybWF0IGluIGZvcm1h
dEJ5dGVzKCkuIik7DQ0KICBlcnJvcihSdEVycm9yOjpXQVJOSU5HKTsNDQoN
DQogIHJldHVybiAwOw0NCn0NDQoNDQp2b2lkIFJ0QXVkaW8gOjogY29udmVy
dFN0cmVhbUJ1ZmZlcihSVEFVRElPX1NUUkVBTSAqc3RyZWFtLCBTVFJFQU1f
TU9ERSBtb2RlKQ0NCnsNDQogIC8vIFRoaXMgbWV0aG9kIGRvZXMgZm9ybWF0
IGNvbnZlcnNpb24sIGlucHV0L291dHB1dCBjaGFubmVsIGNvbXBlbnNhdGlv
biwgYW5kDQ0KICAvLyBkYXRhIGludGVybGVhdmluZy9kZWludGVybGVhdmlu
Zy4gIDI0LWJpdCBpbnRlZ2VycyBhcmUgYXNzdW1lZCB0byBvY2N1cHkNDQog
IC8vIHRoZSB1cHBlciB0aHJlZSBieXRlcyBvZiBhIDMyLWJpdCBpbnRlZ2Vy
Lg0NCg0NCiAgaW50IGosIGNoYW5uZWxzX2luLCBjaGFubmVsc19vdXQsIGNo
YW5uZWxzOw0NCiAgUlRBVURJT19GT1JNQVQgZm9ybWF0X2luLCBmb3JtYXRf
b3V0Ow0NCiAgY2hhciAqaW5wdXQsICpvdXRwdXQ7DQ0KDQ0KICBpZiAobW9k
ZSA9PSBSRUNPUkQpIHsgLy8gY29udmVydCBkZXZpY2UgdG8gdXNlciBidWZm
ZXINDQogICAgaW5wdXQgPSBzdHJlYW0tPmRldmljZUJ1ZmZlcjsNDQogICAg
b3V0cHV0ID0gc3RyZWFtLT51c2VyQnVmZmVyOw0NCiAgICBjaGFubmVsc19p
biA9IHN0cmVhbS0+bkRldmljZUNoYW5uZWxzWzFdOw0NCiAgICBjaGFubmVs
c19vdXQgPSBzdHJlYW0tPm5Vc2VyQ2hhbm5lbHNbMV07DQ0KICAgIGZvcm1h
dF9pbiA9IHN0cmVhbS0+ZGV2aWNlRm9ybWF0WzFdOw0NCiAgICBmb3JtYXRf
b3V0ID0gc3RyZWFtLT51c2VyRm9ybWF0Ow0NCiAgfQ0NCiAgZWxzZSB7IC8v
IGNvbnZlcnQgdXNlciB0byBkZXZpY2UgYnVmZmVyDQ0KICAgIGlucHV0ID0g
c3RyZWFtLT51c2VyQnVmZmVyOw0NCiAgICBvdXRwdXQgPSBzdHJlYW0tPmRl
dmljZUJ1ZmZlcjsNDQogICAgY2hhbm5lbHNfaW4gPSBzdHJlYW0tPm5Vc2Vy
Q2hhbm5lbHNbMF07DQ0KICAgIGNoYW5uZWxzX291dCA9IHN0cmVhbS0+bkRl
dmljZUNoYW5uZWxzWzBdOw0NCiAgICBmb3JtYXRfaW4gPSBzdHJlYW0tPnVz
ZXJGb3JtYXQ7DQ0KICAgIGZvcm1hdF9vdXQgPSBzdHJlYW0tPmRldmljZUZv
cm1hdFswXTsNDQoNDQogICAgLy8gY2xlYXIgb3VyIGRldmljZSBidWZmZXIg
d2hlbiBpbi9vdXQgZHVwbGV4IGRldmljZSBjaGFubmVscyBhcmUgZGlmZmVy
ZW50DQ0KICAgIGlmICggc3RyZWFtLT5tb2RlID09IERVUExFWCAmJg0NCiAg
ICAgICAgIHN0cmVhbS0+bkRldmljZUNoYW5uZWxzWzBdICE9IHN0cmVhbS0+
bkRldmljZUNoYW5uZWxzWzFdICkNDQogICAgICBtZW1zZXQob3V0cHV0LCAw
LCBzdHJlYW0tPmJ1ZmZlclNpemUgKiBjaGFubmVsc19vdXQgKiBmb3JtYXRC
eXRlcyhmb3JtYXRfb3V0KSk7DQ0KICB9DQ0KDQ0KICBjaGFubmVscyA9IChj
aGFubmVsc19pbiA8IGNoYW5uZWxzX291dCkgPyBjaGFubmVsc19pbiA6IGNo
YW5uZWxzX291dDsNDQoNDQogIC8vIFNldCB1cCB0aGUgaW50ZXJsZWF2ZS9k
ZWludGVybGVhdmUgb2Zmc2V0cw0NCiAgc3RkOjp2ZWN0b3I8aW50PiBvZmZz
ZXRfaW4oY2hhbm5lbHMpOw0NCiAgc3RkOjp2ZWN0b3I8aW50PiBvZmZzZXRf
b3V0KGNoYW5uZWxzKTsNDQogIGlmIChtb2RlID09IFJFQ09SRCAmJiBzdHJl
YW0tPmRlSW50ZXJsZWF2ZVsxXSkgew0NCiAgICBmb3IgKGludCBrPTA7IGs8
Y2hhbm5lbHM7IGsrKykgew0NCiAgICAgIG9mZnNldF9pbltrXSA9IGsgKiBz
dHJlYW0tPmJ1ZmZlclNpemU7DQ0KICAgICAgb2Zmc2V0X291dFtrXSA9IGs7
DQ0KICAgIH0NDQogIH0NDQogIGVsc2UgaWYgKG1vZGUgPT0gUExBWUJBQ0sg
JiYgc3RyZWFtLT5kZUludGVybGVhdmVbMF0pIHsNDQogICAgZm9yIChpbnQg
az0wOyBrPGNoYW5uZWxzOyBrKyspIHsNDQogICAgICBvZmZzZXRfaW5ba10g
PSBrOw0NCiAgICAgIG9mZnNldF9vdXRba10gPSBrICogc3RyZWFtLT5idWZm
ZXJTaXplOw0NCiAgICB9DQ0KICB9DQ0KICBlbHNlIHsNDQogICAgZm9yIChp
bnQgaz0wOyBrPGNoYW5uZWxzOyBrKyspIHsNDQogICAgICBvZmZzZXRfaW5b
a10gPSBrOw0NCiAgICAgIG9mZnNldF9vdXRba10gPSBrOw0NCiAgICB9DQ0K
ICB9DQ0KDQ0KICBpZiAoZm9ybWF0X291dCA9PSBSVEFVRElPX0ZMT0FUNjQp
IHsNDQogICAgRkxPQVQ2NCBzY2FsZTsNDQogICAgRkxPQVQ2NCAqb3V0ID0g
KEZMT0FUNjQgKilvdXRwdXQ7DQ0KDQ0KICAgIGlmIChmb3JtYXRfaW4gPT0g
UlRBVURJT19TSU5UOCkgew0NCiAgICAgIHNpZ25lZCBjaGFyICppbiA9IChz
aWduZWQgY2hhciAqKWlucHV0Ow0NCiAgICAgIHNjYWxlID0gMS4wIC8gMTI4
LjA7DQ0KICAgICAgZm9yIChpbnQgaT0wOyBpPHN0cmVhbS0+YnVmZmVyU2l6
ZTsgaSsrKSB7DQ0KICAgICAgICBmb3IgKGo9MDsgajxjaGFubmVsczsgaisr
KSB7DQ0KICAgICAgICAgIG91dFtvZmZzZXRfb3V0W2pdXSA9IChGTE9BVDY0
KSBpbltvZmZzZXRfaW5bal1dOw0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291
dFtqXV0gKj0gc2NhbGU7DQ0KICAgICAgICB9DQ0KICAgICAgICBpbiArPSBj
aGFubmVsc19pbjsNDQogICAgICAgIG91dCArPSBjaGFubmVsc19vdXQ7DQ0K
ICAgICAgfQ0NCiAgICB9DQ0KICAgIGVsc2UgaWYgKGZvcm1hdF9pbiA9PSBS
VEFVRElPX1NJTlQxNikgew0NCiAgICAgIElOVDE2ICppbiA9IChJTlQxNiAq
KWlucHV0Ow0NCiAgICAgIHNjYWxlID0gMS4wIC8gMzI3NjguMDsNDQogICAg
ICBmb3IgKGludCBpPTA7IGk8c3RyZWFtLT5idWZmZXJTaXplOyBpKyspIHsN
DQogICAgICAgIGZvciAoaj0wOyBqPGNoYW5uZWxzOyBqKyspIHsNDQogICAg
ICAgICAgb3V0W29mZnNldF9vdXRbal1dID0gKEZMT0FUNjQpIGluW29mZnNl
dF9pbltqXV07DQ0KICAgICAgICAgIG91dFtvZmZzZXRfb3V0W2pdXSAqPSBz
Y2FsZTsNDQogICAgICAgIH0NDQogICAgICAgIGluICs9IGNoYW5uZWxzX2lu
Ow0NCiAgICAgICAgb3V0ICs9IGNoYW5uZWxzX291dDsNDQogICAgICB9DQ0K
ICAgIH0NDQogICAgZWxzZSBpZiAoZm9ybWF0X2luID09IFJUQVVESU9fU0lO
VDI0KSB7DQ0KICAgICAgSU5UMzIgKmluID0gKElOVDMyICopaW5wdXQ7DQ0K
ICAgICAgc2NhbGUgPSAxLjAgLyAyMTQ3NDgzNjQ4LjA7DQ0KICAgICAgZm9y
IChpbnQgaT0wOyBpPHN0cmVhbS0+YnVmZmVyU2l6ZTsgaSsrKSB7DQ0KICAg
ICAgICBmb3IgKGo9MDsgajxjaGFubmVsczsgaisrKSB7DQ0KICAgICAgICAg
IG91dFtvZmZzZXRfb3V0W2pdXSA9IChGTE9BVDY0KSAoaW5bb2Zmc2V0X2lu
W2pdXSAmIDB4ZmZmZmZmMDApOw0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291
dFtqXV0gKj0gc2NhbGU7DQ0KICAgICAgICB9DQ0KICAgICAgICBpbiArPSBj
aGFubmVsc19pbjsNDQogICAgICAgIG91dCArPSBjaGFubmVsc19vdXQ7DQ0K
ICAgICAgfQ0NCiAgICB9DQ0KICAgIGVsc2UgaWYgKGZvcm1hdF9pbiA9PSBS
VEFVRElPX1NJTlQzMikgew0NCiAgICAgIElOVDMyICppbiA9IChJTlQzMiAq
KWlucHV0Ow0NCiAgICAgIHNjYWxlID0gMS4wIC8gMjE0NzQ4MzY0OC4wOw0N
CiAgICAgIGZvciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7IGkr
Kykgew0NCiAgICAgICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykgew0N
CiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPSAoRkxPQVQ2NCkgaW5b
b2Zmc2V0X2luW2pdXTsNDQogICAgICAgICAgb3V0W29mZnNldF9vdXRbal1d
ICo9IHNjYWxlOw0NCiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hhbm5l
bHNfaW47DQ0KICAgICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAgICAg
IH0NDQogICAgfQ0NCiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0gUlRBVURJ
T19GTE9BVDMyKSB7DQ0KICAgICAgRkxPQVQzMiAqaW4gPSAoRkxPQVQzMiAq
KWlucHV0Ow0NCiAgICAgIGZvciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZl
clNpemU7IGkrKykgew0NCiAgICAgICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7
IGorKykgew0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPSAoRkxP
QVQ2NCkgaW5bb2Zmc2V0X2luW2pdXTsNDQogICAgICAgIH0NDQogICAgICAg
IGluICs9IGNoYW5uZWxzX2luOw0NCiAgICAgICAgb3V0ICs9IGNoYW5uZWxz
X291dDsNDQogICAgICB9DQ0KICAgIH0NDQogICAgZWxzZSBpZiAoZm9ybWF0
X2luID09IFJUQVVESU9fRkxPQVQ2NCkgew0NCiAgICAgIC8vIENoYW5uZWwg
Y29tcGVuc2F0aW9uIGFuZC9vciAoZGUpaW50ZXJsZWF2aW5nIG9ubHkuDQ0K
ICAgICAgRkxPQVQ2NCAqaW4gPSAoRkxPQVQ2NCAqKWlucHV0Ow0NCiAgICAg
IGZvciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7IGkrKykgew0N
CiAgICAgICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykgew0NCiAgICAg
ICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPSBpbltvZmZzZXRfaW5bal1dOw0N
CiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hhbm5lbHNfaW47DQ0KICAg
ICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAgICAgIH0NDQogICAgfQ0N
CiAgfQ0NCiAgZWxzZSBpZiAoZm9ybWF0X291dCA9PSBSVEFVRElPX0ZMT0FU
MzIpIHsNDQogICAgRkxPQVQzMiBzY2FsZTsNDQogICAgRkxPQVQzMiAqb3V0
ID0gKEZMT0FUMzIgKilvdXRwdXQ7DQ0KDQ0KICAgIGlmIChmb3JtYXRfaW4g
PT0gUlRBVURJT19TSU5UOCkgew0NCiAgICAgIHNpZ25lZCBjaGFyICppbiA9
IChzaWduZWQgY2hhciAqKWlucHV0Ow0NCiAgICAgIHNjYWxlID0gMS4wIC8g
MTI4LjA7DQ0KICAgICAgZm9yIChpbnQgaT0wOyBpPHN0cmVhbS0+YnVmZmVy
U2l6ZTsgaSsrKSB7DQ0KICAgICAgICBmb3IgKGo9MDsgajxjaGFubmVsczsg
aisrKSB7DQ0KICAgICAgICAgIG91dFtvZmZzZXRfb3V0W2pdXSA9IChGTE9B
VDMyKSBpbltvZmZzZXRfaW5bal1dOw0NCiAgICAgICAgICBvdXRbb2Zmc2V0
X291dFtqXV0gKj0gc2NhbGU7DQ0KICAgICAgICB9DQ0KICAgICAgICBpbiAr
PSBjaGFubmVsc19pbjsNDQogICAgICAgIG91dCArPSBjaGFubmVsc19vdXQ7
DQ0KICAgICAgfQ0NCiAgICB9DQ0KICAgIGVsc2UgaWYgKGZvcm1hdF9pbiA9
PSBSVEFVRElPX1NJTlQxNikgew0NCiAgICAgIElOVDE2ICppbiA9IChJTlQx
NiAqKWlucHV0Ow0NCiAgICAgIHNjYWxlID0gMS4wIC8gMzI3NjguMDsNDQog
ICAgICBmb3IgKGludCBpPTA7IGk8c3RyZWFtLT5idWZmZXJTaXplOyBpKysp
IHsNDQogICAgICAgIGZvciAoaj0wOyBqPGNoYW5uZWxzOyBqKyspIHsNDQog
ICAgICAgICAgb3V0W29mZnNldF9vdXRbal1dID0gKEZMT0FUMzIpIGluW29m
ZnNldF9pbltqXV07DQ0KICAgICAgICAgIG91dFtvZmZzZXRfb3V0W2pdXSAq
PSBzY2FsZTsNDQogICAgICAgIH0NDQogICAgICAgIGluICs9IGNoYW5uZWxz
X2luOw0NCiAgICAgICAgb3V0ICs9IGNoYW5uZWxzX291dDsNDQogICAgICB9
DQ0KICAgIH0NDQogICAgZWxzZSBpZiAoZm9ybWF0X2luID09IFJUQVVESU9f
U0lOVDI0KSB7DQ0KICAgICAgSU5UMzIgKmluID0gKElOVDMyICopaW5wdXQ7
DQ0KICAgICAgc2NhbGUgPSAxLjAgLyAyMTQ3NDgzNjQ4LjA7DQ0KICAgICAg
Zm9yIChpbnQgaT0wOyBpPHN0cmVhbS0+YnVmZmVyU2l6ZTsgaSsrKSB7DQ0K
ICAgICAgICBmb3IgKGo9MDsgajxjaGFubmVsczsgaisrKSB7DQ0KICAgICAg
ICAgIG91dFtvZmZzZXRfb3V0W2pdXSA9IChGTE9BVDMyKSAoaW5bb2Zmc2V0
X2luW2pdXSAmIDB4ZmZmZmZmMDApOw0NCiAgICAgICAgICBvdXRbb2Zmc2V0
X291dFtqXV0gKj0gc2NhbGU7DQ0KICAgICAgICB9DQ0KICAgICAgICBpbiAr
PSBjaGFubmVsc19pbjsNDQogICAgICAgIG91dCArPSBjaGFubmVsc19vdXQ7
DQ0KICAgICAgfQ0NCiAgICB9DQ0KICAgIGVsc2UgaWYgKGZvcm1hdF9pbiA9
PSBSVEFVRElPX1NJTlQzMikgew0NCiAgICAgIElOVDMyICppbiA9IChJTlQz
MiAqKWlucHV0Ow0NCiAgICAgIHNjYWxlID0gMS4wIC8gMjE0NzQ4MzY0OC4w
Ow0NCiAgICAgIGZvciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7
IGkrKykgew0NCiAgICAgICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykg
ew0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPSAoRkxPQVQzMikg
aW5bb2Zmc2V0X2luW2pdXTsNDQogICAgICAgICAgb3V0W29mZnNldF9vdXRb
al1dICo9IHNjYWxlOw0NCiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hh
bm5lbHNfaW47DQ0KICAgICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAg
ICAgIH0NDQogICAgfQ0NCiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0gUlRB
VURJT19GTE9BVDMyKSB7DQ0KICAgICAgLy8gQ2hhbm5lbCBjb21wZW5zYXRp
b24gYW5kL29yIChkZSlpbnRlcmxlYXZpbmcgb25seS4NDQogICAgICBGTE9B
VDMyICppbiA9IChGTE9BVDMyICopaW5wdXQ7DQ0KICAgICAgZm9yIChpbnQg
aT0wOyBpPHN0cmVhbS0+YnVmZmVyU2l6ZTsgaSsrKSB7DQ0KICAgICAgICBm
b3IgKGo9MDsgajxjaGFubmVsczsgaisrKSB7DQ0KICAgICAgICAgIG91dFtv
ZmZzZXRfb3V0W2pdXSA9IGluW29mZnNldF9pbltqXV07DQ0KICAgICAgICB9
DQ0KICAgICAgICBpbiArPSBjaGFubmVsc19pbjsNDQogICAgICAgIG91dCAr
PSBjaGFubmVsc19vdXQ7DQ0KICAgICAgfQ0NCiAgICB9DQ0KICAgIGVsc2Ug
aWYgKGZvcm1hdF9pbiA9PSBSVEFVRElPX0ZMT0FUNjQpIHsNDQogICAgICBG
TE9BVDY0ICppbiA9IChGTE9BVDY0ICopaW5wdXQ7DQ0KICAgICAgZm9yIChp
bnQgaT0wOyBpPHN0cmVhbS0+YnVmZmVyU2l6ZTsgaSsrKSB7DQ0KICAgICAg
ICBmb3IgKGo9MDsgajxjaGFubmVsczsgaisrKSB7DQ0KICAgICAgICAgIG91
dFtvZmZzZXRfb3V0W2pdXSA9IChGTE9BVDMyKSBpbltvZmZzZXRfaW5bal1d
Ow0NCiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hhbm5lbHNfaW47DQ0K
ICAgICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAgICAgIH0NDQogICAg
fQ0NCiAgfQ0NCiAgZWxzZSBpZiAoZm9ybWF0X291dCA9PSBSVEFVRElPX1NJ
TlQzMikgew0NCiAgICBJTlQzMiAqb3V0ID0gKElOVDMyICopb3V0cHV0Ow0N
CiAgICBpZiAoZm9ybWF0X2luID09IFJUQVVESU9fU0lOVDgpIHsNDQogICAg
ICBzaWduZWQgY2hhciAqaW4gPSAoc2lnbmVkIGNoYXIgKilpbnB1dDsNDQog
ICAgICBmb3IgKGludCBpPTA7IGk8c3RyZWFtLT5idWZmZXJTaXplOyBpKysp
IHsNDQogICAgICAgIGZvciAoaj0wOyBqPGNoYW5uZWxzOyBqKyspIHsNDQog
ICAgICAgICAgb3V0W29mZnNldF9vdXRbal1dID0gKElOVDMyKSBpbltvZmZz
ZXRfaW5bal1dOw0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPDw9
IDI0Ow0NCiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hhbm5lbHNfaW47
DQ0KICAgICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAgICAgIH0NDQog
ICAgfQ0NCiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0gUlRBVURJT19TSU5U
MTYpIHsNDQogICAgICBJTlQxNiAqaW4gPSAoSU5UMTYgKilpbnB1dDsNDQog
ICAgICBmb3IgKGludCBpPTA7IGk8c3RyZWFtLT5idWZmZXJTaXplOyBpKysp
IHsNDQogICAgICAgIGZvciAoaj0wOyBqPGNoYW5uZWxzOyBqKyspIHsNDQog
ICAgICAgICAgb3V0W29mZnNldF9vdXRbal1dID0gKElOVDMyKSBpbltvZmZz
ZXRfaW5bal1dOw0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPDw9
IDE2Ow0NCiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hhbm5lbHNfaW47
DQ0KICAgICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAgICAgIH0NDQog
ICAgfQ0NCiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0gUlRBVURJT19TSU5U
MjQpIHsNDQogICAgICBJTlQzMiAqaW4gPSAoSU5UMzIgKilpbnB1dDsNDQog
ICAgICBmb3IgKGludCBpPTA7IGk8c3RyZWFtLT5idWZmZXJTaXplOyBpKysp
IHsNDQogICAgICAgIGZvciAoaj0wOyBqPGNoYW5uZWxzOyBqKyspIHsNDQog
ICAgICAgICAgb3V0W29mZnNldF9vdXRbal1dID0gKElOVDMyKSBpbltvZmZz
ZXRfaW5bal1dOw0NCiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hhbm5l
bHNfaW47DQ0KICAgICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAgICAg
IH0NDQogICAgfQ0NCiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0gUlRBVURJ
T19TSU5UMzIpIHsNDQogICAgICAvLyBDaGFubmVsIGNvbXBlbnNhdGlvbiBh
bmQvb3IgKGRlKWludGVybGVhdmluZyBvbmx5Lg0NCiAgICAgIElOVDMyICpp
biA9IChJTlQzMiAqKWlucHV0Ow0NCiAgICAgIGZvciAoaW50IGk9MDsgaTxz
dHJlYW0tPmJ1ZmZlclNpemU7IGkrKykgew0NCiAgICAgICAgZm9yIChqPTA7
IGo8Y2hhbm5lbHM7IGorKykgew0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291
dFtqXV0gPSBpbltvZmZzZXRfaW5bal1dOw0NCiAgICAgICAgfQ0NCiAgICAg
ICAgaW4gKz0gY2hhbm5lbHNfaW47DQ0KICAgICAgICBvdXQgKz0gY2hhbm5l
bHNfb3V0Ow0NCiAgICAgIH0NDQogICAgfQ0NCiAgICBlbHNlIGlmIChmb3Jt
YXRfaW4gPT0gUlRBVURJT19GTE9BVDMyKSB7DQ0KICAgICAgRkxPQVQzMiAq
aW4gPSAoRkxPQVQzMiAqKWlucHV0Ow0NCiAgICAgIGZvciAoaW50IGk9MDsg
aTxzdHJlYW0tPmJ1ZmZlclNpemU7IGkrKykgew0NCiAgICAgICAgZm9yIChq
PTA7IGo8Y2hhbm5lbHM7IGorKykgew0NCiAgICAgICAgICBvdXRbb2Zmc2V0
X291dFtqXV0gPSAoSU5UMzIpIChpbltvZmZzZXRfaW5bal1dICogMjE0NzQ4
MzY0Ny4wKTsNDQogICAgICAgIH0NDQogICAgICAgIGluICs9IGNoYW5uZWxz
X2luOw0NCiAgICAgICAgb3V0ICs9IGNoYW5uZWxzX291dDsNDQogICAgICB9
DQ0KICAgIH0NDQogICAgZWxzZSBpZiAoZm9ybWF0X2luID09IFJUQVVESU9f
RkxPQVQ2NCkgew0NCiAgICAgIEZMT0FUNjQgKmluID0gKEZMT0FUNjQgKilp
bnB1dDsNDQogICAgICBmb3IgKGludCBpPTA7IGk8c3RyZWFtLT5idWZmZXJT
aXplOyBpKyspIHsNDQogICAgICAgIGZvciAoaj0wOyBqPGNoYW5uZWxzOyBq
KyspIHsNDQogICAgICAgICAgb3V0W29mZnNldF9vdXRbal1dID0gKElOVDMy
KSAoaW5bb2Zmc2V0X2luW2pdXSAqIDIxNDc0ODM2NDcuMCk7DQ0KICAgICAg
ICB9DQ0KICAgICAgICBpbiArPSBjaGFubmVsc19pbjsNDQogICAgICAgIG91
dCArPSBjaGFubmVsc19vdXQ7DQ0KICAgICAgfQ0NCiAgICB9DQ0KICB9DQ0K
ICBlbHNlIGlmIChmb3JtYXRfb3V0ID09IFJUQVVESU9fU0lOVDI0KSB7DQ0K
ICAgIElOVDMyICpvdXQgPSAoSU5UMzIgKilvdXRwdXQ7DQ0KICAgIGlmIChm
b3JtYXRfaW4gPT0gUlRBVURJT19TSU5UOCkgew0NCiAgICAgIHNpZ25lZCBj
aGFyICppbiA9IChzaWduZWQgY2hhciAqKWlucHV0Ow0NCiAgICAgIGZvciAo
aW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7IGkrKykgew0NCiAgICAg
ICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykgew0NCiAgICAgICAgICBv
dXRbb2Zmc2V0X291dFtqXV0gPSAoSU5UMzIpIGluW29mZnNldF9pbltqXV07
DQ0KICAgICAgICAgIG91dFtvZmZzZXRfb3V0W2pdXSA8PD0gMjQ7DQ0KICAg
ICAgICB9DQ0KICAgICAgICBpbiArPSBjaGFubmVsc19pbjsNDQogICAgICAg
IG91dCArPSBjaGFubmVsc19vdXQ7DQ0KICAgICAgfQ0NCiAgICB9DQ0KICAg
IGVsc2UgaWYgKGZvcm1hdF9pbiA9PSBSVEFVRElPX1NJTlQxNikgew0NCiAg
ICAgIElOVDE2ICppbiA9IChJTlQxNiAqKWlucHV0Ow0NCiAgICAgIGZvciAo
aW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7IGkrKykgew0NCiAgICAg
ICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykgew0NCiAgICAgICAgICBv
dXRbb2Zmc2V0X291dFtqXV0gPSAoSU5UMzIpIGluW29mZnNldF9pbltqXV07
DQ0KICAgICAgICAgIG91dFtvZmZzZXRfb3V0W2pdXSA8PD0gMTY7DQ0KICAg
ICAgICB9DQ0KICAgICAgICBpbiArPSBjaGFubmVsc19pbjsNDQogICAgICAg
IG91dCArPSBjaGFubmVsc19vdXQ7DQ0KICAgICAgfQ0NCiAgICB9DQ0KICAg
IGVsc2UgaWYgKGZvcm1hdF9pbiA9PSBSVEFVRElPX1NJTlQyNCkgew0NCiAg
ICAgIC8vIENoYW5uZWwgY29tcGVuc2F0aW9uIGFuZC9vciAoZGUpaW50ZXJs
ZWF2aW5nIG9ubHkuDQ0KICAgICAgSU5UMzIgKmluID0gKElOVDMyICopaW5w
dXQ7DQ0KICAgICAgZm9yIChpbnQgaT0wOyBpPHN0cmVhbS0+YnVmZmVyU2l6
ZTsgaSsrKSB7DQ0KICAgICAgICBmb3IgKGo9MDsgajxjaGFubmVsczsgaisr
KSB7DQ0KICAgICAgICAgIG91dFtvZmZzZXRfb3V0W2pdXSA9IGluW29mZnNl
dF9pbltqXV07DQ0KICAgICAgICB9DQ0KICAgICAgICBpbiArPSBjaGFubmVs
c19pbjsNDQogICAgICAgIG91dCArPSBjaGFubmVsc19vdXQ7DQ0KICAgICAg
fQ0NCiAgICB9DQ0KICAgIGVsc2UgaWYgKGZvcm1hdF9pbiA9PSBSVEFVRElP
X1NJTlQzMikgew0NCiAgICAgIElOVDMyICppbiA9IChJTlQzMiAqKWlucHV0
Ow0NCiAgICAgIGZvciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7
IGkrKykgew0NCiAgICAgICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykg
ew0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPSAoSU5UMzIpIChp
bltvZmZzZXRfaW5bal1dICYgMHhmZmZmZmYwMCk7DQ0KICAgICAgICB9DQ0K
ICAgICAgICBpbiArPSBjaGFubmVsc19pbjsNDQogICAgICAgIG91dCArPSBj
aGFubmVsc19vdXQ7DQ0KICAgICAgfQ0NCiAgICB9DQ0KICAgIGVsc2UgaWYg
KGZvcm1hdF9pbiA9PSBSVEFVRElPX0ZMT0FUMzIpIHsNDQogICAgICBGTE9B
VDMyICppbiA9IChGTE9BVDMyICopaW5wdXQ7DQ0KICAgICAgZm9yIChpbnQg
aT0wOyBpPHN0cmVhbS0+YnVmZmVyU2l6ZTsgaSsrKSB7DQ0KICAgICAgICBm
b3IgKGo9MDsgajxjaGFubmVsczsgaisrKSB7DQ0KICAgICAgICAgIG91dFtv
ZmZzZXRfb3V0W2pdXSA9IChJTlQzMikgKGluW29mZnNldF9pbltqXV0gKiAy
MTQ3NDgzNjQ3LjApOw0NCiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hh
bm5lbHNfaW47DQ0KICAgICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAg
ICAgIH0NDQogICAgfQ0NCiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0gUlRB
VURJT19GTE9BVDY0KSB7DQ0KICAgICAgRkxPQVQ2NCAqaW4gPSAoRkxPQVQ2
NCAqKWlucHV0Ow0NCiAgICAgIGZvciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1
ZmZlclNpemU7IGkrKykgew0NCiAgICAgICAgZm9yIChqPTA7IGo8Y2hhbm5l
bHM7IGorKykgew0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPSAo
SU5UMzIpIChpbltvZmZzZXRfaW5bal1dICogMjE0NzQ4MzY0Ny4wKTsNDQog
ICAgICAgIH0NDQogICAgICAgIGluICs9IGNoYW5uZWxzX2luOw0NCiAgICAg
ICAgb3V0ICs9IGNoYW5uZWxzX291dDsNDQogICAgICB9DQ0KICAgIH0NDQog
IH0NDQogIGVsc2UgaWYgKGZvcm1hdF9vdXQgPT0gUlRBVURJT19TSU5UMTYp
IHsNDQogICAgSU5UMTYgKm91dCA9IChJTlQxNiAqKW91dHB1dDsNDQogICAg
aWYgKGZvcm1hdF9pbiA9PSBSVEFVRElPX1NJTlQ4KSB7DQ0KICAgICAgc2ln
bmVkIGNoYXIgKmluID0gKHNpZ25lZCBjaGFyICopaW5wdXQ7DQ0KICAgICAg
Zm9yIChpbnQgaT0wOyBpPHN0cmVhbS0+YnVmZmVyU2l6ZTsgaSsrKSB7DQ0K
ICAgICAgICBmb3IgKGo9MDsgajxjaGFubmVsczsgaisrKSB7DQ0KICAgICAg
ICAgIG91dFtvZmZzZXRfb3V0W2pdXSA9IChJTlQxNikgaW5bb2Zmc2V0X2lu
W2pdXTsNDQogICAgICAgICAgb3V0W29mZnNldF9vdXRbal1dIDw8PSA4Ow0N
CiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hhbm5lbHNfaW47DQ0KICAg
ICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAgICAgIH0NDQogICAgfQ0N
CiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0gUlRBVURJT19TSU5UMTYpIHsN
DQogICAgICAvLyBDaGFubmVsIGNvbXBlbnNhdGlvbiBhbmQvb3IgKGRlKWlu
dGVybGVhdmluZyBvbmx5Lg0NCiAgICAgIElOVDE2ICppbiA9IChJTlQxNiAq
KWlucHV0Ow0NCiAgICAgIGZvciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZl
clNpemU7IGkrKykgew0NCiAgICAgICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7
IGorKykgew0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPSBpbltv
ZmZzZXRfaW5bal1dOw0NCiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hh
bm5lbHNfaW47DQ0KICAgICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAg
ICAgIH0NDQogICAgfQ0NCiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0gUlRB
VURJT19TSU5UMjQpIHsNDQogICAgICBJTlQzMiAqaW4gPSAoSU5UMzIgKilp
bnB1dDsNDQogICAgICBmb3IgKGludCBpPTA7IGk8c3RyZWFtLT5idWZmZXJT
aXplOyBpKyspIHsNDQogICAgICAgIGZvciAoaj0wOyBqPGNoYW5uZWxzOyBq
KyspIHsNDQogICAgICAgICAgb3V0W29mZnNldF9vdXRbal1dID0gKElOVDE2
KSAoKGluW29mZnNldF9pbltqXV0gPj4gMTYpICYgMHgwMDAwZmZmZik7DQ0K
ICAgICAgICB9DQ0KICAgICAgICBpbiArPSBjaGFubmVsc19pbjsNDQogICAg
ICAgIG91dCArPSBjaGFubmVsc19vdXQ7DQ0KICAgICAgfQ0NCiAgICB9DQ0K
ICAgIGVsc2UgaWYgKGZvcm1hdF9pbiA9PSBSVEFVRElPX1NJTlQzMikgew0N
CiAgICAgIElOVDMyICppbiA9IChJTlQzMiAqKWlucHV0Ow0NCiAgICAgIGZv
ciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7IGkrKykgew0NCiAg
ICAgICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykgew0NCiAgICAgICAg
ICBvdXRbb2Zmc2V0X291dFtqXV0gPSAoSU5UMTYpICgoaW5bb2Zmc2V0X2lu
W2pdXSA+PiAxNikgJiAweDAwMDBmZmZmKTsNDQogICAgICAgIH0NDQogICAg
ICAgIGluICs9IGNoYW5uZWxzX2luOw0NCiAgICAgICAgb3V0ICs9IGNoYW5u
ZWxzX291dDsNDQogICAgICB9DQ0KICAgIH0NDQogICAgZWxzZSBpZiAoZm9y
bWF0X2luID09IFJUQVVESU9fRkxPQVQzMikgew0NCiAgICAgIEZMT0FUMzIg
KmluID0gKEZMT0FUMzIgKilpbnB1dDsNDQogICAgICBmb3IgKGludCBpPTA7
IGk8c3RyZWFtLT5idWZmZXJTaXplOyBpKyspIHsNDQogICAgICAgIGZvciAo
aj0wOyBqPGNoYW5uZWxzOyBqKyspIHsNDQogICAgICAgICAgb3V0W29mZnNl
dF9vdXRbal1dID0gKElOVDE2KSAoaW5bb2Zmc2V0X2luW2pdXSAqIDMyNzY3
LjApOw0NCiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hhbm5lbHNfaW47
DQ0KICAgICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAgICAgIH0NDQog
ICAgfQ0NCiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0gUlRBVURJT19GTE9B
VDY0KSB7DQ0KICAgICAgRkxPQVQ2NCAqaW4gPSAoRkxPQVQ2NCAqKWlucHV0
Ow0NCiAgICAgIGZvciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7
IGkrKykgew0NCiAgICAgICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykg
ew0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPSAoSU5UMTYpIChp
bltvZmZzZXRfaW5bal1dICogMzI3NjcuMCk7DQ0KICAgICAgICB9DQ0KICAg
ICAgICBpbiArPSBjaGFubmVsc19pbjsNDQogICAgICAgIG91dCArPSBjaGFu
bmVsc19vdXQ7DQ0KICAgICAgfQ0NCiAgICB9DQ0KICB9DQ0KICBlbHNlIGlm
IChmb3JtYXRfb3V0ID09IFJUQVVESU9fU0lOVDgpIHsNDQogICAgc2lnbmVk
IGNoYXIgKm91dCA9IChzaWduZWQgY2hhciAqKW91dHB1dDsNDQogICAgaWYg
KGZvcm1hdF9pbiA9PSBSVEFVRElPX1NJTlQ4KSB7DQ0KICAgICAgLy8gQ2hh
bm5lbCBjb21wZW5zYXRpb24gYW5kL29yIChkZSlpbnRlcmxlYXZpbmcgb25s
eS4NDQogICAgICBzaWduZWQgY2hhciAqaW4gPSAoc2lnbmVkIGNoYXIgKilp
bnB1dDsNDQogICAgICBmb3IgKGludCBpPTA7IGk8c3RyZWFtLT5idWZmZXJT
aXplOyBpKyspIHsNDQogICAgICAgIGZvciAoaj0wOyBqPGNoYW5uZWxzOyBq
KyspIHsNDQogICAgICAgICAgb3V0W29mZnNldF9vdXRbal1dID0gaW5bb2Zm
c2V0X2luW2pdXTsNDQogICAgICAgIH0NDQogICAgICAgIGluICs9IGNoYW5u
ZWxzX2luOw0NCiAgICAgICAgb3V0ICs9IGNoYW5uZWxzX291dDsNDQogICAg
ICB9DQ0KICAgIH0NDQogICAgaWYgKGZvcm1hdF9pbiA9PSBSVEFVRElPX1NJ
TlQxNikgew0NCiAgICAgIElOVDE2ICppbiA9IChJTlQxNiAqKWlucHV0Ow0N
CiAgICAgIGZvciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7IGkr
Kykgew0NCiAgICAgICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykgew0N
CiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPSAoc2lnbmVkIGNoYXIp
ICgoaW5bb2Zmc2V0X2luW2pdXSA+PiA4KSAmIDB4MDBmZik7DQ0KICAgICAg
ICB9DQ0KICAgICAgICBpbiArPSBjaGFubmVsc19pbjsNDQogICAgICAgIG91
dCArPSBjaGFubmVsc19vdXQ7DQ0KICAgICAgfQ0NCiAgICB9DQ0KICAgIGVs
c2UgaWYgKGZvcm1hdF9pbiA9PSBSVEFVRElPX1NJTlQyNCkgew0NCiAgICAg
IElOVDMyICppbiA9IChJTlQzMiAqKWlucHV0Ow0NCiAgICAgIGZvciAoaW50
IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7IGkrKykgew0NCiAgICAgICAg
Zm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykgew0NCiAgICAgICAgICBvdXRb
b2Zmc2V0X291dFtqXV0gPSAoc2lnbmVkIGNoYXIpICgoaW5bb2Zmc2V0X2lu
W2pdXSA+PiAyNCkgJiAweDAwMDAwMGZmKTsNDQogICAgICAgIH0NDQogICAg
ICAgIGluICs9IGNoYW5uZWxzX2luOw0NCiAgICAgICAgb3V0ICs9IGNoYW5u
ZWxzX291dDsNDQogICAgICB9DQ0KICAgIH0NDQogICAgZWxzZSBpZiAoZm9y
bWF0X2luID09IFJUQVVESU9fU0lOVDMyKSB7DQ0KICAgICAgSU5UMzIgKmlu
ID0gKElOVDMyICopaW5wdXQ7DQ0KICAgICAgZm9yIChpbnQgaT0wOyBpPHN0
cmVhbS0+YnVmZmVyU2l6ZTsgaSsrKSB7DQ0KICAgICAgICBmb3IgKGo9MDsg
ajxjaGFubmVsczsgaisrKSB7DQ0KICAgICAgICAgIG91dFtvZmZzZXRfb3V0
W2pdXSA9IChzaWduZWQgY2hhcikgKChpbltvZmZzZXRfaW5bal1dID4+IDI0
KSAmIDB4MDAwMDAwZmYpOw0NCiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0g
Y2hhbm5lbHNfaW47DQ0KICAgICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0N
CiAgICAgIH0NDQogICAgfQ0NCiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0g
UlRBVURJT19GTE9BVDMyKSB7DQ0KICAgICAgRkxPQVQzMiAqaW4gPSAoRkxP
QVQzMiAqKWlucHV0Ow0NCiAgICAgIGZvciAoaW50IGk9MDsgaTxzdHJlYW0t
PmJ1ZmZlclNpemU7IGkrKykgew0NCiAgICAgICAgZm9yIChqPTA7IGo8Y2hh
bm5lbHM7IGorKykgew0NCiAgICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0g
PSAoc2lnbmVkIGNoYXIpIChpbltvZmZzZXRfaW5bal1dICogMTI3LjApOw0N
CiAgICAgICAgfQ0NCiAgICAgICAgaW4gKz0gY2hhbm5lbHNfaW47DQ0KICAg
ICAgICBvdXQgKz0gY2hhbm5lbHNfb3V0Ow0NCiAgICAgIH0NDQogICAgfQ0N
CiAgICBlbHNlIGlmIChmb3JtYXRfaW4gPT0gUlRBVURJT19GTE9BVDY0KSB7
DQ0KICAgICAgRkxPQVQ2NCAqaW4gPSAoRkxPQVQ2NCAqKWlucHV0Ow0NCiAg
ICAgIGZvciAoaW50IGk9MDsgaTxzdHJlYW0tPmJ1ZmZlclNpemU7IGkrKykg
ew0NCiAgICAgICAgZm9yIChqPTA7IGo8Y2hhbm5lbHM7IGorKykgew0NCiAg
ICAgICAgICBvdXRbb2Zmc2V0X291dFtqXV0gPSAoc2lnbmVkIGNoYXIpIChp
bltvZmZzZXRfaW5bal1dICogMTI3LjApOw0NCiAgICAgICAgfQ0NCiAgICAg
ICAgaW4gKz0gY2hhbm5lbHNfaW47DQ0KICAgICAgICBvdXQgKz0gY2hhbm5l
bHNfb3V0Ow0NCiAgICAgIH0NDQogICAgfQ0NCiAgfQ0NCn0NDQoNDQp2b2lk
IFJ0QXVkaW8gOjogYnl0ZVN3YXBCdWZmZXIoY2hhciAqYnVmZmVyLCBpbnQg
c2FtcGxlcywgUlRBVURJT19GT1JNQVQgZm9ybWF0KQ0NCnsNDQogIHJlZ2lz
dGVyIGNoYXIgdmFsOw0NCiAgcmVnaXN0ZXIgY2hhciAqcHRyOw0NCg0NCiAg
cHRyID0gYnVmZmVyOw0NCiAgaWYgKGZvcm1hdCA9PSBSVEFVRElPX1NJTlQx
Nikgew0NCiAgICBmb3IgKGludCBpPTA7IGk8c2FtcGxlczsgaSsrKSB7DQ0K
ICAgICAgLy8gU3dhcCAxc3QgYW5kIDJuZCBieXRlcy4NDQogICAgICB2YWwg
PSAqKHB0cik7DQ0KICAgICAgKihwdHIpID0gKihwdHIrMSk7DQ0KICAgICAg
KihwdHIrMSkgPSB2YWw7DQ0KDQ0KICAgICAgLy8gSW5jcmVtZW50IDIgYnl0
ZXMuDQ0KICAgICAgcHRyICs9IDI7DQ0KICAgIH0NDQogIH0NDQogIGVsc2Ug
aWYgKGZvcm1hdCA9PSBSVEFVRElPX1NJTlQyNCB8fA0NCiAgICAgICAgICAg
Zm9ybWF0ID09IFJUQVVESU9fU0lOVDMyIHx8DQ0KICAgICAgICAgICBmb3Jt
YXQgPT0gUlRBVURJT19GTE9BVDMyKSB7DQ0KICAgIGZvciAoaW50IGk9MDsg
aTxzYW1wbGVzOyBpKyspIHsNDQogICAgICAvLyBTd2FwIDFzdCBhbmQgNHRo
IGJ5dGVzLg0NCiAgICAgIHZhbCA9ICoocHRyKTsNDQogICAgICAqKHB0cikg
PSAqKHB0ciszKTsNDQogICAgICAqKHB0ciszKSA9IHZhbDsNDQoNDQogICAg
ICAvLyBTd2FwIDJuZCBhbmQgM3JkIGJ5dGVzLg0NCiAgICAgIHB0ciArPSAx
Ow0NCiAgICAgIHZhbCA9ICoocHRyKTsNDQogICAgICAqKHB0cikgPSAqKHB0
cisxKTsNDQogICAgICAqKHB0cisxKSA9IHZhbDsNDQoNDQogICAgICAvLyBJ
bmNyZW1lbnQgNCBieXRlcy4NDQogICAgICBwdHIgKz0gNDsNDQogICAgfQ0N
CiAgfQ0NCiAgZWxzZSBpZiAoZm9ybWF0ID09IFJUQVVESU9fRkxPQVQ2NCkg
ew0NCiAgICBmb3IgKGludCBpPTA7IGk8c2FtcGxlczsgaSsrKSB7DQ0KICAg
ICAgLy8gU3dhcCAxc3QgYW5kIDh0aCBieXRlcw0NCiAgICAgIHZhbCA9ICoo
cHRyKTsNDQogICAgICAqKHB0cikgPSAqKHB0cis3KTsNDQogICAgICAqKHB0
cis3KSA9IHZhbDsNDQoNDQogICAgICAvLyBTd2FwIDJuZCBhbmQgN3RoIGJ5
dGVzDQ0KICAgICAgcHRyICs9IDE7DQ0KICAgICAgdmFsID0gKihwdHIpOw0N
CiAgICAgICoocHRyKSA9ICoocHRyKzUpOw0NCiAgICAgICoocHRyKzUpID0g
dmFsOw0NCg0NCiAgICAgIC8vIFN3YXAgM3JkIGFuZCA2dGggYnl0ZXMNDQog
ICAgICBwdHIgKz0gMTsNDQogICAgICB2YWwgPSAqKHB0cik7DQ0KICAgICAg
KihwdHIpID0gKihwdHIrMyk7DQ0KICAgICAgKihwdHIrMykgPSB2YWw7DQ0K
DQ0KICAgICAgLy8gU3dhcCA0dGggYW5kIDV0aCBieXRlcw0NCiAgICAgIHB0
ciArPSAxOw0NCiAgICAgIHZhbCA9ICoocHRyKTsNDQogICAgICAqKHB0cikg
PSAqKHB0cisxKTsNDQogICAgICAqKHB0cisxKSA9IHZhbDsNDQoNDQogICAg
ICAvLyBJbmNyZW1lbnQgOCBieXRlcy4NDQogICAgICBwdHIgKz0gODsNDQog
ICAgfQ0NCiAgfQ0NCn0NDQoNDQoNDQovLyAqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8NDQovLw0NCi8v
IFJ0RXJyb3IgY2xhc3MgZGVmaW5pdGlvbi4NDQovLw0NCi8vICoqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAv
Lw0NCg0NClJ0RXJyb3IgOjogUnRFcnJvcihjb25zdCBjaGFyICpwLCBUWVBF
IHRpcGUpDQ0Kew0NCiAgdHlwZSA9IHRpcGU7DQ0KICBzdHJuY3B5KGVycm9y
X21lc3NhZ2UsIHAsIDI1Nik7DQ0KfQ0NCg0NClJ0RXJyb3IgOjogflJ0RXJy
b3IoKQ0NCnsNDQp9DQ0KDQ0Kdm9pZCBSdEVycm9yIDo6IHByaW50TWVzc2Fn
ZSgpDQ0Kew0NCiAgcHJpbnRmKCJcbiVzXG5cbiIsIGVycm9yX21lc3NhZ2Up
Ow0NCn0NDQo=
--1084992965-1107128285-1021486713=:6894--