[PATCHv2 1/2] coroutine: New module

David Gibson <[email protected]> Thu, 1 Dec 2016 22:28:39 +1100
Newsgroups org.ozlabs.lists.ccan
Message-ID <[email protected]>
VGhpcyBpcyBlc3NlbnRpYWxseSBhIHdyYXBwZXIgYXJvdW5kIHVjb250ZXh0LmgsIGJ1dCB0aGUg
aWRlYSBpcyB0aGF0CmFsdGVybmF0aXZlIGJhY2sgZW5kIGltcGxlbWVudGF0aW9ucyBjb3VsZCBi
ZSB1c2VkIGluIGZ1dHVyZS4KClNpZ25lZC1vZmYtYnk6IERhdmlkIEdpYnNvbiA8ZGF2aWRAZ2li
c29uLmRyb3BiZWFyLmlkLmF1PgotLS0KIGNjYW4vY29yb3V0aW5lL0xJQ0VOU0UgICAgICB8ICAg
MSArCiBjY2FuL2Nvcm91dGluZS9faW5mbyAgICAgICAgfCAgNDQgKysrKysrKysrCiBjY2FuL2Nv
cm91dGluZS9jb3JvdXRpbmUuYyAgfCAxMzYgKysrKysrKysrKysrKysrKysrKysrKysrKysKIGNj
YW4vY29yb3V0aW5lL2Nvcm91dGluZS5oICB8IDIzMSArKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKwogY2Nhbi9jb3JvdXRpbmUvdGVzdC9hcGktMS5jIHwgIDUyICsr
KysrKysrKysKIGNjYW4vY29yb3V0aW5lL3Rlc3QvYXBpLTIuYyB8IDExMCArKysrKysrKysrKysr
KysrKysrKysKIGNjYW4vY29yb3V0aW5lL3Rlc3QvYXBpLTMuYyB8ICA5MCArKysrKysrKysrKysr
KysrKwogNyBmaWxlcyBjaGFuZ2VkLCA2NjQgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTIw
MDAwIGNjYW4vY29yb3V0aW5lL0xJQ0VOU0UKIGNyZWF0ZSBtb2RlIDEwMDY0NCBjY2FuL2Nvcm91
dGluZS9faW5mbwogY3JlYXRlIG1vZGUgMTAwNjQ0IGNjYW4vY29yb3V0aW5lL2Nvcm91dGluZS5j
CiBjcmVhdGUgbW9kZSAxMDA2NDQgY2Nhbi9jb3JvdXRpbmUvY29yb3V0aW5lLmgKIGNyZWF0ZSBt
b2RlIDEwMDY0NCBjY2FuL2Nvcm91dGluZS90ZXN0L2FwaS0xLmMKIGNyZWF0ZSBtb2RlIDEwMDY0
NCBjY2FuL2Nvcm91dGluZS90ZXN0L2FwaS0yLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBjY2FuL2Nv
cm91dGluZS90ZXN0L2FwaS0zLmMKCmRpZmYgLS1naXQgYS9jY2FuL2Nvcm91dGluZS9MSUNFTlNF
IGIvY2Nhbi9jb3JvdXRpbmUvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAw
MDAwLi5kYzMxNGVjCi0tLSAvZGV2L251bGwKKysrIGIvY2Nhbi9jb3JvdXRpbmUvTElDRU5TRQpA
QCAtMCwwICsxIEBACisuLi8uLi9saWNlbnNlcy9MR1BMLTIuMQpcIE5vIG5ld2xpbmUgYXQgZW5k
IG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NjYW4vY29yb3V0aW5lL19pbmZvIGIvY2Nhbi9jb3JvdXRp
bmUvX2luZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5NjI5YwotLS0g
L2Rldi9udWxsCisrKyBiL2NjYW4vY29yb3V0aW5lL19pbmZvCkBAIC0wLDAgKzEsNDQgQEAKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5o
PgorCisvKioKKyAqIGNvcm91dGluZSAtIENvLXJvdXRpbmVzCisgKgorICogVGhpcyBjb2RlIGhh
cyBoZWxwZXIgZnVuY3Rpb25zIGZvciBpbXBsZW1lbnRpbmcgY28tcm91dGluZXMsIHRoYXQKKyAq
IGlzLCBleHBsaWNpdCBjby1vcGVyYXRpdmUgY29udGV4dCBzd2l0Y2hpbmcuICBJdCdzIGludGVu
ZGVkIHRvCisgKiBwcm92aWRlIHNpbWlsYXIgZnVuY3Rpb25hbGl0eSB0byB1Y29udGV4dCwgYnV0
IHdpdGggYSBjbGVhbmVyCisgKiBpbnRlcmZhY2UuICBBdCB0aGUgbW9tZW50IHRoaXMgaXMgaW1w
bGVtZW50ZWQgaW4gdGVybXMgb2YgdWNvbnRleHQsCisgKiBidXQgdGhlIGhvcGUgaXMgdG8gYWRk
IG90aGVyIGltcGxlbWVudGF0aW9ucyBmb3IgcGxhdGZvcm1zIHRoYXQKKyAqIGRvbid0IGhhdmUg
dWNvbnRleHQgaW4gZnV0dXJlLgorICoKKyAqIEF1dGhvcjogRGF2aWQgR2lic29uIDxkYXZpZEBn
aWJzb24uZHJvcGJlYXIuaWQuYXU+CisgKiBMaWNlbnNlOiBMR1BMICh2Mi4xIG9yIGFueSBsYXRl
ciB2ZXJzaW9uKQorICoKKyAqIENjYW5saW50OgorICoJLy8gQ29udGV4dCBzd2l0Y2hpbmcgcmVh
bGx5IGNvbmZ1c2VzIHZhbGdyaW5kCisgKgl0ZXN0c19wYXNzX3ZhbGdyaW5kIEZBSUwKKyAqLwor
aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwkvKiBFeHBlY3QgZXhhY3RseSBv
bmUgYXJndW1lbnQgKi8KKwlpZiAoYXJnYyAhPSAyKQorCQlyZXR1cm4gMTsKKworCWlmIChzdHJj
bXAoYXJndlsxXSwgImRlcGVuZHMiKSA9PSAwKSB7CisJCXByaW50ZigiY2Nhbi9wdHJpbnRcbiIp
OworCQlwcmludGYoImNjYW4vY29tcGlsZXJcbiIpOworCQlwcmludGYoImNjYW4vYnVpbGRfYXNz
ZXJ0XG4iKTsKKwkJcHJpbnRmKCJjY2FuL3R5cGVzYWZlX2NiXG4iKTsKKwkJcmV0dXJuIDA7CisJ
fQorCisJaWYgKHN0cmNtcChhcmd2WzFdLCAicG9ydGVkIikgPT0gMCkgeworI2lmICFIQVZFX1VD
T05URVhUCisJCXByaW50ZigiUmVxdWlyZXMgd29ya2luZyB1Y29udGV4dC5oXG4iKTsKKyNlbmRp
ZgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2NjYW4vY29y
b3V0aW5lL2Nvcm91dGluZS5jIGIvY2Nhbi9jb3JvdXRpbmUvY29yb3V0aW5lLmMKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwMWJkZQotLS0gL2Rldi9udWxsCisrKyBiL2Nj
YW4vY29yb3V0aW5lL2Nvcm91dGluZS5jCkBAIC0wLDAgKzEsMTM2IEBACisvKiBHTlUgTEdQTCB2
ZXJzaW9uIDIgKG9yIGxhdGVyKSAtIHNlZSBMSUNFTlNFIGZpbGUgZm9yIGRldGFpbHMgKi8KKyNp
bmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5o
PgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRl
IDxjY2FuL3B0cmludC9wdHJpbnQuaD4KKyNpbmNsdWRlIDxjY2FuL2NvbXBpbGVyL2NvbXBpbGVy
Lmg+CisjaW5jbHVkZSA8Y2Nhbi9idWlsZF9hc3NlcnQvYnVpbGRfYXNzZXJ0Lmg+CisjaW5jbHVk
ZSA8Y2Nhbi9jb3JvdXRpbmUvY29yb3V0aW5lLmg+CisKKy8qCisgKiBTdGFjayBtYW5hZ2VtZW50
CisgKi8KKworc3RydWN0IGNvcm91dGluZV9zdGFjayB7CisJdWludDY0X3QgbWFnaWM7CisJc2l6
ZV90IHNpemU7Cit9OworCisvKiBSZXR1cm5zIGxvd2VzdCBzdGFjayBhZGRyZXMsIHJlZ2FyZGxl
c3Mgb2YgZ3Jvd3RoIGRpcmVjdGlvbiAqLworc3RhdGljIFVOTkVFREVEIHZvaWQgKmNvcm91dGlu
ZV9zdGFja19iYXNlKHN0cnVjdCBjb3JvdXRpbmVfc3RhY2sgKnN0YWNrKQoreworI2lmIEhBVkVf
U1RBQ0tfR1JPV1NfVVBXQVJEUworCXJldHVybiAoY2hhciAqKShzdGFjayArIDEpOworI2Vsc2UK
KwlyZXR1cm4gKGNoYXIgKilzdGFjayAtIHN0YWNrLT5zaXplOworI2VuZGlmCit9CisKK3N0cnVj
dCBjb3JvdXRpbmVfc3RhY2sgKmNvcm91dGluZV9zdGFja19pbml0KHZvaWQgKmJ1Ziwgc2l6ZV90
IGJ1ZnNpemUsCisJCQkJCSAgICAgc2l6ZV90IG1ldGFzaXplKQoreworCXN0cnVjdCBjb3JvdXRp
bmVfc3RhY2sgKnN0YWNrOworCisJQlVJTERfQVNTRVJUKENPUk9VVElORV9TVEtfT1ZFUkhFQUQg
PT0gc2l6ZW9mKCpzdGFjaykpOworI2lmZGVmIE1JTlNJR1NUS1NaCisJQlVJTERfQVNTRVJUKENP
Uk9VVElORV9NSU5fU1RLU1ogPj0gTUlOU0lHU1RLU1opOworI2VuZGlmCisKKwlpZiAoYnVmc2l6
ZSA8IChDT1JPVVRJTkVfTUlOX1NUS1NaICsgc2l6ZW9mKCpzdGFjaykgKyBtZXRhc2l6ZSkpCisJ
CXJldHVybiBOVUxMOworCisjaWYgSEFWRV9TVEFDS19HUk9XU19VUFdBUkRTCisJc3RhY2sgPSAo
Y2hhciAqKWJ1ZiArIG1ldGFzaXplOworI2Vsc2UKKwlzdGFjayA9IChzdHJ1Y3QgY29yb3V0aW5l
X3N0YWNrICopCisJCSgoY2hhciAqKWJ1ZiArIGJ1ZnNpemUgLSBtZXRhc2l6ZSkgLSAxOworI2Vu
ZGlmCisKKwlzdGFjay0+bWFnaWMgPSBDT1JPVVRJTkVfU1RBQ0tfTUFHSUM7CisJc3RhY2stPnNp
emUgPSBidWZzaXplIC0gc2l6ZW9mKCpzdGFjaykgLSBtZXRhc2l6ZTsKKworCXJldHVybiBzdGFj
azsKK30KKwordm9pZCBjb3JvdXRpbmVfc3RhY2tfcmVsZWFzZShzdHJ1Y3QgY29yb3V0aW5lX3N0
YWNrICpzdGFjaykKK3sKKwltZW1zZXQoc3RhY2ssIDAsIHNpemVvZigqc3RhY2spKTsKK30KKwor
c3RydWN0IGNvcm91dGluZV9zdGFjayAqY29yb3V0aW5lX3N0YWNrX2NoZWNrKHN0cnVjdCBjb3Jv
dXRpbmVfc3RhY2sgKnN0YWNrLAorCQkJCQkgICAgICBjb25zdCBjaGFyICphYm9ydHN0cikKK3sK
KwlpZiAoc3RhY2sgJiYgKHN0YWNrLT5tYWdpYyA9PSBDT1JPVVRJTkVfU1RBQ0tfTUFHSUMpCisJ
ICAgICYmIChzdGFjay0+c2l6ZSA+PSBDT1JPVVRJTkVfTUlOX1NUS1NaKSkKKwkJcmV0dXJuIHN0
YWNrOworCisJaWYgKGFib3J0c3RyKSB7CisJCWlmICghc3RhY2spCisJCQlmcHJpbnRmKHN0ZGVy
ciwgIiVzOiBOVUxMIGNvcm91dGluZSBzdGFja1xuIiwgYWJvcnRzdHIpOworCQllbHNlCisJCQlm
cHJpbnRmKHN0ZGVyciwKKwkJCQkiJXM6IEJhZCBjb3JvdXRpbmUgc3RhY2sgYXQgJXAgKG1hZ2lj
PTB4JSJQUkl4NjQiIHNpemU9JXpkKVxuIiwKKwkJCQlhYm9ydHN0ciwgc3RhY2ssIHN0YWNrLT5t
YWdpYywgc3RhY2stPnNpemUpOworCQlhYm9ydCgpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwor
c2l6ZV90IGNvcm91dGluZV9zdGFja19zaXplKGNvbnN0IHN0cnVjdCBjb3JvdXRpbmVfc3RhY2sg
KnN0YWNrKQoreworCXJldHVybiBzdGFjay0+c2l6ZTsKK30KKworI2lmIEhBVkVfVUNPTlRFWFQK
K3N0YXRpYyB2b2lkIGNvcm91dGluZV91Y19zdGFjayhzdGFja190ICp1Y19zdGFjaywKKwkJCSAg
ICAgICBjb25zdCBzdHJ1Y3QgY29yb3V0aW5lX3N0YWNrICpzdGFjaykKK3sKKwl1Y19zdGFjay0+
c3Nfc2l6ZSA9IGNvcm91dGluZV9zdGFja19zaXplKHN0YWNrKTsKKwl1Y19zdGFjay0+c3Nfc3Ag
PSBjb3JvdXRpbmVfc3RhY2tfYmFzZSgoc3RydWN0IGNvcm91dGluZV9zdGFjayAqKXN0YWNrKTsK
K30KKyNlbmRpZiAvKiBIQVZFX1VDT05URVhUICovCisKKy8qCisgKiBDb3JvdXRpbmUgc3dpdGNo
aW5nCisgKi8KKworI2lmIEhBVkVfVUNPTlRFWFQKK3ZvaWQgY29yb3V0aW5lX2luaXRfKHN0cnVj
dCBjb3JvdXRpbmVfc3RhdGUgKmNzLAorCQkgICAgIHZvaWQgKCpmbikodm9pZCAqKSwgdm9pZCAq
YXJnLAorCQkgICAgIHN0cnVjdCBjb3JvdXRpbmVfc3RhY2sgKnN0YWNrKQoreworCWdldGNvbnRl
eHQgKCZjcy0+dWMpOworCisJY29yb3V0aW5lX3VjX3N0YWNrKCZjcy0+dWMudWNfc3RhY2ssIHN0
YWNrKTsKKworICAgICAgICBpZiAoSEFWRV9QT0lOVEVSX1NBRkVfTUFLRUNPTlRFWFQpIHsKKyAg
ICAgICAgICAgICAgICBtYWtlY29udGV4dCgmY3MtPnVjLCAodm9pZCAqKWZuLCAxLCBhcmcpOwor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzaSA9IHB0cjJpbnQo
YXJnKTsKKyAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbWFzayA9ICgxVUwgPDwgKHNpemVvZihp
bnQpICogOCkpIC0gMTsKKyAgICAgICAgICAgICAgICBpbnQgbG8gPSBzaSAmIG1hc2s7CisgICAg
ICAgICAgICAgICAgaW50IGhpID0gc2kgPj4gKHNpemVvZihpbnQpICogOCk7CisKKyAgICAgICAg
ICAgICAgICBtYWtlY29udGV4dCgmY3MtPnVjLCAodm9pZCAqKWZuLCAyLCBsbywgaGkpOworICAg
ICAgICB9CisJCit9CisKK3ZvaWQgY29yb3V0aW5lX2p1bXAoY29uc3Qgc3RydWN0IGNvcm91dGlu
ZV9zdGF0ZSAqdG8pCit7CisJc2V0Y29udGV4dCgmdG8tPnVjKTsKKwlhc3NlcnQoMCk7Cit9CisK
K3ZvaWQgY29yb3V0aW5lX3N3aXRjaChzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlICpmcm9tLAorCQkg
ICAgICBjb25zdCBzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlICp0bykKK3sKKwlpbnQgcmM7CisKKwly
YyA9IHN3YXBjb250ZXh0KCZmcm9tLT51YywgJnRvLT51Yyk7CisJYXNzZXJ0KHJjID09IDApOwor
fQorI2VuZGlmIC8qIEhBVkVfVUNPTlRFWFQgKi8KZGlmZiAtLWdpdCBhL2NjYW4vY29yb3V0aW5l
L2Nvcm91dGluZS5oIGIvY2Nhbi9jb3JvdXRpbmUvY29yb3V0aW5lLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0NzQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2NjYW4vY29y
b3V0aW5lL2Nvcm91dGluZS5oCkBAIC0wLDAgKzEsMjMxIEBACisvKiBMaWNlbnNlZCB1bmRlciBM
R1BMdjIuMSsgLSBzZWUgTElDRU5TRSBmaWxlIGZvciBkZXRhaWxzICovCisjaWZuZGVmIENDQU5f
Q09ST1VUSU5FX0gKKyNkZWZpbmUgQ0NBTl9DT1JPVVRJTkVfSAorLyojZGVmaW5lIENDQU5fQ09S
T1VUSU5FX0RFQlVHIDEqLworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkZGVm
Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUg
PGFzc2VydC5oPgorCisjaW5jbHVkZSA8Y2Nhbi9jb21waWxlci9jb21waWxlci5oPgorI2luY2x1
ZGUgPGNjYW4vdHlwZXNhZmVfY2IvdHlwZXNhZmVfY2IuaD4KKworLyoqCisgKiBzdHJ1Y3QgY29y
b3V0aW5lX3N0YWNrCisgKgorICogRGVzY3JpYmVzIGEgc3RhY2sgc3VpdGFibGUgZm9yIGV4ZWN1
dGluZyBhIGNvcm91dGluZS4gIFRoaXMKKyAqIHN0cnVjdHVyZSBpcyBhbHdheXMgY29udGFpbmVk
IHdpdGhpbiB0aGUgc3RhY2sgaXQgZGVzY3JpYmVzLgorICovCitzdHJ1Y3QgY29yb3V0aW5lX3N0
YWNrOworCisvKioKKyAqIHN0cnVjdCBjb3JvdXRpbmVfc3RhdGUKKyAqCisgKiBEZXNjcmliZXMg
dGhlIHN0YXRlIG9mIGFuIGluLXByb2dyZXNzIGNvcm91dGluZS4KKyAqLworc3RydWN0IGNvcm91
dGluZV9zdGF0ZTsKKworLyoKKyAqIFN0YWNrIG1hbmFnZW1lbnQKKyAqLworCisvKioKKyAqIENP
Uk9VVElORV9TVEtfT1ZFUkhFQUQgLSBpbnRlcm5hbCBzdGFjayBvdmVyaGVhZAorICoKKyAqIE51
bWJlciBvZiBieXRlcyBvZiBhIHN0YWNrIHdoaWNoIGNvcm91dGluZSBuZWVkcyBmb3IgaXRzIG93
bgorICogdHJhY2tpbmcgaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgQ09ST1VUSU5FX1NUS19P
VkVSSEVBRAkJKHNpemVvZih1aW50NjRfdCkgKyBzaXplb2Yoc2l6ZV90KSkKKworLyoqCisgKiBD
T1JPVVRJTkVfTUlOX1NUS1NaIC0gTWluaW11bSBjb3JvdXRpbmUgc3RhY2sgc2l6ZQorICoKKyAq
IENvbnRhaW5zIHRoZSBtaW5pbXVtIHNpemUgZm9yIGEgY29yb3V0aW5lIHN0YWNrIChub3QgaW5j
bHVkaW5nCisgKiBvdmVyaGVhZCkuICBPbiBzeXN0ZW1zIHdpdGggTUlOU1RLU1osIGd1YXJhbnRl
ZWQgdG8gYmUgYXQgbGVhc3QgYXMKKyAqIGxhcmdlIGFzIE1JTlNUS1NaLgorICovCisjZGVmaW5l
IENPUk9VVElORV9NSU5fU1RLU1oJCTIwNDgKKworLyoqCisgKiBDT1JPVVRJTkVfU1RBQ0tfTUFH
SUMgLSBNYWdpYyBudW1iZXIgZm9yIGNvcm91dGluZSBzdGFja3MKKyAqLworI2RlZmluZSBDT1JP
VVRJTkVfU1RBQ0tfTUFHSUMJCTB4YzA0MGMwNDA1NzRjNTc0YworCisKKy8qKgorICogY29yb3V0
aW5lX3N0YWNrX2luaXQgLSBQcmVwYXJlIGEgY29yb3V0aW5lIHN0YWNrIGluIGFuIGV4aXN0aW5n
IGJ1ZmZlcgorICogQGJ1ZjogYnVmZmVyIHRvIHVzZSBmb3IgdGhlIGNvcm91dGluZSBzdGFjawor
ICogQGJ1ZnNpemU6IHNpemUgb2YgQGJ1ZgorICogQG1ldGFzaXplOiBzaXplIG9mIG1ldGFkYXRh
IHRvIGFkZCB0byB0aGUgc3RhY2sgKG5vdCBpbmNsdWRpbmcKKyAqICAgICAgICAgICAgY29yb3V0
aW5lIGludGVybmFsIG92ZXJoZWFkKQorICoKKyAqIFByZXBhcmVzIEBidWYgZm9yIHVzZSBhcyBh
IGNvcm91dGluZSBzdGFjaywgcmV0dXJuaW5nIGEKKyAqIGNvcm91dGluZV9zdGFjayAqLCBhbGxv
Y2F0ZWQgZnJvbSB3aXRoaW4gdGhlIGJ1ZmZlci4gIFJldHVybnMgTlVMTAorICogb24gZmFpbHVy
ZS4KKyAqCisgKiBUaGlzIHdpbGwgZmFpbCBpZiB0aGUgYnVmc2l6ZSA8IChDT1JPVVRJTkVfTUlO
X1NUS1NaICsKKyAqIENPUk9VVElORV9TVEtfT1ZFUkhFQUQgKyBtZXRhc2l6ZSkuCisgKi8KK3N0
cnVjdCBjb3JvdXRpbmVfc3RhY2sgKmNvcm91dGluZV9zdGFja19pbml0KHZvaWQgKmJ1Ziwgc2l6
ZV90IGJ1ZnNpemUsCisJCQkJCSAgICAgc2l6ZV90IG1ldGFzaXplKTsKKworLyoqCisgKiBjb3Jv
dXRpbmVfc3RhY2tfaW5pdCAtIFN0b3AgdXNpbmcgYSBjb3JvdXRpbmUgc3RhY2sKKyAqIEBzdGFj
azogY29yb3V0aW5lIHN0YWNrIHRvIHJlbGVhc2UKKyAqCisgKiBUaGlzIHJlbGVhc2VzIEBzdGFj
aywgbWFraW5nIGl0IG5vIGxvbmdlciBzdWl0YWJsZSBmb3IgdXNlIGFzIGEKKyAqIGNvcm91dGlu
ZSBzdGFjay4KKyAqLwordm9pZCBjb3JvdXRpbmVfc3RhY2tfcmVsZWFzZShzdHJ1Y3QgY29yb3V0
aW5lX3N0YWNrICpzdGFjayk7CisKKy8qKgorICogY29yb3V0aW5lX3N0YWNrX2NoZWNrIC0gVmFs
aWRhdGUgYW5kIHJldHVybiBhIGNvcm91dGluZSBzdGFjaworICogQHN0YWNrOiBzdGFjayB0byBj
aGVjaworICogQGFib3J0c3RyOiB0aGUgbG9jYXRpb24gdG8gcHJpbnQgb24gYWJvcnRpbmcsIG9y
IE5VTEwuCisgKgorICogRGVidWdnaW5nIGNoZWNrIGlmIEBzdGFjayBkb2Vzbid0IGFwcGVhciB0
byBiZSBhIHZhbGlkIGNvcm91dGluZQorICogc3RhY2ssIGFuZCBAYWJvcnRzdHIgaXMgbm9uLU5V
TEwgaXQgd2lsbCBiZSBwcmludGVkIGFuZCB0aGUKKyAqIGZ1bmN0aW9uIHdpbGwgYWJvcnQuCisg
KgorICogUmV0dXJucyBAc3RhY2sgaWYgaXQgYXBwZWFycyB2YWxpZCwgTlVMTCBpZiBub3QgKGl0
IGNhbiBuZXZlcgorICogcmV0dXJuIE5VTEwgaWYgQGFib3J0c3RyIGlzIHNldCkuCisgKi8KK3N0
cnVjdCBjb3JvdXRpbmVfc3RhY2sgKmNvcm91dGluZV9zdGFja19jaGVjayhzdHJ1Y3QgY29yb3V0
aW5lX3N0YWNrICpzdGFjaywKKwkJCQkJICAgICAgY29uc3QgY2hhciAqYWJvcnRzdHIpOworCisv
KioKKyAqIGNvcm91dGluZV9zdGFja190b19tZXRhZGF0YSAtIFJldHVybnMgcG9pbnRlciB0byB1
c2VyJ3MgbWV0YWRhdGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRl
ZCB3aXRoaW4gdGhlIHN0YWNrCisgKiBAc3RhY2s6IGNvcm91dGluZSBzdGFjaworICogQG1ldGFz
aXplOiBzaXplIG9mIG1ldGFkYXRhCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG1l
dGFkYXRhIGFyZWEgd2l0aGluIEBzdGFjay4gIFRoaXMgaXMgb2YKKyAqIHNpemUgZ2l2ZW4gYXQg
aW5pdGlhbGl6YXRpb24gdGltZSwgYW5kIHdvbid0IGJlIG92ZXJ3cml0dGVuIGJ5CisgKiBjb3Jv
dXRpbmVzIGV4ZWN1dGluZyBvbiB0aGUgc3RhY2suICBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgd2hh
dCB0bworICogcHV0IGluIGhlcmUuIEBtZXRhc2l6ZSBtdXN0IGJlIGVxdWFsIHRvIHRoZSB2YWx1
ZSBwYXNzZWQgdG8KKyAqIGNvcm91dGluZV9zdGFja19pbml0KCkuCisgKi8KK3N0YXRpYyBpbmxp
bmUgdm9pZCAqY29yb3V0aW5lX3N0YWNrX3RvX21ldGFkYXRhKHN0cnVjdCBjb3JvdXRpbmVfc3Rh
Y2sgKnN0YWNrLAorCQkJCQkJc2l6ZV90IG1ldGFzaXplKQoreworI2lmIEhBVkVfU1RBQ0tfR1JP
V1NfVVBXQVJEUworCXJldHVybiAoY2hhciAqKXN0YWNrIC0gbWV0YXNpemU7CisjZWxzZQorCXJl
dHVybiAoY2hhciAqKXN0YWNrICsgQ09ST1VUSU5FX1NUS19PVkVSSEVBRDsKKyNlbmRpZgorfQor
CisvKioKKyAqIGNvcm91dGluZV9zdGFja19mcm9tX21ldGFkYXRhIC0gUmV0dXJucyBwb2ludGVy
IHRvIGNvcm91dGluZSBzdGFjaworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw
b2ludGVyIGdpdmVuIHBvaW50ZXIgdG8gdXNlciBtZXRhZGF0YQorICogQG1ldGFkYXQ6IHVzZXIg
bWV0YWRhdGEgd2l0aGluIGEgc3RhY2sKKyAqIEBtZXRhc2l6ZTogc2l6ZSBvZiBtZXRhZGF0YQor
ICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb3JvdXRpbmVfc3RhY2sgaGFuZGxlIHdp
dGhpbiBhIHN0YWNrLgorICogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBwb2ludGVyIHJldHVybmVk
IGJ5CisgKiBjb3JvdXRpbmVfc3RhY2tfdG9fbWV0YWRhdGEoKSBhdCBhbiBlYXJsaWVyIHRpbWUu
IEBtZXRhc2l6ZSBtdXN0IGJlCisgKiBlcXVhbCB0byB0aGUgdmFsdWUgcGFzc2VkIHRvIGNvcm91
dGluZV9zdGFja19pbml0KCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNvcm91dGluZV9z
dGFjayAqCitjb3JvdXRpbmVfc3RhY2tfZnJvbV9tZXRhZGF0YSh2b2lkICptZXRhZGF0YSwgc2l6
ZV90IG1ldGFzaXplKQoreworI2lmIEhBVkVfU1RBQ0tfR1JPV1NfVVBXQVJEUworCXJldHVybiAo
c3RydWN0IGNvcm91dGluZV9zdGFjayAqKSgoY2hhciAqKW1ldGFkYXRhICsgbWV0YXNpemUpOwor
I2Vsc2UKKwlyZXR1cm4gKHN0cnVjdCBjb3JvdXRpbmVfc3RhY2sgKikoKGNoYXIgKiltZXRhZGF0
YQorCQkJCQkgIC0gQ09ST1VUSU5FX1NUS19PVkVSSEVBRCk7CisjZW5kaWYKK30KKworLyoqCisg
KiBjb3JvdXRpbmVfc3RhY2tfc2l6ZSAtIFJldHVybiBzaXplIG9mIGEgY29yb3V0aW5lIHN0YWNr
CisgKiBAc3RhY2s6IGNvcm91dGluZSBzdGFjaworICoKKyAqIFJldHVybnMgdGhlIHNpemUgb2Yg
dGhlIGNvcm91dGluZSBzdGFjayBAc3RhY2suICBUaGlzIGRvZXMgbm90CisgKiBpbmNsdWRlIHRo
ZSBvdmVyaGVhZCBvZiBzdHJ1Y3QgY29yb3V0aW5lX3N0YWNrIG9yIG1ldGRhdGEuCisgKi8KK3Np
emVfdCBjb3JvdXRpbmVfc3RhY2tfc2l6ZShjb25zdCBzdHJ1Y3QgY29yb3V0aW5lX3N0YWNrICpz
dGFjayk7CisKKy8qCisgKiBDb3JvdXRpbmUgc3dpdGNoaW5nCisgKi8KKworI2lmIEhBVkVfVUNP
TlRFWFQKKyNpbmNsdWRlIDx1Y29udGV4dC5oPgorI2RlZmluZSBDT1JPVVRJTkVfQVZBSUxBQkxF
CQkxCisjZWxzZQorI2RlZmluZSBDT1JPVVRJTkVfQVZBSUxBQkxFCQkwCisjZW5kaWYKKworc3Ry
dWN0IGNvcm91dGluZV9zdGF0ZSB7CisjaWYgSEFWRV9VQ09OVEVYVAorCXVjb250ZXh0X3QgdWM7
CisjZW5kaWYgLyogSEFWRV9VQ09OVEVYVCAqLworfTsKKworI2lmIENPUk9VVElORV9BVkFJTEFC
TEUKKworLyoqCisgKiBjb3JvdXRpbmVfaW5pdCAtIFByZXBhcmUgYSBjb3JvdXRpbmUgZm9yIGV4
ZWN1dGlvbgorICogQGNzOiBjb3JvdXRpbmVfc3RhdGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUK
KyAqIEBmbjogZnVuY3Rpb24gdG8gc3RhcnQgZXhlY3V0aW5nIGluIHRoZSBjb3JvdXRpbmUKKyAq
IEBhcmc6IGFyZ3VtZW50IGZvciBAZm4KKyAqIEBzdGFjazogc3RhY2sgdG8gdXNlIGZvciB0aGUg
Y29yb3V0aW5lCisgKgorICogUHJlcGFyZXMgQGNzIGFzIGEgbmV3IGNvcm91dGluZSB3aGljaCB3
aWxsIGV4ZWN1dGUgc3RhcnRpbmcgd2l0aAorICogZnVuY3Rpb24gQGZuLCB1c2luZyBzdGFjayBA
c3RhY2suCisgKi8KK3ZvaWQgY29yb3V0aW5lX2luaXRfKHN0cnVjdCBjb3JvdXRpbmVfc3RhdGUg
KmNzLAorCQkgICAgIHZvaWQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnLAorCQkgICAgIHN0cnVj
dCBjb3JvdXRpbmVfc3RhY2sgKnN0YWNrKTsKKyNkZWZpbmUgY29yb3V0aW5lX2luaXQoY3MsIGZu
LCBhcmcsIHN0YWNrKQkJCQlcCisJY29yb3V0aW5lX2luaXRfKChjcyksICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCXR5cGVzYWZlX2NiKHZvaWQsIHZvaWQg
KiwgKGZuKSwgKGFyZykpLAkJXAorCQkJKGFyZyksIChzdGFjaykpCisKKy8qKgorICogY29yb3V0
aW5lX2p1bXAgLSBJcnJldmVyc2libHkgc3dpdGNoIHRvIGV4ZWN1dGluZyBhIGNvcm91dGluZQor
ICogQHRvOiBjb3JvdXRpbmUgdG8gc3dpdGNoIHRvCisgKgorICogSW1tZWRpYXRlbHkganVtcCB0
byBleGVjdXRpbmcgY29yb3V0aW5lIEB0byAoYXQgd2hhdGV2ZXIgcG9pbnQgaW4KKyAqIGV4ZWN1
dGlvbiBpdCB3YXMgdXAgdG8pLiAgTmV2ZXIgcmV0dXJucy4KKyAqLwordm9pZCBOT1JFVFVSTiBj
b3JvdXRpbmVfanVtcChjb25zdCBzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlICp0byk7CisKKy8qKgor
ICogY29yb3V0aW5lX3N3aXRjaCAtIFN3aXRjaCBjb3JvdXRpbmVzCisgKiBAZnJvbTogY29yb3V0
aW5lIGluIHdoaWNoIHRvIHN0b3JlIGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlCisgKiBAdG86IGNv
cm91dGluZSB0byBzd2l0Y2ggdG8KKyAqCisgKiBTdG9wIGV4ZWN1dGluZyB0aGUgY3VycmVudCBy
b3V0aW5lLCBzYXZpbmcgaXRzIHN0YXRlIGluIEBmcm9tLCBhbmQKKyAqIHN3aXRjaCB0byBleGVj
dXRpbmcgdGhlIGNvcm91dGluZSBAdG8uICBSZXR1cm5zIG9ubHkgd2hlbiBzb21ldGhpbmcKKyAq
IHN3aXRjaGVzIG9yIGp1bXBzIGJhY2sgdG8gQGZyb20uCisgKi8KK3ZvaWQgY29yb3V0aW5lX3N3
aXRjaChzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlICpmcm9tLAorCQkgICAgICBjb25zdCBzdHJ1Y3Qg
Y29yb3V0aW5lX3N0YXRlICp0byk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3Jv
dXRpbmVfaW5pdChzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlICpjcywKKwkJCQkgIHZvaWQgKCpmbiko
dm9pZCAqKSwgdm9pZCAqYXJnLAorCQkJCSAgc3RydWN0IGNvcm91dGluZV9zdGFjayAqc3RhY2sp
Cit7CisJYXNzZXJ0KDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgTk9SRVRVUk4gY29yb3V0
aW5lX2p1bXAoY29uc3Qgc3RydWN0IGNvcm91dGluZV9zdGF0ZSAqdG8pCit7CisJYXNzZXJ0KDAp
OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29yb3V0aW5lX3N3aXRjaChzdHJ1Y3QgY29yb3V0
aW5lX3N0YXRlICpmcm9tLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlICp0
bykKK3sKKwlhc3NlcnQoMCk7Cit9CisKKyNlbmRpZiAvKiAhQ09ST1VUSU5FX0FWQUlMQUJMRSAq
LworCisjZW5kaWYgLyogQ0NBTl9DT1JPVVRJTkVfSCAqLwpkaWZmIC0tZ2l0IGEvY2Nhbi9jb3Jv
dXRpbmUvdGVzdC9hcGktMS5jIGIvY2Nhbi9jb3JvdXRpbmUvdGVzdC9hcGktMS5jCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjEwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9j
Y2FuL2Nvcm91dGluZS90ZXN0L2FwaS0xLmMKQEAgLTAsMCArMSw1MiBAQAorI2luY2x1ZGUgPHN0
ZGxpYi5oPgorCisjaW5jbHVkZSA8Y2Nhbi9jb3JvdXRpbmUvY29yb3V0aW5lLmg+CisjaW5jbHVk
ZSA8Y2Nhbi90YXAvdGFwLmg+CisKK3N0YXRpYyBpbnQgZ2xvYmFsID0gMDsKKworc3RhdGljIHZv
aWQgdHJpdmlhbF9mbih2b2lkICpwKQoreworCXN0cnVjdCBjb3JvdXRpbmVfc3RhdGUgKnJldCA9
IChzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlICopcDsKKworCWdsb2JhbCA9IDE7CisKKwljb3JvdXRp
bmVfanVtcChyZXQpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3RyaXZpYWwoc3RydWN0IGNvcm91
dGluZV9zdGFjayAqc3RhY2spCit7CisJc3RydWN0IGNvcm91dGluZV9zdGF0ZSB0LCBtYXN0ZXI7
CisKKwlpZiAoIUNPUk9VVElORV9BVkFJTEFCTEUpIHsKKwkJc2tpcCgxLCAiQ29yb3V0aW5lcyBu
b3QgYXZhaWxhYmxlIik7CisJCXJldHVybjsKKwl9CisKKwljb3JvdXRpbmVfaW5pdCgmdCwgdHJp
dmlhbF9mbiwgJm1hc3Rlciwgc3RhY2spOworCWNvcm91dGluZV9zd2l0Y2goJm1hc3RlciwgJnQp
OworCisJb2sxKGdsb2JhbCA9PSAxKTsKK30KKworCitpbnQgbWFpbih2b2lkKQoreworCWNoYXIg
YnVmW0NPUk9VVElORV9NSU5fU1RLU1ogKyBDT1JPVVRJTkVfU1RLX09WRVJIRUFEXTsKKwlzdHJ1
Y3QgY29yb3V0aW5lX3N0YWNrICpzdGFjazsKKworCS8qIFRoaXMgaXMgaG93IG1hbnkgdGVzdHMg
eW91IHBsYW4gdG8gcnVuICovCisJcGxhbl90ZXN0cyg0KTsKKworCXN0YWNrID0gY29yb3V0aW5l
X3N0YWNrX2luaXQoYnVmLCBzaXplb2YoYnVmKSwgMCk7CisJb2sxKHN0YWNrICE9IE5VTEwpOwor
CW9rMShjb3JvdXRpbmVfc3RhY2tfY2hlY2soc3RhY2ssIE5VTEwpID09IHN0YWNrKTsKKwlvazEo
Y29yb3V0aW5lX3N0YWNrX3NpemUoc3RhY2spID09IENPUk9VVElORV9NSU5fU1RLU1opOworCisJ
dGVzdF90cml2aWFsKHN0YWNrKTsKKworCWNvcm91dGluZV9zdGFja19yZWxlYXNlKHN0YWNrKTsK
KworCS8qIFRoaXMgZXhpdHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgYWxsIHRlc3RzIHBhc3NlZCAq
LworCXJldHVybiBleGl0X3N0YXR1cygpOworfQpkaWZmIC0tZ2l0IGEvY2Nhbi9jb3JvdXRpbmUv
dGVzdC9hcGktMi5jIGIvY2Nhbi9jb3JvdXRpbmUvdGVzdC9hcGktMi5jCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NzQyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jY2FuL2Nv
cm91dGluZS90ZXN0L2FwaS0yLmMKQEAgLTAsMCArMSwxMTAgQEAKKyNpbmNsdWRlIDxzdGRsaWIu
aD4KKworI2luY2x1ZGUgPGNjYW4vY29yb3V0aW5lL2Nvcm91dGluZS5oPgorI2luY2x1ZGUgPGNj
YW4vdGFwL3RhcC5oPgorCitzdHJ1Y3Qgc3RhdGUgeworCXN0cnVjdCBjb3JvdXRpbmVfc3RhdGUg
YzEsIGMyOworCXN0cnVjdCBjb3JvdXRpbmVfc3RhdGUgbWFzdGVyOworCWludCB2YWw7Cit9Owor
CitzdGF0aWMgdm9pZCBmMSh2b2lkICpwKQoreworCXN0cnVjdCBzdGF0ZSAqc3RhdGUgPSAoc3Ry
dWN0IHN0YXRlICopcDsKKworCWNvcm91dGluZV9zd2l0Y2goJnN0YXRlLT5jMSwgJnN0YXRlLT5j
Mik7CisKKwlvayhzdGF0ZS0+dmFsID09IDE3LCAic3RhdGUtPnZhbCA9PSAlZCBbZXhwZWN0ZWQg
MTddIiwgc3RhdGUtPnZhbCk7CisJc3RhdGUtPnZhbCA9IDIzOworCisJY29yb3V0aW5lX3N3aXRj
aCgmc3RhdGUtPmMxLCAmc3RhdGUtPmMyKTsKKworCW9rKHN0YXRlLT52YWwgPT0gMjQsICJzdGF0
ZS0+dmFsID09ICVkIFtleHBlY3RlZCAyNF0iLCBzdGF0ZS0+dmFsKTsKKworCWNvcm91dGluZV9z
d2l0Y2goJnN0YXRlLT5jMSwgJnN0YXRlLT5jMik7CisKKwlvayhzdGF0ZS0+dmFsID09IDI2LCAi
c3RhdGUtPnZhbCA9PSAlZCBbZXhwZWN0ZWQgMjZdIiwgc3RhdGUtPnZhbCk7CisKKwljb3JvdXRp
bmVfc3dpdGNoKCZzdGF0ZS0+YzEsICZzdGF0ZS0+YzIpOworCisJb2soc3RhdGUtPnZhbCA9PSAy
OSwgInN0YXRlLT52YWwgPT0gJWQgW2V4cGVjdGVkIDI5XSIsIHN0YXRlLT52YWwpOworCisJY29y
b3V0aW5lX3N3aXRjaCgmc3RhdGUtPmMxLCAmc3RhdGUtPmMyKTsKK30KKworc3RhdGljIHZvaWQg
ZjIodm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBzdGF0ZSAqKXA7
CisKKwlzdGF0ZS0+dmFsID0gMTc7CisKKwljb3JvdXRpbmVfc3dpdGNoKCZzdGF0ZS0+YzIsICZz
dGF0ZS0+YzEpOworCisJb2soc3RhdGUtPnZhbCA9PSAyMywgInN0YXRlLT52YWwgPT0gJWQgW2V4
cGVjdGVkIDIzXSIsIHN0YXRlLT52YWwpOworCXN0YXRlLT52YWwgKz0gMTsKKworCWNvcm91dGlu
ZV9zd2l0Y2goJnN0YXRlLT5jMiwgJnN0YXRlLT5jMSk7CisKKwlzdGF0ZS0+dmFsICs9IDI7CisK
Kwljb3JvdXRpbmVfc3dpdGNoKCZzdGF0ZS0+YzIsICZzdGF0ZS0+YzEpOworCisJc3RhdGUtPnZh
bCArPSAzOworCisJY29yb3V0aW5lX3N3aXRjaCgmc3RhdGUtPmMyLCAmc3RhdGUtPmMxKTsKKwor
CWNvcm91dGluZV9qdW1wKCZzdGF0ZS0+bWFzdGVyKTsKK30KKworc3RhdGljIHZvaWQgdGVzdDEo
c2l6ZV90IGJ1ZnN6KQoreworCXZvaWQgKmJ1ZjEsICpidWYyOworCXN0cnVjdCBjb3JvdXRpbmVf
c3RhY2sgKnN0YWNrMSwgKnN0YWNrMjsKKworCWJ1ZjEgPSBtYWxsb2MoYnVmc3opOworCW9rMShi
dWYxICE9IE5VTEwpOworCXN0YWNrMSA9IGNvcm91dGluZV9zdGFja19pbml0KGJ1ZjEsIGJ1ZnN6
LCAwKTsKKwlkaWFnKCJidWYxPSVwIHN0YWNrMT0lcCBidWZzej0weCV6eCBvdmVyaGVhZD0weCV6
eFxuIiwKKwkgICAgIGJ1ZjEsIHN0YWNrMSwgYnVmc3osIENPUk9VVElORV9TVEtfT1ZFUkhFQUQp
OworCW9rMShjb3JvdXRpbmVfc3RhY2tfY2hlY2soc3RhY2sxLCBOVUxMKSA9PSBzdGFjazEpOwor
CW9rMShjb3JvdXRpbmVfc3RhY2tfc2l6ZShzdGFjazEpID09IGJ1ZnN6IC0gQ09ST1VUSU5FX1NU
S19PVkVSSEVBRCk7CisKKwlidWYyID0gbWFsbG9jKGJ1ZnN6KTsKKwlvazEoYnVmMiAhPSBOVUxM
KTsKKwlzdGFjazIgPSBjb3JvdXRpbmVfc3RhY2tfaW5pdChidWYyLCBidWZzeiwgMCk7CisJb2sx
KGNvcm91dGluZV9zdGFja19jaGVjayhzdGFjazIsIE5VTEwpID09IHN0YWNrMik7CisJb2sxKGNv
cm91dGluZV9zdGFja19zaXplKHN0YWNrMikgPT0gYnVmc3ogLSBDT1JPVVRJTkVfU1RLX09WRVJI
RUFEKTsKKworCWlmIChDT1JPVVRJTkVfQVZBSUxBQkxFKSB7CisJCXN0cnVjdCBzdGF0ZSBzOwor
CisJCWNvcm91dGluZV9pbml0KCZzLmMxLCBmMSwgJnMsIHN0YWNrMSk7CisJCWNvcm91dGluZV9p
bml0KCZzLmMyLCBmMiwgJnMsIHN0YWNrMik7CisKKwkJY29yb3V0aW5lX3N3aXRjaCgmcy5tYXN0
ZXIsICZzLmMxKTsKKwl9IGVsc2UgeworCQlza2lwKDUsICJDb3JvdXRpbmVzIG5vdCBhdmFpbGFi
bGUiKTsKKwl9CisKKwlvaygxLCAiQ29tcGxldGVkIHRlc3QxIik7CisKKwljb3JvdXRpbmVfc3Rh
Y2tfcmVsZWFzZShzdGFjazEpOworCW9rMShjb3JvdXRpbmVfc3RhY2tfY2hlY2soc3RhY2sxLCBO
VUxMKSA9PSBOVUxMKTsKKwlmcmVlKGJ1ZjEpOworCWNvcm91dGluZV9zdGFja19yZWxlYXNlKHN0
YWNrMik7CisJb2sxKGNvcm91dGluZV9zdGFja19jaGVjayhzdGFjazIsIE5VTEwpID09IE5VTEwp
OworCWZyZWUoYnVmMik7Cit9CisKKworaW50IG1haW4odm9pZCkKK3sKKwkvKiBUaGlzIGlzIGhv
dyBtYW55IHRlc3RzIHlvdSBwbGFuIHRvIHJ1biAqLworCXBsYW5fdGVzdHMoMTQpOworCisJdGVz
dDEoODE5Mik7CisKKwkvKiBUaGlzIGV4aXRzIGRlcGVuZGluZyBvbiB3aGV0aGVyIGFsbCB0ZXN0
cyBwYXNzZWQgKi8KKwlyZXR1cm4gZXhpdF9zdGF0dXMoKTsKK30KZGlmZiAtLWdpdCBhL2NjYW4v
Y29yb3V0aW5lL3Rlc3QvYXBpLTMuYyBiL2NjYW4vY29yb3V0aW5lL3Rlc3QvYXBpLTMuYwpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFhN2RhCi0tLSAvZGV2L251bGwKKysr
IGIvY2Nhbi9jb3JvdXRpbmUvdGVzdC9hcGktMy5jCkBAIC0wLDAgKzEsOTAgQEAKKyNpbmNsdWRl
IDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGNjYW4vY29yb3V0aW5lL2Nvcm91dGluZS5oPgorI2lu
Y2x1ZGUgPGNjYW4vdGFwL3RhcC5oPgorCisvKiBUZXN0IG1ldGFkYXRhICovCisjZGVmaW5lIE1F
VEFfTUFHSUMgMHg0ZDg2YWE4MmVjMTg5MmY2CisjZGVmaW5lIEJVRlNJWkUgICAgODE5MgorCitz
dHJ1Y3QgbWV0YWRhdGEgeworCXVpbnQ2NF90IG1hZ2ljOworfTsKKworc3RydWN0IHN0YXRlIHsK
KwlzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlIHJldDsKKwl1bnNpZ25lZCBsb25nIHRvdGFsOworfTsK
KworLyogVG91Y2ggYSBidW5jaCBvZiBzdGFjayAqLworc3RhdGljIHZvaWQgY2xvYmJlcih2b2lk
ICpwKQoreworCXN0cnVjdCBzdGF0ZSAqcyA9IChzdHJ1Y3Qgc3RhdGUgKilwOworCWNoYXIgYnVm
W0JVRlNJWkUgLSBDT1JPVVRJTkVfTUlOX1NUS1NaXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7
IGkgPCBzaXplb2YoYnVmKTsgaSsrKSB7CisJCWJ1ZltpXSA9IHJhbmRvbSgpICYgMHhmZjsKKwl9
CisKKwlkaWFnKCJXcm90ZSByYW5kb20gdG8gYnVmZmVyXG4iKTsKKworCXMtPnRvdGFsID0gMDsK
Kwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1Zik7IGkrKykgeworCQlzLT50b3RhbCArPSBidWZb
aV07CisJfQorCisJY29yb3V0aW5lX2p1bXAoJnMtPnJldCk7Cit9CisKK3N0YXRpYyB2b2lkIHRl
c3RfbWV0YWRhdGEoc3RydWN0IGNvcm91dGluZV9zdGFjayAqc3RhY2spCit7CisJc3RydWN0IG1l
dGFkYXRhICptZXRhOworCisJbWV0YSA9IGNvcm91dGluZV9zdGFja190b19tZXRhZGF0YShzdGFj
aywgc2l6ZW9mKCptZXRhKSk7CisJb2sxKGNvcm91dGluZV9zdGFja19mcm9tX21ldGFkYXRhKG1l
dGEsIHNpemVvZigqbWV0YSkpID09IHN0YWNrKTsKKworCW1ldGEtPm1hZ2ljID0gTUVUQV9NQUdJ
QzsKKwlvazEobWV0YS0+bWFnaWMgPT0gTUVUQV9NQUdJQyk7CisKKwlpZiAoQ09ST1VUSU5FX0FW
QUlMQUJMRSkgeworCQlzdHJ1Y3QgY29yb3V0aW5lX3N0YXRlIHQ7CisJCXN0cnVjdCBzdGF0ZSBz
ID0geworCQl9OworCisJCWNvcm91dGluZV9pbml0KCZ0LCBjbG9iYmVyLCAmcywgc3RhY2spOwor
CQljb3JvdXRpbmVfc3dpdGNoKCZzLnJldCwgJnQpOworCQlvazEocy50b3RhbCAhPSAwKTsKKwl9
IGVsc2UgeworCQlza2lwKDEsICJDb3JvdXRpbmVzIG5vdCBhdmFpbGFibGUiKTsKKwl9CisKKwlv
azEoY29yb3V0aW5lX3N0YWNrX3RvX21ldGFkYXRhKHN0YWNrLCBzaXplb2YoKm1ldGEpKSA9PSBt
ZXRhKTsKKwlvazEoY29yb3V0aW5lX3N0YWNrX2Zyb21fbWV0YWRhdGEobWV0YSwgc2l6ZW9mKCpt
ZXRhKSkgPT0gc3RhY2spOworCW9rMShtZXRhLT5tYWdpYyA9PSBNRVRBX01BR0lDKTsKK30KKwor
aW50IG1haW4odm9pZCkKK3sKKwljaGFyIGJ1ZltCVUZTSVpFXTsKKwlzdHJ1Y3QgY29yb3V0aW5l
X3N0YWNrICpzdGFjazsKKworCS8qIFRoaXMgaXMgaG93IG1hbnkgdGVzdHMgeW91IHBsYW4gdG8g
cnVuICovCisJcGxhbl90ZXN0cyg5KTsKKworCS8qIEZpeCBzZWVkIHNvIHdlIGdldCBjb25zaXN0
ZW50LCB0aG91Z2ggcHNldWRvLXJhbmRvbSByZXN1bHRzICovCQorCXNyYW5kb20oMCk7CisKKwlz
dGFjayA9IGNvcm91dGluZV9zdGFja19pbml0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIHNpemVvZihzdHJ1
Y3QgbWV0YWRhdGEpKTsKKwlvazEoc3RhY2sgIT0gTlVMTCk7CisJb2sxKGNvcm91dGluZV9zdGFj
a19jaGVjayhzdGFjaywgTlVMTCkgPT0gc3RhY2spOworCW9rMShjb3JvdXRpbmVfc3RhY2tfc2l6
ZShzdGFjaykKKwkgICAgPT0gQlVGU0laRSAtIENPUk9VVElORV9TVEtfT1ZFUkhFQUQgLSBzaXpl
b2Yoc3RydWN0IG1ldGFkYXRhKSk7CisKKwl0ZXN0X21ldGFkYXRhKHN0YWNrKTsKKworCWNvcm91
dGluZV9zdGFja19yZWxlYXNlKHN0YWNrKTsKKworCS8qIFRoaXMgZXhpdHMgZGVwZW5kaW5nIG9u
IHdoZXRoZXIgYWxsIHRlc3RzIHBhc3NlZCAqLworCXJldHVybiBleGl0X3N0YXR1cygpOworfQot
LSAKMi45LjMKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
CmNjYW4gbWFpbGluZyBsaXN0CmNjYW5AbGlzdHMub3psYWJzLm9yZwpodHRwczovL2xpc3RzLm96
bGFicy5vcmcvbGlzdGluZm8vY2Nhbgo=