[RFC PATCH 2/5] mpt: Add Smsdid and Smmpt supervisor domain core

Rahul Pathak <[email protected]> Wed, 22 Jul 2026 09:04:51 +0530
Newsgroups org.infradead.lists.opensbi
Message-ID <[email protected]>
SW50cm9kdWNlIHRoZSBzdXBlcnZpc29yZCBvbWFpbiBtZW1vcnktcHJvdGVjdGlvbiAoU21tcHQp
IHRhYmxlCm1hbmFnZW1lbnQgY29yZS4gVGhpcyBhZGRzIHRoZSBtb2RlIGFnbm9zdGljIGNvcmUg
bGF5ZXIgYW5kIHRoZQpwZXIgbW9kZSB0YWJsZSB3YWxrZXJzL2J1aWxkZXIuCgpBZGQgZGVmaW5l
cyBmb3IgdGhlIG1tcHQgQ1NSIGVuY29kaW5nLCBNUFRFIGJpdCBsYXlvdXQsIHBlcm1pc3Npb24g
ZmxhZ3MsCnN0cnVjdHVyZXMsIGZlbmNlIGhlbHBlcnMgYW5kIHRoZSBwdWJsaWMgaW50ZXJmYWNl
cy4KCkl0IGltcGxlbWVudHMgdGhlIFJWNjQgc3VwcG9ydGVkIG1vZGVzIChTbW1wdDQzLzUyLzY0
KSBhbmQKdGhlIFJWMzIgbW9kZSAoU21tcHQzNCksIGl0cyBNUFQgdGFibGUgc3VwcG9ydC4KCkFs
c28gaW1wbGVtZW50cyBtcHQgY29yZSB3aGljaCBpbnRlZ3JhdGVzIFNtbXB0IHdpdGggU0JJIGRv
bWFpbnMgYW5kCm90aGVyIGNvcmUgbGF5ZXJzLgoKU2lnbmVkLW9mZi1ieTogUmFodWwgUGF0aGFr
IDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KLS0tCiBpbmNsdWRlL3NiaS9zYmlfbXB0
LmggIHwgMzIxICsrKysrKysrKysrKysrKwogbGliL3NiaS9vYmplY3RzLm1rICAgICB8ICAgMiAr
CiBsaWIvc2JpL3NiaV9tcHQuYyAgICAgIHwgODgyICsrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysKIGxpYi9zYmkvc2JpX21wdF9tb2RlLmMgfCA4OTEgKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMjA5NiBpbnNl
cnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9zYmkvc2JpX21wdC5oCiBjcmVh
dGUgbW9kZSAxMDA2NDQgbGliL3NiaS9zYmlfbXB0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIv
c2JpL3NiaV9tcHRfbW9kZS5jCgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zYmkvc2JpX21wdC5oIGIv
aW5jbHVkZS9zYmkvc2JpX21wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
Li4wZDc2MTg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2JpL3NiaV9tcHQuaApAQCAt
MCwwICsxLDMyMSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0yLUNsYXVzZQor
ICoKKyAqIENvcHlyaWdodCAoYykgMjAyNiBRdWFsY29tbSBJbmMuCisgKgorICogQXV0aG9yczog
UmFodWwgUGF0aGFrIDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KKyAqLworCisjaWZu
ZGVmIF9fU0JJX01QVF9IX18KKyNkZWZpbmUgX19TQklfTVBUX0hfXworCisjaW5jbHVkZSA8c2Jp
L3NiaV90eXBlcy5oPgorI2luY2x1ZGUgPHNiaS9yaXNjdl9sb2Nrcy5oPgorI2luY2x1ZGUgPHNi
aS9zYmlfc2NyYXRjaC5oPgorI2luY2x1ZGUgPHNiaS9zYmlfYml0bWFwLmg+CisjaW5jbHVkZSA8
c2JpL3Jpc2N2X2FzbS5oPgorCitzdHJ1Y3Qgc2JpX2RvbWFpbjsKK3N0cnVjdCBzYmlfbXB0X2Rv
bWFpbjsKK3N0cnVjdCBzYmlfbXB0X2N0cmw7CitzdHJ1Y3Qgc2JpX2RvbWFpbl9tZW1yZWdpb247
CisKKy8qIENTUiBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0JJX0NTUl9NTVBUCQkweDM4MgorI2Rl
ZmluZSBTQklfQ1NSX01TRENGRwkJMHg3NEUKKworLyogbW1wdCByZWdpc3RlciBmaWVsZCBkZWZp
bml0aW9ucyAqLworI2lmIF9fcmlzY3ZfeGxlbiA9PSA2NAorIyBkZWZpbmUgU0JJX01NUFRfTU9E
RV9TSElGVAk2MFVMCisjIGRlZmluZSBTQklfTU1QVF9NT0RFX01BU0sJKFVMKDB4RikgPDwgU0JJ
X01NUFRfTU9ERV9TSElGVCkKKyMgZGVmaW5lIFNCSV9NTVBUX1NESURfU0hJRlQJNTJVTAorIyBk
ZWZpbmUgU0JJX01NUFRfU0RJRF9NQVNLCShVTCgweDNGKSA8PCBTQklfTU1QVF9TRElEX1NISUZU
KQorIyBkZWZpbmUgU0JJX01NUFRfUFBOX01BU0sJVUwoMHgwMDAwMEZGRkZGRkZGRkZGKQorI2Vs
c2UKKyMgZGVmaW5lIFNCSV9NTVBUX01PREVfU0hJRlQJVUwoMzApCisjIGRlZmluZSBTQklfTU1Q
VF9NT0RFX01BU0sJKFVMKDB4MykgPDwgU0JJX01NUFRfTU9ERV9TSElGVCkKKyMgZGVmaW5lIFNC
SV9NTVBUX1NESURfU0hJRlQJVUwoMjIpCisjIGRlZmluZSBTQklfTU1QVF9TRElEX01BU0sJKFVM
KDB4M0YpIDw8IFNCSV9NTVBUX1NESURfU0hJRlQpCisjIGRlZmluZSBTQklfTU1QVF9QUE5fTUFT
SwlVTCgweDNGRkZGRikKKyNlbmRpZgorCisjZGVmaW5lIFNCSV9NTVBUX01PREVfQkFSRQkwVUwK
KyNpZiBfX3Jpc2N2X3hsZW4gPT0gNjQKKyMgZGVmaW5lIFNCSV9NTVBUX01PREVfU01NUFQ0Mwkx
VUwKKyMgZGVmaW5lIFNCSV9NTVBUX01PREVfU01NUFQ1MgkyVUwKKyMgZGVmaW5lIFNCSV9NTVBU
X01PREVfU01NUFQ2NAkzVUwKKyNlbHNlCisjIGRlZmluZSBTQklfTU1QVF9NT0RFX1NNTVBUMzQJ
MVVMCisjZW5kaWYKKworLyoKKyAqIHNiaV9tbXB0X2VuY29kZSgpIOKAlCBhc3NlbWJsZSB0aGUg
ZnVsbCBtbXB0IENTUiB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNi
aV9tbXB0X2VuY29kZSh1MzIgbW9kZSwgdTMyIHNkaWQsCisJCQkJCSAgICB1bnNpZ25lZCBsb25n
IHBwbikKK3sKKwlyZXR1cm4gKCgodW5zaWduZWQgbG9uZyltb2RlIDw8IFNCSV9NTVBUX01PREVf
U0hJRlQpICYgU0JJX01NUFRfTU9ERV9NQVNLKSB8CisJICAgICAgICgoKHVuc2lnbmVkIGxvbmcp
c2RpZCA8PCBTQklfTU1QVF9TRElEX1NISUZUKSAmIFNCSV9NTVBUX1NESURfTUFTSykgfAorCSAg
ICAgICAocHBuICYgU0JJX01NUFRfUFBOX01BU0spOworfQorCisvKgorICogTVBURSBiaXQgZGVm
aW5pdGlvbnMKKyAqLworI2RlZmluZSBTQklfTVBURV9WCQkoMVVMIDw8IDApCisjZGVmaW5lIFNC
SV9NUFRFX0wJCSgxVUwgPDwgMSkKKyNkZWZpbmUgU0JJX01QVEVfTgkJKDFVTCA8PCAyKQorI2Rl
ZmluZSBTQklfTVBURV9QUE5fU0hJRlQJMTBVCisjZGVmaW5lIFNCSV9NUFRfUEFHRV9TSElGVAkx
MlUKKyNkZWZpbmUgU0JJX01QVF9QQUdFX1NJWkUJNDA5NlVMCisjZGVmaW5lIFNCSV9NUFRfUEFH
RV9NQVNLCShTQklfTVBUX1BBR0VfU0laRSAtIDFVTCkKKyNkZWZpbmUgU0JJX01QVEVfWFdSX0JB
U0UJOFUKKyNkZWZpbmUgU0JJX01QVEVfWFdSX1dJRFRICTNVCisjZGVmaW5lIFNCSV9NUFRFX1hX
Ul9NQVNLCTdVTAorCitzdGF0aWMgaW5saW5lIHUzMiBzYmlfbXB0ZV94d3Jfc2hpZnQodTMyIG4p
Cit7CisJcmV0dXJuIChTQklfTVBURV9YV1JfQkFTRSArIG4gKiBTQklfTVBURV9YV1JfV0lEVEgp
OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2JpX21wdGVfbGVhZl9zZXRfeHdy
KHVuc2lnbmVkIGxvbmcgbXB0ZSwKKwkJCQkJCSAgICB1MzIgbiwgdTggeHdyKQoreworCXUzMiBz
aCA9IHNiaV9tcHRlX3h3cl9zaGlmdChuKTsKKworCW1wdGUgJj0gfihTQklfTVBURV9YV1JfTUFT
SyA8PCBzaCk7CisJbXB0ZSB8PSAoeHdyICYgU0JJX01QVEVfWFdSX01BU0spIDw8IHNoOworCXJl
dHVybiBtcHRlOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2JpX21wdGVfbm9u
bGVhZih1bnNpZ25lZCBsb25nIHRhYmxlX3BhKQoreworCXJldHVybiAoKCh0YWJsZV9wYSA+PiBT
QklfTVBUX1BBR0VfU0hJRlQpIDw8IFNCSV9NUFRFX1BQTl9TSElGVCkKKwkgICAgICAgfCBTQklf
TVBURV9WKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNiaV9tcHRlX25vbmxl
YWZfdGFibGVfcGEodW5zaWduZWQgbG9uZyBtcHRlKQoreworCXJldHVybiAoKG1wdGUgPj4gU0JJ
X01QVEVfUFBOX1NISUZUKSA8PCBTQklfTVBUX1BBR0VfU0hJRlQpOworfQorCisvKgorICogWFdS
IHBlcm1pc3Npb24gY29uc3RhbnRzIChYV1I9MDAwIG1lYW5zIG5vIGFjY2VzcykKKyAqLworI2Rl
ZmluZSBTQklfTVBUX1BFUk1fTk9ORQkwVQorI2RlZmluZSBTQklfTVBUX1BFUk1fUgkJMVUKKyNk
ZWZpbmUgU0JJX01QVF9QRVJNX1cJCTJVCisjZGVmaW5lIFNCSV9NUFRfUEVSTV9YCQk0VQorI2Rl
ZmluZSBTQklfTVBUX1BFUk1fUlcJCShTQklfTVBUX1BFUk1fUiB8IFNCSV9NUFRfUEVSTV9XKQor
I2RlZmluZSBTQklfTVBUX1BFUk1fUlgJCShTQklfTVBUX1BFUk1fUiB8IFNCSV9NUFRfUEVSTV9Y
KQorI2RlZmluZSBTQklfTVBUX1BFUk1fUldYCShTQklfTVBUX1BFUk1fUiB8IFNCSV9NUFRfUEVS
TV9XIHwgU0JJX01QVF9QRVJNX1gpCisKKy8qCisgKiBTRElEIGNvbnN0YW50cworICovCisjZGVm
aW5lIFNCSV9NUFRfU0RJRE1BWAkJNlUKKyNkZWZpbmUgU0JJX01QVF9NQVhfRE9NQUlOUwkoMVVM
IDw8IFNCSV9NUFRfU0RJRE1BWCkKKyNkZWZpbmUgU0JJX01QVF9TRElEX0lOVkFMSUQJU0JJX01Q
VF9NQVhfRE9NQUlOUworCisvKgorICogU0JJX01QVF9NQVhfUkVHSU9OU19ET01BSU46IE51bWJl
ciBvZiByZWdpb25zIGEgZG9tYWluIG1heSBoYXZlCisgKiBVc2VkIGZvciB0cmFja2luZyBvZiBy
ZWdpb25zCisgKi8KKyNkZWZpbmUgU0JJX01QVF9NQVhfUkVHSU9OU19ET01BSU4gIDMyVQorCisv
KgorICogU01TRElEIG1mZW5jZSBhbmQgbWludmFsIHJhdyBlbmNvZGluZ3MKKyAqCisgKiBSLXR5
cGUsIG9wY29kZT1TWVNURU0oMHg3MyksIGZ1bmN0Mz0wLCByZD14MCwgcnMxPVBBRERSLCByczI9
U0RJRAorICogbWZlbmNlLnBhIGZ1bmN0Nz0weDE5IC0+IDB4MzIwMDAwNzMgd2hlcmUgcnMxPXJz
Mj14MAorICogbWludmFsLnBhIGZ1bmN0Nz0weDFiIC0+IDB4MzYwMDAwNzMgd2hlcmUgcnMxPXJz
Mj14MAorICoKKyAqIC5pbnNuIHIgb3Bjb2RlLCBmdW5jMywgZnVuYzcsIHJkLCByczEsIHJzMgor
ICovCisjZGVmaW5lIFNCSV9NUFRfTUZFTkNFX1BBKHJzMSwgcnMyKQkiLmluc24gciAweDczLCAw
LCAweDE5LCB4MCwgIiByczEgIiwgIiByczIKKworI2RlZmluZSBTQklfTVBUX01JTlZBTF9QQShy
czEsIHJzMikJIi5pbnNuIHIgMHg3MywgMCwgMHgxYiwgeDAsICIgcnMxICIsICIgcnMyCisKKy8q
CisgKiBGZW5jZSBhbmQgaW52YWxpZGF0aW9uIGhlbHBlcnMKKyAqLworc3RhdGljIGlubGluZSB2
b2lkIHNiaV9tcHRfZmVuY2VfYWxsKHZvaWQpCit7CisJX19hc21fXyB2b2xhdGlsZShTQklfTVBU
X01GRU5DRV9QQSgieDAiLCAieDAiKSA6OjogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5l
IHZvaWQgc2JpX21wdF9mZW5jZV9zZGlkKHUzMiBzZGlkKQoreworCXVuc2lnbmVkIGxvbmcgcyA9
ICh1bnNpZ25lZCBsb25nKXNkaWQgJiAoU0JJX01QVF9NQVhfRE9NQUlOUyAtIFVMKDEpKTsKKwor
CV9fYXNtX18gdm9sYXRpbGUoU0JJX01QVF9NRkVOQ0VfUEEoIngwIiwgIiUwIikgOjogInIiKHMp
IDogIm1lbW9yeSIpOworfQorCisvKgorICogcnMxPXBhZGRyIGFuZCByczI9eDAKKyAqLworc3Rh
dGljIGlubGluZSB2b2lkIHNiaV9tcHRfbWZlbmNlX2FkZHIodW5zaWduZWQgbG9uZyBwYWRkcikK
K3sKKwlfX2FzbV9fIHZvbGF0aWxlKFNCSV9NUFRfTUZFTkNFX1BBKCIlMCIsICJ4MCIpIDo6ICJy
IihwYWRkcikgOiAibWVtb3J5Iik7Cit9CisKKy8qCisgKiByczE9cGFkZHIgYW5kIHJzMj1zZGlk
CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzYmlfbXB0X21mZW5jZV9wYSh1bnNpZ25lZCBsb25n
IHBhZGRyLCB1MzIgc2RpZCkKK3sKKwl1bnNpZ25lZCBsb25nIHMgPSAodW5zaWduZWQgbG9uZylz
ZGlkICYgKFNCSV9NUFRfTUFYX0RPTUFJTlMgLSBVTCgxKSk7CisKKwlfX2FzbV9fIHZvbGF0aWxl
KFNCSV9NUFRfTUZFTkNFX1BBKCIlMCIsICIlMSIpCisJCQkgOjogInIiKHBhZGRyKSwgInIiKHMp
IDogIm1lbW9yeSIpOworfQorCisvKgorICogcnMxPTAgYW5kIHJzMj0wCisgKi8KK3N0YXRpYyBp
bmxpbmUgdm9pZCBzYmlfbXB0X21pbnZhbF9hbGwodm9pZCkKK3sKKwkvKiBQcmlvciBzdG9yZXMg
Z2xvYmFsbHkgdmlzaWJsZSBiZWZvcmUgaW52YWxpZGF0aW9uICovCisJX19hc21fXyB2b2xhdGls
ZSgic2ZlbmNlLncuaW52YWwiIDo6OiAibWVtb3J5Iik7CisJX19hc21fXyB2b2xhdGlsZShTQklf
TVBUX01JTlZBTF9QQSgieDAiLCAieDAiKSA6OjogIm1lbW9yeSIpOworCS8qIEludmFsaWRhdGlv
biBjb21wbGV0ZXMgYmVmb3JlIHN1YnNlcXVlbnQgaW1wbGljaXQgYWNjZXNzZXMgKi8KKwlfX2Fz
bV9fIHZvbGF0aWxlKCJzZmVuY2UuaW52YWwuaXIiIDo6OiAibWVtb3J5Iik7Cit9CisKKy8qCisg
KiByczE9cGFkZHIgYW5kIHJzMj1zZGlkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzYmlfbXB0
X21pbnZhbF9zZGlkKHVuc2lnbmVkIGxvbmcgcGEsIHUzMiBzZGlkKQoreworCXVuc2lnbmVkIGxv
bmcgcyA9ICh1bnNpZ25lZCBsb25nKXNkaWQgJiAoU0JJX01QVF9NQVhfRE9NQUlOUyAtIFVMKDEp
KTsKKworCV9fYXNtX18gdm9sYXRpbGUoInNmZW5jZS53LmludmFsIiA6OjogIm1lbW9yeSIpOwor
CV9fYXNtX18gdm9sYXRpbGUoU0JJX01QVF9NSU5WQUxfUEEoIiUwIiwgIiUxIikKKwkJCSA6OiAi
ciIocGEpLCAiciIocykgOiAibWVtb3J5Iik7CisJX19hc21fXyB2b2xhdGlsZSgic2ZlbmNlLmlu
dmFsLmlyIiA6OjogIm1lbW9yeSIpOworfQorCisvKgorICogQ29yZSBkYXRhIHN0cnVjdHVyZXMK
KyAqLworc3RydWN0IHNiaV9tcHRfcmVnaW9uIHsKKwl1bnNpZ25lZCBsb25nCXBhOworCXVuc2ln
bmVkIGxvbmcJc2l6ZTsKKwl1OAkJeHdyOworCS8qIHJlZ2lvbiBpcyBsb2NrZWQgYW5kIGRlbnkg
bW9kaWZpY2F0aW9uIHZpYSBhZGQvcmVtb3ZlX3JlZ2lvbiAqLworCWJvb2wJCWxvY2tlZDsKKwkv
KiBtYXBwZWQgaW50byBtb3JlIHRoYW4gb25lIGRvbWFpbiAqLworCWJvb2wJCXNoYXJlZDsKK307
CisKKy8qCisgKiBzdHJ1Y3Qgc2JpX21wdF9tb2RlIOKAlCBTTU1QVCBtb2RlIGRlc2NyaXB0aW9u
LgorICovCitzdHJ1Y3Qgc2JpX21wdF9tb2RlIHsKKwljb25zdCBjaGFyCSpuYW1lOworCXUzMgkJ
bW9kZV92YWw7CisJdW5zaWduZWQgbG9uZwkoKmVuY29kZV9tbXB0KSh1bnNpZ25lZCBsb25nIHBw
biwgdTMyIHNkaWQpOworCS8qIG1hcCBhIHJhbmdlIGluIE1QVCB0YWJsZSAqLworCWludAkJKCpt
YXBfcmFuZ2UpKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJdW5zaWduZWQgbG9uZyBw
YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4d3IpOworCS8qIG51bWJlciBieXRlcyBmb3Igcm9v
dCB0YWJsZSBhbGxvY2F0aW9uICovCisJdW5zaWduZWQgbG9uZwkoKnJvb3RfdGFibGVfc2l6ZSko
dm9pZCk7CisJLyogcmVxdWlyZWQgcm9vdCB0YWJsZSBwaHlzaWNhbCBhZGRyZXNzIGFsaWdubWVu
dCAqLworCXVuc2lnbmVkIGxvbmcJKCpyb290X3RhYmxlX2FsaWduKSh2b2lkKTsKKwkvKiBjaGVj
ayBpZiBbcGEscGErc2l6ZV0gZml0cyBpbiBzbW1wdCBtb2RlIHN1cHBvcnRlZCBhZGRyZXNzIHNw
YWNlICovCisJYm9vbAkJKCpwYV9pbl9yYW5nZSkodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQg
bG9uZyBzaXplKTsKKwlpbnQJCSgqbWFwX2Z1bGxfcmFuZ2UpKHN0cnVjdCBzYmlfbXB0X2RvbWFp
biAqZG9tLCB1OCB4d3IpOworfTsKKworc3RydWN0IHNiaV9tcHRfZG9tYWluIHsKKwl1MzIJCQlz
ZGlkOworCWJvb2wJCQl2YWxpZDsKKwl1bnNpZ25lZCBsb25nCQlyb290X3BhOworCXN0cnVjdCBz
YmlfbXB0X21vZGUJKm1vZGU7CisJc3RydWN0IHNiaV9kb21haW4JKnNiaV9kb207CisJdW5zaWdu
ZWQgaW50CQlucmVnaW9uczsKKwlzdHJ1Y3Qgc2JpX21wdF9yZWdpb24JcmVnaW9uc1tTQklfTVBU
X01BWF9SRUdJT05TX0RPTUFJTl07CisJc3BpbmxvY2tfdAkJbG9jazsKK307CisKKy8qCisgKiBz
dHJ1Y3Qgc2JpX21wdF9jdHJsIOKAlCBSRFNNIE1QVCBzdGF0ZQorICovCitzdHJ1Y3Qgc2JpX21w
dF9jdHJsIHsKKwlib29sCQkJcmVhZHk7CisJc3RydWN0IHNiaV9tcHRfbW9kZQkqbW9kZTsKKwkv
KiBkZXRlY3RlZCBzZGlkbGVuIGZyb20gbW1wdCBwcm9iZSAqLworCXUzMgkJCXNkaWRfbGVuOwor
CS8qIDJec2RpZF9sZW4g4oCUIHJ1bnRpbWUgbGltaXQgZm9yIGFsbCBkb21haW4gb3BlcmF0aW9u
cyAqLworCXUzMgkJCW1heF9kb21haW5zOworCXVuc2lnbmVkIGxvbmcJCWZ3X3BhOworCXVuc2ln
bmVkIGxvbmcJCWZ3X3NpemU7CisJc3RydWN0IHNiaV9tcHRfZG9tYWluCWRvbWFpbnNbU0JJX01Q
VF9NQVhfRE9NQUlOU107CisJdTMyCQkJbmRvbWFpbjsKKwkvKiBzZGlkIG9mZnNldCBpbiBzY3Jh
dGNoICovCisJdW5zaWduZWQgbG9uZwkJc2RpZF9vZmZzZXQ7CisJLyogYml0bWFwIHRvIHRyYWNr
IGFzc2lnbmVkL2ZyZWUgU0RJRCAoYml0IE4gc2V0ID0gU0RJRCBOIGZyZWUpICovCisJREVDTEFS
RV9CSVRNQVAoc2RpZF9iaXRtYXAsIFNCSV9NUFRfTUFYX0RPTUFJTlMpOworfTsKKworc3RydWN0
IHNiaV9tcHRfY3RybCAqc2JpX21wdF9jdHJsX2dldCh2b2lkKTsKKworc3RhdGljIGlubGluZSB1
MzIgc2JpX21wdF90aGlzaGFydF9zZGlkKHZvaWQpCit7CisJc3RydWN0IHNiaV9tcHRfY3RybCAq
Y3RybCA9IHNiaV9tcHRfY3RybF9nZXQoKTsKKwl1MzIgKnA7CisKKwlpZiAoIWN0cmwtPnJlYWR5
IHx8ICFjdHJsLT5zZGlkX29mZnNldCkKKwkJcmV0dXJuICh1MzIpU0JJX01QVF9TRElEX0lOVkFM
SUQ7CisJcCA9IHNiaV9zY3JhdGNoX29mZnNldF9wdHIoc2JpX3NjcmF0Y2hfdGhpc2hhcnRfcHRy
KCksCisJCQkJICAgY3RybC0+c2RpZF9vZmZzZXQpOworCXJldHVybiAqcDsKK30KKworLyoKKyAq
IERvbWFpbiBjcmVhdGlvbiBjb25maWcKKyAqCisgKiBzYmlfZG9tIGFuZCByZWdpb25zIGFyZSBt
dXR1YWxseSBleGNsdXNpdmUuCisgKiB3aGVuIGEgc3VwZXJ2aXNvciBkb21haW4gaXMgYmFja2Vk
IGJ5IGEgU0JJIGRvbWFpbgorICogdGhlbiB0aGUgcmVnaW9ucyBsaXN0IGFuZCBhY2Nlc3MgcGVy
bWlzc2lvbnMgYXJlIGRlcml2ZWQKKyAqIGZyb20gdGhlIFNCSSBkb21haW4gc3RydWN0dXJlcy4K
KyAqLworc3RydWN0IHNiaV9tcHRfZG9tYWluX2NvbmZpZyB7CisJLyogU0JJIGRvbWFpbiB3aG9z
ZSBTL1UgbWVtcmVnaW9ucyBhcmUgbWFwcGVkLiAqLworCXN0cnVjdCBzYmlfZG9tYWluCSpzYmlf
ZG9tOworCS8qIHBlcm1pc3Npb24gZm9yIHJlZ2lvbnMgaW5oZXJpdGVkIGZyb20gc2JpX2RvbSAq
LworCXU4CQkJeHdyOworCS8qIHByb3RlY3QgZmlybXdhcmUgcmVnaW9ucyBmb3IgdGhlIGRvbWFp
biAqLworCWJvb2wJCQlmd19wcm90ZWN0OworCS8qCisJICogZXhwbGljaXQgcmVnaW9uIGxpc3Qg
bWFwcGVkIGluIE1QVCB0YWJsZS4KKwkgKiBOVUxMIHdoZW4gc2JpX2RvbSBjb3ZlcnMgZXZlcnl0
aGluZworCSAqLworCXN0cnVjdCBzYmlfbXB0X3JlZ2lvbgkqcmVnaW9uczsKKwl1MzIJCQlucmVn
aW9uczsKK307CisKK2ludCBzYmlfbXB0X2luaXQodm9pZCk7CisKK2ludCBzYmlfbXB0X2RvbWFp
bl9jcmVhdGUoY29uc3Qgc3RydWN0IHNiaV9tcHRfZG9tYWluX2NvbmZpZyAqY2ZnLCB1MzIgKm91
dF9zZGlkKTsKKworaW50IHNiaV9tcHRfZG9tYWluX2FkZF9yZWdpb24odTMyIHNkaWQsIHVuc2ln
bmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTggeHdyKTsKKworaW50IHNiaV9tcHRf
ZG9tYWluX3JlbW92ZV9yZWdpb24odTMyIHNkaWQsIHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVk
IGxvbmcgc2l6ZSk7CisKK2ludCBzYmlfbXB0X3NoYXJlX3JlZ2lvbih1MzIgc3JjX3NkaWQsIHUz
MiBkc3Rfc2RpZCwgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCBkc3Rf
eHdyKTsKKworaW50IHNiaV9tcHRfdW5zaGFyZV9yZWdpb24odTMyIHNkaWQsIHVuc2lnbmVkIGxv
bmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK2ludCBzYmlfbXB0X2hhcnRfYWN0aXZhdGUo
dTMyIHNkaWQpOworCitpbnQgc2JpX21wdF9oYXJ0X2FjdGl2YXRlX2Zvcl9kb21haW4oc3RydWN0
IHNiaV9kb21haW4gKnNiaV9kb20pOworCitzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKnNiaV9tcHRf
ZG9tYWluX2dldCh1MzIgc2RpZCk7CisKK3Vuc2lnbmVkIGxvbmcgc2JpX21wdF9wb29sX2FsbG9j
KHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbik7CisKK3ZvaWQgc2JpX21w
dF9zZGlkX2ZyZWUodTMyIHNkaWQpOworCit2b2lkIHNiaV9tcHRfZHVtcCh2b2lkKTsKKworI2Vu
ZGlmIC8qIF9fU0JJX01QVF9IX18gKi8KZGlmZiAtLWdpdCBhL2xpYi9zYmkvb2JqZWN0cy5tayBi
L2xpYi9zYmkvb2JqZWN0cy5tawppbmRleCBjMjljODg4Zi4uM2IzYzNlYTMgMTAwNjQ0Ci0tLSBh
L2xpYi9zYmkvb2JqZWN0cy5taworKysgYi9saWIvc2JpL29iamVjdHMubWsKQEAgLTEwOCwzICsx
MDgsNSBAQCBsaWJzYmktb2Jqcy15ICs9IHNiaV9leHBlY3RlZF90cmFwLm8KIGxpYnNiaS1vYmpz
LXkgKz0gc2JpX2NwcGMubwogbGlic2JpLW9ianMtJChDQ19TVVBQT1JUX1ZFQ1RPUikgKz0gc2Jp
X3ZlY3Rvci5vCiBsaWJzYmktb2Jqcy15ICs9IHNiaV9mcC5vCitsaWJzYmktb2Jqcy15ICs9IHNi
aV9tcHQubworbGlic2JpLW9ianMteSArPSBzYmlfbXB0X21vZGUubwpkaWZmIC0tZ2l0IGEvbGli
L3NiaS9zYmlfbXB0LmMgYi9saWIvc2JpL3NiaV9tcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMC4uNjAxZmRlYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc2JpL3NiaV9t
cHQuYwpAQCAtMCwwICsxLDg4MiBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0y
LUNsYXVzZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAyNiBRdWFsY29tbSBJbmMuCisgKgorICog
QXV0aG9yczogUmFodWwgUGF0aGFrIDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KKyAq
LworCisjaW5jbHVkZSA8c2JpL3NiaV9tcHQuaD4KKyNpbmNsdWRlIDxzYmkvc2JpX2RvbWFpbi5o
PgorI2luY2x1ZGUgPHNiaS9zYmlfZXJyb3IuaD4KKyNpbmNsdWRlIDxzYmkvc2JpX2hhcnQuaD4K
KyNpbmNsdWRlIDxzYmkvc2JpX2hlYXAuaD4KKyNpbmNsdWRlIDxzYmkvc2JpX3NjcmF0Y2guaD4K
KyNpbmNsdWRlIDxzYmkvc2JpX3N0cmluZy5oPgorI2luY2x1ZGUgPHNiaS9zYmlfY29uc29sZS5o
PgorI2luY2x1ZGUgPHNiaS9yaXNjdl9sb2Nrcy5oPgorI2luY2x1ZGUgPHNiaS9yaXNjdl9hc20u
aD4KKworc3RhdGljIHN0cnVjdCBzYmlfbXB0X2N0cmwgbXB0X2N0cmw7CisKK3N0cnVjdCBzYmlf
bXB0X2N0cmwgKnNiaV9tcHRfY3RybF9nZXQodm9pZCkKK3sKKwlyZXR1cm4gJm1wdF9jdHJsOwor
fQorCitzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKnNiaV9tcHRfZG9tYWluX2dldCh1MzIgc2RpZCkK
K3sKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKnNkOworCisJaWYgKHNkaWQgPj0gbXB0X2N0cmwu
bWF4X2RvbWFpbnMpCisJCXJldHVybiBOVUxMOworCisJc2QgPSBtcHRfY3RybC5kb21haW5zW3Nk
aWRdLnZhbGlkID8gJm1wdF9jdHJsLmRvbWFpbnNbc2RpZF0gOiBOVUxMOworCisJcmV0dXJuIHNk
OworfQorCisvKiBNZW1vcnkgYWxsb2NhdG9yIGZvciBNUFQgdGFibGVzIGZyb20gaGVhcCAqLwor
dW5zaWduZWQgbG9uZyBzYmlfbXB0X3Bvb2xfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCB1bnNp
Z25lZCBsb25nIGFsaWduKQoreworCXVuc2lnbmVkIGxvbmcgcHRyID0gKHVuc2lnbmVkIGxvbmcp
c2JpX2FsaWduZWRfYWxsb2MoYWxpZ24sIHNpemUpOworCisJaWYgKCFwdHIpIHsKKwkJc2JpX3By
aW50Zigic2JpX21wdDogYWxsb2MgZmFpbGVkIChzaXplPTB4JWx4IGFsaWduPTB4JWx4KVxuIiwK
KwkJCSAgIHNpemUsIGFsaWduKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTVBUIHRhYmxlcyBt
dXN0IGJlIHplcm9lZCB0byBtYXJrIHRoZW0gaW52YWxpZCAobXB0ZS5WID0gMCkgKi8KKwlzYmlf
bWVtc2V0KCh2b2lkICopcHRyLCAwLCBzaXplKTsKKworCXJldHVybiBwdHI7Cit9CisKKy8qIENo
ZWNrIGlmIHR3byByZWdpb25zIG92ZXJsYXAgKi8KK3N0YXRpYyBib29sIHJlZ2lvbnNfb3Zlcmxh
cCh1bnNpZ25lZCBsb25nIHBhMSwgdW5zaWduZWQgbG9uZyBzaXplMSwKKwkJCSAgIHVuc2lnbmVk
IGxvbmcgcGEyLCB1bnNpZ25lZCBsb25nIHNpemUyKQoreworCXJldHVybiAocGExIDwgcGEyICsg
c2l6ZTIpICYmIChwYTIgPCBwYTEgKyBzaXplMSk7Cit9CisKKy8qIENoZWNrIGlmIGEgcmVnaW9u
IGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIGluc2lkZSBhbm90aGVyIHJlZ2lvbiAqLworc3RhdGlj
IGJvb2wgcmVnaW9uX2NvbnRhaW5lZCh1bnNpZ25lZCBsb25nIGNoaWxkX3BhLCB1bnNpZ25lZCBs
b25nIGNoaWxkX3NpemUsCisJCQkgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcGEsIHVuc2lnbmVk
IGxvbmcgcGFyZW50X3NpemUpCit7CisJcmV0dXJuIChjaGlsZF9wYSA+PSBwYXJlbnRfcGEpICYm
CisJICAgICAgIChjaGlsZF9wYSArIGNoaWxkX3NpemUgPD0gcGFyZW50X3BhICsgcGFyZW50X3Np
emUpOworfQorCisvKgorICogQ2hlY2sgaWYgYSByZWdpb24gW3BhLCBwYStzaXplXSBvdmVybGFw
cyB3aXRoIGFueSBtYXBwZWQKKyAqIHJlZ2lvbiB3aGljaCBpcyBsb2NrZWQKKyAqLworc3RhdGlj
IGJvb2wgcmVnaW9uX292ZXJsYXBzX2xvY2tlZChjb25zdCBzdHJ1Y3Qgc2JpX21wdF9kb21haW4g
KmRvbSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJ
dW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZG9tLT5ucmVnaW9uczsgaSsrKQor
CQlpZiAoZG9tLT5yZWdpb25zW2ldLmxvY2tlZCAmJgorCQkgICAgcmVnaW9uc19vdmVybGFwKHBh
LCBzaXplLCBkb20tPnJlZ2lvbnNbaV0ucGEsIGRvbS0+cmVnaW9uc1tpXS5zaXplKSkKKwkJCXJl
dHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyogUHJvYmUgU0RJRExFTiBmcm9tIE1N
UFQgQ1NSICovCitzdGF0aWMgdTMyIHByb2JlX3NkaWRsZW4odm9pZCkKK3sKKwl1bnNpZ25lZCBs
b25nIG1tcHRfdmFsLCBzZGlkX3ZhbDsKKwl1MzIgc2RpZGxlbiA9IDA7CisKKwltbXB0X3ZhbCA9
IGNzcl9yZWFkKFNCSV9DU1JfTU1QVCk7CisKKwkvKiBXcml0ZSBhbGwtb25lcyBpbnRvIFNESUQg
ZmllbGQgKi8KKwltbXB0X3ZhbCB8PSBTQklfTU1QVF9TRElEX01BU0s7CisJY3NyX3dyaXRlKFNC
SV9DU1JfTU1QVCwgU0JJX01NUFRfU0RJRF9NQVNLKTsKKworCXNkaWRfdmFsID0gKGNzcl9yZWFk
KFNCSV9DU1JfTU1QVCkgJiBTQklfTU1QVF9TRElEX01BU0spID4+IFNCSV9NTVBUX1NESURfU0hJ
RlQ7CisKKwlpZiAoc2RpZF92YWwpIHsKKwkJc2RpZGxlbiA9IDA7CisJCXdoaWxlIChzZGlkX3Zh
bCkgeworCQkJc2RpZGxlbis9MTsKKwkJCXNkaWRfdmFsID4+PSAxOworCQl9CisKKwkJaWYgKHNk
aWRsZW4gPiBTQklfTVBUX1NESURNQVgpCisJCQlzZGlkbGVuID0gU0JJX01QVF9TRElETUFYOwor
CX0KKworCWNzcl93cml0ZShTQklfQ1NSX01NUFQsIG1tcHRfdmFsKTsKKworCXJldHVybiBzZGlk
bGVuOworfQorCisjaWYgX19yaXNjdl94bGVuID09IDY0CitleHRlcm4gc3RydWN0IHNiaV9tcHRf
bW9kZSBzbW1wdDQzX21vZGU7CitleHRlcm4gc3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDUyX21v
ZGU7CitleHRlcm4gc3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDY0X21vZGU7CisjZWxzZQorZXh0
ZXJuIHN0cnVjdCBzYmlfbXB0X21vZGUgc21tcHQzNF9tb2RlOworI2VuZGlmCisKK3N0YXRpYyBi
b29sIHByb2JlX21vZGUodTMyIG1vZGVfdmFsKQoreworCXUzMiBtOworCWNzcl93cml0ZShTQklf
Q1NSX01NUFQsCisJCSAgKCh1bnNpZ25lZCBsb25nKW1vZGVfdmFsIDw8IFNCSV9NTVBUX01PREVf
U0hJRlQpICYgU0JJX01NUFRfTU9ERV9NQVNLKTsKKworCW0gPSAoY3NyX3JlYWQoU0JJX0NTUl9N
TVBUKSAmIFNCSV9NTVBUX01PREVfTUFTSykgPj4gU0JJX01NUFRfTU9ERV9TSElGVDsKKworCXJl
dHVybiAobSA9PSBtb2RlX3ZhbCk7Cit9CisKKworLyoKKyAqIFByb2JlIFNNTVBUIG1vZGUgYW5k
IGluaXRpYWxpemUgdGhlIHJlbGF0ZWQgbW9kZSBvcHMKKyAqCisgKiBEZWxpYmVyYXRlbHkgcHJl
ZmVyIGNvdmVyYWdlIG92ZXIgbGF0ZW5jeSwgYmVjYXVzZSBsYXRlbmN5IGNhbiBiZQorICogaW1w
cm92ZWQgYnkgdGhlIE1QVCBjYWNoZSB3aGljaCBoYXJkd2FyZSBtYXkgaW1wbGVtZW50IGJ1dCB0
aGUKKyAqIGNvdmVyYWdlIGlzIG5vdC4gU28gcGljayB0aGUgd2lkZXN0IG1vZGUgd2hpY2ggaXMg
c3VwcG9ydGVkIGJ5IHRoZQorICogaGFyZHdhcmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2JpX21w
dF9tb2RlICppbml0X21wdF9tb2RlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtbXB0X3ZhbCA9
IGNzcl9yZWFkKFNCSV9DU1JfTU1QVCk7CisJc3RydWN0IHNiaV9tcHRfbW9kZSAqcyA9IE5VTEw7
CisKKyNpZiBfX3Jpc2N2X3hsZW4gPT0gNjQKKwlpZiAocHJvYmVfbW9kZShTQklfTU1QVF9NT0RF
X1NNTVBUNjQpKQorCQlzID0gJnNtbXB0NjRfbW9kZTsKKwllbHNlIGlmIChwcm9iZV9tb2RlKFNC
SV9NTVBUX01PREVfU01NUFQ1MikpCisJCXMgPSAmc21tcHQ1Ml9tb2RlOworCWVsc2UgaWYgKHBy
b2JlX21vZGUoU0JJX01NUFRfTU9ERV9TTU1QVDQzKSkKKwkJcyA9ICZzbW1wdDQzX21vZGU7Cisj
ZWxzZQorCWlmIChwcm9iZV9tb2RlKFNCSV9NTVBUX01PREVfU01NUFQzNCkpCisJCXMgPSAmc21t
cHQzNF9tb2RlOworI2VuZGlmCisKKwljc3Jfd3JpdGUoU0JJX0NTUl9NTVBULCBtbXB0X3ZhbCk7
CisJcmV0dXJuIHM7Cit9CisKKy8qCisgKiBtcHRfbWFwX3JhbmdlX3Blcm0oKTogTWFwcyBbcGEs
IHBhK3NpemVdIHJlZ2lvbiBpbnRvIHN1cGVydmlzb3IgZG9tYWluIE1QVCB0YWJsZQorICogd2l0
aCBpdHMgYWNjZXNzIHBlcm1pc3Npb25zKHh3cikuCisgKgorICogbG9ja2VkPXRydWU6IG1lYW5z
IGVudHJ5IGlzIGltbXV0YWJsZSBhbmQgaXQgY2Fubm90IGJlIG1vZGlmaWVkLiBVc2VkIGZvcgor
ICogZmlybXdhcmUgZGVueS1hbGwgYW5kIG90aGVyIHN1Y2ggcmVnaW9ucyBmb3IgcGVybWFuZW5l
dCBhY2Nlc3MgcG9saWN5LgorICoKKyAqIGxvY2tlZD1mYWxzZTogcmVnaW9uIGVudHJ5IGlzIG1v
ZGlmaWFibGUgYXQgcnVudGltZSB2aWEgYWRkL3JlbW92ZV9yZWdpb24uCisgKiBVc2VkIGZvciBT
L1UtbW9kZSBhY2Nlc3NpYmxlIGRvbWFpbiByZWdpb25zLgorICovCisKK3N0YXRpYyBpbnQgbXB0
X21hcF9yYW5nZV9wZXJtKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCBzdHJ1Y3Qgc2JpX21w
dF9tb2RlICpzY2gsCisJCQkgIHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwg
dTggeHdyLCBib29sIGxvY2tlZCkKK3sKKwlpbnQgcmM7CisJYm9vbCBmaXJzdF9pbl9yYW5nZTsK
KworCWlmICghc2l6ZSkgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBpbnZhbGlkIHNpemUgZm9y
IHJhbmdlIDB4JWx4XG4iLCBwYSk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCWlmICgo
cGEgJiBTQklfTVBUX1BBR0VfTUFTSykgfHwgKHNpemUgJiBTQklfTVBUX1BBR0VfTUFTSykpIHsK
KwkJc2JpX3ByaW50Zigic2JpX21wdDogdW5hbGlnbmVkIHJhbmdlIDB4JWx4KzB4JWx4XG4iLCBw
YSwgc2l6ZSk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCWlmICghc2NoLT5wYV9pbl9y
YW5nZShwYSwgc2l6ZSkpIHsKKwkJLyoKKwkJICogQSByZWdpb24gdGhhdCBwYV9pbl9yYW5nZSgp
IHJldHVybnMgZmFsc2UgZmFsbHMgaW50byBvbmUgb2YgdHdvCisJCSAqIGRpZmZlcmVudCBjYXNl
cyAtIFBBIHdoaWNoIGlzIG91dCBvZiByYW5nZSBmcm9tIHRoZSBtYXBwYWJsZQorCQkgKiByYW5n
ZSBvZiB0aGF0IG1vZGUgYW5kIHNlY29uZCBpcyBQQSBpcyBpbiByYW5nZSBidXQgdGhlIGVuZAor
CQkgKiAocGEgKyBzaXplKSBpcyBjcm9zc2luZyB0aGUgbWFwcGFibGUgcmFuZ2UuCisJCSAqCisJ
CSAqIERpc3Rpbmd1aXNoIHRoZSB0d28gYnkgcHJvYmluZyBwYV9pbl9yYW5nZSgpIGZvciBqdXN0
CisJCSAqIHRoZSBmaXJzdCBwYWdlIGluIHRoYXQgYmlnIHJhbmdlIGFuZCBpZiBldmVuIHRoZSBm
aXJzdCBwYWdlCisJCSAqIGlzIG91dCBvZiByYW5nZSBpdCBpcyB0aGUgZmlyc3QgY2FzZSBhbmQg
aWYgdGhlIGJhc2UgaXMgaW4KKwkJICogcmFuZ2UgYnV0IHRoZSB3aG9sZSByZWdpb24gaXMgbm90
LCBpdCBpcyBjYXNlIGxhdGVyLgorCQkgKi8KKwkJZmlyc3RfaW5fcmFuZ2UgPSBzY2gtPnBhX2lu
X3JhbmdlKHBhLCBTQklfTVBUX1BBR0VfU0laRSk7CisKKwkJaWYgKGxvY2tlZCkgeworCQkJc2Jp
X3ByaW50Zigic2JpX21wdDogbG9ja2VkIHJlZ2lvbiAweCVseCsweCVseCBvdXQgb2YgbW9kZSBy
YW5nZVxuIiwKKwkJCQkgICBwYSwgc2l6ZSk7CisJCQlyZXR1cm4gU0JJX0VJTlZBTDsKKwkJfQor
CisJCS8qIFJlZ2lvbiB3aXRoIFBBIHdoaWNoIHBhcnRpYWxseSBjcm9zc292ZXIgdGhlIG1hcHBh
YmxlIHNwYWNlICovCisJCWlmIChmaXJzdF9pbl9yYW5nZSkgeworCQkJc2JpX3ByaW50Zigic2Jp
X21wdDogZmF0YWwgcmVnaW9uIDB4JWx4KzB4JWx4IGNyb3Nzb3ZlciIKKwkJCQkgICAiIG1vZGUg
JyVzJyBjZWlsaW5nOyBoaWdoIHBhcnQgbWF5IGFsaWFzIgorCQkJCSAgICIgd2l0aCBsb3cgTVBU
RSBlbnRyaWVzIOKAlCBub3QgbWFwcGluZyB0aGlzIHJlZ2lvblxuIiwKKwkJCQkgICBwYSwgc2l6
ZSwgc2NoLT5uYW1lKTsKKwkJCXJldHVybiBTQklfRUlOVkFMOworCQl9CisKKwkJLyogUmVnaW9u
IHdoaWNoIGlzIGVudGlyZWx5IGFib3ZlIHRoZSBjZWlsaW5nIOKAlCB1bnJlYWNoYWJsZSAqLwor
CQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBza2lwIG91dC1vZi1yYW5nZSAweCVseCsweCVseCIKKwkJ
CSAgICIgKGVudGlyZWx5IGFib3ZlICclcycgY2VpbGluZzsgbm8gTVBUIGVudHJ5LFxuIiwKKwkJ
CSAgIHBhLCBzaXplLCBzY2gtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IHNjaC0+
bWFwX3JhbmdlKGRvbSwgcGEsIHNpemUsIHh3cik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisK
KwlpZiAoZG9tLT5ucmVnaW9ucyA+PSBTQklfTVBUX01BWF9SRUdJT05TX0RPTUFJTikKKwkJcmV0
dXJuIFNCSV9FTk9NRU07CisKKwlkb20tPnJlZ2lvbnNbZG9tLT5ucmVnaW9uc10ucGEgPSBwYTsK
Kwlkb20tPnJlZ2lvbnNbZG9tLT5ucmVnaW9uc10uc2l6ZSA9IHNpemU7CisJZG9tLT5yZWdpb25z
W2RvbS0+bnJlZ2lvbnNdLnh3ciA9IHh3cjsKKwlkb20tPnJlZ2lvbnNbZG9tLT5ucmVnaW9uc10u
bG9ja2VkID0gbG9ja2VkOworCWRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25zXS5zaGFyZWQgPSBm
YWxzZTsKKwlkb20tPm5yZWdpb25zKys7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1wdF94
d3JfZnJvbV9tZW1yZWdpb24oKTogZGVyaXZlIGFuIE1QVEUgWFdSIGVuY29kaW5nIGZyb20gYSBT
QkkgZG9tYWluCisgKiBtZW1yZWdpb24ncyBTL1UgYWNjZXNzIGZsYWdzLCBjbGFtcGVkIGJ5IGNh
cC4KKyAqCisgKiBjYXAgaXMgYW4gdXBwZXIgYm91bmQgdGhlIGNhbGxlciBtYXkgaW1wb3NlLiBB
IHJlZ2lvbiBmcm9tIFNCSSBkb21haW4KKyAqIG1heSBoYXZlIG1vcmUgcGVybWlzc2l2ZSBhY2Nl
c3MgcGVybWlzc2lvbnMgd2hpY2ggYW4gc3VwZXJ2aXNvciBkb21haW4KKyAqIG1heSB3YW50IHRv
IHJlc3RpY3QgYW5kIGNhcCB0aGVtLgorICovCitzdGF0aWMgdTggbXB0X3h3cl9mcm9tX21lbXJl
Z2lvbihjb25zdCBzdHJ1Y3Qgc2JpX2RvbWFpbl9tZW1yZWdpb24gKm1yLAorCQkJCSB1OCBjYXAp
Cit7CisJdTggeHdyID0gU0JJX01QVF9QRVJNX05PTkU7CisKKwlpZiAobXItPmZsYWdzICYgU0JJ
X0RPTUFJTl9NRU1SRUdJT05fU1VfUkVBREFCTEUpCisJCXh3ciB8PSBTQklfTVBUX1BFUk1fUjsK
KwlpZiAobXItPmZsYWdzICYgU0JJX0RPTUFJTl9NRU1SRUdJT05fU1VfV1JJVEFCTEUpCisJCXh3
ciB8PSBTQklfTVBUX1BFUk1fVzsKKwlpZiAobXItPmZsYWdzICYgU0JJX0RPTUFJTl9NRU1SRUdJ
T05fU1VfRVhFQ1VUQUJMRSkKKwkJeHdyIHw9IFNCSV9NUFRfUEVSTV9YOworCisJeHdyICY9IGNh
cDsKKworCS8qIFhXUiBlbmNvZGluZ3MgMGIwMTAgKFcpIGFuZCAwYjExMCAoV1gpIGFyZSByZXNl
cnZlZCAqLworCWlmICgoeHdyICYgU0JJX01QVF9QRVJNX1cpICYmICEoeHdyICYgU0JJX01QVF9Q
RVJNX1IpKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IHJlZ2lvbiAweCVseDogVyB3aXRob3V0
IFIgaXMgYSByZXNlcnZlZCIKKwkJCSAgICIgWFdSIGVuY29kaW5nIOKAlCBkZW55aW5nIHJlZ2lv
blxuIiwgbXItPmJhc2UpOworCQlyZXR1cm4gU0JJX01QVF9QRVJNX05PTkU7CisJfQorCisJcmV0
dXJuIHh3cjsKK30KKworLyoKKyAqIHNiaV9tcHRfaW5pdCgpOiBJbml0aWFsaXplIE1QVCBzdHJ1
Y3R1cmVzCisgKi8KK2ludCBzYmlfbXB0X2luaXQodm9pZCkKK3sKKwl1MzIgKnA7CisJdW5zaWdu
ZWQgbG9uZyBmd19lbmQ7CisJc3RydWN0IHNiaV9zY3JhdGNoICpzOworCXN0cnVjdCBzYmlfc2Ny
YXRjaCAqc2NyYXRjaCA9IHNiaV9zY3JhdGNoX3RoaXNoYXJ0X3B0cigpOworCXVuc2lnbmVkIGxv
bmcgZndfcGEgPSBzY3JhdGNoLT5md19zdGFydDsKKwl1bnNpZ25lZCBsb25nIGZ3X3NpemUgPSBz
Y3JhdGNoLT5md19zaXplOworCisJaWYgKG1wdF9jdHJsLnJlYWR5KQorCQlyZXR1cm4gMDsKKwor
CWlmICghc2JpX2hhcnRfaGFzX2V4dGVuc2lvbihzY3JhdGNoLCBTQklfSEFSVF9FWFRfU01TRElE
KSkgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBTbXNkaWQgZXh0ZW5zaW9uIGFic2VudFxuIik7
CisJCXJldHVybiBTQklfRU5PREVWOworCX0KKworCWlmICghc2JpX2hhcnRfaGFzX2V4dGVuc2lv
bihzY3JhdGNoLCBTQklfSEFSVF9FWFRfU01NUFQpKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6
IFNtbXB0IGV4dGVuc2lvbiBhYnNlbnRcbiIpOworCQlyZXR1cm4gU0JJX0VOT0RFVjsKKwl9CisK
KwltcHRfY3RybC5zZGlkX2xlbiA9IHByb2JlX3NkaWRsZW4oKTsKKwlpZiAoIW1wdF9jdHJsLnNk
aWRfbGVuKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IFNESURMRU49MCDigJQgU0RJRCBmaWVs
ZCBub3QgaW1wbGVtZW50ZWRcbiIpOworCQlyZXR1cm4gU0JJX0VOT0RFVjsKKwl9CisJbXB0X2N0
cmwubWF4X2RvbWFpbnMgPSBVTCgxKSA8PCBtcHRfY3RybC5zZGlkX2xlbjsKKworCS8qCisJICog
SW5pdGlhbGlzZSBTRElEIGJpdG1hcAorCSAqIHNldCBiaXRzIDAuLihtYXhfZG9tYWlucy0xKSBh
cyAxIG1hcmtpbmcgdGhvc2UgU0RJRHMgZnJlZS4KKwkgKi8KKwliaXRtYXBfZmlsbChtcHRfY3Ry
bC5zZGlkX2JpdG1hcCwgbXB0X2N0cmwubWF4X2RvbWFpbnMpOworCisJbXB0X2N0cmwubW9kZSA9
IGluaXRfbXB0X21vZGUoKTsKKwlpZiAoIW1wdF9jdHJsLm1vZGUpIHsKKwkJc2JpX3ByaW50Zigi
c2JpX21wdDogV0FSTCBwcm9iZSBmb3VuZCBubyBtb2RlXG4iKTsKKwkJcmV0dXJuIFNCSV9FTk9E
RVY7CisJfQorCisJLyogUm91bmQgZndfcGEgYW5kIGZ3X3NpemUgdG8gcGFnZSBib3VuZGFyaWVz
IGJlZm9yZSBzdG9yaW5nLiAqLworCWZ3X2VuZCA9IChmd19wYSArIGZ3X3NpemUgKyBTQklfTVBU
X1BBR0VfU0laRSAtIDFVTCkgJiB+U0JJX01QVF9QQUdFX01BU0s7CisJbXB0X2N0cmwuZndfcGEg
PSBmd19wYSAmIH5TQklfTVBUX1BBR0VfTUFTSzsKKwltcHRfY3RybC5md19zaXplID0gZndfZW5k
IC0gbXB0X2N0cmwuZndfcGE7CisKKworCS8qIFBlci1oYXJ0IFNESUQgc2NyYXRjaCBzbG90IOKA
lCBpbml0aWFsaXNlIGFsbCBoYXJ0cyB0byBJTlZBTElEICovCisJbXB0X2N0cmwuc2RpZF9vZmZz
ZXQgPSBzYmlfc2NyYXRjaF9hbGxvY19vZmZzZXQoc2l6ZW9mKHUzMikpOworCWlmICghbXB0X2N0
cmwuc2RpZF9vZmZzZXQpIHsKKwkJc2JpX3ByaW50Zigic2JpX21wdDogc2NyYXRjaCBhbGxvYyBm
b3IgU0RJRCBmYWlsZWRcbiIpOworCX0KKwllbHNlIHsKKwkJc2JpX2Zvcl9lYWNoX2hhcnRpbmRl
eChpKSB7CisJCQlzID0gc2JpX2hhcnRpbmRleF90b19zY3JhdGNoKGkpOworCQkJaWYgKHMpIHsK
KwkJCQlwID0gc2JpX3NjcmF0Y2hfb2Zmc2V0X3B0cihzLCBtcHRfY3RybC5zZGlkX29mZnNldCk7
CisJCQkJKnAgPSBTQklfTVBUX1NESURfSU5WQUxJRDsKKwkJCX0KKwkJfQorCX0KKworCW1wdF9j
dHJsLnJlYWR5ID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCisvKgorICogc2JpX21wdF9kb21h
aW5fY3JlYXRlKCk6IENyZWF0ZSBhIFN1cGVydmlzb3IgRG9tYWluCisgKi8KK2ludCBzYmlfbXB0
X2RvbWFpbl9jcmVhdGUoY29uc3Qgc3RydWN0IHNiaV9tcHRfZG9tYWluX2NvbmZpZyAqY2ZnLAor
CQkJICAgdTMyICpvdXRfc2RpZCkKK3sKKwlpbnQgcmM7CisJdTMyIHNkaWQsIGk7CisJdW5zaWdu
ZWQgbG9uZyByb290X3BhOworCXN0cnVjdCBzYmlfbXB0X21vZGUgKnNjaDsKKwlzdHJ1Y3Qgc2Jp
X21wdF9kb21haW4gKmRvbTsKKwljb25zdCBzdHJ1Y3Qgc2JpX2RvbWFpbl9tZW1yZWdpb24gKm1y
OworCXN0cnVjdCBzYmlfbXB0X2N0cmwgKmN0cmwgPSAmbXB0X2N0cmw7CisJdTggYmFzZV94d3Ig
PSBTQklfTVBUX1BFUk1fTk9ORTsKKworCWlmICghY3RybC0+cmVhZHkpCisJCXJldHVybiBTQklf
RU5PREVWOworCisJaWYgKGNmZy0+c2JpX2RvbSAmJiBjZmctPm5yZWdpb25zKSB7CisJCXNiaV9w
cmludGYoInNiaV9tcHQ6IHNiaV9kb20gYW5kIGV4cGxpY2l0IHJlZ2lvbnMgYXJlIG11dHVhbGx5
IGV4Y2x1c2l2ZVxuIik7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCS8qCisJICogc2Rp
ZF9iaXRtYXAgZW1wdHkgbWVhbnMgZXZlcnkgYXZhaWxhYmxlIFNESUQgaXMKKwkgKiBjdXJyZW50
bHkgaW4gdXNlIGFuZCBubyBkb21haW4gY2FuIGJlIGNyZWF0ZWQuCisJICovCisJaWYgKGJpdG1h
cF9lbXB0eShjdHJsLT5zZGlkX2JpdG1hcCwgY3RybC0+bWF4X2RvbWFpbnMpKQorCQlyZXR1cm4g
U0JJX0VOT01FTTsKKworCXNjaCA9IGN0cmwtPm1vZGU7CisKKwlyb290X3BhID0gc2JpX21wdF9w
b29sX2FsbG9jKHNjaC0+cm9vdF90YWJsZV9zaXplKCksCisJCQkJICAgICBzY2gtPnJvb3RfdGFi
bGVfYWxpZ24oKSk7CisJaWYgKCFyb290X3BhKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IE9P
TSByb290IHRhYmxlXG4iKTsKKwkJcmV0dXJuIFNCSV9FTk9NRU07CisJfQorCisJLyoKKwkgKiBS
b290IE1QVCBtZW1vcnkgYWxsb2NhdGVkIOKAlCB0YWtlIFNESUQgZnJvbSBiaXRtYXAgZm9yIHJv
b3Qgc3VwZXJ2aXNvcgorCSAqIGRvbWFpbgorCSAqLworCWZvciAoc2RpZCA9IDA7IHNkaWQgPCBj
dHJsLT5tYXhfZG9tYWluczsgc2RpZCsrKQorCQlpZiAoYml0bWFwX3Rlc3QoY3RybC0+c2RpZF9i
aXRtYXAsIHNkaWQpKQorCQkJYnJlYWs7CisJYml0bWFwX2NsZWFyKGN0cmwtPnNkaWRfYml0bWFw
LCBzZGlkLCAxKTsKKworCWRvbSA9ICZjdHJsLT5kb21haW5zW3NkaWRdOworCVNQSU5fTE9DS19J
TklUKGRvbS0+bG9jayk7CisKKwlkb20tPnNkaWQgPSBzZGlkOworCWRvbS0+dmFsaWQgPSB0cnVl
OworCWRvbS0+cm9vdF9wYSA9IHJvb3RfcGE7CisJZG9tLT5tb2RlID0gc2NoOworCWRvbS0+c2Jp
X2RvbSA9IGNmZy0+c2JpX2RvbTsKKwlkb20tPm5yZWdpb25zID0gMDsKKworCWlmIChjZmctPnNi
aV9kb20pIHsKKwkJLyoKKwkJICogU2ltaWxhciB0byBTQkkgZG9tYWluLCBjcmVhdGUgYSBiYXNl
bGluZSB3aGljaAorCQkgKiBtYXBzIHdob2xlIG1hcHBhYmxlIGFkZHJlc3Mgc3BhY2UgYnkgYSBt
b2RlIGFuZCBtYXJrIGl0CisJCSAqIHdpdGggWFdSIHBlcm1pc3Npb25zLiBMYXRlciBzZWxlY3Rp
dmVseSByZXN0cmljdCB0aGUKKwkJICogcGVybWlzc2lvbnMgaW4gYW5vdGhlciBwYXNzLgorCQkg
Ki8KKwkJc2JpX2RvbWFpbl9mb3JfZWFjaF9tZW1yZWdpb24oY2ZnLT5zYmlfZG9tLCBtcikgewor
CQkJaWYgKG1yLT5vcmRlciA8IHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpCisJCQkJY29udGlu
dWU7CisKKwkJCWlmICghKG1yLT5mbGFncyAmIFNCSV9ET01BSU5fTUVNUkVHSU9OX1NVX0FDQ0VT
U19NQVNLKSkKKwkJCQljb250aW51ZTsKKworCQkJYmFzZV94d3IgPSBtcHRfeHdyX2Zyb21fbWVt
cmVnaW9uKG1yLCBjZmctPnh3cik7CisJCQlyYyA9IHNjaC0+bWFwX2Z1bGxfcmFuZ2UoZG9tLCBi
YXNlX3h3cik7CisJCQlpZiAocmMpCisJCQkJZ290byBmYWlsOworCisJCQlpZiAoZG9tLT5ucmVn
aW9ucyA8IFNCSV9NUFRfTUFYX1JFR0lPTlNfRE9NQUlOKSB7CisJCQkJc3RydWN0IHNiaV9tcHRf
cmVnaW9uICpyID0gJmRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25zKytdOworCQkJCXItPnBhID0g
MDsKKwkJCQlyLT5zaXplID0gfjBVTCAmIH5TQklfTVBUX1BBR0VfTUFTSzsKKwkJCQlyLT54d3Ig
PSBiYXNlX3h3cjsKKwkJCQlyLT5sb2NrZWQgPSBmYWxzZTsKKwkJCQlyLT5zaGFyZWQgPSBmYWxz
ZTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBBbm90aGVyIHBhc3MgdG8g
bWFwIGV2ZXJ5IG90aGVyIHJlZ2lvbiB3aGljaCBoYXMgaXRzIG93bgorCQkgKiBwZXJtaXNzaW9u
cyBkZXJpdmVkIGZyb20gdGhlIG1lbXJlZ2lvbidzIFMvVSBmbGFncy4KKwkJICovCisJCXNiaV9k
b21haW5fZm9yX2VhY2hfbWVtcmVnaW9uKGNmZy0+c2JpX2RvbSwgbXIpIHsKKwkJCWlmIChtci0+
b3JkZXIgPj0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkKKwkJCQljb250aW51ZTsKKworCQkJ
cmMgPSBtcHRfbWFwX3JhbmdlX3Blcm0oZG9tLCBzY2gsIG1yLT5iYXNlLCBCSVQobXItPm9yZGVy
KSwKKwkJCQkJCW1wdF94d3JfZnJvbV9tZW1yZWdpb24obXIsIGNmZy0+eHdyKSwgZmFsc2UpOwor
CQkJaWYgKHJjKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCS8qIE1hcCBleHBsaWNpdCBy
ZWdpb25zIHdoaWNoIGFyZSBub3QgcGFydCBvZiBhbnkgU0JJIGRvbWFpbiAqLworCWZvciAoaSA9
IDA7IGkgPCBjZmctPm5yZWdpb25zOyBpKyspIHsKKwkJcmMgPSBtcHRfbWFwX3JhbmdlX3Blcm0o
ZG9tLCBzY2gsIGNmZy0+cmVnaW9uc1tpXS5wYSwgY2ZnLT5yZWdpb25zW2ldLnNpemUsCisJCQkJ
CWNmZy0+cmVnaW9uc1tpXS54d3IsIGZhbHNlKTsKKwkJaWYgKHJjKQorCQkJZ290byBmYWlsOwor
CX0KKworCS8qCisJICogTWFwIGZpcm13YXJlIHJlZ2lvbiB3aXRoIG5vIHBlcm1pc3Npb24gd2l0
aCBhbmQgbWFyayBhcyBsb2NrZWQKKwkgKi8KKwlpZiAoY2ZnLT5md19wcm90ZWN0KSB7CisJCXJj
ID0gbXB0X21hcF9yYW5nZV9wZXJtKGRvbSwgc2NoLCBjdHJsLT5md19wYSwgY3RybC0+Zndfc2l6
ZSwKKwkJCQkJU0JJX01QVF9QRVJNX05PTkUsIHRydWUpOworCQlpZiAocmMpIHsKKwkJCXNiaV9w
cmludGYoInNiaV9tcHQ6IGNhbm5vdCBwcm90ZWN0IGZpcm13YXJlIgorCQkJCSAgICIgcmM9JWRc
biIsIHJjKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWN0cmwtPm5kb21haW4rKzsKKwlp
ZiAob3V0X3NkaWQpCisJCSpvdXRfc2RpZCA9IHNkaWQ7CisKKwlzYmlfbXB0X2ZlbmNlX3NkaWQo
c2RpZCk7CisKKwkvKiBUbyBiZSByZW1vdmVkICovCisJc2JpX3ByaW50Zigic2JpX21wdDogU0RJ
RCAldSByb290PTB4JWx4IG1vZGU9JXMgZG9tPSVzXG4iLAorCQkgICBzZGlkLCByb290X3BhLCBz
Y2gtPm5hbWUsIGNmZy0+c2JpX2RvbSA/IGNmZy0+c2JpX2RvbS0+bmFtZSA6ICIobm9uZSkiKTsK
KwlyZXR1cm4gMDsKKworZmFpbDoKKwliaXRtYXBfc2V0KGN0cmwtPnNkaWRfYml0bWFwLCAoaW50
KXNkaWQsIDEpOworCWRvbS0+dmFsaWQgPSBmYWxzZTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisg
KiBzYmlfbXB0X2RvbWFpbl9hZGRfcmVnaW9uKCk6IE1hcCBhIHJlZ2lvbiBpbiBhIE1QVCB0YWJs
ZQorICovCitpbnQgc2JpX21wdF9kb21haW5fYWRkX3JlZ2lvbih1MzIgc2RpZCwgdW5zaWduZWQg
bG9uZyBwYSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHU4IHh3cikKK3sKKwlzdHJ1
Y3Qgc2JpX21wdF9kb21haW4gKmRvbTsKKwlzdHJ1Y3Qgc2JpX21wdF9yZWdpb24gKnI7CisJaW50
IHJjOworCisJaWYgKCFtcHRfY3RybC5yZWFkeSkKKwkJcmV0dXJuIFNCSV9FTk9ERVY7CisJaWYg
KCFzaXplIHx8IChwYSAmIFNCSV9NUFRfUEFHRV9NQVNLKSB8fCAoc2l6ZSAmIFNCSV9NUFRfUEFH
RV9NQVNLKSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisKKwlkb20gPSBzYmlfbXB0X2RvbWFpbl9n
ZXQoc2RpZCk7CisJaWYgKCFkb20pCisJCXJldHVybiBTQklfRUlOVkFMOworCisJaWYgKHJlZ2lv
bl9vdmVybGFwc19sb2NrZWQoZG9tLCBwYSwgc2l6ZSkpIHsKKwkJc2JpX3ByaW50Zigic2JpX21w
dDogMHglbHgrMHglbHggb3ZlcmxhcHMgbG9ja2VkIgorCQkJICAgIiAoU0RJRCAldSlcbiIsIHBh
LCBzaXplLCBzZGlkKTsKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisJfQorCisJaWYgKCFkb20tPm1v
ZGUtPnBhX2luX3JhbmdlKHBhLCBzaXplKSkgeworCQkvKgorCQkgKiBBIHJlZ2lvbiB0aGF0IHBh
X2luX3JhbmdlKCkgcmVqZWN0cyBmYWxscyBpbnRvIG9uZSBvZiB0d28KKwkJICogZGlmZmVyZW50
IGNhc2VzIC0gUEEgd2hpY2ggaXMgb3V0IG9mIHJhbmdlIGZyb20gdGhlIG1hcHBhYmxlCisJCSAq
IHJhbmdlIG9mIHRoYXQgbW9kZSBhbmQgc2Vjb25kIGlzIFBBIGlzIGluIHJhbmdlIGJ1dCB0aGUg
ZW5kCisJCSAqIChQQSArIFNJWkUpIGlzIGNyb3NzaW5nIHRoZSBtYXBwYWJsZSByYW5nZS4KKwkJ
ICoKKwkJICogRGlzdGluZ3Vpc2ggdGhlIHR3byBieSBwcm9iaW5nIHBhX2luX3JhbmdlKCkgZm9y
IGp1c3QKKwkJICogdGhlIGJhc2UgcGFnZSBhbmQgaWYgZXZlbiB0aGUgYmFzZSBpcyBvdXQgb2Yg
cmFuZ2UgaXQgaXMKKwkJICogdGhlIGZpcnN0IGNhc2UgYW5kIGlmIHRoZSBiYXNlIGlzIGluIHJh
bmdlIGJ1dCB0aGUgd2hvbGUKKwkJICogcmVnaW9uIGlzIG5vdCwgaXQgaXMgY2FzZSBsYXRlci4K
KwkJICovCisJCWlmIChkb20tPm1vZGUtPnBhX2luX3JhbmdlKHBhLCBTQklfTVBUX1BBR0VfU0la
RSkpCisJCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiAweCVseCsweCVseCBjcm9zc292ZXIgbW9kZSAn
JXMnIgorCQkJCSAgICIgY2VpbGluZyAoU0RJRCAldSkg4oCUIGhpZ2ggcGFydCB3b3VsZCBhbGlh
czsiCisJCQkJICAgIiByZWplY3RlZFxuIiwKKwkJCQkgICBwYSwgc2l6ZSwgZG9tLT5tb2RlLT5u
YW1lLCBzZGlkKTsKKwkJZWxzZQorCQkJc2JpX3ByaW50Zigic2JpX21wdDogMHglbHgrMHglbHgg
b3V0IG9mIHJhbmdlIgorCQkJCSAgICIgKFNESUQgJXUpXG4iLCBwYSwgc2l6ZSwgc2RpZCk7CisJ
CXJldHVybiBTQklfRUlOVkFMOworCX0KKworCXNwaW5fbG9jaygmZG9tLT5sb2NrKTsKKwlyYyA9
IGRvbS0+bW9kZS0+bWFwX3JhbmdlKGRvbSwgcGEsIHNpemUsIHh3cik7CisJc3Bpbl91bmxvY2so
JmRvbS0+bG9jayk7CisKKwlpZiAoIXJjKSB7CisJCWlmIChkb20tPm5yZWdpb25zIDwgU0JJX01Q
VF9NQVhfUkVHSU9OU19ET01BSU4pIHsKKwkJCXIgPSAmZG9tLT5yZWdpb25zW2RvbS0+bnJlZ2lv
bnMrK107CisJCQlyLT5wYSA9IHBhOworCQkJci0+c2l6ZSA9IHNpemU7CisJCQlyLT54d3IgPSB4
d3I7CisJCQlyLT5sb2NrZWQgPSBmYWxzZTsKKwkJCXItPnNoYXJlZCA9IGZhbHNlOworCQl9CisK
KwkJc2JpX21wdF9mZW5jZV9zZGlkKHNkaWQpOworCX0KKworCXJldHVybiByYzsKK30KKworLyoK
KyAqIHNiaV9tcHRfZG9tYWluX3JlbW92ZV9yZWdpb24oKTogVW5tYXAgYSByZWdpb24gZnJvbSB0
aGUgTVBUIHRhYmxlCisgKi8KK2ludCBzYmlfbXB0X2RvbWFpbl9yZW1vdmVfcmVnaW9uKHUzMiBz
ZGlkLCB1bnNpZ25lZCBsb25nIHBhLAorCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlu
dCByYzsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbTsKKwlz
dHJ1Y3Qgc2JpX21wdF9yZWdpb24gKnI7CisKKwlpZiAoIW1wdF9jdHJsLnJlYWR5KQorCQlyZXR1
cm4gU0JJX0VOT0RFVjsKKworCWlmICghc2l6ZSB8fCAocGEgJiBTQklfTVBUX1BBR0VfTUFTSykg
fHwgKHNpemUgJiBTQklfTVBUX1BBR0VfTUFTSykpCisJCXJldHVybiBTQklfRUlOVkFMOworCisJ
ZG9tID0gc2JpX21wdF9kb21haW5fZ2V0KHNkaWQpOworCWlmICghZG9tKQorCQlyZXR1cm4gU0JJ
X0VJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBkb20tPm5yZWdpb25zOyBpKyspIHsKKwkJciA9
ICZkb20tPnJlZ2lvbnNbaV07CisKKwkJaWYgKHItPmxvY2tlZCAmJiByZWdpb25fY29udGFpbmVk
KHBhLCBzaXplLCByLT5wYSwgci0+c2l6ZSkpCisJCQlyZXR1cm4gU0JJX0VERU5JRUQ7CisJCS8q
CisJCSAqIFNoYXJlZCByZWdpb25zIG11c3QgYmUgcmVtb3ZlZCB2aWEgc2JpX21wdF91bnNoYXJl
X3JlZ2lvbigpCisJCSAqIGJlY2F1c2UgdGhhdCBmdW5jdGlvbiBwcmV2ZW50cyBvbmUgZG9tYWlu
IHJldm9raW5nIGEgcmVnaW9uCisJCSAqIHRoYXQgYW5vdGhlciBkb21haW4gc3RpbGwgaGFzIG1h
cHBlZC4KKwkJICovCisJCWlmIChyLT5zaGFyZWQgJiYgci0+cGEgPT0gcGEgJiYgci0+c2l6ZSA9
PSBzaXplKQorCQkJcmV0dXJuIFNCSV9FREVOSUVEOworCX0KKworCXNwaW5fbG9jaygmZG9tLT5s
b2NrKTsKKwlyYyA9IGRvbS0+bW9kZS0+bWFwX3JhbmdlKGRvbSwgcGEsIHNpemUsIFNCSV9NUFRf
UEVSTV9OT05FKTsKKwlzcGluX3VubG9jaygmZG9tLT5sb2NrKTsKKworCWlmICghcmMpCisJCXNi
aV9tcHRfZmVuY2Vfc2RpZChzZGlkKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFNoYXJl
ZCBtZW1vcnkgcmVnaW9ucworICoKKyAqIHNiaV9tcHRfc2hhcmVfcmVnaW9uKCkg4oCUIG1hcCBh
IHJlZ2lvbiBpbnRvIGEgc2Vjb25kIGRvbWFpbi4KKyAqCisgKiBCb3RoIGRvbWFpbnMgTVBUIHRh
YmxlcyBhcmUgdXBkYXRlZCBpbmRlcGVuZGVudGx5IOKAlCBlYWNoIGhhcyBpdHMKKyAqIG93biBy
b290L2lubmVyL2xlYWYgdGFibGUgdHJlZS4gVGhlIHNhbWUgUEEgcmFuZ2UgY2FuIGhhdmUgZGlm
ZmVyZW50CisgKiBYV1IgcGVybWlzc2lvbnMgaW4gZGlmZmVyZW50IGRvbWFpbnMuCisgKgorICov
CisKK2ludCBzYmlfbXB0X3NoYXJlX3JlZ2lvbih1MzIgc3JjX3NkaWQsIHUzMiBkc3Rfc2RpZCwK
KwkJCSAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICB1OCBkc3Rf
eHdyKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKwlzdHJ1Y3Qgc2JpX21wdF9kb21h
aW4gKnNyY19kb20sICpkc3RfZG9tOworCisJaWYgKCFtcHRfY3RybC5yZWFkeSkKKwkJcmV0dXJu
IFNCSV9FTk9ERVY7CisKKwlpZiAoIXNpemUgfHwgKHBhICYgU0JJX01QVF9QQUdFX01BU0spIHx8
IChzaXplICYgU0JJX01QVF9QQUdFX01BU0spKQorCQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWlm
IChzcmNfc2RpZCA9PSBkc3Rfc2RpZCkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisKKwlzcmNfZG9t
ID0gc2JpX21wdF9kb21haW5fZ2V0KHNyY19zZGlkKTsKKwlkc3RfZG9tID0gc2JpX21wdF9kb21h
aW5fZ2V0KGRzdF9zZGlkKTsKKwlpZiAoIXNyY19kb20gfHwgIWRzdF9kb20pCisJCXJldHVybiBT
QklfRUlOVkFMOworCisJaWYgKHJlZ2lvbl9vdmVybGFwc19sb2NrZWQoZHN0X2RvbSwgcGEsIHNp
emUpKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IHNoYXJlIDB4JWx4KzB4JWx4IG92ZXJsYXBz
IGxvY2tlZCByZWdpb24gaW4gU0RJRCAldVxuIiwKKwkJCSAgIHBhLCBzaXplLCBkc3Rfc2RpZCk7
CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCS8qIFJlamVjdCByZXNlcnZlZCB4d3IgcGVy
bWlzc2lvbnM6IDBiMDEwIGFuZCAwYjExMCAoVyB3aXRob3V0IFIpICovCisJaWYgKChkc3RfeHdy
ICYgU0JJX01QVF9QRVJNX1cpICYmICEoZHN0X3h3ciAmIFNCSV9NUFRfUEVSTV9SKSkgeworCQlz
YmlfcHJpbnRmKCJzYmlfbXB0OiBzaGFyZSAweCVseCsweCVseDogVyB3aXRob3V0IFIgaXMgYSBy
ZXNlcnZlZCBYV1IgZW5jb2RpbmdcbiIsCisJCQkgICBwYSwgc2l6ZSk7CisJCXJldHVybiBTQklf
RUlOVkFMOworCX0KKworCWlmIChkc3RfZG9tLT5ucmVnaW9ucyA+PSBTQklfTVBUX01BWF9SRUdJ
T05TX0RPTUFJTikgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBzaGFyZTogU0RJRCAldSByZWdp
b24gdGFibGUgZnVsbFxuIiwgZHN0X3NkaWQpOworCQlyZXR1cm4gU0JJX0VOT01FTTsKKwl9CisK
KwlzcGluX2xvY2soJmRzdF9kb20tPmxvY2spOworCXJjID0gZHN0X2RvbS0+bW9kZS0+bWFwX3Jh
bmdlKGRzdF9kb20sIHBhLCBzaXplLCBkc3RfeHdyKTsKKwlzcGluX3VubG9jaygmZHN0X2RvbS0+
bG9jayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlkc3RfZG9tLT5yZWdpb25zW2RzdF9k
b20tPm5yZWdpb25zXS5wYSA9IHBhOworCWRzdF9kb20tPnJlZ2lvbnNbZHN0X2RvbS0+bnJlZ2lv
bnNdLnNpemUgPSBzaXplOworCWRzdF9kb20tPnJlZ2lvbnNbZHN0X2RvbS0+bnJlZ2lvbnNdLnh3
ciA9IGRzdF94d3I7CisJZHN0X2RvbS0+cmVnaW9uc1tkc3RfZG9tLT5ucmVnaW9uc10ubG9ja2Vk
ID0gZmFsc2U7CisJZHN0X2RvbS0+cmVnaW9uc1tkc3RfZG9tLT5ucmVnaW9uc10uc2hhcmVkID0g
dHJ1ZTsKKwlkc3RfZG9tLT5ucmVnaW9ucysrOworCisJZm9yIChpID0gMDsgaSA8IHNyY19kb20t
Pm5yZWdpb25zOyBpKyspIHsKKwkJaWYgKHNyY19kb20tPnJlZ2lvbnNbaV0ucGEgPT0gcGEgJiYK
KwkJICAgIHNyY19kb20tPnJlZ2lvbnNbaV0uc2l6ZSA9PSBzaXplKSB7CisJCQlzcmNfZG9tLT5y
ZWdpb25zW2ldLnNoYXJlZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNiaV9tcHRf
ZmVuY2Vfc2RpZChzcmNfc2RpZCk7CisJc2JpX21wdF9mZW5jZV9zZGlkKGRzdF9zZGlkKTsKKwor
CXNiaV9wcmludGYoInNiaV9tcHQ6IHNoYXJlZCAweCVseCsweCVseCBTRElEICV1IOKGkiBTRElE
ICV1IHh3cj0ldVxuIiwKKwkJICAgcGEsIHNpemUsIHNyY19zZGlkLCBkc3Rfc2RpZCwgZHN0X3h3
cik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNiaV9tcHRfdW5zaGFyZV9yZWdpb24oKSDi
gJQgVW5tYXAgYSBzaGFyZWQgcmVnaW9uIGZyb20gYSBkb21haW4uCisgKgorICogVGhlIG90aGVy
IGRvbWFpbiByZW1haW5zIHVuYWZmZWN0ZWQganVzdCB0aGUgc2hhcmVkIGZsYWcgZ2V0cyByZW1v
dmVkCisgKiBmb3IgdGhhdCByZWdpb24gZnJvbSBib3RoIHRoZSBkb21haW5zLgorICovCitpbnQg
c2JpX21wdF91bnNoYXJlX3JlZ2lvbih1MzIgc2RpZCwgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWdu
ZWQgbG9uZyBzaXplKQoreworCXUzMiBzOworCWludCByYzsKKwl1bnNpZ25lZCBpbnQgaSwgajsK
KwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwgKnBlZXI7CisKKwlpZiAoIW1wdF9jdHJsLnJl
YWR5KQorCQlyZXR1cm4gU0JJX0VOT0RFVjsKKworCWlmICghc2l6ZSB8fCAocGEgJiBTQklfTVBU
X1BBR0VfTUFTSykgfHwgKHNpemUgJiBTQklfTVBUX1BBR0VfTUFTSykpCisJCXJldHVybiBTQklf
RUlOVkFMOworCisJZG9tID0gc2JpX21wdF9kb21haW5fZ2V0KHNkaWQpOworCWlmICghZG9tKQor
CQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBkb20tPm5yZWdpb25zOyBp
KyspIHsKKwkJaWYgKGRvbS0+cmVnaW9uc1tpXS5wYSA9PSBwYSAmJgorCQkgICAgZG9tLT5yZWdp
b25zW2ldLnNpemUgPT0gc2l6ZSAmJgorCQkgICAgZG9tLT5yZWdpb25zW2ldLnNoYXJlZCkKKwkJ
CWJyZWFrOworCX0KKwlpZiAoaSA9PSBkb20tPm5yZWdpb25zKSB7CisJCXNiaV9wcmludGYoInNi
aV9tcHQ6IHVuc2hhcmUgMHglbHgrMHglbHggbm90IGZvdW5kIGluIFNESUQgJXVcbiIsCisJCQkg
ICBwYSwgc2l6ZSwgc2RpZCk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCXNwaW5fbG9j
aygmZG9tLT5sb2NrKTsKKwlyYyA9IGRvbS0+bW9kZS0+bWFwX3JhbmdlKGRvbSwgcGEsIHNpemUs
IFNCSV9NUFRfUEVSTV9OT05FKTsKKwlzcGluX3VubG9jaygmZG9tLT5sb2NrKTsKKworCWlmIChy
YykKKwkJcmV0dXJuIHJjOworCisJZG9tLT5ucmVnaW9ucyAtPSAxOworCWRvbS0+cmVnaW9uc1tp
XSA9IGRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25zXTsKKworCS8qIENsZWFyIHRoZSBzaGFyZWQg
ZmxhZyBvbiBhbnkgb3RoZXIgZG9tYWluIHRoYXQgaGFzIHRoaXMgUEEgcmVnaW9uIHNoYXJlZC4q
LworCWZvciAocyA9IDA7IHMgPCBtcHRfY3RybC5tYXhfZG9tYWluczsgcysrKSB7CisJCXBlZXIg
PSBzYmlfbXB0X2RvbWFpbl9nZXQocyk7CisJCWlmICghcGVlciB8fCBwZWVyID09IGRvbSkKKwkJ
CWNvbnRpbnVlOworCisJCWZvciAoaiA9IDA7IGogPCBwZWVyLT5ucmVnaW9uczsgaisrKQorCQkJ
aWYgKHBlZXItPnJlZ2lvbnNbal0ucGEgPT0gcGEgJiYgcGVlci0+cmVnaW9uc1tqXS5zaXplID09
IHNpemUpCisJCQkJcGVlci0+cmVnaW9uc1tqXS5zaGFyZWQgPSBmYWxzZTsKKwl9CisKKwlzYmlf
bXB0X2ZlbmNlX3NkaWQoc2RpZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERpc2FibGUg
U01NUFQgb24gaGFydAorICovCit2b2lkIHNiaV9tcHRfaGFydF9kZWFjdGl2YXRlKHZvaWQpCit7
CisJLyoKKwkgKiBtbXB0IGlzIGluYWN0aXZlIGluIE0tbW9kZSBwZXIgc3BlYywgc28gbm8gQ1NS
IHdyaXRlCisJICogaXMgbmVlZGVkLgorCSAqLworfQorCisvKgorICogRW5hYmxlIFNNTVBUIG9u
IGhhcnQKKyAqLworaW50IHNiaV9tcHRfaGFydF9hY3RpdmF0ZSh1MzIgc2RpZCkKK3sKKwl1MzIg
KnA7CisJdW5zaWduZWQgbG9uZyBwcG47CisJc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb207CisK
KwlpZiAoIW1wdF9jdHJsLnJlYWR5KQorCQlyZXR1cm4gU0JJX0VOT0RFVjsKKworCWRvbSA9IHNi
aV9tcHRfZG9tYWluX2dldChzZGlkKTsKKwlpZiAoIWRvbSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7
CisKKwlwcG4gPSBkb20tPnJvb3RfcGEgPj4gU0JJX01QVF9QQUdFX1NISUZUOworCWNzcl93cml0
ZShTQklfQ1NSX01NUFQsIGRvbS0+bW9kZS0+ZW5jb2RlX21tcHQocHBuLCBzZGlkKSk7CisJc2Jp
X21wdF9mZW5jZV9zZGlkKHNkaWQpOworCisJaWYgKG1wdF9jdHJsLnNkaWRfb2Zmc2V0KSB7CisJ
CXAgPSBzYmlfc2NyYXRjaF9vZmZzZXRfcHRyKHNiaV9zY3JhdGNoX3RoaXNoYXJ0X3B0cigpLCBt
cHRfY3RybC5zZGlkX29mZnNldCk7CisJCSpwID0gc2RpZDsKKwl9CisKKwlyZXR1cm4gMDsKK30K
KworLyoKKyAqIEFjdGl2YXRlIFNNTVBUIGZvciBhbGwgaGFydHMgd2hpY2ggYXJlIGFzc29jaWF0
ZWQgd2l0aCBhbiBsaW5rZWQKKyAqIFNCSSBkb21haW4gaW4gYW4gc3VwZXJ2aXNvciBkb21haW4u
CisgKi8KK2ludCBzYmlfbXB0X2hhcnRfYWN0aXZhdGVfZm9yX2RvbWFpbihzdHJ1Y3Qgc2JpX2Rv
bWFpbiAqc2JpX2RvbSkKK3sKKwl1MzIgczsKKworCWlmICghbXB0X2N0cmwucmVhZHkpCisJCXJl
dHVybiBTQklfRU5PREVWOworCWlmICghc2JpX2RvbSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisK
KwkvKgorCSAqIFNlYXJjaCBhbGwgc3VwZXJ2aXNvciBkb21haW5zIGZvciBhc3NvY2lhdGVkIHNi
aV9kb20gYW5kCisJICogYWN0aXZhdGUgaGFydHMgZm9yIHRoYXQgc3VwZXJ2aXNvciBkb21haW4K
KwkgKi8KKwlmb3IgKHMgPSAwOyBzIDwgbXB0X2N0cmwubWF4X2RvbWFpbnM7IHMrKykgeworCQlp
ZiAobXB0X2N0cmwuZG9tYWluc1tzXS52YWxpZCAmJiBtcHRfY3RybC5kb21haW5zW3NdLnNiaV9k
b20gPT0gc2JpX2RvbSkKKwkJCXJldHVybiBzYmlfbXB0X2hhcnRfYWN0aXZhdGUocyk7CisJfQor
CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzYmlfbXB0X3NkaWRfZnJlZSgpOiBSZXR1cm5zIFNE
SUQgdG8gdGhlIGZyZWUgcG9vbCBhZnRlciBkb21haW4gZGVzdHJveS4KKyAqLwordm9pZCBzYmlf
bXB0X3NkaWRfZnJlZSh1MzIgc2RpZCkKK3sKKwlpZiAoIW1wdF9jdHJsLnJlYWR5IHx8IHNkaWQg
Pj0gbXB0X2N0cmwubWF4X2RvbWFpbnMpCisJCXJldHVybjsKKwliaXRtYXBfc2V0KG1wdF9jdHJs
LnNkaWRfYml0bWFwLCAoaW50KXNkaWQsIDEpOworCW1wdF9jdHJsLmRvbWFpbnNbc2RpZF0udmFs
aWQgPSBmYWxzZTsKK30KKworLyoKKyAqIERlYnVnIGR1bXAKKyAqLwordm9pZCBzYmlfbXB0X2R1
bXAodm9pZCkKK3sKKwl1MzIgczsKKwl1bnNpZ25lZCBpbnQgcjsKKwljb25zdCBzdHJ1Y3Qgc2Jp
X21wdF9kb21haW4gKmQ7CisJY29uc3QgdW5zaWduZWQgbG9uZyBjYXRjaGFsbF9zaXplID0gfjBV
TCAmIH5TQklfTVBUX1BBR0VfTUFTSzsKKworCWlmICghbXB0X2N0cmwucmVhZHkpIHsKKwkJc2Jp
X3ByaW50Zigic2JpX21wdDogbm90IGluaXRpYWxpc2VkXG4iKTsKKwkJcmV0dXJuOworCX0KKwor
CXNiaV9wcmludGYoInNiaV9tcHQ6IG1vZGU9JS0xMHMgU0RJRExFTj0ldSBtYXhfZG9tYWlucz0l
dVxuIiwgbXB0X2N0cmwubW9kZS0+bmFtZSwKKwkJICAgbXB0X2N0cmwuc2RpZF9sZW4sIG1wdF9j
dHJsLm1heF9kb21haW5zKTsKKwlzYmlfcHJpbnRmKCJyb290X3NpemU9MHglbHggcm9vdF9hbGln
bj0weCVseFxuIiwKKwkJICAgbXB0X2N0cmwubW9kZS0+cm9vdF90YWJsZV9zaXplKCksIG1wdF9j
dHJsLm1vZGUtPnJvb3RfdGFibGVfYWxpZ24oKSk7CisJc2JpX3ByaW50ZigiZncgMHglMDE2bHgr
MHglbHggIHBvb2w9Z2xvYmFsIGhlYXBcbiIsCisJCSAgIG1wdF9jdHJsLmZ3X3BhLCBtcHRfY3Ry
bC5md19zaXplKTsKKwlmb3IgKHMgPSAwOyBzIDwgbXB0X2N0cmwubWF4X2RvbWFpbnM7IHMrKykg
eworCQlib29sIGhhc19iYXNlbGluZSA9IGZhbHNlOworCQl1OCAgIGJhc2VsaW5lX3h3ciA9IFNC
SV9NUFRfUEVSTV9OT05FOworCisJCWQgPSAmbXB0X2N0cmwuZG9tYWluc1tzXTsKKwkJaWYgKCFk
LT52YWxpZCkKKwkJCWNvbnRpbnVlOworCQlzYmlfcHJpbnRmKCJTRElEICUydSByb290PTB4JTAx
Nmx4IHJlZ2lvbnM9JXUgZG9tPSVzXG4iLAorCQkJICAgZC0+c2RpZCwgZC0+cm9vdF9wYSwgZC0+
bnJlZ2lvbnMsIGQtPnNiaV9kb20gPyBkLT5zYmlfZG9tLT5uYW1lIDogIihub25lKSIpOworCQlm
b3IgKHIgPSAwOyByIDwgZC0+bnJlZ2lvbnM7IHIrKykgeworCisJCQlpZiAoZC0+cmVnaW9uc1ty
XS5wYSA9PSAwICYmCisJCQkgICAgZC0+cmVnaW9uc1tyXS5zaXplID09IGNhdGNoYWxsX3NpemUp
IHsKKwkJCQloYXNfYmFzZWxpbmUgPSB0cnVlOworCQkJCWJhc2VsaW5lX3h3ciA9IGQtPnJlZ2lv
bnNbcl0ueHdyOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzYmlfcHJpbnRmKCJTLURvbWFp
biV1IFJlZ2lvbiUwMnUgICAgICAgICAgOiAweCUwMTZseCsweCUtMTZseDogeHdyPSV1ICglYyVj
JWMpJXMlc1xuIiwKKwkJCSAgIGQtPnNkaWQsIHIsIGQtPnJlZ2lvbnNbcl0ucGEsCisJCQkgICBk
LT5yZWdpb25zW3JdLnNpemUsCisJCQkgICBkLT5yZWdpb25zW3JdLnh3ciwKKwkJCSAgIChkLT5y
ZWdpb25zW3JdLnh3ciAmIFNCSV9NUFRfUEVSTV9SKSA/ICdSJyA6ICctJywKKwkJCSAgIChkLT5y
ZWdpb25zW3JdLnh3ciAmIFNCSV9NUFRfUEVSTV9XKSA/ICdXJyA6ICctJywKKwkJCSAgIChkLT5y
ZWdpb25zW3JdLnh3ciAmIFNCSV9NUFRfUEVSTV9YKSA/ICdYJyA6ICctJywKKwkJCSAgIGQtPnJl
Z2lvbnNbcl0ubG9ja2VkID8gIiBbTE9DS0VEXSIgOiAiIiwKKwkJCSAgIGQtPnJlZ2lvbnNbcl0u
c2hhcmVkID8gIiBbU0hBUkVEXSIgOiAiIik7CisJCX0KKworCQlpZiAoaGFzX2Jhc2VsaW5lKSB7
CisJCQlzYmlfcHJpbnRmKCJTLURvbWFpbiV1IERlZmF1bHQgICAgICAgICAgIDogJS0zN3M6IHh3
cj0ldSAoJWMlYyVjKSAgIFtiYXNlbGluZSwgb3ZlcmxheSBieSByZWdpb25zIGFib3ZlXVxuIiwK
KwkJCQkgICBkLT5zZGlkLCAiUmVzdCBvZiB0aGUgYWRkcmVzcyBzcGFjZSIsCisJCQkJICAgYmFz
ZWxpbmVfeHdyLAorCQkJCSAgIChiYXNlbGluZV94d3IgJiBTQklfTVBUX1BFUk1fUikgPyAnUicg
OiAnLScsCisJCQkJICAgKGJhc2VsaW5lX3h3ciAmIFNCSV9NUFRfUEVSTV9XKSA/ICdXJyA6ICct
JywKKwkJCQkgICAoYmFzZWxpbmVfeHdyICYgU0JJX01QVF9QRVJNX1gpID8gJ1gnIDogJy0nKTsK
KwkJfQorCQllbHNlIHsKKwkJCXNiaV9wcmludGYoIlMtRG9tYWluJXUgICAgICAgICAgIDogeHdy
PTAgKC0tLSkgICBbbm8gYmFzZWxpbmUg4oCUIHVubWFwcGVkIFBBcyBkZW5pZWRdXG4iLAorCQkJ
CSAgIGQtPnNkaWQpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL3NiaS9zYmlfbXB0X21v
ZGUuYyBiL2xpYi9zYmkvc2JpX21wdF9tb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAuLmY0MGI4Y2EwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3NiaS9zYmlfbXB0X21v
ZGUuYwpAQCAtMCwwICsxLDg5MSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0y
LUNsYXVzZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAyNiBRdWFsY29tbSBJbmMuCisgKgorICog
QXV0aG9yczogUmFodWwgUGF0aGFrIDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KKyAq
LworCisjaW5jbHVkZSA8c2JpL3NiaV9tcHQuaD4KKyNpbmNsdWRlIDxzYmkvc2JpX2Vycm9yLmg+
CisjaW5jbHVkZSA8c2JpL3NiaV9zdHJpbmcuaD4KKyNpbmNsdWRlIDxzYmkvc2JpX2NvbnNvbGUu
aD4KKworI2lmIF9fcmlzY3ZfeGxlbiA9PSA2NAorCisvKgorICogU21tcHQ0MyAg4oCUICA0My1i
aXQgc3VwZXJ2aXNvciBwaHlzaWNhbCBhZGRyZXNzIChTUEEpCisgKiArLS0tLS0tLS0tKy0tLS0t
LS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tKworICogfCAgcG5bMl0gIHwgIHBuWzFd
ICB8ICBwblswXSAgfCAgICBwaSAgIHwgb2Zmc2V0IHwKKyAqIHwgWzQyOjM0XSB8IFszMzoyNV0g
fCBbMjQ6MTZdIHwgWzE1OjEyXSB8IFsxMTowXSB8CisgKiB8ICAgIDliICAgfCAgICA5YiAgIHwg
ICAgOWIgICB8ICAgIDRiICAgfCAgMTJiICAgfAorICogKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0t
LS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSsKKyAqCisgKiBTbW1wdDUyICDigJQgIDUyLWJpdCBz
dXBlcnZpc29yIHBoeXNpY2FsIGFkZHJlc3MgKFNQQSkKKyAqICstLS0tLS0tLS0rLS0tLS0tLS0t
Ky0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tKworICogfCAgcG5bM10gIHwg
IHBuWzJdICB8ICBwblsxXSAgfCAgcG5bMF0gIHwgICAgcGkgICB8IG9mZnNldCB8CisgKiB8IFs1
MTo0M10gfCBbNDI6MzRdIHwgWzMzOjI1XSB8IFsyNDoxNl0gfCBbMTU6MTJdIHwgWzExOjBdIHwK
KyAqIHwgICAgOWIgICB8ICAgIDliICAgfCAgICA5YiAgIHwgICAgOWIgICB8ICAgIDRiICAgfCAg
MTJiICAgfAorICogKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0t
LS0tLS0rLS0tLS0tLS0rCisgKgorICogU21tcHQ2NCAg4oCUICA2NC1iaXQgc3VwZXJ2aXNvciBw
aHlzaWNhbCBhZGRyZXNzIChTUEEpCisgKiArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0r
LS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rCisgKiB8ICBwbls0XSAgfCAg
cG5bM10gIHwgIHBuWzJdICB8ICBwblsxXSAgfCAgcG5bMF0gIHwgICAgcGkgICB8IG9mZnNldCB8
CisgKiB8IFs2Mzo1Ml0gfCBbNTE6NDNdIHwgWzQyOjM0XSB8IFszMzoyNV0gfCBbMjQ6MTZdIHwg
WzE1OjEyXSB8IFsxMTowXSB8CisgKiB8ICAgMTJiICAgfCAgICA5YiAgIHwgICAgOWIgICB8ICAg
IDliICAgfCAgICA5YiAgIHwgICAgNGIgICB8ICAxMmIgICB8CisgKiArLS0tLS0tLS0tKy0tLS0t
LS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rCisg
KgorICovCisKKy8qIElubnRlciBlbnRyaWVzIGFyZSBNUFRFcyBub3QgaW4gcm9vdCBNUFQgcGFn
ZSAqLworI2RlZmluZSBSVjY0X0lOTkVSX0VOVFJJRVMJCTUxMlUKKyNkZWZpbmUgUlY2NF9NUFRF
X1NJWkUJCQk4VUwKKyNkZWZpbmUgUlY2NF9UQUJMRV9TSVpFCQkJKFJWNjRfSU5ORVJfRU5UUklF
UyAqIFJWNjRfTVBURV9TSVpFKQorCisvKiBTbW1wdDY0IHJvb3Q6IDQwOTYgZW50cmllcyDDlyA4
QiA9IDMyS0IsIDMyS0IgYWxpZ25lZCAqLworI2RlZmluZSBSVjY0X1JPT1RfU01NUFQ2NF9FTlRS
SUVTCTQwOTZVCisjZGVmaW5lIFJWNjRfUk9PVF9TTU1QVDY0X1NJWkUJCShSVjY0X1JPT1RfU01N
UFQ2NF9FTlRSSUVTICogUlY2NF9NUFRFX1NJWkUpCisKKyNkZWZpbmUgUlY2NF9OVU1QR0lOUkFO
R0UJCTRVCisjZGVmaW5lIFJWNjRfUEFHRVNfUEVSX01QVEUJCSgxVSA8PCBSVjY0X05VTVBHSU5S
QU5HRSkKKyNkZWZpbmUgUlY2NF9QQUdFU19QRVJfTVBURV9NQVNLCShSVjY0X1BBR0VTX1BFUl9N
UFRFIC0gMVUpCisjZGVmaW5lIFJWNjRfSU5ORVJfUE5fQklUUwkJOVUKKworLyogQnl0ZXMgY292
ZXJlZCBieSBvbmUgY29tcGxldGUgbGVhZiB0YWJsZSA9IHBhZ2VzX3Blcl9sZWFmIMOXIFBBR0Vf
U0laRSAqLworI2RlZmluZSBSVjY0X0xFQUZfUkFOR0UJCQkoUlY2NF9QQUdFU19QRVJfTVBURSAq
IFNCSV9NUFRfUEFHRV9TSVpFKQorCisvKgorICogTkFQT1QgRz00IGZvciBTbW1wdDQzLCBTbW1w
dDUyIGFuZCBTbW1wdDY0CisgKgorICogRz00IG1lYW5zIDJeKEcrMSk9MzIgY29udGlndW91cyBs
ZWFmIG1wdGUgd2hpY2ggZm9ybSBhIE5BUE9UIGdyb3VwLgorICogRWFjaCBSVjY0IGxlYWYgTVBU
RSBjb3ZlcnMgNjRLaUIgc28gb25lIE5BUE9UIGdyb3VwIGNvdmVycyAyTWlCLgorICoKKyAqIEFs
bCBvdGhlciBHIHZhbHVlcyBhcGFydCBmcm9tIDQgYXJlIHJlc2VydmVkLgorICovCisjZGVmaW5l
IFJWNjRfTkFQT1RfRwkJCTRVCisjZGVmaW5lIFJWNjRfTkFQT1RfR19TSElGVAkJMTJVCisjZGVm
aW5lIFJWNjRfTkFQT1RfTVBURV9DT1VOVAkJKDFVIDw8IChSVjY0X05BUE9UX0cgKyAxKSkKKyNk
ZWZpbmUgUlY2NF9OQVBPVF9TSVpFCQkJKCh1bnNpZ25lZCBsb25nKVJWNjRfTkFQT1RfTVBURV9D
T1VOVCAqIFJWNjRfTEVBRl9SQU5HRSkKKyNkZWZpbmUgUlY2NF9OQVBPVF9QTjBfQUxJR04JCVJW
NjRfTkFQT1RfTVBURV9DT1VOVAorCisvKgorICogU3dpdGggdG8gZGlzYWJsZSBOQVBPVCBjb21w
YWN0aW9uIG9mIE1QVEUgZW50cmllcyB3aGlsZSB3cml0aW5nLgorICovCisjZGVmaW5lIFJWNjRf
TkFQT1RfRElTQUJMRQkwCisKKy8qCisgKiBTdXBlcnZpc29yIFBoeXN1Y2FsIGFkZHJlc3MgZmll
bGRzIGV4dHJhY3Rpb24KKyAqLworCisvKgorICogcnY2NF90YWJsZV9pZHgoKSDigJQgZXh0cmFj
dCBwbltsZXZlbF0gZnJvbSBhIFNQQS4KKyAqLworc3RhdGljIGlubGluZSB1MzIgcnY2NF90YWJs
ZV9pZHgodW5zaWduZWQgbG9uZyBwYSwgdTMyIGxldmVsLAorCQkJICBjb25zdCBzdHJ1Y3Qgc2Jp
X21wdF9tb2RlICpzY2gpCit7CisJdTMyIHNoaWZ0ID0gMTYgKyBsZXZlbCAqIDk7CisJdTMyIG1h
c2sgPSAoc2NoLT5tb2RlX3ZhbCA9PSBTQklfTU1QVF9NT0RFX1NNTVBUNjQgJiYgbGV2ZWwgPT0g
NCkgPyAweEZGRiA6IDB4MUZGOworCisJcmV0dXJuICgocGEgPj4gc2hpZnQpICYgbWFzayk7Cit9
CisKKy8qCisgKiBydjY0X3R1cGxlX2lkeF9zaGlmdCgpIOKAlCBYV1IgdHVwbGUgaW5kZXggc2hp
ZnQgYXQgbGV2ZWwgaS4KKyAqLworc3RhdGljIGlubGluZSB1MzIgcnY2NF90dXBsZV9pZHhfc2hp
ZnQodTMyIGxldmVsKQoreworCXJldHVybiAoU0JJX01QVF9QQUdFX1NISUZUICsgbGV2ZWwgKiBS
VjY0X0lOTkVSX1BOX0JJVFMpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBydjY0X3R1cGxlX2lk
eCh1bnNpZ25lZCBsb25nIHBhLCB1MzIgbGV2ZWwpCit7CisJcmV0dXJuICgocGEgPj4gcnY2NF90
dXBsZV9pZHhfc2hpZnQobGV2ZWwpKSAmIFJWNjRfUEFHRVNfUEVSX01QVEVfTUFTSyk7Cit9CisK
Ky8qCisgKiBydjY0X21wdGVfcmFuZ2UoKSDigJQgYnl0ZXMgY292ZXJlZCBieSBvbmUgTVBURSBh
dCBsZXZlbCBMLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcnY2NF9tcHRlX3Jh
bmdlKHUzMiBsZXZlbCkKK3sKKwlyZXR1cm4gUlY2NF9MRUFGX1JBTkdFIDw8IChsZXZlbCAqIFJW
NjRfSU5ORVJfUE5fQklUUyk7Cit9CisKKy8qCisgKiBSVjY0IE1QVEUgUmVhZC9Xcml0ZSBmdW5j
dGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIHU2NCBydjY0X3JlYWRfbXB0ZSh1bnNpZ25lZCBs
b25nIHBhKQoreworCXJldHVybiAqKHZvbGF0aWxlIHU2NCAqKXBhOworfQorCitzdGF0aWMgaW5s
aW5lIHZvaWQgcnY2NF93cml0ZV9tcHRlKHVuc2lnbmVkIGxvbmcgcGEsIHU2NCB2KQoreworCSoo
dm9sYXRpbGUgdTY0ICopcGEgPSB2OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcg
cnY2NF9tcHRlX3BhKHVuc2lnbmVkIGxvbmcgdGFibGVfcGEsIHUzMiBpZHgpCit7CisJcmV0dXJu
ICh0YWJsZV9wYSArIGlkeCAqIFJWNjRfTVBURV9TSVpFKTsKK30KKworc3RhdGljIGlubGluZSB1
bnNpZ25lZCBsb25nIHJ2NjRfbmV4dF90YWJsZV9wYSh1NjQgbXB0ZSkKK3sKKwlyZXR1cm4gKHVu
c2lnbmVkIGxvbmcpKCh1NjQpKG1wdGUgPj4gU0JJX01QVEVfUFBOX1NISUZUKSA8PCBTQklfTVBU
X1BBR0VfU0hJRlQpOworfQorCisvKgorICogR2VuZXJhdGUgTmFwb3QgTGVhZiBNUFRFCisgKgor
ICogQ29uc3RydWN0cyBvbmUgTVBURSB2YWx1ZSB1c2VkIGZvciBhbGwKKyAqIFJWNjRfTkFQT1Rf
TVBURV9DT1VOVCBlbnRyaWVzIGluIGEgTkFQT1QgZ3JvdXAuCisgKgorICogQWxsIE1QVEVzIGlu
IHRoZSBncm91cCBhcmUgaWRlbnRpY2FsCisgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IHJ2NjRfbmFw
b3RfbGVhZl9tcHRlKHU4IHh3cikKK3sKKwl1NjQgbXB0ZSA9IFNCSV9NUFRFX1YgfCBTQklfTVBU
RV9MIHwgU0JJX01QVEVfTjsKKworCW1wdGUgPSBzYmlfbXB0ZV9sZWFmX3NldF94d3IobXB0ZSwg
MCwgeHdyKTsKKwltcHRlIHw9ICgodTY0KVJWNjRfTkFQT1RfRyA8PCBSVjY0X05BUE9UX0dfU0hJ
RlQpOworCisJcmV0dXJuIG1wdGU7Cit9CisKKy8qCisgKiBydjY0X25hcG90X2xlYWZfeHdyKCkg
4oCUIHJlY292ZXIgdGhlIHVuaWZvcm0gWFdSIGZyb20gYSBOQVBPVCBsZWFmLgorICovCitzdGF0
aWMgaW5saW5lIHU4IHJ2NjRfbmFwb3RfbGVhZl94d3IodTY0IG1wdGUpCit7CisJcmV0dXJuICgo
bXB0ZSA+PiBTQklfTVBURV9YV1JfQkFTRSkgJiBTQklfTVBURV9YV1JfTUFTSyk7Cit9CisKKy8q
CisgKiBydjY0X25hcG90X2RlbW90ZSgpIOKAlCBDb252ZXJ0IGEgTmFwb3QgTVBURSBncm91cCBp
bnRvIFJWNjRfTkFQT1RfTVBURV9DT1VOVAorICogbm9ybWFsKE5vbi1OYXBvdCkgTVBURSBjYXJy
eWluZyB0aGUgU0FNRSBwZXJtaXNzaW9uLgorICoKKyAqIGxlYWZfbXB0ZV9wYSBpcyBhbnkgbGVh
ZiBtcHRlIHBhIGZyb20gdGhlIE5hcG90IGdyb3VwCisgKi8KK3N0YXRpYyB2b2lkIHJ2NjRfbmFw
b3RfZGVtb3RlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgICAgdW5zaWduZWQg
bG9uZyBsZWFmX21wdGVfcGEsIHVuc2lnbmVkIGxvbmcgcGEpCit7CisJdTggeHdyOworCXUzMiBw
bjAsIHBnLCBpOworCXU2NCBsZWFmOworCXVuc2lnbmVkIGxvbmcgZ3JwX2Jhc2U7CisKKwl4d3Ig
PSBydjY0X25hcG90X2xlYWZfeHdyKHJ2NjRfcmVhZF9tcHRlKGxlYWZfbXB0ZV9wYSkpOworCXBu
MCA9IHJ2NjRfdGFibGVfaWR4KHBhLCAwLCBkb20tPm1vZGUpOworCWdycF9iYXNlID0gbGVhZl9t
cHRlX3BhIC0gKHBuMCAmIChSVjY0X05BUE9UX01QVEVfQ09VTlQgLSAxKSkgKiBSVjY0X01QVEVf
U0laRTsKKwlsZWFmID0gU0JJX01QVEVfViB8IFNCSV9NUFRFX0w7CisKKwlmb3IgKHBnID0gMDsg
cGcgPCBSVjY0X1BBR0VTX1BFUl9NUFRFOyBwZysrKQorCQlsZWFmID0gc2JpX21wdGVfbGVhZl9z
ZXRfeHdyKGxlYWYsIHBnLCB4d3IpOworCisJZm9yIChpID0gMDsgaSA8IFJWNjRfTkFQT1RfTVBU
RV9DT1VOVDsgaSsrKQorCQlydjY0X3dyaXRlX21wdGUoZ3JwX2Jhc2UgKyBpICogUlY2NF9NUFRF
X1NJWkUsIGxlYWYpOworfQorCisvKgorICogTVBUIHRhYmxlIGJlc3QtbGV2ZWwgc2VsZWN0aW9u
CisgKgorICogUmV0dXJucyB0aGUgaGlnaGVzdCBsZXZlbCBhdCB3aGljaCB0aGUgcmFuZ2UgW3Bh
LCBwYStzaXplXSBjYW4gYmUKKyAqIGNvdmVyZWQgYnkgYSBzaW5nbGUgbGVhZiBNUFRFLiBMZXZl
bCAwIGlzIGFsd2F5cyB2YWxpZCBiZWNhdXNlIHRoYXRzCisgKiB0aGUgbGFzdCByZXNvcnQuCisg
Ki8KK3N0YXRpYyB1MzIgcnY2NF9iZXN0X2xldmVsKHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVk
IGxvbmcgc2l6ZSwKKwkJCSAgIHUzMiB0b3BfbGV2ZWwpCit7CisJdTMyIGx2bDsKKwl1bnNpZ25l
ZCBsb25nIHJhbmdlOworCisJZm9yIChsdmwgPSB0b3BfbGV2ZWw7IGx2bCA+PSAxOyBsdmwtLSkg
eworCQlyYW5nZSA9IHJ2NjRfbXB0ZV9yYW5nZShsdmwpOworCisJCWlmIChzaXplID49IHJhbmdl
ICYmIChwYSAmIChyYW5nZSAtIDEpKSA9PSAwKQorCQkJcmV0dXJuIGx2bDsKKwl9CisJcmV0dXJu
IDA7Cit9CisKKy8qCisgKiBHZW5lcmljIE4tbGV2ZWwgd2FsayB3aXRoIGxhenkgdGFibGUgYWxs
b2NhdGlvbgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydjY0X3NwbGl0X2xlYWYodW5zaWdu
ZWQgbG9uZyBwYXJlbnRfZXApCit7CisJdTY0IHBhcmVudCA9IHJ2NjRfcmVhZF9tcHRlKHBhcmVu
dF9lcCk7CisJdW5zaWduZWQgbG9uZyBzdWI7CisJdTMyIGosIHBnLCBzaDsKKwl1OCB4d3I7CisJ
dTY0IGNoaWxkOworCisJc3ViID0gc2JpX21wdF9wb29sX2FsbG9jKFJWNjRfVEFCTEVfU0laRSwg
U0JJX01QVF9QQUdFX1NJWkUpOworCWlmICghc3ViKQorCQlyZXR1cm4gMDsKKworCWZvciAoaiA9
IDA7IGogPCBSVjY0X0lOTkVSX0VOVFJJRVM7IGorKykgeworCQlzaCA9IHNiaV9tcHRlX3h3cl9z
aGlmdChqID4+IDUpOworCQl4d3IgPSAoKCh1bnNpZ25lZCBsb25nKXBhcmVudCA+PiBzaCkgJiBT
QklfTVBURV9YV1JfTUFTSyk7CisJCWNoaWxkID0gU0JJX01QVEVfViB8IFNCSV9NUFRFX0w7IC8q
IE49MCB1bmlmb3JtIGxlYWYgKi8KKworCQlmb3IgKHBnID0gMDsgcGcgPCBSVjY0X1BBR0VTX1BF
Ul9NUFRFOyBwZysrKQorCQkJY2hpbGQgPSBzYmlfbXB0ZV9sZWFmX3NldF94d3IoY2hpbGQsIHBn
LCB4d3IpOworCisJCXJ2NjRfd3JpdGVfbXB0ZShzdWIgKyBqICogUlY2NF9NUFRFX1NJWkUsIGNo
aWxkKTsKKwl9CisKKwkvKiBwYXJlbnQgbGVhZiAtPiBub24tbGVhZiBwb2ludGVyIHRvIE1QVCBz
dWIgdGFibGUuICovCisJcnY2NF93cml0ZV9tcHRlKHBhcmVudF9lcCwgc2JpX21wdGVfbm9ubGVh
ZihzdWIpKTsKKwlyZXR1cm4gc3ViOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydjY0X3dh
bGtfYWxsb2Moc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sCisJCQkJICAgICB1bnNpZ25lZCBs
b25nIHBhLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgICAgdTMyICpvdXRf
bGV2ZWwsCisJCQkJICAgICB1MzIgdG9wX2xldmVsKQoreworCXUzMiBsdmwsIGlkeDsKKwl1NjQg
bXB0ZTsKKwl1bnNpZ25lZCBsb25nIGVwLCBzdWIsIG5ld19wYTsKKwljb25zdCBzdHJ1Y3Qgc2Jp
X21wdF9tb2RlICpzY2ggPSBkb20tPm1vZGU7CisJdW5zaWduZWQgbG9uZyB0YWJsZV9wYSA9IGRv
bS0+cm9vdF9wYTsKKwl1MzIgYmVzdF9sdmwgPSBydjY0X2Jlc3RfbGV2ZWwocGEsIHNpemUsIHRv
cF9sZXZlbCk7CisKKworCWZvciAobHZsID0gdG9wX2xldmVsOyBsdmwgPj0gMTsgbHZsLS0pIHsK
KwkJaWR4ID0gcnY2NF90YWJsZV9pZHgocGEsIGx2bCwgc2NoKTsKKwkJZXAgPSBydjY0X21wdGVf
cGEodGFibGVfcGEsIGlkeCk7CisJCW1wdGUgPSBydjY0X3JlYWRfbXB0ZShlcCk7CisKKwkJaWYg
KG1wdGUgJiBTQklfTVBURV9MKSB7CisJCQlpZiAobHZsID4gYmVzdF9sdmwpIHsKKwkJCQlzdWIg
PSBydjY0X3NwbGl0X2xlYWYoZXApOworCQkJCWlmICghc3ViKQorCQkJCQlyZXR1cm4gMDsKKwkJ
CQl0YWJsZV9wYSA9IHN1YjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSpvdXRfbGV2ZWwgPSBs
dmw7CisJCQlyZXR1cm4gZXA7CisJCX0KKworCQlpZiAoIShtcHRlICYgU0JJX01QVEVfVikpIHsK
KwkJCWlmIChsdmwgPD0gYmVzdF9sdmwpIHsKKwkJCQkqb3V0X2xldmVsID0gbHZsOworCQkJCXJl
dHVybiBlcDsKKwkJCX0KKwkJCS8qIEFsbG9jYXRlIGlubmVyIHRhYmxlIChhbHdheXMgNEtpQiwg
YWxsIGxldmVscywgYWxsIG1vZGVzKSAqLworCQkJbmV3X3BhID0gc2JpX21wdF9wb29sX2FsbG9j
KFJWNjRfVEFCTEVfU0laRSwKKwkJCQkJCSAgICBTQklfTVBUX1BBR0VfU0laRSk7CisJCQlpZiAo
IW5ld19wYSkKKwkJCQlyZXR1cm4gMDsKKwkJCXJ2NjRfd3JpdGVfbXB0ZShlcCwgKHU2NClzYmlf
bXB0ZV9ub25sZWFmKG5ld19wYSkpOworCQkJdGFibGVfcGEgPSBuZXdfcGE7CisJCX0KKwkJZWxz
ZSB7CisJCQl0YWJsZV9wYSA9IHJ2NjRfbmV4dF90YWJsZV9wYShtcHRlKTsKKwkJfQorCX0KKwor
CSpvdXRfbGV2ZWwgPSAwOworCXJldHVybiBydjY0X21wdGVfcGEodGFibGVfcGEsIHJ2NjRfdGFi
bGVfaWR4KHBhLCAwLCBzY2gpKTsKK30KKworLyoKKyAqIEdlbmVyaWMgbWFwX3JhbmdlIOKAlCBz
aGFyZWQgYnkgU21tcHQ0MywgU21tcHQ1MiwgU21tcHQ2NAorICoKKyAqIE1hcHMgYSByYW5nZSBb
cGEsIHBhK3NpemVdIGluIHRoZSBNUFQgdGFibGUKKyAqLworc3RhdGljIGludCBfX3J2NjRfbWFw
X3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgIHVuc2lnbmVkIGxvbmcg
cGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgICB1OCB4d3IsIHUzMiB0b3BfbGV2ZWwpCit7
CisJdW5zaWduZWQgbG9uZyBjdXIgPSBwYTsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IHBhICsgc2l6
ZTsKKwl1bnNpZ25lZCBsb25nIGxlYWZfbXB0ZV9wYSwgbXB0ZV9yYW5nZSwgbXB0ZV9iYXNlLCBt
cHRlX2VuZCwgYmF0Y2hfZW5kOworCXUzMiBsZXZlbCwgcG4wLCBpLCBwZ19maXJzdCwgcGdfbGFz
dCwgcGc7CisJdTY0IG5hcG90LCBtcHRlOworCisJd2hpbGUgKGN1ciA8IGVuZCkgeworCQkvKgor
CQkgKiBDaGVjayBpZiB0aGUgcmVnaW9uIHF1YWxpZmllcyBmb3IgTkFQT1QgcmFuZ2UgYW5kIHRo
ZQorCQkgKiByZWdpb24gaXMgY29udGFpbmVkCisJCSAqLworCQlpZiAoKGN1ciAmIChSVjY0X05B
UE9UX1NJWkUgLSAxKSkgPT0gMCAmJgorCQkJCWN1ciArIFJWNjRfTkFQT1RfU0laRSA+IGN1ciAm
JgorCQkJCWN1ciArIFJWNjRfTkFQT1RfU0laRSA8PSBlbmQpIHsKKwkJCWxlYWZfbXB0ZV9wYSA9
IHJ2NjRfd2Fsa19hbGxvYyhkb20sIGN1ciwgZW5kIC0gY3VyLCAmbGV2ZWwsIHRvcF9sZXZlbCk7
CisJCQlpZiAoIWxlYWZfbXB0ZV9wYSkKKwkJCQlyZXR1cm4gU0JJX0VOT01FTTsKKworCQkJcG4w
ID0gcnY2NF90YWJsZV9pZHgoY3VyLCAwLCBkb20tPm1vZGUpOworCisJCQlpZiAoIVJWNjRfTkFQ
T1RfRElTQUJMRSAmJiBsZXZlbCA9PSAwICYmIChwbjAgJiAoUlY2NF9OQVBPVF9QTjBfQUxJR04g
LSAxKSkgPT0gMCkgeworCQkJCW5hcG90ID0gcnY2NF9uYXBvdF9sZWFmX21wdGUoeHdyKTsKKwor
CQkJCWZvciAoaSA9IDA7IGkgPCBSVjY0X05BUE9UX01QVEVfQ09VTlQ7IGkrKykKKwkJCQkJcnY2
NF93cml0ZV9tcHRlKGxlYWZfbXB0ZV9wYSArIGkgKiBSVjY0X01QVEVfU0laRSwgbmFwb3QpOwor
CisJCQkJY3VyICs9IFJWNjRfTkFQT1RfU0laRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQor
CQllbHNlIHsKKwkJCWxlYWZfbXB0ZV9wYSA9IHJ2NjRfd2Fsa19hbGxvYyhkb20sIGN1ciwgZW5k
IC0gY3VyLCAmbGV2ZWwsIHRvcF9sZXZlbCk7CisJCQlpZiAoIWxlYWZfbXB0ZV9wYSkKKwkJCQly
ZXR1cm4gU0JJX0VOT01FTTsKKwkJfQorCisJCS8qIE5vcm1hbCBwYXRoICovCisJCW1wdGVfcmFu
Z2UgPSBydjY0X21wdGVfcmFuZ2UobGV2ZWwpOworCQlwZ19maXJzdCA9IHJ2NjRfdHVwbGVfaWR4
KGN1ciwgbGV2ZWwpOworCQltcHRlX2Jhc2UgPSBjdXIgJiB+KG1wdGVfcmFuZ2UgLSAxKTsKKwor
CQltcHRlX2VuZCA9IG1wdGVfYmFzZSArIG1wdGVfcmFuZ2U7CisJCWlmIChtcHRlX2VuZCA8IG1w
dGVfYmFzZSkKKwkJCW1wdGVfZW5kID0gfjBVTDsKKworCQliYXRjaF9lbmQgPSAoZW5kIDwgbXB0
ZV9lbmQpID8gZW5kIDogbXB0ZV9lbmQ7CisJCXBnX2xhc3QgPSBydjY0X3R1cGxlX2lkeChiYXRj
aF9lbmQgLSBTQklfTVBUX1BBR0VfU0laRSwgbGV2ZWwpOworCisJCS8qCisJCSogSWYgdGhpcyBs
ZXZlbC0wIE1QVEUgaXMgYSBOYXBvdCBtZW1iZXIsIGV4cGFuZCB0aGUKKwkJKiB3aG9sZSBuYXR1
cmFsbHktYWxpZ25lZCBncm91cCB0byBwbGFpbiBsZWF2ZXMgYW5kIHdyaXRlIHNhbWUKKwkJKiBw
ZXJtaXNzaW9ucyB4d3IKKwkJKi8KKwkJbXB0ZSA9IHJ2NjRfcmVhZF9tcHRlKGxlYWZfbXB0ZV9w
YSk7CisJCWlmIChsZXZlbCA9PSAwICYmIChtcHRlICYgKHU2NClTQklfTVBURV9OKSkgeworCQkJ
cnY2NF9uYXBvdF9kZW1vdGUoZG9tLCBsZWFmX21wdGVfcGEsIGN1cik7CisJCQlzYmlfbXB0X2Zl
bmNlX3NkaWQoZG9tLT5zZGlkKTsKKwkJCW1wdGUgPSBydjY0X3JlYWRfbXB0ZShsZWFmX21wdGVf
cGEpOworCQl9CisJCWlmICghKG1wdGUgJiAodTY0KShTQklfTVBURV9WIHwgU0JJX01QVEVfTCkp
KQorCQkJbXB0ZSA9ICh1NjQpKFNCSV9NUFRFX1YgfCBTQklfTVBURV9MKTsKKworCQlmb3IgKHBn
ID0gcGdfZmlyc3Q7IHBnIDw9IHBnX2xhc3Q7IHBnKyspCisJCQltcHRlID0gc2JpX21wdGVfbGVh
Zl9zZXRfeHdyKG1wdGUsIHBnLCB4d3IpOworCisJCXJ2NjRfd3JpdGVfbXB0ZShsZWFmX21wdGVf
cGEsIG1wdGUpOworCisJCWN1ciA9IGJhdGNoX2VuZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor
LyoKKyAqIFBlci1tb2RlIG1tcHQgZW5jb2RpbmcKKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9u
ZyBzbW1wdDQzX2VuY29kZV9tbXB0KHVuc2lnbmVkIGxvbmcgcHBuLCB1MzIgc2RpZCkKK3sKKwly
ZXR1cm4gc2JpX21tcHRfZW5jb2RlKFNCSV9NTVBUX01PREVfU01NUFQ0Mywgc2RpZCwgcHBuKTsK
K30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQ1Ml9lbmNvZGVfbW1wdCh1bnNpZ25lZCBs
b25nIHBwbiwgdTMyIHNkaWQpCit7CisJcmV0dXJuIHNiaV9tbXB0X2VuY29kZShTQklfTU1QVF9N
T0RFX1NNTVBUNTIsIHNkaWQsIHBwbik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNtbXB0
NjRfZW5jb2RlX21tcHQodW5zaWduZWQgbG9uZyBwcG4sIHUzMiBzZGlkKQoreworCXJldHVybiBz
YmlfbW1wdF9lbmNvZGUoU0JJX01NUFRfTU9ERV9TTU1QVDY0LCBzZGlkLCBwcG4pOworfQorCitz
dGF0aWMgdW5zaWduZWQgbG9uZyBzbW1wdDQzX3Jvb3RfdGFibGVfc2l6ZSh2b2lkKQoreworCXJl
dHVybiBSVjY0X1RBQkxFX1NJWkU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNtbXB0NDNf
cm9vdF90YWJsZV9hbGlnbih2b2lkKQoreworCXJldHVybiBTQklfTVBUX1BBR0VfU0laRTsKK30K
Kworc3RhdGljIGJvb2wgc21tcHQ0M19wYV9pbl9yYW5nZSh1bnNpZ25lZCBsb25nIHBhLCB1bnNp
Z25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBwYV9tYXggPSAxVUwgPDwgNDM7CisK
KwlyZXR1cm4gKHBhIDwgcGFfbWF4ICYmIHNpemUgPD0gcGFfbWF4IC0gcGEpOworfQorCitzdGF0
aWMgdW5zaWduZWQgbG9uZyBzbW1wdDUyX3Jvb3RfdGFibGVfc2l6ZSh2b2lkKQoreworCXJldHVy
biBSVjY0X1RBQkxFX1NJWkU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNtbXB0NTJfcm9v
dF90YWJsZV9hbGlnbih2b2lkKQoreworCXJldHVybiBTQklfTVBUX1BBR0VfU0laRTsKK30KKwor
c3RhdGljIGJvb2wgc21tcHQ1Ml9wYV9pbl9yYW5nZSh1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25l
ZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBwYV9tYXggPSAxVUwgPDwgNTI7CisKKwly
ZXR1cm4gKHBhIDwgcGFfbWF4ICYmIHNpemUgPD0gcGFfbWF4IC0gcGEpOworfQorCitzdGF0aWMg
dW5zaWduZWQgbG9uZyBzbW1wdDY0X3Jvb3RfdGFibGVfc2l6ZSh2b2lkKQoreworCXJldHVybiBS
VjY0X1JPT1RfU01NUFQ2NF9TSVpFOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbW1wdDY0
X3Jvb3RfdGFibGVfYWxpZ24odm9pZCkKK3sKKwlyZXR1cm4gUlY2NF9ST09UX1NNTVBUNjRfU0la
RTsKK30KKworc3RhdGljIGJvb2wgc21tcHQ2NF9wYV9pbl9yYW5nZSh1bnNpZ25lZCBsb25nIHBh
LAorCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwkvKgorCSAqIFNtbXB0NjQgY292ZXJzIHRo
ZSBmdWxsIDY0LWJpdCBQQSBzcGFjZS4KKwkgKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAq
IFBlci1tb2RlIG1hcF9yYW5nZSB3cmFwcGVycworICoKKyAqIFNtbXB0NDM6CisgKiBSb290IGxl
dmVsIDIsIDktYml0LCAgNTEyIGVudHJpZXMsICA0S2lCIHJvb3QgTVBUIHNpemUKKyAqCisgKiBT
bW1wdDUyOgorICogUm9vdCBsZXZlbCAzLCA5LWJpdCwgIDUxMiBlbnRyaWVzLCAgNEtpQiByb290
IE1QVCBzaXplCisgKgorICogU21tcHQ2NDoKKyAqIFJvb3QgbGV2ZWwgNCwgMTItYml0LCA0MDk2
IGVudHJpZXMsIDMyS2lCIHJvb3QgTVBUIHNpemUKKyAqLworCitzdGF0aWMgaW50IHNtbXB0NDNf
bWFwX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgICB1bnNpZ25lZCBs
b25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUsIHU4IHh3cikKK3sKKwlyZXR1cm4gX19ydjY0X21h
cF9yYW5nZShkb20sIHBhLCBzaXplLCB4d3IsIDIpOworfQorCitzdGF0aWMgaW50IHNtbXB0NTJf
bWFwX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgICB1bnNpZ25lZCBs
b25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUsIHU4IHh3cikKK3sKKwlyZXR1cm4gX19ydjY0X21h
cF9yYW5nZShkb20sIHBhLCBzaXplLCB4d3IsIDMpOworfQorCitzdGF0aWMgaW50IHNtbXB0NjRf
bWFwX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgICB1bnNpZ25lZCBs
b25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUsIHU4IHh3cikKK3sKKwlyZXR1cm4gX19ydjY0X21h
cF9yYW5nZShkb20sIHBhLCBzaXplLCB4d3IsIDQpOworfQorCisvKgorICogX19ydjY0X21hcF9m
dWxsX3JhbmdlKCkg4oCUIFdyaXRlIGV2ZXJ5IE1QVEUgYXQgUm9vdCBNUFQKKyAqCisgKiBXcml0
ZXMgeHdyIGludG8gZXZlcnkgcm9vdCB0YWJsZSBNUFRFIGRpcmVjdGx5IGFzIGEgbGVhZgorICog
c3VwZXJwYWdlIGNvdmVyaW5nIHRoZSBtb2RlIGVudGlyZSBhZGRyZXNzYWJsZSBQQSByYW5nZS4K
KyAqIE5vIGludGVybWlkaWF0ZSBNUFQgdGFibGVzIGFsbG9jYXRlZCBqdXN0IGFsbCBsZWFmIE1Q
VEVzIGF0CisgKiByb290IGxldmVsLgorICovCisKK3N0YXRpYyBpbnQgX19ydjY0X21hcF9mdWxs
X3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3IsCisJCQkJIHVuc2lnbmVk
IGxvbmcgcm9vdF9lbnRyaWVzKQoreworCXUzMiBwZzsKKwl1bnNpZ25lZCBsb25nIGk7CisJdTY0
IG1wdGUgPSBTQklfTVBURV9WIHwgU0JJX01QVEVfTDsKKworCWZvciAocGcgPSAwOyBwZyA8IFJW
NjRfUEFHRVNfUEVSX01QVEU7IHBnKyspCisJCW1wdGUgPSBzYmlfbXB0ZV9sZWFmX3NldF94d3Io
bXB0ZSwgcGcsIHh3cik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcm9vdF9lbnRyaWVzOyBpKyspCisJ
CXJ2NjRfd3JpdGVfbXB0ZShydjY0X21wdGVfcGEoZG9tLT5yb290X3BhLCBpKSwgbXB0ZSk7CisK
KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbW1wdDQzX21hcF9mdWxsX3JhbmdlKHN0cnVj
dCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3IpCit7CisJcmV0dXJuIF9fcnY2NF9tYXBfZnVs
bF9yYW5nZShkb20sIHh3ciwgUlY2NF9JTk5FUl9FTlRSSUVTKTsKK30KKworc3RhdGljIGludCBz
bW1wdDUyX21hcF9mdWxsX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3Ip
Cit7CisJcmV0dXJuIF9fcnY2NF9tYXBfZnVsbF9yYW5nZShkb20sIHh3ciwgUlY2NF9JTk5FUl9F
TlRSSUVTKTsKK30KKworc3RhdGljIGludCBzbW1wdDY0X21hcF9mdWxsX3JhbmdlKHN0cnVjdCBz
YmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3IpCit7CisJcmV0dXJuIF9fcnY2NF9tYXBfZnVsbF9y
YW5nZShkb20sIHh3ciwgUlY2NF9ST09UX1NNTVBUNjRfRU5UUklFUyk7Cit9CisKK3N0cnVjdCBz
YmlfbXB0X21vZGUgc21tcHQ0M19tb2RlID0geworCS5uYW1lCQkJPSAiU21tcHQ0MyIsCisJLm1v
ZGVfdmFsCQk9IFNCSV9NTVBUX01PREVfU01NUFQ0MywKKwkuZW5jb2RlX21tcHQJCT0gc21tcHQ0
M19lbmNvZGVfbW1wdCwKKwkubWFwX3JhbmdlCQk9IHNtbXB0NDNfbWFwX3JhbmdlLAorCS5yb290
X3RhYmxlX3NpemUJPSBzbW1wdDQzX3Jvb3RfdGFibGVfc2l6ZSwKKwkucm9vdF90YWJsZV9hbGln
bgk9IHNtbXB0NDNfcm9vdF90YWJsZV9hbGlnbiwKKwkucGFfaW5fcmFuZ2UJCT0gc21tcHQ0M19w
YV9pbl9yYW5nZSwKKwkubWFwX2Z1bGxfcmFuZ2UJCT0gc21tcHQ0M19tYXBfZnVsbF9yYW5nZSwK
K307CisKK3N0cnVjdCBzYmlfbXB0X21vZGUgc21tcHQ1Ml9tb2RlID0geworCS5uYW1lCQkJPSAi
U21tcHQ1MiIsCisJLm1vZGVfdmFsCQk9IFNCSV9NTVBUX01PREVfU01NUFQ1MiwKKwkuZW5jb2Rl
X21tcHQJCT0gc21tcHQ1Ml9lbmNvZGVfbW1wdCwKKwkubWFwX3JhbmdlCQk9IHNtbXB0NTJfbWFw
X3JhbmdlLAorCS5yb290X3RhYmxlX3NpemUJPSBzbW1wdDUyX3Jvb3RfdGFibGVfc2l6ZSwKKwku
cm9vdF90YWJsZV9hbGlnbgk9IHNtbXB0NTJfcm9vdF90YWJsZV9hbGlnbiwKKwkucGFfaW5fcmFu
Z2UJCT0gc21tcHQ1Ml9wYV9pbl9yYW5nZSwKKwkubWFwX2Z1bGxfcmFuZ2UJCT0gc21tcHQ1Ml9t
YXBfZnVsbF9yYW5nZSwKK307CisKK3N0cnVjdCBzYmlfbXB0X21vZGUgc21tcHQ2NF9tb2RlID0g
eworCS5uYW1lCQkJPSAiU21tcHQ2NCIsCisJLm1vZGVfdmFsCQk9IFNCSV9NTVBUX01PREVfU01N
UFQ2NCwKKwkuZW5jb2RlX21tcHQJCT0gc21tcHQ2NF9lbmNvZGVfbW1wdCwKKwkubWFwX3Jhbmdl
CQk9IHNtbXB0NjRfbWFwX3JhbmdlLAorCS5yb290X3RhYmxlX3NpemUJPSBzbW1wdDY0X3Jvb3Rf
dGFibGVfc2l6ZSwKKwkucm9vdF90YWJsZV9hbGlnbgk9IHNtbXB0NjRfcm9vdF90YWJsZV9hbGln
biwKKwkucGFfaW5fcmFuZ2UJCT0gc21tcHQ2NF9wYV9pbl9yYW5nZSwKKwkubWFwX2Z1bGxfcmFu
Z2UJCT0gc21tcHQ2NF9tYXBfZnVsbF9yYW5nZSwKK307CisKKyNlbHNlIC8qIF9fcmlzY3ZfeGxl
biA9PSA2NCAqLworCisvKgorICogU21tcHQzNCAoUlYzMikgIOKAlCAgMzQtYml0IHN1cGVydmlz
b3IgcGh5c2ljYWwgYWRkcmVzcyAoU1BBKQorICoKKyAqICstLS0tLS0tLS0rLS0tLS0tLS0tKy0t
LS0tLS0tLSstLS0tLS0tLSsKKyAqIHwgIHBuWzFdICB8ICBwblswXSAgfCAgICBwaSAgIHwgb2Zm
c2V0IHwKKyAqIHwgWzMzOjI1XSB8IFsyNDoxNV0gfCBbMTQ6MTJdIHwgWzExOjBdIHwKKyAqIHwg
ICAgOWIgICB8ICAgMTBiICAgfCAgICAzYiAgIHwgIDEyYiAgIHwKKyAqICstLS0tLS0tLS0rLS0t
LS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSsKKyAqCisgKi8KKworI2RlZmluZSBSVjMyX01QVEVf
U0laRQkJCTRVTAorI2RlZmluZSBSVjMyX1JPT1RfRU5UUklFUwkJNTEyVQorI2RlZmluZSBSVjMy
X0xFQUZfRU5UUklFUwkJMTAyNFUKKyNkZWZpbmUgUlYzMl9ST09UX1NJWkUJCQkoUlYzMl9ST09U
X0VOVFJJRVMgKiBSVjMyX01QVEVfU0laRSkKKyNkZWZpbmUgUlYzMl9MRUFGX1NJWkUJCQkoUlYz
Ml9MRUFGX0VOVFJJRVMgKiBSVjMyX01QVEVfU0laRSkKKworLyogcG4gZmllbGQgd2lkdGhzICov
CisjZGVmaW5lIFJWMzJfUE4xX0JJVFMJCQk5VQorI2RlZmluZSBSVjMyX1BOMF9CSVRTCQkJMTBV
CisKKyNkZWZpbmUgUlYzMl9OVU1QR0lOUkFOR0UJCTNVCisjZGVmaW5lIFJWMzJfUEFHRVNfUEVS
X01QVEUJCSgxVSA8PCBSVjMyX05VTVBHSU5SQU5HRSkKKyNkZWZpbmUgUlYzMl9QQUdFU19QRVJf
TVBURV9NQVNLCShSVjMyX1BBR0VTX1BFUl9NUFRFIC0gMSkKKworLyogUmFuZ2UgY292ZXJlZCBi
eSBvbmUgTVBURSBhdCBlYWNoIGxldmVsICovCisjZGVmaW5lIFJWMzJfTEVBRl9SQU5HRQkJCShS
VjMyX1BBR0VTX1BFUl9NUFRFICogU0JJX01QVF9QQUdFX1NJWkUpCisjZGVmaW5lIFJWMzJfUk9P
VF9SQU5HRQkJCShSVjMyX0xFQUZfUkFOR0UgPDwgUlYzMl9QTjBfQklUUykKKworLyogTkFQT1Qg
Y29uc3RhbnRzIChHPTYpICovCisjZGVmaW5lIFJWMzJfTkFQT1RfRwkJCTZVCisjZGVmaW5lIFJW
MzJfTkFQT1RfR19TSElGVAkJMTJVCisjZGVmaW5lIFJWMzJfTkFQT1RfQ09VTlQJCSgxVSA8PCAo
UlYzMl9OQVBPVF9HICsgMSkpCisjZGVmaW5lIFJWMzJfTkFQT1RfU0laRQkJCShSVjMyX05BUE9U
X0NPVU5UICogUlYzMl9MRUFGX1JBTkdFKQorI2RlZmluZSBSVjMyX05BUE9UX1BOMF9BTElHTgkJ
UlYzMl9OQVBPVF9DT1VOVAorCisvKgorICogU3dpdGggdG8gZGlzYWJsZSBOQVBPVCBjb21wYWN0
aW9uIG9mIE1QVEUgZW50cmllcyB3aGlsZSB3cml0aW5nLgorICovCisjZGVmaW5lIFJWMzJfTkFQ
T1RfRElTQUJMRQkwCisKKy8qCisgKiBydjMyX3BuMV90YWJsZV9pZHgoKSDigJQgZXh0cmFjdCBw
blsxXSBmcm9tIGEgU1BBLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBydjMyX3BuMV90YWJsZV9p
ZHgodW5zaWduZWQgbG9uZyBwYSkKK3sKKwlyZXR1cm4gKChwYSA+PiAyNSkgJiAweDFGRlUpOwor
fQorCisvKgorICogcnYzMl9wbjBfdGFibGVfaWR4KCkg4oCUIGV4dHJhY3QgcG5bMF0gZnJvbSBh
IFNQQS4KKyAqLworc3RhdGljIGlubGluZSB1MzIgcnYzMl9wbjBfdGFibGVfaWR4KHVuc2lnbmVk
IGxvbmcgcGEpCit7CisJcmV0dXJuICgocGEgPj4gMTUpICYgMHgzRkZVKTsKK30KKworc3RhdGlj
IGlubGluZSB1MzIgcnYzMl90dXBsZV9pZHhfc2hpZnQodTMyIGxldmVsKQoreworCXJldHVybiAo
bGV2ZWwgPT0gMCkgPyBTQklfTVBUX1BBR0VfU0hJRlQgOiBTQklfTVBUX1BBR0VfU0hJRlQgKyBS
VjMyX1BOMF9CSVRTOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBydjMyX3R1cGxlX2lkeCh1bnNp
Z25lZCBsb25nIHBhLCB1MzIgbGV2ZWwpCit7CisJcmV0dXJuICgocGEgPj4gcnYzMl90dXBsZV9p
ZHhfc2hpZnQobGV2ZWwpKSAmIFJWMzJfUEFHRVNfUEVSX01QVEVfTUFTSyk7Cit9CisKKy8qIEJ5
dGVzIGNvdmVyZWQgYnkgb25lIE1QVEUgYXQgdGhlIGdpdmVuIGxldmVsICovCitzdGF0aWMgaW5s
aW5lIHVuc2lnbmVkIGxvbmcgcnYzMl9tcHRlX3JhbmdlKHUzMiBsZXZlbCkKK3sKKwlyZXR1cm4g
KGxldmVsID09IDApID8gUlYzMl9MRUFGX1JBTkdFIDogUlYzMl9ST09UX1JBTkdFOworfQorCisv
KgorICogUlYzMiBNUFRFIFJlYWQvV3JpdGUgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUg
dTMyIHJ2MzJfcmVhZF9tcHRlKHVuc2lnbmVkIGxvbmcgcGEpCit7CisJcmV0dXJuICoodm9sYXRp
bGUgdTMyICopcGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydjMyX3dyaXRlX21wdGUodW5z
aWduZWQgbG9uZyBwYSwgdTMyIHYpCit7CisJKih2b2xhdGlsZSB1MzIgKilwYSA9IHY7Cit9CisK
K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBydjMyX21wdGVfcGEodW5zaWduZWQgbG9uZyB0
YWJsZV9wYSwgdTMyIGlkeCkKK3sKKwlyZXR1cm4gKHRhYmxlX3BhICsgaWR4ICogUlYzMl9NUFRF
X1NJWkUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcnYzMl9uZXh0X3RhYmxl
X3BhKHUzMiBtcHRlKQoreworCXJldHVybiAoKG1wdGUgPj4gU0JJX01QVEVfUFBOX1NISUZUKSA8
PCBTQklfTVBUX1BBR0VfU0hJRlQpOworfQorCisvKgorICogR2VuZXJhdGUgTmFwb3QgTGVhZiBN
UFRFCisgKgorICogQ29uc3RydWN0cyBvbmUgTVBURSB2YWx1ZSB1c2VkIGZvciBhbGwgUlYzMl9O
QVBPVF9DT1VOVCBlbnRyaWVzCisgKiBpbiBhIE5BUE9UIGdyb3VwLgorICoKKyAqIEFsbCBNUFRF
cyBpbiB0aGUgZ3JvdXAgYXJlIGlkZW50aWNhbAorICovCitzdGF0aWMgaW5saW5lIHUzMiBydjMy
X25hcG90X2xlYWYodTggeHdyKQoreworCXUzMiBtcHRlID0gU0JJX01QVEVfViB8IFNCSV9NUFRF
X0wgfCBTQklfTVBURV9OOworCisJbXB0ZSA9IHNiaV9tcHRlX2xlYWZfc2V0X3h3cihtcHRlLCAw
LCB4d3IpOworCW1wdGUgfD0gKCh1MzIpUlYzMl9OQVBPVF9HIDw8IFJWMzJfTkFQT1RfR19TSElG
VCk7CisKKwlyZXR1cm4gbXB0ZTsKK30KKworLyogR2V0IHRoZSB4d3IgZnJvbSBhIE5hcG90IGxl
YWYuICovCitzdGF0aWMgaW5saW5lIHU4IHJ2MzJfbmFwb3RfeHdyKHUzMiBtcHRlKQoreworCXJl
dHVybiAoKG1wdGUgPj4gU0JJX01QVEVfWFdSX0JBU0UpICYgU0JJX01QVEVfWFdSX01BU0spOwor
fQorCisvKgorICogcnYzMl9uYXBvdF9kZW1vdGUoKSDigJQgQ29udmVydCBhIE5hcG90IE1QVEUg
Z3JvdXAgaW50byBSVjY0X05BUE9UX01QVEVfQ09VTlQKKyAqIG5vcm1hbChOb24tTmFwb3QpIE1Q
VEUgY2FycnlpbmcgdGhlIFNBTUUgcGVybWlzc2lvbi4KKyAqCisgKiBsZWFmX21wdGVfcGEgaXMg
YW55IG9mIHRoZSBncm91cCBNUFRFIFBBCisgKi8KK3N0YXRpYyB2b2lkIHJ2MzJfbmFwb3RfZGVt
b3RlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBs
ZWFmX21wdGVfcGEsIHVuc2lnbmVkIGxvbmcgcGEpCit7CisJdTMyIHBnLCBsZWFmLCBpOworCXVu
c2lnbmVkIGxvbmcgZ3JwX2Jhc2U7CisKKwl1OCB4d3IgPSBydjMyX25hcG90X3h3cihydjMyX3Jl
YWRfbXB0ZShsZWFmX21wdGVfcGEpKTsKKwl1MzIgcG4wID0gcnYzMl9wbjBfdGFibGVfaWR4KHBh
KTsKKworCWdycF9iYXNlID0gbGVhZl9tcHRlX3BhIC0gKHBuMCAmIChSVjMyX05BUE9UX0NPVU5U
IC0gMSkpICogUlYzMl9NUFRFX1NJWkU7CisKKwlsZWFmID0gKFNCSV9NUFRFX1YgfCBTQklfTVBU
RV9MKTsgLyogTj0wICovCisKKwlmb3IgKHBnID0gMDsgcGcgPCBSVjMyX1BBR0VTX1BFUl9NUFRF
OyBwZysrKQorCQlsZWFmID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKGxlYWYsIHBnLCB4d3IpOwor
CisJZm9yIChpID0gMDsgaSA8IFJWMzJfTkFQT1RfQ09VTlQ7IGkrKykKKwkJcnYzMl93cml0ZV9t
cHRlKGdycF9iYXNlICsgaSAqIFJWMzJfTVBURV9TSVpFLCBsZWFmKTsKK30KKworc3RhdGljIGlu
bGluZSB1MzIgcnYzMl9iZXN0X2xldmVsKHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcg
c2l6ZSkKK3sKKwlpZiAoc2l6ZSA+PSBSVjMyX1JPT1RfUkFOR0UgJiYgKHBhICYgKFJWMzJfUk9P
VF9SQU5HRSAtIDEpKSA9PSAwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgor
ICogTVBUIFdhbGsgZm9yIFJWMzIgU21tcHQ0MworICoKKyAqIFJldHVybnMgdGhlIFBBIG9mIHRo
ZSBNUFRFIGNvdmVyaW5nIHBhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ2MzJfd2Fsa19h
bGxvYyhzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcg
cGEsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJICAgICB1MzIgKm91dF9sZXZl
bCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3RfZXAgPSBydjMyX21wdGVfcGEoZG9tLT5yb290X3Bh
LCBydjMyX3BuMV90YWJsZV9pZHgocGEpKTsKKwl1MzIgcm9vdF9tcHRlID0gcnYzMl9yZWFkX21w
dGUocm9vdF9lcCk7CisJdTMyIGJlc3QgPSBydjMyX2Jlc3RfbGV2ZWwocGEsIHNpemUpOworCXVu
c2lnbmVkIGxvbmcgbGVhZl9wYTsKKworCWlmIChyb290X21wdGUgJiAodTMyKVNCSV9NUFRFX0wp
IHsKKwkJLyogRXhpc3Rpbmcgcm9vdC1sZXZlbCBsZWFmICovCisJCSpvdXRfbGV2ZWwgPSAxOwor
CQlyZXR1cm4gcm9vdF9lcDsKKwl9CisKKwlpZiAoIShyb290X21wdGUgJiAodTMyKVNCSV9NUFRF
X1YpICYmIGJlc3QgPT0gMSkgeworCQkvKiBuZXcgZW50cnksIHJhbmdlIGZpdHMgYXQgcm9vdCBs
ZXZlbCBzbyBza2lwIGxlYWYgYWxsb2NhdGlvbiAqLworCQkqb3V0X2xldmVsID0gMTsKKwkJcmV0
dXJuIHJvb3RfZXA7CisJfQorCisJaWYgKCEocm9vdF9tcHRlICYgKHUzMilTQklfTVBURV9WKSkg
eworCQkvKiBBbGxvY2F0ZSBsZWFmIHRhYmxlIGZyb20gZ2xvYmFsIGhlYXAgKi8KKwkJbGVhZl9w
YSA9IHNiaV9tcHRfcG9vbF9hbGxvYyhSVjMyX0xFQUZfU0laRSwKKwkJCQkJICAgICBTQklfTVBU
X1BBR0VfU0laRSk7CisJCWlmICghbGVhZl9wYSkKKwkJCXJldHVybiAwOworCisJCXJ2MzJfd3Jp
dGVfbXB0ZShyb290X2VwLCBzYmlfbXB0ZV9ub25sZWFmKGxlYWZfcGEpKTsKKwkJKm91dF9sZXZl
bCA9IDA7CisKKwkJcmV0dXJuIHJ2MzJfbXB0ZV9wYShsZWFmX3BhLCBydjMyX3BuMF90YWJsZV9p
ZHgocGEpKTsKKwl9CisKKwkvKiBWYWxpZCBub24tbGVhZjogZm9sbG93IFBQTiB0byBleGlzdGlu
ZyBsZWFmIHRhYmxlICovCisJKm91dF9sZXZlbCA9IDA7CisKKwlyZXR1cm4gcnYzMl9tcHRlX3Bh
KHJ2MzJfbmV4dF90YWJsZV9wYShydjMyX3JlYWRfbXB0ZShyb290X2VwKSksIHJ2MzJfcG4wX3Rh
YmxlX2lkeChwYSkpOworfQorCisvKgorICogc21tcHQzNF9tYXBfcmFuZ2UoKTogTWFwcyBhIHJh
bmdlIFtwYSwgcGErc2l6ZV0gaW4gdGhlIE1QVCB0YWJsZQorICovCisKK3N0YXRpYyBpbnQgc21t
cHQzNF9tYXBfcmFuZ2Uoc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sCisJCQkgICAgIHVuc2ln
bmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTggeHdyKQoreworCXVuc2lnbmVkIGxv
bmcgY3VyID0gcGE7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBwYSArIHNpemU7CisJdW5zaWduZWQg
bG9uZyBsZWFmX21wdGVfcGE7CisJdW5zaWduZWQgbG9uZyBtcHRlX3JhbmdlLCBtcHRlX2Jhc2Us
IG1wdGVfZW5kLCBiYXRjaF9lbmQ7CisJdTMyIGxldmVsLCBwZ19maXJzdCwgcGdfbGFzdCwgcGcs
IGk7CisJdTMyIG1wdGUsIG5hcG90OworCisJd2hpbGUgKGN1ciA8IGVuZCkgeworCQkvKgorCQkg
KiBDaGVjayBpZiB0aGUgcmVnaW9uIHF1YWxpZmllcyBmb3IgTkFQT1QgcmFuZ2UgYW5kIHRoZQor
CQkgKiByZWdpb24gaXMgY29udGFpbmVkCisJCSAqLworCQlpZiAoKGN1ciAmIChSVjMyX05BUE9U
X1NJWkUgLSAxKSkgPT0gMCAmJgorCQkJY3VyICsgUlYzMl9OQVBPVF9TSVpFID4gY3VyICYmCisJ
CQljdXIgKyBSVjMyX05BUE9UX1NJWkUgPD0gZW5kKSB7CisJCQlsZWFmX21wdGVfcGEgPSBydjMy
X3dhbGtfYWxsb2MoZG9tLCBjdXIsIGVuZCAtIGN1ciwgJmxldmVsKTsKKwkJCWlmICghbGVhZl9t
cHRlX3BhKQorCQkJCXJldHVybiBTQklfRU5PTUVNOworCisJCQlpZiAoIVJWMzJfTkFQT1RfRElT
QUJMRSAmJiBsZXZlbCA9PSAwICYmIChydjMyX3BuMF90YWJsZV9pZHgoY3VyKSAmIChSVjMyX05B
UE9UX1BOMF9BTElHTiAtIDEpKSA9PSAwKSB7CisJCQkJbmFwb3QgPSBydjMyX25hcG90X2xlYWYo
eHdyKTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBSVjMyX05BUE9UX0NPVU5UOyBpKyspCisJCQkJ
CXJ2MzJfd3JpdGVfbXB0ZShsZWFmX21wdGVfcGEgKyBpICogUlYzMl9NUFRFX1NJWkUsIG5hcG90
KTsKKworCQkJCWN1ciArPSBSVjMyX05BUE9UX1NJWkU7CisKKwkJCQljb250aW51ZTsKKwkJCX0K
KwkJfSBlbHNlIHsKKwkJCWxlYWZfbXB0ZV9wYSA9IHJ2MzJfd2Fsa19hbGxvYyhkb20sIGN1ciwg
ZW5kIC0gY3VyLCAmbGV2ZWwpOworCQkJaWYgKCFsZWFmX21wdGVfcGEpCisJCQkJcmV0dXJuIFNC
SV9FTk9NRU07CisJCX0KKworCQkvKiBOb3JtYWwgcGF0aCAqLworCQltcHRlX3JhbmdlID0gcnYz
Ml9tcHRlX3JhbmdlKGxldmVsKTsKKwkJcGdfZmlyc3QgPSBydjMyX3R1cGxlX2lkeChjdXIsIGxl
dmVsKTsKKwkJbXB0ZV9iYXNlID0gY3VyICYgfihtcHRlX3JhbmdlIC0gMVVMKTsKKwkJbXB0ZV9l
bmQgPSBtcHRlX2Jhc2UgKyBtcHRlX3JhbmdlOworCQliYXRjaF9lbmQgPSAoZW5kIDwgbXB0ZV9l
bmQpID8gZW5kIDogbXB0ZV9lbmQ7CisJCXBnX2xhc3QgPSBydjMyX3R1cGxlX2lkeChiYXRjaF9l
bmQgLSBTQklfTVBUX1BBR0VfU0laRSwgbGV2ZWwpOworCisJCS8qCisJCSogSWYgdGhpcyBsZXZl
bC0wIE1QVEUgaXMgYSBOYXBvdCBtZW1iZXIsIGV4cGFuZCB0aGUKKwkJKiB3aG9sZSBuYXR1cmFs
bHktYWxpZ25lZCBncm91cCB0byBwbGFpbiBsZWF2ZXMgYW5kIHdyaXRlIHNhbWUKKwkJKiBwZXJt
aXNzaW9ucyB4d3IKKwkJKi8KKwkJbXB0ZSA9IHJ2MzJfcmVhZF9tcHRlKGxlYWZfbXB0ZV9wYSk7
CisJCWlmIChsZXZlbCA9PSAwICYmIChtcHRlICYgKHUzMilTQklfTVBURV9OKSkgeworCQkJcnYz
Ml9uYXBvdF9kZW1vdGUoZG9tLCBsZWFmX21wdGVfcGEsIGN1cik7CisJCQlzYmlfbXB0X2ZlbmNl
X3NkaWQoZG9tLT5zZGlkKTsKKwkJCW1wdGUgPSBydjMyX3JlYWRfbXB0ZShsZWFmX21wdGVfcGEp
OworCQl9CisJCWlmICghKG1wdGUgJiAodTMyKShTQklfTVBURV9WIHwgU0JJX01QVEVfTCkpKQor
CQkJbXB0ZSA9IFNCSV9NUFRFX1YgfCBTQklfTVBURV9MOworCisJCWZvciAocGcgPSBwZ19maXJz
dDsgcGcgPD0gcGdfbGFzdDsgcGcrKykKKwkJCW1wdGUgPSBzYmlfbXB0ZV9sZWFmX3NldF94d3Io
bXB0ZSwgcGcsIHh3cik7CisKKwkJcnYzMl93cml0ZV9tcHRlKGxlYWZfbXB0ZV9wYSwgbXB0ZSk7
CisJCWN1ciA9IGJhdGNoX2VuZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1tcHQg
ZW5jb2RpbmcKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQzNF9lbmNvZGVfbW1wdCh1
bnNpZ25lZCBsb25nIHBwbiwgdTMyIHNkaWQpCit7CisJcmV0dXJuIHNiaV9tbXB0X2VuY29kZShT
QklfTU1QVF9NT0RFX1NNTVBUMzQsIHNkaWQsIHBwbik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBs
b25nIHNtbXB0MzRfcm9vdF90YWJsZV9zaXplKHZvaWQpCit7CisJcmV0dXJuIFJWMzJfUk9PVF9T
SVpFOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbW1wdDM0X3Jvb3RfdGFibGVfYWxpZ24o
dm9pZCkKK3sKKwlyZXR1cm4gU0JJX01QVF9QQUdFX1NJWkU7Cit9CisKK3N0YXRpYyBib29sIHNt
bXB0MzRfcGFfaW5fcmFuZ2UodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplKQor
eworCS8qCisJICogUmV0dXJuIHRydWUgc2luY2UgMSA8PCAzNCB3aWwgYmUgVUIKKwkgKiBpbiBS
VjMyIGNhc2UgYW5kIGFueXdheXMgdmFyaWFibGVzIGFyZSBsaW1pdGVkIGJ5IFJWMzIKKwkgKiBh
cmNoaXRlY3R1cmFsIHdpZHRoCisJICovCisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIHNt
bXB0MzRfbWFwX2Z1bGxfcmFuZ2UoKSDigJQgV3JpdGUgZXZlcnkgTVBURSBhdCBSb290IE1QVAor
ICoKKyAqIFdyaXRlcyB4d3IgaW50byBldmVyeSByb290IHRhYmxlIE1QVEUgZGlyZWN0bHkgYXMg
YSBsZWFmCisgKiBzdXBlcnBhZ2UgY292ZXJpbmcgdGhlIG1vZGUgZW50aXJlIGFkZHJlc3NhYmxl
IFBBIHJhbmdlLgorICogTm8gaW50ZXJtaWRpYXRlIE1QVCB0YWJsZXMgYWxsb2NhdGVkIGp1c3Qg
YWxsIGxlYWYgTVBURXMgYXQKKyAqIHJvb3QgbGV2ZWwuCisgKi8KKworc3RhdGljIGludCBzbW1w
dDM0X21hcF9mdWxsX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3IpCit7
CisJdTMyIG1wdGUgPSBTQklfTVBURV9WIHwgU0JJX01QVEVfTDsKKwl1MzIgcGcsIGk7CisKKwlm
b3IgKHBnID0gMDsgcGcgPCBSVjMyX1BBR0VTX1BFUl9NUFRFOyBwZysrKQorCQltcHRlID0gc2Jp
X21wdGVfbGVhZl9zZXRfeHdyKG1wdGUsIHBnLCB4d3IpOworCisJZm9yIChpID0gMDsgaSA8IFJW
MzJfUk9PVF9FTlRSSUVTOyBpKyspCisJCXJ2MzJfd3JpdGVfbXB0ZShydjMyX21wdGVfcGEoZG9t
LT5yb290X3BhLCBpKSwgbXB0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNiaV9tcHRf
bW9kZSBzbW1wdDM0X21vZGUgPSB7CisJLm5hbWUgPSAiU21tcHQzNCIsCisJLm1vZGVfdmFsID0g
U0JJX01NUFRfTU9ERV9TTU1QVDM0LAorCS5lbmNvZGVfbW1wdCA9IHNtbXB0MzRfZW5jb2RlX21t
cHQsCisJLm1hcF9yYW5nZSA9IHNtbXB0MzRfbWFwX3JhbmdlLAorCS5yb290X3RhYmxlX3NpemUg
PSBzbW1wdDM0X3Jvb3RfdGFibGVfc2l6ZSwKKwkucm9vdF90YWJsZV9hbGlnbiA9IHNtbXB0MzRf
cm9vdF90YWJsZV9hbGlnbiwKKwkucGFfaW5fcmFuZ2UgPSBzbW1wdDM0X3BhX2luX3JhbmdlLAor
CS5tYXBfZnVsbF9yYW5nZSA9IHNtbXB0MzRfbWFwX2Z1bGxfcmFuZ2UsCit9OworCisjZW5kaWYg
LyogX19yaXNjdl94bGVuID09IDMyICovCi0tIAoyLjUxLjAKCgotLSAKb3BlbnNiaSBtYWlsaW5n
IGxpc3QKb3BlbnNiaUBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu
b3JnL21haWxtYW4vbGlzdGluZm8vb3BlbnNiaQo=