ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vSE9XVE8gYi9Eb2N1bWVudGF0aW9uL0hPV1RPCmluZGV4IDhkNTFjMTQuLjQ4MTIzZGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vSE9XVE8KKysrIGIvRG9jdW1lbnRhdGlvbi9IT1dUTwpAQCAtMzAsNiArMzAsNyBAQAogZXhwZXJpZW5jZSwgdGhlIGZvbGxvd2luZyBib29rcyBhcmUgZ29vZCBmb3IsIGlmIGFueXRoaW5nLCByZWZlcmVuY2U6CiAgLSAiVGhlIEMgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UiIGJ5IEtlcm5pZ2hhbiBhbmQgUml0Y2hpZSBbUHJlbnRpY2UgSGFsbF0KICAtICJQcmFjdGljYWwgQyBQcm9ncmFtbWluZyIgYnkgU3RldmUgT3VhbGxpbmUgW08nUmVpbGx5XQorIC0gIkM6ICBBIFJlZmVyZW5jZSBNYW51YWwiIGJ5IEhhcmJpc29uIGFuZCBTdGVlbGUgW1ByZW50aWNlIEhhbGxdCiAKIFRoZSBrZXJuZWwgaXMgd3JpdHRlbiB1c2luZyBHTlUgQyBhbmQgdGhlIEdOVSB0b29sY2hhaW4uICBXaGlsZSBpdAogYWRoZXJlcyB0byB0aGUgSVNPIEM4OSBzdGFuZGFyZCwgaXQgdXNlcyBhIG51bWJlciBvZiBleHRlbnNpb25zIHRoYXQgYXJlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggMGJhNmFmMC4uMmRjNWU1ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMjc0LDYgKzI3NCw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCis8PDw8PDw8IHRlc3Q6RG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CiBXaGF0OglBQ1BJIGhvdGtleSBkcml2ZXIgKENPTkZJR19BQ1BJX0hPVEtFWSkKIFdoZW46CTIuNi4yMQogV2h5Oglob3RrZXkuYyB3YXMgYW4gYXR0ZW1wdCB0byBjb25zb2xpZGF0ZSBtdWx0aXBsZSBkcml2ZXJzIHRoYXQgdXNlCkBAIC0zMDYsMTEgKzMwNywxOCBAQAogCXRoZSBCSU9TIGNhbiBiZSBleHRyYWN0ZWQgYW5kIGRpc2Fzc2VtYmxlZCB3aXRoIGFjcGlkdW1wCiAJYW5kIGlhc2wgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcG10b29scyBwYWNrYWdlIGhlcmU6CiAJaHR0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL2xlbmIvYWNwaS91dGlscwotCiBXaG86CUxlbiBCcm93biA8bGVuLmJyb3duQGludGVsLmNvbT4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK1doYXQ6CUFDUEkgcHJvY2ZzIGludGVyZmFjZQorV2hlbjoJSnVseSAyMDA3CitXaHk6CUFmdGVyIEFDUEkgc3lzZnMgY29udmVyc2lvbiwgQUNQSSBhdHRyaWJ1dGVzIHdpbGwgYmUgZHVwbGljYXRlZAorCWluIHN5c2ZzIGFuZCB0aGUgQUNQSSBwcm9jZnMgaW50ZXJmYWNlIHNob3VsZCBiZSByZW1vdmVkLgorV2hvOglaaGFuZyBSdWkgPHJ1aS56aGFuZ0BpbnRlbC5jb20+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBXaGF0OgkvcHJvYy9hY3BpL2J1dHRvbgogV2hlbjoJQXVndXN0IDIwMDcKIFdoeToJL3Byb2MvYWNwaS9idXR0b24gaGFzIGJlZW4gcmVwbGFjZWQgYnkgZXZlbnRzIHRvIHRoZSBpbnB1dCBsYXllcgpAQCAtMzI1LDMgKzMzMywxMCBAQAogV2hvOglKZWZmIEdhcnppayA8amVmZkBnYXJ6aWsub3JnPgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDogICBzazk4bGluIG5ldHdvcmsgZHJpdmVyCitXaGVuOiAgIEp1bHkgMjAwNworV2h5OiAgICBJbiBrZXJuZWwgdHJlZSB2ZXJzaW9uIG9mIGRyaXZlciBpcyB1bm1haW50YWluZWQuIFNrOThsaW4gZHJpdmVyCisJcmVwbGFjZWQgYnkgdGhlIHNrZ2UgZHJpdmVyLiAKK1dobzogICAgU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW8tb3V0cHV0LnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW8tb3V0cHV0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTE3MDExCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlby1vdXRwdXQudHh0CkBAIC0wLDAgKzEsMzQgQEAKKworCQlWaWRlbyBPdXRwdXQgU3dpdGNoZXIgQ29udHJvbAorCQl+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCQkyMDA2IGx1bWluZy55dUBpbnRlbC5jb20KKworVGhlIG91dHB1dCBzeXNmcyBjbGFzcyBkcml2ZXIgcHJvdmlkZXMgYW4gYWJzdHJhY3QgdmlkZW8gb3V0cHV0IGxheWVyIHRoYXQKK2NhbiBiZSB1c2VkIHRvIGhvb2sgcGxhdGZvcm0gc3BlY2lmaWMgbWV0aG9kcyB0byBlbmFibGUvZGlzYWJsZSB2aWRlbyBvdXRwdXQKK2RldmljZSB0aHJvdWdoIGNvbW1vbiBzeXNmcyBpbnRlcmZhY2UuIEZvciBleGFtcGxlLCBvbiBteSBJQk0gVGhpbmtQYWQgVDQyCitsYXB0b3AsIFRoZSBBQ1BJIHZpZGVvIGRyaXZlciByZWdpc3RlcmVkIGl0cyBvdXRwdXQgZGV2aWNlcyBhbmQgcmVhZC93cml0ZQorbWV0aG9kIGZvciAnc3RhdGUnIHdpdGggb3V0cHV0IHN5c2ZzIGNsYXNzLiBUaGUgdXNlciBpbnRlcmZhY2UgdW5kZXIgc3lzZnMgaXM6CisKK2xpbnV4Oi9zeXMvY2xhc3MvdmlkZW9fb3V0cHV0ICMgdHJlZSAuCisuCit8LS0gQ1JUMAorfCAgIHwtLSBkZXZpY2UgLT4gLi4vLi4vLi4vZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MDEuMAorfCAgIHwtLSBzdGF0ZQorfCAgIHwtLSBzdWJzeXN0ZW0gLT4gLi4vLi4vLi4vY2xhc3MvdmlkZW9fb3V0cHV0Cit8ICAgYC0tIHVldmVudAorfC0tIERWSTAKK3wgICB8LS0gZGV2aWNlIC0+IC4uLy4uLy4uL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAxLjAKK3wgICB8LS0gc3RhdGUKK3wgICB8LS0gc3Vic3lzdGVtIC0+IC4uLy4uLy4uL2NsYXNzL3ZpZGVvX291dHB1dAorfCAgIGAtLSB1ZXZlbnQKK3wtLSBMQ0QwCit8ICAgfC0tIGRldmljZSAtPiAuLi8uLi8uLi9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDowMS4wCit8ICAgfC0tIHN0YXRlCit8ICAgfC0tIHN1YnN5c3RlbSAtPiAuLi8uLi8uLi9jbGFzcy92aWRlb19vdXRwdXQKK3wgICBgLS0gdWV2ZW50CitgLS0gVFYwCisgICB8LS0gZGV2aWNlIC0+IC4uLy4uLy4uL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAxLjAKKyAgIHwtLSBzdGF0ZQorICAgfC0tIHN1YnN5c3RlbSAtPiAuLi8uLi8uLi9jbGFzcy92aWRlb19vdXRwdXQKKyAgIGAtLSB1ZXZlbnQKKwpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCAxNmMwZTE1Li5mZTM1ZjNhIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNTg0LDEyICs1ODQsMzAgQEAKIFc6CWh0dHA6Ly94Zi5pa3NhaWYubmV0L2FjcGk0YXN1cwogUzoJTWFpbnRhaW5lZAogCitBU1VTIExBUFRPUCBFWFRSQVMgRFJJVkVSCitQOglDb3JlbnRpbiBDaGFyeQorTToJY29yZW50aW5jakBpa3NhaWYubmV0CitMOglhY3BpNGFzdXMtdXNlckBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1c6CWh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYWNwaTRhc3VzCitXOglodHRwOi8veGYuaWtzYWlmLm5ldC9hY3BpNGFzdXMKK1M6CU1haW50YWluZWQKKwogQVRBIE9WRVIgRVRIRVJORVQgRFJJVkVSCiBQOglFZCBMLiBDYXNoaW4KIE06CWVjYXNoaW5AY29yYWlkLmNvbQogVzoJaHR0cDovL3d3dy5jb3JhaWQuY29tL3N1cHBvcnQvbGludXgKIFM6CVN1cHBvcnRlZAogCitBVEwxIEVUSEVSTkVUIERSSVZFUgorUDoJSmF5IENsaWJ1cm4KK006CWpjbGlidXJuQGdtYWlsLmNvbQorUDoJQ2hyaXMgU25vb2sKK006CWNzbm9va0ByZWRoYXQuY29tCitMOglhdGwxLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAorVzoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9hdGwxCitXOglodHRwOi8vYXRsMS5zb3VyY2Vmb3JnZS5uZXQKK1M6CU1haW50YWluZWQKKwogQVRNCiBQOglDaGFzIFdpbGxpYW1zCiBNOgljaGFzQGNtZi5ucmwubmF2eS5taWwKQEAgLTI0NzcsNiArMjQ5NSwxMiBAQAogVzoJaHR0cDovL3d3dy5ub25nbnUub3JnL29yaW5vY28vCiBTOglNYWludGFpbmVkCiAKK1BBIFNFTUkgRVRIRVJORVQgRFJJVkVSCitQOglPbG9mIEpvaGFuc3NvbgorTToJb2xvZkBsaXhvbS5uZXQKK0w6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKKwogUEFSQUxMRUwgUE9SVCBTVVBQT1JUCiBQOglQaGlsIEJsdW5kZWxsCiBNOglwaGlsYkBnbnUub3JnCkBAIC0yNjQ2LDcgKzI2NzAsNyBAQAogCiBQUklTTTU0IFdJUkVMRVNTIERSSVZFUgogUDoJUHJpc201NCBEZXZlbG9wbWVudCBUZWFtCi1NOglwcmlzbTU0LXByaXZhdGVAcHJpc201NC5vcmcKK006CWRldmVsb3BlcnNAaXNsc20ub3JnCiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vcHJpc201NC5vcmcKIFM6CU1haW50YWluZWQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9kZWZjb25maWcgYi9hcmNoL2kzODYvZGVmY29uZmlnCmluZGV4IDVkODBlZGYuLmJiMGMzNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9kZWZjb25maWcKKysrIGIvYXJjaC9pMzg2L2RlZmNvbmZpZwpAQCAtNDY2LDcgKzQ2Niw4IEBACiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAogIwotIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKK0NPTkZJR19QTlA9eQorQ09ORklHX1BOUEFDUEk9eQogCiAjCiAjIEJsb2NrIGRldmljZXMKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IGNiY2IyYzIuLmU5NGFmZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYwpAQCAtNjYsNyArNjYsNyBAQAogCiAjZGVmaW5lIEJBRF9NQURUX0VOVFJZKGVudHJ5LCBlbmQpICgJCQkJCSAgICBcCiAJCSghZW50cnkpIHx8ICh1bnNpZ25lZCBsb25nKWVudHJ5ICsgc2l6ZW9mKCplbnRyeSkgPiBlbmQgfHwgIFwKLQkJKChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqKWVudHJ5KS0+bGVuZ3RoIDwgc2l6ZW9mKCplbnRyeSkpCisJCSgoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICopZW50cnkpLT5sZW5ndGggPCBzaXplb2YoKmVudHJ5KSkKIAogI2RlZmluZSBQUkVGSVgJCQkiQUNQSTogIgogCkBAIC03OSw3ICs3OSw3IEBACiBpbnQgYWNwaV9zdHJpY3Q7CiBFWFBPUlRfU1lNQk9MKGFjcGlfc3RyaWN0KTsKIAotYWNwaV9pbnRlcnJ1cHRfZmxhZ3MgYWNwaV9zY2lfZmxhZ3MgX19pbml0ZGF0YTsKK3U4IGFjcGlfc2NpX2ZsYWdzIF9faW5pdGRhdGE7CiBpbnQgYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpIF9faW5pdGRhdGE7CiBpbnQgYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIF9faW5pdGRhdGE7CiBpbnQgYWNwaV91c2VfdGltZXJfb3ZlcnJpZGUgX19pbml0ZGF0YTsKQEAgLTkyLDExICs5Miw2IEBACiAjd2FybmluZyBBQ1BJIHVzZXMgQ01QWENIRywgaTQ4NiBhbmQgbGF0ZXIgaGFyZHdhcmUKICNlbmRpZgogCi0jZGVmaW5lIE1BWF9NQURUX0VOVFJJRVMJMjU2Ci11OCB4ODZfYWNwaWlkX3RvX2FwaWNpZFtNQVhfTUFEVF9FTlRSSUVTXSA9Ci0gICAge1swIC4uLiBNQVhfTUFEVF9FTlRSSUVTIC0gMV0gPSAweGZmIH07Ci1FWFBPUlRfU1lNQk9MKHg4Nl9hY3BpaWRfdG9fYXBpY2lkKTsKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb3QtdGltZSBDb25maWd1cmF0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTY2LDMwICsxNjEsMjYgQEAKIAogI2lmZGVmIENPTkZJR19QQ0lfTU1DT05GSUcKIC8qIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBNTUNPTkZJRyBhcGVydHVyZS4gIFNldCBmcm9tIEFDUEkgdGFibGVzLiAqLwotc3RydWN0IGFjcGlfdGFibGVfbWNmZ19jb25maWcgKnBjaV9tbWNmZ19jb25maWc7CitzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24gKnBjaV9tbWNmZ19jb25maWc7CiBpbnQgcGNpX21tY2ZnX2NvbmZpZ19udW07CiAKLWludCBfX2luaXQgYWNwaV9wYXJzZV9tY2ZnKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitpbnQgX19pbml0IGFjcGlfcGFyc2VfbWNmZyhzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlcikKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnICptY2ZnOwogCXVuc2lnbmVkIGxvbmcgaTsKIAlpbnQgY29uZmlnX3NpemU7CiAKLQlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKKwlpZiAoIWhlYWRlcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltY2ZnID0gKHN0cnVjdCBhY3BpX3RhYmxlX21jZmcgKilfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7Ci0JaWYgKCFtY2ZnKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIE1DRkdcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJbWNmZyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnICopaGVhZGVyOwogCiAJLyogaG93IG1hbnkgY29uZmlnIHN0cnVjdHVyZXMgZG8gd2UgaGF2ZSAqLwogCXBjaV9tbWNmZ19jb25maWdfbnVtID0gMDsKLQlpID0gc2l6ZSAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnKTsKLQl3aGlsZSAoaSA+PSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfbWNmZ19jb25maWcpKSB7CisJaSA9IGhlYWRlci0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX21jZmcpOworCXdoaWxlIChpID49IHNpemVvZihzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24pKSB7CiAJCSsrcGNpX21tY2ZnX2NvbmZpZ19udW07Ci0JCWkgLT0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnKTsKKwkJaSAtPSBzaXplb2Yoc3RydWN0IGFjcGlfbWNmZ19hbGxvY2F0aW9uKTsKIAl9OwogCWlmIChwY2lfbW1jZmdfY29uZmlnX251bSA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIk1NQ09ORklHIGhhcyBubyBlbnRyaWVzXG4iKTsKQEAgLTIwNCw5ICsxOTUsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQltZW1jcHkocGNpX21tY2ZnX2NvbmZpZywgJm1jZmctPmNvbmZpZywgY29uZmlnX3NpemUpOworCW1lbWNweShwY2lfbW1jZmdfY29uZmlnLCAmbWNmZ1sxXSwgY29uZmlnX3NpemUpOwogCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgKytpKSB7Ci0JCWlmIChtY2ZnLT5jb25maWdbaV0uYmFzZV9yZXNlcnZlZCkgeworCQlpZiAocGNpX21tY2ZnX2NvbmZpZ1tpXS5hZGRyZXNzID4gMHhGRkZGRkZGRikgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAogCQkJICAgICAgICJNTUNPTkZJRyBub3QgaW4gbG93IDRHQiBvZiBtZW1vcnlcbiIpOwogCQkJa2ZyZWUocGNpX21tY2ZnX2NvbmZpZyk7CkBAIC0yMjAsMjQgKzIxMSwyNCBAQAogI2VuZGlmCQkJCS8qIENPTkZJR19QQ0lfTU1DT05GSUcgKi8KIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9tYWR0KHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX21hZHQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICptYWR0ID0gTlVMTDsKIAotCWlmICghcGh5c19hZGRyIHx8ICFzaXplIHx8ICFjcHVfaGFzX2FwaWMpCisJaWYgKCFjcHVfaGFzX2FwaWMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWFkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICopX19hY3BpX21hcF90YWJsZShwaHlzX2FkZHIsIHNpemUpOworCW1hZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqKXRhYmxlOwogCWlmICghbWFkdCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBNQURUXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKG1hZHQtPmxhcGljX2FkZHJlc3MpIHsKLQkJYWNwaV9sYXBpY19hZGRyID0gKHU2NCkgbWFkdC0+bGFwaWNfYWRkcmVzczsKKwlpZiAobWFkdC0+YWRkcmVzcykgeworCQlhY3BpX2xhcGljX2FkZHIgPSAodTY0KSBtYWR0LT5hZGRyZXNzOwogCiAJCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWCAiTG9jYWwgQVBJQyBhZGRyZXNzIDB4JTA4eFxuIiwKLQkJICAgICAgIG1hZHQtPmxhcGljX2FkZHJlc3MpOworCQkgICAgICAgbWFkdC0+YWRkcmVzcyk7CiAJfQogCiAJYWNwaV9tYWR0X29lbV9jaGVjayhtYWR0LT5oZWFkZXIub2VtX2lkLCBtYWR0LT5oZWFkZXIub2VtX3RhYmxlX2lkKTsKQEAgLTI0NiwyMSArMjM3LDE3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2xhcGljKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfbGFwaWMoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpYyAqcHJvY2Vzc29yID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWMgKnByb2Nlc3NvciA9IE5VTEw7CiAKLQlwcm9jZXNzb3IgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWMgKiloZWFkZXI7CisJcHJvY2Vzc29yID0gKHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfYXBpYyAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShwcm9jZXNzb3IsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5KGhlYWRlcik7CiAKLQkvKiBSZWNvcmQgbG9jYWwgYXBpYyBpZCBvbmx5IHdoZW4gZW5hYmxlZCAqLwotCWlmIChwcm9jZXNzb3ItPmZsYWdzLmVuYWJsZWQpCi0JCXg4Nl9hY3BpaWRfdG9fYXBpY2lkW3Byb2Nlc3Nvci0+YWNwaV9pZF0gPSBwcm9jZXNzb3ItPmlkOwotCiAJLyoKIAkgKiBXZSBuZWVkIHRvIHJlZ2lzdGVyIGRpc2FibGVkIENQVSBhcyB3ZWxsIHRvIHBlcm1pdAogCSAqIGNvdW50aW5nIGRpc2FibGVkIENQVXMuIFRoaXMgYWxsb3dzIHVzIHRvIHNpemUKQEAgLTI2OSwxOCArMjU2LDE4IEBACiAJICogd2hlbiB3ZSB1c2UgQ1BVIGhvdHBsdWcuCiAJICovCiAJbXBfcmVnaXN0ZXJfbGFwaWMocHJvY2Vzc29yLT5pZCwJLyogQVBJQyBJRCAqLwotCQkJICBwcm9jZXNzb3ItPmZsYWdzLmVuYWJsZWQpOwkvKiBFbmFibGVkPyAqLworCQkJICBwcm9jZXNzb3ItPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpOwkvKiBFbmFibGVkPyAqLwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLAorYWNwaV9wYXJzZV9sYXBpY19hZGRyX292cihzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKiBoZWFkZXIsCiAJCQkgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICpsYXBpY19hZGRyX292ciA9IE5VTEw7CisJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljX292ZXJyaWRlICpsYXBpY19hZGRyX292ciA9IE5VTEw7CiAKLQlsYXBpY19hZGRyX292ciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sYXBpY19hZGRyX292ciAqKWhlYWRlcjsKKwlsYXBpY19hZGRyX292ciA9IChzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWNfb3ZlcnJpZGUgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkobGFwaWNfYWRkcl9vdnIsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjkxLDExICsyNzgsMTEgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfbGFwaWNfbm1pKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfbGFwaWNfbm1pKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfbm1pICpsYXBpY19ubWkgPSBOVUxMOworCXN0cnVjdCBhY3BpX21hZHRfbG9jYWxfYXBpY19ubWkgKmxhcGljX25taSA9IE5VTEw7CiAKLQlsYXBpY19ubWkgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfbm1pICopaGVhZGVyOworCWxhcGljX25taSA9IChzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWNfbm1pICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKGxhcGljX25taSwgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMTMsMTEgKzMwMCwxMSBAQAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9pb2FwaWMoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQorYWNwaV9wYXJzZV9pb2FwaWMoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9pb2FwaWMgKmlvYXBpYyA9IE5VTEw7CisJc3RydWN0IGFjcGlfbWFkdF9pb19hcGljICppb2FwaWMgPSBOVUxMOwogCi0JaW9hcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2lvYXBpYyAqKWhlYWRlcjsKKwlpb2FwaWMgPSAoc3RydWN0IGFjcGlfbWFkdF9pb19hcGljICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKGlvYXBpYywgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNDIsMTEgKzMyOSwxMSBAQAogCQlwb2xhcml0eSA9IDM7CiAKIAkvKiBDb21tYW5kLWxpbmUgb3Zlci1yaWRlIHZpYSBhY3BpX3NjaT0gKi8KLQlpZiAoYWNwaV9zY2lfZmxhZ3MudHJpZ2dlcikKLQkJdHJpZ2dlciA9IGFjcGlfc2NpX2ZsYWdzLnRyaWdnZXI7CisJaWYgKGFjcGlfc2NpX2ZsYWdzICYgQUNQSV9NQURUX1RSSUdHRVJfTUFTSykKKwkJdHJpZ2dlciA9IChhY3BpX3NjaV9mbGFncyAmIEFDUElfTUFEVF9UUklHR0VSX01BU0spID4+IDI7CiAKLQlpZiAoYWNwaV9zY2lfZmxhZ3MucG9sYXJpdHkpCi0JCXBvbGFyaXR5ID0gYWNwaV9zY2lfZmxhZ3MucG9sYXJpdHk7CisJaWYgKGFjcGlfc2NpX2ZsYWdzICYgQUNQSV9NQURUX1BPTEFSSVRZX01BU0spCisJCXBvbGFyaXR5ID0gYWNwaV9zY2lfZmxhZ3MgJiBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTSzsKIAogCS8qCiAJICogbXBfY29uZmlnX2FjcGlfbGVnYWN5X2lycXMoKSBhbHJlYWR5IHNldHVwIElSUXMgPCAxNgpAQCAtMzU3LDUxICszNDQsNTIgQEAKIAogCS8qCiAJICogc3Rhc2ggb3Zlci1yaWRlIHRvIGluZGljYXRlIHdlJ3ZlIGJlZW4gaGVyZQotCSAqIGFuZCBmb3IgbGF0ZXIgdXBkYXRlIG9mIGFjcGlfZmFkdAorCSAqIGFuZCBmb3IgbGF0ZXIgdXBkYXRlIG9mIGFjcGlfZ2JsX0ZBRFQKIAkgKi8KIAlhY3BpX3NjaV9vdmVycmlkZV9nc2kgPSBnc2k7CiAJcmV0dXJuOwogfQogCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9pbnRfc3JjX292cihhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwKK2FjcGlfcGFyc2VfaW50X3NyY19vdnIoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICogaGVhZGVyLAogCQkgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIgKmludHNyYyA9IE5VTEw7CisJc3RydWN0IGFjcGlfbWFkdF9pbnRlcnJ1cHRfb3ZlcnJpZGUgKmludHNyYyA9IE5VTEw7CiAKLQlpbnRzcmMgPSAoc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIgKiloZWFkZXI7CisJaW50c3JjID0gKHN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X292ZXJyaWRlICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKGludHNyYywgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlhY3BpX3RhYmxlX3ByaW50X21hZHRfZW50cnkoaGVhZGVyKTsKIAotCWlmIChpbnRzcmMtPmJ1c19pcnEgPT0gYWNwaV9mYWR0LnNjaV9pbnQpIHsKKwlpZiAoaW50c3JjLT5zb3VyY2VfaXJxID09IGFjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdCkgewogCQlhY3BpX3NjaV9pb2FwaWNfc2V0dXAoaW50c3JjLT5nbG9iYWxfaXJxLAotCQkJCSAgICAgIGludHNyYy0+ZmxhZ3MucG9sYXJpdHksCi0JCQkJICAgICAgaW50c3JjLT5mbGFncy50cmlnZ2VyKTsKKwkJCQkgICAgICBpbnRzcmMtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTSywKKwkJCQkgICAgICAoaW50c3JjLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1RSSUdHRVJfTUFTSykgPj4gMik7CiAJCXJldHVybiAwOwogCX0KIAogCWlmIChhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgJiYKLQkgICAgaW50c3JjLT5idXNfaXJxID09IDAgJiYgaW50c3JjLT5nbG9iYWxfaXJxID09IDIpIHsKKwkgICAgaW50c3JjLT5zb3VyY2VfaXJxID09IDAgJiYgaW50c3JjLT5nbG9iYWxfaXJxID09IDIpIHsKIAkJcHJpbnRrKFBSRUZJWCAiQklPUyBJUlEwIHBpbjIgb3ZlcnJpZGUgaWdub3JlZC5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQltcF9vdmVycmlkZV9sZWdhY3lfaXJxKGludHNyYy0+YnVzX2lycSwKLQkJCSAgICAgICBpbnRzcmMtPmZsYWdzLnBvbGFyaXR5LAotCQkJICAgICAgIGludHNyYy0+ZmxhZ3MudHJpZ2dlciwgaW50c3JjLT5nbG9iYWxfaXJxKTsKKwltcF9vdmVycmlkZV9sZWdhY3lfaXJxKGludHNyYy0+c291cmNlX2lycSwKKwkJCQlpbnRzcmMtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTSywKKwkJCQkoaW50c3JjLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1RSSUdHRVJfTUFTSykgPj4gMiwKKwkJCQlpbnRzcmMtPmdsb2JhbF9pcnEpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX25taV9zcmMoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQorYWNwaV9wYXJzZV9ubWlfc3JjKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyAqbm1pX3NyYyA9IE5VTEw7CisJc3RydWN0IGFjcGlfbWFkdF9ubWlfc291cmNlICpubWlfc3JjID0gTlVMTDsKIAotCW5taV9zcmMgPSAoc3RydWN0IGFjcGlfdGFibGVfbm1pX3NyYyAqKWhlYWRlcjsKKwlubWlfc3JjID0gKHN0cnVjdCBhY3BpX21hZHRfbm1pX3NvdXJjZSAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShubWlfc3JjLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQxNyw3ICs0MDUsNyBAQAogCiAvKgogICogYWNwaV9waWNfc2NpX3NldF90cmlnZ2VyKCkKLSAqIAorICoKICAqIHVzZSBFTENSIHRvIHNldCBQSUMtbW9kZSB0cmlnZ2VyIHR5cGUgZm9yIFNDSQogICoKICAqIElmIGEgUElDLW1vZGUgU0NJIGlzIG5vdCByZWNvZ25pemVkIG9yIGdpdmVzIHNwdXJpb3VzIElSUTcncwpAQCAtNTExLDcgKzQ5OSw3IEBACiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwotCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljICpsYXBpYzsKKwlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWMgKmxhcGljOwogCWNwdW1hc2tfdCB0bXBfbWFwLCBuZXdfbWFwOwogCXU4IHBoeXNpZDsKIAlpbnQgY3B1OwpAQCAtNTI5LDEwICs1MTcsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbGFwaWMgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWMgKilvYmotPmJ1ZmZlci5wb2ludGVyOworCWxhcGljID0gKHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfYXBpYyAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CiAKLQlpZiAoKGxhcGljLT5oZWFkZXIudHlwZSAhPSBBQ1BJX01BRFRfTEFQSUMpIHx8Ci0JICAgICghbGFwaWMtPmZsYWdzLmVuYWJsZWQpKSB7CisJaWYgKGxhcGljLT5oZWFkZXIudHlwZSAhPSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9BUElDIHx8CisJICAgICEobGFwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKSB7CiAJCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNTQ0LDcgKzUzMiw3IEBACiAJYnVmZmVyLnBvaW50ZXIgPSBOVUxMOwogCiAJdG1wX21hcCA9IGNwdV9wcmVzZW50X21hcDsKLQltcF9yZWdpc3Rlcl9sYXBpYyhwaHlzaWQsIGxhcGljLT5mbGFncy5lbmFibGVkKTsKKwltcF9yZWdpc3Rlcl9sYXBpYyhwaHlzaWQsIGxhcGljLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKTsKIAogCS8qCiAJICogSWYgbXBfcmVnaXN0ZXJfbGFwaWMgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlcyBhIG5ldyBsb2dpY2FsIGNwdQpAQCAtNTY2LDE0ICs1NTQsNiBAQAogCiBpbnQgYWNwaV91bm1hcF9sc2FwaWMoaW50IGNwdSkKIHsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCWlmICh4ODZfYWNwaWlkX3RvX2FwaWNpZFtpXSA9PSB4ODZfY3B1X3RvX2FwaWNpZFtjcHVdKSB7Ci0JCQl4ODZfYWNwaWlkX3RvX2FwaWNpZFtpXSA9IC0xOwotCQkJYnJlYWs7Ci0JCX0KLQl9CiAJeDg2X2NwdV90b19hcGljaWRbY3B1XSA9IC0xOwogCWNwdV9jbGVhcihjcHUsIGNwdV9wcmVzZW50X21hcCk7CiAJbnVtX3Byb2Nlc3NvcnMtLTsKQEAgLTYxOSw0MiArNTk5LDM2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2Vfc2JmKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX3NiZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX3NiZiAqc2I7CisJc3RydWN0IGFjcGlfdGFibGVfYm9vdCAqc2I7CiAKLQlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzYiA9IChzdHJ1Y3QgYWNwaV90YWJsZV9zYmYgKilfX2FjcGlfbWFwX3RhYmxlKHBoeXNfYWRkciwgc2l6ZSk7CisJc2IgPSAoc3RydWN0IGFjcGlfdGFibGVfYm9vdCAqKXRhYmxlOwogCWlmICghc2IpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgU0JGXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc2JmX3BvcnQgPSBzYi0+c2JmX2Ntb3M7CS8qIFNhdmUgQ01PUyBwb3J0ICovCisJc2JmX3BvcnQgPSBzYi0+Y21vc19pbmRleDsJLyogU2F2ZSBDTU9TIHBvcnQgKi8KIAogCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX0hQRVRfVElNRVIKIAotc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9ocGV0KHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9ocGV0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaHBldCAqaHBldF90Ymw7CiAJc3RydWN0IHJlc291cmNlICpocGV0X3JlczsKIAlyZXNvdXJjZV9zaXplX3QgcmVzX3N0YXJ0OwogCi0JaWYgKCFwaHlzIHx8ICFzaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWhwZXRfdGJsID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hwZXQgKilfX2FjcGlfbWFwX3RhYmxlKHBoeXMsIHNpemUpOworCWhwZXRfdGJsID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hwZXQgKil0YWJsZTsKIAlpZiAoIWhwZXRfdGJsKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIEhQRVRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoaHBldF90YmwtPmFkZHIuc3BhY2VfaWQgIT0gQUNQSV9TUEFDRV9NRU0pIHsKKwlpZiAoaHBldF90YmwtPmFkZHJlc3Muc3BhY2VfaWQgIT0gQUNQSV9TUEFDRV9NRU0pIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIkhQRVQgdGltZXJzIG11c3QgYmUgbG9jYXRlZCBpbiAiCiAJCSAgICAgICAibWVtb3J5LlxuIik7CiAJCXJldHVybiAtMTsKQEAgLTY2NywyOSArNjQxLDI4IEBACiAJCWhwZXRfcmVzLT5uYW1lID0gKHZvaWQgKikmaHBldF9yZXNbMV07CiAJCWhwZXRfcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOwogCQlzbnByaW50ZigoY2hhciAqKWhwZXRfcmVzLT5uYW1lLCBIUEVUX1JFU09VUkNFX05BTUVfU0laRSwKLQkJCSAiSFBFVCAldSIsIGhwZXRfdGJsLT5udW1iZXIpOworCQkJICJIUEVUICV1IiwgaHBldF90YmwtPnNlcXVlbmNlKTsKIAkJaHBldF9yZXMtPmVuZCA9ICgxICogMTAyNCkgLSAxOwogCX0KIAotI2lmZGVmCUNPTkZJR19YODZfNjQKLQl2eHRpbWUuaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHIuYWRkcmwgfAotCSAgICAoKGxvbmcpaHBldF90YmwtPmFkZHIuYWRkcmggPDwgMzIpOworI2lmZGVmIENPTkZJR19YODZfNjQKKwl2eHRpbWUuaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHJlc3MuYWRkcmVzczsKIAogCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJIUEVUIGlkOiAlI3ggYmFzZTogJSNseFxuIiwKLQkgICAgICAgaHBldF90YmwtPmlkLCB2eHRpbWUuaHBldF9hZGRyZXNzKTsKKwkJaHBldF90YmwtPmlkLCB2eHRpbWUuaHBldF9hZGRyZXNzKTsKIAogCXJlc19zdGFydCA9IHZ4dGltZS5ocGV0X2FkZHJlc3M7Ci0jZWxzZQkJCQkvKiBYODYgKi8KKyNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYODYgKi8KIAl7CiAJCWV4dGVybiB1bnNpZ25lZCBsb25nIGhwZXRfYWRkcmVzczsKIAotCQlocGV0X2FkZHJlc3MgPSBocGV0X3RibC0+YWRkci5hZGRybDsKKwkJaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHJlc3MuYWRkcmVzczsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkhQRVQgaWQ6ICUjeCBiYXNlOiAlI2x4XG4iLAotCQkgICAgICAgaHBldF90YmwtPmlkLCBocGV0X2FkZHJlc3MpOworCQkJaHBldF90YmwtPmlkLCBocGV0X2FkZHJlc3MpOwogCiAJCXJlc19zdGFydCA9IGhwZXRfYWRkcmVzczsKIAl9Ci0jZW5kaWYJCQkJLyogWDg2ICovCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogWDg2ICovCiAKIAlpZiAoaHBldF9yZXMpIHsKIAkJaHBldF9yZXMtPnN0YXJ0ID0gcmVzX3N0YXJ0OwpAQCAtNzA3LDQyICs2ODAsMjggQEAKIGV4dGVybiB1MzIgcG10bXJfaW9wb3J0OwogI2VuZGlmCiAKLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfZmFkdCh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfZmFkdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKQogewotCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgKmZhZHQgPSBOVUxMOwotCi0JZmFkdCA9IChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICopX19hY3BpX21hcF90YWJsZShwaHlzLCBzaXplKTsKLQlpZiAoIWZhZHQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgRkFEVFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBpbml0aWFsaXplIHNjaV9pbnQgZWFybHkgZm9yIElOVF9TUkNfT1ZSIE1BRFQgcGFyc2luZyAqLwotCWFjcGlfZmFkdC5zY2lfaW50ID0gZmFkdC0+c2NpX2ludDsKLQotCS8qIGluaXRpYWxpemUgcmV2IGFuZCBhcGljX3BoeXNfZGVzdF9tb2RlIGZvciB4ODZfNjQgZ2VuYXBpYyAqLwotCWFjcGlfZmFkdC5yZXZpc2lvbiA9IGZhZHQtPnJldmlzaW9uOwotCWFjcGlfZmFkdC5mb3JjZV9hcGljX3BoeXNpY2FsX2Rlc3RpbmF0aW9uX21vZGUgPQotCSAgICBmYWR0LT5mb3JjZV9hcGljX3BoeXNpY2FsX2Rlc3RpbmF0aW9uX21vZGU7CiAKICNpZmRlZiBDT05GSUdfWDg2X1BNX1RJTUVSCiAJLyogZGV0ZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgQUNQSSBQTSBUaW1lciAqLwotCWlmIChmYWR0LT5yZXZpc2lvbiA+PSBGQURUMl9SRVZJU0lPTl9JRCkgeworCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5yZXZpc2lvbiA+PSBGQURUMl9SRVZJU0lPTl9JRCkgewogCQkvKiBGQURUIHJldi4gMiAqLwotCQlpZiAoZmFkdC0+eHBtX3Rtcl9ibGsuYWRkcmVzc19zcGFjZV9pZCAhPQorCQlpZiAoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suc3BhY2VfaWQgIT0KIAkJICAgIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykKIAkJCXJldHVybiAwOwogCi0JCXBtdG1yX2lvcG9ydCA9IGZhZHQtPnhwbV90bXJfYmxrLmFkZHJlc3M7CisJCXBtdG1yX2lvcG9ydCA9IGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3M7CiAJCS8qCiAJCSAqICJYIiBmaWVsZHMgYXJlIG9wdGlvbmFsIGV4dGVuc2lvbnMgdG8gdGhlIG9yaWdpbmFsIFYxLjAKIAkJICogZmllbGRzLCBzbyB3ZSBtdXN0IHNlbGVjdGl2ZWx5IGV4cGFuZCBWMS4wIGZpZWxkcyBpZiB0aGUKIAkJICogY29ycmVzcG9uZGluZyBYIGZpZWxkIGlzIHplcm8uCiAJIAkgKi8KIAkJaWYgKCFwbXRtcl9pb3BvcnQpCi0JCQlwbXRtcl9pb3BvcnQgPSBmYWR0LT5WMV9wbV90bXJfYmxrOworCQkJcG10bXJfaW9wb3J0ID0gYWNwaV9nYmxfRkFEVC5wbV90aW1lcl9ibG9jazsKIAl9IGVsc2UgewogCQkvKiBGQURUIHJldi4gMSAqLwotCQlwbXRtcl9pb3BvcnQgPSBmYWR0LT5WMV9wbV90bXJfYmxrOworCQlwbXRtcl9pb3BvcnQgPSBhY3BpX2dibF9GQURULnBtX3RpbWVyX2Jsb2NrOwogCX0KIAlpZiAocG10bXJfaW9wb3J0KQogCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiUE0tVGltZXIgSU8gUG9ydDogJSN4XG4iLApAQCAtNzg0LDEzICs3NDMsMTMgQEAKIAlpZiAoIWNwdV9oYXNfYXBpYykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQkvKiAKKwkvKgogCSAqIE5vdGUgdGhhdCB0aGUgTEFQSUMgYWRkcmVzcyBpcyBvYnRhaW5lZCBmcm9tIHRoZSBNQURUICgzMi1iaXQgdmFsdWUpCiAJICogYW5kIChvcHRpb25hbGx5KSBvdmVycmlkZW4gYnkgYSBMQVBJQ19BRERSX09WUiBlbnRyeSAoNjQtYml0IHZhbHVlKS4KIAkgKi8KIAogCWNvdW50ID0KLQkgICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQ19BRERSX09WUiwKKwkgICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUNfT1ZFUlJJREUsCiAJCQkJICBhY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyLCAwKTsKIAlpZiAoY291bnQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKQEAgLTgwMCw3ICs3NTksNyBAQAogCiAJbXBfcmVnaXN0ZXJfbGFwaWNfYWRkcmVzcyhhY3BpX2xhcGljX2FkZHIpOwogCi0JY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0xBUElDLCBhY3BpX3BhcnNlX2xhcGljLAorCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUMsIGFjcGlfcGFyc2VfbGFwaWMsCiAJCQkJICAgICAgTUFYX0FQSUNTKTsKIAlpZiAoIWNvdW50KSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIk5vIExBUElDIGVudHJpZXMgcHJlc2VudFxuIik7CkBAIC04MTMsNyArNzcyLDcgQEAKIAl9CiAKIAljb3VudCA9Ci0JICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTEFQSUNfTk1JLCBhY3BpX3BhcnNlX2xhcGljX25taSwgMCk7CisJICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9MT0NBTF9BUElDX05NSSwgYWNwaV9wYXJzZV9sYXBpY19ubWksIDApOwogCWlmIChjb3VudCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBMQVBJQyBOTUkgZW50cnlcbiIpOwogCQkvKiBUQkQ6IENsZWFudXAgdG8gYWxsb3cgZmFsbGJhY2sgdG8gTVBTICovCkBAIC04NDIsNyArODAxLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKCFjcHVfaGFzX2FwaWMpIAorCWlmICghY3B1X2hhc19hcGljKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qCkBAIC04NTUsNyArODE0LDcgQEAKIAl9CiAKIAljb3VudCA9Ci0JICAgIGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfSU9BUElDLCBhY3BpX3BhcnNlX2lvYXBpYywKKwkgICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0lPX0FQSUMsIGFjcGlfcGFyc2VfaW9hcGljLAogCQkJCSAgTUFYX0lPX0FQSUNTKTsKIAlpZiAoIWNvdW50KSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIk5vIElPQVBJQyBlbnRyaWVzIHByZXNlbnRcbiIpOwpAQCAtODY2LDcgKzgyNSw3IEBACiAJfQogCiAJY291bnQgPQotCSAgICBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX0lOVF9TUkNfT1ZSLCBhY3BpX3BhcnNlX2ludF9zcmNfb3ZyLAorCSAgICBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1RZUEVfSU5URVJSVVBUX09WRVJSSURFLCBhY3BpX3BhcnNlX2ludF9zcmNfb3ZyLAogCQkJCSAgTlJfSVJRX1ZFQ1RPUlMpOwogCWlmIChjb3VudCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWApAQCAtODgwLDEzICs4MzksMTMgQEAKIAkgKiBwcmV0ZW5kIHdlIGdvdCBvbmUgc28gd2UgY2FuIHNldCB0aGUgU0NJIGZsYWdzLgogCSAqLwogCWlmICghYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpKQotCQlhY3BpX3NjaV9pb2FwaWNfc2V0dXAoYWNwaV9mYWR0LnNjaV9pbnQsIDAsIDApOworCQlhY3BpX3NjaV9pb2FwaWNfc2V0dXAoYWNwaV9nYmxfRkFEVC5zY2lfaW50ZXJydXB0LCAwLCAwKTsKIAogCS8qIEZpbGwgaW4gaWRlbnRpdHkgbGVnYWN5IG1hcGluZ3Mgd2hlcmUgbm8gb3ZlcnJpZGUgKi8KIAltcF9jb25maWdfYWNwaV9sZWdhY3lfaXJxcygpOwogCiAJY291bnQgPQotCSAgICBhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX05NSV9TUkMsIGFjcGlfcGFyc2Vfbm1pX3NyYywKKwkgICAgYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX05NSV9TT1VSQ0UsIGFjcGlfcGFyc2Vfbm1pX3NyYywKIAkJCQkgIE5SX0lSUV9WRUNUT1JTKTsKIAlpZiAoY291bnQgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTk1JIFNSQyBlbnRyeVxuIik7CkBAIC05MDgsNyArODY3LDcgQEAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAlpbnQgY291bnQsIGVycm9yOwogCi0JY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlKEFDUElfQVBJQywgYWNwaV9wYXJzZV9tYWR0KTsKKwljb3VudCA9IGFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfTUFEVCwgYWNwaV9wYXJzZV9tYWR0KTsKIAlpZiAoY291bnQgPj0gMSkgewogCiAJCS8qCkBAIC0xMTk1LDcgKzExNTQsNyBAQAogCWlmIChhY3BpX2Rpc2FibGVkICYmICFhY3BpX2h0KQogCQlyZXR1cm4gMTsKIAotCS8qIAorCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgQUNQSSBib290LXRpbWUgdGFibGUgcGFyc2VyLgogCSAqLwogCWVycm9yID0gYWNwaV90YWJsZV9pbml0KCk7CkBAIC0xMjA0LDcgKzExNjMsNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JYWNwaV90YWJsZV9wYXJzZShBQ1BJX0JPT1QsIGFjcGlfcGFyc2Vfc2JmKTsKKwlhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX0JPT1QsIGFjcGlfcGFyc2Vfc2JmKTsKIAogCS8qCiAJICogYmxhY2tsaXN0IG1heSBkaXNhYmxlIEFDUEkgZW50aXJlbHkKQEAgLTEyMzIsMTkgKzExOTEsMTkgQEAKIAlpZiAoYWNwaV9kaXNhYmxlZCAmJiAhYWNwaV9odCkKIAkJcmV0dXJuIDE7CiAKLQlhY3BpX3RhYmxlX3BhcnNlKEFDUElfQk9PVCwgYWNwaV9wYXJzZV9zYmYpOworCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfQk9PVCwgYWNwaV9wYXJzZV9zYmYpOwogCiAJLyoKIAkgKiBzZXQgc2NpX2ludCBhbmQgUE0gdGltZXIgYWRkcmVzcwogCSAqLwotCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9GQURULCBhY3BpX3BhcnNlX2ZhZHQpOworCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfRkFEVCwgYWNwaV9wYXJzZV9mYWR0KTsKIAogCS8qCiAJICogUHJvY2VzcyB0aGUgTXVsdGlwbGUgQVBJQyBEZXNjcmlwdGlvbiBUYWJsZSAoTUFEVCksIGlmIHByZXNlbnQKIAkgKi8KIAlhY3BpX3Byb2Nlc3NfbWFkdCgpOwogCi0JYWNwaV90YWJsZV9wYXJzZShBQ1BJX0hQRVQsIGFjcGlfcGFyc2VfaHBldCk7CisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19IUEVULCBhY3BpX3BhcnNlX2hwZXQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzE1LDEzICsxMjc0LDE3IEBACiAJaWYgKCFzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIXN0cmNtcChzLCAiZWRnZSIpKQotCQlhY3BpX3NjaV9mbGFncy50cmlnZ2VyID0gMTsKKwkJYWNwaV9zY2lfZmxhZ3MgPSAgQUNQSV9NQURUX1RSSUdHRVJfRURHRSB8CisJCQkoYWNwaV9zY2lfZmxhZ3MgJiB+QUNQSV9NQURUX1RSSUdHRVJfTUFTSyk7CiAJZWxzZSBpZiAoIXN0cmNtcChzLCAibGV2ZWwiKSkKLQkJYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9IDM7CisJCWFjcGlfc2NpX2ZsYWdzID0gQUNQSV9NQURUX1RSSUdHRVJfTEVWRUwgfAorCQkJKGFjcGlfc2NpX2ZsYWdzICYgfkFDUElfTUFEVF9UUklHR0VSX01BU0spOwogCWVsc2UgaWYgKCFzdHJjbXAocywgImhpZ2giKSkKLQkJYWNwaV9zY2lfZmxhZ3MucG9sYXJpdHkgPSAxOworCQlhY3BpX3NjaV9mbGFncyA9IEFDUElfTUFEVF9QT0xBUklUWV9BQ1RJVkVfSElHSCB8CisJCQkoYWNwaV9zY2lfZmxhZ3MgJiB+QUNQSV9NQURUX1BPTEFSSVRZX01BU0spOwogCWVsc2UgaWYgKCFzdHJjbXAocywgImxvdyIpKQotCQlhY3BpX3NjaV9mbGFncy5wb2xhcml0eSA9IDM7CisJCWFjcGlfc2NpX2ZsYWdzID0gQUNQSV9NQURUX1BPTEFSSVRZX0FDVElWRV9MT1cgfAorCQkJKGFjcGlfc2NpX2ZsYWdzICYgfkFDUElfTUFEVF9QT0xBUklUWV9NQVNLKTsKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKaW5kZXggNGI2MGFmNy4uYmY4NmY3NiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvZWFybHlxdWlyay5jCkBAIC0xNiw3ICsxNiw3IEBACiAKIHN0YXRpYyBpbnQgbnZpZGlhX2hwZXRfZGV0ZWN0ZWQgX19pbml0ZGF0YTsKIAotc3RhdGljIGludCBfX2luaXQgbnZpZGlhX2hwZXRfY2hlY2sodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpCitzdGF0aWMgaW50IF9faW5pdCBudmlkaWFfaHBldF9jaGVjayhzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlcikKIHsKIAludmlkaWFfaHBldF9kZXRlY3RlZCA9IDE7CiAJcmV0dXJuIDA7CkBAIC0zMCw3ICszMCw3IEBACiAJICAgaXMgZW5hYmxlZC4gKi8KIAlpZiAoIWFjcGlfdXNlX3RpbWVyX292ZXJyaWRlICYmIHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05WSURJQSkgewogCQludmlkaWFfaHBldF9kZXRlY3RlZCA9IDA7Ci0JCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9IUEVULCBudmlkaWFfaHBldF9jaGVjayk7CisJCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfSFBFVCwgbnZpZGlhX2hwZXRfY2hlY2spOwogCQlpZiAobnZpZGlhX2hwZXRfZGV0ZWN0ZWQgPT0gMCkgewogCQkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsKIAkJCSAgcHJpbnRrKEtFUk5fSU5GTyAiTnZpZGlhIGJvYXJkICIKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYwppbmRleCBlOTQwZTAwLi5hM2RiOTMzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIAkJLyogSW52b2tlIEMzICovCiAJCWluYihjeF9hZGRyZXNzKTsKIAkJLyogRHVtbXkgb3AgLSBtdXN0IGRvIHNvbWV0aGluZyB1c2VsZXNzIGFmdGVyIFBfTFZMMyByZWFkICovCi0JCXQgPSBpbmwoYWNwaV9mYWR0LnhwbV90bXJfYmxrLmFkZHJlc3MpOworCQl0ID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOwogCX0KIAkvKiBEaXNhYmxlIGJ1cyByYXRpbyBiaXQgKi8KIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwpAQCAtMjUwLDggKzI1MCw3IEBACiAJCW91dGIoMywgMHgyMik7CiAJfSBlbHNlIGlmICgocHIgIT0gTlVMTCkgJiYgcHItPmZsYWdzLmJtX2NvbnRyb2wpIHsKICAJCS8qIERpc2FibGUgYnVzIG1hc3RlciBhcmJpdHJhdGlvbiAqLwotCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19BUkJfRElTQUJMRSwgMSwKLQkJCQkgIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQVJCX0RJU0FCTEUsIDEpOwogCX0KIAlzd2l0Y2ggKGxvbmdoYXVsX3ZlcnNpb24pIHsKIApAQCAtMjgxLDggKzI4MCw3IEBACiAJY2FzZSBUWVBFX1BPV0VSU0FWRVI6CiAJCWlmIChsb25naGF1bF9mbGFncyAmIFVTRV9BQ1BJX0MzKSB7CiAJCQkvKiBEb24ndCBhbGxvdyB3YWtldXAgKi8KLQkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELCAwLAotCQkJCQkgIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELCAwKTsKIAkJCWRvX3Bvd2Vyc2F2ZXIoY3gtPmFkZHJlc3MsIGNsb2NrX3JhdGlvX2luZGV4KTsKIAkJfSBlbHNlIHsKIAkJCWRvX3Bvd2Vyc2F2ZXIoMCwgY2xvY2tfcmF0aW9faW5kZXgpOwpAQCAtMjk1LDggKzI5Myw3IEBACiAJCW91dGIoMCwgMHgyMik7CiAJfSBlbHNlIGlmICgocHIgIT0gTlVMTCkgJiYgcHItPmZsYWdzLmJtX2NvbnRyb2wpIHsKIAkJLyogRW5hYmxlIGJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24gKi8KLQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQVJCX0RJU0FCTEUsIDAsCi0JCQkJICBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0FSQl9ESVNBQkxFLCAwKTsKIAl9CiAJb3V0YihwaWMyX21hc2ssMHhBMSk7CS8qIHJlc3RvcmUgbWFzayAqLwogCW91dGIocGljMV9tYXNrLDB4MjEpOwpAQCAtNDE0LDcgKzQxMSw3IEBACiAJaGlnaGVzdF9zcGVlZCA9IGNhbGNfc3BlZWQobWF4bXVsdCk7CiAJbG93ZXN0X3NwZWVkID0gY2FsY19zcGVlZChtaW5tdWx0KTsKIAlkcHJpbnRrICgiRlNCOiVkTUh6ICBMb3dlc3Qgc3BlZWQ6ICVzICAgSGlnaGVzdCBzcGVlZDolc1xuIiwgZnNiLAotCQkgcHJpbnRfc3BlZWQobG93ZXN0X3NwZWVkLzEwMDApLCAKKwkJIHByaW50X3NwZWVkKGxvd2VzdF9zcGVlZC8xMDAwKSwKIAkJIHByaW50X3NwZWVkKGhpZ2hlc3Rfc3BlZWQvMTAwMCkpOwogCiAJaWYgKGxvd2VzdF9zcGVlZCA9PSBoaWdoZXN0X3NwZWVkKSB7CkBAIC00OTgsNyArNDk1LDcgQEAKIAkJbWF4dmlkLm1WLzEwMDAsIG1heHZpZC5tViUxMDAwLAogCQltaW52aWQubVYvMTAwMCwgbWludmlkLm1WJTEwMDAsCiAJCW51bXZzY2FsZXMpOwotCQorCiAJaiA9IDA7CiAJd2hpbGUgKGxvbmdoYXVsX3RhYmxlW2pdLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX1RBQkxFX0VORCkgewogCQlzcGVlZCA9IGxvbmdoYXVsX3RhYmxlW2pdLmZyZXF1ZW5jeTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbXBwYXJzZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMKaW5kZXggNDliZmYzNS4uNGY1OTgzYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMKQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAJc3RhdGljIGludAkJZ3NpX3RvX2lycVtNQVhfR1NJX05VTV07CiAKIAkvKiBEb24ndCBzZXQgdXAgdGhlIEFDUEkgU0NJIGJlY2F1c2UgaXQncyBhbHJlYWR5IHNldCB1cCAqLwotCWlmIChhY3BpX2ZhZHQuc2NpX2ludCA9PSBnc2kpCisJaWYgKGFjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdCA9PSBnc2kpCiAJCXJldHVybiBnc2k7CiAKIAlpb2FwaWMgPSBtcF9maW5kX2lvYXBpYyhnc2kpOwpAQCAtMTExNCw3ICsxMTE0LDcgQEAKIAkJCS8qCiAJCQkgKiBEb24ndCBhc3NpZ24gSVJRIHVzZWQgYnkgQUNQSSBTQ0kKIAkJCSAqLwotCQkJaWYgKGdzaSA9PSBhY3BpX2ZhZHQuc2NpX2ludCkKKwkJCWlmIChnc2kgPT0gYWNwaV9nYmxfRkFEVC5zY2lfaW50ZXJydXB0KQogCQkJCWdzaSA9IHBjaV9pcnErKzsKIAkJCWdzaV90b19pcnFbaXJxXSA9IGdzaTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3JhdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zcmF0LmMKaW5kZXggZjdlNzM1Yy4uMmE4NzEzZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zcmF0LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zcmF0LmMKQEAgLTYyLDE5ICs2MiwxOSBAQAogLyogSWRlbnRpZnkgQ1BVIHByb3hpbWl0eSBkb21haW5zICovCiBzdGF0aWMgdm9pZCBfX2luaXQgcGFyc2VfY3B1X2FmZmluaXR5X3N0cnVjdHVyZShjaGFyICpwKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqY3B1X2FmZmluaXR5ID0gCi0JCQkJKHN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqKSBwOworCXN0cnVjdCBhY3BpX3NyYXRfY3B1X2FmZmluaXR5ICpjcHVfYWZmaW5pdHkgPQorCQkJCShzdHJ1Y3QgYWNwaV9zcmF0X2NwdV9hZmZpbml0eSAqKSBwOwogCi0JaWYgKCFjcHVfYWZmaW5pdHktPmZsYWdzLmVuYWJsZWQpCisJaWYgKChjcHVfYWZmaW5pdHktPmZsYWdzICYgQUNQSV9TUkFUX0NQVV9FTkFCTEVEKSA9PSAwKQogCQlyZXR1cm47CQkvKiBlbXB0eSBlbnRyeSAqLwogCiAJLyogbWFyayB0aGlzIG5vZGUgYXMgInNlZW4iIGluIG5vZGUgYml0bWFwICovCi0JQk1BUF9TRVQocHhtX2JpdG1hcCwgY3B1X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluKTsKKwlCTUFQX1NFVChweG1fYml0bWFwLCBjcHVfYWZmaW5pdHktPnByb3hpbWl0eV9kb21haW5fbG8pOwogCi0JYXBpY2lkX3RvX3B4bVtjcHVfYWZmaW5pdHktPmFwaWNfaWRdID0gY3B1X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluOworCWFwaWNpZF90b19weG1bY3B1X2FmZmluaXR5LT5hcGljX2lkXSA9IGNwdV9hZmZpbml0eS0+cHJveGltaXR5X2RvbWFpbl9sbzsKIAogCXByaW50aygiQ1BVIDB4JTAyWCBpbiBwcm94aW1pdHkgZG9tYWluIDB4JTAyWFxuIiwKLQkJY3B1X2FmZmluaXR5LT5hcGljX2lkLCBjcHVfYWZmaW5pdHktPnByb3hpbWl0eV9kb21haW4pOworCQljcHVfYWZmaW5pdHktPmFwaWNfaWQsIGNwdV9hZmZpbml0eS0+cHJveGltaXR5X2RvbWFpbl9sbyk7CiB9CiAKIC8qCkBAIC04NCwyOCArODQsMjcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV9tZW1vcnlfYWZmaW5pdHlfc3RydWN0dXJlIChjaGFyICpzcmF0cCkKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgcGFkZHIsIHNpemU7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47IAorCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOwogCXU4IHB4bTsKIAlzdHJ1Y3Qgbm9kZV9tZW1vcnlfY2h1bmtfcyAqcCwgKnEsICpwZW5kOwotCXN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSAqbWVtb3J5X2FmZmluaXR5ID0KLQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkgKikgc3JhdHA7CisJc3RydWN0IGFjcGlfc3JhdF9tZW1fYWZmaW5pdHkgKm1lbW9yeV9hZmZpbml0eSA9CisJCQkoc3RydWN0IGFjcGlfc3JhdF9tZW1fYWZmaW5pdHkgKikgc3JhdHA7CiAKLQlpZiAoIW1lbW9yeV9hZmZpbml0eS0+ZmxhZ3MuZW5hYmxlZCkKKwlpZiAoKG1lbW9yeV9hZmZpbml0eS0+ZmxhZ3MgJiBBQ1BJX1NSQVRfTUVNX0VOQUJMRUQpID09IDApCiAJCXJldHVybjsJCS8qIGVtcHR5IGVudHJ5ICovCiAKKwlweG0gPSBtZW1vcnlfYWZmaW5pdHktPnByb3hpbWl0eV9kb21haW4gJiAweGZmOworCiAJLyogbWFyayB0aGlzIG5vZGUgYXMgInNlZW4iIGluIG5vZGUgYml0bWFwICovCi0JQk1BUF9TRVQocHhtX2JpdG1hcCwgbWVtb3J5X2FmZmluaXR5LT5wcm94aW1pdHlfZG9tYWluKTsKKwlCTUFQX1NFVChweG1fYml0bWFwLCBweG0pOwogCiAJLyogY2FsY3VsYXRlIGluZm8gZm9yIG1lbW9yeSBjaHVuayBzdHJ1Y3R1cmUgKi8KLQlwYWRkciA9IG1lbW9yeV9hZmZpbml0eS0+YmFzZV9hZGRyX2hpOwotCXBhZGRyID0gKHBhZGRyIDw8IDMyKSB8IG1lbW9yeV9hZmZpbml0eS0+YmFzZV9hZGRyX2xvOwotCXNpemUgPSBtZW1vcnlfYWZmaW5pdHktPmxlbmd0aF9oaTsKLQlzaXplID0gKHNpemUgPDwgMzIpIHwgbWVtb3J5X2FmZmluaXR5LT5sZW5ndGhfbG87Ci0JCisJcGFkZHIgPSBtZW1vcnlfYWZmaW5pdHktPmJhc2VfYWRkcmVzczsKKwlzaXplID0gbWVtb3J5X2FmZmluaXR5LT5sZW5ndGg7CisKIAlzdGFydF9wZm4gPSBwYWRkciA+PiBQQUdFX1NISUZUOwogCWVuZF9wZm4gPSAocGFkZHIgKyBzaXplKSA+PiBQQUdFX1NISUZUOwotCQotCXB4bSA9IG1lbW9yeV9hZmZpbml0eS0+cHJveGltaXR5X2RvbWFpbjsKKwogCiAJaWYgKG51bV9tZW1vcnlfY2h1bmtzID49IE1BWENIVU5LUykgewogCQlwcmludGsoIlRvbyBtYW55IG1lbSBjaHVua3MgaW4gU1JBVC4gSWdub3JpbmcgJWxsZCBNQnl0ZXMgYXQgJWxseFxuIiwKQEAgLTEzMiw4ICsxMzEsOCBAQAogCXByaW50aygiTWVtb3J5IHJhbmdlIDB4JWxYIHRvIDB4JWxYICh0eXBlIDB4JVgpIGluIHByb3hpbWl0eSBkb21haW4gMHglMDJYICVzXG4iLAogCQlzdGFydF9wZm4sIGVuZF9wZm4sCiAJCW1lbW9yeV9hZmZpbml0eS0+bWVtb3J5X3R5cGUsCi0JCW1lbW9yeV9hZmZpbml0eS0+cHJveGltaXR5X2RvbWFpbiwKLQkJKG1lbW9yeV9hZmZpbml0eS0+ZmxhZ3MuaG90X3BsdWdnYWJsZSA/CisJCXB4bSwKKwkJKChtZW1vcnlfYWZmaW5pdHktPmZsYWdzICYgQUNQSV9TUkFUX01FTV9IT1RfUExVR0dBQkxFKSA/CiAJCSAiZW5hYmxlZCBhbmQgcmVtb3ZhYmxlIiA6ICJlbmFibGVkIiApICk7CiB9CiAKQEAgLTE4NSwxMCArMTg0LDEwIEBACiAJbnVtX21lbW9yeV9jaHVua3MgPSAwOwogCXdoaWxlIChwIDwgZW5kKSB7CiAJCXN3aXRjaCAoKnApIHsKLQkJY2FzZSBBQ1BJX1NSQVRfUFJPQ0VTU09SX0FGRklOSVRZOgorCQljYXNlIEFDUElfU1JBVF9UWVBFX0NQVV9BRkZJTklUWToKIAkJCXBhcnNlX2NwdV9hZmZpbml0eV9zdHJ1Y3R1cmUocCk7CiAJCQlicmVhazsKLQkJY2FzZSBBQ1BJX1NSQVRfTUVNT1JZX0FGRklOSVRZOgorCQljYXNlIEFDUElfU1JBVF9UWVBFX01FTU9SWV9BRkZJTklUWToKIAkJCXBhcnNlX21lbW9yeV9hZmZpbml0eV9zdHJ1Y3R1cmUocCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTI2MiwzMSArMjYxLDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBhY3BpX3N0YXRpY19yc2R0IHsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0IHRhYmxlOworCXUzMiBwYWRkaW5nWzddOyAvKiBBbGxvdyBmb3IgNyBtb3JlIHRhYmxlIGVudHJpZXMgKi8KK307CisKIGludCBfX2luaXQgZ2V0X21lbWNmZ19mcm9tX3NyYXQodm9pZCkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciA9IE5VTEw7CiAJc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcCA9IE5VTEw7CiAJc3RydWN0IGFjcGlfdGFibGVfcnNkdCAqcnNkdCA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfcG9pbnRlciAqcnNkcF9hZGRyZXNzID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0IHNhdmVkX3JzZHQ7CisJYWNwaV9uYXRpdmVfdWludCByc2RwX2FkZHJlc3MgPSAwOworCXN0cnVjdCBhY3BpX3N0YXRpY19yc2R0IHNhdmVkX3JzZHQ7CiAJaW50IHRhYmxlcyA9IDA7CiAJaW50IGkgPSAwOwogCi0JaWYgKEFDUElfRkFJTFVSRShhY3BpX2ZpbmRfcm9vdF9wb2ludGVyKEFDUElfUEhZU0lDQUxfQUREUkVTU0lORywKLQkJCQkJCXJzZHBfYWRkcmVzcykpKSB7CisJcnNkcF9hZGRyZXNzID0gYWNwaV9maW5kX3JzZHAoKTsKKwlpZiAoIXJzZHBfYWRkcmVzcykgewogCQlwcmludGsoIiVzOiBTeXN0ZW0gZGVzY3JpcHRpb24gdGFibGVzIG5vdCBmb3VuZFxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQlpZiAocnNkcF9hZGRyZXNzLT5wb2ludGVyX3R5cGUgPT0gQUNQSV9QSFlTSUNBTF9QT0lOVEVSKSB7Ci0JCXByaW50aygiJXM6IGFzc2lnbmluZyBhZGRyZXNzIHRvIHJzZHBcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJzZHAgPSAoc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqKQotCQkJCSh1MzIpcnNkcF9hZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsOwotCX0gZWxzZSB7Ci0JCXByaW50aygiJXM6IHJzZHBfYWRkcmVzcyBpcyBub3QgYSBwaHlzaWNhbCBwb2ludGVyXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlnb3RvIG91dF9lcnI7Ci0JfQorCXByaW50aygiJXM6IGFzc2lnbmluZyBhZGRyZXNzIHRvIHJzZHBcbiIsIF9fRlVOQ1RJT05fXyk7CisJcnNkcCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICopKHUzMilyc2RwX2FkZHJlc3M7CiAJaWYgKCFyc2RwKSB7CiAJCXByaW50aygiJXM6IERpZG4ndCBmaW5kIEFDUEkgcm9vdCFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gb3V0X2VycjsKQEAgLTI5NSwxMyArMjkzLDEzIEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiJS44cyB2JWQgWyUuNnNdXG4iLCByc2RwLT5zaWduYXR1cmUsIHJzZHAtPnJldmlzaW9uLAogCQlyc2RwLT5vZW1faWQpOwogCi0JaWYgKHN0cm5jbXAocnNkcC0+c2lnbmF0dXJlLCBSU0RQX1NJRyxzdHJsZW4oUlNEUF9TSUcpKSkgeworCWlmIChzdHJuY21wKHJzZHAtPnNpZ25hdHVyZSwgQUNQSV9TSUdfUlNEUCxzdHJsZW4oQUNQSV9TSUdfUlNEUCkpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSU0RQIHRhYmxlIHNpZ25hdHVyZSBpbmNvcnJlY3RcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAlyc2R0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHQgKikKLQkgICAgYm9vdF9pb3JlbWFwKHJzZHAtPnJzZHRfYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHQpKTsKKwkgICAgYm9vdF9pb3JlbWFwKHJzZHAtPnJzZHRfcGh5c2ljYWxfYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHQpKTsKIAogCWlmICghcnNkdCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCkBAIC0zMTAsOSArMzA4LDkgQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAotCWhlYWRlciA9ICYgcnNkdC0+aGVhZGVyOworCWhlYWRlciA9ICZyc2R0LT5oZWFkZXI7CiAKLQlpZiAoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgUlNEVF9TSUcsIHN0cmxlbihSU0RUX1NJRykpKSB7CisJaWYgKHN0cm5jbXAoaGVhZGVyLT5zaWduYXR1cmUsIEFDUElfU0lHX1JTRFQsIHN0cmxlbihBQ1BJX1NJR19SU0RUKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUNQSTogUlNEVCBzaWduYXR1cmUgaW5jb3JyZWN0XG4iKTsKIAkJZ290byBvdXRfZXJyOwogCX0KQEAgLTMzMCw5ICszMjgsOSBAQAogCiAJbWVtY3B5KCZzYXZlZF9yc2R0LCByc2R0LCBzaXplb2Yoc2F2ZWRfcnNkdCkpOwogCi0JaWYgKHNhdmVkX3JzZHQuaGVhZGVyLmxlbmd0aCA+IHNpemVvZihzYXZlZF9yc2R0KSkgeworCWlmIChzYXZlZF9yc2R0LnRhYmxlLmhlYWRlci5sZW5ndGggPiBzaXplb2Yoc2F2ZWRfcnNkdCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUNQSTogVG9vIGJpZyBsZW5ndGggaW4gUlNEVDogJWRcbiIsCi0JCSAgICAgICBzYXZlZF9yc2R0LmhlYWRlci5sZW5ndGgpOworCQkgICAgICAgc2F2ZWRfcnNkdC50YWJsZS5oZWFkZXIubGVuZ3RoKTsKIAkJZ290byBvdXRfZXJyOwogCX0KIApAQCAtMzQxLDE1ICszMzksMTUgQEAKIAlmb3IgKGkgPSAwOyBpIDwgdGFibGVzOyBpKyspIHsKIAkJLyogTWFwIGluIGhlYWRlciwgdGhlbiBtYXAgaW4gZnVsbCB0YWJsZSBsZW5ndGguICovCiAJCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKLQkJCWJvb3RfaW9yZW1hcChzYXZlZF9yc2R0LmVudHJ5W2ldLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCQlib290X2lvcmVtYXAoc2F2ZWRfcnNkdC50YWJsZS50YWJsZV9vZmZzZXRfZW50cnlbaV0sIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKIAkJaWYgKCFoZWFkZXIpCiAJCQlicmVhazsKIAkJaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKQotCQkJYm9vdF9pb3JlbWFwKHNhdmVkX3JzZHQuZW50cnlbaV0sIGhlYWRlci0+bGVuZ3RoKTsKKwkJCWJvb3RfaW9yZW1hcChzYXZlZF9yc2R0LnRhYmxlLnRhYmxlX29mZnNldF9lbnRyeVtpXSwgaGVhZGVyLT5sZW5ndGgpOwogCQlpZiAoIWhlYWRlcikKIAkJCWJyZWFrOwogCi0JCWlmIChzdHJuY21wKChjaGFyICopICZoZWFkZXItPnNpZ25hdHVyZSwgIlNSQVQiLCA0KSkKKwkJaWYgKHN0cm5jbXAoKGNoYXIgKikgJmhlYWRlci0+c2lnbmF0dXJlLCBBQ1BJX1NJR19TUkFULCA0KSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIHdlJ3ZlIGZvdW5kIHRoZSBzcmF0IHRhYmxlLiBkb24ndCBuZWVkIHRvIGxvb2sgYXQgYW55IG1vcmUgdGFibGVzICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwLmggYi9hcmNoL2kzODYvbWFjaC1lczcwMDAvZXM3MDAwLmgKaW5kZXggODA1NjZjYS4uYzhkNWFhMSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21hY2gtZXM3MDAwL2VzNzAwMC5oCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9lczcwMDAuaApAQCAtODQsMTUgKzg0LDYgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfQUNQSQotc3RydWN0IGFjcGlfdGFibGVfc2R0IHsKLQl1bnNpZ25lZCBsb25nIHBhOwotCXVuc2lnbmVkIGxvbmcgY291bnQ7Ci0Jc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZyBwYTsKLQkJZW51bSBhY3BpX3RhYmxlX2lkIGlkOwotCQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JfQllbnRyeVs1MF07Ci19OwogCiBzdHJ1Y3Qgb2VtX3RhYmxlIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgSGVhZGVyOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtZXM3MDAwL2VzNzAwMHBsYXQuYyBiL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9lczcwMDBwbGF0LmMKaW5kZXggM2QwZmM4NTMuLjliZTZjZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLWVzNzAwMC9lczcwMDBwbGF0LmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZXM3MDAwL2VzNzAwMHBsYXQuYwpAQCAtMTYwLDUxICsxNjAsMTQgQEAKIGludCBfX2luaXQKIGZpbmRfdW5pc3lzX2FjcGlfb2VtX3RhYmxlKHVuc2lnbmVkIGxvbmcgKm9lbV9hZGRyKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX3JzZHAJCSpyc2RwID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nCQkJcnNkcF9waHlzID0gMDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgCSpoZWFkZXIgPSBOVUxMOwotCWludAkJCQlpOwotCXN0cnVjdCBhY3BpX3RhYmxlX3NkdAkJc2R0OwotCi0JcnNkcF9waHlzID0gYWNwaV9maW5kX3JzZHAoKTsKLQlyc2RwID0gX192YShyc2RwX3BoeXMpOwotCWlmIChyc2RwLT5yc2R0X2FkZHJlc3MpIHsKLQkJc3RydWN0IGFjcGlfdGFibGVfcnNkdAkqbWFwcGVkX3JzZHQgPSBOVUxMOwotCQlzZHQucGEgPSByc2RwLT5yc2R0X2FkZHJlc3M7Ci0KLQkJaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKQotCQkJX19hY3BpX21hcF90YWJsZShzZHQucGEsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKLQkJaWYgKCFoZWFkZXIpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCQlzZHQuY291bnQgPSAoaGVhZGVyLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgPj4gMzsKLQkJbWFwcGVkX3JzZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfcnNkdCAqKQotCQkJX19hY3BpX21hcF90YWJsZShzZHQucGEsIGhlYWRlci0+bGVuZ3RoKTsKLQkJaWYgKCFtYXBwZWRfcnNkdCkKLQkJCXJldHVybiAtRU5PREVWOwotCi0JCWhlYWRlciA9ICZtYXBwZWRfcnNkdC0+aGVhZGVyOwotCi0JCWZvciAoaSA9IDA7IGkgPCBzZHQuY291bnQ7IGkrKykKLQkJCXNkdC5lbnRyeVtpXS5wYSA9ICh1bnNpZ25lZCBsb25nKSBtYXBwZWRfcnNkdC0+ZW50cnlbaV07Ci0JfTsKLQlmb3IgKGkgPSAwOyBpIDwgc2R0LmNvdW50OyBpKyspIHsKLQotCQloZWFkZXIgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopCi0JCQlfX2FjcGlfbWFwX3RhYmxlKHNkdC5lbnRyeVtpXS5wYSwKLQkJCQlzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JCWlmICghaGVhZGVyKQotCQkJY29udGludWU7Ci0JCWlmICghc3RybmNtcCgoY2hhciAqKSAmaGVhZGVyLT5zaWduYXR1cmUsICJPRU0xIiwgNCkpIHsKLQkJCWlmICghc3RybmNtcCgoY2hhciAqKSAmaGVhZGVyLT5vZW1faWQsICJVTklTWVMiLCA2KSkgewotCQkJCXZvaWQgKmFkZHI7Ci0JCQkJc3RydWN0IG9lbV90YWJsZSAqdDsKLQkJCQlhY3BpX3RhYmxlX3ByaW50KGhlYWRlciwgc2R0LmVudHJ5W2ldLnBhKTsKLQkJCQl0ID0gKHN0cnVjdCBvZW1fdGFibGUgKikgX19hY3BpX21hcF90YWJsZShzZHQuZW50cnlbaV0ucGEsIGhlYWRlci0+bGVuZ3RoKTsKLQkJCQlhZGRyID0gKHZvaWQgKikgX19hY3BpX21hcF90YWJsZSh0LT5PRU1UYWJsZUFkZHIsIHQtPk9FTVRhYmxlU2l6ZSk7Ci0JCQkJKm9lbV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIgPSBOVUxMOworCWludCBpID0gMDsKKwl3aGlsZSAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X3RhYmxlKCJPRU0xIiwgaSsrLCAmaGVhZGVyKSkpIHsKKwkJaWYgKCFtZW1jbXAoKGNoYXIgKikgJmhlYWRlci0+b2VtX2lkLCAiVU5JU1lTIiwgNikpIHsKKwkJCXN0cnVjdCBvZW1fdGFibGUgKnQgPSAoc3RydWN0IG9lbV90YWJsZSAqKWhlYWRlcjsKKwkJCSpvZW1fYWRkciA9ICh1bnNpZ25lZCBsb25nKV9fYWNwaV9tYXBfdGFibGUodC0+T0VNVGFibGVBZGRyLAorCQkJCQkJCQkgICAgdC0+T0VNVGFibGVTaXplKTsKKwkJCXJldHVybiAwOwogCQl9CiAJfQogCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYyBiL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYwppbmRleCBlMjYxNmEyLi41NzAwMjIwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL21tY29uZmlnLmMKKysrIGIvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jCkBAIC0zNiw3ICszNiw3IEBACiBzdGF0aWMgdTMyIGdldF9iYXNlX2FkZHIodW5zaWduZWQgaW50IHNlZywgaW50IGJ1cywgdW5zaWduZWQgZGV2Zm4pCiB7CiAJaW50IGNmZ19udW0gPSAtMTsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnX2NvbmZpZyAqY2ZnOworCXN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqY2ZnOwogCiAJaWYgKHNlZyA9PSAwICYmIGJ1cyA8IE1BWF9DSEVDS19CVVMgJiYKIAkgICAgdGVzdF9iaXQoUENJX1NMT1QoZGV2Zm4pICsgMzIqYnVzLCBmYWxsYmFja19zbG90cykpCkBAIC00OCwxMSArNDgsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWNmZyA9ICZwY2lfbW1jZmdfY29uZmlnW2NmZ19udW1dOwotCQlpZiAoY2ZnLT5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIgIT0gc2VnKQorCQlpZiAoY2ZnLT5wY2lfc2VnbWVudCAhPSBzZWcpCiAJCQljb250aW51ZTsKIAkJaWYgKChjZmctPnN0YXJ0X2J1c19udW1iZXIgPD0gYnVzKSAmJgogCQkgICAgKGNmZy0+ZW5kX2J1c19udW1iZXIgPj0gYnVzKSkKLQkJCXJldHVybiBjZmctPmJhc2VfYWRkcmVzczsKKwkJCXJldHVybiBjZmctPmFkZHJlc3M7CiAJfQogCiAJLyogSGFuZGxlIG1vcmUgYnJva2VuIE1DRkcgdGFibGVzIG9uIEFzdXMgZXRjLgpAQCAtNjAsOSArNjAsOSBAQAogIAkgICB0aGlzIGFwcGxpZXMgdG8gYWxsIGJ1c3Nlcy4gKi8KIAljZmcgPSAmcGNpX21tY2ZnX2NvbmZpZ1swXTsKIAlpZiAocGNpX21tY2ZnX2NvbmZpZ19udW0gPT0gMSAmJgotCQljZmctPnBjaV9zZWdtZW50X2dyb3VwX251bWJlciA9PSAwICYmCisJCWNmZy0+cGNpX3NlZ21lbnQgPT0gMCAmJgogCQkoY2ZnLT5zdGFydF9idXNfbnVtYmVyIHwgY2ZnLT5lbmRfYnVzX251bWJlcikgPT0gMCkKLQkJcmV0dXJuIGNmZy0+YmFzZV9hZGRyZXNzOworCQlyZXR1cm4gY2ZnLT5hZGRyZXNzOwogCiAJLyogRmFsbCBiYWNrIHRvIHR5cGUgMCAqLwogCXJldHVybiAwOwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgYmFzZTsKIAotCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiA0MDk1KSkgCisJaWYgKChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDQwOTUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWJhc2UgPSBnZXRfYmFzZV9hZGRyKHNlZywgYnVzLCBkZXZmbik7CkBAIC0xOTksMTkgKzE5OSwxOSBAQAogCWlmICgocGNpX3Byb2JlICYgUENJX1BST0JFX01NQ09ORikgPT0gMCkKIAkJcmV0dXJuOwogCi0JYWNwaV90YWJsZV9wYXJzZShBQ1BJX01DRkcsIGFjcGlfcGFyc2VfbWNmZyk7CisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19NQ0ZHLCBhY3BpX3BhcnNlX21jZmcpOwogCWlmICgocGNpX21tY2ZnX2NvbmZpZ19udW0gPT0gMCkgfHwKIAkgICAgKHBjaV9tbWNmZ19jb25maWcgPT0gTlVMTCkgfHwKLQkgICAgKHBjaV9tbWNmZ19jb25maWdbMF0uYmFzZV9hZGRyZXNzID09IDApKQorCSAgICAocGNpX21tY2ZnX2NvbmZpZ1swXS5hZGRyZXNzID09IDApKQogCQlyZXR1cm47CiAKIAkvKiBPbmx5IGRvIHRoaXMgY2hlY2sgd2hlbiB0eXBlIDEgd29ya3MuIElmIGl0IGRvZXNuJ3Qgd29yawogCSAgIGFzc3VtZSB3ZSBydW4gb24gYSBNYWMgYW5kIGFsd2F5cyB1c2UgTUNGRyAqLwotCWlmICh0eXBlID09IDEgJiYgIWU4MjBfYWxsX21hcHBlZChwY2lfbW1jZmdfY29uZmlnWzBdLmJhc2VfYWRkcmVzcywKLQkJCXBjaV9tbWNmZ19jb25maWdbMF0uYmFzZV9hZGRyZXNzICsgTU1DT05GSUdfQVBFUl9NSU4sCisJaWYgKHR5cGUgPT0gMSAmJiAhZTgyMF9hbGxfbWFwcGVkKHBjaV9tbWNmZ19jb25maWdbMF0uYWRkcmVzcywKKwkJCXBjaV9tbWNmZ19jb25maWdbMF0uYWRkcmVzcyArIE1NQ09ORklHX0FQRVJfTUlOLAogCQkJRTgyMF9SRVNFUlZFRCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEJJT1MgQnVnOiBNQ0ZHIGFyZWEgYXQgJXggaXMgbm90IEU4MjAtcmVzZXJ2ZWRcbiIsCi0JCQkJcGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MpOworCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQklPUyBCdWc6IE1DRkcgYXJlYSBhdCAlbHggaXMgbm90IEU4MjAtcmVzZXJ2ZWRcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpcGNpX21tY2ZnX2NvbmZpZ1swXS5hZGRyZXNzKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IE5vdCB1c2luZyBNTUNPTkZJRy5cbiIpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwppbmRleCAyOWYwNWQ0Li45MTk3ZDdiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwpAQCAtNTUsNyArNTUsNyBAQAogCiAjZGVmaW5lIEJBRF9NQURUX0VOVFJZKGVudHJ5LCBlbmQpICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkoIWVudHJ5KSB8fCAodW5zaWduZWQgbG9uZyllbnRyeSArIHNpemVvZigqZW50cnkpID4gZW5kIHx8ICBcCi0JCSgoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKillbnRyeSktPmxlbmd0aCA8IHNpemVvZigqZW50cnkpKQorCQkoKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqKWVudHJ5KS0+bGVuZ3RoIDwgc2l6ZW9mKCplbnRyeSkpCiAKICNkZWZpbmUgUFJFRklYCQkJIkFDUEk6ICIKIApAQCAtNjcsMTYgKzY3LDExIEBACiB1bnNpZ25lZCBpbnQgYWNwaV9jcGVpX292ZXJyaWRlOwogdW5zaWduZWQgaW50IGFjcGlfY3BlaV9waHlzX2NwdWlkOwogCi0jZGVmaW5lIE1BWF9TQVBJQ1MgMjU2Ci11MTYgaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtNQVhfU0FQSUNTXSA9IHtbMCAuLi4gTUFYX1NBUElDUyAtIDFdID0gLTEgfTsKLQotRVhQT1JUX1NZTUJPTChpYTY0X2FjcGlpZF90b19zYXBpY2lkKTsKLQogY29uc3QgY2hhciAqYWNwaV9nZXRfc3lzbmFtZSh2b2lkKQogewogI2lmZGVmIENPTkZJR19JQTY0X0dFTkVSSUMKIAl1bnNpZ25lZCBsb25nIHJzZHBfcGh5czsKLQlzdHJ1Y3QgYWNwaTIwX3RhYmxlX3JzZHAgKnJzZHA7CisJc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcDsKIAlzdHJ1Y3QgYWNwaV90YWJsZV94c2R0ICp4c2R0OwogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGRyOwogCkBAIC04NywxNiArODIsMTYgQEAKIAkJcmV0dXJuICJkaWciOwogCX0KIAotCXJzZHAgPSAoc3RydWN0IGFjcGkyMF90YWJsZV9yc2RwICopX192YShyc2RwX3BoeXMpOwotCWlmIChzdHJuY21wKHJzZHAtPnNpZ25hdHVyZSwgUlNEUF9TSUcsIHNpemVvZihSU0RQX1NJRykgLSAxKSkgeworCXJzZHAgPSAoc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqKV9fdmEocnNkcF9waHlzKTsKKwlpZiAoc3RybmNtcChyc2RwLT5zaWduYXR1cmUsIEFDUElfU0lHX1JTRFAsIHNpemVvZihBQ1BJX1NJR19SU0RQKSAtIDEpKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkgICAgICAgIkFDUEkgMi4wIFJTRFAgc2lnbmF0dXJlIGluY29ycmVjdCwgZGVmYXVsdCB0byBcImRpZ1wiXG4iKTsKIAkJcmV0dXJuICJkaWciOwogCX0KIAotCXhzZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfeHNkdCAqKV9fdmEocnNkcC0+eHNkdF9hZGRyZXNzKTsKKwl4c2R0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3hzZHQgKilfX3ZhKHJzZHAtPnhzZHRfcGh5c2ljYWxfYWRkcmVzcyk7CiAJaGRyID0gJnhzZHQtPmhlYWRlcjsKLQlpZiAoc3RybmNtcChoZHItPnNpZ25hdHVyZSwgWFNEVF9TSUcsIHNpemVvZihYU0RUX1NJRykgLSAxKSkgeworCWlmIChzdHJuY21wKGhkci0+c2lnbmF0dXJlLCBBQ1BJX1NJR19YU0RULCBzaXplb2YoQUNQSV9TSUdfWFNEVCkgLSAxKSkgewogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJBQ1BJIDIuMCBYU0RUIHNpZ25hdHVyZSBpbmNvcnJlY3QsIGRlZmF1bHQgdG8gXCJkaWdcIlxuIik7CiAJCXJldHVybiAiZGlnIjsKQEAgLTE2OSwxMiArMTY0LDEyIEBACiBzdGF0aWMgdTggaGFzXzgyNTk7CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLAorYWNwaV9wYXJzZV9sYXBpY19hZGRyX292cihzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKiBoZWFkZXIsCiAJCQkgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICpsYXBpYzsKKwlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWNfb3ZlcnJpZGUgKmxhcGljOwogCi0JbGFwaWMgPSAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfYWRkcl9vdnIgKiloZWFkZXI7CisJbGFwaWMgPSAoc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljX292ZXJyaWRlICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKGxhcGljLCBlbmQpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE4NywyMiArMTgyLDE5IEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hY3BpX3BhcnNlX2xzYXBpYyhhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX2xzYXBpYyhzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKiBoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2xzYXBpYyAqbHNhcGljOworCXN0cnVjdCBhY3BpX21hZHRfbG9jYWxfc2FwaWMgKmxzYXBpYzsKIAotCWxzYXBpYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9sc2FwaWMgKiloZWFkZXI7CisJbHNhcGljID0gKHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfc2FwaWMgKiloZWFkZXI7CiAKLQlpZiAoQkFEX01BRFRfRU5UUlkobHNhcGljLCBlbmQpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKlNraXAgQkFEX01BRFRfRU5UUlkgY2hlY2ssIGFzIGxzYXBpYyBzaXplIGNvdWxkIHZhcnkgKi8KIAotCWlmIChsc2FwaWMtPmZsYWdzLmVuYWJsZWQpIHsKKwlpZiAobHNhcGljLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSB7CiAjaWZkZWYgQ09ORklHX1NNUAogCQlzbXBfYm9vdF9kYXRhLmNwdV9waHlzX2lkW2F2YWlsYWJsZV9jcHVzXSA9CiAJCSAgICAobHNhcGljLT5pZCA8PCA4KSB8IGxzYXBpYy0+ZWlkOwogI2VuZGlmCi0JCWlhNjRfYWNwaWlkX3RvX3NhcGljaWRbbHNhcGljLT5hY3BpX2lkXSA9Ci0JCSAgICAobHNhcGljLT5pZCA8PCA4KSB8IGxzYXBpYy0+ZWlkOwogCQkrK2F2YWlsYWJsZV9jcHVzOwogCX0KIApAQCAtMjExLDExICsyMDMsMTEgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfbGFwaWNfbm1pKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2VfbGFwaWNfbm1pKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfbm1pICpsYWNwaV9ubWk7CisJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljX25taSAqbGFjcGlfbm1pOwogCi0JbGFjcGlfbm1pID0gKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSAqKWhlYWRlcjsKKwlsYWNwaV9ubWkgPSAoc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljX25taSAqKWhlYWRlcjsKIAogCWlmIChCQURfTUFEVF9FTlRSWShsYWNwaV9ubWksIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI1LDExICsyMTcsMTEgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLWFjcGlfcGFyc2VfaW9zYXBpYyhhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCithY3BpX3BhcnNlX2lvc2FwaWMoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9pb3NhcGljICppb3NhcGljOworCXN0cnVjdCBhY3BpX21hZHRfaW9fc2FwaWMgKmlvc2FwaWM7CiAKLQlpb3NhcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2lvc2FwaWMgKiloZWFkZXI7CisJaW9zYXBpYyA9IChzdHJ1Y3QgYWNwaV9tYWR0X2lvX3NhcGljICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKGlvc2FwaWMsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjQwLDEzICsyMzIsMTMgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0ZGF0YSBhY3BpX21hZHRfcmV2OwogCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9wbGF0X2ludF9zcmMoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsCithY3BpX3BhcnNlX3BsYXRfaW50X3NyYyhzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKiBoZWFkZXIsCiAJCQljb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9wbGF0X2ludF9zcmMgKnBsaW50c3JjOworCXN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X3NvdXJjZSAqcGxpbnRzcmM7CiAJaW50IHZlY3RvcjsKIAotCXBsaW50c3JjID0gKHN0cnVjdCBhY3BpX3RhYmxlX3BsYXRfaW50X3NyYyAqKWhlYWRlcjsKKwlwbGludHNyYyA9IChzdHJ1Y3QgYWNwaV9tYWR0X2ludGVycnVwdF9zb3VyY2UgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkocGxpbnRzcmMsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjU3LDE5ICsyNDksMTkgQEAKIAkgKi8KIAl2ZWN0b3IgPSBpb3NhcGljX3JlZ2lzdGVyX3BsYXRmb3JtX2ludHIocGxpbnRzcmMtPnR5cGUsCiAJCQkJCQlwbGludHNyYy0+Z2xvYmFsX2lycSwKLQkJCQkJCXBsaW50c3JjLT5pb3NhcGljX3ZlY3RvciwKKwkJCQkJCXBsaW50c3JjLT5pb19zYXBpY192ZWN0b3IsCiAJCQkJCQlwbGludHNyYy0+ZWlkLAogCQkJCQkJcGxpbnRzcmMtPmlkLAotCQkJCQkJKHBsaW50c3JjLT5mbGFncy5wb2xhcml0eSA9PQotCQkJCQkJIDEpID8gSU9TQVBJQ19QT0xfSElHSCA6Ci0JCQkJCQlJT1NBUElDX1BPTF9MT1csCi0JCQkJCQkocGxpbnRzcmMtPmZsYWdzLnRyaWdnZXIgPT0KLQkJCQkJCSAxKSA/IElPU0FQSUNfRURHRSA6Ci0JCQkJCQlJT1NBUElDX0xFVkVMKTsKKwkJCQkJCSgocGxpbnRzcmMtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTSykgPT0KKwkJCQkJCSBBQ1BJX01BRFRfUE9MQVJJVFlfQUNUSVZFX0hJR0gpID8KKwkJCQkJCUlPU0FQSUNfUE9MX0hJR0ggOiBJT1NBUElDX1BPTF9MT1csCisJCQkJCQkoKHBsaW50c3JjLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1RSSUdHRVJfTUFTSykgPT0KKwkJCQkJCSBBQ1BJX01BRFRfVFJJR0dFUl9FREdFKSA/CisJCQkJCQlJT1NBUElDX0VER0UgOiBJT1NBUElDX0xFVkVMKTsKIAogCXBsYXRmb3JtX2ludHJfbGlzdFtwbGludHNyYy0+dHlwZV0gPSB2ZWN0b3I7CiAJaWYgKGFjcGlfbWFkdF9yZXYgPiAxKSB7Ci0JCWFjcGlfY3BlaV9vdmVycmlkZSA9IHBsaW50c3JjLT5wbGludF9mbGFncy5jcGVpX292ZXJyaWRlX2ZsYWc7CisJCWFjcGlfY3BlaV9vdmVycmlkZSA9IHBsaW50c3JjLT5mbGFncyAmIEFDUElfTUFEVF9DUEVJX09WRVJSSURFOwogCX0KIAogCS8qCkBAIC0zMjQsMzAgKzMxNiwzMiBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9pbnRfc3JjX292cihhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwKK2FjcGlfcGFyc2VfaW50X3NyY19vdnIoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICogaGVhZGVyLAogCQkgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIgKnA7CisJc3RydWN0IGFjcGlfbWFkdF9pbnRlcnJ1cHRfb3ZlcnJpZGUgKnA7CiAKLQlwID0gKHN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyICopaGVhZGVyOworCXAgPSAoc3RydWN0IGFjcGlfbWFkdF9pbnRlcnJ1cHRfb3ZlcnJpZGUgKiloZWFkZXI7CiAKIAlpZiAoQkFEX01BRFRfRU5UUlkocCwgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpb3NhcGljX292ZXJyaWRlX2lzYV9pcnEocC0+YnVzX2lycSwgcC0+Z2xvYmFsX2lycSwKLQkJCQkgKHAtPmZsYWdzLnBvbGFyaXR5ID09Ci0JCQkJICAxKSA/IElPU0FQSUNfUE9MX0hJR0ggOiBJT1NBUElDX1BPTF9MT1csCi0JCQkJIChwLT5mbGFncy50cmlnZ2VyID09Ci0JCQkJICAxKSA/IElPU0FQSUNfRURHRSA6IElPU0FQSUNfTEVWRUwpOworCWlvc2FwaWNfb3ZlcnJpZGVfaXNhX2lycShwLT5zb3VyY2VfaXJxLCBwLT5nbG9iYWxfaXJxLAorCQkJCSAoKHAtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTSykgPT0KKwkJCQkgIEFDUElfTUFEVF9QT0xBUklUWV9BQ1RJVkVfSElHSCkgPworCQkJCSBJT1NBUElDX1BPTF9ISUdIIDogSU9TQVBJQ19QT0xfTE9XLAorCQkJCSAoKHAtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfVFJJR0dFUl9NQVNLKSA9PQorCQkJCSBBQ1BJX01BRFRfVFJJR0dFUl9FREdFKSA/CisJCQkJIElPU0FQSUNfRURHRSA6IElPU0FQSUNfTEVWRUwpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9ubWlfc3JjKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK2FjcGlfcGFyc2Vfbm1pX3NyYyhzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKiBoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMgKm5taV9zcmM7CisJc3RydWN0IGFjcGlfbWFkdF9ubWlfc291cmNlICpubWlfc3JjOwogCi0Jbm1pX3NyYyA9IChzdHJ1Y3QgYWNwaV90YWJsZV9ubWlfc3JjICopaGVhZGVyOworCW5taV9zcmMgPSAoc3RydWN0IGFjcGlfbWFkdF9ubWlfc291cmNlICopaGVhZGVyOwogCiAJaWYgKEJBRF9NQURUX0VOVFJZKG5taV9zcmMsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzcxLDEyICszNjUsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfbWFkdCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9tYWR0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiB7Ci0JaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCisJaWYgKCF0YWJsZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlhY3BpX21hZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqKV9fdmEocGh5c19hZGRyKTsKKwlhY3BpX21hZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqKXRhYmxlOwogCiAJYWNwaV9tYWR0X3JldiA9IGFjcGlfbWFkdC0+aGVhZGVyLnJldmlzaW9uOwogCkBAIC0zODQsMTQgKzM3OCwxNCBAQAogI2lmZGVmIENPTkZJR19JVEFOSVVNCiAJaGFzXzgyNTkgPSAxOwkJLyogRmlybXdhcmUgb24gb2xkIEl0YW5pdW0gc3lzdGVtcyBpcyBicm9rZW4gKi8KICNlbHNlCi0JaGFzXzgyNTkgPSBhY3BpX21hZHQtPmZsYWdzLnBjYXRfY29tcGF0OworCWhhc184MjU5ID0gYWNwaV9tYWR0LT5mbGFncyAmIEFDUElfTUFEVF9QQ0FUX0NPTVBBVDsKICNlbmRpZgogCWlvc2FwaWNfc3lzdGVtX2luaXQoaGFzXzgyNTkpOwogCiAJLyogR2V0IGJhc2UgYWRkcmVzcyBvZiBJUEkgTWVzc2FnZSBCbG9jayAqLwogCi0JaWYgKGFjcGlfbWFkdC0+bGFwaWNfYWRkcmVzcykKLQkJaXBpX2Jhc2VfYWRkciA9IGlvcmVtYXAoYWNwaV9tYWR0LT5sYXBpY19hZGRyZXNzLCAwKTsKKwlpZiAoYWNwaV9tYWR0LT5hZGRyZXNzKQorCQlpcGlfYmFzZV9hZGRyID0gaW9yZW1hcChhY3BpX21hZHQtPmFkZHJlc3MsIDApOwogCiAJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkxvY2FsIEFQSUMgYWRkcmVzcyAlcFxuIiwgaXBpX2Jhc2VfYWRkcik7CiAKQEAgLTQxMywyMyArNDA3LDI0IEBACiAjZGVmaW5lIHB4bV9iaXRfdGVzdChiaXQpCSh0ZXN0X2JpdChiaXQsKHZvaWQgKilweG1fZmxhZykpCiBzdGF0aWMgc3RydWN0IGFjcGlfdGFibGVfc2xpdCBfX2luaXRkYXRhICpzbGl0X3RhYmxlOwogCi1zdGF0aWMgaW50IGdldF9wcm9jZXNzb3JfcHJveGltaXR5X2RvbWFpbihzdHJ1Y3QgYWNwaV90YWJsZV9wcm9jZXNzb3JfYWZmaW5pdHkgKnBhKQorc3RhdGljIGludCBnZXRfcHJvY2Vzc29yX3Byb3hpbWl0eV9kb21haW4oc3RydWN0IGFjcGlfc3JhdF9jcHVfYWZmaW5pdHkgKnBhKQogewogCWludCBweG07CiAKLQlweG0gPSBwYS0+cHJveGltaXR5X2RvbWFpbjsKKwlweG0gPSBwYS0+cHJveGltaXR5X2RvbWFpbl9sbzsKIAlpZiAoaWE2NF9wbGF0Zm9ybV9pcygic24yIikpCi0JCXB4bSArPSBwYS0+cmVzZXJ2ZWRbMF0gPDwgODsKKwkJcHhtICs9IHBhLT5wcm94aW1pdHlfZG9tYWluX2hpWzBdIDw8IDg7CiAJcmV0dXJuIHB4bTsKIH0KIAotc3RhdGljIGludCBnZXRfbWVtb3J5X3Byb3hpbWl0eV9kb21haW4oc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICptYSkKK3N0YXRpYyBpbnQgZ2V0X21lbW9yeV9wcm94aW1pdHlfZG9tYWluKHN0cnVjdCBhY3BpX3NyYXRfbWVtX2FmZmluaXR5ICptYSkKIHsKIAlpbnQgcHhtOwogCiAJcHhtID0gbWEtPnByb3hpbWl0eV9kb21haW47Ci0JaWYgKGlhNjRfcGxhdGZvcm1faXMoInNuMiIpKQotCQlweG0gKz0gbWEtPnJlc2VydmVkMVswXSA8PCA4OworCWlmICghaWE2NF9wbGF0Zm9ybV9pcygic24yIikpCisJCXB4bSAmPSAweGZmOworCiAJcmV0dXJuIHB4bTsKIH0KIApAQCAtNDQyLDcgKzQzNyw3IEBACiAJdTMyIGxlbjsKIAogCWxlbiA9IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpICsgOAotCSAgICArIHNsaXQtPmxvY2FsaXRpZXMgKiBzbGl0LT5sb2NhbGl0aWVzOworCSAgICArIHNsaXQtPmxvY2FsaXR5X2NvdW50ICogc2xpdC0+bG9jYWxpdHlfY291bnQ7CiAJaWYgKHNsaXQtPmhlYWRlci5sZW5ndGggIT0gbGVuKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkgICAgICAgIkFDUEkgMi4wIFNMSVQ6IHNpemUgbWlzbWF0Y2g6ICVkIGV4cGVjdGVkLCAlZCBhY3R1YWxcbiIsCkBAIC00NTQsMTEgKzQ0OSwxMSBAQAogfQogCiB2b2lkIF9faW5pdAotYWNwaV9udW1hX3Byb2Nlc3Nvcl9hZmZpbml0eV9pbml0KHN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqcGEpCithY3BpX251bWFfcHJvY2Vzc29yX2FmZmluaXR5X2luaXQoc3RydWN0IGFjcGlfc3JhdF9jcHVfYWZmaW5pdHkgKnBhKQogewogCWludCBweG07CiAKLQlpZiAoIXBhLT5mbGFncy5lbmFibGVkKQorCWlmICghKHBhLT5mbGFncyAmIEFDUElfU1JBVF9DUFVfRU5BQkxFRCkpCiAJCXJldHVybjsKIAogCXB4bSA9IGdldF9wcm9jZXNzb3JfcHJveGltaXR5X2RvbWFpbihwYSk7CkBAIC00NjcsMTQgKzQ2MiwxNCBAQAogCXB4bV9iaXRfc2V0KHB4bSk7CiAKIAlub2RlX2NwdWlkW3NyYXRfbnVtX2NwdXNdLnBoeXNfaWQgPQotCSAgICAocGEtPmFwaWNfaWQgPDwgOCkgfCAocGEtPmxzYXBpY19laWQpOworCSAgICAocGEtPmFwaWNfaWQgPDwgOCkgfCAocGEtPmxvY2FsX3NhcGljX2VpZCk7CiAJLyogbmlkIHNob3VsZCBiZSBvdmVycmlkZGVuIGFzIGxvZ2ljYWwgbm9kZSBpZCBsYXRlciAqLwogCW5vZGVfY3B1aWRbc3JhdF9udW1fY3B1c10ubmlkID0gcHhtOwogCXNyYXRfbnVtX2NwdXMrKzsKIH0KIAogdm9pZCBfX2luaXQKLWFjcGlfbnVtYV9tZW1vcnlfYWZmaW5pdHlfaW5pdChzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkgKm1hKQorYWNwaV9udW1hX21lbW9yeV9hZmZpbml0eV9pbml0KHN0cnVjdCBhY3BpX3NyYXRfbWVtX2FmZmluaXR5ICptYSkKIHsKIAl1bnNpZ25lZCBsb25nIHBhZGRyLCBzaXplOwogCWludCBweG07CkBAIC00ODMsMTMgKzQ3OCwxMSBAQAogCXB4bSA9IGdldF9tZW1vcnlfcHJveGltaXR5X2RvbWFpbihtYSk7CiAKIAkvKiBmaWxsIG5vZGUgbWVtb3J5IGNodW5rIHN0cnVjdHVyZSAqLwotCXBhZGRyID0gbWEtPmJhc2VfYWRkcl9oaTsKLQlwYWRkciA9IChwYWRkciA8PCAzMikgfCBtYS0+YmFzZV9hZGRyX2xvOwotCXNpemUgPSBtYS0+bGVuZ3RoX2hpOwotCXNpemUgPSAoc2l6ZSA8PCAzMikgfCBtYS0+bGVuZ3RoX2xvOworCXBhZGRyID0gbWEtPmJhc2VfYWRkcmVzczsKKwlzaXplID0gbWEtPmxlbmd0aDsKIAogCS8qIElnbm9yZSBkaXNhYmxlZCBlbnRyaWVzICovCi0JaWYgKCFtYS0+ZmxhZ3MuZW5hYmxlZCkKKwlpZiAoIShtYS0+ZmxhZ3MgJiBBQ1BJX1NSQVRfTUVNX0VOQUJMRUQpKQogCQlyZXR1cm47CiAKIAkvKiByZWNvcmQgdGhpcyBub2RlIGluIHByb3hpbWl0eSBiaXRtYXAgKi8KQEAgLTU2MCwxNiArNTUzLDE2IEBACiAJaWYgKCFzbGl0X3RhYmxlKQogCQlyZXR1cm47CiAJbWVtc2V0KG51bWFfc2xpdCwgLTEsIHNpemVvZihudW1hX3NsaXQpKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2xpdF90YWJsZS0+bG9jYWxpdGllczsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHNsaXRfdGFibGUtPmxvY2FsaXR5X2NvdW50OyBpKyspIHsKIAkJaWYgKCFweG1fYml0X3Rlc3QoaSkpCiAJCQljb250aW51ZTsKIAkJbm9kZV9mcm9tID0gcHhtX3RvX25vZGUoaSk7Ci0JCWZvciAoaiA9IDA7IGogPCBzbGl0X3RhYmxlLT5sb2NhbGl0aWVzOyBqKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IHNsaXRfdGFibGUtPmxvY2FsaXR5X2NvdW50OyBqKyspIHsKIAkJCWlmICghcHhtX2JpdF90ZXN0KGopKQogCQkJCWNvbnRpbnVlOwogCQkJbm9kZV90byA9IHB4bV90b19ub2RlKGopOwogCQkJbm9kZV9kaXN0YW5jZShub2RlX2Zyb20sIG5vZGVfdG8pID0KLQkJCSAgICBzbGl0X3RhYmxlLT5lbnRyeVtpICogc2xpdF90YWJsZS0+bG9jYWxpdGllcyArIGpdOworCQkJICAgIHNsaXRfdGFibGUtPmVudHJ5W2kgKiBzbGl0X3RhYmxlLT5sb2NhbGl0eV9jb3VudCArIGpdOwogCQl9CiAJfQogCkBAIC02MTcsMjEgKzYxMCwyMSBAQAogCiBFWFBPUlRfU1lNQk9MKGFjcGlfdW5yZWdpc3Rlcl9nc2kpOwogCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX2ZhZHQodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2VfZmFkdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqZmFkdF9oZWFkZXI7Ci0Jc3RydWN0IGZhZHRfZGVzY3JpcHRvciAqZmFkdDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0ICpmYWR0OwogCi0JaWYgKCFwaHlzX2FkZHIgfHwgIXNpemUpCisJaWYgKCF0YWJsZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmYWR0X2hlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKilfX3ZhKHBoeXNfYWRkcik7CisJZmFkdF9oZWFkZXIgPSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICopdGFibGU7CiAJaWYgKGZhZHRfaGVhZGVyLT5yZXZpc2lvbiAhPSAzKQogCQlyZXR1cm4gLUVOT0RFVjsJLyogT25seSBkZWFsIHdpdGggQUNQSSAyLjAgRkFEVCAqLwogCi0JZmFkdCA9IChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICopZmFkdF9oZWFkZXI7CisJZmFkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0ICopZmFkdF9oZWFkZXI7CiAKLQlhY3BpX3JlZ2lzdGVyX2dzaShmYWR0LT5zY2lfaW50LCBBQ1BJX0xFVkVMX1NFTlNJVElWRSwgQUNQSV9BQ1RJVkVfTE9XKTsKKwlhY3BpX3JlZ2lzdGVyX2dzaShmYWR0LT5zY2lfaW50ZXJydXB0LCBBQ1BJX0xFVkVMX1NFTlNJVElWRSwgQUNQSV9BQ1RJVkVfTE9XKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjU4LDcgKzY1MSw3IEBACiAJICogaW5mb3JtYXRpb24gLS0gdGhlIHN1Y2Nlc3NvciB0byBNUFMgdGFibGVzLgogCSAqLwogCi0JaWYgKGFjcGlfdGFibGVfcGFyc2UoQUNQSV9BUElDLCBhY3BpX3BhcnNlX21hZHQpIDwgMSkgeworCWlmIChhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX01BRFQsIGFjcGlfcGFyc2VfbWFkdCkgPCAxKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkNhbid0IGZpbmQgTUFEVFxuIik7CiAJCWdvdG8gc2tpcF9tYWR0OwogCX0KQEAgLTY2Niw0MCArNjU5LDQwIEBACiAJLyogTG9jYWwgQVBJQyAqLwogCiAJaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdAotCSAgICAoQUNQSV9NQURUX0xBUElDX0FERFJfT1ZSLCBhY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyLCAwKSA8IDApCisJICAgIChBQ1BJX01BRFRfVFlQRV9MT0NBTF9BUElDX09WRVJSSURFLCBhY3BpX3BhcnNlX2xhcGljX2FkZHJfb3ZyLCAwKSA8IDApCiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKIAkJICAgICAgICJFcnJvciBwYXJzaW5nIExBUElDIGFkZHJlc3Mgb3ZlcnJpZGUgZW50cnlcbiIpOwogCi0JaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTFNBUElDLCBhY3BpX3BhcnNlX2xzYXBpYywgTlJfQ1BVUykKKwlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0xPQ0FMX1NBUElDLCBhY3BpX3BhcnNlX2xzYXBpYywgTlJfQ1BVUykKIAkgICAgPCAxKQogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCiAJCSAgICAgICAiRXJyb3IgcGFyc2luZyBNQURUIC0gbm8gTEFQSUMgZW50cmllc1xuIik7CiAKLQlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9MQVBJQ19OTUksIGFjcGlfcGFyc2VfbGFwaWNfbm1pLCAwKQorCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1RZUEVfTE9DQUxfQVBJQ19OTUksIGFjcGlfcGFyc2VfbGFwaWNfbm1pLCAwKQogCSAgICA8IDApCiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkVycm9yIHBhcnNpbmcgTEFQSUMgTk1JIGVudHJ5XG4iKTsKIAogCS8qIEkvTyBBUElDICovCiAKIAlpZiAoYWNwaV90YWJsZV9wYXJzZV9tYWR0Ci0JICAgIChBQ1BJX01BRFRfSU9TQVBJQywgYWNwaV9wYXJzZV9pb3NhcGljLCBOUl9JT1NBUElDUykgPCAxKQorCSAgICAoQUNQSV9NQURUX1RZUEVfSU9fU0FQSUMsIGFjcGlfcGFyc2VfaW9zYXBpYywgTlJfSU9TQVBJQ1MpIDwgMSkKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAogCQkgICAgICAgIkVycm9yIHBhcnNpbmcgTUFEVCAtIG5vIElPU0FQSUMgZW50cmllc1xuIik7CiAKIAkvKiBTeXN0ZW0tTGV2ZWwgSW50ZXJydXB0IFJvdXRpbmcgKi8KIAogCWlmIChhY3BpX3RhYmxlX3BhcnNlX21hZHQKLQkgICAgKEFDUElfTUFEVF9QTEFUX0lOVF9TUkMsIGFjcGlfcGFyc2VfcGxhdF9pbnRfc3JjLAorCSAgICAoQUNQSV9NQURUX1RZUEVfSU5URVJSVVBUX1NPVVJDRSwgYWNwaV9wYXJzZV9wbGF0X2ludF9zcmMsCiAJICAgICBBQ1BJX01BWF9QTEFURk9STV9JTlRFUlJVUFRTKSA8IDApCiAJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKIAkJICAgICAgICJFcnJvciBwYXJzaW5nIHBsYXRmb3JtIGludGVycnVwdCBzb3VyY2UgZW50cnlcbiIpOwogCiAJaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdAotCSAgICAoQUNQSV9NQURUX0lOVF9TUkNfT1ZSLCBhY3BpX3BhcnNlX2ludF9zcmNfb3ZyLCAwKSA8IDApCisJICAgIChBQ1BJX01BRFRfVFlQRV9JTlRFUlJVUFRfT1ZFUlJJREUsIGFjcGlfcGFyc2VfaW50X3NyY19vdnIsIDApIDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAogCQkgICAgICAgIkVycm9yIHBhcnNpbmcgaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZXMgZW50cnlcbiIpOwogCi0JaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfTk1JX1NSQywgYWNwaV9wYXJzZV9ubWlfc3JjLCAwKSA8IDApCisJaWYgKGFjcGlfdGFibGVfcGFyc2VfbWFkdChBQ1BJX01BRFRfVFlQRV9OTUlfU09VUkNFLCBhY3BpX3BhcnNlX25taV9zcmMsIDApIDwgMCkKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcGFyc2luZyBOTUkgU1JDIGVudHJ5XG4iKTsKICAgICAgIHNraXBfbWFkdDoKIApAQCAtNzA5LDcgKzcwMiw3IEBACiAJICogZ2V0cyBpbnRlcnJ1cHRzIHN1Y2ggYXMgcG93ZXIgYW5kIHNsZWVwIGJ1dHRvbnMuICBJZiBpdCdzIG5vdAogCSAqIG9uIGEgTGVnYWN5IGludGVycnVwdCwgaXQgbmVlZHMgdG8gYmUgc2V0dXAuCiAJICovCi0JaWYgKGFjcGlfdGFibGVfcGFyc2UoQUNQSV9GQURULCBhY3BpX3BhcnNlX2ZhZHQpIDwgMSkKKwlpZiAoYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19GQURULCBhY3BpX3BhcnNlX2ZhZHQpIDwgMSkKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ2FuJ3QgZmluZCBGQURUXG4iKTsKIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTg0Miw3ICs4MzUsNyBAQAogewogCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9sc2FwaWMgKmxzYXBpYzsKKwlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3NhcGljICpsc2FwaWM7CiAJY3B1bWFza190IHRtcF9tYXA7CiAJbG9uZyBwaHlzaWQ7CiAJaW50IGNwdTsKQEAgLTg1NCwxNiArODQ3LDE2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJb2JqID0gYnVmZmVyLnBvaW50ZXI7Ci0JaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSIHx8Ci0JICAgIG9iai0+YnVmZmVyLmxlbmd0aCA8IHNpemVvZigqbHNhcGljKSkgeworCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikKKwl7CiAJCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbHNhcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2xzYXBpYyAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CisJbHNhcGljID0gKHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfc2FwaWMgKilvYmotPmJ1ZmZlci5wb2ludGVyOwogCi0JaWYgKChsc2FwaWMtPmhlYWRlci50eXBlICE9IEFDUElfTUFEVF9MU0FQSUMpIHx8Ci0JICAgICghbHNhcGljLT5mbGFncy5lbmFibGVkKSkgeworCWlmICgobHNhcGljLT5oZWFkZXIudHlwZSAhPSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9TQVBJQykgfHwKKwkgICAgKCFsc2FwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKSB7CiAJCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtODgzLDcgKzg3Niw2IEBACiAKIAljcHVfc2V0KGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKIAlpYTY0X2NwdV90b19zYXBpY2lkW2NwdV0gPSBwaHlzaWQ7Ci0JaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtsc2FwaWMtPmFjcGlfaWRdID0gaWE2NF9jcHVfdG9fc2FwaWNpZFtjcHVdOwogCiAJKnBjcHUgPSBjcHU7CiAJcmV0dXJuICgwKTsKQEAgLTg5MywxNCArODg1LDYgQEAKIAogaW50IGFjcGlfdW5tYXBfbHNhcGljKGludCBjcHUpCiB7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NBUElDUzsgaSsrKSB7Ci0JCWlmIChpYTY0X2FjcGlpZF90b19zYXBpY2lkW2ldID09IGlhNjRfY3B1X3RvX3NhcGljaWRbY3B1XSkgewotCQkJaWE2NF9hY3BpaWRfdG9fc2FwaWNpZFtpXSA9IC0xOwotCQkJYnJlYWs7Ci0JCX0KLQl9CiAJaWE2NF9jcHVfdG9fc2FwaWNpZFtjcHVdID0gLTE7CiAJY3B1X2NsZWFyKGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKIApAQCAtOTIwLDcgKzkwNCw3IEBACiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAl1bmlvbiBhY3BpX29iamVjdCAqb2JqOwotCXN0cnVjdCBhY3BpX3RhYmxlX2lvc2FwaWMgKmlvc2FwaWM7CisJc3RydWN0IGFjcGlfbWFkdF9pb19zYXBpYyAqaW9zYXBpYzsKIAl1bnNpZ25lZCBpbnQgZ3NpX2Jhc2U7CiAJaW50IHB4bSwgbm9kZTsKIApAQCAtOTM4LDkgKzkyMiw5IEBACiAJCXJldHVybiBBRV9PSzsKIAl9CiAKLQlpb3NhcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2lvc2FwaWMgKilvYmotPmJ1ZmZlci5wb2ludGVyOworCWlvc2FwaWMgPSAoc3RydWN0IGFjcGlfbWFkdF9pb19zYXBpYyAqKW9iai0+YnVmZmVyLnBvaW50ZXI7CiAKLQlpZiAoaW9zYXBpYy0+aGVhZGVyLnR5cGUgIT0gQUNQSV9NQURUX0lPU0FQSUMpIHsKKwlpZiAoaW9zYXBpYy0+aGVhZGVyLnR5cGUgIT0gQUNQSV9NQURUX1RZUEVfSU9fU0FQSUMpIHsKIAkJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCQlyZXR1cm4gQUVfT0s7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19hY3BpX2luaXQuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fYWNwaV9pbml0LmMKaW5kZXggY2I5NmI0ZS4uOGMzMzFjYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19hY3BpX2luaXQuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2FjcGlfaW5pdC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgogI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKIAogLyoKQEAgLTMxLDYgKzMyLDEyIEBACiAJCSAgICAweGEyLCAweDdjLCAweDA4LCAweDAwLCAweDY5LCAweDEzLCAweGVhLCAweDUxIH0sCiB9OwogCitzdHJ1Y3Qgc25fcGNpZGV2X21hdGNoIHsKKwl1OCBidXM7CisJdW5zaWduZWQgaW50IGRldmZuOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKK307CisKIC8qCiAgKiBQZXJmb3JtIHRoZSBlYXJseSBJTyBpbml0IGluIFBST00uCiAgKi8KQEAgLTExOSw5ICsxMjYsMTEgQEAKIAlzdGF0dXMgPSBhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAogCQkJCQkgICZzbl91dWlkLCAmYnVmZmVyKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJnZXRfYWNwaV9wY2lidXNfcHRyOiAiCi0JCSAgICAgICAiZ2V0X2FjcGlfYnVzc29mdF9pbmZvKCkgZmFpbGVkOiAlZFxuIiwKLQkJICAgICAgIHN0YXR1cyk7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICIKKwkJICAgICAgICJhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoKSBmYWlsZWQgKDB4JXgpIGZvcjogIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGhhbmRsZSwgTlVMTCk7CisJCXByaW50aygiXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXJlc291cmNlID0gYnVmZmVyLnBvaW50ZXI7CkBAIC0xMzAsOCArMTM5LDggQEAKIAlpZiAoKHZlbmRvci0+Ynl0ZV9sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdmVuZG9yX3V1aWQpKSAhPQogCSAgICAgc2l6ZW9mKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKSkgewogCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJnZXRfYWNwaV9idXNzb2Z0X3B0cjogSW52YWxpZCB2ZW5kb3IgZGF0YSAiCi0JCSAgICAgICAibGVuZ3RoICVkXG4iLCB2ZW5kb3ItPmJ5dGVfbGVuZ3RoKTsKKwkJICAgICAgICIlczogSW52YWxpZCB2ZW5kb3IgZGF0YSBsZW5ndGggJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHZlbmRvci0+Ynl0ZV9sZW5ndGgpOwogCQlrZnJlZShidWZmZXIucG9pbnRlcik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTE0MywzNCArMTUyLDI1NCBAQAogfQogCiAvKgotICogc25fYWNwaV9idXNfZml4dXAKKyAqIHNuX2V4dHJhY3RfZGV2aWNlX2luZm8gLSBFeHRyYWN0IHRoZSBwY2lkZXZfaW5mbyBhbmQgdGhlIHNuX2lycV9pbmZvCisgKgkJCSAgICBwb2ludGVycyBmcm9tIHRoZSB2ZW5kb3IgcmVzb3VyY2UgdXNpbmcgdGhlCisgKgkJCSAgICBwcm92aWRlZCBhY3BpIGhhbmRsZSwgYW5kIGNvcHkgdGhlIHN0cnVjdHVyZXMKKyAqCQkJICAgIGludG8gdGhlIGFyZ3VtZW50IGJ1ZmZlcnMuCiAgKi8KLXZvaWQKLXNuX2FjcGlfYnVzX2ZpeHVwKHN0cnVjdCBwY2lfYnVzICpidXMpCitzdGF0aWMgaW50Citzbl9leHRyYWN0X2RldmljZV9pbmZvKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IHBjaWRldl9pbmZvICoqcGNpZGV2X2luZm8sCisJCSAgICBzdHJ1Y3Qgc25faXJxX2luZm8gKipzbl9pcnFfaW5mbykKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7Ci0Jc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnRfcHRyOwotCWV4dGVybiB2b2lkIHNuX2NvbW1vbl9idXNfZml4dXAoc3RydWN0IHBjaV9idXMgKiwKLQkJCQkJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopOworCXU2NCBhZGRyOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJc3RydWN0IHNuX2lycV9pbmZvICppcnFfaW5mbywgKmlycV9pbmZvX3Byb207CisJc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfcHRyLCAqcGNpZGV2X3Byb21fcHRyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZTsKKwlpbnQgcmV0ID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yX3R5cGVkICp2ZW5kb3I7CiAKLQlpZiAoIWJ1cy0+cGFyZW50KSB7CS8qIElmIHJvb3QgYnVzICovCi0JCXByb21fYnVzc29mdF9wdHIgPSBzbl9nZXRfYnVzc29mdF9wdHIoYnVzKTsKLQkJaWYgKHByb21fYnVzc29mdF9wdHIgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgInNuX3BjaV9maXh1cF9idXM6IDB4JTA0eDoweCUwMnggVW5hYmxlIHRvICIKLQkJCSAgICAgICAib2J0YWluIHByb21fYnVzc29mdF9wdHJcbiIsCi0JCQkgICAgICAgcGNpX2RvbWFpbl9ucihidXMpLCBidXMtPm51bWJlcik7Ci0JCQlyZXR1cm47CisJLyoKKwkgKiBUaGUgcG9pbnRlciB0byB0aGlzIGRldmljZSdzIHBjaWRldl9pbmZvIHN0cnVjdHVyZSBpbgorCSAqIHRoZSBQUk9NLCBpcyBpbiB0aGUgdmVuZG9yIHJlc291cmNlLgorCSAqLworCXN0YXR1cyA9IGFjcGlfZ2V0X3ZlbmRvcl9yZXNvdXJjZShoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCisJCQkJCSAgJnNuX3V1aWQsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICIlczogYWNwaV9nZXRfdmVuZG9yX3Jlc291cmNlKCkgZmFpbGVkICgweCV4KSBmb3I6ICIsCisJCSAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUoaGFuZGxlLCBOVUxMKTsKKwkJcHJpbnRrKCJcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXNvdXJjZSA9IGJ1ZmZlci5wb2ludGVyOworCXZlbmRvciA9ICZyZXNvdXJjZS0+ZGF0YS52ZW5kb3JfdHlwZWQ7CisJaWYgKCh2ZW5kb3ItPmJ5dGVfbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3ZlbmRvcl91dWlkKSkgIT0KKwkgICAgc2l6ZW9mKHN0cnVjdCBwY2lfZGV2ZGV2X2luZm8gKikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IEludmFsaWQgdmVuZG9yIGRhdGEgbGVuZ3RoOiAlZCBmb3I6ICIsCisJCSAgICAgICAgX19GVU5DVElPTl9fLCB2ZW5kb3ItPmJ5dGVfbGVuZ3RoKTsKKwkJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGhhbmRsZSwgTlVMTCk7CisJCXByaW50aygiXG4iKTsKKwkJcmV0ID0gMTsKKwkJZ290byBleGl0OworCX0KKworCXBjaWRldl9wdHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjaWRldl9wdHIpCisJCXBhbmljKCIlczogVW5hYmxlIHRvIGFsbG9jIG1lbW9yeSBmb3IgcGNpZGV2X2luZm8iLCBfX0ZVTkNUSU9OX18pOworCisJbWVtY3B5KCZhZGRyLCB2ZW5kb3ItPmJ5dGVfZGF0YSwgc2l6ZW9mKHN0cnVjdCBwY2lkZXZfaW5mbyAqKSk7CisJcGNpZGV2X3Byb21fcHRyID0gX192YShhZGRyKTsKKwltZW1jcHkocGNpZGV2X3B0ciwgcGNpZGV2X3Byb21fcHRyLCBzaXplb2Yoc3RydWN0IHBjaWRldl9pbmZvKSk7CisKKwkvKiBHZXQgdGhlIElSUSBpbmZvICovCisJaXJxX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc25faXJxX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlycV9pbmZvKQorCQkgcGFuaWMoIiVzOiBVbmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBzbl9pcnFfaW5mbyIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAocGNpZGV2X3B0ci0+cGRpX3NuX2lycV9pbmZvKSB7CisJCWlycV9pbmZvX3Byb20gPSBfX3ZhKHBjaWRldl9wdHItPnBkaV9zbl9pcnFfaW5mbyk7CisJCW1lbWNweShpcnFfaW5mbywgaXJxX2luZm9fcHJvbSwgc2l6ZW9mKHN0cnVjdCBzbl9pcnFfaW5mbykpOworCX0KKworCSpwY2lkZXZfaW5mbyA9IHBjaWRldl9wdHI7CisJKnNuX2lycV9pbmZvID0gaXJxX2luZm87CisKK2V4aXQ6CisJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2dldF9ob3N0X2RldmZuKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsIGFjcGlfaGFuZGxlIHJvb3RidXNfaGFuZGxlKQoreworCXVuc2lnbmVkIGxvbmcgYWRyOworCWFjcGlfaGFuZGxlIGNoaWxkOworCXVuc2lnbmVkIGludCBkZXZmbjsKKwlpbnQgZnVuY3Rpb247CisJYWNwaV9oYW5kbGUgcGFyZW50OworCWludCBzbG90OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCS8qCisJICogRG8gYW4gdXB3YXJkIHNlYXJjaCB0byBmaW5kIHRoZSByb290IGJ1cyBkZXZpY2UsIGFuZAorCSAqIG9idGFpbiB0aGUgaG9zdCBkZXZmbiBmcm9tIHRoZSBwcmV2aW91cyBjaGlsZCBkZXZpY2UuCisJICovCisJY2hpbGQgPSBkZXZpY2VfaGFuZGxlOworCXdoaWxlIChjaGlsZCkgeworCQlzdGF0dXMgPSBhY3BpX2dldF9wYXJlbnQoY2hpbGQsICZwYXJlbnQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFjcGlfZ2V0X3BhcmVudCgpIGZhaWxlZCAiCisJCQkgICAgICAgIigweCV4KSBmb3I6ICIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZShjaGlsZCwgTlVMTCk7CisJCQlwcmludGsoIlxuIik7CisJCQlwYW5pYygiJXM6IFVuYWJsZSB0byBmaW5kIGhvc3QgZGV2Zm5cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCX0KLQkJc25fY29tbW9uX2J1c19maXh1cChidXMsIHByb21fYnVzc29mdF9wdHIpOworCQlpZiAocGFyZW50ID09IHJvb3RidXNfaGFuZGxlKQorCQkJYnJlYWs7CisJCWNoaWxkID0gcGFyZW50OwogCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjaV9kZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7Ci0JCXNuX3BjaV9maXh1cF9zbG90KHBjaV9kZXYpOworCWlmICghY2hpbGQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGZpbmQgcm9vdCBidXMgZm9yOiAiLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lKGRldmljZV9oYW5kbGUsIE5VTEwpOworCQlwcmludGsoIlxuIik7CisJCUJVRygpOwogCX0KKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihjaGlsZCwgTUVUSE9EX05BTUVfX0FEUiwgTlVMTCwgJmFkcik7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBnZXQgX0FEUiAoMHgleCkgZm9yOiAiLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUoY2hpbGQsIE5VTEwpOworCQlwcmludGsoIlxuIik7CisJCXBhbmljKCIlczogVW5hYmxlIHRvIGZpbmQgaG9zdCBkZXZmblxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisKKwlzbG90ID0gKGFkciA+PiAxNikgJiAweGZmZmY7CisJZnVuY3Rpb24gPSBhZHIgJiAweGZmZmY7CisJZGV2Zm4gPSBQQ0lfREVWRk4oc2xvdCwgZnVuY3Rpb24pOworCXJldHVybiBkZXZmbjsKIH0KIAogLyoKLSAqIHNuX2FjcGlfc2xvdF9maXh1cCAtIFBlcmZvcm0gYW55IFNOIHNwZWNpZmljIHNsb3QgZml4dXAuCisgKiBmaW5kX21hdGNoaW5nX2RldmljZSAtIENhbGxiYWNrIHJvdXRpbmUgdG8gZmluZCB0aGUgQUNQSSBkZXZpY2UKKyAqCQkJICB0aGF0IG1hdGNoZXMgdXAgd2l0aCBvdXIgcGNpX2RldiBkZXZpY2UuCisgKgkJCSAgTWF0Y2hpbmcgaXMgZG9uZSBvbiBidXMgbnVtYmVyIGFuZCBkZXZmbi4KKyAqCQkJICBUbyBmaW5kIHRoZSBidXMgbnVtYmVyIGZvciBhIHBhcnRpY3VsYXIKKyAqCQkJICBBQ1BJIGRldmljZSwgd2UgbXVzdCBsb29rIGF0IHRoZSBfQkJOIG1ldGhvZAorICoJCQkgIG9mIGl0cyBwYXJlbnQuCisgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cworZmluZF9tYXRjaGluZ19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCit7CisJdW5zaWduZWQgbG9uZyBiYm4gPSAtMTsKKwl1bnNpZ25lZCBsb25nIGFkcjsKKwlhY3BpX2hhbmRsZSBwYXJlbnQgPSBOVUxMOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgZGV2Zm47CisJaW50IGZ1bmN0aW9uOworCWludCBzbG90OworCXN0cnVjdCBzbl9wY2lkZXZfbWF0Y2ggKmluZm8gPSBjb250ZXh0OworCisgICAgICAgIHN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsIE1FVEhPRF9OQU1FX19BRFIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRyKTsKKyAgICAgICAgaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXN0YXR1cyA9IGFjcGlfZ2V0X3BhcmVudChoYW5kbGUsICZwYXJlbnQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogYWNwaV9nZXRfcGFyZW50KCkgZmFpbGVkICgweCV4KSBmb3I6ICIsCisJCQkJCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJCWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZShoYW5kbGUsIE5VTEwpOworCQkJcHJpbnRrKCJcbiIpOworCQkJcmV0dXJuIEFFX09LOworCQl9CisJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihwYXJlbnQsIE1FVEhPRF9OQU1FX19CQk4sCisJCQkJCSAgICAgICBOVUxMLCAmYmJuKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgIiVzOiBGYWlsZWQgdG8gZmluZCBfQkJOIGluIHBhcmVudCBvZjogIiwKKwkJCQkJX19GVU5DVElPTl9fKTsKKwkJCWFjcGlfbnNfcHJpbnRfbm9kZV9wYXRobmFtZShoYW5kbGUsIE5VTEwpOworCQkJcHJpbnRrKCJcbiIpOworCQkJcmV0dXJuIEFFX09LOworCQl9CisKKyAgICAgICAgICAgICAgICBzbG90ID0gKGFkciA+PiAxNikgJiAweGZmZmY7CisgICAgICAgICAgICAgICAgZnVuY3Rpb24gPSBhZHIgJiAweGZmZmY7CisgICAgICAgICAgICAgICAgZGV2Zm4gPSBQQ0lfREVWRk4oc2xvdCwgZnVuY3Rpb24pOworICAgICAgICAgICAgICAgIGlmICgoaW5mby0+ZGV2Zm4gPT0gZGV2Zm4pICYmIChpbmZvLT5idXMgPT0gYmJuKSkgeworCQkJLyogV2UgaGF2ZSBhIG1hdGNoISAqLworCQkJaW5mby0+aGFuZGxlID0gaGFuZGxlOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIEFFX09LOworfQorCisvKgorICogc25fYWNwaV9nZXRfcGNpZGV2X2luZm8gLSBTZWFyY2ggQUNQSSBuYW1lc3BhY2UgZm9yIHRoZSBhY3BpCisgKgkJCSAgICAgZGV2aWNlIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgcGNpX2RldiwKKyAqCQkJICAgICBhbmQgcmV0dXJuIHRoZSBwY2lkZXYgaW5mbyBhbmQgaXJxIGluZm8uCisgKi8KK2ludAorc25fYWNwaV9nZXRfcGNpZGV2X2luZm8oc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaWRldl9pbmZvICoqcGNpZGV2X2luZm8sCisJCQlzdHJ1Y3Qgc25faXJxX2luZm8gKipzbl9pcnFfaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaG9zdF9kZXZmbjsKKwlzdHJ1Y3Qgc25fcGNpZGV2X21hdGNoIHBjaWRldl9tYXRjaDsKKwlhY3BpX2hhbmRsZSByb290YnVzX2hhbmRsZTsKKwl1bnNpZ25lZCBsb25nIHNlZ21lbnQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJcm9vdGJ1c19oYW5kbGUgPSBQQ0lfQ09OVFJPTExFUihkZXYpLT5hY3BpX2hhbmRsZTsKKyAgICAgICAgc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHJvb3RidXNfaGFuZGxlLCBNRVRIT0RfTkFNRV9fU0VHLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZ21lbnQpOworICAgICAgICBpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJaWYgKHNlZ21lbnQgIT0gcGNpX2RvbWFpbl9ucihkZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXM6IFNlZ21lbnQgbnVtYmVyIG1pc21hdGNoLCAweCVseCB2cyAweCV4IGZvcjogIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHNlZ21lbnQsIHBjaV9kb21haW5fbnIoZGV2KSk7CisJCQlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUocm9vdGJ1c19oYW5kbGUsIE5VTEwpOworCQkJcHJpbnRrKCJcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gZ2V0IF9fU0VHIGZyb206ICIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUocm9vdGJ1c19oYW5kbGUsIE5VTEwpOworCQlwcmludGsoIlxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qCisJICogV2Ugd2FudCB0byBzZWFyY2ggYWxsIGRldmljZXMgaW4gdGhpcyBzZWdtZW50L2RvbWFpbgorCSAqIG9mIHRoZSBBQ1BJIG5hbWVzcGFjZSBmb3IgdGhlIG1hdGNoaW5nIEFDUEkgZGV2aWNlLAorCSAqIHdoaWNoIGhvbGRzIHRoZSBwY2lkZXZfaW5mbyBwb2ludGVyIGluIGl0cyB2ZW5kb3IgcmVzb3VyY2UuCisJICovCisJcGNpZGV2X21hdGNoLmJ1cyA9IGRldi0+YnVzLT5udW1iZXI7CisJcGNpZGV2X21hdGNoLmRldmZuID0gZGV2LT5kZXZmbjsKKwlwY2lkZXZfbWF0Y2guaGFuZGxlID0gTlVMTDsKKworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgcm9vdGJ1c19oYW5kbGUsIEFDUElfVUlOVDMyX01BWCwKKwkJCSAgICBmaW5kX21hdGNoaW5nX2RldmljZSwgJnBjaWRldl9tYXRjaCwgTlVMTCk7CisKKwlpZiAoIXBjaWRldl9tYXRjaC5oYW5kbGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IENvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIEFDUEkgZGV2aWNlIGZvciAlcy5cbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIHBjaV9uYW1lKGRldikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoc25fZXh0cmFjdF9kZXZpY2VfaW5mbyhwY2lkZXZfbWF0Y2guaGFuZGxlLCBwY2lkZXZfaW5mbywgc25faXJxX2luZm8pKQorCQlyZXR1cm4gMTsKKworCS8qIEJ1aWxkIHVwIHRoZSBwY2lkZXZfaW5mby5wZGlfc2xvdF9ob3N0X2hhbmRsZSAqLworCWhvc3RfZGV2Zm4gPSBnZXRfaG9zdF9kZXZmbihwY2lkZXZfbWF0Y2guaGFuZGxlLCByb290YnVzX2hhbmRsZSk7CisJKCpwY2lkZXZfaW5mbyktPnBkaV9zbG90X2hvc3RfaGFuZGxlID0KKwkJCSgodW5zaWduZWQgbG9uZykgcGNpX2RvbWFpbl9ucihkZXYpIDw8IDQwKSB8CisJCQkJCS8qIGJ1cyA9PSAwICovCisJCQkJCWhvc3RfZGV2Zm47CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzbl9hY3BpX3Nsb3RfZml4dXAgLSBPYnRhaW4gdGhlIHBjaWRldl9pbmZvIGFuZCBzbl9pcnFfaW5mby4KKyAqCQkJUGVyZm9ybSBhbnkgU04gc3BlY2lmaWMgc2xvdCBmaXh1cC4KICAqCQkJQXQgcHJlc2VudCB0aGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUKICAqCQkJYW55IGdlbmVyaWMgd2F5IHRvIGhhbmRsZSBhIFJPTSBpbWFnZQogICoJCQl0aGF0IGhhcyBiZWVuIHNoYWRvd2VkIGJ5IHRoZSBQUk9NLCBzbwpAQCAtMTc5LDExICs0MDgsMTggQEAKICAqLwogCiB2b2lkCi1zbl9hY3BpX3Nsb3RfZml4dXAoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbykKK3NuX2FjcGlfc2xvdF9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXZvaWQgX19pb21lbSAqYWRkcjsKKwlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvID0gTlVMTDsKKwlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvID0gTlVMTDsKIAlzaXplX3Qgc2l6ZTsKIAorCWlmIChzbl9hY3BpX2dldF9wY2lkZXZfaW5mbyhkZXYsICZwY2lkZXZfaW5mbywgJnNuX2lycV9pbmZvKSkgeworCQlwYW5pYygiJXM6ICBGYWlsdXJlIG9idGFpbmluZyBwY2lkZXZfaW5mbyBmb3IgJXNcbiIsCisJCSAgICAgIF9fRlVOQ1RJT05fXywgcGNpX25hbWUoZGV2KSk7CisJfQorCiAJaWYgKHBjaWRldl9pbmZvLT5wZGlfcGlvX21hcHBlZF9hZGRyW1BDSV9ST01fUkVTT1VSQ0VdKSB7CiAJCS8qCiAJCSAqIEEgdmFsaWQgUk9NIGltYWdlIGV4aXN0cyBhbmQgaGFzIGJlZW4gc2hhZG93ZWQgYnkgdGhlCkBAIC0yMDAsOCArNDM2LDExIEBACiAJCQkJCQkodW5zaWduZWQgbG9uZykgYWRkciArIHNpemU7CiAJCWRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uZmxhZ3MgfD0gSU9SRVNPVVJDRV9ST01fQklPU19DT1BZOwogCX0KKwlzbl9wY2lfZml4dXBfc2xvdChkZXYsIHBjaWRldl9pbmZvLCBzbl9pcnFfaW5mbyk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25fYWNwaV9zbG90X2ZpeHVwKTsKKwogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3NuX2h1YmRldl9kcml2ZXIgPSB7CiAJLm5hbWUgPSAiU0dJIEhVQkRFViBEcml2ZXIiLAogCS5pZHMgPSAiU0dJSFVCLFNHSVRJTyIsCkBAIC0yMTIsNiArNDUxLDMzIEBACiAKIAogLyoKKyAqIHNuX2FjcGlfYnVzX2ZpeHVwIC0gIFBlcmZvcm0gU04gc3BlY2lmaWMgc2V0dXAgb2Ygc29mdHdhcmUgc3RydWN0cworICoJCQkocGNpYnVzX2J1c3NvZnQsIHBjaWRldl9pbmZvKSBhbmQgaGFyZHdhcmUKKyAqCQkJcmVnaXN0ZXJzLCBmb3IgdGhlIHNwZWNpZmllZCBidXMgYW5kIGRldmljZXMgdW5kZXIgaXQuCisgKi8KK3ZvaWQKK3NuX2FjcGlfYnVzX2ZpeHVwKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCXN0cnVjdCBwY2lidXNfYnVzc29mdCAqcHJvbV9idXNzb2Z0X3B0cjsKKworCWlmICghYnVzLT5wYXJlbnQpIHsJLyogSWYgcm9vdCBidXMgKi8KKwkJcHJvbV9idXNzb2Z0X3B0ciA9IHNuX2dldF9idXNzb2Z0X3B0cihidXMpOworCQlpZiAocHJvbV9idXNzb2Z0X3B0ciA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXM6IDB4JTA0eDoweCUwMnggVW5hYmxlIHRvICIKKwkJCSAgICAgICAib2J0YWluIHByb21fYnVzc29mdF9wdHJcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBwY2lfZG9tYWluX25yKGJ1cyksIGJ1cy0+bnVtYmVyKTsKKwkJCXJldHVybjsKKwkJfQorCQlzbl9jb21tb25fYnVzX2ZpeHVwKGJ1cywgcHJvbV9idXNzb2Z0X3B0cik7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkocGNpX2RldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJc25fYWNwaV9zbG90X2ZpeHVwKHBjaV9kZXYpOworCX0KK30KKworLyoKICAqIHNuX2lvX2FjcGlfaW5pdCAtIFBST00gaGFzIEFDUEkgc3VwcG9ydCBmb3IgSU8sIGRlZmluaW5nIGF0IGEgbWluaW11bSB0aGUKICAqCQkgICAgIG5vZGVzIGFuZCByb290IGJ1c2VzIGluIHRoZSBEU0RULiBBcyBhIHJlc3VsdCwgYnVzIHNjYW5uaW5nCiAgKgkJICAgICB3aWxsIGJlIGluaXRpYXRlZCBieSB0aGUgTGludXggQUNQSSBjb2RlLgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19jb21tb24uYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fY29tbW9uLmMKaW5kZXggZDRkZDhmNC4uZDQ4YmNkOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19jb21tb24uYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2NvbW1vbi5jCkBAIC0yNiwxNCArMjYsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuMi9zbl9od3BlcmYuaD4KICNpbmNsdWRlIDxhc20vc24vYWNwaS5oPgorI2luY2x1ZGUgImFjcGkvYWNnbG9iYWwuaCIKIAogZXh0ZXJuIHZvaWQgc25faW5pdF9jcGVpX3RpbWVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfc25fcHJvY2ZzKHZvaWQpOwotZXh0ZXJuIHZvaWQgc25fYWNwaV9idXNfZml4dXAoc3RydWN0IHBjaV9idXMgKik7Ci1leHRlcm4gdm9pZCBzbl9idXNfZml4dXAoc3RydWN0IHBjaV9idXMgKik7Ci1leHRlcm4gdm9pZCBzbl9hY3BpX3Nsb3RfZml4dXAoc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IHBjaWRldl9pbmZvICopOwotZXh0ZXJuIHZvaWQgc25fbW9yZV9zbG90X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICosIHN0cnVjdCBwY2lkZXZfaW5mbyAqKTsKLWV4dGVybiB2b2lkIHNuX2xlZ2FjeV9wY2lfd2luZG93X2ZpeHVwKHN0cnVjdCBwY2lfY29udHJvbGxlciAqLCB1NjQsIHU2NCk7CiBleHRlcm4gdm9pZCBzbl9pb19hY3BpX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBzbl9pb19pbml0KHZvaWQpOwogCkBAIC00OCw2ICs0NCw5IEBACiAKIGludCBzbl9pb2lmX2luaXRlZDsJCS8qIFNOIEkvTyBpbmZyYXN0cnVjdHVyZSBpbml0aWFsaXplZD8gKi8KIAoraW50IHNuX2FjcGlfcmV2OwkJLyogU04gQUNQSSByZXZpc2lvbiAqLworRVhQT1JUX1NZTUJPTF9HUEwoc25fYWNwaV9yZXYpOworCiBzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpzbl9wY2lfcHJvdmlkZXJbUENJSU9fQVNJQ19NQVhfVFlQRVNdOwkvKiBpbmRleGVkIGJ5IGFzaWMgdHlwZSAqLwogCiAvKgpAQCAtOTksMjUgKzk4LDYgQEAKIH0KIAogLyoKLSAqIFJldHJpZXZlIHRoZSBwY2kgZGV2aWNlIGluZm9ybWF0aW9uIGdpdmVuIHRoZSBidXMgYW5kIGRldmljZXxmdW5jdGlvbiBudW1iZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTY0Ci1zYWxfZ2V0X3BjaWRldl9pbmZvKHU2NCBzZWdtZW50LCB1NjQgYnVzX251bWJlciwgdTY0IGRldmZuLCB1NjQgcGNpX2RldiwKLQkJICAgIHU2NCBzbl9pcnFfaW5mbykKLXsKLQlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKLQlyZXRfc3R1ZmYuc3RhdHVzID0gMDsKLQlyZXRfc3R1ZmYudjAgPSAwOwotCi0JU0FMX0NBTExfTk9MT0NLKHJldF9zdHVmZiwKLQkJCSh1NjQpIFNOX1NBTF9JT0lGX0dFVF9QQ0lERVZfSU5GTywKLQkJCSh1NjQpIHNlZ21lbnQsICh1NjQpIGJ1c19udW1iZXIsICh1NjQpIGRldmZuLAotCQkJKHU2NCkgcGNpX2RldiwKLQkJCXNuX2lycV9pbmZvLCAwLCAwKTsKLQlyZXR1cm4gcmV0X3N0dWZmLnYwOwotfQotCi0vKgogICogc25fcGNpZGV2X2luZm9fZ2V0KCkgLSBSZXRyaWV2ZSB0aGUgcGNpZGV2X2luZm8gc3RydWN0IGZvciB0aGUgc3BlY2lmaWVkCiAgKgkJCSAgZGV2aWNlLgogICovCkBAIC0yNDksNTAgKzIyOSwyNSBAQAogfQogCiAvKgotICogc25fcGNpX2ZpeHVwX3Nsb3QoKSAtIFRoaXMgcm91dGluZSBzZXRzIHVwIGEgc2xvdCdzIHJlc291cmNlcyBjb25zaXN0ZW50Ci0gKgkJCSB3aXRoIHRoZSBMaW51eCBQQ0kgYWJzdHJhY3Rpb24gbGF5ZXIuIFJlc291cmNlcwotICoJCQkgYWNxdWlyZWQgZnJvbSBvdXIgUENJIHByb3ZpZGVyIGluY2x1ZGUgUElPIG1hcHMKLSAqCQkJIHRvIEJBUiBzcGFjZSBhbmQgaW50ZXJydXB0IG9iamVjdHMuCisgKiBzbl9wY2lfZml4dXBfc2xvdCgpCiAgKi8KLXZvaWQgc25fcGNpX2ZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldikKK3ZvaWQgc25fcGNpX2ZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbywKKwkJICAgICAgIHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pCiB7CiAJaW50IHNlZ21lbnQgPSBwY2lfZG9tYWluX25yKGRldi0+YnVzKTsKLQlpbnQgc3RhdHVzID0gMDsKIAlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKmJzOwotIAlzdHJ1Y3QgcGNpX2J1cyAqaG9zdF9wY2lfYnVzOwotIAlzdHJ1Y3QgcGNpX2RldiAqaG9zdF9wY2lfZGV2OwotCXN0cnVjdCBwY2lkZXZfaW5mbyAqcGNpZGV2X2luZm87Ci0gCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87Ci0gCXVuc2lnbmVkIGludCBidXNfbm8sIGRldmZuOworCXN0cnVjdCBwY2lfYnVzICpob3N0X3BjaV9idXM7CisJc3RydWN0IHBjaV9kZXYgKmhvc3RfcGNpX2RldjsKKwl1bnNpZ25lZCBpbnQgYnVzX25vLCBkZXZmbjsKIAogCXBjaV9kZXZfZ2V0KGRldik7IC8qIGZvciB0aGUgc3lzZGF0YSBwb2ludGVyICovCi0JcGNpZGV2X2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjaWRldl9pbmZvKQotCQlCVUcoKTsJCS8qIENhbm5vdCBhZmZvcmQgdG8gcnVuIG91dCBvZiBtZW1vcnkgKi8KLQotCXNuX2lycV9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzbl9pcnFfaW5mbykKLQkJQlVHKCk7CQkvKiBDYW5ub3QgYWZmb3JkIHRvIHJ1biBvdXQgb2YgbWVtb3J5ICovCi0KLQkvKiBDYWxsIHRvIHJldHJpZXZlIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IGtlcm5lbC4gKi8KLQlzdGF0dXMgPSBzYWxfZ2V0X3BjaWRldl9pbmZvKCh1NjQpIHNlZ21lbnQsICh1NjQpIGRldi0+YnVzLT5udW1iZXIsCi0JCQkJICAgICBkZXYtPmRldmZuLAotCQkJCSAgICAgKHU2NCkgX19wYShwY2lkZXZfaW5mbyksCi0JCQkJICAgICAodTY0KSBfX3BhKHNuX2lycV9pbmZvKSk7Ci0JaWYgKHN0YXR1cykKLQkJQlVHKCk7IC8qIENhbm5vdCBnZXQgcGxhdGZvcm0gcGNpIGRldmljZSBpbmZvcm1hdGlvbiAqLwogCiAJLyogQWRkIHBjaWRldl9pbmZvIHRvIGxpc3QgaW4gcGNpX2NvbnRyb2xsZXIucGxhdGZvcm1fZGF0YSAqLwogCWxpc3RfYWRkX3RhaWwoJnBjaWRldl9pbmZvLT5wZGlfbGlzdCwKIAkJICAgICAgJihTTl9QTEFURk9STV9EQVRBKGRldi0+YnVzKS0+cGNpZGV2X2luZm8pKTsKLQotCWlmIChTTl9BQ1BJX0JBU0VfU1VQUE9SVCgpKQotCQlzbl9hY3BpX3Nsb3RfZml4dXAoZGV2LCBwY2lkZXZfaW5mbyk7Ci0JZWxzZQotCQlzbl9tb3JlX3Nsb3RfZml4dXAoZGV2LCBwY2lkZXZfaW5mbyk7CiAJLyoKIAkgKiBVc2luZyB0aGUgUFJPTXMgdmFsdWVzIGZvciB0aGUgUENJIGhvc3QgYnVzLCBnZXQgdGhlIExpbnV4Ci0gCSAqIFBDSSBob3N0X3BjaV9kZXYgc3RydWN0IGFuZCBzZXQgdXAgaG9zdCBidXMgbGlua2FnZXMKKwkgKiBQQ0kgaG9zdF9wY2lfZGV2IHN0cnVjdCBhbmQgc2V0IHVwIGhvc3QgYnVzIGxpbmthZ2VzCiAgCSAqLwogCiAJYnVzX25vID0gKHBjaWRldl9pbmZvLT5wZGlfc2xvdF9ob3N0X2hhbmRsZSA+PiAzMikgJiAweGZmOwpAQCAtNDg5LDExICs0NDQsNiBAQAogCQkJc3ByaW50ZihhZGRyZXNzLCAiJXNeJWQiLCBhZGRyZXNzLCBnZW9fc2xvdChnZW9pZCkpOwogfQogCi0vKgotICogc25fcGNpX2ZpeHVwX2J1cygpIC0gUGVyZm9ybSBTTiBzcGVjaWZpYyBzZXR1cCBvZiBzb2Z0d2FyZSBzdHJ1Y3RzCi0gKgkJCShwY2lidXNfYnVzc29mdCwgcGNpZGV2X2luZm8pIGFuZCBoYXJkd2FyZQotICoJCQlyZWdpc3RlcnMsIGZvciB0aGUgc3BlY2lmaWVkIGJ1cyBhbmQgZGV2aWNlcyB1bmRlciBpdC4KLSAqLwogdm9pZCBfX2RldmluaXQKIHNuX3BjaV9maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKQEAgLTUxOSw2ICs0NjksMTUgQEAKIAlpZiAoIWlhNjRfcGxhdGZvcm1faXMoInNuMiIpIHx8IElTX1JVTk5JTkdfT05fRkFLRV9QUk9NKCkpCiAJCXJldHVybiAwOwogCisJLyogd2Ugc2V0IHRoZSBhY3BpIHJldmlzaW9uIHRvIHRoYXQgb2YgdGhlIERTRFQgdGFibGUgT0VNIHJldi4gKi8KKwl7CisJCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKKworCQlhY3BpX2dldF90YWJsZV9ieV9pbmRleChBQ1BJX1RBQkxFX0lOREVYX0RTRFQsICZoZWFkZXIpOworCQlCVUdfT04oaGVhZGVyID09IE5VTEwpOworCQlzbl9hY3BpX3JldiA9IGhlYWRlci0+b2VtX3JldmlzaW9uOworCX0KKwogCS8qCiAJICogcHJpbWUgc25fcGNpX3Byb3ZpZGVyW10uICBJbmRpdmlkaWFsIHByb3ZpZGVyIGluaXQgcm91dGluZXMgd2lsbAogCSAqIG92ZXJyaWRlIHRoZWlyIHJlc3BlY3RpdmUgZGVmYXVsdCBlbnRyaWVzLgpAQCAtNTQ0LDggKzUwMywxMiBAQAogCXJlZ2lzdGVyX3NuX3Byb2NmcygpOwogI2VuZGlmCiAKLQlwcmludGsoS0VSTl9JTkZPICJBQ1BJICBEU0RUIE9FTSBSZXYgMHgleFxuIiwKLQkgICAgICAgYWNwaV9nYmxfRFNEVC0+b2VtX3JldmlzaW9uKTsKKwl7CisJCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyOworCQkodm9pZClhY3BpX2dldF90YWJsZV9ieV9pbmRleChBQ1BJX1RBQkxFX0lOREVYX0RTRFQsICZoZWFkZXIpOworCQlwcmludGsoS0VSTl9JTkZPICJBQ1BJICBEU0RUIE9FTSBSZXYgMHgleFxuIiwKKwkJCWhlYWRlci0+b2VtX3JldmlzaW9uKTsKKwl9CiAJaWYgKFNOX0FDUElfQkFTRV9TVVBQT1JUKCkpCiAJCXNuX2lvX2FjcGlfaW5pdCgpOwogCWVsc2UKQEAgLTYwNSw3ICs1NjgsNiBAQAogCiBmc19pbml0Y2FsbChzbl9pb19sYXRlX2luaXQpOwogCi1FWFBPUlRfU1lNQk9MKHNuX3BjaV9maXh1cF9zbG90KTsKIEVYUE9SVF9TWU1CT0woc25fcGNpX3VuZml4dXBfc2xvdCk7CiBFWFBPUlRfU1lNQk9MKHNuX2J1c19zdG9yZV9zeXNkYXRhKTsKIEVYUE9SVF9TWU1CT0woc25fYnVzX2ZyZWVfc3lzZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCmluZGV4IDlhZDg0M2UuLjYwMGJlM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jCkBAIC01Niw2ICs1NiwyNSBAQAogCXJldHVybiByZXRfc3R1ZmYudjA7CiB9CiAKKy8qCisgKiBSZXRyaWV2ZSB0aGUgcGNpIGRldmljZSBpbmZvcm1hdGlvbiBnaXZlbiB0aGUgYnVzIGFuZCBkZXZpY2V8ZnVuY3Rpb24gbnVtYmVyLgorICovCitzdGF0aWMgaW5saW5lIHU2NAorc2FsX2dldF9wY2lkZXZfaW5mbyh1NjQgc2VnbWVudCwgdTY0IGJ1c19udW1iZXIsIHU2NCBkZXZmbiwgdTY0IHBjaV9kZXYsCisJCSAgICB1NjQgc25faXJxX2luZm8pCit7CisJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7CisJcmV0X3N0dWZmLnN0YXR1cyA9IDA7CisJcmV0X3N0dWZmLnYwID0gMDsKKworCVNBTF9DQUxMX05PTE9DSyhyZXRfc3R1ZmYsCisJCQkodTY0KSBTTl9TQUxfSU9JRl9HRVRfUENJREVWX0lORk8sCisJCQkodTY0KSBzZWdtZW50LCAodTY0KSBidXNfbnVtYmVyLCAodTY0KSBkZXZmbiwKKwkJCSh1NjQpIHBjaV9kZXYsCisJCQlzbl9pcnFfaW5mbywgMCwgMCk7CisJcmV0dXJuIHJldF9zdHVmZi52MDsKK30KKwogCiAvKgogICogc25fZml4dXBfaW9ub2RlcygpIC0gVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBIVUIgZGF0YSBzdHJ1Y3R1cmUgZm9yCkBAIC0xNzIsMTggKzE5MSw0MCBAQAogfQogCiAvKgotICogc25fbW9yZV9zbG90X2ZpeHVwKCkgLSBXZSBhcmUgbm90IHJ1bm5pbmcgd2l0aCBhbiBBQ1BJIGNhcGFibGUgUFJPTSwKKyAqIHNuX2lvX3Nsb3RfZml4dXAoKSAtICAgV2UgYXJlIG5vdCBydW5uaW5nIHdpdGggYW4gQUNQSSBjYXBhYmxlIFBST00sCiAgKgkJCSAgYW5kIG5lZWQgdG8gY29udmVydCB0aGUgcGNpX2Rldi0+cmVzb3VyY2UKICAqCQkJICAnc3RhcnQnIGFuZCAnZW5kJyBhZGRyZXNzZXMgdG8gbWFwcGVkIGFkZHJlc3NlcywKICAqCQkJICBhbmQgc2V0dXAgdGhlIHBjaV9jb250cm9sbGVyLT53aW5kb3cgYXJyYXkgZW50cmllcy4KICAqLwogdm9pZAotc25fbW9yZV9zbG90X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lkZXZfaW5mbyAqcGNpZGV2X2luZm8pCitzbl9pb19zbG90X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAlpbnQgaWR4OwogCXM2NCBwY2lfYWRkcnNbUENJX1JPTV9SRVNPVVJDRSArIDFdOwogCXVuc2lnbmVkIGxvbmcgYWRkciwgZW5kLCBzaXplLCBzdGFydDsKKwlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvOworCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87CisJaW50IHN0YXR1czsKKworCXBjaWRldl9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBjaWRldl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2lkZXZfaW5mbykKKwkJcGFuaWMoIiVzOiBVbmFibGUgdG8gYWxsb2MgbWVtb3J5IGZvciBwY2lkZXZfaW5mbyIsIF9fRlVOQ1RJT05fXyk7CisKKwlzbl9pcnFfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbl9pcnFfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc25faXJxX2luZm8pCisJCXBhbmljKCIlczogVW5hYmxlIHRvIGFsbG9jIG1lbW9yeSBmb3Igc25faXJxX2luZm8iLCBfX0ZVTkNUSU9OX18pOworCisJLyogQ2FsbCB0byByZXRyaWV2ZSBwY2kgZGV2aWNlIGluZm9ybWF0aW9uIG5lZWRlZCBieSBrZXJuZWwuICovCisJc3RhdHVzID0gc2FsX2dldF9wY2lkZXZfaW5mbygodTY0KSBwY2lfZG9tYWluX25yKGRldiksCisJCSh1NjQpIGRldi0+YnVzLT5udW1iZXIsCisJCWRldi0+ZGV2Zm4sCisJCSh1NjQpIF9fcGEocGNpZGV2X2luZm8pLAorCQkodTY0KSBfX3BhKHNuX2lycV9pbmZvKSk7CisKKwlpZiAoc3RhdHVzKQorCQlCVUcoKTsgLyogQ2Fubm90IGdldCBwbGF0Zm9ybSBwY2kgZGV2aWNlIGluZm9ybWF0aW9uICovCisKIAogCS8qIENvcHkgb3ZlciBQSU8gTWFwcGVkIEFkZHJlc3NlcyAqLwogCWZvciAoaWR4ID0gMDsgaWR4IDw9IFBDSV9ST01fUkVTT1VSQ0U7IGlkeCsrKSB7CkBAIC0yMTksOCArMjYwLDEyIEBACiAJICovCiAJaWYgKGNvdW50ID4gMCkKIAkJc25fcGNpX3dpbmRvd19maXh1cChkZXYsIGNvdW50LCBwY2lfYWRkcnMpOworCisJc25fcGNpX2ZpeHVwX3Nsb3QoZGV2LCBwY2lkZXZfaW5mbywgc25faXJxX2luZm8pOwogfQogCitFWFBPUlRfU1lNQk9MKHNuX2lvX3Nsb3RfZml4dXApOworCiAvKgogICogc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoKSAtIFRoaXMgcm91dGluZSBzZXRzIHVwIGEgYnVzJ3MgcmVzb3VyY2VzCiAgKgkJCSAgICAgICBjb25zaXN0ZW50IHdpdGggdGhlIExpbnV4IFBDSSBhYnN0cmFjdGlvbiBsYXllci4KQEAgLTI3Miw5ICszMTcsNiBAQAogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKnByb21fYnVzc29mdF9wdHI7Ci0JZXh0ZXJuIHZvaWQgc25fY29tbW9uX2J1c19maXh1cChzdHJ1Y3QgcGNpX2J1cyAqLAotCQkJCQlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKik7Ci0KIAogCWlmICghYnVzLT5wYXJlbnQpIHsgIC8qIElmIHJvb3QgYnVzICovCiAJCXByb21fYnVzc29mdF9wdHIgPSBQQ0lfQ09OVFJPTExFUihidXMpLT5wbGF0Zm9ybV9kYXRhOwpAQCAtMjkxLDcgKzMzMyw3IEBACiAJCQkJCSAgIHByb21fYnVzc29mdF9wdHItPmJzX2xlZ2FjeV9tZW0pOwogICAgICAgICB9CiAgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkocGNpX2RldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKLSAgICAgICAgICAgICAgICBzbl9wY2lfZml4dXBfc2xvdChwY2lfZGV2KTsKKyAgICAgICAgICAgICAgICBzbl9pb19zbG90X2ZpeHVwKHBjaV9kZXYpOwogICAgICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9tdi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb212LmMKaW5kZXggNGFhNGYzMC4uYWI3ZTJmZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb212LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb212LmMKQEAgLTEsNCArMSw0IEBACi0vKiAKKy8qCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KQEAgLTI2LDkgKzI2LDEwIEBACiAgKiBAcG9ydDogcG9ydCB0byBjb252ZXJ0CiAgKgogICogTGVnYWN5IGluL291dCBpbnN0cnVjdGlvbnMgYXJlIGNvbnZlcnRlZCB0byBsZC9zdCBpbnN0cnVjdGlvbnMKLSAqIG9uIElBNjQuICBUaGlzIHJvdXRpbmUgd2lsbCBjb252ZXJ0IGEgcG9ydCBudW1iZXIgaW50byBhIHZhbGlkIAorICogb24gSUE2NC4gIFRoaXMgcm91dGluZSB3aWxsIGNvbnZlcnQgYSBwb3J0IG51bWJlciBpbnRvIGEgdmFsaWQKICAqIFNOIGkvbyBhZGRyZXNzLiAgVXNlZCBieSBzbl9pbiooKSBhbmQgc25fb3V0KigpLgogICovCisKIHZvaWQgKnNuX2lvX2FkZHIodW5zaWduZWQgbG9uZyBwb3J0KQogewogCWlmICghSVNfUlVOTklOR19PTl9TSU1VTEFUT1IoKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCmluZGV4IDY4NDZkYzkuLjA0YTgyNTYwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCkBAIC0yMCw3ICsyMCw4IEBACiAjaW5jbHVkZSAieHRhbGsvaHViZGV2LmgiCiAKIGludAotc2FsX3BjaWJyX3Nsb3RfZW5hYmxlKHN0cnVjdCBwY2lidXNfaW5mbyAqc29mdCwgaW50IGRldmljZSwgdm9pZCAqcmVzcCkKK3NhbF9wY2licl9zbG90X2VuYWJsZShzdHJ1Y3QgcGNpYnVzX2luZm8gKnNvZnQsIGludCBkZXZpY2UsIHZvaWQgKnJlc3AsCisgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnNzZHQpCiB7CiAJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7CiAJdTY0IGJ1c251bTsKQEAgLTMyLDcgKzMzLDggQEAKIAlzZWdtZW50ID0gc29mdC0+cGJpX2J1c2NvbW1vbi5ic19wZXJzaXN0X3NlZ21lbnQ7CiAJYnVzbnVtID0gc29mdC0+cGJpX2J1c2NvbW1vbi5ic19wZXJzaXN0X2J1c251bTsKIAlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLCAodTY0KSBTTl9TQUxfSU9JRl9TTE9UX0VOQUJMRSwgc2VnbWVudCwKLQkJCWJ1c251bSwgKHU2NCkgZGV2aWNlLCAodTY0KSByZXNwLCAwLCAwLCAwKTsKKwkJCWJ1c251bSwgKHU2NCkgZGV2aWNlLCAodTY0KSByZXNwLCAodTY0KWlhNjRfdHBhKHNzZHQpLAorCQkJMCwgMCk7CiAKIAlyZXR1cm4gKGludClyZXRfc3R1ZmYudjA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHktcXVpcmtzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHktcXVpcmtzLmMKaW5kZXggNDk4MDJmMS4uYmQzMGQxMyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5LXF1aXJrcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseS1xdWlya3MuYwpAQCAtMzIsNyArMzIsNyBAQAogCiBzdGF0aWMgaW50IG52aWRpYV9ocGV0X2RldGVjdGVkIF9faW5pdGRhdGE7CiAKLXN0YXRpYyBpbnQgX19pbml0IG52aWRpYV9ocGV0X2NoZWNrKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGludCBfX2luaXQgbnZpZGlhX2hwZXRfY2hlY2soc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIpCiB7CiAJbnZpZGlhX2hwZXRfZGV0ZWN0ZWQgPSAxOwogCXJldHVybiAwOwpAQCAtNTMsNyArNTMsNyBAQAogCQlyZXR1cm47CiAKIAludmlkaWFfaHBldF9kZXRlY3RlZCA9IDA7Ci0JYWNwaV90YWJsZV9wYXJzZShBQ1BJX0hQRVQsIG52aWRpYV9ocGV0X2NoZWNrKTsKKwlhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX0hQRVQsIG52aWRpYV9ocGV0X2NoZWNrKTsKIAlpZiAobnZpZGlhX2hwZXRfZGV0ZWN0ZWQgPT0gMCkgewogCQlhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgPSAxOwogCQlwcmludGsoS0VSTl9JTkZPICJOdmlkaWEgYm9hcmQgIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljLmMKaW5kZXggYjAwNzQzMy4uMGIzNjAzYSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpYy5jCkBAIC01OCw4ICs1OCw4IEBACiAJICogU29tZSB4ODZfNjQgbWFjaGluZXMgdXNlIHBoeXNpY2FsIEFQSUMgbW9kZSByZWdhcmRsZXNzIG9mIGhvdyBtYW55CiAJICogcHJvY3MvY2x1c3RlcnMgYXJlIHByZXNlbnQgKHg4Nl82NCBFUzcwMDAgaXMgYW4gZXhhbXBsZSkuCiAJICovCi0JaWYgKGFjcGlfZmFkdC5yZXZpc2lvbiA+IEZBRFQyX1JFVklTSU9OX0lEKQotCQlpZiAoYWNwaV9mYWR0LmZvcmNlX2FwaWNfcGh5c2ljYWxfZGVzdGluYXRpb25fbW9kZSkgeworCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5yZXZpc2lvbiA+IEZBRFQyX1JFVklTSU9OX0lEKQorCQlpZiAoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9BUElDX1BIWVNJQ0FMKSB7CiAJCQlnZW5hcGljID0gJmFwaWNfY2x1c3RlcjsKIAkJCWdvdG8gcHJpbnQ7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbXBwYXJzZS5jCmluZGV4IDA4MDcyNTY4Li41MGRkOGJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbXBwYXJzZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tcHBhcnNlLmMKQEAgLTc5OCw3ICs3OTgsNyBAQAogCQlyZXR1cm4gZ3NpOwogCiAJLyogRG9uJ3Qgc2V0IHVwIHRoZSBBQ1BJIFNDSSBiZWNhdXNlIGl0J3MgYWxyZWFkeSBzZXQgdXAgKi8KLQlpZiAoYWNwaV9mYWR0LnNjaV9pbnQgPT0gZ3NpKQorCWlmIChhY3BpX2dibF9GQURULnNjaV9pbnRlcnJ1cHQgPT0gZ3NpKQogCQlyZXR1cm4gZ3NpOwogCiAJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCmluZGV4IDVjYzc2ZDAuLjMzNWNjOTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiB7CiAJdW5zaWduZWQgaW50IHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGV4dHllYXIgPSAwOworCXVuc2lnbmVkIGNlbnR1cnkgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CiAKQEAgLTUxMCw5ICs1MTAsOSBAQAogCQltb24gPSBDTU9TX1JFQUQoUlRDX01PTlRIKTsKIAkJeWVhciA9IENNT1NfUkVBRChSVENfWUVBUik7CiAjaWZkZWYgQ09ORklHX0FDUEkKLQkJaWYgKGFjcGlfZmFkdC5yZXZpc2lvbiA+PSBGQURUMl9SRVZJU0lPTl9JRCAmJgotCQkJCQlhY3BpX2ZhZHQuY2VudHVyeSkKLQkJCWV4dHllYXIgPSBDTU9TX1JFQUQoYWNwaV9mYWR0LmNlbnR1cnkpOworCQlpZiAoYWNwaV9nYmxfRkFEVC5oZWFkZXIucmV2aXNpb24gPj0gRkFEVDJfUkVWSVNJT05fSUQgJiYKKwkJCQkJYWNwaV9nYmxfRkFEVC5jZW50dXJ5KQorCQkJY2VudHVyeSA9IENNT1NfUkVBRChhY3BpX2dibF9GQURULmNlbnR1cnkpOwogI2VuZGlmCiAJfSB3aGlsZSAoc2VjICE9IENNT1NfUkVBRChSVENfU0VDT05EUykpOwogCkBAIC01MzAsMTAgKzUzMCwxMCBAQAogCUJDRF9UT19CSU4obW9uKTsKIAlCQ0RfVE9fQklOKHllYXIpOwogCi0JaWYgKGV4dHllYXIpIHsKLQkJQkNEX1RPX0JJTihleHR5ZWFyKTsKLQkJeWVhciArPSBleHR5ZWFyOwotCQlwcmludGsoS0VSTl9JTkZPICJFeHRlbmRlZCBDTU9TIHllYXI6ICVkXG4iLCBleHR5ZWFyKTsKKwlpZiAoY2VudHVyeSkgeworCQlCQ0RfVE9fQklOKGNlbnR1cnkpOworCQl5ZWFyICs9IGNlbnR1cnkgKiAxMDA7CisJCXByaW50ayhLRVJOX0lORk8gIkV4dGVuZGVkIENNT1MgeWVhcjogJWRcbiIsIGNlbnR1cnkgKiAxMDApOwogCX0gZWxzZSB7IAogCQkvKgogCQkgKiB4ODYtNjQgc3lzdGVtcyBvbmx5IGV4aXN0cyBzaW5jZSAyMDAyLgpAQCAtOTU0LDcgKzk1NCw3IEBACiAgCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgewogI2lmZGVmIENPTkZJR19BQ1BJCiAJCS8qIEJ1dCBUU0MgZG9lc24ndCB0aWNrIGluIEMzIHNvIGRvbid0IHVzZSBpdCB0aGVyZSAqLwotCQlpZiAoYWNwaV9mYWR0Lmxlbmd0aCA+IDAgJiYgYWNwaV9mYWR0LnBsdmwzX2xhdCA8IDEwMDApCisJCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5sZW5ndGggPiAwICYmIGFjcGlfZ2JsX0ZBRFQuQzNsYXRlbmN5IDwgMTAwMCkKIAkJCXJldHVybiAxOwogI2VuZGlmCiAgCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL3NyYXQuYyBiL2FyY2gveDg2XzY0L21tL3NyYXQuYwppbmRleCAxMDg3ZTE1Li4yZWZlMjE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9tbS9zcmF0LmMKKysrIGIvYXJjaC94ODZfNjQvbW0vc3JhdC5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIHN0YXRpYyBfX2luaXQgaW50IHNsaXRfdmFsaWQoc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqc2xpdCkKIHsKIAlpbnQgaSwgajsKLQlpbnQgZCA9IHNsaXQtPmxvY2FsaXRpZXM7CisJaW50IGQgPSBzbGl0LT5sb2NhbGl0eV9jb3VudDsKIAlmb3IgKGkgPSAwOyBpIDwgZDsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCBkOyBqKyspICB7CiAJCQl1OCB2YWwgPSBzbGl0LT5lbnRyeVtkKmkgKyBqXTsKQEAgLTEyNywxOCArMTI3LDE4IEBACiAKIC8qIENhbGxiYWNrIGZvciBQcm94aW1pdHkgRG9tYWluIC0+IExBUElDIG1hcHBpbmcgKi8KIHZvaWQgX19pbml0Ci1hY3BpX251bWFfcHJvY2Vzc29yX2FmZmluaXR5X2luaXQoc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICpwYSkKK2FjcGlfbnVtYV9wcm9jZXNzb3JfYWZmaW5pdHlfaW5pdChzdHJ1Y3QgYWNwaV9zcmF0X2NwdV9hZmZpbml0eSAqcGEpCiB7CiAJaW50IHB4bSwgbm9kZTsKIAlpZiAoc3JhdF9kaXNhYmxlZCgpKQogCQlyZXR1cm47Ci0JaWYgKHBhLT5oZWFkZXIubGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9wcm9jZXNzb3JfYWZmaW5pdHkpKSB7CisJaWYgKHBhLT5oZWFkZXIubGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgYWNwaV9zcmF0X2NwdV9hZmZpbml0eSkpIHsKIAkJYmFkX3NyYXQoKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAocGEtPmZsYWdzLmVuYWJsZWQgPT0gMCkKKwlpZiAoKHBhLT5mbGFncyAmIEFDUElfU1JBVF9DUFVfRU5BQkxFRCkgPT0gMCkKIAkJcmV0dXJuOwotCXB4bSA9IHBhLT5wcm94aW1pdHlfZG9tYWluOworCXB4bSA9IHBhLT5wcm94aW1pdHlfZG9tYWluX2xvOwogCW5vZGUgPSBzZXR1cF9ub2RlKHB4bSk7CiAJaWYgKG5vZGUgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU1JBVDogVG9vIG1hbnkgcHJveGltaXR5IGRvbWFpbnMgJXhcbiIsIHB4bSk7CkBAIC0yNTQsMjEgKzI1NCwyMSBAQAogCS8qIExvb2tzIGdvb2QgKi8KIAogCWlmIChuZC0+c3RhcnQgPT0gbmQtPmVuZCkgewotIAkJbmQtPnN0YXJ0ID0gc3RhcnQ7Ci0gCQluZC0+ZW5kID0gZW5kOworCQluZC0+c3RhcnQgPSBzdGFydDsKKwkJbmQtPmVuZCA9IGVuZDsKIAkJY2hhbmdlZCA9IDE7Ci0gCX0gZWxzZSB7Ci0gCQlpZiAobmQtPnN0YXJ0ID09IGVuZCkgewotIAkJCW5kLT5zdGFydCA9IHN0YXJ0OworCX0gZWxzZSB7CisJCWlmIChuZC0+c3RhcnQgPT0gZW5kKSB7CisJCQluZC0+c3RhcnQgPSBzdGFydDsKIAkJCWNoYW5nZWQgPSAxOwogCQl9Ci0gCQlpZiAobmQtPmVuZCA9PSBzdGFydCkgewotIAkJCW5kLT5lbmQgPSBlbmQ7CisJCWlmIChuZC0+ZW5kID09IHN0YXJ0KSB7CisJCQluZC0+ZW5kID0gZW5kOwogCQkJY2hhbmdlZCA9IDE7CiAJCX0KIAkJaWYgKCFjaGFuZ2VkKQogCQkJcHJpbnRrKEtFUk5fRVJSICJTUkFUOiBIb3RwbHVnIHpvbmUgbm90IGNvbnRpbnVvdXMuIFBhcnRseSBpZ25vcmVkXG4iKTsKLSAJfQorCX0KIAogCXJldCA9IHVwZGF0ZV9lbmRfb2ZfbWVtb3J5KG5kLT5lbmQpOwogCkBAIC0yNzksNyArMjc5LDcgQEAKIAogLyogQ2FsbGJhY2sgZm9yIHBhcnNpbmcgb2YgdGhlIFByb3hpbWl0eSBEb21haW4gPC0+IE1lbW9yeSBBcmVhIG1hcHBpbmdzICovCiB2b2lkIF9faW5pdAotYWNwaV9udW1hX21lbW9yeV9hZmZpbml0eV9pbml0KHN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSAqbWEpCithY3BpX251bWFfbWVtb3J5X2FmZmluaXR5X2luaXQoc3RydWN0IGFjcGlfc3JhdF9tZW1fYWZmaW5pdHkgKm1hKQogewogCXN0cnVjdCBib290bm9kZSAqbmQsIG9sZG5vZGU7CiAJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOwpAQCAtMjg4LDE2ICsyODgsMTcgQEAKIAogCWlmIChzcmF0X2Rpc2FibGVkKCkpCiAJCXJldHVybjsKLQlpZiAobWEtPmhlYWRlci5sZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSkpIHsKKwlpZiAobWEtPmhlYWRlci5sZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBhY3BpX3NyYXRfbWVtX2FmZmluaXR5KSkgewogCQliYWRfc3JhdCgpOwogCQlyZXR1cm47CiAJfQotCWlmIChtYS0+ZmxhZ3MuZW5hYmxlZCA9PSAwKQorCWlmICgobWEtPmZsYWdzICYgQUNQSV9TUkFUX01FTV9FTkFCTEVEKSA9PSAwKQogCQlyZXR1cm47Ci0gCWlmIChtYS0+ZmxhZ3MuaG90X3BsdWdnYWJsZSAmJiAhc2F2ZV9hZGRfaW5mbygpKQorCisJaWYgKChtYS0+ZmxhZ3MgJiBBQ1BJX1NSQVRfTUVNX0hPVF9QTFVHR0FCTEUpICYmICFzYXZlX2FkZF9pbmZvKCkpCiAJCXJldHVybjsKLQlzdGFydCA9IG1hLT5iYXNlX2FkZHJfbG8gfCAoKHU2NCltYS0+YmFzZV9hZGRyX2hpIDw8IDMyKTsKLQllbmQgPSBzdGFydCArIChtYS0+bGVuZ3RoX2xvIHwgKCh1NjQpbWEtPmxlbmd0aF9oaSA8PCAzMikpOworCXN0YXJ0ID0gbWEtPmJhc2VfYWRkcmVzczsKKwllbmQgPSBzdGFydCArIG1hLT5sZW5ndGg7CiAJcHhtID0gbWEtPnByb3hpbWl0eV9kb21haW47CiAJbm9kZSA9IHNldHVwX25vZGUocHhtKTsKIAlpZiAobm9kZSA8IDApIHsKQEAgLTMzNyw3ICszMzgsOCBAQAogCXB1c2hfbm9kZV9ib3VuZGFyaWVzKG5vZGUsIG5kLT5zdGFydCA+PiBQQUdFX1NISUZULAogCQkJCQkJbmQtPmVuZCA+PiBQQUdFX1NISUZUKTsKIAotIAlpZiAobWEtPmZsYWdzLmhvdF9wbHVnZ2FibGUgJiYgKHJlc2VydmVfaG90YWRkKG5vZGUsIHN0YXJ0LCBlbmQpIDwgMCkpIHsKKwlpZiAoKG1hLT5mbGFncyAmIEFDUElfU1JBVF9NRU1fSE9UX1BMVUdHQUJMRSkgJiYKKwkgICAgKHJlc2VydmVfaG90YWRkKG5vZGUsIHN0YXJ0LCBlbmQpIDwgMCkpIHsKIAkJLyogSWdub3JlIGhvdGFkZCByZWdpb24uIFVuZG8gZGFtYWdlICovCiAJCXByaW50ayhLRVJOX05PVElDRSAiU1JBVDogSG90cGx1ZyByZWdpb24gaWdub3JlZFxuIik7CiAJCSpuZCA9IG9sZG5vZGU7CkBAIC0zOTQsNyArMzk2LDcgQEAKIAogCS8qIEZpcnN0IGNsZWFuIHVwIHRoZSBub2RlIGxpc3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKLSAJCWN1dG9mZl9ub2RlKGksIHN0YXJ0LCBlbmQpOworCQljdXRvZmZfbm9kZShpLCBzdGFydCwgZW5kKTsKIAkJaWYgKChub2Rlc1tpXS5lbmQgLSBub2Rlc1tpXS5zdGFydCkgPCBOT0RFX01JTl9TSVpFKSB7CiAJCQl1bnBhcnNlX25vZGUoaSk7CiAJCQlub2RlX3NldF9vZmZsaW5lKGkpOwpAQCAtNDI2LDcgKzQyOCw3IEBACiAJCWlmICghbm9kZV9vbmxpbmUoaSkpCiAJCQlzZXR1cF9ub2RlX2Jvb3RtZW0oaSwgbm9kZXNbaV0uc3RhcnQsIG5vZGVzW2ldLmVuZCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7IAorCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKIAkJaWYgKGNwdV90b19ub2RlW2ldID09IE5VTUFfTk9fTk9ERSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIW5vZGVfaXNzZXQoY3B1X3RvX25vZGVbaV0sIG5vZGVzX3BhcnNlZCkpCkBAIC00NjEsNyArNDYzLDcgQEAKIAogCWlmICghYWNwaV9zbGl0KQogCQlyZXR1cm4gYSA9PSBiID8gMTAgOiAyMDsKLQlpbmRleCA9IGFjcGlfc2xpdC0+bG9jYWxpdGllcyAqIG5vZGVfdG9fcHhtKGEpOworCWluZGV4ID0gYWNwaV9zbGl0LT5sb2NhbGl0eV9jb3VudCAqIG5vZGVfdG9fcHhtKGEpOwogCXJldHVybiBhY3BpX3NsaXQtPmVudHJ5W2luZGV4ICsgbm9kZV90b19weG0oYildOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYyBiL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCmluZGV4IGY4YjZiMjguLmZhYWJiNmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCisrKyBiL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIG1tY29uZmlnLmMgLSBMb3ctbGV2ZWwgZGlyZWN0IFBDSSBjb25maWcgc3BhY2UgYWNjZXNzIHZpYSBNTUNPTkZJRwotICogCisgKgogICogVGhpcyBpcyBhbiA2NGJpdCBvcHRpbWl6ZWQgdmVyc2lvbiB0aGF0IGFsd2F5cyBrZWVwcyB0aGUgZnVsbCBtbWNvbmZpZwogICogc3BhY2UgbWFwcGVkLiBUaGlzIGFsbG93cyBsb2NrbGVzcyBjb25maWcgc3BhY2Ugb3BlcmF0aW9uLgogICovCkBAIC0yNSw3ICsyNSw3IEBACiAKIC8qIFN0YXRpYyB2aXJ0dWFsIG1hcHBpbmcgb2YgdGhlIE1NQ09ORklHIGFwZXJ0dXJlICovCiBzdHJ1Y3QgbW1jZmdfdmlydCB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfbWNmZ19jb25maWcgKmNmZzsKKwlzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24gKmNmZzsKIAljaGFyIF9faW9tZW0gKnZpcnQ7CiB9Owogc3RhdGljIHN0cnVjdCBtbWNmZ192aXJ0ICpwY2lfbW1jZmdfdmlydDsKQEAgLTMzLDE0ICszMywxNCBAQAogc3RhdGljIGNoYXIgX19pb21lbSAqZ2V0X3ZpcnQodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgYnVzKQogewogCWludCBjZmdfbnVtID0gLTE7Ci0Jc3RydWN0IGFjcGlfdGFibGVfbWNmZ19jb25maWcgKmNmZzsKKwlzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24gKmNmZzsKIAogCXdoaWxlICgxKSB7CiAJCSsrY2ZnX251bTsKIAkJaWYgKGNmZ19udW0gPj0gcGNpX21tY2ZnX2NvbmZpZ19udW0pCiAJCQlicmVhazsKIAkJY2ZnID0gcGNpX21tY2ZnX3ZpcnRbY2ZnX251bV0uY2ZnOwotCQlpZiAoY2ZnLT5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIgIT0gc2VnKQorCQlpZiAoY2ZnLT5wY2lfc2VnbWVudCAhPSBzZWcpCiAJCQljb250aW51ZTsKIAkJaWYgKChjZmctPnN0YXJ0X2J1c19udW1iZXIgPD0gYnVzKSAmJgogCQkgICAgKGNmZy0+ZW5kX2J1c19udW1iZXIgPj0gYnVzKSkKQEAgLTUyLDcgKzUyLDcgQEAKICAJICAgdGhpcyBhcHBsaWVzIHRvIGFsbCBidXNzZXMuICovCiAJY2ZnID0gJnBjaV9tbWNmZ19jb25maWdbMF07CiAJaWYgKHBjaV9tbWNmZ19jb25maWdfbnVtID09IDEgJiYKLQkJY2ZnLT5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIgPT0gMCAmJgorCQljZmctPnBjaV9zZWdtZW50ID09IDAgJiYKIAkJKGNmZy0+c3RhcnRfYnVzX251bWJlciB8IGNmZy0+ZW5kX2J1c19udW1iZXIpID09IDApCiAJCXJldHVybiBwY2lfbW1jZmdfdmlydFswXS52aXJ0OwogCkBAIC0xNzAsMTkgKzE3MCwxOSBAQAogCWlmICgocGNpX3Byb2JlICYgUENJX1BST0JFX01NQ09ORikgPT0gMCkKIAkJcmV0dXJuOwogCi0JYWNwaV90YWJsZV9wYXJzZShBQ1BJX01DRkcsIGFjcGlfcGFyc2VfbWNmZyk7CisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19NQ0ZHLCBhY3BpX3BhcnNlX21jZmcpOwogCWlmICgocGNpX21tY2ZnX2NvbmZpZ19udW0gPT0gMCkgfHwKIAkgICAgKHBjaV9tbWNmZ19jb25maWcgPT0gTlVMTCkgfHwKLQkgICAgKHBjaV9tbWNmZ19jb25maWdbMF0uYmFzZV9hZGRyZXNzID09IDApKQorCSAgICAocGNpX21tY2ZnX2NvbmZpZ1swXS5hZGRyZXNzID09IDApKQogCQlyZXR1cm47CiAKIAkvKiBPbmx5IGRvIHRoaXMgY2hlY2sgd2hlbiB0eXBlIDEgd29ya3MuIElmIGl0IGRvZXNuJ3Qgd29yawogICAgICAgICAgICBhc3N1bWUgd2UgcnVuIG9uIGEgTWFjIGFuZCBhbHdheXMgdXNlIE1DRkcgKi8KLQlpZiAodHlwZSA9PSAxICYmICFlODIwX2FsbF9tYXBwZWQocGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MsCi0JCQlwY2lfbW1jZmdfY29uZmlnWzBdLmJhc2VfYWRkcmVzcyArIE1NQ09ORklHX0FQRVJfTUlOLAorCWlmICh0eXBlID09IDEgJiYgIWU4MjBfYWxsX21hcHBlZChwY2lfbW1jZmdfY29uZmlnWzBdLmFkZHJlc3MsCisJCQlwY2lfbW1jZmdfY29uZmlnWzBdLmFkZHJlc3MgKyBNTUNPTkZJR19BUEVSX01JTiwKIAkJCUU4MjBfUkVTRVJWRUQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENJOiBCSU9TIEJ1ZzogTUNGRyBhcmVhIGF0ICV4IGlzIG5vdCBFODIwLXJlc2VydmVkXG4iLAotCQkJCXBjaV9tbWNmZ19jb25maWdbMF0uYmFzZV9hZGRyZXNzKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEJJT1MgQnVnOiBNQ0ZHIGFyZWEgYXQgJWx4IGlzIG5vdCBFODIwLXJlc2VydmVkXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKXBjaV9tbWNmZ19jb25maWdbMF0uYWRkcmVzcyk7CiAJCXByaW50ayhLRVJOX0VSUiAiUENJOiBOb3QgdXNpbmcgTU1DT05GSUcuXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE5NCwxNSArMTk0LDE2IEBACiAJfQogCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgKytpKSB7CiAJCXBjaV9tbWNmZ192aXJ0W2ldLmNmZyA9ICZwY2lfbW1jZmdfY29uZmlnW2ldOwotCQlwY2lfbW1jZmdfdmlydFtpXS52aXJ0ID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9tbWNmZ19jb25maWdbaV0uYmFzZV9hZGRyZXNzLAorCQlwY2lfbW1jZmdfdmlydFtpXS52aXJ0ID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9tbWNmZ19jb25maWdbaV0uYWRkcmVzcywKIAkJCQkJCQkgTU1DT05GSUdfQVBFUl9NQVgpOwogCQlpZiAoIXBjaV9tbWNmZ192aXJ0W2ldLnZpcnQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBDYW5ub3QgbWFwIG1tY29uZmlnIGFwZXJ0dXJlIGZvciAiCiAJCQkJCSJzZWdtZW50ICVkXG4iLAotCQkJICAgICAgIHBjaV9tbWNmZ19jb25maWdbaV0ucGNpX3NlZ21lbnRfZ3JvdXBfbnVtYmVyKTsKKwkJCQlwY2lfbW1jZmdfY29uZmlnW2ldLnBjaV9zZWdtZW50KTsKIAkJCXJldHVybjsKIAkJfQotCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFVzaW5nIE1NQ09ORklHIGF0ICV4XG4iLCBwY2lfbW1jZmdfY29uZmlnW2ldLmJhc2VfYWRkcmVzcyk7CisJCXByaW50ayhLRVJOX0lORk8gIlBDSTogVXNpbmcgTU1DT05GSUcgYXQgJWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpcGNpX21tY2ZnX2NvbmZpZ1tpXS5hZGRyZXNzKTsKIAl9CiAKIAl1bnJlYWNoYWJsZV9kZXZpY2VzKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvS2NvbmZpZyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCmluZGV4IGY0ZjAwMGEuLjIwZWFjYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYWNwaS9LY29uZmlnCkBAIC0zLDYgKzMsNyBAQAogIwogCiBtZW51ICJBQ1BJIChBZHZhbmNlZCBDb25maWd1cmF0aW9uIGFuZCBQb3dlciBJbnRlcmZhY2UpIFN1cHBvcnQiCisJZGVwZW5kcyBvbiAhWDg2X05VTUFRCiAJZGVwZW5kcyBvbiAhWDg2X1ZJU1dTCiAJZGVwZW5kcyBvbiAhSUE2NF9IUF9TSU0KIAlkZXBlbmRzIG9uIElBNjQgfHwgWDg2CkBAIC03Nyw2ICs3OCwyMCBAQAogCSAgQ3JlYXRlIC9wcm9jL2FjcGkvc2xlZXAKIAkgIERlcHJlY2F0ZWQgYnkgL3N5cy9wb3dlci9zdGF0ZQogCitjb25maWcgQUNQSV9QUk9DRlMKKwlib29sICJQcm9jZnMgaW50ZXJmYWNlIChkZXByZWNhdGVkKSIKKwlkZXBlbmRzIG9uIEFDUEkKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBQcm9jZnMgaW50ZXJmYWNlIGZvciBBQ1BJIGlzIG1hZGUgb3B0aW9uYWwgZm9yIGJhY2stY29tcGF0aWJsZS4KKwkgIEFzIHRoZSBzYW1lIGZ1bmN0aW9ucyBhcmUgZHVwbGljYXRlZCBpbiBzeXNmcyBpbnRlcmZhY2UKKwkgIGFuZCB0aGlzIHByb2MgaW50ZXJmYWNlIHdpbGwgYmUgcmVtb3ZlZCBzb21lIHRpbWUgbGF0ZXIsCisJICBpdCdzIG1hcmtlZCBhcyBkZXByZWNhdGVkLgorCSAgKCAvcHJvYy9hY3BpL2RlYnVnX2xheWVyICYmIGRlYnVnX2xldmVsIGFyZSBkZXByZWNhdGVkIGJ5CisJICAgIC9zeXMvbW9kdWxlL2FjcGkvcGFyYW1ldGVycy9kZWJ1Z19sYXllciAmJiBkZWJ1Z19sZXZlbC4KKwkgICAgL3Byb2MvYWNwaS9pbmZvIGlzIGRlcHJlY2F0ZWQgYnkKKwkgICAgL3N5cy9tb2R1bGUvYWNwaS9wYXJhbWV0ZXJzL2FjcGljYV92ZXJzaW9uICkKKwogY29uZmlnIEFDUElfQUMKIAl0cmlzdGF0ZSAiQUMgQWRhcHRlciIKIAlkZXBlbmRzIG9uIFg4NgpAQCAtMTA3LDcgKzEyMiw3IEBACiAKIGNvbmZpZyBBQ1BJX1ZJREVPCiAJdHJpc3RhdGUgIlZpZGVvIgotCWRlcGVuZHMgb24gWDg2CisJZGVwZW5kcyBvbiBYODYgJiYgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIGltcGxlbWVudCB0aGUgQUNQSSBFeHRlbnNpb25zIEZvciBEaXNwbGF5IEFkYXB0ZXJzCiAJICBmb3IgaW50ZWdyYXRlZCBncmFwaGljcyBkZXZpY2VzIG9uIG1vdGhlcmJvYXJkLCBhcyBzcGVjaWZpZWQgaW4KQEAgLTEzOSw2ICsxNTQsMTMgQEAKIAloZWxwCiAJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIEFDUEkgY29udHJvbGxlZCBkb2NraW5nIHN0YXRpb25zCiAKK2NvbmZpZyBBQ1BJX0JBWQorCXRyaXN0YXRlICJSZW1vdmFibGUgRHJpdmUgQmF5IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBBQ1BJIGNvbnRyb2xsZWQgcmVtb3ZhYmxlIGRyaXZlCisJICBiYXlzIHN1Y2ggYXMgdGhlIElCTSB1bHRyYWJheSBvciB0aGUgRGVsbCBNb2R1bGUgQmF5LgorCiBjb25maWcgQUNQSV9QUk9DRVNTT1IKIAl0cmlzdGF0ZSAiUHJvY2Vzc29yIgogCWRlZmF1bHQgeQpAQCAtMTg2LDE5ICsyMDgsMjIgQEAKIAogCSAgTm90ZTogZGlzcGxheSBzd2l0Y2hpbmcgY29kZSBpcyBjdXJyZW50bHkgY29uc2lkZXJlZCBFWFBFUklNRU5UQUwsCiAJICB0b3lpbmcgd2l0aCB0aGVzZSB2YWx1ZXMgbWF5IGV2ZW4gbG9jayB5b3VyIG1hY2hpbmUuCi0gICAgICAgICAgCisKICAgICAgICAgICBBbGwgc2V0dGluZ3MgYXJlIGNoYW5nZWQgdmlhIC9wcm9jL2FjcGkvYXN1cyBkaXJlY3RvcnkgZW50cmllcy4gT3duZXIKICAgICAgICAgICBhbmQgZ3JvdXAgZm9yIHRoZXNlIGVudHJpZXMgY2FuIGJlIHNldCB3aXRoIGFzdXNfdWlkIGFuZCBhc3VzX2dpZAogICAgICAgICAgIHBhcmFtZXRlcnMuCi0gICAgICAgICAgCisKICAgICAgICAgICBNb3JlIGluZm9ybWF0aW9uIGFuZCBhIHVzZXJzcGFjZSBkYWVtb24gZm9yIGhhbmRsaW5nIHRoZSBleHRyYSBidXR0b25zCiAgICAgICAgICAgYXQgPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYWNwaTRhc3VzLz4uCi0gICAgICAgICAgCisKICAgICAgICAgICBJZiB5b3UgaGF2ZSBhbiBBQ1BJLWNvbXBhdGlibGUgQVNVUyBsYXB0b3AsIHNheSBZIG9yIE0gaGVyZS4gVGhpcwogICAgICAgICAgIGRyaXZlciBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCwgc28gaWYgeW91ciBsYXB0b3AgaXMgdW5zdXBwb3J0ZWQgb3IKICAgICAgICAgICBzb21ldGhpbmcgd29ya3Mgbm90IHF1aXRlIGFzIGV4cGVjdGVkLCBwbGVhc2UgdXNlIHRoZSBtYWlsaW5nIGxpc3QKLSAgICAgICAgICBhdmFpbGFibGUgb24gdGhlIGFib3ZlIHBhZ2UgKGFjcGk0YXN1cy11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCkKLSAgICAgICAgICAKKyAgICAgICAgICBhdmFpbGFibGUgb24gdGhlIGFib3ZlIHBhZ2UgKGFjcGk0YXN1cy11c2VyQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCkuCisKKwkgIE5PVEU6IFRoaXMgZHJpdmVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBzb29uLAorCSAgdXNlIGFzdXMtbGFwdG9wIGluc3RlYWQuCisKIGNvbmZpZyBBQ1BJX0lCTQogCXRyaXN0YXRlICJJQk0gVGhpbmtQYWQgTGFwdG9wIEV4dHJhcyIKIAlkZXBlbmRzIG9uIFg4NgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL01ha2VmaWxlIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCmluZGV4IGJjZTdjYTIuLjg1NmMzMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKQEAgLTM3LDEzICszNywxNSBAQAogCiBvYmoteQkJCQkrPSBzbGVlcC8KIG9iai15CQkJCSs9IGJ1cy5vIGdsdWUubworb2JqLXkJCQkJKz0gc2Nhbi5vCiBvYmotJChDT05GSUdfQUNQSV9BQykgCQkrPSBhYy5vCiBvYmotJChDT05GSUdfQUNQSV9CQVRURVJZKQkrPSBiYXR0ZXJ5Lm8KIG9iai0kKENPTkZJR19BQ1BJX0JVVFRPTikJKz0gYnV0dG9uLm8KIG9iai0kKENPTkZJR19BQ1BJX0VDKQkJKz0gZWMubwogb2JqLSQoQ09ORklHX0FDUElfRkFOKQkJKz0gZmFuLm8KIG9iai0kKENPTkZJR19BQ1BJX0RPQ0spCQkrPSBkb2NrLm8KLW9iai0kKENPTkZJR19BQ1BJX1ZJREVPKQkrPSB2aWRlby5vIAorb2JqLSQoQ09ORklHX0FDUElfQkFZKQkJKz0gYmF5Lm8KK29iai0kKENPTkZJR19BQ1BJX1ZJREVPKQkrPSB2aWRlby5vCiBvYmotJChDT05GSUdfQUNQSV9IT1RLRVkpCSs9IGhvdGtleS5vCiBvYmoteQkJCQkrPSBwY2lfcm9vdC5vIHBjaV9saW5rLm8gcGNpX2lycS5vIHBjaV9iaW5kLm8KIG9iai0kKENPTkZJR19BQ1BJX1BPV0VSKQkrPSBwb3dlci5vCkBAIC01Niw3ICs1OCw2IEBACiBvYmotJChDT05GSUdfQUNQSV9BU1VTKQkJKz0gYXN1c19hY3BpLm8KIG9iai0kKENPTkZJR19BQ1BJX0lCTSkJCSs9IGlibV9hY3BpLm8KIG9iai0kKENPTkZJR19BQ1BJX1RPU0hJQkEpCSs9IHRvc2hpYmFfYWNwaS5vCi1vYmoteQkJCQkrPSBzY2FuLm8gbW90aGVyYm9hcmQubwogb2JqLSQoQ09ORklHX0FDUElfSE9UUExVR19NRU1PUlkpCSs9IGFjcGlfbWVtaG90cGx1Zy5vCiBvYmoteQkJCQkrPSBjbV9zYnMubwogb2JqLSQoQ09ORklHX0FDUElfU0JTKQkJKz0gaTJjX2VjLm8gc2JzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYyBiL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYwppbmRleCAzOTYxNDBiLi4zMWFkNzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCkBAIC0yNiw3ICsyNiw3IEBACiAgKiAgUG9udHVzIEZ1Y2hzICAgLSBIZWxwZXIgZnVuY3Rpb25zLCBjbGVhbnVwCiAgKiAgSm9oYW5uIFdpZXNuZXIgLSBTbWFsbCBjb21waWxlIGZpeGVzCiAgKiAgSm9obiBCZWxtb250ZSAgLSBBQ1BJIGNvZGUgZm9yIFRvc2hpYmEgbGFwdG9wIHdhcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuCi0gKiAgyXJpYyBCdXJnaGFyZCAgLSBMRUQgZGlzcGxheSBzdXBwb3J0IGZvciBXMU4KKyAqICDvv71pYyBCdXJnaGFyZCAgLSBMRUQgZGlzcGxheSBzdXBwb3J0IGZvciBXMU4KICAqCiAgKi8KIApAQCAtMTEyOCw3ICsxMTI4LDYgQEAKIHN0YXRpYyBpbnQgYXN1c19ob3RrX2dldF9pbmZvKHZvaWQpCiB7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgZHNkdCA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKIAl1bmlvbiBhY3BpX29iamVjdCAqbW9kZWwgPSBOVUxMOwogCWludCBic3RzX3Jlc3VsdDsKIAljaGFyICpzdHJpbmcgPSBOVUxMOwpAQCAtMTE0MiwxMSArMTE0MSw5IEBACiAJICogSElEKSwgdGhpcyBiaXQgd2lsbCBiZSBtb3ZlZC4gQSBnbG9iYWwgdmFyaWFibGUgYXN1c19pbmZvIGNvbnRhaW5zCiAJICogdGhlIERTRFQgaGVhZGVyLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfVEFCTEVfSURfRFNEVCwgMSwgJmRzZHQpOworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0RTRFQsIDEsICZhc3VzX2luZm8pOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBDb3VsZG4ndCBnZXQgdGhlIERTRFQgdGFibGUgaGVhZGVyXG4iKTsKLQllbHNlCi0JCWFzdXNfaW5mbyA9IGRzZHQucG9pbnRlcjsKIAogCS8qIFdlIGhhdmUgdG8gd3JpdGUgMCBvbiBpbml0IHRoaXMgZmFyIGZvciBhbGwgQVNVUyBtb2RlbHMgKi8KIAlpZiAoIXdyaXRlX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIklOSVQiLCAwLCAmYnVmZmVyKSkgewpAQCAtMTM1OCw4ICsxMzU1LDYgQEAKIAlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYXN1c19ob3RrX2RyaXZlcik7CiAJcmVtb3ZlX3Byb2NfZW50cnkoUFJPQ19BU1VTLCBhY3BpX3Jvb3RfZGlyKTsKIAotCWtmcmVlKGFzdXNfaW5mbyk7Ci0KIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCmluZGV4IDVmNDNlMGQuLjJmNDUyMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwpAQCAtNjQsNyArNjQsNyBAQAogCiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7Ci1zdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0dXMpOworc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2JhdHRlcnlfZHJpdmVyID0gewogCS5uYW1lID0gQUNQSV9CQVRURVJZX0RSSVZFUl9OQU1FLApAQCAtNzUzLDcgKzc1Myw3IEBACiB9CiAKIC8qIHRoaXMgaXMgbmVlZGVkIHRvIGxlYXJuIGFib3V0IGNoYW5nZXMgbWFkZSBpbiBzdXNwZW5kZWQgc3RhdGUgKi8KLXN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKQorc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXkuYyBiL2RyaXZlcnMvYWNwaS9iYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjdmYTFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2JheS5jCkBAIC0wLDAgKzEsNDkwIEBACisvKgorICogIGJheS5jIC0gQUNQSSByZW1vdmFibGUgZHJpdmUgYmF5IGRyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgS3Jpc3RlbiBDYXJsc29uIEFjY2FyZGkgPGtyaXN0ZW4uYy5hY2NhcmRpQGludGVsLmNvbT4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIEFDUElfQkFZX0RSSVZFUl9OQU1FICJBQ1BJIFJlbW92YWJsZSBEcml2ZSBCYXkgRHJpdmVyIgorCitBQ1BJX01PRFVMRV9OQU1FKCJiYXkiKQorTU9EVUxFX0FVVEhPUigiS3Jpc3RlbiBDYXJsc29uIEFjY2FyZGkiKTsKK01PRFVMRV9ERVNDUklQVElPTihBQ1BJX0JBWV9EUklWRVJfTkFNRSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZGVmaW5lIEFDUElfQkFZX0NMQVNTICJiYXkiCisjZGVmaW5lIEFDUElfQkFZX0NPTVBPTkVOVAkweDEwMDAwMDAwCisjZGVmaW5lIF9DT01QT05FTlQgQUNQSV9CQVlfQ09NUE9ORU5UCisjZGVmaW5lIGJheV9kcHJpbnRrKGgscykge1wKKwljaGFyIHByZWZpeFs4MF0gPSB7J1wwJ307XAorCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7c2l6ZW9mKHByZWZpeCksIHByZWZpeH07XAorCWFjcGlfZ2V0X25hbWUoaCwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTtcCisJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICIlczogJXNcbiIsIHByZWZpeCwgcyk7IH0KK3N0YXRpYyB2b2lkIGJheV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBhY3BpX2JheV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhY3BpX2JheV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2JheV9kcml2ZXIgPSB7CisJLm5hbWUgPSBBQ1BJX0JBWV9EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX0JBWV9DTEFTUywKKwkuaWRzID0gQUNQSV9CQVlfSElELAorCS5vcHMgPSB7CisJCS5hZGQgPSBhY3BpX2JheV9hZGQsCisJCS5yZW1vdmUgPSBhY3BpX2JheV9yZW1vdmUsCisJCX0sCit9OworCitzdHJ1Y3QgYmF5IHsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoZHJpdmVfYmF5cyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZSBCYXkgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogaXNfZWplY3RhYmxlIC0gc2VlIGlmIGEgZGV2aWNlIGlzIGVqZWN0YWJsZQorICogQGhhbmRsZTogYWNwaSBoYW5kbGUgb2YgdGhlIGRldmljZQorICoKKyAqIElmIGFuIGFjcGkgb2JqZWN0IGhhcyBhIF9FSjAgbWV0aG9kLCB0aGVuIGl0IGlzIGVqZWN0YWJsZQorICovCitzdGF0aWMgaW50IGlzX2VqZWN0YWJsZShhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIHRtcDsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfRUowIiwgJnRtcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBiYXlfcHJlc2VudCAtIHNlZSBpZiB0aGUgYmF5IGRldmljZSBpcyBwcmVzZW50CisgKiBAYmF5OiB0aGUgZHJpdmUgYmF5CisgKgorICogZXhlY3V0ZSB0aGUgX1NUQSBtZXRob2QuCisgKi8KK3N0YXRpYyBpbnQgYmF5X3ByZXNlbnQoc3RydWN0IGJheSAqYmF5KQoreworCXVuc2lnbmVkIGxvbmcgc3RhOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmIChiYXkpIHsKKwkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGJheS0+aGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykgJiYgc3RhKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGVqZWN0X2RldmljZSAtIHJlc3BvbmQgdG8gYW4gZWplY3QgcmVxdWVzdAorICogQGhhbmRsZSAtIHRoZSBkZXZpY2UgdG8gZWplY3QKKyAqCisgKiBDYWxsIHRoaXMgZGV2aWNlcyBfRUowIG1ldGhvZC4KKyAqLworc3RhdGljIHZvaWQgZWplY3RfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmc7CisKKwliYXlfZHByaW50ayhoYW5kbGUsICJFamVjdGluZyBkZXZpY2UiKTsKKworCWFyZ19saXN0LmNvdW50ID0gMTsKKwlhcmdfbGlzdC5wb2ludGVyID0gJmFyZzsKKwlhcmcudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCWFyZy5pbnRlZ2VyLnZhbHVlID0gMTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX0VKMCIsCisJCQkJCSAgICAgICZhcmdfbGlzdCwgTlVMTCkpKQorCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGV2YWx1YXRlIF9FSjAhXG4iKTsKK30KKworLyoKKyAqIHNob3dfcHJlc2VudCAtIHJlYWQgbWV0aG9kIGZvciAicHJlc2VudCIgZmlsZSBpbiBzeXNmcworICovCitzdGF0aWMgc3NpemVfdCBzaG93X3ByZXNlbnQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYmF5ICpiYXkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgYmF5X3ByZXNlbnQoYmF5KSk7CisKK30KK0RFVklDRV9BVFRSKHByZXNlbnQsIFNfSVJVR08sIHNob3dfcHJlc2VudCwgTlVMTCk7CisKKy8qCisgKiB3cml0ZV9lamVjdCAtIHdyaXRlIG1ldGhvZCBmb3IgImVqZWN0IiBmaWxlIGluIHN5c2ZzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2VqZWN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYmF5ICpiYXkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJZWplY3RfZGV2aWNlKGJheS0+aGFuZGxlKTsKKwlyZXR1cm4gY291bnQ7Cit9CitERVZJQ0VfQVRUUihlamVjdCwgU19JV1VTUiwgTlVMTCwgd3JpdGVfZWplY3QpOworCisvKioKKyAqIGlzX2F0YSAtIHNlZSBpZiBhIGRldmljZSBpcyBhbiBhdGEgZGV2aWNlCisgKiBAaGFuZGxlOiBhY3BpIGhhbmRsZSBvZiB0aGUgZGV2aWNlCisgKgorICogSWYgYW4gYWNwaSBvYmplY3QgaGFzIG9uZSBvZiA0IEFUQSBBQ1BJIG1ldGhvZHMgZGVmaW5lZCwKKyAqIHRoZW4gaXQgaXMgYW4gQVRBIGRldmljZQorICovCitzdGF0aWMgaW50IGlzX2F0YShhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9oYW5kbGUgdG1wOworCisJaWYgKChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9HVEYiLCAmdG1wKSkpIHx8CisJICAgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0dUTSIsICZ0bXApKSkgfHwKKwkgICAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfU1RNIiwgJnRtcCkpKSB8fAorCSAgIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9TREQiLCAmdG1wKSkpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBhcmVudF9pc19hdGEoYWNwaV9oYW5kbGUgaGFuZGxlKQorICoKKyAqLworc3RhdGljIGludCBwYXJlbnRfaXNfYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlhY3BpX2hhbmRsZSBwaGFuZGxlOworCisJaWYgKGFjcGlfZ2V0X3BhcmVudChoYW5kbGUsICZwaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaXNfYXRhKHBoYW5kbGUpOworfQorCisvKioKKyAqIGlzX2VqZWN0YWJsZV9iYXkgLSBzZWUgaWYgYSBkZXZpY2UgaXMgYW4gZWplY3RhYmxlIGRyaXZlIGJheQorICogQGhhbmRsZTogYWNwaSBoYW5kbGUgb2YgdGhlIGRldmljZQorICoKKyAqIElmIGFuIGFjcGkgb2JqZWN0IGlzIGVqZWN0YWJsZSBhbmQgaGFzIG9uZSBvZiB0aGUgQUNQSSBBVEEKKyAqIG1ldGhvZHMgZGVmaW5lZCwgdGhlbiB3ZSBjYW4gc2FmZWx5IGNhbGwgaXQgYW4gZWplY3RhYmxlCisgKiBkcml2ZSBiYXkKKyAqLworc3RhdGljIGludCBpc19lamVjdGFibGVfYmF5KGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlpZiAoKGlzX2F0YShoYW5kbGUpIHx8IHBhcmVudF9pc19hdGEoaGFuZGxlKSkgJiYgaXNfZWplY3RhYmxlKGhhbmRsZSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKioKKyAqIGVqZWN0X3JlbW92YWJsZV9kcml2ZSAtIHRyeSB0byBlamVjdCB0aGlzIGRyaXZlCisgKiBAZGV2IDogdGhlIGRldmljZSBzdHJ1Y3R1cmUgb2YgdGhlIGRyaXZlCisgKgorICogSWYgYSBkZXZpY2UgaXMgYSByZW1vdmFibGUgZHJpdmUgdGhhdCByZXF1aXJlcyBhbiBfRUowIG1ldGhvZAorICogdG8gYmUgZXhlY3V0ZWQgaW4gb3JkZXIgdG8gc2FmZWx5IHJlbW92ZSBmcm9tIHRoZSBzeXN0ZW0sIGRvCisgKiBpdC4gIEFUTSAtIGFsd2F5cyByZXR1cm5zIHN1Y2Nlc3MKKyAqLworaW50IGVqZWN0X3JlbW92YWJsZV9kcml2ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gREVWSUNFX0FDUElfSEFORExFKGRldik7CisKKwlpZiAoaGFuZGxlKSB7CisJCWJheV9kcHJpbnRrKGhhbmRsZSwgIkdvdCBkZXZpY2UgaGFuZGxlIik7CisJCWlmIChpc19lamVjdGFibGVfYmF5KGhhbmRsZSkpCisJCQllamVjdF9kZXZpY2UoaGFuZGxlKTsKKwl9IGVsc2UgeworCQlwcmludGsoIk5vIGFjcGkgaGFuZGxlIGZvciBkZXZpY2VcbiIpOworCX0KKworCS8qIHNob3VsZCBJIHJldHVybiBhbiBlcnJvciBjb2RlPyAqLworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZWplY3RfcmVtb3ZhYmxlX2RyaXZlKTsKKworc3RhdGljIGludCBhY3BpX2JheV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJYmF5X2RwcmludGsoZGV2aWNlLT5oYW5kbGUsICJhZGRpbmcgYmF5IGRldmljZSIpOworCXN0cmNweShhY3BpX2RldmljZV9uYW1lKGRldmljZSksICJEb2NrYWJsZSBCYXkiKTsKKwlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgImJheSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjcGlfYmF5X2FkZF9mcyhzdHJ1Y3QgYmF5ICpiYXkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYmF5LT5wZGV2LT5kZXY7CisKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcHJlc2VudCk7CisJaWYgKHJldCkKKwkJZ290byBhZGRfZnNfZXJyOworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9lamVjdCk7CisJaWYgKHJldCkgeworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcHJlc2VudCk7CisJCWdvdG8gYWRkX2ZzX2VycjsKKwl9CisJcmV0dXJuIDA7CisKKyBhZGRfZnNfZXJyOgorCWJheV9kcHJpbnRrKGJheS0+aGFuZGxlLCAiRXJyb3IgYWRkaW5nIHN5c2ZzIGZpbGVzXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhY3BpX2JheV9yZW1vdmVfZnMoc3RydWN0IGJheSAqYmF5KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZiYXktPnBkZXYtPmRldjsKKworCS8qIGNsZWFudXAgc3lzZnMgKi8KKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcHJlc2VudCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2VqZWN0KTsKK30KKworc3RhdGljIGludCBiYXlfaXNfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWFjcGlfaGFuZGxlIHBhcmVudDsKKworCWFjcGlfZ2V0X3BhcmVudChoYW5kbGUsICZwYXJlbnQpOworCisJLyogaWYgdGhlIGRldmljZSBvciBpdCdzIHBhcmVudCBpcyBkZXBlbmRlbnQgb24gdGhlCisJICogZG9jaywgdGhlbiB3ZSBhcmUgYSBkb2NrIGRldmljZQorCSAqLworCXJldHVybiAoaXNfZG9ja19kZXZpY2UoaGFuZGxlKSB8fCBpc19kb2NrX2RldmljZShwYXJlbnQpKTsKK30KKworc3RhdGljIGludCBiYXlfYWRkKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGlkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYmF5ICpuZXdfYmF5OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGFjcGlfYnVmZmVyIG5idWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZuYnVmZmVyKTsKKworCWJheV9kcHJpbnRrKGhhbmRsZSwgIkFkZGluZyBub3RpZnkgaGFuZGxlciIpOworCisJLyoKKwkgKiBJbml0aWFsaXplIGJheSBkZXZpY2Ugc3RydWN0dXJlCisJICovCisJbmV3X2JheSA9IGt6YWxsb2MoR0ZQX0FUT01JQywgc2l6ZW9mKCpuZXdfYmF5KSk7CisJSU5JVF9MSVNUX0hFQUQoJm5ld19iYXktPmxpc3QpOworCW5ld19iYXktPmhhbmRsZSA9IGhhbmRsZTsKKwluZXdfYmF5LT5uYW1lID0gKGNoYXIgKiluYnVmZmVyLnBvaW50ZXI7CisKKwkvKiBpbml0aWFsaXplIHBsYXRmb3JtIGRldmljZSBzdHVmZiAqLworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKEFDUElfQkFZX0NMQVNTLCBpZCwgTlVMTCwgMCk7CisJaWYgKHBkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciByZWdpc3RlcmluZyBiYXkgZGV2aWNlXG4iKTsKKwkJZ290byBiYXlfYWRkX2VycjsKKwl9CisJbmV3X2JheS0+cGRldiA9IHBkZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmV3X2JheSk7CisKKwlpZiAoYWNwaV9iYXlfYWRkX2ZzKG5ld19iYXkpKSB7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKG5ld19iYXktPnBkZXYpOworCQlnb3RvIGJheV9hZGRfZXJyOworCX0KKworCS8qIHJlZ2lzdGVyIGZvciBldmVudHMgb24gdGhpcyBkZXZpY2UgKi8KKwlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoaGFuZGxlLCBBQ1BJX1NZU1RFTV9OT1RJRlksCisJCQliYXlfbm90aWZ5LCBuZXdfYmF5KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgaW5zdGFsbGluZyBiYXkgbm90aWZ5IGhhbmRsZXJcbiIpOworCX0KKworCS8qIGlmIHdlIGFyZSBvbiBhIGRvY2sgc3RhdGlvbiwgd2Ugc2hvdWxkIHJlZ2lzdGVyIGZvciBkb2NrCisJICogbm90aWZpY2F0aW9ucy4KKwkgKi8KKwlpZiAoYmF5X2lzX2RvY2tfZGV2aWNlKGhhbmRsZSkpIHsKKwkJYmF5X2RwcmludGsoaGFuZGxlLCAiSXMgZGVwZW5kZW50IG9uIGRvY2tcbiIpOworCQlyZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGhhbmRsZSwgYmF5X25vdGlmeSwgbmV3X2JheSk7CisJfQorCWxpc3RfYWRkKCZuZXdfYmF5LT5saXN0LCAmZHJpdmVfYmF5cyk7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkJheSBbJXNdIEFkZGVkXG4iLCBuZXdfYmF5LT5uYW1lKTsKKwlyZXR1cm4gMDsKKworYmF5X2FkZF9lcnI6CisJa2ZyZWUobmV3X2JheS0+bmFtZSk7CisJa2ZyZWUobmV3X2JheSk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9iYXlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKK3sKKwkvKioqIEZJWE1FOiBkbyBzb21ldGhpbmcgaGVyZSAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIGJheV9jcmVhdGVfYWNwaV9kZXZpY2UgLSBhZGQgbmV3IGRldmljZXMgdG8gYWNwaQorICogQGhhbmRsZSAtIGhhbmRsZSBvZiB0aGUgZGV2aWNlIHRvIGFkZAorICoKKyAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgbmV3IGFjcGlfZGV2aWNlIGZvciB0aGUgZ2l2ZW4KKyAqICBoYW5kbGUgaWYgb25lIGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBUaGlzIHNob3VsZCBjYXVzZQorICogIGFjcGkgdG8gc2NhbiBmb3IgZHJpdmVycyBmb3IgdGhlIGdpdmVuIGRldmljZXMsIGFuZCBjYWxsCisgKiAgbWF0Y2hpbmcgZHJpdmVyJ3MgYWRkIHJvdXRpbmUuCisgKgorICogIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhY3BpX2RldmljZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYW5kbGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBiYXlfY3JlYXRlX2FjcGlfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnRfZGV2aWNlOworCWFjcGlfaGFuZGxlIHBhcmVudDsKKwlpbnQgcmV0OworCisJYmF5X2RwcmludGsoaGFuZGxlLCAiVHJ5aW5nIHRvIGdldCBkZXZpY2UiKTsKKwlpZiAoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpKSB7CisJCS8qCisJCSAqIG5vIGRldmljZSBjcmVhdGVkIGZvciB0aGlzIG9iamVjdCwKKwkJICogc28gd2Ugc2hvdWxkIGNyZWF0ZSBvbmUuCisJCSAqLworCQliYXlfZHByaW50ayhoYW5kbGUsICJObyBkZXZpY2UgZm9yIGhhbmRsZSIpOworCQlhY3BpX2dldF9wYXJlbnQoaGFuZGxlLCAmcGFyZW50KTsKKwkJaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UocGFyZW50LCAmcGFyZW50X2RldmljZSkpCisJCQlwYXJlbnRfZGV2aWNlID0gTlVMTDsKKworCQlyZXQgPSBhY3BpX2J1c19hZGQoJmRldmljZSwgcGFyZW50X2RldmljZSwgaGFuZGxlLAorCQkJQUNQSV9CVVNfVFlQRV9ERVZJQ0UpOworCQlpZiAocmV0KSB7CisJCQlwcl9kZWJ1ZygiZXJyb3IgYWRkaW5nIGJ1cywgJXhcbiIsCisJCQkJLXJldCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gZGV2aWNlOworfQorCisvKioKKyAqIGJheV9ub3RpZnkgLSBhY3QgdXBvbiBhbiBhY3BpIGJheSBub3RpZmljYXRpb24KKyAqIEBoYW5kbGU6IHRoZSBiYXkgaGFuZGxlCisgKiBAZXZlbnQ6IHRoZSBhY3BpIGV2ZW50CisgKiBAZGF0YTogb3VyIGRyaXZlciBkYXRhIHN0cnVjdAorICoKKyAqLworc3RhdGljIHZvaWQgYmF5X25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldjsKKworCWJheV9kcHJpbnRrKGhhbmRsZSwgIkJheSBldmVudCIpOworCisJc3dpdGNoKGV2ZW50KSB7CisJY2FzZSBBQ1BJX05PVElGWV9CVVNfQ0hFQ0s6CisJCXByaW50aygiQnVzIENoZWNrXG4iKTsKKwljYXNlIEFDUElfTk9USUZZX0RFVklDRV9DSEVDSzoKKwkJcHJpbnRrKCJEZXZpY2UgQ2hlY2tcbiIpOworCQlkZXYgPSBiYXlfY3JlYXRlX2FjcGlfZGV2aWNlKGhhbmRsZSk7CisJCWlmIChkZXYpCisJCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXYsIGV2ZW50LCAwKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJObyBkZXZpY2UgZm9yIGdlbmVyYXRpbmcgZXZlbnRcbiIpOworCQkvKiB3b3VsZG4ndCBpdCBiZSBhIGdvb2QgaWRlYSB0byBqdXN0IHJlc2NhbiBTQVRBCisJCSAqIHJpZ2h0IGhlcmU/CisJCSAqLworCQlicmVhazsKKwljYXNlIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1Q6CisJCXByaW50aygiRWplY3QgcmVxdWVzdFxuIik7CisJCWRldiA9IGJheV9jcmVhdGVfYWNwaV9kZXZpY2UoaGFuZGxlKTsKKwkJaWYgKGRldikKKwkJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGRldiwgZXZlbnQsIDApOworCQllbHNlCisJCQlwcmludGsoIk5vIGRldmljZSBmb3IgZ2VuZXJhdGluZyBldmVudG4iKTsKKworCQkvKiB3b3VsZG4ndCBpdCBiZSBhIGdvb2QgaWRlYSB0byBqdXN0IGNhbGwgdGhlCisJCSAqIGVqZWN0X2RldmljZSBoZXJlIGlmIHdlIHdlcmUgYSBTQVRBIGRldmljZT8KKwkJICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygidW5rbm93biBldmVudCAlZFxuIiwgZXZlbnQpOworCX0KK30KKworc3RhdGljIGFjcGlfc3RhdHVzCitmaW5kX2JheShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKK3sKKwlpbnQgKmNvdW50ID0gKGludCAqKWNvbnRleHQ7CisKKwkvKgorCSAqIHRoZXJlIGNvdWxkIGJlIG1vcmUgdGhhbiBvbmUgZWplY3RhYmxlIGJheS4KKwkgKiBzbywganVzdCByZXR1cm4gQUVfT0sgYWx3YXlzIHNvIHRoYXQgZXZlcnkgb2JqZWN0CisJICogd2lsbCBiZSBjaGVja2VkLgorCSAqLworCWlmIChpc19lamVjdGFibGVfYmF5KGhhbmRsZSkpIHsKKwkJYmF5X2RwcmludGsoaGFuZGxlLCAiZm91bmQgZWplY3RhYmxlIGJheSIpOworCQlpZiAoIWJheV9hZGQoaGFuZGxlLCAqY291bnQpKQorCQkJKCpjb3VudCkrKzsKKwl9CisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgaW50IF9faW5pdCBiYXlfaW5pdCh2b2lkKQoreworCWludCBiYXlzID0gMDsKKworCUlOSVRfTElTVF9IRUFEKCZkcml2ZV9iYXlzKTsKKworCS8qIGxvb2sgZm9yIGRvY2thYmxlIGRyaXZlIGJheXMgKi8KKwlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCisJCUFDUElfVUlOVDMyX01BWCwgZmluZF9iYXksICZiYXlzLCBOVUxMKTsKKworCWlmIChiYXlzKQorCQlpZiAoKGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9iYXlfZHJpdmVyKSA8IDApKQorCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgYmF5IGRyaXZlclxuIik7CisKKwlpZiAoIWJheXMpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiYXlfZXhpdCh2b2lkKQoreworCXN0cnVjdCBiYXkgKmJheSwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShiYXksIHRtcCwgJmRyaXZlX2JheXMsIGxpc3QpIHsKKwkJaWYgKGlzX2RvY2tfZGV2aWNlKGJheS0+aGFuZGxlKSkKKwkJCXVucmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShiYXktPmhhbmRsZSk7CisJCWFjcGlfYmF5X3JlbW92ZV9mcyhiYXkpOworCQlhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihiYXktPmhhbmRsZSwgQUNQSV9TWVNURU1fTk9USUZZLAorCQkJYmF5X25vdGlmeSk7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGJheS0+cGRldik7CisJCWtmcmVlKGJheS0+bmFtZSk7CisJCWtmcmVlKGJheSk7CisJfQorCisJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfYmF5X2RyaXZlcik7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKGJheV9pbml0KTsKK21vZHVsZV9leGl0KGJheV9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jIGIvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jCmluZGV4IGY5Yzk3MmIuLmYyODlmZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ibGFja2xpc3QuYworKysgYi9kcml2ZXJzL2FjcGkvYmxhY2tsaXN0LmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAljaGFyIG9lbV9pZFs3XTsKIAljaGFyIG9lbV90YWJsZV9pZFs5XTsKIAl1MzIgb2VtX3JldmlzaW9uOwotCWFjcGlfdGFibGVfdHlwZSB0YWJsZTsKKwljaGFyICp0YWJsZTsKIAllbnVtIGFjcGlfYmxhY2tsaXN0X3ByZWRpY2F0ZXMgb2VtX3JldmlzaW9uX3ByZWRpY2F0ZTsKIAljaGFyICpyZWFzb247CiAJdTMyIGlzX2NyaXRpY2FsX2Vycm9yOwpAQCAtNTYsMTggKzU2LDE4IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYWNwaV9ibGFja2xpc3RfaXRlbSBhY3BpX2JsYWNrbGlzdFtdIF9faW5pdGRhdGEgPSB7CiAJLyogQ29tcGFxIFByZXNhcmlvIDE3MDAgKi8KLQl7IlBUTFREICIsICIgIERTRFQgICIsIDB4MDYwNDAwMDAsIEFDUElfRFNEVCwgbGVzc190aGFuX29yX2VxdWFsLAorCXsiUFRMVEQgIiwgIiAgRFNEVCAgIiwgMHgwNjA0MDAwMCwgQUNQSV9TSUdfRFNEVCwgbGVzc190aGFuX29yX2VxdWFsLAogCSAiTXVsdGlwbGUgcHJvYmxlbXMiLCAxfSwKIAkvKiBTb255IEZYMTIwLCBGWDE0MCwgRlgxNTA/ICovCi0JeyJTT05ZICAiLCAiVTAgICAgICAiLCAweDIwMDEwMzEzLCBBQ1BJX0RTRFQsIGxlc3NfdGhhbl9vcl9lcXVhbCwKKwl7IlNPTlkgICIsICJVMCAgICAgICIsIDB4MjAwMTAzMTMsIEFDUElfU0lHX0RTRFQsIGxlc3NfdGhhbl9vcl9lcXVhbCwKIAkgIkFDUEkgZHJpdmVyIHByb2JsZW0iLCAxfSwKIAkvKiBDb21wYXEgUHJlc2FyaW8gODAwLCBJbnN5ZGUgQklPUyAqLwotCXsiSU5UNDQwIiwgIlNZU0ZleHh4IiwgMHgwMDAwMTAwMSwgQUNQSV9EU0RULCBsZXNzX3RoYW5fb3JfZXF1YWwsCisJeyJJTlQ0NDAiLCAiU1lTRmV4eHgiLCAweDAwMDAxMDAxLCBBQ1BJX1NJR19EU0RULCBsZXNzX3RoYW5fb3JfZXF1YWwsCiAJICJEb2VzIG5vdCB1c2UgX1JFRyB0byBwcm90ZWN0IEVDIE9wUmVnaW9ucyIsIDF9LAogCS8qIElCTSA2MDBFIC0gX0FEUiBzaG91bGQgcmV0dXJuIDcsIGJ1dCBpdCByZXR1cm5zIDEgKi8KLQl7IklCTSAgICIsICJUUDYwMEUgICIsIDB4MDAwMDAxMDUsIEFDUElfRFNEVCwgbGVzc190aGFuX29yX2VxdWFsLAorCXsiSUJNICAgIiwgIlRQNjAwRSAgIiwgMHgwMDAwMDEwNSwgQUNQSV9TSUdfRFNEVCwgbGVzc190aGFuX29yX2VxdWFsLAogCSAiSW5jb3JyZWN0IF9BRFIiLCAxfSwKLQl7IkFTVVNcMFwwIiwgIlAyQi1TICAgIiwgMCwgQUNQSV9EU0RULCBhbGxfdmVyc2lvbnMsCisJeyJBU1VTXDBcMCIsICJQMkItUyAgICIsIDAsIEFDUElfU0lHX0RTRFQsIGFsbF92ZXJzaW9ucywKIAkgIkJvZ3VzIFBDSSByb3V0aW5nIiwgMX0sCiAKIAl7IiJ9CkBAIC03OSw3ICs3OSw3IEBACiB7CiAJaW50IHllYXIgPSBkbWlfZ2V0X3llYXIoRE1JX0JJT1NfREFURSk7CiAJLyogRG9lc24ndCBleGlzdD8gTGlrZWx5IGFuIG9sZCBzeXN0ZW0gKi8KLQlpZiAoeWVhciA9PSAtMSkgCisJaWYgKHllYXIgPT0gLTEpCiAJCXJldHVybiAxOwogCS8qIDA/IExpa2VseSBhIGJ1Z2d5IG5ldyBCSU9TICovCiAJaWYgKHllYXIgPT0gMCkKQEAgLTEwMywyMiArMTAzLDIxIEBACiB7CiAJaW50IGkgPSAwOwogCWludCBibGFja2xpc3RlZCA9IDA7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXI7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIHRhYmxlX2hlYWRlcjsKIAogCXdoaWxlIChhY3BpX2JsYWNrbGlzdFtpXS5vZW1faWRbMF0gIT0gJ1wwJykgewotCQlpZiAoYWNwaV9nZXRfdGFibGVfaGVhZGVyX2Vhcmx5Ci0JCSAgICAoYWNwaV9ibGFja2xpc3RbaV0udGFibGUsICZ0YWJsZV9oZWFkZXIpKSB7CisJCWlmIChhY3BpX2dldF90YWJsZV9oZWFkZXIoYWNwaV9ibGFja2xpc3RbaV0udGFibGUsIDAsICZ0YWJsZV9oZWFkZXIpKSB7CiAJCQlpKys7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmIChzdHJuY21wKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9pZCwgdGFibGVfaGVhZGVyLT5vZW1faWQsIDYpKSB7CisJCWlmIChzdHJuY21wKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9pZCwgdGFibGVfaGVhZGVyLm9lbV9pZCwgNikpIHsKIAkJCWkrKzsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJaWYgKHN0cm5jbXAKLQkJICAgIChhY3BpX2JsYWNrbGlzdFtpXS5vZW1fdGFibGVfaWQsIHRhYmxlX2hlYWRlci0+b2VtX3RhYmxlX2lkLAorCQkgICAgKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV90YWJsZV9pZCwgdGFibGVfaGVhZGVyLm9lbV90YWJsZV9pZCwKIAkJICAgICA4KSkgewogCQkJaSsrOwogCQkJY29udGludWU7CkBAIC0xMjcsMTQgKzEyNiwxNCBAQAogCQlpZiAoKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbl9wcmVkaWNhdGUgPT0gYWxsX3ZlcnNpb25zKQogCQkgICAgfHwgKGFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbl9wcmVkaWNhdGUgPT0KIAkJCWxlc3NfdGhhbl9vcl9lcXVhbAotCQkJJiYgdGFibGVfaGVhZGVyLT5vZW1fcmV2aXNpb24gPD0KKwkJCSYmIHRhYmxlX2hlYWRlci5vZW1fcmV2aXNpb24gPD0KIAkJCWFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbikKIAkJICAgIHx8IChhY3BpX2JsYWNrbGlzdFtpXS5vZW1fcmV2aXNpb25fcHJlZGljYXRlID09CiAJCQlncmVhdGVyX3RoYW5fb3JfZXF1YWwKLQkJCSYmIHRhYmxlX2hlYWRlci0+b2VtX3JldmlzaW9uID49CisJCQkmJiB0YWJsZV9oZWFkZXIub2VtX3JldmlzaW9uID49CiAJCQlhY3BpX2JsYWNrbGlzdFtpXS5vZW1fcmV2aXNpb24pCiAJCSAgICB8fCAoYWNwaV9ibGFja2xpc3RbaV0ub2VtX3JldmlzaW9uX3ByZWRpY2F0ZSA9PSBlcXVhbAotCQkJJiYgdGFibGVfaGVhZGVyLT5vZW1fcmV2aXNpb24gPT0KKwkJCSYmIHRhYmxlX2hlYWRlci5vZW1fcmV2aXNpb24gPT0KIAkJCWFjcGlfYmxhY2tsaXN0W2ldLm9lbV9yZXZpc2lvbikpIHsKIAogCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1cy5jIGIvZHJpdmVycy9hY3BpL2J1cy5jCmluZGV4IDc2NjMzMmUuLmMyNjQ2OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXMuYworKysgYi9kcml2ZXJzL2FjcGkvYnVzLmMKQEAgLTQ0LDkgKzQ0LDYgQEAKIGV4dGVybiB2b2lkIF9faW5pdCBhY3BpX3BpY19zY2lfc2V0X3RyaWdnZXIodW5zaWduZWQgaW50IGlycSwgdTE2IHRyaWdnZXIpOwogI2VuZGlmCiAKLXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgYWNwaV9mYWR0OwotRVhQT1JUX1NZTUJPTChhY3BpX2ZhZHQpOwotCiBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfcm9vdDsKIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9yb290X2RpcjsKIEVYUE9SVF9TWU1CT0woYWNwaV9yb290X2Rpcik7CkBAIC0xOTUsNyArMTkyLDcgQEAKIAogCWlmICghZGV2aWNlLT5mbGFncy5wb3dlcl9tYW5hZ2VhYmxlKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSBgWyVzXScgaXMgbm90IHBvd2VyIG1hbmFnZWFibGVcbiIsCi0JCQkJZGV2aWNlLT5rb2JqLm5hbWUpKTsKKwkJCQlkZXZpY2UtPmRldi5rb2JqLm5hbWUpKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCS8qCkBAIC01ODIsMTEgKzU3OSwxMiBAQAogCXJldHVybiAwOwogfQogCithY3BpX25hdGl2ZV91aW50IGFjcGlfZ2JsX3Blcm1hbmVudF9tbWFwOworCisKIHZvaWQgX19pbml0IGFjcGlfZWFybHlfaW5pdCh2b2lkKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IHNpemVvZihhY3BpX2ZhZHQpLCAmYWNwaV9mYWR0IH07Ci0KIAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm47CkBAIC01OTcsNiArNTk1LDE1IEBACiAJaWYgKCFhY3BpX3N0cmljdCkKIAkJYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrID0gVFJVRTsKIAorCWFjcGlfZ2JsX3Blcm1hbmVudF9tbWFwID0gMTsKKworCXN0YXR1cyA9IGFjcGlfcmVhbGxvY2F0ZV9yb290X3RhYmxlKCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJVbmFibGUgdG8gcmVhbGxvY2F0ZSBBQ1BJIHRhYmxlc1xuIik7CisJCWdvdG8gZXJyb3IwOworCX0KKwogCXN0YXR1cyA9IGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0oKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWApAQCAtNjExLDMyICs2MTgsMjUgQEAKIAkJZ290byBlcnJvcjA7CiAJfQogCi0JLyoKLQkgKiBHZXQgYSBzZXBhcmF0ZSBjb3B5IG9mIHRoZSBGQURUIGZvciB1c2UgYnkgb3RoZXIgZHJpdmVycy4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1RBQkxFX0lEX0ZBRFQsIDEsICZidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJVbmFibGUgdG8gZ2V0IHRoZSBGQURUXG4iKTsKLQkJZ290byBlcnJvcjA7Ci0JfQogI2lmZGVmIENPTkZJR19YODYKIAlpZiAoIWFjcGlfaW9hcGljKSB7Ci0JCWV4dGVybiBhY3BpX2ludGVycnVwdF9mbGFncyBhY3BpX3NjaV9mbGFnczsKKwkJZXh0ZXJuIHU4IGFjcGlfc2NpX2ZsYWdzOwogCiAJCS8qIGNvbXBhdGlibGUgKDApIG1lYW5zIGxldmVsICgzKSAqLwotCQlpZiAoYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9PSAwKQotCQkJYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9IDM7Ci0KKwkJaWYgKCEoYWNwaV9zY2lfZmxhZ3MgJiBBQ1BJX01BRFRfVFJJR0dFUl9NQVNLKSkgeworCQkJYWNwaV9zY2lfZmxhZ3MgJj0gfkFDUElfTUFEVF9UUklHR0VSX01BU0s7CisJCQlhY3BpX3NjaV9mbGFncyB8PSBBQ1BJX01BRFRfVFJJR0dFUl9MRVZFTDsKKwkJfQogCQkvKiBTZXQgUElDLW1vZGUgU0NJIHRyaWdnZXIgdHlwZSAqLwotCQlhY3BpX3BpY19zY2lfc2V0X3RyaWdnZXIoYWNwaV9mYWR0LnNjaV9pbnQsCi0JCQkJCSBhY3BpX3NjaV9mbGFncy50cmlnZ2VyKTsKKwkJYWNwaV9waWNfc2NpX3NldF90cmlnZ2VyKGFjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdCwKKwkJCQkJIChhY3BpX3NjaV9mbGFncyAmIEFDUElfTUFEVF9UUklHR0VSX01BU0spID4+IDIpOwogCX0gZWxzZSB7CiAJCWV4dGVybiBpbnQgYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpOwogCQkvKgotCQkgKiBub3cgdGhhdCBhY3BpX2ZhZHQgaXMgaW5pdGlhbGl6ZWQsCisJCSAqIG5vdyB0aGF0IGFjcGlfZ2JsX0ZBRFQgaXMgaW5pdGlhbGl6ZWQsCiAJCSAqIHVwZGF0ZSBpdCB3aXRoIHJlc3VsdCBmcm9tIElOVF9TUkNfT1ZSIHBhcnNpbmcKIAkJICovCi0JCWFjcGlfZmFkdC5zY2lfaW50ID0gYWNwaV9zY2lfb3ZlcnJpZGVfZ3NpOworCQlhY3BpX2dibF9GQURULnNjaV9pbnRlcnJ1cHQgPSBhY3BpX3NjaV9vdmVycmlkZV9nc2k7CiAJfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXR0b24uYyBiL2RyaXZlcnMvYWNwaS9idXR0b24uYwppbmRleCBhYzg2MDU4Li5jNzI2NjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCkBAIC03NSw3ICs3NSw3IEBACiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfYnV0dG9uX2RyaXZlciA9IHsKIAkubmFtZSA9IEFDUElfQlVUVE9OX0RSSVZFUl9OQU1FLAogCS5jbGFzcyA9IEFDUElfQlVUVE9OX0NMQVNTLAotCS5pZHMgPSAiQUNQSV9GUEIsQUNQSV9GU0IsUE5QMEMwRCxQTlAwQzBDLFBOUDBDMEUiLAorCS5pZHMgPSAiYnV0dG9uX3Bvd2VyLGJ1dHRvbl9zbGVlcCxQTlAwQzBELFBOUDBDMEMsUE5QMEMwRSIsCiAJLm9wcyA9IHsKIAkJLmFkZCA9IGFjcGlfYnV0dG9uX2FkZCwKIAkJLnJlbW92ZSA9IGFjcGlfYnV0dG9uX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYyBiL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYwppbmRleCAwYTE4NjNlLi42OWE2OGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKKysrIGIvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhZGV2aWNlKSB7CiAJCQkJcmVzdWx0ID0gY29udGFpbmVyX2RldmljZV9hZGQoJmRldmljZSwgaGFuZGxlKTsKIAkJCQlpZiAoIXJlc3VsdCkKLQkJCQkJa29iamVjdF91ZXZlbnQoJmRldmljZS0+a29iaiwKKwkJCQkJa29iamVjdF91ZXZlbnQoJmRldmljZS0+ZGV2LmtvYmosCiAJCQkJCQkgICAgICAgS09CSl9PTkxJTkUpOwogCQkJCWVsc2UKIAkJCQkJcHJpbnRrKCJGYWlsZWQgdG8gYWRkIGNvbnRhaW5lclxuIik7CkBAIC0xNzUsMTMgKzE3NSwxMyBAQAogCQl9IGVsc2UgewogCQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCQkJLyogZGV2aWNlIGV4aXN0IGFuZCB0aGlzIGlzIGEgcmVtb3ZlIHJlcXVlc3QgKi8KLQkJCQlrb2JqZWN0X3VldmVudCgmZGV2aWNlLT5rb2JqLCBLT0JKX09GRkxJTkUpOworCQkJCWtvYmplY3RfdWV2ZW50KCZkZXZpY2UtPmRldi5rb2JqLCBLT0JKX09GRkxJTkUpOwogCQkJfQogCQl9CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9OT1RJRllfRUpFQ1RfUkVRVUVTVDoKIAkJaWYgKCFhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSkgJiYgZGV2aWNlKSB7Ci0JCQlrb2JqZWN0X3VldmVudCgmZGV2aWNlLT5rb2JqLCBLT0JKX09GRkxJTkUpOworCQkJa29iamVjdF91ZXZlbnQoJmRldmljZS0+ZGV2LmtvYmosIEtPQkpfT0ZGTElORSk7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jIGIvZHJpdmVycy9hY3BpL2RlYnVnLmMKaW5kZXggMzVjNmFmOC4uZDQ4ZjY1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2RlYnVnLmMKKysrIGIvZHJpdmVycy9hY3BpL2RlYnVnLmMKQEAgLTEzLDE0ICsxMywxMSBAQAogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfU1lTVEVNX0NPTVBPTkVOVAogQUNQSV9NT0RVTEVfTkFNRSgiZGVidWciKQotI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX0RFQlVHX0xBWUVSCSJkZWJ1Z19sYXllciIKLSNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9ERUJVR19MRVZFTAkiZGVidWdfbGV2ZWwiCisKICNpZmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCiAjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAogI2VuZGlmCi0jZGVmaW5lIE1PRFVMRV9QQVJBTV9QUkVGSVgKLSAgICBtb2R1bGVfcGFyYW0oYWNwaV9kYmdfbGF5ZXIsIHVpbnQsIDA0MDApOwotbW9kdWxlX3BhcmFtKGFjcGlfZGJnX2xldmVsLCB1aW50LCAwNDAwKTsKKyNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWCAiYWNwaS4iCiAKIHN0cnVjdCBhY3BpX2RsYXllciB7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTg2LDYgKzgzLDYwIEBACiAJQUNQSV9ERUJVR19JTklUKEFDUElfTFZfRVZFTlRTKSwKIH07CiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9zeXMpCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGludCBwYXJhbV9nZXRfZGVidWdfbGF5ZXIoY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkgeworCWludCByZXN1bHQgPSAwOworCWludCBpOworCisJcmVzdWx0ID0gc3ByaW50ZihidWZmZXIsICIlLTI1c1x0SGV4ICAgICAgICBTRVRcbiIsICJEZXNjcmlwdGlvbiIpOworCisJZm9yKGkgPSAwOyBpIDxBUlJBWV9TSVpFKGFjcGlfZGVidWdfbGF5ZXJzKTsgaSsrKSB7CisJCXJlc3VsdCArPSBzcHJpbnRmKGJ1ZmZlcityZXN1bHQsICIlLTI1c1x0MHglMDhsWCBbJWNdXG4iLAorCQkJCQlhY3BpX2RlYnVnX2xheWVyc1tpXS5uYW1lLAorCQkJCQlhY3BpX2RlYnVnX2xheWVyc1tpXS52YWx1ZSwKKwkJCQkJKGFjcGlfZGJnX2xheWVyICYgYWNwaV9kZWJ1Z19sYXllcnNbaV0udmFsdWUpID8gJyonIDogJyAnKTsKKwl9CisJcmVzdWx0ICs9IHNwcmludGYoYnVmZmVyK3Jlc3VsdCwgIiUtMjVzXHQweCUwOFggWyVjXVxuIiwgIkFDUElfQUxMX0RSSVZFUlMiLAorCQkJCQlBQ1BJX0FMTF9EUklWRVJTLAorCQkJCQkoYWNwaV9kYmdfbGF5ZXIgJiBBQ1BJX0FMTF9EUklWRVJTKSA9PQorCQkJCQlBQ1BJX0FMTF9EUklWRVJTID8gJyonIDogKGFjcGlfZGJnX2xheWVyICYKKwkJCQkJQUNQSV9BTExfRFJJVkVSUykgPT0gMCA/ICcgJyA6ICctJyk7CisJcmVzdWx0ICs9IHNwcmludGYoYnVmZmVyK3Jlc3VsdCwgIi0tXG5kZWJ1Z19sYXllciA9IDB4JTA4WCAoICogPSBlbmFibGVkKVxuIiwgYWNwaV9kYmdfbGF5ZXIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBwYXJhbV9nZXRfZGVidWdfbGV2ZWwoY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkgeworCWludCByZXN1bHQgPSAwOworCWludCBpOworCisJcmVzdWx0ID0gc3ByaW50ZihidWZmZXIsICIlLTI1c1x0SGV4ICAgICAgICBTRVRcbiIsICJEZXNjcmlwdGlvbiIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWNwaV9kZWJ1Z19sZXZlbHMpOyBpKyspIHsKKwkJcmVzdWx0ICs9IHNwcmludGYoYnVmZmVyK3Jlc3VsdCwgIiUtMjVzXHQweCUwOGxYIFslY11cbiIsCisJCQkJICAgICBhY3BpX2RlYnVnX2xldmVsc1tpXS5uYW1lLAorCQkJCSAgICAgYWNwaV9kZWJ1Z19sZXZlbHNbaV0udmFsdWUsCisJCQkJICAgICAoYWNwaV9kYmdfbGV2ZWwgJiBhY3BpX2RlYnVnX2xldmVsc1tpXS4KKwkJCQkgICAgICB2YWx1ZSkgPyAnKicgOiAnICcpOworCX0KKwlyZXN1bHQgKz0gc3ByaW50ZihidWZmZXIrcmVzdWx0LCAiLS1cbmRlYnVnX2xldmVsID0gMHglMDhYICgqID0gZW5hYmxlZClcbiIsCisJCQkgICAgIGFjcGlfZGJnX2xldmVsKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK21vZHVsZV9wYXJhbV9jYWxsKGRlYnVnX2xheWVyLCBwYXJhbV9zZXRfdWludCwgcGFyYW1fZ2V0X2RlYnVnX2xheWVyLCAmYWNwaV9kYmdfbGF5ZXIsIDA2NDQpOworbW9kdWxlX3BhcmFtX2NhbGwoZGVidWdfbGV2ZWwsIHBhcmFtX3NldF91aW50LCBwYXJhbV9nZXRfZGVidWdfbGV2ZWwsICZhY3BpX2RiZ19sZXZlbCwgMDY0NCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBDT05GSUdfQUNQSV9QUk9DRlMKKyNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9ERUJVR19MQVlFUgkiZGVidWdfbGF5ZXIiCisjZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfREVCVUdfTEVWRUwJCSJkZWJ1Z19sZXZlbCIKKwogc3RhdGljIGludAogYWNwaV9zeXN0ZW1fcmVhZF9kZWJ1ZyhjaGFyICpwYWdlLAogCQkgICAgICAgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCkBAIC0yMjEsMyArMjcyLDQgQEAKIH0KIAogc3Vic3lzX2luaXRjYWxsKGFjcGlfZGVidWdfaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYwppbmRleCBhNmQ3N2VmLi5mMDQ5NjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2ZpZWxkLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTMzLDcgKzEzMyw4IEBACiAJCX0KIAl9CiAKLQkvKiBXZSBjb3VsZCBwdXQgdGhlIHJldHVybmVkIG9iamVjdCAoTm9kZSkgb24gdGhlIG9iamVjdCBzdGFjayBmb3IgbGF0ZXIsCisJLyoKKwkgKiBXZSBjb3VsZCBwdXQgdGhlIHJldHVybmVkIG9iamVjdCAoTm9kZSkgb24gdGhlIG9iamVjdCBzdGFjayBmb3IgbGF0ZXIsCiAJICogYnV0IGZvciBub3csIHdlIHdpbGwgcHV0IGl0IGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywKIAkgKiBzbyB3ZSBjYW4gZ2V0IGl0IGFnYWluIGF0IHRoZSBlbmQgb2YgdGhpcyBzY29wZQogCSAqLwpAQCAtNTE0LDggKzUxNSwzMyBAQAogCiAJLyogVGhpcmQgYXJnIGlzIHRoZSBiYW5rX3ZhbHVlICovCiAKKwkvKiBUQkQ6IFRoaXMgYXJnIGlzIGEgdGVybV9hcmcsIG5vdCBhIGNvbnN0YW50LCBhbmQgbXVzdCBiZSBldmFsdWF0ZWQgKi8KKwogCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7Ci0JaW5mby5iYW5rX3ZhbHVlID0gKHUzMikgYXJnLT5jb21tb24udmFsdWUuaW50ZWdlcjsKKworCS8qIEN1cnJlbnRseSwgb25seSB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgc3VwcG9ydGVkICovCisKKwlzd2l0Y2ggKGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKKwljYXNlIEFNTF9aRVJPX09QOgorCQlpbmZvLmJhbmtfdmFsdWUgPSAwOworCQlicmVhazsKKworCWNhc2UgQU1MX09ORV9PUDoKKwkJaW5mby5iYW5rX3ZhbHVlID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIEFNTF9CWVRFX09QOgorCWNhc2UgQU1MX1dPUkRfT1A6CisJY2FzZSBBTUxfRFdPUkRfT1A6CisJY2FzZSBBTUxfUVdPUkRfT1A6CisJCWluZm8uYmFua192YWx1ZSA9ICh1MzIpIGFyZy0+Y29tbW9uLnZhbHVlLmludGVnZXI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaW5mby5iYW5rX3ZhbHVlID0gMDsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiTm9uLWNvbnN0YW50IEJhbmtWYWx1ZSBmb3IgQmFua0ZpZWxkIGlzIG5vdCBpbXBsZW1lbnRlZCIpKTsKKwl9CiAKIAkvKiBGb3VydGggYXJnIGlzIHRoZSBmaWVsZCBmbGFncyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2luaXQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzaW5pdC5jCmluZGV4IDE4ODhjMDUuLmFmOTIzYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzaW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzaW5pdC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CisjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCiBBQ1BJX01PRFVMRV9OQU1FKCJkc2luaXQiKQpAQCAtOTAsNyArOTEsNyBAQAogCSAqIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gTlMgbm9kZXMgb3duZWQgYnkgdGhlIHRhYmxlIHRoYXQKIAkgKiB3YXMganVzdCBsb2FkZWQKIAkgKi8KLQlpZiAobm9kZS0+b3duZXJfaWQgIT0gaW5mby0+dGFibGVfZGVzYy0+b3duZXJfaWQpIHsKKwlpZiAobm9kZS0+b3duZXJfaWQgIT0gaW5mby0+b3duZXJfaWQpIHsKIAkJcmV0dXJuIChBRV9PSyk7CiAJfQogCkBAIC0xNTAsMTQgKzE1MSwyMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdGlhbGl6ZV9vYmplY3RzKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKiB0YWJsZV9kZXNjLAorYWNwaV9kc19pbml0aWFsaXplX29iamVjdHMoYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleCwKIAkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogc3RhcnRfbm9kZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gaW5mbzsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2luaXRpYWxpemVfb2JqZWN0cyk7CiAKKwlzdGF0dXMgPSBhY3BpX3RiX2dldF9vd25lcl9pZCh0YWJsZV9pbmRleCwgJm93bmVyX2lkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKIAkJCSAgIioqKiogU3RhcnRpbmcgaW5pdGlhbGl6YXRpb24gb2YgbmFtZXNwYWNlIG9iamVjdHMgKioqKlxuIikpOwogCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsICJQYXJzaW5nIGFsbCBDb250cm9sIE1ldGhvZHM6IikpOwpAQCAtMTY2LDcgKzE3NCw4IEBACiAJaW5mby5vcF9yZWdpb25fY291bnQgPSAwOwogCWluZm8ub2JqZWN0X2NvdW50ID0gMDsKIAlpbmZvLmRldmljZV9jb3VudCA9IDA7Ci0JaW5mby50YWJsZV9kZXNjID0gdGFibGVfZGVzYzsKKwlpbmZvLnRhYmxlX2luZGV4ID0gdGFibGVfaW5kZXg7CisJaW5mby5vd25lcl9pZCA9IG93bmVyX2lkOwogCiAJLyogV2FsayBlbnRpcmUgbmFtZXNwYWNlIGZyb20gdGhlIHN1cHBsaWVkIHJvb3QgKi8KIApAQCAtMTc2LDEwICsxODUsMTQgQEAKIAkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkR1cmluZyBXYWxrTmFtZXNwYWNlIikpOwogCX0KIAorCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KHRhYmxlX2luZGV4LCAmdGFibGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKIAlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULAogCQkJICAgICAgIlxuVGFibGUgWyU0LjRzXShpZCAlNC40WCkgLSAlaGQgT2JqZWN0cyB3aXRoICVoZCBEZXZpY2VzICVoZCBNZXRob2RzICVoZCBSZWdpb25zXG4iLAotCQkJICAgICAgdGFibGVfZGVzYy0+cG9pbnRlci0+c2lnbmF0dXJlLAotCQkJICAgICAgdGFibGVfZGVzYy0+b3duZXJfaWQsIGluZm8ub2JqZWN0X2NvdW50LAorCQkJICAgICAgdGFibGUtPnNpZ25hdHVyZSwgb3duZXJfaWQsIGluZm8ub2JqZWN0X2NvdW50LAogCQkJICAgICAgaW5mby5kZXZpY2VfY291bnQsIGluZm8ubWV0aG9kX2NvdW50LAogCQkJICAgICAgaW5mby5vcF9yZWdpb25fY291bnQpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbWV0aG9kLmMKaW5kZXggY2Y4ODhhZC4uMWNiZTYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzI3LDcgKzMyNyw3IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfY2FsbF9jb250cm9sX21ldGhvZCwgdGhpc193YWxrX3N0YXRlKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkgICJFeGVjdXRlIG1ldGhvZCAlcCwgY3VycmVudHN0YXRlPSVwXG4iLAorCQkJICAiQ2FsbGluZyBtZXRob2QgJXAsIGN1cnJlbnRzdGF0ZT0lcFxuIiwKIAkJCSAgdGhpc193YWxrX3N0YXRlLT5wcmV2X29wLCB0aGlzX3dhbGtfc3RhdGUpKTsKIAogCS8qCkBAIC0zNTEsNDkgKzM1MSw3IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCS8qCi0JICogMSkgUGFyc2UgdGhlIG1ldGhvZC4gQWxsICJub3JtYWwiIG1ldGhvZHMgYXJlIHBhcnNlZCBmb3IgZWFjaCBleGVjdXRpb24uCi0JICogSW50ZXJuYWwgbWV0aG9kcyAoX09TSSwgZXRjLikgZG8gbm90IHJlcXVpcmUgcGFyc2luZy4KLQkgKi8KLQlpZiAoIShvYmpfZGVzYy0+bWV0aG9kLm1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfSU5URVJOQUxfT05MWSkpIHsKLQotCQkvKiBDcmVhdGUgYSBuZXcgd2FsayBzdGF0ZSBmb3IgdGhlIHBhcnNlICovCi0KLQkJbmV4dF93YWxrX3N0YXRlID0KLQkJICAgIGFjcGlfZHNfY3JlYXRlX3dhbGtfc3RhdGUob2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCwgb3AsCi0JCQkJCSAgICAgIG9ial9kZXNjLCBOVUxMKTsKLQkJaWYgKCFuZXh0X3dhbGtfc3RhdGUpIHsKLQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qIENyZWF0ZSBhbmQgaW5pdCBhIHBhcnNlIHRyZWUgcm9vdCAqLwotCi0JCW9wID0gYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AoKTsKLQkJaWYgKCFvcCkgewotCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrKG5leHRfd2Fsa19zdGF0ZSwgb3AsIG1ldGhvZF9ub2RlLAotCQkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCi0JCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsCi0JCQkJCSAgICAgICBOVUxMLCAxKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCi0JCS8qIEJlZ2luIEFNTCBwYXJzZSAoZGVsZXRlcyBuZXh0X3dhbGtfc3RhdGUpICovCi0KLQkJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwobmV4dF93YWxrX3N0YXRlKTsKLQkJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JfQotCi0JLyogMikgQmVnaW4gbWV0aG9kIGV4ZWN1dGlvbi4gQ3JlYXRlIGEgbmV3IHdhbGsgc3RhdGUgKi8KKwkvKiBCZWdpbiBtZXRob2QgcGFyc2UvZXhlY3V0aW9uLiBDcmVhdGUgYSBuZXcgd2FsayBzdGF0ZSAqLwogCiAJbmV4dF93YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLAogCQkJCQkJICAgIE5VTEwsIG9ial9kZXNjLCB0aHJlYWQpOwpAQCAtNDI0LDcgKzM4Miw4IEBACiAKIAlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsobmV4dF93YWxrX3N0YXRlLCBOVUxMLCBtZXRob2Rfbm9kZSwKIAkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCi0JCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwgaW5mbywgMyk7CisJCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwgaW5mbywKKwkJCQkgICAgICAgQUNQSV9JTU9ERV9FWEVDVVRFKTsKIAogCUFDUElfRlJFRShpbmZvKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKQEAgLTQ0NSw4ICs0MDQsOCBAQAogCXRoaXNfd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID0gMDsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkgICJTdGFydGluZyBuZXN0ZWQgZXhlY3V0aW9uLCBuZXdzdGF0ZT0lcFxuIiwKLQkJCSAgbmV4dF93YWxrX3N0YXRlKSk7CisJCQkgICIqKioqIEJlZ2luIG5lc3RlZCBleGVjdXRpb24gb2YgWyU0LjRzXSAqKioqIFdhbGtTdGF0ZT0lcFxuIiwKKwkJCSAgbWV0aG9kX25vZGUtPm5hbWUuYXNjaWksIG5leHRfd2Fsa19zdGF0ZSkpOwogCiAJLyogSW52b2tlIGFuIGludGVybmFsIG1ldGhvZCBpZiBuZWNlc3NhcnkgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMKaW5kZXggNDU5MTYwZi4uYmE0NjI2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jCmluZGV4IDcyMTkwYWIuLmE0NzRjYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTI2MCw3ICsyNjAsNyBAQAogCX0KIAogCW9ial9kZXNjLT5idWZmZXIuZmxhZ3MgfD0gQU9QT0JKX0RBVEFfVkFMSUQ7Ci0Jb3AtPmNvbW1vbi5ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopb2JqX2Rlc2M7CisJb3AtPmNvbW1vbi5ub2RlID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgb2JqX2Rlc2MpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKQEAgLTI3MCw3ICsyNzAsOCBAQAogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUKICAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBQYXJzZXIgb2JqZWN0IHRvIGJlIHRyYW5zbGF0ZWQKLSAqICAgICAgICAgICAgICBwYWNrYWdlX2xlbmd0aCAgLSBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHBhY2thZ2UKKyAqICAgICAgICAgICAgICBlbGVtZW50X2NvdW50ICAgLSBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHBhY2thZ2UgLSB0aGlzIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG51bV9lbGVtZW50cyBhcmd1bWVudCB0byBQYWNrYWdlKCkKICAqICAgICAgICAgICAgICBvYmpfZGVzY19wdHIgICAgLSBXaGVyZSB0aGUgQUNQSSBpbnRlcm5hbCBvYmplY3QgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCkBAIC0yNzgsMTggKzI3OSwyOSBAQAogICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIHBhcnNlciBPcCBwYWNrYWdlIG9iamVjdCB0byB0aGUgZXF1aXZhbGVudAogICogICAgICAgICAgICAgIG5hbWVzcGFjZSBvYmplY3QKICAqCisgKiBOT1RFOiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBwYWNrYWdlIHdpbGwgYmUgYWx3YXlzIGJlIHRoZSBudW1fZWxlbWVudHMKKyAqIGNvdW50LCByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHBhY2thZ2UgbGlzdC4gSWYKKyAqIG51bV9lbGVtZW50cyBpcyBzbWFsbGVyLCBvbmx5IHRoYXQgbWFueSBwYWNrYWdlIGxpc3QgZWxlbWVudHMgYXJlIHVzZWQuCisgKiBpZiBudW1fZWxlbWVudHMgaXMgbGFyZ2VyLCB0aGUgUGFja2FnZSBvYmplY3QgaXMgcGFkZGVkIG91dCB3aXRoCisgKiBvYmplY3RzIG9mIHR5cGUgVW5pbml0aWFsaXplZCAoYXMgcGVyIEFDUEkgc3BlYy4pCisgKgorICogRXZlbiB0aG91Z2ggdGhlIEFTTCBjb21waWxlcnMgZG8gbm90IGFsbG93IG51bV9lbGVtZW50cyB0byBiZSBzbWFsbGVyCisgKiB0aGFuIHRoZSBQYWNrYWdlIGxpc3QgbGVuZ3RoIChmb3IgdGhlIGZpeGVkIGxlbmd0aCBwYWNrYWdlIG9wY29kZSksIHNvbWUKKyAqIEJJT1MgY29kZSBtb2RpZmllcyB0aGUgQU1MIG9uIHRoZSBmbHkgdG8gYWRqdXN0IHRoZSBudW1fZWxlbWVudHMsIGFuZAorICogdGhpcyBjb2RlIGNvbXBlbnNhdGVzIGZvciB0aGF0LiBUaGlzIGFsc28gcHJvdmlkZXMgY29tcGF0aWJpbGl0eSB3aXRoCisgKiBvdGhlciBBTUwgaW50ZXJwcmV0ZXJzLgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2J1aWxkX2ludGVybmFsX3BhY2thZ2Vfb2JqKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCiAJCQkJICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAotCQkJCSAgIHUzMiBwYWNrYWdlX2xlbmd0aCwKKwkJCQkgICB1MzIgZWxlbWVudF9jb3VudCwKIAkJCQkgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb2JqX2Rlc2NfcHRyKQogewogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcmVudDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyA9IE5VTEw7Ci0JdTMyIHBhY2thZ2VfbGlzdF9sZW5ndGg7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJYWNwaV9uYXRpdmVfdWludCBpOwogCkBAIC0zMTgsMzIgKzMzMCwxMyBAQAogCQlvYmpfZGVzYy0+cGFja2FnZS5ub2RlID0gcGFyZW50LT5jb21tb24ubm9kZTsKIAl9CiAKLQlvYmpfZGVzYy0+cGFja2FnZS5jb3VudCA9IHBhY2thZ2VfbGVuZ3RoOwotCi0JLyogQ291bnQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgcGFja2FnZSBsaXN0ICovCi0KLQlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKLQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCWZvciAocGFja2FnZV9saXN0X2xlbmd0aCA9IDA7IGFyZzsgcGFja2FnZV9saXN0X2xlbmd0aCsrKSB7Ci0JCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7Ci0JfQotCiAJLyoKLQkgKiBUaGUgcGFja2FnZSBsZW5ndGggKG51bWJlciBvZiBlbGVtZW50cykgd2lsbCBiZSB0aGUgZ3JlYXRlcgotCSAqIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsaXplciBsaXN0Ci0JICovCi0JaWYgKHBhY2thZ2VfbGlzdF9sZW5ndGggPiBwYWNrYWdlX2xlbmd0aCkgewotCQlvYmpfZGVzYy0+cGFja2FnZS5jb3VudCA9IHBhY2thZ2VfbGlzdF9sZW5ndGg7Ci0JfQotCi0JLyoKLQkgKiBBbGxvY2F0ZSB0aGUgcG9pbnRlciBhcnJheSAoYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlCi0JICogaW5kaXZpZHVhbCBvYmplY3RzKS4gQWRkIGFuIGV4dHJhIHBvaW50ZXIgc2xvdCBzbwotCSAqIHRoYXQgdGhlIGxpc3QgaXMgYWx3YXlzIG51bGwgdGVybWluYXRlZC4KKwkgKiBBbGxvY2F0ZSB0aGUgZWxlbWVudCBhcnJheSAoYXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIGluZGl2aWR1YWwKKwkgKiBvYmplY3RzKSBiYXNlZCBvbiB0aGUgbnVtX2VsZW1lbnRzIHBhcmFtZXRlci4gQWRkIGFuIGV4dHJhIHBvaW50ZXIgc2xvdAorCSAqIHNvIHRoYXQgdGhlIGxpc3QgaXMgYWx3YXlzIG51bGwgdGVybWluYXRlZC4KIAkgKi8KIAlvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKQotCQkJCQkJCSAgIG9ial9kZXNjLT5wYWNrYWdlLgotCQkJCQkJCSAgIGNvdW50ICsKKwkJCQkJCQkgICBlbGVtZW50X2NvdW50ICsKIAkJCQkJCQkgICAxKSAqIHNpemVvZih2b2lkICopKTsKIAogCWlmICghb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMpIHsKQEAgLTM1MSwxNSArMzQ0LDIwIEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAorCW9ial9kZXNjLT5wYWNrYWdlLmNvdW50ID0gZWxlbWVudF9jb3VudDsKKwogCS8qCi0JICogSW5pdGlhbGl6ZSBhbGwgZWxlbWVudHMgb2YgdGhlIHBhY2thZ2UKKwkgKiBJbml0aWFsaXplIHRoZSBlbGVtZW50cyBvZiB0aGUgcGFja2FnZSwgdXAgdG8gdGhlIG51bV9lbGVtZW50cyBjb3VudC4KKwkgKiBQYWNrYWdlIGlzIGF1dG9tYXRpY2FsbHkgcGFkZGVkIHdpdGggdW5pbml0aWFsaXplZCAoTlVMTCkgZWxlbWVudHMKKwkgKiBpZiBudW1fZWxlbWVudHMgaXMgZ3JlYXRlciB0aGFuIHRoZSBwYWNrYWdlIGxpc3QgbGVuZ3RoLiBMaWtld2lzZSwKKwkgKiBQYWNrYWdlIGlzIHRydW5jYXRlZCBpZiBudW1fZWxlbWVudHMgaXMgbGVzcyB0aGFuIHRoZSBsaXN0IGxlbmd0aC4KIAkgKi8KIAlhcmcgPSBvcC0+Y29tbW9uLnZhbHVlLmFyZzsKIAlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwotCWZvciAoaSA9IDA7IGFyZzsgaSsrKSB7CisJZm9yIChpID0gMDsgYXJnICYmIChpIDwgZWxlbWVudF9jb3VudCk7IGkrKykgewogCQlpZiAoYXJnLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX1JFVFVSTl9WQUxVRV9PUCkgewogCi0JCQkvKiBPYmplY3QgKHBhY2thZ2Ugb3IgYnVmZmVyKSBpcyBhbHJlYWR5IGJ1aWx0ICovCisJCQkvKiBUaGlzIHBhY2thZ2UgZWxlbWVudCBpcyBhbHJlYWR5IGJ1aWx0LCBqdXN0IGdldCBpdCAqLwogCiAJCQlvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSA9CiAJCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LApAQCAtMzczLDggKzM3MSwxNCBAQAogCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OwogCX0KIAorCWlmICghYXJnKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkgICJQYWNrYWdlIExpc3QgbGVuZ3RoIGxhcmdlciB0aGFuIE51bUVsZW1lbnRzIGNvdW50ICglWCksIHRydW5jYXRlZFxuIiwKKwkJCQkgIGVsZW1lbnRfY291bnQpKTsKKwl9CisKIAlvYmpfZGVzYy0+cGFja2FnZS5mbGFncyB8PSBBT1BPQkpfREFUQV9WQUxJRDsKLQlvcC0+Y29tbW9uLm5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKilvYmpfZGVzYzsKKwlvcC0+Y29tbW9uLm5vZGUgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBvYmpfZGVzYyk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKQEAgLTQ4OCw4ICs0OTIsOSBAQAogCQkvKgogCQkgKiBEZWZlciBldmFsdWF0aW9uIG9mIEJ1ZmZlciB0ZXJtX2FyZyBvcGVyYW5kCiAJCSAqLwotCQlvYmpfZGVzYy0+YnVmZmVyLm5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKLQkJICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCQlvYmpfZGVzYy0+YnVmZmVyLm5vZGUgPQorCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKKwkJCQkgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdKTsKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfc3RhcnQgPSBvcC0+bmFtZWQuZGF0YTsKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfbGVuZ3RoID0gb3AtPm5hbWVkLmxlbmd0aDsKIAkJYnJlYWs7CkBAIC00OTksOCArNTA0LDkgQEAKIAkJLyoKIAkJICogRGVmZXIgZXZhbHVhdGlvbiBvZiBQYWNrYWdlIHRlcm1fYXJnIG9wZXJhbmQKIAkJICovCi0JCW9ial9kZXNjLT5wYWNrYWdlLm5vZGUgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKLQkJICAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCQlvYmpfZGVzYy0+cGFja2FnZS5ub2RlID0KKwkJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSk7CiAJCW9ial9kZXNjLT5wYWNrYWdlLmFtbF9zdGFydCA9IG9wLT5uYW1lZC5kYXRhOwogCQlvYmpfZGVzYy0+cGFja2FnZS5hbWxfbGVuZ3RoID0gb3AtPm5hbWVkLmxlbmd0aDsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYwppbmRleCA1Yjk3NGE4Li42YzYxMDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMTQsNyArMTE0LDcgQEAKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIE5VTEwsIGFtbF9zdGFydCwKLQkJCQkgICAgICAgYW1sX2xlbmd0aCwgTlVMTCwgMSk7CisJCQkJICAgICAgIGFtbF9sZW5ndGgsIE5VTEwsIEFDUElfSU1PREVfTE9BRF9QQVNTMSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CiAJCWdvdG8gY2xlYW51cDsKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSBhbmQgYXJndW1lbnRzICovCiAKIAlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIE5VTEwsIGFtbF9zdGFydCwKLQkJCQkgICAgICAgYW1sX2xlbmd0aCwgTlVMTCwgMyk7CisJCQkJICAgICAgIGFtbF9sZW5ndGgsIE5VTEwsIEFDUElfSU1PREVfRVhFQ1VURSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CiAJCWdvdG8gY2xlYW51cDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYwppbmRleCAwNTIzMGJhLi5lNDA3M2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN1dGlscy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYwppbmRleCBkN2E2MTZjLi42OTY5M2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMjE5LDcgKzIxOSw3IEBACiAJaWYgKCFvcCkgewogCQlzdGF0dXMgPSBhY3BpX2RzX2xvYWQyX2JlZ2luX29wKHdhbGtfc3RhdGUsIG91dF9vcCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQlnb3RvIGVycm9yX2V4aXQ7CiAJCX0KIAogCQlvcCA9ICpvdXRfb3A7CkBAIC0yMzgsNyArMjM4LDcgQEAKIAogCQkJc3RhdHVzID0gYWNwaV9kc19zY29wZV9zdGFja19wb3Aod2Fsa19zdGF0ZSk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CiAJCQl9CiAJCX0KIAl9CkBAIC0yODcsNyArMjg3LDcgQEAKIAogCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wdXNoKHdhbGtfc3RhdGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJZ290byBlcnJvcl9leGl0OwogCQl9CiAKIAkJc3RhdHVzID0gYWNwaV9kc19leGVjX2JlZ2luX2NvbnRyb2xfb3Aod2Fsa19zdGF0ZSwgb3ApOwpAQCAtMzI4LDYgKzMyOCwxMCBAQAogCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSBkdXJpbmcgbWV0aG9kIGV4ZWN1dGlvbiAqLwogCiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisKKyAgICAgIGVycm9yX2V4aXQ6CisJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZXJyb3Ioc3RhdHVzLCB3YWxrX3N0YXRlKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMKaW5kZXggZTNjYTdmNi4uOGFiOWQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTE5Niw2ICsxOTYsNyBAQAogCQkgKiBvbmUgb2YgdGhlIG9wY29kZXMgdGhhdCBhY3R1YWxseSBvcGVucyBhIHNjb3BlCiAJCSAqLwogCQlzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfQU5ZOgogCQljYXNlIEFDUElfVFlQRV9MT0NBTF9TQ09QRToJLyogU2NvcGUgICovCiAJCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKIAkJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CkBAIC01NDYsNiArNTQ3LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsKIAljaGFyICpidWZmZXJfcHRyOworCXUzMiBmbGFnczsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbG9hZDJfYmVnaW5fb3ApOwogCkBAIC02NjksNiArNjcxLDcgQEAKIAkJICogb25lIG9mIHRoZSBvcGNvZGVzIHRoYXQgYWN0dWFsbHkgb3BlbnMgYSBzY29wZQogCQkgKi8KIAkJc3dpdGNoIChub2RlLT50eXBlKSB7CisJCWNhc2UgQUNQSV9UWVBFX0FOWToKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfU0NPUEU6CS8qIFNjb3BlICovCiAJCWNhc2UgQUNQSV9UWVBFX0RFVklDRToKIAkJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CkBAIC03NTAsMTIgKzc1MywyMCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQkvKiBBZGQgbmV3IGVudHJ5IGludG8gbmFtZXNwYWNlICovCisJCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSDsKKwkJaWYgKHdhbGtfc3RhdGUtPnBhc3NfbnVtYmVyID09IEFDUElfSU1PREVfRVhFQ1VURSkgeworCisJCQkvKiBFeGVjdXRpb24gbW9kZSwgbm9kZSBjYW5ub3QgYWxyZWFkeSBleGlzdCwgbm9kZSBpcyB0ZW1wb3JhcnkgKi8KKworCQkJZmxhZ3MgfD0gKEFDUElfTlNfRVJST1JfSUZfRk9VTkQgfCBBQ1BJX05TX1RFTVBPUkFSWSk7CisJCX0KKworCQkvKiBBZGQgbmV3IGVudHJ5IG9yIGxvb2t1cCBleGlzdGluZyBlbnRyeSAqLwogCiAJCXN0YXR1cyA9CiAJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBidWZmZXJfcHRyLAotCQkJCSAgIG9iamVjdF90eXBlLCBBQ1BJX0lNT0RFX0xPQURfUEFTUzIsCi0JCQkJICAgQUNQSV9OU19OT19VUFNFQVJDSCwgd2Fsa19zdGF0ZSwgJihub2RlKSk7CisJCQkJICAgb2JqZWN0X3R5cGUsIEFDUElfSU1PREVfTE9BRF9QQVNTMiwgZmxhZ3MsCisJCQkJICAgd2Fsa19zdGF0ZSwgJm5vZGUpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jCmluZGV4IGM5MjI4OTcuLjM5MjdjNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3N0YXRlLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jCmluZGV4IDc4MTdlNTUuLjE2YzhlMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3N0YXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kb2NrLmMgYi9kcml2ZXJzL2FjcGkvZG9jay5jCmluZGV4IDkwOTkwYTQuLjY4OGU4M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kb2NrLmMKKysrIGIvZHJpdmVycy9hY3BpL2RvY2suYwpAQCAtNjE1LDIwICs2MTUsMjggQEAKIGZpbmRfZG9ja19kZXZpY2VzKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX2hhbmRsZSB0bXA7CisJYWNwaV9oYW5kbGUgdG1wLCBwYXJlbnQ7CiAJc3RydWN0IGRvY2tfc3RhdGlvbiAqZHMgPSBjb250ZXh0OwogCXN0cnVjdCBkb2NrX2RlcGVuZGVudF9kZXZpY2UgKmRkOwogCiAJc3RhdHVzID0gYWNwaV9idXNfZ2V0X2VqZChoYW5kbGUsICZ0bXApOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuIEFFX09LOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkvKiB0cnkgdGhlIHBhcmVudCBkZXZpY2UgYXMgd2VsbCAqLworCQlzdGF0dXMgPSBhY3BpX2dldF9wYXJlbnQoaGFuZGxlLCAmcGFyZW50KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJZ290byBmZGRfb3V0OworCQkvKiBzZWUgaWYgcGFyZW50IGlzIGRlcGVuZGVudCBvbiBkb2NrICovCisJCXN0YXR1cyA9IGFjcGlfYnVzX2dldF9lamQocGFyZW50LCAmdG1wKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJZ290byBmZGRfb3V0OworCX0KIAogCWlmICh0bXAgPT0gZHMtPmhhbmRsZSkgewogCQlkZCA9IGFsbG9jX2RvY2tfZGVwZW5kZW50X2RldmljZShoYW5kbGUpOwogCQlpZiAoZGQpCiAJCQlhZGRfZG9ja19kZXBlbmRlbnRfZGV2aWNlKGRzLCBkZCk7CiAJfQotCitmZGRfb3V0OgogCXJldHVybiBBRV9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2VjLmMgYi9kcml2ZXJzL2FjcGkvZWMuYwppbmRleCBjYmRmMDMxLi43NDNjZTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZWMuYworKysgYi9kcml2ZXJzL2FjcGkvZWMuYwpAQCAtODcyLDkgKzg3Miw4IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgKmVjZHRfcHRyOwogCi0Jc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoIkVDRFQiLCAxLCBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywKLQkJCQkJIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopCi0JCQkJCSAmZWNkdF9wdHIpOworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0VDRFQsIDEsCisJCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikmZWNkdF9wdHIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTg5MSwxNCArODkwLDE0IEBACiAJaWYgKGFjcGlfZWNfbW9kZSA9PSBFQ19JTlRSKSB7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVjX2VjZHQtPndhaXQpOwogCX0KLQllY19lY2R0LT5jb21tYW5kX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbC5hZGRyZXNzOwotCWVjX2VjZHQtPmRhdGFfYWRkciA9IGVjZHRfcHRyLT5lY19kYXRhLmFkZHJlc3M7Ci0JZWNfZWNkdC0+Z3BlID0gZWNkdF9wdHItPmdwZV9iaXQ7CisJZWNfZWNkdC0+Y29tbWFuZF9hZGRyID0gZWNkdF9wdHItPmNvbnRyb2wuYWRkcmVzczsKKwllY19lY2R0LT5kYXRhX2FkZHIgPSBlY2R0X3B0ci0+ZGF0YS5hZGRyZXNzOworCWVjX2VjZHQtPmdwZSA9IGVjZHRfcHRyLT5ncGU7CiAJLyogdXNlIHRoZSBHTCBqdXN0IHRvIGJlIHNhZmUgKi8KIAllY19lY2R0LT5nbG9iYWxfbG9jayA9IFRSVUU7CiAJZWNfZWNkdC0+dWlkID0gZWNkdF9wdHItPnVpZDsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBlY2R0X3B0ci0+ZWNfaWQsICZlY19lY2R0LT5oYW5kbGUpOworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBlY2R0X3B0ci0+aWQsICZlY19lY2R0LT5oYW5kbGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKaW5kZXggOTE5MDM3ZC4uYTFmODdiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC03MCwxMyArNzAsNiBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbml0aWFsaXplX2V2ZW50cyk7CiAKLQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBBQ1BJIHRhYmxlcyAqLwotCi0JaWYgKCFhY3BpX2dibF9EU0RUKSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIk5vIEFDUEkgdGFibGVzIHByZXNlbnQhIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwotCX0KLQogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgRml4ZWQgYW5kIEdlbmVyYWwgUHVycG9zZSBFdmVudHMuIFRoaXMgaXMgZG9uZSBwcmlvciB0bwogCSAqIGVuYWJsaW5nIFNDSXMgdG8gcHJldmVudCBpbnRlcnJ1cHRzIGZyb20gb2NjdXJyaW5nIGJlZm9yZSB0aGUgaGFuZGxlcnMgYXJlCkBAIC0yMTEsOCArMjA0LDcgQEAKIAkJaWYgKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9baV0uZW5hYmxlX3JlZ2lzdGVyX2lkICE9IDB4RkYpIHsKIAkJCXN0YXR1cyA9CiAJCQkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS4KLQkJCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAwLAotCQkJCQkgICAgICBBQ1BJX01UWF9MT0NLKTsKKwkJCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAwKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCXJldHVybiAoc3RhdHVzKTsKIAkJCX0KQEAgLTI5OCw3ICsyOTAsNyBAQAogCS8qIENsZWFyIHRoZSBzdGF0dXMgYml0ICovCiAKIAkodm9pZClhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KLQkJCQlzdGF0dXNfcmVnaXN0ZXJfaWQsIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJCQlzdGF0dXNfcmVnaXN0ZXJfaWQsIDEpOwogCiAJLyoKIAkgKiBNYWtlIHN1cmUgd2UndmUgZ290IGEgaGFuZGxlci4gIElmIG5vdCwgcmVwb3J0IGFuIGVycm9yLgpAQCAtMzA2LDggKzI5OCw3IEBACiAJICovCiAJaWYgKE5VTEwgPT0gYWNwaV9nYmxfZml4ZWRfZXZlbnRfaGFuZGxlcnNbZXZlbnRdLmhhbmRsZXIpIHsKIAkJKHZvaWQpYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCi0JCQkJCWVuYWJsZV9yZWdpc3Rlcl9pZCwgMCwKLQkJCQkJQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJCQllbmFibGVfcmVnaXN0ZXJfaWQsIDApOwogCiAJCUFDUElfRVJST1IoKEFFX0lORk8sCiAJCQkgICAgIk5vIGluc3RhbGxlZCBoYW5kbGVyIGZvciBmaXhlZCBldmVudCBbJTA4WF0iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCmluZGV4IGM3NmMwNTguLmRmYWMzZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMjEsNyArMTIxLDkgQEAKIAlpZiAoIWdwZV9yZWdpc3Rlcl9pbmZvKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCX0KLQlyZWdpc3Rlcl9iaXQgPSBncGVfZXZlbnRfaW5mby0+cmVnaXN0ZXJfYml0OworCXJlZ2lzdGVyX2JpdCA9ICh1OCkKKwkgICAgKDEgPDwKKwkgICAgIChncGVfZXZlbnRfaW5mby0+Z3BlX251bWJlciAtIGdwZV9yZWdpc3Rlcl9pbmZvLT5iYXNlX2dwZV9udW1iZXIpKTsKIAogCS8qIDEpIERpc2FibGUgY2FzZS4gIFNpbXBseSBjbGVhciBhbGwgZW5hYmxlIGJpdHMgKi8KIApAQCAtNDU4LDggKzQ2MCw3IEBACiAKIAkJCQkvKiBFeGFtaW5lIG9uZSBHUEUgYml0ICovCiAKLQkJCQlpZiAoZW5hYmxlZF9zdGF0dXNfYnl0ZSAmCi0JCQkJICAgIGFjcGlfZ2JsX2RlY29kZV90bzhiaXRbal0pIHsKKwkJCQlpZiAoZW5hYmxlZF9zdGF0dXNfYnl0ZSAmICgxIDw8IGopKSB7CiAJCQkJCS8qCiAJCQkJCSAqIEZvdW5kIGFuIGFjdGl2ZSBHUEUuIERpc3BhdGNoIHRoZSBldmVudCB0byBhIGhhbmRsZXIKIAkJCQkJICogb3IgbWV0aG9kLgpAQCAtNTcwLDcgKzU3MSw3IEBACiAKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkiV2hpbGUgZXZhbHVhdGluZyBHUEUgbWV0aG9kIFslNC40c10iLAorCQkJCQkid2hpbGUgZXZhbHVhdGluZyBHUEUgbWV0aG9kIFslNC40c10iLAogCQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUKIAkJCQkJKGxvY2FsX2dwZV9ldmVudF9pbmZvLmRpc3BhdGNoLgogCQkJCQkgbWV0aG9kX25vZGUpKSk7CkBAIC02MTgsNiArNjE5LDggQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZ3BlX2Rpc3BhdGNoKTsKIAorCWFjcGlfZ3BlX2NvdW50Kys7CisKIAkvKgogCSAqIElmIGVkZ2UtdHJpZ2dlcmVkLCBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgbm93LiAgTm90ZSB0aGF0CiAJICogbGV2ZWwtdHJpZ2dlcmVkIGV2ZW50cyBhcmUgY2xlYXJlZCBhZnRlciB0aGUgR1BFIGlzIHNlcnZpY2VkLgpAQCAtNjMzLDIwICs2MzYsMjMgQEAKIAkJfQogCX0KIAotCS8qIFNhdmUgY3VycmVudCBzeXN0ZW0gc3RhdGUgKi8KLQotCWlmIChhY3BpX2dibF9zeXN0ZW1fYXdha2VfYW5kX3J1bm5pbmcpIHsKLQkJQUNQSV9TRVRfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfU1lTVEVNX1JVTk5JTkcpOwotCX0gZWxzZSB7Ci0JCUFDUElfQ0xFQVJfQklUKGdwZV9ldmVudF9pbmZvLT5mbGFncywgQUNQSV9HUEVfU1lTVEVNX1JVTk5JTkcpOworCWlmICghYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nKSB7CisJCS8qCisJCSAqIFdlIGp1c3Qgd29rZSB1cCBiZWNhdXNlIG9mIGEgd2FrZSBHUEUuIERpc2FibGUgYW55IGZ1cnRoZXIgR1BFcworCQkgKiB1bnRpbCB3ZSBhcmUgZnVsbHkgdXAgYW5kIHJ1bm5pbmcgKE9ubHkgd2FrZSBHUEVzIHNob3VsZCBiZSBlbmFibGVkCisJCSAqIGF0IHRoaXMgdGltZSwgYnV0IHdlIGp1c3QgYnJ1dGUtZm9yY2UgZGlzYWJsZSB0aGVtIGFsbC4pCisJCSAqIDEpIFdlIG11c3QgZGlzYWJsZSB0aGlzIHBhcnRpY3VsYXIgd2FrZSBHUEUgc28gaXQgd29uJ3QgZmlyZSBhZ2FpbgorCQkgKiAyKSBXZSB3YW50IHRvIGRpc2FibGUgYWxsIHdha2UgR1BFcywgc2luY2Ugd2UgYXJlIG5vdyBhd2FrZQorCQkgKi8KKwkJKHZvaWQpYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKCk7CiAJfQogCiAJLyoKLQkgKiBEaXNwYXRjaCB0aGUgR1BFIHRvIGVpdGhlciBhbiBpbnN0YWxsZWQgaGFuZGxlciwgb3IgdGhlIGNvbnRyb2wKLQkgKiBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgR1BFIChfTHh4IG9yIF9FeHgpLgotCSAqIElmIGEgaGFuZGxlciBleGlzdHMsIHdlIGludm9rZSBpdCBhbmQgZG8gbm90IGF0dGVtcHQgdG8gcnVuIHRoZSBtZXRob2QuCi0JICogSWYgdGhlcmUgaXMgbmVpdGhlciBhIGhhbmRsZXIgbm9yIGEgbWV0aG9kLCB3ZSBkaXNhYmxlIHRoZSBsZXZlbCB0bwotCSAqIHByZXZlbnQgZnVydGhlciBldmVudHMgZnJvbSBjb21pbmcgaW4gaGVyZS4KKwkgKiBEaXNwYXRjaCB0aGUgR1BFIHRvIGVpdGhlciBhbiBpbnN0YWxsZWQgaGFuZGxlciwgb3IgdGhlIGNvbnRyb2wgbWV0aG9kCisJICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgR1BFIChfTHh4IG9yIF9FeHgpLiBJZiBhIGhhbmRsZXIgZXhpc3RzLCB3ZSBpbnZva2UKKwkgKiBpdCBhbmQgZG8gbm90IGF0dGVtcHQgdG8gcnVuIHRoZSBtZXRob2QuIElmIHRoZXJlIGlzIG5laXRoZXIgYSBoYW5kbGVyCisJICogbm9yIGEgbWV0aG9kLCB3ZSBkaXNhYmxlIHRoaXMgR1BFIHRvIHByZXZlbnQgZnVydGhlciBzdWNoIHBvaW50bGVzcworCSAqIGV2ZW50cyBmcm9tIGZpcmluZy4KIAkgKi8KIAlzd2l0Y2ggKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spIHsKIAljYXNlIEFDUElfR1BFX0RJU1BBVENIX0hBTkRMRVI6CkBAIC02NzcsOCArNjgzLDggQEAKIAljYXNlIEFDUElfR1BFX0RJU1BBVENIX01FVEhPRDoKIAogCQkvKgotCQkgKiBEaXNhYmxlIEdQRSwgc28gaXQgZG9lc24ndCBrZWVwIGZpcmluZyBiZWZvcmUgdGhlIG1ldGhvZCBoYXMgYQotCQkgKiBjaGFuY2UgdG8gcnVuLgorCQkgKiBEaXNhYmxlIHRoZSBHUEUsIHNvIGl0IGRvZXNuJ3Qga2VlcCBmaXJpbmcgYmVmb3JlIHRoZSBtZXRob2QgaGFzIGEKKwkJICogY2hhbmNlIHRvIHJ1biAoaXQgcnVucyBhc3luY2hyb25vdXNseSB3aXRoIGludGVycnVwdHMgZW5hYmxlZCkuCiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CkBAIC03MTEsNyArNzE3LDcgQEAKIAkJCSAgICBncGVfbnVtYmVyKSk7CiAKIAkJLyoKLQkJICogRGlzYWJsZSB0aGUgR1BFLiAgVGhlIEdQRSB3aWxsIHJlbWFpbiBkaXNhYmxlZCB1bnRpbCB0aGUgQUNQSQorCQkgKiBEaXNhYmxlIHRoZSBHUEUuIFRoZSBHUEUgd2lsbCByZW1haW4gZGlzYWJsZWQgdW50aWwgdGhlIEFDUEkKIAkJICogQ29yZSBTdWJzeXN0ZW0gaXMgcmVzdGFydGVkLCBvciBhIGhhbmRsZXIgaXMgaW5zdGFsbGVkLgogCQkgKi8KIAkJc3RhdHVzID0gYWNwaV9ldl9kaXNhYmxlX2dwZShncGVfZXZlbnRfaW5mbyk7CkBAIC03MjYsNTAgKzczMiwzIEBACiAKIAlyZXR1cm5fVUlOVDMyKEFDUElfSU5URVJSVVBUX0hBTkRMRUQpOwogfQotCi0jaWZkZWYgQUNQSV9HUEVfTk9USUZZX0NIRUNLCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVEJEOiBOT1QgVVNFRCwgUFJPVE9UWVBFIE9OTFkgQU5EIFdJTEwgUFJPQkFCTFkgQkUgUkVNT1ZFRAotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2NoZWNrX2Zvcl93YWtlX29ubHlfZ3BlCi0gKgotICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAtIGluZm8gZm9yIHRoaXMgR1BFCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBEZXRlcm1pbmUgaWYgYSBhIEdQRSBpcyAid2FrZS1vbmx5Ii4KLSAqCi0gKiAgICAgICAgICAgICAgQ2FsbGVkIGZyb20gTm90aWZ5KCkgY29kZSBpbiBpbnRlcnByZXRlciB3aGVuIGEgIkRldmljZVdha2UiCi0gKiAgICAgICAgICAgICAgTm90aWZ5IGNvbWVzIGluLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V2X2NoZWNrX2Zvcl93YWtlX29ubHlfZ3BlKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2NoZWNrX2Zvcl93YWtlX29ubHlfZ3BlKTsKLQotCWlmICgoZ3BlX2V2ZW50X2luZm8pICYmCS8qIE9ubHkgPjAgZm9yIF9MeHgvX0V4eCAqLwotCSAgICAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1NZU1RFTV9NQVNLKSA9PSBBQ1BJX0dQRV9TWVNURU1fUlVOTklORykpIHsJLyogU3lzdGVtIHN0YXRlIGF0IEdQRSB0aW1lICovCi0JCS8qIFRoaXMgbXVzdCBiZSBhIHdha2Utb25seSBHUEUsIGRpc2FibGUgaXQgKi8KLQotCQlzdGF0dXMgPSBhY3BpX2V2X2Rpc2FibGVfZ3BlKGdwZV9ldmVudF9pbmZvKTsKLQotCQkvKiBTZXQgR1BFIHRvIHdha2Utb25seS4gIERvIG5vdCBjaGFuZ2Ugd2FrZSBkaXNhYmxlZC9lbmFibGVkIHN0YXR1cyAqLwotCi0JCWFjcGlfZXZfc2V0X2dwZV90eXBlKGdwZV9ldmVudF9pbmZvLCBBQ1BJX0dQRV9UWVBFX1dBS0UpOwotCi0JCUFDUElfSU5GTygoQUVfSU5GTywKLQkJCSAgICJHUEUgJXAgd2FzIHVwZGF0ZWQgZnJvbSB3YWtlL3J1biB0byB3YWtlLW9ubHkiLAotCQkJICAgZ3BlX2V2ZW50X2luZm8pKTsKLQotCQkvKiBUaGlzIHdhcyBhIHdha2Utb25seSBHUEUgKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfV0FLRV9PTkxZX0dQRSk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jCmluZGV4IDk1ZGRlYjQ4Li5hZDViYzc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNTI5LDcgKzUyOSw3IEBACiAKIAkvKiBJbnN0YWxsIG5ldyBpbnRlcnJ1cHQgaGFuZGxlciBpZiBub3QgU0NJX0lOVCAqLwogCi0JaWYgKGludGVycnVwdF9udW1iZXIgIT0gYWNwaV9nYmxfRkFEVC0+c2NpX2ludCkgeworCWlmIChpbnRlcnJ1cHRfbnVtYmVyICE9IGFjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdCkgewogCQlzdGF0dXMgPSBhY3BpX29zX2luc3RhbGxfaW50ZXJydXB0X2hhbmRsZXIoaW50ZXJydXB0X251bWJlciwKIAkJCQkJCQkgICBhY3BpX2V2X2dwZV94cnVwdF9oYW5kbGVyLAogCQkJCQkJCSAgIGdwZV94cnVwdCk7CkBAIC01NjcsNyArNTY3LDcgQEAKIAogCS8qIFdlIG5ldmVyIHdhbnQgdG8gcmVtb3ZlIHRoZSBTQ0kgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAotCWlmIChncGVfeHJ1cHQtPmludGVycnVwdF9udW1iZXIgPT0gYWNwaV9nYmxfRkFEVC0+c2NpX2ludCkgeworCWlmIChncGVfeHJ1cHQtPmludGVycnVwdF9udW1iZXIgPT0gYWNwaV9nYmxfRkFEVC5zY2lfaW50ZXJydXB0KSB7CiAJCWdwZV94cnVwdC0+Z3BlX2Jsb2NrX2xpc3RfaGVhZCA9IE5VTEw7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQpAQCAtNzk2LDMwICs3OTYsMzEgQEAKIAkJICAgICh1OCkgKGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKwogCQkJICAoaSAqIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSk7CiAKLQkJQUNQSV9TVE9SRV9BRERSRVNTKHRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLmFkZHJlc3MsCi0JCQkJICAgKGdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcy5hZGRyZXNzICsgaSkpOworCQl0aGlzX3JlZ2lzdGVyLT5zdGF0dXNfYWRkcmVzcy5hZGRyZXNzID0KKwkJICAgIGdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcy5hZGRyZXNzICsgaTsKIAotCQlBQ1BJX1NUT1JFX0FERFJFU1ModGhpc19yZWdpc3Rlci0+ZW5hYmxlX2FkZHJlc3MuYWRkcmVzcywKLQkJCQkgICAoZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3MKLQkJCQkgICAgKyBpICsgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudCkpOworCQl0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5hZGRyZXNzID0KKwkJICAgIGdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcy5hZGRyZXNzICsgaSArCisJCSAgICBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OwogCi0JCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQgPQotCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQ7Ci0JCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQgPQotCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLmFkZHJlc3Nfc3BhY2VfaWQ7Ci0JCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLnJlZ2lzdGVyX2JpdF93aWR0aCA9CisJCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLnNwYWNlX2lkID0KKwkJICAgIGdwZV9ibG9jay0+YmxvY2tfYWRkcmVzcy5zcGFjZV9pZDsKKwkJdGhpc19yZWdpc3Rlci0+ZW5hYmxlX2FkZHJlc3Muc3BhY2VfaWQgPQorCQkgICAgZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLnNwYWNlX2lkOworCQl0aGlzX3JlZ2lzdGVyLT5zdGF0dXNfYWRkcmVzcy5iaXRfd2lkdGggPQogCQkgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7Ci0JCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLnJlZ2lzdGVyX2JpdF93aWR0aCA9CisJCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLmJpdF93aWR0aCA9CiAJCSAgICBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsKLQkJdGhpc19yZWdpc3Rlci0+c3RhdHVzX2FkZHJlc3MucmVnaXN0ZXJfYml0X29mZnNldCA9CisJCXRoaXNfcmVnaXN0ZXItPnN0YXR1c19hZGRyZXNzLmJpdF9vZmZzZXQgPQogCQkgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7Ci0JCXRoaXNfcmVnaXN0ZXItPmVuYWJsZV9hZGRyZXNzLnJlZ2lzdGVyX2JpdF9vZmZzZXQgPQorCQl0aGlzX3JlZ2lzdGVyLT5lbmFibGVfYWRkcmVzcy5iaXRfb2Zmc2V0ID0KIAkJICAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOwogCiAJCS8qIEluaXQgdGhlIGV2ZW50X2luZm8gZm9yIGVhY2ggR1BFIHdpdGhpbiB0aGlzIHJlZ2lzdGVyICovCiAKIAkJZm9yIChqID0gMDsgaiA8IEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIOyBqKyspIHsKLQkJCXRoaXNfZXZlbnQtPnJlZ2lzdGVyX2JpdCA9IGFjcGlfZ2JsX2RlY29kZV90bzhiaXRbal07CisJCQl0aGlzX2V2ZW50LT5ncGVfbnVtYmVyID0KKwkJCSAgICAodTgpICh0aGlzX3JlZ2lzdGVyLT5iYXNlX2dwZV9udW1iZXIgKyBqKTsKIAkJCXRoaXNfZXZlbnQtPnJlZ2lzdGVyX2luZm8gPSB0aGlzX3JlZ2lzdGVyOwogCQkJdGhpc19ldmVudCsrOwogCQl9CkBAIC0xMTA5LDExICsxMTEwLDEyIEBACiAJICogSWYgRUlUSEVSIHRoZSByZWdpc3RlciBsZW5ndGggT1IgdGhlIGJsb2NrIGFkZHJlc3MgYXJlIHplcm8sIHRoZW4gdGhhdAogCSAqIHBhcnRpY3VsYXIgYmxvY2sgaXMgbm90IHN1cHBvcnRlZC4KIAkgKi8KLQlpZiAoYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuICYmIGFjcGlfZ2JsX0ZBRFQtPnhncGUwX2Jsay5hZGRyZXNzKSB7CisJaWYgKGFjcGlfZ2JsX0ZBRFQuZ3BlMF9ibG9ja19sZW5ndGggJiYKKwkgICAgYWNwaV9nYmxfRkFEVC54Z3BlMF9ibG9jay5hZGRyZXNzKSB7CiAKIAkJLyogR1BFIGJsb2NrIDAgZXhpc3RzIChoYXMgYm90aCBsZW5ndGggYW5kIGFkZHJlc3MgPiAwKSAqLwogCi0JCXJlZ2lzdGVyX2NvdW50MCA9ICh1MTYpIChhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4gLyAyKTsKKwkJcmVnaXN0ZXJfY291bnQwID0gKHUxNikgKGFjcGlfZ2JsX0ZBRFQuZ3BlMF9ibG9ja19sZW5ndGggLyAyKTsKIAogCQlncGVfbnVtYmVyX21heCA9CiAJCSAgICAocmVnaXN0ZXJfY291bnQwICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0gMTsKQEAgLTExMjEsOSArMTEyMyw5IEBACiAJCS8qIEluc3RhbGwgR1BFIEJsb2NrIDAgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2soYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlLAotCQkJCQkJICAmYWNwaV9nYmxfRkFEVC0+eGdwZTBfYmxrLAorCQkJCQkJICAmYWNwaV9nYmxfRkFEVC54Z3BlMF9ibG9jaywKIAkJCQkJCSAgcmVnaXN0ZXJfY291bnQwLCAwLAotCQkJCQkJICBhY3BpX2dibF9GQURULT5zY2lfaW50LAorCQkJCQkJICBhY3BpX2dibF9GQURULnNjaV9pbnRlcnJ1cHQsCiAJCQkJCQkgICZhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMF0pOwogCiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtMTEzMiwyMCArMTEzNCwyMSBAQAogCQl9CiAJfQogCi0JaWYgKGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiAmJiBhY3BpX2dibF9GQURULT54Z3BlMV9ibGsuYWRkcmVzcykgeworCWlmIChhY3BpX2dibF9GQURULmdwZTFfYmxvY2tfbGVuZ3RoICYmCisJICAgIGFjcGlfZ2JsX0ZBRFQueGdwZTFfYmxvY2suYWRkcmVzcykgewogCiAJCS8qIEdQRSBibG9jayAxIGV4aXN0cyAoaGFzIGJvdGggbGVuZ3RoIGFuZCBhZGRyZXNzID4gMCkgKi8KIAotCQlyZWdpc3Rlcl9jb3VudDEgPSAodTE2KSAoYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuIC8gMik7CisJCXJlZ2lzdGVyX2NvdW50MSA9ICh1MTYpIChhY3BpX2dibF9GQURULmdwZTFfYmxvY2tfbGVuZ3RoIC8gMik7CiAKIAkJLyogQ2hlY2sgZm9yIEdQRTAvR1BFMSBvdmVybGFwIChpZiBib3RoIGJhbmtzIGV4aXN0KSAqLwogCiAJCWlmICgocmVnaXN0ZXJfY291bnQwKSAmJgotCQkgICAgKGdwZV9udW1iZXJfbWF4ID49IGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmFzZSkpIHsKKwkJICAgIChncGVfbnVtYmVyX21heCA+PSBhY3BpX2dibF9GQURULmdwZTFfYmFzZSkpIHsKIAkJCUFDUElfRVJST1IoKEFFX0lORk8sCiAJCQkJICAgICJHUEUwIGJsb2NrIChHUEUgMCB0byAlZCkgb3ZlcmxhcHMgdGhlIEdQRTEgYmxvY2sgKEdQRSAlZCB0byAlZCkgLSBJZ25vcmluZyBHUEUxIiwKLQkJCQkgICAgZ3BlX251bWJlcl9tYXgsIGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmFzZSwKLQkJCQkgICAgYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlICsKKwkJCQkgICAgZ3BlX251bWJlcl9tYXgsIGFjcGlfZ2JsX0ZBRFQuZ3BlMV9iYXNlLAorCQkJCSAgICBhY3BpX2dibF9GQURULmdwZTFfYmFzZSArCiAJCQkJICAgICgocmVnaXN0ZXJfY291bnQxICoKIAkJCQkgICAgICBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxKSkpOwogCkBAIC0xMTU3LDEwICsxMTYwLDExIEBACiAKIAkJCXN0YXR1cyA9CiAJCQkgICAgYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrKGFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSwKLQkJCQkJCSAgICAgJmFjcGlfZ2JsX0ZBRFQtPnhncGUxX2JsaywKKwkJCQkJCSAgICAgJmFjcGlfZ2JsX0ZBRFQueGdwZTFfYmxvY2ssCiAJCQkJCQkgICAgIHJlZ2lzdGVyX2NvdW50MSwKLQkJCQkJCSAgICAgYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlLAotCQkJCQkJICAgICBhY3BpX2dibF9GQURULT5zY2lfaW50LAorCQkJCQkJICAgICBhY3BpX2dibF9GQURULmdwZTFfYmFzZSwKKwkJCQkJCSAgICAgYWNwaV9nYmxfRkFEVC4KKwkJCQkJCSAgICAgc2NpX2ludGVycnVwdCwKIAkJCQkJCSAgICAgJmFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2NrcwogCQkJCQkJICAgICBbMV0pOwogCkBAIC0xMTczLDcgKzExNzcsNyBAQAogCQkJICogR1BFMCBhbmQgR1BFMSBkbyBub3QgaGF2ZSB0byBiZSBjb250aWd1b3VzIGluIHRoZSBHUEUgbnVtYmVyCiAJCQkgKiBzcGFjZS4gSG93ZXZlciwgR1BFMCBhbHdheXMgc3RhcnRzIGF0IEdQRSBudW1iZXIgemVyby4KIAkJCSAqLwotCQkJZ3BlX251bWJlcl9tYXggPSBhY3BpX2dibF9GQURULT5ncGUxX2Jhc2UgKworCQkJZ3BlX251bWJlcl9tYXggPSBhY3BpX2dibF9GQURULmdwZTFfYmFzZSArCiAJCQkgICAgKChyZWdpc3Rlcl9jb3VudDEgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCmluZGV4IGJmNjNlZGMuLjFiNzg0ZmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02MywxNCArNjMsMTggQEAKIH07CiAjZW5kaWYKIAorLyogUG9pbnRlciB0byBGQUNTIG5lZWRlZCBmb3IgdGhlIEdsb2JhbCBMb2NrICovCisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9mYWNzICpmYWNzID0gTlVMTDsKKwogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCiBzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X25vdGlmeV9kaXNwYXRjaCh2b2lkICpjb250ZXh0KTsKIAotc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQodm9pZCAqY29udGV4dCk7Ci0KIHN0YXRpYyB1MzIgYWNwaV9ldl9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQgKmNvbnRleHQpOwogCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9ldl9yZW1vdmVfZ2xvYmFsX2xvY2tfaGFuZGxlcih2b2lkKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pc19ub3RpZnlfb2JqZWN0CkBAIC0yODIsNDkgKzI4NiwxOSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZAotICoKLSAqIFBBUkFNRVRFUlM6ICBDb250ZXh0ICAgICAgICAgLSBGcm9tIHRocmVhZCBpbnRlcmZhY2UsIG5vdCB1c2VkCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogSW52b2tlZCBieSBTQ0kgaW50ZXJydXB0IGhhbmRsZXIgdXBvbiBhY3F1aXNpdGlvbiBvZiB0aGUKLSAqICAgICAgICAgICAgICBHbG9iYWwgTG9jay4gIFNpbXBseSBzaWduYWwgYWxsIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZwotICogICAgICAgICAgICAgIGZvciB0aGUgbG9jay4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRSBhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZCh2b2lkICpjb250ZXh0KQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCS8qIFNpZ25hbCB0aHJlYWRzIHRoYXQgYXJlIHdhaXRpbmcgZm9yIHRoZSBsb2NrICovCi0KLQlpZiAoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfdGhyZWFkX2NvdW50KSB7Ci0KLQkJLyogU2VuZCBzdWZmaWNpZW50IHVuaXRzIHRvIHRoZSBzZW1hcGhvcmUgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9vc19zaWduYWxfc2VtYXBob3JlKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSwKLQkJCQkJICAgICBhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJDb3VsZCBub3Qgc2lnbmFsIEdsb2JhbCBMb2NrIHNlbWFwaG9yZSIpKTsKLQkJfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9nbG9iYWxfbG9ja19oYW5kbGVyCiAgKgogICogUEFSQU1FVEVSUzogIENvbnRleHQgICAgICAgICAtIEZyb20gdGhyZWFkIGludGVyZmFjZSwgbm90IHVzZWQKICAqCi0gKiBSRVRVUk46ICAgICAgQUNQSV9JTlRFUlJVUFRfSEFORExFRCBvciBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRAorICogUkVUVVJOOiAgICAgIEFDUElfSU5URVJSVVBUX0hBTkRMRUQKICAqCiAgKiBERVNDUklQVElPTjogSW52b2tlZCBkaXJlY3RseSBmcm9tIHRoZSBTQ0kgaGFuZGxlciB3aGVuIGEgZ2xvYmFsIGxvY2sKLSAqICAgICAgICAgICAgICByZWxlYXNlIGludGVycnVwdCBvY2N1cnMuICBHcmFiIHRoZSBnbG9iYWwgbG9jayBhbmQgcXVldWUKLSAqICAgICAgICAgICAgICB0aGUgZ2xvYmFsIGxvY2sgdGhyZWFkIGZvciBleGVjdXRpb24KKyAqICAgICAgICAgICAgICByZWxlYXNlIGludGVycnVwdCBvY2N1cnMuIEF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgZ2xvYmFsIGxvY2ssCisgKiAgICAgICAgICAgICAgaWYgc3VjY2Vzc2Z1bCwgc2lnbmFsIHRoZSB0aHJlYWQgd2FpdGluZyBmb3IgdGhlIGxvY2suCisgKgorICogTk9URTogQXNzdW1lcyB0aGF0IHRoZSBzZW1hcGhvcmUgY2FuIGJlIHNpZ25hbGVkIGZyb20gaW50ZXJydXB0IGxldmVsLiBJZgorICogdGhpcyBpcyBub3QgcG9zc2libGUgZm9yIHNvbWUgcmVhc29uLCBhIHNlcGFyYXRlIHRocmVhZCB3aWxsIGhhdmUgdG8gYmUKKyAqIHNjaGVkdWxlZCB0byBkbyB0aGlzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTMzMywxNiArMzA3LDI0IEBACiAJdTggYWNxdWlyZWQgPSBGQUxTRTsKIAogCS8qCi0JICogQXR0ZW1wdCB0byBnZXQgdGhlIGxvY2sKKwkgKiBBdHRlbXB0IHRvIGdldCB0aGUgbG9jay4KKwkgKgogCSAqIElmIHdlIGRvbid0IGdldCBpdCBub3csIGl0IHdpbGwgYmUgbWFya2VkIHBlbmRpbmcgYW5kIHdlIHdpbGwKIAkgKiB0YWtlIGFub3RoZXIgaW50ZXJydXB0IHdoZW4gaXQgYmVjb21lcyBmcmVlLgogCSAqLwotCUFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhhY3BpX2dibF9jb21tb25fZkFDUy5nbG9iYWxfbG9jaywgYWNxdWlyZWQpOworCUFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhmYWNzLCBhY3F1aXJlZCk7CiAJaWYgKGFjcXVpcmVkKSB7CiAKIAkJLyogR290IHRoZSBsb2NrLCBub3cgd2FrZSBhbGwgdGhyZWFkcyB3YWl0aW5nIGZvciBpdCAqLworCiAJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkID0gVFJVRTsKLQkJYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQoY29udGV4dCk7CisJCS8qIFNlbmQgYSB1bml0IHRvIHRoZSBzZW1hcGhvcmUgKi8KKworCQlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSgKKwkJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSwgMSkpKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiQ291bGQgbm90IHNpZ25hbCBHbG9iYWwgTG9jayBzZW1hcGhvcmUiKSk7CisJCX0KIAl9CiAKIAlyZXR1cm4gKEFDUElfSU5URVJSVVBUX0hBTkRMRUQpOwpAQCAtMzY2LDYgKzM0OCwxMyBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIpOwogCisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgoQUNQSV9UQUJMRV9JTkRFWF9GQUNTLAorCQkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKSZmYWNzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCiAJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCA9IFRSVUU7CiAJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIoQUNQSV9FVkVOVF9HTE9CQUwsCiAJCQkJCQkgIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlciwKQEAgLTM4OSw2ICszNzgsMzEgQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9yZW1vdmVfZ2xvYmFsX2xvY2tfaGFuZGxlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZW1vdmUgdGhlIGhhbmRsZXIgZm9yIHRoZSBHbG9iYWwgTG9jaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2V2X3JlbW92ZV9nbG9iYWxfbG9ja19oYW5kbGVyKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9yZW1vdmVfZ2xvYmFsX2xvY2tfaGFuZGxlcik7CisKKwlhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50ID0gRkFMU0U7CisJc3RhdHVzID0gYWNwaV9yZW1vdmVfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX0dMT0JBTCwKKwkJCQkJCSBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIpOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9hY3F1aXJlX2dsb2JhbF9sb2NrCkBAIC0zOTksNiArNDEzLDE2IEBACiAgKgogICogREVTQ1JJUFRJT046IEF0dGVtcHQgdG8gZ2FpbiBvd25lcnNoaXAgb2YgdGhlIEdsb2JhbCBMb2NrLgogICoKKyAqIE1VVEVYOiAgICAgICBJbnRlcnByZXRlciBtdXN0IGJlIGxvY2tlZAorICoKKyAqIE5vdGU6IFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBhbGxvd2VkIG11bHRpcGxlIHRocmVhZHMgdG8gImFjcXVpcmUiIHRoZQorICogR2xvYmFsIExvY2ssIGFuZCB0aGUgT1Mgd291bGQgaG9sZCB0aGUgbG9jayB1bnRpbCB0aGUgbGFzdCB0aHJlYWQgaGFkCisgKiByZWxlYXNlZCBpdC4gSG93ZXZlciwgdGhpcyBjb3VsZCBwb3RlbnRpYWxseSBzdGFydmUgdGhlIEJJT1Mgb3V0IG9mIHRoZQorICogbG9jaywgZXNwZWNpYWxseSBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBhIHRpZ2h0IGhhbmRzaGFrZSBiZXR3ZWVuIHRoZQorICogRW1iZWRkZWQgQ29udHJvbGxlciBkcml2ZXIgYW5kIHRoZSBCSU9TLiBUaGVyZWZvcmUsIHRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGFsbG93cyBvbmx5IG9uZSB0aHJlYWQgdG8gYWNxdWlyZSB0aGUgSFcgR2xvYmFsIExvY2sgYXQgYSB0aW1lLCBhbmQgbWFrZXMKKyAqIHRoZSBnbG9iYWwgbG9jayBhcHBlYXIgYXMgYSBzdGFuZGFyZCBtdXRleCBvbiB0aGUgT1Mgc2lkZS4KKyAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzIGFjcGlfZXZfYWNxdWlyZV9nbG9iYWxfbG9jayh1MTYgdGltZW91dCkKQEAgLTQwOCw1MyArNDMyLDUxIEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2FjcXVpcmVfZ2xvYmFsX2xvY2spOwogCi0jaWZuZGVmIEFDUElfQVBQTElDQVRJT04KLQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEgZ2xvYmFsIGxvY2sgKi8KLQotCWlmICghYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fR0xPQkFMX0xPQ0spOworCS8qCisJICogT25seSBvbmUgdGhyZWFkIGNhbiBhY3F1aXJlIHRoZSBHTCBhdCBhIHRpbWUsIHRoZSBnbG9iYWxfbG9ja19tdXRleAorCSAqIGVuZm9yY2VzIHRoaXMuIFRoaXMgaW50ZXJmYWNlIHJlbGVhc2VzIHRoZSBpbnRlcnByZXRlciBpZiB3ZSBtdXN0IHdhaXQuCisJICovCisJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9tdXRleChhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCwgdGltZW91dCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KLSNlbmRpZgotCi0JLyogT25lIG1vcmUgdGhyZWFkIHdhbnRzIHRoZSBnbG9iYWwgbG9jayAqLwotCi0JYWNwaV9nYmxfZ2xvYmFsX2xvY2tfdGhyZWFkX2NvdW50Kys7CiAKIAkvKgotCSAqIElmIHdlIChPUyBzaWRlIHZzLiBCSU9TIHNpZGUpIGhhdmUgdGhlIGhhcmR3YXJlIGxvY2sgYWxyZWFkeSwKLQkgKiB3ZSBhcmUgZG9uZQorCSAqIE1ha2Ugc3VyZSB0aGF0IGEgZ2xvYmFsIGxvY2sgYWN0dWFsbHkgZXhpc3RzLiBJZiBub3QsIGp1c3QgdHJlYXQKKwkgKiB0aGUgbG9jayBhcyBhIHN0YW5kYXJkIG11dGV4LgogCSAqLwotCWlmIChhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCkgeworCWlmICghYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCkgeworCQlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IFRSVUU7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCi0JLyogV2UgbXVzdCBhY3F1aXJlIHRoZSBhY3R1YWwgaGFyZHdhcmUgbG9jayAqLworCS8qIEF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgYWN0dWFsIGhhcmR3YXJlIGxvY2sgKi8KIAotCUFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhhY3BpX2dibF9jb21tb25fZkFDUy5nbG9iYWxfbG9jaywgYWNxdWlyZWQpOworCUFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhmYWNzLCBhY3F1aXJlZCk7CiAJaWYgKGFjcXVpcmVkKSB7CiAKIAkJLyogV2UgZ290IHRoZSBsb2NrICovCiAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIkFjcXVpcmVkIHRoZSBIVyBHbG9iYWwgTG9ja1xuIikpOworCQkJCSAgIkFjcXVpcmVkIGhhcmR3YXJlIEdsb2JhbCBMb2NrXG4iKSk7CiAKIAkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfYWNxdWlyZWQgPSBUUlVFOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAogCS8qCi0JICogRGlkIG5vdCBnZXQgdGhlIGxvY2suICBUaGUgcGVuZGluZyBiaXQgd2FzIHNldCBhYm92ZSwgYW5kIHdlIG11c3Qgbm93CisJICogRGlkIG5vdCBnZXQgdGhlIGxvY2suIFRoZSBwZW5kaW5nIGJpdCB3YXMgc2V0IGFib3ZlLCBhbmQgd2UgbXVzdCBub3cKIAkgKiB3YWl0IHVudGlsIHdlIGdldCB0aGUgZ2xvYmFsIGxvY2sgcmVsZWFzZWQgaW50ZXJydXB0LgogCSAqLwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIldhaXRpbmcgZm9yIHRoZSBIVyBHbG9iYWwgTG9ja1xuIikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIldhaXRpbmcgZm9yIGhhcmR3YXJlIEdsb2JhbCBMb2NrXG4iKSk7CiAKIAkvKgotCSAqIEFjcXVpcmUgdGhlIGdsb2JhbCBsb2NrIHNlbWFwaG9yZSBmaXJzdC4KLQkgKiBTaW5jZSB0aGlzIHdhaXQgd2lsbCBibG9jaywgd2UgbXVzdCByZWxlYXNlIHRoZSBpbnRlcnByZXRlcgorCSAqIFdhaXQgZm9yIGhhbmRzaGFrZSB3aXRoIHRoZSBnbG9iYWwgbG9jayBpbnRlcnJ1cHQgaGFuZGxlci4KKwkgKiBUaGlzIGludGVyZmFjZSByZWxlYXNlcyB0aGUgaW50ZXJwcmV0ZXIgaWYgd2UgbXVzdCB3YWl0LgogCSAqLwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSwKLQkJCQkJICB0aW1lb3V0KTsKKwlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZShhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUsCisJCQkJCSAgICAgICBBQ1BJX1dBSVRfRk9SRVZFUik7CisKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIApAQCAtNDc3LDM4ICs0OTksMzkgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfcmVsZWFzZV9nbG9iYWxfbG9jayk7CiAKLQlpZiAoIWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCkgeworCS8qIExvY2sgbXVzdCBiZSBhbHJlYWR5IGFjcXVpcmVkICovCisKKwlpZiAoIWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkKSB7CiAJCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCSAgICAgICJDYW5ub3QgcmVsZWFzZSBIVyBHbG9iYWwgTG9jaywgaXQgaGFzIG5vdCBiZWVuIGFjcXVpcmVkIikpOworCQkJICAgICAgIkNhbm5vdCByZWxlYXNlIHRoZSBBQ1BJIEdsb2JhbCBMb2NrLCBpdCBoYXMgbm90IGJlZW4gYWNxdWlyZWQiKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfQUNRVUlSRUQpOwogCX0KIAotCS8qIE9uZSBmZXdlciB0aHJlYWQgaGFzIHRoZSBnbG9iYWwgbG9jayAqLworCWlmIChhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50KSB7CiAKLQlhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQtLTsKLQlpZiAoYWNwaV9nYmxfZ2xvYmFsX2xvY2tfdGhyZWFkX2NvdW50KSB7CisJCS8qIEFsbG93IGFueSB0aHJlYWQgdG8gcmVsZWFzZSB0aGUgbG9jayAqLwogCi0JCS8qIFRoZXJlIGFyZSBzdGlsbCBzb21lIHRocmVhZHMgaG9sZGluZyB0aGUgbG9jaywgY2Fubm90IHJlbGVhc2UgKi8KKwkJQUNQSV9SRUxFQVNFX0dMT0JBTF9MT0NLKGZhY3MsIHBlbmRpbmcpOwogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCS8qCisJCSAqIElmIHRoZSBwZW5kaW5nIGJpdCB3YXMgc2V0LCB3ZSBtdXN0IHdyaXRlIEdCTF9STFMgdG8gdGhlIGNvbnRyb2wKKwkJICogcmVnaXN0ZXIKKwkJICovCisJCWlmIChwZW5kaW5nKSB7CisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0dMT0JBTF9MT0NLX1JFTEVBU0UsCisJCQkJCSAgICAgIDEpOworCQl9CisKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAorCQkJCSAgIlJlbGVhc2VkIGhhcmR3YXJlIEdsb2JhbCBMb2NrXG4iKSk7CiAJfQogCi0JLyoKLQkgKiBObyBtb3JlIHRocmVhZHMgaG9sZGluZyBsb2NrLCB3ZSBjYW4gZG8gdGhlIGFjdHVhbCBoYXJkd2FyZQotCSAqIHJlbGVhc2UKLQkgKi8KLQlBQ1BJX1JFTEVBU0VfR0xPQkFMX0xPQ0soYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZ2xvYmFsX2xvY2ssIHBlbmRpbmcpOwogCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2FjcXVpcmVkID0gRkFMU0U7CiAKLQkvKgotCSAqIElmIHRoZSBwZW5kaW5nIGJpdCB3YXMgc2V0LCB3ZSBtdXN0IHdyaXRlIEdCTF9STFMgdG8gdGhlIGNvbnRyb2wKLQkgKiByZWdpc3RlcgotCSAqLwotCWlmIChwZW5kaW5nKSB7Ci0JCXN0YXR1cyA9IGFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0dMT0JBTF9MT0NLX1JFTEVBU0UsCi0JCQkJCSAgIDEsIEFDUElfTVRYX0xPQ0spOwotCX0KKwkvKiBSZWxlYXNlIHRoZSBsb2NhbCBHTCBtdXRleCAqLwogCisJYWNwaV9vc19yZWxlYXNlX211dGV4KGFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4KTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIApAQCAtNTU4LDYgKzU4MSwxMiBAQAogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgcmVtb3ZlIFNDSSBoYW5kbGVyIikpOwogCQl9CisKKwkJc3RhdHVzID0gYWNwaV9ldl9yZW1vdmVfZ2xvYmFsX2xvY2tfaGFuZGxlcigpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJDb3VsZCBub3QgcmVtb3ZlIEdsb2JhbCBMb2NrIGhhbmRsZXIiKSk7CisJCX0KIAl9CiAKIAkvKiBEZWFsbG9jYXRlIGFsbCBoYW5kbGVyIG9iamVjdHMgaW5zdGFsbGVkIHdpdGhpbiBHUEUgaW5mbyBzdHJ1Y3RzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmVnaW9uLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmVnaW9uLmMKaW5kZXggMjFjYWFlMC4uZTk5ZjBjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTI5MSw3ICsyOTEsNiBAQAogCQkJICAgICAgIHUzMiBiaXRfd2lkdGgsIGFjcGlfaW50ZWdlciAqIHZhbHVlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX3N0YXR1cyBzdGF0dXMyOwogCWFjcGlfYWRyX3NwYWNlX2hhbmRsZXIgaGFuZGxlcjsKIAlhY3BpX2Fkcl9zcGFjZV9zZXR1cCByZWdpb25fc2V0dXA7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaGFuZGxlcl9kZXNjOwpAQCAtMzQ1LDcgKzM0NCw3IEBACiAJCSAqIHNldHVwIHdpbGwgcG90ZW50aWFsbHkgZXhlY3V0ZSBjb250cm9sIG1ldGhvZHMKIAkJICogKGUuZy4sIF9SRUcgbWV0aG9kIGZvciB0aGlzIHJlZ2lvbikKIAkJICovCi0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOworCQlhY3BpX2V4X3JlbGlucXVpc2hfaW50ZXJwcmV0ZXIoKTsKIAogCQlzdGF0dXMgPSByZWdpb25fc2V0dXAocmVnaW9uX29iaiwgQUNQSV9SRUdJT05fQUNUSVZBVEUsCiAJCQkJICAgICAgaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLmNvbnRleHQsCkBAIC0zNTMsMTAgKzM1Miw3IEBACiAKIAkJLyogUmUtZW50ZXIgdGhlIGludGVycHJldGVyICovCiAKLQkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwotCQl9CisJCWFjcGlfZXhfcmVhY3F1aXJlX2ludGVycHJldGVyKCk7CiAKIAkJLyogQ2hlY2sgZm9yIGZhaWx1cmUgb2YgdGhlIFJlZ2lvbiBTZXR1cCAqLwogCkBAIC00MDksNyArNDA1LDcgQEAKIAkJICogZXhpdCB0aGUgaW50ZXJwcmV0ZXIgYmVjYXVzZSB0aGUgaGFuZGxlciAqbWlnaHQqIGJsb2NrIC0tIHdlIGRvbid0CiAJCSAqIGtub3cgd2hhdCBpdCB3aWxsIGRvLCBzbyB3ZSBjYW4ndCBob2xkIHRoZSBsb2NrIG9uIHRoZSBpbnRlcHJldGVyLgogCQkgKi8KLQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CisJCWFjcGlfZXhfcmVsaW5xdWlzaF9pbnRlcnByZXRlcigpOwogCX0KIAogCS8qIENhbGwgdGhlIGhhbmRsZXIgKi8KQEAgLTQzMCwxMCArNDI2LDcgQEAKIAkJICogV2UganVzdCByZXR1cm5lZCBmcm9tIGEgbm9uLWRlZmF1bHQgaGFuZGxlciwgd2UgbXVzdCByZS1lbnRlciB0aGUKIAkJICogaW50ZXJwcmV0ZXIKIAkJICovCi0JCXN0YXR1czIgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKLQkJfQorCQlhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcigpOwogCX0KIAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCmluZGV4IDIwM2QxMzUuLmE0ZmE3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00OCw2ICs0OCwxMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCiBBQ1BJX01PRFVMRV9OQU1FKCJldnJnbmluaSIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyB1OCBhY3BpX2V2X21hdGNoX3BjaV9yb290X2JyaWRnZShjaGFyICppZCk7CisKK3N0YXRpYyB1OCBhY3BpX2V2X2lzX3BjaV9yb290X2JyaWRnZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAKQEAgLTYyLDYgKzY3LDcgQEAKICAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIHN5c3RlbV9tZW1vcnkgb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIGFjcGlfc3RhdHVzCiBhY3BpX2V2X3N5c3RlbV9tZW1vcnlfcmVnaW9uX3NldHVwKGFjcGlfaGFuZGxlIGhhbmRsZSwKIAkJCQkgICB1MzIgZnVuY3Rpb24sCkBAIC0xNjgsOSArMTc0LDkgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBjaV9yb290X25vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBjaV9kZXZpY2Vfbm9kZTsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqID0KIAkgICAgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiloYW5kbGU7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX2lkIG9iamVjdF9oSUQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3BjaV9jb25maWdfcmVnaW9uX3NldHVwKTsKIApAQCAtMjE1LDQ1ICsyMjEsMzAgQEAKIAogCQlwY2lfcm9vdF9ub2RlID0gcGFyZW50X25vZGU7CiAJCXdoaWxlIChwY2lfcm9vdF9ub2RlICE9IGFjcGlfZ2JsX3Jvb3Rfbm9kZSkgewotCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3V0X2V4ZWN1dGVfSElEKHBjaV9yb290X25vZGUsICZvYmplY3RfaElEKTsKLQkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJCS8qCi0JCQkJICogR290IGEgdmFsaWQgX0hJRCBzdHJpbmcsIGNoZWNrIGlmIHRoaXMgaXMgYSBQQ0kgcm9vdC4KLQkJCQkgKiBOZXcgZm9yIEFDUEkgMy4wOiBjaGVjayBmb3IgYSBQQ0kgRXhwcmVzcyByb290IGFsc28uCi0JCQkJICovCi0JCQkJaWYgKCEKLQkJCQkgICAgKEFDUElfU1RSTkNNUAotCQkJCSAgICAgKG9iamVjdF9oSUQudmFsdWUsIFBDSV9ST09UX0hJRF9TVFJJTkcsCi0JCQkJICAgICAgc2l6ZW9mKFBDSV9ST09UX0hJRF9TVFJJTkcpKSkKLQkJCQkgICAgfHwKLQkJCQkgICAgIShBQ1BJX1NUUk5DTVAKLQkJCQkgICAgICAob2JqZWN0X2hJRC52YWx1ZSwKLQkJCQkgICAgICAgUENJX0VYUFJFU1NfUk9PVF9ISURfU1RSSU5HLAotCQkJCSAgICAgICBzaXplb2YoUENJX0VYUFJFU1NfUk9PVF9ISURfU1RSSU5HKSkpKSB7CiAKLQkJCQkJLyogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoaXMgUENJIHJvb3QgYnJpZGdlICovCisJCQkvKiBHZXQgdGhlIF9ISUQvX0NJRCBpbiBvcmRlciB0byBkZXRlY3QgYSByb290X2JyaWRnZSAqLwogCi0JCQkJCXN0YXR1cyA9Ci0JCQkJCSAgICBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKChhY3BpX2hhbmRsZSkgcGNpX3Jvb3Rfbm9kZSwgQUNQSV9BRFJfU1BBQ0VfUENJX0NPTkZJRywgQUNQSV9ERUZBVUxUX0hBTkRMRVIsIE5VTEwsIE5VTEwpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJCWlmIChzdGF0dXMgPT0gQUVfU0FNRV9IQU5ETEVSKSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBJdCBpcyBPSyBpZiB0aGUgaGFuZGxlciBpcyBhbHJlYWR5IGluc3RhbGxlZCBvbiB0aGUgcm9vdAotCQkJCQkJCSAqIGJyaWRnZS4gIFN0aWxsIG5lZWQgdG8gcmV0dXJuIGEgY29udGV4dCBvYmplY3QgZm9yIHRoZQotCQkJCQkJCSAqIG5ldyBQQ0lfQ29uZmlnIG9wZXJhdGlvbiByZWdpb24sIGhvd2V2ZXIuCi0JCQkJCQkJICovCi0JCQkJCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLAotCQkJCQkJCQkJc3RhdHVzLAotCQkJCQkJCQkJIkNvdWxkIG5vdCBpbnN0YWxsIFBjaUNvbmZpZyBoYW5kbGVyIGZvciBSb290IEJyaWRnZSAlNC40cyIsCi0JCQkJCQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUKLQkJCQkJCQkJCShwY2lfcm9vdF9ub2RlKSkpOwotCQkJCQkJfQorCQkJaWYgKGFjcGlfZXZfaXNfcGNpX3Jvb3RfYnJpZGdlKHBjaV9yb290X25vZGUpKSB7CisKKwkJCQkvKiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgdGhpcyBQQ0kgcm9vdCBicmlkZ2UgKi8KKworCQkJCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoKGFjcGlfaGFuZGxlKSBwY2lfcm9vdF9ub2RlLCBBQ1BJX0FEUl9TUEFDRV9QQ0lfQ09ORklHLCBBQ1BJX0RFRkFVTFRfSEFORExFUiwgTlVMTCwgTlVMTCk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCWlmIChzdGF0dXMgPT0gQUVfU0FNRV9IQU5ETEVSKSB7CisJCQkJCQkvKgorCQkJCQkJICogSXQgaXMgT0sgaWYgdGhlIGhhbmRsZXIgaXMgYWxyZWFkeSBpbnN0YWxsZWQgb24gdGhlIHJvb3QKKwkJCQkJCSAqIGJyaWRnZS4gIFN0aWxsIG5lZWQgdG8gcmV0dXJuIGEgY29udGV4dCBvYmplY3QgZm9yIHRoZQorCQkJCQkJICogbmV3IFBDSV9Db25maWcgb3BlcmF0aW9uIHJlZ2lvbiwgaG93ZXZlci4KKwkJCQkJCSAqLworCQkJCQkJc3RhdHVzID0gQUVfT0s7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAorCQkJCQkJCQkiQ291bGQgbm90IGluc3RhbGwgUGNpQ29uZmlnIGhhbmRsZXIgZm9yIFJvb3QgQnJpZGdlICU0LjRzIiwKKwkJCQkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lCisJCQkJCQkJCShwY2lfcm9vdF9ub2RlKSkpOwogCQkJCQl9Ci0JCQkJCWJyZWFrOwogCQkJCX0KKwkJCQlicmVhazsKIAkJCX0KIAogCQkJcGNpX3Jvb3Rfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBjaV9yb290X25vZGUpOwpAQCAtMjgyLDE0ICsyNzMsMjUgQEAKIAkvKgogCSAqIEZvciBQQ0lfQ29uZmlnIHNwYWNlIGFjY2Vzcywgd2UgbmVlZCB0aGUgc2VnbWVudCwgYnVzLAogCSAqIGRldmljZSBhbmQgZnVuY3Rpb24gbnVtYmVycy4gIEFjcXVpcmUgdGhlbSBoZXJlLgorCSAqCisJICogRmluZCB0aGUgcGFyZW50IGRldmljZSBvYmplY3QuIChUaGlzIGFsbG93cyB0aGUgb3BlcmF0aW9uIHJlZ2lvbiB0byBiZQorCSAqIHdpdGhpbiBhIHN1YnNjb3BlIHVuZGVyIHRoZSBkZXZpY2UsIHN1Y2ggYXMgYSBjb250cm9sIG1ldGhvZC4pCiAJICovCisJcGNpX2RldmljZV9ub2RlID0gcmVnaW9uX29iai0+cmVnaW9uLm5vZGU7CisJd2hpbGUgKHBjaV9kZXZpY2Vfbm9kZSAmJiAocGNpX2RldmljZV9ub2RlLT50eXBlICE9IEFDUElfVFlQRV9ERVZJQ0UpKSB7CisJCXBjaV9kZXZpY2Vfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHBjaV9kZXZpY2Vfbm9kZSk7CisJfQorCisJaWYgKCFwY2lfZGV2aWNlX25vZGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCX0KIAogCS8qCiAJICogR2V0IHRoZSBQQ0kgZGV2aWNlIGFuZCBmdW5jdGlvbiBudW1iZXJzIGZyb20gdGhlIF9BRFIgb2JqZWN0CiAJICogY29udGFpbmVkIGluIHRoZSBwYXJlbnQncyBzY29wZS4KIAkgKi8KIAlzdGF0dXMgPQotCSAgICBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0KE1FVEhPRF9OQU1FX19BRFIsIHBhcmVudF9ub2RlLAorCSAgICBhY3BpX3V0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0KE1FVEhPRF9OQU1FX19BRFIsIHBjaV9kZXZpY2Vfbm9kZSwKIAkJCQkJICAgICZwY2lfdmFsdWUpOwogCiAJLyoKQEAgLTMyOSw2ICszMzEsOTEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9tYXRjaF9wY2lfcm9vdF9icmlkZ2UKKyAqCisgKiBQQVJBTUVURVJTOiAgSWQgICAgICAgICAgICAgIC0gVGhlIEhJRC9DSUQgaW4gc3RyaW5nIGZvcm1hdAorICoKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIHRoZSBJZCBpcyBhIG1hdGNoIGZvciBhIFBDSS9QQ0ktRXhwcmVzcyBSb290IEJyaWRnZQorICoKKyAqIERFU0NSSVBUSU9OOiBEZXRlcm1pbmUgaWYgdGhlIGlucHV0IElEIGlzIGEgUENJIFJvb3QgQnJpZGdlIElELgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1OCBhY3BpX2V2X21hdGNoX3BjaV9yb290X2JyaWRnZShjaGFyICppZCkKK3sKKworCS8qCisJICogQ2hlY2sgaWYgdGhpcyBpcyBhIFBDSSByb290LgorCSAqIEFDUEkgMy4wKzogY2hlY2sgZm9yIGEgUENJIEV4cHJlc3Mgcm9vdCBhbHNvLgorCSAqLworCWlmICghKEFDUElfU1RSTkNNUChpZCwKKwkJCSAgIFBDSV9ST09UX0hJRF9TVFJJTkcsCisJCQkgICBzaXplb2YoUENJX1JPT1RfSElEX1NUUklORykpKSB8fAorCSAgICAhKEFDUElfU1RSTkNNUChpZCwKKwkJCSAgIFBDSV9FWFBSRVNTX1JPT1RfSElEX1NUUklORywKKwkJCSAgIHNpemVvZihQQ0lfRVhQUkVTU19ST09UX0hJRF9TVFJJTkcpKSkpIHsKKwkJcmV0dXJuIChUUlVFKTsKKwl9CisKKwlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9ldl9pc19wY2lfcm9vdF9icmlkZ2UKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gRGV2aWNlIG5vZGUgYmVpbmcgZXhhbWluZWQKKyAqCisgKiBSRVRVUk46ICAgICAgVFJVRSBpZiBkZXZpY2UgaXMgYSBQQ0kvUENJLUV4cHJlc3MgUm9vdCBCcmlkZ2UKKyAqCisgKiBERVNDUklQVElPTjogRGV0ZXJtaW5lIGlmIHRoZSBpbnB1dCBkZXZpY2UgcmVwcmVzZW50cyBhIFBDSSBSb290IEJyaWRnZSBieQorICogICAgICAgICAgICAgIGV4YW1pbmluZyB0aGUgX0hJRCBhbmQgX0NJRCBmb3IgdGhlIGRldmljZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdTggYWNwaV9ldl9pc19wY2lfcm9vdF9icmlkZ2Uoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2RldmljZV9pZCBoaWQ7CisJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWQ7CisJYWNwaV9uYXRpdmVfdWludCBpOworCisJLyoKKwkgKiBHZXQgdGhlIF9ISUQgYW5kIGNoZWNrIGZvciBhIFBDSSBSb290IEJyaWRnZQorCSAqLworCXN0YXR1cyA9IGFjcGlfdXRfZXhlY3V0ZV9ISUQobm9kZSwgJmhpZCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoRkFMU0UpOworCX0KKworCWlmIChhY3BpX2V2X21hdGNoX3BjaV9yb290X2JyaWRnZShoaWQudmFsdWUpKSB7CisJCXJldHVybiAoVFJVRSk7CisJfQorCisJLyoKKwkgKiBUaGUgX0hJRCBkaWQgbm90IG1hdGNoLgorCSAqIEdldCB0aGUgX0NJRCBhbmQgY2hlY2sgZm9yIGEgUENJIFJvb3QgQnJpZGdlCisJICovCisJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0NJRChub2RlLCAmY2lkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJLyogQ2hlY2sgYWxsIF9DSURzIGluIHRoZSByZXR1cm5lZCBsaXN0ICovCisKKwlmb3IgKGkgPSAwOyBpIDwgY2lkLT5jb3VudDsgaSsrKSB7CisJCWlmIChhY3BpX2V2X21hdGNoX3BjaV9yb290X2JyaWRnZShjaWQtPmlkW2ldLnZhbHVlKSkgeworCQkJQUNQSV9GUkVFKGNpZCk7CisJCQlyZXR1cm4gKFRSVUUpOworCQl9CisJfQorCisJQUNQSV9GUkVFKGNpZCk7CisJcmV0dXJuIChGQUxTRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfcGNpX2Jhcl9yZWdpb25fc2V0dXAKICAqCiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIFJlZ2lvbiB3ZSBhcmUgaW50ZXJlc3RlZCBpbgpAQCAtNDMyLDYgKzUxOSw5IEBACiAgKiAgICAgICAgICAgICAgYSBQQ0kgYWRkcmVzcyBpbiB0aGUgc2NvcGUgb2YgdGhlIGRlZmluaXRpb24uICBUaGlzIGFkZHJlc3MgaXMKICAqICAgICAgICAgICAgICByZXF1aXJlZCB0byBwZXJmb3JtIGFuIGFjY2VzcyB0byBQQ0kgY29uZmlnIHNwYWNlLgogICoKKyAqIE1VVEVYOiAgICAgICBJbnRlcnByZXRlciBzaG91bGQgYmUgdW5sb2NrZWQsIGJlY2F1c2Ugd2UgbWF5IHJ1biB0aGUgX1JFRworICogICAgICAgICAgICAgIG1ldGhvZCBmb3IgdGhpcyByZWdpb24uCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYwppbmRleCA4MTA2MjE1Li43ZTVkMTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTE0Miw5ICsxNDIsMTAgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5zdGFsbF9zY2lfaGFuZGxlcik7CiAKLQlzdGF0dXMgPSBhY3BpX29zX2luc3RhbGxfaW50ZXJydXB0X2hhbmRsZXIoKHUzMikgYWNwaV9nYmxfRkFEVC0+c2NpX2ludCwKLQkJCQkJCSAgIGFjcGlfZXZfc2NpX3hydXB0X2hhbmRsZXIsCi0JCQkJCQkgICBhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX2luc3RhbGxfaW50ZXJydXB0X2hhbmRsZXIoKHUzMikgYWNwaV9nYmxfRkFEVC5zY2lfaW50ZXJydXB0LAorCQkJCQkgICAgICBhY3BpX2V2X3NjaV94cnVwdF9oYW5kbGVyLAorCQkJCQkgICAgICBhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIApAQCAtMTc1LDggKzE3Niw5IEBACiAKIAkvKiBKdXN0IGxldCB0aGUgT1MgcmVtb3ZlIHRoZSBoYW5kbGVyIGFuZCBkaXNhYmxlIHRoZSBsZXZlbCAqLwogCi0Jc3RhdHVzID0gYWNwaV9vc19yZW1vdmVfaW50ZXJydXB0X2hhbmRsZXIoKHUzMikgYWNwaV9nYmxfRkFEVC0+c2NpX2ludCwKLQkJCQkJCSAgYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlcik7CisJc3RhdHVzID0KKwkgICAgYWNwaV9vc19yZW1vdmVfaW50ZXJydXB0X2hhbmRsZXIoKHUzMikgYWNwaV9nYmxfRkFEVC5zY2lfaW50ZXJydXB0LAorCQkJCQkgICAgIGFjcGlfZXZfc2NpX3hydXB0X2hhbmRsZXIpOwogCiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jCmluZGV4IDkyM2ZkMmIuLjY4NWExMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNzY4LDExICs3NjgsOSBAQAogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KKwkvKiBNdXN0IGxvY2sgaW50ZXJwcmV0ZXIgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgKi8KIAorCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKIAlzdGF0dXMgPSBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sodGltZW91dCk7CiAJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYwppbmRleCA3ZWJjMmVmLi4xNzA2NWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmZXZudC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CisjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKIEFDUElfTU9EVUxFX05BTUUoImV2eGZldm50IikKQEAgLTY1LDEzICs2NiwxNCBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2VuYWJsZSk7CiAKLQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgRkFEVCAqLworCS8qIEFDUEkgdGFibGVzIG11c3QgYmUgcHJlc2VudCAqLwogCi0JaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIk5vIEZBRFQgaW5mb3JtYXRpb24gcHJlc2VudCEiKSk7CisJaWYgKCFhY3BpX3RiX3RhYmxlc19sb2FkZWQoKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwogCX0KIAorCS8qIENoZWNrIGN1cnJlbnQgbW9kZSAqLworCiAJaWYgKGFjcGlfaHdfZ2V0X21vZGUoKSA9PSBBQ1BJX1NZU19NT0RFX0FDUEkpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULAogCQkJCSAgIlN5c3RlbSBpcyBhbHJlYWR5IGluIEFDUEkgbW9kZVxuIikpOwpAQCAtMTExLDExICsxMTMsNiBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2Rpc2FibGUpOwogCi0JaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIk5vIEZBRFQgaW5mb3JtYXRpb24gcHJlc2VudCEiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7Ci0JfQotCiAJaWYgKGFjcGlfaHdfZ2V0X21vZGUoKSA9PSBBQ1BJX1NZU19NT0RFX0xFR0FDWSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsCiAJCQkJICAiU3lzdGVtIGlzIGFscmVhZHkgaW4gbGVnYWN5IChub24tQUNQSSkgbW9kZVxuIikpOwpAQCAtMTY5LDcgKzE2Niw3IEBACiAJICovCiAJc3RhdHVzID0KIAkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCi0JCQkgICAgICBlbmFibGVfcmVnaXN0ZXJfaWQsIDEsIEFDUElfTVRYX0xPQ0spOworCQkJICAgICAgZW5hYmxlX3JlZ2lzdGVyX2lkLCAxKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQpAQCAtMTc4LDcgKzE3NSw3IEBACiAKIAlzdGF0dXMgPQogCSAgICBhY3BpX2dldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KLQkJCSAgICAgIGVuYWJsZV9yZWdpc3Rlcl9pZCwgJnZhbHVlLCBBQ1BJX01UWF9MT0NLKTsKKwkJCSAgICAgIGVuYWJsZV9yZWdpc3Rlcl9pZCwgJnZhbHVlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQpAQCAtMzY4LDE0ICszNjUsMTQgQEAKIAkgKi8KIAlzdGF0dXMgPQogCSAgICBhY3BpX3NldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KLQkJCSAgICAgIGVuYWJsZV9yZWdpc3Rlcl9pZCwgMCwgQUNQSV9NVFhfTE9DSyk7CisJCQkgICAgICBlbmFibGVfcmVnaXN0ZXJfaWQsIDApOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAlzdGF0dXMgPQogCSAgICBhY3BpX2dldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KLQkJCSAgICAgIGVuYWJsZV9yZWdpc3Rlcl9pZCwgJnZhbHVlLCBBQ1BJX01UWF9MT0NLKTsKKwkJCSAgICAgIGVuYWJsZV9yZWdpc3Rlcl9pZCwgJnZhbHVlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQpAQCAtNDIxLDcgKzQxOCw3IEBACiAJICovCiAJc3RhdHVzID0KIAkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tldmVudF0uCi0JCQkgICAgICBzdGF0dXNfcmVnaXN0ZXJfaWQsIDEsIEFDUElfTVRYX0xPQ0spOworCQkJICAgICAgc3RhdHVzX3JlZ2lzdGVyX2lkLCAxKTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpAQCAtNTEwLDcgKzUwNyw3IEBACiAKIAlzdGF0dXMgPQogCSAgICBhY3BpX2dldF9yZWdpc3RlcihhY3BpX2dibF9maXhlZF9ldmVudF9pbmZvW2V2ZW50XS4KLQkJCSAgICAgIHN0YXR1c19yZWdpc3Rlcl9pZCwgZXZlbnRfc3RhdHVzLCBBQ1BJX01UWF9MT0NLKTsKKwkJCSAgICAgIHN0YXR1c19yZWdpc3Rlcl9pZCwgZXZlbnRfc3RhdHVzKTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmcmVnbi5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmcmVnbi5jCmluZGV4IDgzYjEyYTkuLjdiZjA5YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZnJlZ24uYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZyZWduLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb25maWcuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbmZpZy5jCmluZGV4IGM4MzQxZmEuLjI1ODAyZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbmZpZy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbmZpZy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNTQsNyArNTQsNyBAQAogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCiBzdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfZXhfYWRkX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUsCithY3BpX2V4X2FkZF90YWJsZShhY3BpX25hdGl2ZV91aW50IHRhYmxlX2luZGV4LAogCQkgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSwKIAkJICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZGRiX2hhbmRsZSk7CiAKQEAgLTc0LDEyICs3NCwxMSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2FkZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlLAorYWNwaV9leF9hZGRfdGFibGUoYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleCwKIAkJICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGUsCiAJCSAgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmRkYl9oYW5kbGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfaW5mbzsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfYWRkX3RhYmxlKTsKQEAgLTk4LDQyICs5NywxNiBAQAogCiAJLyogSW5zdGFsbCB0aGUgbmV3IHRhYmxlIGludG8gdGhlIGxvY2FsIGRhdGEgc3RydWN0dXJlcyAqLwogCi0JQUNQSV9NRU1TRVQoJnRhYmxlX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7Ci0KLQl0YWJsZV9pbmZvLnR5cGUgPSBBQ1BJX1RBQkxFX0lEX1NTRFQ7Ci0JdGFibGVfaW5mby5wb2ludGVyID0gdGFibGU7Ci0JdGFibGVfaW5mby5sZW5ndGggPSAoYWNwaV9zaXplKSB0YWJsZS0+bGVuZ3RoOwotCXRhYmxlX2luZm8uYWxsb2NhdGlvbiA9IEFDUElfTUVNX0FMTE9DQVRFRDsKLQotCXN0YXR1cyA9IGFjcGlfdGJfaW5zdGFsbF90YWJsZSgmdGFibGVfaW5mbyk7Ci0Jb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QgPSB0YWJsZV9pbmZvLmluc3RhbGxlZF9kZXNjOwotCi0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWlmIChzdGF0dXMgPT0gQUVfQUxSRUFEWV9FWElTVFMpIHsKLQotCQkJLyogVGFibGUgYWxyZWFkeSBleGlzdHMsIGp1c3QgcmV0dXJuIHRoZSBoYW5kbGUgKi8KLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCQlnb3RvIGNsZWFudXA7Ci0JfQorCW9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0ID0gQUNQSV9DQVNUX1BUUih2b2lkLCB0YWJsZV9pbmRleCk7CiAKIAkvKiBBZGQgdGhlIHRhYmxlIHRvIHRoZSBuYW1lc3BhY2UgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF90YWJsZSh0YWJsZV9pbmZvLmluc3RhbGxlZF9kZXNjLCBwYXJlbnRfbm9kZSk7CisJc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlKHRhYmxlX2luZGV4LCBwYXJlbnRfbm9kZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0KLQkJLyogVW5pbnN0YWxsIHRhYmxlIG9uIGVycm9yICovCi0KLQkJKHZvaWQpYWNwaV90Yl91bmluc3RhbGxfdGFibGUodGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYyk7Ci0JCWdvdG8gY2xlYW51cDsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJKmRkYl9oYW5kbGUgPSBOVUxMOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0KLSAgICAgIGNsZWFudXA6Ci0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKLQkqZGRiX2hhbmRsZSA9IE5VTEw7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKQEAgLTE0Niw3ICsxMTksNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogTG9hZCBhbiBBQ1BJIHRhYmxlCisgKiBERVNDUklQVElPTjogTG9hZCBhbiBBQ1BJIHRhYmxlIGZyb20gdGhlIFJTRFQvWFNEVAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE1NiwzMyArMTI5LDIwIEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CisJYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleDsKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcGFyZW50X25vZGU7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGU7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmFtZXRlcl9ub2RlID0gTlVMTDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZGJfaGFuZGxlOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2xvYWRfdGFibGVfb3ApOwogCi0jaWYgMAotCS8qCi0JICogTWFrZSBzdXJlIHRoYXQgdGhlIHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaCBvbmUgb2YgdGhlIHRhYmxlcyB0aGF0Ci0JICogaXMgYWxyZWFkeSBsb2FkZWQuCi0JICovCi0Jc3RhdHVzID0gYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUob3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIsIE5VTEwpOwotCWlmIChzdGF0dXMgPT0gQUVfT0spIHsKLQotCQkvKiBTaWduYXR1cmUgbWF0Y2hlZCAtLSBkb24ndCBhbGxvdyBvdmVycmlkZSAqLwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTFJFQURZX0VYSVNUUyk7Ci0JfQotI2VuZGlmCi0KLQkvKiBGaW5kIHRoZSBBQ1BJIHRhYmxlICovCisJLyogRmluZCB0aGUgQUNQSSB0YWJsZSBpbiB0aGUgUlNEVC9YU0RUICovCiAKIAlzdGF0dXMgPSBhY3BpX3RiX2ZpbmRfdGFibGUob3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIsCiAJCQkJICAgIG9wZXJhbmRbMV0tPnN0cmluZy5wb2ludGVyLAotCQkJCSAgICBvcGVyYW5kWzJdLT5zdHJpbmcucG9pbnRlciwgJnRhYmxlKTsKKwkJCQkgICAgb3BlcmFuZFsyXS0+c3RyaW5nLnBvaW50ZXIsICZ0YWJsZV9pbmRleCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTI0NSw3ICsyMDUsNyBAQAogCiAJLyogTG9hZCB0aGUgdGFibGUgaW50byB0aGUgbmFtZXNwYWNlICovCiAKLQlzdGF0dXMgPSBhY3BpX2V4X2FkZF90YWJsZSh0YWJsZSwgcGFyZW50X25vZGUsICZkZGJfaGFuZGxlKTsKKwlzdGF0dXMgPSBhY3BpX2V4X2FkZF90YWJsZSh0YWJsZV9pbmRleCwgcGFyZW50X25vZGUsICZkZGJfaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQpAQCAtMjY2LDkgKzIyNiwxMyBAQAogCQl9CiAJfQogCi0JQUNQSV9JTkZPKChBRV9JTkZPLAotCQkgICAiRHluYW1pYyBPRU0gVGFibGUgTG9hZCAtIFslNC40c10gT2VtSWQgWyU2LjZzXSBPZW1UYWJsZUlkIFslOC44c10iLAotCQkgICB0YWJsZS0+c2lnbmF0dXJlLCB0YWJsZS0+b2VtX2lkLCB0YWJsZS0+b2VtX3RhYmxlX2lkKSk7CisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgodGFibGVfaW5kZXgsICZ0YWJsZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCUFDUElfSU5GTygoQUVfSU5GTywKKwkJCSAgICJEeW5hbWljIE9FTSBUYWJsZSBMb2FkIC0gWyU0LjRzXSBPZW1JZCBbJTYuNnNdIE9lbVRhYmxlSWQgWyU4LjhzXSIsCisJCQkgICB0YWJsZS0+c2lnbmF0dXJlLCB0YWJsZS0+b2VtX2lkLAorCQkJICAgdGFibGUtPm9lbV90YWJsZV9pZCkpOworCX0KIAogCSpyZXR1cm5fZGVzYyA9IGRkYl9oYW5kbGU7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CkBAIC0yNzgsNyArMjQyLDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9sb2FkX29wCiAgKgotICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFJlZ2lvbiBvciBGaWVsZCB3aGVyZSB0aGUgdGFibGUgd2lsbCBiZQorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFJlZ2lvbiBvciBCdWZmZXIvRmllbGQgd2hlcmUgdGhlIHRhYmxlIHdpbGwgYmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnRhaW5lZAogICogICAgICAgICAgICAgIFRhcmdldCAgICAgICAgICAtIFdoZXJlIGEgaGFuZGxlIHRvIHRoZSB0YWJsZSB3aWxsIGJlIHN0b3JlZAogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUKQEAgLTI4Nyw2ICsyNTEsMTIgQEAKICAqCiAgKiBERVNDUklQVElPTjogTG9hZCBhbiBBQ1BJIHRhYmxlIGZyb20gYSBmaWVsZCBvciBvcGVyYXRpb24gcmVnaW9uCiAgKgorICogTk9URTogUmVnaW9uIEZpZWxkcyAoRmllbGQsIGJhbmtfZmllbGQsIGluZGV4X2ZpZWxkcykgYXJlIHJlc29sdmVkIHRvIGJ1ZmZlcgorICogICAgICAgb2JqZWN0cyBiZWZvcmUgdGhpcyBjb2RlIGlzIHJlYWNoZWQuCisgKgorICogICAgICAgSWYgc291cmNlIGlzIGFuIG9wZXJhdGlvbiByZWdpb24sIGl0IG11c3QgcmVmZXIgdG8gc3lzdGVtX21lbW9yeSwgYXMKKyAqICAgICAgIHBlciB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCkBAIC0yOTQsMjIgKzI2NCwyNiBAQAogCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0YXJnZXQsCiAJCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmRkYl9oYW5kbGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYnVmZmVyX2Rlc2MgPSBOVUxMOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfcHRyID0gTlVMTDsKLQlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzczsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgdGFibGVfaGVhZGVyOwotCWFjcGlfaW50ZWdlciB0ZW1wOwotCXUzMiBpOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfZGVzYzsKKwlhY3BpX25hdGl2ZV91aW50IHRhYmxlX2luZGV4OworCWFjcGlfc3RhdHVzIHN0YXR1czsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfbG9hZF9vcCk7CiAKLQkvKiBPYmplY3QgY2FuIGJlIGVpdGhlciBhbiBvcF9yZWdpb24gb3IgYSBGaWVsZCAqLworCUFDUElfTUVNU0VUKCZ0YWJsZV9kZXNjLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOworCisJLyogU291cmNlIE9iamVjdCBjYW4gYmUgZWl0aGVyIGFuIG9wX3JlZ2lvbiBvciBhIEJ1ZmZlci9GaWVsZCAqLwogCiAJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9SRUdJT046CiAKKwkJLyogUmVnaW9uIG11c3QgYmUgc3lzdGVtX21lbW9yeSAoZnJvbSBBQ1BJIHNwZWMpICovCisKKwkJaWYgKG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOworCQl9CisKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiTG9hZCBmcm9tIFJlZ2lvbiAlcCAlc1xuIiwKIAkJCQkgIG9ial9kZXNjLAogCQkJCSAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShvYmpfZGVzYykpKTsKQEAgLTMyNSwxMTMgKzI5OSw0MSBAQAogCQkJfQogCQl9CiAKLQkJLyogR2V0IHRoZSBiYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHJlZ2lvbiAqLwotCi0JCWFkZHJlc3MgPSBvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3M7Ci0KLQkJLyogR2V0IHBhcnQgb2YgdGhlIHRhYmxlIGhlYWRlciB0byBnZXQgdGhlIHRhYmxlIGxlbmd0aCAqLwotCi0JCXRhYmxlX2hlYWRlci5sZW5ndGggPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaChvYmpfZGVzYywgQUNQSV9SRUFELAotCQkJCQkJCSAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkJCQkJICAgKGkgKyBhZGRyZXNzKSwgOCwKLQkJCQkJCQkgICAmdGVtcCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQotCQkJLyogR2V0IHRoZSBvbmUgdmFsaWQgYnl0ZSBvZiB0aGUgcmV0dXJuZWQgNjQtYml0IHZhbHVlICovCi0KLQkJCUFDUElfQ0FTVF9QVFIodTgsICZ0YWJsZV9oZWFkZXIpW2ldID0gKHU4KSB0ZW1wOwotCQl9Ci0KLQkJLyogU2FuaXR5IGNoZWNrIHRoZSB0YWJsZSBsZW5ndGggKi8KLQotCQlpZiAodGFibGVfaGVhZGVyLmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0hFQURFUik7Ci0JCX0KLQotCQkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGVudGlyZSB0YWJsZSAqLwotCi0JCXRhYmxlX3B0ciA9IEFDUElfQUxMT0NBVEUodGFibGVfaGVhZGVyLmxlbmd0aCk7Ci0JCWlmICghdGFibGVfcHRyKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQkJfQotCi0JCS8qIEdldCB0aGUgZW50aXJlIHRhYmxlIGZyb20gdGhlIG9wIHJlZ2lvbiAqLwotCi0JCWZvciAoaSA9IDA7IGkgPCB0YWJsZV9oZWFkZXIubGVuZ3RoOyBpKyspIHsKLQkJCXN0YXR1cyA9Ci0JCQkgICAgYWNwaV9ldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoKG9ial9kZXNjLCBBQ1BJX1JFQUQsCi0JCQkJCQkJICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkJCQkgICAoaSArIGFkZHJlc3MpLCA4LAotCQkJCQkJCSAgICZ0ZW1wKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCWdvdG8gY2xlYW51cDsKLQkJCX0KLQotCQkJLyogR2V0IHRoZSBvbmUgdmFsaWQgYnl0ZSBvZiB0aGUgcmV0dXJuZWQgNjQtYml0IHZhbHVlICovCi0KLQkJCUFDUElfQ0FTVF9QVFIodTgsIHRhYmxlX3B0cilbaV0gPSAodTgpIHRlbXA7Ci0JCX0KKwkJdGFibGVfZGVzYy5hZGRyZXNzID0gb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzOworCQl0YWJsZV9kZXNjLmxlbmd0aCA9IG9ial9kZXNjLT5yZWdpb24ubGVuZ3RoOworCQl0YWJsZV9kZXNjLmZsYWdzID0gQUNQSV9UQUJMRV9PUklHSU5fTUFQUEVEOwogCQlicmVhazsKIAotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFR0lPTl9GSUVMRDoKLQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgotCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgorCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoJLyogQnVmZmVyIG9yIHJlc29sdmVkIHJlZ2lvbl9maWVsZCAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkxvYWQgZnJvbSBGaWVsZCAlcCAlc1xuIiwKLQkJCQkgIG9ial9kZXNjLAorCQkvKiBTaW1wbHkgZXh0cmFjdCB0aGUgYnVmZmVyIGZyb20gdGhlIGJ1ZmZlciBvYmplY3QgKi8KKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiTG9hZCBmcm9tIEJ1ZmZlciBvciBGaWVsZCAlcCAlc1xuIiwgb2JqX2Rlc2MsCiAJCQkJICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKG9ial9kZXNjKSkpOwogCi0JCS8qCi0JCSAqIFRoZSBsZW5ndGggb2YgdGhlIGZpZWxkIG11c3QgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIHRhYmxlLgotCQkgKiBSZWFkIHRoZSBlbnRpcmUgZmllbGQgYW5kIHRodXMgdGhlIGVudGlyZSB0YWJsZS4gIEJ1ZmZlciBpcwotCQkgKiBhbGxvY2F0ZWQgZHVyaW5nIHRoZSByZWFkLgotCQkgKi8KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQod2Fsa19zdGF0ZSwgb2JqX2Rlc2MsCi0JCQkJCQkgJmJ1ZmZlcl9kZXNjKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQorCQl0YWJsZV9kZXNjLnBvaW50ZXIgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwKKwkJCQkJCSAgIG9ial9kZXNjLT5idWZmZXIucG9pbnRlcik7CisJCXRhYmxlX2Rlc2MubGVuZ3RoID0gdGFibGVfZGVzYy5wb2ludGVyLT5sZW5ndGg7CisJCXRhYmxlX2Rlc2MuZmxhZ3MgPSBBQ1BJX1RBQkxFX09SSUdJTl9BTExPQ0FURUQ7CiAKLQkJdGFibGVfcHRyID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsCi0JCQkJCSAgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKLQotCQkvKiBBbGwgZG9uZSB3aXRoIHRoZSBidWZmZXJfZGVzYywgZGVsZXRlIGl0ICovCi0KLQkJYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0gTlVMTDsKLQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGJ1ZmZlcl9kZXNjKTsKLQotCQkvKiBTYW5pdHkgY2hlY2sgdGhlIHRhYmxlIGxlbmd0aCAqLwotCi0JCWlmICh0YWJsZV9wdHItPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7Ci0JCQlzdGF0dXMgPSBBRV9CQURfSEVBREVSOwotCQkJZ290byBjbGVhbnVwOwotCQl9CisJCW9ial9kZXNjLT5idWZmZXIucG9pbnRlciA9IE5VTEw7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCX0KIAotCS8qIFRoZSB0YWJsZSBtdXN0IGJlIGVpdGhlciBhbiBTU0RUIG9yIGEgUFNEVCAqLwotCi0JaWYgKCghQUNQSV9DT01QQVJFX05BTUUodGFibGVfcHRyLT5zaWduYXR1cmUsIFBTRFRfU0lHKSkgJiYKLQkgICAgKCFBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZV9wdHItPnNpZ25hdHVyZSwgU1NEVF9TSUcpKSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJUYWJsZSBoYXMgaW52YWxpZCBzaWduYXR1cmUgWyU0LjRzXSwgbXVzdCBiZSBTU0RUIG9yIFBTRFQiLAotCQkJICAgIHRhYmxlX3B0ci0+c2lnbmF0dXJlKSk7Ci0JCXN0YXR1cyA9IEFFX0JBRF9TSUdOQVRVUkU7CisJLyoKKwkgKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzCisJICovCisJc3RhdHVzID0gYWNwaV90Yl9hZGRfdGFibGUoJnRhYmxlX2Rlc2MsICZ0YWJsZV9pbmRleCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQkvKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLQlzdGF0dXMgPSBhY3BpX2V4X2FkZF90YWJsZSh0YWJsZV9wdHIsIGFjcGlfZ2JsX3Jvb3Rfbm9kZSwgJmRkYl9oYW5kbGUpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZXhfYWRkX3RhYmxlKHRhYmxlX2luZGV4LCBhY3BpX2dibF9yb290X25vZGUsICZkZGJfaGFuZGxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAogCQkvKiBPbiBlcnJvciwgdGFibGVfcHRyIHdhcyBkZWFsbG9jYXRlZCBhYm92ZSAqLwpAQCAtNDUwLDEzICszNTIsOSBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlBQ1BJX0lORk8oKEFFX0lORk8sCi0JCSAgICJEeW5hbWljIFNTRFQgTG9hZCAtIE9lbUlkIFslNi42c10gT2VtVGFibGVJZCBbJTguOHNdIiwKLQkJICAgdGFibGVfcHRyLT5vZW1faWQsIHRhYmxlX3B0ci0+b2VtX3RhYmxlX2lkKSk7Ci0KICAgICAgIGNsZWFudXA6CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRlJFRSh0YWJsZV9wdHIpOworCQlhY3BpX3RiX2RlbGV0ZV90YWJsZSgmdGFibGVfZGVzYyk7CiAJfQogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpAQCAtNDc3LDcgKzM3NSw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGFibGVfZGVzYyA9IGRkYl9oYW5kbGU7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbzsKKwlhY3BpX25hdGl2ZV91aW50IHRhYmxlX2luZGV4OwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShleF91bmxvYWRfdGFibGUpOwogCkBAIC00OTMsMTkgKzM5MSwxOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JLyogR2V0IHRoZSBhY3R1YWwgdGFibGUgZGVzY3JpcHRvciBmcm9tIHRoZSBkZGJfaGFuZGxlICovCisJLyogR2V0IHRoZSB0YWJsZSBpbmRleCBmcm9tIHRoZSBkZGJfaGFuZGxlICovCiAKLQl0YWJsZV9pbmZvID0gKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKil0YWJsZV9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0OworCXRhYmxlX2luZGV4ID0gKGFjcGlfbmF0aXZlX3VpbnQpIHRhYmxlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3Q7CiAKIAkvKgogCSAqIERlbGV0ZSB0aGUgZW50aXJlIG5hbWVzcGFjZSB1bmRlciB0aGlzIHRhYmxlIE5vZGUKIAkgKiAoT2Zmc2V0IGNvbnRhaW5zIHRoZSB0YWJsZV9pZCkKIAkgKi8KLQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIodGFibGVfaW5mby0+b3duZXJfaWQpOworCWFjcGlfdGJfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcih0YWJsZV9pbmRleCk7CisJYWNwaV90Yl9yZWxlYXNlX293bmVyX2lkKHRhYmxlX2luZGV4KTsKIAotCS8qIERlbGV0ZSB0aGUgdGFibGUgaXRzZWxmICovCi0KLQkodm9pZClhY3BpX3RiX3VuaW5zdGFsbF90YWJsZSh0YWJsZV9pbmZvLT5pbnN0YWxsZWRfZGVzYyk7CisJYWNwaV90Yl9zZXRfdGFibGVfbG9hZGVkX2ZsYWcodGFibGVfaW5kZXgsIEZBTFNFKTsKIAogCS8qIERlbGV0ZSB0aGUgdGFibGUgZGVzY3JpcHRvciAoZGRiX2hhbmRsZSkgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29udnJ0LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYwppbmRleCA1NDRlODFhLi5kNDcwZThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y3JlYXRlLmMKaW5kZXggMzRlZWM4Mi4uN2MzODUyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y3JlYXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y3JlYXRlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zNTksOCArMzU5LDkgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOworCWFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXg7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbik7CiAKQEAgLTM4MCw3ICszODEsNyBAQAogCiAJc3RhdHVzID0gYWNwaV90Yl9maW5kX3RhYmxlKG9wZXJhbmRbMV0tPnN0cmluZy5wb2ludGVyLAogCQkJCSAgICBvcGVyYW5kWzJdLT5zdHJpbmcucG9pbnRlciwKLQkJCQkgICAgb3BlcmFuZFszXS0+c3RyaW5nLnBvaW50ZXIsICZ0YWJsZSk7CisJCQkJICAgIG9wZXJhbmRbM10tPnN0cmluZy5wb2ludGVyLCAmdGFibGVfaW5kZXgpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CkBAIC0zOTUsNiArMzk2LDExIEBACiAJcmVnaW9uX29iajIgPSBvYmpfZGVzYy0+Y29tbW9uLm5leHRfb2JqZWN0OwogCXJlZ2lvbl9vYmoyLT5leHRyYS5yZWdpb25fY29udGV4dCA9IE5VTEw7CiAKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZV9ieV9pbmRleCh0YWJsZV9pbmRleCwgJnRhYmxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCiAJLyogSW5pdCB0aGUgcmVnaW9uIGZyb20gdGhlIG9wZXJhbmRzICovCiAKIAlvYmpfZGVzYy0+cmVnaW9uLnNwYWNlX2lkID0gUkVHSU9OX0RBVEFfVEFCTEU7CkBAIC01NTMsNyArNTU5LDggQEAKIAogCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9NRVRIT0QpOwogCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBleGl0OwogCX0KIAogCS8qIFNhdmUgdGhlIG1ldGhvZCdzIEFNTCBwb2ludGVyIGFuZCBsZW5ndGggICovCkBAIC01NzYsMTAgKzU4Myw3IEBACiAJICogR2V0IHRoZSBzeW5jX2xldmVsLiBJZiBtZXRob2QgaXMgc2VyaWFsaXplZCwgYSBtdXRleCB3aWxsIGJlCiAJICogY3JlYXRlZCBmb3IgdGhpcyBtZXRob2Qgd2hlbiBpdCBpcyBwYXJzZWQuCiAJICovCi0JaWYgKGFjcGlfZ2JsX2FsbF9tZXRob2RzX3NlcmlhbGl6ZWQpIHsKLQkJb2JqX2Rlc2MtPm1ldGhvZC5zeW5jX2xldmVsID0gMDsKLQkJb2JqX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgfD0gQU1MX01FVEhPRF9TRVJJQUxJWkVEOwotCX0gZWxzZSBpZiAobWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9TRVJJQUxJWkVEKSB7CisJaWYgKG1ldGhvZF9mbGFncyAmIEFNTF9NRVRIT0RfU0VSSUFMSVpFRCkgewogCQkvKgogCQkgKiBBQ1BJIDEuMDogc3luY19sZXZlbCA9IDAKIAkJICogQUNQSSAyLjA6IHN5bmNfbGV2ZWwgPSBzeW5jX2xldmVsIGluIG1ldGhvZCBkZWNsYXJhdGlvbgpAQCAtNTk3LDYgKzYwMSw3IEBACiAKIAlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2Uob2JqX2Rlc2MpOwogCisgICAgICBleGl0OgogCS8qIFJlbW92ZSBhIHJlZmVyZW5jZSB0byB0aGUgb3BlcmFuZCAqLwogCiAJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9wZXJhbmRbMV0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jCmluZGV4IDI0NTA5NDMuLjY4ZDI4M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01OSw4ICs1OSw2IEBACiAKIHN0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X3BvaW50ZXIoY2hhciAqdGl0bGUsIHZvaWQgKnZhbHVlKTsKIAotc3RhdGljIHZvaWQgYWNwaV9leF9vdXRfYWRkcmVzcyhjaGFyICp0aXRsZSwgYWNwaV9waHlzaWNhbF9hZGRyZXNzIHZhbHVlKTsKLQogc3RhdGljIHZvaWQKIGFjcGlfZXhfZHVtcF9vYmplY3QodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsCiAJCSAgICBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyAqaW5mbyk7CkBAIC05MiwxMCArOTAsMTEgQEAKIAl7QUNQSV9FWERfU1RSSU5HLCAwLCBOVUxMfQogfTsKIAotc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9idWZmZXJbNF0gPSB7CitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX2J1ZmZlcls1XSA9IHsKIAl7QUNQSV9FWERfSU5JVCwgQUNQSV9FWERfVEFCTEVfU0laRShhY3BpX2V4X2R1bXBfYnVmZmVyKSwgTlVMTH0sCiAJe0FDUElfRVhEX1VJTlQzMiwgQUNQSV9FWERfT0ZGU0VUKGJ1ZmZlci5sZW5ndGgpLCAiTGVuZ3RoIn0sCiAJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXIucG9pbnRlciksICJQb2ludGVyIn0sCisJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChidWZmZXIubm9kZSksICJQYXJlbnQgTm9kZSJ9LAogCXtBQ1BJX0VYRF9CVUZGRVIsIDAsIE5VTEx9CiB9OwogCkBAIC0xNjUsOCArMTY0LDggQEAKIAogc3RhdGljIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvIGFjcGlfZXhfZHVtcF9wcm9jZXNzb3JbN10gPSB7CiAJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX3Byb2Nlc3NvciksIE5VTEx9LAotCXtBQ1BJX0VYRF9VSU5UMzIsIEFDUElfRVhEX09GRlNFVChwcm9jZXNzb3IucHJvY19pZCksICJQcm9jZXNzb3IgSUQifSwKLQl7QUNQSV9FWERfVUlOVDMyLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLmxlbmd0aCksICJMZW5ndGgifSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChwcm9jZXNzb3IucHJvY19pZCksICJQcm9jZXNzb3IgSUQifSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChwcm9jZXNzb3IubGVuZ3RoKSwgIkxlbmd0aCJ9LAogCXtBQ1BJX0VYRF9BRERSRVNTLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLmFkZHJlc3MpLCAiQWRkcmVzcyJ9LAogCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQocHJvY2Vzc29yLnN5c3RlbV9ub3RpZnkpLAogCSAiU3lzdGVtIE5vdGlmeSJ9LApAQCAtMzc5LDE4ICszNzgsMTIgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9FWERfUE9JTlRFUjoKKwkJY2FzZSBBQ1BJX0VYRF9BRERSRVNTOgogCiAJCQlhY3BpX2V4X291dF9wb2ludGVyKG5hbWUsCiAJCQkJCSAgICAqQUNQSV9DQVNUX1BUUih2b2lkICosIHRhcmdldCkpOwogCQkJYnJlYWs7CiAKLQkJY2FzZSBBQ1BJX0VYRF9BRERSRVNTOgotCi0JCQlhY3BpX2V4X291dF9hZGRyZXNzKG5hbWUsCi0JCQkJCSAgICAqQUNQSV9DQVNUX1BUUgotCQkJCQkgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcywgdGFyZ2V0KSk7Ci0JCQlicmVhazsKLQogCQljYXNlIEFDUElfRVhEX1NUUklORzoKIAogCQkJYWNwaV91dF9wcmludF9zdHJpbmcob2JqX2Rlc2MtPnN0cmluZy5wb2ludGVyLApAQCAtODM0LDE2ICs4MjcsNiBAQAogCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJXBcbiIsIHRpdGxlLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGFjcGlfZXhfb3V0X2FkZHJlc3MoY2hhciAqdGl0bGUsIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyB2YWx1ZSkKLXsKLQotI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSAxNgotCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJXBcbiIsIHRpdGxlLCB2YWx1ZSk7Ci0jZWxzZQotCWFjcGlfb3NfcHJpbnRmKCIlMjBzIDogJTguOFglOC44WFxuIiwgdGl0bGUsIEFDUElfRk9STUFUX1VJTlQ2NCh2YWx1ZSkpOwotI2VuZGlmCi19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZHVtcF9uYW1lc3BhY2Vfbm9kZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMKaW5kZXggOWVhOWMzYTYuLjJkODhhM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmbGRpby5jCmluZGV4IDQwZjBiZWUuLjY1YTQ4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTI1NywxNCArMjU3LDEzIEBACiAJfQogCiAJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfQkZJRUxELAotCQkJICAgICAgIiBSZWdpb24gWyVzOiVYXSwgV2lkdGggJVgsIEJ5dGVCYXNlICVYLCBPZmZzZXQgJVggYXQgJTguOFglOC44WFxuIiwKKwkJCSAgICAgICIgUmVnaW9uIFslczolWF0sIFdpZHRoICVYLCBCeXRlQmFzZSAlWCwgT2Zmc2V0ICVYIGF0ICVwXG4iLAogCQkJICAgICAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmduX2Rlc2MtPnJlZ2lvbi4KIAkJCQkJCSAgICAgIHNwYWNlX2lkKSwKIAkJCSAgICAgIHJnbl9kZXNjLT5yZWdpb24uc3BhY2VfaWQsCiAJCQkgICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAogCQkJICAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAotCQkJICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JCQkgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcykpKTsKKwkJCSAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LCAodm9pZCAqKWFkZHJlc3MpKTsKIAogCS8qIEludm9rZSB0aGUgYXBwcm9wcmlhdGUgYWRkcmVzc19zcGFjZS9vcF9yZWdpb24gaGFuZGxlciAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMKaW5kZXggYmQ5OGFhYi4uZjEzZDFjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCmluZGV4IGJmOTBmMDQuLjUxMDFiYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ0LDYgKzQ0LDcgQEAKIAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KKyNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiBBQ1BJX01PRFVMRV9OQU1FKCJleG11dGV4IikKQEAgLTE1MCw3ICsxNTEsNyBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JLyogU2FuaXR5IGNoZWNrIC0tIHdlIG11c3QgaGF2ZSBhIHZhbGlkIHRocmVhZCBJRCAqLworCS8qIFNhbml0eSBjaGVjazogd2UgbXVzdCBoYXZlIGEgdmFsaWQgdGhyZWFkIElEICovCiAKIAlpZiAoIXdhbGtfc3RhdGUtPnRocmVhZCkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLApAQCAtMTc0LDI0ICsxNzUsMjggQEAKIAkvKiBTdXBwb3J0IGZvciBtdWx0aXBsZSBhY3F1aXJlcyBieSB0aGUgb3duaW5nIHRocmVhZCAqLwogCiAJaWYgKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQpIHsKLQotCQkvKiBTcGVjaWFsIGNhc2UgZm9yIEdsb2JhbCBMb2NrLCBhbGxvdyBhbGwgdGhyZWFkcyAqLwotCi0JCWlmICgob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkID09Ci0JCSAgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpIHx8Ci0JCSAgICAob2JqX2Rlc2MtPm11dGV4Lm9zX211dGV4ID09IEFDUElfR0xPQkFMX0xPQ0spKSB7CisJCWlmIChvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkLT50aHJlYWRfaWQgPT0KKwkJICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkKSB7CiAJCQkvKgotCQkJICogVGhlIG11dGV4IGlzIGFscmVhZHkgb3duZWQgYnkgdGhpcyB0aHJlYWQsCi0JCQkgKiBqdXN0IGluY3JlbWVudCB0aGUgYWNxdWlzaXRpb24gZGVwdGgKKwkJCSAqIFRoZSBtdXRleCBpcyBhbHJlYWR5IG93bmVkIGJ5IHRoaXMgdGhyZWFkLCBqdXN0IGluY3JlbWVudCB0aGUKKwkJCSAqIGFjcXVpc2l0aW9uIGRlcHRoCiAJCQkgKi8KIAkJCW9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCsrOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJfQogCX0KIAotCS8qIEFjcXVpcmUgdGhlIG11dGV4LCB3YWl0IGlmIG5lY2Vzc2FyeSAqLworCS8qIEFjcXVpcmUgdGhlIG11dGV4LCB3YWl0IGlmIG5lY2Vzc2FyeS4gU3BlY2lhbCBjYXNlIGZvciBHbG9iYWwgTG9jayAqLwogCi0Jc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fYWNxdWlyZV9tdXRleCh0aW1lX2Rlc2MsIG9ial9kZXNjKTsKKwlpZiAob2JqX2Rlc2MtPm11dGV4Lm9zX211dGV4ID09IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4KSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2soKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV93YWl0X211dGV4KG9ial9kZXNjLT5tdXRleC5vc19tdXRleCwKKwkJCQkJCSAgICh1MTYpIHRpbWVfZGVzYy0+aW50ZWdlci4KKwkJCQkJCSAgIHZhbHVlKTsKKwl9CisKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAogCQkvKiBJbmNsdWRlcyBmYWlsdXJlIGZyb20gYSB0aW1lb3V0IG9uIHRpbWVfZGVzYyAqLwpAQCAtMjExLDcgKzIxNiw2IEBACiAJLyogTGluayB0aGUgbXV0ZXggdG8gdGhlIGN1cnJlbnQgdGhyZWFkIGZvciBmb3JjZS11bmxvY2sgYXQgbWV0aG9kIGV4aXQgKi8KIAogCWFjcGlfZXhfbGlua19tdXRleChvYmpfZGVzYywgd2Fsa19zdGF0ZS0+dGhyZWFkKTsKLQogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKQEAgLTIzMiw3ICsyMzYsNyBAQAogYWNwaV9leF9yZWxlYXNlX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAogCQkgICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewotCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVsZWFzZV9tdXRleCk7CiAKQEAgLTI0OSw3ICsyNTMsNyBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX01VVEVYX05PVF9BQ1FVSVJFRCk7CiAJfQogCi0JLyogU2FuaXR5IGNoZWNrIC0tIHdlIG11c3QgaGF2ZSBhIHZhbGlkIHRocmVhZCBJRCAqLworCS8qIFNhbml0eSBjaGVjazogd2UgbXVzdCBoYXZlIGEgdmFsaWQgdGhyZWFkIElEICovCiAKIAlpZiAoIXdhbGtfc3RhdGUtPnRocmVhZCkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLApAQCAtMjY0LDcgKzI2OCw3IEBACiAJICovCiAJaWYgKChvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkLT50aHJlYWRfaWQgIT0KIAkgICAgIHdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkKQotCSAgICAmJiAob2JqX2Rlc2MtPm11dGV4Lm9zX211dGV4ICE9IEFDUElfR0xPQkFMX0xPQ0spKSB7CisJICAgICYmIChvYmpfZGVzYy0+bXV0ZXgub3NfbXV0ZXggIT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXgpKSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sCiAJCQkgICAgIlRocmVhZCAlbFggY2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSBhY3F1aXJlZCBieSB0aHJlYWQgJWxYIiwKIAkJCSAgICAodW5zaWduZWQgbG9uZyl3YWxrX3N0YXRlLT50aHJlYWQtPnRocmVhZF9pZCwKQEAgLTI3NCw4ICsyNzgsOCBAQAogCX0KIAogCS8qCi0JICogVGhlIHN5bmMgbGV2ZWwgb2YgdGhlIG11dGV4IG11c3QgYmUgbGVzcyB0aGFuIG9yCi0JICogZXF1YWwgdG8gdGhlIGN1cnJlbnQgc3luYyBsZXZlbAorCSAqIFRoZSBzeW5jIGxldmVsIG9mIHRoZSBtdXRleCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudAorCSAqIHN5bmMgbGV2ZWwKIAkgKi8KIAlpZiAob2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwgPiB3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLApAQCAtMjk4LDExICszMDIsMTUgQEAKIAogCWFjcGlfZXhfdW5saW5rX211dGV4KG9ial9kZXNjKTsKIAotCS8qIFJlbGVhc2UgdGhlIG11dGV4ICovCisJLyogUmVsZWFzZSB0aGUgbXV0ZXgsIHNwZWNpYWwgY2FzZSBmb3IgR2xvYmFsIExvY2sgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgob2JqX2Rlc2MpOworCWlmIChvYmpfZGVzYy0+bXV0ZXgub3NfbXV0ZXggPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXgpIHsKKwkJc3RhdHVzID0gYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrKCk7CisJfSBlbHNlIHsKKwkJYWNwaV9vc19yZWxlYXNlX211dGV4KG9ial9kZXNjLT5tdXRleC5vc19tdXRleCk7CisJfQogCi0JLyogVXBkYXRlIHRoZSBtdXRleCBhbmQgd2FsayBzdGF0ZSwgcmVzdG9yZSBzeW5jX2xldmVsIGJlZm9yZSBhY3F1aXJlICovCisJLyogVXBkYXRlIHRoZSBtdXRleCBhbmQgcmVzdG9yZSBzeW5jX2xldmVsICovCiAKIAlvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkID0gTlVMTDsKIAl3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9CkBAIC0zMjEsMzkgKzMyOSw0OSBAQAogICoKICAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGFsbCBtdXRleGVzIGhlbGQgYnkgdGhpcyB0aHJlYWQKICAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhcyB0aGUgdGhyZWFkIGlzIGV4aXRpbmcgdGhlIGludGVycHJldGVyLgorICogTXV0ZXhlcyBhcmUgbm90IHJlbGVhc2VkIHdoZW4gYW4gaW5kaXZpZHVhbCBjb250cm9sIG1ldGhvZCBpcyBleGl0ZWQsIGJ1dAorICogb25seSB3aGVuIHRoZSBwYXJlbnQgdGhyZWFkIGFjdHVhbGx5IGV4aXRzIHRoZSBpbnRlcnByZXRlci4gVGhpcyBhbGxvd3Mgb25lCisgKiBtZXRob2QgdG8gYWNxdWlyZSBhIG11dGV4LCBhbmQgYSBkaWZmZXJlbnQgbWV0aG9kIHRvIHJlbGVhc2UgaXQsIGFzIGxvbmcgYXMKKyAqIHRoaXMgaXMgcGVyZm9ybWVkIHVuZGVybmVhdGggYSBzaW5nbGUgcGFyZW50IGNvbnRyb2wgbWV0aG9kLgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQgYWNwaV9leF9yZWxlYXNlX2FsbF9tdXRleGVzKHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkKQogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5leHQgPSB0aHJlYWQtPmFjcXVpcmVkX211dGV4X2xpc3Q7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqdGhpczsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAKIAlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKiBUcmF2ZXJzZSB0aGUgbGlzdCBvZiBvd25lZCBtdXRleGVzLCByZWxlYXNpbmcgZWFjaCBvbmUgKi8KIAogCXdoaWxlIChuZXh0KSB7Ci0JCXRoaXMgPSBuZXh0OwotCQluZXh0ID0gdGhpcy0+bXV0ZXgubmV4dDsKKwkJb2JqX2Rlc2MgPSBuZXh0OworCQluZXh0ID0gb2JqX2Rlc2MtPm11dGV4Lm5leHQ7CiAKLQkJdGhpcy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPSAxOwotCQl0aGlzLT5tdXRleC5wcmV2ID0gTlVMTDsKLQkJdGhpcy0+bXV0ZXgubmV4dCA9IE5VTEw7CisJCW9ial9kZXNjLT5tdXRleC5wcmV2ID0gTlVMTDsKKwkJb2JqX2Rlc2MtPm11dGV4Lm5leHQgPSBOVUxMOworCQlvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPSAwOwogCi0JCS8qIFJlbGVhc2UgdGhlIG11dGV4ICovCisJCS8qIFJlbGVhc2UgdGhlIG11dGV4LCBzcGVjaWFsIGNhc2UgZm9yIEdsb2JhbCBMb2NrICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fcmVsZWFzZV9tdXRleCh0aGlzKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQljb250aW51ZTsKKwkJaWYgKG9ial9kZXNjLT5tdXRleC5vc19tdXRleCA9PSBhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCkgeworCisJCQkvKiBJZ25vcmUgZXJyb3JzICovCisKKwkJCSh2b2lkKWFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jaygpOworCQl9IGVsc2UgeworCQkJYWNwaV9vc19yZWxlYXNlX211dGV4KG9ial9kZXNjLT5tdXRleC5vc19tdXRleCk7CiAJCX0KIAogCQkvKiBNYXJrIG11dGV4IHVub3duZWQgKi8KIAotCQl0aGlzLT5tdXRleC5vd25lcl90aHJlYWQgPSBOVUxMOworCQlvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkID0gTlVMTDsKIAogCQkvKiBVcGRhdGUgVGhyZWFkIHN5bmNfbGV2ZWwgKExhc3QgbXV0ZXggaXMgdGhlIGltcG9ydGFudCBvbmUpICovCiAKLQkJdGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwgPSB0aGlzLT5tdXRleC5vcmlnaW5hbF9zeW5jX2xldmVsOworCQl0aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9CisJCSAgICBvYmpfZGVzYy0+bXV0ZXgub3JpZ2luYWxfc3luY19sZXZlbDsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYwppbmRleCBkM2Q3MDM2Li4xZWU0ZmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG5hbWVzLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jCmluZGV4IDYzNzRkOGIuLjI1MmYxMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMS5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTA0LDkgKzEwNCw3IEBACiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KLSNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggIT0gMTYKIAkJcmV0dXJuX2Rlc2MtPmludGVnZXIudmFsdWUgPSBhY3BpX29zX2dldF90aW1lcigpOwotI2VuZGlmCiAJCWJyZWFrOwogCiAJZGVmYXVsdDoJCS8qICBVbmtub3duIG9wY29kZSAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKaW5kZXggN2QyY2JjMS4uMTdlNjUyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzMuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jCmluZGV4IGUyZDk0NWQuLjdmZTY3Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3Bhcmc2LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYwppbmRleCBmMGMwYmE2Li5iZDgwYTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYwppbmRleCA0NGQwNjRmLi5hNjY5NjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwppbmRleCAzY2M5N2JhLi4yZTljZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTE1NSwxNiArMTU1LDE1IEBACiAKIAkJLyogQ3JlYXRlIGEgbmV3IG1hcHBpbmcgc3RhcnRpbmcgYXQgdGhlIGFkZHJlc3MgZ2l2ZW4gKi8KIAotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcywgd2luZG93X3NpemUsCi0JCQkJCSAgICAodm9pZCAqKikmbWVtX2luZm8tPgotCQkJCQkgICAgbWFwcGVkX2xvZ2ljYWxfYWRkcmVzcyk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQltZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcyA9CisJCSAgICBhY3BpX29zX21hcF9tZW1vcnkoKGFjcGlfbmF0aXZlX3VpbnQpIGFkZHJlc3MsIHdpbmRvd19zaXplKTsKKwkJaWYgKCFtZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcykgewogCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKIAkJCQkgICAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFgsIHNpemUgJVgiLAogCQkJCSAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCiAJCQkJICAgICh1MzIpIHdpbmRvd19zaXplKSk7CiAJCQltZW1faW5mby0+bWFwcGVkX2xlbmd0aCA9IDA7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CiAKIAkJLyogU2F2ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQgbWFwcGluZyBzaXplICovCkBAIC0yMTAsMTEgKzIwOSwxMCBAQAogCQkJKnZhbHVlID0gKGFjcGlfaW50ZWdlcikgQUNQSV9HRVQzMihsb2dpY2FsX2FkZHJfcHRyKTsKIAkJCWJyZWFrOwogCi0jaWYgQUNQSV9NQUNISU5FX1dJRFRIICE9IDE2CiAJCWNhc2UgNjQ6CiAJCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSBBQ1BJX0dFVDY0KGxvZ2ljYWxfYWRkcl9wdHIpOwogCQkJYnJlYWs7Ci0jZW5kaWYKKwogCQlkZWZhdWx0OgogCQkJLyogYml0X3dpZHRoIHdhcyBhbHJlYWR5IHZhbGlkYXRlZCAqLwogCQkJYnJlYWs7CkBAIC0yMzYsMTEgKzIzNCw5IEBACiAJCQlBQ1BJX1NFVDMyKGxvZ2ljYWxfYWRkcl9wdHIpID0gKHUzMikgKiB2YWx1ZTsKIAkJCWJyZWFrOwogCi0jaWYgQUNQSV9NQUNISU5FX1dJRFRIICE9IDE2CiAJCWNhc2UgNjQ6CiAJCQlBQ1BJX1NFVDY0KGxvZ2ljYWxfYWRkcl9wdHIpID0gKHU2NCkgKiB2YWx1ZTsKIAkJCWJyZWFrOwotI2VuZGlmCiAKIAkJZGVmYXVsdDoKIAkJCS8qIGJpdF93aWR0aCB3YXMgYWxyZWFkeSB2YWxpZGF0ZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzbnRlLmMKaW5kZXggMzA4OWIwNS4uMmIzYTAxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzbnRlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzbnRlLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCmluZGV4IDY0OTlkZTguLjZjNjRlNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTQxLDcgKzE0MSw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc3RhY2tfZGVzYzsKIAl2b2lkICp0ZW1wX25vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MgPSBOVUxMOwogCXUxNiBvcGNvZGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlKTsKQEAgLTI5OSw4ICsyOTksNiBAQAogCQlzdGF0dXMgPSBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyhzdGFja19kZXNjKTsKIAkJYnJlYWs7CiAKLQkJLyogVGhlc2UgY2FzZXMgbWF5IG5ldmVyIGhhcHBlbiBoZXJlLCBidXQganVzdCBpbiBjYXNlLi4gKi8KLQogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKQEAgLTMxNCw2ICszMTIsMTAgQEAKIAkJc3RhdHVzID0KIAkJICAgIGFjcGlfZXhfcmVhZF9kYXRhX2Zyb21fZmllbGQod2Fsa19zdGF0ZSwgc3RhY2tfZGVzYywKIAkJCQkJCSAmb2JqX2Rlc2MpOworCisJCS8qIFJlbW92ZSBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgb3BlcmFuZCwgdGhlbiBvdmVycmlkZSAqLworCisJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSgqc3RhY2tfcHRyKTsKIAkJKnN0YWNrX3B0ciA9ICh2b2lkICopb2JqX2Rlc2M7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYwppbmRleCA0YzkzZDA5Li5iYTc2MTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02MTEsMjIgKzYxMSwyMCBAQAogCQkJfQogCQkJZ290byBuZXh0X29wZXJhbmQ7CiAKLQkJY2FzZSBBUkdJX1JFR0lPTl9PUl9GSUVMRDoKKwkJY2FzZSBBUkdJX1JFR0lPTl9PUl9CVUZGRVI6CS8qIFVzZWQgYnkgTG9hZCgpIG9ubHkgKi8KIAotCQkJLyogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgUkVHSU9OIG9yIGEgRklFTEQgaW4gYSByZWdpb24gKi8KKwkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIFJFR0lPTiBvciBhIEJVRkZFUiAod2hpY2ggY291bGQgYmUgYSByZXNvbHZlZCByZWdpb24gZmllbGQpICovCiAKIAkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CisJCQljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAJCQljYXNlIEFDUElfVFlQRV9SRUdJT046Ci0JCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6Ci0JCQljYXNlIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEOgotCQkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CiAKIAkJCQkvKiBWYWxpZCBvcGVyYW5kICovCiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6CiAJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJICAgICJOZWVkZWQgW1JlZ2lvbi9SZWdpb25GaWVsZF0sIGZvdW5kIFslc10gJXAiLAorCQkJCQkgICAgIk5lZWRlZCBbUmVnaW9uL0J1ZmZlcl0sIGZvdW5kIFslc10gJXAiLAogCQkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZQogCQkJCQkgICAgKG9ial9kZXNjKSwgb2JqX2Rlc2MpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMKaW5kZXggMDQ1NjQwNS4uZjRiNjlhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZW4uYwppbmRleCA1OTFhYWYwLi4xZDYyMmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZW4uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZW4uYwpAQCAtNyw3ICs3LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JvYi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKaW5kZXggOTllYmU1YS4uODIzM2Q0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCmluZGV4IDI4YWVmM2UuLjk0NjBiYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNjYsNyArNjYsNiBAQAogYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUoYWNwaV9zZW1hcGhvcmUgc2VtYXBob3JlLCB1MTYgdGltZW91dCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzMjsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlKTsKIApAQCAtNzksNyArNzgsNyBAQAogCiAJCS8qIFdlIG11c3Qgd2FpdCwgc28gdW5sb2NrIHRoZSBpbnRlcnByZXRlciAqLwogCi0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOworCQlhY3BpX2V4X3JlbGlucXVpc2hfaW50ZXJwcmV0ZXIoKTsKIAogCQlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlKHNlbWFwaG9yZSwgMSwgdGltZW91dCk7CiAKQEAgLTg5LDEzICs4OCw3IEBACiAKIAkJLyogUmVhY3F1aXJlIHRoZSBpbnRlcnByZXRlciAqLwogCi0JCXN0YXR1czIgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKLQotCQkJLyogUmVwb3J0IGZhdGFsIGVycm9yLCBjb3VsZCBub3QgYWNxdWlyZSBpbnRlcnByZXRlciAqLwotCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7Ci0JCX0KKwkJYWNwaV9leF9yZWFjcXVpcmVfaW50ZXJwcmV0ZXIoKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTExOSw3ICsxMTIsNiBAQAogYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fd2FpdF9tdXRleChhY3BpX211dGV4IG11dGV4LCB1MTYgdGltZW91dCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzMjsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfc3lzdGVtX3dhaXRfbXV0ZXgpOwogCkBAIC0xMzIsNyArMTI0LDcgQEAKIAogCQkvKiBXZSBtdXN0IHdhaXQsIHNvIHVubG9jayB0aGUgaW50ZXJwcmV0ZXIgKi8KIAotCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKwkJYWNwaV9leF9yZWxpbnF1aXNoX2ludGVycHJldGVyKCk7CiAKIAkJc3RhdHVzID0gYWNwaV9vc19hY3F1aXJlX211dGV4KG11dGV4LCB0aW1lb3V0KTsKIApAQCAtMTQyLDEzICsxMzQsNyBAQAogCiAJCS8qIFJlYWNxdWlyZSB0aGUgaW50ZXJwcmV0ZXIgKi8KIAotCQlzdGF0dXMyID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7Ci0KLQkJCS8qIFJlcG9ydCBmYXRhbCBlcnJvciwgY291bGQgbm90IGFjcXVpcmUgaW50ZXJwcmV0ZXIgKi8KLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwotCQl9CisJCWFjcGlfZXhfcmVhY3F1aXJlX2ludGVycHJldGVyKCk7CiAJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CkBAIC0yMDksOTYgKzE5NSwxOCBAQAogCiBhY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9kb19zdXNwZW5kKGFjcGlfaW50ZWdlciBob3dfbG9uZykKIHsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KIAlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKiBTaW5jZSB0aGlzIHRocmVhZCB3aWxsIHNsZWVwLCB3ZSBtdXN0IHJlbGVhc2UgdGhlIGludGVycHJldGVyICovCiAKLQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKKwlhY3BpX2V4X3JlbGlucXVpc2hfaW50ZXJwcmV0ZXIoKTsKIAogCWFjcGlfb3Nfc2xlZXAoaG93X2xvbmcpOwogCiAJLyogQW5kIG5vdyB3ZSBtdXN0IGdldCB0aGUgaW50ZXJwcmV0ZXIgYWdhaW4gKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKLQlyZXR1cm4gKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX2FjcXVpcmVfbXV0ZXgKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGltZV9kZXNjICAgICAgIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBtdXRleAotICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogUHJvdmlkZXMgYW4gYWNjZXNzIHBvaW50IHRvIHBlcmZvcm0gc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbnMKLSAqICAgICAgICAgICAgICB3aXRoaW4gdGhlIEFNTC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBjYXVzZSBhIGxvY2sgdG8gYmUgZ2VuZXJhdGVkCi0gKiAgICAgICAgICAgICAgZm9yIHRoZSBNdXRleCBwb2ludGVkIHRvIGJ5IG9ial9kZXNjLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3N5c3RlbV9hY3F1aXJlX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiB0aW1lX2Rlc2MsCi0JCQkgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiBvYmpfZGVzYykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X3N5c3RlbV9hY3F1aXJlX211dGV4LCBvYmpfZGVzYyk7Ci0KLQlpZiAoIW9ial9kZXNjKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBTdXBwb3J0IGZvciB0aGUgX0dMXyBNdXRleCBvYmplY3QgLS0gZ28gZ2V0IHRoZSBnbG9iYWwgbG9jayAqLwotCi0JaWYgKG9ial9kZXNjLT5tdXRleC5vc19tdXRleCA9PSBBQ1BJX0dMT0JBTF9MT0NLKSB7Ci0JCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2soKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9leF9zeXN0ZW1fd2FpdF9tdXRleChvYmpfZGVzYy0+bXV0ZXgub3NfbXV0ZXgsCi0JCQkJCSAgICh1MTYpIHRpbWVfZGVzYy0+aW50ZWdlci52YWx1ZSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgKLSAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBQcm92aWRlcyBhbiBhY2Nlc3MgcG9pbnQgdG8gcGVyZm9ybSBzeW5jaHJvbml6YXRpb24gb3BlcmF0aW9ucwotICogICAgICAgICAgICAgIHdpdGhpbiB0aGUgQU1MLiAgVGhpcyBvcGVyYXRpb24gaXMgYSByZXF1ZXN0IHRvIHJlbGVhc2UgYQotICogICAgICAgICAgICAgIHByZXZpb3VzbHkgYWNxdWlyZWQgTXV0ZXguICBJZiB0aGUgTXV0ZXggdmFyaWFibGUgaXMgc2V0IHRoZW4KLSAqICAgICAgICAgICAgICBpdCB3aWxsIGJlIGRlY3JlbWVudGVkLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV9yZWxlYXNlX211dGV4KTsKLQotCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIFN1cHBvcnQgZm9yIHRoZSBfR0xfIE11dGV4IG9iamVjdCAtLSByZWxlYXNlIHRoZSBnbG9iYWwgbG9jayAqLwotCi0JaWYgKG9ial9kZXNjLT5tdXRleC5vc19tdXRleCA9PSBBQ1BJX0dMT0JBTF9MT0NLKSB7Ci0JCXN0YXR1cyA9IGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jaygpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlhY3BpX29zX3JlbGVhc2VfbXV0ZXgob2JqX2Rlc2MtPm11dGV4Lm9zX211dGV4KTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCWFjcGlfZXhfcmVhY3F1aXJlX2ludGVycHJldGVyKCk7CisJcmV0dXJuIChBRV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMTQsNyArMjIyLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9zaWduYWxfZXZlbnQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpCithY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9zaWduYWxfZXZlbnQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIG9ial9kZXNjKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4dXRpbHMuYwppbmRleCA5ODJjOGI2Li42YjBhZWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC03NiwxNCArNzYsMTUgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IEVudGVyIHRoZSBpbnRlcnByZXRlciBleGVjdXRpb24gcmVnaW9uLiAgRmFpbHVyZSB0byBlbnRlcgotICogICAgICAgICAgICAgIHRoZSBpbnRlcnByZXRlciByZWdpb24gaXMgYSBmYXRhbCBzeXN0ZW0gZXJyb3IKKyAqIERFU0NSSVBUSU9OOiBFbnRlciB0aGUgaW50ZXJwcmV0ZXIgZXhlY3V0aW9uIHJlZ2lvbi4gRmFpbHVyZSB0byBlbnRlcgorICogICAgICAgICAgICAgIHRoZSBpbnRlcnByZXRlciByZWdpb24gaXMgYSBmYXRhbCBzeXN0ZW0gZXJyb3IuIFVzZWQgaW4KKyAqICAgICAgICAgICAgICBjb25qdW5jdGlvbiB3aXRoIGV4aXRfaW50ZXJwcmV0ZXIuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcih2b2lkKQordm9pZCBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC05MSwxMCArOTIsNDIgQEAKIAogCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9JTlRFUlBSRVRFUik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgYWNxdWlyZSBpbnRlcnByZXRlciBtdXRleCIpKTsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiQ291bGQgbm90IGFjcXVpcmUgQU1MIEludGVycHJldGVyIG11dGV4IikpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogUmVhY3F1aXJlIHRoZSBpbnRlcnByZXRlciBleGVjdXRpb24gcmVnaW9uIGZyb20gd2l0aGluIHRoZQorICogICAgICAgICAgICAgIGludGVycHJldGVyIGNvZGUuIEZhaWx1cmUgdG8gZW50ZXIgdGhlIGludGVycHJldGVyIHJlZ2lvbiBpcyBhCisgKiAgICAgICAgICAgICAgZmF0YWwgc3lzdGVtIGVycm9yLiBVc2VkIGluICBjb25qdWN0aW9uIHdpdGgKKyAqICAgICAgICAgICAgICByZWxpbnF1aXNoX2ludGVycHJldGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX2V4X3JlYWNxdWlyZV9pbnRlcnByZXRlcih2b2lkKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVhY3F1aXJlX2ludGVycHJldGVyKTsKKworCS8qCisJICogSWYgdGhlIGdsb2JhbCBzZXJpYWxpemVkIGZsYWcgaXMgc2V0LCBkbyBub3QgcmVsZWFzZSB0aGUgaW50ZXJwcmV0ZXIsCisJICogc2luY2UgaXQgd2FzIG5vdCBhY3R1YWxseSByZWxlYXNlZCBieSBhY3BpX2V4X3JlbGlucXVpc2hfaW50ZXJwcmV0ZXIuCisJICogVGhpcyBmb3JjZXMgdGhlIGludGVycHJldGVyIHRvIGJlIHNpbmdsZSB0aHJlYWRlZC4KKwkgKi8KKwlpZiAoIWFjcGlfZ2JsX2FsbF9tZXRob2RzX3NlcmlhbGl6ZWQpIHsKKwkJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCX0KKworCXJldHVybl9WT0lEOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA1LDE3ICsxMzgsOSBAQAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IEV4aXQgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbiByZWdpb24KLSAqCi0gKiBDYXNlcyB3aGVyZSB0aGUgaW50ZXJwcmV0ZXIgaXMgdW5sb2NrZWQ6Ci0gKiAgICAgIDEpIENvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbnRyb2wgbWV0aG9kCi0gKiAgICAgIDIpIE1ldGhvZCBibG9ja2VkIG9uIGEgU2xlZXAoKSBBTUwgb3Bjb2RlCi0gKiAgICAgIDMpIE1ldGhvZCBibG9ja2VkIG9uIGFuIEFjcXVpcmUoKSBBTUwgb3Bjb2RlCi0gKiAgICAgIDQpIE1ldGhvZCBibG9ja2VkIG9uIGEgV2FpdCgpIEFNTCBvcGNvZGUKLSAqICAgICAgNSkgTWV0aG9kIGJsb2NrZWQgdG8gYWNxdWlyZSB0aGUgZ2xvYmFsIGxvY2sKLSAqICAgICAgNikgTWV0aG9kIGJsb2NrZWQgdG8gZXhlY3V0ZSBhIHNlcmlhbGl6ZWQgY29udHJvbCBtZXRob2QgdGhhdCBpcwotICogICAgICAgICAgYWxyZWFkeSBleGVjdXRpbmcKLSAqICAgICAgNykgQWJvdXQgdG8gaW52b2tlIGEgdXNlci1pbnN0YWxsZWQgb3ByZWdpb24gaGFuZGxlcgorICogREVTQ1JJUFRJT046IEV4aXQgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbiByZWdpb24uIFRoaXMgaXMgdGhlIHRvcCBsZXZlbAorICogICAgICAgICAgICAgIHJvdXRpbmUgdXNlZCB0byBleGl0IHRoZSBpbnRlcnByZXRlciB3aGVuIGFsbCBwcm9jZXNzaW5nIGhhcworICogICAgICAgICAgICAgIGJlZW4gY29tcGxldGVkLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTEyNyw3ICsxNTIsNDYgQEAKIAogCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9JTlRFUlBSRVRFUik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgcmVsZWFzZSBpbnRlcnByZXRlciBtdXRleCIpKTsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiQ291bGQgbm90IHJlbGVhc2UgQU1MIEludGVycHJldGVyIG11dGV4IikpOworCX0KKworCXJldHVybl9WT0lEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3JlbGlucXVpc2hfaW50ZXJwcmV0ZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEV4aXQgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbiByZWdpb24sIGZyb20gd2l0aGluIHRoZQorICogICAgICAgICAgICAgIGludGVycHJldGVyIC0gYmVmb3JlIGF0dGVtcHRpbmcgYW4gb3BlcmF0aW9uIHRoYXQgd2lsbCBwb3NzaWJseQorICogICAgICAgICAgICAgIGJsb2NrIHRoZSBydW5uaW5nIHRocmVhZC4KKyAqCisgKiBDYXNlcyB3aGVyZSB0aGUgaW50ZXJwcmV0ZXIgaXMgdW5sb2NrZWQgaW50ZXJuYWxseQorICogICAgICAxKSBNZXRob2QgdG8gYmUgYmxvY2tlZCBvbiBhIFNsZWVwKCkgQU1MIG9wY29kZQorICogICAgICAyKSBNZXRob2QgdG8gYmUgYmxvY2tlZCBvbiBhbiBBY3F1aXJlKCkgQU1MIG9wY29kZQorICogICAgICAzKSBNZXRob2QgdG8gYmUgYmxvY2tlZCBvbiBhIFdhaXQoKSBBTUwgb3Bjb2RlCisgKiAgICAgIDQpIE1ldGhvZCB0byBiZSBibG9ja2VkIHRvIGFjcXVpcmUgdGhlIGdsb2JhbCBsb2NrCisgKiAgICAgIDUpIE1ldGhvZCB0byBiZSBibG9ja2VkIHdhaXRpbmcgdG8gZXhlY3V0ZSBhIHNlcmlhbGl6ZWQgY29udHJvbCBtZXRob2QKKyAqICAgICAgICAgIHRoYXQgaXMgY3VycmVudGx5IGV4ZWN1dGluZworICogICAgICA2KSBBYm91dCB0byBpbnZva2UgYSB1c2VyLWluc3RhbGxlZCBvcHJlZ2lvbiBoYW5kbGVyCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX2V4X3JlbGlucXVpc2hfaW50ZXJwcmV0ZXIodm9pZCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3JlbGlucXVpc2hfaW50ZXJwcmV0ZXIpOworCisJLyoKKwkgKiBJZiB0aGUgZ2xvYmFsIHNlcmlhbGl6ZWQgZmxhZyBpcyBzZXQsIGRvIG5vdCByZWxlYXNlIHRoZSBpbnRlcnByZXRlci4KKwkgKiBUaGlzIGZvcmNlcyB0aGUgaW50ZXJwcmV0ZXIgdG8gYmUgc2luZ2xlIHRocmVhZGVkLgorCSAqLworCWlmICghYWNwaV9nYmxfYWxsX21ldGhvZHNfc2VyaWFsaXplZCkgeworCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAl9CiAKIAlyZXR1cm5fVk9JRDsKQEAgLTE0MSw4ICsyMDUsOCBAQAogICoKICAqIFJFVFVSTjogICAgICBub25lCiAgKgotICogREVTQ1JJUFRJT046IFRydW5jYXRlIGEgbnVtYmVyIHRvIDMyLWJpdHMgaWYgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgbWV0aG9kCi0gKiAgICAgICAgICAgICAgYmVsb25ncyB0byBhIDMyLWJpdCBBQ1BJIHRhYmxlLgorICogREVTQ1JJUFRJT046IFRydW5jYXRlIGFuIEFDUEkgSW50ZWdlciB0byAzMiBiaXRzIGlmIHRoZSBleGVjdXRpb24gbW9kZSBpcworICogICAgICAgICAgICAgIDMyLWJpdCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgcmV2aXNpb24gb2YgdGhlIERTRFQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Zhbi5jIGIvZHJpdmVycy9hY3BpL2Zhbi5jCmluZGV4IGYzMDVhODIuLmFmMjJmZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9mYW4uYworKysgYi9kcml2ZXJzL2FjcGkvZmFuLmMKQEAgLTQ4LDggKzQ4LDggQEAKIAogc3RhdGljIGludCBhY3BpX2Zhbl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX2Zhbl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXN0YXRpYyBpbnQgYWNwaV9mYW5fc3VzcGVuZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKTsKLXN0YXRpYyBpbnQgYWNwaV9mYW5fcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgc3RhdGUpOworc3RhdGljIGludCBhY3BpX2Zhbl9zdXNwZW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIGludCBhY3BpX2Zhbl9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfZmFuX2RyaXZlciA9IHsKIAkubmFtZSA9IEFDUElfRkFOX0RSSVZFUl9OQU1FLApAQCAtMjM3LDcgKzIzNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9mYW5fc3VzcGVuZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKQorc3RhdGljIGludCBhY3BpX2Zhbl9zdXNwZW5kKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJaWYgKCFkZXZpY2UpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJcmV0dXJuIEFFX09LOwogfQogCi1zdGF0aWMgaW50IGFjcGlfZmFuX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKQorc3RhdGljIGludCBhY3BpX2Zhbl9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IHBvd2VyX3N0YXRlID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9nbHVlLmMgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCmluZGV4IDhhMDMyNGIuLjdiNmM5ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9nbHVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtODYsMTI5ICs4Niw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogR2V0IFBDSSByb290IGJyaWRnZSdzIGhhbmRsZSBmcm9tIGl0cyBzZWdtZW50IGFuZCBidXMgbnVtYmVyICovCi1zdHJ1Y3QgYWNwaV9maW5kX3BjaV9yb290IHsKLQl1bnNpZ25lZCBpbnQgc2VnOwotCXVuc2lnbmVkIGludCBidXM7Ci0JYWNwaV9oYW5kbGUgaGFuZGxlOwotfTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1kb19yb290X2JyaWRnZV9idXNucl9jYWxsYmFjayhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyAqYnVzbnIgPSBkYXRhOwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyZXNzOwotCi0JaWYgKHJlc291cmNlLT50eXBlICE9IEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTYgJiYKLQkgICAgcmVzb3VyY2UtPnR5cGUgIT0gQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MzMiAmJgotCSAgICByZXNvdXJjZS0+dHlwZSAhPSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzY0KQotCQlyZXR1cm4gQUVfT0s7Ci0KLQlhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NChyZXNvdXJjZSwgJmFkZHJlc3MpOwotCWlmICgoYWRkcmVzcy5hZGRyZXNzX2xlbmd0aCA+IDApICYmCi0JICAgIChhZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9CVVNfTlVNQkVSX1JBTkdFKSkKLQkJKmJ1c25yID0gYWRkcmVzcy5taW5pbXVtOwotCi0JcmV0dXJuIEFFX09LOwotfQotCi1zdGF0aWMgaW50IGdldF9yb290X2JyaWRnZV9idXNucihhY3BpX2hhbmRsZSBoYW5kbGUpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgYnVzLCBiYm47Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKLQotCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgTUVUSE9EX05BTUVfX0JCTiwgTlVMTCwKLQkJCQkgICAgICAgJmJibik7Ci0JaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKLQkJLyogQXNzdW1lIGJ1cyA9IDAgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKLQkJICAgICAgICJBc3N1bWUgcm9vdCBicmlkZ2UgWyVzXSBidXMgaXMgMFxuIiwKLQkJICAgICAgIChjaGFyICopYnVmZmVyLnBvaW50ZXIpOwotCQlzdGF0dXMgPSBBRV9PSzsKLQkJYmJuID0gMDsKLQl9Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWJibiA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKGJibiA+IDApCi0JCWdvdG8gZXhpdDsKLQotCS8qIF9CQk4gaW4gc29tZSBzeXN0ZW1zIHJldHVybiAwIGZvciBhbGwgcm9vdCBicmlkZ2VzICovCi0JYnVzID0gLTE7Ci0Jc3RhdHVzID0gYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCi0JCQkJICAgICBkb19yb290X2JyaWRnZV9idXNucl9jYWxsYmFjaywgJmJ1cyk7Ci0JLyogSWYgX0NSUyBmYWlsZWQsIHdlIGp1c3QgdXNlIF9CQk4gKi8KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgKGJ1cyA9PSAtMSkpCi0JCWdvdG8gZXhpdDsKLQkvKiBXZSBzZWxlY3QgX0NSUyAqLwotCWlmIChiYm4gIT0gYnVzKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYCi0JCSAgICAgICAiX0JCTiBhbmQgX0NSUyByZXR1cm5zIGRpZmZlcmVudCB2YWx1ZSBmb3IgJXMuIFNlbGVjdCBfQ1JTXG4iLAotCQkgICAgICAgKGNoYXIgKilidWZmZXIucG9pbnRlcik7Ci0JCWJibiA9IGJ1czsKLQl9Ci0gICAgICBleGl0OgotCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKLQlyZXR1cm4gKGludCliYm47Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotZmluZF9wY2lfcm9vdGJyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKLXsKLQlzdHJ1Y3QgYWNwaV9maW5kX3BjaV9yb290ICpmaW5kID0gKHN0cnVjdCBhY3BpX2ZpbmRfcGNpX3Jvb3QgKiljb250ZXh0OwotCXVuc2lnbmVkIGxvbmcgc2VnLCBidXM7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWludCB0bXA7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKLQotCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgTUVUSE9EX05BTUVfX1NFRywgTlVMTCwgJnNlZyk7Ci0JaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKLQkJLyogQXNzdW1lIHNlZyA9IDAgKi8KLQkJc3RhdHVzID0gQUVfT0s7Ci0JCXNlZyA9IDA7Ci0JfQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlzdGF0dXMgPSBBRV9DVFJMX0RFUFRIOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JdG1wID0gZ2V0X3Jvb3RfYnJpZGdlX2J1c25yKGhhbmRsZSk7Ci0JaWYgKHRtcCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAotCQkgICAgICAgIkZpbmQgcm9vdCBicmlkZ2UgZmFpbGVkIGZvciAlc1xuIiwKLQkJICAgICAgIChjaGFyICopYnVmZmVyLnBvaW50ZXIpOwotCQlzdGF0dXMgPSBBRV9DVFJMX0RFUFRIOwotCQlnb3RvIGV4aXQ7Ci0JfQotCWJ1cyA9IHRtcDsKLQotCWlmIChzZWcgPT0gZmluZC0+c2VnICYmIGJ1cyA9PSBmaW5kLT5idXMpCi0JewotCQlmaW5kLT5oYW5kbGUgPSBoYW5kbGU7Ci0JCXN0YXR1cyA9IEFFX0NUUkxfVEVSTUlOQVRFOwotCX0KLQllbHNlCi0JCXN0YXR1cyA9IEFFX09LOwotICAgICAgZXhpdDoKLQlrZnJlZShidWZmZXIucG9pbnRlcik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotYWNwaV9oYW5kbGUgYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMpCi17Ci0Jc3RydWN0IGFjcGlfZmluZF9wY2lfcm9vdCBmaW5kID0geyBzZWcsIGJ1cywgTlVMTCB9OwotCi0JYWNwaV9nZXRfZGV2aWNlcyhQQ0lfUk9PVF9ISURfU1RSSU5HLCBmaW5kX3BjaV9yb290YnJpZGdlLCAmZmluZCwgTlVMTCk7Ci0JcmV0dXJuIGZpbmQuaGFuZGxlOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKTsKLQogLyogR2V0IGRldmljZSdzIGhhbmRsZXIgcGVyIGl0cyBhZGRyZXNzIHVuZGVyIGl0cyBwYXJlbnQgKi8KIHN0cnVjdCBhY3BpX2ZpbmRfY2hpbGQgewogCWFjcGlfaGFuZGxlIGhhbmRsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYwppbmRleCBkZTUwZmFiLi42MDMxY2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDksNDEgKzQ5LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2luaXRpYWxpemUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBhbmQgdmFsaWRhdGUgdGhlIHZhcmlvdXMgQUNQSSByZWdpc3RlcnMgZGVmaW5lZCBpbgotICogICAgICAgICAgICAgIHRoZSBGQURULgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2h3X2luaXRpYWxpemUodm9pZCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGh3X2luaXRpYWxpemUpOwotCi0JLyogV2UgbXVzdCBoYXZlIHRoZSBBQ1BJIHRhYmxlcyBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSAqLwotCi0JaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJObyBGQURUIGlzIHByZXNlbnQiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7Ci0JfQotCi0JLyogU2FuaXR5IGNoZWNrIHRoZSBGQURUIGZvciB2YWxpZCB2YWx1ZXMgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfZmFkdCgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgogICogRlVOQ1RJT046ICAgIGFjcGlfaHdfc2V0X21vZGUKICAqCiAgKiBQQVJBTUVURVJTOiAgTW9kZSAgICAgICAgICAgIC0gU1lTX01PREVfQUNQSSBvciBTWVNfTU9ERV9MRUdBQ1kKQEAgLTkzLDcgKzU4LDYgQEAKICAqIERFU0NSSVBUSU9OOiBUcmFuc2l0aW9ucyB0aGUgc3lzdGVtIGludG8gdGhlIHJlcXVlc3RlZCBtb2RlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzIGFjcGlfaHdfc2V0X21vZGUodTMyIG1vZGUpCiB7CiAKQEAgLTEwNiw3ICs3MCw3IEBACiAJICogQUNQSSAyLjAgY2xhcmlmaWVkIHRoYXQgaWYgU01JX0NNRCBpbiBGQURUIGlzIHplcm8sCiAJICogc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgbW9kZSB0cmFuc2l0aW9uLgogCSAqLwotCWlmICghYWNwaV9nYmxfRkFEVC0+c21pX2NtZCkgeworCWlmICghYWNwaV9nYmxfRkFEVC5zbWlfY29tbWFuZCkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAogCQkJICAgICJObyBTTUlfQ01EIGluIEZBRFQsIG1vZGUgdHJhbnNpdGlvbiBmYWlsZWQiKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19IQVJEV0FSRV9SRVNQT05TRSk7CkBAIC0xMTksNyArODMsNyBAQAogCSAqIHdlIG1ha2Ugc3VyZSBib3RoIHRoZSBudW1iZXJzIGFyZSB6ZXJvIHRvIGRldGVybWluZSB0aGVzZQogCSAqIHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgogCSAqLwotCWlmICghYWNwaV9nYmxfRkFEVC0+YWNwaV9lbmFibGUgJiYgIWFjcGlfZ2JsX0ZBRFQtPmFjcGlfZGlzYWJsZSkgeworCWlmICghYWNwaV9nYmxfRkFEVC5hY3BpX2VuYWJsZSAmJiAhYWNwaV9nYmxfRkFEVC5hY3BpX2Rpc2FibGUpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKIAkJCSAgICAiTm8gQUNQSSBtb2RlIHRyYW5zaXRpb24gc3VwcG9ydGVkIGluIHRoaXMgc3lzdGVtIChlbmFibGUvZGlzYWJsZSBib3RoIHplcm8pIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwpAQCAtMTMwLDkgKzk0LDggQEAKIAogCQkvKiBCSU9TIHNob3VsZCBoYXZlIGRpc2FibGVkIEFMTCBmaXhlZCBhbmQgR1AgZXZlbnRzICovCiAKLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsCi0JCQkJCSAgICAodTMyKSBhY3BpX2dibF9GQURULT5hY3BpX2VuYWJsZSwKLQkJCQkJICAgIDgpOworCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9nYmxfRkFEVC5zbWlfY29tbWFuZCwKKwkJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQuYWNwaV9lbmFibGUsIDgpOwogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkJICAiQXR0ZW1wdGluZyB0byBlbmFibGUgQUNQSSBtb2RlXG4iKSk7CiAJCWJyZWFrOwpAQCAtMTQzLDggKzEwNiw4IEBACiAJCSAqIEJJT1Mgc2hvdWxkIGNsZWFyIGFsbCBmaXhlZCBzdGF0dXMgYml0cyBhbmQgcmVzdG9yZSBmaXhlZCBldmVudAogCQkgKiBlbmFibGUgYml0cyB0byBkZWZhdWx0CiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwKLQkJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQtPmFjcGlfZGlzYWJsZSwKKwkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQsCisJCQkJCSAgICAodTMyKSBhY3BpX2dibF9GQURULmFjcGlfZGlzYWJsZSwKIAkJCQkJICAgIDgpOwogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkJICAiQXR0ZW1wdGluZyB0byBlbmFibGUgTGVnYWN5IChub24tQUNQSSkgbW9kZVxuIikpOwpAQCAtMjA0LDEyICsxNjcsMTEgQEAKIAkgKiBBQ1BJIDIuMCBjbGFyaWZpZWQgdGhhdCBpZiBTTUlfQ01EIGluIEZBRFQgaXMgemVybywKIAkgKiBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBtb2RlIHRyYW5zaXRpb24uCiAJICovCi0JaWYgKCFhY3BpX2dibF9GQURULT5zbWlfY21kKSB7CisJaWYgKCFhY3BpX2dibF9GQURULnNtaV9jb21tYW5kKSB7CiAJCXJldHVybl9VSU5UMzIoQUNQSV9TWVNfTU9ERV9BQ1BJKTsKIAl9CiAKLQlzdGF0dXMgPQotCSAgICBhY3BpX2dldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19TQ0lfRU5BQkxFLCAmdmFsdWUsIEFDUElfTVRYX0xPQ0spOworCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1NDSV9FTkFCTEUsICZ2YWx1ZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9VSU5UMzIoQUNQSV9TWVNfTU9ERV9MRUdBQ1kpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3Z3BlLmMKaW5kZXggNjA4YTNhNi4uMTE3YTA1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3Z3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3Z3BlLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMDUsMTQgKzEwNSwyMCBAQAogYWNwaV9zdGF0dXMgYWNwaV9od19jbGVhcl9ncGUoc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKiBncGVfZXZlbnRfaW5mbykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTggcmVnaXN0ZXJfYml0OwogCiAJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCisJcmVnaXN0ZXJfYml0ID0gKHU4KQorCSAgICAoMSA8PAorCSAgICAgKGdwZV9ldmVudF9pbmZvLT5ncGVfbnVtYmVyIC0KKwkgICAgICBncGVfZXZlbnRfaW5mby0+cmVnaXN0ZXJfaW5mby0+YmFzZV9ncGVfbnVtYmVyKSk7CisKIAkvKgogCSAqIFdyaXRlIGEgb25lIHRvIHRoZSBhcHByb3ByaWF0ZSBiaXQgaW4gdGhlIHN0YXR1cyByZWdpc3RlciB0bwogCSAqIGNsZWFyIHRoaXMgR1BFLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9iaXQsCisJc3RhdHVzID0gYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgcmVnaXN0ZXJfYml0LAogCQkJCQkgJmdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9pbmZvLT4KIAkJCQkJIHN0YXR1c19hZGRyZXNzKTsKIApAQCAtMTU1LDcgKzE2MSwxMCBAQAogCiAJLyogR2V0IHRoZSByZWdpc3RlciBiaXRtYXNrIGZvciB0aGlzIEdQRSAqLwogCi0JcmVnaXN0ZXJfYml0ID0gZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2JpdDsKKwlyZWdpc3Rlcl9iaXQgPSAodTgpCisJICAgICgxIDw8CisJICAgICAoZ3BlX2V2ZW50X2luZm8tPmdwZV9udW1iZXIgLQorCSAgICAgIGdwZV9ldmVudF9pbmZvLT5yZWdpc3Rlcl9pbmZvLT5iYXNlX2dwZV9udW1iZXIpKTsKIAogCS8qIEdQRSBjdXJyZW50bHkgZW5hYmxlZD8gKGVuYWJsZWQgZm9yIHJ1bnRpbWU/KSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMKaW5kZXggZmE1OGMxZS4uMWQzNzFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3cmVncy5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3JlZ3MuYwpAQCAtNyw3ICs3LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01NCwxNyArNTQsMTUgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9od19jbGVhcl9hY3BpX3N0YXR1cwogICoKLSAqIFBBUkFNRVRFUlM6ICBGbGFncyAgICAgICAgICAgLSBMb2NrIHRoZSBoYXJkd2FyZSBvciBub3QKKyAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgotICogUkVUVVJOOiAgICAgIG5vbmUKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IENsZWFycyBhbGwgZml4ZWQgYW5kIGdlbmVyYWwgcHVycG9zZSBzdGF0dXMgYml0cwogICogICAgICAgICAgICAgIFRISVMgRlVOQ1RJT04gTVVTVCBCRSBDQUxMRUQgV0lUSCBJTlRFUlJVUFRTIERJU0FCTEVECiAgKgotICogTk9URTogVEJEOiBGbGFncyBwYXJhbWV0ZXIgaXMgb2Jzb2xldGUsIHRvIGJlIHJlbW92ZWQKLSAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9od19jbGVhcl9hY3BpX3N0YXR1cyh1MzIgZmxhZ3MpCithY3BpX3N0YXR1cyBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzKHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfY3B1X2ZsYWdzIGxvY2tfZmxhZ3MgPSAwOwpAQCAtNzMsNyArNzEsNyBAQAogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTywgIkFib3V0IHRvIHdyaXRlICUwNFggdG8gJTA0WFxuIiwKIAkJCSAgQUNQSV9CSVRNQVNLX0FMTF9GSVhFRF9TVEFUVVMsCi0JCQkgICh1MTYpIGFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcykpOworCQkJICAodTE2KSBhY3BpX2dibF9GQURULnhwbTFhX2V2ZW50X2Jsb2NrLmFkZHJlc3MpKTsKIAogCWxvY2tfZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrKTsKIApAQCAtODYsMTAgKzg0LDEwIEBACiAKIAkvKiBDbGVhciB0aGUgZml4ZWQgZXZlbnRzICovCiAKLQlpZiAoYWNwaV9nYmxfRkFEVC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzKSB7CisJaWYgKGFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2suYWRkcmVzcykgewogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIEFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTLAotCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2V2dF9ibGspOworCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2spOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CkBAIC0yNTMsMTggKzI1MSwxNSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICByZWdpc3Rlcl9pZCAgICAgLSBJRCBvZiBBQ1BJIGJpdF9yZWdpc3RlciB0byBhY2Nlc3MKICAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgLSBWYWx1ZSB0aGF0IHdhcyByZWFkIGZyb20gdGhlIHJlZ2lzdGVyCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gTG9jayB0aGUgaGFyZHdhcmUgb3Igbm90CiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgdGhlIHZhbHVlIHJlYWQgZnJvbSBzcGVjaWZpZWQgUmVnaXN0ZXIuIFZhbHVlCiAgKiAgICAgICAgICAgICAgcmV0dXJuZWQgaXMgbm9ybWFsaXplZCB0byBiaXQwIChpcyBzaGlmdGVkIGFsbCB0aGUgd2F5IHJpZ2h0KQogICoKICAqIERFU0NSSVBUSU9OOiBBQ1BJIGJpdF9yZWdpc3RlciByZWFkIGZ1bmN0aW9uLgogICoKLSAqIE5PVEU6IFRCRDogRmxhZ3MgcGFyYW1ldGVyIGlzIG9ic29sZXRlLCB0byBiZSByZW1vdmVkCi0gKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgYWNwaV9nZXRfcmVnaXN0ZXIodTMyIHJlZ2lzdGVyX2lkLCB1MzIgKiByZXR1cm5fdmFsdWUsIHUzMiBmbGFncykKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3JlZ2lzdGVyKHUzMiByZWdpc3Rlcl9pZCwgdTMyICogcmV0dXJuX3ZhbHVlKQogewogCXUzMiByZWdpc3Rlcl92YWx1ZSA9IDA7CiAJc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKmJpdF9yZWdfaW5mbzsKQEAgLTMxMiwxNiArMzA3LDEzIEBACiAgKiBQQVJBTUVURVJTOiAgcmVnaXN0ZXJfaWQgICAgIC0gSUQgb2YgQUNQSSBiaXRfcmVnaXN0ZXIgdG8gYWNjZXNzCiAgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgIC0gKG9ubHkgdXNlZCBvbiB3cml0ZSkgdmFsdWUgdG8gd3JpdGUgdG8gdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIsIE5PVCBwcmUtbm9ybWFsaXplZCB0byB0aGUgYml0IHBvcwotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAtIExvY2sgdGhlIGhhcmR3YXJlIG9yIG5vdAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogQUNQSSBCaXQgUmVnaXN0ZXIgd3JpdGUgZnVuY3Rpb24uCiAgKgotICogTk9URTogVEJEOiBGbGFncyBwYXJhbWV0ZXIgaXMgb2Jzb2xldGUsIHRvIGJlIHJlbW92ZWQKLSAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV9zZXRfcmVnaXN0ZXIodTMyIHJlZ2lzdGVyX2lkLCB1MzIgdmFsdWUsIHUzMiBmbGFncykKK2FjcGlfc3RhdHVzIGFjcGlfc2V0X3JlZ2lzdGVyKHUzMiByZWdpc3Rlcl9pZCwgdTMyIHZhbHVlKQogewogCXUzMiByZWdpc3Rlcl92YWx1ZSA9IDA7CiAJc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gKmJpdF9yZWdfaW5mbzsKQEAgLTQyMiw4ICs0MTQsOSBAQAogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLAogCQkJCSAgIlBNMiBjb250cm9sOiBSZWFkICVYIGZyb20gJTguOFglOC44WFxuIiwKIAkJCQkgIHJlZ2lzdGVyX3ZhbHVlLAotCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGFjcGlfZ2JsX0ZBRFQtPgotCQkJCQkJICAgICB4cG0yX2NudF9ibGsuYWRkcmVzcykpKTsKKwkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhY3BpX2dibF9GQURULgorCQkJCQkJICAgICB4cG0yX2NvbnRyb2xfYmxvY2suCisJCQkJCQkgICAgIGFkZHJlc3MpKSk7CiAKIAkJQUNQSV9SRUdJU1RFUl9JTlNFUlRfVkFMVUUocmVnaXN0ZXJfdmFsdWUsCiAJCQkJCSAgIGJpdF9yZWdfaW5mby0+Yml0X3Bvc2l0aW9uLApAQCAtNDMzLDggKzQyNiw5IEBACiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sCiAJCQkJICAiQWJvdXQgdG8gd3JpdGUgJTQuNFggdG8gJTguOFglOC44WFxuIiwKIAkJCQkgIHJlZ2lzdGVyX3ZhbHVlLAotCQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGFjcGlfZ2JsX0ZBRFQtPgotCQkJCQkJICAgICB4cG0yX2NudF9ibGsuYWRkcmVzcykpKTsKKwkJCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhY3BpX2dibF9GQURULgorCQkJCQkJICAgICB4cG0yX2NvbnRyb2xfYmxvY2suCisJCQkJCQkgICAgIGFkZHJlc3MpKSk7CiAKIAkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX01UWF9ET19OT1RfTE9DSywKIAkJCQkJCUFDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsCkBAIC00OTUsNyArNDg5LDcgQEAKIAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZCgxNiwgJnZhbHVlMSwKLQkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGspOworCQkJCQkgICAmYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jayk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KQEAgLTUwNCw3ICs0OTgsNyBAQAogCiAJCXN0YXR1cyA9CiAJCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDE2LCAmdmFsdWUyLAotCQkJCQkgICAmYWNwaV9nYmxfRkFEVC0+eHBtMWJfZXZ0X2Jsayk7CisJCQkJCSAgICZhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrKTsKIAkJdmFsdWUxIHw9IHZhbHVlMjsKIAkJYnJlYWs7CiAKQEAgLTUyNywxNCArNTIxLDE0IEBACiAKIAkJc3RhdHVzID0KIAkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoMTYsICZ2YWx1ZTEsCi0JCQkJCSAgICZhY3BpX2dibF9GQURULT54cG0xYV9jbnRfYmxrKTsKKwkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQueHBtMWFfY29udHJvbF9ibG9jayk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCX0KIAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfcmVhZCgxNiwgJnZhbHVlMiwKLQkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2NudF9ibGspOworCQkJCQkgICAmYWNwaV9nYmxfRkFEVC54cG0xYl9jb250cm9sX2Jsb2NrKTsKIAkJdmFsdWUxIHw9IHZhbHVlMjsKIAkJYnJlYWs7CiAKQEAgLTU0MiwxOSArNTM2LDIwIEBACiAKIAkJc3RhdHVzID0KIAkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnZhbHVlMSwKLQkJCQkJICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsayk7CisJCQkJCSAgICZhY3BpX2dibF9GQURULnhwbTJfY29udHJvbF9ibG9jayk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNX1RJTUVSOgkvKiAzMi1iaXQgYWNjZXNzICovCiAKIAkJc3RhdHVzID0KIAkJICAgIGFjcGlfaHdfbG93X2xldmVsX3JlYWQoMzIsICZ2YWx1ZTEsCi0JCQkJCSAgICZhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsayk7CisJCQkJCSAgICZhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jayk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1JFR0lTVEVSX1NNSV9DT01NQU5EX0JMT0NLOgkvKiA4LWJpdCBhY2Nlc3MgKi8KIAotCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydChhY3BpX2dibF9GQURULT5zbWlfY21kLCAmdmFsdWUxLCA4KTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfb3NfcmVhZF9wb3J0KGFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQsICZ2YWx1ZTEsIDgpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC02MzUsNyArNjMwLDcgQEAKIAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIHZhbHVlLAotCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGspOworCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQueHBtMWFfZXZlbnRfYmxvY2spOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQl9CkBAIC02NDQsNyArNjM5LDcgQEAKIAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIHZhbHVlLAotCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2V2dF9ibGspOworCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2spOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFOgkvKiAxNi1iaXQgYWNjZXNzICovCkBAIC02ODIsNDkgKzY3Nyw1MCBAQAogCiAJCXN0YXR1cyA9CiAJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgxNiwgdmFsdWUsCi0JCQkJCSAgICAmYWNwaV9nYmxfRkFEVC0+eHBtMWFfY250X2Jsayk7CisJCQkJCSAgICAmYWNwaV9nYmxfRkFEVC54cG0xYV9jb250cm9sX2Jsb2NrKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAkJfQogCiAJCXN0YXR1cyA9CiAJCSAgICBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSgxNiwgdmFsdWUsCi0JCQkJCSAgICAmYWNwaV9nYmxfRkFEVC0+eHBtMWJfY250X2Jsayk7CisJCQkJCSAgICAmYWNwaV9nYmxfRkFEVC54cG0xYl9jb250cm9sX2Jsb2NrKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MOgkvKiAxNi1iaXQgYWNjZXNzICovCiAKIAkJc3RhdHVzID0KIAkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDE2LCB2YWx1ZSwKLQkJCQkJICAgICZhY3BpX2dibF9GQURULT54cG0xYV9jbnRfYmxrKTsKKwkJCQkJICAgICZhY3BpX2dibF9GQURULnhwbTFhX2NvbnRyb2xfYmxvY2spOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0w6CS8qIDE2LWJpdCBhY2Nlc3MgKi8KIAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoMTYsIHZhbHVlLAotCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2NudF9ibGspOworCQkJCQkgICAgJmFjcGlfZ2JsX0ZBRFQueHBtMWJfY29udHJvbF9ibG9jayk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNMl9DT05UUk9MOgkvKiA4LWJpdCBhY2Nlc3MgKi8KIAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgdmFsdWUsCi0JCQkJCSAgICAmYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrKTsKKwkJCQkJICAgICZhY3BpX2dibF9GQURULnhwbTJfY29udHJvbF9ibG9jayk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1JFR0lTVEVSX1BNX1RJTUVSOgkvKiAzMi1iaXQgYWNjZXNzICovCiAKIAkJc3RhdHVzID0KIAkJICAgIGFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDMyLCB2YWx1ZSwKLQkJCQkJICAgICZhY3BpX2dibF9GQURULT54cG1fdG1yX2Jsayk7CisJCQkJCSAgICAmYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2spOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9SRUdJU1RFUl9TTUlfQ09NTUFORF9CTE9DSzoJLyogOC1iaXQgYWNjZXNzICovCiAKIAkJLyogU01JX0NNRCBpcyBjdXJyZW50bHkgYWx3YXlzIGluIElPIHNwYWNlICovCiAKLQkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsIHZhbHVlLCA4KTsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2dibF9GQURULnNtaV9jb21tYW5kLCB2YWx1ZSwgOCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTc4Myw3ICs3NzksNyBAQAogCSAqIFR3byBhZGRyZXNzIHNwYWNlcyBzdXBwb3J0ZWQ6IE1lbW9yeSBvciBJTy4KIAkgKiBQQ0lfQ29uZmlnIGlzIG5vdCBzdXBwb3J0ZWQgaGVyZSBiZWNhdXNlIHRoZSBHQVMgc3RydWN0IGlzIGluc3VmZmljaWVudAogCSAqLwotCXN3aXRjaCAocmVnLT5hZGRyZXNzX3NwYWNlX2lkKSB7CisJc3dpdGNoIChyZWctPnNwYWNlX2lkKSB7CiAJY2FzZSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZOgogCiAJCXN0YXR1cyA9IGFjcGlfb3NfcmVhZF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgYWRkcmVzcywKQEAgLTc5MiwyMiArNzg4LDIwIEBACiAKIAljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzoKIAotCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydCgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLAotCQkJCQkgICB2YWx1ZSwgd2lkdGgpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9vc19yZWFkX3BvcnQoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywgdmFsdWUsIHdpZHRoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAlWCIsCi0JCQkgICAgcmVnLT5hZGRyZXNzX3NwYWNlX2lkKSk7CisJCQkgICAgIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2U6ICVYIiwgcmVnLT5zcGFjZV9pZCkpOwogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sCiAJCQkgICJSZWFkOiAgJTguOFggd2lkdGggJTJkIGZyb20gJTguOFglOC44WCAoJXMpXG4iLAotCQkJICAqdmFsdWUsIHdpZHRoLAotCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCi0JCQkgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpKTsKKwkJCSAgKnZhbHVlLCB3aWR0aCwgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpLAorCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWctPnNwYWNlX2lkKSkpOwogCiAJcmV0dXJuIChzdGF0dXMpOwogfQpAQCAtODU0LDcgKzg0OCw3IEBACiAJICogVHdvIGFkZHJlc3Mgc3BhY2VzIHN1cHBvcnRlZDogTWVtb3J5IG9yIElPLgogCSAqIFBDSV9Db25maWcgaXMgbm90IHN1cHBvcnRlZCBoZXJlIGJlY2F1c2UgdGhlIEdBUyBzdHJ1Y3QgaXMgaW5zdWZmaWNpZW50CiAJICovCi0Jc3dpdGNoIChyZWctPmFkZHJlc3Nfc3BhY2VfaWQpIHsKKwlzd2l0Y2ggKHJlZy0+c3BhY2VfaWQpIHsKIAljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlk6CiAKIAkJc3RhdHVzID0gYWNwaV9vc193cml0ZV9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgYWRkcmVzcywKQEAgLTg2MywyMiArODU3LDIwIEBACiAKIAljYXNlIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzoKIAotCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywKLQkJCQkJICAgIHZhbHVlLCB3aWR0aCk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCgoYWNwaV9pb19hZGRyZXNzKSBhZGRyZXNzLCB2YWx1ZSwKKwkJCQkJICAgIHdpZHRoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJVbnN1cHBvcnRlZCBhZGRyZXNzIHNwYWNlOiAlWCIsCi0JCQkgICAgcmVnLT5hZGRyZXNzX3NwYWNlX2lkKSk7CisJCQkgICAgIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2U6ICVYIiwgcmVnLT5zcGFjZV9pZCkpOwogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU8sCiAJCQkgICJXcm90ZTogJTguOFggd2lkdGggJTJkICAgdG8gJTguOFglOC44WCAoJXMpXG4iLAotCQkJICB2YWx1ZSwgd2lkdGgsCi0JCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSwKLQkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnLT5hZGRyZXNzX3NwYWNlX2lkKSkpOworCQkJICB2YWx1ZSwgd2lkdGgsIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSwKKwkJCSAgYWNwaV91dF9nZXRfcmVnaW9uX25hbWUocmVnLT5zcGFjZV9pZCkpKTsKIAogCXJldHVybiAoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jCmluZGV4IDhiYjQzY2EuLjU3OTAxY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQzLDYgKzQzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9IQVJEV0FSRQogQUNQSV9NT0RVTEVfTkFNRSgiaHdzbGVlcCIpCkBAIC02MiwxNyArNjMsMzIgQEAKIGFjcGlfc3RhdHVzCiBhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzaWNhbF9hZGRyZXNzKQogeworCXN0cnVjdCBhY3BpX3RhYmxlX2ZhY3MgKmZhY3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKTsKIAorCS8qIEdldCB0aGUgRkFDUyAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgoQUNQSV9UQUJMRV9JTkRFWF9GQUNTLAorCQkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKSZmYWNzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCiAJLyogU2V0IHRoZSB2ZWN0b3IgKi8KIAotCWlmIChhY3BpX2dibF9jb21tb25fZkFDUy52ZWN0b3Jfd2lkdGggPT0gMzIpIHsKLQkJKihBQ1BJX0NBU1RfUFRSCi0JCSAgKHUzMiwgYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpCi0JCSAgICA9ICh1MzIpIHBoeXNpY2FsX2FkZHJlc3M7CisJaWYgKChmYWNzLT5sZW5ndGggPCAzMikgfHwgKCEoZmFjcy0+eGZpcm13YXJlX3dha2luZ192ZWN0b3IpKSkgeworCQkvKgorCQkgKiBBQ1BJIDEuMCBGQUNTIG9yIHNob3J0IHRhYmxlIG9yIG9wdGlvbmFsIFhfIGZpZWxkIGlzIHplcm8KKwkJICovCisJCWZhY3MtPmZpcm13YXJlX3dha2luZ192ZWN0b3IgPSAodTMyKSBwaHlzaWNhbF9hZGRyZXNzOwogCX0gZWxzZSB7Ci0JCSphY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0gcGh5c2ljYWxfYWRkcmVzczsKKwkJLyoKKwkJICogQUNQSSAyLjAgRkFDUyB3aXRoIHZhbGlkIFhfIGZpZWxkCisJCSAqLworCQlmYWNzLT54ZmlybXdhcmVfd2FraW5nX3ZlY3RvciA9IHBoeXNpY2FsX2FkZHJlc3M7CiAJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKQEAgLTk3LDYgKzExMyw4IEBACiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcihhY3BpX3BoeXNpY2FsX2FkZHJlc3MgKiBwaHlzaWNhbF9hZGRyZXNzKQogeworCXN0cnVjdCBhY3BpX3RhYmxlX2ZhY3MgKmZhY3M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKTsKIApAQCAtMTA0LDE2ICsxMjIsMjkgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAorCS8qIEdldCB0aGUgRkFDUyAqLworCisJc3RhdHVzID0KKwkgICAgYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgoQUNQSV9UQUJMRV9JTkRFWF9GQUNTLAorCQkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKSZmYWNzKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCiAJLyogR2V0IHRoZSB2ZWN0b3IgKi8KIAotCWlmIChhY3BpX2dibF9jb21tb25fZkFDUy52ZWN0b3Jfd2lkdGggPT0gMzIpIHsKLQkJKnBoeXNpY2FsX2FkZHJlc3MgPSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkgICAgKgotCQkgICAgKEFDUElfQ0FTVF9QVFIKLQkJICAgICAodTMyLCBhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yKSk7Ci0JfSBlbHNlIHsKKwlpZiAoKGZhY3MtPmxlbmd0aCA8IDMyKSB8fCAoIShmYWNzLT54ZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpKSB7CisJCS8qCisJCSAqIEFDUEkgMS4wIEZBQ1Mgb3Igc2hvcnQgdGFibGUgb3Igb3B0aW9uYWwgWF8gZmllbGQgaXMgemVybworCQkgKi8KIAkJKnBoeXNpY2FsX2FkZHJlc3MgPQotCQkgICAgKmFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3I7CisJCSAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBmYWNzLT5maXJtd2FyZV93YWtpbmdfdmVjdG9yOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEFDUEkgMi4wIEZBQ1Mgd2l0aCB2YWxpZCBYXyBmaWVsZAorCQkgKi8KKwkJKnBoeXNpY2FsX2FkZHJlc3MgPQorCQkgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgZmFjcy0+eGZpcm13YXJlX3dha2luZ192ZWN0b3I7CiAJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKQEAgLTI0NiwxNSArMjc3LDE0IEBACiAKIAkvKiBDbGVhciB3YWtlIHN0YXR1cyAqLwogCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgMSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIENsZWFyIGFsbCBmaXhlZCBhbmQgZ2VuZXJhbCBwdXJwb3NlIHN0YXR1cyBiaXRzICovCiAKLQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzKEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzKCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KQEAgLTM2Nyw4ICszOTcsNyBAQAogCS8qIFdhaXQgdW50aWwgd2UgZW50ZXIgc2xlZXAgc3RhdGUgKi8KIAogCWRvIHsKLQkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsICZpbl92YWx1ZSwKLQkJCQkJICAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQlzdGF0dXMgPSBhY3BpX2dldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgJmluX3ZhbHVlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQpAQCAtNDAxLDEzICs0MzAsMTIgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3MpOwogCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfV0FLRV9TVEFUVVMsIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgMSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMoQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXMoKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQpAQCAtNDI5LDEzICs0NTcsMTIgQEAKIAogCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CiAKLQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9nYmxfRkFEVC0+c21pX2NtZCwKLQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+UzRiaW9zX3JlcSwgOCk7CisJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQsCisJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQuUzRiaW9zX3JlcXVlc3QsIDgpOwogCiAJZG8gewogCQlhY3BpX29zX3N0YWxsKDEwMDApOwotCQlzdGF0dXMgPSBhY3BpX2dldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgJmluX3ZhbHVlLAotCQkJCQkgICBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAmaW5fdmFsdWUpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CkBAIC01NjgsMTMgKzU5NSwxMSBAQAogCiAJKHZvaWQpCiAJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm8KLQkJCSAgICAgIFtBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uZW5hYmxlX3JlZ2lzdGVyX2lkLCAxLAotCQkJICAgICAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJICAgICAgW0FDUElfRVZFTlRfUE9XRVJfQlVUVE9OXS5lbmFibGVfcmVnaXN0ZXJfaWQsIDEpOwogCiAJKHZvaWQpCiAJICAgIGFjcGlfc2V0X3JlZ2lzdGVyKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm8KLQkJCSAgICAgIFtBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uc3RhdHVzX3JlZ2lzdGVyX2lkLCAxLAotCQkJICAgICAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJICAgICAgW0FDUElfRVZFTlRfUE9XRVJfQlVUVE9OXS5zdGF0dXNfcmVnaXN0ZXJfaWQsIDEpOwogCiAJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9XT1JLSU5HOwogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYwppbmRleCBjNGVjNDdjLi5jMzJlYWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02Niw3ICs2Niw3IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlpZiAoYWNwaV9nYmxfRkFEVC0+dG1yX3ZhbF9leHQgPT0gMCkgeworCWlmICgoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF8zMkJJVF9USU1FUikgPT0gMCkgewogCQkqcmVzb2x1dGlvbiA9IDI0OwogCX0gZWxzZSB7CiAJCSpyZXNvbHV0aW9uID0gMzI7CkBAIC05OCw3ICs5OCw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDMyLCB0aWNrcywgJmFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrKTsKKwlzdGF0dXMgPQorCSAgICBhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDMyLCB0aWNrcywgJmFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrKTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpAQCAtMTUzLDcgKzE1NCw3IEBACiAJaWYgKHN0YXJ0X3RpY2tzIDwgZW5kX3RpY2tzKSB7CiAJCWRlbHRhX3RpY2tzID0gZW5kX3RpY2tzIC0gc3RhcnRfdGlja3M7CiAJfSBlbHNlIGlmIChzdGFydF90aWNrcyA+IGVuZF90aWNrcykgewotCQlpZiAoYWNwaV9nYmxfRkFEVC0+dG1yX3ZhbF9leHQgPT0gMCkgeworCQlpZiAoKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfMzJCSVRfVElNRVIpID09IDApIHsKIAogCQkJLyogMjQtYml0IFRpbWVyICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9tb3RoZXJib2FyZC5jIGIvZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTdlYzc1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9tb3RoZXJib2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qIAotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqLwotCi0vKiBQdXJwb3NlOiBQcmV2ZW50IFBDTUNJQSBjYXJkcyBmcm9tIHVzaW5nIG1vdGhlcmJvYXJkIHJlc291cmNlcy4gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX21vdGhlcmJvYXJkIikKLQotLyogRGVsbCB1c2UgUE5QMEMwMSBpbnN0ZWFkIG9mIFBOUDBDMDIgKi8KLSNkZWZpbmUgQUNQSV9NQl9ISUQxCQkJIlBOUDBDMDEiCi0jZGVmaW5lIEFDUElfTUJfSElEMgkJCSJQTlAwQzAyIgotLyoqCi0gKiBEb2Vzbid0IGNhcmUgYWJvdXQgbGVnYWN5IElPIHBvcnRzLCBvbmx5IElPIHBvcnRzIGJleW9uZCAweDEwMDAgYXJlIHJlc2VydmVkCi0gKiBEb2Vzbid0IGNhcmUgYWJvdXQgdGhlIGZhaWx1cmUgb2YgJ3JlcXVlc3RfcmVnaW9uJywgc2luY2Ugb3RoZXIgbWF5IHJlc2VydmUKLSAqIHRoZSBpbyBwb3J0cyBhcyB3ZWxsCi0gKi8KLSNkZWZpbmUgSVNfUkVTRVJWRURfQUREUihiYXNlLCBsZW4pIFwKLQkoKChsZW4pID4gMCkgJiYgKChiYXNlKSA+IDApICYmICgoYmFzZSkgKyAobGVuKSA8IElPX1NQQUNFX0xJTUlUKSBcCi0JJiYgKChiYXNlKSArIChsZW4pID4gUENJQklPU19NSU5fSU8pKQotLyoKLSAqIENsZWFyaW5nIHRoZSBmbGFnIChJT1JFU09VUkNFX0JVU1kpIGFsbG93cyBkcml2ZXJzIHRvIHVzZQotICogdGhlIGlvIHBvcnRzIGlmIHRoZXkgcmVhbGx5IGtub3cgdGhleSBjYW4gdXNlIGl0LCB3aGlsZQotICogc3RpbGwgcHJldmVudGluZyBob3RwbHVnIFBDSSBkZXZpY2VzIGZyb20gdXNpbmcgaXQuCi0gKi8KLQotLyoKLSAqIFdoZW4gQ09ORklHX1BOUCBpcyBlbmFibGVkLCBwbnAvc3lzdGVtLmMgYmluZHMgdG8gUE5QMEMwMQotICogYW5kIFBOUDBDMDIsIHJlZHVuZGFudCB3aXRoIGFjcGlfcmVzZXJ2ZV9pb19yYW5nZXMoKS4KLSAqIEJ1dCBhY3BpX3Jlc2VydmVfaW9fcmFuZ2VzKCkgaXMgbmVjZXNzYXJ5IGZvciAhQ09ORklHX1BOUC4KLSAqLwotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfcmVzZXJ2ZV9pb19yYW5nZXMoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlcywgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcXVlc3RlZF9yZXMgPSBOVUxMOwotCi0KLQlpZiAocmVzLT50eXBlID09IEFDUElfUkVTT1VSQ0VfVFlQRV9JTykgewotCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyAqaW9fcmVzID0gJnJlcy0+ZGF0YS5pbzsKLQotCQlpZiAoaW9fcmVzLT5taW5pbXVtICE9IGlvX3Jlcy0+bWF4aW11bSkKLQkJCXJldHVybiBBRV9PSzsKLQkJaWYgKElTX1JFU0VSVkVEX0FERFIKLQkJICAgIChpb19yZXMtPm1pbmltdW0sIGlvX3Jlcy0+YWRkcmVzc19sZW5ndGgpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJCSAgIk1vdGhlcmJvYXJkIHJlc291cmNlcyAweCUwOHggLSAweCUwOHhcbiIsCi0JCQkJCSAgaW9fcmVzLT5taW5pbXVtLAotCQkJCQkgIGlvX3Jlcy0+bWluaW11bSArCi0JCQkJCSAgaW9fcmVzLT5hZGRyZXNzX2xlbmd0aCkpOwotCQkJcmVxdWVzdGVkX3JlcyA9Ci0JCQkgICAgcmVxdWVzdF9yZWdpb24oaW9fcmVzLT5taW5pbXVtLAotCQkJCQkgICBpb19yZXMtPmFkZHJlc3NfbGVuZ3RoLCAibW90aGVyYm9hcmQiKTsKLQkJfQotCX0gZWxzZSBpZiAocmVzLT50eXBlID09IEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTykgewotCQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyAqZml4ZWRfaW9fcmVzID0KLQkJICAgICZyZXMtPmRhdGEuZml4ZWRfaW87Ci0KLQkJaWYgKElTX1JFU0VSVkVEX0FERFIKLQkJICAgIChmaXhlZF9pb19yZXMtPmFkZHJlc3MsIGZpeGVkX2lvX3Jlcy0+YWRkcmVzc19sZW5ndGgpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJCSAgIk1vdGhlcmJvYXJkIHJlc291cmNlcyAweCUwOHggLSAweCUwOHhcbiIsCi0JCQkJCSAgZml4ZWRfaW9fcmVzLT5hZGRyZXNzLAotCQkJCQkgIGZpeGVkX2lvX3Jlcy0+YWRkcmVzcyArCi0JCQkJCSAgZml4ZWRfaW9fcmVzLT5hZGRyZXNzX2xlbmd0aCkpOwotCQkJcmVxdWVzdGVkX3JlcyA9Ci0JCQkgICAgcmVxdWVzdF9yZWdpb24oZml4ZWRfaW9fcmVzLT5hZGRyZXNzLAotCQkJCQkgICBmaXhlZF9pb19yZXMtPmFkZHJlc3NfbGVuZ3RoLAotCQkJCQkgICAibW90aGVyYm9hcmQiKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIE1lbW9yeSBtYXBwZWQgSU8/ICovCi0JfQotCi0JaWYgKHJlcXVlc3RlZF9yZXMpCi0JCXJlcXVlc3RlZF9yZXMtPmZsYWdzICY9IH5JT1JFU09VUkNFX0JVU1k7Ci0JcmV0dXJuIEFFX09LOwotfQotCi1zdGF0aWMgaW50IGFjcGlfbW90aGVyYm9hcmRfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCWlmICghZGV2aWNlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlhY3BpX3dhbGtfcmVzb3VyY2VzKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAotCQkJICAgIGFjcGlfcmVzZXJ2ZV9pb19yYW5nZXMsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9tb3RoZXJib2FyZF9kcml2ZXIxID0gewotCS5uYW1lID0gIm1vdGhlcmJvYXJkIiwKLQkuY2xhc3MgPSAiIiwKLQkuaWRzID0gQUNQSV9NQl9ISUQxLAotCS5vcHMgPSB7Ci0JCS5hZGQgPSBhY3BpX21vdGhlcmJvYXJkX2FkZCwKLQkJfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9tb3RoZXJib2FyZF9kcml2ZXIyID0gewotCS5uYW1lID0gIm1vdGhlcmJvYXJkIiwKLQkuY2xhc3MgPSAiIiwKLQkuaWRzID0gQUNQSV9NQl9ISUQyLAotCS5vcHMgPSB7Ci0JCS5hZGQgPSBhY3BpX21vdGhlcmJvYXJkX2FkZCwKLQkJfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBhY3BpX3JlcXVlc3RfcmVnaW9uIChzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmFkZHIsCi0JdW5zaWduZWQgaW50IGxlbmd0aCwgY2hhciAqZGVzYykKLXsKLQlpZiAoIWFkZHItPmFkZHJlc3MgfHwgIWxlbmd0aCkKLQkJcmV0dXJuOwotCi0JaWYgKGFkZHItPmFkZHJlc3Nfc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKQotCQlyZXF1ZXN0X3JlZ2lvbihhZGRyLT5hZGRyZXNzLCBsZW5ndGgsIGRlc2MpOwotCWVsc2UgaWYgKGFkZHItPmFkZHJlc3Nfc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkKLQkJcmVxdWVzdF9tZW1fcmVnaW9uKGFkZHItPmFkZHJlc3MsIGxlbmd0aCwgZGVzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBhY3BpX3Jlc2VydmVfcmVzb3VyY2VzKHZvaWQpCi17Ci0JYWNwaV9yZXF1ZXN0X3JlZ2lvbigmYWNwaV9nYmxfRkFEVC0+eHBtMWFfZXZ0X2JsaywKLQkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiwgIkFDUEkgUE0xYV9FVlRfQkxLIik7Ci0KLQlhY3BpX3JlcXVlc3RfcmVnaW9uKCZhY3BpX2dibF9GQURULT54cG0xYl9ldnRfYmxrLAotCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuLCAiQUNQSSBQTTFiX0VWVF9CTEsiKTsKLQotCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2NudF9ibGssCi0JCQkgICAgICAgYWNwaV9nYmxfRkFEVC0+cG0xX2NudF9sZW4sICJBQ1BJIFBNMWFfQ05UX0JMSyIpOwotCi0JYWNwaV9yZXF1ZXN0X3JlZ2lvbigmYWNwaV9nYmxfRkFEVC0+eHBtMWJfY250X2JsaywKLQkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTFfY250X2xlbiwgIkFDUEkgUE0xYl9DTlRfQkxLIik7Ci0KLQlpZiAoYWNwaV9nYmxfRkFEVC0+cG1fdG1fbGVuID09IDQpCi0JCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrLCA0LCAiQUNQSSBQTV9UTVIiKTsKLQotCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2JsaywKLQkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTJfY250X2xlbiwgIkFDUEkgUE0yX0NOVF9CTEsiKTsKLQotCS8qIExlbmd0aCBvZiBHUEUgYmxvY2tzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbXVsdGlwbGUgb2YgMiAqLwotCi0JaWYgKCEoYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuICYgMHgxKSkKLQkJYWNwaV9yZXF1ZXN0X3JlZ2lvbigmYWNwaV9nYmxfRkFEVC0+eGdwZTBfYmxrLAotCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiwgIkFDUEkgR1BFMF9CTEsiKTsKLQotCWlmICghKGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiAmIDB4MSkpCi0JCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQtPnhncGUxX2JsaywKLQkJCSAgICAgICBhY3BpX2dibF9GQURULT5ncGUxX2Jsa19sZW4sICJBQ1BJIEdQRTFfQkxLIik7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfbW90aGVyYm9hcmRfaW5pdCh2b2lkKQotewotCWFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9tb3RoZXJib2FyZF9kcml2ZXIxKTsKLQlhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfbW90aGVyYm9hcmRfZHJpdmVyMik7Ci0JLyoKLQkgKiBHdWFyYW50ZWUgbW90aGVyYm9hcmQgSU8gcmVzZXJ2YXRpb24gZmlyc3QKLQkgKiBUaGlzIG1vZHVsZSBtdXN0IHJ1biBhZnRlciBzY2FuLmMKLQkgKi8KLQlpZiAoIWFjcGlfZGlzYWJsZWQpCi0JCWFjcGlfcmVzZXJ2ZV9yZXNvdXJjZXMoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBSZXNlcnZlIG1vdGhlcmJvYXJkIHJlc291cmNlcyBhZnRlciBQQ0kgY2xhaW0gQkFScywKLSAqIGJ1dCBiZWZvcmUgUENJIGFzc2lnbiByZXNvdXJjZXMgZm9yIHVuaW5pdGlhbGl6ZWQgUENJIGRldmljZXMKLSAqLwotZnNfaW5pdGNhbGwoYWNwaV9tb3RoZXJib2FyZF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYwppbmRleCBjMWM2YzIzLi41N2ZhZjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWNjZXNzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTE5NSwzMSArMTk1LDI3IEBACiAJCQkJb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwgPQogCQkJCSAgICAodTgpIChBQ1BJX1RPX0lOVEVHRVIodmFsKSAtIDEpOwogCisJCQkJLyogQ3JlYXRlIGEgbXV0ZXggKi8KKworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfb3NfY3JlYXRlX211dGV4KCZvYmpfZGVzYy0+bXV0ZXguCisJCQkJCQkJIG9zX211dGV4KTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKKwkJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCQkJfQorCisJCQkJLyogU3BlY2lhbCBjYXNlIGZvciBBQ1BJIEdsb2JhbCBMb2NrICovCisKIAkJCQlpZiAoQUNQSV9TVFJDTVAoaW5pdF92YWwtPm5hbWUsICJfR0xfIikgPT0gMCkgeworCQkJCQlhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCA9CisJCQkJCSAgICBvYmpfZGVzYy0+bXV0ZXgub3NfbXV0ZXg7CiAKLQkJCQkJLyogQ3JlYXRlIGEgY291bnRpbmcgc2VtYXBob3JlIGZvciB0aGUgZ2xvYmFsIGxvY2sgKi8KKwkJCQkJLyogQ3JlYXRlIGFkZGl0aW9uYWwgY291bnRpbmcgc2VtYXBob3JlIGZvciBnbG9iYWwgbG9jayAqLwogCiAJCQkJCXN0YXR1cyA9Ci0JCQkJCSAgICBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUKLQkJCQkJICAgIChBQ1BJX05PX1VOSVRfTElNSVQsIDEsCi0JCQkJCSAgICAgJmFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSk7Ci0JCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlCi0JCQkJCQkgICAgKG9ial9kZXNjKTsKLQkJCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCQkJCQl9Ci0KLQkJCQkJLyogTWFyayB0aGlzIG11dGV4IGFzIHZlcnkgc3BlY2lhbCAqLwotCi0JCQkJCW9ial9kZXNjLT5tdXRleC5vc19tdXRleCA9Ci0JCQkJCSAgICBBQ1BJX0dMT0JBTF9MT0NLOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIENyZWF0ZSBhIG11dGV4ICovCi0KLQkJCQkJc3RhdHVzID0KLQkJCQkJICAgIGFjcGlfb3NfY3JlYXRlX211dGV4KCZvYmpfZGVzYy0+Ci0JCQkJCQkJCSBtdXRleC4KLQkJCQkJCQkJIG9zX211dGV4KTsKKwkJCQkJICAgIGFjcGlfb3NfY3JlYXRlX3NlbWFwaG9yZSgxLCAwLAorCQkJCQkJCQkgICAgICZhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUpOwogCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZQogCQkJCQkJICAgIChvYmpfZGVzYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCmluZGV4IDU1YjQwN2EuLjFkNjkzZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTYxLDYgKzYxLDkgQEAKIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICphY3BpX25zX2NyZWF0ZV9ub2RlKHUzMiBuYW1lKQogewogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCisJdTMyIHRlbXA7CisjZW5kaWYKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfY3JlYXRlX25vZGUpOwogCkBAIC03MSw2ICs3NCwxNSBAQAogCiAJQUNQSV9NRU1fVFJBQ0tJTkcoYWNwaV9nYmxfbnNfbm9kZV9saXN0LT50b3RhbF9hbGxvY2F0ZWQrKyk7CiAKKyNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUworCXRlbXAgPQorCSAgICBhY3BpX2dibF9uc19ub2RlX2xpc3QtPnRvdGFsX2FsbG9jYXRlZCAtCisJICAgIGFjcGlfZ2JsX25zX25vZGVfbGlzdC0+dG90YWxfZnJlZWQ7CisJaWYgKHRlbXAgPiBhY3BpX2dibF9uc19ub2RlX2xpc3QtPm1heF9vY2N1cGllZCkgeworCQlhY3BpX2dibF9uc19ub2RlX2xpc3QtPm1heF9vY2N1cGllZCA9IHRlbXA7CisJfQorI2VuZGlmCisKIAlub2RlLT5uYW1lLmludGVnZXIgPSBuYW1lOwogCUFDUElfU0VUX0RFU0NSSVBUT1JfVFlQRShub2RlLCBBQ1BJX0RFU0NfVFlQRV9OQU1FRCk7CiAJcmV0dXJuX1BUUihub2RlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcC5jCmluZGV4IGQ3MmRmNjYuLjFmYzRmODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTIwNSw3ICsyMDUsNyBAQAogCiAJCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUodGhpc19ub2RlLT5uYW1lLmludGVnZXIpKSB7CiAJCQl0aGlzX25vZGUtPm5hbWUuaW50ZWdlciA9Ci0JCQkgICAgYWNwaV91dF9yZXBhaXJfbmFtZSh0aGlzX25vZGUtPm5hbWUuaW50ZWdlcik7CisJCQkgICAgYWNwaV91dF9yZXBhaXJfbmFtZSh0aGlzX25vZGUtPm5hbWUuYXNjaWkpOwogCiAJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJJbnZhbGlkIEFDUEkgTmFtZSAlMDhYIiwKIAkJCQkgICAgICB0aGlzX25vZGUtPm5hbWUuaW50ZWdlcikpOwpAQCAtMjI2LDYgKzIyNiwxMiBAQAogCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KHRoaXNfbm9kZSk7CiAJYWNwaV9kYmdfbGV2ZWwgPSBkYmdfbGV2ZWw7CiAKKwkvKiBUZW1wIG5vZGVzIGFyZSB0aG9zZSBub2RlcyBjcmVhdGVkIGJ5IGEgY29udHJvbCBtZXRob2QgKi8KKworCWlmICh0aGlzX25vZGUtPmZsYWdzICYgQU5PQkpfVEVNUE9SQVJZKSB7CisJCWFjcGlfb3NfcHJpbnRmKCIoVCkgIik7CisJfQorCiAJc3dpdGNoIChpbmZvLT5kaXNwbGF5X3R5cGUgJiBBQ1BJX0RJU1BMQVlfTUFTSykgewogCWNhc2UgQUNQSV9ESVNQTEFZX1NVTU1BUlk6CiAKQEAgLTYyMyw3ICs2MjksOCBAQAogCWluZm8uZGlzcGxheV90eXBlID0gZGlzcGxheV90eXBlOwogCiAJKHZvaWQpYWNwaV9uc193YWxrX25hbWVzcGFjZSh0eXBlLCBzdGFydF9oYW5kbGUsIG1heF9kZXB0aCwKLQkJCQkgICAgIEFDUElfTlNfV0FMS19OT19VTkxPQ0ssCisJCQkJICAgICBBQ1BJX05TX1dBTEtfTk9fVU5MT0NLIHwKKwkJCQkgICAgIEFDUElfTlNfV0FMS19URU1QX05PREVTLAogCQkJCSAgICAgYWNwaV9uc19kdW1wX29uZV9vYmplY3QsICh2b2lkICopJmluZm8sCiAJCQkJICAgICBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYwppbmRleCBjNmJmNWQzLi41MDk3ZTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcGR2LmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMKaW5kZXggNGIwYTRhOC4uYWE2MzcwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZXZhbC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTE1NCwxMSArMTU0LDcgQEAKIAkJICogRXhlY3V0ZSB0aGUgbWV0aG9kIHZpYSB0aGUgaW50ZXJwcmV0ZXIuIFRoZSBpbnRlcnByZXRlciBpcyBsb2NrZWQKIAkJICogaGVyZSBiZWZvcmUgY2FsbGluZyBpbnRvIHRoZSBBTUwgcGFyc2VyCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQorCQlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CiAJCXN0YXR1cyA9IGFjcGlfcHNfZXhlY3V0ZV9tZXRob2QoaW5mbyk7CiAJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCX0gZWxzZSB7CkBAIC0xODIsMTAgKzE3OCw3IEBACiAJCSAqIHJlc29sdXRpb24sIHdlIG11c3QgbG9jayBpdCBiZWNhdXNlIHdlIGNvdWxkIGFjY2VzcyBhbiBvcHJlZ2lvbi4KIAkJICogVGhlIG9wcmVnaW9uIGFjY2VzcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgaW50ZXJwcmV0ZXIgaXMgbG9ja2VkLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9CisJCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKIAogCQkvKiBGdW5jdGlvbiBoYXMgYSBzdHJhbmdlIGludGVyZmFjZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYwppbmRleCBhZWM4NDg4Li4zMjZhZjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNpbml0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJCXUzMiBsZXZlbCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKIAlhY3BpX29iamVjdF90eXBlIHR5cGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICppbmZvID0KIAkgICAgKHN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvICopY29udGV4dDsKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSA9CkBAIC0yNjcsMTAgKzI2Nyw3IEBACiAJLyoKIAkgKiBNdXN0IGxvY2sgdGhlIGludGVycHJldGVyIGJlZm9yZSBleGVjdXRpbmcgQU1MIGNvZGUKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiAoc3RhdHVzKTsKLQl9CisJYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwogCiAJLyoKIAkgKiBFYWNoIG9mIHRoZXNlIHR5cGVzIGNhbiBjb250YWluIGV4ZWN1dGFibGUgQU1MIGNvZGUgd2l0aGluIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMKaW5kZXggZmU3NWQ4OC4uZDRmOTY1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDQsMTMgKzQ0LDEyIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KKyNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogQUNQSV9NT0RVTEVfTkFNRSgibnNsb2FkIikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlKTsKLQogI2lmZGVmIEFDUElfRlVUVVJFX0lNUExFTUVOVEFUSU9OCiBhY3BpX3N0YXR1cyBhY3BpX25zX3VubG9hZF9uYW1lc3BhY2UoYWNwaV9oYW5kbGUgaGFuZGxlKTsKIApAQCAtNjIsNyArNjEsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2xvYWRfdGFibGUKICAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfZGVzYyAgICAgIC0gRGVzY3JpcHRvciBmb3IgdGFibGUgdG8gYmUgbG9hZGVkCisgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgIC0gSW5kZXggZm9yIHRhYmxlIHRvIGJlIGxvYWRlZAogICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAtIE93bmluZyBOUyBub2RlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwpAQCAtNzIsNDIgKzcxLDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19sb2FkX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MsCithY3BpX25zX2xvYWRfdGFibGUoYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleCwKIAkJICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShuc19sb2FkX3RhYmxlKTsKIAotCS8qIENoZWNrIGlmIHRhYmxlIGNvbnRhaW5zIHZhbGlkIEFNTCAobXVzdCBiZSBEU0RULCBQU0RULCBTU0RULCBldGMuKSAqLwotCi0JaWYgKCEKLQkgICAgKGFjcGlfZ2JsX3RhYmxlX2RhdGFbdGFibGVfZGVzYy0+dHlwZV0uCi0JICAgICBmbGFncyAmIEFDUElfVEFCTEVfRVhFQ1VUQUJMRSkpIHsKLQotCQkvKiBKdXN0IGlnbm9yZSB0aGlzIHRhYmxlICovCi0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBDaGVjayB2YWxpZGl0eSBvZiB0aGUgQU1MIHN0YXJ0IGFuZCBsZW5ndGggKi8KLQotCWlmICghdGFibGVfZGVzYy0+YW1sX3N0YXJ0KSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJOdWxsIEFNTCBwb2ludGVyIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQU1MIGJsb2NrIGF0ICVwXG4iLAotCQkJICB0YWJsZV9kZXNjLT5hbWxfc3RhcnQpKTsKLQotCS8qIElnbm9yZSB0YWJsZSBpZiB0aGVyZSBpcyBubyBBTUwgY29udGFpbmVkIHdpdGhpbiAqLwotCi0JaWYgKCF0YWJsZV9kZXNjLT5hbWxfbGVuZ3RoKSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIlplcm8tbGVuZ3RoIEFNTCBibG9jayBpbiB0YWJsZSBbJTQuNHNdIiwKLQkJCSAgICAgIHRhYmxlX2Rlc2MtPnBvaW50ZXItPnNpZ25hdHVyZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQogCS8qCiAJICogUGFyc2UgdGhlIHRhYmxlIGFuZCBsb2FkIHRoZSBuYW1lc3BhY2Ugd2l0aCBhbGwgbmFtZWQKIAkgKiBvYmplY3RzIGZvdW5kIHdpdGhpbi4gIENvbnRyb2wgbWV0aG9kcyBhcmUgTk9UIHBhcnNlZApAQCAtMTE3LDE1ICs4NywzNCBAQAogCSAqIHRvIGFub3RoZXIgY29udHJvbCBtZXRob2QsIHdlIGNhbid0IGNvbnRpbnVlIHBhcnNpbmcKIAkgKiBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IG1hbnkgYXJndW1lbnRzIHRvIHBhcnNlIG5leHQhCiAJICovCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJICAiKioqKiBMb2FkaW5nIHRhYmxlIGludG8gbmFtZXNwYWNlICoqKipcbiIpKTsKLQogCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX25zX3BhcnNlX3RhYmxlKHRhYmxlX2Rlc2MsIG5vZGUtPmNoaWxkKTsKKwkvKiBJZiB0YWJsZSBhbHJlYWR5IGxvYWRlZCBpbnRvIG5hbWVzcGFjZSwganVzdCByZXR1cm4gKi8KKworCWlmIChhY3BpX3RiX2lzX3RhYmxlX2xvYWRlZCh0YWJsZV9pbmRleCkpIHsKKwkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CisJCWdvdG8gdW5sb2NrOworCX0KKworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIioqKiogTG9hZGluZyB0YWJsZSBpbnRvIG5hbWVzcGFjZSAqKioqXG4iKSk7CisKKwlzdGF0dXMgPSBhY3BpX3RiX2FsbG9jYXRlX293bmVyX2lkKHRhYmxlX2luZGV4KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byB1bmxvY2s7CisJfQorCisJc3RhdHVzID0gYWNwaV9uc19wYXJzZV90YWJsZSh0YWJsZV9pbmRleCwgbm9kZS0+Y2hpbGQpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlhY3BpX3RiX3NldF90YWJsZV9sb2FkZWRfZmxhZyh0YWJsZV9pbmRleCwgVFJVRSk7CisJfSBlbHNlIHsKKwkJYWNwaV90Yl9yZWxlYXNlX293bmVyX2lkKHRhYmxlX2luZGV4KTsKKwl9CisKKyAgICAgIHVubG9jazoKIAkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtMTQxLDcgKzEzMCw3IEBACiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAogCQkJICAiKioqKiBCZWdpbiBUYWJsZSBNZXRob2QgUGFyc2luZyBhbmQgT2JqZWN0IEluaXRpYWxpemF0aW9uICoqKipcbiIpKTsKIAotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdGlhbGl6ZV9vYmplY3RzKHRhYmxlX2Rlc2MsIG5vZGUpOworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdGlhbGl6ZV9vYmplY3RzKHRhYmxlX2luZGV4LCBub2RlKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKIAkJCSAgIioqKiogQ29tcGxldGVkIFRhYmxlIE1ldGhvZCBQYXJzaW5nIGFuZCBPYmplY3QgSW5pdGlhbGl6YXRpb24gKioqKlxuIikpOwpAQCAtMTQ5LDk5ICsxMzgsNyBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZQotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV90eXBlICAgICAgICAgIC0gSWQgb2YgdGhlIHRhYmxlIHR5cGUgdG8gbG9hZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogTG9hZCBhbiBBQ1BJIHRhYmxlIG9yIHRhYmxlcyBpbnRvIHRoZSBuYW1lc3BhY2UuICBBbGwgdGFibGVzCi0gKiAgICAgICAgICAgICAgb2YgdGhlIGdpdmVuIHR5cGUgYXJlIGxvYWRlZC4gIFRoZSBtZWNoYW5pc20gYWxsb3dzIHRoaXMKLSAqICAgICAgICAgICAgICByb3V0aW5lIHRvIGJlIGNhbGxlZCByZXBlYXRlZGx5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZShhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSkKLXsKLQl1MzIgaTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfbG9hZF90YWJsZV9ieV90eXBlKTsKLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIFRhYmxlIHR5cGVzIHN1cHBvcnRlZCBhcmU6Ci0JICogRFNEVCAob25lKSwgU1NEVC9QU0RUIChtdWx0aXBsZSkKLQkgKi8KLQlzd2l0Y2ggKHRhYmxlX3R5cGUpIHsKLQljYXNlIEFDUElfVEFCTEVfSURfRFNEVDoKLQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJOYW1lc3BhY2UgbG9hZDogRFNEVFxuIikpOwotCi0JCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1tBQ1BJX1RBQkxFX0lEX0RTRFRdLm5leHQ7Ci0KLQkJLyogSWYgdGFibGUgYWxyZWFkeSBsb2FkZWQgaW50byBuYW1lc3BhY2UsIGp1c3QgcmV0dXJuICovCi0KLQkJaWYgKHRhYmxlX2Rlc2MtPmxvYWRlZF9pbnRvX25hbWVzcGFjZSkgewotCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7Ci0JCX0KLQotCQkvKiBOb3cgbG9hZCB0aGUgc2luZ2xlIERTRFQgKi8KLQotCQlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUodGFibGVfZGVzYywgYWNwaV9nYmxfcm9vdF9ub2RlKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0JCQl0YWJsZV9kZXNjLT5sb2FkZWRfaW50b19uYW1lc3BhY2UgPSBUUlVFOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RBQkxFX0lEX1NTRFQ6Ci0JY2FzZSBBQ1BJX1RBQkxFX0lEX1BTRFQ6Ci0KLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgIk5hbWVzcGFjZSBsb2FkOiAlZCBTU0RUIG9yIFBTRFRzXG4iLAotCQkJCSAgYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0uY291bnQpKTsKLQotCQkvKgotCQkgKiBUcmF2ZXJzZSBsaXN0IG9mIFNTRFQgb3IgUFNEVCB0YWJsZXMKLQkJICovCi0JCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXS5uZXh0OwotCQlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0uY291bnQ7IGkrKykgewotCQkJLyoKLQkJCSAqIE9ubHkgYXR0ZW1wdCB0byBsb2FkIHRhYmxlIGludG8gbmFtZXNwYWNlIGlmIGl0IGlzIG5vdAotCQkJICogYWxyZWFkeSBsb2FkZWQhCi0JCQkgKi8KLQkJCWlmICghdGFibGVfZGVzYy0+bG9hZGVkX2ludG9fbmFtZXNwYWNlKSB7Ci0JCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9uc19sb2FkX3RhYmxlKHRhYmxlX2Rlc2MsCi0JCQkJCQkgICAgICAgYWNwaV9nYmxfcm9vdF9ub2RlKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJdGFibGVfZGVzYy0+bG9hZGVkX2ludG9fbmFtZXNwYWNlID0gVFJVRTsKLQkJCX0KLQotCQkJdGFibGVfZGVzYyA9IHRhYmxlX2Rlc2MtPm5leHQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlzdGF0dXMgPSBBRV9TVVBQT1JUOwotCQlicmVhazsKLQl9Ci0KLSAgICAgIHVubG9ja19hbmRfZXhpdDoKLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQorI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2xvYWRfbmFtZXNwYWNlCkBAIC0yODgsNiArMTg1LDcgQEAKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQorI2VuZGlmCiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9JTVBMRU1FTlRBVElPTgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKaW5kZXggOTdiODMzMi4uY2JkOTRhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jCmluZGV4IGFhYmU4NzkuLmQ5ZDczNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3BhcnNlLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zcGFyc2UuYwppbmRleCAxNTU1MDVhLi5lNjk2YWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zcGFyc2UuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zcGFyc2UuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYWNkaXNwYXQuaD4KKyNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogQUNQSV9NT0RVTEVfTkFNRSgibnNwYXJzZSIpCkBAIC02MiwxNCArNjMsMjQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogYWNwaV9zdGF0dXMKLWFjcGlfbnNfb25lX2NvbXBsZXRlX3BhcnNlKHU4IHBhc3NfbnVtYmVyLCBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKQorYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UoYWNwaV9uYXRpdmVfdWludCBwYXNzX251bWJlciwKKwkJCSAgIGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgpCiB7CiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcnNlX3Jvb3Q7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfbmF0aXZlX3VpbnQgYW1sX2xlbmd0aDsKKwl1OCAqYW1sX3N0YXJ0OwogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShuc19vbmVfY29tcGxldGVfcGFyc2UpOwogCisJc3RhdHVzID0gYWNwaV90Yl9nZXRfb3duZXJfaWQodGFibGVfaW5kZXgsICZvd25lcl9pZCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCX0KKwogCS8qIENyZWF0ZSBhbmQgaW5pdCBhIFJvb3QgTm9kZSAqLwogCiAJcGFyc2Vfcm9vdCA9IGFjcGlfcHNfY3JlYXRlX3Njb3BlX29wKCk7CkBAIC03OSwyNiArOTAsNDEgQEAKIAogCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyB3YWxrIHN0YXRlICovCiAKLQl3YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZSh0YWJsZV9kZXNjLT5vd25lcl9pZCwKLQkJCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworCXdhbGtfc3RhdGUgPSBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKG93bmVyX2lkLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAlpZiAoIXdhbGtfc3RhdGUpIHsKIAkJYWNwaV9wc19mcmVlX29wKHBhcnNlX3Jvb3QpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgcGFyc2Vfcm9vdCwgTlVMTCwKLQkJCQkgICAgICAgdGFibGVfZGVzYy0+YW1sX3N0YXJ0LAotCQkJCSAgICAgICB0YWJsZV9kZXNjLT5hbWxfbGVuZ3RoLCBOVUxMLAotCQkJCSAgICAgICBwYXNzX251bWJlcik7CisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGVfYnlfaW5kZXgodGFibGVfaW5kZXgsICZ0YWJsZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CisJCWFjcGlfcHNfZnJlZV9vcChwYXJzZV9yb290KTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogVGFibGUgbXVzdCBjb25zaXN0IG9mIGF0IGxlYXN0IGEgY29tcGxldGUgaGVhZGVyICovCisKKwlpZiAodGFibGUtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7CisJCXN0YXR1cyA9IEFFX0JBRF9IRUFERVI7CisJfSBlbHNlIHsKKwkJYW1sX3N0YXJ0ID0gKHU4ICopIHRhYmxlICsgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcik7CisJCWFtbF9sZW5ndGggPSB0YWJsZS0+bGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcik7CisJCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2Fsayh3YWxrX3N0YXRlLCBwYXJzZV9yb290LCBOVUxMLAorCQkJCQkgICAgICAgYW1sX3N0YXJ0LCBhbWxfbGVuZ3RoLCBOVUxMLAorCQkJCQkgICAgICAgKHU4KSBwYXNzX251bWJlcik7CisJfQorCisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CisJCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUocGFyc2Vfcm9vdCk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAogCS8qIFBhcnNlIHRoZSBBTUwgKi8KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICIqUEFSU0UqIHBhc3MgJWQgcGFyc2VcbiIsCi0JCQkgIHBhc3NfbnVtYmVyKSk7CisJCQkgICh1bnNpZ25lZClwYXNzX251bWJlcikpOwogCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sKHdhbGtfc3RhdGUpOwogCiAJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShwYXJzZV9yb290KTsKQEAgLTExOSw3ICsxNDUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfcGFyc2VfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYywKK2FjcGlfbnNfcGFyc2VfdGFibGUoYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleCwKIAkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzdGFydF9ub2RlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTEzNCwxMCArMTYwLDEwIEBACiAJICogZWFjaCBQYXJzZXIgT3Agc3VidHJlZSBpcyBkZWxldGVkIHdoZW4gaXQgaXMgZmluaXNoZWQuICBUaGlzIHNhdmVzCiAJICogYSBncmVhdCBkZWFsIG9mIG1lbW9yeSwgYW5kIGFsbG93cyBhIHNtYWxsIGNhY2hlIG9mIHBhcnNlIG9iamVjdHMKIAkgKiB0byBzZXJ2aWNlIHRoZSBlbnRpcmUgcGFyc2UuICBUaGUgc2Vjb25kIHBhc3Mgb2YgdGhlIHBhcnNlIHRoZW4KLQkgKiBwZXJmb3JtcyBhbm90aGVyIGNvbXBsZXRlIHBhcnNlIG9mIHRoZSBBTUwuLgorCSAqIHBlcmZvcm1zIGFub3RoZXIgY29tcGxldGUgcGFyc2Ugb2YgdGhlIEFNTC4KIAkgKi8KIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiKioqKiBTdGFydCBwYXNzIDFcbiIpKTsKLQlzdGF0dXMgPSBhY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZSgxLCB0YWJsZV9kZXNjKTsKKwlzdGF0dXMgPSBhY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZShBQ1BJX0lNT0RFX0xPQURfUEFTUzEsIHRhYmxlX2luZGV4KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQpAQCAtMTUyLDcgKzE3OCw3IEBACiAJICogcGFyc2Ugb2JqZWN0cyBhcmUgYWxsIGNhY2hlZC4KIAkgKi8KIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiKioqKiBTdGFydCBwYXNzIDJcbiIpKTsKLQlzdGF0dXMgPSBhY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZSgyLCB0YWJsZV9kZXNjKTsKKwlzdGF0dXMgPSBhY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZShBQ1BJX0lNT0RFX0xPQURfUEFTUzIsIHRhYmxlX2luZGV4KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jCmluZGV4IDUwMGUyYmIuLmU4NjNiZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzIxLDcgKzMyMSw4IEBACiAJICogZXZlbiB0aG91Z2ggdGhlcmUgYXJlIGEgZmV3IGJhZCBuYW1lcy4KIAkgKi8KIAlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHRhcmdldF9uYW1lKSkgewotCQl0YXJnZXRfbmFtZSA9IGFjcGlfdXRfcmVwYWlyX25hbWUodGFyZ2V0X25hbWUpOworCQl0YXJnZXRfbmFtZSA9CisJCSAgICBhY3BpX3V0X3JlcGFpcl9uYW1lKEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSk7CiAKIAkJLyogUmVwb3J0IHdhcm5pbmcgb25seSBpZiBpbiBzdHJpY3QgbW9kZSBvciBkZWJ1ZyBtb2RlICovCiAKQEAgLTQwMSw2ICs0MDIsMTAgQEAKIAl9CiAjZW5kaWYKIAorCWlmIChmbGFncyAmIEFDUElfTlNfVEVNUE9SQVJZKSB7CisJCW5ld19ub2RlLT5mbGFncyB8PSBBTk9CSl9URU1QT1JBUlk7CisJfQorCiAJLyogSW5zdGFsbCB0aGUgbmV3IG9iamVjdCBpbnRvIHRoZSBwYXJlbnQncyBsaXN0IG9mIGNoaWxkcmVuICovCiAKIAlhY3BpX25zX2luc3RhbGxfbm9kZSh3YWxrX3N0YXRlLCBub2RlLCBuZXdfbm9kZSwgdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCmluZGV4IGFhNGU3OTkuLjkwZmQwNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNzcwLDEzICs3NzAsNiBAQAogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk5hbWVzcGFjZSBmcmVlZFxuIikpOwotCi0JLyoKLQkgKiAyKSBOb3cgd2UgY2FuIGRlbGV0ZSB0aGUgQUNQSSB0YWJsZXMKLQkgKi8KLQlhY3BpX3RiX2RlbGV0ZV9hbGxfdGFibGVzKCk7Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQUNQSSBUYWJsZXMgZnJlZWRcbiIpKTsKLQogCXJldHVybl9WT0lEOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3dhbGsuYwppbmRleCBjOGY2YmVmLi45NGViOGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMjYsNyArMTI2LDcgQEAKICAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gYWNwaV9vYmplY3RfdHlwZSB0byBzZWFyY2ggZm9yCiAgKiAgICAgICAgICAgICAgc3RhcnRfbm9kZSAgICAgICAgICAtIEhhbmRsZSBpbiBuYW1lc3BhY2Ugd2hlcmUgc2VhcmNoIGJlZ2lucwogICogICAgICAgICAgICAgIG1heF9kZXB0aCAgICAgICAgICAgLSBEZXB0aCB0byB3aGljaCBzZWFyY2ggaXMgdG8gcmVhY2gKLSAqICAgICAgICAgICAgICB1bmxvY2tfYmVmb3JlX2NhbGxiYWNrLSBXaGV0aGVyIHRvIHVubG9jayB0aGUgTlMgYmVmb3JlIGludm9raW5nCisgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIFdoZXRoZXIgdG8gdW5sb2NrIHRoZSBOUyBiZWZvcmUgaW52b2tpbmcKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNhbGxiYWNrIHJvdXRpbmUKICAqICAgICAgICAgICAgICB1c2VyX2Z1bmN0aW9uICAgICAgIC0gQ2FsbGVkIHdoZW4gYW4gb2JqZWN0IG9mICJUeXBlIiBpcyBmb3VuZAogICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAgICAgLSBQYXNzZWQgdG8gdXNlciBmdW5jdGlvbgpAQCAtMTUzLDcgKzE1Myw3IEBACiBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKIAkJICAgICAgIGFjcGlfaGFuZGxlIHN0YXJ0X25vZGUsCiAJCSAgICAgICB1MzIgbWF4X2RlcHRoLAotCQkgICAgICAgdTggdW5sb2NrX2JlZm9yZV9jYWxsYmFjaywKKwkJICAgICAgIHUzMiBmbGFncywKIAkJICAgICAgIGFjcGlfd2Fsa19jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLAogCQkgICAgICAgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldHVybl92YWx1ZSkKIHsKQEAgLTE5MywyMCArMTkzLDM0IEBACiAJCSAgICBhY3BpX25zX2dldF9uZXh0X25vZGUoQUNQSV9UWVBFX0FOWSwgcGFyZW50X25vZGUsCiAJCQkJCSAgY2hpbGRfbm9kZSk7CiAJCWlmIChjaGlsZF9ub2RlKSB7Ci0JCQkvKgotCQkJICogRm91bmQgbm9kZSwgR2V0IHRoZSB0eXBlIGlmIHdlIGFyZSBub3QKLQkJCSAqIHNlYXJjaGluZyBmb3IgQU5ZCi0JCQkgKi8KKworCQkJLyogRm91bmQgbmV4dCBjaGlsZCwgZ2V0IHRoZSB0eXBlIGlmIHdlIGFyZSBub3Qgc2VhcmNoaW5nIGZvciBBTlkgKi8KKwogCQkJaWYgKHR5cGUgIT0gQUNQSV9UWVBFX0FOWSkgewogCQkJCWNoaWxkX3R5cGUgPSBjaGlsZF9ub2RlLT50eXBlOwogCQkJfQogCi0JCQlpZiAoY2hpbGRfdHlwZSA9PSB0eXBlKSB7CisJCQkvKgorCQkJICogSWdub3JlIGFsbCB0ZW1wb3JhcnkgbmFtZXNwYWNlIG5vZGVzIChjcmVhdGVkIGR1cmluZyBjb250cm9sCisJCQkgKiBtZXRob2QgZXhlY3V0aW9uKSB1bmxlc3MgdG9sZCBvdGhlcndpc2UuIFRoZXNlIHRlbXBvcmFyeSBub2RlcworCQkJICogY2FuIGNhdXNlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSB0aGV5IGNhbiBiZSBkZWxldGVkIGR1cmluZyB0aGUKKwkJCSAqIGV4ZWN1dGlvbiBvZiB0aGUgdXNlciBmdW5jdGlvbiAoaWYgdGhlIG5hbWVzcGFjZSBpcyB1bmxvY2tlZCBiZWZvcmUKKwkJCSAqIGludm9jYXRpb24gb2YgdGhlIHVzZXIgZnVuY3Rpb24uKSBPbmx5IHRoZSBkZWJ1Z2dlciBuYW1lc3BhY2UgZHVtcAorCQkJICogd2lsbCBleGFtaW5lIHRoZSB0ZW1wb3Jhcnkgbm9kZXMuCisJCQkgKi8KKwkJCWlmICgoY2hpbGRfbm9kZS0+ZmxhZ3MgJiBBTk9CSl9URU1QT1JBUlkpICYmCisJCQkgICAgIShmbGFncyAmIEFDUElfTlNfV0FMS19URU1QX05PREVTKSkgeworCQkJCXN0YXR1cyA9IEFFX0NUUkxfREVQVEg7CisJCQl9CisKKwkJCS8qIFR5cGUgbXVzdCBtYXRjaCByZXF1ZXN0ZWQgdHlwZSAqLworCisJCQllbHNlIGlmIChjaGlsZF90eXBlID09IHR5cGUpIHsKIAkJCQkvKgotCQkJCSAqIEZvdW5kIGEgbWF0Y2hpbmcgbm9kZSwgaW52b2tlIHRoZSB1c2VyCi0JCQkJICogY2FsbGJhY2sgZnVuY3Rpb24KKwkJCQkgKiBGb3VuZCBhIG1hdGNoaW5nIG5vZGUsIGludm9rZSB0aGUgdXNlciBjYWxsYmFjayBmdW5jdGlvbi4KKwkJCQkgKiBVbmxvY2sgdGhlIG5hbWVzcGFjZSBpZiBmbGFnIGlzIHNldC4KIAkJCQkgKi8KLQkJCQlpZiAodW5sb2NrX2JlZm9yZV9jYWxsYmFjaykgeworCQkJCWlmIChmbGFncyAmIEFDUElfTlNfV0FMS19VTkxPQ0spIHsKIAkJCQkJbXV0ZXhfc3RhdHVzID0KIAkJCQkJICAgIGFjcGlfdXRfcmVsZWFzZV9tdXRleAogCQkJCQkgICAgKEFDUElfTVRYX05BTUVTUEFDRSk7CkBAIC0yMTYsMTAgKzIzMCwxMSBAQAogCQkJCQl9CiAJCQkJfQogCi0JCQkJc3RhdHVzID0gdXNlcl9mdW5jdGlvbihjaGlsZF9ub2RlLCBsZXZlbCwKLQkJCQkJCSAgICAgICBjb250ZXh0LCByZXR1cm5fdmFsdWUpOworCQkJCXN0YXR1cyA9CisJCQkJICAgIHVzZXJfZnVuY3Rpb24oY2hpbGRfbm9kZSwgbGV2ZWwsIGNvbnRleHQsCisJCQkJCQkgIHJldHVybl92YWx1ZSk7CiAKLQkJCQlpZiAodW5sb2NrX2JlZm9yZV9jYWxsYmFjaykgeworCQkJCWlmIChmbGFncyAmIEFDUElfTlNfV0FMS19VTkxPQ0spIHsKIAkJCQkJbXV0ZXhfc3RhdHVzID0KIAkJCQkJICAgIGFjcGlfdXRfYWNxdWlyZV9tdXRleAogCQkJCQkgICAgKEFDUElfTVRYX05BTUVTUEFDRSk7CkBAIC0yNTEsMjAgKzI2NiwxNyBAQAogCQkJfQogCiAJCQkvKgotCQkJICogRGVwdGggZmlyc3Qgc2VhcmNoOgotCQkJICogQXR0ZW1wdCB0byBnbyBkb3duIGFub3RoZXIgbGV2ZWwgaW4gdGhlIG5hbWVzcGFjZQotCQkJICogaWYgd2UgYXJlIGFsbG93ZWQgdG8uICBEb24ndCBnbyBhbnkgZnVydGhlciBpZiB3ZQotCQkJICogaGF2ZSByZWFjaGVkIHRoZSBjYWxsZXIgc3BlY2lmaWVkIG1heGltdW0gZGVwdGgKLQkJCSAqIG9yIGlmIHRoZSB1c2VyIGZ1bmN0aW9uIGhhcyBzcGVjaWZpZWQgdGhhdCB0aGUKLQkJCSAqIG1heGltdW0gZGVwdGggaGFzIGJlZW4gcmVhY2hlZC4KKwkJCSAqIERlcHRoIGZpcnN0IHNlYXJjaDogQXR0ZW1wdCB0byBnbyBkb3duIGFub3RoZXIgbGV2ZWwgaW4gdGhlCisJCQkgKiBuYW1lc3BhY2UgaWYgd2UgYXJlIGFsbG93ZWQgdG8uICBEb24ndCBnbyBhbnkgZnVydGhlciBpZiB3ZSBoYXZlCisJCQkgKiByZWFjaGVkIHRoZSBjYWxsZXIgc3BlY2lmaWVkIG1heGltdW0gZGVwdGggb3IgaWYgdGhlIHVzZXIKKwkJCSAqIGZ1bmN0aW9uIGhhcyBzcGVjaWZpZWQgdGhhdCB0aGUgbWF4aW11bSBkZXB0aCBoYXMgYmVlbiByZWFjaGVkLgogCQkJICovCiAJCQlpZiAoKGxldmVsIDwgbWF4X2RlcHRoKSAmJiAoc3RhdHVzICE9IEFFX0NUUkxfREVQVEgpKSB7CiAJCQkJaWYgKGFjcGlfbnNfZ2V0X25leHRfbm9kZQogCQkJCSAgICAoQUNQSV9UWVBFX0FOWSwgY2hpbGRfbm9kZSwgTlVMTCkpIHsKLQkJCQkJLyoKLQkJCQkJICogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoaWxkIG9mIHRoaXMKLQkJCQkJICogbm9kZSwgdmlzaXQgdGhlIG9uZGUKLQkJCQkJICovCisKKwkJCQkJLyogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoaWxkIG9mIHRoaXMgbm9kZSwgdmlzaXQgaXQgKi8KKwogCQkJCQlsZXZlbCsrOwogCQkJCQlwYXJlbnRfbm9kZSA9IGNoaWxkX25vZGU7CiAJCQkJCWNoaWxkX25vZGUgPSBOVUxMOwpAQCAtMjcyLDkgKzI4NCw4IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKgotCQkJICogTm8gbW9yZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgKGFjcGlfbnNfZ2V0X25leHRfbm9kZQotCQkJICogZmFpbGVkKSwgZ28gYmFjayB1cHdhcmRzIGluIHRoZSBuYW1lc3BhY2UgdHJlZSB0bwotCQkJICogdGhlIG5vZGUncyBwYXJlbnQuCisJCQkgKiBObyBtb3JlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSAoYWNwaV9uc19nZXRfbmV4dF9ub2RlIGZhaWxlZCksIGdvCisJCQkgKiBiYWNrIHVwd2FyZHMgaW4gdGhlIG5hbWVzcGFjZSB0cmVlIHRvIHRoZSBub2RlJ3MgcGFyZW50LgogCQkJICovCiAJCQlsZXZlbC0tOwogCQkJY2hpbGRfbm9kZSA9IHBhcmVudF9ub2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCmluZGV4IGRjYTY3OTkuLjdhYzZhY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMKQEAgLTYsNyArNiw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTcwLDcgKzE3MCw2IEBACiAJCSAgICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXR1cm5fYnVmZmVyKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX3N0YXR1cyBzdGF0dXMyOwogCXN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm87CiAJYWNwaV9zaXplIGJ1ZmZlcl9zcGFjZV9uZWVkZWQ7CiAJdTMyIGk7CkBAIC0zMjksMTQgKzMyOCwxMiBAQAogCQkgKiBEZWxldGUgdGhlIGludGVybmFsIHJldHVybiBvYmplY3QuIE5PVEU6IEludGVycHJldGVyIG11c3QgYmUKIAkJICogbG9ja2VkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uLgogCQkgKi8KLQkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMyKSkgeworCQlhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7CiAKLQkJCS8qIFJlbW92ZSBvbmUgcmVmZXJlbmNlIG9uIHRoZSByZXR1cm4gb2JqZWN0IChzaG91bGQgZGVsZXRlIGl0KSAqLworCQkvKiBSZW1vdmUgb25lIHJlZmVyZW5jZSBvbiB0aGUgcmV0dXJuIG9iamVjdCAoc2hvdWxkIGRlbGV0ZSBpdCkgKi8KIAotCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOwotCQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7Ci0JCX0KKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOworCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAl9CiAKICAgICAgIGNsZWFudXA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMKaW5kZXggOTc4MjEzYS4uYjQ4OTc4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm5hbWUuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTg0LDM4ICs4NCw0MSBAQAogCS8qIENvbnZlcnQgYSBwYXJlbnQgaGFuZGxlIHRvIGEgcHJlZml4IG5vZGUgKi8KIAogCWlmIChwYXJlbnQpIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuIChzdGF0dXMpOwotCQl9Ci0KIAkJcHJlZml4X25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShwYXJlbnQpOwogCQlpZiAoIXByZWZpeF9ub2RlKSB7Ci0JCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAkJCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiAJCX0KLQotCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm4gKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKiBTcGVjaWFsIGNhc2UgZm9yIHJvb3QsIHNpbmNlIHdlIGNhbid0IHNlYXJjaCBmb3IgaXQgKi8KLQotCWlmIChBQ1BJX1NUUkNNUChwYXRobmFtZSwgQUNQSV9OU19ST09UX1BBVEgpID09IDApIHsKLQkJKnJldF9oYW5kbGUgPQotCQkgICAgYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShhY3BpX2dibF9yb290X25vZGUpOwotCQlyZXR1cm4gKEFFX09LKTsKIAl9CiAKIAkvKgotCSAqICBGaW5kIHRoZSBOb2RlIGFuZCBjb252ZXJ0IHRvIGEgaGFuZGxlCisJICogVmFsaWQgY2FzZXMgYXJlOgorCSAqIDEpIEZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZQorCSAqIDIpIFBhcmVudCArIFJlbGF0aXZlIHBhdGhuYW1lCisJICoKKwkgKiBFcnJvciBmb3IgPG51bGwgUGFyZW50ICsgcmVsYXRpdmUgcGF0aD4KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX25zX2dldF9ub2RlKHByZWZpeF9ub2RlLCBwYXRobmFtZSwgQUNQSV9OU19OT19VUFNFQVJDSCwKLQkJCQkgICZub2RlKTsKKwlpZiAoYWNwaV9uc192YWxpZF9yb290X3ByZWZpeChwYXRobmFtZVswXSkpIHsKIAotCSpyZXRfaGFuZGxlID0gTlVMTDsKKwkJLyogUGF0aG5hbWUgaXMgZnVsbHkgcXVhbGlmaWVkIChzdGFydHMgd2l0aCAnXCcpICovCisKKwkJLyogU3BlY2lhbCBjYXNlIGZvciByb290LW9ubHksIHNpbmNlIHdlIGNhbid0IHNlYXJjaCBmb3IgaXQgKi8KKworCQlpZiAoIUFDUElfU1RSQ01QKHBhdGhuYW1lLCBBQ1BJX05TX1JPT1RfUEFUSCkpIHsKKwkJCSpyZXRfaGFuZGxlID0KKwkJCSAgICBhY3BpX25zX2NvbnZlcnRfZW50cnlfdG9faGFuZGxlKGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CisJCQlyZXR1cm4gKEFFX09LKTsKKwkJfQorCX0gZWxzZSBpZiAoIXByZWZpeF9ub2RlKSB7CisKKwkJLyogUmVsYXRpdmUgcGF0aCB3aXRoIG51bGwgcHJlZml4IGlzIGRpc2FsbG93ZWQgKi8KKworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qIEZpbmQgdGhlIE5vZGUgYW5kIGNvbnZlcnQgdG8gYSBoYW5kbGUgKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfbnNfZ2V0X25vZGUocHJlZml4X25vZGUsIHBhdGhuYW1lLCBBQ1BJX05TX05PX1VQU0VBUkNILCAmbm9kZSk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CiAJCSpyZXRfaGFuZGxlID0gYWNwaV9uc19jb252ZXJ0X2VudHJ5X3RvX2hhbmRsZShub2RlKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCmluZGV4IGExOGIxYzIuLmZhYTM3NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCkBAIC02LDcgKzYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9udW1hLmMgYi9kcml2ZXJzL2FjcGkvbnVtYS5jCmluZGV4IGJkOTZhNzAuLjRhOWZhZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9udW1hLmMKKysrIGIvZHJpdmVycy9hY3BpL251bWEuYwpAQCAtNDUsNyArNDUsNyBAQAogaW50IF9fY3B1aW5pdGRhdGEgbm9kZV90b19weG1fbWFwW01BWF9OVU1OT0RFU10KIAkJCQk9IHsgWzAgLi4uIE1BWF9OVU1OT0RFUyAtIDFdID0gUFhNX0lOVkFMIH07CiAKLWV4dGVybiBpbnQgX19pbml0IGFjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkoZW51bSBhY3BpX3RhYmxlX2lkIGlkLAorZXh0ZXJuIGludCBfX2luaXQgYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseShjaGFyICppZCwKIAkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbWFkdF9zaXplLAogCQkJCQkgICAgICAgaW50IGVudHJ5X2lkLAogCQkJCQkgICAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwKQEAgLTg5LDcgKzg5LDcgQEAKIAlub2RlX2NsZWFyKG5vZGUsIG5vZGVzX2ZvdW5kX21hcCk7CiB9CiAKLXZvaWQgX19pbml0IGFjcGlfdGFibGVfcHJpbnRfc3JhdF9lbnRyeShhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlcikKK3ZvaWQgX19pbml0IGFjcGlfdGFibGVfcHJpbnRfc3JhdF9lbnRyeShzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKiBoZWFkZXIpCiB7CiAKIAlBQ1BJX0ZVTkNUSU9OX05BTUUoImFjcGlfdGFibGVfcHJpbnRfc3JhdF9lbnRyeSIpOwpAQCAtOTksMzYgKzk5LDM1IEBACiAKIAlzd2l0Y2ggKGhlYWRlci0+dHlwZSkgewogCi0JY2FzZSBBQ1BJX1NSQVRfUFJPQ0VTU09SX0FGRklOSVRZOgorCWNhc2UgQUNQSV9TUkFUX1RZUEVfQ1BVX0FGRklOSVRZOgogI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCiAJCXsKLQkJCXN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqcCA9Ci0JCQkgICAgKHN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqKWhlYWRlcjsKKwkJCXN0cnVjdCBhY3BpX3NyYXRfY3B1X2FmZmluaXR5ICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfc3JhdF9jcHVfYWZmaW5pdHkgKiloZWFkZXI7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkJCSAgIlNSQVQgUHJvY2Vzc29yIChpZFsweCUwMnhdIGVpZFsweCUwMnhdKSBpbiBwcm94aW1pdHkgZG9tYWluICVkICVzXG4iLAotCQkJCQkgIHAtPmFwaWNfaWQsIHAtPmxzYXBpY19laWQsCi0JCQkJCSAgcC0+cHJveGltaXR5X2RvbWFpbiwKLQkJCQkJICBwLT5mbGFncy4KLQkJCQkJICBlbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOworCQkJCQkgIHAtPmFwaWNfaWQsIHAtPmxvY2FsX3NhcGljX2VpZCwKKwkJCQkJICBwLT5wcm94aW1pdHlfZG9tYWluX2xvLAorCQkJCQkgIChwLT5mbGFncyAmIEFDUElfU1JBVF9DUFVfRU5BQkxFRCk/CisJCQkJCSAgImVuYWJsZWQiIDogImRpc2FibGVkIikpOwogCQl9CiAjZW5kaWYJCQkJLyogQUNQSV9ERUJVR19PVVRQVVQgKi8KIAkJYnJlYWs7CiAKLQljYXNlIEFDUElfU1JBVF9NRU1PUllfQUZGSU5JVFk6CisJY2FzZSBBQ1BJX1NSQVRfVFlQRV9NRU1PUllfQUZGSU5JVFk6CiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKIAkJewotCQkJc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICpwID0KLQkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICopaGVhZGVyOworCQkJc3RydWN0IGFjcGlfc3JhdF9tZW1fYWZmaW5pdHkgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV9zcmF0X21lbV9hZmZpbml0eSAqKWhlYWRlcjsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkJICAiU1JBVCBNZW1vcnkgKDB4JTA4eCUwOHggbGVuZ3RoIDB4JTA4eCUwOHggdHlwZSAweCV4KSBpbiBwcm94aW1pdHkgZG9tYWluICVkICVzJXNcbiIsCi0JCQkJCSAgcC0+YmFzZV9hZGRyX2hpLCBwLT5iYXNlX2FkZHJfbG8sCi0JCQkJCSAgcC0+bGVuZ3RoX2hpLCBwLT5sZW5ndGhfbG8sCisJCQkJCSAgIlNSQVQgTWVtb3J5ICgweCVseCBsZW5ndGggMHglbHggdHlwZSAweCV4KSBpbiBwcm94aW1pdHkgZG9tYWluICVkICVzJXNcbiIsCisJCQkJCSAgKHVuc2lnbmVkIGxvbmcpcC0+YmFzZV9hZGRyZXNzLAorCQkJCQkgICh1bnNpZ25lZCBsb25nKXAtPmxlbmd0aCwKIAkJCQkJICBwLT5tZW1vcnlfdHlwZSwgcC0+cHJveGltaXR5X2RvbWFpbiwKLQkJCQkJICBwLT5mbGFncy4KLQkJCQkJICBlbmFibGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKLQkJCQkJICBwLT5mbGFncy4KLQkJCQkJICBob3RfcGx1Z2dhYmxlID8gIiBob3QtcGx1Z2dhYmxlIiA6Ci0JCQkJCSAgIiIpKTsKKwkJCQkJICAocC0+ZmxhZ3MgJiBBQ1BJX1NSQVRfTUVNX0VOQUJMRUQpPworCQkJCQkgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCisJCQkJCSAgKHAtPmZsYWdzICYgQUNQSV9TUkFUX01FTV9IT1RfUExVR0dBQkxFKT8KKwkJCQkJICAiIGhvdC1wbHVnZ2FibGUiIDogIiIpKTsKIAkJfQogI2VuZGlmCQkJCS8qIEFDUElfREVCVUdfT1VUUFVUICovCiAJCWJyZWFrOwpAQCAtMTQxLDE4ICsxNDAsMTggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2Vfc2xpdCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9zbGl0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqc2xpdDsKIAl1MzIgbG9jYWxpdGllczsKIAotCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQorCWlmICghdGFibGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc2xpdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9zbGl0ICopX192YShwaHlzX2FkZHIpOworCXNsaXQgPSAoc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqKXRhYmxlOwogCiAJLyogZG93bmNhc3QganVzdCBmb3IgJWxsdSB2cyAlbHUgZm9yIGkzODYvaWE2NCAgKi8KLQlsb2NhbGl0aWVzID0gKHUzMikgc2xpdC0+bG9jYWxpdGllczsKKwlsb2NhbGl0aWVzID0gKHUzMikgc2xpdC0+bG9jYWxpdHlfY291bnQ7CiAKIAlhY3BpX251bWFfc2xpdF9pbml0KHNsaXQpOwogCkBAIC0xNjAsMTIgKzE1OSwxMiBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9wcm9jZXNzb3JfYWZmaW5pdHkoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsCithY3BpX3BhcnNlX3Byb2Nlc3Nvcl9hZmZpbml0eShzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKiBoZWFkZXIsCiAJCQkgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9wcm9jZXNzb3JfYWZmaW5pdHkgKnByb2Nlc3Nvcl9hZmZpbml0eTsKKwlzdHJ1Y3QgYWNwaV9zcmF0X2NwdV9hZmZpbml0eSAqcHJvY2Vzc29yX2FmZmluaXR5OwogCi0JcHJvY2Vzc29yX2FmZmluaXR5ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSAqKWhlYWRlcjsKKwlwcm9jZXNzb3JfYWZmaW5pdHkgPSAoc3RydWN0IGFjcGlfc3JhdF9jcHVfYWZmaW5pdHkgKiloZWFkZXI7CiAJaWYgKCFwcm9jZXNzb3JfYWZmaW5pdHkpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xNzgsMTIgKzE3NywxMiBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotYWNwaV9wYXJzZV9tZW1vcnlfYWZmaW5pdHkoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIsCithY3BpX3BhcnNlX21lbW9yeV9hZmZpbml0eShzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKiBoZWFkZXIsCiAJCQkgICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9tZW1vcnlfYWZmaW5pdHkgKm1lbW9yeV9hZmZpbml0eTsKKwlzdHJ1Y3QgYWNwaV9zcmF0X21lbV9hZmZpbml0eSAqbWVtb3J5X2FmZmluaXR5OwogCi0JbWVtb3J5X2FmZmluaXR5ID0gKHN0cnVjdCBhY3BpX3RhYmxlX21lbW9yeV9hZmZpbml0eSAqKWhlYWRlcjsKKwltZW1vcnlfYWZmaW5pdHkgPSAoc3RydWN0IGFjcGlfc3JhdF9tZW1fYWZmaW5pdHkgKiloZWFkZXI7CiAJaWYgKCFtZW1vcnlfYWZmaW5pdHkpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xOTUsMjMgKzE5NCwyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX3NyYXQodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcGFyc2Vfc3JhdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX3NyYXQgKnNyYXQ7CiAKLQlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKKwlpZiAoIXRhYmxlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNyYXQgPSAoc3RydWN0IGFjcGlfdGFibGVfc3JhdCAqKV9fdmEocGh5c19hZGRyKTsKKwlzcmF0ID0gKHN0cnVjdCBhY3BpX3RhYmxlX3NyYXQgKil0YWJsZTsKIAogCXJldHVybiAwOwogfQogCiBpbnQgX19pbml0Ci1hY3BpX3RhYmxlX3BhcnNlX3NyYXQoZW51bSBhY3BpX3NyYXRfZW50cnlfaWQgaWQsCithY3BpX3RhYmxlX3BhcnNlX3NyYXQoZW51bSBhY3BpX3NyYXRfdHlwZSBpZCwKIAkJICAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQogewotCXJldHVybiBhY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5KEFDUElfU1JBVCwKKwlyZXR1cm4gYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseShBQ1BJX1NJR19TUkFULAogCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3NyYXQpLCBpZCwKIAkJCQkJICAgIGhhbmRsZXIsIG1heF9lbnRyaWVzKTsKIH0KQEAgLTIyMSwxNyArMjIwLDE3IEBACiAJaW50IHJlc3VsdDsKIAogCS8qIFNSQVQ6IFN0YXRpYyBSZXNvdXJjZSBBZmZpbml0eSBUYWJsZSAqLwotCXJlc3VsdCA9IGFjcGlfdGFibGVfcGFyc2UoQUNQSV9TUkFULCBhY3BpX3BhcnNlX3NyYXQpOworCXJlc3VsdCA9IGFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfU1JBVCwgYWNwaV9wYXJzZV9zcmF0KTsKIAogCWlmIChyZXN1bHQgPiAwKSB7Ci0JCXJlc3VsdCA9IGFjcGlfdGFibGVfcGFyc2Vfc3JhdChBQ1BJX1NSQVRfUFJPQ0VTU09SX0FGRklOSVRZLAorCQlyZXN1bHQgPSBhY3BpX3RhYmxlX3BhcnNlX3NyYXQoQUNQSV9TUkFUX1RZUEVfQ1BVX0FGRklOSVRZLAogCQkJCQkgICAgICAgYWNwaV9wYXJzZV9wcm9jZXNzb3JfYWZmaW5pdHksCiAJCQkJCSAgICAgICBOUl9DUFVTKTsKLQkJcmVzdWx0ID0gYWNwaV90YWJsZV9wYXJzZV9zcmF0KEFDUElfU1JBVF9NRU1PUllfQUZGSU5JVFksIGFjcGlfcGFyc2VfbWVtb3J5X2FmZmluaXR5LCBOUl9OT0RFX01FTUJMS1MpOwkvLyBJQTY0IHNwZWNpZmljCisJCXJlc3VsdCA9IGFjcGlfdGFibGVfcGFyc2Vfc3JhdChBQ1BJX1NSQVRfVFlQRV9NRU1PUllfQUZGSU5JVFksIGFjcGlfcGFyc2VfbWVtb3J5X2FmZmluaXR5LCBOUl9OT0RFX01FTUJMS1MpOwkvLyBJQTY0IHNwZWNpZmljCiAJfQogCiAJLyogU0xJVDogU3lzdGVtIExvY2FsaXR5IEluZm9ybWF0aW9uIFRhYmxlICovCi0JcmVzdWx0ID0gYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NMSVQsIGFjcGlfcGFyc2Vfc2xpdCk7CisJcmVzdWx0ID0gYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19TTElULCBhY3BpX3BhcnNlX3NsaXQpOwogCiAJYWNwaV9udW1hX2FyY2hfZml4dXAoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9vc2wuYyBiL2RyaXZlcnMvYWNwaS9vc2wuYwppbmRleCA1N2FlMWU1Li4wZjZmM2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvb3NsLmMKKysrIGIvZHJpdmVycy9hY3BpL29zbC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9ubWkuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgpAQCAtNzUsNiArNzYsNTQgQEAKIHN0YXRpYyB2b2lkICphY3BpX2lycV9jb250ZXh0Owogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICprYWNwaWRfd3E7CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBhY3BpX3JlcXVlc3RfcmVnaW9uIChzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmFkZHIsCisJdW5zaWduZWQgaW50IGxlbmd0aCwgY2hhciAqZGVzYykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCWlmICghYWRkci0+YWRkcmVzcyB8fCAhbGVuZ3RoKQorCQlyZXR1cm47CisKKwlpZiAoYWRkci0+c3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKQorCQlyZXMgPSByZXF1ZXN0X3JlZ2lvbihhZGRyLT5hZGRyZXNzLCBsZW5ndGgsIGRlc2MpOworCWVsc2UgaWYgKGFkZHItPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpCisJCXJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihhZGRyLT5hZGRyZXNzLCBsZW5ndGgsIGRlc2MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3Jlc2VydmVfcmVzb3VyY2VzKHZvaWQpCit7CisJYWNwaV9yZXF1ZXN0X3JlZ2lvbigmYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jaywgYWNwaV9nYmxfRkFEVC5wbTFfZXZlbnRfbGVuZ3RoLAorCQkiQUNQSSBQTTFhX0VWVF9CTEsiKTsKKworCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2ssIGFjcGlfZ2JsX0ZBRFQucG0xX2V2ZW50X2xlbmd0aCwKKwkJIkFDUEkgUE0xYl9FVlRfQkxLIik7CisKKwlhY3BpX3JlcXVlc3RfcmVnaW9uKCZhY3BpX2dibF9GQURULnhwbTFhX2NvbnRyb2xfYmxvY2ssIGFjcGlfZ2JsX0ZBRFQucG0xX2NvbnRyb2xfbGVuZ3RoLAorCQkiQUNQSSBQTTFhX0NOVF9CTEsiKTsKKworCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQueHBtMWJfY29udHJvbF9ibG9jaywgYWNwaV9nYmxfRkFEVC5wbTFfY29udHJvbF9sZW5ndGgsCisJCSJBQ1BJIFBNMWJfQ05UX0JMSyIpOworCisJaWYgKGFjcGlfZ2JsX0ZBRFQucG1fdGltZXJfbGVuZ3RoID09IDQpCisJCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLCA0LCAiQUNQSSBQTV9UTVIiKTsKKworCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQueHBtMl9jb250cm9sX2Jsb2NrLCBhY3BpX2dibF9GQURULnBtMl9jb250cm9sX2xlbmd0aCwKKwkJIkFDUEkgUE0yX0NOVF9CTEsiKTsKKworCS8qIExlbmd0aCBvZiBHUEUgYmxvY2tzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbXVsdGlwbGUgb2YgMiAqLworCisJaWYgKCEoYWNwaV9nYmxfRkFEVC5ncGUwX2Jsb2NrX2xlbmd0aCAmIDB4MSkpCisJCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQueGdwZTBfYmxvY2ssCisJCQkgICAgICAgYWNwaV9nYmxfRkFEVC5ncGUwX2Jsb2NrX2xlbmd0aCwgIkFDUEkgR1BFMF9CTEsiKTsKKworCWlmICghKGFjcGlfZ2JsX0ZBRFQuZ3BlMV9ibG9ja19sZW5ndGggJiAweDEpKQorCQlhY3BpX3JlcXVlc3RfcmVnaW9uKCZhY3BpX2dibF9GQURULnhncGUxX2Jsb2NrLAorCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQuZ3BlMV9ibG9ja19sZW5ndGgsICJBQ1BJIEdQRTFfQkxLIik7CisKKwlyZXR1cm4gMDsKK30KK2RldmljZV9pbml0Y2FsbChhY3BpX3Jlc2VydmVfcmVzb3VyY2VzKTsKKwogYWNwaV9zdGF0dXMgYWNwaV9vc19pbml0aWFsaXplKHZvaWQpCiB7CiAJcmV0dXJuIEFFX09LOwpAQCAtMTM2LDUzICsxODUsNDMgQEAKICNlbmRpZgogfQogCi1hY3BpX3N0YXR1cyBhY3BpX29zX2dldF9yb290X3BvaW50ZXIodTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyKQorYWNwaV9waHlzaWNhbF9hZGRyZXNzIF9faW5pdCBhY3BpX29zX2dldF9yb290X3BvaW50ZXIodm9pZCkKIHsKIAlpZiAoZWZpX2VuYWJsZWQpIHsKLQkJYWRkci0+cG9pbnRlcl90eXBlID0gQUNQSV9QSFlTSUNBTF9QT0lOVEVSOwogCQlpZiAoZWZpLmFjcGkyMCAhPSBFRklfSU5WQUxJRF9UQUJMRV9BRERSKQotCQkJYWRkci0+cG9pbnRlci5waHlzaWNhbCA9IGVmaS5hY3BpMjA7CisJCQlyZXR1cm4gZWZpLmFjcGkyMDsKIAkJZWxzZSBpZiAoZWZpLmFjcGkgIT0gRUZJX0lOVkFMSURfVEFCTEVfQUREUikKLQkJCWFkZHItPnBvaW50ZXIucGh5c2ljYWwgPSBlZmkuYWNwaTsKKwkJCXJldHVybiBlZmkuYWNwaTsKIAkJZWxzZSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCiAJCQkgICAgICAgIlN5c3RlbSBkZXNjcmlwdGlvbiB0YWJsZXMgbm90IGZvdW5kXG4iKTsKLQkJCXJldHVybiBBRV9OT1RfRk9VTkQ7CisJCQlyZXR1cm4gMDsKIAkJfQotCX0gZWxzZSB7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9maW5kX3Jvb3RfcG9pbnRlcihmbGFncywgYWRkcikpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCi0JCQkgICAgICAgIlN5c3RlbSBkZXNjcmlwdGlvbiB0YWJsZXMgbm90IGZvdW5kXG4iKTsKLQkJCXJldHVybiBBRV9OT1RfRk9VTkQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gQUVfT0s7CisJfSBlbHNlCisJCXJldHVybiBhY3BpX2ZpbmRfcnNkcCgpOwogfQogCi1hY3BpX3N0YXR1cwotYWNwaV9vc19tYXBfbWVtb3J5KGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzLCBhY3BpX3NpemUgc2l6ZSwKLQkJICAgdm9pZCBfX2lvbWVtICoqIHZpcnQpCit2b2lkIF9faW9tZW0gKmFjcGlfb3NfbWFwX21lbW9yeShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcGh5cywgYWNwaV9zaXplIHNpemUpCiB7CiAJaWYgKHBoeXMgPiBVTE9OR19NQVgpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ2Fubm90IG1hcCBtZW1vcnkgdGhhdCBoaWdoXG4iKTsKLQkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CisJCXJldHVybiAwOwogCX0KLQkvKgotCSAqIGlvcmVtYXAgY2hlY2tzIHRvIGVuc3VyZSB0aGlzIGlzIGluIHJlc2VydmVkIHNwYWNlCi0JICovCi0JKnZpcnQgPSBpb3JlbWFwKCh1bnNpZ25lZCBsb25nKXBoeXMsIHNpemUpOwotCi0JaWYgKCEqdmlydCkKLQkJcmV0dXJuIEFFX05PX01FTU9SWTsKLQotCXJldHVybiBBRV9PSzsKKwlpZiAoYWNwaV9nYmxfcGVybWFuZW50X21tYXApCisJCS8qCisJCSogaW9yZW1hcCBjaGVja3MgdG8gZW5zdXJlIHRoaXMgaXMgaW4gcmVzZXJ2ZWQgc3BhY2UKKwkJKi8KKwkJcmV0dXJuIGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpcGh5cywgc2l6ZSk7CisJZWxzZQorCQlyZXR1cm4gX19hY3BpX21hcF90YWJsZSgodW5zaWduZWQgbG9uZylwaHlzLCBzaXplKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFjcGlfb3NfbWFwX21lbW9yeSk7CiAKIHZvaWQgYWNwaV9vc191bm1hcF9tZW1vcnkodm9pZCBfX2lvbWVtICogdmlydCwgYWNwaV9zaXplIHNpemUpCiB7Ci0JaW91bm1hcCh2aXJ0KTsKKwlpZiAoYWNwaV9nYmxfcGVybWFuZW50X21tYXApIHsKKwkJaW91bm1hcCh2aXJ0KTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhY3BpX29zX3VubWFwX21lbW9yeSk7CiAKQEAgLTI1NCw3ICsyOTMsNyBAQAogCSAqIEZBRFQuIEl0IG1heSBub3QgYmUgdGhlIHNhbWUgaWYgYW4gaW50ZXJydXB0IHNvdXJjZSBvdmVycmlkZSBleGlzdHMKIAkgKiBmb3IgdGhlIFNDSS4KIAkgKi8KLQlnc2kgPSBhY3BpX2ZhZHQuc2NpX2ludDsKKwlnc2kgPSBhY3BpX2dibF9GQURULnNjaV9pbnRlcnJ1cHQ7CiAJaWYgKGFjcGlfZ3NpX3RvX2lycShnc2ksICZpcnEpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJTQ0kgKEFDUEkgR1NJICVkKSBub3QgcmVnaXN0ZXJlZFxuIiwKIAkJICAgICAgIGdzaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYwppbmRleCBiZjg4ZTA3Li5jMmI5ODM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzbG9vcC5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2xvb3AuYwppbmRleCBlMTU0MWRiLi43NzNhZWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzbG9vcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNsb29wLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00MiwxMiArNDIsMTEgQEAKICAqLwogCiAvKgotICogUGFyc2UgdGhlIEFNTCBhbmQgYnVpbGQgYW4gb3BlcmF0aW9uIHRyZWUgYXMgbW9zdCBpbnRlcnByZXRlcnMsCi0gKiBsaWtlIFBlcmwsIGRvLiAgUGFyc2luZyBpcyBkb25lIGJ5IGhhbmQgcmF0aGVyIHRoYW4gd2l0aCBhIFlBQ0MKLSAqIGdlbmVyYXRlZCBwYXJzZXIgdG8gdGlnaHRseSBjb25zdHJhaW4gc3RhY2sgYW5kIGR5bmFtaWMgbWVtb3J5Ci0gKiB1c2FnZS4gIEF0IHRoZSBzYW1lIHRpbWUsIHBhcnNpbmcgaXMga2VwdCBmbGV4aWJsZSBhbmQgdGhlIGNvZGUKLSAqIGZhaXJseSBjb21wYWN0IGJ5IHBhcnNpbmcgYmFzZWQgb24gYSBsaXN0IG9mIEFNTCBvcGNvZGUKLSAqIHRlbXBsYXRlcyBpbiBhbWxfb3BfaW5mb1tdCisgKiBQYXJzZSB0aGUgQU1MIGFuZCBidWlsZCBhbiBvcGVyYXRpb24gdHJlZSBhcyBtb3N0IGludGVycHJldGVycywgKHN1Y2ggYXMKKyAqIFBlcmwpIGRvLiBQYXJzaW5nIGlzIGRvbmUgYnkgaGFuZCByYXRoZXIgdGhhbiB3aXRoIGEgWUFDQyBnZW5lcmF0ZWQgcGFyc2VyCisgKiB0byB0aWdodGx5IGNvbnN0cmFpbiBzdGFjayBhbmQgZHluYW1pYyBtZW1vcnkgdXNhZ2UuIFBhcnNpbmcgaXMga2VwdAorICogZmxleGlibGUgYW5kIHRoZSBjb2RlIGZhaXJseSBjb21wYWN0IGJ5IHBhcnNpbmcgYmFzZWQgb24gYSBsaXN0IG9mIEFNTAorICogb3Bjb2RlIHRlbXBsYXRlcyBpbiBhbWxfb3BfaW5mb1tdLgogICovCiAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KQEAgLTYwLDYgKzU5LDc2MSBAQAogCiBzdGF0aWMgdTMyIGFjcGlfZ2JsX2RlcHRoID0gMDsKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9wc19nZXRfYW1sX29wY29kZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3BzX2J1aWxkX25hbWVkX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgICB1OCAqIGFtbF9vcF9zdGFydCwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICp1bm5hbWVkX29wLAorCQkgICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvcCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9wc19jcmVhdGVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICB1OCAqIGFtbF9vcF9zdGFydCwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipuZXdfb3ApOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfZ2V0X2FyZ3VtZW50cyhzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAorCQkgICAgICB1OCAqIGFtbF9vcF9zdGFydCwgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3BzX2NvbXBsZXRlX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqKm9wLCBhY3BpX3N0YXR1cyBzdGF0dXMpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfY29tcGxldGVfZmluYWxfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLCBhY3BpX3N0YXR1cyBzdGF0dXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9hbWxfb3Bjb2RlCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBFeHRyYWN0IHRoZSBuZXh0IEFNTCBvcGNvZGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3BzX2dldF9hbWxfb3Bjb2RlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19nZXRfYW1sX29wY29kZSwgd2Fsa19zdGF0ZSk7CisKKwl3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0ID0KKwkgICAgKHUzMikgQUNQSV9QVFJfRElGRih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sLAorCQkJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc3RhcnQpOworCXdhbGtfc3RhdGUtPm9wY29kZSA9IGFjcGlfcHNfcGVla19vcGNvZGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpKTsKKworCS8qCisJICogRmlyc3QgY3V0IHRvIGRldGVybWluZSB3aGF0IHdlIGhhdmUgZm91bmQ6CisJICogMSkgQSB2YWxpZCBBTUwgb3Bjb2RlCisJICogMikgQSBuYW1lIHN0cmluZworCSAqIDMpIEFuIHVua25vd24vaW52YWxpZCBvcGNvZGUKKwkgKi8KKwl3YWxrX3N0YXRlLT5vcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8od2Fsa19zdGF0ZS0+b3Bjb2RlKTsKKworCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MpIHsKKwljYXNlIEFNTF9DTEFTU19BU0NJSToKKwljYXNlIEFNTF9DTEFTU19QUkVGSVg6CisJCS8qCisJCSAqIFN0YXJ0cyB3aXRoIGEgdmFsaWQgcHJlZml4IG9yIEFTQ0lJIGNoYXIsIHRoaXMgaXMgYSBuYW1lCisJCSAqIHN0cmluZy4gQ29udmVydCB0aGUgYmFyZSBuYW1lIHN0cmluZyB0byBhIG5hbWVwYXRoLgorCQkgKi8KKwkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gQU1MX0lOVF9OQU1FUEFUSF9PUDsKKwkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gQVJHUF9OQU1FU1RSSU5HOworCQlicmVhazsKKworCWNhc2UgQU1MX0NMQVNTX1VOS05PV046CisKKwkJLyogVGhlIG9wY29kZSBpcyB1bnJlY29nbml6ZWQuIEp1c3Qgc2tpcCB1bmtub3duIG9wY29kZXMgKi8KKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJGb3VuZCB1bmtub3duIG9wY29kZSAlWCBhdCBBTUwgYWRkcmVzcyAlcCBvZmZzZXQgJVgsIGlnbm9yaW5nIiwKKwkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUsIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsCisJCQkgICAgd2Fsa19zdGF0ZS0+YW1sX29mZnNldCkpOworCisJCUFDUElfRFVNUF9CVUZGRVIod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCwgMTI4KTsKKworCQkvKiBBc3N1bWUgb25lLWJ5dGUgYmFkIG9wY29kZSAqLworCisJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwrKzsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfUEFSU0VfQ09OVElOVUUpOworCisJZGVmYXVsdDoKKworCQkvKiBGb3VuZCBvcGNvZGUgaW5mbywgdGhpcyBpcyBhIG5vcm1hbCBvcGNvZGUgKi8KKworCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sICs9CisJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfc2l6ZSh3YWxrX3N0YXRlLT5vcGNvZGUpOworCQl3YWxrX3N0YXRlLT5hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5vcF9pbmZvLT5wYXJzZV9hcmdzOworCQlicmVhazsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2J1aWxkX25hbWVkX29wCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKiAgICAgICAgICAgICAgYW1sX29wX3N0YXJ0ICAgICAgICAtIEJlZ2luIG9mIG5hbWVkIE9wIGluIEFNTAorICogICAgICAgICAgICAgIHVubmFtZWRfb3AgICAgICAgICAgLSBFYXJseSBPcCAobm90IGEgbmFtZWQgT3ApCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIFJldHVybmVkIE9wCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBQYXJzZSBhIG5hbWVkIE9wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3BzX2J1aWxkX25hbWVkX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgICB1OCAqIGFtbF9vcF9zdGFydCwKKwkJICAgICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICp1bm5hbWVkX29wLAorCQkgICAgICAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKipvcCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2J1aWxkX25hbWVkX29wLCB3YWxrX3N0YXRlKTsKKworCXVubmFtZWRfb3AtPmNvbW1vbi52YWx1ZS5hcmcgPSBOVUxMOworCXVubmFtZWRfb3AtPmNvbW1vbi5hbWxfb3Bjb2RlID0gd2Fsa19zdGF0ZS0+b3Bjb2RlOworCisJLyoKKwkgKiBHZXQgYW5kIGFwcGVuZCBhcmd1bWVudHMgdW50aWwgd2UgZmluZCB0aGUgbm9kZSB0aGF0IGNvbnRhaW5zCisJICogdGhlIG5hbWUgKHRoZSB0eXBlIEFSR1BfTkFNRSkuCisJICovCisJd2hpbGUgKEdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgJiYKKwkgICAgICAgKEdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgIT0gQVJHUF9OQU1FKSkgeworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9wc19nZXRfbmV4dF9hcmcod2Fsa19zdGF0ZSwKKwkJCQkJICYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSwKKwkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPgorCQkJCQkJCSAgICAgIGFyZ190eXBlcyksICZhcmcpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisKKwkJYWNwaV9wc19hcHBlbmRfYXJnKHVubmFtZWRfb3AsIGFyZyk7CisJCUlOQ1JFTUVOVF9BUkdfTElTVCh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgd2UgZm91bmQgYSBOQU1FIGFuZCBkaWRuJ3QgcnVuIG91dCBvZiBhcmd1bWVudHMKKwkgKi8KKwlpZiAoIUdFVF9DVVJSRU5UX0FSR19UWVBFKHdhbGtfc3RhdGUtPmFyZ190eXBlcykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKKwl9CisKKwkvKiBXZSBrbm93IHRoYXQgdGhpcyBhcmcgaXMgYSBuYW1lLCBtb3ZlIHRvIG5leHQgYXJnICovCisKKwlJTkNSRU1FTlRfQVJHX0xJU1Qod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKTsKKworCS8qCisJICogRmluZCB0aGUgb2JqZWN0LiBUaGlzIHdpbGwgZWl0aGVyIGluc2VydCB0aGUgb2JqZWN0IGludG8KKwkgKiB0aGUgbmFtZXNwYWNlIG9yIHNpbXBseSBsb29rIGl0IHVwCisJICovCisJd2Fsa19zdGF0ZS0+b3AgPSBOVUxMOworCisJc3RhdHVzID0gd2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlLCBvcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgbmFtZSBsb29rdXAvY2F0YWxvZyIpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJaWYgKCEqb3ApIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfUEFSU0VfQ09OVElOVUUpOworCX0KKworCXN0YXR1cyA9IGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCAqb3AsIHN0YXR1cyk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9QQVJTRV9QRU5ESU5HKTsKKwkJfQorCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwlhY3BpX3BzX2FwcGVuZF9hcmcoKm9wLCB1bm5hbWVkX29wLT5jb21tb24udmFsdWUuYXJnKTsKKwlhY3BpX2dibF9kZXB0aCsrOworCisJaWYgKCgqb3ApLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSB7CisJCS8qCisJCSAqIERlZmVyIGZpbmFsIHBhcnNpbmcgb2YgYW4gb3BlcmF0aW9uX3JlZ2lvbiBib2R5LCBiZWNhdXNlIHdlIGRvbid0CisJCSAqIGhhdmUgZW5vdWdoIGluZm8gaW4gdGhlIGZpcnN0IHBhc3MgdG8gcGFyc2UgaXQgY29ycmVjdGx5IChpLmUuLAorCQkgKiB0aGVyZSBtYXkgYmUgbWV0aG9kIGNhbGxzIHdpdGhpbiB0aGUgdGVybV9hcmcgZWxlbWVudHMgb2YgdGhlIGJvZHkuKQorCQkgKgorCQkgKiBIb3dldmVyLCB3ZSBtdXN0IGNvbnRpbnVlIHBhcnNpbmcgYmVjYXVzZSB0aGUgb3ByZWdpb24gaXMgbm90IGEKKwkJICogc3RhbmRhbG9uZSBwYWNrYWdlIC0tIHdlIGRvbid0IGtub3cgd2hlcmUgdGhlIGVuZCBpcyBhdCB0aGlzIHBvaW50LgorCQkgKgorCQkgKiAoTGVuZ3RoIGlzIHVua25vd24gdW50aWwgcGFyc2Ugb2YgdGhlIGJvZHkgY29tcGxldGUpCisJCSAqLworCQkoKm9wKS0+bmFtZWQuZGF0YSA9IGFtbF9vcF9zdGFydDsKKwkJKCpvcCktPm5hbWVkLmxlbmd0aCA9IDA7CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9wc19jcmVhdGVfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqICAgICAgICAgICAgICBhbWxfb3Bfc3RhcnQgICAgICAgIC0gT3Agc3RhcnQgaW4gQU1MCisgKiAgICAgICAgICAgICAgbmV3X29wICAgICAgICAgICAgICAtIFJldHVybmVkIE9wCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgT3AgZnJvbSBBTUwKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfY3JlYXRlX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgdTggKiBhbWxfb3Bfc3RhcnQsIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqbmV3X29wKQoreworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmFtZWRfb3AgPSBOVUxMOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfY3JlYXRlX29wLCB3YWxrX3N0YXRlKTsKKworCXN0YXR1cyA9IGFjcGlfcHNfZ2V0X2FtbF9vcGNvZGUod2Fsa19zdGF0ZSk7CisJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BBUlNFX0NPTlRJTlVFKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9DVFJMX1BBUlNFX0NPTlRJTlVFKTsKKwl9CisKKwkvKiBDcmVhdGUgT3Agc3RydWN0dXJlIGFuZCBhcHBlbmQgdG8gcGFyZW50J3MgYXJndW1lbnQgbGlzdCAqLworCisJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKHdhbGtfc3RhdGUtPm9wY29kZSk7CisJb3AgPSBhY3BpX3BzX2FsbG9jX29wKHdhbGtfc3RhdGUtPm9wY29kZSk7CisJaWYgKCFvcCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfcHNfYnVpbGRfbmFtZWRfb3Aod2Fsa19zdGF0ZSwgYW1sX29wX3N0YXJ0LCBvcCwKKwkJCQkJICAgJm5hbWVkX29wKTsKKwkJYWNwaV9wc19mcmVlX29wKG9wKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCSpuZXdfb3AgPSBuYW1lZF9vcDsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBOb3QgYSBuYW1lZCBvcGNvZGUsIGp1c3QgYWxsb2NhdGUgT3AgYW5kIGFwcGVuZCB0byBwYXJlbnQgKi8KKworCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9DUkVBVEUpIHsKKwkJLyoKKwkJICogQmFja3VwIHRvIGJlZ2lubmluZyBvZiBjcmVhdGVfeFhYZmllbGQgZGVjbGFyYXRpb24KKwkJICogYm9keV9sZW5ndGggaXMgdW5rbm93biB1bnRpbCB3ZSBwYXJzZSB0aGUgYm9keQorCQkgKi8KKwkJb3AtPm5hbWVkLmRhdGEgPSBhbWxfb3Bfc3RhcnQ7CisJCW9wLT5uYW1lZC5sZW5ndGggPSAwOworCX0KKworCWFjcGlfcHNfYXBwZW5kX2FyZyhhY3BpX3BzX2dldF9wYXJlbnRfc2NvcGUKKwkJCSAgICgmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSkpLCBvcCk7CisKKwlpZiAod2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayAhPSBOVUxMKSB7CisJCS8qCisJCSAqIEZpbmQgdGhlIG9iamVjdC4gVGhpcyB3aWxsIGVpdGhlciBpbnNlcnQgdGhlIG9iamVjdCBpbnRvCisJCSAqIHRoZSBuYW1lc3BhY2Ugb3Igc2ltcGx5IGxvb2sgaXQgdXAKKwkJICovCisJCXdhbGtfc3RhdGUtPm9wID0gKm5ld19vcCA9IG9wOworCisJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSwgJm9wKTsKKwkJc3RhdHVzID0gYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOworCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgeworCQkJc3RhdHVzID0gQUVfQ1RSTF9QQVJTRV9QRU5ESU5HOworCQl9CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZ2V0X2FyZ3VtZW50cworICoKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBzdGF0ZQorICogICAgICAgICAgICAgIGFtbF9vcF9zdGFydCAgICAgICAgLSBPcCBzdGFydCBpbiBBTUwKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBPcAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogR2V0IGFyZ3VtZW50cyBmb3IgcGFzc2VkIE9wLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9wc19nZXRfYXJndW1lbnRzKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCSAgICAgIHU4ICogYW1sX29wX3N0YXJ0LCB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZyA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19nZXRfYXJndW1lbnRzLCB3YWxrX3N0YXRlKTsKKworCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CisJY2FzZSBBTUxfQllURV9PUDoJLyogQU1MX0JZVEVEQVRBX0FSRyAqLworCWNhc2UgQU1MX1dPUkRfT1A6CS8qIEFNTF9XT1JEREFUQV9BUkcgKi8KKwljYXNlIEFNTF9EV09SRF9PUDoJLyogQU1MX0RXT1JEQVRBX0FSRyAqLworCWNhc2UgQU1MX1FXT1JEX09QOgkvKiBBTUxfUVdPUkRBVEFfQVJHICovCisJY2FzZSBBTUxfU1RSSU5HX09QOgkvKiBBTUxfQVNDSUlDSEFSTElTVF9BUkcgKi8KKworCQkvKiBGaWxsIGluIGNvbnN0YW50IG9yIHN0cmluZyBhcmd1bWVudCBkaXJlY3RseSAqLworCisJCWFjcGlfcHNfZ2V0X25leHRfc2ltcGxlX2FyZygmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksCisJCQkJCSAgICBHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT4KKwkJCQkJCQkJIGFyZ190eXBlcyksCisJCQkJCSAgICBvcCk7CisJCWJyZWFrOworCisJY2FzZSBBTUxfSU5UX05BTUVQQVRIX09QOgkvKiBBTUxfTkFNRVNUUklOR19BUkcgKi8KKworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aCh3YWxrX3N0YXRlLAorCQkJCQkgICAgICAmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksIG9wLAorCQkJCQkgICAgICAxKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCXdhbGtfc3RhdGUtPmFyZ190eXBlcyA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyoKKwkJICogT3AgaXMgbm90IGEgY29uc3RhbnQgb3Igc3RyaW5nLCBhcHBlbmQgZWFjaCBhcmd1bWVudCB0byB0aGUgT3AKKwkJICovCisJCXdoaWxlIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpCisJCSAgICAgICAmJiAhd2Fsa19zdGF0ZS0+YXJnX2NvdW50KSB7CisJCQl3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0ID0KKwkJCSAgICAodTMyKSBBQ1BJX1BUUl9ESUZGKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsCisJCQkJCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuCisJCQkJCQlhbWxfc3RhcnQpOworCisJCQlzdGF0dXMgPQorCQkJICAgIGFjcGlfcHNfZ2V0X25leHRfYXJnKHdhbGtfc3RhdGUsCisJCQkJCQkgJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLAorCQkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFCisJCQkJCQkgKHdhbGtfc3RhdGUtPmFyZ190eXBlcyksICZhcmcpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQl9CisKKwkJCWlmIChhcmcpIHsKKwkJCQlhcmctPmNvbW1vbi5hbWxfb2Zmc2V0ID0gd2Fsa19zdGF0ZS0+YW1sX29mZnNldDsKKwkJCQlhY3BpX3BzX2FwcGVuZF9hcmcob3AsIGFyZyk7CisJCQl9CisKKwkJCUlOQ1JFTUVOVF9BUkdfTElTVCh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpOworCQl9CisKKwkJLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBjZXJ0YWluIG9wY29kZXMgKi8KKworCQkvKiBUQkQgKHJlbW92ZSk6IFRlbXBvcmFyeSBtZWNoYW5pc20gdG8gZGlzYWJsZSB0aGlzIGNvZGUgaWYgbmVlZGVkICovCisKKyNpZmRlZiBBQ1BJX0VOQUJMRV9NT0RVTEVfTEVWRUxfQ09ERQorCisJCWlmICgod2Fsa19zdGF0ZS0+cGFzc19udW1iZXIgPD0gQUNQSV9JTU9ERV9MT0FEX1BBU1MxKSAmJgorCQkgICAgKCh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfRElTQVNTRU1CTEUpID09IDApKSB7CisJCQkvKgorCQkJICogV2Ugd2FudCB0byBza2lwIElmL0Vsc2UvV2hpbGUgY29uc3RydWN0cyBkdXJpbmcgUGFzczEgYmVjYXVzZSB3ZQorCQkJICogd2FudCB0byBhY3R1YWxseSBjb25kaXRpb25hbGx5IGV4ZWN1dGUgdGhlIGNvZGUgZHVyaW5nIFBhc3MyLgorCQkJICoKKwkJCSAqIEV4Y2VwdCBmb3IgZGlzYXNzZW1ibHksIHdoZXJlIHdlIGFsd2F5cyB3YW50IHRvIHdhbGsgdGhlCisJCQkgKiBJZi9FbHNlL1doaWxlIHBhY2thZ2VzCisJCQkgKi8KKwkJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CisJCQljYXNlIEFNTF9JRl9PUDoKKwkJCWNhc2UgQU1MX0VMU0VfT1A6CisJCQljYXNlIEFNTF9XSElMRV9PUDoKKworCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCisJCQkJCQkgICJQYXNzMTogU2tpcHBpbmcgYW4gSWYvRWxzZS9XaGlsZSBib2R5XG4iKSk7CisKKwkJCQkvKiBTa2lwIGJvZHkgb2YgaWYvZWxzZS93aGlsZSBpbiBwYXNzIDEgKi8KKworCQkJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwgPQorCQkJCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZDsKKwkJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAwOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisjZW5kaWYKKworCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgeworCQljYXNlIEFNTF9NRVRIT0RfT1A6CisJCQkvKgorCQkJICogU2tpcCBwYXJzaW5nIG9mIGNvbnRyb2wgbWV0aG9kIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2gKKwkJCSAqIGluZm8gaW4gdGhlIGZpcnN0IHBhc3MgdG8gcGFyc2UgaXQgY29ycmVjdGx5LgorCQkJICoKKwkJCSAqIFNhdmUgdGhlIGxlbmd0aCBhbmQgYWRkcmVzcyBvZiB0aGUgYm9keQorCQkJICovCisJCQlvcC0+bmFtZWQuZGF0YSA9IHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWw7CisJCQlvcC0+bmFtZWQubGVuZ3RoID0gKHUzMikKKwkJCSAgICAod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnBrZ19lbmQgLQorCQkJICAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sKTsKKworCQkJLyogU2tpcCBib2R5IG9mIG1ldGhvZCAqLworCisJCQl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuYW1sID0KKwkJCSAgICB3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUucGtnX2VuZDsKKwkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIEFNTF9CVUZGRVJfT1A6CisJCWNhc2UgQU1MX1BBQ0tBR0VfT1A6CisJCWNhc2UgQU1MX1ZBUl9QQUNLQUdFX09QOgorCisJCQlpZiAoKG9wLT5jb21tb24ucGFyZW50KSAmJgorCQkJICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0KKwkJCSAgICAgQU1MX05BTUVfT1ApCisJCQkgICAgJiYgKHdhbGtfc3RhdGUtPnBhc3NfbnVtYmVyIDw9CisJCQkJQUNQSV9JTU9ERV9MT0FEX1BBU1MyKSkgeworCQkJCS8qCisJCQkJICogU2tpcCBwYXJzaW5nIG9mIEJ1ZmZlcnMgYW5kIFBhY2thZ2VzIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZQorCQkJCSAqIGVub3VnaCBpbmZvIGluIHRoZSBmaXJzdCBwYXNzIHRvIHBhcnNlIHRoZW0gY29ycmVjdGx5LgorCQkJCSAqLworCQkJCW9wLT5uYW1lZC5kYXRhID0gYW1sX29wX3N0YXJ0OworCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKQorCQkJCSAgICAod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnBrZ19lbmQgLQorCQkJCSAgICAgYW1sX29wX3N0YXJ0KTsKKworCQkJCS8qIFNraXAgYm9keSAqLworCisJCQkJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCA9CisJCQkJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5wa2dfZW5kOworCQkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEFNTF9XSElMRV9PUDoKKworCQkJaWYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpIHsKKwkJCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kID0KKwkJCQkgICAgd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnBrZ19lbmQ7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCisJCQkvKiBObyBhY3Rpb24gZm9yIGFsbCBvdGhlciBvcGNvZGVzICovCisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcHNfY29tcGxldGVfb3AKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgICAgIC0gUmV0dXJuZWQgT3AKKyAqICAgICAgICAgICAgICBTdGF0dXMgICAgICAgICAgICAgIC0gUGFyc2Ugc3RhdHVzIGJlZm9yZSBjb21wbGV0ZSBPcAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29tcGxldGUgT3AKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfY29tcGxldGVfb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKKwkJICAgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoqb3AsIGFjcGlfc3RhdHVzIHN0YXR1cykKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMyOworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfY29tcGxldGVfb3AsIHdhbGtfc3RhdGUpOworCisJLyoKKwkgKiBGaW5pc2hlZCBvbmUgYXJndW1lbnQgb2YgdGhlIGNvbnRhaW5pbmcgc2NvcGUKKwkgKi8KKwl3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUuc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudC0tOworCisJLyogQ2xvc2UgdGhpcyBPcCAod2lsbCByZXN1bHQgaW4gcGFyc2Ugc3VidHJlZSBkZWxldGlvbikgKi8KKworCXN0YXR1czIgPSBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgKm9wKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwl9CisKKwkqb3AgPSBOVUxMOworCisJc3dpdGNoIChzdGF0dXMpIHsKKwljYXNlIEFFX09LOgorCQlicmVhazsKKworCWNhc2UgQUVfQ1RSTF9UUkFOU0ZFUjoKKworCQkvKiBXZSBhcmUgYWJvdXQgdG8gdHJhbnNmZXIgdG8gYSBjYWxsZWQgbWV0aG9kICovCisKKwkJd2Fsa19zdGF0ZS0+cHJldl9vcCA9IE5VTEw7CisJCXdhbGtfc3RhdGUtPnByZXZfYXJnX3R5cGVzID0gd2Fsa19zdGF0ZS0+YXJnX3R5cGVzOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKworCWNhc2UgQUVfQ1RSTF9FTkQ6CisKKwkJYWNwaV9wc19wb3Bfc2NvcGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLCBvcCwKKwkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKworCQlpZiAoKm9wKSB7CisJCQl3YWxrX3N0YXRlLT5vcCA9ICpvcDsKKwkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQorCQkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKCgqb3ApLT5jb21tb24uYW1sX29wY29kZSk7CisJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSAoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGU7CisKKwkJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayh3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsICpvcCwgc3RhdHVzKTsKKworCQkJc3RhdHVzMiA9IGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLCAqb3ApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwkJCX0KKwkJfQorCisJCXN0YXR1cyA9IEFFX09LOworCQlicmVhazsKKworCWNhc2UgQUVfQ1RSTF9CUkVBSzoKKwljYXNlIEFFX0NUUkxfQ09OVElOVUU6CisKKwkJLyogUG9wIG9mZiBzY29wZXMgdW50aWwgd2UgZmluZCB0aGUgV2hpbGUgKi8KKworCQl3aGlsZSAoISgqb3ApIHx8ICgoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX1dISUxFX09QKSkgeworCQkJYWNwaV9wc19wb3Bfc2NvcGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpLCBvcCwKKwkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAorCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCisJCQlpZiAoKCpvcCktPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9XSElMRV9PUCkgeworCQkJCXN0YXR1czIgPSBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3Aod2Fsa19zdGF0ZSk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogQ2xvc2UgdGhpcyBpdGVyYXRpb24gb2YgdGhlIFdoaWxlIGxvb3AgKi8KKworCQl3YWxrX3N0YXRlLT5vcCA9ICpvcDsKKwkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9CisJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbygoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGUpOworCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSAoKm9wKS0+Y29tbW9uLmFtbF9vcGNvZGU7CisKKwkJc3RhdHVzID0gd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUpOworCQlzdGF0dXMgPSBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUod2Fsa19zdGF0ZSwgKm9wLCBzdGF0dXMpOworCisJCXN0YXR1czIgPSBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgKm9wKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOworCQl9CisKKwkJc3RhdHVzID0gQUVfT0s7CisJCWJyZWFrOworCisJY2FzZSBBRV9DVFJMX1RFUk1JTkFURToKKworCQkvKiBDbGVhbiB1cCAqLworCQlkbyB7CisJCQlpZiAoKm9wKSB7CisJCQkJc3RhdHVzMiA9CisJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLCAqb3ApOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOworCQkJCX0KKwkJCQlzdGF0dXMyID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcG9wKHdhbGtfc3RhdGUpOworCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzMikpIHsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOworCQkJCX0KKworCQkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUKKwkJCQkgICAgKGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUKKwkJCQkgICAgICgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkpOworCQkJfQorCisJCQlhY3BpX3BzX3BvcF9zY29wZSgmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksIG9wLAorCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7CisKKwkJfSB3aGlsZSAoKm9wKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCisJZGVmYXVsdDoJCS8qIEFsbCBvdGhlciBub24tQUVfT0sgc3RhdHVzICovCisKKwkJZG8geworCQkJaWYgKCpvcCkgeworCQkJCXN0YXR1czIgPQorCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgKm9wKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwkJCQl9CisJCQl9CisKKwkJCWFjcGlfcHNfcG9wX3Njb3BlKCYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSwgb3AsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKworCQl9IHdoaWxlICgqb3ApOworCisjaWYgMAorCQkvKgorCQkgKiBUQkQ6IENsZWFudXAgcGFyc2Ugb3BzIG9uIGVycm9yCisJCSAqLworCQlpZiAoKm9wID09IE5VTEwpIHsKKwkJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgb3AsCisJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKKwkJfQorI2VuZGlmCisJCXdhbGtfc3RhdGUtPnByZXZfb3AgPSBOVUxMOworCQl3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlcyA9IHdhbGtfc3RhdGUtPmFyZ190eXBlczsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJLyogVGhpcyBzY29wZSBjb21wbGV0ZT8gKi8KKworCWlmIChhY3BpX3BzX2hhc19jb21wbGV0ZWRfc2NvcGUoJih3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpKSkgeworCQlhY3BpX3BzX3BvcF9zY29wZSgmKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZSksIG9wLAorCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiUG9wcGVkIHNjb3BlLCBPcD0lcFxuIiwgKm9wKSk7CisJfSBlbHNlIHsKKwkJKm9wID0gTlVMTDsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2NvbXBsZXRlX2ZpbmFsX29wCisgKgorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIEN1cnJlbnQgT3AKKyAqICAgICAgICAgICAgICBTdGF0dXMgICAgICAgICAgICAgIC0gQ3VycmVudCBwYXJzZSBzdGF0dXMgYmVmb3JlIGNvbXBsZXRlIGxhc3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3AKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IENvbXBsZXRlIGxhc3QgT3AuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3BzX2NvbXBsZXRlX2ZpbmFsX29wKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCisJCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCwgYWNwaV9zdGF0dXMgc3RhdHVzKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czI7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19jb21wbGV0ZV9maW5hbF9vcCwgd2Fsa19zdGF0ZSk7CisKKwkvKgorCSAqIENvbXBsZXRlIHRoZSBsYXN0IE9wIChpZiBub3QgY29tcGxldGVkKSwgYW5kIGNsZWFyIHRoZSBzY29wZSBzdGFjay4KKwkgKiBJdCBpcyBlYXNpbHkgcG9zc2libGUgdG8gZW5kIGFuIEFNTCAicGFja2FnZSIgd2l0aCBhbiB1bmJvdW5kZWQgbnVtYmVyCisJICogb2Ygb3BlbiBzY29wZXMgKHN1Y2ggYXMgd2hlbiBzZXZlcmFsIEFTTCBibG9ja3MgYXJlIGNsb3NlZCB3aXRoCisJICogc2VxdWVudGlhbCBjbG9zaW5nIGJyYWNlcykuIFdlIHdhbnQgdG8gdGVybWluYXRlIGVhY2ggb25lIGNsZWFubHkuCisJICovCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIkFNTCBwYWNrYWdlIGNvbXBsZXRlIGF0IE9wICVwXG4iLAorCQkJICBvcCkpOworCWRvIHsKKwkJaWYgKG9wKSB7CisJCQlpZiAod2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrICE9IE5VTEwpIHsKKwkJCQl3YWxrX3N0YXRlLT5vcCA9IG9wOworCQkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQorCQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLgorCQkJCQkJCSAgICBhbWxfb3Bjb2RlKTsKKwkJCQl3YWxrX3N0YXRlLT5vcGNvZGUgPSBvcC0+Y29tbW9uLmFtbF9vcGNvZGU7CisKKwkJCQlzdGF0dXMgPQorCQkJCSAgICB3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSk7CisJCQkJc3RhdHVzID0KKwkJCQkgICAgYWNwaV9wc19uZXh0X3BhcnNlX3N0YXRlKHdhbGtfc3RhdGUsIG9wLAorCQkJCQkJCSAgICAgc3RhdHVzKTsKKwkJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEVORElORykgeworCQkJCQlzdGF0dXMgPQorCQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV9vcCh3YWxrX3N0YXRlLCAmb3AsCisJCQkJCQkJCUFFX09LKTsKKwkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKKwkJCQkJc3RhdHVzID0gQUVfT0s7CisKKwkJCQkJLyogQ2xlYW4gdXAgKi8KKwkJCQkJZG8geworCQkJCQkJaWYgKG9wKSB7CisJCQkJCQkJc3RhdHVzMiA9CisJCQkJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcAorCQkJCQkJCSAgICAod2Fsa19zdGF0ZSwgb3ApOworCQkJCQkJCWlmIChBQ1BJX0ZBSUxVUkUKKwkJCQkJCQkgICAgKHN0YXR1czIpKSB7CisJCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUworCQkJCQkJCQkgICAgKHN0YXR1czIpOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQkJYWNwaV9wc19wb3Bfc2NvcGUoJgorCQkJCQkJCQkgICh3YWxrX3N0YXRlLT4KKwkJCQkJCQkJICAgcGFyc2VyX3N0YXRlKSwKKwkJCQkJCQkJICAmb3AsCisJCQkJCQkJCSAgJndhbGtfc3RhdGUtPgorCQkJCQkJCQkgIGFyZ190eXBlcywKKwkJCQkJCQkJICAmd2Fsa19zdGF0ZS0+CisJCQkJCQkJCSAgYXJnX2NvdW50KTsKKworCQkJCQl9IHdoaWxlIChvcCk7CisKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQkJfQorCisJCQkJZWxzZSBpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKworCQkJCQkvKiBGaXJzdCBlcnJvciBpcyBtb3N0IGltcG9ydGFudCAqLworCisJCQkJCSh2b2lkKQorCQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsCisJCQkJCQkJCSAgICAgb3ApOworCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCQl9CisJCQl9CisKKwkJCXN0YXR1czIgPSBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgb3ApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKKwkJCX0KKwkJfQorCisJCWFjcGlfcHNfcG9wX3Njb3BlKCYod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlKSwgJm9wLAorCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKKwkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOworCisJfSB3aGlsZSAob3ApOworCisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfcGFyc2VfbG9vcApAQCAtNzYsMTAgKzgzMCw3IEBACiBhY3BpX3N0YXR1cyBhY3BpX3BzX3BhcnNlX2xvb3Aoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlhY3BpX3N0YXR1cyBzdGF0dXMyOwogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCA9IE5VTEw7CS8qIGN1cnJlbnQgb3AgKi8KLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYXJnID0gTlVMTDsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcHJlX29wID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAqcGFyc2VyX3N0YXRlOwogCXU4ICphbWxfb3Bfc3RhcnQgPSBOVUxMOwogCkBAIC0xMjgsNiArODc5LDcgQEAKIAkJCQkJCQkJIkludm9rZWQgbWV0aG9kIGRpZCBub3QgcmV0dXJuIGEgdmFsdWUiKSk7CiAKIAkJCQkJfQorCiAJCQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCiAJCQkJCQkJIkdldFByZWRpY2F0ZSBGYWlsZWQiKSk7CiAJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwpAQCAtMTU4LDIxNyArOTEwLDI1IEBACiAJd2hpbGUgKChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+YW1sX2VuZCkgfHwgKG9wKSkgewogCQlhbWxfb3Bfc3RhcnQgPSBwYXJzZXJfc3RhdGUtPmFtbDsKIAkJaWYgKCFvcCkgewotCi0JCQkvKiBHZXQgdGhlIG5leHQgb3Bjb2RlIGZyb20gdGhlIEFNTCBzdHJlYW0gKi8KLQotCQkJd2Fsa19zdGF0ZS0+YW1sX29mZnNldCA9Ci0JCQkgICAgKHUzMikgQUNQSV9QVFJfRElGRihwYXJzZXJfc3RhdGUtPmFtbCwKLQkJCQkJCXBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKLQkJCXdhbGtfc3RhdGUtPm9wY29kZSA9IGFjcGlfcHNfcGVla19vcGNvZGUocGFyc2VyX3N0YXRlKTsKLQotCQkJLyoKLQkJCSAqIEZpcnN0IGN1dCB0byBkZXRlcm1pbmUgd2hhdCB3ZSBoYXZlIGZvdW5kOgotCQkJICogMSkgQSB2YWxpZCBBTUwgb3Bjb2RlCi0JCQkgKiAyKSBBIG5hbWUgc3RyaW5nCi0JCQkgKiAzKSBBbiB1bmtub3duL2ludmFsaWQgb3Bjb2RlCi0JCQkgKi8KLQkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQotCQkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKHdhbGtfc3RhdGUtPm9wY29kZSk7Ci0JCQlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzKSB7Ci0JCQljYXNlIEFNTF9DTEFTU19BU0NJSToKLQkJCWNhc2UgQU1MX0NMQVNTX1BSRUZJWDoKLQkJCQkvKgotCQkJCSAqIFN0YXJ0cyB3aXRoIGEgdmFsaWQgcHJlZml4IG9yIEFTQ0lJIGNoYXIsIHRoaXMgaXMgYSBuYW1lCi0JCQkJICogc3RyaW5nLiAgQ29udmVydCB0aGUgYmFyZSBuYW1lIHN0cmluZyB0byBhIG5hbWVwYXRoLgotCQkJCSAqLwotCQkJCXdhbGtfc3RhdGUtPm9wY29kZSA9IEFNTF9JTlRfTkFNRVBBVEhfT1A7Ci0JCQkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gQVJHUF9OQU1FU1RSSU5HOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEFNTF9DTEFTU19VTktOT1dOOgotCi0JCQkJLyogVGhlIG9wY29kZSBpcyB1bnJlY29nbml6ZWQuICBKdXN0IHNraXAgdW5rbm93biBvcGNvZGVzICovCi0KLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkgICAgIkZvdW5kIHVua25vd24gb3Bjb2RlICVYIGF0IEFNTCBhZGRyZXNzICVwIG9mZnNldCAlWCwgaWdub3JpbmciLAotCQkJCQkgICAgd2Fsa19zdGF0ZS0+b3Bjb2RlLAotCQkJCQkgICAgcGFyc2VyX3N0YXRlLT5hbWwsCi0JCQkJCSAgICB3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0KSk7Ci0KLQkJCQlBQ1BJX0RVTVBfQlVGRkVSKHBhcnNlcl9zdGF0ZS0+YW1sLCAxMjgpOwotCi0JCQkJLyogQXNzdW1lIG9uZS1ieXRlIGJhZCBvcGNvZGUgKi8KLQotCQkJCXBhcnNlcl9zdGF0ZS0+YW1sKys7Ci0JCQkJY29udGludWU7Ci0KLQkJCWRlZmF1bHQ6Ci0KLQkJCQkvKiBGb3VuZCBvcGNvZGUgaW5mbywgdGhpcyBpcyBhIG5vcm1hbCBvcGNvZGUgKi8KLQotCQkJCXBhcnNlcl9zdGF0ZS0+YW1sICs9Ci0JCQkJICAgIGFjcGlfcHNfZ2V0X29wY29kZV9zaXplKHdhbGtfc3RhdGUtPm9wY29kZSk7Ci0JCQkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0KLQkJCQkgICAgd2Fsa19zdGF0ZS0+b3BfaW5mby0+cGFyc2VfYXJnczsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogQ3JlYXRlIE9wIHN0cnVjdHVyZSBhbmQgYXBwZW5kIHRvIHBhcmVudCdzIGFyZ3VtZW50IGxpc3QgKi8KLQotCQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7Ci0KLQkJCQkvKiBBbGxvY2F0ZSBhIG5ldyBwcmVfb3AgaWYgbmVjZXNzYXJ5ICovCi0KLQkJCQlpZiAoIXByZV9vcCkgewotCQkJCQlwcmVfb3AgPQotCQkJCQkgICAgYWNwaV9wc19hbGxvY19vcCh3YWxrX3N0YXRlLT4KLQkJCQkJCQkgICAgIG9wY29kZSk7Ci0JCQkJCWlmICghcHJlX29wKSB7Ci0JCQkJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwcmVfb3AtPmNvbW1vbi52YWx1ZS5hcmcgPSBOVUxMOwotCQkJCXByZV9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgPSB3YWxrX3N0YXRlLT5vcGNvZGU7Ci0KLQkJCQkvKgotCQkJCSAqIEdldCBhbmQgYXBwZW5kIGFyZ3VtZW50cyB1bnRpbCB3ZSBmaW5kIHRoZSBub2RlIHRoYXQgY29udGFpbnMKLQkJCQkgKiB0aGUgbmFtZSAodGhlIHR5cGUgQVJHUF9OQU1FKS4KLQkJCQkgKi8KLQkJCQl3aGlsZSAoR0VUX0NVUlJFTlRfQVJHX1RZUEUKLQkJCQkgICAgICAgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykKLQkJCQkgICAgICAgJiYKLQkJCQkgICAgICAgKEdFVF9DVVJSRU5UX0FSR19UWVBFCi0JCQkJCSh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpICE9IEFSR1BfTkFNRSkpIHsKLQkJCQkJc3RhdHVzID0KLQkJCQkJICAgIGFjcGlfcHNfZ2V0X25leHRfYXJnKHdhbGtfc3RhdGUsCi0JCQkJCQkJCSBwYXJzZXJfc3RhdGUsCi0JCQkJCQkJCSBHRVRfQ1VSUkVOVF9BUkdfVFlQRQotCQkJCQkJCQkgKHdhbGtfc3RhdGUtPgotCQkJCQkJCQkgIGFyZ190eXBlcyksCi0JCQkJCQkJCSAmYXJnKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJCX0KLQotCQkJCQlhY3BpX3BzX2FwcGVuZF9hcmcocHJlX29wLCBhcmcpOwotCQkJCQlJTkNSRU1FTlRfQVJHX0xJU1Qod2Fsa19zdGF0ZS0+Ci0JCQkJCQkJICAgYXJnX3R5cGVzKTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGZvdW5kIGEgTkFNRSBhbmQgZGlkbid0IHJ1biBvdXQgb2YKLQkJCQkgKiBhcmd1bWVudHMKLQkJCQkgKi8KLQkJCQlpZiAoIUdFVF9DVVJSRU5UX0FSR19UWVBFCi0JCQkJICAgICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpKSB7Ci0JCQkJCXN0YXR1cyA9IEFFX0FNTF9OT19PUEVSQU5EOwotCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJfQotCi0JCQkJLyogV2Uga25vdyB0aGF0IHRoaXMgYXJnIGlzIGEgbmFtZSwgbW92ZSB0byBuZXh0IGFyZyAqLwotCi0JCQkJSU5DUkVNRU5UX0FSR19MSVNUKHdhbGtfc3RhdGUtPmFyZ190eXBlcyk7Ci0KLQkJCQkvKgotCQkJCSAqIEZpbmQgdGhlIG9iamVjdC4gIFRoaXMgd2lsbCBlaXRoZXIgaW5zZXJ0IHRoZSBvYmplY3QgaW50bwotCQkJCSAqIHRoZSBuYW1lc3BhY2Ugb3Igc2ltcGx5IGxvb2sgaXQgdXAKLQkJCQkgKi8KLQkJCQl3YWxrX3N0YXRlLT5vcCA9IE5VTEw7Ci0KLQkJCQlzdGF0dXMgPQotCQkJCSAgICB3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUsCi0JCQkJCQkJCSAgICAmb3ApOwotCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCQkJCSJEdXJpbmcgbmFtZSBsb29rdXAvY2F0YWxvZyIpKTsKLQkJCQkJZ290byBjbG9zZV90aGlzX29wOwotCQkJCX0KLQotCQkJCWlmICghb3ApIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9wc19jcmVhdGVfb3Aod2Fsa19zdGF0ZSwgYW1sX29wX3N0YXJ0LCAmb3ApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BBUlNFX0NPTlRJTlVFKSB7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCBvcCwKLQkJCQkJCQkgICAgIHN0YXR1cyk7Ci0JCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKKwkJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUEFSU0VfUEVORElORykgewogCQkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCQkJZ290byBjbG9zZV90aGlzX29wOwogCQkJCX0KIAorCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfb3Aod2Fsa19zdGF0ZSwgJm9wLAorCQkJCQkJCXN0YXR1cyk7CiAJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQkJfQogCi0JCQkJYWNwaV9wc19hcHBlbmRfYXJnKG9wLAotCQkJCQkJICAgcHJlX29wLT5jb21tb24udmFsdWUuYXJnKTsKLQkJCQlhY3BpX2dibF9kZXB0aCsrOwotCi0JCQkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfUkVHSU9OX09QKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIERlZmVyIGZpbmFsIHBhcnNpbmcgb2YgYW4gb3BlcmF0aW9uX3JlZ2lvbiBib2R5LAotCQkJCQkgKiBiZWNhdXNlIHdlIGRvbid0IGhhdmUgZW5vdWdoIGluZm8gaW4gdGhlIGZpcnN0IHBhc3MKLQkJCQkJICogdG8gcGFyc2UgaXQgY29ycmVjdGx5IChpLmUuLCB0aGVyZSBtYXkgYmUgbWV0aG9kCi0JCQkJCSAqIGNhbGxzIHdpdGhpbiB0aGUgdGVybV9hcmcgZWxlbWVudHMgb2YgdGhlIGJvZHkuKQotCQkJCQkgKgotCQkJCQkgKiBIb3dldmVyLCB3ZSBtdXN0IGNvbnRpbnVlIHBhcnNpbmcgYmVjYXVzZQotCQkJCQkgKiB0aGUgb3ByZWdpb24gaXMgbm90IGEgc3RhbmRhbG9uZSBwYWNrYWdlIC0tCi0JCQkJCSAqIHdlIGRvbid0IGtub3cgd2hlcmUgdGhlIGVuZCBpcyBhdCB0aGlzIHBvaW50LgotCQkJCQkgKgotCQkJCQkgKiAoTGVuZ3RoIGlzIHVua25vd24gdW50aWwgcGFyc2Ugb2YgdGhlIGJvZHkgY29tcGxldGUpCi0JCQkJCSAqLwotCQkJCQlvcC0+bmFtZWQuZGF0YSA9IGFtbF9vcF9zdGFydDsKLQkJCQkJb3AtPm5hbWVkLmxlbmd0aCA9IDA7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvKiBOb3QgYSBuYW1lZCBvcGNvZGUsIGp1c3QgYWxsb2NhdGUgT3AgYW5kIGFwcGVuZCB0byBwYXJlbnQgKi8KLQotCQkJCXdhbGtfc3RhdGUtPm9wX2luZm8gPQotCQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyh3YWxrX3N0YXRlLT5vcGNvZGUpOwotCQkJCW9wID0gYWNwaV9wc19hbGxvY19vcCh3YWxrX3N0YXRlLT5vcGNvZGUpOwotCQkJCWlmICghb3ApIHsKLQkJCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQkJCQlnb3RvIGNsb3NlX3RoaXNfb3A7Ci0JCQkJfQotCi0JCQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0NSRUFURSkgewotCQkJCQkvKgotCQkJCQkgKiBCYWNrdXAgdG8gYmVnaW5uaW5nIG9mIGNyZWF0ZV94WFhmaWVsZCBkZWNsYXJhdGlvbgotCQkJCQkgKiBib2R5X2xlbmd0aCBpcyB1bmtub3duIHVudGlsIHdlIHBhcnNlIHRoZSBib2R5Ci0JCQkJCSAqLwotCQkJCQlvcC0+bmFtZWQuZGF0YSA9IGFtbF9vcF9zdGFydDsKLQkJCQkJb3AtPm5hbWVkLmxlbmd0aCA9IDA7Ci0JCQkJfQotCi0JCQkJYWNwaV9wc19hcHBlbmRfYXJnKGFjcGlfcHNfZ2V0X3BhcmVudF9zY29wZQotCQkJCQkJICAgKHBhcnNlcl9zdGF0ZSksIG9wKTsKLQotCQkJCWlmICgod2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayAhPSBOVUxMKSkgewotCQkJCQkvKgotCQkJCQkgKiBGaW5kIHRoZSBvYmplY3QuIFRoaXMgd2lsbCBlaXRoZXIgaW5zZXJ0IHRoZSBvYmplY3QgaW50bwotCQkJCQkgKiB0aGUgbmFtZXNwYWNlIG9yIHNpbXBseSBsb29rIGl0IHVwCi0JCQkJCSAqLwotCQkJCQl3YWxrX3N0YXRlLT5vcCA9IG9wOwotCi0JCQkJCXN0YXR1cyA9Ci0JCQkJCSAgICB3YWxrX3N0YXRlLT4KLQkJCQkJICAgIGRlc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSwKLQkJCQkJCQkJJm9wKTsKLQkJCQkJc3RhdHVzID0KLQkJCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLAotCQkJCQkJCQkgICAgIG9wLAotCQkJCQkJCQkgICAgIHN0YXR1cyk7Ci0JCQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7Ci0JCQkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQkJfQotCi0JCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCQkJZ290byBjbG9zZV90aGlzX29wOwotCQkJCQl9Ci0JCQkJfQorCQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQlvcC0+Y29tbW9uLmFtbF9vZmZzZXQgPSB3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0OwpAQCAtMzk1LDE3MiArOTU1LDE3IEBACiAKIAkJCS8qIEdldCBhcmd1bWVudHMgKi8KIAotCQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKLQkJCWNhc2UgQU1MX0JZVEVfT1A6CS8qIEFNTF9CWVRFREFUQV9BUkcgKi8KLQkJCWNhc2UgQU1MX1dPUkRfT1A6CS8qIEFNTF9XT1JEREFUQV9BUkcgKi8KLQkJCWNhc2UgQU1MX0RXT1JEX09QOgkvKiBBTUxfRFdPUkRBVEFfQVJHICovCi0JCQljYXNlIEFNTF9RV09SRF9PUDoJLyogQU1MX1FXT1JEQVRBX0FSRyAqLwotCQkJY2FzZSBBTUxfU1RSSU5HX09QOgkvKiBBTUxfQVNDSUlDSEFSTElTVF9BUkcgKi8KLQotCQkJCS8qIEZpbGwgaW4gY29uc3RhbnQgb3Igc3RyaW5nIGFyZ3VtZW50IGRpcmVjdGx5ICovCi0KLQkJCQlhY3BpX3BzX2dldF9uZXh0X3NpbXBsZV9hcmcocGFyc2VyX3N0YXRlLAotCQkJCQkJCSAgICBHRVRfQ1VSUkVOVF9BUkdfVFlQRQotCQkJCQkJCSAgICAod2Fsa19zdGF0ZS0+Ci0JCQkJCQkJICAgICBhcmdfdHlwZXMpLCBvcCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQU1MX0lOVF9OQU1FUEFUSF9PUDoJLyogQU1MX05BTUVTVFJJTkdfQVJHICovCi0KKwkJCXN0YXR1cyA9CisJCQkgICAgYWNwaV9wc19nZXRfYXJndW1lbnRzKHdhbGtfc3RhdGUsIGFtbF9vcF9zdGFydCwgb3ApOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9wc19nZXRfbmV4dF9uYW1lcGF0aCh3YWxrX3N0YXRlLAotCQkJCQkJCSAgICAgIHBhcnNlcl9zdGF0ZSwgb3AsCi0JCQkJCQkJICAgICAgMSk7CisJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfb3Aod2Fsa19zdGF0ZSwgJm9wLAorCQkJCQkJCXN0YXR1cyk7CiAJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKKwkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJCQkJfQogCi0JCQkJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gMDsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQkvKgotCQkJCSAqIE9wIGlzIG5vdCBhIGNvbnN0YW50IG9yIHN0cmluZywgYXBwZW5kIGVhY2ggYXJndW1lbnQKLQkJCQkgKiB0byB0aGUgT3AKLQkJCQkgKi8KLQkJCQl3aGlsZSAoR0VUX0NVUlJFTlRfQVJHX1RZUEUKLQkJCQkgICAgICAgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykKLQkJCQkgICAgICAgJiYgIXdhbGtfc3RhdGUtPmFyZ19jb3VudCkgewotCQkJCQl3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0ID0gKHUzMikKLQkJCQkJICAgIEFDUElfUFRSX0RJRkYocGFyc2VyX3N0YXRlLT5hbWwsCi0JCQkJCQkJICBwYXJzZXJfc3RhdGUtPgotCQkJCQkJCSAgYW1sX3N0YXJ0KTsKLQotCQkJCQlzdGF0dXMgPQotCQkJCQkgICAgYWNwaV9wc19nZXRfbmV4dF9hcmcod2Fsa19zdGF0ZSwKLQkJCQkJCQkJIHBhcnNlcl9zdGF0ZSwKLQkJCQkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFCi0JCQkJCQkJCSAod2Fsa19zdGF0ZS0+Ci0JCQkJCQkJCSAgYXJnX3R5cGVzKSwKLQkJCQkJCQkJICZhcmcpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQkJfQotCi0JCQkJCWlmIChhcmcpIHsKLQkJCQkJCWFyZy0+Y29tbW9uLmFtbF9vZmZzZXQgPQotCQkJCQkJICAgIHdhbGtfc3RhdGUtPmFtbF9vZmZzZXQ7Ci0JCQkJCQlhY3BpX3BzX2FwcGVuZF9hcmcob3AsIGFyZyk7Ci0JCQkJCX0KLQkJCQkJSU5DUkVNRU5UX0FSR19MSVNUKHdhbGtfc3RhdGUtPgotCQkJCQkJCSAgIGFyZ190eXBlcyk7Ci0JCQkJfQotCi0JCQkJLyogU3BlY2lhbCBwcm9jZXNzaW5nIGZvciBjZXJ0YWluIG9wY29kZXMgKi8KLQotCQkJCS8qIFRCRCAocmVtb3ZlKTogVGVtcG9yYXJ5IG1lY2hhbmlzbSB0byBkaXNhYmxlIHRoaXMgY29kZSBpZiBuZWVkZWQgKi8KLQotI2lmZGVmIEFDUElfRU5BQkxFX01PRFVMRV9MRVZFTF9DT0RFCi0KLQkJCQlpZiAoKHdhbGtfc3RhdGUtPnBhc3NfbnVtYmVyIDw9Ci0JCQkJICAgICBBQ1BJX0lNT0RFX0xPQURfUEFTUzEpCi0JCQkJICAgICYmCi0JCQkJICAgICgod2Fsa19zdGF0ZS0+Ci0JCQkJICAgICAgcGFyc2VfZmxhZ3MgJiBBQ1BJX1BBUlNFX0RJU0FTU0VNQkxFKSA9PQotCQkJCSAgICAgMCkpIHsKLQkJCQkJLyoKLQkJCQkJICogV2Ugd2FudCB0byBza2lwIElmL0Vsc2UvV2hpbGUgY29uc3RydWN0cyBkdXJpbmcgUGFzczEKLQkJCQkJICogYmVjYXVzZSB3ZSB3YW50IHRvIGFjdHVhbGx5IGNvbmRpdGlvbmFsbHkgZXhlY3V0ZSB0aGUKLQkJCQkJICogY29kZSBkdXJpbmcgUGFzczIuCi0JCQkJCSAqCi0JCQkJCSAqIEV4Y2VwdCBmb3IgZGlzYXNzZW1ibHksIHdoZXJlIHdlIGFsd2F5cyB3YW50IHRvCi0JCQkJCSAqIHdhbGsgdGhlIElmL0Vsc2UvV2hpbGUgcGFja2FnZXMKLQkJCQkJICovCi0JCQkJCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7Ci0JCQkJCWNhc2UgQU1MX0lGX09QOgotCQkJCQljYXNlIEFNTF9FTFNFX09QOgotCQkJCQljYXNlIEFNTF9XSElMRV9PUDoKLQotCQkJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKLQkJCQkJCQkJICAiUGFzczE6IFNraXBwaW5nIGFuIElmL0Vsc2UvV2hpbGUgYm9keVxuIikpOwotCi0JCQkJCQkvKiBTa2lwIGJvZHkgb2YgaWYvZWxzZS93aGlsZSBpbiBwYXNzIDEgKi8KLQotCQkJCQkJcGFyc2VyX3N0YXRlLT5hbWwgPQotCQkJCQkJICAgIHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKLQkJCQkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7Ci0JCQkJCQlicmVhazsKLQotCQkJCQlkZWZhdWx0OgotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0jZW5kaWYKLQkJCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewotCQkJCWNhc2UgQU1MX01FVEhPRF9PUDoKLQotCQkJCQkvKgotCQkJCQkgKiBTa2lwIHBhcnNpbmcgb2YgY29udHJvbCBtZXRob2QKLQkJCQkJICogYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvIGluIHRoZSBmaXJzdCBwYXNzCi0JCQkJCSAqIHRvIHBhcnNlIGl0IGNvcnJlY3RseS4KLQkJCQkJICoKLQkJCQkJICogU2F2ZSB0aGUgbGVuZ3RoIGFuZCBhZGRyZXNzIG9mIHRoZSBib2R5Ci0JCQkJCSAqLwotCQkJCQlvcC0+bmFtZWQuZGF0YSA9IHBhcnNlcl9zdGF0ZS0+YW1sOwotCQkJCQlvcC0+bmFtZWQubGVuZ3RoID0KLQkJCQkJICAgICh1MzIpIChwYXJzZXJfc3RhdGUtPnBrZ19lbmQgLQotCQkJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWwpOwotCi0JCQkJCS8qIFNraXAgYm9keSBvZiBtZXRob2QgKi8KLQotCQkJCQlwYXJzZXJfc3RhdGUtPmFtbCA9Ci0JCQkJCSAgICBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7Ci0JCQkJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBTUxfQlVGRkVSX09QOgotCQkJCWNhc2UgQU1MX1BBQ0tBR0VfT1A6Ci0JCQkJY2FzZSBBTUxfVkFSX1BBQ0tBR0VfT1A6Ci0KLQkJCQkJaWYgKChvcC0+Y29tbW9uLnBhcmVudCkgJiYKLQkJCQkJICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLgotCQkJCQkgICAgIGFtbF9vcGNvZGUgPT0gQU1MX05BTUVfT1ApCi0JCQkJCSAgICAmJiAod2Fsa19zdGF0ZS0+cGFzc19udW1iZXIgPD0KLQkJCQkJCUFDUElfSU1PREVfTE9BRF9QQVNTMikpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBTa2lwIHBhcnNpbmcgb2YgQnVmZmVycyBhbmQgUGFja2FnZXMKLQkJCQkJCSAqIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mbyBpbiB0aGUgZmlyc3QgcGFzcwotCQkJCQkJICogdG8gcGFyc2UgdGhlbSBjb3JyZWN0bHkuCi0JCQkJCQkgKi8KLQkJCQkJCW9wLT5uYW1lZC5kYXRhID0gYW1sX29wX3N0YXJ0OwotCQkJCQkJb3AtPm5hbWVkLmxlbmd0aCA9Ci0JCQkJCQkgICAgKHUzMikgKHBhcnNlcl9zdGF0ZS0+Ci0JCQkJCQkJICAgcGtnX2VuZCAtCi0JCQkJCQkJICAgYW1sX29wX3N0YXJ0KTsKLQotCQkJCQkJLyogU2tpcCBib2R5ICovCi0KLQkJCQkJCXBhcnNlcl9zdGF0ZS0+YW1sID0KLQkJCQkJCSAgICBwYXJzZXJfc3RhdGUtPnBrZ19lbmQ7Ci0JCQkJCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAwOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBTUxfV0hJTEVfT1A6Ci0KLQkJCQkJaWYgKHdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpIHsKLQkJCQkJCXdhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUtPgotCQkJCQkJICAgIGNvbnRyb2wucGFja2FnZV9lbmQgPQotCQkJCQkJICAgIHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0KLQkJCQkJLyogTm8gYWN0aW9uIGZvciBhbGwgb3RoZXIgb3Bjb2RlcyAqLwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7CisJCQkJY29udGludWU7CiAJCQl9CiAJCX0KIApAQCAtNTc1LDggKzk4MCwxNiBAQAogCQkJCQkJICAgIHdhbGtfc3RhdGUtPmFyZ190eXBlcywKIAkJCQkJCSAgICB3YWxrX3N0YXRlLT5hcmdfY291bnQpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJZ290byBjbG9zZV90aGlzX29wOworCQkJCXN0YXR1cyA9CisJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfb3Aod2Fsa19zdGF0ZSwgJm9wLAorCQkJCQkJCXN0YXR1cyk7CisJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJCX0KKworCQkJCWNvbnRpbnVlOwogCQkJfQorCiAJCQlvcCA9IE5VTEw7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtNjI4LDI2OSArMTA0MSwxNiBAQAogCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCBvcCwgc3RhdHVzKTsKIAkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9QRU5ESU5HKSB7CiAJCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQkJZ290byBjbG9zZV90aGlzX29wOwogCQkJfQogCQl9CiAKLQkgICAgICBjbG9zZV90aGlzX29wOgotCQkvKgotCQkgKiBGaW5pc2hlZCBvbmUgYXJndW1lbnQgb2YgdGhlIGNvbnRhaW5pbmcgc2NvcGUKLQkJICovCi0JCXBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudC0tOwotCi0JCS8qIEZpbmlzaGVkIHdpdGggcHJlX29wICovCi0KLQkJaWYgKHByZV9vcCkgewotCQkJYWNwaV9wc19mcmVlX29wKHByZV9vcCk7Ci0JCQlwcmVfb3AgPSBOVUxMOwotCQl9Ci0KLQkJLyogQ2xvc2UgdGhpcyBPcCAod2lsbCByZXN1bHQgaW4gcGFyc2Ugc3VidHJlZSBkZWxldGlvbikgKi8KLQotCQlzdGF0dXMyID0gYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsIG9wKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwotCQl9Ci0JCW9wID0gTlVMTDsKLQotCQlzd2l0Y2ggKHN0YXR1cykgewotCQljYXNlIEFFX09LOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBRV9DVFJMX1RSQU5TRkVSOgotCi0JCQkvKiBXZSBhcmUgYWJvdXQgdG8gdHJhbnNmZXIgdG8gYSBjYWxsZWQgbWV0aG9kLiAqLwotCi0JCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gb3A7Ci0JCQl3YWxrX3N0YXRlLT5wcmV2X2FyZ190eXBlcyA9IHdhbGtfc3RhdGUtPmFyZ190eXBlczsKKwkJc3RhdHVzID0gYWNwaV9wc19jb21wbGV0ZV9vcCh3YWxrX3N0YXRlLCAmb3AsIHN0YXR1cyk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0KLQkJY2FzZSBBRV9DVFJMX0VORDoKLQotCQkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLCAmb3AsCi0JCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKLQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKLQotCQkJaWYgKG9wKSB7Ci0JCQkJd2Fsa19zdGF0ZS0+b3AgPSBvcDsKLQkJCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0KLQkJCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi4KLQkJCQkJCQkgICAgYW1sX29wY29kZSk7Ci0JCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gb3AtPmNvbW1vbi5hbWxfb3Bjb2RlOwotCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUpOwotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCBvcCwKLQkJCQkJCQkgICAgIHN0YXR1cyk7Ci0KLQkJCQlzdGF0dXMyID0KLQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsIG9wKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7Ci0JCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKLQkJCQl9Ci0JCQkJb3AgPSBOVUxMOwotCQkJfQotCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQlicmVhazsKLQotCQljYXNlIEFFX0NUUkxfQlJFQUs6Ci0JCWNhc2UgQUVfQ1RSTF9DT05USU5VRToKLQotCQkJLyogUG9wIG9mZiBzY29wZXMgdW50aWwgd2UgZmluZCB0aGUgV2hpbGUgKi8KLQotCQkJd2hpbGUgKCFvcCB8fCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9XSElMRV9PUCkpIHsKLQkJCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsICZvcCwKLQkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKLQkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0KLQkJCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9XSElMRV9PUCkgewotCQkJCQlzdGF0dXMyID0KLQkJCQkJICAgIGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcAotCQkJCQkgICAgKHdhbGtfc3RhdGUpOwotCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7Ci0JCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIENsb3NlIHRoaXMgaXRlcmF0aW9uIG9mIHRoZSBXaGlsZSBsb29wICovCi0KLQkJCXdhbGtfc3RhdGUtPm9wID0gb3A7Ci0JCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0KLQkJCSAgICBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwotCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gb3AtPmNvbW1vbi5hbWxfb3Bjb2RlOwotCi0JCQlzdGF0dXMgPSB3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sod2Fsa19zdGF0ZSk7Ci0JCQlzdGF0dXMgPQotCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCBvcCwgc3RhdHVzKTsKLQotCQkJc3RhdHVzMiA9IGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLCBvcCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwotCQkJfQotCQkJb3AgPSBOVUxMOwotCi0JCQlzdGF0dXMgPSBBRV9PSzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQUVfQ1RSTF9URVJNSU5BVEU6Ci0KLQkJCXN0YXR1cyA9IEFFX09LOwotCi0JCQkvKiBDbGVhbiB1cCAqLwotCQkJZG8gewotCQkJCWlmIChvcCkgewotCQkJCQlzdGF0dXMyID0KLQkJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLAotCQkJCQkJCQkgICAgIG9wKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgewotCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwotCQkJCQl9Ci0KLQkJCQkJc3RhdHVzMiA9Ci0JCQkJCSAgICBhY3BpX2RzX3Jlc3VsdF9zdGFja19wb3AKLQkJCQkJICAgICh3YWxrX3N0YXRlKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgewotCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwotCQkJCQl9Ci0KLQkJCQkJYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZQotCQkJCQkgICAgKGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUKLQkJCQkJICAgICAoJndhbGtfc3RhdGUtPmNvbnRyb2xfc3RhdGUpKTsKLQkJCQl9Ci0KLQkJCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsICZvcCwKLQkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ190eXBlcywKLQkJCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0KLQkJCX0gd2hpbGUgKG9wKTsKLQotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0KLQkJZGVmYXVsdDoJLyogQWxsIG90aGVyIG5vbi1BRV9PSyBzdGF0dXMgKi8KLQotCQkJZG8gewotCQkJCWlmIChvcCkgewotCQkJCQlzdGF0dXMyID0KLQkJCQkJICAgIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCh3YWxrX3N0YXRlLAotCQkJCQkJCQkgICAgIG9wKTsKLQkJCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgewotCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLCAmb3AsCi0JCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCi0JCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwotCi0JCQl9IHdoaWxlIChvcCk7Ci0KLQkJCS8qCi0JCQkgKiBUQkQ6IENsZWFudXAgcGFyc2Ugb3BzIG9uIGVycm9yCi0JCQkgKi8KLSNpZiAwCi0JCQlpZiAob3AgPT0gTlVMTCkgewotCQkJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgJm9wLAotCQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAotCQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKLQkJCX0KLSNlbmRpZgotCQkJd2Fsa19zdGF0ZS0+cHJldl9vcCA9IG9wOwotCQkJd2Fsa19zdGF0ZS0+cHJldl9hcmdfdHlwZXMgPSB3YWxrX3N0YXRlLT5hcmdfdHlwZXM7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCi0JCS8qIFRoaXMgc2NvcGUgY29tcGxldGU/ICovCi0KLQkJaWYgKGFjcGlfcHNfaGFzX2NvbXBsZXRlZF9zY29wZShwYXJzZXJfc3RhdGUpKSB7Ci0JCQlhY3BpX3BzX3BvcF9zY29wZShwYXJzZXJfc3RhdGUsICZvcCwKLQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAotCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKLQkJCQkJICAiUG9wcGVkIHNjb3BlLCBPcD0lcFxuIiwgb3ApKTsKLQkJfSBlbHNlIHsKLQkJCW9wID0gTlVMTDsKIAkJfQogCiAJfQkJCS8qIHdoaWxlIHBhcnNlcl9zdGF0ZS0+QW1sICovCiAKLQkvKgotCSAqIENvbXBsZXRlIHRoZSBsYXN0IE9wIChpZiBub3QgY29tcGxldGVkKSwgYW5kIGNsZWFyIHRoZSBzY29wZSBzdGFjay4KLQkgKiBJdCBpcyBlYXNpbHkgcG9zc2libGUgdG8gZW5kIGFuIEFNTCAicGFja2FnZSIgd2l0aCBhbiB1bmJvdW5kZWQgbnVtYmVyCi0JICogb2Ygb3BlbiBzY29wZXMgKHN1Y2ggYXMgd2hlbiBzZXZlcmFsIEFTTCBibG9ja3MgYXJlIGNsb3NlZCB3aXRoCi0JICogc2VxdWVudGlhbCBjbG9zaW5nIGJyYWNlcykuICBXZSB3YW50IHRvIHRlcm1pbmF0ZSBlYWNoIG9uZSBjbGVhbmx5LgotCSAqLwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICJBTUwgcGFja2FnZSBjb21wbGV0ZSBhdCBPcCAlcFxuIiwKLQkJCSAgb3ApKTsKLQlkbyB7Ci0JCWlmIChvcCkgewotCQkJaWYgKHdhbGtfc3RhdGUtPmFzY2VuZGluZ19jYWxsYmFjayAhPSBOVUxMKSB7Ci0JCQkJd2Fsa19zdGF0ZS0+b3AgPSBvcDsKLQkJCQl3YWxrX3N0YXRlLT5vcF9pbmZvID0KLQkJCQkgICAgYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3AtPmNvbW1vbi4KLQkJCQkJCQkgICAgYW1sX29wY29kZSk7Ci0JCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlID0gb3AtPmNvbW1vbi5hbWxfb3Bjb2RlOwotCi0JCQkJc3RhdHVzID0KLQkJCQkgICAgd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrKHdhbGtfc3RhdGUpOwotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSh3YWxrX3N0YXRlLCBvcCwKLQkJCQkJCQkgICAgIHN0YXR1cyk7Ci0JCQkJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1BFTkRJTkcpIHsKLQkJCQkJc3RhdHVzID0gQUVfT0s7Ci0JCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKLQkJCQl9Ci0KLQkJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfVEVSTUlOQVRFKSB7Ci0JCQkJCXN0YXR1cyA9IEFFX09LOwotCi0JCQkJCS8qIENsZWFuIHVwICovCi0JCQkJCWRvIHsKLQkJCQkJCWlmIChvcCkgewotCQkJCQkJCXN0YXR1czIgPQotCQkJCQkJCSAgICBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3AKLQkJCQkJCQkgICAgKHdhbGtfc3RhdGUsIG9wKTsKLQkJCQkJCQlpZiAoQUNQSV9GQUlMVVJFCi0JCQkJCQkJICAgIChzdGF0dXMyKSkgewotCQkJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMKLQkJCQkJCQkJICAgIChzdGF0dXMyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwKLQkJCQkJCQkJICAmb3AsCi0JCQkJCQkJCSAgJndhbGtfc3RhdGUtPgotCQkJCQkJCQkgIGFyZ190eXBlcywKLQkJCQkJCQkJICAmd2Fsa19zdGF0ZS0+Ci0JCQkJCQkJCSAgYXJnX2NvdW50KTsKLQotCQkJCQl9IHdoaWxlIChvcCk7Ci0KLQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQkJfQotCi0JCQkJZWxzZSBpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQotCQkJCQkvKiBGaXJzdCBlcnJvciBpcyBtb3N0IGltcG9ydGFudCAqLwotCi0JCQkJCSh2b2lkKQotCQkJCQkgICAgYWNwaV9wc19jb21wbGV0ZV90aGlzX29wKHdhbGtfc3RhdGUsCi0JCQkJCQkJCSAgICAgb3ApOwotCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXN0YXR1czIgPSBhY3BpX3BzX2NvbXBsZXRlX3RoaXNfb3Aod2Fsa19zdGF0ZSwgb3ApOwotCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKLQkJCX0KLQkJfQotCi0JCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgJm9wLCAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAotCQkJCSAgJndhbGtfc3RhdGUtPmFyZ19jb3VudCk7Ci0KLQl9IHdoaWxlIChvcCk7Ci0KKwlzdGF0dXMgPSBhY3BpX3BzX2NvbXBsZXRlX2ZpbmFsX29wKHdhbGtfc3RhdGUsIG9wLCBzdGF0dXMpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jCmluZGV4IDRiZDI1ZTMuLjE2ZDhiNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNvcGNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNwYXJzZS5jCmluZGV4IGEwMmFhNjIuLjVkNjNmNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNwYXJzZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNwYXJzZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNTQwLDYgKzU0MCwxMSBAQAogCiAJCQlpZiAoKHN0YXR1cyA9PSBBRV9BTFJFQURZX0VYSVNUUykgJiYKIAkJCSAgICAoIXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QubXV0ZXgpKSB7CisJCQkJQUNQSV9JTkZPKChBRV9JTkZPLAorCQkJCQkgICAiTWFya2luZyBtZXRob2QgJTQuNHMgYXMgU2VyaWFsaXplZCIsCisJCQkJCSAgIHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlLT5uYW1lLgorCQkJCQkgICBhc2NpaSkpOworCiAJCQkJLyoKIAkJCQkgKiBNZXRob2QgdHJpZWQgdG8gY3JlYXRlIGFuIG9iamVjdCB0d2ljZS4gVGhlIHByb2JhYmxlIGNhdXNlIGlzCiAJCQkJICogdGhhdCB0aGUgbWV0aG9kIGNhbm5vdCBoYW5kbGUgcmVlbnRyYW5jeS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNzY29wZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3Njb3BlLmMKaW5kZXggYTNlMDMxNGQuLjc3Y2ZhNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNzY29wZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNzY29wZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMKaW5kZXggMDAxNTcxNy4uOTY2ZTdlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdHJlZS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdXRpbHMuYwppbmRleCBkNDA1Mzg3Li44Y2E1MjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdXRpbHMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzd2Fsay5jCmluZGV4IGE4NGE1NDcuLjQ5Zjk3NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKaW5kZXggNWQ5OTZjMS4uOTQxMDNiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3hmYWNlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01NCw4ICs1NCw2IEBACiAKIHN0YXRpYyB2b2lkIGFjcGlfcHNfc3RvcF90cmFjZShzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKTsKIAotc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfcHNfZXhlY3V0ZV9wYXNzKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8pOwotCiBzdGF0aWMgdm9pZAogYWNwaV9wc191cGRhdGVfcGFyYW1ldGVyX2xpc3Qoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbywgdTE2IGFjdGlvbik7CiAKQEAgLTIxNSw2ICsyMTMsOCBAQAogYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX21ldGhvZChzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfZXhlY3V0ZV9tZXRob2QpOwogCkBAIC0yMzQsOCArMjM0LDcgQEAKIAl9CiAKIAkvKgotCSAqIFRoZSBjYWxsZXIgIm93bnMiIHRoZSBwYXJhbWV0ZXJzLCBzbyBnaXZlIGVhY2ggb25lIGFuIGV4dHJhCi0JICogcmVmZXJlbmNlCisJICogVGhlIGNhbGxlciAib3ducyIgdGhlIHBhcmFtZXRlcnMsIHNvIGdpdmUgZWFjaCBvbmUgYW4gZXh0cmEgcmVmZXJlbmNlCiAJICovCiAJYWNwaV9wc191cGRhdGVfcGFyYW1ldGVyX2xpc3QoaW5mbywgUkVGX0lOQ1JFTUVOVCk7CiAKQEAgLTI0NCwzMCArMjQzLDUwIEBACiAJYWNwaV9wc19zdGFydF90cmFjZShpbmZvKTsKIAogCS8qCi0JICogMSkgUGVyZm9ybSB0aGUgZmlyc3QgcGFzcyBwYXJzZSBvZiB0aGUgbWV0aG9kIHRvIGVudGVyIGFueQotCSAqICAgIG5hbWVkIG9iamVjdHMgdGhhdCBpdCBjcmVhdGVzIGludG8gdGhlIG5hbWVzcGFjZQorCSAqIEV4ZWN1dGUgdGhlIG1ldGhvZC4gUGVyZm9ybXMgcGFyc2Ugc2ltdWx0YW5lb3VzbHkKIAkgKi8KIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJICAiKioqKiBCZWdpbiBNZXRob2QgUGFyc2UgKioqKiBFbnRyeT0lcCBvYmo9JXBcbiIsCi0JCQkgIGluZm8tPnJlc29sdmVkX25vZGUsIGluZm8tPm9ial9kZXNjKSk7CisJCQkgICIqKioqIEJlZ2luIE1ldGhvZCBQYXJzZS9FeGVjdXRlIFslNC40c10gKioqKiBOb2RlPSVwIE9iaj0lcFxuIiwKKwkJCSAgaW5mby0+cmVzb2x2ZWRfbm9kZS0+bmFtZS5hc2NpaSwgaW5mby0+cmVzb2x2ZWRfbm9kZSwKKwkJCSAgaW5mby0+b2JqX2Rlc2MpKTsKIAotCWluZm8tPnBhc3NfbnVtYmVyID0gMTsKLQlzdGF0dXMgPSBhY3BpX3BzX2V4ZWN1dGVfcGFzcyhpbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkvKiBDcmVhdGUgYW5kIGluaXQgYSBSb290IE5vZGUgKi8KKworCW9wID0gYWNwaV9wc19jcmVhdGVfc2NvcGVfb3AoKTsKKwlpZiAoIW9wKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCS8qCi0JICogMikgRXhlY3V0ZSB0aGUgbWV0aG9kLiBQZXJmb3JtcyBzZWNvbmQgcGFzcyBwYXJzZSBzaW11bHRhbmVvdXNseQotCSAqLwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCi0JCQkgICIqKioqIEJlZ2luIE1ldGhvZCBFeGVjdXRpb24gKioqKiBFbnRyeT0lcCBvYmo9JXBcbiIsCi0JCQkgIGluZm8tPnJlc29sdmVkX25vZGUsIGluZm8tPm9ial9kZXNjKSk7CisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUgKi8KIAotCWluZm8tPnBhc3NfbnVtYmVyID0gMzsKLQlzdGF0dXMgPSBhY3BpX3BzX2V4ZWN1dGVfcGFzcyhpbmZvKTsKKwlpbmZvLT5wYXNzX251bWJlciA9IEFDUElfSU1PREVfRVhFQ1VURTsKKwl3YWxrX3N0YXRlID0KKwkgICAgYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLCBOVUxMLAorCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCWlmICghd2Fsa19zdGF0ZSkgeworCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIGluZm8tPnJlc29sdmVkX25vZGUsCisJCQkJICAgICAgIGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX3N0YXJ0LAorCQkJCSAgICAgICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIGluZm8sCisJCQkJICAgICAgIGluZm8tPnBhc3NfbnVtYmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZSh3YWxrX3N0YXRlKTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIFBhcnNlIHRoZSBBTUwgKi8KKworCXN0YXR1cyA9IGFjcGlfcHNfcGFyc2VfYW1sKHdhbGtfc3RhdGUpOworCisJLyogd2Fsa19zdGF0ZSB3YXMgZGVsZXRlZCBieSBwYXJzZV9hbWwgKi8KIAogICAgICAgY2xlYW51cDoKKwlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKKwogCS8qIEVuZCBvcHRpb25hbCB0cmFjaW5nICovCiAKIAlhY3BpX3BzX3N0b3BfdHJhY2UoaW5mbyk7CkBAIC0zMzAsNjIgKzM0OSwzIEBACiAJCX0KIAl9CiB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZXhlY3V0ZV9wYXNzCi0gKgotICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIFNlZSBzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVzZWQ6IHBhc3NfbnVtYmVyLCBOb2RlLCBhbmQgb2JqX2Rlc2MpCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBTaW5nbGUgQU1MIHBhc3M6IFBhcnNlIG9yIEV4ZWN1dGUgYSBjb250cm9sIG1ldGhvZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3BzX2V4ZWN1dGVfcGFzcyhzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7Ci0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfZXhlY3V0ZV9wYXNzKTsKLQotCS8qIENyZWF0ZSBhbmQgaW5pdCBhIFJvb3QgTm9kZSAqLwotCi0Jb3AgPSBhY3BpX3BzX2NyZWF0ZV9zY29wZV9vcCgpOwotCWlmICghb3ApIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JfQotCi0JLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHdhbGsgc3RhdGUgKi8KLQotCXdhbGtfc3RhdGUgPQotCSAgICBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlKGluZm8tPm9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQsIE5VTEwsCi0JCQkJICAgICAgTlVMTCwgTlVMTCk7Ci0JaWYgKCF3YWxrX3N0YXRlKSB7Ci0JCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9hbWxfd2Fsayh3YWxrX3N0YXRlLCBvcCwgaW5mby0+cmVzb2x2ZWRfbm9kZSwKLQkJCQkgICAgICAgaW5mby0+b2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCi0JCQkJICAgICAgIGluZm8tPm9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwKLQkJCQkgICAgICAgaW5mby0+cGFzc19udW1iZXIgPT0gMSA/IE5VTEwgOiBpbmZvLAotCQkJCSAgICAgICBpbmZvLT5wYXNzX251bWJlcik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBQYXJzZSB0aGUgQU1MICovCi0KLQlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCh3YWxrX3N0YXRlKTsKLQotCS8qIFdhbGsgc3RhdGUgd2FzIGRlbGV0ZWQgYnkgcGFyc2VfYW1sICovCi0KLSAgICAgIGNsZWFudXA6Ci0JYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCmluZGV4IDQ4MWU2MzMuLjBmNjgzYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCkBAIC01MTMsNyArNTEzLDcgQEAKIAkJfQogCX0KIAkvKiBBZGQgYSBwZW5hbHR5IGZvciB0aGUgU0NJICovCi0JYWNwaV9pcnFfcGVuYWx0eVthY3BpX2ZhZHQuc2NpX2ludF0gKz0gUElSUV9QRU5BTFRZX1BDSV9VU0lORzsKKwlhY3BpX2lycV9wZW5hbHR5W2FjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdF0gKz0gUElSUV9QRU5BTFRZX1BDSV9VU0lORzsKIAogCXJldHVybiAwOwogfQpAQCAtNzg1LDcgKzc4NSw3IEBACiAKIAogCS8qIE1ha2Ugc3VyZSBTQ0kgaXMgZW5hYmxlZCBhZ2FpbiAoQXBwbGUgZmlybXdhcmUgYnVnPykgKi8KLQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19TQ0lfRU5BQkxFLCAxLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfU0NJX0VOQUJMRSwgMSk7CiAKIAlsaXN0X2Zvcl9lYWNoKG5vZGUsICZhY3BpX2xpbmsuZW50cmllcykgewogCQlsaW5rID0gbGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgYWNwaV9wY2lfbGluaywgbm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCmluZGV4IGE4NjBlZmEuLjRlY2Y3MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCkBAIC0xMTcsNiArMTE3LDE5IEBACiAKIEVYUE9SVF9TWU1CT0woYWNwaV9wY2lfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCithY3BpX2hhbmRsZSBhY3BpX2dldF9wY2lfcm9vdGJyaWRnZV9oYW5kbGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cykKK3sKKwlzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqdG1wOworCQorCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYWNwaV9wY2lfcm9vdHMsIG5vZGUpIHsKKwkJaWYgKCh0bXAtPmlkLnNlZ21lbnQgPT0gKHUxNikgc2VnKSAmJiAodG1wLT5pZC5idXMgPT0gKHUxNikgYnVzKSkKKwkJCXJldHVybiB0bXAtPmRldmljZS0+aGFuZGxlOworCX0KKwlyZXR1cm4gTlVMTDsJCQorfQorCitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX2dldF9wY2lfcm9vdGJyaWRnZV9oYW5kbGUpOworCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGdldF9yb290X2JyaWRnZV9idXNucl9jYWxsYmFjayhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmRhdGEpCiB7CkBAIC0xNTIsNiArMTY1LDIxIEBACiAJcmV0dXJuIEFFX09LOwogfQogCitzdGF0aWMgdm9pZCBhY3BpX3BjaV9icmlkZ2Vfc2NhbihzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhY3BpX2RldmljZSAqY2hpbGQgPSBOVUxMOworCisJaWYgKGRldmljZS0+ZmxhZ3MuYnVzX2FkZHJlc3MpCisJCWlmIChkZXZpY2UtPnBhcmVudCAmJiBkZXZpY2UtPnBhcmVudC0+b3BzLmJpbmQpIHsKKwkJCXN0YXR1cyA9IGRldmljZS0+cGFyZW50LT5vcHMuYmluZChkZXZpY2UpOworCQkJaWYgKCFzdGF0dXMpIHsKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGV2aWNlLT5jaGlsZHJlbiwgbm9kZSkKKwkJCQkJYWNwaV9wY2lfYnJpZGdlX3NjYW4oY2hpbGQpOworCQkJfQorCQl9Cit9CisKIHN0YXRpYyBpbnQgYWNwaV9wY2lfcm9vdF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0xNjAsNiArMTg4LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAl1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKIAlhY3BpX2hhbmRsZSBoYW5kbGUgPSBOVUxMOworCXN0cnVjdCBhY3BpX2RldmljZSAqY2hpbGQ7CiAKIAogCWlmICghZGV2aWNlKQpAQCAtMTc1LDkgKzIwNCw2IEBACiAJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfUENJX1JPT1RfQ0xBU1MpOwogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IHJvb3Q7CiAKLQkvKgotCSAqIFRCRDogRG9lc24ndCB0aGUgYnVzIGRyaXZlciBhdXRvbWF0aWNhbGx5IHNldCB0aGlzPwotCSAqLwogCWRldmljZS0+b3BzLmJpbmQgPSBhY3BpX3BjaV9iaW5kOwogCiAJLyogCkBAIC0yOTksNiArMzI1LDEyIEBACiAJCXJlc3VsdCA9IGFjcGlfcGNpX2lycV9hZGRfcHJ0KGRldmljZS0+aGFuZGxlLCByb290LT5pZC5zZWdtZW50LAogCQkJCQkgICAgICByb290LT5pZC5idXMpOwogCisJLyoKKwkgKiBTY2FuIGFuZCBiaW5kIGFsbCBfQURSLUJhc2VkIERldmljZXMKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGV2aWNlLT5jaGlsZHJlbiwgbm9kZSkKKwkJYWNwaV9wY2lfYnJpZGdlX3NjYW4oY2hpbGQpOworCiAgICAgICBlbmQ6CiAJaWYgKHJlc3VsdCkgewogCQlpZiAoIWxpc3RfZW1wdHkoJnJvb3QtPm5vZGUpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCA1Zjk0OTZkLi4wMDc5YmM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtMzc1LDMwICszNzUsMTI2IEBACiB9CiAKIC8qIFVzZSB0aGUgYWNwaWlkIGluIE1BRFQgdG8gbWFwIGNwdXMgaW4gY2FzZSBvZiBTTVAgKi8KKwogI2lmbmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIGNvbnZlcnRfYWNwaWlkX3RvX2NwdShhY3BpX2lkKSAoLTEpCitzdGF0aWMgaW50IGdldF9jcHVfaWQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgYWNwaV9pZCkge3JldHVybiAtMTt9CiAjZWxzZQogCitzdGF0aWMgc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqbWFkdDsKKworc3RhdGljIGludCBtYXBfbGFwaWNfaWQoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICplbnRyeSwKKwkJIHUzMiBhY3BpX2lkLCBpbnQgKmFwaWNfaWQpCit7CisJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljICpsYXBpYyA9CisJCShzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWMgKillbnRyeTsKKwlpZiAoKGxhcGljLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSAmJgorCSAgICBsYXBpYy0+cHJvY2Vzc29yX2lkID09IGFjcGlfaWQpIHsKKwkJKmFwaWNfaWQgPSBsYXBpYy0+aWQ7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXBfbHNhcGljX2lkKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnksCisJCSAgdTMyIGFjcGlfaWQsIGludCAqYXBpY19pZCkKK3sKKwlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3NhcGljICpsc2FwaWMgPQorCQkoc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9zYXBpYyAqKWVudHJ5OworCS8qIE9ubHkgY2hlY2sgZW5hYmxlZCBBUElDcyovCisJaWYgKGxzYXBpYy0+bGFwaWNfZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCkgeworCQkvKiBGaXJzdCBjaGVjayBhZ2FpbnN0IGlkICovCisJCWlmIChsc2FwaWMtPnByb2Nlc3Nvcl9pZCA9PSBhY3BpX2lkKSB7CisJCQkqYXBpY19pZCA9IGxzYXBpYy0+aWQ7CisJCQlyZXR1cm4gMTsKKwkJLyogQ2hlY2sgYWdhaW5zdCBvcHRpb25hbCB1aWQgKi8KKwkJfSBlbHNlIGlmIChlbnRyeS0+bGVuZ3RoID49IDE2ICYmCisJCQlsc2FwaWMtPnVpZCA9PSBhY3BpX2lkKSB7CisJCQkqYXBpY19pZCA9IGxzYXBpYy0+dWlkOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKICNpZmRlZiBDT05GSUdfSUE2NAotI2RlZmluZSBhcmNoX2FjcGlpZF90b19hcGljaWQgCWlhNjRfYWNwaWlkX3RvX3NhcGljaWQKICNkZWZpbmUgYXJjaF9jcHVfdG9fYXBpY2lkIAlpYTY0X2NwdV90b19zYXBpY2lkCi0jZGVmaW5lIEFSQ0hfQkFEX0FQSUNJRAkJKDB4ZmZmZikKICNlbHNlCi0jZGVmaW5lIGFyY2hfYWNwaWlkX3RvX2FwaWNpZCAJeDg2X2FjcGlpZF90b19hcGljaWQKICNkZWZpbmUgYXJjaF9jcHVfdG9fYXBpY2lkIAl4ODZfY3B1X3RvX2FwaWNpZAotI2RlZmluZSBBUkNIX0JBRF9BUElDSUQJCSgweGZmKQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgY29udmVydF9hY3BpaWRfdG9fY3B1KHU4IGFjcGlfaWQpCitzdGF0aWMgaW50IG1hcF9tYWR0X2VudHJ5KHUzMiBhY3BpX2lkKQogewotCXUxNiBhcGljX2lkOworCXVuc2lnbmVkIGxvbmcgbWFkdF9lbmQsIGVudHJ5OworCWludCBhcGljX2lkID0gLTE7CisKKwlpZiAoIW1hZHQpCisJCXJldHVybiBhcGljX2lkOworCisJZW50cnkgPSAodW5zaWduZWQgbG9uZyltYWR0OworCW1hZHRfZW5kID0gZW50cnkgKyBtYWR0LT5oZWFkZXIubGVuZ3RoOworCisJLyogUGFyc2UgYWxsIGVudHJpZXMgbG9va2luZyBmb3IgYSBtYXRjaC4gKi8KKworCWVudHJ5ICs9IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0KTsKKwl3aGlsZSAoZW50cnkgKyBzaXplb2Yoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyKSA8IG1hZHRfZW5kKSB7CisJCXN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyID0KKwkJCShzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKillbnRyeTsKKwkJaWYgKGhlYWRlci0+dHlwZSA9PSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9BUElDKSB7CisJCQlpZiAobWFwX2xhcGljX2lkKGhlYWRlciwgYWNwaV9pZCwgJmFwaWNfaWQpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGhlYWRlci0+dHlwZSA9PSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9TQVBJQykgeworCQkJaWYgKG1hcF9sc2FwaWNfaWQoaGVhZGVyLCBhY3BpX2lkLCAmYXBpY19pZCkpCisJCQkJYnJlYWs7CisJCX0KKwkJZW50cnkgKz0gaGVhZGVyLT5sZW5ndGg7CisJfQorCXJldHVybiBhcGljX2lkOworfQorCitzdGF0aWMgaW50IG1hcF9tYXRfZW50cnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgYWNwaV9pZCkKK3sKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXI7CisJaW50IGFwaWNfaWQgPSAtMTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX01BVCIsIE5VTEwsICZidWZmZXIpKSkKKwkJZ290byBleGl0OworCisJaWYgKCFidWZmZXIubGVuZ3RoIHx8ICFidWZmZXIucG9pbnRlcikKKwkJZ290byBleGl0OworCisJb2JqID0gYnVmZmVyLnBvaW50ZXI7CisJaWYgKG9iai0+dHlwZSAhPSBBQ1BJX1RZUEVfQlVGRkVSIHx8CisJICAgIG9iai0+YnVmZmVyLmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIpKSB7CisJCWdvdG8gZXhpdDsKKwl9CisKKwloZWFkZXIgPSAoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICopb2JqLT5idWZmZXIucG9pbnRlcjsKKwlpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUMpIHsKKwkJbWFwX2xhcGljX2lkKGhlYWRlciwgYWNwaV9pZCwgJmFwaWNfaWQpOworCX0gZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1NBUElDKSB7CisJCW1hcF9sc2FwaWNfaWQoaGVhZGVyLCBhY3BpX2lkLCAmYXBpY19pZCk7CisJfQorCitleGl0OgorCWlmIChidWZmZXIucG9pbnRlcikKKwkJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCXJldHVybiBhcGljX2lkOworfQorCitzdGF0aWMgaW50IGdldF9jcHVfaWQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgYWNwaV9pZCkKK3sKIAlpbnQgaTsKKwlpbnQgYXBpY19pZCA9IC0xOwogCi0JYXBpY19pZCA9IGFyY2hfYWNwaWlkX3RvX2FwaWNpZFthY3BpX2lkXTsKLQlpZiAoYXBpY19pZCA9PSBBUkNIX0JBRF9BUElDSUQpCi0JCXJldHVybiAtMTsKKwlhcGljX2lkID0gbWFwX21hdF9lbnRyeShoYW5kbGUsIGFjcGlfaWQpOworCWlmIChhcGljX2lkID09IC0xKQorCQlhcGljX2lkID0gbWFwX21hZHRfZW50cnkoYWNwaV9pZCk7CisJaWYgKGFwaWNfaWQgPT0gLTEpCisJCXJldHVybiBhcGljX2lkOwogCi0JZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyArK2kpIHsKIAkJaWYgKGFyY2hfY3B1X3RvX2FwaWNpZFtpXSA9PSBhcGljX2lkKQogCQkJcmV0dXJuIGk7CiAJfQpAQCAtNDEwLDcgKzUwNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgSW50ZXJmYWNlCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9pbmZvKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9pbmZvKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsIHVuc2lnbmVkIGhhc191aWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKIAl1bmlvbiBhY3BpX29iamVjdCBvYmplY3QgPSB7IDAgfTsKQEAgLTQzMSw3ICs1MjcsNyBAQAogCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGJ1cyBtYXN0ZXJpbmcgYXJiaXRyYXRpb24gY29udHJvbC4gIFRoaXMKIAkgKiBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIEMzIHVzYWdlICh0byBtYWludGFpbiBjYWNoZSBjb2hlcmVuY3kpLgogCSAqLwotCWlmIChhY3BpX2ZhZHQuVjFfcG0yX2NudF9ibGsgJiYgYWNwaV9mYWR0LnBtMl9jbnRfbGVuKSB7CisJaWYgKGFjcGlfZ2JsX0ZBRFQucG0yX2NvbnRyb2xfYmxvY2sgJiYgYWNwaV9nYmxfRkFEVC5wbTJfY29udHJvbF9sZW5ndGgpIHsKIAkJcHItPmZsYWdzLmJtX2NvbnRyb2wgPSAxOwogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkJICAiQnVzIG1hc3RlcmluZyBhcmJpdHJhdGlvbiBjb250cm9sIHByZXNlbnRcbiIpKTsKQEAgLTQzOSwyNCArNTM1LDM1IEBACiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKIAkJCQkgICJObyBidXMgbWFzdGVyaW5nIGFyYml0cmF0aW9uIGNvbnRyb2xcbiIpKTsKIAotCS8qCi0JICogRXZhbHV0ZSB0aGUgcHJvY2Vzc29yIG9iamVjdC4gIE5vdGUgdGhhdCBpdCBpcyBjb21tb24gb24gU01QIHRvCi0JICogaGF2ZSB0aGUgZmlyc3QgKGJvb3QpIHByb2Nlc3NvciB3aXRoIGEgdmFsaWQgUEJMSyBhZGRyZXNzIHdoaWxlCi0JICogYWxsIG90aGVycyBoYXZlIGEgTlVMTCBhZGRyZXNzLgotCSAqLwotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KHByLT5oYW5kbGUsIE5VTEwsIE5VTEwsICZidWZmZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFdmFsdWF0aW5nIHByb2Nlc3NvciBvYmplY3RcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBDaGVjayBpZiBpdCBpcyBhIERldmljZSB3aXRoIEhJRCBhbmQgVUlEICovCisJaWYgKGhhc191aWQpIHsKKwkJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKHByLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19VSUQsCisJCQkJCQlOVUxMLCAmdmFsdWUpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkV2YWx1YXRpbmcgcHJvY2Vzc29yIF9VSURcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJcHItPmFjcGlfaWQgPSB2YWx1ZTsKKwl9IGVsc2UgeworCQkvKgorCQkqIEV2YWx1dGUgdGhlIHByb2Nlc3NvciBvYmplY3QuICBOb3RlIHRoYXQgaXQgaXMgY29tbW9uIG9uIFNNUCB0bworCQkqIGhhdmUgdGhlIGZpcnN0IChib290KSBwcm9jZXNzb3Igd2l0aCBhIHZhbGlkIFBCTEsgYWRkcmVzcyB3aGlsZQorCQkqIGFsbCBvdGhlcnMgaGF2ZSBhIE5VTEwgYWRkcmVzcy4KKwkJKi8KKwkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgTlVMTCwgTlVMTCwgJmJ1ZmZlcik7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXZhbHVhdGluZyBwcm9jZXNzb3Igb2JqZWN0XG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJLyoKKwkJKiBUQkQ6IFN5bmNoIHByb2Nlc3NvciBJRCAodmlhIExBUElDL0xTQVBJQyBzdHJ1Y3R1cmVzKSBvbiBTTVAuCisJCSogICAgICA+Pj4gJ2FjcGlfZ2V0X3Byb2Nlc3Nvcl9pZChhY3BpX2lkLCAmaWQpJyBpbiBhcmNoL3h4eC9hY3BpLmMKKwkJKi8KKwkJcHItPmFjcGlfaWQgPSBvYmplY3QucHJvY2Vzc29yLnByb2NfaWQ7CiAJfQotCi0JLyoKLQkgKiBUQkQ6IFN5bmNoIHByb2Nlc3NvciBJRCAodmlhIExBUElDL0xTQVBJQyBzdHJ1Y3R1cmVzKSBvbiBTTVAuCi0JICogICAgICA+Pj4gJ2FjcGlfZ2V0X3Byb2Nlc3Nvcl9pZChhY3BpX2lkLCAmaWQpJyBpbiBhcmNoL3h4eC9hY3BpLmMKLQkgKi8KLQlwci0+YWNwaV9pZCA9IG9iamVjdC5wcm9jZXNzb3IucHJvY19pZDsKLQotCWNwdV9pbmRleCA9IGNvbnZlcnRfYWNwaWlkX3RvX2NwdShwci0+YWNwaV9pZCk7CisJY3B1X2luZGV4ID0gZ2V0X2NwdV9pZChwci0+aGFuZGxlLCBwci0+YWNwaV9pZCk7CiAKIAkvKiBIYW5kbGUgVVAgc3lzdGVtIHJ1bm5pbmcgU01QIGtlcm5lbCwgd2l0aCBubyBMQVBJQyBpbiBNQURUICovCiAJaWYgKCFjcHUwX2luaXRpYWxpemVkICYmIChjcHVfaW5kZXggPT0gLTEpICYmCkBAIC00NzMsNyArNTgwLDcgQEAKIAkgKiAgbGVzcyB0aGFuIHRoZSBtYXggIyBvZiBDUFVzLiBUaGV5IHNob3VsZCBiZSBpZ25vcmVkIF9pZmYKIAkgKiAgdGhleSBhcmUgcGh5c2ljYWxseSBub3QgcHJlc2VudC4KIAkgKi8KLQlpZiAoY3B1X2luZGV4ID09IC0xKSB7CisJaWYgKHByLT5pZCA9PSAtMSkgewogCQlpZiAoQUNQSV9GQUlMVVJFCiAJCSAgICAoYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQocHItPmhhbmRsZSwgJnByLT5pZCkpKSB7CiAJCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQ5MCw4ICs1OTcsOCBAQAogCQkJICAgIG9iamVjdC5wcm9jZXNzb3IucGJsa19sZW5ndGgpOwogCWVsc2UgewogCQlwci0+dGhyb3R0bGluZy5hZGRyZXNzID0gb2JqZWN0LnByb2Nlc3Nvci5wYmxrX2FkZHJlc3M7Ci0JCXByLT50aHJvdHRsaW5nLmR1dHlfb2Zmc2V0ID0gYWNwaV9mYWR0LmR1dHlfb2Zmc2V0OwotCQlwci0+dGhyb3R0bGluZy5kdXR5X3dpZHRoID0gYWNwaV9mYWR0LmR1dHlfd2lkdGg7CisJCXByLT50aHJvdHRsaW5nLmR1dHlfb2Zmc2V0ID0gYWNwaV9nYmxfRkFEVC5kdXR5X29mZnNldDsKKwkJcHItPnRocm90dGxpbmcuZHV0eV93aWR0aCA9IGFjcGlfZ2JsX0ZBRFQuZHV0eV93aWR0aDsKIAogCQlwci0+cGJsayA9IG9iamVjdC5wcm9jZXNzb3IucGJsa19hZGRyZXNzOwogCkBAIC01MjUsNyArNjMyLDcgQEAKIAogCXByID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCi0JcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3JfZ2V0X2luZm8ocHIpOworCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX2dldF9pbmZvKHByLCBkZXZpY2UtPmZsYWdzLnVuaXF1ZV9pZCk7CiAJaWYgKHJlc3VsdCkgewogCQkvKiBQcm9jZXNzb3IgaXMgcGh5c2ljYWxseSBub3QgcHJlc2VudCAqLwogCQlyZXR1cm4gMDsKQEAgLTcwNyw3ICs4MTQsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgocHItPmlkID49IDApICYmIChwci0+aWQgPCBOUl9DUFVTKSkgewotCQlrb2JqZWN0X3VldmVudCgmKCpkZXZpY2UpLT5rb2JqLCBLT0JKX09OTElORSk7CisJCWtvYmplY3RfdWV2ZW50KCYoKmRldmljZSktPmRldi5rb2JqLCBLT0JKX09OTElORSk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNzQ1LDEzICs4NTIsMTMgQEAKIAkJfQogCiAJCWlmIChwci0+aWQgPj0gMCAmJiAocHItPmlkIDwgTlJfQ1BVUykpIHsKLQkJCWtvYmplY3RfdWV2ZW50KCZkZXZpY2UtPmtvYmosIEtPQkpfT0ZGTElORSk7CisJCQlrb2JqZWN0X3VldmVudCgmZGV2aWNlLT5kZXYua29iaiwgS09CSl9PRkZMSU5FKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3Jfc3RhcnQoZGV2aWNlKTsKIAkJaWYgKCghcmVzdWx0KSAmJiAoKHByLT5pZCA+PSAwKSAmJiAocHItPmlkIDwgTlJfQ1BVUykpKSB7Ci0JCQlrb2JqZWN0X3VldmVudCgmZGV2aWNlLT5rb2JqLCBLT0JKX09OTElORSk7CisJCQlrb2JqZWN0X3VldmVudCgmZGV2aWNlLT5kZXYua29iaiwgS09CSl9PTkxJTkUpOwogCQl9IGVsc2UgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRGV2aWNlIFslc10gZmFpbGVkIHRvIHN0YXJ0XG4iLAogCQkJCSAgICBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSk7CkBAIC03NzQsNyArODgxLDcgQEAKIAkJfQogCiAJCWlmICgocHItPmlkIDwgTlJfQ1BVUykgJiYgKGNwdV9wcmVzZW50KHByLT5pZCkpKQotCQkJa29iamVjdF91ZXZlbnQoJmRldmljZS0+a29iaiwgS09CSl9PRkZMSU5FKTsKKwkJCWtvYmplY3RfdWV2ZW50KCZkZXZpY2UtPmRldi5rb2JqLCBLT0JKX09GRkxJTkUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCkBAIC04OTUsNiArMTAwMiwxMiBAQAogCW1lbXNldCgmcHJvY2Vzc29ycywgMCwgc2l6ZW9mKHByb2Nlc3NvcnMpKTsKIAltZW1zZXQoJmVycmF0YSwgMCwgc2l6ZW9mKGVycmF0YSkpOwogCisjaWZkZWYgQ09ORklHX1NNUAorCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9nZXRfdGFibGUoQUNQSV9TSUdfTUFEVCwgMCwKKwkJCQkoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKSZtYWR0KSkpCisJCW1hZHQgPSAwOworI2VuZGlmCisKIAlhY3BpX3Byb2Nlc3Nvcl9kaXIgPSBwcm9jX21rZGlyKEFDUElfUFJPQ0VTU09SX0NMQVNTLCBhY3BpX3Jvb3RfZGlyKTsKIAlpZiAoIWFjcGlfcHJvY2Vzc29yX2RpcikKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCmluZGV4IDNmMzBhZjIuLjZjNjc1MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIHsKIAlpZiAodDIgPj0gdDEpCiAJCXJldHVybiAodDIgLSB0MSk7Ci0JZWxzZSBpZiAoIWFjcGlfZmFkdC50bXJfdmFsX2V4dCkKKwllbHNlIGlmICghKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfMzJCSVRfVElNRVIpKQogCQlyZXR1cm4gKCgoMHgwMEZGRkZGRiAtIHQxKSArIHQyKSAmIDB4MDBGRkZGRkYpOwogCWVsc2UKIAkJcmV0dXJuICgoMHhGRkZGRkZGRiAtIHQxKSArIHQyKTsKQEAgLTE4Nyw4ICsxODcsNyBAQAogCQljYXNlIEFDUElfU1RBVEVfQzM6CiAJCQkvKiBEaXNhYmxlIGJ1cyBtYXN0ZXIgcmVsb2FkICovCiAJCQlpZiAobmV3LT50eXBlICE9IEFDUElfU1RBVEVfQzMgJiYgcHItPmZsYWdzLmJtX2NoZWNrKQotCQkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELCAwLAotCQkJCQkJICBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsIDApOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xOTgsOCArMTk3LDcgQEAKIAljYXNlIEFDUElfU1RBVEVfQzM6CiAJCS8qIEVuYWJsZSBidXMgbWFzdGVyIHJlbG9hZCAqLwogCQlpZiAob2xkLT50eXBlICE9IEFDUElfU1RBVEVfQzMgJiYgcHItPmZsYWdzLmJtX2NoZWNrKQotCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsIDEsCi0JCQkJCSAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsIDEpOwogCQlicmVhazsKIAl9CiAKQEAgLTIzNiw3ICsyMzQsNyBAQAogCQkvKiBEdW1teSB3YWl0IG9wIC0gbXVzdCBkbyBzb21ldGhpbmcgdXNlbGVzcyBhZnRlciBQX0xWTDIgcmVhZAogCQkgICBiZWNhdXNlIGNoaXBzZXRzIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBTVFBDTEsjIHNpZ25hbAogCQkgICBnZXRzIGFzc2VydGVkIGluIHRpbWUgdG8gZnJlZXplIGV4ZWN1dGlvbiBwcm9wZXJseS4gKi8KLQkJdW51c2VkID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKKwkJdW51c2VkID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOwogCX0KIH0KIApAQCAtMjkxLDEyICsyODksMTAgQEAKIAogCQlwci0+cG93ZXIuYm1fYWN0aXZpdHkgPDw9IGRpZmY7CiAKLQkJYWNwaV9nZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9TVEFUVVMsCi0JCQkJICAmYm1fc3RhdHVzLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCWFjcGlfZ2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfU1RBVFVTLCAmYm1fc3RhdHVzKTsKIAkJaWYgKGJtX3N0YXR1cykgewogCQkJcHItPnBvd2VyLmJtX2FjdGl2aXR5IHw9IDB4MTsKLQkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfU1RBVFVTLAotCQkJCQkgIDEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfU1RBVFVTLCAxKTsKIAkJfQogCQkvKgogCQkgKiBQSUlYNCBFcnJhdHVtICMxODogTm90ZSB0aGF0IEJNX1NUUyBkb2Vzbid0IGFsd2F5cyByZWZsZWN0CkBAIC0zMzgsNyArMzM0LDcgQEAKIAkgKiBkZXRlY3Rpb24gcGhhc2UsIHRvIHdvcmsgY2xlYW5seSB3aXRoIGxvZ2ljYWwgQ1BVIGhvdHBsdWcuCiAJICovCiAJaWYgKChjeC0+dHlwZSAhPSBBQ1BJX1NUQVRFX0MxKSAmJiAobnVtX29ubGluZV9jcHVzKCkgPiAxKSAmJiAKLQkgICAgIXByLT5mbGFncy5oYXNfY3N0ICYmICFhY3BpX2ZhZHQucGx2bDJfdXApCisJICAgICFwci0+ZmxhZ3MuaGFzX2NzdCAmJiAhKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfQzJfTVBfU1VQUE9SVEVEKSkKIAkJY3ggPSAmcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MxXTsKICNlbmRpZgogCkBAIC0zODQsMTEgKzM4MCwxMSBAQAogCiAJY2FzZSBBQ1BJX1NUQVRFX0MyOgogCQkvKiBHZXQgc3RhcnQgdGltZSAodGlja3MpICovCi0JCXQxID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKKwkJdDEgPSBpbmwoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suYWRkcmVzcyk7CiAJCS8qIEludm9rZSBDMiAqLwogCQlhY3BpX2NzdGF0ZV9lbnRlcihjeCk7CiAJCS8qIEdldCBlbmQgdGltZSAodGlja3MpICovCi0JCXQyID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKKwkJdDIgPSBpbmwoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suYWRkcmVzcyk7CiAKICNpZmRlZiBDT05GSUdfR0VORVJJQ19USU1FCiAJCS8qIFRTQyBoYWx0cyBpbiBDMiwgc28gbm90aWZ5IHVzZXJzICovCkBAIC00MTEsOCArNDA3LDcgQEAKIAkJCQkgKiBBbGwgQ1BVcyBhcmUgdHJ5aW5nIHRvIGdvIHRvIEMzCiAJCQkJICogRGlzYWJsZSBidXMgbWFzdGVyIGFyYml0cmF0aW9uCiAJCQkJICovCi0JCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQVJCX0RJU0FCTEUsIDEsCi0JCQkJCQkgIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19BUkJfRElTQUJMRSwgMSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBTTVAgd2l0aCBubyBzaGFyZWQgY2FjaGUuLi4gSW52YWxpZGF0ZSBjYWNoZSAgKi8KQEAgLTQyMCwxNiArNDE1LDE1IEBACiAJCX0KIAogCQkvKiBHZXQgc3RhcnQgdGltZSAodGlja3MpICovCi0JCXQxID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKKwkJdDEgPSBpbmwoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suYWRkcmVzcyk7CiAJCS8qIEludm9rZSBDMyAqLwogCQlhY3BpX2NzdGF0ZV9lbnRlcihjeCk7CiAJCS8qIEdldCBlbmQgdGltZSAodGlja3MpICovCi0JCXQyID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKKwkJdDIgPSBpbmwoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suYWRkcmVzcyk7CiAJCWlmIChwci0+ZmxhZ3MuYm1fY2hlY2spIHsKIAkJCS8qIEVuYWJsZSBidXMgbWFzdGVyIGFyYml0cmF0aW9uICovCiAJCQlhdG9taWNfZGVjKCZjM19jcHVfY291bnQpOwotCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQVJCX0RJU0FCTEUsIDAsCi0JCQkJCSAgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQVJCX0RJU0FCTEUsIDApOwogCQl9CiAKICNpZmRlZiBDT05GSUdfR0VORVJJQ19USU1FCkBAIC00NTcsNyArNDUxLDcgQEAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAkvKiBEb24ndCBkbyBwcm9tb3Rpb24vZGVtb3Rpb24gKi8KIAlpZiAoKGN4LT50eXBlID09IEFDUElfU1RBVEVfQzEpICYmIChudW1fb25saW5lX2NwdXMoKSA+IDEpICYmCi0JICAgICFwci0+ZmxhZ3MuaGFzX2NzdCAmJiAhYWNwaV9mYWR0LnBsdmwyX3VwKSB7CisJICAgICFwci0+ZmxhZ3MuaGFzX2NzdCAmJiAhKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfQzJfTVBfU1VQUE9SVEVEKSkgewogCQluZXh0X3N0YXRlID0gY3g7CiAJCWdvdG8gZW5kOwogCX0KQEAgLTYyNyw3ICs2MjEsOCBAQAogCSAqIENoZWNrIGZvciBQX0xWTDJfVVAgZmxhZyBiZWZvcmUgZW50ZXJpbmcgQzIgYW5kIGFib3ZlIG9uCiAJICogYW4gU01QIHN5c3RlbS4gCiAJICovCi0JaWYgKChudW1fb25saW5lX2NwdXMoKSA+IDEpICYmICFhY3BpX2ZhZHQucGx2bDJfdXApCisJaWYgKChudW1fb25saW5lX2NwdXMoKSA+IDEpICYmCisJICAgICEoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9DMl9NUF9TVVBQT1JURUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKICNlbmRpZgogCkBAIC02MzYsOCArNjMxLDggQEAKIAlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzNdLmFkZHJlc3MgPSBwci0+cGJsayArIDU7CiAKIAkvKiBkZXRlcm1pbmUgbGF0ZW5jaWVzIGZyb20gRkFEVCAqLwotCXByLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9DMl0ubGF0ZW5jeSA9IGFjcGlfZmFkdC5wbHZsMl9sYXQ7Ci0JcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MzXS5sYXRlbmN5ID0gYWNwaV9mYWR0LnBsdmwzX2xhdDsKKwlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzJdLmxhdGVuY3kgPSBhY3BpX2dibF9GQURULkMybGF0ZW5jeTsKKwlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzNdLmxhdGVuY3kgPSBhY3BpX2dibF9GQURULkMzbGF0ZW5jeTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKIAkJCSAgImx2bDJbMHglMDh4XSBsdmwzWzB4JTA4eF1cbiIsCkBAIC04ODMsMTQgKzg3OCwxMyBAQAogCQkgKiBXQklOVkQgc2hvdWxkIGJlIHNldCBpbiBmYWR0LCBmb3IgQzMgc3RhdGUgdG8gYmUKIAkJICogc3VwcG9ydGVkIG9uIHdoZW4gYm1fY2hlY2sgaXMgbm90IHJlcXVpcmVkLgogCQkgKi8KLQkJaWYgKGFjcGlfZmFkdC53Yl9pbnZkICE9IDEpIHsKKwkJaWYgKCEoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9XQklOVkQpKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkJCSAgIkNhY2hlIGludmFsaWRhdGlvbiBzaG91bGQgd29yayBwcm9wZXJseSIKIAkJCQkJICAiIGZvciBDMyB0byBiZSBlbmFibGVkIG9uIFNNUCBzeXN0ZW1zXG4iKSk7CiAJCQlyZXR1cm47CiAJCX0KLQkJYWNwaV9zZXRfcmVnaXN0ZXIoQUNQSV9CSVRSRUdfQlVTX01BU1RFUl9STEQsCi0JCQkJICAwLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELCAwKTsKIAl9CiAKIAkvKgpAQCAtMTA5Niw3ICsxMDkwLDcgQEAKIAkJc2VxX3ByaW50ZihzZXEsICJsYXRlbmN5WyUwM2RdIHVzYWdlWyUwOGRdIGR1cmF0aW9uWyUwMjBsbHVdXG4iLAogCQkJICAgcHItPnBvd2VyLnN0YXRlc1tpXS5sYXRlbmN5LAogCQkJICAgcHItPnBvd2VyLnN0YXRlc1tpXS51c2FnZSwKLQkJCSAgIHByLT5wb3dlci5zdGF0ZXNbaV0udGltZSk7CisJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXByLT5wb3dlci5zdGF0ZXNbaV0udGltZSk7CiAJfQogCiAgICAgICBlbmQ6CkBAIC0xMTY0LDkgKzExNTgsOSBAQAogCWlmICghcHIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGFjcGlfZmFkdC5jc3RfY250ICYmICFub2NzdCkgeworCWlmIChhY3BpX2dibF9GQURULmNzdF9jb250cm9sICYmICFub2NzdCkgewogCQlzdGF0dXMgPQotCQkgICAgYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZmFkdC5zbWlfY21kLCBhY3BpX2ZhZHQuY3N0X2NudCwgOCk7CisJCSAgICBhY3BpX29zX3dyaXRlX3BvcnQoYWNwaV9nYmxfRkFEVC5zbWlfY29tbWFuZCwgYWNwaV9nYmxfRkFEVC5jc3RfY29udHJvbCwgOCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKIAkJCQkJIk5vdGlmeWluZyBCSU9TIG9mIF9DU1QgYWJpbGl0eSBmYWlsZWQiKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCmluZGV4IGNiYjZmMDguLjA1OGYxM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCkBAIC0zNTIsMzEgKzM1MiwyNCBAQAogCiAJaXNfZG9uZSA9IC1FSU87CiAKLQkvKiBDYW4ndCB3cml0ZSBwc3RhdGVfY250IHRvIHNtaV9jbWQgaWYgZWl0aGVyIHZhbHVlIGlzIHplcm8gKi8KLQlpZiAoKCFhY3BpX2ZhZHQuc21pX2NtZCkgfHwgKCFhY3BpX2ZhZHQucHN0YXRlX2NudCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTm8gU01JIHBvcnQgb3IgcHN0YXRlX2NudFxuIikpOworCS8qIENhbid0IHdyaXRlIHBzdGF0ZV9jb250cm9sIHRvIHNtaV9jb21tYW5kIGlmIGVpdGhlciB2YWx1ZSBpcyB6ZXJvICovCisJaWYgKCghYWNwaV9nYmxfRkFEVC5zbWlfY29tbWFuZCkgfHwgKCFhY3BpX2dibF9GQURULnBzdGF0ZV9jb250cm9sKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJObyBTTUkgcG9ydCBvciBwc3RhdGVfY29udHJvbFxuIikpOwogCQltb2R1bGVfcHV0KGNhbGxpbmdfbW9kdWxlKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJICAiV3JpdGluZyBwc3RhdGVfY250IFsweCV4XSB0byBzbWlfY21kIFsweCV4XVxuIiwKLQkJCSAgYWNwaV9mYWR0LnBzdGF0ZV9jbnQsIGFjcGlfZmFkdC5zbWlfY21kKSk7CisJCQkgICJXcml0aW5nIHBzdGF0ZV9jb250cm9sIFsweCV4XSB0byBzbWlfY29tbWFuZCBbMHgleF1cbiIsCisJCQkgIGFjcGlfZ2JsX0ZBRFQucHN0YXRlX2NvbnRyb2wsIGFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQpKTsKIAotCS8qIEZBRFQgdjEgZG9lc24ndCBzdXBwb3J0IHBzdGF0ZV9jbnQsIG1hbnkgQklPUyB2ZW5kb3JzIHVzZQotCSAqIGl0IGFueXdheSwgc28gd2UgbmVlZCB0byBzdXBwb3J0IGl0Li4uICovCi0JaWYgKGFjcGlfZmFkdF9pc192MSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkJICAiVXNpbmcgdjEuMCBGQURUIHJlc2VydmVkIHZhbHVlIGZvciBwc3RhdGVfY250XG4iKSk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZmFkdC5zbWlfY21kLAotCQkJCSAgICAodTMyKSBhY3BpX2ZhZHQucHN0YXRlX2NudCwgOCk7CisJc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0KGFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQsCisJCQkJICAgICh1MzIpIGFjcGlfZ2JsX0ZBRFQucHN0YXRlX2NvbnRyb2wsIDgpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCSJGYWlsZWQgdG8gd3JpdGUgcHN0YXRlX2NudCBbMHgleF0gdG8gIgotCQkJCSJzbWlfY21kIFsweCV4XSIsIGFjcGlfZmFkdC5wc3RhdGVfY250LAotCQkJCWFjcGlfZmFkdC5zbWlfY21kKSk7CisJCQkJIkZhaWxlZCB0byB3cml0ZSBwc3RhdGVfY29udHJvbCBbMHgleF0gdG8gIgorCQkJCSJzbWlfY29tbWFuZCBbMHgleF0iLCBhY3BpX2dibF9GQURULnBzdGF0ZV9jb250cm9sLAorCQkJCWFjcGlfZ2JsX0ZBRFQuc21pX2NvbW1hbmQpKTsKIAkJbW9kdWxlX3B1dChjYWxsaW5nX21vZHVsZSk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwppbmRleCAwZWM3ZGNkLi44OWRmZjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJCS8qIFVzZWQgdG8gY2xlYXIgYWxsIGR1dHlfdmFsdWUgYml0cyAqLwogCQlkdXR5X21hc2sgPSBwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCAtIDE7CiAKLQkJZHV0eV9tYXNrIDw8PSBhY3BpX2ZhZHQuZHV0eV9vZmZzZXQ7CisJCWR1dHlfbWFzayA8PD0gYWNwaV9nYmxfRkFEVC5kdXR5X29mZnNldDsKIAkJZHV0eV9tYXNrID0gfmR1dHlfbWFzazsKIAl9CiAKQEAgLTIwOCw3ICsyMDgsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlwci0+dGhyb3R0bGluZy5zdGF0ZV9jb3VudCA9IDEgPDwgYWNwaV9mYWR0LmR1dHlfd2lkdGg7CisJcHItPnRocm90dGxpbmcuc3RhdGVfY291bnQgPSAxIDw8IGFjcGlfZ2JsX0ZBRFQuZHV0eV93aWR0aDsKIAogCS8qCiAJICogQ29tcHV0ZSBzdGF0ZSB2YWx1ZXMuIE5vdGUgdGhhdCB0aHJvdHRsaW5nIGRpc3BsYXlzIGEgbGluZWFyIHBvd2VyLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNhZGRyLmMKaW5kZXggOGZhMzIxMy4uMjcxZTYxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jCmluZGV4IGNmODdiMDIuLjhjNmQzZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKaW5kZXggMDA4MDU4YS4uMTM1OGMwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAuYwppbmRleCA5Yzk5YTcyLi5kZTIwYTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2luZm8uYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpbmZvLmMKaW5kZXggOWU3YWUyZi4uN2UzYzMzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2luZm8uYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaW5mby5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKaW5kZXggZWE1NjcxNi4uYjI5N2JjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jCmluZGV4IDFmYTYzYmMuLjU2NTdmN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaXJxLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNsaXN0LmMKaW5kZXggMjk0MjNjZS4uYTkyNzU1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYwppbmRleCBhNTEzMTkzLi41MjFlYWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWVtb3J5LmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jCmluZGV4IGZhZjZlMTAuLjNiNjNiNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jCmluZGV4IGE5Y2JlZTguLjI0NDJhOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKaW5kZXggMTk5OWUyYS4uOTkxZjg5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NjYW4uYyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKaW5kZXggMjgzZDg3NS4uNjRmMjZkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NjYW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCkBAIC0yMSwxMDEgKzIxLDMwNSBAQAogI2RlZmluZSBBQ1BJX0JVU19ERVZJQ0VfTkFNRQkJIlN5c3RlbSBCdXMiCiAKIHN0YXRpYyBMSVNUX0hFQUQoYWNwaV9kZXZpY2VfbGlzdCk7CitzdGF0aWMgTElTVF9IRUFEKGFjcGlfYnVzX2lkX2xpc3QpOwogREVGSU5FX1NQSU5MT0NLKGFjcGlfZGV2aWNlX2xvY2spOwogTElTVF9IRUFEKGFjcGlfd2FrZXVwX2RldmljZV9saXN0KTsKIAotCi1zdGF0aWMgdm9pZCBhY3BpX2RldmljZV9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQorc3RydWN0IGFjcGlfZGV2aWNlX2J1c19pZHsKKwljaGFyIGJ1c19pZFsxNV07CisJdW5zaWduZWQgaW50IGluc3RhbmNlX25vOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CitzdGF0aWMgaW50IGFjcGlfZWplY3Rfb3BlcmF0aW9uKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGxvY2thYmxlKQogewotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBhY3BpX2RldmljZSwga29iaik7Ci0Ja2ZyZWUoZGV2LT5wbnAuY2lkX2xpc3QpOwotCWtmcmVlKGRldik7CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3Q7CisJdW5pb24gYWNwaV9vYmplY3QgYXJnOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCisJLyoKKwkgKiBUQkQ6IGV2YWx1YXRlIF9QUzM/CisJICovCisKKwlpZiAobG9ja2FibGUpIHsKKwkJYXJnX2xpc3QuY291bnQgPSAxOworCQlhcmdfbGlzdC5wb2ludGVyID0gJmFyZzsKKwkJYXJnLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwkJYXJnLmludGVnZXIudmFsdWUgPSAwOworCQlhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsICJfTENLIiwgJmFyZ19saXN0LCBOVUxMKTsKKwl9CisKKwlhcmdfbGlzdC5jb3VudCA9IDE7CisJYXJnX2xpc3QucG9pbnRlciA9ICZhcmc7CisJYXJnLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlhcmcuaW50ZWdlci52YWx1ZSA9IDE7CisKKwkvKgorCSAqIFRCRDogX0VKRCBzdXBwb3J0LgorCSAqLworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX0VKMCIsICZhcmdfbGlzdCwgTlVMTCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoLUVOT0RFVik7CisJfQorCisJcmV0dXJuICgwKTsKIH0KIAotc3RydWN0IGFjcGlfZGV2aWNlX2F0dHJpYnV0ZSB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCSBzc2l6ZV90KCpzaG93KSAoc3RydWN0IGFjcGlfZGV2aWNlICosIGNoYXIgKik7Ci0JIHNzaXplX3QoKnN0b3JlKSAoc3RydWN0IGFjcGlfZGV2aWNlICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLX07Ci0KLXR5cGVkZWYgdm9pZCBhY3BpX2RldmljZV9zeXNmc19maWxlcyhzdHJ1Y3Qga29iamVjdCAqLAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqKTsKLQotc3RhdGljIHZvaWQgc2V0dXBfc3lzX2ZzX2RldmljZV9maWxlcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICBhY3BpX2RldmljZV9zeXNmc19maWxlcyAqIGZ1bmMpOwotCi0jZGVmaW5lIGNyZWF0ZV9zeXNmc19kZXZpY2VfZmlsZXMoZGV2KQlcCi0Jc2V0dXBfc3lzX2ZzX2RldmljZV9maWxlcyhkZXYsIChhY3BpX2RldmljZV9zeXNmc19maWxlcyAqKSZzeXNmc19jcmVhdGVfZmlsZSkKLSNkZWZpbmUgcmVtb3ZlX3N5c2ZzX2RldmljZV9maWxlcyhkZXYpCVwKLQlzZXR1cF9zeXNfZnNfZGV2aWNlX2ZpbGVzKGRldiwgKGFjcGlfZGV2aWNlX3N5c2ZzX2ZpbGVzICopJnN5c2ZzX3JlbW92ZV9maWxlKQotCi0jZGVmaW5lIHRvX2FjcGlfZGV2aWNlKG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIGtvYmopCi0jZGVmaW5lIHRvX2hhbmRsZV9hdHRyKG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgYWNwaV9kZXZpY2VfYXR0cmlidXRlLCBhdHRyKTsKLQotc3RhdGljIHNzaXplX3QgYWNwaV9kZXZpY2VfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QKK2FjcGlfZWplY3Rfc3RvcmUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gdG9fYWNwaV9kZXZpY2Uoa29iaik7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0cmlidXRlID0gdG9faGFuZGxlX2F0dHIoYXR0cik7Ci0JcmV0dXJuIGF0dHJpYnV0ZS0+c2hvdyA/IGF0dHJpYnV0ZS0+c2hvdyhkZXZpY2UsIGJ1ZikgOiAtRUlPOwotfQotc3RhdGljIHNzaXplX3QgYWNwaV9kZXZpY2VfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCi0JCQkJICAgICAgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IHRvX2FjcGlfZGV2aWNlKGtvYmopOwotCXN0cnVjdCBhY3BpX2RldmljZV9hdHRyaWJ1dGUgKmF0dHJpYnV0ZSA9IHRvX2hhbmRsZV9hdHRyKGF0dHIpOwotCXJldHVybiBhdHRyaWJ1dGUtPnN0b3JlID8gYXR0cmlidXRlLT5zdG9yZShkZXZpY2UsIGJ1ZiwgbGVuKSA6IC1FSU87CisJaW50IHJlc3VsdDsKKwlpbnQgcmV0ID0gY291bnQ7CisJaW50IGlzbG9ja2FibGU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlhY3BpX29iamVjdF90eXBlIHR5cGUgPSAwOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXZpY2UgPSB0b19hY3BpX2RldmljZShkKTsKKworCWlmICgoIWNvdW50KSB8fCAoYnVmWzBdICE9ICcxJykpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2lmbmRlZiBGT1JDRV9FSkVDVAorCWlmIChhY3BpX2RldmljZS0+ZHJpdmVyID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorI2VuZGlmCisJc3RhdHVzID0gYWNwaV9nZXRfdHlwZShhY3BpX2RldmljZS0+aGFuZGxlLCAmdHlwZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICghYWNwaV9kZXZpY2UtPmZsYWdzLmVqZWN0YWJsZSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJaXNsb2NrYWJsZSA9IGFjcGlfZGV2aWNlLT5mbGFncy5sb2NrYWJsZTsKKwloYW5kbGUgPSBhY3BpX2RldmljZS0+aGFuZGxlOworCisJcmVzdWx0ID0gYWNwaV9idXNfdHJpbShhY3BpX2RldmljZSwgMSk7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmVzdWx0ID0gYWNwaV9lamVjdF9vcGVyYXRpb24oaGFuZGxlLCBpc2xvY2thYmxlKTsKKworCWlmIChyZXN1bHQpIHsKKwkJcmV0ID0gLUVCVVNZOworCX0KKyAgICAgIGVycjoKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBhY3BpX2RldmljZV9zeXNmc19vcHMgPSB7Ci0JLnNob3cgPSBhY3BpX2RldmljZV9hdHRyX3Nob3csCi0JLnN0b3JlID0gYWNwaV9kZXZpY2VfYXR0cl9zdG9yZSwKLX07CitzdGF0aWMgREVWSUNFX0FUVFIoZWplY3QsIDAyMDAsIE5VTEwsIGFjcGlfZWplY3Rfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9hY3BpX25zID0gewotCS5zeXNmc19vcHMgPSAmYWNwaV9kZXZpY2Vfc3lzZnNfb3BzLAotCS5yZWxlYXNlID0gYWNwaV9kZXZpY2VfcmVsZWFzZSwKLX07CitzdGF0aWMgc3NpemVfdAorYWNwaV9kZXZpY2VfaGlkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSB7CisJc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldiA9IHRvX2FjcGlfZGV2aWNlKGRldik7CiAKLXN0YXRpYyBpbnQgbmFtZXNwYWNlX3VldmVudChzdHJ1Y3Qga3NldCAqa3NldCwgc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkgICAgIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwKLQkJCSAgICAgaW50IGJ1ZmZlcl9zaXplKQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBhY3BpX2Rldi0+cG5wLmhhcmR3YXJlX2lkKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihoaWQsIDA0NDQsIGFjcGlfZGV2aWNlX2hpZF9zaG93LCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QKK2FjcGlfZGV2aWNlX3BhdGhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIHsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2ID0gdG9fYWNwaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgcGF0aCA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGFjcGlfZ2V0X25hbWUoYWNwaV9kZXYtPmhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmcGF0aCk7CisJaWYocmVzdWx0KQorCQlnb3RvIGVuZDsKKworCXJlc3VsdCA9IHNwcmludGYoYnVmLCAiJXNcbiIsIChjaGFyKilwYXRoLnBvaW50ZXIpOworCWtmcmVlKHBhdGgucG9pbnRlcik7CisgIGVuZDoKKwlyZXR1cm4gcmVzdWx0OworfQorc3RhdGljIERFVklDRV9BVFRSKHBhdGgsIDA0NDQsIGFjcGlfZGV2aWNlX3BhdGhfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBpbnQgYWNwaV9kZXZpY2Vfc2V0dXBfZmlsZXMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICpkZXYgPSB0b19hY3BpX2RldmljZShrb2JqKTsKLQlpbnQgaSA9IDA7Ci0JaW50IGxlbiA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIHRlbXA7CisJaW50IHJlc3VsdCA9IDA7CiAKLQlpZiAoIWRldi0+ZHJpdmVyKQotCQlyZXR1cm4gMDsKKwkvKgorCSAqIERldmljZXMgZ290dGVuIGZyb20gRkFEVCBkb24ndCBoYXZlIGEgInBhdGgiIGF0dHJpYnV0ZQorCSAqLworCWlmKGRldi0+aGFuZGxlKSB7CisJCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9wYXRoKTsKKwkJaWYocmVzdWx0KQorCQkJZ290byBlbmQ7CisJfQogCi0JaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbiwKLQkJCSAgICJQSFlTREVWRFJJVkVSPSVzIiwgZGV2LT5kcml2ZXItPm5hbWUpKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZihkZXYtPmZsYWdzLmhhcmR3YXJlX2lkKSB7CisJCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9oaWQpOworCQlpZihyZXN1bHQpCisJCQlnb3RvIGVuZDsKKwl9CiAKLQllbnZwW2ldID0gTlVMTDsKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgZGV2aWNlIGhhcyBfRUowLCAnZWplY3QnIGZpbGUgaXMgY3JlYXRlZCB0aGF0IGlzIHVzZWQgdG8gdHJpZ2dlcgorICAgICAgICAgKiBob3QtcmVtb3ZhbCBmdW5jdGlvbiBmcm9tIHVzZXJsYW5kLgorICAgICAgICAgKi8KKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoZGV2LT5oYW5kbGUsICJfRUowIiwgJnRlbXApOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmVzdWx0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2VqZWN0KTsKKyAgZW5kOgorCXJldHVybiByZXN1bHQ7Cit9CiAKK3N0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX3JlbW92ZV9maWxlcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldikKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9oYW5kbGUgdGVtcDsKKworCS8qCisJICogSWYgZGV2aWNlIGhhcyBfRUowLCAnZWplY3QnIGZpbGUgaXMgY3JlYXRlZCB0aGF0IGlzIHVzZWQgdG8gdHJpZ2dlcgorCSAqIGhvdC1yZW1vdmFsIGZ1bmN0aW9uIGZyb20gdXNlcmxhbmQuCisJICovCisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGRldi0+aGFuZGxlLCAiX0VKMCIsICZ0ZW1wKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9lamVjdCk7CisKKwlpZihkZXYtPmZsYWdzLmhhcmR3YXJlX2lkKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaGlkKTsKKwlpZihkZXYtPmhhbmRsZSkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3BhdGgpOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUFDUEkgQnVzIG9wZXJhdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgdm9pZCBhY3BpX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2ID0gdG9fYWNwaV9kZXZpY2UoZGV2KTsKKworCWtmcmVlKGFjcGlfZGV2LT5wbnAuY2lkX2xpc3QpOworCWtmcmVlKGFjcGlfZGV2KTsKK30KKworc3RhdGljIGludCBhY3BpX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYgPSB0b19hY3BpX2RldmljZShkZXYpOworCXN0cnVjdCBhY3BpX2RyaXZlciAqYWNwaV9kcnYgPSBhY3BpX2Rldi0+ZHJpdmVyOworCisJaWYgKGFjcGlfZHJ2ICYmIGFjcGlfZHJ2LT5vcHMuc3VzcGVuZCkKKwkJcmV0dXJuIGFjcGlfZHJ2LT5vcHMuc3VzcGVuZChhY3BpX2Rldiwgc3RhdGUpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGtzZXRfdWV2ZW50X29wcyBuYW1lc3BhY2VfdWV2ZW50X29wcyA9IHsKLQkudWV2ZW50ID0gJm5hbWVzcGFjZV91ZXZlbnQsCitzdGF0aWMgaW50IGFjcGlfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldiA9IHRvX2FjcGlfZGV2aWNlKGRldik7CisJc3RydWN0IGFjcGlfZHJpdmVyICphY3BpX2RydiA9IGFjcGlfZGV2LT5kcml2ZXI7CisKKwlpZiAoYWNwaV9kcnYgJiYgYWNwaV9kcnYtPm9wcy5yZXN1bWUpCisJCXJldHVybiBhY3BpX2Rydi0+b3BzLnJlc3VtZShhY3BpX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYgPSB0b19hY3BpX2RldmljZShkZXYpOworCXN0cnVjdCBhY3BpX2RyaXZlciAqYWNwaV9kcnYgPSB0b19hY3BpX2RyaXZlcihkcnYpOworCisJcmV0dXJuICFhY3BpX21hdGNoX2lkcyhhY3BpX2RldiwgYWNwaV9kcnYtPmlkcyk7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9kZXZpY2VfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwljaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2ID0gdG9fYWNwaV9kZXZpY2UoZGV2KTsKKwlpbnQgaSA9IDAsIGxlbmd0aCA9IDAsIHJldCA9IDA7CisKKwlpZiAoYWNwaV9kZXYtPmZsYWdzLmhhcmR3YXJlX2lkKQorCQlyZXQgPSBhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQlidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJIkhXSUQ9JXMiLCBhY3BpX2Rldi0+cG5wLmhhcmR3YXJlX2lkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoYWNwaV9kZXYtPmZsYWdzLmNvbXBhdGlibGVfaWRzKSB7CisJCWludCBqOworCQlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgKmNpZF9saXN0OworCisJCWNpZF9saXN0ID0gYWNwaV9kZXYtPnBucC5jaWRfbGlzdDsKKworCQlmb3IgKGogPSAwOyBqIDwgY2lkX2xpc3QtPmNvdW50OyBqKyspIHsKKwkJCXJldCA9IGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwgYnVmZmVyLAorCQkJCWJ1ZmZlcl9zaXplLCAmbGVuZ3RoLCAiQ09NUFRJRD0lcyIsCisJCQkJY2lkX2xpc3QtPmlkW2pdLnZhbHVlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwllbnZwW2ldID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3BpX2J1c19kcml2ZXJfaW5pdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiwgc3RydWN0IGFjcGlfZHJpdmVyICopOworc3RhdGljIGludCBhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3Qoc3RydWN0IGFjcGlfZGV2aWNlICopOworc3RhdGljIGludCBhY3BpX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICogZGV2KQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYgPSB0b19hY3BpX2RldmljZShkZXYpOworCXN0cnVjdCBhY3BpX2RyaXZlciAqYWNwaV9kcnYgPSB0b19hY3BpX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaW50IHJldDsKKworCXJldCA9IGFjcGlfYnVzX2RyaXZlcl9pbml0KGFjcGlfZGV2LCBhY3BpX2Rydik7CisJaWYgKCFyZXQpIHsKKwkJaWYgKGFjcGlfZGV2LT5idXNfb3BzLmFjcGlfb3Bfc3RhcnQpCisJCQlhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoYWNwaV9kZXYpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkiRm91bmQgZHJpdmVyIFslc10gZm9yIGRldmljZSBbJXNdXG4iLAorCQkJYWNwaV9kcnYtPm5hbWUsIGFjcGlfZGV2LT5wbnAuYnVzX2lkKSk7CisJCWdldF9kZXZpY2UoZGV2KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhY3BpX2RldmljZV9yZW1vdmUoc3RydWN0IGRldmljZSAqIGRldikKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2ID0gdG9fYWNwaV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmFjcGlfZHJ2ID0gYWNwaV9kZXYtPmRyaXZlcjsKKworCWlmIChhY3BpX2RydikgeworCQlpZiAoYWNwaV9kcnYtPm9wcy5zdG9wKQorCQkJYWNwaV9kcnYtPm9wcy5zdG9wKGFjcGlfZGV2LCBhY3BpX2Rldi0+cmVtb3ZhbF90eXBlKTsKKwkJaWYgKGFjcGlfZHJ2LT5vcHMucmVtb3ZlKQorCQkJYWNwaV9kcnYtPm9wcy5yZW1vdmUoYWNwaV9kZXYsIGFjcGlfZGV2LT5yZW1vdmFsX3R5cGUpOworCX0KKwlhY3BpX2Rldi0+ZHJpdmVyID0gTlVMTDsKKwlhY3BpX2RyaXZlcl9kYXRhKGRldikgPSBOVUxMOworCisJcHV0X2RldmljZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhY3BpX2RldmljZV9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldiA9IHRvX2FjcGlfZGV2aWNlKGRldik7CisJc3RydWN0IGFjcGlfZHJpdmVyICphY3BpX2RydiA9IGFjcGlfZGV2LT5kcml2ZXI7CisKKwlpZiAoYWNwaV9kcnYgJiYgYWNwaV9kcnYtPm9wcy5zaHV0ZG93bikKKwkJYWNwaV9kcnYtPm9wcy5zaHV0ZG93bihhY3BpX2Rldik7CisKKwlyZXR1cm4gOworfQorCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIGFjcGlfYnVzX3R5cGUgPSB7CisJLm5hbWUJCT0gImFjcGkiLAorCS5zdXNwZW5kCT0gYWNwaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFjcGlfZGV2aWNlX3Jlc3VtZSwKKwkuc2h1dGRvd24JPSBhY3BpX2RldmljZV9zaHV0ZG93biwKKwkubWF0Y2gJCT0gYWNwaV9idXNfbWF0Y2gsCisJLnByb2JlCQk9IGFjcGlfZGV2aWNlX3Byb2JlLAorCS5yZW1vdmUJCT0gYWNwaV9kZXZpY2VfcmVtb3ZlLAorCS51ZXZlbnQJCT0gYWNwaV9kZXZpY2VfdWV2ZW50LAogfTsKIAotc3RhdGljIHN0cnVjdCBrc2V0IGFjcGlfbmFtZXNwYWNlX2tzZXQgPSB7Ci0JLmtvYmogPSB7Ci0JCSAubmFtZSA9ICJuYW1lc3BhY2UiLAotCQkgfSwKLQkuc3Vic3lzID0gJmFjcGlfc3Vic3lzLAotCS5rdHlwZSA9ICZrdHlwZV9hY3BpX25zLAotCS51ZXZlbnRfb3BzID0gJm5hbWVzcGFjZV91ZXZlbnRfb3BzLAotfTsKLQotc3RhdGljIHZvaWQgYWNwaV9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCitzdGF0aWMgaW50IGFjcGlfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAogCQkJCSBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCkKIHsKLQlpbnQgZXJyOwotCisJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2VfYnVzX2lkICphY3BpX2RldmljZV9idXNfaWQsICpuZXdfYnVzX2lkOworCWludCBmb3VuZCA9IDA7CiAJLyoKIAkgKiBMaW5rYWdlCiAJICogLS0tLS0tLQpAQCAtMTI2LDcgKzMzMCwzMyBAQAogCUlOSVRfTElTVF9IRUFEKCZkZXZpY2UtPmdfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldmljZS0+d2FrZXVwX2xpc3QpOwogCisJbmV3X2J1c19pZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2RldmljZV9idXNfaWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19idXNfaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOworCS8qCisJICogRmluZCBzdWl0YWJsZSBidXNfaWQgYW5kIGluc3RhbmNlIG51bWJlciBpbiBhY3BpX2J1c19pZF9saXN0CisJICogSWYgZmFpbGVkLCBjcmVhdGUgb25lIGFuZCBsaW5rIGl0IGludG8gYWNwaV9idXNfaWRfbGlzdAorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWNwaV9kZXZpY2VfYnVzX2lkLCAmYWNwaV9idXNfaWRfbGlzdCwgbm9kZSkgeworCQlpZighc3RyY21wKGFjcGlfZGV2aWNlX2J1c19pZC0+YnVzX2lkLCBkZXZpY2UtPmZsYWdzLmhhcmR3YXJlX2lkPyBkZXZpY2UtPnBucC5oYXJkd2FyZV9pZCA6ICJkZXZpY2UiKSkgeworCQkJYWNwaV9kZXZpY2VfYnVzX2lkLT5pbnN0YW5jZV9ubyArKzsKKwkJCWZvdW5kID0gMTsKKwkJCWtmcmVlKG5ld19idXNfaWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYoIWZvdW5kKSB7CisJCWFjcGlfZGV2aWNlX2J1c19pZCA9IG5ld19idXNfaWQ7CisJCXN0cmNweShhY3BpX2RldmljZV9idXNfaWQtPmJ1c19pZCwgZGV2aWNlLT5mbGFncy5oYXJkd2FyZV9pZCA/IGRldmljZS0+cG5wLmhhcmR3YXJlX2lkIDogImRldmljZSIpOworCQlhY3BpX2RldmljZV9idXNfaWQtPmluc3RhbmNlX25vID0gMDsKKwkJbGlzdF9hZGRfdGFpbCgmYWNwaV9kZXZpY2VfYnVzX2lkLT5ub2RlLCAmYWNwaV9idXNfaWRfbGlzdCk7CisJfQorCXNwcmludGYoZGV2aWNlLT5kZXYuYnVzX2lkLCAiJXM6JTAyeCIsIGFjcGlfZGV2aWNlX2J1c19pZC0+YnVzX2lkLCBhY3BpX2RldmljZV9idXNfaWQtPmluc3RhbmNlX25vKTsKKwogCWlmIChkZXZpY2UtPnBhcmVudCkgewogCQlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPm5vZGUsICZkZXZpY2UtPnBhcmVudC0+Y2hpbGRyZW4pOwogCQlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPmdfbGlzdCwgJmRldmljZS0+cGFyZW50LT5nX2xpc3QpOwpAQCAtMTM2LDE2ICszNjYsMzMgQEAKIAkJbGlzdF9hZGRfdGFpbCgmZGV2aWNlLT53YWtldXBfbGlzdCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KTsKIAlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAKLQlzdHJsY3B5KGRldmljZS0+a29iai5uYW1lLCBkZXZpY2UtPnBucC5idXNfaWQsIEtPQkpfTkFNRV9MRU4pOwotCWlmIChwYXJlbnQpCi0JCWRldmljZS0+a29iai5wYXJlbnQgPSAmcGFyZW50LT5rb2JqOwotCWRldmljZS0+a29iai5rdHlwZSA9ICZrdHlwZV9hY3BpX25zOwotCWRldmljZS0+a29iai5rc2V0ID0gJmFjcGlfbmFtZXNwYWNlX2tzZXQ7Ci0JZXJyID0ga29iamVjdF9yZWdpc3RlcigmZGV2aWNlLT5rb2JqKTsKLQlpZiAoZXJyIDwgMCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGtvYmplY3RfcmVnaXN0ZXIgZXJyb3I6ICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBlcnIpOwotCWNyZWF0ZV9zeXNmc19kZXZpY2VfZmlsZXMoZGV2aWNlKTsKKwlpZiAoZGV2aWNlLT5wYXJlbnQpCisJCWRldmljZS0+ZGV2LnBhcmVudCA9ICZwYXJlbnQtPmRldjsKKwlkZXZpY2UtPmRldi5idXMgPSAmYWNwaV9idXNfdHlwZTsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmZGV2aWNlLT5kZXYpOworCWRldmljZS0+ZGV2LnJlbGVhc2UgPSAmYWNwaV9kZXZpY2VfcmVsZWFzZTsKKwlyZXN1bHQgPSBkZXZpY2VfYWRkKCZkZXZpY2UtPmRldik7CisJaWYocmVzdWx0KSB7CisJCXByaW50aygiRXJyb3IgYWRkaW5nIGRldmljZSAlcyIsIGRldmljZS0+ZGV2LmJ1c19pZCk7CisJCWdvdG8gZW5kOworCX0KKworCXJlc3VsdCA9IGFjcGlfZGV2aWNlX3NldHVwX2ZpbGVzKGRldmljZSk7CisJaWYocmVzdWx0KQorCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgY3JlYXRpbmcgc3lzZnMgaW50ZXJmYWNlIGZvciBkZXZpY2UgJXNcbiIsIGRldmljZS0+ZGV2LmJ1c19pZCkpOworCisJZGV2aWNlLT5yZW1vdmFsX3R5cGUgPSBBQ1BJX0JVU19SRU1PVkFMX05PUk1BTDsKKwlyZXR1cm4gMDsKKyAgZW5kOgorCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJaWYgKGRldmljZS0+cGFyZW50KSB7CisJCWxpc3RfZGVsKCZkZXZpY2UtPm5vZGUpOworCQlsaXN0X2RlbCgmZGV2aWNlLT5nX2xpc3QpOworCX0gZWxzZQorCQlsaXN0X2RlbCgmZGV2aWNlLT5nX2xpc3QpOworCWxpc3RfZGVsKCZkZXZpY2UtPndha2V1cF9saXN0KTsKKwlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIHZvaWQgYWNwaV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCkBAIC0xNTgsMTQgKzQwNSwxMzcgQEAKIAkJbGlzdF9kZWwoJmRldmljZS0+Z19saXN0KTsKIAogCWxpc3RfZGVsKCZkZXZpY2UtPndha2V1cF9saXN0KTsKLQogCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAogCWFjcGlfZGV0YWNoX2RhdGEoZGV2aWNlLT5oYW5kbGUsIGFjcGlfYnVzX2RhdGFfaGFuZGxlcik7Ci0JcmVtb3ZlX3N5c2ZzX2RldmljZV9maWxlcyhkZXZpY2UpOwotCWtvYmplY3RfdW5yZWdpc3RlcigmZGV2aWNlLT5rb2JqKTsKKworCWFjcGlfZGV2aWNlX3JlbW92ZV9maWxlcyhkZXZpY2UpOworCWRldmljZV91bnJlZ2lzdGVyKCZkZXZpY2UtPmRldik7CiB9CiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgTWFuYWdlbWVudAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qKgorICogYWNwaV9idXNfZHJpdmVyX2luaXQgLSBhZGQgYSBkZXZpY2UgdG8gYSBkcml2ZXIKKyAqIEBkZXZpY2U6IHRoZSBkZXZpY2UgdG8gYWRkIGFuZCBpbml0aWFsaXplCisgKiBAZHJpdmVyOiBkcml2ZXIgZm9yIHRoZSBkZXZpY2UKKyAqCisgKiBVc2VkIHRvIGluaXRpYWxpemUgYSBkZXZpY2UgdmlhIGl0cyBkZXZpY2UgZHJpdmVyLiAgQ2FsbGVkIHdoZW5ldmVyIGEgCisgKiBkcml2ZXIgaXMgYm91bmQgdG8gYSBkZXZpY2UuICBJbnZva2VzIHRoZSBkcml2ZXIncyBhZGQoKSBvcHMuCisgKi8KK3N0YXRpYyBpbnQKK2FjcGlfYnVzX2RyaXZlcl9pbml0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCisJaWYgKCFkZXZpY2UgfHwgIWRyaXZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRyaXZlci0+b3BzLmFkZCkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwlyZXN1bHQgPSBkcml2ZXItPm9wcy5hZGQoZGV2aWNlKTsKKwlpZiAocmVzdWx0KSB7CisJCWRldmljZS0+ZHJpdmVyID0gTlVMTDsKKwkJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gTlVMTDsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlkZXZpY2UtPmRyaXZlciA9IGRyaXZlcjsKKworCS8qCisJICogVEJEIC0gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50OiBBc3NpZ24gcmVzb3VyY2VzIHRvIGRldmljZSBiYXNlZAorCSAqIHVwb24gcG9zc2libGUgY29uZmlndXJhdGlvbiBhbmQgY3VycmVudGx5IGFsbG9jYXRlZCByZXNvdXJjZXMuCisJICovCisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCisJCQkgICJEcml2ZXIgc3VjY2Vzc2Z1bGx5IGJvdW5kIHRvIGRldmljZVxuIikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcjsKKworCisJaWYgKCEoZHJpdmVyID0gZGV2aWNlLT5kcml2ZXIpKQorCQlyZXR1cm4gMDsKKworCWlmIChkcml2ZXItPm9wcy5zdGFydCkgeworCQlyZXN1bHQgPSBkcml2ZXItPm9wcy5zdGFydChkZXZpY2UpOworCQlpZiAocmVzdWx0ICYmIGRyaXZlci0+b3BzLnJlbW92ZSkKKwkJCWRyaXZlci0+b3BzLnJlbW92ZShkZXZpY2UsIEFDUElfQlVTX1JFTU9WQUxfTk9STUFMKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlciAtIHJlZ2lzdGVyIGEgZHJpdmVyIHdpdGggdGhlIEFDUEkgYnVzCisgKiBAZHJpdmVyOiBkcml2ZXIgYmVpbmcgcmVnaXN0ZXJlZAorICoKKyAqIFJlZ2lzdGVycyBhIGRyaXZlciB3aXRoIHRoZSBBQ1BJIGJ1cy4gIFNlYXJjaGVzIHRoZSBuYW1lc3BhY2UgZm9yIGFsbAorICogZGV2aWNlcyB0aGF0IG1hdGNoIHRoZSBkcml2ZXIncyBjcml0ZXJpYSBhbmQgYmluZHMuICBSZXR1cm5zIHplcm8gZm9yCisgKiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3Igc3RhdHVzIGZvciBmYWlsdXJlLgorICovCitpbnQgYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKQoreworCWludCByZXQ7CisKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZHJpdmVyLT5kcnYubmFtZSA9IGRyaXZlci0+bmFtZTsKKwlkcml2ZXItPmRydi5idXMgPSAmYWNwaV9idXNfdHlwZTsKKwlkcml2ZXItPmRydi5vd25lciA9IGRyaXZlci0+b3duZXI7CisKKwlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJ2KTsKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcik7CisKKy8qKgorICogYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIgLSB1bnJlZ2lzdGVycyBhIGRyaXZlciB3aXRoIHRoZSBBUElDIGJ1cworICogQGRyaXZlcjogZHJpdmVyIHRvIHVucmVnaXN0ZXIKKyAqCisgKiBVbnJlZ2lzdGVycyBhIGRyaXZlciB3aXRoIHRoZSBBQ1BJIGJ1cy4gIFNlYXJjaGVzIHRoZSBuYW1lc3BhY2UgZm9yIGFsbAorICogZGV2aWNlcyB0aGF0IG1hdGNoIHRoZSBkcml2ZXIncyBjcml0ZXJpYSBhbmQgdW5iaW5kcy4KKyAqLwordm9pZCBhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcnYpOworfQorCitFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZSBFbnVtZXJhdGlvbgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2FjcGlfc3RhdHVzCithY3BpX2J1c19nZXRfZWpkKGFjcGlfaGFuZGxlIGhhbmRsZSwgYWNwaV9oYW5kbGUgKmVqZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9oYW5kbGUgdG1wOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0VKRCIsICZ0bXApOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgIl9FSkQiLCBOVUxMLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJb2JqID0gYnVmZmVyLnBvaW50ZXI7CisJCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBvYmotPnN0cmluZy5wb2ludGVyLCBlamQpOworCQlrZnJlZShidWZmZXIucG9pbnRlcik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhY3BpX2J1c19nZXRfZWpkKTsKKwogdm9pZCBhY3BpX2J1c19kYXRhX2hhbmRsZXIoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZnVuY3Rpb24sIHZvaWQgKmNvbnRleHQpCiB7CiAKQEAgLTE3NCw2NyArNTQ0LDYgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9idXNfZ2V0X3Bvd2VyX2ZsYWdzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IDA7Ci0JYWNwaV9oYW5kbGUgaGFuZGxlID0gTlVMTDsKLQl1MzIgaSA9IDA7Ci0KLQotCS8qCi0JICogUG93ZXIgTWFuYWdlbWVudCBGbGFncwotCSAqLwotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9QU0MiLCAmaGFuZGxlKTsKLQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCWRldmljZS0+cG93ZXIuZmxhZ3MuZXhwbGljaXRfZ2V0ID0gMTsKLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfSVJDIiwgJmhhbmRsZSk7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQotCQlkZXZpY2UtPnBvd2VyLmZsYWdzLmlucnVzaF9jdXJyZW50ID0gMTsKLQotCS8qCi0JICogRW51bWVyYXRlIHN1cHBvcnRlZCBwb3dlciBtYW5hZ2VtZW50IHN0YXRlcwotCSAqLwotCWZvciAoaSA9IEFDUElfU1RBVEVfRDA7IGkgPD0gQUNQSV9TVEFURV9EMzsgaSsrKSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZV9wb3dlcl9zdGF0ZSAqcHMgPSAmZGV2aWNlLT5wb3dlci5zdGF0ZXNbaV07Ci0JCWNoYXIgb2JqZWN0X25hbWVbNV0gPSB7ICdfJywgJ1AnLCAnUicsICcwJyArIGksICdcMCcgfTsKLQotCQkvKiBFdmFsdWF0ZSAiX1BSeCIgdG8gc2UgaWYgcG93ZXIgcmVzb3VyY2VzIGFyZSByZWZlcmVuY2VkICovCi0JCWFjcGlfZXZhbHVhdGVfcmVmZXJlbmNlKGRldmljZS0+aGFuZGxlLCBvYmplY3RfbmFtZSwgTlVMTCwKLQkJCQkJJnBzLT5yZXNvdXJjZXMpOwotCQlpZiAocHMtPnJlc291cmNlcy5jb3VudCkgewotCQkJZGV2aWNlLT5wb3dlci5mbGFncy5wb3dlcl9yZXNvdXJjZXMgPSAxOwotCQkJcHMtPmZsYWdzLnZhbGlkID0gMTsKLQkJfQotCi0JCS8qIEV2YWx1YXRlICJfUFN4IiB0byBzZWUgaWYgd2UgY2FuIGRvIGV4cGxpY2l0IHNldHMgKi8KLQkJb2JqZWN0X25hbWVbMl0gPSAnUyc7Ci0JCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgb2JqZWN0X25hbWUsICZoYW5kbGUpOwotCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKLQkJCXBzLT5mbGFncy5leHBsaWNpdF9zZXQgPSAxOwotCQkJcHMtPmZsYWdzLnZhbGlkID0gMTsKLQkJfQotCi0JCS8qIFN0YXRlIGlzIHZhbGlkIGlmIHdlIGhhdmUgc29tZSBwb3dlciBjb250cm9sICovCi0JCWlmIChwcy0+cmVzb3VyY2VzLmNvdW50IHx8IHBzLT5mbGFncy5leHBsaWNpdF9zZXQpCi0JCQlwcy0+ZmxhZ3MudmFsaWQgPSAxOwotCi0JCXBzLT5wb3dlciA9IC0xOwkvKiBVbmtub3duIC0gZHJpdmVyIGFzc2lnbmVkICovCi0JCXBzLT5sYXRlbmN5ID0gLTE7CS8qIFVua25vd24gLSBkcml2ZXIgYXNzaWduZWQgKi8KLQl9Ci0KLQkvKiBTZXQgZGVmYXVsdHMgZm9yIEQwIGFuZCBEMyBzdGF0ZXMgKGFsd2F5cyB2YWxpZCkgKi8KLQlkZXZpY2UtPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0QwXS5mbGFncy52YWxpZCA9IDE7Ci0JZGV2aWNlLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9EMF0ucG93ZXIgPSAxMDA7Ci0JZGV2aWNlLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9EM10uZmxhZ3MudmFsaWQgPSAxOwotCWRldmljZS0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfRDNdLnBvd2VyID0gMDsKLQotCS8qIFRCRDogU3lzdGVtIHdha2Ugc3VwcG9ydCBhbmQgcmVzb3VyY2UgcmVxdWlyZW1lbnRzLiAqLwotCi0JZGV2aWNlLT5wb3dlci5zdGF0ZSA9IEFDUElfU1RBVEVfVU5LTk9XTjsKLQotCXJldHVybiAwOwotfQotCiBpbnQgYWNwaV9tYXRjaF9pZHMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGNoYXIgKmlkcykKIHsKIAlpZiAoZGV2aWNlLT5mbGFncy5oYXJkd2FyZV9pZCkKQEAgLTI1NCw2ICs1NjMsMTIgQEAKIAlyZXR1cm4gLUVOT0VOVDsKIH0KIAorc3RhdGljIGludCBhY3BpX2J1c19nZXRfcGVyZl9mbGFncyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlkZXZpY2UtPnBlcmZvcm1hbmNlLnN0YXRlID0gQUNQSV9TVEFURV9VTktOT1dOOworCXJldHVybiAwOworfQorCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfYnVzX2V4dHJhY3Rfd2FrZXVwX2RldmljZV9wb3dlcl9wYWNrYWdlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAogCQkJCQkgICAgIHVuaW9uIGFjcGlfb2JqZWN0ICpwYWNrYWdlKQpAQCAtMzM4LDM2MCArNjUzLDY3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUFDUEkgc3lzZnMgZGV2aWNlIGZpbGUgc3VwcG9ydAotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXN0YXRpYyBzc2l6ZV90IGFjcGlfZWplY3Rfc3RvcmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwotCi0jZGVmaW5lIEFDUElfREVWSUNFX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKSBcCi1zdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2F0dHJpYnV0ZSBhY3BpX2RldmljZV9hdHRyXyMjX25hbWUgPSBcCi0JCV9fQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCi0KLUFDUElfREVWSUNFX0FUVFIoZWplY3QsIDAyMDAsIE5VTEwsIGFjcGlfZWplY3Rfc3RvcmUpOwotCi0vKioKLSAqIHNldHVwX3N5c19mc19kZXZpY2VfZmlsZXMgLSBzZXRzIHVwIHRoZSBkZXZpY2UgZmlsZXMgdW5kZXIgZGV2aWNlIG5hbWVzcGFjZQotICogQGRldjoJYWNwaV9kZXZpY2Ugb2JqZWN0Ci0gKiBAZnVuYzoJZnVuY3Rpb24gcG9pbnRlciB0byBjcmVhdGUgb3IgZGVzdHJveSB0aGUgZGV2aWNlIGZpbGUKLSAqLwotc3RhdGljIHZvaWQKLXNldHVwX3N5c19mc19kZXZpY2VfZmlsZXMoc3RydWN0IGFjcGlfZGV2aWNlICpkZXYsCi0JCQkgIGFjcGlfZGV2aWNlX3N5c2ZzX2ZpbGVzICogZnVuYykKK3N0YXRpYyBpbnQgYWNwaV9idXNfZ2V0X3Bvd2VyX2ZsYWdzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX2hhbmRsZSB0ZW1wID0gTlVMTDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCWFjcGlfaGFuZGxlIGhhbmRsZSA9IE5VTEw7CisJdTMyIGkgPSAwOworCiAKIAkvKgotCSAqIElmIGRldmljZSBoYXMgX0VKMCwgJ2VqZWN0JyBmaWxlIGlzIGNyZWF0ZWQgdGhhdCBpcyB1c2VkIHRvIHRyaWdnZXIKLQkgKiBob3QtcmVtb3ZhbCBmdW5jdGlvbiBmcm9tIHVzZXJsYW5kLgorCSAqIFBvd2VyIE1hbmFnZW1lbnQgRmxhZ3MKIAkgKi8KLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoZGV2LT5oYW5kbGUsICJfRUowIiwgJnRlbXApOworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9QU0MiLCAmaGFuZGxlKTsKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCi0JCSgqKGZ1bmMpKSAoJmRldi0+a29iaiwgJmFjcGlfZGV2aWNlX2F0dHJfZWplY3QuYXR0cik7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9lamVjdF9vcGVyYXRpb24oYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgbG9ja2FibGUpCi17Ci0Jc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3Q7Ci0JdW5pb24gYWNwaV9vYmplY3QgYXJnOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOworCQlkZXZpY2UtPnBvd2VyLmZsYWdzLmV4cGxpY2l0X2dldCA9IDE7CisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX0lSQyIsICZoYW5kbGUpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJZGV2aWNlLT5wb3dlci5mbGFncy5pbnJ1c2hfY3VycmVudCA9IDE7CiAKIAkvKgotCSAqIFRCRDogZXZhbHVhdGUgX1BTMz8KKwkgKiBFbnVtZXJhdGUgc3VwcG9ydGVkIHBvd2VyIG1hbmFnZW1lbnQgc3RhdGVzCiAJICovCisJZm9yIChpID0gQUNQSV9TVEFURV9EMDsgaSA8PSBBQ1BJX1NUQVRFX0QzOyBpKyspIHsKKwkJc3RydWN0IGFjcGlfZGV2aWNlX3Bvd2VyX3N0YXRlICpwcyA9ICZkZXZpY2UtPnBvd2VyLnN0YXRlc1tpXTsKKwkJY2hhciBvYmplY3RfbmFtZVs1XSA9IHsgJ18nLCAnUCcsICdSJywgJzAnICsgaSwgJ1wwJyB9OwogCi0JaWYgKGxvY2thYmxlKSB7Ci0JCWFyZ19saXN0LmNvdW50ID0gMTsKLQkJYXJnX2xpc3QucG9pbnRlciA9ICZhcmc7Ci0JCWFyZy50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7Ci0JCWFyZy5pbnRlZ2VyLnZhbHVlID0gMDsKLQkJYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX0xDSyIsICZhcmdfbGlzdCwgTlVMTCk7Ci0JfQotCi0JYXJnX2xpc3QuY291bnQgPSAxOwotCWFyZ19saXN0LnBvaW50ZXIgPSAmYXJnOwotCWFyZy50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7Ci0JYXJnLmludGVnZXIudmFsdWUgPSAxOwotCi0JLyoKLQkgKiBUQkQ6IF9FSkQgc3VwcG9ydC4KLQkgKi8KLQotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgIl9FSjAiLCAmYXJnX2xpc3QsIE5VTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKC1FTk9ERVYpOwotCX0KLQotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1hY3BpX2VqZWN0X3N0b3JlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgcmVzdWx0OwotCWludCByZXQgPSBjb3VudDsKLQlpbnQgaXNsb2NrYWJsZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0JYWNwaV9oYW5kbGUgaGFuZGxlOwotCWFjcGlfb2JqZWN0X3R5cGUgdHlwZSA9IDA7Ci0KLQlpZiAoKCFjb3VudCkgfHwgKGJ1ZlswXSAhPSAnMScpKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLSNpZm5kZWYgRk9SQ0VfRUpFQ1QKLQlpZiAoZGV2aWNlLT5kcml2ZXIgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKLQl9Ci0jZW5kaWYKLQlzdGF0dXMgPSBhY3BpX2dldF90eXBlKGRldmljZS0+aGFuZGxlLCAmdHlwZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICghZGV2aWNlLT5mbGFncy5lamVjdGFibGUpKSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlzbG9ja2FibGUgPSBkZXZpY2UtPmZsYWdzLmxvY2thYmxlOwotCWhhbmRsZSA9IGRldmljZS0+aGFuZGxlOwotCi0JcmVzdWx0ID0gYWNwaV9idXNfdHJpbShkZXZpY2UsIDEpOwotCi0JaWYgKCFyZXN1bHQpCi0JCXJlc3VsdCA9IGFjcGlfZWplY3Rfb3BlcmF0aW9uKGhhbmRsZSwgaXNsb2NrYWJsZSk7Ci0KLQlpZiAocmVzdWx0KSB7Ci0JCXJldCA9IC1FQlVTWTsKLQl9Ci0gICAgICBlcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlIE1hbmFnZW1lbnQKLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQgYWNwaV9idXNfZ2V0X3BlcmZfZmxhZ3Moc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JZGV2aWNlLT5wZXJmb3JtYW5jZS5zdGF0ZSA9IEFDUElfU1RBVEVfVU5LTk9XTjsKLQlyZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBNYW5hZ2VtZW50Ci0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgTElTVF9IRUFEKGFjcGlfYnVzX2RyaXZlcnMpOwotCi0vKioKLSAqIGFjcGlfYnVzX21hdGNoIC0gbWF0Y2ggZGV2aWNlIElEcyB0byBkcml2ZXIncyBzdXBwb3J0ZWQgSURzCi0gKiBAZGV2aWNlOiB0aGUgZGV2aWNlIHRoYXQgd2UgYXJlIHRyeWluZyB0byBtYXRjaCB0byBhIGRyaXZlcgotICogQGRyaXZlcjogZHJpdmVyIHdob3NlIGRldmljZSBpZCB0YWJsZSBpcyBiZWluZyBjaGVja2VkCi0gKgotICogQ2hlY2tzIHRoZSBkZXZpY2UncyBoYXJkd2FyZSAoX0hJRCkgb3IgY29tcGF0aWJsZSAoX0NJRCkgaWRzIHRvIHNlZSBpZiBpdAotICogbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGRyaXZlcidzIGNyaXRlcmlhLgotICovCi1zdGF0aWMgaW50Ci1hY3BpX2J1c19tYXRjaChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpCi17Ci0JaWYgKGRyaXZlciAmJiBkcml2ZXItPm9wcy5tYXRjaCkKLQkJcmV0dXJuIGRyaXZlci0+b3BzLm1hdGNoKGRldmljZSwgZHJpdmVyKTsKLQlyZXR1cm4gYWNwaV9tYXRjaF9pZHMoZGV2aWNlLCBkcml2ZXItPmlkcyk7Ci19Ci0KLS8qKgotICogYWNwaV9idXNfZHJpdmVyX2luaXQgLSBhZGQgYSBkZXZpY2UgdG8gYSBkcml2ZXIKLSAqIEBkZXZpY2U6IHRoZSBkZXZpY2UgdG8gYWRkIGFuZCBpbml0aWFsaXplCi0gKiBAZHJpdmVyOiBkcml2ZXIgZm9yIHRoZSBkZXZpY2UKLSAqCi0gKiBVc2VkIHRvIGluaXRpYWxpemUgYSBkZXZpY2UgdmlhIGl0cyBkZXZpY2UgZHJpdmVyLiAgQ2FsbGVkIHdoZW5ldmVyIGEgCi0gKiBkcml2ZXIgaXMgYm91bmQgdG8gYSBkZXZpY2UuICBJbnZva2VzIHRoZSBkcml2ZXIncyBhZGQoKSBhbmQgc3RhcnQoKSBvcHMuCi0gKi8KLXN0YXRpYyBpbnQKLWFjcGlfYnVzX2RyaXZlcl9pbml0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcikKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCi0JaWYgKCFkZXZpY2UgfHwgIWRyaXZlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIWRyaXZlci0+b3BzLmFkZCkKLQkJcmV0dXJuIC1FTk9TWVM7Ci0KLQlyZXN1bHQgPSBkcml2ZXItPm9wcy5hZGQoZGV2aWNlKTsKLQlpZiAocmVzdWx0KSB7Ci0JCWRldmljZS0+ZHJpdmVyID0gTlVMTDsKLQkJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gTlVMTDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlkZXZpY2UtPmRyaXZlciA9IGRyaXZlcjsKLQotCS8qCi0JICogVEJEIC0gQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50OiBBc3NpZ24gcmVzb3VyY2VzIHRvIGRldmljZSBiYXNlZAotCSAqIHVwb24gcG9zc2libGUgY29uZmlndXJhdGlvbiBhbmQgY3VycmVudGx5IGFsbG9jYXRlZCByZXNvdXJjZXMuCi0JICovCi0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkgICJEcml2ZXIgc3VjY2Vzc2Z1bGx5IGJvdW5kIHRvIGRldmljZVxuIikpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcjsKLQotCi0JaWYgKCEoZHJpdmVyID0gZGV2aWNlLT5kcml2ZXIpKQotCQlyZXR1cm4gMDsKLQotCWlmIChkcml2ZXItPm9wcy5zdGFydCkgewotCQlyZXN1bHQgPSBkcml2ZXItPm9wcy5zdGFydChkZXZpY2UpOwotCQlpZiAocmVzdWx0ICYmIGRyaXZlci0+b3BzLnJlbW92ZSkKLQkJCWRyaXZlci0+b3BzLnJlbW92ZShkZXZpY2UsIEFDUElfQlVTX1JFTU9WQUxfTk9STUFMKTsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX2RyaXZlcl9hdHRhY2goc3RydWN0IGFjcGlfZHJpdmVyICpkcnYpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7Ci0KLQotCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX2RldmljZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0KLQkJICAgIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIGdfbGlzdCk7Ci0KLQkJaWYgKGRldi0+ZHJpdmVyIHx8ICFkZXYtPnN0YXR1cy5wcmVzZW50KQotCQkJY29udGludWU7Ci0JCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQotCQlpZiAoIWFjcGlfYnVzX21hdGNoKGRldiwgZHJ2KSkgewotCQkJaWYgKCFhY3BpX2J1c19kcml2ZXJfaW5pdChkZXYsIGRydikpIHsKLQkJCQlhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoZGV2KTsKLQkJCQlhdG9taWNfaW5jKCZkcnYtPnJlZmVyZW5jZXMpOwotCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkJCSAgIkZvdW5kIGRyaXZlciBbJXNdIGZvciBkZXZpY2UgWyVzXVxuIiwKLQkJCQkJCSAgZHJ2LT5uYW1lLCBkZXYtPnBucC5idXNfaWQpKTsKLQkJCX0KKwkJLyogRXZhbHVhdGUgIl9QUngiIHRvIHNlIGlmIHBvd2VyIHJlc291cmNlcyBhcmUgcmVmZXJlbmNlZCAqLworCQlhY3BpX2V2YWx1YXRlX3JlZmVyZW5jZShkZXZpY2UtPmhhbmRsZSwgb2JqZWN0X25hbWUsIE5VTEwsCisJCQkJCSZwcy0+cmVzb3VyY2VzKTsKKwkJaWYgKHBzLT5yZXNvdXJjZXMuY291bnQpIHsKKwkJCWRldmljZS0+cG93ZXIuZmxhZ3MucG93ZXJfcmVzb3VyY2VzID0gMTsKKwkJCXBzLT5mbGFncy52YWxpZCA9IDE7CiAJCX0KLQkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotfQogCi1zdGF0aWMgdm9pZCBhY3BpX2RyaXZlcl9kZXRhY2goc3RydWN0IGFjcGlfZHJpdmVyICpkcnYpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7Ci0KLQotCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX2RldmljZV9saXN0KSB7Ci0JCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0KLQkJICAgIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIGdfbGlzdCk7Ci0KLQkJaWYgKGRldi0+ZHJpdmVyID09IGRydikgewotCQkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCQkJaWYgKGRydi0+b3BzLnJlbW92ZSkKLQkJCQlkcnYtPm9wcy5yZW1vdmUoZGV2LCBBQ1BJX0JVU19SRU1PVkFMX05PUk1BTCk7Ci0JCQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCQkJZGV2LT5kcml2ZXIgPSBOVUxMOwotCQkJZGV2LT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCQlhdG9taWNfZGVjKCZkcnYtPnJlZmVyZW5jZXMpOworCQkvKiBFdmFsdWF0ZSAiX1BTeCIgdG8gc2VlIGlmIHdlIGNhbiBkbyBleHBsaWNpdCBzZXRzICovCisJCW9iamVjdF9uYW1lWzJdID0gJ1MnOworCQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsIG9iamVjdF9uYW1lLCAmaGFuZGxlKTsKKwkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCQlwcy0+ZmxhZ3MuZXhwbGljaXRfc2V0ID0gMTsKKwkJCXBzLT5mbGFncy52YWxpZCA9IDE7CiAJCX0KKworCQkvKiBTdGF0ZSBpcyB2YWxpZCBpZiB3ZSBoYXZlIHNvbWUgcG93ZXIgY29udHJvbCAqLworCQlpZiAocHMtPnJlc291cmNlcy5jb3VudCB8fCBwcy0+ZmxhZ3MuZXhwbGljaXRfc2V0KQorCQkJcHMtPmZsYWdzLnZhbGlkID0gMTsKKworCQlwcy0+cG93ZXIgPSAtMTsJLyogVW5rbm93biAtIGRyaXZlciBhc3NpZ25lZCAqLworCQlwcy0+bGF0ZW5jeSA9IC0xOwkvKiBVbmtub3duIC0gZHJpdmVyIGFzc2lnbmVkICovCiAJfQotCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLX0KIAotLyoqCi0gKiBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIgLSByZWdpc3RlciBhIGRyaXZlciB3aXRoIHRoZSBBQ1BJIGJ1cwotICogQGRyaXZlcjogZHJpdmVyIGJlaW5nIHJlZ2lzdGVyZWQKLSAqCi0gKiBSZWdpc3RlcnMgYSBkcml2ZXIgd2l0aCB0aGUgQUNQSSBidXMuICBTZWFyY2hlcyB0aGUgbmFtZXNwYWNlIGZvciBhbGwKLSAqIGRldmljZXMgdGhhdCBtYXRjaCB0aGUgZHJpdmVyJ3MgY3JpdGVyaWEgYW5kIGJpbmRzLiAgUmV0dXJucyB6ZXJvIGZvcgotICogc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIHN0YXR1cyBmb3IgZmFpbHVyZS4KLSAqLwotaW50IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcikKLXsKKwkvKiBTZXQgZGVmYXVsdHMgZm9yIEQwIGFuZCBEMyBzdGF0ZXMgKGFsd2F5cyB2YWxpZCkgKi8KKwlkZXZpY2UtPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0QwXS5mbGFncy52YWxpZCA9IDE7CisJZGV2aWNlLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9EMF0ucG93ZXIgPSAxMDA7CisJZGV2aWNlLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9EM10uZmxhZ3MudmFsaWQgPSAxOworCWRldmljZS0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfRDNdLnBvd2VyID0gMDsKIAotCWlmIChhY3BpX2Rpc2FibGVkKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBUQkQ6IFN5c3RlbSB3YWtlIHN1cHBvcnQgYW5kIHJlc291cmNlIHJlcXVpcmVtZW50cy4gKi8KIAotCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmZHJpdmVyLT5ub2RlLCAmYWNwaV9idXNfZHJpdmVycyk7Ci0Jc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCWFjcGlfZHJpdmVyX2F0dGFjaChkcml2ZXIpOworCWRldmljZS0+cG93ZXIuc3RhdGUgPSBBQ1BJX1NUQVRFX1VOS05PV047CiAKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIpOwotCi0vKioKLSAqIGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyIC0gdW5yZWdpc3RlcnMgYSBkcml2ZXIgd2l0aCB0aGUgQVBJQyBidXMKLSAqIEBkcml2ZXI6IGRyaXZlciB0byB1bnJlZ2lzdGVyCi0gKgotICogVW5yZWdpc3RlcnMgYSBkcml2ZXIgd2l0aCB0aGUgQUNQSSBidXMuICBTZWFyY2hlcyB0aGUgbmFtZXNwYWNlIGZvciBhbGwKLSAqIGRldmljZXMgdGhhdCBtYXRjaCB0aGUgZHJpdmVyJ3MgY3JpdGVyaWEgYW5kIHVuYmluZHMuCi0gKi8KLXZvaWQgYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpCi17Ci0JYWNwaV9kcml2ZXJfZGV0YWNoKGRyaXZlcik7Ci0KLQlpZiAoIWF0b21pY19yZWFkKCZkcml2ZXItPnJlZmVyZW5jZXMpKSB7Ci0JCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JCWxpc3RfZGVsX2luaXQoJmRyaXZlci0+bm9kZSk7Ci0JCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQl9Ci0JcmV0dXJuOwotfQotCi1FWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKTsKLQotLyoqCi0gKiBhY3BpX2J1c19maW5kX2RyaXZlciAtIGNoZWNrIGlmIHRoZXJlIGlzIGEgZHJpdmVyIGluc3RhbGxlZCBmb3IgdGhlIGRldmljZQotICogQGRldmljZTogZGV2aWNlIHRoYXQgd2UgYXJlIHRyeWluZyB0byBmaW5kIGEgc3VwcG9ydGluZyBkcml2ZXIgZm9yCi0gKgotICogUGFyc2VzIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgZHJpdmVycyBsb29raW5nIGZvciBhIGRyaXZlciBhcHBsaWNhYmxlIGZvcgotICogdGhlIHNwZWNpZmllZCBkZXZpY2UuCi0gKi8KLXN0YXRpYyBpbnQgYWNwaV9idXNfZmluZF9kcml2ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7Ci0KLQotCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZhY3BpX2J1c19kcml2ZXJzKSB7Ci0JCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyID0KLQkJICAgIGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9kcml2ZXIsIG5vZGUpOwotCi0JCWF0b21pY19pbmMoJmRyaXZlci0+cmVmZXJlbmNlcyk7Ci0JCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQkJaWYgKCFhY3BpX2J1c19tYXRjaChkZXZpY2UsIGRyaXZlcikpIHsKLQkJCXJlc3VsdCA9IGFjcGlfYnVzX2RyaXZlcl9pbml0KGRldmljZSwgZHJpdmVyKTsKLQkJCWlmICghcmVzdWx0KQotCQkJCWdvdG8gRG9uZTsKLQkJfQotCQlhdG9taWNfZGVjKCZkcml2ZXItPnJlZmVyZW5jZXMpOwotCQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCX0KLQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0KLSAgICAgIERvbmU6Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZSBFbnVtZXJhdGlvbgotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfYnVzX2dldF9lamQoYWNwaV9oYW5kbGUgaGFuZGxlLCBhY3BpX2hhbmRsZSAqZWpkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlhY3BpX2hhbmRsZSB0bXA7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0JdW5pb24gYWNwaV9vYmplY3QgKm9iajsKLQotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfRUpEIiwgJnRtcCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlyZXR1cm4gc3RhdHVzOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX0VKRCIsIE5VTEwsICZidWZmZXIpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlvYmogPSBidWZmZXIucG9pbnRlcjsKLQkJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIG9iai0+c3RyaW5nLnBvaW50ZXIsIGVqZCk7Ci0JCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGFjcGlfYnVzX2dldF9lamQpOwotCi0KIHN0YXRpYyBpbnQgYWNwaV9idXNfZ2V0X2ZsYWdzKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwpAQCAtNzgyLDYgKzgwNCw3NSBAQAogCX0KIH0KIAorc3RhdGljIGludAorYWNwaV92aWRlb19idXNfbWF0Y2goc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJYWNwaV9oYW5kbGUgaF9kdW1teTE7CisJYWNwaV9oYW5kbGUgaF9kdW1teTI7CisJYWNwaV9oYW5kbGUgaF9kdW1teTM7CisKKworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNpbmNlIHRoZXJlIGlzIG5vIEhJRCwgQ0lEIGZvciBBQ1BJIFZpZGVvIGRyaXZlcnMsIHdlIGhhdmUKKwkgKiB0byBjaGVjayB3ZWxsIGtub3duIHJlcXVpcmVkIG5vZGVzIGZvciBlYWNoIGZlYXR1cmUgd2Ugc3VwcG9ydC4KKwkgKi8KKworCS8qIERvZXMgdGhpcyBkZXZpY2UgYWJsZSB0byBzdXBwb3J0IHZpZGVvIHN3aXRjaGluZyA/ICovCisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfRE9EIiwgJmhfZHVtbXkxKSkgJiYKKwkgICAgQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9ET1MiLCAmaF9kdW1teTIpKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBEb2VzIHRoaXMgZGV2aWNlIGFibGUgdG8gcmV0cmlldmUgYSB2aWRlbyBST00gPyAqLworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX1JPTSIsICZoX2R1bW15MSkpKQorCQlyZXR1cm4gMDsKKworCS8qIERvZXMgdGhpcyBkZXZpY2UgYWJsZSB0byBjb25maWd1cmUgd2hpY2ggdmlkZW8gaGVhZCB0byBiZSBQT1NUZWQgPyAqLworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX1ZQTyIsICZoX2R1bW15MSkpICYmCisJICAgIEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfR1BEIiwgJmhfZHVtbXkyKSkgJiYKKwkgICAgQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9TUEQiLCAmaF9kdW1teTMpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyoKKyAqIGFjcGlfYmF5X21hdGNoIC0gc2VlIGlmIGEgZGV2aWNlIGlzIGFuIGVqZWN0YWJsZSBkcml2ZXIgYmF5CisgKgorICogSWYgYW4gYWNwaSBvYmplY3QgaXMgZWplY3RhYmxlIGFuZCBoYXMgb25lIG9mIHRoZSBBQ1BJIEFUQSBtZXRob2RzIGRlZmluZWQsCisgKiB0aGVuIHdlIGNhbiBzYWZlbHkgY2FsbCBpdCBhbiBlamVjdGFibGUgZHJpdmUgYmF5CisgKi8KK3N0YXRpYyBpbnQgYWNwaV9iYXlfbWF0Y2goc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpeworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJYWNwaV9oYW5kbGUgdG1wOworCWFjcGlfaGFuZGxlIHBoYW5kbGU7CisKKwloYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfRUowIiwgJnRtcCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICgoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfR1RGIiwgJnRtcCkpKSB8fAorCQkoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfR1RNIiwgJnRtcCkpKSB8fAorCQkoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfU1RNIiwgJnRtcCkpKSB8fAorCQkoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShoYW5kbGUsICJfU0REIiwgJnRtcCkpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWNwaV9nZXRfcGFyZW50KGhhbmRsZSwgJnBoYW5kbGUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworICAgICAgICBpZiAoKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUocGhhbmRsZSwgIl9HVEYiLCAmdG1wKSkpIHx8CisgICAgICAgICAgICAgICAgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUocGhhbmRsZSwgIl9HVE0iLCAmdG1wKSkpIHx8CisgICAgICAgICAgICAgICAgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUocGhhbmRsZSwgIl9TVE0iLCAmdG1wKSkpIHx8CisgICAgICAgICAgICAgICAgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUocGhhbmRsZSwgIl9TREQiLCAmdG1wKSkpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKIHN0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX3NldF9pZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKIAkJCSAgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwgYWNwaV9oYW5kbGUgaGFuZGxlLAogCQkJICAgICAgIGludCB0eXBlKQpAQCAtODEyLDYgKzkwMywxNiBAQAogCQkJZGV2aWNlLT5wbnAuYnVzX2FkZHJlc3MgPSBpbmZvLT5hZGRyZXNzOwogCQkJZGV2aWNlLT5mbGFncy5idXNfYWRkcmVzcyA9IDE7CiAJCX0KKworCQlpZighKGluZm8tPnZhbGlkICYgKEFDUElfVkFMSURfSElEIHwgQUNQSV9WQUxJRF9DSUQpKSl7CisJCQlzdGF0dXMgPSBhY3BpX3ZpZGVvX2J1c19tYXRjaChkZXZpY2UpOworCQkJaWYoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCQkJaGlkID0gQUNQSV9WSURFT19ISUQ7CisKKwkJCXN0YXR1cyA9IGFjcGlfYmF5X21hdGNoKGRldmljZSk7CisJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCQkJaGlkID0gQUNQSV9CQVlfSElEOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9CVVNfVFlQRV9QT1dFUjoKIAkJaGlkID0gQUNQSV9QT1dFUl9ISUQ7CkBAIC04ODgsODYgKzk4OSwyNCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGFjcGlfZGV2aWNlX2dldF9kZWJ1Z19pbmZvKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAotCQkJCSAgICAgICBhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlKQotewotI2lmZGVmIENPTkZJR19BQ1BJX0RFQlVHX09VVFBVVAotCWNoYXIgKnR5cGVfc3RyaW5nID0gTlVMTDsKLQljaGFyIG5hbWVbODBdID0geyAnPycsICdcMCcgfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBzaXplb2YobmFtZSksIG5hbWUgfTsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQUNQSV9CVVNfVFlQRV9ERVZJQ0U6Ci0JCXR5cGVfc3RyaW5nID0gIkRldmljZSI7Ci0JCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwotCQlicmVhazsKLQljYXNlIEFDUElfQlVTX1RZUEVfUE9XRVI6Ci0JCXR5cGVfc3RyaW5nID0gIlBvd2VyIFJlc291cmNlIjsKLQkJYWNwaV9nZXRfbmFtZShoYW5kbGUsIEFDUElfRlVMTF9QQVRITkFNRSwgJmJ1ZmZlcik7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9CVVNfVFlQRV9QUk9DRVNTT1I6Ci0JCXR5cGVfc3RyaW5nID0gIlByb2Nlc3NvciI7Ci0JCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwotCQlicmVhazsKLQljYXNlIEFDUElfQlVTX1RZUEVfU1lTVEVNOgotCQl0eXBlX3N0cmluZyA9ICJTeXN0ZW0iOwotCQlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBBQ1BJX0JVU19UWVBFX1RIRVJNQUw6Ci0JCXR5cGVfc3RyaW5nID0gIlRoZXJtYWwgWm9uZSI7Ci0JCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwotCQlicmVhazsKLQljYXNlIEFDUElfQlVTX1RZUEVfUE9XRVJfQlVUVE9OOgotCQl0eXBlX3N0cmluZyA9ICJQb3dlciBCdXR0b24iOwotCQlzcHJpbnRmKG5hbWUsICJQV1JCIik7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9CVVNfVFlQRV9TTEVFUF9CVVRUT046Ci0JCXR5cGVfc3RyaW5nID0gIlNsZWVwIEJ1dHRvbiI7Ci0JCXNwcmludGYobmFtZSwgIlNMUEIiKTsKLQkJYnJlYWs7Ci0JfQotCi0JcHJpbnRrKEtFUk5fREVCVUcgIkZvdW5kICVzICVzIFslcF1cbiIsIHR5cGVfc3RyaW5nLCBuYW1lLCBoYW5kbGUpOwotI2VuZGlmCQkJCS8qQ09ORklHX0FDUElfREVCVUdfT1VUUFVUICovCi19Ci0KIHN0YXRpYyBpbnQgYWNwaV9idXNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2LCBpbnQgcm1kZXZpY2UpCiB7Ci0JaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXI7Ci0KLQogCWlmICghZGV2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRyaXZlciA9IGRldi0+ZHJpdmVyOwotCi0JaWYgKChkcml2ZXIpICYmIChkcml2ZXItPm9wcy5yZW1vdmUpKSB7Ci0KLQkJaWYgKGRyaXZlci0+b3BzLnN0b3ApIHsKLQkJCXJlc3VsdCA9IGRyaXZlci0+b3BzLnN0b3AoZGV2LCBBQ1BJX0JVU19SRU1PVkFMX0VKRUNUKTsKLQkJCWlmIChyZXN1bHQpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJlc3VsdCA9IGRldi0+ZHJpdmVyLT5vcHMucmVtb3ZlKGRldiwgQUNQSV9CVVNfUkVNT1ZBTF9FSkVDVCk7Ci0JCWlmIChyZXN1bHQpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlhdG9taWNfZGVjKCZkZXYtPmRyaXZlci0+cmVmZXJlbmNlcyk7Ci0JCWRldi0+ZHJpdmVyID0gTlVMTDsKLQkJYWNwaV9kcml2ZXJfZGF0YShkZXYpID0gTlVMTDsKLQl9CisJZGV2LT5yZW1vdmFsX3R5cGUgPSBBQ1BJX0JVU19SRU1PVkFMX0VKRUNUOworCWRldmljZV9yZWxlYXNlX2RyaXZlcigmZGV2LT5kZXYpOwogCiAJaWYgKCFybWRldmljZSkKIAkJcmV0dXJuIDA7CiAKKwkvKgorCSAqIHVuYmluZCBfQURSLUJhc2VkIERldmljZXMgd2hlbiBob3QgcmVtb3ZhbAorCSAqLwogCWlmIChkZXYtPmZsYWdzLmJ1c19hZGRyZXNzKSB7CiAJCWlmICgoZGV2LT5wYXJlbnQpICYmIChkZXYtPnBhcmVudC0+b3BzLnVuYmluZCkpCiAJCQlkZXYtPnBhcmVudC0+b3BzLnVuYmluZChkZXYpOwogCX0KLQogCWFjcGlfZGV2aWNlX3VucmVnaXN0ZXIoZGV2LCBBQ1BJX0JVU19SRU1PVkFMX0VKRUNUKTsKIAogCXJldHVybiAwOwpAQCAtOTc1LDcgKzEwMTQsOCBAQAogCiBzdGF0aWMgaW50CiBhY3BpX2FkZF9zaW5nbGVfb2JqZWN0KHN0cnVjdCBhY3BpX2RldmljZSAqKmNoaWxkLAotCQkgICAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnQsIGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpCisJCSAgICAgICBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwgYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSwKKwkJCXN0cnVjdCBhY3BpX2J1c19vcHMgKm9wcykKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CkBAIC05OTIsNiArMTAzMiw4IEBACiAKIAlkZXZpY2UtPmhhbmRsZSA9IGhhbmRsZTsKIAlkZXZpY2UtPnBhcmVudCA9IHBhcmVudDsKKwlkZXZpY2UtPmJ1c19vcHMgPSAqb3BzOyAvKiB3b3Jrcm91bmQgZm9yIG5vdCBjYWxsIC5zdGFydCAqLworCiAKIAlhY3BpX2RldmljZV9nZXRfYnVzaWQoZGV2aWNlLCBoYW5kbGUsIHR5cGUpOwogCkBAIC0xMDc2LDMzICsxMTE4LDE2IEBACiAJaWYgKChyZXN1bHQgPSBhY3BpX2RldmljZV9zZXRfY29udGV4dChkZXZpY2UsIHR5cGUpKSkKIAkJZ290byBlbmQ7CiAKLQlhY3BpX2RldmljZV9nZXRfZGVidWdfaW5mbyhkZXZpY2UsIGhhbmRsZSwgdHlwZSk7Ci0KLQlhY3BpX2RldmljZV9yZWdpc3RlcihkZXZpY2UsIHBhcmVudCk7CisJcmVzdWx0ID0gYWNwaV9kZXZpY2VfcmVnaXN0ZXIoZGV2aWNlLCBwYXJlbnQpOwogCiAJLyoKLQkgKiBCaW5kIF9BRFItQmFzZWQgRGV2aWNlcwotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICogSWYgdGhlcmUncyBhIGEgYnVzIGFkZHJlc3MgKF9BRFIpIHRoZW4gd2UgdXRpbGl6ZSB0aGUgcGFyZW50J3MgCi0JICogJ2JpbmQnIGZ1bmN0aW9uIChpZiBleGlzdHMpIHRvIGJpbmQgdGhlIEFDUEktIGFuZCBuYXRpdmVseS0KLQkgKiBlbnVtZXJhdGVkIGRldmljZSByZXByZXNlbnRhdGlvbnMuCisJICogQmluZCBfQURSLUJhc2VkIERldmljZXMgd2hlbiBob3QgYWRkCiAJICovCiAJaWYgKGRldmljZS0+ZmxhZ3MuYnVzX2FkZHJlc3MpIHsKIAkJaWYgKGRldmljZS0+cGFyZW50ICYmIGRldmljZS0+cGFyZW50LT5vcHMuYmluZCkKIAkJCWRldmljZS0+cGFyZW50LT5vcHMuYmluZChkZXZpY2UpOwogCX0KIAotCS8qCi0JICogTG9jYXRlICYgQXR0YWNoIERyaXZlcgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiBJZiB0aGVyZSdzIGEgaGFyZHdhcmUgaWQgKF9ISUQpIG9yIGNvbXBhdGlibGUgaWRzIChfQ0lEKSB3ZSBjaGVjawotCSAqIHRvIHNlZSBpZiB0aGVyZSdzIGEgZHJpdmVyIGluc3RhbGxlZCBmb3IgdGhpcyBraW5kIG9mIGRldmljZS4gIE5vdGUKLQkgKiB0aGF0IGRyaXZlcnMgY2FuIGluc3RhbGwgYmVmb3JlIG9yIGFmdGVyIGEgZGV2aWNlIGlzIGVudW1lcmF0ZWQuCi0JICoKLQkgKiBUQkQ6IEFzc3VtZXMgTERNIHByb3ZpZGVzIGRyaXZlciBob3QtcGx1ZyBjYXBhYmlsaXR5LgotCSAqLwotCWFjcGlfYnVzX2ZpbmRfZHJpdmVyKGRldmljZSk7Ci0KICAgICAgIGVuZDoKIAlpZiAoIXJlc3VsdCkKIAkJKmNoaWxkID0gZGV2aWNlOwpAQCAtMTE4OCwxNCArMTIxMywxNCBAQAogCiAJCWlmIChvcHMtPmFjcGlfb3BfYWRkKQogCQkJc3RhdHVzID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmY2hpbGQsIHBhcmVudCwKLQkJCQkJCQljaGFuZGxlLCB0eXBlKTsKKwkJCQljaGFuZGxlLCB0eXBlLCBvcHMpOwogCQllbHNlCiAJCQlzdGF0dXMgPSBhY3BpX2J1c19nZXRfZGV2aWNlKGNoYW5kbGUsICZjaGlsZCk7CiAKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJY29udGludWU7CiAKLQkJaWYgKG9wcy0+YWNwaV9vcF9zdGFydCkgeworCQlpZiAob3BzLT5hY3BpX29wX3N0YXJ0ICYmICEob3BzLT5hY3BpX29wX2FkZCkpIHsKIAkJCXN0YXR1cyA9IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChjaGlsZCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQkJY29udGludWU7CkBAIC0xMjMzLDEzICsxMjU4LDEzIEBACiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgYWNwaV9idXNfb3BzIG9wczsKIAorCW1lbXNldCgmb3BzLCAwLCBzaXplb2Yob3BzKSk7CisJb3BzLmFjcGlfb3BfYWRkID0gMTsKIAotCXJlc3VsdCA9IGFjcGlfYWRkX3NpbmdsZV9vYmplY3QoY2hpbGQsIHBhcmVudCwgaGFuZGxlLCB0eXBlKTsKLQlpZiAoIXJlc3VsdCkgewotCQltZW1zZXQoJm9wcywgMCwgc2l6ZW9mKG9wcykpOwotCQlvcHMuYWNwaV9vcF9hZGQgPSAxOworCXJlc3VsdCA9IGFjcGlfYWRkX3NpbmdsZV9vYmplY3QoY2hpbGQsIHBhcmVudCwgaGFuZGxlLCB0eXBlLCAmb3BzKTsKKwlpZiAoIXJlc3VsdCkKIAkJcmVzdWx0ID0gYWNwaV9idXNfc2NhbigqY2hpbGQsICZvcHMpOwotCX0KKwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTEzMjUsMTI3ICsxMzUwLDM1IEBACiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwotCisJc3RydWN0IGFjcGlfYnVzX29wcyBvcHM7CiAKIAlpZiAoIXJvb3QpCiAJCXJldHVybiAtRU5PREVWOwogCisJbWVtc2V0KCZvcHMsIDAsIHNpemVvZihvcHMpKTsKKwlvcHMuYWNwaV9vcF9hZGQgPSAxOworCW9wcy5hY3BpX29wX3N0YXJ0ID0gMTsKKwogCS8qCiAJICogRW51bWVyYXRlIGFsbCBmaXhlZC1mZWF0dXJlIGRldmljZXMuCiAJICovCi0JaWYgKGFjcGlfZmFkdC5wd3JfYnV0dG9uID09IDApIHsKKwlpZiAoKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfUE9XRVJfQlVUVE9OKSA9PSAwKSB7CiAJCXJlc3VsdCA9IGFjcGlfYWRkX3NpbmdsZV9vYmplY3QoJmRldmljZSwgYWNwaV9yb290LAogCQkJCQkJTlVMTCwKLQkJCQkJCUFDUElfQlVTX1RZUEVfUE9XRVJfQlVUVE9OKTsKLQkJaWYgKCFyZXN1bHQpCi0JCQlyZXN1bHQgPSBhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoZGV2aWNlKTsKKwkJCQkJCUFDUElfQlVTX1RZUEVfUE9XRVJfQlVUVE9OLAorCQkJCQkJJm9wcyk7CiAJfQogCi0JaWYgKGFjcGlfZmFkdC5zbGVlcF9idXR0b24gPT0gMCkgeworCWlmICgoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF9TTEVFUF9CVVRUT04pID09IDApIHsKIAkJcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmZGV2aWNlLCBhY3BpX3Jvb3QsCiAJCQkJCQlOVUxMLAotCQkJCQkJQUNQSV9CVVNfVFlQRV9TTEVFUF9CVVRUT04pOwotCQlpZiAoIXJlc3VsdCkKLQkJCXJlc3VsdCA9IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChkZXZpY2UpOworCQkJCQkJQUNQSV9CVVNfVFlQRV9TTEVFUF9CVVRUT04sCisJCQkJCQkmb3BzKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGFjcGlfZGV2aWNlICogdG9fYWNwaV9kZXYoc3RydWN0IGRldmljZSAqIGRldikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGFjcGlfZGV2aWNlLCBkZXYpOwotfQotCi0KLXN0YXRpYyBpbnQgcm9vdF9zdXNwZW5kKHN0cnVjdCBhY3BpX2RldmljZSAqIGFjcGlfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICogZGV2LCAqIG5leHQ7Ci0JaW50IHJlc3VsdDsKLQotCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoZGV2LCBuZXh0LCAmYWNwaV9kZXZpY2VfbGlzdCwgZ19saXN0KSB7Ci0JCWlmIChkZXYtPmRyaXZlciAmJiBkZXYtPmRyaXZlci0+b3BzLnN1c3BlbmQpIHsKLQkJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQkJCXJlc3VsdCA9IGRldi0+ZHJpdmVyLT5vcHMuc3VzcGVuZChkZXYsIDApOwotCQkJaWYgKHJlc3VsdCkgewotCQkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlslcyAtICVzXSBTdXNwZW5kIGZhaWxlZDogJWRcbiIsCi0JCQkJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2KSwKLQkJCQkgICAgICAgYWNwaV9kZXZpY2VfYmlkKGRldiksIHJlc3VsdCk7Ci0JCQl9Ci0JCQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGFjcGlfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBhY3BpX2RldmljZSAqIGFjcGlfZGV2ID0gdG9fYWNwaV9kZXYoZGV2KTsKLQotCS8qCi0JICogRm9yIG5vdywgd2Ugc2hvdWxkIG9ubHkgcmVnaXN0ZXIgMSBnZW5lcmljIGRldmljZSAtCi0JICogdGhlIEFDUEkgcm9vdCBkZXZpY2UgLSBhbmQgZnJvbSB0aGVyZSwgd2Ugd2FsayB0aGUKLQkgKiB0cmVlIG9mIEFDUEkgZGV2aWNlcyB0byBzdXNwZW5kIGVhY2ggb25lIHVzaW5nIHRoZQotCSAqIEFDUEkgZHJpdmVyIG1ldGhvZHMuCi0JICovCi0JaWYgKGFjcGlfZGV2LT5oYW5kbGUgPT0gQUNQSV9ST09UX09CSkVDVCkKLQkJcm9vdF9zdXNwZW5kKGFjcGlfZGV2LCBzdGF0ZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgaW50IHJvb3RfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqIGFjcGlfZGV2KQotewotCXN0cnVjdCBhY3BpX2RldmljZSAqIGRldiwgKiBuZXh0OwotCWludCByZXN1bHQ7Ci0KLQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIG5leHQsICZhY3BpX2RldmljZV9saXN0LCBnX2xpc3QpIHsKLQkJaWYgKGRldi0+ZHJpdmVyICYmIGRldi0+ZHJpdmVyLT5vcHMucmVzdW1lKSB7Ci0JCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JCQlyZXN1bHQgPSBkZXYtPmRyaXZlci0+b3BzLnJlc3VtZShkZXYsIDApOwotCQkJaWYgKHJlc3VsdCkgewotCQkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIlslcyAtICVzXSByZXN1bWUgZmFpbGVkOiAlZFxuIiwKLQkJCQkgICAgICAgYWNwaV9kZXZpY2VfbmFtZShkZXYpLAotCQkJCSAgICAgICBhY3BpX2RldmljZV9iaWQoZGV2KSwgcmVzdWx0KTsKLQkJCX0KLQkJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgYWNwaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKiBkZXYpCi17Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICogYWNwaV9kZXYgPSB0b19hY3BpX2RldihkZXYpOwotCi0JLyoKLQkgKiBGb3Igbm93LCB3ZSBzaG91bGQgb25seSByZWdpc3RlciAxIGdlbmVyaWMgZGV2aWNlIC0KLQkgKiB0aGUgQUNQSSByb290IGRldmljZSAtIGFuZCBmcm9tIHRoZXJlLCB3ZSB3YWxrIHRoZQotCSAqIHRyZWUgb2YgQUNQSSBkZXZpY2VzIHRvIHJlc3VtZSBlYWNoIG9uZSB1c2luZyB0aGUKLQkgKiBBQ1BJIGRyaXZlciBtZXRob2RzLgotCSAqLwotCWlmIChhY3BpX2Rldi0+aGFuZGxlID09IEFDUElfUk9PVF9PQkpFQ1QpCi0JCXJvb3RfcmVzdW1lKGFjcGlfZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgc3RydWN0IGJ1c190eXBlIGFjcGlfYnVzX3R5cGUgPSB7Ci0JLm5hbWUJCT0gImFjcGkiLAotCS5zdXNwZW5kCT0gYWNwaV9kZXZpY2Vfc3VzcGVuZCwKLQkucmVzdW1lCQk9IGFjcGlfZGV2aWNlX3Jlc3VtZSwKLX07Ci0KLQotCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3NjYW5faW5pdCh2b2lkKQogewogCWludCByZXN1bHQ7CkBAIC0xNDU1LDkgKzEzODgsOSBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gMDsKIAotCXJlc3VsdCA9IGtzZXRfcmVnaXN0ZXIoJmFjcGlfbmFtZXNwYWNlX2tzZXQpOwotCWlmIChyZXN1bHQgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJrc2V0X3JlZ2lzdGVyIGVycm9yOiAlZFxuIiwgcmVzdWx0KTsKKwltZW1zZXQoJm9wcywgMCwgc2l6ZW9mKG9wcykpOworCW9wcy5hY3BpX29wX2FkZCA9IDE7CisJb3BzLmFjcGlfb3Bfc3RhcnQgPSAxOwogCiAJcmVzdWx0ID0gYnVzX3JlZ2lzdGVyKCZhY3BpX2J1c190eXBlKTsKIAlpZiAocmVzdWx0KSB7CkBAIC0xNDY5LDMyICsxNDAyLDE2IEBACiAJICogQ3JlYXRlIHRoZSByb290IGRldmljZSBpbiB0aGUgYnVzJ3MgZGV2aWNlIHRyZWUKIAkgKi8KIAlyZXN1bHQgPSBhY3BpX2FkZF9zaW5nbGVfb2JqZWN0KCZhY3BpX3Jvb3QsIE5VTEwsIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkJCUFDUElfQlVTX1RZUEVfU1lTVEVNKTsKKwkJCQkJQUNQSV9CVVNfVFlQRV9TWVNURU0sICZvcHMpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gRG9uZTsKIAotCXJlc3VsdCA9IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChhY3BpX3Jvb3QpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gRG9uZTsKLQotCWFjcGlfcm9vdC0+ZGV2LmJ1cyA9ICZhY3BpX2J1c190eXBlOwotCXNucHJpbnRmKGFjcGlfcm9vdC0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlcyIsIGFjcGlfYnVzX3R5cGUubmFtZSk7Ci0JcmVzdWx0ID0gZGV2aWNlX3JlZ2lzdGVyKCZhY3BpX3Jvb3QtPmRldik7Ci0JaWYgKHJlc3VsdCkgewotCQkvKiBXZSBkb24ndCB3YW50IHRvIHF1aXQgZXZlbiBpZiB3ZSBmYWlsZWQgdG8gYWRkIHN1c3BlbmQvcmVzdW1lICovCi0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkNvdWxkIG5vdCByZWdpc3RlciBkZXZpY2VcbiIpOwotCX0KLQogCS8qCiAJICogRW51bWVyYXRlIGRldmljZXMgaW4gdGhlIEFDUEkgbmFtZXNwYWNlLgogCSAqLwogCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW5fZml4ZWQoYWNwaV9yb290KTsKLQlpZiAoIXJlc3VsdCkgewotCQltZW1zZXQoJm9wcywgMCwgc2l6ZW9mKG9wcykpOwotCQlvcHMuYWNwaV9vcF9hZGQgPSAxOwotCQlvcHMuYWNwaV9vcF9zdGFydCA9IDE7CisJaWYgKCFyZXN1bHQpCiAJCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW4oYWNwaV9yb290LCAmb3BzKTsKLQl9CiAKIAlpZiAocmVzdWx0KQogCQlhY3BpX2RldmljZV91bnJlZ2lzdGVyKGFjcGlfcm9vdCwgQUNQSV9CVVNfUkVNT1ZBTF9OT1JNQUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKaW5kZXggMzQ5NjI1Ny4uY2NjMTFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCkBAIC03Myw3ICs3Myw3IEBACiBzdGF0aWMgaW50IGFjcGlfc3lzdGVtX2FsYXJtX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CiAJdTMyIHNlYywgbWluLCBocjsKLQl1MzIgZGF5LCBtbywgeXI7CisJdTMyIGRheSwgbW8sIHlyLCBjZW50ID0gMDsKIAl1bnNpZ25lZCBjaGFyIHJ0Y19jb250cm9sID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC04NywyMCArODcsMTkgQEAKIAlydGNfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CiAKIAkvKiBJZiB3ZSBldmVyIGdldCBhbiBGQUNQIHdpdGggcHJvcGVyIHZhbHVlcy4uLiAqLwotCWlmIChhY3BpX2dibF9GQURULT5kYXlfYWxybSkKKwlpZiAoYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm0pCiAJCS8qIEFDUEkgc3BlYzogb25seSBsb3cgNiBpdHMgc2hvdWxkIGJlIGNhcmVkICovCi0JCWRheSA9IENNT1NfUkVBRChhY3BpX2dibF9GQURULT5kYXlfYWxybSkgJiAweDNGOworCQlkYXkgPSBDTU9TX1JFQUQoYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm0pICYgMHgzRjsKIAllbHNlCiAJCWRheSA9IENNT1NfUkVBRChSVENfREFZX09GX01PTlRIKTsKLQlpZiAoYWNwaV9nYmxfRkFEVC0+bW9uX2Fscm0pCi0JCW1vID0gQ01PU19SRUFEKGFjcGlfZ2JsX0ZBRFQtPm1vbl9hbHJtKTsKKwlpZiAoYWNwaV9nYmxfRkFEVC5tb250aF9hbGFybSkKKwkJbW8gPSBDTU9TX1JFQUQoYWNwaV9nYmxfRkFEVC5tb250aF9hbGFybSk7CiAJZWxzZQogCQltbyA9IENNT1NfUkVBRChSVENfTU9OVEgpOwotCWlmIChhY3BpX2dibF9GQURULT5jZW50dXJ5KQotCQl5ciA9IENNT1NfUkVBRChhY3BpX2dibF9GQURULT5jZW50dXJ5KSAqIDEwMCArCi0JCSAgICBDTU9TX1JFQUQoUlRDX1lFQVIpOwotCWVsc2UKLQkJeXIgPSBDTU9TX1JFQUQoUlRDX1lFQVIpOworCWlmIChhY3BpX2dibF9GQURULmNlbnR1cnkpCisJCWNlbnQgPSBDTU9TX1JFQUQoYWNwaV9nYmxfRkFEVC5jZW50dXJ5KTsKKworCXlyID0gQ01PU19SRUFEKFJUQ19ZRUFSKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CiAKQEAgLTExMSwxMCArMTEwLDExIEBACiAJCUJDRF9UT19CSU4oZGF5KTsKIAkJQkNEX1RPX0JJTihtbyk7CiAJCUJDRF9UT19CSU4oeXIpOworCQlCQ0RfVE9fQklOKGNlbnQpOwogCX0KIAogCS8qIHdlJ3JlIHRydXN0aW5nIHRoZSBGQURUIChzZWUgYWJvdmUpICovCi0JaWYgKCFhY3BpX2dibF9GQURULT5jZW50dXJ5KQorCWlmICghYWNwaV9nYmxfRkFEVC5jZW50dXJ5KQogCQkvKiBJZiB3ZSdyZSBub3QgdHJ1c3RpbmcgdGhlIEZBRFQsIHdlIHNob3VsZCBhdCBsZWFzdCBtYWtlIGl0CiAJCSAqIHJpZ2h0IGZvciBfdGhpc18gY2VudHVyeS4uLiBlaG0sIHdoYXQgaXMgX3RoaXNfIGNlbnR1cnk/CiAJCSAqCkBAIC0xMzQsNiArMTM0LDggQEAKIAkJICoKIAkJICovCiAJCXlyICs9IDIwMDA7CisJZWxzZQorCQl5ciArPSBjZW50ICogMTAwOwogCiAJc2VxX3ByaW50ZihzZXEsICIlNC40dS0iLCB5cik7CiAJKG1vID4gMTIpID8gc2VxX3B1dHMoc2VxLCAiKiotIikgOiBzZXFfcHJpbnRmKHNlcSwgIiUyLjJ1LSIsIG1vKTsKQEAgLTMxNywxMiArMzE5LDEyIEBACiAJICogb2Zmc2V0cyBpbnRvIHRoZSBDTU9TIFJBTSBoZXJlIC0tIHdoaWNoIGZvciBzb21lIHJlYXNvbiBhcmUgcG9pbnRpbmcKIAkgKiB0byB0aGUgUlRDIGFyZWEgb2YgbWVtb3J5LgogCSAqLwotCWlmIChhY3BpX2dibF9GQURULT5kYXlfYWxybSkKLQkJQ01PU19XUklURShkYXksIGFjcGlfZ2JsX0ZBRFQtPmRheV9hbHJtKTsKLQlpZiAoYWNwaV9nYmxfRkFEVC0+bW9uX2Fscm0pCi0JCUNNT1NfV1JJVEUobW8sIGFjcGlfZ2JsX0ZBRFQtPm1vbl9hbHJtKTsKLQlpZiAoYWNwaV9nYmxfRkFEVC0+Y2VudHVyeSkKLQkJQ01PU19XUklURSh5ciAvIDEwMCwgYWNwaV9nYmxfRkFEVC0+Y2VudHVyeSk7CisJaWYgKGFjcGlfZ2JsX0ZBRFQuZGF5X2FsYXJtKQorCQlDTU9TX1dSSVRFKGRheSwgYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm0pOworCWlmIChhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtKQorCQlDTU9TX1dSSVRFKG1vLCBhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtKTsKKwlpZiAoYWNwaV9nYmxfRkFEVC5jZW50dXJ5KQorCQlDTU9TX1dSSVRFKHlyIC8gMTAwLCBhY3BpX2dibF9GQURULmNlbnR1cnkpOwogCS8qIGVuYWJsZSB0aGUgcnRjIGFsYXJtIGludGVycnVwdCAqLwogCXJ0Y19jb250cm9sIHw9IFJUQ19BSUU7CiAJQ01PU19XUklURShydGNfY29udHJvbCwgUlRDX0NPTlRST0wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3N5c3RlbS5jIGIvZHJpdmVycy9hY3BpL3N5c3RlbS5jCmluZGV4IGQ4NmRjYjMuLjcxNDdiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zeXN0ZW0uYworKysgYi9kcml2ZXJzL2FjcGkvc3lzdGVtLmMKQEAgLTMyLDYgKzMyLDExIEBACiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCiBBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3N5c3RlbSIpCisjaWZkZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAorI3VuZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKKyNlbmRpZgorI2RlZmluZSBNT0RVTEVfUEFSQU1fUFJFRklYICJhY3BpLiIKKwogI2RlZmluZSBBQ1BJX1NZU1RFTV9DTEFTUwkJInN5c3RlbSIKICNkZWZpbmUgQUNQSV9TWVNURU1fRFJJVkVSX05BTUUJCSJBQ1BJIFN5c3RlbSBEcml2ZXIiCiAjZGVmaW5lIEFDUElfU1lTVEVNX0RFVklDRV9OQU1FCQkiU3lzdGVtIgpAQCAtMzksMTEgKzQ0LDI0IEBACiAjZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfRVZFTlQJCSJldmVudCIKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9EU0RUCQkiZHNkdCIKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9GQURUCQkiZmFkdCIKLWV4dGVybiBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yIGFjcGlfZmFkdDsKKworLyoKKyAqIE1ha2UgQUNQSUNBIHZlcnNpb24gd29yayBhcyBtb2R1bGUgcGFyYW0KKyAqLworc3RhdGljIGludCBwYXJhbV9nZXRfYWNwaWNhX3ZlcnNpb24oY2hhciAqYnVmZmVyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkgeworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBzcHJpbnRmKGJ1ZmZlciwgIiV4IiwgQUNQSV9DQV9WRVJTSU9OKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK21vZHVsZV9wYXJhbV9jYWxsKGFjcGljYV92ZXJzaW9uLCBOVUxMLCBwYXJhbV9nZXRfYWNwaWNhX3ZlcnNpb24sIE5VTEwsIDA0NDQpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgQ09ORklHX0FDUElfUFJPQ0ZTCiAKIHN0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fcmVhZF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CkBAIC02Myw2ICs4MSw3IEBACiAJLmxsc2VlayA9IHNlcV9sc2VlaywKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKKyNlbmRpZgogCiBzdGF0aWMgc3NpemVfdCBhY3BpX3N5c3RlbV9yZWFkX2RzZHQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LAogCQkJCSAgICAgbG9mZl90ICopOwpAQCAtNzYsMTcgKzk1LDE2IEBACiAJCSAgICAgIGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGRzZHQgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpkc2R0ID0gTlVMTDsKIAlzc2l6ZV90IHJlczsKIAogCi0Jc3RhdHVzID0gYWNwaV9nZXRfdGFibGUoQUNQSV9UQUJMRV9JRF9EU0RULCAxLCAmZHNkdCk7CisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGUoQUNQSV9TSUdfRFNEVCwgMSwgJmRzZHQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWZmZXIsIGNvdW50LCBwcG9zLAotCQkJCSAgICAgIGRzZHQucG9pbnRlciwgZHNkdC5sZW5ndGgpOwotCWtmcmVlKGRzZHQucG9pbnRlcik7CisJCQkJICAgICAgZHNkdCwgZHNkdC0+bGVuZ3RoKTsKIAogCXJldHVybiByZXM7CiB9CkBAIC0xMDMsMTcgKzEyMSwxNiBAQAogCQkgICAgICBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2J1ZmZlciBmYWR0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqZmFkdCA9IE5VTEw7CiAJc3NpemVfdCByZXM7CiAKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfVEFCTEVfSURfRkFEVCwgMSwgJmZhZHQpOworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0ZBRFQsIDEsICZmYWR0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmZmVyLCBjb3VudCwgcHBvcywKLQkJCQkgICAgICBmYWR0LnBvaW50ZXIsIGZhZHQubGVuZ3RoKTsKLQlrZnJlZShmYWR0LnBvaW50ZXIpOworCQkJCSAgICAgIGZhZHQsIGZhZHQtPmxlbmd0aCk7CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTI4LDYgKzE0NSw3IEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAwOwogCisjaWZkZWYgQ09ORklHX0FDUElfUFJPQ0ZTCiAJLyogJ2luZm8nIFtSXSAqLwogCW5hbWUgPSBBQ1BJX1NZU1RFTV9GSUxFX0lORk87CiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCBTX0lSVUdPLCBhY3BpX3Jvb3RfZGlyKTsKQEAgLTEzNiw2ICsxNTQsNyBAQAogCWVsc2UgewogCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfc3lzdGVtX2luZm9fb3BzOwogCX0KKyNlbmRpZgogCiAJLyogJ2RzZHQnIFtSXSAqLwogCW5hbWUgPSBBQ1BJX1NZU1RFTV9GSUxFX0RTRFQ7CkBAIC0xNTksNyArMTc4LDkgQEAKICAgICAgIEVycm9yOgogCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfU1lTVEVNX0ZJTEVfRkFEVCwgYWNwaV9yb290X2Rpcik7CiAJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9TWVNURU1fRklMRV9EU0RULCBhY3BpX3Jvb3RfZGlyKTsKKyNpZmRlZiBDT05GSUdfQUNQSV9QUk9DRlMKIAlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX1NZU1RFTV9GSUxFX0lORk8sIGFjcGlfcm9vdF9kaXIpOworI2VuZGlmCiAKIAllcnJvciA9IC1FRkFVTFQ7CiAJZ290byBEb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy5jCmluZGV4IGZmYTMwYzkuLmJhNGNiMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzLmMKQEAgLTM4LDE1NCArMzgsOTcgQEAKIAogI2RlZmluZSBBQ1BJX01BWF9UQUJMRVMJCTEyOAogCi1zdGF0aWMgY2hhciAqYWNwaV90YWJsZV9zaWduYXR1cmVzW0FDUElfVEFCTEVfQ09VTlRdID0gewotCVtBQ1BJX1RBQkxFX1VOS05PV05dID0gIj8/Pz8iLAotCVtBQ1BJX0FQSUNdID0gIkFQSUMiLAotCVtBQ1BJX0JPT1RdID0gIkJPT1QiLAotCVtBQ1BJX0RCR1BdID0gIkRCR1AiLAotCVtBQ1BJX0RTRFRdID0gIkRTRFQiLAotCVtBQ1BJX0VDRFRdID0gIkVDRFQiLAotCVtBQ1BJX0VURFRdID0gIkVURFQiLAotCVtBQ1BJX0ZBRFRdID0gIkZBQ1AiLAotCVtBQ1BJX0ZBQ1NdID0gIkZBQ1MiLAotCVtBQ1BJX09FTVhdID0gIk9FTSIsCi0JW0FDUElfUFNEVF0gPSAiUFNEVCIsCi0JW0FDUElfU0JTVF0gPSAiU0JTVCIsCi0JW0FDUElfU0xJVF0gPSAiU0xJVCIsCi0JW0FDUElfU1BDUl0gPSAiU1BDUiIsCi0JW0FDUElfU1JBVF0gPSAiU1JBVCIsCi0JW0FDUElfU1NEVF0gPSAiU1NEVCIsCi0JW0FDUElfU1BNSV0gPSAiU1BNSSIsCi0JW0FDUElfSFBFVF0gPSAiSFBFVCIsCi0JW0FDUElfTUNGR10gPSAiTUNGRyIsCi19OwotCiBzdGF0aWMgY2hhciAqbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbXSA9IHsgImRmbCIsICJoaWdoIiwgInJlcyIsICJsb3ciIH07CiBzdGF0aWMgY2hhciAqbXBzX2ludGlfZmxhZ3NfdHJpZ2dlcltdID0geyAiZGZsIiwgImVkZ2UiLCAicmVzIiwgImxldmVsIiB9OwogCi0vKiBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKFJTRFQvWFNEVCkgKi8KLXN0cnVjdCBhY3BpX3RhYmxlX3NkdCB7Ci0JdW5zaWduZWQgbG9uZyBwYTsKLQllbnVtIGFjcGlfdGFibGVfaWQgaWQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CitzdGF0aWMgc3RydWN0IGFjcGlfdGFibGVfZGVzYyBpbml0aWFsX3RhYmxlc1tBQ1BJX01BWF9UQUJMRVNdIF9faW5pdGRhdGE7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNkdF9wYTsJLyogUGh5c2ljYWwgQWRkcmVzcyAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2R0X2NvdW50OwkvKiBUYWJsZSBjb3VudCAqLwotCi1zdGF0aWMgc3RydWN0IGFjcGlfdGFibGVfc2R0IHNkdF9lbnRyeVtBQ1BJX01BWF9UQUJMRVNdIF9faW5pdGRhdGE7Ci0KLXZvaWQgYWNwaV90YWJsZV9wcmludChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCi17Ci0JY2hhciAqbmFtZSA9IE5VTEw7Ci0KLQlpZiAoIWhlYWRlcikKLQkJcmV0dXJuOwotCi0JLyogU29tZSB0YWJsZSBzaWduYXR1cmVzIGFyZW4ndCBnb29kIHRhYmxlIG5hbWVzICovCi0KLQlpZiAoIXN0cm5jbXAoKGNoYXIgKikmaGVhZGVyLT5zaWduYXR1cmUsCi0JCSAgICAgYWNwaV90YWJsZV9zaWduYXR1cmVzW0FDUElfQVBJQ10sCi0JCSAgICAgc2l6ZW9mKGhlYWRlci0+c2lnbmF0dXJlKSkpIHsKLQkJbmFtZSA9ICJNQURUIjsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKChjaGFyICopJmhlYWRlci0+c2lnbmF0dXJlLAotCQkJICAgIGFjcGlfdGFibGVfc2lnbmF0dXJlc1tBQ1BJX0ZBRFRdLAotCQkJICAgIHNpemVvZihoZWFkZXItPnNpZ25hdHVyZSkpKSB7Ci0JCW5hbWUgPSAiRkFEVCI7Ci0JfSBlbHNlCi0JCW5hbWUgPSBoZWFkZXItPnNpZ25hdHVyZTsKLQotCXByaW50ayhLRVJOX0RFQlVHIFBSRUZJWAotCSAgICAgICAiJS40cyAodiUzLjNkICU2LjZzICU4LjhzIDB4JTA4eCAlLjRzIDB4JTA4eCkgQCAweCVwXG4iLCBuYW1lLAotCSAgICAgICBoZWFkZXItPnJldmlzaW9uLCBoZWFkZXItPm9lbV9pZCwgaGVhZGVyLT5vZW1fdGFibGVfaWQsCi0JICAgICAgIGhlYWRlci0+b2VtX3JldmlzaW9uLCBoZWFkZXItPmFzbF9jb21waWxlcl9pZCwKLQkgICAgICAgaGVhZGVyLT5hc2xfY29tcGlsZXJfcmV2aXNpb24sICh2b2lkICopcGh5c19hZGRyKTsKLX0KLQotdm9pZCBhY3BpX3RhYmxlX3ByaW50X21hZHRfZW50cnkoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKiBoZWFkZXIpCit2b2lkIGFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKiBoZWFkZXIpCiB7CiAJaWYgKCFoZWFkZXIpCiAJCXJldHVybjsKIAogCXN3aXRjaCAoaGVhZGVyLT50eXBlKSB7CiAKLQljYXNlIEFDUElfTUFEVF9MQVBJQzoKKwljYXNlIEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUM6CiAJCXsKLQkJCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljICpwID0KLQkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWMgKiloZWFkZXI7CisJCQlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWMgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWMgKiloZWFkZXI7CiAJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAogCQkJICAgICAgICJMQVBJQyAoYWNwaV9pZFsweCUwMnhdIGxhcGljX2lkWzB4JTAyeF0gJXMpXG4iLAotCQkJICAgICAgIHAtPmFjcGlfaWQsIHAtPmlkLAotCQkJICAgICAgIHAtPmZsYWdzLmVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJCSAgICAgICBwLT5wcm9jZXNzb3JfaWQsIHAtPmlkLAorCQkJICAgICAgIChwLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX01BRFRfSU9BUElDOgorCWNhc2UgQUNQSV9NQURUX1RZUEVfSU9fQVBJQzoKIAkJewotCQkJc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICpwID0KLQkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICopaGVhZGVyOworCQkJc3RydWN0IGFjcGlfbWFkdF9pb19hcGljICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfbWFkdF9pb19hcGljICopaGVhZGVyOwogCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKIAkJCSAgICAgICAiSU9BUElDIChpZFsweCUwMnhdIGFkZHJlc3NbMHglMDh4XSBnc2lfYmFzZVslZF0pXG4iLAogCQkJICAgICAgIHAtPmlkLCBwLT5hZGRyZXNzLCBwLT5nbG9iYWxfaXJxX2Jhc2UpOwogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX01BRFRfSU5UX1NSQ19PVlI6CisJY2FzZSBBQ1BJX01BRFRfVFlQRV9JTlRFUlJVUFRfT1ZFUlJJREU6CiAJCXsKLQkJCXN0cnVjdCBhY3BpX3RhYmxlX2ludF9zcmNfb3ZyICpwID0KLQkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfaW50X3NyY19vdnIgKiloZWFkZXI7CisJCQlzdHJ1Y3QgYWNwaV9tYWR0X2ludGVycnVwdF9vdmVycmlkZSAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX21hZHRfaW50ZXJydXB0X292ZXJyaWRlICopaGVhZGVyOwogCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKIAkJCSAgICAgICAiSU5UX1NSQ19PVlIgKGJ1cyAlZCBidXNfaXJxICVkIGdsb2JhbF9pcnEgJWQgJXMgJXMpXG4iLAotCQkJICAgICAgIHAtPmJ1cywgcC0+YnVzX2lycSwgcC0+Z2xvYmFsX2lycSwKLQkJCSAgICAgICBtcHNfaW50aV9mbGFnc19wb2xhcml0eVtwLT5mbGFncy5wb2xhcml0eV0sCi0JCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfdHJpZ2dlcltwLT5mbGFncy50cmlnZ2VyXSk7Ci0JCQlpZiAocC0+ZmxhZ3MucmVzZXJ2ZWQpCisJCQkgICAgICAgcC0+YnVzLCBwLT5zb3VyY2VfaXJxLCBwLT5nbG9iYWxfaXJxLAorCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTS10sCisJCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfdHJpZ2dlclsocC0+aW50aV9mbGFncyAmIEFDUElfTUFEVF9UUklHR0VSX01BU0spID4+IDJdKTsKKwkJCWlmIChwLT5pbnRpX2ZsYWdzICAmCisJCQkgICAgfihBQ1BJX01BRFRfUE9MQVJJVFlfTUFTSyB8IEFDUElfTUFEVF9UUklHR0VSX01BU0spKQogCQkJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCiAJCQkJICAgICAgICJJTlRfU1JDX09WUiB1bmV4cGVjdGVkIHJlc2VydmVkIGZsYWdzOiAweCV4XG4iLAotCQkJCSAgICAgICBwLT5mbGFncy5yZXNlcnZlZCk7CisJCQkJICAgICAgIHAtPmludGlfZmxhZ3MgICYKKwkJCQkJfihBQ1BJX01BRFRfUE9MQVJJVFlfTUFTSyB8IEFDUElfTUFEVF9UUklHR0VSX01BU0spKTsKIAogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX01BRFRfTk1JX1NSQzoKKwljYXNlIEFDUElfTUFEVF9UWVBFX05NSV9TT1VSQ0U6CiAJCXsKLQkJCXN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMgKnAgPQotCQkJICAgIChzdHJ1Y3QgYWNwaV90YWJsZV9ubWlfc3JjICopaGVhZGVyOworCQkJc3RydWN0IGFjcGlfbWFkdF9ubWlfc291cmNlICpwID0KKwkJCSAgICAoc3RydWN0IGFjcGlfbWFkdF9ubWlfc291cmNlICopaGVhZGVyOwogCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKIAkJCSAgICAgICAiTk1JX1NSQyAoJXMgJXMgZ2xvYmFsX2lycSAlZClcbiIsCi0JCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+ZmxhZ3MucG9sYXJpdHldLAotCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3RyaWdnZXJbcC0+ZmxhZ3MudHJpZ2dlcl0sCisJCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfcG9sYXJpdHlbcC0+aW50aV9mbGFncyAmIEFDUElfTUFEVF9QT0xBUklUWV9NQVNLXSwKKwkJCSAgICAgICBtcHNfaW50aV9mbGFnc190cmlnZ2VyWyhwLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1RSSUdHRVJfTUFTSykgPj4gMl0sCiAJCQkgICAgICAgcC0+Z2xvYmFsX2lycSk7CiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIEFDUElfTUFEVF9MQVBJQ19OTUk6CisJY2FzZSBBQ1BJX01BRFRfVFlQRV9MT0NBTF9BUElDX05NSToKIAkJewotCQkJc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfbm1pICpwID0KLQkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfbm1pICopaGVhZGVyOworCQkJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljX25taSAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfYXBpY19ubWkgKiloZWFkZXI7CiAJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAogCQkJICAgICAgICJMQVBJQ19OTUkgKGFjcGlfaWRbMHglMDJ4XSAlcyAlcyBsaW50WzB4JXhdKVxuIiwKLQkJCSAgICAgICBwLT5hY3BpX2lkLAotCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3BvbGFyaXR5W3AtPmZsYWdzLnBvbGFyaXR5XSwKLQkJCSAgICAgICBtcHNfaW50aV9mbGFnc190cmlnZ2VyW3AtPmZsYWdzLnRyaWdnZXJdLAorCQkJICAgICAgIHAtPnByb2Nlc3Nvcl9pZCwKKwkJCSAgICAgICBtcHNfaW50aV9mbGFnc19wb2xhcml0eVtwLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1BPTEFSSVRZX01BU0sJXSwKKwkJCSAgICAgICBtcHNfaW50aV9mbGFnc190cmlnZ2VyWyhwLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1RSSUdHRVJfTUFTSykgPj4gMl0sCiAJCQkgICAgICAgcC0+bGludCk7CiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIEFDUElfTUFEVF9MQVBJQ19BRERSX09WUjoKKwljYXNlIEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUNfT1ZFUlJJREU6CiAJCXsKLQkJCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX2FkZHJfb3ZyICpwID0KLQkJCSAgICAoc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfYWRkcl9vdnIgKiloZWFkZXI7CisJCQlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWNfb3ZlcnJpZGUgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWNfb3ZlcnJpZGUgKiloZWFkZXI7CiAJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAogCQkJICAgICAgICJMQVBJQ19BRERSX09WUiAoYWRkcmVzc1slcF0pXG4iLAogCQkJICAgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcC0+YWRkcmVzcyk7CiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIEFDUElfTUFEVF9JT1NBUElDOgorCWNhc2UgQUNQSV9NQURUX1RZUEVfSU9fU0FQSUM6CiAJCXsKLQkJCXN0cnVjdCBhY3BpX3RhYmxlX2lvc2FwaWMgKnAgPQotCQkJICAgIChzdHJ1Y3QgYWNwaV90YWJsZV9pb3NhcGljICopaGVhZGVyOworCQkJc3RydWN0IGFjcGlfbWFkdF9pb19zYXBpYyAqcCA9CisJCQkgICAgKHN0cnVjdCBhY3BpX21hZHRfaW9fc2FwaWMgKiloZWFkZXI7CiAJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAogCQkJICAgICAgICJJT1NBUElDIChpZFsweCV4XSBhZGRyZXNzWyVwXSBnc2lfYmFzZVslZF0pXG4iLAogCQkJICAgICAgIHAtPmlkLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXAtPmFkZHJlc3MsCkBAIC0xOTMsMjYgKzEzNiwyNiBAQAogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX01BRFRfTFNBUElDOgorCWNhc2UgQUNQSV9NQURUX1RZUEVfTE9DQUxfU0FQSUM6CiAJCXsKLQkJCXN0cnVjdCBhY3BpX3RhYmxlX2xzYXBpYyAqcCA9Ci0JCQkgICAgKHN0cnVjdCBhY3BpX3RhYmxlX2xzYXBpYyAqKWhlYWRlcjsKKwkJCXN0cnVjdCBhY3BpX21hZHRfbG9jYWxfc2FwaWMgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3NhcGljICopaGVhZGVyOwogCQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKIAkJCSAgICAgICAiTFNBUElDIChhY3BpX2lkWzB4JTAyeF0gbHNhcGljX2lkWzB4JTAyeF0gbHNhcGljX2VpZFsweCUwMnhdICVzKVxuIiwKLQkJCSAgICAgICBwLT5hY3BpX2lkLCBwLT5pZCwgcC0+ZWlkLAotCQkJICAgICAgIHAtPmZsYWdzLmVuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJCSAgICAgICBwLT5wcm9jZXNzb3JfaWQsIHAtPmlkLCBwLT5laWQsCisJCQkgICAgICAgKHAtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIEFDUElfTUFEVF9QTEFUX0lOVF9TUkM6CisJY2FzZSBBQ1BJX01BRFRfVFlQRV9JTlRFUlJVUFRfU09VUkNFOgogCQl7Ci0JCQlzdHJ1Y3QgYWNwaV90YWJsZV9wbGF0X2ludF9zcmMgKnAgPQotCQkJICAgIChzdHJ1Y3QgYWNwaV90YWJsZV9wbGF0X2ludF9zcmMgKiloZWFkZXI7CisJCQlzdHJ1Y3QgYWNwaV9tYWR0X2ludGVycnVwdF9zb3VyY2UgKnAgPQorCQkJICAgIChzdHJ1Y3QgYWNwaV9tYWR0X2ludGVycnVwdF9zb3VyY2UgKiloZWFkZXI7CiAJCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAogCQkJICAgICAgICJQTEFUX0lOVF9TUkMgKCVzICVzIHR5cGVbMHgleF0gaWRbMHglMDR4XSBlaWRbMHgleF0gaW9zYXBpY192ZWN0b3JbMHgleF0gZ2xvYmFsX2lycVsweCV4XVxuIiwKLQkJCSAgICAgICBtcHNfaW50aV9mbGFnc19wb2xhcml0eVtwLT5mbGFncy5wb2xhcml0eV0sCi0JCQkgICAgICAgbXBzX2ludGlfZmxhZ3NfdHJpZ2dlcltwLT5mbGFncy50cmlnZ2VyXSwKLQkJCSAgICAgICBwLT50eXBlLCBwLT5pZCwgcC0+ZWlkLCBwLT5pb3NhcGljX3ZlY3RvciwKKwkJCSAgICAgICBtcHNfaW50aV9mbGFnc19wb2xhcml0eVtwLT5pbnRpX2ZsYWdzICYgQUNQSV9NQURUX1BPTEFSSVRZX01BU0tdLAorCQkJICAgICAgIG1wc19pbnRpX2ZsYWdzX3RyaWdnZXJbKHAtPmludGlfZmxhZ3MgJiBBQ1BJX01BRFRfVFJJR0dFUl9NQVNLKSA+PiAyXSwKKwkJCSAgICAgICBwLT50eXBlLCBwLT5pZCwgcC0+ZWlkLCBwLT5pb19zYXBpY192ZWN0b3IsCiAJCQkgICAgICAgcC0+Z2xvYmFsX2lycSk7CiAJCX0KIAkJYnJlYWs7CkBAIC0yMjUsMzQyICsxNjgsNzYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQKLWFjcGlfdGFibGVfY29tcHV0ZV9jaGVja3N1bSh2b2lkICp0YWJsZV9wb2ludGVyLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKLXsKLQl1OCAqcCA9IHRhYmxlX3BvaW50ZXI7Ci0JdW5zaWduZWQgbG9uZyByZW1haW5zID0gbGVuZ3RoOwotCXVuc2lnbmVkIGxvbmcgc3VtID0gMDsKLQotCWlmICghcCB8fCAhbGVuZ3RoKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXdoaWxlIChyZW1haW5zLS0pCi0JCXN1bSArPSAqcCsrOwotCi0JcmV0dXJuIChzdW0gJiAweEZGKTsKLX0KLQotLyoKLSAqIGFjcGlfZ2V0X3RhYmxlX2hlYWRlcl9lYXJseSgpCi0gKiBmb3IgYWNwaV9ibGFja2xpc3RlZCgpLCBhY3BpX3RhYmxlX2dldF9zZHQoKQotICovCi1pbnQgX19pbml0Ci1hY3BpX2dldF90YWJsZV9oZWFkZXJfZWFybHkoZW51bSBhY3BpX3RhYmxlX2lkIGlkLAotCQkJICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKmhlYWRlcikKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQllbnVtIGFjcGlfdGFibGVfaWQgdGVtcF9pZDsKLQotCS8qIERTRFQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJlc3QgKi8KLQlpZiAoaWQgPT0gQUNQSV9EU0RUKQotCQl0ZW1wX2lkID0gQUNQSV9GQURUOwotCWVsc2UKLQkJdGVtcF9pZCA9IGlkOwotCi0JLyogTG9jYXRlIHRoZSB0YWJsZS4gKi8KLQotCWZvciAoaSA9IDA7IGkgPCBzZHRfY291bnQ7IGkrKykgewotCQlpZiAoc2R0X2VudHJ5W2ldLmlkICE9IHRlbXBfaWQpCi0JCQljb250aW51ZTsKLQkJKmhlYWRlciA9ICh2b2lkICopCi0JCSAgICBfX2FjcGlfbWFwX3RhYmxlKHNkdF9lbnRyeVtpXS5wYSwgc2R0X2VudHJ5W2ldLnNpemUpOwotCQlpZiAoISpoZWFkZXIpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwICVzXG4iLAotCQkJICAgICAgIGFjcGlfdGFibGVfc2lnbmF0dXJlc1t0ZW1wX2lkXSk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlpZiAoISpoZWFkZXIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIiVzIG5vdCBwcmVzZW50XG4iLAotCQkgICAgICAgYWNwaV90YWJsZV9zaWduYXR1cmVzW2lkXSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIE1hcCB0aGUgRFNEVCBoZWFkZXIgdmlhIHRoZSBwb2ludGVyIGluIHRoZSBGQURUICovCi0JaWYgKGlkID09IEFDUElfRFNEVCkgewotCQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpmYWR0ID0KLQkJICAgIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICopKmhlYWRlcjsKLQotCQlpZiAoZmFkdC0+cmV2aXNpb24gPT0gMyAmJiBmYWR0LT5YZHNkdCkgewotCQkJKmhlYWRlciA9ICh2b2lkICopX19hY3BpX21hcF90YWJsZShmYWR0LT5YZHNkdCwKLQkJCQkJCQkgICBzaXplb2Yoc3RydWN0Ci0JCQkJCQkJCSAgYWNwaV90YWJsZV9oZWFkZXIpKTsKLQkJfSBlbHNlIGlmIChmYWR0LT5WMV9kc2R0KSB7Ci0JCQkqaGVhZGVyID0gKHZvaWQgKilfX2FjcGlfbWFwX3RhYmxlKGZhZHQtPlYxX2RzZHQsCi0JCQkJCQkJICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkJCQkgIGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JCX0gZWxzZQotCQkJKmhlYWRlciA9IE5VTEw7Ci0KLQkJaWYgKCEqaGVhZGVyKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBEU0RUXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19CiAKIGludCBfX2luaXQKLWFjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkoZW51bSBhY3BpX3RhYmxlX2lkIGlkLAorYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseShjaGFyICppZCwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBtYWR0X3NpemUsCiAJCQkgICAgIGludCBlbnRyeV9pZCwKIAkJCSAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwKIAkJCSAgICAgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQogewotCXZvaWQgKm1hZHQgPSBOVUxMOwotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyICplbnRyeTsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKm1hZHQgPSBOVUxMOworCXN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnk7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKIAl1bnNpZ25lZCBsb25nIG1hZHRfZW5kOwotCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFoYW5kbGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIExvY2F0ZSB0aGUgTUFEVCAoaWYgZXhpc3RzKS4gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lLiAqLwotCi0JZm9yIChpID0gMDsgaSA8IHNkdF9jb3VudDsgaSsrKSB7Ci0JCWlmIChzZHRfZW50cnlbaV0uaWQgIT0gaWQpCi0JCQljb250aW51ZTsKLQkJbWFkdCA9ICh2b2lkICopCi0JCSAgICBfX2FjcGlfbWFwX3RhYmxlKHNkdF9lbnRyeVtpXS5wYSwgc2R0X2VudHJ5W2ldLnNpemUpOwotCQlpZiAoIW1hZHQpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwICVzXG4iLAotCQkJICAgICAgIGFjcGlfdGFibGVfc2lnbmF0dXJlc1tpZF0pOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorCWFjcGlfZ2V0X3RhYmxlKGlkLCAwLCAmbWFkdCk7CiAKIAlpZiAoIW1hZHQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIiVzIG5vdCBwcmVzZW50XG4iLAotCQkgICAgICAgYWNwaV90YWJsZV9zaWduYXR1cmVzW2lkXSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICIlNC40cyBub3QgcHJlc2VudFxuIiwgaWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQltYWR0X2VuZCA9ICh1bnNpZ25lZCBsb25nKW1hZHQgKyBzZHRfZW50cnlbaV0uc2l6ZTsKKwltYWR0X2VuZCA9ICh1bnNpZ25lZCBsb25nKW1hZHQgKyBtYWR0LT5sZW5ndGg7CiAKIAkvKiBQYXJzZSBhbGwgZW50cmllcyBsb29raW5nIGZvciBhIG1hdGNoLiAqLwogCi0JZW50cnkgPSAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKikKKwllbnRyeSA9IChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKikKIAkgICAgKCh1bnNpZ25lZCBsb25nKW1hZHQgKyBtYWR0X3NpemUpOwogCi0Jd2hpbGUgKCgodW5zaWduZWQgbG9uZyllbnRyeSkgKyBzaXplb2YoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIpIDwKKwl3aGlsZSAoKCh1bnNpZ25lZCBsb25nKWVudHJ5KSArIHNpemVvZihzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIpIDwKIAkgICAgICAgbWFkdF9lbmQpIHsKIAkJaWYgKGVudHJ5LT50eXBlID09IGVudHJ5X2lkCiAJCSAgICAmJiAoIW1heF9lbnRyaWVzIHx8IGNvdW50KysgPCBtYXhfZW50cmllcykpCiAJCQlpZiAoaGFuZGxlcihlbnRyeSwgbWFkdF9lbmQpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCi0JCWVudHJ5ID0gKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICopCisJCWVudHJ5ID0gKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqKQogCQkgICAgKCh1bnNpZ25lZCBsb25nKWVudHJ5ICsgZW50cnktPmxlbmd0aCk7CiAJfQogCWlmIChtYXhfZW50cmllcyAmJiBjb3VudCA+IG1heF9lbnRyaWVzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJbJXM6MHglMDJ4XSBpZ25vcmVkICVpIGVudHJpZXMgb2YgIgotCQkgICAgICAgIiVpIGZvdW5kXG4iLCBhY3BpX3RhYmxlX3NpZ25hdHVyZXNbaWRdLCBlbnRyeV9pZCwKLQkJICAgICAgIGNvdW50IC0gbWF4X2VudHJpZXMsIGNvdW50KTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlslNC40czoweCUwMnhdIGlnbm9yZWQgJWkgZW50cmllcyBvZiAiCisJCSAgICAgICAiJWkgZm91bmRcbiIsIGlkLCBlbnRyeV9pZCwgY291bnQgLSBtYXhfZW50cmllcywgY291bnQpOwogCX0KIAogCXJldHVybiBjb3VudDsKIH0KIAogaW50IF9faW5pdAotYWNwaV90YWJsZV9wYXJzZV9tYWR0KGVudW0gYWNwaV9tYWR0X2VudHJ5X2lkIGlkLAorYWNwaV90YWJsZV9wYXJzZV9tYWR0KGVudW0gYWNwaV9tYWR0X3R5cGUgaWQsCiAJCSAgICAgIGFjcGlfbWFkdF9lbnRyeV9oYW5kbGVyIGhhbmRsZXIsIHVuc2lnbmVkIGludCBtYXhfZW50cmllcykKIHsKLQlyZXR1cm4gYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseShBQ1BJX0FQSUMsCisJcmV0dXJuIGFjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkoQUNQSV9TSUdfTUFEVCwKIAkJCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0KSwgaWQsCiAJCQkJCSAgICBoYW5kbGVyLCBtYXhfZW50cmllcyk7CiB9CiAKLWludCBfX2luaXQgYWNwaV90YWJsZV9wYXJzZShlbnVtIGFjcGlfdGFibGVfaWQgaWQsIGFjcGlfdGFibGVfaGFuZGxlciBoYW5kbGVyKQoraW50IF9faW5pdCBhY3BpX3RhYmxlX3BhcnNlKGNoYXIgKmlkLCBhY3BpX3RhYmxlX2hhbmRsZXIgaGFuZGxlcikKIHsKLQlpbnQgY291bnQgPSAwOwotCXVuc2lnbmVkIGludCBpID0gMDsKLQorCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUgPSBOVUxMOwogCWlmICghaGFuZGxlcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2R0X2NvdW50OyBpKyspIHsKLQkJaWYgKHNkdF9lbnRyeVtpXS5pZCAhPSBpZCkKLQkJCWNvbnRpbnVlOwotCQljb3VudCsrOwotCQlpZiAoY291bnQgPT0gMSkKLQkJCWhhbmRsZXIoc2R0X2VudHJ5W2ldLnBhLCBzZHRfZW50cnlbaV0uc2l6ZSk7Ci0KLQkJZWxzZQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKLQkJCSAgICAgICAiJWQgZHVwbGljYXRlICVzIHRhYmxlIGlnbm9yZWQuXG4iLCBjb3VudCwKLQkJCSAgICAgICBhY3BpX3RhYmxlX3NpZ25hdHVyZXNbaWRdKTsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfdGFibGVfZ2V0X3NkdChzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwKQotewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgaSwgaWQgPSAwOwotCi0JaWYgKCFyc2RwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIEZpcnN0IGNoZWNrIFhTRFQgKGJ1dCBvbmx5IG9uIEFDUEkgMi4wLWNvbXBhdGlibGUgc3lzdGVtcykgKi8KLQotCWlmICgocnNkcC0+cmV2aXNpb24gPj0gMikgJiYKLQkgICAgKCgoc3RydWN0IGFjcGkyMF90YWJsZV9yc2RwICopcnNkcCktPnhzZHRfYWRkcmVzcykpIHsKLQotCQlzdHJ1Y3QgYWNwaV90YWJsZV94c2R0ICptYXBwZWRfeHNkdCA9IE5VTEw7Ci0KLQkJc2R0X3BhID0gKChzdHJ1Y3QgYWNwaTIwX3RhYmxlX3JzZHAgKilyc2RwKS0+eHNkdF9hZGRyZXNzOwotCi0JCS8qIG1hcCBpbiBqdXN0IHRoZSBoZWFkZXIgKi8KLQkJaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKQotCQkgICAgX19hY3BpX21hcF90YWJsZShzZHRfcGEsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKLQotCQlpZiAoIWhlYWRlcikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKLQkJCSAgICAgICAiVW5hYmxlIHRvIG1hcCBYU0RUIGhlYWRlclxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCS8qIHJlbWFwIGluIHRoZSBlbnRpcmUgdGFibGUgYmVmb3JlIHByb2Nlc3NpbmcgKi8KLQkJbWFwcGVkX3hzZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfeHNkdCAqKQotCQkgICAgX19hY3BpX21hcF90YWJsZShzZHRfcGEsIGhlYWRlci0+bGVuZ3RoKTsKLQkJaWYgKCFtYXBwZWRfeHNkdCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIlVuYWJsZSB0byBtYXAgWFNEVFxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQloZWFkZXIgPSAmbWFwcGVkX3hzZHQtPmhlYWRlcjsKLQotCQlpZiAoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgIlhTRFQiLCA0KSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKLQkJCSAgICAgICAiWFNEVCBzaWduYXR1cmUgaW5jb3JyZWN0XG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJaWYgKGFjcGlfdGFibGVfY29tcHV0ZV9jaGVja3N1bShoZWFkZXIsIGhlYWRlci0+bGVuZ3RoKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIkludmFsaWQgWFNEVCBjaGVja3N1bVxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCi0JCXNkdF9jb3VudCA9Ci0JCSAgICAoaGVhZGVyLT5sZW5ndGggLSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgPj4gMzsKLQkJaWYgKHNkdF9jb3VudCA+IEFDUElfTUFYX1RBQkxFUykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKLQkJCSAgICAgICAiVHJ1bmNhdGVkICVsdSBYU0RUIGVudHJpZXNcbiIsCi0JCQkgICAgICAgKHNkdF9jb3VudCAtIEFDUElfTUFYX1RBQkxFUykpOwotCQkJc2R0X2NvdW50ID0gQUNQSV9NQVhfVEFCTEVTOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IHNkdF9jb3VudDsgaSsrKQotCQkJc2R0X2VudHJ5W2ldLnBhID0gKHVuc2lnbmVkIGxvbmcpbWFwcGVkX3hzZHQtPmVudHJ5W2ldOwotCX0KLQotCS8qIFRoZW4gY2hlY2sgUlNEVCAqLwotCi0JZWxzZSBpZiAocnNkcC0+cnNkdF9hZGRyZXNzKSB7Ci0KLQkJc3RydWN0IGFjcGlfdGFibGVfcnNkdCAqbWFwcGVkX3JzZHQgPSBOVUxMOwotCi0JCXNkdF9wYSA9IHJzZHAtPnJzZHRfYWRkcmVzczsKLQotCQkvKiBtYXAgaW4ganVzdCB0aGUgaGVhZGVyICovCi0JCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKLQkJICAgIF9fYWNwaV9tYXBfdGFibGUoc2R0X3BhLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JCWlmICghaGVhZGVyKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAotCQkJICAgICAgICJVbmFibGUgdG8gbWFwIFJTRFQgaGVhZGVyXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJLyogcmVtYXAgaW4gdGhlIGVudGlyZSB0YWJsZSBiZWZvcmUgcHJvY2Vzc2luZyAqLwotCQltYXBwZWRfcnNkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0ICopCi0JCSAgICBfX2FjcGlfbWFwX3RhYmxlKHNkdF9wYSwgaGVhZGVyLT5sZW5ndGgpOwotCQlpZiAoIW1hcHBlZF9yc2R0KSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBSU0RUXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCWhlYWRlciA9ICZtYXBwZWRfcnNkdC0+aGVhZGVyOwotCi0JCWlmIChzdHJuY21wKGhlYWRlci0+c2lnbmF0dXJlLCAiUlNEVCIsIDQpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAotCQkJICAgICAgICJSU0RUIHNpZ25hdHVyZSBpbmNvcnJlY3RcbiIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQlpZiAoYWNwaV90YWJsZV9jb21wdXRlX2NoZWNrc3VtKGhlYWRlciwgaGVhZGVyLT5sZW5ndGgpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiSW52YWxpZCBSU0RUIGNoZWNrc3VtXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJc2R0X2NvdW50ID0KLQkJICAgIChoZWFkZXItPmxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSA+PiAyOwotCQlpZiAoc2R0X2NvdW50ID4gQUNQSV9NQVhfVEFCTEVTKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAotCQkJICAgICAgICJUcnVuY2F0ZWQgJWx1IFJTRFQgZW50cmllc1xuIiwKLQkJCSAgICAgICAoc2R0X2NvdW50IC0gQUNQSV9NQVhfVEFCTEVTKSk7Ci0JCQlzZHRfY291bnQgPSBBQ1BJX01BWF9UQUJMRVM7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgc2R0X2NvdW50OyBpKyspCi0JCQlzZHRfZW50cnlbaV0ucGEgPSAodW5zaWduZWQgbG9uZyltYXBwZWRfcnNkdC0+ZW50cnlbaV07Ci0JfQotCi0JZWxzZSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCi0JCSAgICAgICAiTm8gU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlIChSU0RUL1hTRFQpIHNwZWNpZmllZCBpbiBSU0RQXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JYWNwaV90YWJsZV9wcmludChoZWFkZXIsIHNkdF9wYSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2R0X2NvdW50OyBpKyspIHsKLQotCQkvKiBtYXAgaW4ganVzdCB0aGUgaGVhZGVyICovCi0JCWhlYWRlciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKikKLQkJICAgIF9fYWNwaV9tYXBfdGFibGUoc2R0X2VudHJ5W2ldLnBhLAotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwotCQlpZiAoIWhlYWRlcikKLQkJCWNvbnRpbnVlOwotCi0JCS8qIHJlbWFwIGluIHRoZSBlbnRpcmUgdGFibGUgYmVmb3JlIHByb2Nlc3NpbmcgKi8KLQkJaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKQotCQkgICAgX19hY3BpX21hcF90YWJsZShzZHRfZW50cnlbaV0ucGEsIGhlYWRlci0+bGVuZ3RoKTsKLQkJaWYgKCFoZWFkZXIpCi0JCQljb250aW51ZTsKLQotCQlhY3BpX3RhYmxlX3ByaW50KGhlYWRlciwgc2R0X2VudHJ5W2ldLnBhKTsKLQotCQlpZiAoYWNwaV90YWJsZV9jb21wdXRlX2NoZWNrc3VtKGhlYWRlciwgaGVhZGVyLT5sZW5ndGgpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIgID4+PiBFUlJPUjogSW52YWxpZCBjaGVja3N1bVxuIik7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXNkdF9lbnRyeVtpXS5zaXplID0gaGVhZGVyLT5sZW5ndGg7Ci0KLQkJZm9yIChpZCA9IDA7IGlkIDwgQUNQSV9UQUJMRV9DT1VOVDsgaWQrKykgewotCQkJaWYgKCFzdHJuY21wKChjaGFyICopJmhlYWRlci0+c2lnbmF0dXJlLAotCQkJCSAgICAgYWNwaV90YWJsZV9zaWduYXR1cmVzW2lkXSwKLQkJCQkgICAgIHNpemVvZihoZWFkZXItPnNpZ25hdHVyZSkpKSB7Ci0JCQkJc2R0X2VudHJ5W2ldLmlkID0gaWQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAKLQkgKiBUaGUgRFNEVCBpcyAqbm90KiBpbiB0aGUgUlNEVCAod2h5IG5vdD8gbm8gaWRlYS4pIGJ1dCB3ZSB3YW50Ci0JICogdG8gcHJpbnQgaXRzIGluZm8sIGJlY2F1c2UgdGhpcyBpcyB3aGF0IHBlb3BsZSB1c3VhbGx5IGJsYWNrbGlzdAotCSAqIGFnYWluc3QuIFVuZm9ydHVuYXRlbHksIHdlIGRvbid0IGtub3cgdGhlIHBoeXNfYWRkciwgc28ganVzdAotCSAqIHByaW50IDAuIE1heWJlIG5vIG9uZSB3aWxsIG5vdGljZS4KLQkgKi8KLQlpZiAoIWFjcGlfZ2V0X3RhYmxlX2hlYWRlcl9lYXJseShBQ1BJX0RTRFQsICZoZWFkZXIpKQotCQlhY3BpX3RhYmxlX3ByaW50KGhlYWRlciwgMCk7Ci0KLQlyZXR1cm4gMDsKKwlhY3BpX2dldF90YWJsZShpZCwgMCwgJnRhYmxlKTsKKwlpZiAodGFibGUpIHsKKwkJaGFuZGxlcih0YWJsZSk7CisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTU2OCw1NCArMjQ1LDEzIEBACiAgKgogICogZmluZCBSU0RQLCBmaW5kIGFuZCBjaGVja3N1bSBTRFQvWFNEVC4KICAqIGNoZWNrc3VtIGFsbCB0YWJsZXMsIHByaW50IFNEVC9YU0RUCi0gKiAKKyAqCiAgKiByZXN1bHQ6IHNkdF9lbnRyeVtdIGlzIGluaXRpYWxpemVkCiAgKi8KIAorCiBpbnQgX19pbml0IGFjcGlfdGFibGVfaW5pdCh2b2lkKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX3JzZHAgKnJzZHAgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgcnNkcF9waHlzID0gMDsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCS8qIExvY2F0ZSBhbmQgbWFwIHRoZSBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAoUlNEUCkgKi8KLQotCXJzZHBfcGh5cyA9IGFjcGlfZmluZF9yc2RwKCk7Ci0JaWYgKCFyc2RwX3BoeXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVW5hYmxlIHRvIGxvY2F0ZSBSU0RQXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcnNkcCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICopX19hY3BpX21hcF90YWJsZShyc2RwX3BoeXMsCi0JCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwKSk7Ci0JaWYgKCFyc2RwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJVbmFibGUgdG8gbWFwIFJTRFBcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVgKLQkgICAgICAgIlJTRFAgKHYlMy4zZCAlNi42cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBAIDB4JXBcbiIsCi0JICAgICAgIHJzZHAtPnJldmlzaW9uLCByc2RwLT5vZW1faWQsICh2b2lkICopcnNkcF9waHlzKTsKLQotCWlmIChyc2RwLT5yZXZpc2lvbiA8IDIpCi0JCXJlc3VsdCA9Ci0JCSAgICBhY3BpX3RhYmxlX2NvbXB1dGVfY2hlY2tzdW0ocnNkcCwKLQkJCQkJCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwKSk7Ci0JZWxzZQotCQlyZXN1bHQgPQotCQkgICAgYWNwaV90YWJsZV9jb21wdXRlX2NoZWNrc3VtKHJzZHAsCi0JCQkJCQkoKHN0cnVjdCBhY3BpMjBfdGFibGVfcnNkcCAqKQotCQkJCQkJIHJzZHApLT5sZW5ndGgpOwotCi0JaWYgKHJlc3VsdCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIgID4+PiBFUlJPUjogSW52YWxpZCBjaGVja3N1bVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIExvY2F0ZSBhbmQgbWFwIHRoZSBTeXN0ZW0gRGVzY3JpcHRpb24gdGFibGUgKFJTRFQvWFNEVCkgKi8KLQotCWlmIChhY3BpX3RhYmxlX2dldF9zZHQocnNkcCkpCi0JCXJldHVybiAtRU5PREVWOwotCisJYWNwaV9pbml0aWFsaXplX3RhYmxlcyhpbml0aWFsX3RhYmxlcywgQUNQSV9NQVhfVEFCTEVTLCAwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvdGFibGVzL01ha2VmaWxlCmluZGV4IGFhNGM2OTUuLjBhN2Q3YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy9NYWtlZmlsZQpAQCAtMiw3ICsyLDYgQEAKICMgTWFrZWZpbGUgZm9yIGFsbCBMaW51eCBBQ1BJIGludGVycHJldGVyIHN1YmRpcmVjdG9yaWVzCiAjCiAKLW9iai15IDo9IHRiY29udnJ0Lm8gIHRiZ2V0Lm8gICAgIHRicnNkdC5vICAgdGJ4ZmFjZS5vICBcCi0JIHRiZ2V0YWxsLm8gIHRiaW5zdGFsLm8gIHRidXRpbHMubyAgdGJ4ZnJvb3Qubworb2JqLXkgOj0gdGJ4ZmFjZS5vIHRiaW5zdGFsLm8gIHRidXRpbHMubyB0YmZpbmQubyB0YmZhZHQubwogCiBFWFRSQV9DRkxBR1MgKz0gJChBQ1BJX0NGTEFHUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5N2ZjYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiY29udnJ0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiB0YmNvbnZydCAtIEFDUEkgVGFibGUgY29udmVyc2lvbiB1dGlsaXRpZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotQUNQSV9NT0RVTEVfTkFNRSgidGJjb252cnQiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZAotYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyhzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKm5ld19nYXNfc3RydWN0LAotCQkJICAgICB1OCByZWdpc3Rlcl9iaXRfd2lkdGgsCi0JCQkgICAgIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzKTsKLQotc3RhdGljIHZvaWQKLWFjcGlfdGJfY29udmVydF9mYWR0MShzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpsb2NhbF9mYWR0LAotCQkgICAgICBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEgKm9yaWdpbmFsX2ZhZHQpOwotCi1zdGF0aWMgdm9pZAotYWNwaV90Yl9jb252ZXJ0X2ZhZHQyKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgKmxvY2FsX2ZhZHQsCi0JCSAgICAgIHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgKm9yaWdpbmFsX2ZhZHQpOwotCi11OCBhY3BpX2ZhZHRfaXNfdjE7Ci1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9mYWR0X2lzX3YxKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF90YWJsZV9jb3VudAotICoKLSAqIFBBUkFNRVRFUlM6ICBSU0RQICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBSU0RQCi0gKiAgICAgICAgICAgICAgUlNEVCAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgUlNEVC9YU0RUCi0gKgotICogUkVUVVJOOiAgICAgIFRoZSBudW1iZXIgb2YgdGFibGVzIHBvaW50ZWQgdG8gYnkgdGhlIFJTRFQgb3IgWFNEVC4KLSAqCi0gKiBERVNDUklQVElPTjogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGFibGVzLiAgQXV0b21hdGljYWxseSBoYW5kbGVzIGVpdGhlcgotICogICAgICAgICAgICAgIGFuIFJTRFQgb3IgWFNEVC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11MzIKLWFjcGlfdGJfZ2V0X3RhYmxlX2NvdW50KHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgKlJTRFAsCi0JCQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKlJTRFQpCi17Ci0JdTMyIHBvaW50ZXJfc2l6ZTsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIFJTRFQgcG9pbnRlcnMgYXJlIDMyIGJpdHMsIFhTRFQgcG9pbnRlcnMgYXJlIDY0IGJpdHMgKi8KLQotCWlmIChhY3BpX2dibF9yb290X3RhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9UWVBFX1JTRFQpIHsKLQkJcG9pbnRlcl9zaXplID0gc2l6ZW9mKHUzMik7Ci0JfSBlbHNlIHsKLQkJcG9pbnRlcl9zaXplID0gc2l6ZW9mKHU2NCk7Ci0JfQotCi0JLyoKLQkgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0YWJsZXMgcG9pbnRlZCB0byBieSB0aGUgUlNEVC9YU0RULgotCSAqIFRoaXMgaXMgZGVmaW5lZCBieSB0aGUgQUNQSSBTcGVjaWZpY2F0aW9uIHRvIGJlIHRoZSBudW1iZXIgb2YKLQkgKiBwb2ludGVycyBjb250YWluZWQgd2l0aGluIHRoZSBSU0RUL1hTRFQuICBUaGUgc2l6ZSBvZiB0aGUgcG9pbnRlcnMKLQkgKiBpcyBhcmNoaXRlY3R1cmUtZGVwZW5kZW50LgotCSAqLwotCXJldHVybiAoKFJTRFQtPmxlbmd0aCAtCi0JCSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgLyBwb2ludGVyX3NpemUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2NvbnZlcnRfdG9feHNkdAotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmZvICAgICAgLSBJbmZvIGFib3V0IHRoZSBSU0RUCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIFJTRFQgdG8gYW4gWFNEVCAoaW50ZXJuYWwgY29tbW9uIGZvcm1hdCkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX3RiX2NvbnZlcnRfdG9feHNkdChzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKQotewotCWFjcGlfc2l6ZSB0YWJsZV9zaXplOwotCXUzMiBpOwotCXN0cnVjdCB4c2R0X2Rlc2NyaXB0b3IgKm5ld190YWJsZTsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCS8qIENvbXB1dGUgc2l6ZSBvZiB0aGUgY29udmVydGVkIFhTRFQgKi8KLQotCXRhYmxlX3NpemUgPSAoKGFjcGlfc2l6ZSkgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudCAqIHNpemVvZih1NjQpKSArCi0JICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpOwotCi0JLyogQWxsb2NhdGUgYW4gWFNEVCAqLwotCi0JbmV3X3RhYmxlID0gQUNQSV9BTExPQ0FURV9aRVJPRUQodGFibGVfc2l6ZSk7Ci0JaWYgKCFuZXdfdGFibGUpIHsKLQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwotCX0KLQotCS8qIENvcHkgdGhlIGhlYWRlciBhbmQgc2V0IHRoZSBsZW5ndGggKi8KLQotCUFDUElfTUVNQ1BZKG5ld190YWJsZSwgdGFibGVfaW5mby0+cG9pbnRlciwKLQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKLQluZXdfdGFibGUtPmxlbmd0aCA9ICh1MzIpIHRhYmxlX3NpemU7Ci0KLQkvKiBDb3B5IHRoZSB0YWJsZSBwb2ludGVycyAqLwotCi0JZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQ7IGkrKykgewotCi0JCS8qIFJTRFQgcG9pbnRlcnMgYXJlIDMyIGJpdHMsIFhTRFQgcG9pbnRlcnMgYXJlIDY0IGJpdHMgKi8KLQotCQlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlID09IEFDUElfVEFCTEVfVFlQRV9SU0RUKSB7Ci0JCQlBQ1BJX1NUT1JFX0FERFJFU1MobmV3X3RhYmxlLT50YWJsZV9vZmZzZXRfZW50cnlbaV0sCi0JCQkJCSAgIChBQ1BJX0NBU1RfUFRSCi0JCQkJCSAgICAoc3RydWN0IHJzZHRfZGVzY3JpcHRvciwKLQkJCQkJICAgICB0YWJsZV9pbmZvLT5wb2ludGVyKSktPgotCQkJCQkgICB0YWJsZV9vZmZzZXRfZW50cnlbaV0pOwotCQl9IGVsc2UgewotCQkJbmV3X3RhYmxlLT50YWJsZV9vZmZzZXRfZW50cnlbaV0gPQotCQkJICAgIChBQ1BJX0NBU1RfUFRSKHN0cnVjdCB4c2R0X2Rlc2NyaXB0b3IsCi0JCQkJCSAgIHRhYmxlX2luZm8tPnBvaW50ZXIpKS0+Ci0JCQkgICAgdGFibGVfb2Zmc2V0X2VudHJ5W2ldOwotCQl9Ci0JfQotCi0JLyogRGVsZXRlIHRoZSBvcmlnaW5hbCB0YWJsZSAoZWl0aGVyIG1hcHBlZCBvciBpbiBhIGJ1ZmZlcikgKi8KLQotCWFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZSh0YWJsZV9pbmZvKTsKLQotCS8qIFBvaW50IHRoZSB0YWJsZSBkZXNjcmlwdG9yIHRvIHRoZSBuZXcgdGFibGUgKi8KLQotCXRhYmxlX2luZm8tPnBvaW50ZXIgPQotCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgbmV3X3RhYmxlKTsKLQl0YWJsZV9pbmZvLT5sZW5ndGggPSB0YWJsZV9zaXplOwotCXRhYmxlX2luZm8tPmFsbG9jYXRpb24gPSBBQ1BJX01FTV9BTExPQ0FURUQ7Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcwotICoKLSAqIFBBUkFNRVRFUlM6ICBuZXdfZ2FzX3N0cnVjdCAgICAgIC0gR0FTIHN0cnVjdCB0byBiZSBpbml0aWFsaXplZAotICogICAgICAgICAgICAgIHJlZ2lzdGVyX2JpdF93aWR0aCAgLSBXaWR0aCBvZiB0aGlzIHJlZ2lzdGVyCi0gKiAgICAgICAgICAgICAgQWRkcmVzcyAgICAgICAgICAgICAtIEFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVyCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBhIEdBUyBzdHJ1Y3R1cmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3Moc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpuZXdfZ2FzX3N0cnVjdCwKLQkJCSAgICAgdTggcmVnaXN0ZXJfYml0X3dpZHRoLAotCQkJICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcykKLXsKLQotCUFDUElfU1RPUkVfQUREUkVTUyhuZXdfZ2FzX3N0cnVjdC0+YWRkcmVzcywgYWRkcmVzcyk7Ci0KLQluZXdfZ2FzX3N0cnVjdC0+YWRkcmVzc19zcGFjZV9pZCA9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzsKLQluZXdfZ2FzX3N0cnVjdC0+cmVnaXN0ZXJfYml0X3dpZHRoID0gcmVnaXN0ZXJfYml0X3dpZHRoOwotCW5ld19nYXNfc3RydWN0LT5yZWdpc3Rlcl9iaXRfb2Zmc2V0ID0gMDsKLQluZXdfZ2FzX3N0cnVjdC0+YWNjZXNzX3dpZHRoID0gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9jb252ZXJ0X2ZhZHQxCi0gKgotICogUEFSQU1FVEVSUzogIGxvY2FsX2ZhZHQgICAgICAtIFBvaW50ZXIgdG8gbmV3IEZBRFQKLSAqICAgICAgICAgICAgICBvcmlnaW5hbF9mYWR0ICAgLSBQb2ludGVyIHRvIG9sZCBGQURUCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUsIHBvcHVsYXRlcyBsb2NhbF9mYWR0Ci0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gQUNQSSAxLjAgRkFEVCB0byBjb21tb24gaW50ZXJuYWwgZm9ybWF0Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfdGJfY29udmVydF9mYWR0MShzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpsb2NhbF9mYWR0LAotCQkgICAgICBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEgKm9yaWdpbmFsX2ZhZHQpCi17Ci0KLQkvKiBBQ1BJIDEuMCBGQUNTICovCi0JLyogVGhlIEJJT1Mgc3RvcmVkIEZBRFQgc2hvdWxkIGFncmVlIHdpdGggUmV2aXNpb24gMS4wICovCi0JYWNwaV9mYWR0X2lzX3YxID0gMTsKLQotCS8qCi0JICogQ29weSB0aGUgdGFibGUgaGVhZGVyIGFuZCB0aGUgY29tbW9uIHBhcnQgb2YgdGhlIHRhYmxlcy4KLQkgKgotCSAqIFRoZSAyLjAgdGFibGUgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSAxLjAgdGFibGUsIHNvIHRoZSBlbnRpcmUgMS4wCi0JICogdGFibGUgY2FuIGJlIGNvcGllZCBmaXJzdCwgdGhlbiBleHBhbmQgc29tZSBmaWVsZHMgdG8gNjQgYml0cy4KLQkgKi8KLQlBQ1BJX01FTUNQWShsb2NhbF9mYWR0LCBvcmlnaW5hbF9mYWR0LAotCQkgICAgc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSkpOwotCi0JLyogQ29udmVydCB0YWJsZSBwb2ludGVycyB0byA2NC1iaXQgZmllbGRzICovCi0KLQlBQ1BJX1NUT1JFX0FERFJFU1MobG9jYWxfZmFkdC0+eGZpcm13YXJlX2N0cmwsCi0JCQkgICBsb2NhbF9mYWR0LT5WMV9maXJtd2FyZV9jdHJsKTsKLQlBQ1BJX1NUT1JFX0FERFJFU1MobG9jYWxfZmFkdC0+WGRzZHQsIGxvY2FsX2ZhZHQtPlYxX2RzZHQpOwotCi0JLyoKLQkgKiBTeXN0ZW0gSW50ZXJydXB0IE1vZGVsIGlzbid0IHVzZWQgaW4gQUNQSSAyLjAKLQkgKiAobG9jYWxfZmFkdC0+UmVzZXJ2ZWQxID0gMDspCi0JICovCi0KLQkvKgotCSAqIFRoaXMgZmllbGQgaXMgc2V0IGJ5IHRoZSBPRU0gdG8gY29udmV5IHRoZSBwcmVmZXJyZWQgcG93ZXIgbWFuYWdlbWVudAotCSAqIHByb2ZpbGUgdG8gT1NQTS4gSXQgZG9lc24ndCBoYXZlIGFueSAxLjAgZXF1aXZhbGVuY2UuICBTaW5jZSB3ZSBkb24ndAotCSAqIGtub3cgd2hhdCBraW5kIG9mIDMyLWJpdCBzeXN0ZW0gdGhpcyBpcywgd2Ugd2lsbCB1c2UgInVuc3BlY2lmaWVkIi4KLQkgKi8KLQlsb2NhbF9mYWR0LT5wcmVmZXJfUE1fcHJvZmlsZSA9IFBNX1VOU1BFQ0lGSUVEOwotCi0JLyoKLQkgKiBQcm9jZXNzb3IgUGVyZm9ybWFuY2UgU3RhdGUgQ29udHJvbC4gVGhpcyBpcyB0aGUgdmFsdWUgT1NQTSB3cml0ZXMgdG8KLQkgKiB0aGUgU01JX0NNRCByZWdpc3RlciB0byBhc3N1bWUgcHJvY2Vzc29yIHBlcmZvcm1hbmNlIHN0YXRlIGNvbnRyb2wKLQkgKiByZXNwb25zaWJpbGl0eS4gVGhlcmUgaXNuJ3QgYW55IGVxdWl2YWxlbmNlIGluIDEuMCwgYnV0IGFzIG1hbnkgMS54Ci0JICogQUNQSSB0YWJsZXMgY29udGFpbiBfUENUIGFuZCBfUFNTIHdlIGFsc28ga2VlcCB0aGlzIHZhbHVlLCB1bmxlc3MKLQkgKiBhY3BpX3N0cmljdCBpcyBzZXQuCi0JICovCi0JaWYgKGFjcGlfc3RyaWN0KQotCQlsb2NhbF9mYWR0LT5wc3RhdGVfY250ID0gMDsKLQotCS8qCi0JICogU3VwcG9ydCBmb3IgdGhlIF9DU1Qgb2JqZWN0IGFuZCBDIFN0YXRlcyBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIFRoaXMgZGF0YSBpdGVtIGhhc24ndCBhbnkgMS4wIGVxdWl2YWxlbmNlIHNvIGxlYXZlIGl0IHplcm8uCi0JICovCi0JbG9jYWxfZmFkdC0+Y3N0X2NudCA9IDA7Ci0KLQkvKgotCSAqIEZBRFQgUmV2IDIgd2FzIGFuIGludGVyaW0gRkFEVCByZWxlYXNlZCBiZXR3ZWVuIEFDUEkgMS4wIGFuZCBBQ1BJIDIuMC4KLQkgKiBJdCBwcmltYXJpbHkgYWRkcyB0aGUgRkFEVCByZXNldCBtZWNoYW5pc20uCi0JICovCi0JaWYgKChvcmlnaW5hbF9mYWR0LT5yZXZpc2lvbiA9PSAyKSAmJgotCSAgICAob3JpZ2luYWxfZmFkdC0+bGVuZ3RoID09Ci0JICAgICBzaXplb2Yoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyX21pbnVzKSkpIHsKLQkJLyoKLQkJICogR3JhYiB0aGUgZW50aXJlIGdlbmVyaWMgYWRkcmVzcyBzdHJ1Y3QsIHBsdXMgdGhlIDEtYnl0ZSByZXNldCB2YWx1ZQotCQkgKiB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvd3MuCi0JCSAqLwotCQlBQ1BJX01FTUNQWSgmbG9jYWxfZmFkdC0+cmVzZXRfcmVnaXN0ZXIsCi0JCQkgICAgJihBQ1BJX0NBU1RfUFRSKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Ml9taW51cywKLQkJCQkJICAgIG9yaWdpbmFsX2ZhZHQpKS0+cmVzZXRfcmVnaXN0ZXIsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcykgKyAxKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBTaW5jZSB0aGVyZSBpc24ndCBhbnkgZXF1aXZhbGVuY2UgaW4gMS4wIGFuZCBzaW5jZSBpdCBpcyBoaWdobHkKLQkJICogbGlrZWx5IHRoYXQgYSAxLjAgc3lzdGVtIGhhcyBsZWdhY3kgc3VwcG9ydC4KLQkJICovCi0JCWxvY2FsX2ZhZHQtPmlhcGNfYm9vdF9hcmNoID0gQkFGX0xFR0FDWV9ERVZJQ0VTOwotCX0KLQotCS8qCi0JICogQ29udmVydCB0aGUgVjEuMCBibG9jayBhZGRyZXNzZXMgdG8gVjIuMCBHQVMgc3RydWN0dXJlcwotCSAqLwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGssCi0JCQkJICAgICBsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwKLQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPgotCQkJCSAgICAgVjFfcG0xYV9ldnRfYmxrKTsKLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLAotCQkJCSAgICAgbG9jYWxfZmFkdC0+cG0xX2V2dF9sZW4sCi0JCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT4KLQkJCQkgICAgIFYxX3BtMWJfZXZ0X2Jsayk7Ci0JYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtMWFfY250X2JsaywKLQkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAotCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+Ci0JCQkJICAgICBWMV9wbTFhX2NudF9ibGspOwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhwbTFiX2NudF9ibGssCi0JCQkJICAgICBsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwKLQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPgotCQkJCSAgICAgVjFfcG0xYl9jbnRfYmxrKTsKLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0yX2NudF9ibGssCi0JCQkJICAgICBsb2NhbF9mYWR0LT5wbTJfY250X2xlbiwKLQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPgotCQkJCSAgICAgVjFfcG0yX2NudF9ibGspOwotCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhwbV90bXJfYmxrLAotCQkJCSAgICAgbG9jYWxfZmFkdC0+cG1fdG1fbGVuLAotCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+Ci0JCQkJICAgICBWMV9wbV90bXJfYmxrKTsKLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54Z3BlMF9ibGssIDAsCi0JCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT4KLQkJCQkgICAgIFYxX2dwZTBfYmxrKTsKLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54Z3BlMV9ibGssIDAsCi0JCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT4KLQkJCQkgICAgIFYxX2dwZTFfYmxrKTsKLQotCS8qIENyZWF0ZSBzZXBhcmF0ZSBHQVMgc3RydWN0cyBmb3IgdGhlIFBNMSBFbmFibGUgcmVnaXN0ZXJzICovCi0KLQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF94cG0xYV9lbmFibGUsCi0JCQkJICAgICAodTgpIEFDUElfRElWXzIoYWNwaV9nYmxfRkFEVC0+Ci0JCQkJCQkgICAgIHBtMV9ldnRfbGVuKSwKLQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkJICAgICAobG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzICsKLQkJCQkgICAgICBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSkpOwotCi0JLyogUE0xQiBpcyBvcHRpb25hbDsgbGVhdmUgbnVsbCBpZiBub3QgcHJlc2VudCAqLwotCi0JaWYgKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcykgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF94cG0xYl9lbmFibGUsCi0JCQkJCSAgICAgKHU4KSBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPgotCQkJCQkJCSAgICAgcG0xX2V2dF9sZW4pLAotCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkJCSAgICAgKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuCi0JCQkJCSAgICAgIGFkZHJlc3MgKwotCQkJCQkgICAgICBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPgotCQkJCQkJCSBwbTFfZXZ0X2xlbikpKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfY29udmVydF9mYWR0MgotICoKLSAqIFBBUkFNRVRFUlM6ICBsb2NhbF9mYWR0ICAgICAgLSBQb2ludGVyIHRvIG5ldyBGQURUCi0gKiAgICAgICAgICAgICAgb3JpZ2luYWxfZmFkdCAgIC0gUG9pbnRlciB0byBvbGQgRkFEVAotICoKLSAqIFJFVFVSTjogICAgICBOb25lLCBwb3B1bGF0ZXMgbG9jYWxfZmFkdAotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIEFDUEkgMi4wIEZBRFQgdG8gY29tbW9uIGludGVybmFsIGZvcm1hdC4KLSAqICAgICAgICAgICAgICBIYW5kbGVzIG9wdGlvbmFsICJYIiBmaWVsZHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWFjcGlfdGJfY29udmVydF9mYWR0MihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpsb2NhbF9mYWR0LAotCQkgICAgICBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpvcmlnaW5hbF9mYWR0KQotewotCi0JLyogV2UgaGF2ZSBhbiBBQ1BJIDIuMCBGQURUIGJ1dCB3ZSBtdXN0IGNvcHkgaXQgdG8gb3VyIGxvY2FsIGJ1ZmZlciAqLwotCi0JQUNQSV9NRU1DUFkobG9jYWxfZmFkdCwgb3JpZ2luYWxfZmFkdCwgc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IpKTsKLQotCS8qCi0JICogIlgiIGZpZWxkcyBhcmUgb3B0aW9uYWwgZXh0ZW5zaW9ucyB0byB0aGUgb3JpZ2luYWwgVjEuMCBmaWVsZHMsIHNvCi0JICogd2UgbXVzdCBzZWxlY3RpdmVseSBleHBhbmQgVjEuMCBmaWVsZHMgaWYgdGhlIGNvcnJlc3BvbmRpbmcgWCBmaWVsZAotCSAqIGlzIHplcm8uCi0JICovCi0JaWYgKCEobG9jYWxfZmFkdC0+eGZpcm13YXJlX2N0cmwpKSB7Ci0JCUFDUElfU1RPUkVfQUREUkVTUyhsb2NhbF9mYWR0LT54ZmlybXdhcmVfY3RybCwKLQkJCQkgICBsb2NhbF9mYWR0LT5WMV9maXJtd2FyZV9jdHJsKTsKLQl9Ci0KLQlpZiAoIShsb2NhbF9mYWR0LT5YZHNkdCkpIHsKLQkJQUNQSV9TVE9SRV9BRERSRVNTKGxvY2FsX2ZhZHQtPlhkc2R0LCBsb2NhbF9mYWR0LT5WMV9kc2R0KTsKLQl9Ci0KLQlpZiAoIShsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3MpKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGssCi0JCQkJCSAgICAgbG9jYWxfZmFkdC0+cG0xX2V2dF9sZW4sCi0JCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkJICAgICBsb2NhbF9mYWR0LT5WMV9wbTFhX2V2dF9ibGspOwotCX0KLQotCWlmICghKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcykpIHsKLQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2JsaywKLQkJCQkJICAgICBsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwKLQkJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJCQkgICAgIGxvY2FsX2ZhZHQtPlYxX3BtMWJfZXZ0X2Jsayk7Ci0JfQotCi0JaWYgKCEobG9jYWxfZmFkdC0+eHBtMWFfY250X2Jsay5hZGRyZXNzKSkgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0xYV9jbnRfYmxrLAotCQkJCQkgICAgIGxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAotCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkJCSAgICAgbG9jYWxfZmFkdC0+VjFfcG0xYV9jbnRfYmxrKTsKLQl9Ci0KLQlpZiAoIShsb2NhbF9mYWR0LT54cG0xYl9jbnRfYmxrLmFkZHJlc3MpKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhwbTFiX2NudF9ibGssCi0JCQkJCSAgICAgbG9jYWxfZmFkdC0+cG0xX2NudF9sZW4sCi0JCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkJICAgICBsb2NhbF9mYWR0LT5WMV9wbTFiX2NudF9ibGspOwotCX0KLQotCWlmICghKGxvY2FsX2ZhZHQtPnhwbTJfY250X2Jsay5hZGRyZXNzKSkgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54cG0yX2NudF9ibGssCi0JCQkJCSAgICAgbG9jYWxfZmFkdC0+cG0yX2NudF9sZW4sCi0JCQkJCSAgICAgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkJICAgICBsb2NhbF9mYWR0LT5WMV9wbTJfY250X2Jsayk7Ci0JfQotCi0JaWYgKCEobG9jYWxfZmFkdC0+eHBtX3Rtcl9ibGsuYWRkcmVzcykpIHsKLQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmbG9jYWxfZmFkdC0+eHBtX3Rtcl9ibGssCi0JCQkJCSAgICAgbG9jYWxfZmFkdC0+cG1fdG1fbGVuLAotCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkJCSAgICAgbG9jYWxfZmFkdC0+VjFfcG1fdG1yX2Jsayk7Ci0JfQotCi0JaWYgKCEobG9jYWxfZmFkdC0+eGdwZTBfYmxrLmFkZHJlc3MpKSB7Ci0JCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MoJmxvY2FsX2ZhZHQtPnhncGUwX2JsaywKLQkJCQkJICAgICAwLAotCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkJCSAgICAgbG9jYWxfZmFkdC0+VjFfZ3BlMF9ibGspOwotCX0KLQotCWlmICghKGxvY2FsX2ZhZHQtPnhncGUxX2Jsay5hZGRyZXNzKSkgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZsb2NhbF9mYWR0LT54Z3BlMV9ibGssCi0JCQkJCSAgICAgMCwKLQkJCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJCQkgICAgIGxvY2FsX2ZhZHQtPlYxX2dwZTFfYmxrKTsKLQl9Ci0KLQkvKiBDcmVhdGUgc2VwYXJhdGUgR0FTIHN0cnVjdHMgZm9yIHRoZSBQTTEgRW5hYmxlIHJlZ2lzdGVycyAqLwotCi0JYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfeHBtMWFfZW5hYmxlLAotCQkJCSAgICAgKHU4KSBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPgotCQkJCQkJICAgICBwbTFfZXZ0X2xlbiksCi0JCQkJICAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJCSAgICAgKGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcyArCi0JCQkJICAgICAgQUNQSV9ESVZfMihhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikpKTsKLQotCWFjcGlfZ2JsX3hwbTFhX2VuYWJsZS5hZGRyZXNzX3NwYWNlX2lkID0KLQkgICAgbG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzX3NwYWNlX2lkOwotCi0JLyogUE0xQiBpcyBvcHRpb25hbDsgbGVhdmUgbnVsbCBpZiBub3QgcHJlc2VudCAqLwotCi0JaWYgKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcykgewotCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKCZhY3BpX2dibF94cG0xYl9lbmFibGUsCi0JCQkJCSAgICAgKHU4KSBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPgotCQkJCQkJCSAgICAgcG0xX2V2dF9sZW4pLAotCQkJCQkgICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCi0JCQkJCSAgICAgKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuCi0JCQkJCSAgICAgIGFkZHJlc3MgKwotCQkJCQkgICAgICBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQtPgotCQkJCQkJCSBwbTFfZXZ0X2xlbikpKTsKLQotCQlhY3BpX2dibF94cG0xYl9lbmFibGUuYWRkcmVzc19zcGFjZV9pZCA9Ci0JCSAgICBsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3Nfc3BhY2VfaWQ7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdAotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0cyBhIEJJT1Mgc3VwcGxpZWQgQUNQSSAxLjAgRkFEVCB0byBhIGxvY2FsCi0gKiAgICAgICAgICAgICAgQUNQSSAyLjAgRkFEVC4gSWYgdGhlIEJJT1Mgc3VwcGxpZWQgYSAyLjAgRkFEVCB0aGVuIGl0IGlzIHNpbXBseQotICogICAgICAgICAgICAgIGNvcGllZCB0byB0aGUgbG9jYWwgRkFEVC4gIFRoZSBBQ1BJIENBIHNvZnR3YXJlIHVzZXMgdGhpcwotICogICAgICAgICAgICAgIGxvY2FsIEZBRFQuIFRodXMgYSBzaWduaWZpY2FudCBhbW91bnQgb2Ygc3BlY2lhbCAjaWZkZWYKLSAqICAgICAgICAgICAgICB0eXBlIGNvZGVpbmcgaXMgc2F2ZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQodm9pZCkKLXsKLQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpsb2NhbF9mYWR0OwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2NvbnZlcnRfdGFibGVfZmFkdCk7Ci0KLQkvKgotCSAqIGFjcGlfZ2JsX0ZBRFQgaXMgdmFsaWQuIFZhbGlkYXRlIHRoZSBGQURUIGxlbmd0aC4gVGhlIHRhYmxlIG11c3QgYmUKLQkgKiBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSB2ZXJzaW9uIDEuMCBGQURUCi0JICovCi0JaWYgKGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJGQURUIGlzIGludmFsaWQsIHRvbyBzaG9ydDogMHglWCIsCi0JCQkgICAgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7Ci0JfQotCi0JLyogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgQUNQSSAyLjAoKykgRkFEVCAqLwotCi0JbG9jYWxfZmFkdCA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yKSk7Ci0JaWYgKCFsb2NhbF9mYWR0KSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwotCX0KLQotCWlmIChhY3BpX2dibF9GQURULT5yZXZpc2lvbiA+PSBGQURUMl9SRVZJU0lPTl9JRCkgewotCQlpZiAoYWNwaV9nYmxfRkFEVC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IpKSB7Ci0KLQkJCS8qIExlbmd0aCBpcyB0b28gc2hvcnQgdG8gYmUgYSBWMi4wIHRhYmxlICovCi0KLQkJCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCQkgICAgICAiSW5jb25zaXN0ZW50IEZBRFQgbGVuZ3RoICgweCVYKSBhbmQgcmV2aXNpb24gKDB4JVgpLCB1c2luZyBGQURUIFYxLjAgcG9ydGlvbiBvZiB0YWJsZSIsCi0JCQkJICAgICAgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoLAotCQkJCSAgICAgIGFjcGlfZ2JsX0ZBRFQtPnJldmlzaW9uKSk7Ci0KLQkJCWFjcGlfdGJfY29udmVydF9mYWR0MShsb2NhbF9mYWR0LAotCQkJCQkgICAgICAodm9pZCAqKWFjcGlfZ2JsX0ZBRFQpOwotCQl9IGVsc2UgewotCQkJLyogVmFsaWQgVjIuMCB0YWJsZSAqLwotCi0JCQlhY3BpX3RiX2NvbnZlcnRfZmFkdDIobG9jYWxfZmFkdCwgYWNwaV9nYmxfRkFEVCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBWYWxpZCBWMS4wIHRhYmxlICovCi0KLQkJYWNwaV90Yl9jb252ZXJ0X2ZhZHQxKGxvY2FsX2ZhZHQsICh2b2lkICopYWNwaV9nYmxfRkFEVCk7Ci0JfQotCi0JLyogR2xvYmFsIEZBRFQgcG9pbnRlciB3aWxsIHBvaW50IHRvIHRoZSBuZXcgY29tbW9uIFYyLjAgRkFEVCAqLwotCi0JYWNwaV9nYmxfRkFEVCA9IGxvY2FsX2ZhZHQ7Ci0JYWNwaV9nYmxfRkFEVC0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IpOwotCi0JLyogRnJlZSB0aGUgb3JpZ2luYWwgdGFibGUgKi8KLQotCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1tBQ1BJX1RBQkxFX0lEX0ZBRFRdLm5leHQ7Ci0JYWNwaV90Yl9kZWxldGVfc2luZ2xlX3RhYmxlKHRhYmxlX2Rlc2MpOwotCi0JLyogSW5zdGFsbCB0aGUgbmV3IHRhYmxlICovCi0KLQl0YWJsZV9kZXNjLT5wb2ludGVyID0KLQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsIGFjcGlfZ2JsX0ZBRFQpOwotCXRhYmxlX2Rlc2MtPmFsbG9jYXRpb24gPSBBQ1BJX01FTV9BTExPQ0FURUQ7Ci0JdGFibGVfZGVzYy0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IpOwotCi0JLyogRHVtcCB0aGUgZW50aXJlIEZBRFQgKi8KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLAotCQkJICAiSGV4IGR1bXAgb2YgY29tbW9uIGludGVybmFsIEZBRFQsIHNpemUgJWQgKCVYKVxuIiwKLQkJCSAgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoLCBhY3BpX2dibF9GQURULT5sZW5ndGgpKTsKLQotCUFDUElfRFVNUF9CVUZGRVIoQUNQSV9DQVNUX1BUUih1OCwgYWNwaV9nYmxfRkFEVCksCi0JCQkgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfYnVpbGRfY29tbW9uX2ZhY3MKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfaW5mbyAgICAgIC0gSW5mbyBmb3IgY3VycmVudGx5IGluc3RhbGxlZCBGQUNTCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IEFDUEkgMS4wIGFuZCBBQ1BJIDIuMCBGQUNTIHRvIGEgY29tbW9uIGludGVybmFsCi0gKiAgICAgICAgICAgICAgdGFibGUgZm9ybWF0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfdGJfYnVpbGRfY29tbW9uX2ZhY3Moc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKLXsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfYnVpbGRfY29tbW9uX2ZhY3MpOwotCi0JLyogQWJzb2x1dGUgbWluaW11bSBsZW5ndGggaXMgMjQsIGJ1dCB0aGUgQUNQSSBzcGVjIHNheXMgNjQgKi8KLQotCWlmIChhY3BpX2dibF9GQUNTLT5sZW5ndGggPCAyNCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBGQUNTIHRhYmxlIGxlbmd0aDogMHglWCIsCi0JCQkgICAgYWNwaV9nYmxfRkFDUy0+bGVuZ3RoKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7Ci0JfQotCi0JaWYgKGFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCA8IDY0KSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCSAgICAgICJGQUNTIGlzIHNob3J0ZXIgdGhhbiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIGFsbG93czogMHglWCwgdXNpbmcgYW55d2F5IiwKLQkJCSAgICAgIGFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCkpOwotCX0KLQotCS8qIENvcHkgZmllbGRzIHRvIHRoZSBuZXcgRkFDUyAqLwotCi0JYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZ2xvYmFsX2xvY2sgPSAmKGFjcGlfZ2JsX0ZBQ1MtPmdsb2JhbF9sb2NrKTsKLQotCWlmICgoYWNwaV9nYmxfUlNEUC0+cmV2aXNpb24gPCAyKSB8fAotCSAgICAoYWNwaV9nYmxfRkFDUy0+bGVuZ3RoIDwgMzIpIHx8Ci0JICAgICghKGFjcGlfZ2JsX0ZBQ1MtPnhmaXJtd2FyZV93YWtpbmdfdmVjdG9yKSkpIHsKLQotCQkvKiBBQ1BJIDEuMCBGQUNTIG9yIHNob3J0IHRhYmxlIG9yIG9wdGlvbmFsIFhfIGZpZWxkIGlzIHplcm8gKi8KLQotCQlhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0gQUNQSV9DQVNUX1BUUih1NjQsCi0JCQkJCQkJCQkgICAgJgotCQkJCQkJCQkJICAgIChhY3BpX2dibF9GQUNTLT4KLQkJCQkJCQkJCSAgICAgZmlybXdhcmVfd2FraW5nX3ZlY3RvcikpOwotCQlhY3BpX2dibF9jb21tb25fZkFDUy52ZWN0b3Jfd2lkdGggPSAzMjsKLQl9IGVsc2UgewotCQkvKiBBQ1BJIDIuMCBGQUNTIHdpdGggdmFsaWQgWF8gZmllbGQgKi8KLQotCQlhY3BpX2dibF9jb21tb25fZkFDUy5maXJtd2FyZV93YWtpbmdfdmVjdG9yID0KLQkJICAgICZhY3BpX2dibF9GQUNTLT54ZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsKLQkJYWNwaV9nYmxfY29tbW9uX2ZBQ1MudmVjdG9yX3dpZHRoID0gNjQ7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJmYWR0LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZmFkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2M3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZmFkdC5jCkBAIC0wLDAgKzEsNDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kdWxlIE5hbWU6IHRiZmFkdCAgIC0gRkFEVCB0YWJsZSB1dGlsaXRpZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUworQUNQSV9NT0RVTEVfTkFNRSgidGJmYWR0IikKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgaW5saW5lCithY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZ2VuZXJpY19hZGRyZXNzLAorCQkJICAgICB1OCBiaXRfd2lkdGgsIHU2NCBhZGRyZXNzKTsKKworc3RhdGljIHZvaWQgYWNwaV90Yl9jb252ZXJ0X2ZhZHQodm9pZCk7CisKK3N0YXRpYyB2b2lkIGFjcGlfdGJfdmFsaWRhdGVfZmFkdCh2b2lkKTsKKworLyogVGFibGUgZm9yIGNvbnZlcnNpb24gb2YgRkFEVCB0byBjb21tb24gaW50ZXJuYWwgZm9ybWF0IGFuZCBGQURUIHZhbGlkYXRpb24gKi8KKwordHlwZWRlZiBzdHJ1Y3QgYWNwaV9mYWR0X2luZm8geworCWNoYXIgKm5hbWU7CisJdTggdGFyZ2V0OworCXU4IHNvdXJjZTsKKwl1OCBsZW5ndGg7CisJdTggdHlwZTsKKworfSBhY3BpX2ZhZHRfaW5mbzsKKworI2RlZmluZSBBQ1BJX0ZBRFRfUkVRVUlSRUQgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX0ZBRFRfU0VQQVJBVEVfTEVOR1RIICAgMgorCitzdGF0aWMgc3RydWN0IGFjcGlfZmFkdF9pbmZvIGZhZHRfaW5mb190YWJsZVtdID0geworCXsiUG0xYUV2ZW50QmxvY2siLCBBQ1BJX0ZBRFRfT0ZGU0VUKHhwbTFhX2V2ZW50X2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbTFhX2V2ZW50X2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbTFfZXZlbnRfbGVuZ3RoKSwgQUNQSV9GQURUX1JFUVVJUkVEfSwKKworCXsiUG0xYkV2ZW50QmxvY2siLCBBQ1BJX0ZBRFRfT0ZGU0VUKHhwbTFiX2V2ZW50X2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbTFiX2V2ZW50X2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbTFfZXZlbnRfbGVuZ3RoKSwgMH0sCisKKwl7IlBtMWFDb250cm9sQmxvY2siLCBBQ1BJX0ZBRFRfT0ZGU0VUKHhwbTFhX2NvbnRyb2xfYmxvY2spLAorCSBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMWFfY29udHJvbF9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQocG0xX2NvbnRyb2xfbGVuZ3RoKSwgQUNQSV9GQURUX1JFUVVJUkVEfSwKKworCXsiUG0xYkNvbnRyb2xCbG9jayIsIEFDUElfRkFEVF9PRkZTRVQoeHBtMWJfY29udHJvbF9ibG9jayksCisJIEFDUElfRkFEVF9PRkZTRVQocG0xYl9jb250cm9sX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbTFfY29udHJvbF9sZW5ndGgpLCAwfSwKKworCXsiUG0yQ29udHJvbEJsb2NrIiwgQUNQSV9GQURUX09GRlNFVCh4cG0yX2NvbnRyb2xfYmxvY2spLAorCSBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMl9jb250cm9sX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbTJfY29udHJvbF9sZW5ndGgpLCBBQ1BJX0ZBRFRfU0VQQVJBVEVfTEVOR1RIfSwKKworCXsiUG1UaW1lckJsb2NrIiwgQUNQSV9GQURUX09GRlNFVCh4cG1fdGltZXJfYmxvY2spLAorCSBBQ1BJX0ZBRFRfT0ZGU0VUKHBtX3RpbWVyX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChwbV90aW1lcl9sZW5ndGgpLCBBQ1BJX0ZBRFRfUkVRVUlSRUR9LAorCisJeyJHcGUwQmxvY2siLCBBQ1BJX0ZBRFRfT0ZGU0VUKHhncGUwX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChncGUwX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChncGUwX2Jsb2NrX2xlbmd0aCksIEFDUElfRkFEVF9TRVBBUkFURV9MRU5HVEh9LAorCisJeyJHcGUxQmxvY2siLCBBQ1BJX0ZBRFRfT0ZGU0VUKHhncGUxX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChncGUxX2Jsb2NrKSwKKwkgQUNQSV9GQURUX09GRlNFVChncGUxX2Jsb2NrX2xlbmd0aCksIEFDUElfRkFEVF9TRVBBUkFURV9MRU5HVEh9Cit9OworCisjZGVmaW5lIEFDUElfRkFEVF9JTkZPX0VOVFJJRVMgICAgICAgIChzaXplb2YgKGZhZHRfaW5mb190YWJsZSkgLyBzaXplb2YgKHN0cnVjdCBhY3BpX2ZhZHRfaW5mbykpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MKKyAqCisgKiBQQVJBTUVURVJTOiAgZ2VuZXJpY19hZGRyZXNzICAgICAtIEdBUyBzdHJ1Y3QgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqICAgICAgICAgICAgICBiaXRfd2lkdGggICAgICAgICAgIC0gV2lkdGggb2YgdGhpcyByZWdpc3RlcgorICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgLSBBZGRyZXNzIG9mIHRoZSByZWdpc3RlcgorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgYSBHZW5lcmljIEFkZHJlc3MgU3RydWN0dXJlIChHQVMpCisgKiAgICAgICAgICAgICAgU2VlIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24gZm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBhbmQKKyAqICAgICAgICAgICAgICBkZWZpbml0aW9uIG9mIHRoaXMgc3RydWN0dXJlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGlubGluZQorYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyhzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmdlbmVyaWNfYWRkcmVzcywKKwkJCSAgICAgdTggYml0X3dpZHRoLCB1NjQgYWRkcmVzcykKK3sKKworCS8qCisJICogVGhlIDY0LWJpdCBBZGRyZXNzIGZpZWxkIGlzIG5vbi1hbGlnbmVkIGluIHRoZSBieXRlIHBhY2tlZAorCSAqIEdBUyBzdHJ1Y3QuCisJICovCisJQUNQSV9NT1ZFXzY0X1RPXzY0KCZnZW5lcmljX2FkZHJlc3MtPmFkZHJlc3MsICZhZGRyZXNzKTsKKworCS8qIEFsbCBvdGhlciBmaWVsZHMgYXJlIGJ5dGUtd2lkZSAqLworCisJZ2VuZXJpY19hZGRyZXNzLT5zcGFjZV9pZCA9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTzsKKwlnZW5lcmljX2FkZHJlc3MtPmJpdF93aWR0aCA9IGJpdF93aWR0aDsKKwlnZW5lcmljX2FkZHJlc3MtPmJpdF9vZmZzZXQgPSAwOworCWdlbmVyaWNfYWRkcmVzcy0+YWNjZXNzX3dpZHRoID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9wYXJzZV9mYWR0CisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2luZGV4ICAgICAgICAgLSBJbmRleCBmb3IgdGhlIEZBRFQKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRmxhZ3MKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIHRoZSBGQURULCBEU0RUIGFuZCBGQUNTIHRhYmxlcworICogICAgICAgICAgICAgIChGQURUIGNvbnRhaW5zIHRoZSBhZGRyZXNzZXMgb2YgdGhlIERTRFQgYW5kIEZBQ1MpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBhY3BpX3RiX3BhcnNlX2ZhZHQoYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleCwgdTggZmxhZ3MpCit7CisJdTMyIGxlbmd0aDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOworCisJLyoKKwkgKiBUaGUgRkFEVCBoYXMgbXVsdGlwbGUgdmVyc2lvbnMgd2l0aCBkaWZmZXJlbnQgbGVuZ3RocywKKwkgKiBhbmQgaXQgY29udGFpbnMgcG9pbnRlcnMgdG8gYm90aCB0aGUgRFNEVCBhbmQgRkFDUyB0YWJsZXMuCisJICoKKwkgKiBHZXQgYSBsb2NhbCBjb3B5IG9mIHRoZSBGQURUIGFuZCBjb252ZXJ0IGl0IHRvIGEgY29tbW9uIGZvcm1hdAorCSAqIE1hcCBlbnRpcmUgRkFEVCwgYXNzdW1lZCB0byBiZSBzbWFsbGVyIHRoYW4gb25lIHBhZ2UuCisJICovCisJbGVuZ3RoID0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0ubGVuZ3RoOworCisJdGFibGUgPQorCSAgICBhY3BpX29zX21hcF9tZW1vcnkoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0uCisJCQkgICAgICAgYWRkcmVzcywgbGVuZ3RoKTsKKwlpZiAoIXRhYmxlKSB7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBGQURUIGNoZWNrc3VtIGJlZm9yZSB3ZSBjb3B5IHRoZSB0YWJsZS4gSWdub3JlCisJICogY2hlY2tzdW0gZXJyb3IgYXMgd2Ugd2FudCB0byB0cnkgdG8gZ2V0IHRoZSBEU0RUIGFuZCBGQUNTLgorCSAqLworCSh2b2lkKWFjcGlfdGJfdmVyaWZ5X2NoZWNrc3VtKHRhYmxlLCBsZW5ndGgpOworCisJLyogT2J0YWluIGEgbG9jYWwgY29weSBvZiB0aGUgRkFEVCBpbiBjb21tb24gQUNQSSAyLjArIGZvcm1hdCAqLworCisJYWNwaV90Yl9jcmVhdGVfbG9jYWxfZmFkdCh0YWJsZSwgbGVuZ3RoKTsKKworCS8qIEFsbCBkb25lIHdpdGggdGhlIHJlYWwgRkFEVCwgdW5tYXAgaXQgKi8KKworCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlLCBsZW5ndGgpOworCisJLyogT2J0YWluIHRoZSBEU0RUIGFuZCBGQUNTIHRhYmxlcyB2aWEgdGhlaXIgYWRkcmVzc2VzIHdpdGhpbiB0aGUgRkFEVCAqLworCisJYWNwaV90Yl9pbnN0YWxsX3RhYmxlKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGFjcGlfZ2JsX0ZBRFQuWGRzZHQsCisJCQkgICAgICBmbGFncywgQUNQSV9TSUdfRFNEVCwgQUNQSV9UQUJMRV9JTkRFWF9EU0RUKTsKKworCWFjcGlfdGJfaW5zdGFsbF90YWJsZSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBhY3BpX2dibF9GQURULlhmYWNzLAorCQkJICAgICAgZmxhZ3MsIEFDUElfU0lHX0ZBQ1MsIEFDUElfVEFCTEVfSU5ERVhfRkFDUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfY3JlYXRlX2xvY2FsX2ZhZHQKKyAqCisgKiBQQVJBTUVURVJTOiAgVGFibGUgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gQklPUyBGQURUCisgKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAtIExlbmd0aCBvZiB0aGUgdGFibGUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgYSBsb2NhbCBjb3B5IG9mIHRoZSBGQURUIGFuZCBjb252ZXJ0IGl0IHRvIGEgY29tbW9uIGZvcm1hdC4KKyAqICAgICAgICAgICAgICBQZXJmb3JtcyB2YWxpZGF0aW9uIG9uIHNvbWUgaW1wb3J0YW50IEZBRFQgZmllbGRzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV90Yl9jcmVhdGVfbG9jYWxfZmFkdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlLCB1MzIgbGVuZ3RoKQoreworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgRkFEVCBpcyBsYXJnZXIgdGhhbiB3aGF0IHdlIGtub3cgYWJvdXQgKEFDUEkgMi4wIHZlcnNpb24pLgorCSAqIFRydW5jYXRlIHRoZSB0YWJsZSwgYnV0IG1ha2Ugc29tZSBub2lzZS4KKwkgKi8KKwlpZiAobGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQpKSB7CisJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCSAgICAgICJGQURUIChyZXZpc2lvbiAldSkgaXMgbG9uZ2VyIHRoYW4gQUNQSSAyLjAgdmVyc2lvbiwgdHJ1bmNhdGluZyBsZW5ndGggMHglWCB0byAweCV6WCIsCisJCQkgICAgICB0YWJsZS0+cmV2aXNpb24sICh1bnNpZ25lZClsZW5ndGgsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZmFkdCkpKTsKKwl9CisKKwkvKiBDb3B5IHRoZSBlbnRpcmUgRkFEVCBsb2NhbGx5LiBaZXJvIGZpcnN0IGZvciB0Yl9jb252ZXJ0X2ZhZHQgKi8KKworCUFDUElfTUVNU0VUKCZhY3BpX2dibF9GQURULCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZmFkdCkpOworCisJQUNQSV9NRU1DUFkoJmFjcGlfZ2JsX0ZBRFQsIHRhYmxlLAorCQkgICAgQUNQSV9NSU4obGVuZ3RoLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZmFkdCkpKTsKKworCS8qCisJICogMSkgQ29udmVydCB0aGUgbG9jYWwgY29weSBvZiB0aGUgRkFEVCB0byB0aGUgY29tbW9uIGludGVybmFsIGZvcm1hdAorCSAqIDIpIFZhbGlkYXRlIHNvbWUgb2YgdGhlIGltcG9ydGFudCB2YWx1ZXMgd2l0aGluIHRoZSBGQURUCisJICovCisJYWNwaV90Yl9jb252ZXJ0X2ZhZHQoKTsKKwlhY3BpX3RiX3ZhbGlkYXRlX2ZhZHQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9jb252ZXJ0X2ZhZHQKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9uZSwgdXNlcyBhY3BpX2dibF9GQURUCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogQ29udmVydHMgYWxsIHZlcnNpb25zIG9mIHRoZSBGQURUIHRvIGEgY29tbW9uIGludGVybmFsIGZvcm1hdC4KKyAqICAgICAgICAgICAgICAtPiBFeHBhbmQgYWxsIDMyLWJpdCBhZGRyZXNzZXMgdG8gNjQtYml0LgorICoKKyAqIE5PVEU6ICAgICAgICBhY3BpX2dibF9GQURUIG11c3QgYmUgb2Ygc2l6ZSAoc3RydWN0IGFjcGlfdGFibGVfZmFkdCksCisgKiAgICAgICAgICAgICAgYW5kIG11c3QgY29udGFpbiBhIGNvcHkgb2YgdGhlIGFjdHVhbCBGQURULgorICoKKyAqIEFDUElDQSB3aWxsIHVzZSB0aGUgIlgiIGZpZWxkcyBvZiB0aGUgRkFEVCBmb3IgYWxsIGFkZHJlc3Nlcy4KKyAqCisgKiAiWCIgZmllbGRzIGFyZSBvcHRpb25hbCBleHRlbnNpb25zIHRvIHRoZSBvcmlnaW5hbCBWMS4wIGZpZWxkcy4gRXZlbiBpZgorICogdGhleSBhcmUgcHJlc2VudCBpbiB0aGUgc3RydWN0dXJlLCB0aGV5IGNhbiBiZSBvcHRpb25hbGx5IG5vdCB1c2VkIGJ5CisgKiBzZXR0aW5nIHRoZW0gdG8gemVyby4gVGhlcmVmb3JlLCB3ZSBtdXN0IHNlbGVjdGl2ZWx5IGV4cGFuZCBWMS4wIGZpZWxkcworICogaWYgdGhlIGNvcnJlc3BvbmRpbmcgWCBmaWVsZCBpcyB6ZXJvLgorICoKKyAqIEZvciBBQ1BJIDEuMCBGQURUcywgYWxsIGFkZHJlc3MgZmllbGRzIGFyZSBleHBhbmRlZCB0byB0aGUgY29ycmVzcG9uZGluZworICogIlgiIGZpZWxkcy4KKyAqCisgKiBGb3IgQUNQSSAyLjAgRkFEVHMsIGFueSAiWCIgZmllbGRzIHRoYXQgYXJlIE5VTEwgYXJlIGZpbGxlZCBpbiBieQorICogZXhwYW5kaW5nIHRoZSBjb3JyZXNwb25kaW5nIEFDUEkgMS4wIGZpZWxkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGFjcGlfdGJfY29udmVydF9mYWR0KHZvaWQpCit7CisJdTggcG0xX3JlZ2lzdGVyX2xlbmd0aDsKKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKnRhcmdldDsKKwlhY3BpX25hdGl2ZV91aW50IGk7CisKKwkvKiBVcGRhdGUgdGhlIGxvY2FsIEZBRFQgdGFibGUgaGVhZGVyIGxlbmd0aCAqLworCisJYWNwaV9nYmxfRkFEVC5oZWFkZXIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQpOworCisJLyogRXhwYW5kIHRoZSAzMi1iaXQgRkFDUyBhbmQgRFNEVCBhZGRyZXNzZXMgdG8gNjQtYml0IGFzIG5lY2Vzc2FyeSAqLworCisJaWYgKCFhY3BpX2dibF9GQURULlhmYWNzKSB7CisJCWFjcGlfZ2JsX0ZBRFQuWGZhY3MgPSAodTY0KSBhY3BpX2dibF9GQURULmZhY3M7CisJfQorCisJaWYgKCFhY3BpX2dibF9GQURULlhkc2R0KSB7CisJCWFjcGlfZ2JsX0ZBRFQuWGRzZHQgPSAodTY0KSBhY3BpX2dibF9GQURULmRzZHQ7CisJfQorCisJLyoKKwkgKiBFeHBhbmQgdGhlIDMyLWJpdCBWMS4wIGFkZHJlc3NlcyB0byB0aGUgNjQtYml0ICJYIiBnZW5lcmljIGFkZHJlc3MKKwkgKiBzdHJ1Y3R1cmVzIGFzIG5lY2Vzc2FyeS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9GQURUX0lORk9fRU5UUklFUzsgaSsrKSB7CisJCXRhcmdldCA9CisJCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzLCAmYWNwaV9nYmxfRkFEVCwKKwkJCQkgZmFkdF9pbmZvX3RhYmxlW2ldLnRhcmdldCk7CisKKwkJLyogRXhwYW5kIG9ubHkgaWYgdGhlIFggdGFyZ2V0IGlzIG51bGwgKi8KKworCQlpZiAoIXRhcmdldC0+YWRkcmVzcykgeworCQkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyh0YXJnZXQsCisJCQkJCQkgICAgICpBQ1BJX0FERF9QVFIodTgsCisJCQkJCQkJCSAgICZhY3BpX2dibF9GQURULAorCQkJCQkJCQkgICBmYWR0X2luZm9fdGFibGUKKwkJCQkJCQkJICAgW2ldLmxlbmd0aCksCisJCQkJCQkgICAgICh1NjQpICogQUNQSV9BRERfUFRSKHUzMiwKKwkJCQkJCQkJCSAgJmFjcGlfZ2JsX0ZBRFQsCisJCQkJCQkJCQkgIGZhZHRfaW5mb190YWJsZQorCQkJCQkJCQkJICBbaV0uCisJCQkJCQkJCQkgIHNvdXJjZSkpOworCQl9CisJfQorCisJLyoKKwkgKiBDYWxjdWxhdGUgc2VwYXJhdGUgR0FTIHN0cnVjdHMgZm9yIHRoZSBQTTEgRW5hYmxlIHJlZ2lzdGVycy4KKwkgKiBUaGVzZSBhZGRyZXNzZXMgZG8gbm90IGFwcGVhciAoZGlyZWN0bHkpIGluIHRoZSBGQURULCBzbyBpdCBpcworCSAqIHVzZWZ1bCB0byBjYWxjdWxhdGUgdGhlbSBvbmNlLCBoZXJlLgorCSAqCisJICogVGhlIFBNIGV2ZW50IGJsb2NrcyBhcmUgc3BsaXQgaW50byB0d28gcmVnaXN0ZXIgYmxvY2tzLCBmaXJzdCBpcyB0aGUKKwkgKiBQTSBTdGF0dXMgUmVnaXN0ZXIgYmxvY2ssIGZvbGxvd2VkIGltbWVkaWF0ZWx5IGJ5IHRoZSBQTSBFbmFibGUgUmVnaXN0ZXIKKwkgKiBibG9jay4gRWFjaCBpcyBvZiBsZW5ndGggKHBtMV9ldmVudF9sZW5ndGgvMikKKwkgKi8KKwlwbTFfcmVnaXN0ZXJfbGVuZ3RoID0gKHU4KSBBQ1BJX0RJVl8yKGFjcGlfZ2JsX0ZBRFQucG0xX2V2ZW50X2xlbmd0aCk7CisKKwkvKiBUaGUgUE0xQSByZWdpc3RlciBibG9jayBpcyByZXF1aXJlZCAqLworCisJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfeHBtMWFfZW5hYmxlLAorCQkJCSAgICAgcG0xX3JlZ2lzdGVyX2xlbmd0aCwKKwkJCQkgICAgIChhY3BpX2dibF9GQURULnhwbTFhX2V2ZW50X2Jsb2NrLmFkZHJlc3MgKworCQkJCSAgICAgIHBtMV9yZWdpc3Rlcl9sZW5ndGgpKTsKKwkvKiBEb24ndCBmb3JnZXQgdG8gY29weSBzcGFjZV9pZCBvZiB0aGUgR0FTICovCisJYWNwaV9nYmxfeHBtMWFfZW5hYmxlLnNwYWNlX2lkID0gYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jay5zcGFjZV9pZDsKKworCS8qIFRoZSBQTTFCIHJlZ2lzdGVyIGJsb2NrIGlzIG9wdGlvbmFsLCBpZ25vcmUgaWYgbm90IHByZXNlbnQgKi8KKworCWlmIChhY3BpX2dibF9GQURULnhwbTFiX2V2ZW50X2Jsb2NrLmFkZHJlc3MpIHsKKwkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcygmYWNwaV9nYmxfeHBtMWJfZW5hYmxlLAorCQkJCQkgICAgIHBtMV9yZWdpc3Rlcl9sZW5ndGgsCisJCQkJCSAgICAgKGFjcGlfZ2JsX0ZBRFQueHBtMWJfZXZlbnRfYmxvY2suCisJCQkJCSAgICAgIGFkZHJlc3MgKyBwbTFfcmVnaXN0ZXJfbGVuZ3RoKSk7CisJCS8qIERvbid0IGZvcmdldCB0byBjb3B5IHNwYWNlX2lkIG9mIHRoZSBHQVMgKi8KKwkJYWNwaV9nYmxfeHBtMWJfZW5hYmxlLnNwYWNlX2lkID0gYWNwaV9nYmxfRkFEVC54cG0xYV9ldmVudF9ibG9jay5zcGFjZV9pZDsKKworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3ZhbGlkYXRlX2ZhZHQKKyAqCisgKiBQQVJBTUVURVJTOiAgVGFibGUgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgRkFEVCB0byBiZSB2YWxpZGF0ZWQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSB2YXJpb3VzIGltcG9ydGFudCBmaWVsZHMgd2l0aGluIHRoZSBGQURULiBJZiBhIHByb2JsZW0KKyAqICAgICAgICAgICAgICBpcyBmb3VuZCwgaXNzdWUgYSBtZXNzYWdlLCBidXQgbm8gc3RhdHVzIGlzIHJldHVybmVkLgorICogICAgICAgICAgICAgIFVzZWQgYnkgYm90aCB0aGUgdGFibGUgbWFuYWdlciBhbmQgdGhlIGRpc2Fzc2VtYmxlci4KKyAqCisgKiBQb3NzaWJsZSBhZGRpdGlvbmFsIGNoZWNrczoKKyAqIChhY3BpX2dibF9GQURULnBtMV9ldmVudF9sZW5ndGggPj0gNCkKKyAqIChhY3BpX2dibF9GQURULnBtMV9jb250cm9sX2xlbmd0aCA+PSAyKQorICogKGFjcGlfZ2JsX0ZBRFQucG1fdGltZXJfbGVuZ3RoID49IDQpCisgKiBHcGUgYmxvY2sgbGVuZ3RocyBtdXN0IGJlIG11bHRpcGxlIG9mIDIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBhY3BpX3RiX3ZhbGlkYXRlX2ZhZHQodm9pZCkKK3sKKwl1MzIgKmFkZHJlc3MzMjsKKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgKmFkZHJlc3M2NDsKKwl1OCBsZW5ndGg7CisJYWNwaV9uYXRpdmVfdWludCBpOworCisJLyogRXhhbWluZSBhbGwgb2YgdGhlIDY0LWJpdCBleHRlbmRlZCBhZGRyZXNzIGZpZWxkcyAoWCBmaWVsZHMpICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9GQURUX0lORk9fRU5UUklFUzsgaSsrKSB7CisKKwkJLyogR2VuZXJhdGUgcG9pbnRlcnMgdG8gdGhlIDMyLWJpdCBhbmQgNjQtYml0IGFkZHJlc3NlcyBhbmQgZ2V0IHRoZSBsZW5ndGggKi8KKworCQlhZGRyZXNzNjQgPQorCQkgICAgQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcywgJmFjcGlfZ2JsX0ZBRFQsCisJCQkJIGZhZHRfaW5mb190YWJsZVtpXS50YXJnZXQpOworCQlhZGRyZXNzMzIgPQorCQkgICAgQUNQSV9BRERfUFRSKHUzMiwgJmFjcGlfZ2JsX0ZBRFQsCisJCQkJIGZhZHRfaW5mb190YWJsZVtpXS5zb3VyY2UpOworCQlsZW5ndGggPQorCQkgICAgKkFDUElfQUREX1BUUih1OCwgJmFjcGlfZ2JsX0ZBRFQsCisJCQkJICBmYWR0X2luZm9fdGFibGVbaV0ubGVuZ3RoKTsKKworCQlpZiAoZmFkdF9pbmZvX3RhYmxlW2ldLnR5cGUgJiBBQ1BJX0ZBRFRfUkVRVUlSRUQpIHsKKwkJCS8qCisJCQkgKiBGaWVsZCBpcyByZXF1aXJlZCAoUG0xYV9ldmVudCwgUG0xYV9jb250cm9sLCBwbV90aW1lcikuCisJCQkgKiBCb3RoIHRoZSBhZGRyZXNzIGFuZCBsZW5ndGggbXVzdCBiZSBub24temVyby4KKwkJCSAqLworCQkJaWYgKCFhZGRyZXNzNjQtPmFkZHJlc3MgfHwgIWxlbmd0aCkgeworCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJCSAgICAiUmVxdWlyZWQgZmllbGQgXCIlc1wiIGhhcyB6ZXJvIGFkZHJlc3MgYW5kL29yIGxlbmd0aDogJTguOFglOC44WC8lWCIsCisJCQkJCSAgICBmYWR0X2luZm9fdGFibGVbaV0ubmFtZSwKKwkJCQkJICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjQtPgorCQkJCQkJCSAgICAgICBhZGRyZXNzKSwKKwkJCQkJICAgIGxlbmd0aCkpOworCQkJfQorCQl9IGVsc2UgaWYgKGZhZHRfaW5mb190YWJsZVtpXS50eXBlICYgQUNQSV9GQURUX1NFUEFSQVRFX0xFTkdUSCkgeworCQkJLyoKKwkJCSAqIEZpZWxkIGlzIG9wdGlvbmFsIChQTTJDb250cm9sLCBHUEUwLCBHUEUxKSBBTkQgaGFzIGl0cyBvd24KKwkJCSAqIGxlbmd0aCBmaWVsZC4gSWYgcHJlc2VudCwgYm90aCB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG11c3QgYmUgdmFsaWQuCisJCQkgKi8KKwkJCWlmICgoYWRkcmVzczY0LT5hZGRyZXNzICYmICFsZW5ndGgpCisJCQkgICAgfHwgKCFhZGRyZXNzNjQtPmFkZHJlc3MgJiYgbGVuZ3RoKSkgeworCQkJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCQkJICAgICAgIk9wdGlvbmFsIGZpZWxkIFwiJXNcIiBoYXMgemVybyBhZGRyZXNzIG9yIGxlbmd0aDogJTguOFglOC44WC8lWCIsCisJCQkJCSAgICAgIGZhZHRfaW5mb190YWJsZVtpXS5uYW1lLAorCQkJCQkgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzczY0LT4KKwkJCQkJCQkJIGFkZHJlc3MpLAorCQkJCQkgICAgICBsZW5ndGgpKTsKKwkJCX0KKwkJfQorCisJCS8qIElmIGJvdGggMzItIGFuZCA2NC1iaXQgYWRkcmVzc2VzIGFyZSB2YWxpZCAobm9uLXplcm8pLCB0aGV5IG11c3QgbWF0Y2ggKi8KKworCQlpZiAoYWRkcmVzczY0LT5hZGRyZXNzICYmICphZGRyZXNzMzIgJiYKKwkJICAgIChhZGRyZXNzNjQtPmFkZHJlc3MgIT0gKHU2NCkgKiBhZGRyZXNzMzIpKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiMzIvNjRYIGFkZHJlc3MgbWlzbWF0Y2ggaW4gXCIlc1wiOiBbJTguOFhdIFslOC44WCU4LjhYXSwgdXNpbmcgNjRYIiwKKwkJCQkgICAgZmFkdF9pbmZvX3RhYmxlW2ldLm5hbWUsICphZGRyZXNzMzIsCisJCQkJICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzNjQtPmFkZHJlc3MpKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZmluZC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmZpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNThjMDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmZpbmQuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIE1vZHVsZSBOYW1lOiB0YmZpbmQgICAtIGZpbmQgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93CisgKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgorICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKKyAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKKyAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUworQUNQSV9NT0RVTEVfTkFNRSgidGJmaW5kIikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9maW5kX3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIFNpZ25hdHVyZSAgICAgICAgICAgLSBTdHJpbmcgd2l0aCBBQ1BJIHRhYmxlIHNpZ25hdHVyZQorICogICAgICAgICAgICAgIG9lbV9pZCAgICAgICAgICAgICAgLSBTdHJpbmcgd2l0aCB0aGUgdGFibGUgT0VNIElECisgKiAgICAgICAgICAgICAgb2VtX3RhYmxlX2lkICAgICAgICAtIFN0cmluZyB3aXRoIHRoZSBPRU0gVGFibGUgSUQKKyAqICAgICAgICAgICAgICB0YWJsZV9pbmRleCAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIGluZGV4IGlzIHJldHVybmVkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgdGFibGUgaW5kZXgKKyAqCisgKiBERVNDUklQVElPTjogRmluZCBhbiBBQ1BJIHRhYmxlIChpbiB0aGUgUlNEVC9YU0RUKSB0aGF0IG1hdGNoZXMgdGhlCisgKiAgICAgICAgICAgICAgU2lnbmF0dXJlLCBPRU0gSUQgYW5kIE9FTSBUYWJsZSBJRC4gUmV0dXJucyBhbiBpbmRleCB0aGF0IGNhbgorICogICAgICAgICAgICAgIGJlIHVzZWQgdG8gZ2V0IHRoZSB0YWJsZSBoZWFkZXIgb3IgZW50aXJlIHRhYmxlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCithY3BpX3N0YXR1cworYWNwaV90Yl9maW5kX3RhYmxlKGNoYXIgKnNpZ25hdHVyZSwKKwkJICAgY2hhciAqb2VtX2lkLAorCQkgICBjaGFyICpvZW1fdGFibGVfaWQsIGFjcGlfbmF0aXZlX3VpbnQgKiB0YWJsZV9pbmRleCkKK3sKKwlhY3BpX25hdGl2ZV91aW50IGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9maW5kX3RhYmxlKTsKKworCWZvciAoaSA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7ICsraSkgeworCQlpZiAoQUNQSV9NRU1DTVAoJihhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZSksCisJCQkJc2lnbmF0dXJlLCBBQ1BJX05BTUVfU0laRSkpIHsKKworCQkJLyogTm90IHRoZSByZXF1ZXN0ZWQgdGFibGUgKi8KKworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUYWJsZSB3aXRoIG1hdGNoaW5nIHNpZ25hdHVyZSBoYXMgYmVlbiBmb3VuZCAqLworCisJCWlmICghYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyKSB7CisKKwkJCS8qIFRhYmxlIGlzIG5vdCBjdXJyZW50bHkgbWFwcGVkLCBtYXAgaXQgKi8KKworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3RiX3ZlcmlmeV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCQkJIHRhYmxlc1tpXSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KKworCQkJaWYgKCFhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXIpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIENoZWNrIGZvciB0YWJsZSBtYXRjaCBvbiBhbGwgSURzICovCisKKwkJaWYgKCFBQ1BJX01FTUNNUAorCQkgICAgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlci0+c2lnbmF0dXJlLAorCQkgICAgIHNpZ25hdHVyZSwgQUNQSV9OQU1FX1NJWkUpICYmICghb2VtX2lkWzBdCisJCQkJCQkgICAgfHwKKwkJCQkJCSAgICAhQUNQSV9NRU1DTVAKKwkJCQkJCSAgICAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCQkJICAgICB0YWJsZXNbaV0ucG9pbnRlci0+b2VtX2lkLAorCQkJCQkJICAgICBvZW1faWQsIEFDUElfT0VNX0lEX1NJWkUpKQorCQkgICAgJiYgKCFvZW1fdGFibGVfaWRbMF0KKwkJCXx8ICFBQ1BJX01FTUNNUChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLgorCQkJCQlwb2ludGVyLT5vZW1fdGFibGVfaWQsIG9lbV90YWJsZV9pZCwKKwkJCQkJQUNQSV9PRU1fVEFCTEVfSURfU0laRSkpKSB7CisJCQkqdGFibGVfaW5kZXggPSBpOworCisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywKKwkJCQkJICAiRm91bmQgdGFibGUgWyU0LjRzXVxuIiwgc2lnbmF0dXJlKSk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQl9CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTJkNDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogdGJnZXQgLSBBQ1BJIFRhYmxlIGdldCogcm91dGluZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotQUNQSV9NT0RVTEVfTkFNRSgidGJnZXQiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3RoaXNfdGFibGUoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKLQkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLAotCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl90YWJsZV9vdmVycmlkZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwKLQkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF90YWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBBZGRyZXNzICAgICAgICAgICAgIC0gQWRkcmVzcyBvZiB0YWJsZSB0byByZXRyaWV2ZS4gIENhbiBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dpY2FsIG9yIFBoeXNpY2FsCi0gKiAgICAgICAgICAgICAgdGFibGVfaW5mbyAgICAgICAgICAtIFdoZXJlIHRhYmxlIGluZm8gaXMgcmV0dXJuZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgZW50aXJlIHRhYmxlIG9mIHVua25vd24gc2l6ZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGUoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKLQkJICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9nZXRfdGFibGUpOwotCi0JLyogR2V0IHRoZSBoZWFkZXIgaW4gb3JkZXIgdG8gZ2V0IHNpZ25hdHVyZSBhbmQgdGFibGUgc2l6ZSAqLwotCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfaGVhZGVyKGFkZHJlc3MsICZoZWFkZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIGVudGlyZSB0YWJsZSAqLwotCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfYm9keShhZGRyZXNzLCAmaGVhZGVyLCB0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlIChzaXplICVYKSIsCi0JCQkJaGVhZGVyLmxlbmd0aCkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIKLSAqCi0gKiBQQVJBTUVURVJTOiAgQWRkcmVzcyAgICAgICAgICAgICAtIEFkZHJlc3Mgb2YgdGFibGUgdG8gcmV0cmlldmUuICBDYW4gYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9naWNhbCBvciBQaHlzaWNhbAotICogICAgICAgICAgICAgIHJldHVybl9oZWFkZXIgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgaGVhZGVyIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgYW4gQUNQSSB0YWJsZSBoZWFkZXIuICBXb3JrcyBpbiBib3RoIHBoeXNpY2FsIG9yIHZpcnR1YWwKLSAqICAgICAgICAgICAgICBhZGRyZXNzaW5nIG1vZGUuICBXb3JrcyB3aXRoIGJvdGggcGh5c2ljYWwgb3IgbG9naWNhbCBwb2ludGVycy4KLSAqICAgICAgICAgICAgICBUYWJsZSBpcyBlaXRoZXIgY29waWVkIG9yIG1hcHBlZCwgZGVwZW5kaW5nIG9uIHRoZSBwb2ludGVyCi0gKiAgICAgICAgICAgICAgdHlwZSBhbmQgbW9kZSBvZiB0aGUgcHJvY2Vzc29yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9oZWFkZXIoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKLQkJCSBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnJldHVybl9oZWFkZXIpCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIgPSBOVUxMOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9nZXRfdGFibGVfaGVhZGVyKTsKLQotCS8qCi0JICogRmxhZ3MgY29udGFpbnMgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIG1vZGUgKFZpcnR1YWwgb3IgUGh5c2ljYWwKLQkgKiBhZGRyZXNzaW5nKSBUaGUgcG9pbnRlcl90eXBlIGlzIGVpdGhlciBMb2dpY2FsIG9yIFBoeXNpY2FsCi0JICovCi0Jc3dpdGNoIChhZGRyZXNzLT5wb2ludGVyX3R5cGUpIHsKLQljYXNlIEFDUElfUEhZU01PREVfUEhZU1BUUjoKLQljYXNlIEFDUElfTE9HTU9ERV9MT0dQVFI6Ci0KLQkJLyogUG9pbnRlciBtYXRjaGVzIHByb2Nlc3NvciBtb2RlLCBjb3B5IHRoZSBoZWFkZXIgKi8KLQotCQlBQ1BJX01FTUNQWShyZXR1cm5faGVhZGVyLCBhZGRyZXNzLT5wb2ludGVyLmxvZ2ljYWwsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9MT0dNT0RFX1BIWVNQVFI6Ci0KLQkJLyogQ3JlYXRlIGEgbG9naWNhbCBhZGRyZXNzIGZvciB0aGUgcGh5c2ljYWwgcG9pbnRlciAqLwotCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeShhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLAotCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciksCi0JCQkJCSAgICAodm9pZCAqKSZoZWFkZXIpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCU4LjhYIGZvciB0YWJsZSBoZWFkZXIiLAotCQkJCSAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcy0+cG9pbnRlci4KLQkJCQkJCSAgICAgICBwaHlzaWNhbCkpKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJLyogQ29weSBoZWFkZXIgYW5kIGRlbGV0ZSBtYXBwaW5nICovCi0KLQkJQUNQSV9NRU1DUFkocmV0dXJuX2hlYWRlciwgaGVhZGVyLAotCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKLQkJYWNwaV9vc191bm1hcF9tZW1vcnkoaGVhZGVyLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBhZGRyZXNzIGZsYWdzICVYIiwKLQkJCSAgICBhZGRyZXNzLT5wb2ludGVyX3R5cGUpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLCAiVGFibGUgU2lnbmF0dXJlOiBbJTQuNHNdXG4iLAotCQkJICByZXR1cm5faGVhZGVyLT5zaWduYXR1cmUpKTsKLQotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkKLSAqCi0gKiBQQVJBTUVURVJTOiAgQWRkcmVzcyAgICAgICAgICAgICAtIEFkZHJlc3Mgb2YgdGFibGUgdG8gcmV0cmlldmUuICBDYW4gYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9naWNhbCBvciBQaHlzaWNhbAotICogICAgICAgICAgICAgIEhlYWRlciAgICAgICAgICAgICAgLSBIZWFkZXIgb2YgdGhlIHRhYmxlIHRvIHJldHJpZXZlCi0gKiAgICAgICAgICAgICAgdGFibGVfaW5mbyAgICAgICAgICAtIFdoZXJlIHRoZSB0YWJsZSBpbmZvIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgYW4gZW50aXJlIEFDUEkgdGFibGUgd2l0aCBzdXBwb3J0IHRvIGFsbG93IHRoZSBob3N0IE9TIHRvCi0gKiAgICAgICAgICAgICAgcmVwbGFjZSB0aGUgdGFibGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gKHRhYmxlIG92ZXJyaWRlLikKLSAqICAgICAgICAgICAgICBXb3JrcyBpbiBib3RoIHBoeXNpY2FsIG9yIHZpcnR1YWwKLSAqICAgICAgICAgICAgICBhZGRyZXNzaW5nIG1vZGUuICBXb3JrcyB3aXRoIGJvdGggcGh5c2ljYWwgb3IgbG9naWNhbCBwb2ludGVycy4KLSAqICAgICAgICAgICAgICBUYWJsZSBpcyBlaXRoZXIgY29waWVkIG9yIG1hcHBlZCwgZGVwZW5kaW5nIG9uIHRoZSBwb2ludGVyCi0gKiAgICAgICAgICAgICAgdHlwZSBhbmQgbW9kZSBvZiB0aGUgcHJvY2Vzc29yLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9ib2R5KHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCi0JCSAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwKLQkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9nZXRfdGFibGVfYm9keSk7Ci0KLQlpZiAoIXRhYmxlX2luZm8gfHwgIWFkZHJlc3MpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEF0dGVtcHQgdGFibGUgb3ZlcnJpZGUuICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX3RhYmxlX292ZXJyaWRlKGhlYWRlciwgdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7Ci0KLQkJLyogVGFibGUgd2FzIG92ZXJyaWRkZW4gYnkgdGhlIGhvc3QgT1MgKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBObyBvdmVycmlkZSwgZ2V0IHRoZSBvcmlnaW5hbCB0YWJsZSAqLwotCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGhpc190YWJsZShhZGRyZXNzLCBoZWFkZXIsIHRhYmxlX2luZm8pOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3RhYmxlX292ZXJyaWRlCi0gKgotICogUEFSQU1FVEVSUzogIEhlYWRlciAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRhYmxlIGhlYWRlcgotICogICAgICAgICAgICAgIHRhYmxlX2luZm8gICAgICAgICAgLSBSZXR1cm4gaW5mbyBpZiB0YWJsZSBpcyBvdmVycmlkZGVuCi0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogQXR0ZW1wdHMgb3ZlcnJpZGUgb2YgY3VycmVudCB0YWJsZSB3aXRoIGEgbmV3IG9uZSBpZiBwcm92aWRlZAotICogICAgICAgICAgICAgIGJ5IHRoZSBob3N0IE9TLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl90YWJsZV9vdmVycmlkZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciwKLQkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pCi17Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpuZXdfdGFibGU7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3BvaW50ZXIgYWRkcmVzczsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfdGFibGVfb3ZlcnJpZGUpOwotCi0JLyoKLQkgKiBUaGUgT1NMIHdpbGwgZXhhbWluZSB0aGUgaGVhZGVyIGFuZCBkZWNpZGUgd2hldGhlciB0byBvdmVycmlkZSB0aGlzCi0JICogdGFibGUuICBJZiBpdCBkZWNpZGVzIHRvIG92ZXJyaWRlLCBhIHRhYmxlIHdpbGwgYmUgcmV0dXJuZWQgaW4gbmV3X3RhYmxlLAotCSAqIHdoaWNoIHdlIHdpbGwgdGhlbiBjb3B5LgotCSAqLwotCXN0YXR1cyA9IGFjcGlfb3NfdGFibGVfb3ZlcnJpZGUoaGVhZGVyLCAmbmV3X3RhYmxlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQotCQkvKiBTb21lIHNldmVyZSBlcnJvciBmcm9tIHRoZSBPU0wsIGJ1dCB3ZSBiYXNpY2FsbHkgaWdub3JlIGl0ICovCi0KLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiQ291bGQgbm90IG92ZXJyaWRlIEFDUEkgdGFibGUiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCWlmICghbmV3X3RhYmxlKSB7Ci0KLQkJLyogTm8gdGFibGUgb3ZlcnJpZGUgKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwotCX0KLQotCS8qCi0JICogV2UgaGF2ZSBhIG5ldyB0YWJsZSB0byBvdmVycmlkZSB0aGUgb2xkIG9uZS4gIEdldCBhIGNvcHkgb2YKLQkgKiB0aGUgbmV3IG9uZS4gIFdlIGtub3cgdGhhdCB0aGUgbmV3IHRhYmxlIGhhcyBhIGxvZ2ljYWwgcG9pbnRlci4KLQkgKi8KLQlhZGRyZXNzLnBvaW50ZXJfdHlwZSA9IEFDUElfTE9HSUNBTF9QT0lOVEVSIHwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkc7Ci0JYWRkcmVzcy5wb2ludGVyLmxvZ2ljYWwgPSBuZXdfdGFibGU7Ci0KLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90aGlzX3RhYmxlKCZhZGRyZXNzLCBuZXdfdGFibGUsIHRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiQ291bGQgbm90IGNvcHkgQUNQSSB0YWJsZSIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogQ29weSB0aGUgdGFibGUgaW5mbyAqLwotCi0JQUNQSV9JTkZPKChBRV9JTkZPLCAiVGFibGUgWyU0LjRzXSByZXBsYWNlZCBieSBob3N0IE9TIiwKLQkJICAgdGFibGVfaW5mby0+cG9pbnRlci0+c2lnbmF0dXJlKSk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF90aGlzX3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIEFkZHJlc3MgICAgICAgICAgICAgLSBBZGRyZXNzIG9mIHRhYmxlIHRvIHJldHJpZXZlLiAgQ2FuIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2ljYWwgb3IgUGh5c2ljYWwKLSAqICAgICAgICAgICAgICBIZWFkZXIgICAgICAgICAgICAgIC0gSGVhZGVyIG9mIHRoZSB0YWJsZSB0byByZXRyaWV2ZQotICogICAgICAgICAgICAgIHRhYmxlX2luZm8gICAgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgaW5mbyBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogR2V0IGFuIGVudGlyZSBBQ1BJIHRhYmxlLiAgV29ya3MgaW4gYm90aCBwaHlzaWNhbCBvciB2aXJ0dWFsCi0gKiAgICAgICAgICAgICAgYWRkcmVzc2luZyBtb2RlLiAgV29ya3Mgd2l0aCBib3RoIHBoeXNpY2FsIG9yIGxvZ2ljYWwgcG9pbnRlcnMuCi0gKiAgICAgICAgICAgICAgVGFibGUgaXMgZWl0aGVyIGNvcGllZCBvciBtYXBwZWQsIGRlcGVuZGluZyBvbiB0aGUgcG9pbnRlcgotICogICAgICAgICAgICAgIHR5cGUgYW5kIG1vZGUgb2YgdGhlIHByb2Nlc3Nvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3RoaXNfdGFibGUoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKLQkJICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLAotCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmZ1bGxfdGFibGUgPSBOVUxMOwotCXU4IGFsbG9jYXRpb247Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2dldF90aGlzX3RhYmxlKTsKLQotCS8qIFZhbGlkYXRlIG1pbmltdW0gbGVuZ3RoICovCi0KLQlpZiAoaGVhZGVyLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJUYWJsZSBsZW5ndGggKCVYKSBpcyBzbWFsbGVyIHRoYW4gbWluaW11bSAoJXpYKSIsCi0JCQkgICAgaGVhZGVyLT5sZW5ndGgsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSk7Ci0KLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0lOVkFMSURfVEFCTEVfTEVOR1RIKTsKLQl9Ci0KLQkvKgotCSAqIEZsYWdzIGNvbnRhaW5zIHRoZSBjdXJyZW50IHByb2Nlc3NvciBtb2RlIChWaXJ0dWFsIG9yIFBoeXNpY2FsCi0JICogYWRkcmVzc2luZykgVGhlIHBvaW50ZXJfdHlwZSBpcyBlaXRoZXIgTG9naWNhbCBvciBQaHlzaWNhbAotCSAqLwotCXN3aXRjaCAoYWRkcmVzcy0+cG9pbnRlcl90eXBlKSB7Ci0JY2FzZSBBQ1BJX1BIWVNNT0RFX1BIWVNQVFI6Ci0JY2FzZSBBQ1BJX0xPR01PREVfTE9HUFRSOgotCi0JCS8qIFBvaW50ZXIgbWF0Y2hlcyBwcm9jZXNzb3IgbW9kZSwgY29weSB0aGUgdGFibGUgdG8gYSBuZXcgYnVmZmVyICovCi0KLQkJZnVsbF90YWJsZSA9IEFDUElfQUxMT0NBVEUoaGVhZGVyLT5sZW5ndGgpOwotCQlpZiAoIWZ1bGxfdGFibGUpIHsKLQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgdGFibGUgbWVtb3J5IGZvciBbJTQuNHNdIGxlbmd0aCAlWCIsCi0JCQkJICAgIGhlYWRlci0+c2lnbmF0dXJlLCBoZWFkZXItPmxlbmd0aCkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7Ci0JCX0KLQotCQkvKiBDb3B5IHRoZSBlbnRpcmUgdGFibGUgKGluY2x1ZGluZyBoZWFkZXIpIHRvIHRoZSBsb2NhbCBidWZmZXIgKi8KLQotCQlBQ1BJX01FTUNQWShmdWxsX3RhYmxlLCBhZGRyZXNzLT5wb2ludGVyLmxvZ2ljYWwsCi0JCQkgICAgaGVhZGVyLT5sZW5ndGgpOwotCi0JCS8qIFNhdmUgYWxsb2NhdGlvbiB0eXBlICovCi0KLQkJYWxsb2NhdGlvbiA9IEFDUElfTUVNX0FMTE9DQVRFRDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfTE9HTU9ERV9QSFlTUFRSOgotCi0JCS8qCi0JCSAqIEp1c3QgbWFwIHRoZSB0YWJsZSdzIHBoeXNpY2FsIG1lbW9yeQotCQkgKiBpbnRvIG91ciBhZGRyZXNzIHNwYWNlLgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5KGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsCi0JCQkJCSAgICAoYWNwaV9zaXplKSBoZWFkZXItPmxlbmd0aCwKLQkJCQkJICAgIEFDUElfQ0FTVF9QVFIodm9pZCwgJmZ1bGxfdGFibGUpKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQ291bGQgbm90IG1hcCBtZW1vcnkgZm9yIHRhYmxlIFslNC40c10gYXQgJTguOFglOC44WCBmb3IgbGVuZ3RoICVYIiwKLQkJCQkgICAgaGVhZGVyLT5zaWduYXR1cmUsCi0JCQkJICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzLT5wb2ludGVyLgotCQkJCQkJICAgICAgIHBoeXNpY2FsKSwKLQkJCQkgICAgaGVhZGVyLT5sZW5ndGgpKTsKLQkJCXJldHVybiAoc3RhdHVzKTsKLQkJfQotCi0JCS8qIFNhdmUgYWxsb2NhdGlvbiB0eXBlICovCi0KLQkJYWxsb2NhdGlvbiA9IEFDUElfTUVNX01BUFBFRDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIGFkZHJlc3MgZmxhZ3MgJVgiLAotCQkJICAgIGFkZHJlc3MtPnBvaW50ZXJfdHlwZSkpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyoKLQkgKiBWYWxpZGF0ZSBjaGVja3N1bSBmb3IgX21vc3RfIHRhYmxlcywKLQkgKiBldmVuIHRoZSBvbmVzIHdob3NlIHNpZ25hdHVyZSB3ZSBkb24ndCByZWNvZ25pemUKLQkgKi8KLQlpZiAodGFibGVfaW5mby0+dHlwZSAhPSBBQ1BJX1RBQkxFX0lEX0ZBQ1MpIHsKLQkJc3RhdHVzID0gYWNwaV90Yl92ZXJpZnlfdGFibGVfY2hlY2tzdW0oZnVsbF90YWJsZSk7Ci0KLSNpZiAoIUFDUElfQ0hFQ0tTVU1fQUJPUlQpCi0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCi0JCQkvKiBJZ25vcmUgdGhlIGVycm9yIGlmIGNvbmZpZ3VyYXRpb24gc2F5cyBzbyAqLwotCi0JCQlzdGF0dXMgPSBBRV9PSzsKLQkJfQotI2VuZGlmCi0JfQotCi0JLyogUmV0dXJuIHZhbHVlcyAqLwotCi0JdGFibGVfaW5mby0+cG9pbnRlciA9IGZ1bGxfdGFibGU7Ci0JdGFibGVfaW5mby0+bGVuZ3RoID0gKGFjcGlfc2l6ZSkgaGVhZGVyLT5sZW5ndGg7Ci0JdGFibGVfaW5mby0+YWxsb2NhdGlvbiA9IGFsbG9jYXRpb247Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkgICJGb3VuZCB0YWJsZSBbJTQuNHNdIGF0ICU4LjhYJTguOFgsIG1hcHBlZC9jb3BpZWQgdG8gJXBcbiIsCi0JCQkgIGZ1bGxfdGFibGUtPnNpZ25hdHVyZSwKLQkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwpLAotCQkJICBmdWxsX3RhYmxlKSk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfdGFibGVfcHRyCi0gKgotICogUEFSQU1FVEVSUzogIHRhYmxlX3R5cGUgICAgICAtIG9uZSBvZiB0aGUgZGVmaW5lZCB0YWJsZSB0eXBlcwotICogICAgICAgICAgICAgIEluc3RhbmNlICAgICAgICAtIFdoaWNoIHRhYmxlIG9mIHRoaXMgdHlwZQotICogICAgICAgICAgICAgIHJldHVybl90YWJsZSAgICAtIHBvaW50ZXIgdG8gbG9jYXRpb24gdG8gcGxhY2UgdGhlIHBvaW50ZXIgZm9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBnZXQgdGhlIHBvaW50ZXIgdG8gYW4gQUNQSSB0YWJsZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGVfcHRyKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlLAotCQkgICAgICB1MzIgaW5zdGFuY2UsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKnJldHVybl90YWJsZSkKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjOwotCXUzMiBpOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9nZXRfdGFibGVfcHRyKTsKLQotCWlmICh0YWJsZV90eXBlID4gQUNQSV9UQUJMRV9JRF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIENoZWNrIGZvciBpbnN0YW5jZSBvdXQgb2YgcmFuZ2Ugb2YgdGhlIGN1cnJlbnQgdGFibGUgY291bnQgKi8KLQotCWlmIChpbnN0YW5jZSA+IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX3R5cGVdLmNvdW50KSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwotCX0KLQotCS8qCi0JICogV2FsayB0aGUgbGlzdCB0byBnZXQgdGhlIGRlc2lyZWQgdGFibGUKLQkgKiBOb3RlOiBJbnN0YW5jZSBpcyBvbmUtYmFzZWQKLQkgKi8KLQl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0ubmV4dDsKLQlmb3IgKGkgPSAxOyBpIDwgaW5zdGFuY2U7IGkrKykgewotCQl0YWJsZV9kZXNjID0gdGFibGVfZGVzYy0+bmV4dDsKLQl9Ci0KLQkvKiBXZSBhcmUgbm93IHBvaW50aW5nIHRvIHRoZSByZXF1ZXN0ZWQgdGFibGUncyBkZXNjcmlwdG9yICovCi0KLQkqcmV0dXJuX3RhYmxlID0gdGFibGVfZGVzYy0+cG9pbnRlcjsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk4MjExMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiB0YmdldGFsbCAtIEdldCBhbGwgcmVxdWlyZWQgQUNQSSB0YWJsZXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAotICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKLSAqICAgIHN1YnN0YW50aWFsbHkgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93Ci0gKiAgICAoIkRpc2NsYWltZXIiKSBhbmQgYW55IHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQgdXBvbgotICogICAgaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIKLSAqICAgIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcwotICogICAgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBOTyBXQVJSQU5UWQotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcKLSAqIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotICovCi0KLSNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+Ci0KLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwotQUNQSV9NT0RVTEVfTkFNRSgidGJnZXRhbGwiKQotCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3ByaW1hcnlfdGFibGUoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKLQkJCSAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlKHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCi0JCQkgICAgYWNwaV9zdHJpbmcgc2lnbmF0dXJlLAotCQkJICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIEFkZHJlc3MgICAgICAgICAgICAgLSBQaHlzaWNhbCBhZGRyZXNzIG9mIHRhYmxlIHRvIHJldHJpZXZlCi0gKiAgICAgICAgICAgICAgKnRhYmxlX2luZm8gICAgICAgICAtIFdoZXJlIHRoZSB0YWJsZSBpbmZvIGlzIHJldHVybmVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBNYXBzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRhYmxlIGludG8gYSBsb2dpY2FsIGFkZHJlc3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3ByaW1hcnlfdGFibGUoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKLQkJCSAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfZ2V0X3ByaW1hcnlfdGFibGUpOwotCi0JLyogSWdub3JlIGEgTlVMTCBhZGRyZXNzIGluIHRoZSBSU0RUICovCi0KLQlpZiAoIWFkZHJlc3MtPnBvaW50ZXIudmFsdWUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQl9Ci0KLQkvKiBHZXQgdGhlIGhlYWRlciBpbiBvcmRlciB0byBnZXQgc2lnbmF0dXJlIGFuZCB0YWJsZSBzaXplICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIoYWRkcmVzcywgJmhlYWRlcik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIENsZWFyIHRoZSB0YWJsZV9pbmZvICovCi0KLQlBQ1BJX01FTVNFVCh0YWJsZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwotCi0JLyoKLQkgKiBDaGVjayB0aGUgdGFibGUgc2lnbmF0dXJlIGFuZCBtYWtlIHN1cmUgaXQgaXMgcmVjb2duaXplZC4KLQkgKiBBbHNvIGNoZWNrcyB0aGUgaGVhZGVyIGNoZWNrc3VtCi0JICovCi0JdGFibGVfaW5mby0+cG9pbnRlciA9ICZoZWFkZXI7Ci0Jc3RhdHVzID0gYWNwaV90Yl9yZWNvZ25pemVfdGFibGUodGFibGVfaW5mbywgQUNQSV9UQUJMRV9QUklNQVJZKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogR2V0IHRoZSBlbnRpcmUgdGFibGUgKi8KLQotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkoYWRkcmVzcywgJmhlYWRlciwgdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEluc3RhbGwgdGhlIHRhYmxlICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2luc3RhbGxfdGFibGUodGFibGVfaW5mbyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZQotICoKLSAqIFBBUkFNRVRFUlM6ICBBZGRyZXNzICAgICAgICAgICAgIC0gUGh5c2ljYWwgYWRkcmVzcyBvZiB0YWJsZSB0byByZXRyaWV2ZQotICogICAgICAgICAgICAgICp0YWJsZV9pbmZvICAgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgaW5mbyBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogTWFwcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0YWJsZSBpbnRvIGEgbG9naWNhbCBhZGRyZXNzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF9zZWNvbmRhcnlfdGFibGUoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKLQkJCSAgICBhY3BpX3N0cmluZyBzaWduYXR1cmUsCi0JCQkgICAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKHRiX2dldF9zZWNvbmRhcnlfdGFibGUsIHNpZ25hdHVyZSk7Ci0KLQkvKiBHZXQgdGhlIGhlYWRlciBpbiBvcmRlciB0byBtYXRjaCB0aGUgc2lnbmF0dXJlICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIoYWRkcmVzcywgJmhlYWRlcik7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIFNpZ25hdHVyZSBtdXN0IG1hdGNoIHJlcXVlc3QgKi8KLQotCWlmICghQUNQSV9DT01QQVJFX05BTUUoaGVhZGVyLnNpZ25hdHVyZSwgc2lnbmF0dXJlKSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJJbmNvcnJlY3QgdGFibGUgc2lnbmF0dXJlIC0gd2FudGVkIFslc10gZm91bmQgWyU0LjRzXSIsCi0JCQkgICAgc2lnbmF0dXJlLCBoZWFkZXIuc2lnbmF0dXJlKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfU0lHTkFUVVJFKTsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIHRoZSB0YWJsZSBzaWduYXR1cmUgYW5kIG1ha2Ugc3VyZSBpdCBpcyByZWNvZ25pemVkLgotCSAqIEFsc28gY2hlY2tzIHRoZSBoZWFkZXIgY2hlY2tzdW0KLQkgKi8KLQl0YWJsZV9pbmZvLT5wb2ludGVyID0gJmhlYWRlcjsKLQlzdGF0dXMgPSBhY3BpX3RiX3JlY29nbml6ZV90YWJsZSh0YWJsZV9pbmZvLCBBQ1BJX1RBQkxFX1NFQ09OREFSWSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEdldCB0aGUgZW50aXJlIHRhYmxlICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9ib2R5KGFkZHJlc3MsICZoZWFkZXIsIHRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBJbnN0YWxsIHRoZSB0YWJsZSAqLwotCi0Jc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3RhYmxlKHRhYmxlX2luZm8pOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dldF9yZXF1aXJlZF90YWJsZXMKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogTG9hZCBhbmQgdmFsaWRhdGUgdGFibGVzIG90aGVyIHRoYW4gdGhlIFJTRFQuICBUaGUgUlNEVCBtdXN0Ci0gKiAgICAgICAgICAgICAgYWxyZWFkeSBiZSBsb2FkZWQgYW5kIHZhbGlkYXRlZC4KLSAqCi0gKiAgICAgICAgICAgICAgR2V0IHRoZSBtaW5pbXVtIHNldCBvZiBBQ1BJIHRhYmxlcywgbmFtZWx5OgotICoKLSAqICAgICAgICAgICAgICAxKSBGQURUICh2aWEgUlNEVCBpbiBsb29wIGJlbG93KQotICogICAgICAgICAgICAgIDIpIEZBQ1MgKHZpYSBGQURUKQotICogICAgICAgICAgICAgIDMpIERTRFQgKHZpYSBGQURUKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyh2b2lkKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXUzMiBpOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfaW5mbzsKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyIGFkZHJlc3M7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2dldF9yZXF1aXJlZF90YWJsZXMpOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiJWQgQUNQSSB0YWJsZXMgaW4gUlNEVFxuIiwKLQkJCSAgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudCkpOwotCi0JYWRkcmVzcy5wb2ludGVyX3R5cGUgPSBhY3BpX2dibF90YWJsZV9mbGFncyB8IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HOwotCi0JLyoKLQkgKiBMb29wIHRocm91Z2ggYWxsIHRhYmxlIHBvaW50ZXJzIGZvdW5kIGluIFJTRFQuCi0JICogVGhpcyB3aWxsIE5PVCBpbmNsdWRlIHRoZSBGQUNTIGFuZCBEU0RUIC0gd2UgbXVzdCBnZXQKLQkgKiB0aGVtIGFmdGVyIHRoZSBsb29wLgotCSAqCi0JICogVGhlIG9ubHkgdGFibGVzIHdlIGFyZSBpbnRlcmVzdGVkIGluIGdldHRpbmcgaGVyZSBpcyB0aGUgRkFEVCBhbmQKLQkgKiBhbnkgU1NEVHMuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQ7IGkrKykgewotCi0JCS8qIEdldCB0aGUgdGFibGUgYWRkcmVzcyBmcm9tIHRoZSBjb21tb24gaW50ZXJuYWwgWFNEVCAqLwotCi0JCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9IGFjcGlfZ2JsX1hTRFQtPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKLQotCQkvKgotCQkgKiBHZXQgdGhlIHRhYmxlcyBuZWVkZWQgYnkgdGhpcyBzdWJzeXN0ZW0gKEZBRFQgYW5kIGFueSBTU0RUcykuCi0JCSAqIE5PVEU6IEFsbCBvdGhlciB0YWJsZXMgYXJlIGNvbXBsZXRlbHkgaWdub3JlZCBhdCB0aGlzIHRpbWUuCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlKCZhZGRyZXNzLCAmdGFibGVfaW5mbyk7Ci0JCWlmICgoc3RhdHVzICE9IEFFX09LKSAmJiAoc3RhdHVzICE9IEFFX1RBQkxFX05PVF9TVVBQT1JURUQpKSB7Ci0JCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkJICAgICAgIiVzLCB3aGlsZSBnZXR0aW5nIHRhYmxlIGF0ICU4LjhYJTguOFgiLAotCQkJCSAgICAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLAotCQkJCSAgICAgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzLnBvaW50ZXIuCi0JCQkJCQkJIHZhbHVlKSkpOwotCQl9Ci0JfQotCi0JLyogV2UgbXVzdCBoYXZlIGEgRkFEVCB0byBjb250aW51ZSAqLwotCi0JaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJObyBGQURUIHByZXNlbnQgaW4gUlNEVC9YU0RUIikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fQUNQSV9UQUJMRVMpOwotCX0KLQotCS8qCi0JICogQ29udmVydCB0aGUgRkFEVCB0byBhIGNvbW1vbiBmb3JtYXQuICBUaGlzIGFsbG93cyBlYXJsaWVyIHJldmlzaW9ucyBvZgotCSAqIHRoZSB0YWJsZSB0byBjb2V4aXN0IHdpdGggbmV3ZXIgdmVyc2lvbnMsIHVzaW5nIGNvbW1vbiBhY2Nlc3MgY29kZS4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJDb3VsZCBub3QgY29udmVydCBGQURUIHRvIGludGVybmFsIGNvbW1vbiBmb3JtYXQiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIEdldCB0aGUgRkFDUyAoUG9pbnRlZCB0byBieSB0aGUgRkFEVCkgKi8KLQotCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9IGFjcGlfZ2JsX0ZBRFQtPnhmaXJtd2FyZV9jdHJsOwotCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlKCZhZGRyZXNzLCBGQUNTX1NJRywgJnRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCSJDb3VsZCBub3QgZ2V0L2luc3RhbGwgdGhlIEZBQ1MiKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qCi0JICogQ3JlYXRlIHRoZSBjb21tb24gRkFDUyBwb2ludGVyIHRhYmxlCi0JICogKENvbnRhaW5zIHBvaW50ZXJzIHRvIHRoZSBvcmlnaW5hbCB0YWJsZSkKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3RiX2J1aWxkX2NvbW1vbl9mYWNzKCZ0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogR2V0L2luc3RhbGwgdGhlIERTRFQgKFBvaW50ZWQgdG8gYnkgdGhlIEZBRFQpICovCi0KLQlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9GQURULT5YZHNkdDsKLQotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSgmYWRkcmVzcywgRFNEVF9TSUcsICZ0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkNvdWxkIG5vdCBnZXQvaW5zdGFsbCB0aGUgRFNEVCIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogU2V0IEludGVnZXIgV2lkdGggKDMyLzY0KSBiYXNlZCB1cG9uIERTRFQgcmV2aXNpb24gKi8KLQotCWFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGgoYWNwaV9nYmxfRFNEVC0+cmV2aXNpb24pOwotCi0JLyogRHVtcCB0aGUgZW50aXJlIERTRFQgKi8KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLAotCQkJICAiSGV4IGR1bXAgb2YgZW50aXJlIERTRFQsIHNpemUgJWQgKDB4JVgpLCBJbnRlZ2VyIHdpZHRoID0gJWRcbiIsCi0JCQkgIGFjcGlfZ2JsX0RTRFQtPmxlbmd0aCwgYWNwaV9nYmxfRFNEVC0+bGVuZ3RoLAotCQkJICBhY3BpX2dibF9pbnRlZ2VyX2JpdF93aWR0aCkpOwotCi0JQUNQSV9EVU1QX0JVRkZFUihBQ1BJX0NBU1RfUFRSKHU4LCBhY3BpX2dibF9EU0RUKSwKLQkJCSBhY3BpX2dibF9EU0RULT5sZW5ndGgpOwotCi0JLyogQWx3YXlzIGRlbGV0ZSB0aGUgUlNEUCBtYXBwaW5nLCB3ZSBhcmUgZG9uZSB3aXRoIGl0ICovCi0KLQlhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZShBQ1BJX1RBQkxFX0lEX1JTRFApOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jCmluZGV4IDE2NjhhMjMuLjBlN2IxMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00Miw1MTAgKzQyLDQ5OCBAQAogICovCiAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKIEFDUElfTU9EVUxFX05BTUUoInRiaW5zdGFsIikKIAotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3RiX21hdGNoX3NpZ25hdHVyZShjaGFyICpzaWduYXR1cmUsCi0JCQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvLCB1OCBzZWFyY2hfdHlwZSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl92ZXJpZnlfdGFibGUKICAqCi0gKiBQQVJBTUVURVJTOiAgU2lnbmF0dXJlICAgICAgICAgICAtIFRhYmxlIHNpZ25hdHVyZSB0byBtYXRjaAotICogICAgICAgICAgICAgIHRhYmxlX2luZm8gICAgICAgICAgLSBSZXR1cm4gZGF0YQotICogICAgICAgICAgICAgIHNlYXJjaF90eXBlICAgICAgICAgLSBUYWJsZSB0eXBlIHRvIG1hdGNoIChwcmltYXJ5L3NlY29uZGFyeSkKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9kZXNjICAgICAgICAgIC0gdGFibGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IENvbXBhcmUgc2lnbmF0dXJlIGFnYWluc3QgdGhlIGxpc3Qgb2YgIkFDUEktc3Vic3lzdGVtLW93bmVkIgotICogICAgICAgICAgICAgIHRhYmxlcyAoRFNEVC9GQURUL1NTRFQsIGV0Yy4pIFJldHVybnMgdGhlIHRhYmxlX3R5cGVfaUQgb24gbWF0Y2guCisgKiBERVNDUklQVElPTjogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gdmVyaWZ5IGFuZCBtYXAgdGFibGUKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlKGNoYXIgKnNpZ25hdHVyZSwKLQkJCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8sIHU4IHNlYXJjaF90eXBlKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMgYWNwaV90Yl92ZXJpZnlfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYykKIHsKLQlhY3BpX25hdGl2ZV91aW50IGk7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX21hdGNoX3NpZ25hdHVyZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl92ZXJpZnlfdGFibGUpOwogCi0JLyogU2VhcmNoIGZvciBhIHNpZ25hdHVyZSBtYXRjaCBhbW9uZyB0aGUga25vd24gdGFibGUgdHlwZXMgKi8KKwkvKiBNYXAgdGhlIHRhYmxlIGlmIG5lY2Vzc2FyeSAqLwogCi0JZm9yIChpID0gMDsgaSA8IChBQ1BJX1RBQkxFX0lEX01BWCArIDEpOyBpKyspIHsKLQkJaWYgKCEoYWNwaV9nYmxfdGFibGVfZGF0YVtpXS5mbGFncyAmIHNlYXJjaF90eXBlKSkgewotCQkJY29udGludWU7CisJaWYgKCF0YWJsZV9kZXNjLT5wb2ludGVyKSB7CisJCWlmICgodGFibGVfZGVzYy0+ZmxhZ3MgJiBBQ1BJX1RBQkxFX09SSUdJTl9NQVNLKSA9PQorCQkgICAgQUNQSV9UQUJMRV9PUklHSU5fTUFQUEVEKSB7CisJCQl0YWJsZV9kZXNjLT5wb2ludGVyID0KKwkJCSAgICBhY3BpX29zX21hcF9tZW1vcnkodGFibGVfZGVzYy0+YWRkcmVzcywKKwkJCQkJICAgICAgIHRhYmxlX2Rlc2MtPmxlbmd0aCk7CiAJCX0KLQotCQlpZiAoIUFDUElfU1RSTkNNUChzaWduYXR1cmUsIGFjcGlfZ2JsX3RhYmxlX2RhdGFbaV0uc2lnbmF0dXJlLAotCQkJCSAgYWNwaV9nYmxfdGFibGVfZGF0YVtpXS5zaWdfbGVuZ3RoKSkgewotCi0JCQkvKiBGb3VuZCBhIHNpZ25hdHVyZSBtYXRjaCwgcmV0dXJuIGluZGV4IGlmIHJlcXVlc3RlZCAqLwotCi0JCQlpZiAodGFibGVfaW5mbykgewotCQkJCXRhYmxlX2luZm8tPnR5cGUgPSAodTgpIGk7Ci0JCQl9Ci0KLQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkJICAiVGFibGUgWyU0LjRzXSBpcyBhbiBBQ1BJIHRhYmxlIGNvbnN1bWVkIGJ5IHRoZSBjb3JlIHN1YnN5c3RlbVxuIiwKLQkJCQkJICAoY2hhciAqKWFjcGlfZ2JsX3RhYmxlX2RhdGFbaV0uCi0JCQkJCSAgc2lnbmF0dXJlKSk7Ci0KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCWlmICghdGFibGVfZGVzYy0+cG9pbnRlcikgeworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJCX0KIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkgICJUYWJsZSBbJTQuNHNdIGlzIG5vdCBhbiBBQ1BJIHRhYmxlIGNvbnN1bWVkIGJ5IHRoZSBjb3JlIHN1YnN5c3RlbSAtIGlnbm9yZWRcbiIsCi0JCQkgIChjaGFyICopc2lnbmF0dXJlKSk7CisJLyogRkFDUyBpcyB0aGUgb2RkIHRhYmxlLCBoYXMgbm8gc3RhbmRhcmQgQUNQSSBoZWFkZXIgYW5kIG5vIGNoZWNrc3VtICovCiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVEFCTEVfTk9UX1NVUFBPUlRFRCk7CisJaWYgKCFBQ1BJX0NPTVBBUkVfTkFNRSgmdGFibGVfZGVzYy0+c2lnbmF0dXJlLCBBQ1BJX1NJR19GQUNTKSkgeworCisJCS8qIEFsd2F5cyBjYWxjdWxhdGUgY2hlY2tzdW0sIGlnbm9yZSBiYWQgY2hlY2tzdW0gaWYgcmVxdWVzdGVkICovCisKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfdGJfdmVyaWZ5X2NoZWNrc3VtKHRhYmxlX2Rlc2MtPnBvaW50ZXIsCisJCQkJCSAgICB0YWJsZV9kZXNjLT5sZW5ndGgpOworCX0KKworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2luc3RhbGxfdGFibGUKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2FkZF90YWJsZQogICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmZvICAgICAgICAgIC0gUmV0dXJuIHZhbHVlIGZyb20gYWNwaV90Yl9nZXRfdGFibGVfYm9keQorICogUEFSQU1FVEVSUzogIHRhYmxlX2Rlc2MgICAgICAgICAgLSBUYWJsZSBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgdGFibGVfaW5kZXggICAgICAgICAtIFdoZXJlIHRoZSB0YWJsZSBpbmRleCBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogSW5zdGFsbCB0aGUgdGFibGUgaW50byB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlcy4KKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBhZGQgdGhlIEFDUEkgdGFibGUKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cyBhY3BpX3RiX2luc3RhbGxfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbykKK2FjcGlfc3RhdHVzCithY3BpX3RiX2FkZF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjLAorCQkgIGFjcGlfbmF0aXZlX3VpbnQgKiB0YWJsZV9pbmRleCkKIHsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9uYXRpdmVfdWludCBpOworCWFjcGlfbmF0aXZlX3VpbnQgbGVuZ3RoOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9pbnN0YWxsX3RhYmxlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2FkZF90YWJsZSk7CiAKLQkvKiBMb2NrIHRhYmxlcyB3aGlsZSBpbnN0YWxsaW5nICovCisJaWYgKCF0YWJsZV9kZXNjLT5wb2ludGVyKSB7CisJCXN0YXR1cyA9IGFjcGlfdGJfdmVyaWZ5X3RhYmxlKHRhYmxlX2Rlc2MpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIXRhYmxlX2Rlc2MtPnBvaW50ZXIpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CisJfQogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIkNvdWxkIG5vdCBhY3F1aXJlIHRhYmxlIG11dGV4IikpOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkvKiBUaGUgdGFibGUgbXVzdCBiZSBlaXRoZXIgYW4gU1NEVCBvciBhIFBTRFQgKi8KKworCWlmICgoIUFDUElfQ09NUEFSRV9OQU1FKHRhYmxlX2Rlc2MtPnBvaW50ZXItPnNpZ25hdHVyZSwgQUNQSV9TSUdfUFNEVCkpCisJICAgICYmCisJICAgICghQUNQSV9DT01QQVJFX05BTUUodGFibGVfZGVzYy0+cG9pbnRlci0+c2lnbmF0dXJlLCBBQ1BJX1NJR19TU0RUKSkpCisJeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJUYWJsZSBoYXMgaW52YWxpZCBzaWduYXR1cmUgWyU0LjRzXSwgbXVzdCBiZSBTU0RUIG9yIFBTRFQiLAorCQkJICAgIHRhYmxlX2Rlc2MtPnBvaW50ZXItPnNpZ25hdHVyZSkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1NJR05BVFVSRSk7CisJfQorCisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisKKwkvKiBDaGVjayBpZiB0YWJsZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgKi8KKworCWZvciAoaSA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7ICsraSkgeworCQlpZiAoIWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlcikgeworCQkJc3RhdHVzID0KKwkJCSAgICBhY3BpX3RiX3ZlcmlmeV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCQkJIHRhYmxlc1tpXSk7CisJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykKKwkJCSAgICB8fCAhYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlsZW5ndGggPSBBQ1BJX01JTih0YWJsZV9kZXNjLT5sZW5ndGgsCisJCQkJICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLmxlbmd0aCk7CisJCWlmIChBQ1BJX01FTUNNUCh0YWJsZV9kZXNjLT5wb2ludGVyLAorCQkJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlciwKKwkJCQlsZW5ndGgpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRhYmxlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCAqLworCisJCWFjcGlfdGJfZGVsZXRlX3RhYmxlKHRhYmxlX2Rlc2MpOworCQkqdGFibGVfaW5kZXggPSBpOworCQlnb3RvIHJlbGVhc2U7CiAJfQogCiAJLyoKLQkgKiBJZ25vcmUgYSB0YWJsZSB0aGF0IGlzIGFscmVhZHkgaW5zdGFsbGVkLiBGb3IgZXhhbXBsZSwgc29tZSBCSU9TCi0JICogQVNMIGNvZGUgd2lsbCByZXBlYXRlZGx5IGF0dGVtcHQgdG8gbG9hZCB0aGUgc2FtZSBTU0RULgorCSAqIEFkZCB0aGUgdGFibGUgdG8gdGhlIGdsb2JhbCB0YWJsZSBsaXN0CiAJICovCi0Jc3RhdHVzID0gYWNwaV90Yl9pc190YWJsZV9pbnN0YWxsZWQodGFibGVfaW5mbyk7CisJc3RhdHVzID0gYWNwaV90Yl9zdG9yZV90YWJsZSh0YWJsZV9kZXNjLT5hZGRyZXNzLCB0YWJsZV9kZXNjLT5wb2ludGVyLAorCQkJCSAgICAgdGFibGVfZGVzYy0+bGVuZ3RoLCB0YWJsZV9kZXNjLT5mbGFncywKKwkJCQkgICAgIHRhYmxlX2luZGV4KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CisJCWdvdG8gcmVsZWFzZTsKIAl9CiAKLQkvKiBJbnN0YWxsIHRoZSB0YWJsZSBpbnRvIHRoZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgKi8KKwlhY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcih0YWJsZV9kZXNjLT5hZGRyZXNzLCB0YWJsZV9kZXNjLT5wb2ludGVyKTsKIAotCXN0YXR1cyA9IGFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yKHRhYmxlX2luZm8tPnR5cGUsIHRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCSJDb3VsZCBub3QgaW5zdGFsbCB0YWJsZSBbJTQuNHNdIiwKLQkJCQl0YWJsZV9pbmZvLT5wb2ludGVyLT5zaWduYXR1cmUpKTsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICIlcyBsb2NhdGVkIGF0ICVwXG4iLAotCQkJICBhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX2luZm8tPnR5cGVdLm5hbWUsCi0JCQkgIHRhYmxlX2luZm8tPnBvaW50ZXIpKTsKLQotICAgICAgdW5sb2NrX2FuZF9leGl0OgorICAgICAgcmVsZWFzZToKIAkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9yZWNvZ25pemVfdGFibGUKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3Jlc2l6ZV9yb290X3RhYmxlX2xpc3QKICAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfaW5mbyAgICAgICAgICAtIFJldHVybiB2YWx1ZSBmcm9tIGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkKLSAqICAgICAgICAgICAgICBzZWFyY2hfdHlwZSAgICAgICAgIC0gVGFibGUgdHlwZSB0byBtYXRjaCAocHJpbWFyeS9zZWNvbmRhcnkpCisgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogQ2hlY2sgYSB0YWJsZSBzaWduYXR1cmUgZm9yIGEgbWF0Y2ggYWdhaW5zdCBrbm93biB0YWJsZSB0eXBlcwotICoKLSAqIE5PVEU6ICBBbGwgdGFibGUgcG9pbnRlcnMgYXJlIHZhbGlkYXRlZCBhcyBmb2xsb3dzOgotICogICAgICAgICAgMSkgVGFibGUgcG9pbnRlciBtdXN0IHBvaW50IHRvIHZhbGlkIHBoeXNpY2FsIG1lbW9yeQotICogICAgICAgICAgMikgU2lnbmF0dXJlIG11c3QgYmUgNCBBU0NJSSBjaGFycywgZXZlbiBpZiB3ZSBkb24ndCByZWNvZ25pemUgdGhlCi0gKiAgICAgICAgICAgICBuYW1lCi0gKiAgICAgICAgICAzKSBUYWJsZSBtdXN0IGJlIHJlYWRhYmxlIGZvciBsZW5ndGggc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIKLSAqICAgICAgICAgIDQpIFRhYmxlIGNoZWNrc3VtIG11c3QgYmUgdmFsaWQgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgRkFDUwotICogICAgICAgICAgICAgd2hpY2ggaGFzIG5vIGNoZWNrc3VtIGZvciBzb21lIG9kZCByZWFzb24pCisgKiBERVNDUklQVElPTjogRXhwYW5kIHRoZSBzaXplIG9mIGdsb2JhbCB0YWJsZSBhcnJheQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX3JlY29nbml6ZV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvLCB1OCBzZWFyY2hfdHlwZSkKK2FjcGlfc3RhdHVzIGFjcGlfdGJfcmVzaXplX3Jvb3RfdGFibGVfbGlzdCh2b2lkKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfaGVhZGVyOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX3JlY29nbml6ZV90YWJsZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9yZXNpemVfcm9vdF90YWJsZV9saXN0KTsKIAotCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCB0YWJsZSBwb2ludGVyICovCisJLyogYWxsb3dfcmVzaXplIGZsYWcgaXMgYSBwYXJhbWV0ZXIgdG8gYWNwaV9pbml0aWFsaXplX3RhYmxlcyAqLwogCi0JdGFibGVfaGVhZGVyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKXRhYmxlX2luZm8tPnBvaW50ZXI7Ci0JaWYgKCF0YWJsZV9oZWFkZXIpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCWlmICghKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5mbGFncyAmIEFDUElfUk9PVF9BTExPV19SRVNJWkUpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlJlc2l6ZSBvZiBSb290IFRhYmxlIEFycmF5IGlzIG5vdCBhbGxvd2VkIikpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7CiAJfQogCi0JLyoKLQkgKiBXZSBvbmx5ICJyZWNvZ25pemUiIGEgbGltaXRlZCBudW1iZXIgb2YgQUNQSSB0YWJsZXMgLS0gbmFtZWx5LCB0aGUKLQkgKiBvbmVzIHRoYXQgYXJlIHVzZWQgYnkgdGhlIHN1YnN5c3RlbSAoRFNEVCwgRkFEVCwgZXRjLikKLQkgKgotCSAqIEFuIEFFX1RBQkxFX05PVF9TVVBQT1JURUQgbWVhbnMgdGhhdCB0aGUgdGFibGUgd2FzIG5vdCByZWNvZ25pemVkLgotCSAqIFRoaXMgY2FuIGJlIGFueSBvbmUgb2YgbWFueSB2YWxpZCBBQ1BJIHRhYmxlcywgaXQganVzdCBpc24ndCBvbmUgb2YKLQkgKiB0aGUgdGFibGVzIHRoYXQgaXMgY29uc3VtZWQgYnkgdGhlIGNvcmUgc3Vic3lzdGVtCi0JICovCi0Jc3RhdHVzID0gYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUodGFibGVfaGVhZGVyLT5zaWduYXR1cmUsCi0JCQkJCSB0YWJsZV9pbmZvLCBzZWFyY2hfdHlwZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KKwkvKiBJbmNyZWFzZSB0aGUgVGFibGUgQXJyYXkgc2l6ZSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl92YWxpZGF0ZV90YWJsZV9oZWFkZXIodGFibGVfaGVhZGVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogUmV0dXJuIHRoZSB0YWJsZSB0eXBlIGFuZCBsZW5ndGggdmlhIHRoZSBpbmZvIHN0cnVjdCAqLwotCi0JdGFibGVfaW5mby0+bGVuZ3RoID0gKGFjcGlfc2l6ZSkgdGFibGVfaGVhZGVyLT5sZW5ndGg7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yCi0gKgotICogUEFSQU1FVEVSUzogIHRhYmxlX3R5cGUgICAgICAgICAgLSBUaGUgdHlwZSBvZiB0aGUgdGFibGUKLSAqICAgICAgICAgICAgICB0YWJsZV9pbmZvICAgICAgICAgIC0gQSB0YWJsZSBpbmZvIHN0cnVjdAotICoKLSAqIFJFVFVSTjogICAgICBOb25lLgotICoKLSAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgdGFibGUgaW50byB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0cy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9pbml0X3RhYmxlX2Rlc2NyaXB0b3IoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsCi0JCQkgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKQotewotCXN0cnVjdCBhY3BpX3RhYmxlX2xpc3QgKmxpc3RfaGVhZDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHRiX2luaXRfdGFibGVfZGVzY3JpcHRvciwgdGFibGVfdHlwZSk7Ci0KLQkvKiBBbGxvY2F0ZSBhIGRlc2NyaXB0b3IgZm9yIHRoaXMgdGFibGUgKi8KLQotCXRhYmxlX2Rlc2MgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwotCWlmICghdGFibGVfZGVzYykgeworCXRhYmxlcyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKChhY3BpX2dibF9yb290X3RhYmxlX2xpc3Quc2l6ZSArCisJCQkJICAgICAgIEFDUElfUk9PVF9UQUJMRV9TSVpFX0lOQ1JFTUVOVCkKKwkJCQkgICAgICAqIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CisJaWYgKCF0YWJsZXMpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiQ291bGQgbm90IGFsbG9jYXRlIG5ldyByb290IHRhYmxlIGFycmF5IikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQkvKiBHZXQgYSBuZXcgb3duZXIgSUQgZm9yIHRoZSB0YWJsZSAqLworCS8qIENvcHkgYW5kIGZyZWUgdGhlIHByZXZpb3VzIHRhYmxlIGFycmF5ICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkKCZ0YWJsZV9kZXNjLT5vd25lcl9pZCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gZXJyb3JfZXhpdDE7Ci0JfQorCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzKSB7CisJCUFDUElfTUVNQ1BZKHRhYmxlcywgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcywKKwkJCSAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3Quc2l6ZSAqCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKIAotCS8qIEluc3RhbGwgdGhlIHRhYmxlIGludG8gdGhlIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSAqLwotCi0JbGlzdF9oZWFkID0gJmFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX3R5cGVdOwotCi0JLyoKLQkgKiBUd28gbWFqb3IgdHlwZXMgb2YgdGFibGVzOiAgMSkgT25seSBvbmUgaW5zdGFuY2UgaXMgYWxsb3dlZC4gIFRoaXMKLQkgKiBpbmNsdWRlcyBtb3N0IEFDUEkgdGFibGVzIHN1Y2ggYXMgdGhlIERTRFQuICAyKSBNdWx0aXBsZSBpbnN0YW5jZXMgb2YKLQkgKiB0aGUgdGFibGUgYXJlIGFsbG93ZWQuICBUaGlzIGluY2x1ZGVzIFNTRFQgYW5kIFBTRFRzLgotCSAqLwotCWlmIChBQ1BJX0lTX1NJTkdMRV9UQUJMRShhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX3R5cGVdLmZsYWdzKSkgewotCQkvKgotCQkgKiBPbmx5IG9uZSB0YWJsZSBhbGxvd2VkLCBhbmQgYSB0YWJsZSBoYXMgYWxyZWFkIGJlZW4gaW5zdGFsbGVkCi0JCSAqIGF0IHRoaXMgbG9jYXRpb24sIHNvIHJldHVybiBhbiBlcnJvci4KLQkJICovCi0JCWlmIChsaXN0X2hlYWQtPm5leHQpIHsKLQkJCXN0YXR1cyA9IEFFX0FMUkVBRFlfRVhJU1RTOwotCQkJZ290byBlcnJvcl9leGl0MjsKLQkJfQotCi0JCXRhYmxlX2Rlc2MtPm5leHQgPSBsaXN0X2hlYWQtPm5leHQ7Ci0JCWxpc3RfaGVhZC0+bmV4dCA9IHRhYmxlX2Rlc2M7Ci0KLQkJaWYgKHRhYmxlX2Rlc2MtPm5leHQpIHsKLQkJCXRhYmxlX2Rlc2MtPm5leHQtPnByZXYgPSB0YWJsZV9kZXNjOwotCQl9Ci0KLQkJbGlzdF9oZWFkLT5jb3VudCsrOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIExpbmsgdGhlIG5ldyB0YWJsZSBpbiB0byB0aGUgbGlzdCBvZiB0YWJsZXMgb2YgdGhpcyB0eXBlLgotCQkgKiBJbnNlcnQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCwgb3JkZXIgSVMgSU1QT1JUQU5ULgotCQkgKgotCQkgKiB0YWJsZV9kZXNjLT5QcmV2ICYgTmV4dCBhcmUgYWxyZWFkeSBOVUxMIGZyb20gY2FsbG9jKCkKLQkJICovCi0JCWxpc3RfaGVhZC0+Y291bnQrKzsKLQotCQlpZiAoIWxpc3RfaGVhZC0+bmV4dCkgewotCQkJbGlzdF9oZWFkLT5uZXh0ID0gdGFibGVfZGVzYzsKLQkJfSBlbHNlIHsKLQkJCXRhYmxlX2Rlc2MtPm5leHQgPSBsaXN0X2hlYWQtPm5leHQ7Ci0KLQkJCXdoaWxlICh0YWJsZV9kZXNjLT5uZXh0LT5uZXh0KSB7Ci0JCQkJdGFibGVfZGVzYy0+bmV4dCA9IHRhYmxlX2Rlc2MtPm5leHQtPm5leHQ7Ci0JCQl9Ci0KLQkJCXRhYmxlX2Rlc2MtPm5leHQtPm5leHQgPSB0YWJsZV9kZXNjOwotCQkJdGFibGVfZGVzYy0+cHJldiA9IHRhYmxlX2Rlc2MtPm5leHQ7Ci0JCQl0YWJsZV9kZXNjLT5uZXh0ID0gTlVMTDsKKwkJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5mbGFncyAmIEFDUElfUk9PVF9PUklHSU5fQUxMT0NBVEVEKSB7CisJCQlBQ1BJX0ZSRUUoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcyk7CiAJCX0KIAl9CiAKLQkvKiBGaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlIGRlc2NyaXB0b3IgKi8KKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzID0gdGFibGVzOworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5zaXplICs9IEFDUElfUk9PVF9UQUJMRV9TSVpFX0lOQ1JFTUVOVDsKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgfD0gKHU4KSBBQ1BJX1JPT1RfT1JJR0lOX0FMTE9DQVRFRDsKIAotCXRhYmxlX2Rlc2MtPmxvYWRlZF9pbnRvX25hbWVzcGFjZSA9IEZBTFNFOwotCXRhYmxlX2Rlc2MtPnR5cGUgPSAodTgpIHRhYmxlX3R5cGU7Ci0JdGFibGVfZGVzYy0+cG9pbnRlciA9IHRhYmxlX2luZm8tPnBvaW50ZXI7Ci0JdGFibGVfZGVzYy0+bGVuZ3RoID0gdGFibGVfaW5mby0+bGVuZ3RoOwotCXRhYmxlX2Rlc2MtPmFsbG9jYXRpb24gPSB0YWJsZV9pbmZvLT5hbGxvY2F0aW9uOwotCXRhYmxlX2Rlc2MtPmFtbF9zdGFydCA9ICh1OCAqKSAodGFibGVfZGVzYy0+cG9pbnRlciArIDEpLAotCSAgICB0YWJsZV9kZXNjLT5hbWxfbGVuZ3RoID0gKHUzMikKLQkgICAgKHRhYmxlX2Rlc2MtPmxlbmd0aCAtICh1MzIpIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKLQotCS8qCi0JICogU2V0IHRoZSBhcHByb3ByaWF0ZSBnbG9iYWwgcG9pbnRlciAoaWYgdGhlcmUgaXMgb25lKSB0byBwb2ludCB0byB0aGUKLQkgKiBuZXdseSBpbnN0YWxsZWQgdGFibGUKLQkgKi8KLQlpZiAoYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5nbG9iYWxfcHRyKSB7Ci0JCSooYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5nbG9iYWxfcHRyKSA9Ci0JCSAgICB0YWJsZV9pbmZvLT5wb2ludGVyOwotCX0KLQotCS8qIFJldHVybiBEYXRhICovCi0KLQl0YWJsZV9pbmZvLT5vd25lcl9pZCA9IHRhYmxlX2Rlc2MtPm93bmVyX2lkOwotCXRhYmxlX2luZm8tPmluc3RhbGxlZF9kZXNjID0gdGFibGVfZGVzYzsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCi0JLyogRXJyb3IgZXhpdCB3aXRoIGNsZWFudXAgKi8KLQotICAgICAgZXJyb3JfZXhpdDI6Ci0KLQlhY3BpX3V0X3JlbGVhc2Vfb3duZXJfaWQoJnRhYmxlX2Rlc2MtPm93bmVyX2lkKTsKLQotICAgICAgZXJyb3JfZXhpdDE6Ci0KLQlBQ1BJX0ZSRUUodGFibGVfZGVzYyk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZGVsZXRlX2FsbF90YWJsZXMKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3N0b3JlX3RhYmxlCiAgKgotICogUEFSQU1FVEVSUzogIE5vbmUuCisgKiBQQVJBTUVURVJTOiAgQWRkcmVzcyAgICAgICAgICAgICAtIFRhYmxlIGFkZHJlc3MKKyAqICAgICAgICAgICAgICBUYWJsZSAgICAgICAgICAgICAgIC0gVGFibGUgaGVhZGVyCisgKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAtIFRhYmxlIGxlbmd0aAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBmbGFncwogICoKLSAqIFJFVFVSTjogICAgICBOb25lLgorICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgdGFibGUgaW5kZXguCisgKgorICogREVTQ1JJUFRJT046IEFkZCBhbiBBQ1BJIHRhYmxlIHRvIHRoZSBnbG9iYWwgdGFibGUgbGlzdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3RiX3N0b3JlX3RhYmxlKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLAorCQkgICAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwKKwkJICAgIHUzMiBsZW5ndGgsIHU4IGZsYWdzLCBhY3BpX25hdGl2ZV91aW50ICogdGFibGVfaW5kZXgpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisKKwkvKiBFbnN1cmUgdGhhdCB0aGVyZSBpcyByb29tIGZvciB0aGUgdGFibGUgaW4gdGhlIFJvb3QgVGFibGUgTGlzdCAqLworCisJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCA+PSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3Quc2l6ZSkgeworCQlzdGF0dXMgPSBhY3BpX3RiX3Jlc2l6ZV9yb290X3RhYmxlX2xpc3QoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm4gKHN0YXR1cyk7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIGFkZGVkIHRhYmxlICovCisKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2FjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudF0uCisJICAgIGFkZHJlc3MgPSBhZGRyZXNzOworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50XS4KKwkgICAgcG9pbnRlciA9IHRhYmxlOworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50XS5sZW5ndGggPQorCSAgICBsZW5ndGg7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1thY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnRdLgorCSAgICBvd25lcl9pZCA9IDA7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1thY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnRdLmZsYWdzID0KKwkgICAgZmxhZ3M7CisKKwlBQ1BJX01PVkVfMzJfVE9fMzIoJgorCQkJICAgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KKwkJCSAgICB0YWJsZXNbYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50XS5zaWduYXR1cmUpLAorCQkJICAgdGFibGUtPnNpZ25hdHVyZSk7CisKKwkqdGFibGVfaW5kZXggPSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50Kys7CisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2RlbGV0ZV90YWJsZQorICoKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmRleCAgICAgICAgIC0gVGFibGUgaW5kZXgKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBEZWxldGUgb25lIGludGVybmFsIEFDUEkgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdGJfZGVsZXRlX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MpCit7CisJLyogVGFibGUgbXVzdCBiZSBtYXBwZWQgb3IgYWxsb2NhdGVkICovCisJaWYgKCF0YWJsZV9kZXNjLT5wb2ludGVyKSB7CisJCXJldHVybjsKKwl9CisJc3dpdGNoICh0YWJsZV9kZXNjLT5mbGFncyAmIEFDUElfVEFCTEVfT1JJR0lOX01BU0spIHsKKwljYXNlIEFDUElfVEFCTEVfT1JJR0lOX01BUFBFRDoKKwkJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGVfZGVzYy0+cG9pbnRlciwgdGFibGVfZGVzYy0+bGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBBQ1BJX1RBQkxFX09SSUdJTl9BTExPQ0FURUQ6CisJCUFDUElfRlJFRSh0YWJsZV9kZXNjLT5wb2ludGVyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDo7CisJfQorCisJdGFibGVfZGVzYy0+cG9pbnRlciA9IE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdGVybWluYXRlCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBEZWxldGUgYWxsIGludGVybmFsIEFDUEkgdGFibGVzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBhY3BpX3RiX2RlbGV0ZV9hbGxfdGFibGVzKHZvaWQpCit2b2lkIGFjcGlfdGJfdGVybWluYXRlKHZvaWQpCiB7Ci0JYWNwaV90YWJsZV90eXBlIHR5cGU7CisJYWNwaV9uYXRpdmVfdWludCBpOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl90ZXJtaW5hdGUpOworCisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisKKwkvKiBEZWxldGUgdGhlIGluZGl2aWR1YWwgdGFibGVzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyArK2kpIHsKKwkJYWNwaV90Yl9kZWxldGVfdGFibGUoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0pOworCX0KIAogCS8qCi0JICogRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBBQ1BJIHRhYmxlcwotCSAqIE1lbW9yeSBjYW4gZWl0aGVyIGJlIG1hcHBlZCBvciBhbGxvY2F0ZWQKKwkgKiBEZWxldGUgdGhlIHJvb3QgdGFibGUgYXJyYXkgaWYgYWxsb2NhdGVkIGxvY2FsbHkuIEFycmF5IGNhbm5vdCBiZQorCSAqIG1hcHBlZCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgdGhhdCBmbGFnLgogCSAqLwotCWZvciAodHlwZSA9IDA7IHR5cGUgPCAoQUNQSV9UQUJMRV9JRF9NQVggKyAxKTsgdHlwZSsrKSB7Ci0JCWFjcGlfdGJfZGVsZXRlX3RhYmxlc19ieV90eXBlKHR5cGUpOworCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgJiBBQ1BJX1JPT1RfT1JJR0lOX0FMTE9DQVRFRCkgeworCQlBQ1BJX0ZSRUUoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcyk7CiAJfQorCisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcyA9IE5VTEw7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmZsYWdzID0gMDsKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQgPSAwOworCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQUNQSSBUYWJsZXMgZnJlZWRcbiIpKTsKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9kZWxldGVfdGFibGVzX2J5X3R5cGUKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIKICAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIFRoZSB0YWJsZSB0eXBlIHRvIGJlIGRlbGV0ZWQKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmRleCAgICAgICAgIC0gVGFibGUgaW5kZXgKICAqCi0gKiBSRVRVUk46ICAgICAgTm9uZS4KKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IERlbGV0ZSBhbiBpbnRlcm5hbCBBQ1BJIHRhYmxlCi0gKiAgICAgICAgICAgICAgTG9ja3MgdGhlIEFDUEkgdGFibGUgbXV0ZXgKKyAqIERFU0NSSVBUSU9OOiBEZWxldGUgYWxsIG5hbWVzcGFjZSBvYmplY3RzIGNyZWF0ZWQgd2hlbiB0aGlzIHRhYmxlIHdhcyBsb2FkZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZShhY3BpX3RhYmxlX3R5cGUgdHlwZSkKK3ZvaWQgYWNwaV90Yl9kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKLQl1MzIgY291bnQ7Ci0JdTMyIGk7CisJYWNwaV9vd25lcl9pZCBvd25lcl9pZDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHRiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZSwgdHlwZSk7Ci0KLQlpZiAodHlwZSA+IEFDUElfVEFCTEVfSURfTUFYKSB7Ci0JCXJldHVybl9WT0lEOwotCX0KLQotCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUykpKSB7CisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJaWYgKHRhYmxlX2luZGV4IDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50KSB7CisJCW93bmVyX2lkID0KKwkJICAgIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLm93bmVyX2lkOworCX0gZWxzZSB7CisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCQlyZXR1cm47CiAJfQogCi0JLyogQ2xlYXIgdGhlIGFwcHJvcHJpYXRlICJ0eXBlZCIgZ2xvYmFsIHRhYmxlIHBvaW50ZXIgKi8KLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQUNQSV9UQUJMRV9JRF9SU0RQOgotCQlhY3BpX2dibF9SU0RQID0gTlVMTDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVEFCTEVfSURfRFNEVDoKLQkJYWNwaV9nYmxfRFNEVCA9IE5VTEw7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RBQkxFX0lEX0ZBRFQ6Ci0JCWFjcGlfZ2JsX0ZBRFQgPSBOVUxMOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UQUJMRV9JRF9GQUNTOgotCQlhY3BpX2dibF9GQUNTID0gTlVMTDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfVEFCTEVfSURfWFNEVDoKLQkJYWNwaV9nYmxfWFNEVCA9IE5VTEw7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1RBQkxFX0lEX1NTRFQ6Ci0JY2FzZSBBQ1BJX1RBQkxFX0lEX1BTRFQ6Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyoKLQkgKiBGcmVlIHRoZSB0YWJsZQotCSAqIDEpIEdldCB0aGUgaGVhZCBvZiB0aGUgbGlzdAotCSAqLwotCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1t0eXBlXS5uZXh0OwotCWNvdW50ID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbdHlwZV0uY291bnQ7Ci0KLQkvKgotCSAqIDIpIFdhbGsgdGhlIGVudGlyZSBsaXN0LCBkZWxldGluZyBib3RoIHRoZSBhbGxvY2F0ZWQgdGFibGVzCi0JICogICAgYW5kIHRoZSB0YWJsZSBkZXNjcmlwdG9ycwotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCXRhYmxlX2Rlc2MgPSBhY3BpX3RiX3VuaW5zdGFsbF90YWJsZSh0YWJsZV9kZXNjKTsKLQl9Ci0KIAkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKLQlyZXR1cm5fVk9JRDsKKwlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIob3duZXJfaWQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2FsbG9jYXRlX293bmVyX2lkCiAgKgotICogUEFSQU1FVEVSUzogIHRhYmxlX2luZm8gICAgICAgICAgLSBBIHRhYmxlIGluZm8gc3RydWN0CisgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAtIFRhYmxlIGluZGV4CiAgKgotICogUkVUVVJOOiAgICAgIE5vbmUuCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IExvdy1sZXZlbCBmcmVlIGZvciBhIHNpbmdsZSBBQ1BJIHRhYmxlLiAgSGFuZGxlcyBjYXNlcyB3aGVyZQotICogICAgICAgICAgICAgIHRoZSB0YWJsZSB3YXMgYWxsb2NhdGVkIGEgYnVmZmVyIG9yIHdhcyBtYXBwZWQuCisgKiBERVNDUklQVElPTjogQWxsb2NhdGVzIG93bmVyX2lkIGluIHRhYmxlX2Rlc2MKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIGFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKQorYWNwaV9zdGF0dXMgYWNwaV90Yl9hbGxvY2F0ZV9vd25lcl9pZChhY3BpX25hdGl2ZV91aW50IHRhYmxlX2luZGV4KQogeworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CiAKLQkvKiBNdXN0IGhhdmUgYSB2YWxpZCB0YWJsZSBkZXNjcmlwdG9yIGFuZCBwb2ludGVyICovCisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9hbGxvY2F0ZV9vd25lcl9pZCk7CiAKLQlpZiAoKCF0YWJsZV9kZXNjKSB8fCAoIXRhYmxlX2Rlc2MtPnBvaW50ZXIpKSB7Ci0JCXJldHVybjsKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlpZiAodGFibGVfaW5kZXggPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQpIHsKKwkJc3RhdHVzID0gYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZAorCQkgICAgKCYoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0ub3duZXJfaWQpKTsKIAl9CiAKLQkvKiBWYWxpZCB0YWJsZSwgZGV0ZXJtaW5lIHR5cGUgb2YgbWVtb3J5IGFsbG9jYXRpb24gKi8KLQotCXN3aXRjaCAodGFibGVfZGVzYy0+YWxsb2NhdGlvbikgewotCWNhc2UgQUNQSV9NRU1fTk9UX0FMTE9DQVRFRDoKLQkJYnJlYWs7Ci0KLQljYXNlIEFDUElfTUVNX0FMTE9DQVRFRDoKLQotCQlBQ1BJX0ZSRUUodGFibGVfZGVzYy0+cG9pbnRlcik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX01FTV9NQVBQRUQ6Ci0KLQkJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGVfZGVzYy0+cG9pbnRlciwgdGFibGVfZGVzYy0+bGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdW5pbnN0YWxsX3RhYmxlCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9yZWxlYXNlX293bmVyX2lkCiAgKgotICogUEFSQU1FVEVSUzogIHRhYmxlX2luZm8gICAgICAgICAgLSBBIHRhYmxlIGluZm8gc3RydWN0CisgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAtIFRhYmxlIGluZGV4CiAgKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gdGhlIG5leHQgdGFibGUgaW4gdGhlIGxpc3QgKG9mIHNhbWUgdHlwZSkKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRnJlZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhbiBpbnRlcm5hbCBBQ1BJIHRhYmxlIHRoYXQKLSAqICAgICAgICAgICAgICBpcyBlaXRoZXIgaW5zdGFsbGVkIG9yIGhhcyBuZXZlciBiZWVuIGluc3RhbGxlZC4KLSAqICAgICAgICAgICAgICBUYWJsZSBtdXRleCBzaG91bGQgYmUgbG9ja2VkLgorICogREVTQ1JJUFRJT046IFJlbGVhc2VzIG93bmVyX2lkIGluIHRhYmxlX2Rlc2MKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICphY3BpX3RiX3VuaW5zdGFsbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjCi0JCQkJCQkqdGFibGVfZGVzYykKK2FjcGlfc3RhdHVzIGFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZChhY3BpX25hdGl2ZV91aW50IHRhYmxlX2luZGV4KQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKm5leHRfZGVzYzsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIodGJfdW5pbnN0YWxsX3RhYmxlLCB0YWJsZV9kZXNjKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX3JlbGVhc2Vfb3duZXJfaWQpOwogCi0JaWYgKCF0YWJsZV9kZXNjKSB7Ci0JCXJldHVybl9QVFIoTlVMTCk7CisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJaWYgKHRhYmxlX2luZGV4IDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50KSB7CisJCWFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZCgmCisJCQkJCSAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCQkgIHRhYmxlc1t0YWJsZV9pbmRleF0ub3duZXJfaWQpKTsKKwkJc3RhdHVzID0gQUVfT0s7CiAJfQogCi0JLyogVW5saW5rIHRoZSBkZXNjcmlwdG9yIGZyb20gdGhlIGRvdWJseSBsaW5rZWQgbGlzdCAqLworCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQogCi0JaWYgKHRhYmxlX2Rlc2MtPnByZXYpIHsKLQkJdGFibGVfZGVzYy0+cHJldi0+bmV4dCA9IHRhYmxlX2Rlc2MtPm5leHQ7Ci0JfSBlbHNlIHsKLQkJLyogSXMgZmlyc3Qgb24gbGlzdCwgdXBkYXRlIGxpc3QgaGVhZCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfb3duZXJfaWQKKyAqCisgKiBQQVJBTUVURVJTOiAgdGFibGVfaW5kZXggICAgICAgICAtIFRhYmxlIGluZGV4CisgKiAgICAgICAgICAgICAgb3duZXJfaWQgICAgICAgICAgICAtIFdoZXJlIHRoZSB0YWJsZSBvd25lcl9pZCBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJucyBvd25lcl9pZCBmb3IgdGhlIEFDUEkgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCWFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX2Rlc2MtPnR5cGVdLm5leHQgPSB0YWJsZV9kZXNjLT5uZXh0OworYWNwaV9zdGF0dXMKK2FjcGlfdGJfZ2V0X293bmVyX2lkKGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgsIGFjcGlfb3duZXJfaWQgKiBvd25lcl9pZCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9CQURfUEFSQU1FVEVSOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9nZXRfb3duZXJfaWQpOworCisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJaWYgKHRhYmxlX2luZGV4IDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50KSB7CisJCSpvd25lcl9pZCA9CisJCSAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW3RhYmxlX2luZGV4XS5vd25lcl9pZDsKKwkJc3RhdHVzID0gQUVfT0s7CiAJfQogCi0JaWYgKHRhYmxlX2Rlc2MtPm5leHQpIHsKLQkJdGFibGVfZGVzYy0+bmV4dC0+cHJldiA9IHRhYmxlX2Rlc2MtPnByZXY7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaXNfdGFibGVfbG9hZGVkCisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2luZGV4ICAgICAgICAgLSBUYWJsZSBpbmRleAorICoKKyAqIFJFVFVSTjogICAgICBUYWJsZSBMb2FkZWQgRmxhZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4IGFjcGlfdGJfaXNfdGFibGVfbG9hZGVkKGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgpCit7CisJdTggaXNfbG9hZGVkID0gRkFMU0U7CisKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlpZiAodGFibGVfaW5kZXggPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQpIHsKKwkJaXNfbG9hZGVkID0gKHU4KQorCQkgICAgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLgorCQkgICAgIGZsYWdzICYgQUNQSV9UQUJMRV9JU19MT0FERUQpOwogCX0KIAotCS8qIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSB0YWJsZSBpdHNlbGYgKi8KKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlyZXR1cm4gKGlzX2xvYWRlZCk7Cit9CiAKLQlhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUodGFibGVfZGVzYyk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3NldF90YWJsZV9sb2FkZWRfZmxhZworICoKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmRleCAgICAgICAgIC0gVGFibGUgaW5kZXgKKyAqICAgICAgICAgICAgICBpc19sb2FkZWQgICAgICAgICAgIC0gVFJVRSBpZiB0YWJsZSBpcyBsb2FkZWQsIEZBTFNFIG90aGVyd2lzZQorICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IFNldHMgdGhlIHRhYmxlIGxvYWRlZCBmbGFnIHRvIGVpdGhlciBUUlVFIG9yIEZBTFNFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkvKiBGcmVlIHRoZSBvd25lciBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWJsZSAqLwordm9pZCBhY3BpX3RiX3NldF90YWJsZV9sb2FkZWRfZmxhZyhhY3BpX25hdGl2ZV91aW50IHRhYmxlX2luZGV4LCB1OCBpc19sb2FkZWQpCit7CiAKLQlhY3BpX3V0X3JlbGVhc2Vfb3duZXJfaWQoJnRhYmxlX2Rlc2MtPm93bmVyX2lkKTsKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlpZiAodGFibGVfaW5kZXggPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQpIHsKKwkJaWYgKGlzX2xvYWRlZCkgeworCQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0uZmxhZ3MgfD0KKwkJCSAgICBBQ1BJX1RBQkxFX0lTX0xPQURFRDsKKwkJfSBlbHNlIHsKKwkJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLmZsYWdzICY9CisJCQkgICAgfkFDUElfVEFCTEVfSVNfTE9BREVEOworCQl9CisJfQogCi0JLyogRnJlZSB0aGUgdGFibGUgZGVzY3JpcHRvciAqLwotCi0JbmV4dF9kZXNjID0gdGFibGVfZGVzYy0+bmV4dDsKLQlBQ1BJX0ZSRUUodGFibGVfZGVzYyk7Ci0KLQkvKiBSZXR1cm4gcG9pbnRlciB0byB0aGUgbmV4dCBkZXNjcmlwdG9yICovCi0KLQlyZXR1cm5fUFRSKG5leHRfZGVzYyk7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhNWZjYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNb2R1bGUgTmFtZTogdGJyc2R0IC0gQUNQSSBSU0RUIHRhYmxlIHV0aWxpdGllcwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCi0gKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgotICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKLSAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCi0gKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgotICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCi0gKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIE5PIFdBUlJBTlRZCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0gKi8KLQotI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgotI2luY2x1ZGUgPGFjcGkvYWN0YWJsZXMuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCi1BQ1BJX01PRFVMRV9OQU1FKCJ0YnJzZHQiKQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3ZlcmlmeV9yc2RwCi0gKgotICogUEFSQU1FVEVSUzogIEFkZHJlc3MgICAgICAgICAtIFJTRFAgKFBvaW50ZXIgdG8gUlNEVCkKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IExvYWQgYW5kIHZhbGlkYXRlIHRoZSBSU0RQIChwdHIpIGFuZCBSU0RUICh0YWJsZSkKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV90Yl92ZXJpZnlfcnNkcChzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzKQotewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfaW5mbzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IHJzZHBfZGVzY3JpcHRvciAqcnNkcDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfdmVyaWZ5X3JzZHApOwotCi0Jc3dpdGNoIChhZGRyZXNzLT5wb2ludGVyX3R5cGUpIHsKLQljYXNlIEFDUElfTE9HSUNBTF9QT0lOVEVSOgotCi0JCXJzZHAgPSBhZGRyZXNzLT5wb2ludGVyLmxvZ2ljYWw7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ1BJX1BIWVNJQ0FMX1BPSU5URVI6Ci0JCS8qCi0JCSAqIE9idGFpbiBhY2Nlc3MgdG8gdGhlIFJTRFAgc3RydWN0dXJlCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yKSwKLQkJCQkJICAgIEFDUElfQ0FTVF9QVFIodm9pZCwgJnJzZHApKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQkvKiBWZXJpZnkgUlNEUCBzaWduYXR1cmUgYW5kIGNoZWNrc3VtICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAocnNkcCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBSU0RQIGlzIG9rLiBJbml0IHRoZSB0YWJsZSBpbmZvICovCi0KLQl0YWJsZV9pbmZvLnBvaW50ZXIgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgcnNkcCk7Ci0JdGFibGVfaW5mby5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHJzZHBfZGVzY3JpcHRvcik7Ci0KLQlpZiAoYWRkcmVzcy0+cG9pbnRlcl90eXBlID09IEFDUElfUEhZU0lDQUxfUE9JTlRFUikgewotCQl0YWJsZV9pbmZvLmFsbG9jYXRpb24gPSBBQ1BJX01FTV9NQVBQRUQ7Ci0JfSBlbHNlIHsKLQkJdGFibGVfaW5mby5hbGxvY2F0aW9uID0gQUNQSV9NRU1fTk9UX0FMTE9DQVRFRDsKLQl9Ci0KLQkvKiBTYXZlIHRoZSB0YWJsZSBwb2ludGVycyBhbmQgYWxsb2NhdGlvbiBpbmZvICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2luaXRfdGFibGVfZGVzY3JpcHRvcihBQ1BJX1RBQkxFX0lEX1JTRFAsICZ0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIFNhdmUgdGhlIFJTRFAgaW4gYSBnbG9iYWwgZm9yIGVhc3kgYWNjZXNzICovCi0KLQlhY3BpX2dibF9SU0RQID0KLQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yLCB0YWJsZV9pbmZvLnBvaW50ZXIpOwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCi0JLyogRXJyb3IgZXhpdCAqLwotICAgICAgY2xlYW51cDoKLQotCWlmIChhY3BpX2dibF90YWJsZV9mbGFncyAmIEFDUElfUEhZU0lDQUxfUE9JTlRFUikgewotCQlhY3BpX29zX3VubWFwX21lbW9yeShyc2RwLCBzaXplb2Yoc3RydWN0IHJzZHBfZGVzY3JpcHRvcikpOwotCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfcnNkdF9hZGRyZXNzCi0gKgotICogUEFSQU1FVEVSUzogIG91dF9hZGRyZXNzICAgICAgICAgLSBXaGVyZSB0aGUgYWRkcmVzcyBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBOb25lLCBBZGRyZXNzCi0gKgotICogREVTQ1JJUFRJT046IEV4dHJhY3QgdGhlIGFkZHJlc3Mgb2YgZWl0aGVyIHRoZSBSU0RUIG9yIFhTRFQsIGRlcGVuZGluZyBvbiB0aGUKLSAqICAgICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBSU0RQIGFuZCB3aGV0aGVyIHRoZSBYU0RUIHBvaW50ZXIgaXMgdmFsaWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcyhzdHJ1Y3QgYWNwaV9wb2ludGVyICpvdXRfYWRkcmVzcykKLXsKLQotCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKLQotCW91dF9hZGRyZXNzLT5wb2ludGVyX3R5cGUgPQotCSAgICBhY3BpX2dibF90YWJsZV9mbGFncyB8IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HOwotCi0JLyogVXNlIFhTRFQgaWYgaXQgaXMgcHJlc2VudCAqLwotCi0JaWYgKChhY3BpX2dibF9SU0RQLT5yZXZpc2lvbiA+PSAyKSAmJgotCSAgICBhY3BpX2dibF9SU0RQLT54c2R0X3BoeXNpY2FsX2FkZHJlc3MpIHsKLQkJb3V0X2FkZHJlc3MtPnBvaW50ZXIudmFsdWUgPQotCQkgICAgYWNwaV9nYmxfUlNEUC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzOwotCQlhY3BpX2dibF9yb290X3RhYmxlX3R5cGUgPSBBQ1BJX1RBQkxFX1RZUEVfWFNEVDsKLQl9IGVsc2UgewotCQkvKiBObyBYU0RULCB1c2UgdGhlIFJTRFQgKi8KLQotCQlvdXRfYWRkcmVzcy0+cG9pbnRlci52YWx1ZSA9Ci0JCSAgICBhY3BpX2dibF9SU0RQLT5yc2R0X3BoeXNpY2FsX2FkZHJlc3M7Ci0JCWFjcGlfZ2JsX3Jvb3RfdGFibGVfdHlwZSA9IEFDUElfVEFCTEVfVFlQRV9SU0RUOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl92YWxpZGF0ZV9yc2R0Ci0gKgotICogUEFSQU1FVEVSUzogIHRhYmxlX3B0ciAgICAgICAtIEFkZHJlc3NhYmxlIHBvaW50ZXIgdG8gdGhlIFJTRFQuCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSBzaWduYXR1cmUgZm9yIHRoZSBSU0RUIG9yIFhTRFQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1hY3BpX3N0YXR1cyBhY3BpX3RiX3ZhbGlkYXRlX3JzZHQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9wdHIpCi17Ci0JY2hhciAqc2lnbmF0dXJlOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyogVmFsaWRhdGUgbWluaW11bSBsZW5ndGggKi8KLQotCWlmICh0YWJsZV9wdHItPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlJTRFQvWFNEVCBsZW5ndGggKCVYKSBpcyBzbWFsbGVyIHRoYW4gbWluaW11bSAoJXpYKSIsCi0JCQkgICAgdGFibGVfcHRyLT5sZW5ndGgsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpKTsKLQotCQlyZXR1cm4gKEFFX0lOVkFMSURfVEFCTEVfTEVOR1RIKTsKLQl9Ci0KLQkvKiBTZWFyY2ggZm9yIGFwcHJvcHJpYXRlIHNpZ25hdHVyZSwgUlNEVCBvciBYU0RUICovCi0KLQlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlID09IEFDUElfVEFCTEVfVFlQRV9SU0RUKSB7Ci0JCXNpZ25hdHVyZSA9IFJTRFRfU0lHOwotCX0gZWxzZSB7Ci0JCXNpZ25hdHVyZSA9IFhTRFRfU0lHOwotCX0KLQotCWlmICghQUNQSV9DT01QQVJFX05BTUUodGFibGVfcHRyLT5zaWduYXR1cmUsIHNpZ25hdHVyZSkpIHsKLQotCQkvKiBJbnZhbGlkIFJTRFQgb3IgWFNEVCBzaWduYXR1cmUgKi8KLQotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJJbnZhbGlkIHNpZ25hdHVyZSB3aGVyZSBSU0RQIGluZGljYXRlcyBSU0RUL1hTRFQgc2hvdWxkIGJlIGxvY2F0ZWQuIFJTRFA6IikpOwotCi0JCUFDUElfRFVNUF9CVUZGRVIoYWNwaV9nYmxfUlNEUCwgMjApOwotCi0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlJTRFQvWFNEVCBzaWduYXR1cmUgYXQgJVggaXMgaW52YWxpZCIsCi0JCQkgICAgYWNwaV9nYmxfUlNEUC0+cnNkdF9waHlzaWNhbF9hZGRyZXNzKSk7Ci0KLQkJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX1RZUEVfUlNEVCkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkxvb2tpbmcgZm9yIFJTRFQiKSk7Ci0JCX0gZWxzZSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTG9va2luZyBmb3IgWFNEVCIpKTsKLQkJfQotCi0JCUFDUElfRFVNUF9CVUZGRVIoQUNQSV9DQVNUX1BUUihjaGFyLCB0YWJsZV9wdHIpLCA0OCk7Ci0JCXJldHVybiAoQUVfQkFEX1NJR05BVFVSRSk7Ci0JfQotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZ2V0X3RhYmxlX3JzZHQKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogTG9hZCBhbmQgdmFsaWRhdGUgdGhlIFJTRFAgKHB0cikgYW5kIFJTRFQgKHRhYmxlKQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfdGJfZ2V0X3RhYmxlX3JzZHQodm9pZCkKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHRhYmxlX2luZm87Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXN0cnVjdCBhY3BpX3BvaW50ZXIgYWRkcmVzczsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfZ2V0X3RhYmxlX3JzZHQpOwotCi0JLyogR2V0IHRoZSBSU0RUL1hTRFQgdmlhIHRoZSBSU0RQICovCi0KLQlhY3BpX3RiX2dldF9yc2R0X2FkZHJlc3MoJmFkZHJlc3MpOwotCi0JdGFibGVfaW5mby50eXBlID0gQUNQSV9UQUJMRV9JRF9YU0RUOwotCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3RhYmxlKCZhZGRyZXNzLCAmdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIkNvdWxkIG5vdCBnZXQgdGhlIFJTRFQvWFNEVCIpKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJICAiUlNEUCBsb2NhdGVkIGF0ICVwLCBwb2ludHMgdG8gUlNEVCBwaHlzaWNhbD0lOC44WCU4LjhYXG4iLAotCQkJICBhY3BpX2dibF9SU0RQLAotCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcy5wb2ludGVyLnZhbHVlKSkpOwotCi0JLyogQ2hlY2sgdGhlIFJTRFQgb3IgWFNEVCBzaWduYXR1cmUgKi8KLQotCXN0YXR1cyA9IGFjcGlfdGJfdmFsaWRhdGVfcnNkdCh0YWJsZV9pbmZvLnBvaW50ZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGVycm9yX2NsZWFudXA7Ci0JfQotCi0JLyogR2V0IHRoZSBudW1iZXIgb2YgdGFibGVzIGRlZmluZWQgaW4gdGhlIFJTRFQgb3IgWFNEVCAqLwotCi0JYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudCA9IGFjcGlfdGJfZ2V0X3RhYmxlX2NvdW50KGFjcGlfZ2JsX1JTRFAsCi0JCQkJCQkJICAgIHRhYmxlX2luZm8ucG9pbnRlcik7Ci0KLQkvKiBDb252ZXJ0IGFuZC9vciBjb3B5IHRvIGFuIFhTRFQgc3RydWN0dXJlICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2NvbnZlcnRfdG9feHNkdCgmdGFibGVfaW5mbyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gZXJyb3JfY2xlYW51cDsKLQl9Ci0KLQkvKiBTYXZlIHRoZSB0YWJsZSBwb2ludGVycyBhbmQgYWxsb2NhdGlvbiBpbmZvICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2luaXRfdGFibGVfZGVzY3JpcHRvcihBQ1BJX1RBQkxFX0lEX1hTRFQsICZ0YWJsZV9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBlcnJvcl9jbGVhbnVwOwotCX0KLQotCWFjcGlfZ2JsX1hTRFQgPQotCSAgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCB4c2R0X2Rlc2NyaXB0b3IsIHRhYmxlX2luZm8ucG9pbnRlcik7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJYU0RUIGxvY2F0ZWQgYXQgJXBcbiIsIGFjcGlfZ2JsX1hTRFQpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQotICAgICAgZXJyb3JfY2xlYW51cDoKLQotCS8qIEZyZWUgdGFibGUgYWxsb2NhdGVkIGJ5IGFjcGlfdGJfZ2V0X3RhYmxlICovCi0KLQlhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUoJnRhYmxlX2luZm8pOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCmluZGV4IDIwOWE0MDEuLjFkYTY0YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jCkBAIC0xLDExICsxLDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogTW9kdWxlIE5hbWU6IHRidXRpbHMgLSBUYWJsZSBtYW5pcHVsYXRpb24gdXRpbGl0aWVzCisgKiBNb2R1bGUgTmFtZTogdGJ1dGlscyAgIC0gdGFibGUgdXRpbGl0aWVzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDgsMTM3ICs0OCwxMTkgQEAKIEFDUElfTU9EVUxFX05BTUUoInRidXRpbHMiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi0jaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2hhbmRsZV90b19vYmplY3QodTE2IHRhYmxlX2lkLCBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICoqdGFibGVfZGVzYyk7Ci0jZW5kaWYKK3N0YXRpYyBhY3BpX3BoeXNpY2FsX2FkZHJlc3MKK2FjcGlfdGJfZ2V0X3Jvb3RfdGFibGVfZW50cnkodTggKiB0YWJsZV9lbnRyeSwKKwkJCSAgICAgYWNwaV9uYXRpdmVfdWludCB0YWJsZV9lbnRyeV9zaXplKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9pc190YWJsZV9pbnN0YWxsZWQKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3RhYmxlc19sb2FkZWQKICAqCi0gKiBQQVJBTUVURVJTOiAgbmV3X3RhYmxlX2Rlc2MgICAgICAtIERlc2NyaXB0b3IgZm9yIG5ldyB0YWJsZSBiZWluZyBpbnN0YWxsZWQKKyAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyAtIEFFX0FMUkVBRFlfRVhJU1RTIGlmIHRoZSB0YWJsZSBpcyBhbHJlYWR5IGluc3RhbGxlZAorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgcmVxdWlyZWQgQUNQSSB0YWJsZXMgYXJlIGxvYWRlZAogICoKLSAqIERFU0NSSVBUSU9OOiBEZXRlcm1pbmUgaWYgYW4gQUNQSSB0YWJsZSBpcyBhbHJlYWR5IGluc3RhbGxlZAotICoKLSAqIE1VVEVYOiAgICAgICBUYWJsZSBkYXRhIHN0cnVjdHVyZXMgc2hvdWxkIGJlIGxvY2tlZAorICogREVTQ1JJUFRJT046IERldGVybWluZSBpZiB0aGUgbWluaW11bSByZXF1aXJlZCBBQ1BJIHRhYmxlcyBhcmUgcHJlc2VudAorICogICAgICAgICAgICAgIChGQURULCBGQUNTLCBEU0RUKQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzIGFjcGlfdGJfaXNfdGFibGVfaW5zdGFsbGVkKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKm5ld190YWJsZV9kZXNjKQordTggYWNwaV90Yl90YWJsZXNfbG9hZGVkKHZvaWQpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfaXNfdGFibGVfaW5zdGFsbGVkKTsKLQotCS8qIEdldCB0aGUgbGlzdCBkZXNjcmlwdG9yIGFuZCBmaXJzdCB0YWJsZSBkZXNjcmlwdG9yICovCi0KLQl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbbmV3X3RhYmxlX2Rlc2MtPnR5cGVdLm5leHQ7Ci0KLQkvKiBFeGFtaW5lIGFsbCBpbnN0YWxsZWQgdGFibGVzIG9mIHRoaXMgdHlwZSAqLwotCi0Jd2hpbGUgKHRhYmxlX2Rlc2MpIHsKLQkJLyoKLQkJICogSWYgdGhlIHRhYmxlIGxlbmd0aHMgbWF0Y2gsIHBlcmZvcm0gYSBmdWxsIGJ5dGV3aXNlIGNvbXBhcmUuIFRoaXMKLQkJICogbWVhbnMgdGhhdCB3ZSB3aWxsIGFsbG93IHRhYmxlcyB3aXRoIGR1cGxpY2F0ZSBvZW1fdGFibGVfaWQocyksIGFzCi0JCSAqIGxvbmcgYXMgdGhlIHRhYmxlcyBhcmUgZGlmZmVyZW50IGluIHNvbWUgd2F5LgotCQkgKgotCQkgKiBDaGVja2luZyBpZiB0aGUgdGFibGUgaGFzIGJlZW4gbG9hZGVkIGludG8gdGhlIG5hbWVzcGFjZSBtZWFucyB0aGF0Ci0JCSAqIHdlIGRvbid0IGNoZWNrIGZvciBkdXBsaWNhdGUgdGFibGVzIGR1cmluZyB0aGUgaW5pdGlhbCBpbnN0YWxsYXRpb24KLQkJICogb2YgdGFibGVzIHdpdGhpbiB0aGUgUlNEVC9YU0RULgotCQkgKi8KLQkJaWYgKCh0YWJsZV9kZXNjLT5sb2FkZWRfaW50b19uYW1lc3BhY2UpICYmCi0JCSAgICAodGFibGVfZGVzYy0+cG9pbnRlci0+bGVuZ3RoID09Ci0JCSAgICAgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXItPmxlbmd0aCkKLQkJICAgICYmCi0JCSAgICAoIUFDUElfTUVNQ01QCi0JCSAgICAgKHRhYmxlX2Rlc2MtPnBvaW50ZXIsIG5ld190YWJsZV9kZXNjLT5wb2ludGVyLAotCQkgICAgICBuZXdfdGFibGVfZGVzYy0+cG9pbnRlci0+bGVuZ3RoKSkpIHsKLQotCQkJLyogTWF0Y2g6IHRoaXMgdGFibGUgaXMgYWxyZWFkeSBpbnN0YWxsZWQgKi8KLQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9UQUJMRVMsCi0JCQkJCSAgIlRhYmxlIFslNC40c10gYWxyZWFkeSBpbnN0YWxsZWQ6IFJldiAlWCBPZW1UYWJsZUlkIFslOC44c11cbiIsCi0JCQkJCSAgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXItPnNpZ25hdHVyZSwKLQkJCQkJICBuZXdfdGFibGVfZGVzYy0+cG9pbnRlci0+cmV2aXNpb24sCi0JCQkJCSAgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXItPgotCQkJCQkgIG9lbV90YWJsZV9pZCkpOwotCi0JCQluZXdfdGFibGVfZGVzYy0+b3duZXJfaWQgPSB0YWJsZV9kZXNjLT5vd25lcl9pZDsKLQkJCW5ld190YWJsZV9kZXNjLT5pbnN0YWxsZWRfZGVzYyA9IHRhYmxlX2Rlc2M7Ci0KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTFJFQURZX0VYSVNUUyk7Ci0JCX0KLQotCQkvKiBHZXQgbmV4dCB0YWJsZSBvbiB0aGUgbGlzdCAqLwotCi0JCXRhYmxlX2Rlc2MgPSB0YWJsZV9kZXNjLT5uZXh0OworCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQgPj0gMykgeworCQlyZXR1cm4gKFRSVUUpOwogCX0KIAotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJcmV0dXJuIChGQUxTRSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9wcmludF90YWJsZV9oZWFkZXIKICAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfaGVhZGVyICAgICAgICAtIExvZ2ljYWwgcG9pbnRlciB0byB0aGUgdGFibGUKKyAqIFBBUkFNRVRFUlM6ICBBZGRyZXNzICAgICAgICAgICAgIC0gVGFibGUgcGh5c2ljYWwgYWRkcmVzcworICogICAgICAgICAgICAgIEhlYWRlciAgICAgICAgICAgICAgLSBUYWJsZSBoZWFkZXIKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKLSAqIERFU0NSSVBUSU9OOiBDaGVjayBhbiBBQ1BJIHRhYmxlIGhlYWRlciBmb3IgdmFsaWRpdHkKLSAqCi0gKiBOT1RFOiAgVGFibGUgcG9pbnRlcnMgYXJlIHZhbGlkYXRlZCBhcyBmb2xsb3dzOgotICogICAgICAgICAgMSkgVGFibGUgcG9pbnRlciBtdXN0IHBvaW50IHRvIHZhbGlkIHBoeXNpY2FsIG1lbW9yeQotICogICAgICAgICAgMikgU2lnbmF0dXJlIG11c3QgYmUgNCBBU0NJSSBjaGFycywgZXZlbiBpZiB3ZSBkb24ndCByZWNvZ25pemUgdGhlCi0gKiAgICAgICAgICAgICBuYW1lCi0gKiAgICAgICAgICAzKSBUYWJsZSBtdXN0IGJlIHJlYWRhYmxlIGZvciBsZW5ndGggc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIKLSAqICAgICAgICAgIDQpIFRhYmxlIGNoZWNrc3VtIG11c3QgYmUgdmFsaWQgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgRkFDUwotICogICAgICAgICAgICAgIHdoaWNoIGhhcyBubyBjaGVja3N1bSBiZWNhdXNlIGl0IGNvbnRhaW5zIHZhcmlhYmxlIGZpZWxkcykKKyAqIERFU0NSSVBUSU9OOiBQcmludCBhbiBBQ1BJIHRhYmxlIGhlYWRlci4gU3BlY2lhbCBjYXNlcyBmb3IgRkFDUyBhbmQgUlNEUC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cwotYWNwaV90Yl92YWxpZGF0ZV90YWJsZV9oZWFkZXIoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXIpCit2b2lkCithY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcihhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyKQogewotCWFjcGlfbmFtZSBzaWduYXR1cmU7CiAKLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CisJaWYgKEFDUElfQ09NUEFSRV9OQU1FKGhlYWRlci0+c2lnbmF0dXJlLCBBQ1BJX1NJR19GQUNTKSkgewogCi0JLyogVmVyaWZ5IHRoYXQgdGhpcyBpcyBhIHZhbGlkIGFkZHJlc3MgKi8KKwkJLyogRkFDUyBvbmx5IGhhcyBzaWduYXR1cmUgYW5kIGxlbmd0aCBmaWVsZHMgb2YgY29tbW9uIHRhYmxlIGhlYWRlciAqLwogCi0JaWYgKCFhY3BpX29zX3JlYWRhYmxlKHRhYmxlX2hlYWRlciwgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkNhbm5vdCByZWFkIHRhYmxlIGhlYWRlciBhdCAlcCIsIHRhYmxlX2hlYWRlcikpOworCQlBQ1BJX0lORk8oKEFFX0lORk8sICIlNC40cyAlMDhsWCwgJTA0WCIsCisJCQkgICBoZWFkZXItPnNpZ25hdHVyZSwgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKKwkJCSAgIGhlYWRlci0+bGVuZ3RoKSk7CisJfSBlbHNlIGlmIChBQ1BJX0NPTVBBUkVfTkFNRShoZWFkZXItPnNpZ25hdHVyZSwgQUNQSV9TSUdfUlNEUCkpIHsKIAotCQlyZXR1cm4gKEFFX0JBRF9BRERSRVNTKTsKKwkJLyogUlNEUCBoYXMgbm8gY29tbW9uIGZpZWxkcyAqLworCisJCUFDUElfSU5GTygoQUVfSU5GTywgIlJTRFAgJTA4bFgsICUwNFggKHIlZCAlNi42cykiLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKKwkJCSAgIChBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAsIGhlYWRlciktPgorCQkJICAgIHJldmlzaW9uID4KKwkJCSAgICAwKSA/IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfdGFibGVfcnNkcCwKKwkJCQkJICAgICAgIGhlYWRlciktPmxlbmd0aCA6IDIwLAorCQkJICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwLAorCQkJCQkgaGVhZGVyKS0+cmV2aXNpb24sCisJCQkgICBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAsCisJCQkJCSBoZWFkZXIpLT5vZW1faWQpKTsKKwl9IGVsc2UgeworCQkvKiBTdGFuZGFyZCBBQ1BJIHRhYmxlIHdpdGggZnVsbCBjb21tb24gaGVhZGVyICovCisKKwkJQUNQSV9JTkZPKChBRV9JTkZPLAorCQkJICAgIiU0LjRzICUwOGxYLCAlMDRYIChyJWQgJTYuNnMgJTguOHMgJThYICU0LjRzICU4WCkiLAorCQkJICAgaGVhZGVyLT5zaWduYXR1cmUsICh1bnNpZ25lZCBsb25nKWFkZHJlc3MsCisJCQkgICBoZWFkZXItPmxlbmd0aCwgaGVhZGVyLT5yZXZpc2lvbiwgaGVhZGVyLT5vZW1faWQsCisJCQkgICBoZWFkZXItPm9lbV90YWJsZV9pZCwgaGVhZGVyLT5vZW1fcmV2aXNpb24sCisJCQkgICBoZWFkZXItPmFzbF9jb21waWxlcl9pZCwKKwkJCSAgIGhlYWRlci0+YXNsX2NvbXBpbGVyX3JldmlzaW9uKSk7CiAJfQorfQogCi0JLyogRW5zdXJlIHRoYXQgdGhlIHNpZ25hdHVyZSBpcyA0IEFTQ0lJIGNoYXJhY3RlcnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfdmFsaWRhdGVfY2hlY2tzdW0KKyAqCisgKiBQQVJBTUVURVJTOiAgVGFibGUgICAgICAgICAgICAgICAtIEFDUEkgdGFibGUgdG8gdmVyaWZ5CisgKiAgICAgICAgICAgICAgTGVuZ3RoICAgICAgICAgICAgICAtIExlbmd0aCBvZiBlbnRpcmUgdGFibGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFZlcmlmaWVzIHRoYXQgdGhlIHRhYmxlIGNoZWNrc3VtcyB0byB6ZXJvLiBPcHRpb25hbGx5IHJldHVybnMKKyAqICAgICAgICAgICAgICBleGNlcHRpb24gb24gYmFkIGNoZWNrc3VtLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQlBQ1BJX01PVkVfMzJfVE9fMzIoJnNpZ25hdHVyZSwgdGFibGVfaGVhZGVyLT5zaWduYXR1cmUpOwotCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUoc2lnbmF0dXJlKSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCB0YWJsZSBzaWduYXR1cmUgMHglOC44WCIsCi0JCQkgICAgc2lnbmF0dXJlKSk7CithY3BpX3N0YXR1cyBhY3BpX3RiX3ZlcmlmeV9jaGVja3N1bShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlLCB1MzIgbGVuZ3RoKQoreworCXU4IGNoZWNrc3VtOwogCi0JCUFDUElfRFVNUF9CVUZGRVIodGFibGVfaGVhZGVyLAotCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JCXJldHVybiAoQUVfQkFEX1NJR05BVFVSRSk7Ci0JfQorCS8qIENvbXB1dGUgdGhlIGNoZWNrc3VtIG9uIHRoZSB0YWJsZSAqLwogCi0JLyogVmFsaWRhdGUgdGhlIHRhYmxlIGxlbmd0aCAqLworCWNoZWNrc3VtID0gYWNwaV90Yl9jaGVja3N1bShBQ1BJX0NBU1RfUFRSKHU4LCB0YWJsZSksIGxlbmd0aCk7CiAKLQlpZiAodGFibGVfaGVhZGVyLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJJbnZhbGlkIGxlbmd0aCAweCVYIGluIHRhYmxlIHdpdGggc2lnbmF0dXJlICU0LjRzIiwKLQkJCSAgICAodTMyKSB0YWJsZV9oZWFkZXItPmxlbmd0aCwKLQkJCSAgICBBQ1BJX0NBU1RfUFRSKGNoYXIsICZzaWduYXR1cmUpKSk7CisJLyogQ2hlY2tzdW0gb2s/IChzaG91bGQgYmUgemVybykgKi8KIAotCQlBQ1BJX0RVTVBfQlVGRkVSKHRhYmxlX2hlYWRlciwKLQkJCQkgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwotCQlyZXR1cm4gKEFFX0JBRF9IRUFERVIpOworCWlmIChjaGVja3N1bSkgeworCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCQkgICAgICAiSW5jb3JyZWN0IGNoZWNrc3VtIGluIHRhYmxlIFslNC40c10gLSAgJTIuMlgsIHNob3VsZCBiZSAlMi4yWCIsCisJCQkgICAgICB0YWJsZS0+c2lnbmF0dXJlLCB0YWJsZS0+Y2hlY2tzdW0sCisJCQkgICAgICAodTgpICh0YWJsZS0+Y2hlY2tzdW0gLSBjaGVja3N1bSkpKTsKKworI2lmIChBQ1BJX0NIRUNLU1VNX0FCT1JUKQorCisJCXJldHVybiAoQUVfQkFEX0NIRUNLU1VNKTsKKyNlbmRpZgogCX0KIAogCXJldHVybiAoQUVfT0spOwpAQCAtMTg2LDE1NyArMTY4LDMyMCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3N1bV90YWJsZQorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfY2hlY2tzdW0KICAqCi0gKiBQQVJBTUVURVJTOiAgQnVmZmVyICAgICAgICAgICAgICAtIEJ1ZmZlciB0byBzdW0KLSAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICAgIC0gU2l6ZSBvZiB0aGUgYnVmZmVyCisgKiBQQVJBTUVURVJTOiAgQnVmZmVyICAgICAgICAgIC0gUG9pbnRlciB0byBtZW1vcnkgcmVnaW9uIHRvIGJlIGNoZWNrZWQKKyAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgLSBMZW5ndGggb2YgdGhpcyBtZW1vcnkgcmVnaW9uCiAgKgotICogUkVUVVJOOiAgICAgIDggYml0IHN1bSBvZiBidWZmZXIKKyAqIFJFVFVSTjogICAgICBDaGVja3N1bSAodTgpCiAgKgotICogREVTQ1JJUFRJT046IENvbXB1dGVzIGFuIDggYml0IHN1bSBvZiB0aGUgYnVmZmVyKGxlbmd0aCkgYW5kIHJldHVybnMgaXQuCisgKiBERVNDUklQVElPTjogQ2FsY3VsYXRlcyBjaXJjdWxhciBjaGVja3N1bSBvZiBtZW1vcnkgcmVnaW9uLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4IGFjcGlfdGJfc3VtX3RhYmxlKHZvaWQgKmJ1ZmZlciwgdTMyIGxlbmd0aCkKK3U4IGFjcGlfdGJfY2hlY2tzdW0odTggKiBidWZmZXIsIGFjcGlfbmF0aXZlX3VpbnQgbGVuZ3RoKQogewotCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAl1OCBzdW0gPSAwOworCXU4ICplbmQgPSBidWZmZXIgKyBsZW5ndGg7CiAKLQlpZiAoIWJ1ZmZlciB8fCAhbGVuZ3RoKSB7Ci0JCXJldHVybiAoMCk7CisJd2hpbGUgKGJ1ZmZlciA8IGVuZCkgeworCQlzdW0gPSAodTgpIChzdW0gKyAqKGJ1ZmZlcisrKSk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCXN1bSA9ICh1OCkgKHN1bSArICgodTggKikgYnVmZmVyKVtpXSk7Ci0JfQotCXJldHVybiAoc3VtKTsKKwlyZXR1cm4gc3VtOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dlbmVyYXRlX2NoZWNrc3VtCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9pbnN0YWxsX3RhYmxlCiAgKgotICogUEFSQU1FVEVSUzogIFRhYmxlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGEgdmFsaWQgQUNQSSB0YWJsZSAod2l0aCBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIEFDUEkgaGVhZGVyKQorICogUEFSQU1FVEVSUzogIEFkZHJlc3MgICAgICAgICAgICAgICAgIC0gUGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUIG9yIEZBQ1MKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgICAgICAtIEZsYWdzCisgKiAgICAgICAgICAgICAgU2lnbmF0dXJlICAgICAgICAgICAgICAgLSBUYWJsZSBzaWduYXR1cmUsIE5VTEwgaWYgbm8gbmVlZCB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2gKKyAqICAgICAgICAgICAgICB0YWJsZV9pbmRleCAgICAgICAgICAgICAtIEluZGV4IGludG8gcm9vdCB0YWJsZSBhcnJheQogICoKLSAqIFJFVFVSTjogICAgICA4IGJpdCBjaGVja3N1bSBvZiBidWZmZXIKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IENvbXB1dGVzIGFuIDggYml0IGNoZWNrc3VtIG9mIHRoZSB0YWJsZS4KKyAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGFuIEFDUEkgdGFibGUgaW50byB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4IGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0oc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICogdGFibGUpCit2b2lkCithY3BpX3RiX2luc3RhbGxfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCisJCSAgICAgIHU4IGZsYWdzLCBjaGFyICpzaWduYXR1cmUsIGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgpCiB7Ci0JdTggY2hlY2tzdW07CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKIAotCS8qIFN1bSB0aGUgZW50aXJlIHRhYmxlIGFzLWlzICovCi0KLQljaGVja3N1bSA9IGFjcGlfdGJfc3VtX3RhYmxlKHRhYmxlLCB0YWJsZS0+bGVuZ3RoKTsKLQotCS8qIFN1YnRyYWN0IG9mZiB0aGUgZXhpc3RpbmcgY2hlY2tzdW0gdmFsdWUgaW4gdGhlIHRhYmxlICovCi0KLQljaGVja3N1bSA9ICh1OCkgKGNoZWNrc3VtIC0gdGFibGUtPmNoZWNrc3VtKTsKLQotCS8qIENvbXB1dGUgdGhlIGZpbmFsIGNoZWNrc3VtICovCi0KLQljaGVja3N1bSA9ICh1OCkgKDAgLSBjaGVja3N1bSk7Ci0JcmV0dXJuIChjaGVja3N1bSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdGJfc2V0X2NoZWNrc3VtCi0gKgotICogUEFSQU1FVEVSUzogIFRhYmxlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGEgdmFsaWQgQUNQSSB0YWJsZSAod2l0aCBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIEFDUEkgaGVhZGVyKQotICoKLSAqIFJFVFVSTjogICAgICBOb25lLiBTZXRzIHRoZSB0YWJsZSBjaGVja3N1bSBmaWVsZAotICoKLSAqIERFU0NSSVBUSU9OOiBDb21wdXRlcyBhbiA4IGJpdCBjaGVja3N1bSBvZiB0aGUgdGFibGUgYW5kIGluc2VydHMgdGhlCi0gKiAgICAgICAgICAgICAgY2hlY2tzdW0gaW50byB0aGUgdGFibGUgaGVhZGVyLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV90Yl9zZXRfY2hlY2tzdW0oc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSkKLXsKLQotCXRhYmxlLT5jaGVja3N1bSA9IGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0odGFibGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3ZlcmlmeV90YWJsZV9jaGVja3N1bQotICoKLSAqIFBBUkFNRVRFUlM6ICAqdGFibGVfaGVhZGVyICAgICAgICAgICAtIEFDUEkgdGFibGUgdG8gdmVyaWZ5Ci0gKgotICogUkVUVVJOOiAgICAgIDggYml0IGNoZWNrc3VtIG9mIHRhYmxlCi0gKgotICogREVTQ1JJUFRJT046IEdlbmVyYXRlcyBhbiA4IGJpdCBjaGVja3N1bSBvZiB0YWJsZSBhbmQgcmV0dXJucyBhbmQgY29tcGFyZXMKLSAqICAgICAgICAgICAgICBpdCB0byB0aGUgZXhpc3RpbmcgY2hlY2tzdW0gdmFsdWUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfaGVhZGVyKQotewotCXU4IGNoZWNrc3VtOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl92ZXJpZnlfdGFibGVfY2hlY2tzdW0pOwotCi0JLyogQ29tcHV0ZSB0aGUgY2hlY2tzdW0gb24gdGhlIHRhYmxlICovCi0KLQljaGVja3N1bSA9IGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0odGFibGVfaGVhZGVyKTsKLQotCS8qIENoZWNrc3VtIG9rPyAqLwotCi0JaWYgKGNoZWNrc3VtID09IHRhYmxlX2hlYWRlci0+Y2hlY2tzdW0pIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwlpZiAoIWFkZHJlc3MpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiTnVsbCBwaHlzaWNhbCBhZGRyZXNzIGZvciBBQ1BJIHRhYmxlIFslc10iLAorCQkJICAgIHNpZ25hdHVyZSkpOworCQlyZXR1cm47CiAJfQogCi0JQUNQSV9XQVJOSU5HKChBRV9JTkZPLAotCQkgICAgICAiSW5jb3JyZWN0IGNoZWNrc3VtIGluIHRhYmxlIFslNC40c10gLSBpcyAlMi4yWCwgc2hvdWxkIGJlICUyLjJYIiwKLQkJICAgICAgdGFibGVfaGVhZGVyLT5zaWduYXR1cmUsIHRhYmxlX2hlYWRlci0+Y2hlY2tzdW0sCi0JCSAgICAgIGNoZWNrc3VtKSk7CisJLyogTWFwIGp1c3QgdGhlIHRhYmxlIGhlYWRlciAqLwogCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9DSEVDS1NVTSk7CisJdGFibGUgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCWlmICghdGFibGUpIHsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIGEgcGFydGljdWxhciBzaWduYXR1cmUgaXMgZXhwZWN0ZWQsIHNpZ25hdHVyZSBtdXN0IG1hdGNoICovCisKKwlpZiAoc2lnbmF0dXJlICYmICFBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZS0+c2lnbmF0dXJlLCBzaWduYXR1cmUpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkludmFsaWQgc2lnbmF0dXJlIDB4JVggZm9yIEFDUEkgdGFibGUgWyVzXSIsCisJCQkgICAgKkFDUElfQ0FTVF9QVFIodTMyLCB0YWJsZS0+c2lnbmF0dXJlKSwgc2lnbmF0dXJlKSk7CisJCWdvdG8gdW5tYXBfYW5kX2V4aXQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgdGFibGUgZW50cnkgKi8KKworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLmFkZHJlc3MgPSBhZGRyZXNzOworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLmxlbmd0aCA9IHRhYmxlLT5sZW5ndGg7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0uZmxhZ3MgPSBmbGFnczsKKworCUFDUElfTU9WRV8zMl9UT18zMigmCisJCQkgICAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0uCisJCQkgICAgc2lnbmF0dXJlKSwgdGFibGUtPnNpZ25hdHVyZSk7CisKKwlhY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcihhZGRyZXNzLCB0YWJsZSk7CisKKwlpZiAodGFibGVfaW5kZXggPT0gQUNQSV9UQUJMRV9JTkRFWF9EU0RUKSB7CisKKwkJLyogR2xvYmFsIGludGVnZXIgd2lkdGggaXMgYmFzZWQgdXBvbiByZXZpc2lvbiBvZiB0aGUgRFNEVCAqLworCisJCWFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGgodGFibGUtPnJldmlzaW9uKTsKKwl9CisKKyAgICAgIHVubWFwX2FuZF9leGl0OgorCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CiB9CiAKLSNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9oYW5kbGVfdG9fb2JqZWN0CisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfcm9vdF90YWJsZV9lbnRyeQogICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pZCAgICAgICAgICAgIC0gSWQgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBzZWFyY2hpbmcKLSAqICAgICAgICAgICAgICB0YWJsZV9kZXNjICAgICAgICAgIC0gUG9pbnRlciB0byByZXR1cm4gdGhlIG1hdGNoaW5nIHRhYmxlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci4KKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9lbnRyeSAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgUlNEVC9YU0RUIHRhYmxlIGVudHJ5CisgKiAgICAgICAgICAgICAgdGFibGVfZW50cnlfc2l6ZSAgICAtIHNpemVvZiAzMiBvciA2NCAoUlNEVCBvciBYU0RUKQogICoKLSAqIFJFVFVSTjogICAgICBTZWFyY2ggdGhlIHRhYmxlcyB0byBmaW5kIG9uZSB3aXRoIGEgbWF0Y2hpbmcgdGFibGVfaWQgYW5kCi0gKiAgICAgICAgICAgICAgcmV0dXJuIGEgcG9pbnRlciB0byB0aGF0IHRhYmxlIGRlc2NyaXB0b3IuCisgKiBSRVRVUk46ICAgICAgUGh5c2ljYWwgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSB0aGUgcm9vdCB0YWJsZQorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgb25lIHJvb3QgdGFibGUgZW50cnkuIEhhbmRsZXMgMzItYml0IGFuZCA2NC1iaXQgY2FzZXMgb24KKyAqICAgICAgICAgICAgICBib3RoIDMyLWJpdCBhbmQgNjQtYml0IHBsYXRmb3JtcworICoKKyAqIE5PVEU6ICAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgaXMgMzItYml0IG9uIDMyLWJpdCBwbGF0Zm9ybXMsIDY0LWJpdCBvbgorICogICAgICAgICAgICAgIDY0LWJpdCBwbGF0Zm9ybXMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfaGFuZGxlX3RvX29iamVjdCh1MTYgdGFibGVfaWQsCi0JCQkgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqKnJldHVybl90YWJsZV9kZXNjKQorc3RhdGljIGFjcGlfcGh5c2ljYWxfYWRkcmVzcworYWNwaV90Yl9nZXRfcm9vdF90YWJsZV9lbnRyeSh1OCAqIHRhYmxlX2VudHJ5LAorCQkJICAgICBhY3BpX25hdGl2ZV91aW50IHRhYmxlX2VudHJ5X3NpemUpCiB7Ci0JdTMyIGk7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKKwl1NjQgYWRkcmVzczY0OwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKHRiX2hhbmRsZV90b19vYmplY3QpOworCS8qCisJICogR2V0IHRoZSB0YWJsZSBwaHlzaWNhbCBhZGRyZXNzICgzMi1iaXQgZm9yIFJTRFQsIDY0LWJpdCBmb3IgWFNEVCk6CisJICogTm90ZTogQWRkcmVzc2VzIGFyZSAzMi1iaXQgYWxpZ25lZCAobm90IDY0KSBpbiBib3RoIFJTRFQgYW5kIFhTRFQKKwkgKi8KKwlpZiAodGFibGVfZW50cnlfc2l6ZSA9PSBzaXplb2YodTMyKSkgeworCQkvKgorCQkgKiAzMi1iaXQgcGxhdGZvcm0sIFJTRFQ6IFJldHVybiAzMi1iaXQgdGFibGUgZW50cnkKKwkJICogNjQtYml0IHBsYXRmb3JtLCBSU0RUOiBFeHBhbmQgMzItYml0IHRvIDY0LWJpdCBhbmQgcmV0dXJuCisJCSAqLworCQlyZXR1cm4gKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkoKkFDUElfQ0FTVF9QVFIodTMyLCB0YWJsZV9lbnRyeSkpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiAzMi1iaXQgcGxhdGZvcm0sIFhTRFQ6IFRydW5jYXRlIDY0LWJpdCB0byAzMi1iaXQgYW5kIHJldHVybgorCQkgKiA2NC1iaXQgcGxhdGZvcm0sIFhTRFQ6IE1vdmUgKHVuYWxpZ25lZCkgNjQtYml0IHRvIGxvY2FsLCByZXR1cm4gNjQtYml0CisJCSAqLworCQlBQ1BJX01PVkVfNjRfVE9fNjQoJmFkZHJlc3M2NCwgdGFibGVfZW50cnkpOwogCi0JZm9yIChpID0gMDsgaSA8IEFDUElfVEFCTEVfTUFYOyBpKyspIHsKLQkJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW2ldLm5leHQ7Ci0JCXdoaWxlICh0YWJsZV9kZXNjKSB7Ci0JCQlpZiAodGFibGVfZGVzYy0+dGFibGVfaWQgPT0gdGFibGVfaWQpIHsKLQkJCQkqcmV0dXJuX3RhYmxlX2Rlc2MgPSB0YWJsZV9kZXNjOwotCQkJCXJldHVybiAoQUVfT0spOworI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSAzMgorCQlpZiAoYWRkcmVzczY0ID4gQUNQSV9VSU5UMzJfTUFYKSB7CisKKwkJCS8qIFdpbGwgdHJ1bmNhdGUgNjQtYml0IGFkZHJlc3MgdG8gMzIgYml0cywgaXNzdWUgd2FybmluZyAqLworCisJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCisJCQkJICAgICAgIjY0LWJpdCBQaHlzaWNhbCBBZGRyZXNzIGluIFhTRFQgaXMgdG9vIGxhcmdlICglOC44WCU4LjhYKSwgdHJ1bmNhdGluZyIsCisJCQkJICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3M2NCkpKTsKKwkJfQorI2VuZGlmCisJCXJldHVybiAoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgKGFkZHJlc3M2NCkpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9wYXJzZV9yb290X3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIFJzZHAgICAgICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgUlNEUAorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgICAgIC0gRmxhZ3MKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHBhcnNlIHRoZSBSb290IFN5c3RlbSBEZXNjcmlwdGlvbgorICogICAgICAgICAgICAgIFRhYmxlIChSU0RUIG9yIFhTRFQpCisgKgorICogTk9URTogICAgICAgIFRhYmxlcyBhcmUgbWFwcGVkIChub3QgY29waWVkKSBmb3IgZWZmaWNpZW5jeS4gVGhlIEZBQ1MgbXVzdAorICogICAgICAgICAgICAgIGJlIG1hcHBlZCBhbmQgY2Fubm90IGJlIGNvcGllZCBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBhY3R1YWwKKyAqICAgICAgICAgICAgICBtZW1vcnkgbG9jYXRpb24gb2YgdGhlIEFDUEkgR2xvYmFsIExvY2suCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgX19pbml0CithY3BpX3RiX3BhcnNlX3Jvb3RfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHJzZHBfYWRkcmVzcywgdTggZmxhZ3MpCit7CisJc3RydWN0IGFjcGlfdGFibGVfcnNkcCAqcnNkcDsKKwlhY3BpX25hdGl2ZV91aW50IHRhYmxlX2VudHJ5X3NpemU7CisJYWNwaV9uYXRpdmVfdWludCBpOworCXUzMiB0YWJsZV9jb3VudDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOworCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzOworCXUzMiBsZW5ndGg7CisJdTggKnRhYmxlX2VudHJ5OworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfcGFyc2Vfcm9vdF90YWJsZSk7CisKKwkvKgorCSAqIE1hcCB0aGUgZW50aXJlIFJTRFAgYW5kIGV4dHJhY3QgdGhlIGFkZHJlc3Mgb2YgdGhlIFJTRFQgb3IgWFNEVAorCSAqLworCXJzZHAgPSBhY3BpX29zX21hcF9tZW1vcnkocnNkcF9hZGRyZXNzLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfcnNkcCkpOworCWlmICghcnNkcCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlhY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcihyc2RwX2FkZHJlc3MsCisJCQkJICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsCisJCQkJCQkgcnNkcCkpOworCisJLyogRGlmZmVyZW50aWF0ZSBiZXR3ZWVuIFJTRFQgYW5kIFhTRFQgcm9vdCB0YWJsZXMgKi8KKworCWlmIChyc2RwLT5yZXZpc2lvbiA+IDEgJiYgcnNkcC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzKSB7CisJCS8qCisJCSAqIFJvb3QgdGFibGUgaXMgYW4gWFNEVCAoNjQtYml0IHBoeXNpY2FsIGFkZHJlc3NlcykuIFdlIG11c3QgdXNlIHRoZQorCQkgKiBYU0RUIGlmIHRoZSByZXZpc2lvbiBpcyA+IDEgYW5kIHRoZSBYU0RUIHBvaW50ZXIgaXMgcHJlc2VudCwgYXMgcGVyCisJCSAqIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uCisJCSAqLworCQlhZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgcnNkcC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzOworCQl0YWJsZV9lbnRyeV9zaXplID0gc2l6ZW9mKHU2NCk7CisJfSBlbHNlIHsKKwkJLyogUm9vdCB0YWJsZSBpcyBhbiBSU0RUICgzMi1iaXQgcGh5c2ljYWwgYWRkcmVzc2VzKSAqLworCisJCWFkZHJlc3MgPSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSByc2RwLT5yc2R0X3BoeXNpY2FsX2FkZHJlc3M7CisJCXRhYmxlX2VudHJ5X3NpemUgPSBzaXplb2YodTMyKTsKKwl9CisKKwkvKgorCSAqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBtYXAgbW9yZSB0aGFuIG9uZSBlbnRyeSBpbiBzb21lIGVudmlyb25tZW50cywKKwkgKiBzbyB1bm1hcCB0aGUgUlNEUCBoZXJlIGJlZm9yZSBtYXBwaW5nIG90aGVyIHRhYmxlcworCSAqLworCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHJzZHAsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwKSk7CisKKwkvKiBNYXAgdGhlIFJTRFQvWFNEVCB0YWJsZSBoZWFkZXIgdG8gZ2V0IHRoZSBmdWxsIHRhYmxlIGxlbmd0aCAqLworCisJdGFibGUgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcywgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCWlmICghdGFibGUpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJYWNwaV90Yl9wcmludF90YWJsZV9oZWFkZXIoYWRkcmVzcywgdGFibGUpOworCisJLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGZ1bGwgdGFibGUsIHZlcmlmeSBsZW5ndGggYW5kIG1hcCBlbnRpcmUgdGFibGUgKi8KKworCWxlbmd0aCA9IHRhYmxlLT5sZW5ndGg7CisJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGUsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKworCWlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBsZW5ndGggMHglWCBpbiBSU0RUL1hTRFQiLAorCQkJICAgIGxlbmd0aCkpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfSU5WQUxJRF9UQUJMRV9MRU5HVEgpOworCX0KKworCXRhYmxlID0gYWNwaV9vc19tYXBfbWVtb3J5KGFkZHJlc3MsIGxlbmd0aCk7CisJaWYgKCF0YWJsZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwkvKiBWYWxpZGF0ZSB0aGUgcm9vdCB0YWJsZSBjaGVja3N1bSAqLworCisJc3RhdHVzID0gYWNwaV90Yl92ZXJpZnlfY2hlY2tzdW0odGFibGUsIGxlbmd0aCk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlLCBsZW5ndGgpOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0YWJsZXMgZGVzY3JpYmVkIGluIHRoZSByb290IHRhYmxlICovCisKKwl0YWJsZV9jb3VudCA9CisJICAgICh1MzIpICgodGFibGUtPmxlbmd0aCAtCisJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgLyB0YWJsZV9lbnRyeV9zaXplKTsKKworCS8qCisJICogRmlyc3QgdHdvIGVudHJpZXMgaW4gdGhlIHRhYmxlIGFycmF5IGFyZSByZXNlcnZlZCBmb3IgdGhlIERTRFQgYW5kIEZBQ1MsCisJICogd2hpY2ggYXJlIG5vdCBhY3R1YWxseSBwcmVzZW50IGluIHRoZSBSU0RUL1hTRFQgLSB0aGV5IGNvbWUgZnJvbSB0aGUgRkFEVAorCSAqLworCXRhYmxlX2VudHJ5ID0KKwkgICAgQUNQSV9DQVNUX1BUUih1OCwgdGFibGUpICsgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcik7CisJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50ID0gMjsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcm9vdCB0YWJsZSBhcnJheSBmcm9tIHRoZSBSU0RUL1hTRFQKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGFibGVfY291bnQ7IGkrKykgeworCQlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50ID49CisJCSAgICBhY3BpX2dibF9yb290X3RhYmxlX2xpc3Quc2l6ZSkgeworCisJCQkvKiBUaGVyZSBpcyBubyBtb3JlIHJvb20gaW4gdGhlIHJvb3QgdGFibGUgYXJyYXksIGF0dGVtcHQgcmVzaXplICovCisKKwkJCXN0YXR1cyA9IGFjcGlfdGJfcmVzaXplX3Jvb3RfdGFibGVfbGlzdCgpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJCQkgICAgICAiVHJ1bmNhdGluZyAldSB0YWJsZSBlbnRyaWVzISIsCisJCQkJCSAgICAgICh1bnNpZ25lZCkKKwkJCQkJICAgICAgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5zaXplIC0KKwkJCQkJICAgICAgIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC4KKwkJCQkJICAgICAgIGNvdW50KSkpOworCQkJCWJyZWFrOwogCQkJfQorCQl9CiAKLQkJCXRhYmxlX2Rlc2MgPSB0YWJsZV9kZXNjLT5uZXh0OworCQkvKiBHZXQgdGhlIHRhYmxlIHBoeXNpY2FsIGFkZHJlc3MgKDMyLWJpdCBmb3IgUlNEVCwgNjQtYml0IGZvciBYU0RUKSAqLworCisJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50XS4KKwkJICAgIGFkZHJlc3MgPQorCQkgICAgYWNwaV90Yl9nZXRfcm9vdF90YWJsZV9lbnRyeSh0YWJsZV9lbnRyeSwgdGFibGVfZW50cnlfc2l6ZSk7CisKKwkJdGFibGVfZW50cnkgKz0gdGFibGVfZW50cnlfc2l6ZTsKKwkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50Kys7CisJfQorCisJLyoKKwkgKiBJdCBpcyBub3QgcG9zc2libGUgdG8gbWFwIG1vcmUgdGhhbiBvbmUgZW50cnkgaW4gc29tZSBlbnZpcm9ubWVudHMsCisJICogc28gdW5tYXAgdGhlIHJvb3QgdGFibGUgaGVyZSBiZWZvcmUgbWFwcGluZyBvdGhlciB0YWJsZXMKKwkgKi8KKwlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZSwgbGVuZ3RoKTsKKworCS8qCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSByb290IHRhYmxlIGFycmF5IGJ5IGV4YW1pbmluZworCSAqIHRoZSBoZWFkZXIgb2YgZWFjaCB0YWJsZQorCSAqLworCWZvciAoaSA9IDI7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7IGkrKykgeworCQlhY3BpX3RiX2luc3RhbGxfdGFibGUoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS4KKwkJCQkgICAgICBhZGRyZXNzLCBmbGFncywgTlVMTCwgaSk7CisKKwkJLyogU3BlY2lhbCBjYXNlIGZvciBGQURUIC0gZ2V0IHRoZSBEU0RUIGFuZCBGQUNTICovCisKKwkJaWYgKEFDUElfQ09NUEFSRV9OQU1FCisJCSAgICAoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0uc2lnbmF0dXJlLAorCQkgICAgIEFDUElfU0lHX0ZBRFQpKSB7CisJCQlhY3BpX3RiX3BhcnNlX2ZhZHQoaSwgZmxhZ3MpOwogCQl9CiAJfQogCi0JQUNQSV9FUlJPUigoQUVfSU5GTywgIlRhYmxlSWQ9JVggZG9lcyBub3QgZXhpc3QiLCB0YWJsZV9pZCkpOwotCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYwppbmRleCA1YmE5MzAzLi44MDc5NzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYwpAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ5LDgwICs0OSwxNTggQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwogQUNQSV9NT0RVTEVfTkFNRSgidGJ4ZmFjZSIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KK3N0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3RiX2xvYWRfbmFtZXNwYWNlKHZvaWQpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2xvYWRfdGFibGVzCisgKiBGVU5DVElPTjogICAgYWNwaV9hbGxvY2F0ZV9yb290X3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIGluaXRpYWxfdGFibGVfY291bnQgLSBTaXplIG9mIGluaXRpYWxfdGFibGVfYXJyYXksIGluIG51bWJlciBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHN0cnVjdHVyZXMKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGEgcm9vdCB0YWJsZSBhcnJheS4gVXNlZCBieSBpX2FTTCBjb21waWxlciBhbmQKKyAqICAgICAgICAgICAgICBhY3BpX2luaXRpYWxpemVfdGFibGVzLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIGFjcGlfYWxsb2NhdGVfcm9vdF90YWJsZSh1MzIgaW5pdGlhbF90YWJsZV9jb3VudCkKK3sKKworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5zaXplID0gaW5pdGlhbF90YWJsZV9jb3VudDsKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgPSBBQ1BJX1JPT1RfQUxMT1dfUkVTSVpFOworCisJcmV0dXJuIChhY3BpX3RiX3Jlc2l6ZV9yb290X3RhYmxlX2xpc3QoKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfaW5pdGlhbGl6ZV90YWJsZXMKKyAqCisgKiBQQVJBTUVURVJTOiAgaW5pdGlhbF90YWJsZV9hcnJheSAtIFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcHJlLWFsbG9jYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHN0cnVjdHVyZXMuIElmIE5VTEwsIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuCisgKiAgICAgICAgICAgICAgaW5pdGlhbF90YWJsZV9jb3VudCAtIFNpemUgb2YgaW5pdGlhbF90YWJsZV9hcnJheSwgaW4gbnVtYmVyIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2Mgc3RydWN0dXJlcworICogICAgICAgICAgICAgIGFsbG93X3JlYWxsb2MgICAgICAgLSBGbGFnIHRvIHRlbGwgVGFibGUgTWFuYWdlciBpZiByZXNpemUgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlLWFsbG9jYXRlZCBhcnJheSBpcyBhbGxvd2VkLiBJZ25vcmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluaXRpYWxfdGFibGVfYXJyYXkgaXMgTlVMTC4KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgdGhlIHRhYmxlIG1hbmFnZXIsIGdldCB0aGUgUlNEUCBhbmQgUlNEVC9YU0RULgorICoKKyAqIE5PVEU6ICAgICAgICBBbGxvd3Mgc3RhdGljIGFsbG9jYXRpb24gb2YgdGhlIGluaXRpYWwgdGFibGUgYXJyYXkgaW4gb3JkZXIKKyAqICAgICAgICAgICAgICB0byBhdm9pZCB0aGUgdXNlIG9mIGR5bmFtaWMgbWVtb3J5IGluIGNvbmZpbmVkIGVudmlyb25tZW50cworICogICAgICAgICAgICAgIHN1Y2ggYXMgdGhlIGtlcm5lbCBib290IHNlcXVlbmNlIHdoZXJlIGl0IG1heSBub3QgYmUgYXZhaWxhYmxlLgorICoKKyAqICAgICAgICAgICAgICBJZiB0aGUgaG9zdCBPUyBtZW1vcnkgbWFuYWdlcnMgYXJlIGluaXRpYWxpemVkLCB1c2UgTlVMTCBmb3IKKyAqICAgICAgICAgICAgICBpbml0aWFsX3RhYmxlX2FycmF5LCBhbmQgdGhlIHRhYmxlIHdpbGwgYmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzIF9faW5pdAorYWNwaV9pbml0aWFsaXplX3RhYmxlcyhzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICogaW5pdGlhbF90YWJsZV9hcnJheSwKKwkJICAgICAgIHUzMiBpbml0aWFsX3RhYmxlX2NvdW50LCB1OCBhbGxvd19yZXNpemUpCit7CisJYWNwaV9waHlzaWNhbF9hZGRyZXNzIHJzZHBfYWRkcmVzczsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5pdGlhbGl6ZV90YWJsZXMpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIFJvb3QgVGFibGUgQXJyYXkKKwkgKiBBbGxvY2F0ZSB0aGUgdGFibGUgYXJyYXkgaWYgcmVxdWVzdGVkCisJICovCisJaWYgKCFpbml0aWFsX3RhYmxlX2FycmF5KSB7CisJCXN0YXR1cyA9IGFjcGlfYWxsb2NhdGVfcm9vdF90YWJsZShpbml0aWFsX3RhYmxlX2NvdW50KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFJvb3QgVGFibGUgQXJyYXkgaGFzIGJlZW4gc3RhdGljYWxseSBhbGxvY2F0ZWQgYnkgdGhlIGhvc3QgKi8KKworCQlBQ1BJX01FTVNFVChpbml0aWFsX3RhYmxlX2FycmF5LCAwLAorCQkJICAgIGluaXRpYWxfdGFibGVfY291bnQgKgorCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CisKKwkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcyA9IGluaXRpYWxfdGFibGVfYXJyYXk7CisJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5zaXplID0gaW5pdGlhbF90YWJsZV9jb3VudDsKKwkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmZsYWdzID0gQUNQSV9ST09UX09SSUdJTl9VTktOT1dOOworCQlpZiAoYWxsb3dfcmVzaXplKSB7CisJCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgfD0KKwkJCSAgICBBQ1BJX1JPT1RfQUxMT1dfUkVTSVpFOworCQl9CisJfQorCisJLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBSU0RQICovCisKKwlyc2RwX2FkZHJlc3MgPSBhY3BpX29zX2dldF9yb290X3BvaW50ZXIoKTsKKwlpZiAoIXJzZHBfYWRkcmVzcykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgcm9vdCB0YWJsZSAoUlNEVCBvciBYU0RUKSBhbmQgZXh0cmFjdCBhbGwgZW50cmllcyB0byB0aGUgbG9jYWwKKwkgKiBSb290IFRhYmxlIEFycmF5LiBUaGlzIGFycmF5IGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgUlNEVC9YU0RUCisJICogaW4gYSBjb21tb24sIG1vcmUgdXNlYWJsZSBmb3JtYXQuCisJICovCisJc3RhdHVzID0KKwkgICAgYWNwaV90Yl9wYXJzZV9yb290X3RhYmxlKHJzZHBfYWRkcmVzcywgQUNQSV9UQUJMRV9PUklHSU5fTUFQUEVEKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9yZWFsbG9jYXRlX3Jvb3RfdGFibGUKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gbG9hZCB0aGUgQUNQSSB0YWJsZXMgZnJvbSB0aGUKLSAqICAgICAgICAgICAgICBwcm92aWRlZCBSU0RUCisgKiBERVNDUklQVElPTjogUmVhbGxvY2F0ZSBSb290IFRhYmxlIExpc3QgaW50byBkeW5hbWljIG1lbW9yeS4gQ29waWVzIHRoZQorICogICAgICAgICAgICAgIHJvb3QgbGlzdCBmcm9tIHRoZSBwcmV2aW91c2x5IHByb3ZpZGVkIHNjcmF0Y2ggYXJlYS4gU2hvdWxkCisgKiAgICAgICAgICAgICAgYmUgY2FsbGVkIG9uY2UgZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlCisgKiAgICAgICAgICAgICAga2VybmVsCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWFjcGlfc3RhdHVzIGFjcGlfbG9hZF90YWJsZXModm9pZCkKK2FjcGlfc3RhdHVzIGFjcGlfcmVhbGxvY2F0ZV9yb290X3RhYmxlKHZvaWQpCiB7Ci0Jc3RydWN0IGFjcGlfcG9pbnRlciByc2RwX2FkZHJlc3M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlczsKKwlhY3BpX3NpemUgbmV3X3NpemU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfbG9hZF90YWJsZXMpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9yZWFsbG9jYXRlX3Jvb3RfdGFibGUpOwogCi0JLyogR2V0IHRoZSBSU0RQICovCi0KLQlzdGF0dXMgPSBhY3BpX29zX2dldF9yb290X3BvaW50ZXIoQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsCi0JCQkJCSAgJnJzZHBfYWRkcmVzcyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJDb3VsZCBub3QgZ2V0IHRoZSBSU0RQIikpOwotCQlnb3RvIGVycm9yX2V4aXQ7CisJLyoKKwkgKiBPbmx5IHJlYWxsb2NhdGUgdGhlIHJvb3QgdGFibGUgaWYgdGhlIGhvc3QgcHJvdmlkZWQgYSBzdGF0aWMgYnVmZmVyCisJICogZm9yIHRoZSB0YWJsZSBhcnJheSBpbiB0aGUgY2FsbCB0byBhY3BpX2luaXRpYWxpemVfdGFibGVzLgorCSAqLworCWlmIChhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuZmxhZ3MgJiBBQ1BJX1JPT1RfT1JJR0lOX0FMTE9DQVRFRCkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfU1VQUE9SVCk7CiAJfQogCi0JLyogTWFwIGFuZCB2YWxpZGF0ZSB0aGUgUlNEUCAqLworCW5ld19zaXplID0KKwkgICAgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCArCisJICAgICBBQ1BJX1JPT1RfVEFCTEVfU0laRV9JTkNSRU1FTlQpICogc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpOwogCi0JYWNwaV9nYmxfdGFibGVfZmxhZ3MgPSByc2RwX2FkZHJlc3MucG9pbnRlcl90eXBlOworCS8qIENyZWF0ZSBuZXcgYXJyYXkgYW5kIGNvcHkgdGhlIG9sZCBhcnJheSAqLwogCi0Jc3RhdHVzID0gYWNwaV90Yl92ZXJpZnlfcnNkcCgmcnNkcF9hZGRyZXNzKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkR1cmluZyBSU0RQIHZhbGlkYXRpb24iKSk7Ci0JCWdvdG8gZXJyb3JfZXhpdDsKKwl0YWJsZXMgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChuZXdfc2l6ZSk7CisJaWYgKCF0YWJsZXMpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCi0JLyogR2V0IHRoZSBSU0RUIHZpYSB0aGUgUlNEUCAqLworCUFDUElfTUVNQ1BZKHRhYmxlcywgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlcywgbmV3X3NpemUpOwogCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfcnNkdCgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLCAiQ291bGQgbm90IGxvYWQgUlNEVCIpKTsKLQkJZ290byBlcnJvcl9leGl0OwotCX0KLQotCS8qIE5vdyBnZXQgdGhlIHRhYmxlcyBuZWVkZWQgYnkgdGhpcyBzdWJzeXN0ZW0gKEZBRFQsIERTRFQsIGV0Yy4pICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2dldF9yZXF1aXJlZF90YWJsZXMoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkiQ291bGQgbm90IGdldCBhbGwgcmVxdWlyZWQgdGFibGVzIChEU0RUL0ZBRFQvRkFDUykiKSk7Ci0JCWdvdG8gZXJyb3JfZXhpdDsKLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsICJBQ1BJIFRhYmxlcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWRcbiIpKTsKLQotCS8qIExvYWQgdGhlIG5hbWVzcGFjZSBmcm9tIHRoZSB0YWJsZXMgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfbG9hZF9uYW1lc3BhY2UoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkNvdWxkIG5vdCBsb2FkIG5hbWVzcGFjZSIpKTsKLQkJZ290byBlcnJvcl9leGl0OwotCX0KKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3Quc2l6ZSA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsKKwlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzID0gdGFibGVzOworCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5mbGFncyA9CisJICAgIEFDUElfUk9PVF9PUklHSU5fQUxMT0NBVEVEIHwgQUNQSV9ST09UX0FMTE9XX1JFU0laRTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0KLSAgICAgIGVycm9yX2V4aXQ6Ci0JQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkNvdWxkIG5vdCBsb2FkIHRhYmxlcyIpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfbG9hZF90YWJsZXMpCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbG9hZF90YWJsZQpAQCAtMTQxLDM0MiArMjE5LDQwNSBAQAogYWNwaV9zdGF0dXMgYWNwaV9sb2FkX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfcHRyKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHRhYmxlX2luZm87Ci0Jc3RydWN0IGFjcGlfcG9pbnRlciBhZGRyZXNzOworCWFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXg7CisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyB0YWJsZV9kZXNjOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2xvYWRfdGFibGUpOworCWlmICghdGFibGVfcHRyKQorCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAotCWlmICghdGFibGVfcHRyKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9CisJQUNQSV9NRU1TRVQoJnRhYmxlX2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CisJdGFibGVfZGVzYy5wb2ludGVyID0gdGFibGVfcHRyOworCXRhYmxlX2Rlc2MubGVuZ3RoID0gdGFibGVfcHRyLT5sZW5ndGg7CisJdGFibGVfZGVzYy5mbGFncyA9IEFDUElfVEFCTEVfT1JJR0lOX1VOS05PV047CiAKLQkvKiBDb3B5IHRoZSB0YWJsZSB0byBhIGxvY2FsIGJ1ZmZlciAqLwotCi0JYWRkcmVzcy5wb2ludGVyX3R5cGUgPSBBQ1BJX0xPR0lDQUxfUE9JTlRFUiB8IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HOwotCWFkZHJlc3MucG9pbnRlci5sb2dpY2FsID0gdGFibGVfcHRyOwotCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfYm9keSgmYWRkcmVzcywgdGFibGVfcHRyLCAmdGFibGVfaW5mbyk7CisJLyoKKwkgKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzCisJICovCisJc3RhdHVzID0gYWNwaV90Yl9hZGRfdGFibGUoJnRhYmxlX2Rlc2MsICZ0YWJsZV9pbmRleCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOwogCX0KLQotCS8qIENoZWNrIHNpZ25hdHVyZSBmb3IgYSB2YWxpZCB0YWJsZSB0eXBlICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX3JlY29nbml6ZV90YWJsZSgmdGFibGVfaW5mbywgQUNQSV9UQUJMRV9BTEwpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBJbnN0YWxsIHRoZSBuZXcgdGFibGUgaW50byB0aGUgbG9jYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2luc3RhbGxfdGFibGUoJnRhYmxlX2luZm8pOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlpZiAoc3RhdHVzID09IEFFX0FMUkVBRFlfRVhJU1RTKSB7Ci0KLQkJCS8qIFRhYmxlIGFscmVhZHkgZXhpc3RzLCBubyBlcnJvciAqLwotCi0JCQlzdGF0dXMgPSBBRV9PSzsKLQkJfQotCi0JCS8qIEZyZWUgdGFibGUgYWxsb2NhdGVkIGJ5IGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkgKi8KLQotCQlhY3BpX3RiX2RlbGV0ZV9zaW5nbGVfdGFibGUoJnRhYmxlX2luZm8pOwotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKiBDb252ZXJ0IHRoZSB0YWJsZSB0byBjb21tb24gZm9ybWF0IGlmIG5lY2Vzc2FyeSAqLwotCi0Jc3dpdGNoICh0YWJsZV9pbmZvLnR5cGUpIHsKLQljYXNlIEFDUElfVEFCTEVfSURfRkFEVDoKLQotCQlzdGF0dXMgPSBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCgpOwotCQlicmVhazsKLQotCWNhc2UgQUNQSV9UQUJMRV9JRF9GQUNTOgotCi0JCXN0YXR1cyA9IGFjcGlfdGJfYnVpbGRfY29tbW9uX2ZhY3MoJnRhYmxlX2luZm8pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qIExvYWQgdGFibGUgaW50byBuYW1lc3BhY2UgaWYgaXQgY29udGFpbnMgZXhlY3V0YWJsZSBBTUwgKi8KLQotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19sb2FkX3RhYmxlKHRhYmxlX2luZm8uaW5zdGFsbGVkX2Rlc2MsCi0JCQkJICAgICAgIGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCi0JCS8qIFVuaW5zdGFsbCB0YWJsZSBhbmQgZnJlZSB0aGUgYnVmZmVyICovCi0KLQkJKHZvaWQpYWNwaV90Yl91bmluc3RhbGxfdGFibGUodGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYyk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlKHRhYmxlX2luZGV4LCBhY3BpX2dibF9yb290X25vZGUpOworCXJldHVybiBzdGF0dXM7CiB9CiAKIEFDUElfRVhQT1JUX1NZTUJPTChhY3BpX2xvYWRfdGFibGUpCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RhYmxlX2hlYWRlcgorICoKKyAqIFBBUkFNRVRFUlM6ICBTaWduYXR1cmUgICAgICAgICAgIC0gQUNQSSBzaWduYXR1cmUgb2YgbmVlZGVkIHRhYmxlCisgKiAgICAgICAgICAgICAgSW5zdGFuY2UgICAgICAgICAgICAtIFdoaWNoIGluc3RhbmNlIChmb3IgU1NEVHMpCisgKiAgICAgICAgICAgICAgb3V0X3RhYmxlX2hlYWRlciAgICAtIFRoZSBwb2ludGVyIHRvIHRoZSB0YWJsZSBoZWFkZXIgdG8gZmlsbAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIHBvaW50ZXIgdG8gbWFwcGVkIHRhYmxlIGhlYWRlcgorICoKKyAqIERFU0NSSVBUSU9OOiBGaW5kcyBhbiBBQ1BJIHRhYmxlIGhlYWRlci4KKyAqCisgKiBOT1RFOiAgICAgICAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGluIHVubWFwcGluZyB0aGUgaGVhZGVyIHdpdGgKKyAqICAgICAgICAgICAgICBhY3BpX29zX3VubWFwX21lbW9yeQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2FjcGlfc3RhdHVzCithY3BpX2dldF90YWJsZV9oZWFkZXIoY2hhciAqc2lnbmF0dXJlLAorCQkgICAgICBhY3BpX25hdGl2ZV91aW50IGluc3RhbmNlLAorCQkgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKm91dF90YWJsZV9oZWFkZXIpCit7CisJYWNwaV9uYXRpdmVfdWludCBpOworCWFjcGlfbmF0aXZlX3VpbnQgajsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlcjsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoIXNpZ25hdHVyZSB8fCAhb3V0X3RhYmxlX2hlYWRlcikgeworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCS8qCisJICogV2FsayB0aGUgcm9vdCB0YWJsZSBsaXN0CisJICovCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7IGkrKykgeworCQlpZiAoIUFDUElfQ09NUEFSRV9OQU1FCisJCSAgICAoJihhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZSksCisJCSAgICAgc2lnbmF0dXJlKSkgeworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKytqIDwgaW5zdGFuY2UpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXIpIHsKKwkJCWlmICgoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS4KKwkJCSAgICAgZmxhZ3MgJiBBQ1BJX1RBQkxFX09SSUdJTl9NQVNLKSA9PQorCQkJICAgIEFDUElfVEFCTEVfT1JJR0lOX01BUFBFRCkgeworCQkJCWhlYWRlciA9CisJCQkJICAgIGFjcGlfb3NfbWFwX21lbW9yeShhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCisJCQkJCQkgICAgICAgdGFibGVzW2ldLmFkZHJlc3MsCisJCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCSAgICAgIGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCQkJaWYgKCFoZWFkZXIpIHsKKwkJCQkJcmV0dXJuIEFFX05PX01FTU9SWTsKKwkJCQl9CisJCQkJQUNQSV9NRU1DUFkob3V0X3RhYmxlX2hlYWRlciwgaGVhZGVyLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOworCQkJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KGhlYWRlciwKKwkJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCSAgICBhY3BpX3RhYmxlX2hlYWRlcikpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gQUVfTk9UX0ZPVU5EOworCQkJfQorCQl9IGVsc2UgeworCQkJQUNQSV9NRU1DUFkob3V0X3RhYmxlX2hlYWRlciwKKwkJCQkgICAgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCX0KKwkJcmV0dXJuIChBRV9PSyk7CisJfQorCisJcmV0dXJuIChBRV9OT1RfRk9VTkQpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdGFibGVfaGVhZGVyKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91bmxvYWRfdGFibGVfaWQKICAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfdHlwZSAgICAtIFR5cGUgb2YgdGFibGUgdG8gYmUgdW5sb2FkZWQKLSAqICAgICAgICAgICAgICBpZCAgICAgICAgICAgIC0gT3duZXIgSUQgb2YgdGhlIHRhYmxlIHRvIGJlIHJlbW92ZWQuCisgKiBQQVJBTUVURVJTOiAgaWQgICAgICAgICAgICAtIE93bmVyIElEIG9mIHRoZSB0YWJsZSB0byBiZSByZW1vdmVkLgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gZm9yY2UgdGhlIHVubG9hZCBvZiBhIHRhYmxlIChieSBpZCkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV91bmxvYWRfdGFibGVfaWQoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsIGFjcGlfb3duZXJfaWQgaWQpCithY3BpX3N0YXR1cyBhY3BpX3VubG9hZF90YWJsZV9pZChhY3BpX293bmVyX2lkIGlkKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCBpOworCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX05PVF9FWElTVDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV91bmxvYWRfdGFibGUpOwogCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQlpZiAodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfSURfTUFYKQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0KIAkvKiBGaW5kIHRhYmxlIGZyb20gdGhlIHJlcXVlc3RlZCB0eXBlIGxpc3QgKi8KLQl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0ubmV4dDsKLQl3aGlsZSAodGFibGVfZGVzYyAmJiB0YWJsZV9kZXNjLT5vd25lcl9pZCAhPSBpZCkKLQkJdGFibGVfZGVzYyA9IHRhYmxlX2Rlc2MtPm5leHQ7Ci0KLQlpZiAoIXRhYmxlX2Rlc2MpCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwotCi0JLyoKLQkgKiBEZWxldGUgYWxsIG5hbWVzcGFjZSBvYmplY3RzIG93bmVkIGJ5IHRoaXMgdGFibGUuIE5vdGUgdGhhdCB0aGVzZQotCSAqIG9iamVjdHMgY2FuIGFwcGVhciBhbnl3aGVyZSBpbiB0aGUgbmFtZXNwYWNlIGJ5IHZpcnR1ZSBvZiB0aGUgQU1MCi0JICogIlNjb3BlIiBvcGVyYXRvci4gVGh1cywgd2UgbmVlZCB0byB0cmFjayBvd25lcnNoaXAgYnkgYW4gSUQsIG5vdAotCSAqIHNpbXBseSBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgaGllcmFyY2h5Ci0JICovCi0JYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKHRhYmxlX2Rlc2MtPm93bmVyX2lkKTsKLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0KLQkodm9pZClhY3BpX3RiX3VuaW5zdGFsbF90YWJsZSh0YWJsZV9kZXNjKTsKLQotCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdW5sb2FkX3RhYmxlX2lkKQotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdW5sb2FkX3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIHRhYmxlX3R5cGUgICAgLSBUeXBlIG9mIHRhYmxlIHRvIGJlIHVubG9hZGVkCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBmb3JjZSB0aGUgdW5sb2FkIG9mIGEgdGFibGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgYWNwaV91bmxvYWRfdGFibGUoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUpCi17Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV91bmxvYWRfdGFibGUpOwotCi0JLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KLQotCWlmICh0YWJsZV90eXBlID4gQUNQSV9UQUJMRV9JRF9NQVgpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEZpbmQgYWxsIHRhYmxlcyBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgKi8KLQotCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXS5uZXh0OwotCWlmICghdGFibGVfZGVzYykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKLQl9Ci0KLQl3aGlsZSAodGFibGVfZGVzYykgeworCWZvciAoaSA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7ICsraSkgeworCQlpZiAoaWQgIT0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5vd25lcl9pZCkgeworCQkJY29udGludWU7CisJCX0KIAkJLyoKLQkJICogRGVsZXRlIGFsbCBuYW1lc3BhY2Ugb2JqZWN0cyBvd25lZCBieSB0aGlzIHRhYmxlLiBOb3RlIHRoYXQgdGhlc2UKLQkJICogb2JqZWN0cyBjYW4gYXBwZWFyIGFueXdoZXJlIGluIHRoZSBuYW1lc3BhY2UgYnkgdmlydHVlIG9mIHRoZSBBTUwKLQkJICogIlNjb3BlIiBvcGVyYXRvci4gVGh1cywgd2UgbmVlZCB0byB0cmFjayBvd25lcnNoaXAgYnkgYW4gSUQsIG5vdAotCQkgKiBzaW1wbHkgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIGhpZXJhcmNoeQotCQkgKi8KLQkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKHRhYmxlX2Rlc2MtPm93bmVyX2lkKTsKLQkJdGFibGVfZGVzYyA9IHRhYmxlX2Rlc2MtPm5leHQ7CisJCSogRGVsZXRlIGFsbCBuYW1lc3BhY2Ugb2JqZWN0cyBvd25lZCBieSB0aGlzIHRhYmxlLiBOb3RlIHRoYXQgdGhlc2UKKwkJKiBvYmplY3RzIGNhbiBhcHBlYXIgYW55d2hlcmUgaW4gdGhlIG5hbWVzcGFjZSBieSB2aXJ0dWUgb2YgdGhlIEFNTAorCQkqICJTY29wZSIgb3BlcmF0b3IuIFRodXMsIHdlIG5lZWQgdG8gdHJhY2sgb3duZXJzaGlwIGJ5IGFuIElELCBub3QKKwkJKiBzaW1wbHkgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIGhpZXJhcmNoeQorCQkqLworCQlhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIoaSk7CisJCWFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZChpKTsKKwkJYWNwaV90Yl9zZXRfdGFibGVfbG9hZGVkX2ZsYWcoaSwgRkFMU0UpOwogCX0KLQotCS8qIERlbGV0ZSAob3IgdW5tYXApIGFsbCB0YWJsZXMgb2YgdGhpcyB0eXBlICovCi0KLQlhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZSh0YWJsZV90eXBlKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotfQotCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV91bmxvYWRfdGFibGUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RhYmxlX2hlYWRlcgotICoKLSAqIFBBUkFNRVRFUlM6ICB0YWJsZV90eXBlICAgICAgLSBvbmUgb2YgdGhlIGRlZmluZWQgdGFibGUgdHlwZXMKLSAqICAgICAgICAgICAgICBJbnN0YW5jZSAgICAgICAgLSB0aGUgbm9uIHplcm8gaW5zdGFuY2Ugb2YgdGhlIHRhYmxlLCBhbGxvd3MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IGZvciBtdWx0aXBsZSB0YWJsZXMgb2YgdGhlIHNhbWUgdHlwZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSBhY3BpX2dibF9hY3BpX3RhYmxlX2ZsYWcKLSAqICAgICAgICAgICAgICBvdXRfdGFibGVfaGVhZGVyIC0gcG9pbnRlciB0byB0aGUgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGlmIHN1Y2Nlc3NmdWwKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IGFuIEFDUEkgdGFibGUgaGVhZGVyLiBUaGUgY2FsbGVyCi0gKiAgICAgICAgICAgICAgc3VwcGxpZXMgYW4gcG9pbnRlciB0byBhIGRhdGEgYXJlYSBzdWZmaWNpZW50IHRvIGNvbnRhaW4gYW4gQUNQSQotICogICAgICAgICAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBzdHJ1Y3R1cmUuCi0gKgotICogICAgICAgICAgICAgIFRoZSBoZWFkZXIgY29udGFpbnMgYSBsZW5ndGggZmllbGQgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUKLSAqICAgICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIG5lZWRlZCB0byBjb250YWluIHRoZSBlbnRpcmUgdGFibGUuIFRoaXMKLSAqICAgICAgICAgICAgICBmdW5jdGlvbiBpcyBub3QgdmFsaWQgZm9yIHRoZSBSU0QgUFRSIHRhYmxlIHNpbmNlIGl0IGRvZXMgbm90Ci0gKiAgICAgICAgICAgICAgaGF2ZSBhIHN0YW5kYXJkIGhlYWRlciBhbmQgaXMgZml4ZWQgbGVuZ3RoLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cwotYWNwaV9nZXRfdGFibGVfaGVhZGVyKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlLAotCQkgICAgICB1MzIgaW5zdGFuY2UsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqb3V0X3RhYmxlX2hlYWRlcikKLXsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRibF9wdHI7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF90YWJsZV9oZWFkZXIpOwotCi0JaWYgKChpbnN0YW5jZSA9PSAwKSB8fAotCSAgICAodGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX0lEX1JTRFApIHx8ICghb3V0X3RhYmxlX2hlYWRlcikpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIENoZWNrIHRoZSB0YWJsZSB0eXBlIGFuZCBpbnN0YW5jZSAqLwotCi0JaWYgKCh0YWJsZV90eXBlID4gQUNQSV9UQUJMRV9JRF9NQVgpIHx8Ci0JICAgIChBQ1BJX0lTX1NJTkdMRV9UQUJMRShhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX3R5cGVdLmZsYWdzKSAmJgotCSAgICAgaW5zdGFuY2UgPiAxKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0JLyogR2V0IGEgcG9pbnRlciB0byB0aGUgZW50aXJlIHRhYmxlICovCi0KLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9wdHIodGFibGVfdHlwZSwgaW5zdGFuY2UsICZ0YmxfcHRyKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgTlVMTCBwb2ludGVyIGlmIHRoZSB0YWJsZSBpcyBub3QgbG9hZGVkICovCi0KLQlpZiAodGJsX3B0ciA9PSBOVUxMKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwotCX0KLQotCS8qIENvcHkgdGhlIGhlYWRlciB0byB0aGUgY2FsbGVyJ3MgYnVmZmVyICovCi0KLQlBQ1BJX01FTUNQWShBQ1BJX0NBU1RfUFRSKHZvaWQsIG91dF90YWJsZV9oZWFkZXIpLAotCQkgICAgQUNQSV9DQVNUX1BUUih2b2lkLCB0YmxfcHRyKSwKLQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKLQogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1BQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdGFibGVfaGVhZGVyKQotI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3VubG9hZF90YWJsZV9pZCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdGFibGUKICAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfdHlwZSAgICAgIC0gb25lIG9mIHRoZSBkZWZpbmVkIHRhYmxlIHR5cGVzCi0gKiAgICAgICAgICAgICAgSW5zdGFuY2UgICAgICAgIC0gdGhlIG5vbiB6ZXJvIGluc3RhbmNlIG9mIHRoZSB0YWJsZSwgYWxsb3dzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBmb3IgbXVsdGlwbGUgdGFibGVzIG9mIHRoZSBzYW1lIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgYWNwaV9nYmxfYWNwaV90YWJsZV9mbGFnCi0gKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gcG9pbnRlciB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nIGEgYnVmZmVyIHRvCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZSB0aGUgdGFibGUKKyAqIFBBUkFNRVRFUlM6ICBTaWduYXR1cmUgICAgICAgICAgIC0gQUNQSSBzaWduYXR1cmUgb2YgbmVlZGVkIHRhYmxlCisgKiAgICAgICAgICAgICAgSW5zdGFuY2UgICAgICAgICAgICAtIFdoaWNoIGluc3RhbmNlIChmb3IgU1NEVHMpCisgKiAgICAgICAgICAgICAgb3V0X3RhYmxlICAgICAgICAgICAtIFdoZXJlIHRoZSBwb2ludGVyIHRvIHRoZSB0YWJsZSBpcyByZXR1cm5lZAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIHBvaW50ZXIgdG8gdGFibGUKICAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IGFuIEFDUEkgdGFibGUuIFRoZSBjYWxsZXIKLSAqICAgICAgICAgICAgICBzdXBwbGllcyBhbiBvdXRfYnVmZmVyIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSBlbnRpcmUgQUNQSQotICogICAgICAgICAgICAgIHRhYmxlLiBUaGUgY2FsbGVyIHNob3VsZCBjYWxsIHRoZSBhY3BpX2dldF90YWJsZV9oZWFkZXIgZnVuY3Rpb24KLSAqICAgICAgICAgICAgICBmaXJzdCB0byBkZXRlcm1pbmUgdGhlIGJ1ZmZlciBzaXplIG5lZWRlZC4gVXBvbiBjb21wbGV0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIG91dF9idWZmZXItPkxlbmd0aCBmaWVsZCB3aWxsIGluZGljYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAqICAgICAgICAgICAgICBjb3BpZWQgaW50byB0aGUgb3V0X2J1ZmZlci0+YnVmX3B0ciBidWZmZXIuIFRoaXMgdGFibGUgd2lsbCBiZQotICogICAgICAgICAgICAgIGEgY29tcGxldGUgdGFibGUgaW5jbHVkaW5nIHRoZSBoZWFkZXIuCisgKiBERVNDUklQVElPTjogRmluZHMgYW5kIHZlcmlmaWVzIGFuIEFDUEkgdGFibGUuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2dldF90YWJsZShhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSwKLQkgICAgICAgdTMyIGluc3RhbmNlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCithY3BpX2dldF90YWJsZShjaGFyICpzaWduYXR1cmUsCisJICAgICAgIGFjcGlfbmF0aXZlX3VpbnQgaW5zdGFuY2UsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKiBvdXRfdGFibGUpCiB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YmxfcHRyOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKKwlhY3BpX25hdGl2ZV91aW50IGo7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCWFjcGlfc2l6ZSB0YWJsZV9sZW5ndGg7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X3RhYmxlKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKLQlpZiAoaW5zdGFuY2UgPT0gMCkgeworCWlmICghc2lnbmF0dXJlIHx8ICFvdXRfdGFibGUpIHsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwkvKgorCSAqIFdhbGsgdGhlIHJvb3QgdGFibGUgbGlzdAorCSAqLworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyBpKyspIHsKKwkJaWYgKCFBQ1BJX0NPTVBBUkVfTkFNRQorCQkgICAgKCYoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5zaWduYXR1cmUpLAorCQkgICAgIHNpZ25hdHVyZSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCsraiA8IGluc3RhbmNlKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3RiX3ZlcmlmeV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXSk7CisJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQkJKm91dF90YWJsZSA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlcjsKKwkJfQorCisJCWlmICghYWNwaV9nYmxfcGVybWFuZW50X21tYXApIHsKKwkJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlciA9IDA7CisJCX0KKworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJcmV0dXJuIChBRV9OT1RfRk9VTkQpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfdGFibGUpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RhYmxlX2J5X2luZGV4CisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2luZGV4ICAgICAgICAgLSBUYWJsZSBpbmRleAorICogICAgICAgICAgICAgIFRhYmxlICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgcG9pbnRlciB0byB0aGUgdGFibGUgaXMgcmV0dXJuZWQKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCBwb2ludGVyIHRvIHRoZSB0YWJsZQorICoKKyAqIERFU0NSSVBUSU9OOiBPYnRhaW4gYSB0YWJsZSBieSBhbiBpbmRleCBpbnRvIHRoZSBnbG9iYWwgdGFibGUgbGlzdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYWNwaV9zdGF0dXMKK2FjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgsCisJCQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiogdGFibGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF90YWJsZV9ieV9pbmRleCk7CisKKwkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLworCisJaWYgKCF0YWJsZSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV91dF92YWxpZGF0ZV9idWZmZXIocmV0X2J1ZmZlcik7CisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisKKwkvKiBWYWxpZGF0ZSBpbmRleCAqLworCisJaWYgKHRhYmxlX2luZGV4ID49IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudCkgeworCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWlmICghYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1t0YWJsZV9pbmRleF0ucG9pbnRlcikgeworCisJCS8qIFRhYmxlIGlzIG5vdCBtYXBwZWQsIG1hcCBpdCAqLworCisJCXN0YXR1cyA9CisJCSAgICBhY3BpX3RiX3ZlcmlmeV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCQkgdGFibGVzW3RhYmxlX2luZGV4XSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCX0KKworCSp0YWJsZSA9IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbdGFibGVfaW5kZXhdLnBvaW50ZXI7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2xvYWRfbmFtZXNwYWNlCisgKgorICogUEFSQU1FVEVSUzogIE5vbmUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IExvYWQgdGhlIG5hbWVzcGFjZSBmcm9tIHRoZSBEU0RUIGFuZCBhbGwgU1NEVHMvUFNEVHMgZm91bmQgaW4KKyAqICAgICAgICAgICAgICB0aGUgUlNEVC9YU0RULgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV90Yl9sb2FkX25hbWVzcGFjZSh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOworCWFjcGlfbmF0aXZlX3VpbnQgaTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfbG9hZF9uYW1lc3BhY2UpOworCisJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CisKKwkvKgorCSAqIExvYWQgdGhlIG5hbWVzcGFjZS4gVGhlIERTRFQgaXMgcmVxdWlyZWQsIGJ1dCBhbnkgU1NEVCBhbmQgUFNEVCB0YWJsZXMKKwkgKiBhcmUgb3B0aW9uYWwuCisJICovCisJaWYgKCFhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQgfHwKKwkgICAgIUFDUElfQ09NUEFSRV9OQU1FKCYKKwkJCSAgICAgICAoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCXRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdLnNpZ25hdHVyZSksCisJCQkgICAgICAgQUNQSV9TSUdfRFNEVCkKKwkgICAgfHwKKwkgICAgQUNQSV9GQUlMVVJFKGFjcGlfdGJfdmVyaWZ5X3RhYmxlCisJCQkgKCZhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCisJCQkgIHRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdKSkpIHsKKwkJc3RhdHVzID0gQUVfTk9fQUNQSV9UQUJMRVM7CisJCWdvdG8gdW5sb2NrX2FuZF9leGl0OworCX0KKworCS8qCisJICogRmluZCBEU0RUIHRhYmxlCisJICovCisJc3RhdHVzID0KKwkgICAgYWNwaV9vc190YWJsZV9vdmVycmlkZShhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuCisJCQkJICAgdGFibGVzW0FDUElfVEFCTEVfSU5ERVhfRFNEVF0ucG9pbnRlciwKKwkJCQkgICAmdGFibGUpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiB0YWJsZSkgeworCQkvKgorCQkgKiBEU0RUIHRhYmxlIGhhcyBiZWVuIGZvdW5kCisJCSAqLworCQlhY3BpX3RiX2RlbGV0ZV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCSAgICAgdGFibGVzW0FDUElfVEFCTEVfSU5ERVhfRFNEVF0pOworCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW0FDUElfVEFCTEVfSU5ERVhfRFNEVF0ucG9pbnRlciA9CisJCSAgICB0YWJsZTsKKwkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tBQ1BJX1RBQkxFX0lOREVYX0RTRFRdLmxlbmd0aCA9CisJCSAgICB0YWJsZS0+bGVuZ3RoOworCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW0FDUElfVEFCTEVfSU5ERVhfRFNEVF0uZmxhZ3MgPQorCQkgICAgQUNQSV9UQUJMRV9PUklHSU5fVU5LTk9XTjsKKworCQlBQ1BJX0lORk8oKEFFX0lORk8sICJUYWJsZSBEU0RUIHJlcGxhY2VkIGJ5IGhvc3QgT1MiKSk7CisJCWFjcGlfdGJfcHJpbnRfdGFibGVfaGVhZGVyKDAsIHRhYmxlKTsKKwl9CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX3RiX3ZlcmlmeV90YWJsZSgmYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LgorCQkJCSB0YWJsZXNbQUNQSV9UQUJMRV9JTkRFWF9EU0RUXSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCisJCS8qIEEgdmFsaWQgRFNEVCBpcyByZXF1aXJlZCAqLworCisJCXN0YXR1cyA9IEFFX05PX0FDUElfVEFCTEVTOworCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKLQkvKiBDaGVjayB0aGUgdGFibGUgdHlwZSBhbmQgaW5zdGFuY2UgKi8KKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIAotCWlmICgodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfSURfTUFYKSB8fAotCSAgICAoQUNQSV9JU19TSU5HTEVfVEFCTEUoYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5mbGFncykgJiYKLQkgICAgIGluc3RhbmNlID4gMSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIGVudGlyZSB0YWJsZSAqLwotCi0Jc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfcHRyKHRhYmxlX3R5cGUsIGluc3RhbmNlLCAmdGJsX3B0cik7CisJLyoKKwkgKiBMb2FkIGFuZCBwYXJzZSB0YWJsZXMuCisJICovCisJc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlKEFDUElfVEFCTEVfSU5ERVhfRFNEVCwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJLyoKLQkgKiBhY3BpX3RiX2dldF90YWJsZV9wdHIgd2lsbCByZXR1cm4gYSBOVUxMIHBvaW50ZXIgaWYgdGhlCi0JICogdGFibGUgaXMgbm90IGxvYWRlZC4KKwkgKiBMb2FkIGFueSBTU0RUIG9yIFBTRFQgdGFibGVzLiBOb3RlOiBMb29wIGxlYXZlcyB0YWJsZXMgbG9ja2VkCiAJICovCi0JaWYgKHRibF9wdHIgPT0gTlVMTCkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKKwkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LmNvdW50OyArK2kpIHsKKwkJaWYgKCghQUNQSV9DT01QQVJFX05BTUUKKwkJICAgICAoJihhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnNpZ25hdHVyZSksCisJCSAgICAgIEFDUElfU0lHX1NTRFQpCisJCSAgICAgJiYKKwkJICAgICAhQUNQSV9DT01QQVJFX05BTUUoJgorCQkJCQkoYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS4KKwkJCQkJIHNpZ25hdHVyZSksIEFDUElfU0lHX1BTRFQpKQorCQkgICAgfHwKKwkJICAgIEFDUElfRkFJTFVSRShhY3BpX3RiX3ZlcmlmeV90YWJsZQorCQkJCSAoJmFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0pKSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBJZ25vcmUgZXJyb3JzIHdoaWxlIGxvYWRpbmcgdGFibGVzLCBnZXQgYXMgbWFueSBhcyBwb3NzaWJsZSAqLworCisJCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOworCQkodm9pZClhY3BpX25zX2xvYWRfdGFibGUoaSwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwkJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CiAJfQogCi0JLyogR2V0IHRoZSB0YWJsZSBsZW5ndGggKi8KKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lOSVQsICJBQ1BJIFRhYmxlcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWRcbiIpKTsKIAotCWlmICh0YWJsZV90eXBlID09IEFDUElfVEFCTEVfSURfUlNEUCkgewotCi0JCS8qIFJTRCBQVFIgaXMgdGhlIG9ubHkgInRhYmxlIiB3aXRob3V0IGEgaGVhZGVyICovCi0KLQkJdGFibGVfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpOwotCX0gZWxzZSB7Ci0JCXRhYmxlX2xlbmd0aCA9IChhY3BpX3NpemUpIHRibF9wdHItPmxlbmd0aDsKLQl9Ci0KLQkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCi0KLQlzdGF0dXMgPSBhY3BpX3V0X2luaXRpYWxpemVfYnVmZmVyKHJldF9idWZmZXIsIHRhYmxlX2xlbmd0aCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIENvcHkgdGhlIHRhYmxlIHRvIHRoZSBidWZmZXIgKi8KLQotCUFDUElfTUVNQ1BZKEFDUElfQ0FTVF9QVFIodm9pZCwgcmV0X2J1ZmZlci0+cG9pbnRlciksCi0JCSAgICBBQ1BJX0NBU1RfUFRSKHZvaWQsIHRibF9wdHIpLCB0YWJsZV9sZW5ndGgpOwotCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKyAgICAgIHVubG9ja19hbmRfZXhpdDoKKwkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RhYmxlKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9sb2FkX3RhYmxlcworICoKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBMb2FkIHRoZSBBQ1BJIHRhYmxlcyBmcm9tIHRoZSBSU0RUL1hTRFQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cyBhY3BpX2xvYWRfdGFibGVzKHZvaWQpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2xvYWRfdGFibGVzKTsKKworCS8qCisJICogTG9hZCB0aGUgbmFtZXNwYWNlIGZyb20gdGhlIHRhYmxlcworCSAqLworCXN0YXR1cyA9IGFjcGlfdGJfbG9hZF9uYW1lc3BhY2UoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiV2hpbGUgbG9hZGluZyBuYW1lc3BhY2UgZnJvbSBBQ1BJIHRhYmxlcyIpKTsKKwl9CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfbG9hZF90YWJsZXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMKaW5kZXggZGEyNjQ4Yi4uY2Y4ZmE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTQ4LDE2ICs0OCwxNSBAQAogQUNQSV9NT0RVTEVfTkFNRSgidGJ4ZnJvb3QiKQogCiAvKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdGJfZmluZF9yc2RwKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8sIHUzMiBmbGFncyk7Ci0KIHN0YXRpYyB1OCAqYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCh1OCAqIHN0YXJ0X2FkZHJlc3MsIHUzMiBsZW5ndGgpOwogCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV90Yl92YWxpZGF0ZV9yc2RwKHN0cnVjdCBhY3BpX3RhYmxlX3JzZHAgKnJzZHApOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAKICAqCi0gKiBQQVJBTUVURVJTOiAgUnNkcCAgICAgICAgLSBQb2ludGVyIHRvIHVudmFsaWRhdGVkIFJTRFAKKyAqIFBBUkFNRVRFUlM6ICBSc2RwICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byB1bnZhbGlkYXRlZCBSU0RQCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTY1LDE0ICs2NCwxOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzIGFjcGlfdGJfdmFsaWRhdGVfcnNkcChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yICpyc2RwKQorc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfdGJfdmFsaWRhdGVfcnNkcChzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwICpyc2RwKQogewogCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCS8qCi0JICogIFRoZSBzaWduYXR1cmUgYW5kIGNoZWNrc3VtIG11c3QgYm90aCBiZSBjb3JyZWN0CisJICogVGhlIHNpZ25hdHVyZSBhbmQgY2hlY2tzdW0gbXVzdCBib3RoIGJlIGNvcnJlY3QKKwkgKgorCSAqIE5vdGU6IFNvbWV0aW1lcyB0aGVyZSBleGlzdHMgbW9yZSB0aGFuIG9uZSBSU0RQIGluIG1lbW9yeTsgdGhlIHZhbGlkCisJICogUlNEUCBoYXMgYSB2YWxpZCBjaGVja3N1bSwgYWxsIG90aGVycyBoYXZlIGFuIGludmFsaWQgY2hlY2tzdW0uCiAJICovCi0JaWYgKEFDUElfU1RSTkNNUCgoY2hhciAqKXJzZHAsIFJTRFBfU0lHLCBzaXplb2YoUlNEUF9TSUcpIC0gMSkgIT0gMCkgeworCWlmIChBQ1BJX1NUUk5DTVAoKGNoYXIgKilyc2RwLCBBQ1BJX1NJR19SU0RQLCBzaXplb2YoQUNQSV9TSUdfUlNEUCkgLSAxKQorCSAgICAhPSAwKSB7CiAKIAkJLyogTm9wZSwgQkFEIFNpZ25hdHVyZSAqLwogCkBAIC04MSwxNCArODQsMTQgQEAKIAogCS8qIENoZWNrIHRoZSBzdGFuZGFyZCBjaGVja3N1bSAqLwogCi0JaWYgKGFjcGlfdGJfc3VtX3RhYmxlKHJzZHAsIEFDUElfUlNEUF9DSEVDS1NVTV9MRU5HVEgpICE9IDApIHsKKwlpZiAoYWNwaV90Yl9jaGVja3N1bSgodTggKikgcnNkcCwgQUNQSV9SU0RQX0NIRUNLU1VNX0xFTkdUSCkgIT0gMCkgewogCQlyZXR1cm4gKEFFX0JBRF9DSEVDS1NVTSk7CiAJfQogCiAJLyogQ2hlY2sgZXh0ZW5kZWQgY2hlY2tzdW0gaWYgdGFibGUgdmVyc2lvbiA+PSAyICovCiAKIAlpZiAoKHJzZHAtPnJldmlzaW9uID49IDIpICYmCi0JICAgIChhY3BpX3RiX3N1bV90YWJsZShyc2RwLCBBQ1BJX1JTRFBfWENIRUNLU1VNX0xFTkdUSCkgIT0gMCkpIHsKKwkgICAgKGFjcGlfdGJfY2hlY2tzdW0oKHU4ICopIHJzZHAsIEFDUElfUlNEUF9YQ0hFQ0tTVU1fTEVOR1RIKSAhPSAwKSkgewogCQlyZXR1cm4gKEFFX0JBRF9DSEVDS1NVTSk7CiAJfQogCkBAIC05NywzMTQgKzEwMCwxMjMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9maW5kX3RhYmxlCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9maW5kX3JzZHAKICAqCi0gKiBQQVJBTUVURVJTOiAgU2lnbmF0dXJlICAgICAgICAgICAtIFN0cmluZyB3aXRoIEFDUEkgdGFibGUgc2lnbmF0dXJlCi0gKiAgICAgICAgICAgICAgb2VtX2lkICAgICAgICAgICAgICAtIFN0cmluZyB3aXRoIHRoZSB0YWJsZSBPRU0gSUQKLSAqICAgICAgICAgICAgICBvZW1fdGFibGVfaWQgICAgICAgIC0gU3RyaW5nIHdpdGggdGhlIE9FTSBUYWJsZSBJRAotICogICAgICAgICAgICAgIHRhYmxlX3B0ciAgICAgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgcG9pbnRlciBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIHRhYmxlX2FkZHJlc3MgICAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIHBvaW50ZXIgaXMgcmV0dXJuZWQKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgU3RhdHVzLCBSU0RQIHBoeXNpY2FsIGFkZHJlc3MKICAqCi0gKiBERVNDUklQVElPTjogRmluZCBhbiBBQ1BJIHRhYmxlIChpbiB0aGUgUlNEVC9YU0RUKSB0aGF0IG1hdGNoZXMgdGhlCi0gKiAgICAgICAgICAgICAgU2lnbmF0dXJlLCBPRU0gSUQgYW5kIE9FTSBUYWJsZSBJRC4KKyAqIERFU0NSSVBUSU9OOiBTZWFyY2ggbG93ZXIgMV9tYnl0ZSBvZiBtZW1vcnkgZm9yIHRoZSByb290IHN5c3RlbSBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgcG9pbnRlciBzdHJ1Y3R1cmUuICBJZiBpdCBpcyBmb3VuZCwgc2V0ICpSU0RQIHRvIHBvaW50IHRvIGl0LgorICoKKyAqIE5PVEUxOiAgICAgICBUaGUgUlNEUCBtdXN0IGJlIGVpdGhlciBpbiB0aGUgZmlyc3QgMV9rIG9mIHRoZSBFeHRlbmRlZAorICogICAgICAgICAgICAgIEJJT1MgRGF0YSBBcmVhIG9yIGJldHdlZW4gRTAwMDAgYW5kIEZGRkZGIChGcm9tIEFDUEkgU3BlYy4pCisgKiAgICAgICAgICAgICAgT25seSBhIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIGlzIG5lY2Vzc2FyeS4KKyAqCisgKiBOT1RFMjogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBhbHdheXMgYXZhaWxhYmxlLCByZWdhcmRsZXNzIG9mIHRoZQorICogICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIHN0YXRlIG9mIHRoZSByZXN0IG9mIEFDUEkuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfZmluZF90YWJsZShjaGFyICpzaWduYXR1cmUsCi0JCSAgIGNoYXIgKm9lbV9pZCwKLQkJICAgY2hhciAqb2VtX3RhYmxlX2lkLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiogdGFibGVfcHRyKQorYWNwaV9zdGF0dXMgYWNwaV9maW5kX3Jvb3RfcG9pbnRlcihhY3BpX25hdGl2ZV91aW50ICogdGFibGVfYWRkcmVzcykKIHsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfZmluZF90YWJsZSk7Ci0KLQkvKiBWYWxpZGF0ZSBzdHJpbmcgbGVuZ3RocyAqLwotCi0JaWYgKChBQ1BJX1NUUkxFTihzaWduYXR1cmUpID4gQUNQSV9OQU1FX1NJWkUpIHx8Ci0JICAgIChBQ1BJX1NUUkxFTihvZW1faWQpID4gc2l6ZW9mKHRhYmxlLT5vZW1faWQpKSB8fAotCSAgICAoQUNQSV9TVFJMRU4ob2VtX3RhYmxlX2lkKSA+IHNpemVvZih0YWJsZS0+b2VtX3RhYmxlX2lkKSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9TVFJJTkdfTElNSVQpOwotCX0KLQotCWlmIChBQ1BJX0NPTVBBUkVfTkFNRShzaWduYXR1cmUsIERTRFRfU0lHKSkgewotCQkvKgotCQkgKiBUaGUgRFNEVCBwb2ludGVyIGlzIGNvbnRhaW5lZCBpbiB0aGUgRkFEVCwgbm90IHRoZSBSU0RULgotCQkgKiBUaGlzIGNvZGUgc2hvdWxkIHN1ZmZpY2UsIGJlY2F1c2UgdGhlIG9ubHkgY29kZSB0aGF0IHdvdWxkIHBlcmZvcm0KLQkJICogYSAiZmluZCIgb24gdGhlIERTRFQgaXMgdGhlIGRhdGFfdGFibGVfcmVnaW9uKCkgQU1MIG9wY29kZSAtLSBpbgotCQkgKiB3aGljaCBjYXNlLCB0aGUgRFNEVCBpcyBndWFyYW50ZWVkIHRvIGJlIGFscmVhZHkgbG9hZGVkLgotCQkgKiBJZiB0aGlzIGJlY29tZXMgaW5zdWZmaWNpZW50LCB0aGUgRkFEVCB3aWxsIGhhdmUgdG8gYmUgZm91bmQgZmlyc3QuCi0JCSAqLwotCQlpZiAoIWFjcGlfZ2JsX0RTRFQpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7Ci0JCX0KLQkJdGFibGUgPSBhY3BpX2dibF9EU0RUOwotCX0gZWxzZSB7Ci0JCS8qIEZpbmQgdGhlIHRhYmxlICovCi0KLQkJc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoc2lnbmF0dXJlLCAxLAotCQkJCQkJIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HLAotCQkJCQkJICZ0YWJsZSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayBvZW1faWQgYW5kIG9lbV90YWJsZV9pZCAqLwotCi0JaWYgKChvZW1faWRbMF0gJiYKLQkgICAgIEFDUElfU1RSTkNNUChvZW1faWQsIHRhYmxlLT5vZW1faWQsCi0JCQkgIHNpemVvZih0YWJsZS0+b2VtX2lkKSkpIHx8Ci0JICAgIChvZW1fdGFibGVfaWRbMF0gJiYKLQkgICAgIEFDUElfU1RSTkNNUChvZW1fdGFibGVfaWQsIHRhYmxlLT5vZW1fdGFibGVfaWQsCi0JCQkgIHNpemVvZih0YWJsZS0+b2VtX3RhYmxlX2lkKSkpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTkFNRV9OT1RfRk9VTkQpOwotCX0KLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfVEFCTEVTLCAiRm91bmQgdGFibGUgWyU0LjRzXVxuIiwKLQkJCSAgdGFibGUtPnNpZ25hdHVyZSkpOwotCi0JKnRhYmxlX3B0ciA9IHRhYmxlOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlCi0gKgotICogUEFSQU1FVEVSUzogIFNpZ25hdHVyZSAgICAgICAtIEFueSBBQ1BJIHRhYmxlIHNpZ25hdHVyZQotICogICAgICAgICAgICAgIEluc3RhbmNlICAgICAgICAtIHRoZSBub24gemVybyBpbnN0YW5jZSBvZiB0aGUgdGFibGUsIGFsbG93cwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIG11bHRpcGxlIHRhYmxlcyBvZiB0aGUgc2FtZSB0eXBlCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gUGh5c2ljYWwvVmlydHVhbCBzdXBwb3J0Ci0gKiAgICAgICAgICAgICAgdGFibGVfcG9pbnRlciAgIC0gV2hlcmUgYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGFibGUgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IGFuIEFDUEkgdGFibGUuIEEgYnVmZmVyIGlzCi0gKiAgICAgICAgICAgICAgYWxsb2NhdGVkIGZvciB0aGUgdGFibGUgYW5kIHJldHVybmVkIGluIHRhYmxlX3BvaW50ZXIuCi0gKiAgICAgICAgICAgICAgVGhpcyB0YWJsZSB3aWxsIGJlIGEgY29tcGxldGUgdGFibGUgaW5jbHVkaW5nIHRoZSBoZWFkZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKGFjcGlfc3RyaW5nIHNpZ25hdHVyZSwKLQkJCXUzMiBpbnN0YW5jZSwKLQkJCXUzMiBmbGFncywgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqdGFibGVfcG9pbnRlcikKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfcG9pbnRlciBhZGRyZXNzOwotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICpyc2R0X2luZm87Ci0JdTMyIHRhYmxlX2NvdW50OwotCXUzMiBpOwotCXUzMiBqOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9maXJtd2FyZV90YWJsZSk7Ci0KLQkvKgotCSAqIEVuc3VyZSB0aGF0IGF0IGxlYXN0IHRoZSB0YWJsZSBtYW5hZ2VyIGlzIGluaXRpYWxpemVkLiAgV2UgZG9uJ3QKLQkgKiByZXF1aXJlIHRoYXQgdGhlIGVudGlyZSBBQ1BJIHN1YnN5c3RlbSBpcyB1cCBmb3IgdGhpcyBpbnRlcmZhY2UuCi0JICogSWYgd2UgaGF2ZSBhIGJ1ZmZlciwgd2UgbXVzdCBoYXZlIGEgbGVuZ3RoIHRvbwotCSAqLwotCWlmICgoaW5zdGFuY2UgPT0gMCkgfHwgKCFzaWduYXR1cmUpIHx8ICghdGFibGVfcG9pbnRlcikpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSBSU0RQICovCi0KLQlpZiAoIWFjcGlfZ2JsX1JTRFApIHsKLQotCQkvKiBHZXQgdGhlIFJTRFAgKi8KLQotCQlzdGF0dXMgPSBhY3BpX29zX2dldF9yb290X3BvaW50ZXIoZmxhZ3MsICZhZGRyZXNzKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSU0RQIG5vdCBmb3VuZFxuIikpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKLQkJfQotCi0JCS8qIE1hcCBhbmQgdmFsaWRhdGUgdGhlIFJTRFAgKi8KLQotCQlpZiAoKGZsYWdzICYgQUNQSV9NRU1PUllfTU9ERSkgPT0gQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcpIHsKLQkJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeShhZGRyZXNzLnBvaW50ZXIucGh5c2ljYWwsCi0JCQkJCQkgICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkJCSAgIHJzZHBfZGVzY3JpcHRvciksCi0JCQkJCQkgICAgKHZvaWQgKikmYWNwaV9nYmxfUlNEUCk7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWFjcGlfZ2JsX1JTRFAgPSBhZGRyZXNzLnBvaW50ZXIubG9naWNhbDsKLQkJfQotCi0JCS8qIFRoZSBSRFNQIHNpZ25hdHVyZSBhbmQgY2hlY2tzdW0gbXVzdCBib3RoIGJlIGNvcnJlY3QgKi8KLQotCQlzdGF0dXMgPSBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAoYWNwaV9nYmxfUlNEUCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKiBHZXQgdGhlIFJTRFQgYWRkcmVzcyB2aWEgdGhlIFJTRFAgKi8KLQotCWFjcGlfdGJfZ2V0X3JzZHRfYWRkcmVzcygmYWRkcmVzcyk7Ci0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJICAiUlNEUCBsb2NhdGVkIGF0ICVwLCBSU0RUIHBoeXNpY2FsPSU4LjhYJTguOFhcbiIsCi0JCQkgIGFjcGlfZ2JsX1JTRFAsCi0JCQkgIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzLnBvaW50ZXIudmFsdWUpKSk7Ci0KLQkvKiBJbnNlcnQgcHJvY2Vzc29yX21vZGUgZmxhZ3MgKi8KLQotCWFkZHJlc3MucG9pbnRlcl90eXBlIHw9IGZsYWdzOwotCi0JLyogR2V0IGFuZCB2YWxpZGF0ZSB0aGUgUlNEVCAqLwotCi0JcnNkdF9pbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKLQlpZiAoIXJzZHRfaW5mbykgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZSgmYWRkcmVzcywgcnNkdF9pbmZvKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfdGJfdmFsaWRhdGVfcnNkdChyc2R0X2luZm8tPnBvaW50ZXIpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogQWxsb2NhdGUgYSBzY3JhdGNoIHRhYmxlIGhlYWRlciBhbmQgdGFibGUgZGVzY3JpcHRvciAqLwotCi0JaGVhZGVyID0gQUNQSV9BTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JaWYgKCFoZWFkZXIpIHsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JdGFibGVfaW5mbyA9IEFDUElfQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKLQlpZiAoIXRhYmxlX2luZm8pIHsKLQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogR2V0IHRoZSBudW1iZXIgb2YgdGFibGUgcG9pbnRlcnMgd2l0aGluIHRoZSBSU0RUICovCi0KLQl0YWJsZV9jb3VudCA9Ci0JICAgIGFjcGlfdGJfZ2V0X3RhYmxlX2NvdW50KGFjcGlfZ2JsX1JTRFAsIHJzZHRfaW5mby0+cG9pbnRlcik7Ci0JYWRkcmVzcy5wb2ludGVyX3R5cGUgPSBhY3BpX2dibF90YWJsZV9mbGFncyB8IGZsYWdzOwotCi0JLyoKLQkgKiBTZWFyY2ggdGhlIFJTRFQvWFNEVCBmb3IgdGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgdGhlCi0JICogcmVxdWVzdGVkIHRhYmxlCi0JICovCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCB0YWJsZV9jb3VudDsgaSsrKSB7Ci0JCS8qCi0JCSAqIEdldCB0aGUgbmV4dCB0YWJsZSBwb2ludGVyLCBoYW5kbGUgUlNEVCB2cy4gWFNEVAotCQkgKiBSU0RUIHBvaW50ZXJzIGFyZSAzMiBiaXRzLCBYU0RUIHBvaW50ZXJzIGFyZSA2NCBiaXRzCi0JCSAqLwotCQlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlID09IEFDUElfVEFCTEVfVFlQRV9SU0RUKSB7Ci0JCQlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPQotCQkJICAgIChBQ1BJX0NBU1RfUFRSCi0JCQkgICAgIChzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yLAotCQkJICAgICAgcnNkdF9pbmZvLT5wb2ludGVyKSktPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKLQkJfSBlbHNlIHsKLQkJCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9Ci0JCQkgICAgKEFDUElfQ0FTVF9QVFIKLQkJCSAgICAgKHN0cnVjdCB4c2R0X2Rlc2NyaXB0b3IsCi0JCQkgICAgICByc2R0X2luZm8tPnBvaW50ZXIpKS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldOwotCQl9Ci0KLQkJLyogR2V0IHRoZSB0YWJsZSBoZWFkZXIgKi8KLQotCQlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIoJmFkZHJlc3MsIGhlYWRlcik7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0KLQkJLyogQ29tcGFyZSB0YWJsZSBzaWduYXR1cmVzIGFuZCB0YWJsZSBpbnN0YW5jZSAqLwotCi0JCWlmIChBQ1BJX0NPTVBBUkVfTkFNRShoZWFkZXItPnNpZ25hdHVyZSwgc2lnbmF0dXJlKSkgewotCi0JCQkvKiBBbiBpbnN0YW5jZSBvZiB0aGUgdGFibGUgd2FzIGZvdW5kICovCi0KLQkJCWorKzsKLQkJCWlmIChqID49IGluc3RhbmNlKSB7Ci0KLQkJCQkvKiBGb3VuZCB0aGUgY29ycmVjdCBpbnN0YW5jZSwgZ2V0IHRoZSBlbnRpcmUgdGFibGUgKi8KLQotCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfdGJfZ2V0X3RhYmxlX2JvZHkoJmFkZHJlc3MsIGhlYWRlciwKLQkJCQkJCQkgICB0YWJsZV9pbmZvKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQkJZ290byBjbGVhbnVwOwotCQkJCX0KLQotCQkJCSp0YWJsZV9wb2ludGVyID0gdGFibGVfaW5mby0+cG9pbnRlcjsKLQkJCQlnb3RvIGNsZWFudXA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBEaWQgbm90IGZpbmQgdGhlIHRhYmxlICovCi0KLQlzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7Ci0KLSAgICAgIGNsZWFudXA6Ci0JaWYgKHJzZHRfaW5mby0+cG9pbnRlcikgewotCQlhY3BpX29zX3VubWFwX21lbW9yeShyc2R0X2luZm8tPnBvaW50ZXIsCi0JCQkJICAgICAoYWNwaV9zaXplKSByc2R0X2luZm8tPnBvaW50ZXItPmxlbmd0aCk7Ci0JfQotCUFDUElfRlJFRShyc2R0X2luZm8pOwotCi0JaWYgKGhlYWRlcikgewotCQlBQ1BJX0ZSRUUoaGVhZGVyKTsKLQl9Ci0JaWYgKHRhYmxlX2luZm8pIHsKLQkJQUNQSV9GUkVFKHRhYmxlX2luZm8pOwotCX0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKQotCi0vKiBUQkQ6IE1vdmUgdG8gYSBuZXcgZmlsZSAqLwotI2lmIEFDUElfTUFDSElORV9XSURUSCAhPSAxNgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9maW5kX3Jvb3RfcG9pbnRlcgotICoKLSAqIFBBUkFNRVRFUlM6ICBGbGFncyAgICAgICAgICAgICAgICAgICAtIExvZ2ljYWwvUGh5c2ljYWwgYWRkcmVzc2luZwotICogICAgICAgICAgICAgIHJzZHBfYWRkcmVzcyAgICAgICAgICAgIC0gV2hlcmUgdG8gcGxhY2UgdGhlIFJTRFAgYWRkcmVzcwotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMsIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFJTRFAKLSAqCi0gKiBERVNDUklQVElPTjogRmluZCB0aGUgUlNEUAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBhY3BpX2ZpbmRfcm9vdF9wb2ludGVyKHUzMiBmbGFncywgc3RydWN0IGFjcGlfcG9pbnRlciAqcnNkcF9hZGRyZXNzKQotewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfaW5mbzsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTggKnRhYmxlX3B0cjsKKwl1OCAqbWVtX3JvdmVyOworCXUzMiBwaHlzaWNhbF9hZGRyZXNzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2ZpbmRfcm9vdF9wb2ludGVyKTsKIAotCS8qIEdldCB0aGUgUlNEUCAqLworCS8qIDFhKSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBFeHRlbmRlZCBCSU9TIERhdGEgQXJlYSAoRUJEQSkgKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfZmluZF9yc2RwKCZ0YWJsZV9pbmZvLCBmbGFncyk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJIlJTRFAgc3RydWN0dXJlIG5vdCBmb3VuZCAtIEZsYWdzPSVYIiwgZmxhZ3MpKTsKKwl0YWJsZV9wdHIgPSBhY3BpX29zX21hcF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCQkgICAgICAgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiwKKwkJCQkgICAgICAgQUNQSV9FQkRBX1BUUl9MRU5HVEgpOworCWlmICghdGFibGVfcHRyKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVgiLAorCQkJICAgIEFDUElfRUJEQV9QVFJfTE9DQVRJT04sIEFDUElfRUJEQV9QVFJfTEVOR1RIKSk7CiAKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCi0JcnNkcF9hZGRyZXNzLT5wb2ludGVyX3R5cGUgPSBBQ1BJX1BIWVNJQ0FMX1BPSU5URVI7Ci0JcnNkcF9hZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsID0gdGFibGVfaW5mby5waHlzaWNhbF9hZGRyZXNzOwotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJQUNQSV9NT1ZFXzE2X1RPXzMyKCZwaHlzaWNhbF9hZGRyZXNzLCB0YWJsZV9wdHIpOworCisJLyogQ29udmVydCBzZWdtZW50IHBhcnQgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLworCisJcGh5c2ljYWxfYWRkcmVzcyA8PD0gNDsKKwlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZV9wdHIsIEFDUElfRUJEQV9QVFJfTEVOR1RIKTsKKworCS8qIEVCREEgcHJlc2VudD8gKi8KKworCWlmIChwaHlzaWNhbF9hZGRyZXNzID4gMHg0MDApIHsKKwkJLyoKKwkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCREEgaXMgcmVxdWlyZWQgdG8gYmUgYQorCQkgKiAgICAgbWluaW11bSBvZiAxX2sgbGVuZ3RoKQorCQkgKi8KKwkJdGFibGVfcHRyID0gYWNwaV9vc19tYXBfbWVtb3J5KChhY3BpX25hdGl2ZV91aW50KQorCQkJCQkgICAgICAgcGh5c2ljYWxfYWRkcmVzcywKKwkJCQkJICAgICAgIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CisJCWlmICghdGFibGVfcHRyKSB7CisJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJCSAgICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWCIsCisJCQkJICAgIHBoeXNpY2FsX2FkZHJlc3MsIEFDUElfRUJEQV9XSU5ET1dfU0laRSkpOworCisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJfQorCisJCW1lbV9yb3ZlciA9CisJCSAgICBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwKHRhYmxlX3B0ciwKKwkJCQkJCSBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOworCQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZV9wdHIsIEFDUElfRUJEQV9XSU5ET1dfU0laRSk7CisKKwkJaWYgKG1lbV9yb3ZlcikgeworCisJCQkvKiBSZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KKworCQkJcGh5c2ljYWxfYWRkcmVzcyArPQorCQkJICAgICh1MzIpIEFDUElfUFRSX0RJRkYobWVtX3JvdmVyLCB0YWJsZV9wdHIpOworCisJCQkqdGFibGVfYWRkcmVzcyA9IHBoeXNpY2FsX2FkZHJlc3M7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOworCQl9CisJfQorCisJLyoKKwkgKiAyKSBTZWFyY2ggdXBwZXIgbWVtb3J5OiAxNi1ieXRlIGJvdW5kYXJpZXMgaW4gRTAwMDBoLUZGRkZGaAorCSAqLworCXRhYmxlX3B0ciA9IGFjcGlfb3NfbWFwX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCSAgICAgICBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UsCisJCQkJICAgICAgIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSk7CisKKwlpZiAoIXRhYmxlX3B0cikgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYIiwKKwkJCSAgICBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UsCisJCQkgICAgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKSk7CisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJbWVtX3JvdmVyID0KKwkgICAgYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCh0YWJsZV9wdHIsIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSk7CisJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGVfcHRyLCBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOworCisJaWYgKG1lbV9yb3ZlcikgeworCisJCS8qIFJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyAqLworCisJCXBoeXNpY2FsX2FkZHJlc3MgPSAodTMyKQorCQkgICAgKEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSArCisJCSAgICAgQUNQSV9QVFJfRElGRihtZW1fcm92ZXIsIHRhYmxlX3B0cikpOworCisJCSp0YWJsZV9hZGRyZXNzID0gcGh5c2ljYWxfYWRkcmVzczsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBBIHZhbGlkIFJTRFAgd2FzIG5vdCBmb3VuZCAqLworCisJQUNQSV9FUlJPUigoQUVfSU5GTywgIkEgdmFsaWQgUlNEUCB3YXMgbm90IGZvdW5kIikpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRk9VTkQpOwogfQogCiBBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9maW5kX3Jvb3RfcG9pbnRlcikKQEAgLTQ0MCw3ICsyNTIsNyBAQAogCiAJCXN0YXR1cyA9CiAJCSAgICBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAoQUNQSV9DQVNUX1BUUgotCQkJCQkgIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yLCBtZW1fcm92ZXIpKTsKKwkJCQkJICAoc3RydWN0IGFjcGlfdGFibGVfcnNkcCwgbWVtX3JvdmVyKSk7CiAJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCiAJCQkvKiBTaWcgYW5kIGNoZWNrc3VtIHZhbGlkLCB3ZSBoYXZlIGZvdW5kIGEgcmVhbCBSU0RQICovCkBAIC00NjEsMTg5ICsyNzMsMyBAQAogCQkJICBzdGFydF9hZGRyZXNzKSk7CiAJcmV0dXJuX1BUUihOVUxMKTsKIH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9maW5kX3JzZHAKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfaW5mbyAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgaW5mbyBpcyByZXR1cm5lZAotICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBtZW1vcnkgbW9kZSAobG9naWNhbCB2cy4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsIGFkZHJlc3NpbmcpCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cywgUlNEUCBwaHlzaWNhbCBhZGRyZXNzCi0gKgotICogREVTQ1JJUFRJT046IFNlYXJjaCBsb3dlciAxX21ieXRlIG9mIG1lbW9yeSBmb3IgdGhlIHJvb3Qgc3lzdGVtIGRlc2NyaXB0b3IKLSAqICAgICAgICAgICAgICBwb2ludGVyIHN0cnVjdHVyZS4gIElmIGl0IGlzIGZvdW5kLCBzZXQgKlJTRFAgdG8gcG9pbnQgdG8gaXQuCi0gKgotICogICAgICAgICAgICAgIE5PVEUxOiBUaGUgUlNEUCBtdXN0IGJlIGVpdGhlciBpbiB0aGUgZmlyc3QgMV9rIG9mIHRoZSBFeHRlbmRlZAotICogICAgICAgICAgICAgIEJJT1MgRGF0YSBBcmVhIG9yIGJldHdlZW4gRTAwMDAgYW5kIEZGRkZGIChGcm9tIEFDUEkgU3BlYy4pCi0gKiAgICAgICAgICAgICAgT25seSBhIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIGlzIG5lY2Vzc2FyeS4KLSAqCi0gKiAgICAgICAgICAgICAgTk9URTI6IFRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGF2YWlsYWJsZSwgcmVnYXJkbGVzcyBvZiB0aGUKLSAqICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBzdGF0ZSBvZiB0aGUgcmVzdCBvZiBBQ1BJLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV90Yl9maW5kX3JzZHAoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbywgdTMyIGZsYWdzKQotewotCXU4ICp0YWJsZV9wdHI7Ci0JdTggKm1lbV9yb3ZlcjsKLQl1MzIgcGh5c2ljYWxfYWRkcmVzczsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2ZpbmRfcnNkcCk7Ci0KLQkvKgotCSAqIFNjYW4gc3VwcG9ydHMgZWl0aGVyIGxvZ2ljYWwgYWRkcmVzc2luZyBvciBwaHlzaWNhbCBhZGRyZXNzaW5nCi0JICovCi0JaWYgKChmbGFncyAmIEFDUElfTUVNT1JZX01PREUpID09IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HKSB7Ci0KLQkJLyogMWEpIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIEV4dGVuZGVkIEJJT1MgRGF0YSBBcmVhIChFQkRBKSAqLwotCi0JCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJCQkgICAgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiwKLQkJCQkJICAgIEFDUElfRUJEQV9QVFJfTEVOR1RILAotCQkJCQkgICAgKHZvaWQgKikmdGFibGVfcHRyKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWCIsCi0JCQkJICAgIEFDUElfRUJEQV9QVFJfTE9DQVRJT04sCi0JCQkJICAgIEFDUElfRUJEQV9QVFJfTEVOR1RIKSk7Ci0KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJQUNQSV9NT1ZFXzE2X1RPXzMyKCZwaHlzaWNhbF9hZGRyZXNzLCB0YWJsZV9wdHIpOwotCi0JCS8qIENvbnZlcnQgc2VnbWVudCBwYXJ0IHRvIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQotCQlwaHlzaWNhbF9hZGRyZXNzIDw8PSA0OwotCQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZV9wdHIsIEFDUElfRUJEQV9QVFJfTEVOR1RIKTsKLQotCQkvKiBFQkRBIHByZXNlbnQ/ICovCi0KLQkJaWYgKHBoeXNpY2FsX2FkZHJlc3MgPiAweDQwMCkgewotCQkJLyoKLQkJCSAqIDFiKSBTZWFyY2ggRUJEQSBwYXJhZ3JhcGhzIChFQkRBIGlzIHJlcXVpcmVkIHRvIGJlIGEKLQkJCSAqICAgICBtaW5pbXVtIG9mIDFfayBsZW5ndGgpCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQotCQkJCQkJICAgIHBoeXNpY2FsX2FkZHJlc3MsCi0JCQkJCQkgICAgQUNQSV9FQkRBX1dJTkRPV19TSVpFLAotCQkJCQkJICAgICh2b2lkICopJnRhYmxlX3B0cik7Ci0JCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkgICAgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYIGZvciBsZW5ndGggJVgiLAotCQkJCQkgICAgcGh5c2ljYWxfYWRkcmVzcywKLQkJCQkJICAgIEFDUElfRUJEQV9XSU5ET1dfU0laRSkpOwotCi0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCQl9Ci0KLQkJCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAodGFibGVfcHRyLAotCQkJCQkJCQkgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKLQkJCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlX3B0ciwgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKLQotCQkJaWYgKG1lbV9yb3ZlcikgewotCi0JCQkJLyogUmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCi0KLQkJCQlwaHlzaWNhbF9hZGRyZXNzICs9Ci0JCQkJICAgICh1MzIpIEFDUElfUFRSX0RJRkYobWVtX3JvdmVyLCB0YWJsZV9wdHIpOwotCi0JCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9Ci0JCQkJICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIDIpIFNlYXJjaCB1cHBlciBtZW1vcnk6IDE2LWJ5dGUgYm91bmRhcmllcyBpbiBFMDAwMGgtRkZGRkZoCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKLQkJCQkJICAgIEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSwKLQkJCQkJICAgIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSwKLQkJCQkJICAgICh2b2lkICopJnRhYmxlX3B0cik7Ci0KLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWCIsCi0JCQkJICAgIEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSwKLQkJCQkgICAgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKSk7Ci0KLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJbWVtX3JvdmVyID0KLQkJICAgIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAodGFibGVfcHRyLAotCQkJCQkJIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSk7Ci0JCWFjcGlfb3NfdW5tYXBfbWVtb3J5KHRhYmxlX3B0ciwgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKTsKLQotCQlpZiAobWVtX3JvdmVyKSB7Ci0KLQkJCS8qIFJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyAqLwotCi0JCQlwaHlzaWNhbF9hZGRyZXNzID0gKHUzMikKLQkJCSAgICAoQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFICsKLQkJCSAgICAgQUNQSV9QVFJfRElGRihtZW1fcm92ZXIsIHRhYmxlX3B0cikpOwotCi0JCQl0YWJsZV9pbmZvLT5waHlzaWNhbF9hZGRyZXNzID0KLQkJCSAgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBwaHlzaWNhbF9hZGRyZXNzOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCX0KLQotCS8qCi0JICogUGh5c2ljYWwgYWRkcmVzc2luZwotCSAqLwotCWVsc2UgewotCQkvKiAxYSkgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgRUJEQSAqLwotCi0JCUFDUElfTU9WRV8xNl9UT18zMigmcGh5c2ljYWxfYWRkcmVzcywgQUNQSV9FQkRBX1BUUl9MT0NBVElPTik7Ci0JCXBoeXNpY2FsX2FkZHJlc3MgPDw9IDQ7CS8qIENvbnZlcnQgc2VnbWVudCB0byBwaHlzaWNhbCBhZGRyZXNzICovCi0KLQkJLyogRUJEQSBwcmVzZW50PyAqLwotCi0JCWlmIChwaHlzaWNhbF9hZGRyZXNzID4gMHg0MDApIHsKLQkJCS8qCi0JCQkgKiAxYikgU2VhcmNoIEVCREEgcGFyYWdyYXBocyAoRUJEQSBpcyByZXF1aXJlZCB0byBiZSBhIG1pbmltdW0gb2YKLQkJCSAqICAgICAxX2sgbGVuZ3RoKQotCQkJICovCi0JCQltZW1fcm92ZXIgPQotCQkJICAgIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAoQUNQSV9QSFlTQUREUl9UT19QVFIKLQkJCQkJCQkgKHBoeXNpY2FsX2FkZHJlc3MpLAotCQkJCQkJCSBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOwotCQkJaWYgKG1lbV9yb3ZlcikgewotCi0JCQkJLyogUmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCi0KLQkJCQl0YWJsZV9pbmZvLT5waHlzaWNhbF9hZGRyZXNzID0KLQkJCQkgICAgQUNQSV9UT19JTlRFR0VSKG1lbV9yb3Zlcik7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJCX0KLQkJfQotCi0JCS8qIDIpIFNlYXJjaCB1cHBlciBtZW1vcnk6IDE2LWJ5dGUgYm91bmRhcmllcyBpbiBFMDAwMGgtRkZGRkZoICovCi0KLQkJbWVtX3JvdmVyID0KLQkJICAgIGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAoQUNQSV9QSFlTQUREUl9UT19QVFIKLQkJCQkJCSAoQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFKSwKLQkJCQkJCSBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOwotCQlpZiAobWVtX3JvdmVyKSB7Ci0KLQkJCS8qIEZvdW5kIGl0LCByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQotCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9Ci0JCQkgICAgQUNQSV9UT19JTlRFR0VSKG1lbV9yb3Zlcik7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQl9Ci0JfQotCi0JLyogQSB2YWxpZCBSU0RQIHdhcyBub3QgZm91bmQgKi8KLQotCUFDUElfRVJST1IoKEFFX0lORk8sICJObyB2YWxpZCBSU0RQIHdhcyBmb3VuZCIpKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0ZPVU5EKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwppbmRleCA0MGRkYjRkLi5mNzZkMzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwotc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgc3RhdGUpOworc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX3N0YXRlX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfdGVtcF9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX3RyaXBfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CkBAIC0xMzUzLDcgKzEzNTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFjcGlfdGhlcm1hbF9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSkKK3N0YXRpYyBpbnQgYWNwaV90aGVybWFsX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IE5VTEw7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0YWxsb2MuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCmluZGV4IGY2Y2JjMGIuLjU1YTc2NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDIsNiArNDIsNyBAQAogICovCiAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KKyNpbmNsdWRlIDxhY3BpL2FjZGVidWcuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCiBBQ1BJX01PRFVMRV9OQU1FKCJ1dGFsbG9jIikKQEAgLTE0Miw2ICsxNDMsMTQgQEAKIAogYWNwaV9zdGF0dXMgYWNwaV91dF9kZWxldGVfY2FjaGVzKHZvaWQpCiB7CisjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKKwljaGFyIGJ1ZmZlcls3XTsKKworCWlmIChhY3BpX2dibF9kaXNwbGF5X2ZpbmFsX21lbV9zdGF0cykgeworCQlBQ1BJX1NUUkNQWShidWZmZXIsICJNRU1PUlkiKTsKKwkJYWNwaV9kYl9kaXNwbGF5X3N0YXRpc3RpY3MoYnVmZmVyKTsKKwl9CisjZW5kaWYKIAogCSh2b2lkKWFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZSk7CiAJYWNwaV9nYmxfbmFtZXNwYWNlX2NhY2hlID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjYWNoZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNhY2hlLmMKaW5kZXggMWExZjgxMC4uODcwZjZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNhY2hlLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNhY2hlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yODksNiArMjg5LDE0IEBACiAKIAkJQUNQSV9NRU1fVFJBQ0tJTkcoY2FjaGUtPnRvdGFsX2FsbG9jYXRlZCsrKTsKIAorI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCisJCWlmICgoY2FjaGUtPnRvdGFsX2FsbG9jYXRlZCAtIGNhY2hlLT50b3RhbF9mcmVlZCkgPgorCQkgICAgY2FjaGUtPm1heF9vY2N1cGllZCkgeworCQkJY2FjaGUtPm1heF9vY2N1cGllZCA9CisJCQkgICAgY2FjaGUtPnRvdGFsX2FsbG9jYXRlZCAtIGNhY2hlLT50b3RhbF9mcmVlZDsKKwkJfQorI2VuZGlmCisKIAkJLyogQXZvaWQgZGVhZGxvY2sgd2l0aCBBQ1BJX0FMTE9DQVRFX1pFUk9FRCAqLwogCiAJCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMKaW5kZXggNWUxYTgwZC4uODRkNTI5ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTcxOSw2ICs3MTksMTUgQEAKIAkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KTsKIAkJYnJlYWs7CiAKKwljYXNlIEFDUElfVFlQRV9SRUdJT046CisJCS8qCisJCSAqIFdlIGNvcGllZCB0aGUgUmVnaW9uIEhhbmRsZXIsIHNvIHdlIG5vdyBtdXN0IGFkZCBhIHJlZmVyZW5jZQorCQkgKi8KKwkJaWYgKGRlc3RfZGVzYy0+cmVnaW9uLmhhbmRsZXIpIHsKKwkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShkZXN0X2Rlc2MtPnJlZ2lvbi5oYW5kbGVyKTsKKwkJfQorCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCS8qIE5vdGhpbmcgdG8gZG8gZm9yIG90aGVyIHNpbXBsZSBvYmplY3RzICovCiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVidWcuYwppbmRleCA5ZTkwNTRlLi42MWFkNGYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xODEsOCArMTgxLDcgQEAKIAkJaWYgKEFDUElfTFZfVEhSRUFEUyAmIGFjcGlfZGJnX2xldmVsKSB7CiAJCQlhY3BpX29zX3ByaW50ZgogCQkJICAgICgiXG4qKioqIENvbnRleHQgU3dpdGNoIGZyb20gVElEICVsWCB0byBUSUQgJWxYICoqKipcblxuIiwKLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGFjcGlfZ2JsX3ByZXZfdGhyZWFkX2lkLAotCQkJICAgICAodW5zaWduZWQgbG9uZykgdGhyZWFkX2lkKTsKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpYWNwaV9nYmxfcHJldl90aHJlYWRfaWQsICh1bnNpZ25lZCBsb25nKXRocmVhZF9pZCk7CiAJCX0KIAogCQlhY3BpX2dibF9wcmV2X3RocmVhZF9pZCA9IHRocmVhZF9pZDsKQEAgLTE5NSw3ICsxOTQsNyBAQAogCWFjcGlfb3NfcHJpbnRmKCIlOHMtJTA0bGQgIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKIAogCWlmIChBQ1BJX0xWX1RIUkVBRFMgJiBhY3BpX2RiZ19sZXZlbCkgewotCQlhY3BpX29zX3ByaW50ZigiWyUwNGxYXSAiLCB0aHJlYWRfaWQpOworCQlhY3BpX29zX3ByaW50ZigiWyUwNGxYXSAiLCAodW5zaWduZWQgbG9uZyl0aHJlYWRfaWQpOwogCX0KIAogCWFjcGlfb3NfcHJpbnRmKCJbJTAybGRdICUtMjIuMjJzOiAiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jCmluZGV4IDlkM2YxMTQuLmY3NzdjZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTU4LDE2ICsxNTgsMjAgQEAKIAkJCQkgICIqKioqKiBNdXRleCAlcCwgT1MgTXV0ZXggJXBcbiIsCiAJCQkJICBvYmplY3QsIG9iamVjdC0+bXV0ZXgub3NfbXV0ZXgpKTsKIAotCQlpZiAob2JqZWN0LT5tdXRleC5vc19tdXRleCAhPSBBQ1BJX0dMT0JBTF9MT0NLKSB7Ci0JCQlhY3BpX2V4X3VubGlua19tdXRleChvYmplY3QpOwotCQkJYWNwaV9vc19kZWxldGVfbXV0ZXgob2JqZWN0LT5tdXRleC5vc19tdXRleCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBHbG9iYWwgTG9jayAibXV0ZXgiIGlzIGFjdHVhbGx5IGEgY291bnRpbmcgc2VtYXBob3JlICovCisJCWlmIChvYmplY3QtPm11dGV4Lm9zX211dGV4ID09IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4KSB7CisKKwkJCS8qIEdsb2JhbCBMb2NrIGhhcyBleHRyYSBzZW1hcGhvcmUgKi8KIAogCQkJKHZvaWQpCiAJCQkgICAgYWNwaV9vc19kZWxldGVfc2VtYXBob3JlCiAJCQkgICAgKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSk7CiAJCQlhY3BpX2dibF9nbG9iYWxfbG9ja19zZW1hcGhvcmUgPSBOVUxMOworCisJCQlhY3BpX29zX2RlbGV0ZV9tdXRleChvYmplY3QtPm11dGV4Lm9zX211dGV4KTsKKwkJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX211dGV4ID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCWFjcGlfZXhfdW5saW5rX211dGV4KG9iamVjdCk7CisJCQlhY3BpX29zX2RlbGV0ZV9tdXRleChvYmplY3QtPm11dGV4Lm9zX211dGV4KTsKIAkJfQogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMKaW5kZXggZDZkNzEyMS4uMTNkNTg3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jCmluZGV4IDAxNDAzMGEuLmFmMzMzNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00Niw4OSArNDYsOSBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAorQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2JsX0ZBRFQpCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKLUFDUElfTU9EVUxFX05BTUUoInV0Z2xvYmFsIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uCi0gKgotICogUEFSQU1FVEVSUzogIFN0YXR1cyAgICAgICAtIFRoZSBhY3BpX3N0YXR1cyBjb2RlIHRvIGJlIGZvcm1hdHRlZAotICoKLSAqIFJFVFVSTjogICAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dC4gQSB2YWxpZCBwb2ludGVyIGlzCi0gKiAgICAgICAgICAgICAgYWx3YXlzIHJldHVybmVkLgotICoKLSAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgYW4gQUNQSSBleGNlcHRpb24gaW50byBhbiBBU0NJSSBzdHJpbmcuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IGNoYXIgKmFjcGlfZm9ybWF0X2V4Y2VwdGlvbihhY3BpX3N0YXR1cyBzdGF0dXMpCi17Ci0JYWNwaV9zdGF0dXMgc3ViX3N0YXR1czsKLQljb25zdCBjaGFyICpleGNlcHRpb24gPSBOVUxMOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyoKLQkgKiBTdGF0dXMgaXMgY29tcG9zZWQgb2YgdHdvIHBhcnRzLCBhICJ0eXBlIiBhbmQgYW4gYWN0dWFsIGNvZGUKLQkgKi8KLQlzdWJfc3RhdHVzID0gKHN0YXR1cyAmIH5BRV9DT0RFX01BU0spOwotCi0Jc3dpdGNoIChzdGF0dXMgJiBBRV9DT0RFX01BU0spIHsKLQljYXNlIEFFX0NPREVfRU5WSVJPTk1FTlRBTDoKLQotCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0VOVl9NQVgpIHsKLQkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19lbnZbc3ViX3N0YXR1c107Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFFX0NPREVfUFJPR1JBTU1FUjoKLQotCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX1BHTV9NQVgpIHsKLQkJCWV4Y2VwdGlvbiA9Ci0JCQkgICAgYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3BnbVtzdWJfc3RhdHVzIC0gMV07Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFFX0NPREVfQUNQSV9UQUJMRVM6Ci0KLQkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9UQkxfTUFYKSB7Ci0JCQlleGNlcHRpb24gPQotCQkJICAgIGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc190Ymxbc3ViX3N0YXR1cyAtIDFdOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBRV9DT0RFX0FNTDoKLQotCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0FNTF9NQVgpIHsKLQkJCWV4Y2VwdGlvbiA9Ci0JCQkgICAgYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2FtbFtzdWJfc3RhdHVzIC0gMV07Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFFX0NPREVfQ09OVFJPTDoKLQotCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0NUUkxfTUFYKSB7Ci0JCQlleGNlcHRpb24gPQotCQkJICAgIGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19jdHJsW3N1Yl9zdGF0dXMgLSAxXTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmICghZXhjZXB0aW9uKSB7Ci0KLQkJLyogRXhjZXB0aW9uIGNvZGUgd2FzIG5vdCByZWNvZ25pemVkICovCi0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiVW5rbm93biBleGNlcHRpb24gY29kZTogMHglOC44WCIsIHN0YXR1cykpOwotCi0JCWV4Y2VwdGlvbiA9ICJVTktOT1dOX1NUQVRVU19DT0RFIjsKLQl9Ci0KLQlyZXR1cm4gKEFDUElfQ0FTVF9QVFIoY29uc3QgY2hhciwgZXhjZXB0aW9uKSk7Ci19CisgICAgQUNQSV9NT0RVTEVfTkFNRSgidXRnbG9iYWwiKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE2Myw4ICs4Myw2IEBACiAKIHU4IGFjcGlfZ2JsX3NodXRkb3duID0gVFJVRTsKIAotY29uc3QgdTggYWNwaV9nYmxfZGVjb2RlX3RvOGJpdFs4XSA9IHsgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4IH07Ci0KIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW0FDUElfU19TVEFURV9DT1VOVF0gPSB7CiAJIlxcX1MwXyIsCiAJIlxcX1MxXyIsCkBAIC0xODMsMTAgKzEwMSw0NSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIE5hbWVzcGFjZSBnbG9iYWxzCisgKiBGVU5DVElPTjogICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uCisgKgorICogUEFSQU1FVEVSUzogIFN0YXR1cyAgICAgICAtIFRoZSBhY3BpX3N0YXR1cyBjb2RlIHRvIGJlIGZvcm1hdHRlZAorICoKKyAqIFJFVFVSTjogICAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dC4gQSB2YWxpZCBwb2ludGVyIGlzCisgKiAgICAgICAgICAgICAgYWx3YXlzIHJldHVybmVkLgorICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgYW4gQUNQSSBleGNlcHRpb24gaW50byBhbiBBU0NJSSBzdHJpbmcKKyAqICAgICAgICAgICAgICBJdCBpcyBoZXJlIGluc3RlYWQgb2YgdXR4ZmFjZS5jIHNvIGl0IGlzIGFsd2F5cyBwcmVzZW50LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK2NvbnN0IGNoYXIgKmFjcGlfZm9ybWF0X2V4Y2VwdGlvbihhY3BpX3N0YXR1cyBzdGF0dXMpCit7CisJY29uc3QgY2hhciAqZXhjZXB0aW9uID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKKworCWV4Y2VwdGlvbiA9IGFjcGlfdXRfdmFsaWRhdGVfZXhjZXB0aW9uKHN0YXR1cyk7CisJaWYgKCFleGNlcHRpb24pIHsKKworCQkvKiBFeGNlcHRpb24gY29kZSB3YXMgbm90IHJlY29nbml6ZWQgKi8KKworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJVbmtub3duIGV4Y2VwdGlvbiBjb2RlOiAweCU4LjhYIiwgc3RhdHVzKSk7CisKKwkJZXhjZXB0aW9uID0gIlVOS05PV05fU1RBVFVTX0NPREUiOworCX0KKworCXJldHVybiAoQUNQSV9DQVNUX1BUUihjb25zdCBjaGFyLCBleGNlcHRpb24pKTsKK30KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZm9ybWF0X2V4Y2VwdGlvbikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lc3BhY2UgZ2xvYmFscworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogUHJlZGVmaW5lZCBBQ1BJIE5hbWVzIChCdWlsdC1pbiB0byB0aGUgSW50ZXJwcmV0ZXIpCiAgKgpAQCAtMjgwLDUzICsyMzMsNiBAQAogCXJldHVybiAoYWNwaV9nYmxfaGV4X3RvX2FzY2lpWyhpbnRlZ2VyID4+IHBvc2l0aW9uKSAmIDB4Rl0pOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRhYmxlIG5hbWUgZ2xvYmFscwotICoKLSAqIE5PVEU6IFRoaXMgdGFibGUgaW5jbHVkZXMgT05MWSB0aGUgQUNQSSB0YWJsZXMgdGhhdCB0aGUgc3Vic3lzdGVtIGNvbnN1bWVzLgotICogaXQgaXMgTk9UIGFuIGV4aGF1c3RpdmUgbGlzdCBvZiBhbGwgcG9zc2libGUgQUNQSSB0YWJsZXMuICBBbGwgQUNQSSB0YWJsZXMKLSAqIHRoYXQgYXJlIG5vdCB1c2VkIGJ5IHRoZSBzdWJzeXN0ZW0gYXJlIHNpbXBseSBpZ25vcmVkLgotICoKLSAqIERvIE5PVCBhZGQgYW55IHRhYmxlIHRvIHRoaXMgbGlzdCB0aGF0IGlzIG5vdCBjb25zdW1lZCBkaXJlY3RseSBieSB0aGlzCi0gKiBzdWJzeXN0ZW0gKE5vIE1BRFQsIEVDRFQsIFNCU1QsIGV0Yy4pCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGFjcGlfdGFibGVfbGlzdCBhY3BpX2dibF90YWJsZV9saXN0c1tBQ1BJX1RBQkxFX0lEX01BWCArIDFdOwotCi1zdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0IGFjcGlfZ2JsX3RhYmxlX2RhdGFbQUNQSV9UQUJMRV9JRF9NQVggKyAxXSA9IHsKLQkvKioqKioqKioqKiogICAgTmFtZSwgICBTaWduYXR1cmUsIEdsb2JhbCB0eXBlZCBwb2ludGVyICAgICBTaWduYXR1cmUgc2l6ZSwgICAgICBUeXBlICAgICAgICAgICAgICAgICAgSG93IG1hbnkgYWxsb3dlZD8sICAgIENvbnRhaW5zIHZhbGlkIEFNTD8gKi8KLQotCS8qIFJTRFAgMCAqLyB7UlNEUF9OQU1FLCBSU0RQX1NJRywgTlVMTCwgc2l6ZW9mKFJTRFBfU0lHKSAtIDEsCi0JCSAgICAgIEFDUElfVEFCTEVfUk9PVCB8IEFDUElfVEFCTEVfU0lOR0xFfQotCSwKLQkvKiBEU0RUIDEgKi8ge0RTRFRfU0lHLCBEU0RUX1NJRywgKHZvaWQgKikmYWNwaV9nYmxfRFNEVCwKLQkJICAgICAgc2l6ZW9mKERTRFRfU0lHKSAtIDEsCi0JCSAgICAgIEFDUElfVEFCTEVfU0VDT05EQVJZIHwgQUNQSV9UQUJMRV9TSU5HTEUgfAotCQkgICAgICBBQ1BJX1RBQkxFX0VYRUNVVEFCTEV9Ci0JLAotCS8qIEZBRFQgMiAqLyB7RkFEVF9TSUcsIEZBRFRfU0lHLCAodm9pZCAqKSZhY3BpX2dibF9GQURULAotCQkgICAgICBzaXplb2YoRkFEVF9TSUcpIC0gMSwKLQkJICAgICAgQUNQSV9UQUJMRV9QUklNQVJZIHwgQUNQSV9UQUJMRV9TSU5HTEV9Ci0JLAotCS8qIEZBQ1MgMyAqLyB7RkFDU19TSUcsIEZBQ1NfU0lHLCAodm9pZCAqKSZhY3BpX2dibF9GQUNTLAotCQkgICAgICBzaXplb2YoRkFDU19TSUcpIC0gMSwKLQkJICAgICAgQUNQSV9UQUJMRV9TRUNPTkRBUlkgfCBBQ1BJX1RBQkxFX1NJTkdMRX0KLQksCi0JLyogUFNEVCA0ICovIHtQU0RUX1NJRywgUFNEVF9TSUcsIE5VTEwsIHNpemVvZihQU0RUX1NJRykgLSAxLAotCQkgICAgICBBQ1BJX1RBQkxFX1BSSU1BUlkgfCBBQ1BJX1RBQkxFX01VTFRJUExFIHwKLQkJICAgICAgQUNQSV9UQUJMRV9FWEVDVVRBQkxFfQotCSwKLQkvKiBTU0RUIDUgKi8ge1NTRFRfU0lHLCBTU0RUX1NJRywgTlVMTCwgc2l6ZW9mKFNTRFRfU0lHKSAtIDEsCi0JCSAgICAgIEFDUElfVEFCTEVfUFJJTUFSWSB8IEFDUElfVEFCTEVfTVVMVElQTEUgfAotCQkgICAgICBBQ1BJX1RBQkxFX0VYRUNVVEFCTEV9Ci0JLAotCS8qIFhTRFQgNiAqLyB7WFNEVF9TSUcsIFhTRFRfU0lHLCBOVUxMLCBzaXplb2YoUlNEVF9TSUcpIC0gMSwKLQkJICAgICAgQUNQSV9UQUJMRV9ST09UIHwgQUNQSV9UQUJMRV9TSU5HTEV9Ci0JLAotfTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEV2ZW50IGFuZCBIYXJkd2FyZSBnbG9iYWxzCkBAIC02MTIsNyArNTE4LDcgQEAKIAkvKiBOYW1lIG11c3QgYmUgYSB2YWxpZCBBQ1BJIG5hbWUgKi8KIAogCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUobm9kZS0+bmFtZS5pbnRlZ2VyKSkgewotCQlub2RlLT5uYW1lLmludGVnZXIgPSBhY3BpX3V0X3JlcGFpcl9uYW1lKG5vZGUtPm5hbWUuaW50ZWdlcik7CisJCW5vZGUtPm5hbWUuaW50ZWdlciA9IGFjcGlfdXRfcmVwYWlyX25hbWUobm9kZS0+bmFtZS5hc2NpaSk7CiAJfQogCiAJLyogUmV0dXJuIHRoZSBuYW1lICovCkBAIC03NTEsMTMgKzY1Nyw2IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBBQ1BJIHRhYmxlIHN0cnVjdHVyZSAqLwotCi0JZm9yIChpID0gMDsgaSA8IChBQ1BJX1RBQkxFX0lEX01BWCArIDEpOyBpKyspIHsKLQkJYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0ubmV4dCA9IE5VTEw7Ci0JCWFjcGlfZ2JsX3RhYmxlX2xpc3RzW2ldLmNvdW50ID0gMDsKLQl9Ci0KIAkvKiBNdXRleCBsb2NrZWQgZmxhZ3MgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9NVVRFWDsgaSsrKSB7CkBAIC03NzMsNiArNjcyLDcgQEAKIAogCS8qIEdQRSBzdXBwb3J0ICovCiAKKwlhY3BpX2dwZV9jb3VudCA9IDA7CiAJYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZCA9IE5VTEw7CiAJYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzBdID0gTlVMTDsKIAlhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbMV0gPSBOVUxMOwpAQCAtNzg0LDI1ICs2ODQsMTUgQEAKIAlhY3BpX2dibF9leGNlcHRpb25faGFuZGxlciA9IE5VTEw7CiAJYWNwaV9nYmxfaW5pdF9oYW5kbGVyID0gTlVMTDsKIAotCS8qIEdsb2JhbCAidHlwZWQiIEFDUEkgdGFibGUgcG9pbnRlcnMgKi8KLQotCWFjcGlfZ2JsX1JTRFAgPSBOVUxMOwotCWFjcGlfZ2JsX1hTRFQgPSBOVUxMOwotCWFjcGlfZ2JsX0ZBQ1MgPSBOVUxMOwotCWFjcGlfZ2JsX0ZBRFQgPSBOVUxMOwotCWFjcGlfZ2JsX0RTRFQgPSBOVUxMOwotCiAJLyogR2xvYmFsIExvY2sgc3VwcG9ydCAqLwogCiAJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlID0gTlVMTDsKKwlhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCA9IE5VTEw7CiAJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfYWNxdWlyZWQgPSBGQUxTRTsKLQlhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQgPSAwOwogCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX2hhbmRsZSA9IDA7CiAKIAkvKiBNaXNjZWxsYW5lb3VzIHZhcmlhYmxlcyAqLwogCi0JYWNwaV9nYmxfdGFibGVfZmxhZ3MgPSBBQ1BJX1BIWVNJQ0FMX1BPSU5URVI7Ci0JYWNwaV9nYmxfcnNkcF9vcmlnaW5hbF9sb2NhdGlvbiA9IDA7CiAJYWNwaV9nYmxfY21fc2luZ2xlX3N0ZXAgPSBGQUxTRTsKIAlhY3BpX2dibF9kYl90ZXJtaW5hdGVfdGhyZWFkcyA9IEZBTFNFOwogCWFjcGlfZ2JsX3NodXRkb3duID0gRkFMU0U7CkBAIC04MzcsOCArNzI3LDEzIEBACiAJYWNwaV9nYmxfbG93ZXN0X3N0YWNrX3BvaW50ZXIgPSBBQ1BJX1NJWkVfTUFYOwogI2VuZGlmCiAKKyNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUworCWFjcGlfZ2JsX2Rpc3BsYXlfZmluYWxfbWVtX3N0YXRzID0gRkFMU0U7CisjZW5kaWYKKwogCXJldHVybl9WT0lEOwogfQogCiBBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9kYmdfbGV2ZWwpCiBBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9kYmdfbGF5ZXIpCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9ncGVfY291bnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYwppbmRleCBmZjc2MDU1Li5hZDNjMGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00NCwxMTkgKzQ0LDE0IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjdGFibGVzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwogQUNQSV9NT0RVTEVfTkFNRSgidXRpbml0IikKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQKLWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvcihjaGFyICpyZWdpc3Rlcl9uYW1lLCB1MzIgdmFsdWUsIHU4IG9mZnNldCk7Ci0KIHN0YXRpYyB2b2lkIGFjcGlfdXRfdGVybWluYXRlKHZvaWQpOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IKLSAqCi0gKiBQQVJBTUVURVJTOiAgcmVnaXN0ZXJfbmFtZSAgICAgICAgICAgLSBQb2ludGVyIHRvIHN0cmluZyBpZGVudGlmeWluZyByZWdpc3RlcgotICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgIC0gQWN0dWFsIHJlZ2lzdGVyIGNvbnRlbnRzIHZhbHVlCi0gKiAgICAgICAgICAgICAgT2Zmc2V0ICAgICAgICAgICAgICAgICAgLSBCeXRlIG9mZnNldCBpbiB0aGUgRkFEVAotICoKLSAqIFJFVFVSTjogICAgICBBRV9CQURfVkFMVUUKLSAqCi0gKiBERVNDUklQVElPTjogRGlzcGxheSBmYWlsdXJlIG1lc3NhZ2UKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKGNoYXIgKnJlZ2lzdGVyX25hbWUsIHUzMiB2YWx1ZSwgdTggb2Zmc2V0KQotewotCi0JQUNQSV9XQVJOSU5HKChBRV9JTkZPLAotCQkgICAgICAiSW52YWxpZCBGQURUIHZhbHVlICVzPSVYIGF0IG9mZnNldCAlWCBGQURUPSVwIiwKLQkJICAgICAgcmVnaXN0ZXJfbmFtZSwgdmFsdWUsIG9mZnNldCwgYWNwaV9nYmxfRkFEVCkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdmFsaWRhdGVfZmFkdAotICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSB2YXJpb3VzIEFDUEkgcmVnaXN0ZXJzIGluIHRoZSBGQURUCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV91dF92YWxpZGF0ZV9mYWR0KHZvaWQpCi17Ci0KLQkvKgotCSAqIFZlcmlmeSBGaXhlZCBBQ1BJIERlc2NyaXB0aW9uIFRhYmxlIGZpZWxkcywKLQkgKiBidXQgZG9uJ3QgYWJvcnQgb24gYW55IHByb2JsZW1zLCBqdXN0IGRpc3BsYXkgZXJyb3IKLQkgKi8KLQlpZiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4gPCA0KSB7Ci0JCWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvcigiUE0xX0VWVF9MRU4iLAotCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4sCi0JCQkJCSAgICBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMV9ldnRfbGVuKSk7Ci0JfQotCi0JaWYgKCFhY3BpX2dibF9GQURULT5wbTFfY250X2xlbikgewotCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIlBNMV9DTlRfTEVOIiwgMCwKLQkJCQkJICAgIEFDUElfRkFEVF9PRkZTRVQocG0xX2NudF9sZW4pKTsKLQl9Ci0KLQlpZiAoIWFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcykgewotCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIlhfUE0xYV9FVlRfQkxLIiwgMCwKLQkJCQkJICAgIEFDUElfRkFEVF9PRkZTRVQoeHBtMWFfZXZ0X2Jsay4KLQkJCQkJCQkgICAgIGFkZHJlc3MpKTsKLQl9Ci0KLQlpZiAoIWFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2NudF9ibGsuYWRkcmVzcykgewotCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIlhfUE0xYV9DTlRfQkxLIiwgMCwKLQkJCQkJICAgIEFDUElfRkFEVF9PRkZTRVQoeHBtMWFfY250X2Jsay4KLQkJCQkJCQkgICAgIGFkZHJlc3MpKTsKLQl9Ci0KLQlpZiAoIWFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrLmFkZHJlc3MpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCJYX1BNX1RNUl9CTEsiLCAwLAotCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVCh4cG1fdG1yX2Jsay4KLQkJCQkJCQkgICAgIGFkZHJlc3MpKTsKLQl9Ci0KLQlpZiAoKGFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsay5hZGRyZXNzICYmCi0JICAgICAhYWNwaV9nYmxfRkFEVC0+cG0yX2NudF9sZW4pKSB7Ci0JCWFjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvcigiUE0yX0NOVF9MRU4iLAotCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+cG0yX2NudF9sZW4sCi0JCQkJCSAgICBBQ1BJX0ZBRFRfT0ZGU0VUKHBtMl9jbnRfbGVuKSk7Ci0JfQotCi0JaWYgKGFjcGlfZ2JsX0ZBRFQtPnBtX3RtX2xlbiA8IDQpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCJQTV9UTV9MRU4iLAotCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+cG1fdG1fbGVuLAotCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVChwbV90bV9sZW4pKTsKLQl9Ci0KLQkvKiBMZW5ndGggb2YgR1BFIGJsb2NrcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiAqLwotCi0JaWYgKGFjcGlfZ2JsX0ZBRFQtPnhncGUwX2Jsay5hZGRyZXNzICYmCi0JICAgIChhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4gJiAxKSkgewotCQlhY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoIih4KUdQRTBfQkxLX0xFTiIsCi0JCQkJCSAgICAodTMyKSBhY3BpX2dibF9GQURULT5ncGUwX2Jsa19sZW4sCi0JCQkJCSAgICBBQ1BJX0ZBRFRfT0ZGU0VUKGdwZTBfYmxrX2xlbikpOwotCX0KLQotCWlmIChhY3BpX2dibF9GQURULT54Z3BlMV9ibGsuYWRkcmVzcyAmJgotCSAgICAoYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuICYgMSkpIHsKLQkJYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKCIoeClHUEUxX0JMS19MRU4iLAotCQkJCQkgICAgKHUzMikgYWNwaV9nYmxfRkFEVC0+Z3BlMV9ibGtfbGVuLAotCQkJCQkgICAgQUNQSV9GQURUX09GRlNFVChncGUxX2Jsa19sZW4pKTsKLQl9Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3Rlcm1pbmF0ZQpAQCAtMTc4LDcgKzczLDYgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfdGVybWluYXRlKTsKIAotCS8qIEZyZWUgZ2xvYmFsIHRhYmxlcywgZXRjLiAqLwogCS8qIEZyZWUgZ2xvYmFsIEdQRSBibG9ja3MgYW5kIHJlbGF0ZWQgaW5mbyBzdHJ1Y3R1cmVzICovCiAKIAlncGVfeHJ1cHRfaW5mbyA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7CkBAIC0yMzksNiArMTMzLDEwIEBACiAKIAlhY3BpX25zX3Rlcm1pbmF0ZSgpOwogCisJLyogRGVsZXRlIHRoZSBBQ1BJIHRhYmxlcyAqLworCisJYWNwaV90Yl90ZXJtaW5hdGUoKTsKKwogCS8qIENsb3NlIHRoZSBnbG9iYWxzICovCiAKIAlhY3BpX3V0X3Rlcm1pbmF0ZSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMKaW5kZXggMTlkNzRiZS4uMGM1NmEwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jCmluZGV4IDZkOGE4MjEuLjUwMTMzZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01MSw2ICs1MSw3OCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkYXRlX2V4Y2VwdGlvbgorICoKKyAqIFBBUkFNRVRFUlM6ICBTdGF0dXMgICAgICAgLSBUaGUgYWNwaV9zdGF0dXMgY29kZSB0byBiZSBmb3JtYXR0ZWQKKyAqCisgKiBSRVRVUk46ICAgICAgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQuIE5VTEwgaWYgZXhjZXB0aW9uIGlzCisgKiAgICAgICAgICAgICAgbm90IHZhbGlkLgorICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyBhbmQgdHJhbnNsYXRlcyBhbiBBQ1BJIGV4Y2VwdGlvbiBpbnRvCisgKiAgICAgICAgICAgICAgYW4gQVNDSUkgc3RyaW5nLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBjaGFyICphY3BpX3V0X3ZhbGlkYXRlX2V4Y2VwdGlvbihhY3BpX3N0YXR1cyBzdGF0dXMpCit7CisJYWNwaV9zdGF0dXMgc3ViX3N0YXR1czsKKwljb25zdCBjaGFyICpleGNlcHRpb24gPSBOVUxMOworCisJQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCisJLyoKKwkgKiBTdGF0dXMgaXMgY29tcG9zZWQgb2YgdHdvIHBhcnRzLCBhICJ0eXBlIiBhbmQgYW4gYWN0dWFsIGNvZGUKKwkgKi8KKwlzdWJfc3RhdHVzID0gKHN0YXR1cyAmIH5BRV9DT0RFX01BU0spOworCisJc3dpdGNoIChzdGF0dXMgJiBBRV9DT0RFX01BU0spIHsKKwljYXNlIEFFX0NPREVfRU5WSVJPTk1FTlRBTDoKKworCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0VOVl9NQVgpIHsKKwkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19lbnZbc3ViX3N0YXR1c107CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFFX0NPREVfUFJPR1JBTU1FUjoKKworCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX1BHTV9NQVgpIHsKKwkJCWV4Y2VwdGlvbiA9CisJCQkgICAgYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3BnbVtzdWJfc3RhdHVzIC0gMV07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFFX0NPREVfQUNQSV9UQUJMRVM6CisKKwkJaWYgKHN1Yl9zdGF0dXMgPD0gQUVfQ09ERV9UQkxfTUFYKSB7CisJCQlleGNlcHRpb24gPQorCQkJICAgIGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc190Ymxbc3ViX3N0YXR1cyAtIDFdOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBRV9DT0RFX0FNTDoKKworCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0FNTF9NQVgpIHsKKwkJCWV4Y2VwdGlvbiA9CisJCQkgICAgYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX2FtbFtzdWJfc3RhdHVzIC0gMV07CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFFX0NPREVfQ09OVFJPTDoKKworCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0NUUkxfTUFYKSB7CisJCQlleGNlcHRpb24gPQorCQkJICAgIGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19jdHJsW3N1Yl9zdGF0dXMgLSAxXTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAoQUNQSV9DQVNUX1BUUihjb25zdCBjaGFyLCBleGNlcHRpb24pKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9pc19hbWxfdGFibGUKICAqCiAgKiBQQVJBTUVURVJTOiAgVGFibGUgICAgICAgICAgICAgICAtIEFuIEFDUEkgdGFibGUKQEAgLTYyLDE0ICsxMzQsMTUgQEAKICAqICAgICAgICAgICAgICBkYXRhIHRhYmxlcyB0aGF0IGRvIG5vdCBjb250YWluIEFNTCBjb2RlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHU4IGFjcGlfdXRfaXNfYW1sX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiB7CiAKIAkvKiBUaGVzZSBhcmUgdGhlIG9ubHkgdGFibGVzIHRoYXQgY29udGFpbiBleGVjdXRhYmxlIEFNTCAqLwogCi0JaWYgKEFDUElfQ09NUEFSRV9OQU1FKHRhYmxlLT5zaWduYXR1cmUsIERTRFRfU0lHKSB8fAotCSAgICBBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZS0+c2lnbmF0dXJlLCBQU0RUX1NJRykgfHwKLQkgICAgQUNQSV9DT01QQVJFX05BTUUodGFibGUtPnNpZ25hdHVyZSwgU1NEVF9TSUcpKSB7CisJaWYgKEFDUElfQ09NUEFSRV9OQU1FKHRhYmxlLT5zaWduYXR1cmUsIEFDUElfU0lHX0RTRFQpIHx8CisJICAgIEFDUElfQ09NUEFSRV9OQU1FKHRhYmxlLT5zaWduYXR1cmUsIEFDUElfU0lHX1BTRFQpIHx8CisJICAgIEFDUElfQ09NUEFSRV9OQU1FKHRhYmxlLT5zaWduYXR1cmUsIEFDUElfU0lHX1NTRFQpKSB7CiAJCXJldHVybiAoVFJVRSk7CiAJfQogCkBAIC00MTgsNyArNDkxLDcgQEAKIHZvaWQgYWNwaV91dF9zZXRfaW50ZWdlcl93aWR0aCh1OCByZXZpc2lvbikKIHsKIAotCWlmIChyZXZpc2lvbiA8PSAxKSB7CisJaWYgKHJldmlzaW9uIDwgMikgewogCiAJCS8qIDMyLWJpdCBjYXNlICovCiAKQEAgLTU4MiwyNiArNjU1LDI1IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9uYW1lIGFjcGlfdXRfcmVwYWlyX25hbWUoYWNwaV9uYW1lIG5hbWUpCithY3BpX25hbWUgYWNwaV91dF9yZXBhaXJfbmFtZShjaGFyICpuYW1lKQogewotCWNoYXIgKm5hbWVfcHRyID0gQUNQSV9DQVNUX1BUUihjaGFyLCAmbmFtZSk7Ci0JY2hhciBuZXdfbmFtZVtBQ1BJX05BTUVfU0laRV07CiAJYWNwaV9uYXRpdmVfdWludCBpOworCWNoYXIgbmV3X25hbWVbQUNQSV9OQU1FX1NJWkVdOwogCiAJZm9yIChpID0gMDsgaSA8IEFDUElfTkFNRV9TSVpFOyBpKyspIHsKLQkJbmV3X25hbWVbaV0gPSBuYW1lX3B0cltpXTsKKwkJbmV3X25hbWVbaV0gPSBuYW1lW2ldOwogCiAJCS8qCiAJCSAqIFJlcGxhY2UgYSBiYWQgY2hhcmFjdGVyIHdpdGggc29tZXRoaW5nIHByaW50YWJsZSwgeWV0IHRlY2huaWNhbGx5CiAJCSAqIHN0aWxsIGludmFsaWQuIFRoaXMgcHJldmVudHMgYW55IGNvbGxpc2lvbnMgd2l0aCBleGlzdGluZyAiZ29vZCIKIAkJICogbmFtZXMgaW4gdGhlIG5hbWVzcGFjZS4KIAkJICovCi0JCWlmICghYWNwaV91dF92YWxpZF9hY3BpX2NoYXIobmFtZV9wdHJbaV0sIGkpKSB7CisJCWlmICghYWNwaV91dF92YWxpZF9hY3BpX2NoYXIobmFtZVtpXSwgaSkpIHsKIAkJCW5ld19uYW1lW2ldID0gJyonOwogCQl9CiAJfQogCi0JcmV0dXJuICgqQUNQSV9DQVNUX1BUUih1MzIsIG5ld19uYW1lKSk7CisJcmV0dXJuICgqKHUzMiAqKSBuZXdfbmFtZSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC05OTYsOSArMTA2OCwxMyBAQAogewogCXZhX2xpc3QgYXJnczsKIAotCWFjcGlfb3NfcHJpbnRmKCJBQ1BJICglcy0lMDRkKTogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKKwkvKgorCSAqIFJlbW92ZWQgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyLCBhbmQgYWNwaWNhIHZlcnNpb24sIG5vdCBuZWVkZWQKKwkgKiBmb3IgaW5mbyBvdXRwdXQKKwkgKi8KKwlhY3BpX29zX3ByaW50ZigiQUNQSTogIik7CiAKIAl2YV9zdGFydChhcmdzLCBmb3JtYXQpOwogCWFjcGlfb3NfdnByaW50Zihmb3JtYXQsIGFyZ3MpOwotCWFjcGlfb3NfcHJpbnRmKCIgWyVYXVxuIiwgQUNQSV9DQV9WRVJTSU9OKTsKKwlhY3BpX29zX3ByaW50ZigiXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG11dGV4LmMKaW5kZXggMTgwZTczYy4uY2JhZDJlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG11dGV4LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG11dGV4LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCmluZGV4IGJhN2Q4YWMuLjQ2OTYxMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0cmVzcmMuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRyZXNyYy5jCmluZGV4IDVhMmRlOTIuLmU4ZmUxYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRyZXNyYy5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRyZXNyYy5jCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRzdGF0ZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHN0YXRlLmMKaW5kZXggZWFhMTNkMC4uZWRjYWFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHN0YXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHN0YXRlLmMKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYwppbmRleCAzNTM4ZjY5Li5kZTMyNzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYwpAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTY3LDYgKzY3LDcgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSk7CiAKKwlhY3BpX2dibF9zdGFydHVwX2ZsYWdzID0gQUNQSV9TVUJTWVNURU1fSU5JVElBTElaRTsKIAlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZSgpKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIE9TLURlcGVuZGVudCBsYXllciAqLwpAQCAtMTI3LDIwICsxMjgsNiBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2VuYWJsZV9zdWJzeXN0ZW0pOwogCi0JLyoKLQkgKiBXZSBtdXN0IGluaXRpYWxpemUgdGhlIGhhcmR3YXJlIGJlZm9yZSB3ZSBjYW4gZW5hYmxlIEFDUEkuCi0JICogVGhlIHZhbHVlcyBmcm9tIHRoZSBGQURUIGFyZSB2YWxpZGF0ZWQgaGVyZS4KLQkgKi8KLQlpZiAoIShmbGFncyAmIEFDUElfTk9fSEFSRFdBUkVfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBoYXJkd2FyZVxuIikpOwotCi0JCXN0YXR1cyA9IGFjcGlfaHdfaW5pdGlhbGl6ZSgpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfQotCiAJLyogRW5hYmxlIEFDUEkgbW9kZSAqLwogCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0FDUElfRU5BQkxFKSkgewpAQCAtMzk4LDcgKzM4NSw2IEBACiB7CiAJc3RydWN0IGFjcGlfc3lzdGVtX2luZm8gKmluZm9fcHRyOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1MzIgaTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfc3lzdGVtX2luZm8pOwogCkBAIC00MzEsOSArNDE3LDcgQEAKIAogCS8qIFRpbWVyIHJlc29sdXRpb24gLSAyNCBvciAzMiBiaXRzICAqLwogCi0JaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCWluZm9fcHRyLT50aW1lcl9yZXNvbHV0aW9uID0gMDsKLQl9IGVsc2UgaWYgKGFjcGlfZ2JsX0ZBRFQtPnRtcl92YWxfZXh0ID09IDApIHsKKwlpZiAoYWNwaV9nYmxfRkFEVC5mbGFncyAmIEFDUElfRkFEVF8zMkJJVF9USU1FUikgewogCQlpbmZvX3B0ci0+dGltZXJfcmVzb2x1dGlvbiA9IDI0OwogCX0gZWxzZSB7CiAJCWluZm9fcHRyLT50aW1lcl9yZXNvbHV0aW9uID0gMzI7CkBAIC00NDksMTMgKzQzMyw2IEBACiAJaW5mb19wdHItPmRlYnVnX2xheWVyID0gYWNwaV9kYmdfbGF5ZXI7CiAJaW5mb19wdHItPmRlYnVnX2xldmVsID0gYWNwaV9kYmdfbGV2ZWw7CiAKLQkvKiBDdXJyZW50IHN0YXR1cyBvZiB0aGUgQUNQSSB0YWJsZXMsIHBlciB0YWJsZSB0eXBlICovCi0KLQlpbmZvX3B0ci0+bnVtX3RhYmxlX3R5cGVzID0gQUNQSV9UQUJMRV9JRF9NQVggKyAxOwotCWZvciAoaSA9IDA7IGkgPCAoQUNQSV9UQUJMRV9JRF9NQVggKyAxKTsgaSsrKSB7Ci0JCWluZm9fcHRyLT50YWJsZV9pbmZvW2ldLmNvdW50ID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0uY291bnQ7Ci0JfQotCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwppbmRleCAzZDU0NjgwLi5lMGI5N2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdmlkZW8uYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogCisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KQEAgLTU2LDYgKzU3LDEyIEBACiAKICNkZWZpbmUgQUNQSV9WSURFT19IRUFEX0lOVkFMSUQJCSh+MHUgLSAxKQogI2RlZmluZSBBQ1BJX1ZJREVPX0hFQURfRU5ECQkofjB1KQorI2RlZmluZSBNQVhfTkFNRV9MRU4JMjAKKworI2RlZmluZSBBQ1BJX1ZJREVPX0RJU1BMQVlfQ1JUCTEKKyNkZWZpbmUgQUNQSV9WSURFT19ESVNQTEFZX1RWCTIKKyNkZWZpbmUgQUNQSV9WSURFT19ESVNQTEFZX0RWSQkzCisjZGVmaW5lIEFDUElfVklERU9fRElTUExBWV9MQ0QJNAogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfVklERU9fQ09NUE9ORU5UCiBBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3ZpZGVvIikKQEAgLTY2LDE2ICs3MywxNCBAQAogCiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwotc3RhdGljIGludCBhY3BpX3ZpZGVvX2J1c19tYXRjaChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKLQkJCQlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcik7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV92aWRlb19idXMgPSB7CiAJLm5hbWUgPSBBQ1BJX1ZJREVPX0RSSVZFUl9OQU1FLAogCS5jbGFzcyA9IEFDUElfVklERU9fQ0xBU1MsCisJLmlkcyA9IEFDUElfVklERU9fSElELAogCS5vcHMgPSB7CiAJCS5hZGQgPSBhY3BpX3ZpZGVvX2J1c19hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX3ZpZGVvX2J1c19yZW1vdmUsCi0JCS5tYXRjaCA9IGFjcGlfdmlkZW9fYnVzX21hdGNoLAogCQl9LAogfTsKIApAQCAtMTMzLDIwICsxMzgsMjEgQEAKIAl1OCBjcnQ6MTsKIAl1OCBsY2Q6MTsKIAl1OCB0dm91dDoxOworCXU4IGR2aToxOwogCXU4IGJpb3M6MTsKIAl1OCB1bmtub3duOjE7Ci0JdTggcmVzZXJ2ZWQ6MzsKKwl1OCByZXNlcnZlZDoyOwogfTsKIAogc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlX2NhcCB7CiAJdTggX0FEUjoxOwkJLypSZXR1cm4gdGhlIHVuaXF1ZSBJRCAqLwogCXU4IF9CQ0w6MTsJCS8qUXVlcnkgbGlzdCBvZiBicmlnaHRuZXNzIGNvbnRyb2wgbGV2ZWxzIHN1cHBvcnRlZCAqLwogCXU4IF9CQ006MTsJCS8qU2V0IHRoZSBicmlnaHRuZXNzIGxldmVsICovCisJdTggX0JRQzoxOwkJLyogR2V0IGN1cnJlbnQgYnJpZ2h0bmVzcyBsZXZlbCAqLwogCXU4IF9EREM6MTsJCS8qUmV0dXJuIHRoZSBFRElEIGZvciB0aGlzIGRldmljZSAqLwogCXU4IF9EQ1M6MTsJCS8qUmV0dXJuIHN0YXR1cyBvZiBvdXRwdXQgZGV2aWNlICovCiAJdTggX0RHUzoxOwkJLypRdWVyeSBncmFwaGljcyBzdGF0ZSAqLwogCXU4IF9EU1M6MTsJCS8qRGV2aWNlIHN0YXRlIHNldCAqLwotCXU4IF9yZXNlcnZlZDoxOwogfTsKIAogc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlX2JyaWdodG5lc3MgewpAQCAtMTYzLDYgKzE2OSw4IEBACiAJc3RydWN0IGFjcGlfdmlkZW9fYnVzICp2aWRlbzsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfYnJpZ2h0bmVzcyAqYnJpZ2h0bmVzczsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmFja2xpZ2h0OworCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyAqZGF0YTsKIH07CiAKIC8qIGJ1cyAqLwpAQCAtMjU3LDExICsyNjUsMzUgQEAKIAkJCQkgICBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX2VudW1lcmF0ZShzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvKTsKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19zd2l0Y2hfb3V0cHV0KHN0cnVjdCBhY3BpX3ZpZGVvX2J1cyAqdmlkZW8sIGludCBldmVudCk7CitzdGF0aWMgaW50IGFjcGlfdmlkZW9fZGV2aWNlX2xjZF9zZXRfbGV2ZWwoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICpkZXZpY2UsCisJCQlpbnQgbGV2ZWwpOworc3RhdGljIGludCBhY3BpX3ZpZGVvX2RldmljZV9sY2RfZ2V0X2xldmVsX2N1cnJlbnQoCisJCQlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwKKwkJCXVuc2lnbmVkIGxvbmcgKmxldmVsKTsKIHN0YXRpYyBpbnQgYWNwaV92aWRlb19nZXRfbmV4dF9sZXZlbChzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwKIAkJCQkgICAgIHUzMiBsZXZlbF9jdXJyZW50LCB1MzIgZXZlbnQpOwogc3RhdGljIHZvaWQgYWNwaV92aWRlb19zd2l0Y2hfYnJpZ2h0bmVzcyhzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRldmljZSwKIAkJCQkJIGludCBldmVudCk7CiAKKy8qYmFja2xpZ2h0IGRldmljZSBzeXNmcyBzdXBwb3J0Ki8KK3N0YXRpYyBpbnQgYWNwaV92aWRlb19nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJdW5zaWduZWQgbG9uZyBjdXJfbGV2ZWw7CisJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICp2ZCA9CisJCShzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKiljbGFzc19nZXRfZGV2ZGF0YSgmYmQtPmNsYXNzX2Rldik7CisJYWNwaV92aWRlb19kZXZpY2VfbGNkX2dldF9sZXZlbF9jdXJyZW50KHZkLCAmY3VyX2xldmVsKTsKKwlyZXR1cm4gKGludCkgY3VyX2xldmVsOworfQorCitzdGF0aWMgaW50IGFjcGlfdmlkZW9fc2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCWludCByZXF1ZXN0X2xldmVsID0gYmQtPnByb3BzLT5icmlnaHRuZXNzOworCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqdmQgPQorCQkoc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICopY2xhc3NfZ2V0X2RldmRhdGEoJmJkLT5jbGFzc19kZXYpOworCWFjcGlfdmlkZW9fZGV2aWNlX2xjZF9zZXRfbGV2ZWwodmQsIHJlcXVlc3RfbGV2ZWwpOworCXJldHVybiAwOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvIE1hbmFnZW1lbnQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00OTksNiArNTMxLDcgQEAKIAlhY3BpX2ludGVnZXIgc3RhdHVzOwogCWFjcGlfaGFuZGxlIGhfZHVtbXkxOwogCWludCBpOworCXUzMiBtYXhfbGV2ZWwgPSAwOwogCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmogPSBOVUxMOwogCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZV9icmlnaHRuZXNzICpiciA9IE5VTEw7CiAKQEAgLTUxNCw2ICs1NDcsOCBAQAogCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+ZGV2LT5oYW5kbGUsICJfQkNNIiwgJmhfZHVtbXkxKSkpIHsKIAkJZGV2aWNlLT5jYXAuX0JDTSA9IDE7CiAJfQorCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+ZGV2LT5oYW5kbGUsIl9CUUMiLCZoX2R1bW15MSkpKQorCQlkZXZpY2UtPmNhcC5fQlFDID0gMTsKIAlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmRldi0+aGFuZGxlLCAiX0REQyIsICZoX2R1bW15MSkpKSB7CiAJCWRldmljZS0+Y2FwLl9EREMgPSAxOwogCX0KQEAgLTU1MCw2ICs1ODUsOCBAQAogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJYnItPmxldmVsc1tjb3VudF0gPSAodTMyKSBvLT5pbnRlZ2VyLnZhbHVlOworCQkJCWlmIChici0+bGV2ZWxzW2NvdW50XSA+IG1heF9sZXZlbCkKKwkJCQkJbWF4X2xldmVsID0gYnItPmxldmVsc1tjb3VudF07CiAJCQkJY291bnQrKzsKIAkJCX0KIAkJICAgICAgb3V0OgpAQCAtNTY4LDYgKzYwNSwzNyBAQAogCiAJa2ZyZWUob2JqKTsKIAorCWlmIChkZXZpY2UtPmNhcC5fQkNMICYmIGRldmljZS0+Y2FwLl9CQ00gJiYgZGV2aWNlLT5jYXAuX0JRQyl7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlzdGF0aWMgaW50IGNvdW50ID0gMDsKKwkJY2hhciAqbmFtZTsKKwkJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzICphY3BpX3ZpZGVvX2RhdGE7CisKKwkJbmFtZSA9IGt6YWxsb2MoTUFYX05BTUVfTEVOLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuYW1lKQorCQkJcmV0dXJuOworCisJCWFjcGlfdmlkZW9fZGF0YSA9IGt6YWxsb2MoCisJCQlzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSwKKwkJCUdGUF9LRVJORUwpOworCQlpZiAoIWFjcGlfdmlkZW9fZGF0YSl7CisJCQlrZnJlZShuYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCQlhY3BpX3ZpZGVvX2RhdGEtPm93bmVyID0gVEhJU19NT0RVTEU7CisJCWFjcGlfdmlkZW9fZGF0YS0+Z2V0X2JyaWdodG5lc3MgPQorCQkJYWNwaV92aWRlb19nZXRfYnJpZ2h0bmVzczsKKwkJYWNwaV92aWRlb19kYXRhLT51cGRhdGVfc3RhdHVzID0KKwkJCWFjcGlfdmlkZW9fc2V0X2JyaWdodG5lc3M7CisJCXNwcmludGYobmFtZSwgImFjcGlfdmlkZW8lZCIsIGNvdW50KyspOworCQlkZXZpY2UtPmRhdGEgPSBhY3BpX3ZpZGVvX2RhdGE7CisJCWFjcGlfdmlkZW9fZGF0YS0+bWF4X2JyaWdodG5lc3MgPSBtYXhfbGV2ZWw7CisJCWFjcGlfdmlkZW9fZGV2aWNlX2xjZF9nZXRfbGV2ZWxfY3VycmVudChkZXZpY2UsICZ0bXApOworCQlhY3BpX3ZpZGVvX2RhdGEtPmJyaWdodG5lc3MgPSAoaW50KXRtcDsKKwkJZGV2aWNlLT5iYWNrbGlnaHQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKG5hbWUsCisJCQlOVUxMLCBkZXZpY2UsIGFjcGlfdmlkZW9fZGF0YSk7CisJCWtmcmVlKG5hbWUpOworCX0KIAlyZXR1cm47CiB9CiAKQEAgLTY2OCw2ICs3MzYsOCBAQAogCQlzZXFfcHJpbnRmKHNlcSwgIkxDRFxuIik7CiAJZWxzZSBpZiAoZGV2LT5mbGFncy50dm91dCkKIAkJc2VxX3ByaW50ZihzZXEsICJUVk9VVFxuIik7CisJZWxzZSBpZiAoZGV2LT5mbGFncy5kdmkpCisJCXNlcV9wcmludGYoc2VxLCAiRFZJXG4iKTsKIAllbHNlCiAJCXNlcV9wcmludGYoc2VxLCAiVU5LTk9XTlxuIik7CiAKQEAgLTEyNDIsNiArMTMxMiwxNiBAQAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogZGV2aWNlIGludGVyZmFjZSAqLworc3RhdGljIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZV9hdHRyaWIqCithY3BpX3ZpZGVvX2dldF9kZXZpY2VfYXR0cihzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvLCB1bnNpZ25lZCBsb25nIGRldmljZV9pZCkKK3sKKwlpbnQgY291bnQ7CisKKwlmb3IoY291bnQgPSAwOyBjb3VudCA8IHZpZGVvLT5hdHRhY2hlZF9jb3VudDsgY291bnQrKykKKwkJaWYoKHZpZGVvLT5hdHRhY2hlZF9hcnJheVtjb3VudF0udmFsdWUuaW50X3ZhbCAmIDB4ZmZmZikgPT0gZGV2aWNlX2lkKQorCQkJcmV0dXJuICYodmlkZW8tPmF0dGFjaGVkX2FycmF5W2NvdW50XS52YWx1ZS5hdHRyaWIpOworCXJldHVybiBOVUxMOworfQogCiBzdGF0aWMgaW50CiBhY3BpX3ZpZGVvX2J1c19nZXRfb25lX2RldmljZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKQEAgLTEyNTAsNyArMTMzMCw3IEBACiAJdW5zaWduZWQgbG9uZyBkZXZpY2VfaWQ7CiAJaW50IHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UgKmRhdGE7Ci0KKwlzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2VfYXR0cmliKiBhdHRyaWJ1dGU7CiAKIAlpZiAoIWRldmljZSB8fCAhdmlkZW8pCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTI3MSwyMCArMTM1MSwzMCBAQAogCQlkYXRhLT52aWRlbyA9IHZpZGVvOwogCQlkYXRhLT5kZXYgPSBkZXZpY2U7CiAKLQkJc3dpdGNoIChkZXZpY2VfaWQgJiAweGZmZmYpIHsKLQkJY2FzZSAweDAxMDA6Ci0JCQlkYXRhLT5mbGFncy5jcnQgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgwNDAwOgotCQkJZGF0YS0+ZmxhZ3MubGNkID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MDIwMDoKLQkJCWRhdGEtPmZsYWdzLnR2b3V0ID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgorCQlhdHRyaWJ1dGUgPSBhY3BpX3ZpZGVvX2dldF9kZXZpY2VfYXR0cih2aWRlbywgZGV2aWNlX2lkKTsKKworCQlpZigoYXR0cmlidXRlICE9IE5VTEwpICYmIGF0dHJpYnV0ZS0+ZGV2aWNlX2lkX3NjaGVtZSkgeworCQkJc3dpdGNoIChhdHRyaWJ1dGUtPmRpc3BsYXlfdHlwZSkgeworCQkJY2FzZSBBQ1BJX1ZJREVPX0RJU1BMQVlfQ1JUOgorCQkJCWRhdGEtPmZsYWdzLmNydCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDUElfVklERU9fRElTUExBWV9UVjoKKwkJCQlkYXRhLT5mbGFncy50dm91dCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDUElfVklERU9fRElTUExBWV9EVkk6CisJCQkJZGF0YS0+ZmxhZ3MuZHZpID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNQSV9WSURFT19ESVNQTEFZX0xDRDoKKwkJCQlkYXRhLT5mbGFncy5sY2QgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkYXRhLT5mbGFncy51bmtub3duID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmKGF0dHJpYnV0ZS0+Ymlvc19jYW5fZGV0ZWN0KQorCQkJCWRhdGEtPmZsYWdzLmJpb3MgPSAxOworCQl9IGVsc2UKIAkJCWRhdGEtPmZsYWdzLnVua25vd24gPSAxOwotCQkJYnJlYWs7Ci0JCX0KIAogCQlhY3BpX3ZpZGVvX2RldmljZV9iaW5kKHZpZGVvLCBkYXRhKTsKIAkJYWNwaV92aWRlb19kZXZpY2VfZmluZF9jYXAoZGF0YSk7CkBAIC0xNTg4LDcgKzE2NzgsMTAgQEAKIAlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihkZXZpY2UtPmRldi0+aGFuZGxlLAogCQkJCQkgICAgQUNQSV9ERVZJQ0VfTk9USUZZLAogCQkJCQkgICAgYWNwaV92aWRlb19kZXZpY2Vfbm90aWZ5KTsKLQorCWlmIChkZXZpY2UtPmJhY2tsaWdodCl7CisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihkZXZpY2UtPmJhY2tsaWdodCk7CisJCWtmcmVlKGRldmljZS0+ZGF0YSk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xNzkwLDM5ICsxODgzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotYWNwaV92aWRlb19idXNfbWF0Y2goc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKQotewotCWFjcGlfaGFuZGxlIGhfZHVtbXkxOwotCWFjcGlfaGFuZGxlIGhfZHVtbXkyOwotCWFjcGlfaGFuZGxlIGhfZHVtbXkzOwotCi0KLQlpZiAoIWRldmljZSB8fCAhZHJpdmVyKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFNpbmNlIHRoZXJlIGlzIG5vIEhJRCwgQ0lEIGZvciBBQ1BJIFZpZGVvIGRyaXZlcnMsIHdlIGhhdmUKLQkgKiB0byBjaGVjayB3ZWxsIGtub3duIHJlcXVpcmVkIG5vZGVzIGZvciBlYWNoIGZlYXR1cmUgd2Ugc3VwcG9ydC4KLQkgKi8KLQotCS8qIERvZXMgdGhpcyBkZXZpY2UgYWJsZSB0byBzdXBwb3J0IHZpZGVvIHN3aXRjaGluZyA/ICovCi0JaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfRE9EIiwgJmhfZHVtbXkxKSkgJiYKLQkgICAgQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9ET1MiLCAmaF9kdW1teTIpKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBEb2VzIHRoaXMgZGV2aWNlIGFibGUgdG8gcmV0cmlldmUgYSB2aWRlbyBST00gPyAqLwotCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX1JPTSIsICZoX2R1bW15MSkpKQotCQlyZXR1cm4gMDsKLQotCS8qIERvZXMgdGhpcyBkZXZpY2UgYWJsZSB0byBjb25maWd1cmUgd2hpY2ggdmlkZW8gaGVhZCB0byBiZSBQT1NUZWQgPyAqLwotCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGRldmljZS0+aGFuZGxlLCAiX1ZQTyIsICZoX2R1bW15MSkpICYmCi0JICAgIEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoZGV2aWNlLT5oYW5kbGUsICJfR1BEIiwgJmhfZHVtbXkyKSkgJiYKLQkgICAgQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShkZXZpY2UtPmhhbmRsZSwgIl9TUEQiLCAmaF9kdW1teTMpKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQogc3RhdGljIGludCBfX2luaXQgYWNwaV92aWRlb19pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCmluZGV4IDhiZjJjYTIuLjk2ZGVmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIAogCWNsYXNzX25hbWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghY2xhc3NfbmFtZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHVybiBOVUxMOwogCiAJc3RyY3B5KGNsYXNzX25hbWUsIG5hbWUpOwogCXN0cmNhdChjbGFzc19uYW1lLCAiOiIpOwpAQCAtNDExLDggKzQxMSwxMSBAQAogCQlyZXR1cm4gMDsKIAogCWNsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoY2xhc3NfZGV2LT5jbGFzcy0+bmFtZSwgJmNsYXNzX2Rldi0+a29iaik7Ci0JZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmY2xhc3NfZGV2LT5kZXYtPmtvYmosICZjbGFzc19kZXYtPmtvYmosCi0JCQkJICBjbGFzc19uYW1lKTsKKwlpZiAoY2xhc3NfbmFtZSkKKwkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmY2xhc3NfZGV2LT5kZXYtPmtvYmosCisJCQkJCSAgJmNsYXNzX2Rldi0+a29iaiwgY2xhc3NfbmFtZSk7CisJZWxzZQorCQllcnJvciA9IC1FTk9NRU07CiAJa2ZyZWUoY2xhc3NfbmFtZSk7CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNDI1LDcgKzQyOCw4IEBACiAJCXJldHVybjsKIAogCWNsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoY2xhc3NfZGV2LT5jbGFzcy0+bmFtZSwgJmNsYXNzX2Rldi0+a29iaik7Ci0Jc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+ZGV2LT5rb2JqLCBjbGFzc19uYW1lKTsKKwlpZiAoY2xhc3NfbmFtZSkKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+ZGV2LT5rb2JqLCBjbGFzc19uYW1lKTsKIAlrZnJlZShjbGFzc19uYW1lKTsKIH0KICNlbHNlCkBAIC04NjMsOSArODY3LDEyIEBACiAJaWYgKGNsYXNzX2Rldi0+ZGV2KSB7CiAJCW5ld19jbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGNsYXNzX2Rldi0+Y2xhc3MtPm5hbWUsCiAJCQkJCQkgJmNsYXNzX2Rldi0+a29iaik7Ci0JCXN5c2ZzX2NyZWF0ZV9saW5rKCZjbGFzc19kZXYtPmRldi0+a29iaiwgJmNsYXNzX2Rldi0+a29iaiwKLQkJCQkgIG5ld19jbGFzc19uYW1lKTsKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNsYXNzX2Rldi0+ZGV2LT5rb2JqLCBvbGRfY2xhc3NfbmFtZSk7CisJCWlmIChuZXdfY2xhc3NfbmFtZSkKKwkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZjbGFzc19kZXYtPmRldi0+a29iaiwKKwkJCQkJICAmY2xhc3NfZGV2LT5rb2JqLCBuZXdfY2xhc3NfbmFtZSk7CisJCWlmIChvbGRfY2xhc3NfbmFtZSkKKwkJCXN5c2ZzX3JlbW92ZV9saW5rKCZjbGFzc19kZXYtPmRldi0+a29iaiwKKwkJCQkJCW9sZF9jbGFzc19uYW1lKTsKIAl9CiAjZW5kaWYKIAljbGFzc19kZXZpY2VfcHV0KGNsYXNzX2Rldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCA2N2I3OWE3Li5lMTM2MTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTk1LDYgKzk1LDggQEAKIAogCWlmIChkZXYtPnJlbGVhc2UpCiAJCWRldi0+cmVsZWFzZShkZXYpOworCWVsc2UgaWYgKGRldi0+dHlwZSAmJiBkZXYtPnR5cGUtPnJlbGVhc2UpCisJCWRldi0+dHlwZS0+cmVsZWFzZShkZXYpOwogCWVsc2UgaWYgKGRldi0+Y2xhc3MgJiYgZGV2LT5jbGFzcy0+ZGV2X3JlbGVhc2UpCiAJCWRldi0+Y2xhc3MtPmRldl9yZWxlYXNlKGRldik7CiAJZWxzZSB7CkBAIC0xNTQsMjUgKzE1Niw0NyBAQAogCQkJICAgICAgICJNSU5PUj0ldSIsIE1JTk9SKGRldi0+ZGV2dCkpOwogCX0KIAotI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECi0JLyogYWRkIGJ1cyBuYW1lIChzYW1lIGFzIFNVQlNZU1RFTSwgZGVwcmVjYXRlZCkgKi8KLQlpZiAoZGV2LT5idXMpCi0JCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKLQkJCSAgICAgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAotCQkJICAgICAgICJQSFlTREVWQlVTPSVzIiwgZGV2LT5idXMtPm5hbWUpOwotI2VuZGlmCi0KLQkvKiBhZGQgZHJpdmVyIG5hbWUgKFBIWVNERVYqIHZhbHVlcyBhcmUgZGVwcmVjYXRlZCkqLwotCWlmIChkZXYtPmRyaXZlcikgeworCWlmIChkZXYtPmRyaXZlcikKIAkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAogCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCiAJCQkgICAgICAgIkRSSVZFUj0lcyIsIGRldi0+ZHJpdmVyLT5uYW1lKTsKKwogI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECisJaWYgKGRldi0+Y2xhc3MpIHsKKwkJc3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CisKKwkJLyogZmluZCBmaXJzdCBidXMgZGV2aWNlIGluIHBhcmVudCBjaGFpbiAqLworCQl3aGlsZSAocGFyZW50ICYmICFwYXJlbnQtPmJ1cykKKwkJCXBhcmVudCA9IHBhcmVudC0+cGFyZW50OworCQlpZiAocGFyZW50ICYmIHBhcmVudC0+YnVzKSB7CisJCQljb25zdCBjaGFyICpwYXRoOworCisJCQlwYXRoID0ga29iamVjdF9nZXRfcGF0aCgmcGFyZW50LT5rb2JqLCBHRlBfS0VSTkVMKTsKKwkJCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQkgICAgICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCQkgICAgICAgIlBIWVNERVZQQVRIPSVzIiwgcGF0aCk7CisJCQlrZnJlZShwYXRoKTsKKworCQkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCQkJCSAgICAgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkJCSAgICAgICAiUEhZU0RFVkJVUz0lcyIsIHBhcmVudC0+YnVzLT5uYW1lKTsKKworCQkJaWYgKHBhcmVudC0+ZHJpdmVyKQorCQkJCWFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkJCSAgICAgICAiUEhZU0RFVkRSSVZFUj0lcyIsIHBhcmVudC0+ZHJpdmVyLT5uYW1lKTsKKwkJfQorCX0gZWxzZSBpZiAoZGV2LT5idXMpIHsKIAkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAogCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCi0JCQkgICAgICAgIlBIWVNERVZEUklWRVI9JXMiLCBkZXYtPmRyaXZlci0+bmFtZSk7Ci0jZW5kaWYKKwkJCSAgICAgICAiUEhZU0RFVkJVUz0lcyIsIGRldi0+YnVzLT5uYW1lKTsKKworCQlpZiAoZGV2LT5kcml2ZXIpCisJCQlhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkJICAgICAgICJQSFlTREVWRFJJVkVSPSVzIiwgZGV2LT5kcml2ZXItPm5hbWUpOwogCX0KKyNlbmRpZgogCiAJLyogdGVybWluYXRlLCBzZXQgdG8gbmV4dCBmcmVlIHNsb3QsIHNocmluayBhdmFpbGFibGUgc3BhY2UgKi8KIAllbnZwW2ldID0gTlVMTDsKQEAgLTE4NCwxOSArMjA4LDI1IEBACiAJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT51ZXZlbnQpIHsKIAkJLyogaGF2ZSB0aGUgYnVzIHNwZWNpZmljIGZ1bmN0aW9uIGFkZCBpdHMgc3R1ZmYgKi8KIAkJcmV0dmFsID0gZGV2LT5idXMtPnVldmVudChkZXYsIGVudnAsIG51bV9lbnZwLCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKLQkJCWlmIChyZXR2YWwpIHsKLQkJCXByX2RlYnVnICgiJXMgLSB1ZXZlbnQoKSByZXR1cm5lZCAlZFxuIiwKKwkJaWYgKHJldHZhbCkKKwkJCXByX2RlYnVnICgiJXM6IGJ1cyB1ZXZlbnQoKSByZXR1cm5lZCAlZFxuIiwKIAkJCQkgIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKLQkJfQogCX0KIAogCWlmIChkZXYtPmNsYXNzICYmIGRldi0+Y2xhc3MtPmRldl91ZXZlbnQpIHsKIAkJLyogaGF2ZSB0aGUgY2xhc3Mgc3BlY2lmaWMgZnVuY3Rpb24gYWRkIGl0cyBzdHVmZiAqLwogCQlyZXR2YWwgPSBkZXYtPmNsYXNzLT5kZXZfdWV2ZW50KGRldiwgZW52cCwgbnVtX2VudnAsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOwotCQkJaWYgKHJldHZhbCkgewotCQkJCXByX2RlYnVnKCIlcyAtIGRldl91ZXZlbnQoKSByZXR1cm5lZCAlZFxuIiwKLQkJCQkJIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKLQkJfQorCQlpZiAocmV0dmFsKQorCQkJcHJfZGVidWcoIiVzOiBjbGFzcyB1ZXZlbnQoKSByZXR1cm5lZCAlZFxuIiwKKwkJCQkgX19GVU5DVElPTl9fLCByZXR2YWwpOworCX0KKworCWlmIChkZXYtPnR5cGUgJiYgZGV2LT50eXBlLT51ZXZlbnQpIHsKKwkJLyogaGF2ZSB0aGUgZGV2aWNlIHR5cGUgc3BlY2lmaWMgZnVjdGlvbiBhZGQgaXRzIHN0dWZmICovCisJCXJldHZhbCA9IGRldi0+dHlwZS0+dWV2ZW50KGRldiwgZW52cCwgbnVtX2VudnAsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCQlpZiAocmV0dmFsKQorCQkJcHJfZGVidWcoIiVzOiBkZXZfdHlwZSB1ZXZlbnQoKSByZXR1cm5lZCAlZFxuIiwKKwkJCQkgX19GVU5DVElPTl9fLCByZXR2YWwpOwogCX0KIAogCXJldHVybiByZXR2YWw7CkBAIC0yNDcsMzcgKzI3Nyw1MCBAQAogc3RhdGljIGludCBkZXZpY2VfYWRkX2F0dHJzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgY2xhc3MgKmNsYXNzID0gZGV2LT5jbGFzczsKKwlzdHJ1Y3QgZGV2aWNlX3R5cGUgKnR5cGUgPSBkZXYtPnR5cGU7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgaTsKIAotCWlmICghY2xhc3MpCi0JCXJldHVybiAwOwotCi0JaWYgKGNsYXNzLT5kZXZfYXR0cnMpIHsKKwlpZiAoY2xhc3MgJiYgY2xhc3MtPmRldl9hdHRycykgewogCQlmb3IgKGkgPSAwOyBhdHRyX25hbWUoY2xhc3MtPmRldl9hdHRyc1tpXSk7IGkrKykgewogCQkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmY2xhc3MtPmRldl9hdHRyc1tpXSk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJYnJlYWs7CiAJCX0KKwkJaWYgKGVycm9yKQorCQkJd2hpbGUgKC0taSA+PSAwKQorCQkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZjbGFzcy0+ZGV2X2F0dHJzW2ldKTsKIAl9Ci0JaWYgKGVycm9yKQotCQl3aGlsZSAoLS1pID49IDApCi0JCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmY2xhc3MtPmRldl9hdHRyc1tpXSk7CisKKwlpZiAodHlwZSAmJiB0eXBlLT5hdHRycykgeworCQlmb3IgKGkgPSAwOyBhdHRyX25hbWUodHlwZS0+YXR0cnNbaV0pOyBpKyspIHsKKwkJCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnR5cGUtPmF0dHJzW2ldKTsKKwkJCWlmIChlcnJvcikKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyb3IpCisJCQl3aGlsZSAoLS1pID49IDApCisJCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnR5cGUtPmF0dHJzW2ldKTsKKwl9CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyB2b2lkIGRldmljZV9yZW1vdmVfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSBkZXYtPmNsYXNzOworCXN0cnVjdCBkZXZpY2VfdHlwZSAqdHlwZSA9IGRldi0+dHlwZTsKIAlpbnQgaTsKIAotCWlmICghY2xhc3MpCi0JCXJldHVybjsKLQotCWlmIChjbGFzcy0+ZGV2X2F0dHJzKSB7CisJaWYgKGNsYXNzICYmIGNsYXNzLT5kZXZfYXR0cnMpIHsKIAkJZm9yIChpID0gMDsgYXR0cl9uYW1lKGNsYXNzLT5kZXZfYXR0cnNbaV0pOyBpKyspCiAJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmY2xhc3MtPmRldl9hdHRyc1tpXSk7CiAJfQorCisJaWYgKHR5cGUgJiYgdHlwZS0+YXR0cnMpIHsKKwkJZm9yIChpID0gMDsgYXR0cl9uYW1lKHR5cGUtPmF0dHJzW2ldKTsgaSsrKQorCQkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJnR5cGUtPmF0dHJzW2ldKTsKKwl9CiB9CiAKIApAQCAtMzkwLDIyICs0MzMsMjMgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TWVNGU19ERVBSRUNBVEVECi1zdGF0aWMgaW50IHNldHVwX3BhcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqIGdldF9kZXZpY2VfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCiB7CiAJLyogU2V0IHRoZSBwYXJlbnQgdG8gdGhlIGNsYXNzLCBub3QgdGhlIHBhcmVudCBkZXZpY2UgKi8KIAkvKiB0aGlzIGtlZXBzIHN5c2ZzIGZyb20gaGF2aW5nIGEgc3ltbGluayB0byBtYWtlIG9sZCB1ZGV2cyBoYXBweSAqLwogCWlmIChkZXYtPmNsYXNzKQotCQlkZXYtPmtvYmoucGFyZW50ID0gJmRldi0+Y2xhc3MtPnN1YnN5cy5rc2V0LmtvYmo7CisJCXJldHVybiAmZGV2LT5jbGFzcy0+c3Vic3lzLmtzZXQua29iajsKIAllbHNlIGlmIChwYXJlbnQpCi0JCWRldi0+a29iai5wYXJlbnQgPSAmcGFyZW50LT5rb2JqOworCQlyZXR1cm4gJnBhcmVudC0+a29iajsKIAotCXJldHVybiAwOworCXJldHVybiBOVUxMOwogfQogI2Vsc2UKLXN0YXRpYyBpbnQgdmlydHVhbF9kZXZpY2VfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqIHZpcnR1YWxfZGV2aWNlX3BhcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaWYgKCFkZXYtPmNsYXNzKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CiAKIAlpZiAoIWRldi0+Y2xhc3MtPnZpcnR1YWxfZGlyKSB7CiAJCXN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqdmlydHVhbF9kaXIgPSBOVUxMOwpAQCAtNDE1LDI1ICs0NTksMzEgQEAKIAkJZGV2LT5jbGFzcy0+dmlydHVhbF9kaXIgPSBrb2JqZWN0X2FkZF9kaXIodmlydHVhbF9kaXIsIGRldi0+Y2xhc3MtPm5hbWUpOwogCX0KIAotCWRldi0+a29iai5wYXJlbnQgPSBkZXYtPmNsYXNzLT52aXJ0dWFsX2RpcjsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZGV2LT5jbGFzcy0+dmlydHVhbF9kaXI7CiB9CiAKLXN0YXRpYyBpbnQgc2V0dXBfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqcGFyZW50KQorc3RhdGljIHN0cnVjdCBrb2JqZWN0ICogZ2V0X2RldmljZV9wYXJlbnQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKIHsKLQlpbnQgZXJyb3I7Ci0KIAkvKiBpZiB0aGlzIGlzIGEgY2xhc3MgZGV2aWNlLCBhbmQgaGFzIG5vIHBhcmVudCwgY3JlYXRlIG9uZSAqLwogCWlmICgoZGV2LT5jbGFzcykgJiYgKHBhcmVudCA9PSBOVUxMKSkgewotCQllcnJvciA9IHZpcnR1YWxfZGV2aWNlX3BhcmVudChkZXYpOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7CisJCXJldHVybiB2aXJ0dWFsX2RldmljZV9wYXJlbnQoZGV2KTsKIAl9IGVsc2UgaWYgKHBhcmVudCkKLQkJZGV2LT5rb2JqLnBhcmVudCA9ICZwYXJlbnQtPmtvYmo7CisJCXJldHVybiAmcGFyZW50LT5rb2JqOworCXJldHVybiBOVUxMOworfQogCisjZW5kaWYKK3N0YXRpYyBpbnQgc2V0dXBfcGFyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqcGFyZW50KQoreworCXN0cnVjdCBrb2JqZWN0ICprb2JqOworCWtvYmogPSBnZXRfZGV2aWNlX3BhcmVudChkZXYsIHBhcmVudCk7CisJaWYgKElTX0VSUihrb2JqKSkKKwkJcmV0dXJuIFBUUl9FUlIoa29iaik7CisJaWYgKGtvYmopCisJCWRldi0+a29iai5wYXJlbnQgPSBrb2JqOwogCXJldHVybiAwOwogfQotI2VuZGlmCiAKIC8qKgogICoJZGV2aWNlX2FkZCAtIGFkZCBkZXZpY2UgdG8gZGV2aWNlIGhpZXJhcmNoeS4KQEAgLTUyMCw5ICs1NzAsMTMgQEAKIAkJCQkJICAmZGV2LT5rb2JqLCBkZXYtPmJ1c19pZCk7CiAjaWZkZWYgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQKIAkJaWYgKHBhcmVudCkgewotCQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJmRldi0+cGFyZW50LT5rb2JqLCAiZGV2aWNlIik7Ci0JCQljbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGRldi0+Y2xhc3MtPm5hbWUsICZkZXYtPmtvYmopOwotCQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+cGFyZW50LT5rb2JqLCAmZGV2LT5rb2JqLCBjbGFzc19uYW1lKTsKKwkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZkZXYtPnBhcmVudC0+a29iaiwKKwkJCQkJCQkiZGV2aWNlIik7CisJCQljbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGRldi0+Y2xhc3MtPm5hbWUsCisJCQkJCQkJJmRldi0+a29iaik7CisJCQlpZiAoY2xhc3NfbmFtZSkKKwkJCQlzeXNmc19jcmVhdGVfbGluaygmZGV2LT5wYXJlbnQtPmtvYmosCisJCQkJCQkgICZkZXYtPmtvYmosIGNsYXNzX25hbWUpOwogCQl9CiAjZW5kaWYKIAl9CkBAIC01MzUsNyArNTg5LDggQEAKIAkJZ290byBQTUVycm9yOwogCWlmICgoZXJyb3IgPSBidXNfYWRkX2RldmljZShkZXYpKSkKIAkJZ290byBCdXNFcnJvcjsKLQlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX0FERCk7CisJaWYgKCFkZXYtPnVldmVudF9zdXBwcmVzcykKKwkJa29iamVjdF91ZXZlbnQoJmRldi0+a29iaiwgS09CSl9BREQpOwogCWlmICgoZXJyb3IgPSBidXNfYXR0YWNoX2RldmljZShkZXYpKSkKIAkJZ290byBBdHRhY2hFcnJvcjsKIAlpZiAocGFyZW50KQpAQCAtNjY1LDcgKzcyMCw5IEBACiAJCWlmIChwYXJlbnQpIHsKIAkJCWNoYXIgKmNsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoZGV2LT5jbGFzcy0+bmFtZSwKIAkJCQkJCQkgICAmZGV2LT5rb2JqKTsKLQkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPnBhcmVudC0+a29iaiwgY2xhc3NfbmFtZSk7CisJCQlpZiAoY2xhc3NfbmFtZSkKKwkJCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5wYXJlbnQtPmtvYmosCisJCQkJCQkgIGNsYXNzX25hbWUpOwogCQkJa2ZyZWUoY2xhc3NfbmFtZSk7CiAJCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiZGV2aWNlIik7CiAJCX0KQEAgLTk2OCwyMCArMTAyNSwyNSBAQAogCiAJY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShkZXYtPmNsYXNzLT5uYW1lLCAmZGV2LT5rb2JqKTsKIAlpZiAoIWNsYXNzX25hbWUpIHsKLQkJZXJyb3IgPSBQVFJfRVJSKGNsYXNzX25hbWUpOwotCQljbGFzc19uYW1lID0gTlVMTDsKKwkJZXJyb3IgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKG9sZF9wYXJlbnQpIHsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRldmljZSIpOwogCQlzeXNmc19yZW1vdmVfbGluaygmb2xkX3BhcmVudC0+a29iaiwgY2xhc3NfbmFtZSk7CiAJfQotCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJm5ld19wYXJlbnQtPmtvYmosICJkZXZpY2UiKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJm5ld19wYXJlbnQtPmtvYmosICZkZXYtPmtvYmosIGNsYXNzX25hbWUpOwotCWlmIChlcnJvcikKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRldmljZSIpOworCWlmIChuZXdfcGFyZW50KSB7CisJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJm5ld19wYXJlbnQtPmtvYmosCisJCQkJCSAgImRldmljZSIpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmbmV3X3BhcmVudC0+a29iaiwgJmRldi0+a29iaiwKKwkJCQkJICBjbGFzc19uYW1lKTsKKwkJaWYgKGVycm9yKQorCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgImRldmljZSIpOworCX0KKwllbHNlCisJCWVycm9yID0gMDsKIG91dDoKIAlrZnJlZShjbGFzc19uYW1lKTsKIAlyZXR1cm4gZXJyb3I7CkBAIC05OTMsMjkgKzEwNTUsMjggQEAKIC8qKgogICogZGV2aWNlX21vdmUgLSBtb3ZlcyBhIGRldmljZSB0byBhIG5ldyBwYXJlbnQKICAqIEBkZXY6IHRoZSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgZGV2aWNlIHRvIGJlIG1vdmVkCi0gKiBAbmV3X3BhcmVudDogdGhlIG5ldyBwYXJlbnQgb2YgdGhlIGRldmljZQorICogQG5ld19wYXJlbnQ6IHRoZSBuZXcgcGFyZW50IG9mIHRoZSBkZXZpY2UgKGNhbiBieSBOVUxMKQogICovCiBpbnQgZGV2aWNlX21vdmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpuZXdfcGFyZW50KQogewogCWludCBlcnJvcjsKIAlzdHJ1Y3QgZGV2aWNlICpvbGRfcGFyZW50OworCXN0cnVjdCBrb2JqZWN0ICpuZXdfcGFyZW50X2tvYmo7CiAKIAlkZXYgPSBnZXRfZGV2aWNlKGRldik7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFkZXZpY2VfaXNfcmVnaXN0ZXJlZChkZXYpKSB7Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQogCW5ld19wYXJlbnQgPSBnZXRfZGV2aWNlKG5ld19wYXJlbnQpOwotCWlmICghbmV3X3BhcmVudCkgewotCQllcnJvciA9IC1FSU5WQUw7CisJbmV3X3BhcmVudF9rb2JqID0gZ2V0X2RldmljZV9wYXJlbnQgKGRldiwgbmV3X3BhcmVudCk7CisJaWYgKElTX0VSUihuZXdfcGFyZW50X2tvYmopKSB7CisJCWVycm9yID0gUFRSX0VSUihuZXdfcGFyZW50X2tvYmopOworCQlwdXRfZGV2aWNlKG5ld19wYXJlbnQpOwogCQlnb3RvIG91dDsKIAl9CiAJcHJfZGVidWcoIkRFVklDRTogbW92aW5nICclcycgdG8gJyVzJ1xuIiwgZGV2LT5idXNfaWQsCi0JCW5ld19wYXJlbnQtPmJ1c19pZCk7Ci0JZXJyb3IgPSBrb2JqZWN0X21vdmUoJmRldi0+a29iaiwgJm5ld19wYXJlbnQtPmtvYmopOworCQkgbmV3X3BhcmVudCA/IG5ld19wYXJlbnQtPmJ1c19pZCA6ICI8TlVMTD4iKTsKKwllcnJvciA9IGtvYmplY3RfbW92ZSgmZGV2LT5rb2JqLCBuZXdfcGFyZW50X2tvYmopOwogCWlmIChlcnJvcikgewogCQlwdXRfZGV2aWNlKG5ld19wYXJlbnQpOwogCQlnb3RvIG91dDsKQEAgLTEwMjQsNyArMTA4NSw4IEBACiAJZGV2LT5wYXJlbnQgPSBuZXdfcGFyZW50OwogCWlmIChvbGRfcGFyZW50KQogCQlrbGlzdF9yZW1vdmUoJmRldi0+a25vZGVfcGFyZW50KTsKLQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9wYXJlbnQsICZuZXdfcGFyZW50LT5rbGlzdF9jaGlsZHJlbik7CisJaWYgKG5ld19wYXJlbnQpCisJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX3BhcmVudCwgJm5ld19wYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKIAlpZiAoIWRldi0+Y2xhc3MpCiAJCWdvdG8gb3V0X3B1dDsKIAllcnJvciA9IGRldmljZV9tb3ZlX2NsYXNzX2xpbmtzKGRldiwgb2xkX3BhcmVudCwgbmV3X3BhcmVudCk7CkBAIC0xMDMyLDcgKzEwOTQsOCBAQAogCQkvKiBXZSBpZ25vcmUgZXJyb3JzIG9uIGNsZWFudXAgc2luY2Ugd2UncmUgaG9zZWQgYW55d2F5Li4uICovCiAJCWRldmljZV9tb3ZlX2NsYXNzX2xpbmtzKGRldiwgbmV3X3BhcmVudCwgb2xkX3BhcmVudCk7CiAJCWlmICgha29iamVjdF9tb3ZlKCZkZXYtPmtvYmosICZvbGRfcGFyZW50LT5rb2JqKSkgewotCQkJa2xpc3RfcmVtb3ZlKCZkZXYtPmtub2RlX3BhcmVudCk7CisJCQlpZiAobmV3X3BhcmVudCkKKwkJCQlrbGlzdF9yZW1vdmUoJmRldi0+a25vZGVfcGFyZW50KTsKIAkJCWlmIChvbGRfcGFyZW50KQogCQkJCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX3BhcmVudCwKIAkJCQkJICAgICAgICZvbGRfcGFyZW50LT5rbGlzdF9jaGlsZHJlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDUxMGU3ODguLmI1YmYyNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC04Niw4ICs4NiwxMiBAQAogICovCiBpbnQgZGV2aWNlX2JpbmRfZHJpdmVyKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlkcml2ZXJfYm91bmQoZGV2KTsKLQlyZXR1cm4gZHJpdmVyX3N5c2ZzX2FkZChkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBkcml2ZXJfc3lzZnNfYWRkKGRldik7CisJaWYgKCFyZXQpCisJCWRyaXZlcl9ib3VuZChkZXYpOworCXJldHVybiByZXQ7CiB9CiAKIHN0cnVjdCBzdHVwaWRfdGhyZWFkX3N0cnVjdHVyZSB7CkBAIC0xMzYsMTggKzE0MCwxNyBAQAogCWRyaXZlcl9zeXNmc19yZW1vdmUoZGV2KTsKIAlkZXYtPmRyaXZlciA9IE5VTEw7CiAKLQlpZiAocmV0ID09IC1FTk9ERVYgfHwgcmV0ID09IC1FTlhJTykgewotCQkvKiBEcml2ZXIgbWF0Y2hlZCwgYnV0IGRpZG4ndCBzdXBwb3J0IGRldmljZQotCQkgKiBvciBkZXZpY2Ugbm90IGZvdW5kLgotCQkgKiBOb3QgYW4gZXJyb3I7IGtlZXAgZ29pbmcuCi0JCSAqLwotCQlyZXQgPSAwOwotCX0gZWxzZSB7CisJaWYgKHJldCAhPSAtRU5PREVWICYmIHJldCAhPSAtRU5YSU8pIHsKIAkJLyogZHJpdmVyIG1hdGNoZWQgYnV0IHRoZSBwcm9iZSBmYWlsZWQgKi8KIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgIiVzOiBwcm9iZSBvZiAlcyBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwKIAkJICAgICAgIGRydi0+bmFtZSwgZGV2LT5idXNfaWQsIHJldCk7CiAJfQorCS8qCisJICogSWdub3JlIGVycm9ycyByZXR1cm5lZCBieSAtPnByb2JlIHNvIHRoYXQgdGhlIG5leHQgZHJpdmVyIGNhbiB0cnkKKwkgKiBpdHMgbHVjay4KKwkgKi8KKwlyZXQgPSAwOwogZG9uZToKIAlrZnJlZShkYXRhKTsKIAlhdG9taWNfZGVjKCZwcm9iZV9jb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCmluZGV4IDY0NTU4ZjQuLmMwYTk3OWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYworKysgYi9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYwpAQCAtMzUsNyArMzUsNyBAQAogCUZXX1NUQVRVU19SRUFEWV9OT0hPVFBMVUcsCiB9OwogCi1zdGF0aWMgaW50IGxvYWRpbmdfdGltZW91dCA9IDEwOwkvKiBJbiBzZWNvbmRzICovCitzdGF0aWMgaW50IGxvYWRpbmdfdGltZW91dCA9IDYwOwkvKiBJbiBzZWNvbmRzICovCiAKIC8qIGZ3X2xvY2sgY291bGQgYmUgbW92ZWQgdG8gJ3N0cnVjdCBmaXJtd2FyZV9wcml2JyBidXQgc2luY2UgaXQgaXMganVzdAogICogZ3VhcmRpbmcgZm9yIGNvcm5lciBjYXNlcyBhIGdsb2JhbCBsb2NrIHNob3VsZCBiZSBPSyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwppbmRleCBmOWM5MDNiLi4zMDQ4MGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwpAQCAtNjExLDggKzYxMSwxNSBAQAogCiBpbnQgX19pbml0IHBsYXRmb3JtX2J1c19pbml0KHZvaWQpCiB7Ci0JZGV2aWNlX3JlZ2lzdGVyKCZwbGF0Zm9ybV9idXMpOwotCXJldHVybiBidXNfcmVnaXN0ZXIoJnBsYXRmb3JtX2J1c190eXBlKTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRldmljZV9yZWdpc3RlcigmcGxhdGZvcm1fYnVzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9ICBidXNfcmVnaXN0ZXIoJnBsYXRmb3JtX2J1c190eXBlKTsKKwlpZiAoZXJyb3IpCisJCWRldmljZV91bnJlZ2lzdGVyKCZwbGF0Zm9ybV9idXMpOworCXJldHVybiBlcnJvcjsKIH0KIAogI2lmbmRlZiBBUkNIX0hBU19ETUFfR0VUX1JFUVVJUkVEX01BU0sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKaW5kZXggZjFhZmQyNi4uYTdiMzNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMKQEAgLTE4MDIsNyArMTgwMiw3IEBACiAgIAkgICAgcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKHNwbWktPmFkZHIuYWRkcmVzc19zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKQorCWlmIChzcG1pLT5hZGRyLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpCiAJCWFkZHJfc3BhY2UgPSBJUE1JX01FTV9BRERSX1NQQUNFOwogCWVsc2UKIAkJYWRkcl9zcGFjZSA9IElQTUlfSU9fQUREUl9TUEFDRTsKQEAgLTE4NDgsMTkgKzE4NDgsMTkgQEAKIAkJaW5mby0+aXJxX3NldHVwID0gTlVMTDsKIAl9CiAKLQlpZiAoc3BtaS0+YWRkci5yZWdpc3Rlcl9iaXRfd2lkdGgpIHsKKwlpZiAoc3BtaS0+YWRkci5iaXRfd2lkdGgpIHsKIAkJLyogQSAoaG9wZWZ1bGx5KSBwcm9wZXJseSBmb3JtZWQgcmVnaXN0ZXIgYml0IHdpZHRoLiAqLwotCQlpbmZvLT5pby5yZWdzcGFjaW5nID0gc3BtaS0+YWRkci5yZWdpc3Rlcl9iaXRfd2lkdGggLyA4OworCQlpbmZvLT5pby5yZWdzcGFjaW5nID0gc3BtaS0+YWRkci5iaXRfd2lkdGggLyA4OwogCX0gZWxzZSB7CiAJCWluZm8tPmlvLnJlZ3NwYWNpbmcgPSBERUZBVUxUX1JFR1NQQUNJTkc7CiAJfQogCWluZm8tPmlvLnJlZ3NpemUgPSBpbmZvLT5pby5yZWdzcGFjaW5nOwotCWluZm8tPmlvLnJlZ3NoaWZ0ID0gc3BtaS0+YWRkci5yZWdpc3Rlcl9iaXRfb2Zmc2V0OworCWluZm8tPmlvLnJlZ3NoaWZ0ID0gc3BtaS0+YWRkci5iaXRfb2Zmc2V0OwogCi0JaWYgKHNwbWktPmFkZHIuYWRkcmVzc19zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZKSB7CisJaWYgKHNwbWktPmFkZHIuc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkgewogCQlpbmZvLT5pb19zZXR1cCA9IG1lbV9zZXR1cDsKIAkJaW5mby0+aW8uYWRkcl90eXBlID0gSVBNSV9JT19BRERSX1NQQUNFOwotCX0gZWxzZSBpZiAoc3BtaS0+YWRkci5hZGRyZXNzX3NwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykgeworCX0gZWxzZSBpZiAoc3BtaS0+YWRkci5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pIHsKIAkJaW5mby0+aW9fc2V0dXAgPSBwb3J0X3NldHVwOwogCQlpbmZvLT5pby5hZGRyX3R5cGUgPSBJUE1JX01FTV9BRERSX1NQQUNFOwogCX0gZWxzZSB7CkBAIC0xODg4LDEwICsxODg4LDggQEAKIAkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgOyBpKyspIHsKLQkJc3RhdHVzID0gYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoIlNQTUkiLCBpKzEsCi0JCQkJCQkgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsCi0JCQkJCQkgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikKLQkJCQkJCSAmc3BtaSk7CisJCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX1NQTUksIGkrMSwKKwkJCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikmc3BtaSk7CiAJCWlmIChzdGF0dXMgIT0gQUVfT0spCiAJCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2Jpb3MuYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2Jpb3MuYwppbmRleCBhNjExOTcyLi43ZmNhNWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV9iaW9zLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fYmlvcy5jCkBAIC0zNzIsMTAgKzM3Miw4IEBACiAJfQogCiAJLyogRmluZCBUQ1BBIGVudHJ5IGluIFJTRFQgKEFDUElfTE9HSUNBTF9BRERSRVNTSU5HKSAqLwotCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKEFDUElfVENQQV9TSUcsIDEsCi0JCQkJCSBBQ1BJX0xPR0lDQUxfQUREUkVTU0lORywKLQkJCQkJIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopCi0JCQkJCSAmYnVmZik7CisJc3RhdHVzID0gYWNwaV9nZXRfdGFibGUoQUNQSV9TSUdfVENQQSwgMSwKKwkJCQkoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKSZidWZmKTsKIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBFUlJPUiAtIENvdWxkIG5vdCBnZXQgVENQQSB0YWJsZVxuIiwKQEAgLTQwOSw3ICs0MDcsNyBAQAogCiAJbG9nLT5iaW9zX2V2ZW50X2xvZ19lbmQgPSBsb2ctPmJpb3NfZXZlbnRfbG9nICsgbGVuOwogCi0JYWNwaV9vc19tYXBfbWVtb3J5KHN0YXJ0LCBsZW4sICh2b2lkICopICZ2aXJ0KTsKKwl2aXJ0ID0gYWNwaV9vc19tYXBfbWVtb3J5KHN0YXJ0LCBsZW4pOwogCiAJbWVtY3B5KGxvZy0+Ymlvc19ldmVudF9sb2csIHZpcnQsIGxlbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5jIGIvZHJpdmVycy9maXJtd2FyZS9wY2RwLmMKaW5kZXggYzJhZDcyZi4uMmI0Yjc2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9wY2RwLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9wY2RwLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAlzdGF0aWMgY2hhciBvcHRpb25zWzY0XSwgKnAgPSBvcHRpb25zOwogCWNoYXIgcGFyaXR5OwogCi0JbW1pbyA9ICh1YXJ0LT5hZGRyLmFkZHJlc3Nfc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSk7CisJbW1pbyA9ICh1YXJ0LT5hZGRyLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpOwogCXAgKz0gc3ByaW50ZihwLCAiY29uc29sZT11YXJ0LCVzLDB4JWx4IiwKIAkJbW1pbyA/ICJtbWlvIiA6ICJpbyIsIHVhcnQtPmFkZHIuYWRkcmVzcyk7CiAJaWYgKHVhcnQtPmJhdWQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKaW5kZXggNjk1ZTIzOS4uYTUyYzgwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKKysrIGIvZHJpdmVycy9pZGUvc2V0dXAtcGNpLmMKQEAgLTc4MywxMCArNzgzLDExIEBACiAgKglSZXR1cm5zIGFyZSB0aGUgc2FtZSBhcyBmb3IgcGNpX3JlZ2lzdGVyX2RyaXZlcgogICovCiAKLWludCBfX2lkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwY2lfZHJpdmVyICpkcml2ZXIsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKK2ludCBfX2lkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwY2lfZHJpdmVyICpkcml2ZXIsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm1vZF9uYW1lKQogewogCWlmKCFwcmVfaW5pdCkKLQkJcmV0dXJuIF9fcGNpX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIG1vZHVsZSk7CisJCXJldHVybiBfX3BjaV9yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyLCBtb2R1bGUsIG1vZF9uYW1lKTsKIAlkcml2ZXItPmRyaXZlci5vd25lciA9IG1vZHVsZTsKIAlsaXN0X2FkZF90YWlsKCZkcml2ZXItPm5vZGUsICZpZGVfcGNpX2RyaXZlcnMpOwogCXJldHVybiAwOwpAQCAtODYyLDYgKzg2Myw2IEBACiAJewogCQlsaXN0X2RlbChsKTsKIAkJZCA9IGxpc3RfZW50cnkobCwgc3RydWN0IHBjaV9kcml2ZXIsIG5vZGUpOwotCQlfX3BjaV9yZWdpc3Rlcl9kcml2ZXIoZCwgZC0+ZHJpdmVyLm93bmVyKTsKKwkJX19wY2lfcmVnaXN0ZXJfZHJpdmVyKGQsIGQtPmRyaXZlci5vd25lciwgZC0+ZHJpdmVyLm1vZF9uYW1lKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCmluZGV4IDcwNWViMWQuLmFmNWVlMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCkBAIC05NTgsMTYgKzk1OCwxNyBAQAogCXJldHVybiBuZXRkZXZfcHJpdihkZXYpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X3BrZXkoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19wa2V5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9Ci0JCW5ldGRldl9wcml2KGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSwgY2xhc3NfZGV2KSk7CisJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYodG9fbmV0X2RldihkZXYpKTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA0eFxuIiwgcHJpdi0+cGtleSk7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocGtleSwgU19JUlVHTywgc2hvd19wa2V5LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwa2V5LCBTX0lSVUdPLCBzaG93X3BrZXksIE5VTEwpOwogCi1zdGF0aWMgc3NpemVfdCBjcmVhdGVfY2hpbGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldiwKK3N0YXRpYyBzc2l6ZV90IGNyZWF0ZV9jaGlsZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJaW50IHBrZXk7CkBAIC05ODUsMTQgKzk4NiwxNCBAQAogCSAqLwogCXBrZXkgfD0gMHg4MDAwOwogCi0JcmV0ID0gaXBvaWJfdmxhbl9hZGQoY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBuZXRfZGV2aWNlLCBjbGFzc19kZXYpLAotCQkJICAgICBwa2V5KTsKKwlyZXQgPSBpcG9pYl92bGFuX2FkZCh0b19uZXRfZGV2KGRldiksIHBrZXkpOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNyZWF0ZV9jaGlsZCwgU19JV1VHTywgTlVMTCwgY3JlYXRlX2NoaWxkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjcmVhdGVfY2hpbGQsIFNfSVdVR08sIE5VTEwsIGNyZWF0ZV9jaGlsZCk7CiAKLXN0YXRpYyBzc2l6ZV90IGRlbGV0ZV9jaGlsZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZGV2LAorc3RhdGljIHNzaXplX3QgZGVsZXRlX2NoaWxkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlpbnQgcGtleTsKQEAgLTEwMDQsMTggKzEwMDUsMTYgQEAKIAlpZiAocGtleSA8IDAgfHwgcGtleSA+IDB4ZmZmZikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBpcG9pYl92bGFuX2RlbGV0ZShjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IG5ldF9kZXZpY2UsIGNsYXNzX2RldiksCi0JCQkJcGtleSk7CisJcmV0ID0gaXBvaWJfdmxhbl9kZWxldGUodG9fbmV0X2RldihkZXYpLCBwa2V5KTsKIAogCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKIAogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGRlbGV0ZV9jaGlsZCwgU19JV1VHTywgTlVMTCwgZGVsZXRlX2NoaWxkKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxldGVfY2hpbGQsIFNfSVdVR08sIE5VTEwsIGRlbGV0ZV9jaGlsZCk7CiAKIGludCBpcG9pYl9hZGRfcGtleV9hdHRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5jbGFzc19kZXYsCi0JCQkJCSZjbGFzc19kZXZpY2VfYXR0cl9wa2V5KTsKKwlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3BrZXkpOwogfQogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmlwb2liX2FkZF9wb3J0KGNvbnN0IGNoYXIgKmZvcm1hdCwKQEAgLTEwODMsMTEgKzEwODIsOSBAQAogCiAJaWYgKGlwb2liX2FkZF9wa2V5X2F0dHIocHJpdi0+ZGV2KSkKIAkJZ290byBzeXNmc19mYWlsZWQ7Ci0JaWYgKGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmcHJpdi0+ZGV2LT5jbGFzc19kZXYsCi0JCQkJICAgICAmY2xhc3NfZGV2aWNlX2F0dHJfY3JlYXRlX2NoaWxkKSkKKwlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZwcml2LT5kZXYtPmRldiwgJmRldl9hdHRyX2NyZWF0ZV9jaGlsZCkpCiAJCWdvdG8gc3lzZnNfZmFpbGVkOwotCWlmIChjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJnByaXYtPmRldi0+Y2xhc3NfZGV2LAotCQkJCSAgICAgJmNsYXNzX2RldmljZV9hdHRyX2RlbGV0ZV9jaGlsZCkpCisJaWYgKGRldmljZV9jcmVhdGVfZmlsZSgmcHJpdi0+ZGV2LT5kZXYsICZkZXZfYXR0cl9kZWxldGVfY2hpbGQpKQogCQlnb3RvIHN5c2ZzX2ZhaWxlZDsKIAogCXJldHVybiBwcml2LT5kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZsYW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmxhbi5jCmluZGV4IGY4ODc3ODAuLjA4NWVhZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmxhbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfdmxhbi5jCkBAIC00MiwxNSArNDIsMTUgQEAKIAogI2luY2x1ZGUgImlwb2liLmgiCiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfcGFyZW50KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19wYXJlbnQoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9Ci0JCWNvbnRhaW5lcl9vZihjbGFzc19kZXYsIHN0cnVjdCBuZXRfZGV2aWNlLCBjbGFzc19kZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0b19uZXRfZGV2KGQpOwogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgcHJpdi0+cGFyZW50LT5uYW1lKTsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihwYXJlbnQsIFNfSVJVR08sIHNob3dfcGFyZW50LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwYXJlbnQsIFNfSVJVR08sIHNob3dfcGFyZW50LCBOVUxMKTsKIAogaW50IGlwb2liX3ZsYW5fYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBzaG9ydCBwa2V5KQogewpAQCAtMTE4LDggKzExOCw3IEBACiAJaWYgKGlwb2liX2FkZF9wa2V5X2F0dHIocHJpdi0+ZGV2KSkKIAkJZ290byBzeXNmc19mYWlsZWQ7CiAKLQlpZiAoY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZwcml2LT5kZXYtPmNsYXNzX2RldiwKLQkJCQkgICAgICZjbGFzc19kZXZpY2VfYXR0cl9wYXJlbnQpKQorCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJnByaXYtPmRldi0+ZGV2LCAmZGV2X2F0dHJfcGFyZW50KSkKIAkJZ290byBzeXNmc19mYWlsZWQ7CiAKIAlsaXN0X2FkZF90YWlsKCZwcml2LT5saXN0LCAmcHByaXYtPmNoaWxkX2ludGZzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwppbmRleCBmMGNlODIyLi4xN2M4YzYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYwpAQCAtNDUsNyArNDUsNyBAQAogRVhQT1JUX1NZTUJPTChfX3NlcmlvX3JlZ2lzdGVyX3BvcnQpOwogRVhQT1JUX1NZTUJPTChzZXJpb191bnJlZ2lzdGVyX3BvcnQpOwogRVhQT1JUX1NZTUJPTChzZXJpb191bnJlZ2lzdGVyX2NoaWxkX3BvcnQpOwotRVhQT1JUX1NZTUJPTChzZXJpb19yZWdpc3Rlcl9kcml2ZXIpOworRVhQT1JUX1NZTUJPTChfX3NlcmlvX3JlZ2lzdGVyX2RyaXZlcik7CiBFWFBPUlRfU1lNQk9MKHNlcmlvX3VucmVnaXN0ZXJfZHJpdmVyKTsKIEVYUE9SVF9TWU1CT0woc2VyaW9fb3Blbik7CiBFWFBPUlRfU1lNQk9MKHNlcmlvX2Nsb3NlKTsKQEAgLTc4OSwxMiArNzg5LDE0IEBACiAJCQlkcnYtPmRyaXZlci5uYW1lLCBlcnJvcik7CiB9CiAKLWludCBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQoraW50IF9fc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIsIGNvbnN0IGNoYXIgKm1vZF9uYW1lKQogewogCWludCBtYW51YWxfYmluZCA9IGRydi0+bWFudWFsX2JpbmQ7CiAJaW50IGVycm9yOwogCiAJZHJ2LT5kcml2ZXIuYnVzID0gJnNlcmlvX2J1czsKKwlkcnYtPmRyaXZlci5vd25lciA9IG93bmVyOworCWRydi0+ZHJpdmVyLm1vZF9uYW1lID0gbW9kX25hbWU7CiAKIAkvKgogCSAqIFRlbXBvcmFyaWx5IGRpc2FibGUgYXV0b21hdGljIGJpbmRpbmcgYmVjYXVzZSBwcm9iaW5nCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IDAwZGIzMWMuLjg5YmJhMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC02OSw2ICs2OSwyNSBAQAogICAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIHRpZm1fN3h4MS4KIAorY29uZmlnIEFTVVNfTEFQVE9QCisgICAgICAgIHRyaXN0YXRlICJBc3VzIExhcHRvcCBFeHRyYXMgKEVYUEVSSU1FTlRBTCkiCisgICAgICAgIGRlcGVuZHMgb24gWDg2CisgICAgICAgIGRlcGVuZHMgb24gQUNQSQorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmICFBQ1BJX0FTVVMKKwlkZXBlbmRzIG9uIExFRFNfQ0xBU1MKKwlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKyAgICAgICAgLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgbmV3IExpbnV4IGRyaXZlciBmb3IgQXN1cyBsYXB0b3BzLiBJdCBtYXkgYWxzbyBzdXBwb3J0IHNvbWUKKwkgIE1FRElPTiwgSlZDIG9yIFZJQ1RPUiBsYXB0b3BzLiBJdCBtYWtlcyBhbGwgdGhlIGV4dHJhIGJ1dHRvbnMgZ2VuZXJhdGUKKwkgIHN0YW5kYXJkIEFDUEkgZXZlbnRzIHRoYXQgZ28gdGhyb3VnaCAvcHJvYy9hY3BpL2V2ZW50cy4gSXQgYWxzbyBhZGRzCisJICBzdXBwb3J0IGZvciB2aWRlbyBvdXRwdXQgc3dpdGNoaW5nLCBMQ0QgYmFja2xpZ2h0IGNvbnRyb2wsIEJsdWV0b290aCBhbmQKKwkgIFdsYW4gY29udHJvbCwgYW5kIG1vc3QgaW1wb3J0YW50bHksIGFsbG93cyB5b3UgdG8gYmxpbmsgdGhvc2UgZmFuY3kgTEVEcy4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGEgdXNlcnNwYWNlIGRhZW1vbiBmb3IgaGFuZGxpbmcgdGhlIGV4dHJhCisJICBidXR0b25zIHNlZSA8aHR0cDovL2FjcGk0YXN1cy5zZi5uZXQvPi4KKworCSAgSWYgeW91IGhhdmUgYW4gQUNQSS1jb21wYXRpYmxlIEFTVVMgbGFwdG9wLCBzYXkgWSBvciBNIGhlcmUuCisKIGNvbmZpZyBNU0lfTEFQVE9QCiAgICAgICAgIHRyaXN0YXRlICJNU0kgTGFwdG9wIEV4dHJhcyIKICAgICAgICAgZGVwZW5kcyBvbiBYODYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCBjOWU5OGFiLi4zNWRhNTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC02LDYgKzYsNyBAQAogb2JqLSQoQ09ORklHX0lCTV9BU00pCQkrPSBpYm1hc20vCiBvYmotJChDT05GSUdfSERQVV9GRUFUVVJFUykJKz0gaGRwdWZ0cnMvCiBvYmotJChDT05GSUdfTVNJX0xBUFRPUCkgICAgICs9IG1zaS1sYXB0b3Aubworb2JqLSQoQ09ORklHX0FTVVNfTEFQVE9QKSAgICAgKz0gYXN1cy1sYXB0b3Aubwogb2JqLSQoQ09ORklHX0xLRFRNKQkJKz0gbGtkdG0ubwogb2JqLSQoQ09ORklHX1RJRk1fQ09SRSkgICAgICAgCSs9IHRpZm1fY29yZS5vCiBvYmotJChDT05GSUdfVElGTV83WFgxKSAgICAgICAJKz0gdGlmbV83eHgxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hc3VzLWxhcHRvcC5jIGIvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxYzM5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWlzYy9hc3VzLWxhcHRvcC5jCkBAIC0wLDAgKzEsMTE2NSBAQAorLyoKKyAqICBhc3VzLWxhcHRvcC5jIC0gQXN1cyBMYXB0b3AgU3VwcG9ydAorICoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgSnVsaWVuIExlcm91Z2UsIDIwMDMtMjAwNiBLYXJvbCBLb3ppbW9yCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IENvcmVudGluIENoYXJ5CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICoKKyAqICBUaGUgZGV2ZWxvcG1lbnQgcGFnZSBmb3IgdGhpcyBkcml2ZXIgaXMgbG9jYXRlZCBhdAorICogIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYWNwaTRhc3VzLworICoKKyAqICBDcmVkaXRzOgorICogIFBvbnR1cyBGdWNocyAgIC0gSGVscGVyIGZ1bmN0aW9ucywgY2xlYW51cAorICogIEpvaGFubiBXaWVzbmVyIC0gU21hbGwgY29tcGlsZSBmaXhlcworICogIEpvaG4gQmVsbW9udGUgIC0gQUNQSSBjb2RlIGZvciBUb3NoaWJhIGxhcHRvcCB3YXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LgorICogIEVyaWMgQnVyZ2hhcmQgIC0gTEVEIGRpc3BsYXkgc3VwcG9ydCBmb3IgVzFOCisgKiAgSm9zaCBHcmVlbiAgICAgLSBMaWdodCBTZW5zIHN1cHBvcnQKKyAqICBUaG9tYXMgVHV0dGxlICAtIEhpcyBmaXJzdCBwYXRjaCBmb3IgbGVkIHN1cHBvcnQgd2FzIHZlcnkgaGVscGZ1bGwKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2F1dG9jb25mLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgQVNVU19MQVBUT1BfVkVSU0lPTiAiMC40MCIKKworI2RlZmluZSBBU1VTX0hPVEtfTkFNRSAgICAgICAgICAiQXN1cyBMYXB0b3AgU3VwcG9ydCIKKyNkZWZpbmUgQVNVU19IT1RLX0NMQVNTICAgICAgICAgImhvdGtleSIKKyNkZWZpbmUgQVNVU19IT1RLX0RFVklDRV9OQU1FICAgIkhvdGtleSIKKyNkZWZpbmUgQVNVU19IT1RLX0hJRCAgICAgICAgICAgIkFUSzAxMDAiCisjZGVmaW5lIEFTVVNfSE9US19GSUxFICAgICAgICAgICJhc3VzLWxhcHRvcCIKKyNkZWZpbmUgQVNVU19IT1RLX1BSRUZJWCAgICAgICAgIlxcX1NCLkFUS0QuIgorCisvKgorICogU29tZSBldmVudHMgd2UgdXNlLCBzYW1lIGZvciBhbGwgQXN1cworICovCisjZGVmaW5lIEFUS0RfQlJfVVAgICAgICAgMHgxMAorI2RlZmluZSBBVEtEX0JSX0RPV04gICAgIDB4MjAKKyNkZWZpbmUgQVRLRF9MQ0RfT04gICAgICAweDMzCisjZGVmaW5lIEFUS0RfTENEX09GRiAgICAgMHgzNAorCisvKgorICogS25vd24gYml0cyByZXR1cm5lZCBieSBcX1NCLkFUS0QuSFdSUworICovCisjZGVmaW5lIFdMX0hXUlMgICAgIDB4ODAKKyNkZWZpbmUgQlRfSFdSUyAgICAgMHgxMDAKKworLyoKKyAqIEZsYWdzIGZvciBob3RrIHN0YXR1cworICogV0xfT04gYW5kIEJUX09OIGFyZSBhbHNvIHVzZWQgZm9yIHdpcmVsZXNzX3N0YXR1cygpCisgKi8KKyNkZWZpbmUgV0xfT04gICAgICAgMHgwMQkvL2ludGVybmFsIFdpZmkKKyNkZWZpbmUgQlRfT04gICAgICAgMHgwMgkvL2ludGVybmFsIEJsdWV0b290aAorI2RlZmluZSBNTEVEX09OICAgICAweDA0CS8vbWFpbCBMRUQKKyNkZWZpbmUgVExFRF9PTiAgICAgMHgwOAkvL3RvdWNocGFkIExFRAorI2RlZmluZSBSTEVEX09OICAgICAweDEwCS8vUmVjb3JkIExFRAorI2RlZmluZSBQTEVEX09OICAgICAweDIwCS8vUGhvbmUgTEVECisjZGVmaW5lIExDRF9PTiAgICAgIDB4NDAJLy9MQ0QgYmFja2xpZ2h0CisKKyNkZWZpbmUgQVNVU19MT0cgICAgQVNVU19IT1RLX0ZJTEUgIjogIgorI2RlZmluZSBBU1VTX0VSUiAgICBLRVJOX0VSUiAgICBBU1VTX0xPRworI2RlZmluZSBBU1VTX1dBUk5JTkcgICAgS0VSTl9XQVJOSU5HICAgIEFTVVNfTE9HCisjZGVmaW5lIEFTVVNfTk9USUNFIEtFUk5fTk9USUNFIEFTVVNfTE9HCisjZGVmaW5lIEFTVVNfSU5GTyAgIEtFUk5fSU5GTyAgIEFTVVNfTE9HCisjZGVmaW5lIEFTVVNfREVCVUcgIEtFUk5fREVCVUcgIEFTVVNfTE9HCisKK01PRFVMRV9BVVRIT1IoIkp1bGllbiBMZXJvdWdlLCBLYXJvbCBLb3ppbW9yLCBDb3JlbnRpbiBDaGFyeSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKEFTVVNfSE9US19OQU1FKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBBU1VTX0hBTkRMRShvYmplY3QsIHBhdGhzLi4uKQkJCQkJXAorCXN0YXRpYyBhY3BpX2hhbmRsZSAgb2JqZWN0IyNfaGFuZGxlID0gTlVMTDsJCQlcCisJc3RhdGljIGNoYXIgKm9iamVjdCMjX3BhdGhzW10gPSB7IHBhdGhzIH0KKworLyogTEVEICovCitBU1VTX0hBTkRMRShtbGVkX3NldCwgQVNVU19IT1RLX1BSRUZJWCAiTUxFRCIpOworQVNVU19IQU5ETEUodGxlZF9zZXQsIEFTVVNfSE9US19QUkVGSVggIlRMRUQiKTsKK0FTVVNfSEFORExFKHJsZWRfc2V0LCBBU1VTX0hPVEtfUFJFRklYICJSTEVEIik7CS8qIFcxSkMgKi8KK0FTVVNfSEFORExFKHBsZWRfc2V0LCBBU1VTX0hPVEtfUFJFRklYICJQTEVEIik7CS8qIEE3SiAqLworCisvKiBMRUREICovCitBU1VTX0hBTkRMRShsZWRkX3NldCwgQVNVU19IT1RLX1BSRUZJWCAiU0xDTSIpOworCisvKiBCbHVldG9vdGggYW5kIFdMQU4KKyAqIFdMRUQgYW5kIEJMRUQgYXJlIG5vdCBoYW5kbGVkIGxpa2Ugb3RoZXIgWExFRCwgYmVjYXVzZSBpbiBzb21lIGRzZHQKKyAqIHRoZXkgYWxzbyBjb250cm9sIHRoZSBXTEFOL0JsdWV0b290aCBkZXZpY2UuCisgKi8KK0FTVVNfSEFORExFKHdsX3N3aXRjaCwgQVNVU19IT1RLX1BSRUZJWCAiV0xFRCIpOworQVNVU19IQU5ETEUoYnRfc3dpdGNoLCBBU1VTX0hPVEtfUFJFRklYICJCTEVEIik7CitBU1VTX0hBTkRMRSh3aXJlbGVzc19zdGF0dXMsIEFTVVNfSE9US19QUkVGSVggIlJTVFMiKTsJLyogQWxsIG5ldyBtb2RlbHMgKi8KKworLyogQnJpZ2h0bmVzcyAqLworQVNVU19IQU5ETEUoYnJpZ2h0bmVzc19zZXQsIEFTVVNfSE9US19QUkVGSVggIlNQTFYiKTsKK0FTVVNfSEFORExFKGJyaWdodG5lc3NfZ2V0LCBBU1VTX0hPVEtfUFJFRklYICJHUExWIik7CisKKy8qIEJhY2tsaWdodCAqLworQVNVU19IQU5ETEUobGNkX3N3aXRjaCwgIlxcX1NCLlBDSTAuU0JSRy5FQzAuX1ExMCIsCS8qIEFsbCBuZXcgbW9kZWxzICovCisJICAgICJcXF9TQi5QQ0kwLklTQS5FQzAuX1ExMCIsCS8qIEExeCAqLworCSAgICAiXFxfU0IuUENJMC5QWDQwLkVDRDAuX1ExMCIsCS8qIEwzQyAqLworCSAgICAiXFxfU0IuUENJMC5QWDQwLkVDMC5RMTAiLAkvKiBNMUEgKi8KKwkgICAgIlxcX1NCLlBDSTAuTFBDQi5FQzAuX1ExMCIsCS8qIFAzMCAqLworCSAgICAiXFxfU0IuUENJMC5QWDQwLlExMCIsCS8qIFMxeCAqLworCSAgICAiXFxRMTAiKTsJCS8qIEEyeCwgTDJELCBMM0QsIE0yRSAqLworCisvKiBEaXNwbGF5ICovCitBU1VTX0hBTkRMRShkaXNwbGF5X3NldCwgQVNVU19IT1RLX1BSRUZJWCAiU0RTUCIpOworQVNVU19IQU5ETEUoZGlzcGxheV9nZXQsICJcXF9TQi5QQ0kwLlAwUDEuVkdBLkdFVEQiLAkvKiAgQTZCLCBBNksgQTZSIEE3RCBGM0pNIEw0UiBNNlIgQTNHCisJCQkJCQkJICAgTTZBIE02ViBWWC0xIFY2SiBWNlYgVzNaICovCisJICAgICJcXF9TQi5QQ0kwLlAwUDIuVkdBLkdFVEQiLAkvKiBBM0UgQTRLLCBBNEQgQTRMIEE2SiBBN0ogQThKIFo3MVYgTTlWCisJCQkJCSAgIFM1QSBNNUEgejMzQSBXMUpjIFcyViAqLworCSAgICAiXFxfU0IuUENJMC5QMFAzLlZHQS5HRVREIiwJLyogQTZWIEE2USAqLworCSAgICAiXFxfU0IuUENJMC5QMFBBLlZHQS5HRVREIiwJLyogQTZULCBBNk0gKi8KKwkgICAgIlxcX1NCLlBDSTAuUENJMS5WR0FDLk5NQVAiLAkvKiBMM0MgKi8KKwkgICAgIlxcX1NCLlBDSTAuVkdBLkdFVEQiLAkvKiBaOTZGICovCisJICAgICJcXEFDVEQiLAkJLyogQTJEICovCisJICAgICJcXEFEVkciLAkJLyogQTRHIFo3MUEgVzFOIFc1QSBXNUYgTTJOIE0zTiBNNU4gTTZOIFMxTiBTNU4gKi8KKwkgICAgIlxcRE5YVCIsCQkvKiBQMzAgKi8KKwkgICAgIlxcSU5GQiIsCQkvKiBBMkggRDEgTDJEIEwzRCBMM0ggTDJFIEw1RCBMNUMgTTFBIE0yRSBMNEwgVzNWICovCisJICAgICJcXFNTVEUiKTsJCS8qIEEzRiBBNkYgQTNOIEEzTCBNNk4gVzNOIFc2QSAqLworCitBU1VTX0hBTkRMRShsc19zd2l0Y2gsIEFTVVNfSE9US19QUkVGSVggIkFMU0MiKTsJLyogWjcxQSBaNzFWICovCitBU1VTX0hBTkRMRShsc19sZXZlbCwgQVNVU19IT1RLX1BSRUZJWCAiQUxTTCIpOwkvKiBaNzFBIFo3MVYgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIG1haW4gc3RydWN0dXJlLCB3ZSBjYW4gdXNlIGl0IHRvIHN0b3JlIGFueXRoaW5nIGludGVyZXN0aW5nCisgKiBhYm91dCB0aGUgaG90ayBkZXZpY2UKKyAqLworc3RydWN0IGFzdXNfaG90ayB7CisJY2hhciAqbmFtZTsJCS8vbGFwdG9wIG5hbWUKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsJLy90aGUgZGV2aWNlIHdlIGFyZSBpbgorCWFjcGlfaGFuZGxlIGhhbmRsZTsJLy90aGUgaGFuZGxlIG9mIHRoZSBob3RrIGRldmljZQorCWNoYXIgc3RhdHVzOwkJLy9zdGF0dXMgb2YgdGhlIGhvdGssIGZvciBMRURzLCAuLi4KKwl1MzIgbGVkZF9zdGF0dXM7CS8vc3RhdHVzIG9mIHRoZSBMRUQgZGlzcGxheQorCXU4IGxpZ2h0X2xldmVsOwkJLy9saWdodCBzZW5zb3IgbGV2ZWwKKwl1OCBsaWdodF9zd2l0Y2g7CS8vbGlnaHQgc2Vuc29yIHN3aXRjaCB2YWx1ZQorCXUxNiBldmVudF9jb3VudFsxMjhdOwkvL2NvdW50IGZvciBlYWNoIGV2ZW50IFRPRE8gbWFrZSB0aGlzIGJldHRlcgorfTsKKworLyoKKyAqIFRoaXMgaGVhZGVyIGlzIG1hZGUgYXZhaWxhYmxlIHRvIGFsbG93IHByb3BlciBjb25maWd1cmF0aW9uIGdpdmVuIG1vZGVsLAorICogcmV2aXNpb24gbnVtYmVyICwgLi4uIHRoaXMgaW5mbyBjYW5ub3QgZ28gaW4gc3RydWN0IGFzdXNfaG90ayBiZWNhdXNlIGl0IGlzCisgKiBhdmFpbGFibGUgYmVmb3JlIHRoZSBob3RrCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmFzdXNfaW5mbzsKKworLyogVGhlIGFjdHVhbCBkZXZpY2UgdGhlIGRyaXZlciBiaW5kcyB0byAqLworc3RhdGljIHN0cnVjdCBhc3VzX2hvdGsgKmhvdGs7CisKKy8qCisgKiBUaGUgaG90a2V5IGRyaXZlciBkZWNsYXJhdGlvbgorICovCitzdGF0aWMgaW50IGFzdXNfaG90a19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBhc3VzX2hvdGtfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFzdXNfaG90a19kcml2ZXIgPSB7CisJLm5hbWUgPSBBU1VTX0hPVEtfTkFNRSwKKwkuY2xhc3MgPSBBU1VTX0hPVEtfQ0xBU1MsCisJLmlkcyA9IEFTVVNfSE9US19ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGFzdXNfaG90a19hZGQsCisJCS5yZW1vdmUgPSBhc3VzX2hvdGtfcmVtb3ZlLAorCQl9LAorfTsKKworLyogVGhlIGJhY2tsaWdodCBkZXZpY2UgL3N5cy9jbGFzcy9iYWNrbGlnaHQgKi8KK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYXN1c19iYWNrbGlnaHRfZGV2aWNlOworCisvKgorICogVGhlIGJhY2tsaWdodCBjbGFzcyBkZWNsYXJhdGlvbgorICovCitzdGF0aWMgaW50IHJlYWRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpOworc3RhdGljIGludCB1cGRhdGVfYmxfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCk7CitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIGFzdXNibF9kYXRhID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5nZXRfYnJpZ2h0bmVzcyA9IHJlYWRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cyA9IHVwZGF0ZV9ibF9zdGF0dXMsCisJLm1heF9icmlnaHRuZXNzID0gMTUsCit9OworCisvKiBUaGVzZSBmdW5jdGlvbnMgYWN0dWFsbHkgdXBkYXRlIHRoZSBMRUQncywgYW5kIGFyZSBjYWxsZWQgZnJvbSBhCisgKiB3b3JrcXVldWUuIEJ5IGRvaW5nIHRoaXMgYXMgc2VwYXJhdGUgd29yayByYXRoZXIgdGhhbiB3aGVuIHRoZSBMRUQKKyAqIHN1YnN5c3RlbSBhc2tzLCB3ZSBhdm9pZCBtZXNzaW5nIHdpdGggdGhlIEFzdXMgQUNQSSBzdHVmZiBkdXJpbmcgYQorICogcG90ZW50aWFsbHkgYmFkIHRpbWUsIHN1Y2ggYXMgYSB0aW1lciBpbnRlcnJ1cHQuICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmxlZF93b3JrcXVldWU7CisKKyNkZWZpbmUgQVNVU19MRUQob2JqZWN0LCBsZWRuYW1lKQkJCQkJXAorCXN0YXRpYyB2b2lkIG9iamVjdCMjX2xlZF9zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCVwKKwkJCQkgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpOwlcCisJc3RhdGljIHZvaWQgb2JqZWN0IyNfbGVkX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmlnbm9yZWQpOwlcCisJc3RhdGljIGludCBvYmplY3QjI19sZWRfd2s7CQkJCQlcCisJREVDTEFSRV9XT1JLKG9iamVjdCMjX2xlZF93b3JrLCBvYmplY3QjI19sZWRfdXBkYXRlKTsJCVwKKwlzdGF0aWMgc3RydWN0IGxlZF9jbGFzc2RldiBvYmplY3QjI19sZWQgPSB7CQkJXAorCQkubmFtZSAgICAgICAgICAgPSAiYXN1czoiIGxlZG5hbWUsCQkJXAorCQkuYnJpZ2h0bmVzc19zZXQgPSBvYmplY3QjI19sZWRfc2V0LAkJCVwKKwl9CisKK0FTVVNfTEVEKG1sZWQsICJtYWlsIik7CitBU1VTX0xFRCh0bGVkLCAidG91Y2hwYWQiKTsKK0FTVVNfTEVEKHJsZWQsICJyZWNvcmQiKTsKK0FTVVNfTEVEKHBsZWQsICJwaG9uZSIpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBldmFsdWF0ZXMgYW4gQUNQSSBtZXRob2QsIGdpdmVuIGFuIGludCBhcyBwYXJhbWV0ZXIsIHRoZQorICogbWV0aG9kIGlzIHNlYXJjaGVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGhhbmRsZSwgY2FuIGJlIE5VTEwuIFRoZSBvdXRwdXQKKyAqIG9mIHRoZSBtZXRob2QgaXMgd3JpdHRlbiBpcyBvdXRwdXQsIHdoaWNoIGNhbiBhbHNvIGJlIE5VTEwKKyAqCisgKiByZXR1cm5zIDEgaWYgd3JpdGUgaXMgc3VjY2Vzc2Z1bCwgMCBlbHNlLgorICovCitzdGF0aWMgaW50IHdyaXRlX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgdmFsLAorCQkJICBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dCkKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CS8vbGlzdCBvZiBpbnB1dCBwYXJhbWV0ZXJzIChhbiBpbnQgaGVyZSkKKwl1bmlvbiBhY3BpX29iamVjdCBpbl9vYmo7CS8vdGhlIG9ubHkgcGFyYW0gd2UgdXNlCisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJcGFyYW1zLmNvdW50ID0gMTsKKwlwYXJhbXMucG9pbnRlciA9ICZpbl9vYmo7CisJaW5fb2JqLnR5cGUgPSBBQ1BJX1RZUEVfSU5URUdFUjsKKwlpbl9vYmouaW50ZWdlci52YWx1ZSA9IHZhbDsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKiltZXRob2QsICZwYXJhbXMsIG91dHB1dCk7CisJcmV0dXJuIChzdGF0dXMgPT0gQUVfT0spOworfQorCitzdGF0aWMgaW50IHJlYWRfYWNwaV9pbnQoYWNwaV9oYW5kbGUgaGFuZGxlLCBjb25zdCBjaGFyICptZXRob2QsIGludCAqdmFsLAorCQkJIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwYXJhbXMpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dDsKKwl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2JqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCW91dHB1dC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7CisJb3V0cHV0LnBvaW50ZXIgPSAmb3V0X29iajsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKiltZXRob2QsIHBhcmFtcywgJm91dHB1dCk7CisJKnZhbCA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKKwlyZXR1cm4gKHN0YXR1cyA9PSBBRV9PSykgJiYgKG91dF9vYmoudHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUik7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF93aXJlbGVzc19zdGF0dXMoaW50IG1hc2spCit7CisJaW50IHN0YXR1czsKKworCWlmICghd2lyZWxlc3Nfc3RhdHVzX2hhbmRsZSkKKwkJcmV0dXJuIChob3RrLT5zdGF0dXMgJiBtYXNrKSA/IDEgOiAwOworCisJaWYgKHJlYWRfYWNwaV9pbnQod2lyZWxlc3Nfc3RhdHVzX2hhbmRsZSwgTlVMTCwgJnN0YXR1cywgTlVMTCkpIHsKKwkJcmV0dXJuIChzdGF0dXMgJiBtYXNrKSA/IDEgOiAwOworCX0gZWxzZQorCQlwcmludGsoQVNVU19XQVJOSU5HICJFcnJvciByZWFkaW5nIFdpcmVsZXNzIHN0YXR1c1xuIik7CisKKwlyZXR1cm4gKGhvdGstPnN0YXR1cyAmIG1hc2spID8gMSA6IDA7Cit9CisKKy8qIEdlbmVyaWMgTEVEIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCByZWFkX3N0YXR1cyhpbnQgbWFzaykKK3sKKwkvKiBUaGVyZSBpcyBhIHNwZWNpYWwgbWV0aG9kIGZvciBib3RoIHdpcmVsZXNzIGRldmljZXMgKi8KKwlpZiAobWFzayA9PSBCVF9PTiB8fCBtYXNrID09IFdMX09OKQorCQlyZXR1cm4gcmVhZF93aXJlbGVzc19zdGF0dXMobWFzayk7CisKKwlyZXR1cm4gKGhvdGstPnN0YXR1cyAmIG1hc2spID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3N0YXR1cyhhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBvdXQsIGludCBtYXNrLCBpbnQgaW52ZXJ0KQoreworCWhvdGstPnN0YXR1cyA9IChvdXQpID8gKGhvdGstPnN0YXR1cyB8IG1hc2spIDogKGhvdGstPnN0YXR1cyAmIH5tYXNrKTsKKworCWlmIChpbnZlcnQpCQkvKiBpbnZlcnQgdGFyZ2V0IHZhbHVlICovCisJCW91dCA9ICFvdXQgJiAweDE7CisKKwlpZiAoaGFuZGxlICYmICF3cml0ZV9hY3BpX2ludChoYW5kbGUsIE5VTEwsIG91dCwgTlVMTCkpCisJCXByaW50ayhBU1VTX1dBUk5JTkcgIiB3cml0ZSBmYWlsZWRcbiIpOworfQorCisvKiAvc3lzL2NsYXNzL2xlZCBoYW5kbGVycyAqLworI2RlZmluZSBBU1VTX0xFRF9IQU5ETEVSKG9iamVjdCwgbWFzaywgaW52ZXJ0KQkJCQlcCisJc3RhdGljIHZvaWQgb2JqZWN0IyNfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwJXAorCQkJCSAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkJCVwKKwl7CQkJCQkJCQlcCisJCW9iamVjdCMjX2xlZF93ayA9IHZhbHVlOwkJCQlcCisJCXF1ZXVlX3dvcmsobGVkX3dvcmtxdWV1ZSwgJm9iamVjdCMjX2xlZF93b3JrKTsJCVwKKwl9CQkJCQkJCQlcCisJc3RhdGljIHZvaWQgb2JqZWN0IyNfbGVkX3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmlnbm9yZWQpCVwKKwl7CQkJCQkJCQlcCisJCWludCB2YWx1ZSA9IG9iamVjdCMjX2xlZF93azsJCQkJXAorCQl3cml0ZV9zdGF0dXMob2JqZWN0IyNfc2V0X2hhbmRsZSwgdmFsdWUsIChtYXNrKSwgKGludmVydCkpOyBcCisJfQorCitBU1VTX0xFRF9IQU5ETEVSKG1sZWQsIE1MRURfT04sIDEpOworQVNVU19MRURfSEFORExFUihwbGVkLCBQTEVEX09OLCAwKTsKK0FTVVNfTEVEX0hBTkRMRVIocmxlZCwgUkxFRF9PTiwgMCk7CitBU1VTX0xFRF9IQU5ETEVSKHRsZWQsIFRMRURfT04sIDApOworCitzdGF0aWMgaW50IGdldF9sY2Rfc3RhdGUodm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9zdGF0dXMoTENEX09OKTsKK30KKworc3RhdGljIGludCBzZXRfbGNkX3N0YXRlKGludCB2YWx1ZSkKK3sKKwlpbnQgbGNkID0gMDsKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCisJbGNkID0gdmFsdWUgPyAxIDogMDsKKworCWlmIChsY2QgPT0gZ2V0X2xjZF9zdGF0ZSgpKQorCQlyZXR1cm4gMDsKKworCWlmIChsY2Rfc3dpdGNoX2hhbmRsZSkgeworCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChsY2Rfc3dpdGNoX2hhbmRsZSwKKwkJCQkJICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJcHJpbnRrKEFTVVNfV0FSTklORyAiRXJyb3Igc3dpdGNoaW5nIExDRFxuIik7CisJfQorCisJd3JpdGVfc3RhdHVzKE5VTEwsIGxjZCwgTENEX09OLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGNkX2JsYW5rKGludCBibGFuaykKK3sKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSBhc3VzX2JhY2tsaWdodF9kZXZpY2U7CisKKwlpZiAoYmQpIHsKKwkJZG93bigmYmQtPnNlbSk7CisJCWlmIChsaWtlbHkoYmQtPnByb3BzKSkgeworCQkJYmQtPnByb3BzLT5wb3dlciA9IGJsYW5rOworCQkJaWYgKGxpa2VseShiZC0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMpKQorCQkJCWJkLT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhiZCk7CisJCX0KKwkJdXAoJmJkLT5zZW0pOworCX0KK30KKworc3RhdGljIGludCByZWFkX2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCWludCB2YWx1ZTsKKworCWlmICghcmVhZF9hY3BpX2ludChicmlnaHRuZXNzX2dldF9oYW5kbGUsIE5VTEwsICZ2YWx1ZSwgTlVMTCkpCisJCXByaW50ayhBU1VTX1dBUk5JTkcgIkVycm9yIHJlYWRpbmcgYnJpZ2h0bmVzc1xuIik7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkLCBpbnQgdmFsdWUpCit7CisJaW50IHJldCA9IDA7CisKKwl2YWx1ZSA9ICgwIDwgdmFsdWUpID8gKCgxNSA8IHZhbHVlKSA/IDE1IDogdmFsdWUpIDogMDsKKwkvKiAwIDw9IHZhbHVlIDw9IDE1ICovCisKKwlpZiAoIXdyaXRlX2FjcGlfaW50KGJyaWdodG5lc3Nfc2V0X2hhbmRsZSwgTlVMTCwgdmFsdWUsIE5VTEwpKSB7CisJCXByaW50ayhBU1VTX1dBUk5JTkcgIkVycm9yIGNoYW5naW5nIGJyaWdodG5lc3NcbiIpOworCQlyZXQgPSAtRUlPOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2JsX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJaW50IHJ2OworCWludCB2YWx1ZSA9IGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKKworCXJ2ID0gc2V0X2JyaWdodG5lc3MoYmQsIHZhbHVlKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCXZhbHVlID0gKGJkLT5wcm9wcy0+cG93ZXIgPT0gRkJfQkxBTktfVU5CTEFOSykgPyAxIDogMDsKKwlyZXR1cm4gc2V0X2xjZF9zdGF0ZSh2YWx1ZSk7Cit9CisKKy8qCisgKiBQbGF0Zm9ybSBkZXZpY2UgaGFuZGxlcnMKKyAqLworCisvKgorICogV2Ugd3JpdGUgb3VyIGluZm8gaW4gcGFnZSwgd2UgYmVnaW4gYXQgb2Zmc2V0IG9mZiBhbmQgY2Fubm90IHdyaXRlIG1vcmUKKyAqIHRoYW4gY291bnQgYnl0ZXMuIFdlIHNldCBlb2YgdG8gMSBpZiB3ZSBoYW5kbGUgdGhvc2UgMiB2YWx1ZXMuIFdlIHJldHVybiB0aGUKKyAqIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIHBhZ2UKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19pbmZvcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpwYWdlKQoreworCWludCBsZW4gPSAwOworCWludCB0ZW1wOworCWNoYXIgYnVmWzE2XTsJCS8vZW5vdWdoIGZvciBhbGwgaW5mbworCS8qCisJICogV2UgdXNlIHRoZSBlYXN5IHdheSwgd2UgZG9uJ3QgY2FyZSBvZiBvZmYgYW5kIGNvdW50LCBzbyB3ZSBkb24ndCBzZXQgZW9mCisJICogdG8gMQorCSAqLworCisJbGVuICs9IHNwcmludGYocGFnZSwgQVNVU19IT1RLX05BTUUgIiAiIEFTVVNfTEFQVE9QX1ZFUlNJT04gIlxuIik7CisJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIk1vZGVsIHJlZmVyZW5jZSAgICA6ICVzXG4iLCBob3RrLT5uYW1lKTsKKwkvKgorCSAqIFRoZSBTRlVOIG1ldGhvZCBwcm9iYWJseSBhbGxvd3MgdGhlIG9yaWdpbmFsIGRyaXZlciB0byBnZXQgdGhlIGxpc3QKKwkgKiBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgYSBnaXZlbiBtb2RlbC4gRm9yIG5vdywgMHgwMTAwIG9yIDB4MDgwMAorCSAqIGJpdCBzaWduaWZpZXMgdGhhdCB0aGUgbGFwdG9wIGlzIGVxdWlwcGVkIHdpdGggYSBXaS1GaSBNaW5pUENJIGNhcmQuCisJICogVGhlIHNpZ25pZmljYW5jZSBvZiBvdGhlcnMgaXMgeWV0IHRvIGJlIGZvdW5kLgorCSAqLworCWlmIChyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIlNGVU4iLCAmdGVtcCwgTlVMTCkpCisJCWxlbiArPQorCQkgICAgc3ByaW50ZihwYWdlICsgbGVuLCAiU0ZVTiB2YWx1ZSAgICAgICAgIDogMHglMDR4XG4iLCB0ZW1wKTsKKwkvKgorCSAqIEFub3RoZXIgdmFsdWUgZm9yIHVzZXJzcGFjZTogdGhlIEFTWU0gbWV0aG9kIHJldHVybnMgMHgwMiBmb3IKKwkgKiBiYXR0ZXJ5IGxvdyBhbmQgMHgwNCBmb3IgYmF0dGVyeSBjcml0aWNhbCwgaXRzIHJlYWRpbmdzIHRlbmQgdG8gYmUKKwkgKiBtb3JlIGFjY3VyYXRlIHRoYW4gdGhvc2UgcHJvdmlkZWQgYnkgX0JTVC4KKwkgKiBOb3RlOiBzaW5jZSBub3QgYWxsIHRoZSBsYXB0b3BzIHByb3ZpZGUgdGhpcyBtZXRob2QsIGVycm9ycyBhcmUKKwkgKiBzaWxlbnRseSBpZ25vcmVkLgorCSAqLworCWlmIChyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIkFTWU0iLCAmdGVtcCwgTlVMTCkpCisJCWxlbiArPQorCQkgICAgc3ByaW50ZihwYWdlICsgbGVuLCAiQVNZTSB2YWx1ZSAgICAgICAgIDogMHglMDR4XG4iLCB0ZW1wKTsKKwlpZiAoYXN1c19pbmZvKSB7CisJCXNucHJpbnRmKGJ1ZiwgMTYsICIlZCIsIGFzdXNfaW5mby0+bGVuZ3RoKTsKKwkJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIkRTRFQgbGVuZ3RoICAgICAgICA6ICVzXG4iLCBidWYpOworCQlzbnByaW50ZihidWYsIDE2LCAiJWQiLCBhc3VzX2luZm8tPmNoZWNrc3VtKTsKKwkJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIkRTRFQgY2hlY2tzdW0gICAgICA6ICVzXG4iLCBidWYpOworCQlzbnByaW50ZihidWYsIDE2LCAiJWQiLCBhc3VzX2luZm8tPnJldmlzaW9uKTsKKwkJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIkRTRFQgcmV2aXNpb24gICAgICA6ICVzXG4iLCBidWYpOworCQlzbnByaW50ZihidWYsIDcsICIlcyIsIGFzdXNfaW5mby0+b2VtX2lkKTsKKwkJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIk9FTSBpZCAgICAgICAgICAgICA6ICVzXG4iLCBidWYpOworCQlzbnByaW50ZihidWYsIDksICIlcyIsIGFzdXNfaW5mby0+b2VtX3RhYmxlX2lkKTsKKwkJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIk9FTSB0YWJsZSBpZCAgICAgICA6ICVzXG4iLCBidWYpOworCQlzbnByaW50ZihidWYsIDE2LCAiJXgiLCBhc3VzX2luZm8tPm9lbV9yZXZpc2lvbik7CisJCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJPRU0gcmV2aXNpb24gICAgICAgOiAweCVzXG4iLCBidWYpOworCQlzbnByaW50ZihidWYsIDUsICIlcyIsIGFzdXNfaW5mby0+YXNsX2NvbXBpbGVyX2lkKTsKKwkJbGVuICs9IHNwcmludGYocGFnZSArIGxlbiwgIkFTTCBjb21wIHZlbmRvciBpZCA6ICVzXG4iLCBidWYpOworCQlzbnByaW50ZihidWYsIDE2LCAiJXgiLCBhc3VzX2luZm8tPmFzbF9jb21waWxlcl9yZXZpc2lvbik7CisJCWxlbiArPSBzcHJpbnRmKHBhZ2UgKyBsZW4sICJBU0wgY29tcCByZXZpc2lvbiAgOiAweCVzXG4iLCBidWYpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYXJnKGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50ICp2YWwpCit7CisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50ID4gMzEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCB2YWwpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfc3RhdHVzKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkJICAgIGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IG1hc2ssIGludCBpbnZlcnQpCit7CisJaW50IHJ2LCB2YWx1ZTsKKwlpbnQgb3V0ID0gMDsKKworCXJ2ID0gcGFyc2VfYXJnKGJ1ZiwgY291bnQsICZ2YWx1ZSk7CisJaWYgKHJ2ID4gMCkKKwkJb3V0ID0gdmFsdWUgPyAxIDogMDsKKworCXdyaXRlX3N0YXR1cyhoYW5kbGUsIG91dCwgbWFzaywgaW52ZXJ0KTsKKworCXJldHVybiBydjsKK30KKworLyoKKyAqIExFREQgZGlzcGxheQorICovCitzdGF0aWMgc3NpemVfdCBzaG93X2xlZGQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLCBob3RrLT5sZWRkX3N0YXR1cyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2xlZGQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJ2LCB2YWx1ZTsKKworCXJ2ID0gcGFyc2VfYXJnKGJ1ZiwgY291bnQsICZ2YWx1ZSk7CisJaWYgKHJ2ID4gMCkgeworCQlpZiAoIXdyaXRlX2FjcGlfaW50KGxlZGRfc2V0X2hhbmRsZSwgTlVMTCwgdmFsdWUsIE5VTEwpKQorCQkJcHJpbnRrKEFTVVNfV0FSTklORyAiTEVEIGRpc3BsYXkgd3JpdGUgZmFpbGVkXG4iKTsKKwkJZWxzZQorCQkJaG90ay0+bGVkZF9zdGF0dXMgPSAodTMyKSB2YWx1ZTsKKwl9CisJcmV0dXJuIHJ2OworfQorCisvKgorICogV0xBTgorICovCitzdGF0aWMgc3NpemVfdCBzaG93X3dsYW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJlYWRfc3RhdHVzKFdMX09OKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3dsYW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHN0b3JlX3N0YXR1cyhidWYsIGNvdW50LCB3bF9zd2l0Y2hfaGFuZGxlLCBXTF9PTiwgMCk7Cit9CisKKy8qCisgKiBCbHVldG9vdGgKKyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19ibHVldG9vdGgoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVhZF9zdGF0dXMoQlRfT04pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfYmx1ZXRvb3RoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgICAgIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gc3RvcmVfc3RhdHVzKGJ1ZiwgY291bnQsIGJ0X3N3aXRjaF9oYW5kbGUsIEJUX09OLCAwKTsKK30KKworLyoKKyAqIERpc3BsYXkKKyAqLworc3RhdGljIHZvaWQgc2V0X2Rpc3BsYXkoaW50IHZhbHVlKQoreworCS8qIG5vIHNhbml0eSBjaGVjayBuZWVkZWQgZm9yIG5vdyAqLworCWlmICghd3JpdGVfYWNwaV9pbnQoZGlzcGxheV9zZXRfaGFuZGxlLCBOVUxMLCB2YWx1ZSwgTlVMTCkpCisJCXByaW50ayhBU1VTX1dBUk5JTkcgIkVycm9yIHNldHRpbmcgZGlzcGxheVxuIik7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHJlYWRfZGlzcGxheSh2b2lkKQoreworCWludCB2YWx1ZSA9IDA7CisKKwkvKiBJbiBtb3N0IG9mIHRoZSBjYXNlLCB3ZSBrbm93IGhvdyB0byBzZXQgdGhlIGRpc3BsYXksIGJ1dCBzb21ldGltZQorCSAgIHdlIGNhbid0IHJlYWQgaXQgKi8KKwlpZiAoZGlzcGxheV9nZXRfaGFuZGxlKSB7CisJCWlmICghcmVhZF9hY3BpX2ludChkaXNwbGF5X2dldF9oYW5kbGUsIE5VTEwsICZ2YWx1ZSwgTlVMTCkpCisJCQlwcmludGsoQVNVU19XQVJOSU5HICJFcnJvciByZWFkaW5nIGRpc3BsYXkgc3RhdHVzXG4iKTsKKwl9CisKKwl2YWx1ZSAmPSAweDBGOwkJLyogbmVlZGVkIGZvciBzb21lIG1vZGVscywgc2hvdWxkbid0IGh1cnQgb3RoZXJzICovCisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBOb3csICp0aGlzKiBvbmUgY291bGQgYmUgbW9yZSB1c2VyLWZyaWVuZGx5LCBidXQgc28gZmFyLCBuby1vbmUgaGFzCisgKiBjb21wbGFpbmVkLiBUaGUgc2lnbmlmaWNhbmNlIG9mIGJpdHMgaXMgdGhlIHNhbWUgYXMgaW4gc3RvcmVfZGlzcCgpCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfZGlzcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcmVhZF9kaXNwbGF5KCkpOworfQorCisvKgorICogRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGRpc3BsYXkgc3dpdGNoaW5nLiBBcyBvZiBub3c6IDEgc2hvdWxkIGFjdGl2YXRlCisgKiB0aGUgTENEIG91dHB1dCwgMiBzaG91bGQgZG8gZm9yIENSVCwgNCBmb3IgVFYtT3V0IGFuZCA4IGZvciBEVkkuCisgKiBBbnkgY29tYmluYXRpb24gKGJpdHdpc2UpIG9mIHRoZXNlIHdpbGwgc3VmZmljZS4gSSBuZXZlciBhY3R1YWxseSB0ZXN0ZWQgNAorICogZGlzcGxheXMgaG9va2VkIHVwIHNpbXVsdGFuZW91c2x5LCBzbyBiZSB3YXJuZWQuIFNlZSB0aGUgYWNwaTRhc3VzIFJFQURNRQorICogZm9yIG1vcmUgaW5mby4KKyAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfZGlzcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcnYsIHZhbHVlOworCisJcnYgPSBwYXJzZV9hcmcoYnVmLCBjb3VudCwgJnZhbHVlKTsKKwlpZiAocnYgPiAwKQorCQlzZXRfZGlzcGxheSh2YWx1ZSk7CisJcmV0dXJuIHJ2OworfQorCisvKgorICogTGlnaHQgU2VucworICovCitzdGF0aWMgdm9pZCBzZXRfbGlnaHRfc2Vuc19zd2l0Y2goaW50IHZhbHVlKQoreworCWlmICghd3JpdGVfYWNwaV9pbnQobHNfc3dpdGNoX2hhbmRsZSwgTlVMTCwgdmFsdWUsIE5VTEwpKQorCQlwcmludGsoQVNVU19XQVJOSU5HICJFcnJvciBzZXR0aW5nIGxpZ2h0IHNlbnNvciBzd2l0Y2hcbiIpOworCWhvdGstPmxpZ2h0X3N3aXRjaCA9IHZhbHVlOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2xzc3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGhvdGstPmxpZ2h0X3N3aXRjaCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2xzc3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJ2LCB2YWx1ZTsKKworCXJ2ID0gcGFyc2VfYXJnKGJ1ZiwgY291bnQsICZ2YWx1ZSk7CisJaWYgKHJ2ID4gMCkKKwkJc2V0X2xpZ2h0X3NlbnNfc3dpdGNoKHZhbHVlID8gMSA6IDApOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCBzZXRfbGlnaHRfc2Vuc19sZXZlbChpbnQgdmFsdWUpCit7CisJaWYgKCF3cml0ZV9hY3BpX2ludChsc19sZXZlbF9oYW5kbGUsIE5VTEwsIHZhbHVlLCBOVUxMKSkKKwkJcHJpbnRrKEFTVVNfV0FSTklORyAiRXJyb3Igc2V0dGluZyBsaWdodCBzZW5zb3IgbGV2ZWxcbiIpOworCWhvdGstPmxpZ2h0X2xldmVsID0gdmFsdWU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbHNsdmwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBob3RrLT5saWdodF9sZXZlbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2xzbHZsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcnYsIHZhbHVlOworCisJcnYgPSBwYXJzZV9hcmcoYnVmLCBjb3VudCwgJnZhbHVlKTsKKwlpZiAocnYgPiAwKSB7CisJCXZhbHVlID0gKDAgPCB2YWx1ZSkgPyAoKDE1IDwgdmFsdWUpID8gMTUgOiB2YWx1ZSkgOiAwOworCQkvKiAwIDw9IHZhbHVlIDw9IDE1ICovCisJCXNldF9saWdodF9zZW5zX2xldmVsKHZhbHVlKTsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIGFzdXNfaG90a19ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJLyogVE9ETyBGaW5kIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgZXZlbnRzIGNvdW50LiAqLworCWlmICghaG90aykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIHRlbGwgdGhlIGJhY2tsaWdodCBkZXZpY2Ugd2hlbiB0aGUgYmFja2xpZ2h0IHBvd2VyIGlzCisJICogc3dpdGNoZWQKKwkgKi8KKwlpZiAoZXZlbnQgPT0gQVRLRF9MQ0RfT04pIHsKKwkJd3JpdGVfc3RhdHVzKE5VTEwsIDEsIExDRF9PTiwgMCk7CisJCWxjZF9ibGFuayhGQl9CTEFOS19VTkJMQU5LKTsKKwl9IGVsc2UgaWYgKGV2ZW50ID09IEFUS0RfTENEX09GRikgeworCQl3cml0ZV9zdGF0dXMoTlVMTCwgMCwgTENEX09OLCAwKTsKKwkJbGNkX2JsYW5rKEZCX0JMQU5LX1BPV0VSRE9XTik7CisJfQorCisJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoaG90ay0+ZGV2aWNlLCBldmVudCwKKwkJCQlob3RrLT5ldmVudF9jb3VudFtldmVudCAlIDEyOF0rKyk7CisKKwlyZXR1cm47Cit9CisKKyNkZWZpbmUgQVNVU19DUkVBVEVfREVWSUNFX0FUVFIoX25hbWUpCQkJCQlcCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfIyNfbmFtZSA9IHsJCQlcCisJCS5hdHRyID0gewkJCQkJCVwKKwkJCS5uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLAkJCVwKKwkJCS5tb2RlID0gMCwJCQkJCVwKKwkJCS5vd25lciA9IFRISVNfTU9EVUxFIH0sCQkJCVwKKwkJLnNob3cgICA9IE5VTEwsCQkJCQkJXAorCQkuc3RvcmUgID0gTlVMTCwJCQkJCQlcCisJfQorCisjZGVmaW5lIEFTVVNfU0VUX0RFVklDRV9BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWRldl9hdHRyXyMjX25hbWUuYXR0ci5tb2RlID0gX21vZGU7CQkJXAorCQlkZXZfYXR0cl8jI19uYW1lLnNob3cgPSBfc2hvdzsJCQkJXAorCQlkZXZfYXR0cl8jI19uYW1lLnN0b3JlID0gX3N0b3JlOwkJCVwKKwl9IHdoaWxlKDApCisKK3N0YXRpYyBBU1VTX0NSRUFURV9ERVZJQ0VfQVRUUihpbmZvcyk7CitzdGF0aWMgQVNVU19DUkVBVEVfREVWSUNFX0FUVFIod2xhbik7CitzdGF0aWMgQVNVU19DUkVBVEVfREVWSUNFX0FUVFIoYmx1ZXRvb3RoKTsKK3N0YXRpYyBBU1VTX0NSRUFURV9ERVZJQ0VfQVRUUihkaXNwbGF5KTsKK3N0YXRpYyBBU1VTX0NSRUFURV9ERVZJQ0VfQVRUUihsZWRkKTsKK3N0YXRpYyBBU1VTX0NSRUFURV9ERVZJQ0VfQVRUUihsc19zd2l0Y2gpOworc3RhdGljIEFTVVNfQ1JFQVRFX0RFVklDRV9BVFRSKGxzX2xldmVsKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFzdXNwZl9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2luZm9zLmF0dHIsCisJJmRldl9hdHRyX3dsYW4uYXR0ciwKKwkmZGV2X2F0dHJfYmx1ZXRvb3RoLmF0dHIsCisJJmRldl9hdHRyX2Rpc3BsYXkuYXR0ciwKKwkmZGV2X2F0dHJfbGVkZC5hdHRyLAorCSZkZXZfYXR0cl9sc19zd2l0Y2guYXR0ciwKKwkmZGV2X2F0dHJfbHNfbGV2ZWwuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhc3VzcGZfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFzdXNwZl9hdHRyaWJ1dGVzCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhc3VzcGZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gQVNVU19IT1RLX0ZJTEUsCisJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICB9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXN1c3BmX2RldmljZTsKKworc3RhdGljIHZvaWQgYXN1c19ob3RrX2FkZF9mcyh2b2lkKQoreworCUFTVVNfU0VUX0RFVklDRV9BVFRSKGluZm9zLCAwNDQ0LCBzaG93X2luZm9zLCBOVUxMKTsKKworCWlmICh3bF9zd2l0Y2hfaGFuZGxlKQorCQlBU1VTX1NFVF9ERVZJQ0VfQVRUUih3bGFuLCAwNjQ0LCBzaG93X3dsYW4sIHN0b3JlX3dsYW4pOworCisJaWYgKGJ0X3N3aXRjaF9oYW5kbGUpCisJCUFTVVNfU0VUX0RFVklDRV9BVFRSKGJsdWV0b290aCwgMDY0NCwKKwkJCQkgICAgIHNob3dfYmx1ZXRvb3RoLCBzdG9yZV9ibHVldG9vdGgpOworCisJaWYgKGRpc3BsYXlfc2V0X2hhbmRsZSAmJiBkaXNwbGF5X2dldF9oYW5kbGUpCisJCUFTVVNfU0VUX0RFVklDRV9BVFRSKGRpc3BsYXksIDA2NDQsIHNob3dfZGlzcCwgc3RvcmVfZGlzcCk7CisJZWxzZSBpZiAoZGlzcGxheV9zZXRfaGFuZGxlKQorCQlBU1VTX1NFVF9ERVZJQ0VfQVRUUihkaXNwbGF5LCAwMjAwLCBOVUxMLCBzdG9yZV9kaXNwKTsKKworCWlmIChsZWRkX3NldF9oYW5kbGUpCisJCUFTVVNfU0VUX0RFVklDRV9BVFRSKGxlZGQsIDA2NDQsIHNob3dfbGVkZCwgc3RvcmVfbGVkZCk7CisKKwlpZiAobHNfc3dpdGNoX2hhbmRsZSAmJiBsc19sZXZlbF9oYW5kbGUpIHsKKwkJQVNVU19TRVRfREVWSUNFX0FUVFIobHNfbGV2ZWwsIDA2NDQsIHNob3dfbHNsdmwsIHN0b3JlX2xzbHZsKTsKKwkJQVNVU19TRVRfREVWSUNFX0FUVFIobHNfc3dpdGNoLCAwNjQ0LCBzaG93X2xzc3csIHN0b3JlX2xzc3cpOworCX0KK30KKworc3RhdGljIGludCBhc3VzX2hhbmRsZV9pbml0KGNoYXIgKm5hbWUsIGFjcGlfaGFuZGxlICogaGFuZGxlLAorCQkJICAgIGNoYXIgKipwYXRocywgaW50IG51bV9wYXRocykKK3sKKwlpbnQgaTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhdGhzOyBpKyspIHsKKwkJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIHBhdGhzW2ldLCBoYW5kbGUpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkqaGFuZGxlID0gTlVMTDsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2RlZmluZSBBU1VTX0hBTkRMRV9JTklUKG9iamVjdCkJCQkJCVwKKwlhc3VzX2hhbmRsZV9pbml0KCNvYmplY3QsICZvYmplY3QjI19oYW5kbGUsIG9iamVjdCMjX3BhdGhzLAlcCisJCQkgQVJSQVlfU0laRShvYmplY3QjI19wYXRocykpCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgaG90ayB3aXRoIHJpZ2h0IHZhbHVlcy4gSW4gdGhpcworICogbWV0aG9kLCB3ZSBjYW4gbWFrZSBhbGwgdGhlIGRldGVjdGlvbiB3ZSB3YW50LCBhbmQgbW9kaWZ5IHRoZSBob3RrIHN0cnVjdAorICovCitzdGF0aWMgaW50IGFzdXNfaG90a19nZXRfaW5mbyh2b2lkKQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJdW5pb24gYWNwaV9vYmplY3QgKm1vZGVsID0gTlVMTDsKKwlpbnQgYnN0c19yZXN1bHQsIGh3cnNfcmVzdWx0OworCWNoYXIgKnN0cmluZyA9IE5VTEw7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJLyoKKwkgKiBHZXQgRFNEVCBoZWFkZXJzIGVhcmx5IGVub3VnaCB0byBhbGxvdyBmb3IgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4KKwkgKiBtb2RlbHMsIGJ1dCBsYXRlIGVub3VnaCB0byBhbGxvdyBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoKSB0byBmYWlsCisJICogYmVmb3JlIGRvaW5nIGFueXRoaW5nIEFDUEktc3BlY2lmaWMuIFNob3VsZCB3ZSBlbmNvdW50ZXIgYSBtYWNoaW5lLAorCSAqIHdoaWNoIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgKGkuZS4gaXRzIGhvdGtleSBkZXZpY2UgaGFzIGEgZGlmZmVyZW50CisJICogSElEKSwgdGhpcyBiaXQgd2lsbCBiZSBtb3ZlZC4gQSBnbG9iYWwgdmFyaWFibGUgYXN1c19pbmZvIGNvbnRhaW5zCisJICogdGhlIERTRFQgaGVhZGVyLgorCSAqLworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0RTRFQsIDEsICZhc3VzX2luZm8pOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcHJpbnRrKEFTVVNfV0FSTklORyAiQ291bGRuJ3QgZ2V0IHRoZSBEU0RUIHRhYmxlIGhlYWRlclxuIik7CisKKwkvKiBXZSBoYXZlIHRvIHdyaXRlIDAgb24gaW5pdCB0aGlzIGZhciBmb3IgYWxsIEFTVVMgbW9kZWxzICovCisJaWYgKCF3cml0ZV9hY3BpX2ludChob3RrLT5oYW5kbGUsICJJTklUIiwgMCwgJmJ1ZmZlcikpIHsKKwkJcHJpbnRrKEFTVVNfRVJSICJIb3RrZXkgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgZm9yIHNvbWUgbGFwdG9wcyB0byBpbml0IHByb3Blcmx5ICovCisJaWYgKCFyZWFkX2FjcGlfaW50KGhvdGstPmhhbmRsZSwgIkJTVFMiLCAmYnN0c19yZXN1bHQsIE5VTEwpKQorCQlwcmludGsoQVNVU19XQVJOSU5HICJFcnJvciBjYWxsaW5nIEJTVFNcbiIpOworCWVsc2UgaWYgKGJzdHNfcmVzdWx0KQorCQlwcmludGsoQVNVU19OT1RJQ0UgIkJTVFMgY2FsbGVkLCAweCUwMnggcmV0dXJuZWRcbiIsCisJCSAgICAgICBic3RzX3Jlc3VsdCk7CisKKwkvKgorCSAqIFRyeSB0byBtYXRjaCB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IElOSVQgdG8gdGhlIHNwZWNpZmljIG1vZGVsLgorCSAqIEhhbmRsZSBldmVyeSBwb3NzaWJsZSBvYmplY3QgKG9yIHRoZSBsYWNrIG9mIHRoZXJlb2YpIHRoZSBEU0RUCisJICogd3JpdGVycyBtaWdodCB0aHJvdyBhdCB1cy4gV2hlbiBpbiB0cm91YmxlLCB3ZSBwYXNzIE5VTEwgdG8KKwkgKiBhc3VzX21vZGVsX21hdGNoKCkgYW5kIHRyeSBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQuCisJICovCisJaWYgKGJ1ZmZlci5wb2ludGVyKSB7CisJCW1vZGVsID0gYnVmZmVyLnBvaW50ZXI7CisJCXN3aXRjaCAobW9kZWwtPnR5cGUpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgorCQkJc3RyaW5nID0gbW9kZWwtPnN0cmluZy5wb2ludGVyOworCQkJYnJlYWs7CisJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKwkJCXN0cmluZyA9IG1vZGVsLT5idWZmZXIucG9pbnRlcjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RyaW5nID0gIiI7CisJCQlicmVhazsKKwkJfQorCX0KKwlob3RrLT5uYW1lID0ga3N0cmR1cChzdHJpbmcsIEdGUF9LRVJORUwpOworCWlmICghaG90ay0+bmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKnN0cmluZykKKwkJcHJpbnRrKEFTVVNfTk9USUNFICIgICVzIG1vZGVsIGRldGVjdGVkXG4iLCBzdHJpbmcpOworCisJQVNVU19IQU5ETEVfSU5JVChtbGVkX3NldCk7CisJQVNVU19IQU5ETEVfSU5JVCh0bGVkX3NldCk7CisJQVNVU19IQU5ETEVfSU5JVChybGVkX3NldCk7CisJQVNVU19IQU5ETEVfSU5JVChwbGVkX3NldCk7CisKKwlBU1VTX0hBTkRMRV9JTklUKGxlZGRfc2V0KTsKKworCS8qCisJICogVGhlIEhXUlMgbWV0aG9kIHJldHVybiBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlIGhhcmR3YXJlLgorCSAqIDB4ODAgYml0IGlzIGZvciBXTEFOLCAweDEwMCBmb3IgQmx1ZXRvb3RoLgorCSAqIFRoZSBzaWduaWZpY2FuY2Ugb2Ygb3RoZXJzIGlzIHlldCB0byBiZSBmb3VuZC4KKwkgKiBJZiB3ZSBkb24ndCBmaW5kIHRoZSBtZXRob2QsIHdlIGFzc3VtZSB0aGUgZGV2aWNlIGFyZSBwcmVzZW50LgorCSAqLworCWlmICghcmVhZF9hY3BpX2ludChob3RrLT5oYW5kbGUsICJIUldTIiwgJmh3cnNfcmVzdWx0LCBOVUxMKSkKKwkJaHdyc19yZXN1bHQgPSBXTF9IV1JTIHwgQlRfSFdSUzsKKworCWlmIChod3JzX3Jlc3VsdCAmIFdMX0hXUlMpCisJCUFTVVNfSEFORExFX0lOSVQod2xfc3dpdGNoKTsKKwlpZiAoaHdyc19yZXN1bHQgJiBCVF9IV1JTKQorCQlBU1VTX0hBTkRMRV9JTklUKGJ0X3N3aXRjaCk7CisKKwlBU1VTX0hBTkRMRV9JTklUKHdpcmVsZXNzX3N0YXR1cyk7CisKKwlBU1VTX0hBTkRMRV9JTklUKGJyaWdodG5lc3Nfc2V0KTsKKwlBU1VTX0hBTkRMRV9JTklUKGJyaWdodG5lc3NfZ2V0KTsKKworCUFTVVNfSEFORExFX0lOSVQobGNkX3N3aXRjaCk7CisKKwlBU1VTX0hBTkRMRV9JTklUKGRpc3BsYXlfc2V0KTsKKwlBU1VTX0hBTkRMRV9JTklUKGRpc3BsYXlfZ2V0KTsKKworCS8qIFRoZXJlIGlzIGEgbG90IG9mIG1vZGVscyB3aXRoICJBTFNMIiwgYnV0IGEgZmV3IGdldAorCSAgIGEgcmVhbCBsaWdodCBzZW5zLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGl0LiAqLworCWlmIChBU1VTX0hBTkRMRV9JTklUKGxzX3N3aXRjaCkpCisJCUFTVVNfSEFORExFX0lOSVQobHNfbGV2ZWwpOworCisJa2ZyZWUobW9kZWwpOworCisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgaW50IGFzdXNfaG90a19jaGVjayh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCisJcmVzdWx0ID0gYWNwaV9idXNfZ2V0X3N0YXR1cyhob3RrLT5kZXZpY2UpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlpZiAoaG90ay0+ZGV2aWNlLT5zdGF0dXMucHJlc2VudCkgeworCQlyZXN1bHQgPSBhc3VzX2hvdGtfZ2V0X2luZm8oKTsKKwl9IGVsc2UgeworCQlwcmludGsoQVNVU19FUlIgIkhvdGtleSBkZXZpY2Ugbm90IHByZXNlbnQsIGFib3J0aW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBhc3VzX2hvdGtfZm91bmQ7CisKK3N0YXRpYyBpbnQgYXN1c19ob3RrX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlpbnQgcmVzdWx0OworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpbnRrKEFTVVNfTk9USUNFICJBc3VzIExhcHRvcCBTdXBwb3J0IHZlcnNpb24gJXNcbiIsCisJICAgICAgIEFTVVNfTEFQVE9QX1ZFUlNJT04pOworCisJaG90ayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3VzX2hvdGspLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhvdGspCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChob3RrLCAwLCBzaXplb2Yoc3RydWN0IGFzdXNfaG90aykpOworCisJaG90ay0+aGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CisJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQVNVU19IT1RLX0RFVklDRV9OQU1FKTsKKwlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQVNVU19IT1RLX0NMQVNTKTsKKwlhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkgPSBob3RrOworCWhvdGstPmRldmljZSA9IGRldmljZTsKKworCXJlc3VsdCA9IGFzdXNfaG90a19jaGVjaygpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZW5kOworCisJYXN1c19ob3RrX2FkZF9mcygpOworCisJLyoKKwkgKiBXZSBpbnN0YWxsIHRoZSBoYW5kbGVyLCBpdCB3aWxsIHJlY2VpdmUgdGhlIGhvdGsgaW4gcGFyYW1ldGVyLCBzbywgd2UKKwkgKiBjb3VsZCBhZGQgb3RoZXIgZGF0YSB0byB0aGUgaG90ayBzdHJ1Y3QKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoaG90ay0+aGFuZGxlLCBBQ1BJX1NZU1RFTV9OT1RJRlksCisJCQkJCSAgICAgYXN1c19ob3RrX25vdGlmeSwgaG90ayk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlwcmludGsoQVNVU19FUlIgIkVycm9yIGluc3RhbGxpbmcgbm90aWZ5IGhhbmRsZXJcbiIpOworCisJYXN1c19ob3RrX2ZvdW5kID0gMTsKKworCS8qIFdMRUQgYW5kIEJMRUQgYXJlIG9uIGJ5IGRlZmF1bHQgKi8KKwl3cml0ZV9zdGF0dXMoYnRfc3dpdGNoX2hhbmRsZSwgMSwgQlRfT04sIDApOworCXdyaXRlX3N0YXR1cyh3bF9zd2l0Y2hfaGFuZGxlLCAxLCBXTF9PTiwgMCk7CisKKwkvKiBMQ0QgQmFja2xpZ2h0IGlzIG9uIGJ5IGRlZmF1bHQgKi8KKwl3cml0ZV9zdGF0dXMoTlVMTCwgMSwgTENEX09OLCAwKTsKKworCS8qIExFRCBkaXNwbGF5IGlzIG9mZiBieSBkZWZhdWx0ICovCisJaG90ay0+bGVkZF9zdGF0dXMgPSAweEZGRjsKKworCS8qIFNldCBpbml0aWFsIHZhbHVlcyBvZiBsaWdodCBzZW5zb3IgYW5kIGxldmVsICovCisJaG90ay0+bGlnaHRfc3dpdGNoID0gMTsJLyogRGVmYXVsdCB0byBsaWdodCBzZW5zb3IgZGlzYWJsZWQgKi8KKwlob3RrLT5saWdodF9sZXZlbCA9IDA7CS8qIGxldmVsIDUgZm9yIHNlbnNvciBzZW5zaXRpdml0eSAqLworCisJaWYgKGxzX3N3aXRjaF9oYW5kbGUpCisJCXNldF9saWdodF9zZW5zX3N3aXRjaChob3RrLT5saWdodF9zd2l0Y2gpOworCisJaWYgKGxzX2xldmVsX2hhbmRsZSkKKwkJc2V0X2xpZ2h0X3NlbnNfbGV2ZWwoaG90ay0+bGlnaHRfbGV2ZWwpOworCisgICAgICBlbmQ6CisJaWYgKHJlc3VsdCkgeworCQlrZnJlZShob3RrLT5uYW1lKTsKKwkJa2ZyZWUoaG90ayk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBhc3VzX2hvdGtfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXMgPSAwOworCisJaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihob3RrLT5oYW5kbGUsIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJICAgIGFzdXNfaG90a19ub3RpZnkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcHJpbnRrKEFTVVNfRVJSICJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIik7CisKKwlrZnJlZShob3RrLT5uYW1lKTsKKwlrZnJlZShob3RrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhc3VzX2JhY2tsaWdodF9leGl0KHZvaWQpCit7CisJaWYgKGFzdXNfYmFja2xpZ2h0X2RldmljZSkKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGFzdXNfYmFja2xpZ2h0X2RldmljZSk7Cit9CisKKyNkZWZpbmUgIEFTVVNfTEVEX1VOUkVHSVNURVIob2JqZWN0KQkJCQlcCisJaWYob2JqZWN0IyNfbGVkLmNsYXNzX2RldgkJCQlcCisJICAgJiYgIUlTX0VSUihvYmplY3QjI19sZWQuY2xhc3NfZGV2KSkJCQlcCisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZvYmplY3QjI19sZWQpCisKK3N0YXRpYyB2b2lkIGFzdXNfbGVkX2V4aXQodm9pZCkKK3sKKwlBU1VTX0xFRF9VTlJFR0lTVEVSKG1sZWQpOworCUFTVVNfTEVEX1VOUkVHSVNURVIodGxlZCk7CisJQVNVU19MRURfVU5SRUdJU1RFUihwbGVkKTsKKwlBU1VTX0xFRF9VTlJFR0lTVEVSKHJsZWQpOworCisJZGVzdHJveV93b3JrcXVldWUobGVkX3dvcmtxdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhc3VzX2xhcHRvcF9leGl0KHZvaWQpCit7CisJYXN1c19iYWNrbGlnaHRfZXhpdCgpOworCWFzdXNfbGVkX2V4aXQoKTsKKworCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhc3VzX2hvdGtfZHJpdmVyKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmFzdXNwZl9kZXZpY2UtPmRldi5rb2JqLCAmYXN1c3BmX2F0dHJpYnV0ZV9ncm91cCk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoYXN1c3BmX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFzdXNwZl9kcml2ZXIpOworfQorCitzdGF0aWMgaW50IGFzdXNfYmFja2xpZ2h0X2luaXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKworCWlmIChicmlnaHRuZXNzX3NldF9oYW5kbGUgJiYgbGNkX3N3aXRjaF9oYW5kbGUpIHsKKwkJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKEFTVVNfSE9US19GSUxFLCBkZXYsCisJCQkJCSAgICAgICBOVUxMLCAmYXN1c2JsX2RhdGEpOworCQlpZiAoSVNfRVJSKGJkKSkgeworCQkJcHJpbnRrKEFTVVNfRVJSCisJCQkgICAgICAgIkNvdWxkIG5vdCByZWdpc3RlciBhc3VzIGJhY2tsaWdodCBkZXZpY2VcbiIpOworCQkJYXN1c19iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKKwkJCXJldHVybiBQVFJfRVJSKGJkKTsKKwkJfQorCisJCWFzdXNfYmFja2xpZ2h0X2RldmljZSA9IGJkOworCisJCWRvd24oJmJkLT5zZW0pOworCQlpZiAobGlrZWx5KGJkLT5wcm9wcykpIHsKKwkJCWJkLT5wcm9wcy0+YnJpZ2h0bmVzcyA9IHJlYWRfYnJpZ2h0bmVzcyhOVUxMKTsKKwkJCWJkLT5wcm9wcy0+cG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCQkJaWYgKGxpa2VseShiZC0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMpKQorCQkJCWJkLT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhiZCk7CisJCX0KKwkJdXAoJmJkLT5zZW0pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3VzX2xlZF9yZWdpc3RlcihhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxkZXYsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKGRldiwgbGRldik7Cit9CisKKyNkZWZpbmUgQVNVU19MRURfUkVHSVNURVIob2JqZWN0LCBkZXZpY2UpCQkJCVwKKwlhc3VzX2xlZF9yZWdpc3RlcihvYmplY3QjI19zZXRfaGFuZGxlLCAmb2JqZWN0IyNfbGVkLCBkZXZpY2UpCisKK3N0YXRpYyBpbnQgYXN1c19sZWRfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJ2OworCisJcnYgPSBBU1VTX0xFRF9SRUdJU1RFUihtbGVkLCBkZXYpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJcnYgPSBBU1VTX0xFRF9SRUdJU1RFUih0bGVkLCBkZXYpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJcnYgPSBBU1VTX0xFRF9SRUdJU1RFUihybGVkLCBkZXYpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJcnYgPSBBU1VTX0xFRF9SRUdJU1RFUihwbGVkLCBkZXYpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJbGVkX3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJsZWRfd29ya3F1ZXVlIik7CisJaWYgKCFsZWRfd29ya3F1ZXVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhc3VzX2xhcHRvcF9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCByZXN1bHQ7CisKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpIHsKKwkJcHJpbnRrKEFTVVNfRVJSICJVc2luZyBnZW5lcmljIGhvdGtleSBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXN1bHQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFzdXNfaG90a19kcml2ZXIpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OworCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IG9mIGEga2x1ZGdlLiAgV2Ugb25seSB3YW50IHRoaXMgbW9kdWxlIGxvYWRlZAorCSAqIGZvciBBU1VTIHN5c3RlbXMsIGJ1dCB0aGVyZSdzIGN1cnJlbnRseSBubyB3YXkgdG8gcHJvYmUgdGhlCisJICogQUNQSSBuYW1lc3BhY2UgZm9yIEFTVVMgSElEcy4gIFNvIHdlIGp1c3QgcmV0dXJuIGZhaWx1cmUgaWYKKwkgKiB3ZSBkaWRuJ3QgZmluZCBvbmUsIHdoaWNoIHdpbGwgY2F1c2UgdGhlIG1vZHVsZSB0byBiZQorCSAqIHVubG9hZGVkLgorCSAqLworCWlmICghYXN1c19ob3RrX2ZvdW5kKSB7CisJCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhc3VzX2hvdGtfZHJpdmVyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZGV2ID0gYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKGhvdGstPmRldmljZS0+aGFuZGxlKTsKKworCXJlc3VsdCA9IGFzdXNfYmFja2xpZ2h0X2luaXQoZGV2KTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfYmFja2xpZ2h0OworCisJcmVzdWx0ID0gYXN1c19sZWRfaW5pdChkZXYpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbF9sZWQ7CisKKwkvKiBSZWdpc3RlciBwbGF0Zm9ybSBzdHVmZiAqLworCXJlc3VsdCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXN1c3BmX2RyaXZlcik7CisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsX3BsYXRmb3JtX2RyaXZlcjsKKworCWFzdXNwZl9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoQVNVU19IT1RLX0ZJTEUsIC0xKTsKKwlpZiAoIWFzdXNwZl9kZXZpY2UpIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsX3BsYXRmb3JtX2RldmljZTE7CisJfQorCisJcmVzdWx0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChhc3VzcGZfZGV2aWNlKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfcGxhdGZvcm1fZGV2aWNlMjsKKworCXJlc3VsdCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmYXN1c3BmX2RldmljZS0+ZGV2LmtvYmosCisJCQkJICAgICZhc3VzcGZfYXR0cmlidXRlX2dyb3VwKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWxfc3lzZnM7CisKKwlyZXR1cm4gMDsKKworICAgICAgZmFpbF9zeXNmczoKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKGFzdXNwZl9kZXZpY2UpOworCisgICAgICBmYWlsX3BsYXRmb3JtX2RldmljZTI6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChhc3VzcGZfZGV2aWNlKTsKKworICAgICAgZmFpbF9wbGF0Zm9ybV9kZXZpY2UxOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhc3VzcGZfZHJpdmVyKTsKKworICAgICAgZmFpbF9wbGF0Zm9ybV9kcml2ZXI6CisJYXN1c19sZWRfZXhpdCgpOworCisgICAgICBmYWlsX2xlZDoKKwlhc3VzX2JhY2tsaWdodF9leGl0KCk7CisKKyAgICAgIGZhaWxfYmFja2xpZ2h0OgorCisJcmV0dXJuIHJlc3VsdDsKK30KKworbW9kdWxlX2luaXQoYXN1c19sYXB0b3BfaW5pdCk7Cittb2R1bGVfZXhpdChhc3VzX2xhcHRvcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTl4LmMgYi9kcml2ZXJzL25ldC8zYzU5eC5jCmluZGV4IDgwYmRjZjguLjcxNmE0NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTl4LmMKKysrIGIvZHJpdmVycy9uZXQvM2M1OXguYwpAQCAtNzkyLDggKzc5Miw3IEBACiB7CiAJc3RydWN0IHZvcnRleF9wcml2YXRlICp2cCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkodnAtPmZ1bGxfYnVzX21hc3Rlcl9yeCA/IGJvb21lcmFuZ19pbnRlcnJ1cHQ6dm9ydGV4X2ludGVycnVwdCkoZGV2LT5pcnEsZGV2KTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCA4YWE4ZGQwLi5hZDkyYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTE5MCw3ICsxOTAsNyBAQAogCiBjb25maWcgTUFDQgogCXRyaXN0YXRlICJBdG1lbCBNQUNCIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgQVZSMzIKKwlkZXBlbmRzIG9uIE5FVF9FVEhFUk5FVCAmJiAoQVZSMzIgfHwgQVJDSF9BVDkxU0FNOTI2MCB8fCBBUkNIX0FUOTFTQU05MjYzKQogCXNlbGVjdCBNSUkKIAloZWxwCiAJICBUaGUgQXRtZWwgTUFDQiBldGhlcm5ldCBpbnRlcmZhY2UgaXMgZm91bmQgb24gbWFueSBBVDMyIGFuZCBBVDkxCkBAIC0yMzUsMTYgKzIzNSw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBibWFjLgogCi1jb25maWcgT0FLTkVUCi0JdHJpc3RhdGUgIk5hdGlvbmFsIERQODM5MDJBViAoT2FrIGV0aGVybmV0KSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFBQQyAmJiBCUk9LRU4KLQlzZWxlY3QgQ1JDMzIKLQloZWxwCi0JICBTYXkgWSBpZiB5b3VyIG1hY2hpbmUgaGFzIHRoaXMgdHlwZSBvZiBFdGhlcm5ldCBuZXR3b3JrIGNhcmQuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG9ha25ldC4KLQogY29uZmlnIEFSSUFETkUKIAl0cmlzdGF0ZSAiQXJpYWRuZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFpPUlJPCkBAIC0xMTU1LDIxICsxMTQ1LDYgQEAKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXQtbW9kdWxlcy50eHQ+LiBUaGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzZWVxODAwNS4KIAotY29uZmlnIFNLTUMKLQl0cmlzdGF0ZSAiU0tuZXQgTUNBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgTUNBICYmIEJST0tFTgotCS0tLWhlbHAtLS0KLQkgIFRoZXNlIGFyZSBNaWNybyBDaGFubmVsIEV0aGVybmV0IGFkYXB0ZXJzLiBZb3UgbmVlZCB0byBzYXkgWSB0byAiTUNBCi0JICBzdXBwb3J0IiBpbiBvcmRlciB0byB1c2UgdGhpcyBkcml2ZXIuICBTdXBwb3J0ZWQgY2FyZHMgYXJlIHRoZSBTS25ldAotCSAgSnVuaW9yIE1DMiBhbmQgdGhlIFNLbmV0IE1DMigrKS4gIFRoZSBkcml2ZXIgYXV0b21hdGljYWxseQotCSAgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHRoZSB0d28gY2FyZHMuIE5vdGUgdGhhdCB1c2luZyBtdWx0aXBsZSBib2FyZHMKLQkgIG9mIGRpZmZlcmVudCB0eXBlIGhhc24ndCBiZWVuIHRlc3RlZCB3aXRoIHRoaXMgZHJpdmVyLiAgU2F5IFkgaWYgeW91Ci0JICBoYXZlIG9uZSBvZiB0aGVzZSBFdGhlcm5ldCBhZGFwdGVycy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZSBhbmQgcmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNrX21jYS4KLQogY29uZmlnIE5FMl9NQ0EKIAl0cmlzdGF0ZSAiTkUvMiAobmUyMDAwIE1DQSB2ZXJzaW9uKSBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIE1DQV9MRUdBQ1kKQEAgLTE3ODgsNiArMTc2MywxOCBAQAogCSAgd29ya3N0YXRpb25zLgogCSAgU2VlIDxodHRwOi8vd3d3LnNlbWljb25kdWN0b3JzLnBoaWxpcHMuY29tL3BpcC9TQUE5NzMwX2ZseWVyXzE+LgogCitjb25maWcgU0M5MjAzMQorCXRyaXN0YXRlICJTaWxhbiBTQzkyMDMxIFBDSSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIgZHJpdmVyIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IENSQzMyCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEZhc3QgRXRoZXJuZXQgUENJIG5ldHdvcmsgY2FyZHMgYmFzZWQgb24KKwkgIHRoZSBTaWxhbiBTQzkyMDMxIGNoaXAgKHNvbWV0aW1lcyBhbHNvIGNhbGxlZCBSc2x0ZWsgODEzOUQpLiBJZiB5b3UKKwkgIGhhdmUgb25lIG9mIHRoZXNlLCBzYXkgWSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzYzkyMDMxLiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KKwogY29uZmlnIE5FVF9QT0NLRVQKIAlib29sICJQb2NrZXQgYW5kIHBvcnRhYmxlIGFkYXB0ZXJzIgogCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIFBBUlBPUlQKQEAgLTIzOTIsNiArMjM3OSwyNCBAQAogCSAgTkFQSSBpcyBhIGRyaXZlciBBUEkgZGVzaWduZWQgdG8gcmVkdWNlIENQVSBhbmQgaW50ZXJydXB0IGxvYWQKIAkgIHdoZW4gdGhlIGRyaXZlciBpcyByZWNlaXZpbmcgbG90cyBvZiBwYWNrZXRzIGZyb20gdGhlIGNhcmQuCiAKK2NvbmZpZyBDSEVMU0lPX1QzCisgICAgICAgIHRyaXN0YXRlICJDaGVsc2lvIENvbW11bmljYXRpb25zIFQzIDEwR2IgRXRoZXJuZXQgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBQQ0kKKyAgICAgICAgaGVscAorICAgICAgICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIENoZWxzaW8gVDMtYmFzZWQgZ2lnYWJpdCBhbmQgMTBHYiBFdGhlcm5ldAorICAgICAgICAgIGFkYXB0ZXJzLgorCisgICAgICAgICAgRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgQ2hlbHNpbyBhbmQgb3VyIHByb2R1Y3RzLCB2aXNpdAorICAgICAgICAgIG91ciB3ZWJzaXRlIGF0IDxodHRwOi8vd3d3LmNoZWxzaW8uY29tPi4KKworICAgICAgICAgIEZvciBjdXN0b21lciBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgb3VyIGN1c3RvbWVyIHN1cHBvcnQgcGFnZSBhdAorICAgICAgICAgIDxodHRwOi8vd3d3LmNoZWxzaW8uY29tL3N1cHBvcnQuaHRtPi4KKworICAgICAgICAgIFBsZWFzZSBzZW5kIGZlZWRiYWNrIHRvIDxsaW51eC1idWdzQGNoZWxzaW8uY29tPi4KKworICAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKyAgICAgICAgICB3aWxsIGJlIGNhbGxlZCBjeGdiMy4KKwogY29uZmlnIEVIRUEKIAl0cmlzdGF0ZSAiZUhFQSBFdGhlcm5ldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSUJNRUJVUwpAQCAtMjQ4OCw2ICsyNDkzLDEzIEBACiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHRoZSBzdXBwb3J0IGZvciBOZXRYZW4ncyBHaWdhYml0IEV0aGVybmV0IGNhcmQuCiAKK2NvbmZpZyBQQVNFTUlfTUFDCisJdHJpc3RhdGUgIlBBIFNlbWkgMS8xMEdiaXQgTUFDIgorCWRlcGVuZHMgb24gUFBDNjQgJiYgUENJCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIG9uLWNoaXAgMS8xMEdiaXQgRXRoZXJuZXQgY29udHJvbGxlciBvbgorCSAgUEEgU2VtaSdzIFBXUmZpY2llbnQgbGluZSBvZiBjaGlwcy4KKwogZW5kbWVudQogCiBzb3VyY2UgImRyaXZlcnMvbmV0L3Rva2VucmluZy9LY29uZmlnIgpAQCAtMjU0MSw2ICsyNTUzLDcgQEAKIGNvbmZpZyBTS0ZQCiAJdHJpc3RhdGUgIlN5c0tvbm5lY3QgRkRESSBQQ0kgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEZEREkgJiYgUENJCisJc2VsZWN0IEJJVFJFVkVSU0UKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgU3lzS29ubmVjdCBGRERJIFBDSSBhZGFwdGVyLgogCSAgVGhlIGZvbGxvd2luZyBhZGFwdGVycyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQppbmRleCA0YzBkNGU1Li4wODc4ZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9NYWtlZmlsZQpAQCAtNiw2ICs2LDcgQEAKIG9iai0kKENPTkZJR19JQk1fRU1BQykgKz0gaWJtX2VtYWMvCiBvYmotJChDT05GSUdfSVhHQikgKz0gaXhnYi8KIG9iai0kKENPTkZJR19DSEVMU0lPX1QxKSArPSBjaGVsc2lvLworb2JqLSQoQ09ORklHX0NIRUxTSU9fVDMpICs9IGN4Z2IzLwogb2JqLSQoQ09ORklHX0VIRUEpICs9IGVoZWEvCiBvYmotJChDT05GSUdfQk9ORElORykgKz0gYm9uZGluZy8KIG9iai0kKENPTkZJR19HSUFORkFSKSArPSBnaWFuZmFyX2RyaXZlci5vCkBAIC0zNiw4ICszNyw2IEBACiBvYmotJChDT05GSUdfTUFDRSkgKz0gbWFjZS5vCiBvYmotJChDT05GSUdfQk1BQykgKz0gYm1hYy5vCiAKLW9iai0kKENPTkZJR19PQUtORVQpICs9IG9ha25ldC5vIDgzOTAubwotCiBvYmotJChDT05GSUdfREdSUykgKz0gZGdycy5vCiBvYmotJChDT05GSUdfVk9SVEVYKSArPSAzYzU5eC5vCiBvYmotJChDT05GSUdfVFlQSE9PTikgKz0gdHlwaG9vbi5vCkBAIC0xMzcsNyArMTM2LDYgQEAKIG9iai0kKENPTkZJR19FTDEpICs9IDNjNTAxLm8KIG9iai0kKENPTkZJR19FTDE2KSArPSAzYzUwNy5vCiBvYmotJChDT05GSUdfRUxNQykgKz0gM2M1MjMubwotb2JqLSQoQ09ORklHX1NLTUMpICs9IHNrX21jYS5vCiBvYmotJChDT05GSUdfSUJNTEFOQSkgKz0gaWJtbGFuYS5vCiBvYmotJChDT05GSUdfRUxNQ19JSSkgKz0gM2M1Mjcubwogb2JqLSQoQ09ORklHX0VMMykgKz0gM2M1MDkubwpAQCAtMTYwLDYgKzE1OCw3IEBACiBvYmotJChDT05GSUdfTEFTSV84MjU5NikgKz0gbGFzaV84MjU5Ni5vCiBvYmotJChDT05GSUdfTVZNRTE2eF9ORVQpICs9IDgyNTk2Lm8KIG9iai0kKENPTkZJR19CVk1FNjAwMF9ORVQpICs9IDgyNTk2Lm8KK29iai0kKENPTkZJR19TQzkyMDMxKSArPSBzYzkyMDMxLm8KIAogIyBUaGlzIGlzIGFsc28gYSA4MjU5NiBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIG1lcmdlZAogb2JqLSQoQ09ORklHX0xQNDg2RSkgKz0gbHA0ODZlLm8KQEAgLTE5Niw2ICsxOTUsNyBAQAogb2JqLSQoQ09ORklHX1NNQzkxMVgpICs9IHNtYzkxMXgubwogb2JqLSQoQ09ORklHX0RNOTAwMCkgKz0gZG05MDAwLm8KIG9iai0kKENPTkZJR19GRUNfOFhYKSArPSBmZWNfOHh4Lworb2JqLSQoQ09ORklHX1BBU0VNSV9NQUMpICs9IHBhc2VtaV9tYWMubwogCiBvYmotJChDT05GSUdfTUFDQikgKz0gbWFjYi5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L1NwYWNlLmMgYi9kcml2ZXJzL25ldC9TcGFjZS5jCmluZGV4IDkzMDVlYjkuLmRkOGVkNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L1NwYWNlLmMKKysrIGIvZHJpdmVycy9uZXQvU3BhY2UuYwpAQCAtNTksNyArNTksNiBAQAogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphcmxhbl9wcm9iZShpbnQgdW5pdCk7CiBleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmVsMTZfcHJvYmUoaW50IHVuaXQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICplbG1jX3Byb2JlKGludCB1bml0KTsKLWV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqc2ttY2FfcHJvYmUoaW50IHVuaXQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICplbHBsdXNfcHJvYmUoaW50IHVuaXQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphYzMyMDBfcHJvYmUoaW50IHVuaXQpOwogZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICplc19wcm9iZShpbnQgdW5pdCk7CkBAIC0xNTMsOSArMTUyLDYgQEAKICNpZmRlZiBDT05GSUdfRUxNQ19JSQkJLyogM2M1MjcgKi8KIAl7bWMzMl9wcm9iZSwgMH0sCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfU0tNQyAgICAgICAgICAgICAgLyogU0tuZXQgTWljcm9jaGFubmVsICovCi0gICAgICAgIHtza21jYV9wcm9iZSwgMH0sCi0jZW5kaWYKIAl7TlVMTCwgMH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwppbmRleCAxODg5NmYyLi45YzM5OWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCisrKyBiL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKQEAgLTEzMzQsOCArMTMzNCw3IEBACiBzdGF0aWMgdm9pZCBhbWQ4MTExZV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlhbWQ4MTExZV9pbnRlcnJ1cHQoMCwgZGV2KTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5jIGIvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuYwppbmRleCBmYWRhMTVkLi4xNjIxYjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmMKQEAgLTY0MSw3ICs2NDEsNyBAQAogewogCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOwogCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7Ci0Jc3RybGNweShpbmZvLT5idXNfaW5mbywgZGV2LT5jbGFzc19kZXYuZGV2LT5idXNfaWQsIHNpemVvZihpbmZvLT5idXNfaW5mbykpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIGRldi0+ZGV2LnBhcmVudC0+YnVzX2lkLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBhdDkxZXRoZXJfZXRodG9vbF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMKaW5kZXggZjNmYWE0Zi4uNzJjNDFmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYwpAQCAtNTg3LDcgKzU4Nyw3IEBACiB7CiAJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiAJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKLQlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBkZXYtPmNsYXNzX2Rldi5kZXYtPmJ1c19pZCwKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBkZXYtPmRldi5wYXJlbnQtPmJ1c19pZCwKIAkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2I0NC5jIGIvZHJpdmVycy9uZXQvYjQ0LmMKaW5kZXggMzAzYThkOS4uNWZmNzg4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmMKQEAgLTcyMSw3ICs3MjEsNyBAQAogCXN0cnVjdCByaW5nX2luZm8gKnNyY19tYXAsICpkZXN0X21hcDsKIAlzdHJ1Y3QgcnhfaGVhZGVyICpyaDsKIAlpbnQgZGVzdF9pZHg7Ci0JdTMyIGN0cmw7CisJX19sZTMyIGN0cmw7CiAKIAlkZXN0X2lkeCA9IGRlc3RfaWR4X3VubWFza2VkICYgKEI0NF9SWF9SSU5HX1NJWkUgLSAxKTsKIAlkZXN0X2Rlc2MgPSAmYnAtPnJ4X3JpbmdbZGVzdF9pZHhdOwpAQCAtNzgzLDcgKzc4Myw3IEBACiAJCQkJCSAgICBSWF9QS1RfQlVGX1NaLAogCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJcmggPSAoc3RydWN0IHJ4X2hlYWRlciAqKSBza2ItPmRhdGE7Ci0JCWxlbiA9IGNwdV90b19sZTE2KHJoLT5sZW4pOworCQlsZW4gPSBsZTE2X3RvX2NwdShyaC0+bGVuKTsKIAkJaWYgKChsZW4gPiAoUlhfUEtUX0JVRl9TWiAtIGJwLT5yeF9vZmZzZXQpKSB8fAogCQkgICAgKHJoLT5mbGFncyAmIGNwdV90b19sZTE2KFJYX0ZMQUdfRVJST1JTKSkpIHsKIAkJZHJvcF9pdDoKQEAgLTc5OSw3ICs3OTksNyBAQAogCQkJZG8gewogCQkJCXVkZWxheSgyKTsKIAkJCQliYXJyaWVyKCk7Ci0JCQkJbGVuID0gY3B1X3RvX2xlMTYocmgtPmxlbik7CisJCQkJbGVuID0gbGUxNl90b19jcHUocmgtPmxlbik7CiAJCQl9IHdoaWxlIChsZW4gPT0gMCAmJiBpKysgPCA1KTsKIAkJCWlmIChsZW4gPT0gMCkKIAkJCQlnb3RvIGRyb3BfaXQ7CkBAIC0yMDYxLDcgKzIwNjEsNyBAQAogc3RhdGljIGludCBiNDRfcmVhZF9lZXByb20oc3RydWN0IGI0NCAqYnAsIHU4ICpkYXRhKQogewogCWxvbmcgaTsKLQl1MTYgKnB0ciA9ICh1MTYgKikgZGF0YTsKKwlfX2xlMTYgKnB0ciA9IChfX2xlMTYgKikgZGF0YTsKIAogCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkgKz0gMikKIAkJcHRyW2kgLyAyXSA9IGNwdV90b19sZTE2KHJlYWR3KGJwLT5yZWdzICsgNDA5NiArIGkpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2I0NC5oIGIvZHJpdmVycy9uZXQvYjQ0LmgKaW5kZXggNDk0NDUwNy4uMThmYzEzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYjQ0LmgKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmgKQEAgLTMwOCw4ICszMDgsOCBAQAogI2RlZmluZSAgTUlJX1RMRURDVFJMX0VOQUJMRQkweDAwNDAKIAogc3RydWN0IGRtYV9kZXNjIHsKLQl1MzIJY3RybDsKLQl1MzIJYWRkcjsKKwlfX2xlMzIJY3RybDsKKwlfX2xlMzIJYWRkcjsKIH07CiAKIC8qIFRoZXJlIGFyZSBvbmx5IDEyIGJpdHMgaW4gdGhlIERNQSBlbmdpbmUgZm9yIGRlc2NyaXB0b3Igb2Zmc2V0dGluZwpAQCAtMzI3LDkgKzMyNyw5IEBACiAjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xEICAJMjU2CiAKIHN0cnVjdCByeF9oZWFkZXIgewotCXUxNglsZW47Ci0JdTE2CWZsYWdzOwotCXUxNglwYWRbMTJdOworCV9fbGUxNglsZW47CisJX19sZTE2CWZsYWdzOworCV9fbGUxNglwYWRbMTJdOwogfTsKICNkZWZpbmUgUlhfSEVBREVSX0xFTgkyOAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibWFjLmMgYi9kcml2ZXJzL25ldC9ibWFjLmMKaW5kZXggNDUyOGNlOS4uYzE0MzMwNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JtYWMuYworKysgYi9kcml2ZXJzL25ldC9ibWFjLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0xNDAsNyArMTQxLDYgQEAKIAkrIChOX1JYX1JJTkcgKyBOX1RYX1JJTkcgKyA0KSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSBcCiAJKyBzaXplb2Yoc3RydWN0IHNrX2J1ZmZfaGVhZCkpCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJpdHJldih1bnNpZ25lZCBjaGFyIGIpOwogc3RhdGljIGludCBibWFjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGJtYWNfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGJtYWNfdHJhbnNtaXRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtNTg2LDE4ICs1ODYsNiBAQAogCQkgICAgIHZpcnRfdG9fYnVzKGFkZHIpLCAwKTsKIH0KIAotLyogQml0LXJldmVyc2Ugb25lIGJ5dGUgb2YgYW4gZXRoZXJuZXQgaGFyZHdhcmUgYWRkcmVzcy4gKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyCi1iaXRyZXYodW5zaWduZWQgY2hhciBiKQotewotCWludCBkID0gMCwgaTsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyArK2ksIGIgPj49IDEpCi0JCWQgPSAoZCA8PCAxKSB8IChiICYgMSk7Ci0JcmV0dXJuIGQ7Ci19Ci0KLQogc3RhdGljIHZvaWQKIGJtYWNfaW5pdF90eF9yaW5nKHN0cnVjdCBibWFjX2RhdGEgKmJwKQogewpAQCAtMTIyNCw4ICsxMjEyLDggQEAKIAkJewogCQkJcmVzZXRfYW5kX3NlbGVjdF9zcm9tKGRldik7CiAJCQlkYXRhID0gcmVhZF9zcm9tKGRldiwgaSArIEVuZXRBZGRyZXNzT2Zmc2V0LzIsIFNST01BZGRyZXNzQml0cyk7Ci0JCQllYVsyKmldICAgPSBiaXRyZXYoZGF0YSAmIDB4MGZmKTsKLQkJCWVhWzIqaSsxXSA9IGJpdHJldigoZGF0YSA+PiA4KSAmIDB4MGZmKTsKKwkJCWVhWzIqaV0gICA9IGJpdHJldjgoZGF0YSAmIDB4MGZmKTsKKwkJCWVhWzIqaSsxXSA9IGJpdHJldjgoKGRhdGEgPj4gOCkgJiAweDBmZik7CiAJCX0KIH0KIApAQCAtMTMxNSw3ICsxMzAzLDcgQEAKIAogCXJldiA9IGFkZHJbMF0gPT0gMCAmJiBhZGRyWzFdID09IDB4QTA7CiAJZm9yIChqID0gMDsgaiA8IDY7ICsraikKLQkJZGV2LT5kZXZfYWRkcltqXSA9IHJldj8gYml0cmV2KGFkZHJbal0pOiBhZGRyW2pdOworCQlkZXYtPmRldl9hZGRyW2pdID0gcmV2ID8gYml0cmV2OChhZGRyW2pdKTogYWRkcltqXTsKIAogCS8qIEVuYWJsZSBjaGlwIHdpdGhvdXQgaW50ZXJydXB0cyBmb3Igbm93ICovCiAJYm1hY19lbmFibGVfYW5kX3Jlc2V0X2NoaXAoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JueDIuYyBiL2RyaXZlcnMvbmV0L2JueDIuYwppbmRleCBlZTdiNzViLi5jNDE2YzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyLmMKKysrIGIvZHJpdmVycy9uZXQvYm54Mi5jCkBAIC0zOSwxMiArMzksOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNkZWZpbmUgQkNNX1ZMQU4gMQogI2VuZGlmCi0jaWZkZWYgTkVUSUZfRl9UU08KICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0jZGVmaW5lIEJDTV9UU08gMQotI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgpAQCAtMTcyOCw3ICsxNzI1LDcgQEAKIAogCQl0eF9idWYgPSAmYnAtPnR4X2J1Zl9yaW5nW3N3X3JpbmdfY29uc107CiAJCXNrYiA9IHR4X2J1Zi0+c2tiOwotI2lmZGVmIEJDTV9UU08KKwogCQkvKiBwYXJ0aWFsIEJEIGNvbXBsZXRpb25zIHBvc3NpYmxlIHdpdGggVFNPIHBhY2tldHMgKi8KIAkJaWYgKHNrYl9pc19nc28oc2tiKSkgewogCQkJdTE2IGxhc3RfaWR4LCBsYXN0X3JpbmdfaWR4OwpAQCAtMTc0NCw3ICsxNzQxLDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJfQotI2VuZGlmCisKIAkJcGNpX3VubWFwX3NpbmdsZShicC0+cGRldiwgcGNpX3VubWFwX2FkZHIodHhfYnVmLCBtYXBwaW5nKSwKIAkJCXNrYl9oZWFkbGVuKHNrYiksIFBDSV9ETUFfVE9ERVZJQ0UpOwogCkBAIC00NTE0LDcgKzQ1MTEsNiBAQAogCQl2bGFuX3RhZ19mbGFncyB8PQogCQkJKFRYX0JEX0ZMQUdTX1ZMQU5fVEFHIHwgKHZsYW5fdHhfdGFnX2dldChza2IpIDw8IDE2KSk7CiAJfQotI2lmZGVmIEJDTV9UU08KIAlpZiAoKG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpICYmCiAJCShza2ItPmxlbiA+IChicC0+ZGV2LT5tdHUgKyBFVEhfSExFTikpKSB7CiAJCXUzMiB0Y3Bfb3B0X2xlbiwgaXBfdGNwX2xlbjsKQEAgLTQ1NDcsNyArNDU0Myw2IEBACiAJCX0KIAl9CiAJZWxzZQotI2VuZGlmCiAJewogCQltc3MgPSAwOwogCX0KQEAgLTU1NDQsMTAgKzU1MzksOCBAQAogCS5zZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX3NldF90eF9jc3VtLAogCS5nZXRfc2cJCQk9IGV0aHRvb2xfb3BfZ2V0X3NnLAogCS5zZXRfc2cJCQk9IGV0aHRvb2xfb3Bfc2V0X3NnLAotI2lmZGVmIEJDTV9UU08KIAkuZ2V0X3RzbwkJPSBldGh0b29sX29wX2dldF90c28sCiAJLnNldF90c28JCT0gYm54Ml9zZXRfdHNvLAotI2VuZGlmCiAJLnNlbGZfdGVzdF9jb3VudAk9IGJueDJfc2VsZl90ZXN0X2NvdW50LAogCS5zZWxmX3Rlc3QJCT0gYm54Ml9zZWxmX3Rlc3QsCiAJLmdldF9zdHJpbmdzCQk9IGJueDJfZ2V0X3N0cmluZ3MsCkBAIC02MTA0LDkgKzYwOTcsNyBAQAogI2lmZGVmIEJDTV9WTEFOCiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlg7CiAjZW5kaWYKLSNpZmRlZiBCQ01fVFNPCiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPX0VDTjsKLSNlbmRpZgogCiAJbmV0aWZfY2Fycmllcl9vZmYoYnAtPmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCmluZGV4IDY0ODJhZWQuLmQzODAxYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwpAQCAtNDcwNCw2ICs0NzA0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgYm9uZGluZ19uZXRkZXZfeG1pdF9sb2NrX2tleTsKIAogLyogQ3JlYXRlIGEgbmV3IGJvbmQgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBib25kaW5nIHBhcmFtZXRlcnMuCisgKiBJZiBuYW1lIGlzIE5VTEwsIG9idGFpbiBhIHN1aXRhYmxlICJib25kJWQiIG5hbWUgZm9yIHVzLgogICogQ2FsbGVyIG11c3QgTk9UIGhvbGQgcnRubF9sb2NrOyB3ZSBuZWVkIHRvIHJlbGVhc2UgaXQgaGVyZSBiZWZvcmUgd2UKICAqIHNldCB1cCBvdXIgc3lzZnMgZW50cmllcy4KICAqLwpAQCAtNDcxMyw3ICs0NzE0LDggQEAKIAlpbnQgcmVzOwogCiAJcnRubF9sb2NrKCk7Ci0JYm9uZF9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBib25kaW5nKSwgbmFtZSwgZXRoZXJfc2V0dXApOworCWJvbmRfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgYm9uZGluZyksIG5hbWUgPyBuYW1lIDogIiIsCisJCQkJZXRoZXJfc2V0dXApOwogCWlmICghYm9uZF9kZXYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCiAJCSAgICAgICAiOiAlczogZWVrISBjYW4ndCBhbGxvYyBuZXRkZXYhXG4iLApAQCAtNDcyMiw2ICs0NzI0LDEyIEBACiAJCWdvdG8gb3V0X3J0bmw7CiAJfQogCisJaWYgKCFuYW1lKSB7CisJCXJlcyA9IGRldl9hbGxvY19uYW1lKGJvbmRfZGV2LCAiYm9uZCVkIik7CisJCWlmIChyZXMgPCAwKQorCQkJZ290byBvdXRfbmV0ZGV2OworCX0KKwogCS8qIGJvbmRfaW5pdCgpIG11c3QgYmUgY2FsbGVkIGFmdGVyIGRldl9hbGxvY19uYW1lKCkgKGZvciB0aGUKIAkgKiAvcHJvYyBmaWxlcyksIGJ1dCBiZWZvcmUgcmVnaXN0ZXJfbmV0ZGV2aWNlKCksIGJlY2F1c2Ugd2UKIAkgKiBuZWVkIHRvIHNldCBmdW5jdGlvbiBwb2ludGVycy4KQEAgLTQ3NDgsMTQgKzQ3NTYsMTkgQEAKIAogCXJ0bmxfdW5sb2NrKCk7IC8qIGFsbG93cyBzeXNmcyByZWdpc3RyYXRpb24gb2YgbmV0IGRldmljZSAqLwogCXJlcyA9IGJvbmRfY3JlYXRlX3N5c2ZzX2VudHJ5KGJvbmRfZGV2LT5wcml2KTsKLQlnb3RvIGRvbmU7CisJaWYgKHJlcyA8IDApIHsKKwkJcnRubF9sb2NrKCk7CisJCWdvdG8gb3V0X2JvbmQ7CisJfQorCisJcmV0dXJuIDA7CisKIG91dF9ib25kOgogCWJvbmRfZGVpbml0KGJvbmRfZGV2KTsKIG91dF9uZXRkZXY6CiAJZnJlZV9uZXRkZXYoYm9uZF9kZXYpOwogb3V0X3J0bmw6CiAJcnRubF91bmxvY2soKTsKLWRvbmU6CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtNDc2Myw3ICs0Nzc2LDYgQEAKIHsKIAlpbnQgaTsKIAlpbnQgcmVzOwotCWNoYXIgbmV3X2JvbmRfbmFtZVs4XTsgIC8qIEVub3VnaCByb29tIGZvciA5OTkgYm9uZHMgYXQgaW5pdC4gKi8KIAogCXByaW50ayhLRVJOX0lORk8gIiVzIiwgdmVyc2lvbik7CiAKQEAgLTQ3NzYsOCArNDc4OCw3IEBACiAJYm9uZF9jcmVhdGVfcHJvY19kaXIoKTsKICNlbmRpZgogCWZvciAoaSA9IDA7IGkgPCBtYXhfYm9uZHM7IGkrKykgewotCQlzcHJpbnRmKG5ld19ib25kX25hbWUsICJib25kJWQiLGkpOwotCQlyZXMgPSBib25kX2NyZWF0ZShuZXdfYm9uZF9uYW1lLCZib25kaW5nX2RlZmF1bHRzLCBOVUxMKTsKKwkJcmVzID0gYm9uZF9jcmVhdGUoTlVMTCwgJmJvbmRpbmdfZGVmYXVsdHMsIE5VTEwpOwogCQlpZiAocmVzKQogCQkJZ290byBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3N5c2ZzLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwppbmRleCBjZWQ5ZWQ4Li44NzhmN2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfc3lzZnMuYwpAQCAtMzksOCArMzksNyBAQAogCiAvKiAjZGVmaW5lIEJPTkRJTkdfREVCVUcgMSAqLwogI2luY2x1ZGUgImJvbmRpbmcuaCIKLSNkZWZpbmUgdG9fY2xhc3NfZGV2KG9iaikgY29udGFpbmVyX29mKG9iaixzdHJ1Y3QgY2xhc3NfZGV2aWNlLGtvYmopCi0jZGVmaW5lIHRvX25ldF9kZXYoY2xhc3MpIGNvbnRhaW5lcl9vZihjbGFzcywgc3RydWN0IG5ldF9kZXZpY2UsIGNsYXNzX2RldikKKyNkZWZpbmUgdG9fZGV2KG9iaikJY29udGFpbmVyX29mKG9iaixzdHJ1Y3QgZGV2aWNlLGtvYmopCiAjZGVmaW5lIHRvX2JvbmQoY2QpCSgoc3RydWN0IGJvbmRpbmcgKikodG9fbmV0X2RldihjZCktPnByaXYpKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGVjbGFyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTU0LDcgKzE1Myw3IEBACiAJCQkJICogSWYgaXQncyA+IGV4cGVjdGVkLCB0aGVuIHRoZXJlJ3MgYSBmaWxlIG9wZW4sCiAJCQkJICogYW5kIHdlIGhhdmUgdG8gZmFpbC4KIAkJCQkgKi8KLQkJCQlpZiAoYXRvbWljX3JlYWQoJmJvbmQtPmRldi0+Y2xhc3NfZGV2LmtvYmoua3JlZi5yZWZjb3VudCkKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmJvbmQtPmRldi0+ZGV2LmtvYmoua3JlZi5yZWZjb3VudCkKIAkJCQkJCQk+IGV4cGVjdGVkX3JlZmNvdW50KXsKIAkJCQkJcnRubF91bmxvY2soKTsKIAkJCQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQpAQCAtMjAxLDEzICsyMDAsMTMgQEAKIAlpbnQgcmV0ID0gMDsKIAogCS8qIGZpcnN0LCBjcmVhdGUgYSBsaW5rIGZyb20gdGhlIHNsYXZlIGJhY2sgdG8gdGhlIG1hc3RlciAqLwotCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCYoc2xhdmUtPmNsYXNzX2Rldi5rb2JqKSwgJihtYXN0ZXItPmNsYXNzX2Rldi5rb2JqKSwKKwlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmKHNsYXZlLT5kZXYua29iaiksICYobWFzdGVyLT5kZXYua29iaiksCiAJCQkJIm1hc3RlciIpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJLyogbmV4dCwgY3JlYXRlIGEgbGluayBmcm9tIHRoZSBtYXN0ZXIgdG8gdGhlIHNsYXZlICovCiAJc3ByaW50ZihsaW5rbmFtZSwic2xhdmVfJXMiLHNsYXZlLT5uYW1lKTsKLQlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmKG1hc3Rlci0+Y2xhc3NfZGV2LmtvYmopLCAmKHNsYXZlLT5jbGFzc19kZXYua29iaiksCisJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJihtYXN0ZXItPmRldi5rb2JqKSwgJihzbGF2ZS0+ZGV2LmtvYmopLAogCQkJCWxpbmtuYW1lKTsKIAlyZXR1cm4gcmV0OwogCkBAIC0yMTcsMjAgKzIxNiwyMSBAQAogewogCWNoYXIgbGlua25hbWVbSUZOQU1TSVorN107CiAKLQlzeXNmc19yZW1vdmVfbGluaygmKHNsYXZlLT5jbGFzc19kZXYua29iaiksICJtYXN0ZXIiKTsKKwlzeXNmc19yZW1vdmVfbGluaygmKHNsYXZlLT5kZXYua29iaiksICJtYXN0ZXIiKTsKIAlzcHJpbnRmKGxpbmtuYW1lLCJzbGF2ZV8lcyIsc2xhdmUtPm5hbWUpOwotCXN5c2ZzX3JlbW92ZV9saW5rKCYobWFzdGVyLT5jbGFzc19kZXYua29iaiksIGxpbmtuYW1lKTsKKwlzeXNmc19yZW1vdmVfbGluaygmKG1hc3Rlci0+ZGV2LmtvYmopLCBsaW5rbmFtZSk7CiB9CiAKIAogLyoKICAqIFNob3cgdGhlIHNsYXZlcyBpbiB0aGUgY3VycmVudCBib25kLgogICovCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfc2xhdmVzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfc2xhdmVzKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOwogCWludCBpLCByZXMgPSAwOwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJcmVhZF9sb2NrX2JoKCZib25kLT5sb2NrKTsKIAlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7CkBAIC0yNTQsMTQgKzI1NCwxNiBAQAogICogdXAgZm9yIHRoaXMgdG8gc3VjY2VlZC4KICAqIFRoaXMgZnVuY3Rpb24gaXMgbGFyZ2VseSB0aGUgc2FtZSBmbG93IGFzIGJvbmRpbmdfdXBkYXRlX2JvbmRzKCkuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfc2xhdmVzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfc2xhdmVzKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKIHsKIAljaGFyIGNvbW1hbmRbSUZOQU1TSVogKyAxXSA9IHsgMCwgfTsKIAljaGFyICppZm5hbWU7CiAJaW50IGksIHJlcywgZm91bmQsIHJldCA9IGNvdW50OwogCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGNkKTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAkvKiBRdWljayBzYW5pdHkgY2hlY2sgLS0gaXMgdGhlIGJvbmQgaW50ZXJmYWNlIHVwPyAqLwogCWlmICghKGJvbmQtPmRldi0+ZmxhZ3MgJiBJRkZfVVApKSB7CkBAIC0zODcsMjUgKzM4OSwyOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihzbGF2ZXMsIFNfSVJVR08gfCBTX0lXVVNSLCBib25kaW5nX3Nob3dfc2xhdmVzLCBib25kaW5nX3N0b3JlX3NsYXZlcyk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2xhdmVzLCBTX0lSVUdPIHwgU19JV1VTUiwgYm9uZGluZ19zaG93X3NsYXZlcywgYm9uZGluZ19zdG9yZV9zbGF2ZXMpOwogCiAvKgogICogU2hvdyBhbmQgc2V0IHRoZSBib25kaW5nIG1vZGUuICBUaGUgYm9uZCBpbnRlcmZhY2UgbXVzdCBiZSBkb3duIHRvCiAgKiBjaGFuZ2UgdGhlIG1vZGUuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19tb2RlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfbW9kZShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXMgJWRcbiIsCiAJCQlib25kX21vZGVfdGJsW2JvbmQtPnBhcmFtcy5tb2RlXS5tb2RlbmFtZSwKIAkJCWJvbmQtPnBhcmFtcy5tb2RlKSArIDE7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfbW9kZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJaW50IG5ld192YWx1ZSwgcmV0ID0gY291bnQ7Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGNkKTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAlpZiAoYm9uZC0+ZGV2LT5mbGFncyAmIElGRl9VUCkgewogCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKQEAgLTQzOCwxNiArNDQzLDE4IEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwgYm9uZGluZ19zaG93X21vZGUsIGJvbmRpbmdfc3RvcmVfbW9kZSk7CitzdGF0aWMgREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsIGJvbmRpbmdfc2hvd19tb2RlLCBib25kaW5nX3N0b3JlX21vZGUpOwogCiAvKgogICogU2hvdyBhbmQgc2V0IHRoZSBib25kaW5nIHRyYW5zbWl0IGhhc2ggbWV0aG9kLiAgVGhlIGJvbmQgaW50ZXJmYWNlIG11c3QgYmUgZG93biB0bwogICogY2hhbmdlIHRoZSB4bWl0IGhhc2ggcG9saWN5LgogICovCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfeG1pdF9oYXNoKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfeG1pdF9oYXNoKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgY2hhciAqYnVmKQogewogCWludCBjb3VudDsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoY2QpOworCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAogCWlmICgoYm9uZC0+cGFyYW1zLm1vZGUgIT0gQk9ORF9NT0RFX1hPUikgJiYKIAkgICAgKGJvbmQtPnBhcmFtcy5tb2RlICE9IEJPTkRfTU9ERV84MDIzQUQpKSB7CkBAIC00NjIsMTAgKzQ2OSwxMiBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV94bWl0X2hhc2goc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV94bWl0X2hhc2goc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCBuZXdfdmFsdWUsIHJldCA9IGNvdW50OwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJaWYgKGJvbmQtPmRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCkBAIC01MDEsMjQgKzUxMCwyOCBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoeG1pdF9oYXNoX3BvbGljeSwgU19JUlVHTyB8IFNfSVdVU1IsIGJvbmRpbmdfc2hvd194bWl0X2hhc2gsIGJvbmRpbmdfc3RvcmVfeG1pdF9oYXNoKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih4bWl0X2hhc2hfcG9saWN5LCBTX0lSVUdPIHwgU19JV1VTUiwgYm9uZGluZ19zaG93X3htaXRfaGFzaCwgYm9uZGluZ19zdG9yZV94bWl0X2hhc2gpOwogCiAvKgogICogU2hvdyBhbmQgc2V0IGFycF92YWxpZGF0ZS4KICAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FycF92YWxpZGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FycF92YWxpZGF0ZShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGNkKTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlZFxuIiwKIAkJICAgICAgIGFycF92YWxpZGF0ZV90YmxbYm9uZC0+cGFyYW1zLmFycF92YWxpZGF0ZV0ubW9kZW5hbWUsCiAJCSAgICAgICBib25kLT5wYXJhbXMuYXJwX3ZhbGlkYXRlKSArIDE7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfYXJwX3ZhbGlkYXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfYXJwX3ZhbGlkYXRlKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJaW50IG5ld192YWx1ZTsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoY2QpOworCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAogCW5ld192YWx1ZSA9IGJvbmRfcGFyc2VfcGFybSgoY2hhciAqKWJ1ZiwgYXJwX3ZhbGlkYXRlX3RibCk7CiAJaWYgKG5ld192YWx1ZSA8IDApIHsKQEAgLTU0OCw3ICs1NjEsNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGFycF92YWxpZGF0ZSwgU19JUlVHTyB8IFNfSVdVU1IsIGJvbmRpbmdfc2hvd19hcnBfdmFsaWRhdGUsIGJvbmRpbmdfc3RvcmVfYXJwX3ZhbGlkYXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhcnBfdmFsaWRhdGUsIFNfSVJVR08gfCBTX0lXVVNSLCBib25kaW5nX3Nob3dfYXJwX3ZhbGlkYXRlLCBib25kaW5nX3N0b3JlX2FycF92YWxpZGF0ZSk7CiAKIC8qCiAgKiBTaG93IGFuZCBzZXQgdGhlIGFycCB0aW1lciBpbnRlcnZhbC4gIFRoZXJlIGFyZSB0d28gdHJpY2t5IGJpdHMKQEAgLTU1NiwxNyArNTY5LDIxIEBACiAgKiBNSUkgbW9uaXRvcmluZy4gIFNlY29uZCwgaWYgdGhlIEFSUCB0aW1lciBpc24ndCBydW5uaW5nLCB3ZSBtdXN0CiAgKiBzdGFydCBpdC4KICAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FycF9pbnRlcnZhbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FycF9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGNkKTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCkgKyAxOwogfQogCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX2FycF9pbnRlcnZhbChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX2FycF9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCBuZXdfdmFsdWUsIHJldCA9IGNvdW50OwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJaWYgKHNzY2FuZihidWYsICIlZCIsICZuZXdfdmFsdWUpICE9IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCkBAIC02MzgsMTUgKzY1NSwxNyBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYXJwX2ludGVydmFsLCBTX0lSVUdPIHwgU19JV1VTUiAsIGJvbmRpbmdfc2hvd19hcnBfaW50ZXJ2YWwsIGJvbmRpbmdfc3RvcmVfYXJwX2ludGVydmFsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhcnBfaW50ZXJ2YWwsIFNfSVJVR08gfCBTX0lXVVNSICwgYm9uZGluZ19zaG93X2FycF9pbnRlcnZhbCwgYm9uZGluZ19zdG9yZV9hcnBfaW50ZXJ2YWwpOwogCiAvKgogICogU2hvdyBhbmQgc2V0IHRoZSBhcnAgdGFyZ2V0cy4KICAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FycF90YXJnZXRzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfYXJwX3RhcmdldHMoc3RydWN0IGRldmljZSAqZCwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNoYXIgKmJ1ZikKIHsKIAlpbnQgaSwgcmVzID0gMDsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoY2QpOworCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAogCWZvciAoaSA9IDA7IGkgPCBCT05EX01BWF9BUlBfVEFSR0VUUzsgaSsrKSB7CiAJCWlmIChib25kLT5wYXJhbXMuYXJwX3RhcmdldHNbaV0pCkBAIC02NjAsMTEgKzY3OSwxMyBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfYXJwX3RhcmdldHMoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9hcnBfdGFyZ2V0cyhzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAl1MzIgbmV3dGFyZ2V0OwogCWludCBpID0gMCwgZG9uZSA9IDAsIHJldCA9IGNvdW50OwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCXUzMiAqdGFyZ2V0czsKIAogCXRhcmdldHMgPSBib25kLT5wYXJhbXMuYXJwX3RhcmdldHM7CkBAIC03NDIsMjQgKzc2MywyOCBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYXJwX2lwX3RhcmdldCwgU19JUlVHTyB8IFNfSVdVU1IgLCBib25kaW5nX3Nob3dfYXJwX3RhcmdldHMsIGJvbmRpbmdfc3RvcmVfYXJwX3RhcmdldHMpOworc3RhdGljIERFVklDRV9BVFRSKGFycF9pcF90YXJnZXQsIFNfSVJVR08gfCBTX0lXVVNSICwgYm9uZGluZ19zaG93X2FycF90YXJnZXRzLCBib25kaW5nX3N0b3JlX2FycF90YXJnZXRzKTsKIAogLyoKICAqIFNob3cgYW5kIHNldCB0aGUgdXAgYW5kIGRvd24gZGVsYXlzLiAgVGhlc2UgbXVzdCBiZSBtdWx0aXBsZXMgb2YgdGhlCiAgKiBNSUkgbW9uaXRvcmluZyB2YWx1ZSwgYW5kIGFyZSBzdG9yZWQgaW50ZXJuYWxseSBhcyB0aGUgbXVsdGlwbGllci4KICAqIFRodXMsIHdlIG11c3QgdHJhbnNsYXRlIHRvIE1TIGZvciB0aGUgcmVhbCB3b3JsZC4KICAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2Rvd25kZWxheShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2Rvd25kZWxheShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoY2QpOworCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBib25kLT5wYXJhbXMuZG93bmRlbGF5ICogYm9uZC0+cGFyYW1zLm1paW1vbikgKyAxOwogfQogCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX2Rvd25kZWxheShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX2Rvd25kZWxheShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJaW50IG5ld192YWx1ZSwgcmV0ID0gY291bnQ7Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGNkKTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAlpZiAoIShib25kLT5wYXJhbXMubWlpbW9uKSkgewogCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKQEAgLTgwMCwyMCArODI1LDI0IEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihkb3duZGVsYXksIFNfSVJVR08gfCBTX0lXVVNSICwgYm9uZGluZ19zaG93X2Rvd25kZWxheSwgYm9uZGluZ19zdG9yZV9kb3duZGVsYXkpOworc3RhdGljIERFVklDRV9BVFRSKGRvd25kZWxheSwgU19JUlVHTyB8IFNfSVdVU1IgLCBib25kaW5nX3Nob3dfZG93bmRlbGF5LCBib25kaW5nX3N0b3JlX2Rvd25kZWxheSk7CiAKLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd191cGRlbGF5KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfdXBkZWxheShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY2hhciAqYnVmKQogewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGJvbmQtPnBhcmFtcy51cGRlbGF5ICogYm9uZC0+cGFyYW1zLm1paW1vbikgKyAxOwogCiB9CiAKLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfdXBkZWxheShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX3VwZGVsYXkoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJaW50IG5ld192YWx1ZSwgcmV0ID0gY291bnQ7Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGNkKTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAlpZiAoIShib25kLT5wYXJhbXMubWlpbW9uKSkgewogCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKQEAgLTg1NCwyNSArODgzLDI5IEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUih1cGRlbGF5LCBTX0lSVUdPIHwgU19JV1VTUiAsIGJvbmRpbmdfc2hvd191cGRlbGF5LCBib25kaW5nX3N0b3JlX3VwZGVsYXkpOworc3RhdGljIERFVklDRV9BVFRSKHVwZGVsYXksIFNfSVJVR08gfCBTX0lXVVNSICwgYm9uZGluZ19zaG93X3VwZGVsYXksIGJvbmRpbmdfc3RvcmVfdXBkZWxheSk7CiAKIC8qCiAgKiBTaG93IGFuZCBzZXQgdGhlIExBQ1AgaW50ZXJ2YWwuICBJbnRlcmZhY2UgbXVzdCBiZSBkb3duLCBhbmQgdGhlIG1vZGUKICAqIG11c3QgYmUgc2V0IHRvIDgwMi4zYWQgbW9kZS4KICAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2xhY3Aoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19sYWNwKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGNkKTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlcyAlZFxuIiwKIAkJYm9uZF9sYWNwX3RibFtib25kLT5wYXJhbXMubGFjcF9mYXN0XS5tb2RlbmFtZSwKIAkJYm9uZC0+cGFyYW1zLmxhY3BfZmFzdCkgKyAxOwogfQogCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX2xhY3Aoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9sYWNwKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCBuZXdfdmFsdWUsIHJldCA9IGNvdW50OwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJaWYgKGJvbmQtPmRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCkBAIC05MDYsNyArOTM5LDcgQEAKIG91dDoKIAlyZXR1cm4gcmV0OwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGxhY3BfcmF0ZSwgU19JUlVHTyB8IFNfSVdVU1IsIGJvbmRpbmdfc2hvd19sYWNwLCBib25kaW5nX3N0b3JlX2xhY3ApOworc3RhdGljIERFVklDRV9BVFRSKGxhY3BfcmF0ZSwgU19JUlVHTyB8IFNfSVdVU1IsIGJvbmRpbmdfc2hvd19sYWNwLCBib25kaW5nX3N0b3JlX2xhY3ApOwogCiAvKgogICogU2hvdyBhbmQgc2V0IHRoZSBNSUkgbW9uaXRvciBpbnRlcnZhbC4gIFRoZXJlIGFyZSB0d28gdHJpY2t5IGJpdHMKQEAgLTkxNCwxNyArOTQ3LDIxIEBACiAgKiBBUlAgbW9uaXRvcmluZy4gIFNlY29uZCwgaWYgdGhlIHRpbWVyIGlzbid0IHJ1bm5pbmcsIHdlIG11c3QKICAqIHN0YXJ0IGl0LgogICovCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfbWlpbW9uKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfbWlpbW9uKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY2hhciAqYnVmKQogewotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGJvbmQtPnBhcmFtcy5taWltb24pICsgMTsKIH0KIAotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9taWltb24oc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9taWltb24oc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCBuZXdfdmFsdWUsIHJldCA9IGNvdW50OwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJaWYgKHNzY2FuZihidWYsICIlZCIsICZuZXdfdmFsdWUpICE9IDEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCkBAIC0xMDAwLDcgKzEwMzcsNyBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobWlpbW9uLCBTX0lSVUdPIHwgU19JV1VTUiwgYm9uZGluZ19zaG93X21paW1vbiwgYm9uZGluZ19zdG9yZV9taWltb24pOworc3RhdGljIERFVklDRV9BVFRSKG1paW1vbiwgU19JUlVHTyB8IFNfSVdVU1IsIGJvbmRpbmdfc2hvd19taWltb24sIGJvbmRpbmdfc3RvcmVfbWlpbW9uKTsKIAogLyoKICAqIFNob3cgYW5kIHNldCB0aGUgcHJpbWFyeSBzbGF2ZS4gIFRoZSBzdG9yZSBmdW5jdGlvbiBpcyBtdWNoCkBAIC0xMDA5LDEwICsxMDQ2LDEyIEBACiAgKiBUaGUgYm9uZCBtdXN0IGJlIGEgbW9kZSB0aGF0IHN1cHBvcnRzIGEgcHJpbWFyeSBmb3IgdGhpcyBiZQogICogc2V0LgogICovCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfcHJpbWFyeShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X3ByaW1hcnkoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNoYXIgKmJ1ZikKIHsKIAlpbnQgY291bnQgPSAwOwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJaWYgKGJvbmQtPnByaW1hcnlfc2xhdmUpCiAJCWNvdW50ID0gc3ByaW50ZihidWYsICIlc1xuIiwgYm9uZC0+cHJpbWFyeV9zbGF2ZS0+ZGV2LT5uYW1lKSArIDE7CkBAIC0xMDIyLDExICsxMDYxLDEzIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX3ByaW1hcnkoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9wcmltYXJ5KHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCBpOwogCXN0cnVjdCBzbGF2ZSAqc2xhdmU7Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGNkKTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAl3cml0ZV9sb2NrX2JoKCZib25kLT5sb2NrKTsKIAlpZiAoIVVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKQEAgLTEwNjUsMjIgKzExMDYsMjYgQEAKIAl3cml0ZV91bmxvY2tfYmgoJmJvbmQtPmxvY2spOwogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihwcmltYXJ5LCBTX0lSVUdPIHwgU19JV1VTUiwgYm9uZGluZ19zaG93X3ByaW1hcnksIGJvbmRpbmdfc3RvcmVfcHJpbWFyeSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJpbWFyeSwgU19JUlVHTyB8IFNfSVdVU1IsIGJvbmRpbmdfc2hvd19wcmltYXJ5LCBib25kaW5nX3N0b3JlX3ByaW1hcnkpOwogCiAvKgogICogU2hvdyBhbmQgc2V0IHRoZSB1c2VfY2FycmllciBmbGFnLgogICovCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfY2FycmllcihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2NhcnJpZXIoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoY2QpOworCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBib25kLT5wYXJhbXMudXNlX2NhcnJpZXIpICsgMTsKIH0KIAotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zdG9yZV9jYXJyaWVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc3RvcmVfY2FycmllcihzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlpbnQgbmV3X3ZhbHVlLCByZXQgPSBjb3VudDsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoY2QpOworCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAogCiAJaWYgKHNzY2FuZihidWYsICIlZCIsICZuZXdfdmFsdWUpICE9IDEpIHsKQEAgLTExMDIsMTYgKzExNDcsMTggQEAKIG91dDoKIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodXNlX2NhcnJpZXIsIFNfSVJVR08gfCBTX0lXVVNSLCBib25kaW5nX3Nob3dfY2FycmllciwgYm9uZGluZ19zdG9yZV9jYXJyaWVyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih1c2VfY2FycmllciwgU19JUlVHTyB8IFNfSVdVU1IsIGJvbmRpbmdfc2hvd19jYXJyaWVyLCBib25kaW5nX3N0b3JlX2NhcnJpZXIpOwogCiAKIC8qCiAgKiBTaG93IGFuZCBzZXQgY3VycmVudGx5IGFjdGl2ZV9zbGF2ZS4KICAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FjdGl2ZV9zbGF2ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FjdGl2ZV9zbGF2ZShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCiB7CiAJc3RydWN0IHNsYXZlICpjdXJyOwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCWludCBjb3VudDsKIAogCkBAIC0xMTI2LDEzICsxMTczLDE1IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX2FjdGl2ZV9zbGF2ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3N0b3JlX2FjdGl2ZV9zbGF2ZShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCBpOwogCXN0cnVjdCBzbGF2ZSAqc2xhdmU7CiAgICAgICAgIHN0cnVjdCBzbGF2ZSAqb2xkX2FjdGl2ZSA9IE5VTEw7CiAgICAgICAgIHN0cnVjdCBzbGF2ZSAqbmV3X2FjdGl2ZSA9IE5VTEw7Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGNkKTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAl3cml0ZV9sb2NrX2JoKCZib25kLT5sb2NrKTsKIAlpZiAoIVVTRVNfUFJJTUFSWShib25kLT5wYXJhbXMubW9kZSkpIHsKQEAgLTExOTQsMTYgKzEyNDMsMTggQEAKIAlyZXR1cm4gY291bnQ7CiAKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhY3RpdmVfc2xhdmUsIFNfSVJVR08gfCBTX0lXVVNSLCBib25kaW5nX3Nob3dfYWN0aXZlX3NsYXZlLCBib25kaW5nX3N0b3JlX2FjdGl2ZV9zbGF2ZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWN0aXZlX3NsYXZlLCBTX0lSVUdPIHwgU19JV1VTUiwgYm9uZGluZ19zaG93X2FjdGl2ZV9zbGF2ZSwgYm9uZGluZ19zdG9yZV9hY3RpdmVfc2xhdmUpOwogCiAKIC8qCiAgKiBTaG93IGxpbmsgc3RhdHVzIG9mIHRoZSBib25kIGludGVyZmFjZS4KICAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X21paV9zdGF0dXMoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19taWlfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IHNsYXZlICpjdXJyOwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOwogCWN1cnIgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKQEAgLTEyMTEsMTYgKzEyNjIsMTggQEAKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCAoY3VycikgPyAidXAiIDogImRvd24iKSArIDE7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobWlpX3N0YXR1cywgU19JUlVHTywgYm9uZGluZ19zaG93X21paV9zdGF0dXMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKG1paV9zdGF0dXMsIFNfSVJVR08sIGJvbmRpbmdfc2hvd19taWlfc3RhdHVzLCBOVUxMKTsKIAogCiAvKgogICogU2hvdyBjdXJyZW50IDgwMi4zYWQgYWdncmVnYXRvciBJRC4KICAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FkX2FnZ3JlZ2F0b3Ioc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19hZF9hZ2dyZWdhdG9yKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY2hhciAqYnVmKQogewogCWludCBjb3VudCA9IDA7Ci0Jc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGNkKTsKKwlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoZCk7CiAKIAlpZiAoYm9uZC0+cGFyYW1zLm1vZGUgPT0gQk9ORF9NT0RFXzgwMjNBRCkgewogCQlzdHJ1Y3QgYWRfaW5mbyBhZF9pbmZvOwpAQCAtMTIzMSwxNiArMTI4NCwxOCBAQAogCiAJcmV0dXJuIGNvdW50OwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGFkX2FnZ3JlZ2F0b3IsIFNfSVJVR08sIGJvbmRpbmdfc2hvd19hZF9hZ2dyZWdhdG9yLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhZF9hZ2dyZWdhdG9yLCBTX0lSVUdPLCBib25kaW5nX3Nob3dfYWRfYWdncmVnYXRvciwgTlVMTCk7CiAKIAogLyoKICAqIFNob3cgbnVtYmVyIG9mIGFjdGl2ZSA4MDIuM2FkIHBvcnRzLgogICovCi1zdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfYWRfbnVtX3BvcnRzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfYWRfbnVtX3BvcnRzKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNoYXIgKmJ1ZikKIHsKIAlpbnQgY291bnQgPSAwOwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKIAkJc3RydWN0IGFkX2luZm8gYWRfaW5mbzsKQEAgLTEyNTEsMTYgKzEzMDYsMTggQEAKIAogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhZF9udW1fcG9ydHMsIFNfSVJVR08sIGJvbmRpbmdfc2hvd19hZF9udW1fcG9ydHMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGFkX251bV9wb3J0cywgU19JUlVHTywgYm9uZGluZ19zaG93X2FkX251bV9wb3J0cywgTlVMTCk7CiAKIAogLyoKICAqIFNob3cgY3VycmVudCA4MDIuM2FkIGFjdG9yIGtleS4KICAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FkX2FjdG9yX2tleShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FkX2FjdG9yX2tleShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCiB7CiAJaW50IGNvdW50ID0gMDsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoY2QpOworCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAogCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CiAJCXN0cnVjdCBhZF9pbmZvIGFkX2luZm87CkBAIC0xMjcxLDE2ICsxMzI4LDE4IEBACiAKIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYWRfYWN0b3Jfa2V5LCBTX0lSVUdPLCBib25kaW5nX3Nob3dfYWRfYWN0b3Jfa2V5LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhZF9hY3Rvcl9rZXksIFNfSVJVR08sIGJvbmRpbmdfc2hvd19hZF9hY3Rvcl9rZXksIE5VTEwpOwogCiAKIC8qCiAgKiBTaG93IGN1cnJlbnQgODAyLjNhZCBwYXJ0bmVyIGtleS4KICAqLwotc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FkX3BhcnRuZXJfa2V5KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBib25kaW5nX3Nob3dfYWRfcGFydG5lcl9rZXkoc3RydWN0IGRldmljZSAqZCwKKwkJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgIGNoYXIgKmJ1ZikKIHsKIAlpbnQgY291bnQgPSAwOwotCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChjZCk7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSB0b19ib25kKGQpOwogCiAJaWYgKGJvbmQtPnBhcmFtcy5tb2RlID09IEJPTkRfTU9ERV84MDIzQUQpIHsKIAkJc3RydWN0IGFkX2luZm8gYWRfaW5mbzsKQEAgLTEyOTEsMTYgKzEzNTAsMTggQEAKIAogCXJldHVybiBjb3VudDsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhZF9wYXJ0bmVyX2tleSwgU19JUlVHTywgYm9uZGluZ19zaG93X2FkX3BhcnRuZXJfa2V5LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhZF9wYXJ0bmVyX2tleSwgU19JUlVHTywgYm9uZGluZ19zaG93X2FkX3BhcnRuZXJfa2V5LCBOVUxMKTsKIAogCiAvKgogICogU2hvdyBjdXJyZW50IDgwMi4zYWQgcGFydG5lciBtYWMuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IGJvbmRpbmdfc2hvd19hZF9wYXJ0bmVyX21hYyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgYm9uZGluZ19zaG93X2FkX3BhcnRuZXJfbWFjKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCiB7CiAJaW50IGNvdW50ID0gMDsKLQlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IHRvX2JvbmQoY2QpOworCXN0cnVjdCBib25kaW5nICpib25kID0gdG9fYm9uZChkKTsKIAogCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfODAyM0FEKSB7CiAJCXN0cnVjdCBhZF9pbmZvIGFkX2luZm87CkBAIC0xMzE5LDMwICsxMzgwLDMwIEBACiAKIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYWRfcGFydG5lcl9tYWMsIFNfSVJVR08sIGJvbmRpbmdfc2hvd19hZF9wYXJ0bmVyX21hYywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWRfcGFydG5lcl9tYWMsIFNfSVJVR08sIGJvbmRpbmdfc2hvd19hZF9wYXJ0bmVyX21hYywgTlVMTCk7CiAKIAogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGVyX2JvbmRfYXR0cnNbXSA9IHsKLQkmY2xhc3NfZGV2aWNlX2F0dHJfc2xhdmVzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX21vZGUuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfYXJwX3ZhbGlkYXRlLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2FycF9pbnRlcnZhbC5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9hcnBfaXBfdGFyZ2V0LmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2Rvd25kZWxheS5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl91cGRlbGF5LmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2xhY3BfcmF0ZS5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl94bWl0X2hhc2hfcG9saWN5LmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX21paW1vbi5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9wcmltYXJ5LmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3VzZV9jYXJyaWVyLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2FjdGl2ZV9zbGF2ZS5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9taWlfc3RhdHVzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2FkX2FnZ3JlZ2F0b3IuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfYWRfbnVtX3BvcnRzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2FkX2FjdG9yX2tleS5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9hZF9wYXJ0bmVyX2tleS5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9hZF9wYXJ0bmVyX21hYy5hdHRyLAorCSZkZXZfYXR0cl9zbGF2ZXMuYXR0ciwKKwkmZGV2X2F0dHJfbW9kZS5hdHRyLAorCSZkZXZfYXR0cl9hcnBfdmFsaWRhdGUuYXR0ciwKKwkmZGV2X2F0dHJfYXJwX2ludGVydmFsLmF0dHIsCisJJmRldl9hdHRyX2FycF9pcF90YXJnZXQuYXR0ciwKKwkmZGV2X2F0dHJfZG93bmRlbGF5LmF0dHIsCisJJmRldl9hdHRyX3VwZGVsYXkuYXR0ciwKKwkmZGV2X2F0dHJfbGFjcF9yYXRlLmF0dHIsCisJJmRldl9hdHRyX3htaXRfaGFzaF9wb2xpY3kuYXR0ciwKKwkmZGV2X2F0dHJfbWlpbW9uLmF0dHIsCisJJmRldl9hdHRyX3ByaW1hcnkuYXR0ciwKKwkmZGV2X2F0dHJfdXNlX2NhcnJpZXIuYXR0ciwKKwkmZGV2X2F0dHJfYWN0aXZlX3NsYXZlLmF0dHIsCisJJmRldl9hdHRyX21paV9zdGF0dXMuYXR0ciwKKwkmZGV2X2F0dHJfYWRfYWdncmVnYXRvci5hdHRyLAorCSZkZXZfYXR0cl9hZF9udW1fcG9ydHMuYXR0ciwKKwkmZGV2X2F0dHJfYWRfYWN0b3Jfa2V5LmF0dHIsCisJJmRldl9hdHRyX2FkX3BhcnRuZXJfa2V5LmF0dHIsCisJJmRldl9hdHRyX2FkX3BhcnRuZXJfbWFjLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTEzNjcsMTEgKzE0MjgsMjYgQEAKIAlpZiAoIWZpcnN0Ym9uZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQluZXRkZXZfY2xhc3MgPSBmaXJzdGJvbmQtPmRldi0+Y2xhc3NfZGV2LmNsYXNzOworCW5ldGRldl9jbGFzcyA9IGZpcnN0Ym9uZC0+ZGV2LT5kZXYuY2xhc3M7CiAJaWYgKCFuZXRkZXZfY2xhc3MpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0ID0gY2xhc3NfY3JlYXRlX2ZpbGUobmV0ZGV2X2NsYXNzLCAmY2xhc3NfYXR0cl9ib25kaW5nX21hc3RlcnMpOworCS8qCisJICogUGVybWl0IG11bHRpcGxlIGxvYWRzIG9mIHRoZSBtb2R1bGUgYnkgaWdub3JpbmcgZmFpbHVyZXMgdG8KKwkgKiBjcmVhdGUgdGhlIGJvbmRpbmdfbWFzdGVycyBzeXNmcyBmaWxlLiAgQm9uZGluZyBkZXZpY2VzCisJICogY3JlYXRlZCBieSBzZWNvbmQgb3Igc3Vic2VxdWVudCBsb2FkcyBvZiB0aGUgbW9kdWxlIHdpbGwKKwkgKiBub3QgYmUgbGlzdGVkIGluLCBvciBjb250cm9sbGFibGUgYnksIGJvbmRpbmdfbWFzdGVycywgYnV0CisJICogd2lsbCBoYXZlIHRoZSB1c3VhbCAiYm9uZGluZyIgc3lzZnMgZGlyZWN0b3J5LgorCSAqCisJICogVGhpcyBpcyBkb25lIHRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvcgorCSAqIGluaXRzY3JpcHRzL3N5c2NvbmZpZywgd2hpY2ggbG9hZCBib25kaW5nIG11bHRpcGxlIHRpbWVzIHRvCisJICogY29uZmlndXJlIG11bHRpcGxlIGJvbmRpbmcgZGV2aWNlcy4KKwkgKi8KKwlpZiAocmV0ID09IC1FRVhJU1QpIHsKKwkJbmV0ZGV2X2NsYXNzID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQogCiAJcmV0dXJuIHJldDsKIApAQCAtMTM5NSwxMyArMTQ3MSwxMyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBib25kLT5kZXY7CiAJaW50IGVycjsKIAotCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmKGRldi0+Y2xhc3NfZGV2LmtvYmopLCAmYm9uZGluZ19ncm91cCk7CisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCYoZGV2LT5kZXYua29iaiksICZib25kaW5nX2dyb3VwKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VNRVJHICJlZWshIGRpZG4ndCBjcmVhdGUgZ3JvdXAhXG4iKTsKIAl9CiAKIAlpZiAoZXhwZWN0ZWRfcmVmY291bnQgPCAxKQotCQlleHBlY3RlZF9yZWZjb3VudCA9IGF0b21pY19yZWFkKCZib25kLT5kZXYtPmNsYXNzX2Rldi5rb2JqLmtyZWYucmVmY291bnQpOworCQlleHBlY3RlZF9yZWZjb3VudCA9IGF0b21pY19yZWFkKCZib25kLT5kZXYtPmRldi5rb2JqLmtyZWYucmVmY291bnQpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE0MTIsNiArMTQ4OCw2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJvbmQtPmRldjsKIAotCXN5c2ZzX3JlbW92ZV9ncm91cCgmKGRldi0+Y2xhc3NfZGV2LmtvYmopLCAmYm9uZGluZ19ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCYoZGV2LT5kZXYua29iaiksICZib25kaW5nX2dyb3VwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmggYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaAppbmRleCAwOTc4YzlhLi40MWFhNzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaAorKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRpbmcuaApAQCAtMjIsOCArMjIsOCBAQAogI2luY2x1ZGUgImJvbmRfM2FkLmgiCiAjaW5jbHVkZSAiYm9uZF9hbGIuaCIKIAotI2RlZmluZSBEUlZfVkVSU0lPTgkiMy4xLjEiCi0jZGVmaW5lIERSVl9SRUxEQVRFCSJTZXB0ZW1iZXIgMjYsIDIwMDYiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIzLjEuMiIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIkphbnVhcnkgMjAsIDIwMDciCiAjZGVmaW5lIERSVl9OQU1FCSJib25kaW5nIgogI2RlZmluZSBEUlZfREVTQ1JJUFRJT04JIkV0aGVybmV0IENoYW5uZWwgQm9uZGluZyBEcml2ZXIiCiAKQEAgLTIzNywxMiArMjM3LDEzIEBACiAjZGVmaW5lIEJPTkRfQVJQX1ZBTElEQVRFX0FMTAkJKEJPTkRfQVJQX1ZBTElEQVRFX0FDVElWRSB8IFwKIAkJCQkJIEJPTkRfQVJQX1ZBTElEQVRFX0JBQ0tVUCkKIAotZXh0ZXJuIGlubGluZSBpbnQgc2xhdmVfZG9fYXJwX3ZhbGlkYXRlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQorc3RhdGljIGlubGluZSBpbnQgc2xhdmVfZG9fYXJwX3ZhbGlkYXRlKHN0cnVjdCBib25kaW5nICpib25kLAorCQkJCQlzdHJ1Y3Qgc2xhdmUgKnNsYXZlKQogewogCXJldHVybiBib25kLT5wYXJhbXMuYXJwX3ZhbGlkYXRlICYgKDEgPDwgc2xhdmUtPnN0YXRlKTsKIH0KIAotZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBsb25nIHNsYXZlX2xhc3Rfcngoc3RydWN0IGJvbmRpbmcgKmJvbmQsCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2xhdmVfbGFzdF9yeChzdHJ1Y3QgYm9uZGluZyAqYm9uZCwKIAkJCQkJc3RydWN0IHNsYXZlICpzbGF2ZSkKIHsKIAlpZiAoc2xhdmVfZG9fYXJwX3ZhbGlkYXRlKGJvbmQsIHNsYXZlKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2NvbW1vbi5oCmluZGV4IDc0NzU4ZDIuLjc4N2YyZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jb21tb24uaApAQCAtMzI0LDcgKzMyNCw3IEBACiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgbWRpb19waHliYXNlYWRkcjsKIAlzdHJ1Y3QgZ21hYyAgICAgICAgICAgICpnbWFjOwogCXN0cnVjdCBncGh5ICAgICAgICAgICAgKmdwaHk7Ci0Jc3RydWN0IG1kaW9fb3BzCSAgICAgICAqbWRpb19vcHM7CisJc3RydWN0IG1kaW9fb3BzICAgICAgICAqbWRpb19vcHM7CiAJY29uc3QgY2hhciAgICAgICAgICAgICAqZGVzYzsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3BsNV9jbWQuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vY3BsNV9jbWQuaAppbmRleCAzNWY1NjViLi5lMzZkNDViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL2NwbDVfY21kLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jcGw1X2NtZC5oCkBAIC0xMDMsNyArMTAzLDcgQEAKIAlDUExfTUlHUkFURV9DMlRfUlBMICAgPSAweERELAogCUNQTF9FUlJPUiAgICAgICAgICAgICA9IDB4RDcsCiAKLSAgICAvKiBpbnRlcm5hbDogZHJpdmVyIC0+IFRPTSAqLworCS8qIGludGVybmFsOiBkcml2ZXIgLT4gVE9NICovCiAJQ1BMX01TU19DSEFOR0UgICAgICAgID0gMHhFMQogfTsKIApAQCAtMTU5LDggKzE1OSw4IEBACiB9OwogCiB1bmlvbiBvcGNvZGVfdGlkIHsKLSAgICB1MzIgb3Bjb2RlX3RpZDsKLSAgICB1OCBvcGNvZGU7CisJdTMyIG9wY29kZV90aWQ7CisJdTggb3Bjb2RlOwogfTsKIAogI2RlZmluZSBTX09QQ09ERSAyNApAQCAtMjM0LDcgKzIzNCw3IEBACiAJdTMyIGxvY2FsX2lwOwogCXUzMiBwZWVyX2lwOwogCXUzMiB0b3NfdGlkOwotICAgIHN0cnVjdCB0Y3Bfb3B0aW9ucyB0Y3Bfb3B0aW9uczsKKwlzdHJ1Y3QgdGNwX29wdGlvbnMgdGNwX29wdGlvbnM7CiAJdTggIGRzdF9tYWNbNl07CiAJdTE2IHZsYW5fdGFnOwogCXU4ICBzcmNfbWFjWzZdOwpAQCAtMjUwLDEyICsyNTAsMTIgQEAKIAl1MzIgcGVlcl9pcDsKIAl1MzIgb3B0MGg7CiAJdW5pb24gewotCXUzMiBvcHQwbDsKLQlzdHJ1Y3QgewotCSAgICB1OCByc3ZkWzNdOwotCSAgICB1OCBzdGF0dXM7CisJCXUzMiBvcHQwbDsKKwkJc3RydWN0IHsKKwkJICAgIHU4IHJzdmRbM107CisJCSAgICB1OCBzdGF0dXM7CisJCX07CiAJfTsKLSAgICB9OwogfTsKIAogc3RydWN0IGNwbF9hY3Rfb3Blbl9yZXEgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9jeGdiMi5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jeGdiMi5jCmluZGV4IGZkNWQ4MjFmLi43ZDBmMjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL2N4Z2IyLmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9jeGdiMi5jCkBAIC02OSwxNCArNjksMTQgQEAKIAljYW5jZWxfZGVsYXllZF93b3JrKCZhcC0+c3RhdHNfdXBkYXRlX3Rhc2spOwogfQogCi0jZGVmaW5lIE1BWF9DTURRX0VOVFJJRVMgMTYzODQKLSNkZWZpbmUgTUFYX0NNRFExX0VOVFJJRVMgMTAyNAotI2RlZmluZSBNQVhfUlhfQlVGRkVSUyAxNjM4NAotI2RlZmluZSBNQVhfUlhfSlVNQk9fQlVGRkVSUyAxNjM4NAorI2RlZmluZSBNQVhfQ01EUV9FTlRSSUVTCTE2Mzg0CisjZGVmaW5lIE1BWF9DTURRMV9FTlRSSUVTCTEwMjQKKyNkZWZpbmUgTUFYX1JYX0JVRkZFUlMJCTE2Mzg0CisjZGVmaW5lIE1BWF9SWF9KVU1CT19CVUZGRVJTCTE2Mzg0CiAjZGVmaW5lIE1BWF9UWF9CVUZGRVJTX0hJR0gJMTYzODRVCiAjZGVmaW5lIE1BWF9UWF9CVUZGRVJTX0xPVwkxNTM2VQogI2RlZmluZSBNQVhfVFhfQlVGRkVSUwkJMTQ2MFUKLSNkZWZpbmUgTUlOX0ZMX0VOVFJJRVMgMzIKKyNkZWZpbmUgTUlOX0ZMX0VOVFJJRVMJCTMyCiAKICNkZWZpbmUgREZMVF9NU0dfRU5BQkxFIChORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTksgfCBcCiAJCQkgTkVUSUZfTVNHX1RJTUVSIHwgTkVUSUZfTVNHX0lGRE9XTiB8IE5FVElGX01TR19JRlVQIHxcCkBAIC0xNDMsNyArMTQzLDcgQEAKIAkJCWNhc2UgU1BFRURfMTAwOiAgIHMgPSAiMTAwTWJwcyI7IGJyZWFrOwogCQl9CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayB1cCwgJXMsICVzLWR1cGxleFxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAsICVzLCAlcy1kdXBsZXhcbiIsCiAJCSAgICAgICBwLT5kZXYtPm5hbWUsIHMsCiAJCSAgICAgICBwLT5saW5rX2NvbmZpZy5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgPyAiZnVsbCIgOiAiaGFsZiIpOwogCX0KQEAgLTIzMyw3ICsyMzMsNyBAQAogCiAJdDFfc2dlX3N0YXJ0KGFkYXB0ZXItPnNnZSk7CiAJdDFfaW50ZXJydXB0c19lbmFibGUoYWRhcHRlcik7Ci0gb3V0X2VycjoKK291dF9lcnI6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNDU0LDUxICs0NTQsMjEgQEAKIAljb25zdCBzdHJ1Y3QgY21hY19zdGF0aXN0aWNzICpzOwogCWNvbnN0IHN0cnVjdCBzZ2VfaW50cl9jb3VudHMgKnQ7CiAJc3RydWN0IHNnZV9wb3J0X3N0YXRzIHNzOworCXVuc2lnbmVkIGludCBsZW47CiAKIAlzID0gbWFjLT5vcHMtPnN0YXRpc3RpY3NfdXBkYXRlKG1hYywgTUFDX1NUQVRTX1VQREFURV9GVUxMKTsKIAotCSpkYXRhKysgPSBzLT5UeE9jdGV0c09LOwotCSpkYXRhKysgPSBzLT5UeE9jdGV0c0JhZDsKLQkqZGF0YSsrID0gcy0+VHhVbmljYXN0RnJhbWVzT0s7Ci0JKmRhdGErKyA9IHMtPlR4TXVsdGljYXN0RnJhbWVzT0s7Ci0JKmRhdGErKyA9IHMtPlR4QnJvYWRjYXN0RnJhbWVzT0s7Ci0JKmRhdGErKyA9IHMtPlR4UGF1c2VGcmFtZXM7Ci0JKmRhdGErKyA9IHMtPlR4RnJhbWVzV2l0aERlZmVycmVkWG1pc3Npb25zOwotCSpkYXRhKysgPSBzLT5UeExhdGVDb2xsaXNpb25zOwotCSpkYXRhKysgPSBzLT5UeFRvdGFsQ29sbGlzaW9uczsKLQkqZGF0YSsrID0gcy0+VHhGcmFtZXNBYm9ydGVkRHVlVG9YU0NvbGxpc2lvbnM7Ci0JKmRhdGErKyA9IHMtPlR4VW5kZXJydW47Ci0JKmRhdGErKyA9IHMtPlR4TGVuZ3RoRXJyb3JzOwotCSpkYXRhKysgPSBzLT5UeEludGVybmFsTUFDWG1pdEVycm9yOwotCSpkYXRhKysgPSBzLT5UeEZyYW1lc1dpdGhFeGNlc3NpdmVEZWZlcnJhbDsKLQkqZGF0YSsrID0gcy0+VHhGQ1NFcnJvcnM7CisJbGVuID0gc2l6ZW9mKHU2NCkqKCZzLT5UeEZDU0Vycm9ycyArIDEgLSAmcy0+VHhPY3RldHNPSyk7CisJbWVtY3B5KGRhdGEsICZzLT5UeE9jdGV0c09LLCBsZW4pOworCWRhdGEgKz0gbGVuOwogCi0JKmRhdGErKyA9IHMtPlJ4T2N0ZXRzT0s7Ci0JKmRhdGErKyA9IHMtPlJ4T2N0ZXRzQmFkOwotCSpkYXRhKysgPSBzLT5SeFVuaWNhc3RGcmFtZXNPSzsKLQkqZGF0YSsrID0gcy0+UnhNdWx0aWNhc3RGcmFtZXNPSzsKLQkqZGF0YSsrID0gcy0+UnhCcm9hZGNhc3RGcmFtZXNPSzsKLQkqZGF0YSsrID0gcy0+UnhQYXVzZUZyYW1lczsKLQkqZGF0YSsrID0gcy0+UnhGQ1NFcnJvcnM7Ci0JKmRhdGErKyA9IHMtPlJ4QWxpZ25FcnJvcnM7Ci0JKmRhdGErKyA9IHMtPlJ4U3ltYm9sRXJyb3JzOwotCSpkYXRhKysgPSBzLT5SeERhdGFFcnJvcnM7Ci0JKmRhdGErKyA9IHMtPlJ4U2VxdWVuY2VFcnJvcnM7Ci0JKmRhdGErKyA9IHMtPlJ4UnVudEVycm9yczsKLQkqZGF0YSsrID0gcy0+UnhKYWJiZXJFcnJvcnM7Ci0JKmRhdGErKyA9IHMtPlJ4SW50ZXJuYWxNQUNSY3ZFcnJvcjsKLQkqZGF0YSsrID0gcy0+UnhJblJhbmdlTGVuZ3RoRXJyb3JzOwotCSpkYXRhKysgPSBzLT5SeE91dE9mUmFuZ2VMZW5ndGhGaWVsZDsKLQkqZGF0YSsrID0gcy0+UnhGcmFtZVRvb0xvbmdFcnJvcnM7CisJbGVuID0gc2l6ZW9mKHU2NCkqKCZzLT5SeEZyYW1lVG9vTG9uZ0Vycm9ycyArIDEgLSAmcy0+UnhPY3RldHNPSyk7CisJbWVtY3B5KGRhdGEsICZzLT5SeE9jdGV0c09LLCBsZW4pOworCWRhdGEgKz0gbGVuOwogCiAJdDFfc2dlX2dldF9wb3J0X3N0YXRzKGFkYXB0ZXItPnNnZSwgZGV2LT5pZl9wb3J0LCAmc3MpOwotCSpkYXRhKysgPSBzcy5yeF9wYWNrZXRzOwotCSpkYXRhKysgPSBzcy5yeF9jc29fZ29vZDsKLQkqZGF0YSsrID0gc3MudHhfcGFja2V0czsKLQkqZGF0YSsrID0gc3MudHhfY3NvOwotCSpkYXRhKysgPSBzcy50eF90c287Ci0JKmRhdGErKyA9IHNzLnZsYW5feHRyYWN0OwotCSpkYXRhKysgPSBzcy52bGFuX2luc2VydDsKKwltZW1jcHkoZGF0YSwgJnNzLCBzaXplb2Yoc3MpKTsKKwlkYXRhICs9IHNpemVvZihzcyk7CiAKIAl0ID0gdDFfc2dlX2dldF9pbnRyX2NvdW50cyhhZGFwdGVyLT5zZ2UpOwogCSpkYXRhKysgPSB0LT5yeF9kcm9wczsKQEAgLTc0OSw3ICs3MTksNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChhZGFwdGVyLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQotCXJldHVybiAtRUJVU1k7CisJCXJldHVybiAtRUJVU1k7CiAKIAlhZGFwdGVyLT5wYXJhbXMuc2dlLmZyZWVsUV9zaXplWyFqdW1ib19mbF0gPSBlLT5yeF9wZW5kaW5nOwogCWFkYXB0ZXItPnBhcmFtcy5zZ2UuZnJlZWxRX3NpemVbanVtYm9fZmxdID0gZS0+cnhfanVtYm9fcGVuZGluZzsKQEAgLTc2NCw3ICs3MzQsNyBAQAogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OwogCiAJYWRhcHRlci0+cGFyYW1zLnNnZS5yeF9jb2FsZXNjZV91c2VjcyA9IGMtPnJ4X2NvYWxlc2NlX3VzZWNzOwotIAlhZGFwdGVyLT5wYXJhbXMuc2dlLmNvYWxlc2NlX2VuYWJsZSA9IGMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZTsKKwlhZGFwdGVyLT5wYXJhbXMuc2dlLmNvYWxlc2NlX2VuYWJsZSA9IGMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZTsKIAlhZGFwdGVyLT5wYXJhbXMuc2dlLnNhbXBsZV9pbnRlcnZhbF91c2VjcyA9IGMtPnJhdGVfc2FtcGxlX2ludGVydmFsOwogCXQxX3NnZV9zZXRfY29hbGVzY2VfcGFyYW1zKGFkYXB0ZXItPnNnZSwgJmFkYXB0ZXItPnBhcmFtcy5zZ2UpOwogCXJldHVybiAwOwpAQCAtNzgyLDkgKzc1Miw5IEBACiAKIHN0YXRpYyBpbnQgZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CiAKLSAJcmV0dXJuIHQxX2lzX2FzaWMoYWRhcHRlcikgPyBFRVBST01fU0laRSA6IDA7CisJcmV0dXJuIHQxX2lzX2FzaWMoYWRhcHRlcikgPyBFRVBST01fU0laRSA6IDA7CiB9CiAKICNkZWZpbmUgRUVQUk9NX01BR0lDKGFwKSBcCkBAIC04NDgsNyArODE4LDcgQEAKIAkJdTMyIHZhbDsKIAogCQlpZiAoIXBoeS0+bWRpb19yZWFkKQotCSAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCXBoeS0+bWRpb19yZWFkKGFkYXB0ZXIsIGRhdGEtPnBoeV9pZCwgMCwgZGF0YS0+cmVnX251bSAmIDB4MWYsCiAJCQkgICAgICAgJnZhbCk7CiAJCWRhdGEtPnZhbF9vdXQgPSB2YWw7CkBAIC04NjAsNyArODMwLDcgQEAKIAkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkgICAgcmV0dXJuIC1FUEVSTTsKIAkJaWYgKCFwaHktPm1kaW9fd3JpdGUpCi0JICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAkJcGh5LT5tZGlvX3dyaXRlKGFkYXB0ZXIsIGRhdGEtPnBoeV9pZCwgMCwgZGF0YS0+cmVnX251bSAmIDB4MWYsCiAJCQkgICAgICAgIGRhdGEtPnZhbF9pbik7CiAJCWJyZWFrOwpAQCAtODc5LDkgKzg0OSw5IEBACiAJc3RydWN0IGNtYWMgKm1hYyA9IGFkYXB0ZXItPnBvcnRbZGV2LT5pZl9wb3J0XS5tYWM7CiAKIAlpZiAoIW1hYy0+b3BzLT5zZXRfbXR1KQotCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCWlmIChuZXdfbXR1IDwgNjgpCi0JcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRUlOVkFMOwogCWlmICgocmV0ID0gbWFjLT5vcHMtPnNldF9tdHUobWFjLCBuZXdfbXR1KSkpCiAJCXJldHVybiByZXQ7CiAJZGV2LT5tdHUgPSBuZXdfbXR1OwpAQCAtMTIxMSw5ICsxMTgxLDkgQEAKIAogCXJldHVybiAwOwogCi0gb3V0X3JlbGVhc2VfYWRhcHRlcl9yZXM6CitvdXRfcmVsZWFzZV9hZGFwdGVyX3JlczoKIAl0MV9mcmVlX3N3X21vZHVsZXMoYWRhcHRlcik7Ci0gb3V0X2ZyZWVfZGV2Ogorb3V0X2ZyZWVfZGV2OgogCWlmIChhZGFwdGVyKSB7CiAJCWlmIChhZGFwdGVyLT5yZWdzKQogCQkJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKQEAgLTEyMjIsNyArMTE5Miw3IEBACiAJCQkJZnJlZV9uZXRkZXYoYWRhcHRlci0+cG9ydFtpXS5kZXYpOwogCX0KIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotIG91dF9kaXNhYmxlX3BkZXY6CitvdXRfZGlzYWJsZV9wZGV2OgogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJcmV0dXJuIGVycjsKQEAgLTEyNzMsMjggKzEyNDMsMjcgQEAKIAlpbnQgTV9NRU1fVkFMOwogCiAJZW51bSB7Ci0JCU1fQ09SRV9CSVRTID0gOSwKLQkJVF9DT1JFX1ZBTCA9IDAsCi0JCVRfQ09SRV9CSVRTID0gMiwKLQkJTl9DT1JFX1ZBTCA9IDAsCi0JCU5fQ09SRV9CSVRTID0gMiwKLQkJTV9NRU1fQklUUyA9IDksCi0JCVRfTUVNX1ZBTCA9IDAsCi0JCVRfTUVNX0JJVFMgPSAyLAotCQlOX01FTV9WQUwgPSAwLAotCQlOX01FTV9CSVRTID0gMiwKLQkJTlBfTE9BRCA9IDEgPDwgMTcsCi0JCVNfTE9BRF9NRU0gPSAxIDw8IDUsCi0JCVNfTE9BRF9DT1JFID0gMSA8PCA2LAotCQlTX0NMT0NLID0gMSA8PCAzCisJCU1fQ09SRV9CSVRTCT0gOSwKKwkJVF9DT1JFX1ZBTAk9IDAsCisJCVRfQ09SRV9CSVRTCT0gMiwKKwkJTl9DT1JFX1ZBTAk9IDAsCisJCU5fQ09SRV9CSVRTCT0gMiwKKwkJTV9NRU1fQklUUwk9IDksCisJCVRfTUVNX1ZBTAk9IDAsCisJCVRfTUVNX0JJVFMJPSAyLAorCQlOX01FTV9WQUwJPSAwLAorCQlOX01FTV9CSVRTCT0gMiwKKwkJTlBfTE9BRAkJPSAxIDw8IDE3LAorCQlTX0xPQURfTUVNCT0gMSA8PCA1LAorCQlTX0xPQURfQ09SRQk9IDEgPDwgNiwKKwkJU19DTE9DSwkJPSAxIDw8IDMKIAl9OwogCiAJaWYgKCF0MV9pc19UMUIoYWRhcHRlcikpCiAJCXJldHVybiAtRU5PREVWOwkvKiBDYW4ndCByZS1jbG9jayB0aGlzIGNoaXAuICovCiAKLQlpZiAobW9kZSAmIDIpIHsKKwlpZiAobW9kZSAmIDIpCiAJCXJldHVybiAwOwkvKiBzaG93IGN1cnJlbnQgbW9kZS4gKi8KLQl9CiAKIAlpZiAoKGFkYXB0ZXItPnQxcG93ZXJzYXZlICYgMSkgPT0gKG1vZGUgJiAxKSkKIAkJcmV0dXJuIC1FQUxSRUFEWTsJLyogQVNJQyBhbHJlYWR5IHJ1bm5pbmcgaW4gbW9kZS4gKi8KQEAgLTEzODYsMjYgKzEzNTUsMjYgQEAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCByZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJaW50IGk7CiAKLQlpZiAoZGV2KSB7Ci0JCWludCBpOwotCQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKLQotCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCi0JCQlpZiAodGVzdF9iaXQoaSwgJmFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCkpCi0JCQkJdW5yZWdpc3Rlcl9uZXRkZXYoYWRhcHRlci0+cG9ydFtpXS5kZXYpOwotCi0JCXQxX2ZyZWVfc3dfbW9kdWxlcyhhZGFwdGVyKTsKLQkJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKLQkJd2hpbGUgKC0taSA+PSAwKQotCQkJaWYgKGFkYXB0ZXItPnBvcnRbaV0uZGV2KQotCQkJCWZyZWVfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbaV0uZGV2KTsKLQotCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQkJdDFfc3dfcmVzZXQocGRldik7CisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CisJCWlmICh0ZXN0X2JpdChpLCAmYWRhcHRlci0+cmVnaXN0ZXJlZF9kZXZpY2VfbWFwKSkKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbaV0uZGV2KTsKIAl9CisKKwl0MV9mcmVlX3N3X21vZHVsZXMoYWRhcHRlcik7CisJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKKworCXdoaWxlICgtLWkgPj0gMCkgeworCQlpZiAoYWRhcHRlci0+cG9ydFtpXS5kZXYpCisJCQlmcmVlX25ldGRldihhZGFwdGVyLT5wb3J0W2ldLmRldik7CisJfQorCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXQxX3N3X3Jlc2V0KHBkZXYpOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9lbG1lcjAuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vZWxtZXIwLmgKaW5kZXggOWViZWNhYS4uZWVmNjU1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9lbG1lcjAuaAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2VsbWVyMC5oCkBAIC00NiwxNCArNDYsMTQgQEAKIH07CiAKIC8qIEVMTUVSMCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgQV9FTE1FUjBfVkVSU0lPTiAweDEwMDAwMAotI2RlZmluZSBBX0VMTUVSMF9QSFlfQ0ZHIDB4MTAwMDA0Ci0jZGVmaW5lIEFfRUxNRVIwX0lOVF9FTkFCTEUgMHgxMDAwMDgKLSNkZWZpbmUgQV9FTE1FUjBfSU5UX0NBVVNFIDB4MTAwMDBjCi0jZGVmaW5lIEFfRUxNRVIwX0dQSV9DRkcgMHgxMDAwMTAKLSNkZWZpbmUgQV9FTE1FUjBfR1BJX1NUQVQgMHgxMDAwMTQKLSNkZWZpbmUgQV9FTE1FUjBfR1BPIDB4MTAwMDE4Ci0jZGVmaW5lIEFfRUxNRVIwX1BPUlQwX01JMV9DRkcgMHg0MDAwMDAKKyNkZWZpbmUgQV9FTE1FUjBfVkVSU0lPTgkweDEwMDAwMAorI2RlZmluZSBBX0VMTUVSMF9QSFlfQ0ZHCTB4MTAwMDA0CisjZGVmaW5lIEFfRUxNRVIwX0lOVF9FTkFCTEUJMHgxMDAwMDgKKyNkZWZpbmUgQV9FTE1FUjBfSU5UX0NBVVNFCTB4MTAwMDBjCisjZGVmaW5lIEFfRUxNRVIwX0dQSV9DRkcJMHgxMDAwMTAKKyNkZWZpbmUgQV9FTE1FUjBfR1BJX1NUQVQJMHgxMDAwMTQKKyNkZWZpbmUgQV9FTE1FUjBfR1BPCQkweDEwMDAxOAorI2RlZmluZSBBX0VMTUVSMF9QT1JUMF9NSTFfQ0ZHCTB4NDAwMDAwCiAKICNkZWZpbmUgU19NSTFfTURJX0VOQUJMRSAgICAwCiAjZGVmaW5lIFZfTUkxX01ESV9FTkFCTEUoeCkgKCh4KSA8PCBTX01JMV9NRElfRU5BQkxFKQpAQCAtMTExLDE4ICsxMTEsMTggQEAKICNkZWZpbmUgVl9NSTFfT1BfQlVTWSh4KSAoKHgpIDw8IFNfTUkxX09QX0JVU1kpCiAjZGVmaW5lIEZfTUkxX09QX0JVU1kgICAgVl9NSTFfT1BfQlVTWSgxVSkKIAotI2RlZmluZSBBX0VMTUVSMF9QT1JUMV9NSTFfQ0ZHIDB4NTAwMDAwCi0jZGVmaW5lIEFfRUxNRVIwX1BPUlQxX01JMV9BRERSIDB4NTAwMDA0Ci0jZGVmaW5lIEFfRUxNRVIwX1BPUlQxX01JMV9EQVRBIDB4NTAwMDA4Ci0jZGVmaW5lIEFfRUxNRVIwX1BPUlQxX01JMV9PUCAweDUwMDAwYwotI2RlZmluZSBBX0VMTUVSMF9QT1JUMl9NSTFfQ0ZHIDB4NjAwMDAwCi0jZGVmaW5lIEFfRUxNRVIwX1BPUlQyX01JMV9BRERSIDB4NjAwMDA0Ci0jZGVmaW5lIEFfRUxNRVIwX1BPUlQyX01JMV9EQVRBIDB4NjAwMDA4Ci0jZGVmaW5lIEFfRUxNRVIwX1BPUlQyX01JMV9PUCAweDYwMDAwYwotI2RlZmluZSBBX0VMTUVSMF9QT1JUM19NSTFfQ0ZHIDB4NzAwMDAwCi0jZGVmaW5lIEFfRUxNRVIwX1BPUlQzX01JMV9BRERSIDB4NzAwMDA0Ci0jZGVmaW5lIEFfRUxNRVIwX1BPUlQzX01JMV9EQVRBIDB4NzAwMDA4Ci0jZGVmaW5lIEFfRUxNRVIwX1BPUlQzX01JMV9PUCAweDcwMDAwYworI2RlZmluZSBBX0VMTUVSMF9QT1JUMV9NSTFfQ0ZHCTB4NTAwMDAwCisjZGVmaW5lIEFfRUxNRVIwX1BPUlQxX01JMV9BRERSCTB4NTAwMDA0CisjZGVmaW5lIEFfRUxNRVIwX1BPUlQxX01JMV9EQVRBCTB4NTAwMDA4CisjZGVmaW5lIEFfRUxNRVIwX1BPUlQxX01JMV9PUAkweDUwMDAwYworI2RlZmluZSBBX0VMTUVSMF9QT1JUMl9NSTFfQ0ZHCTB4NjAwMDAwCisjZGVmaW5lIEFfRUxNRVIwX1BPUlQyX01JMV9BRERSCTB4NjAwMDA0CisjZGVmaW5lIEFfRUxNRVIwX1BPUlQyX01JMV9EQVRBCTB4NjAwMDA4CisjZGVmaW5lIEFfRUxNRVIwX1BPUlQyX01JMV9PUAkweDYwMDAwYworI2RlZmluZSBBX0VMTUVSMF9QT1JUM19NSTFfQ0ZHCTB4NzAwMDAwCisjZGVmaW5lIEFfRUxNRVIwX1BPUlQzX01JMV9BRERSCTB4NzAwMDA0CisjZGVmaW5lIEFfRUxNRVIwX1BPUlQzX01JMV9EQVRBCTB4NzAwMDA4CisjZGVmaW5lIEFfRUxNRVIwX1BPUlQzX01JMV9PUAkweDcwMDAwYwogCiAvKiBTaW1wbGUgYml0IGRlZmluaXRpb24gZm9yIEdQSSBhbmQgR1AwIHJlZ2lzdGVycy4gKi8KICNkZWZpbmUgICAgIEVMTUVSMF9HUF9CSVQwICAgICAgICAgICAgICAweDAwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vZXNwaS5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmMKaW5kZXggNDE5MmYwZi4uZDdjNTQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9lc3BpLmMKQEAgLTIwMiw5ICsyMDIsOSBAQAogCiBzdGF0aWMgdm9pZCBlc3BpX3NldHVwX2Zvcl92c2M3MzIxKGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLSAgICAgICAgd3JpdGVsKDB4MWY0LCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjApOwotICAgICAgICB3cml0ZWwoMHgxZjQwMWY0LCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjEpOwotICAgICAgICB3cml0ZWwoMHgxZjQsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfU0NIX1RPS0VOMik7CisJd3JpdGVsKDB4MWY0LCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjApOworCXdyaXRlbCgweDFmNDAxZjQsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfU0NIX1RPS0VOMSk7CisJd3JpdGVsKDB4MWY0LCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1NDSF9UT0tFTjIpOwogCXdyaXRlbCgweGEwMCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9SWF9GSUZPX0FMTU9TVF9GVUxMX1dBVEVSTUFSSyk7CiAJd3JpdGVsKDB4MWZmLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX1JYX0ZJRk9fQUxNT1NUX0VNUFRZX1dBVEVSTUFSSyk7CiAJd3JpdGVsKDEsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfQ0FMRU5EQVJfTEVOR1RIKTsKQEAgLTI0NywxMCArMjQ3LDEwIEBACiAJCXdyaXRlbChWX09VVF9PRl9TWU5DX0NPVU5UKDQpIHwKIAkJICAgICAgIFZfRElQMl9QQVJJVFlfRVJSX1RIUkVTKDMpIHwKIAkJICAgICAgIFZfRElQNF9USFJFUygxKSwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpOwotICAgICAgICAJd3JpdGVsKG5wb3J0cyA9PSA0ID8gMHgyMDAwNDAgOiAweDEwMDAwODAsCisJCXdyaXRlbChucG9ydHMgPT0gNCA/IDB4MjAwMDQwIDogMHgxMDAwMDgwLAogCQkgICAgICAgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NQVhCVVJTVDFfTUFYQlVSU1QyKTsKIAl9IGVsc2UKLSAgICAgICAgCXdyaXRlbCgweDgwMDEwMCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NQVhCVVJTVDFfTUFYQlVSU1QyKTsKKwkJd3JpdGVsKDB4ODAwMTAwLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01BWEJVUlNUMV9NQVhCVVJTVDIpOwogCiAJaWYgKG1hY190eXBlID09IENIQlRfTUFDX1BNMzM5MykKIAkJZXNwaV9zZXR1cF9mb3JfcG0zMzkzKGFkYXB0ZXIpOwpAQCAtMzAxLDcgKzMwMSw4IEBACiB7CiAJc3RydWN0IHBlZXNwaSAqZXNwaSA9IGFkYXB0ZXItPmVzcGk7CiAKLQlpZiAoIWlzX1QyKGFkYXB0ZXIpKSByZXR1cm47CisJaWYgKCFpc19UMihhZGFwdGVyKSkKKwkJcmV0dXJuOwogCXNwaW5fbG9jaygmZXNwaS0+bG9jayk7CiAJZXNwaS0+bWlzY19jdHJsID0gKHZhbCAmIH5NT05fTUFTSykgfAogCQkJICAoZXNwaS0+bWlzY19jdHJsICYgTU9OX01BU0spOwpAQCAtMzQwLDMyICszNDEsMzEgQEAKICAqIGNvbXBhcmUgd2l0aCB0MV9lc3BpX2dldF9tb24oKSwgaXQgcmVhZHMgZXNwaUluVHhTb3BbMCB+IDNdIGluCiAgKiBvbmUgc2hvdCwgc2luY2UgdGhlcmUgaXMgbm8gcGVyIHBvcnQgY291bnRlciBvbiB0aGUgb3V0IHNpZGUuCiAgKi8KLWludAotdDFfZXNwaV9nZXRfbW9uX3QyMDQoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgKnZhbHAsIHU4IHdhaXQpCitpbnQgdDFfZXNwaV9nZXRfbW9uX3QyMDQoYWRhcHRlcl90ICphZGFwdGVyLCB1MzIgKnZhbHAsIHU4IHdhaXQpCiB7Ci0gICAgICAgIHN0cnVjdCBwZWVzcGkgKmVzcGkgPSBhZGFwdGVyLT5lc3BpOworCXN0cnVjdCBwZWVzcGkgKmVzcGkgPSBhZGFwdGVyLT5lc3BpOwogCXU4IGksIG5wb3J0ID0gKHU4KWFkYXB0ZXItPnBhcmFtcy5ucG9ydHM7CiAKLSAgICAgICAgaWYgKCF3YWl0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzcGluX3RyeWxvY2soJmVzcGktPmxvY2spKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBzcGluX2xvY2soJmVzcGktPmxvY2spOworCWlmICghd2FpdCkgeworCQlpZiAoIXNwaW5fdHJ5bG9jaygmZXNwaS0+bG9jaykpCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlCisJCXNwaW5fbG9jaygmZXNwaS0+bG9jayk7CiAKLQlpZiAoIChlc3BpLT5taXNjX2N0cmwgJiBNT05fTUFTSykgIT0gRl9NT05JVE9SRURfRElSRUNUSU9OICkgeworCWlmICgoZXNwaS0+bWlzY19jdHJsICYgTU9OX01BU0spICE9IEZfTU9OSVRPUkVEX0RJUkVDVElPTikgewogCQllc3BpLT5taXNjX2N0cmwgPSAoZXNwaS0+bWlzY19jdHJsICYgfk1PTl9NQVNLKSB8CiAJCQkJCUZfTU9OSVRPUkVEX0RJUkVDVElPTjsKLSAgICAgICAgICAgICAgICB3cml0ZWwoZXNwaS0+bWlzY19jdHJsLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01JU0NfQ09OVFJPTCk7Ci0gCX0KKwkJd3JpdGVsKGVzcGktPm1pc2NfY3RybCwgYWRhcHRlci0+cmVncyArIEFfRVNQSV9NSVNDX0NPTlRST0wpOworCX0KIAlmb3IgKGkgPSAwIDsgaSA8IG5wb3J0OyBpKyssIHZhbHArKykgewogCQlpZiAoaSkgewogCQkJd3JpdGVsKGVzcGktPm1pc2NfY3RybCB8IFZfTU9OSVRPUkVEX1BPUlRfTlVNKGkpLAogCQkJICAgICAgIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUlTQ19DT05UUk9MKTsKIAkJfQotICAgICAgICAgICAgICAgICp2YWxwID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfRVNQSV9TQ0hfVE9LRU4zKTsKLSAgICAgICAgfQorCQkqdmFscCA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfU0NIX1RPS0VOMyk7CisJfQogCi0gICAgICAgIHdyaXRlbChlc3BpLT5taXNjX2N0cmwsIGFkYXB0ZXItPnJlZ3MgKyBBX0VTUElfTUlTQ19DT05UUk9MKTsKLSAgICAgICAgc3Bpbl91bmxvY2soJmVzcGktPmxvY2spOwotICAgICAgICByZXR1cm4gMDsKKwl3cml0ZWwoZXNwaS0+bWlzY19jdHJsLCBhZGFwdGVyLT5yZWdzICsgQV9FU1BJX01JU0NfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2soJmVzcGktPmxvY2spOworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9mcGdhX2RlZnMuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vZnBnYV9kZWZzLmgKaW5kZXggMTdhM2MyYi4uY2NkYjJiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9mcGdhX2RlZnMuaAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2ZwZ2FfZGVmcy5oCkBAIC05OCw5ICs5OCw5IEBACiAjZGVmaW5lIEFfTUkwX0RBVEFfSU5UIDB4YjEwCiAKIC8qIEdNQUMgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEFfR01BQ19NQUNJRF9MTyAweDI4Ci0jZGVmaW5lIEFfR01BQ19NQUNJRF9ISSAweDJjCi0jZGVmaW5lIEFfR01BQ19DU1IgMHgzMAorI2RlZmluZSBBX0dNQUNfTUFDSURfTE8JMHgyOAorI2RlZmluZSBBX0dNQUNfTUFDSURfSEkJMHgyYworI2RlZmluZSBBX0dNQUNfQ1NSCTB4MzAKIAogI2RlZmluZSBTX0lOVEVSRkFDRSAgICAwCiAjZGVmaW5lIE1fSU5URVJGQUNFICAgIDB4MwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9nbWFjLmggYi9kcml2ZXJzL25ldC9jaGVsc2lvL2dtYWMuaAppbmRleCBhMmI4YWQ5Li4wMDZhMmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL2dtYWMuaAorKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2dtYWMuaApAQCAtNDIsOCArNDIsMTUgQEAKIAogI2luY2x1ZGUgImNvbW1vbi5oIgogCi1lbnVtIHsgTUFDX1NUQVRTX1VQREFURV9GQVNULCBNQUNfU1RBVFNfVVBEQVRFX0ZVTEwgfTsKLWVudW0geyBNQUNfRElSRUNUSU9OX1JYID0gMSwgTUFDX0RJUkVDVElPTl9UWCA9IDIgfTsKK2VudW0geworCU1BQ19TVEFUU19VUERBVEVfRkFTVCwKKwlNQUNfU1RBVFNfVVBEQVRFX0ZVTEwKK307CisKK2VudW0geworCU1BQ19ESVJFQ1RJT05fUlggPSAxLAorCU1BQ19ESVJFQ1RJT05fVFggPSAyCit9OwogCiBzdHJ1Y3QgY21hY19zdGF0aXN0aWNzIHsKIAkvKiBUcmFuc21pdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9peGYxMDEwLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2l4ZjEwMTAuYwppbmRleCA1YjhmMTQ0Li4xMGIyYTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL2l4ZjEwMTAuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL2l4ZjEwMTAuYwpAQCAtMTQ1LDQ4ICsxNDUsNjEgQEAKIAl0MV90cGlfd3JpdGUobWFjLT5hZGFwdGVyLCBSRUdfUE9SVF9FTkFCTEUsIHZhbCk7CiB9CiAKLSNkZWZpbmUgUk1PTl9VUERBVEUobWFjLCBuYW1lLCBzdGF0X25hbWUpIFwKLQl0MV90cGlfcmVhZCgobWFjKS0+YWRhcHRlciwgTUFDUkVHKG1hYywgUkVHXyMjbmFtZSksICZ2YWwpOyBcCi0JKG1hYyktPnN0YXRzLnN0YXRfbmFtZSArPSB2YWw7Ci0KIC8qCiAgKiBSZWFkIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgUk1PTiBjb3VudGVycyBhbmQgYWRkIHRoZW0gdG8gdGhlIGN1bXVsYXRpdmUKICAqIHBvcnQgc3RhdGlzdGljcy4gIFRoZSBIVyBSTU9OIGNvdW50ZXJzIGFyZSBjbGVhcmVkIGJ5IHRoaXMgb3BlcmF0aW9uLgogICovCiBzdGF0aWMgdm9pZCBwb3J0X3N0YXRzX3VwZGF0ZShzdHJ1Y3QgY21hYyAqbWFjKQogewotCXUzMiB2YWw7CisJc3RhdGljIHN0cnVjdCB7CisJCXVuc2lnbmVkIGludCByZWc7CisJCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJfSBod19zdGF0c1tdID0gewogCi0JLyogUnggc3RhdHMgKi8KLQlSTU9OX1VQREFURShtYWMsIFJ4T2N0ZXRzVG90YWxPSywgUnhPY3RldHNPSyk7Ci0JUk1PTl9VUERBVEUobWFjLCBSeE9jdGV0c0JhZCwgUnhPY3RldHNCYWQpOwotCVJNT05fVVBEQVRFKG1hYywgUnhVQ1BrdHMsIFJ4VW5pY2FzdEZyYW1lc09LKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4TUNQa3RzLCBSeE11bHRpY2FzdEZyYW1lc09LKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4QkNQa3RzLCBSeEJyb2FkY2FzdEZyYW1lc09LKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4SnVtYm9Qa3RzLCBSeEp1bWJvRnJhbWVzT0spOwotCVJNT05fVVBEQVRFKG1hYywgUnhGQ1NFcnJvcnMsIFJ4RkNTRXJyb3JzKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4QWxpZ25FcnJvcnMsIFJ4QWxpZ25FcnJvcnMpOwotCVJNT05fVVBEQVRFKG1hYywgUnhMb25nRXJyb3JzLCBSeEZyYW1lVG9vTG9uZ0Vycm9ycyk7Ci0JUk1PTl9VUERBVEUobWFjLCBSeFZlcnlMb25nRXJyb3JzLCBSeEZyYW1lVG9vTG9uZ0Vycm9ycyk7Ci0JUk1PTl9VUERBVEUobWFjLCBSeFBhdXNlTWFjQ29udHJvbENvdW50ZXIsIFJ4UGF1c2VGcmFtZXMpOwotCVJNT05fVVBEQVRFKG1hYywgUnhEYXRhRXJyb3JzLCBSeERhdGFFcnJvcnMpOwotCVJNT05fVVBEQVRFKG1hYywgUnhKYWJiZXJFcnJvcnMsIFJ4SmFiYmVyRXJyb3JzKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4UnVudEVycm9ycywgUnhSdW50RXJyb3JzKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4U2hvcnRFcnJvcnMsIFJ4UnVudEVycm9ycyk7Ci0JUk1PTl9VUERBVEUobWFjLCBSeFNlcXVlbmNlRXJyb3JzLCBSeFNlcXVlbmNlRXJyb3JzKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4U3ltYm9sRXJyb3JzLCBSeFN5bWJvbEVycm9ycyk7CisjZGVmaW5lIEhXX1NUQVQobmFtZSwgc3RhdF9uYW1lKSBcCisJeyBSRUdfIyNuYW1lLCBcCisJICAoJigoc3RydWN0IGNtYWNfc3RhdGlzdGljcyAqKU5VTEwpLT5zdGF0X25hbWUpIC0gKHU2NCAqKU5VTEwgfQogCi0JLyogVHggc3RhdHMgKHNraXAgY29sbGlzaW9uIHN0YXRzIGFzIHdlIGFyZSBmdWxsLWR1cGxleCBvbmx5KSAqLwotCVJNT05fVVBEQVRFKG1hYywgVHhPY3RldHNUb3RhbE9LLCBUeE9jdGV0c09LKTsKLQlSTU9OX1VQREFURShtYWMsIFR4T2N0ZXRzQmFkLCBUeE9jdGV0c0JhZCk7Ci0JUk1PTl9VUERBVEUobWFjLCBUeFVDUGt0cywgVHhVbmljYXN0RnJhbWVzT0spOwotCVJNT05fVVBEQVRFKG1hYywgVHhNQ1BrdHMsIFR4TXVsdGljYXN0RnJhbWVzT0spOwotCVJNT05fVVBEQVRFKG1hYywgVHhCQ1BrdHMsIFR4QnJvYWRjYXN0RnJhbWVzT0spOwotCVJNT05fVVBEQVRFKG1hYywgVHhKdW1ib1BrdHMsIFR4SnVtYm9GcmFtZXNPSyk7Ci0JUk1PTl9VUERBVEUobWFjLCBUeFBhdXNlRnJhbWVzLCBUeFBhdXNlRnJhbWVzKTsKLQlSTU9OX1VQREFURShtYWMsIFR4RXhjZXNzaXZlTGVuZ3RoRHJvcCwgVHhMZW5ndGhFcnJvcnMpOwotCVJNT05fVVBEQVRFKG1hYywgVHhVbmRlcnJ1biwgVHhVbmRlcnJ1bik7Ci0JUk1PTl9VUERBVEUobWFjLCBUeENSQ0Vycm9ycywgVHhGQ1NFcnJvcnMpOworCQkvKiBSeCBzdGF0cyAqLworCQlIV19TVEFUKFJ4T2N0ZXRzVG90YWxPSywgUnhPY3RldHNPSyksCisJCUhXX1NUQVQoUnhPY3RldHNCYWQsIFJ4T2N0ZXRzQmFkKSwKKwkJSFdfU1RBVChSeFVDUGt0cywgUnhVbmljYXN0RnJhbWVzT0spLAorCQlIV19TVEFUKFJ4TUNQa3RzLCBSeE11bHRpY2FzdEZyYW1lc09LKSwKKwkJSFdfU1RBVChSeEJDUGt0cywgUnhCcm9hZGNhc3RGcmFtZXNPSyksCisJCUhXX1NUQVQoUnhKdW1ib1BrdHMsIFJ4SnVtYm9GcmFtZXNPSyksCisJCUhXX1NUQVQoUnhGQ1NFcnJvcnMsIFJ4RkNTRXJyb3JzKSwKKwkJSFdfU1RBVChSeEFsaWduRXJyb3JzLCBSeEFsaWduRXJyb3JzKSwKKwkJSFdfU1RBVChSeExvbmdFcnJvcnMsIFJ4RnJhbWVUb29Mb25nRXJyb3JzKSwKKwkJSFdfU1RBVChSeFZlcnlMb25nRXJyb3JzLCBSeEZyYW1lVG9vTG9uZ0Vycm9ycyksCisJCUhXX1NUQVQoUnhQYXVzZU1hY0NvbnRyb2xDb3VudGVyLCBSeFBhdXNlRnJhbWVzKSwKKwkJSFdfU1RBVChSeERhdGFFcnJvcnMsIFJ4RGF0YUVycm9ycyksCisJCUhXX1NUQVQoUnhKYWJiZXJFcnJvcnMsIFJ4SmFiYmVyRXJyb3JzKSwKKwkJSFdfU1RBVChSeFJ1bnRFcnJvcnMsIFJ4UnVudEVycm9ycyksCisJCUhXX1NUQVQoUnhTaG9ydEVycm9ycywgUnhSdW50RXJyb3JzKSwKKwkJSFdfU1RBVChSeFNlcXVlbmNlRXJyb3JzLCBSeFNlcXVlbmNlRXJyb3JzKSwKKwkJSFdfU1RBVChSeFN5bWJvbEVycm9ycywgUnhTeW1ib2xFcnJvcnMpLAorCisJCS8qIFR4IHN0YXRzIChza2lwIGNvbGxpc2lvbiBzdGF0cyBhcyB3ZSBhcmUgZnVsbC1kdXBsZXggb25seSkgKi8KKwkJSFdfU1RBVChUeE9jdGV0c1RvdGFsT0ssIFR4T2N0ZXRzT0spLAorCQlIV19TVEFUKFR4T2N0ZXRzQmFkLCBUeE9jdGV0c0JhZCksCisJCUhXX1NUQVQoVHhVQ1BrdHMsIFR4VW5pY2FzdEZyYW1lc09LKSwKKwkJSFdfU1RBVChUeE1DUGt0cywgVHhNdWx0aWNhc3RGcmFtZXNPSyksCisJCUhXX1NUQVQoVHhCQ1BrdHMsIFR4QnJvYWRjYXN0RnJhbWVzT0spLAorCQlIV19TVEFUKFR4SnVtYm9Qa3RzLCBUeEp1bWJvRnJhbWVzT0spLAorCQlIV19TVEFUKFR4UGF1c2VGcmFtZXMsIFR4UGF1c2VGcmFtZXMpLAorCQlIV19TVEFUKFR4RXhjZXNzaXZlTGVuZ3RoRHJvcCwgVHhMZW5ndGhFcnJvcnMpLAorCQlIV19TVEFUKFR4VW5kZXJydW4sIFR4VW5kZXJydW4pLAorCQlIV19TVEFUKFR4Q1JDRXJyb3JzLCBUeEZDU0Vycm9ycykKKwl9LCAqcCA9IGh3X3N0YXRzOworCXU2NCAqc3RhdHMgPSAodTY0ICopICZtYWMtPnN0YXRzOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHdfc3RhdHMpOyBpKyspIHsKKwkJdTMyIHZhbDsKKworCQl0MV90cGlfcmVhZChtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIHAtPnJlZyksICZ2YWwpOworCQlzdGF0c1twLT5vZmZzZXRdICs9IHZhbDsKKwl9CiB9CiAKIC8qIE5vLW9wIGludGVycnVwdCBvcGVyYXRpb24gYXMgdGhpcyBNQUMgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcnJ1cHRzICovCkBAIC0yNzMsNyArMjg2LDggQEAKIHN0YXRpYyBpbnQgbWFjX3NldF9tdHUoc3RydWN0IGNtYWMgKm1hYywgaW50IG10dSkKIHsKIAkvKiBNQVhfRlJBTUVfU0laRSBpbmx1ZGVzIGhlYWRlciArIEZDUywgbXR1IGRvZXNuJ3QgKi8KLQlpZiAobXR1ID4gKE1BWF9GUkFNRV9TSVpFIC0gMTQgLSA0KSkgcmV0dXJuIC1FSU5WQUw7CisJaWYgKG10dSA+IChNQVhfRlJBTUVfU0laRSAtIDE0IC0gNCkpCisJCXJldHVybiAtRUlOVkFMOwogCXQxX3RwaV93cml0ZShtYWMtPmFkYXB0ZXIsIE1BQ1JFRyhtYWMsIFJFR19NQVhfRlJBTUVfU0laRSksCiAJCSAgICAgbXR1ICsgMTQgKyA0KTsKIAlyZXR1cm4gMDsKQEAgLTM1Nyw4ICszNzEsOCBAQAogCXZhbCB8PSAoMSA8PCBpbmRleCk7CiAJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFJFR19QT1JUX0VOQUJMRSwgdmFsKTsKIAotICAgICAgIAlpbmRleCA8PD0gMjsKLSAgICAgICAgaWYgKGlzX1QyKGFkYXB0ZXIpKSB7CisJaW5kZXggPDw9IDI7CisJaWYgKGlzX1QyKGFkYXB0ZXIpKSB7CiAJCS8qIFQyMDQ6IHNldCB0aGUgRmlmbyB3YXRlciBsZXZlbCAmIHRocmVzaG9sZCAqLwogCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgUlhfRklGT19ISUdIX1dBVEVSTUFSS19CQVNFICsgaW5kZXgsIDB4NzQwKTsKIAkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIFJYX0ZJRk9fTE9XX1dBVEVSTUFSS19CQVNFICsgaW5kZXgsIDB4NzMwKTsKQEAgLTM4OSw2ICs0MDMsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBSTU9OX1VQREFURShtYWMsIG5hbWUsIHN0YXRfbmFtZSkgXAorCXQxX3RwaV9yZWFkKChtYWMpLT5hZGFwdGVyLCBNQUNSRUcobWFjLCBSRUdfIyNuYW1lKSwgJnZhbCk7IFwKKwkobWFjKS0+c3RhdHMuc3RhdF9uYW1lICs9IHZhbDsKKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseSB0byBhY2N1bXVsYXRlIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUKICAqIFJNT04gY291bnRlcnMgaW50byB0aGUgcG9ydCBzdGF0aXN0aWNzLiAgU2luY2UgdGhlIGNvdW50ZXJzIGFyZSBvbmx5IDMyIGJpdHMKQEAgLTQ2MCwxMCArNDc4LDEyIEBACiAJc3RydWN0IGNtYWMgKm1hYzsKIAl1MzIgdmFsOwogCi0JaWYgKGluZGV4ID4gOSkgcmV0dXJuIE5VTEw7CisJaWYgKGluZGV4ID4gOSkKKwkJcmV0dXJuIE5VTEw7CiAKIAltYWMgPSBremFsbG9jKHNpemVvZigqbWFjKSArIHNpemVvZihjbWFjX2luc3RhbmNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYWMpIHJldHVybiBOVUxMOworCWlmICghbWFjKQorCQlyZXR1cm4gTlVMTDsKIAogCW1hYy0+b3BzID0gJml4ZjEwMTBfb3BzOwogCW1hYy0+aW5zdGFuY2UgPSAoY21hY19pbnN0YW5jZSAqKShtYWMgKyAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OGUxeHh4LmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL212ODhlMXh4eC5jCmluZGV4IDI4YWM5M2YuLjU4NjdlM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXY4OGUxeHh4LmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9tdjg4ZTF4eHguYwpAQCAtNzMsOSArNzMsOCBAQAogCiAJCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsICZlbG1lcik7CiAJCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQxOwotCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpIHsKLQkJICAgIGVsbWVyIHw9IEVMTUVSMF9HUF9CSVQyfEVMTUVSMF9HUF9CSVQzfEVMTUVSMF9HUF9CSVQ0OwotICAgICAgICAgICAgICAgIH0KKwkJaWYgKGlzX1QyKGNwaHktPmFkYXB0ZXIpKQorCQkgICAgZWxtZXIgfD0gRUxNRVIwX0dQX0JJVDIgfCBFTE1FUjBfR1BfQklUMyB8IEVMTUVSMF9HUF9CSVQ0OwogCQl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgZWxtZXIpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTkyLDkgKzkxLDggQEAKIAogCQl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCAmZWxtZXIpOwogCQllbG1lciAmPSB+RUxNRVIwX0dQX0JJVDE7Ci0JCWlmIChpc19UMihjcGh5LT5hZGFwdGVyKSkgeworCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpCiAJCSAgICBlbG1lciAmPSB+KEVMTUVSMF9HUF9CSVQyfEVMTUVSMF9HUF9CSVQzfEVMTUVSMF9HUF9CSVQ0KTsKLSAgICAgICAgICAgICAgICB9CiAJCXQxX3RwaV93cml0ZShjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCBlbG1lcik7CiAJfQogCXJldHVybiAwOwpAQCAtMTEyLDkgKzExMCw4IEBACiAJaWYgKHQxX2lzX2FzaWMoY3BoeS0+YWRhcHRlcikpIHsKIAkJdDFfdHBpX3JlYWQoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0NBVVNFLCAmZWxtZXIpOwogCQllbG1lciB8PSBFTE1FUjBfR1BfQklUMTsKLQkJaWYgKGlzX1QyKGNwaHktPmFkYXB0ZXIpKSB7CisJCWlmIChpc19UMihjcGh5LT5hZGFwdGVyKSkKIAkJICAgIGVsbWVyIHw9IEVMTUVSMF9HUF9CSVQyfEVMTUVSMF9HUF9CSVQzfEVMTUVSMF9HUF9CSVQ0OwotICAgICAgICAgICAgICAgIH0KIAkJdDFfdHBpX3dyaXRlKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9DQVVTRSwgZWxtZXIpOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMwMCw3ICsyOTcsNyBAQAogCiAJLyoKIAkgKiBMb29wIHVudGlsIGNhdXNlIHJlYWRzIHplcm8uIE5lZWQgdG8gaGFuZGxlIGJvdW5jaW5nIGludGVycnVwdHMuCi0gICAgICAgICAqLworCSAqLwogCXdoaWxlICgxKSB7CiAJCXUzMiBjYXVzZTsKIApAQCAtMzA4LDE1ICszMDUsMTYgQEAKIAkJCQlNVjg4RTFYWFhfSU5URVJSVVBUX1NUQVRVU19SRUdJU1RFUiwKIAkJCQkmY2F1c2UpOwogCQljYXVzZSAmPSBJTlRSX0VOQUJMRV9NQVNLOwotCQlpZiAoIWNhdXNlKSBicmVhazsKKwkJaWYgKCFjYXVzZSkKKwkJCWJyZWFrOwogCiAJCWlmIChjYXVzZSAmIE1WODhFMVhYWF9JTlRSX0xJTktfQ0hORykgewogCQkJKHZvaWQpIHNpbXBsZV9tZGlvX3JlYWQoY3BoeSwKIAkJCQlNVjg4RTFYWFhfU1BFQ0lGSUNfU1RBVFVTX1JFR0lTVEVSLCAmc3RhdHVzKTsKIAotCQkJaWYgKHN0YXR1cyAmIE1WODhFMVhYWF9JTlRSX0xJTktfQ0hORykgeworCQkJaWYgKHN0YXR1cyAmIE1WODhFMVhYWF9JTlRSX0xJTktfQ0hORykKIAkJCQljcGh5LT5zdGF0ZSB8PSBQSFlfTElOS19VUDsKLQkJCX0gZWxzZSB7CisJCQllbHNlIHsKIAkJCQljcGh5LT5zdGF0ZSAmPSB+UEhZX0xJTktfVVA7CiAJCQkJaWYgKGNwaHktPnN0YXRlICYgUEhZX0FVVE9ORUdfRU4pCiAJCQkJCWNwaHktPnN0YXRlICY9IH5QSFlfQVVUT05FR19SRFk7CkBAIC0zNjAsNyArMzU4LDggQEAKIHsKIAlzdHJ1Y3QgY3BoeSAqY3BoeSA9IGt6YWxsb2Moc2l6ZW9mKCpjcGh5KSwgR0ZQX0tFUk5FTCk7CiAKLQlpZiAoIWNwaHkpIHJldHVybiBOVUxMOworCWlmICghY3BoeSkKKwkJcmV0dXJuIE5VTEw7CiAKIAljcGh5X2luaXQoY3BoeSwgYWRhcHRlciwgcGh5X2FkZHIsICZtdjg4ZTF4eHhfb3BzLCBtZGlvX29wcyk7CiAKQEAgLTM3NywxMSArMzc2LDExIEBACiAJfQogCSh2b2lkKSBtdjg4ZTF4eHhfZG93bnNoaWZ0X3NldChjcGh5LCAxKTsgICAvKiBFbmFibGUgZG93bnNoaWZ0ICovCiAKLSAgICAgICAgLyogTEVEICovCisJLyogTEVEICovCiAJaWYgKGlzX1QyKGFkYXB0ZXIpKSB7CiAJCSh2b2lkKSBzaW1wbGVfbWRpb193cml0ZShjcGh5LAogCQkJCU1WODhFMVhYWF9MRURfQ09OVFJPTF9SRUdJU1RFUiwgMHgxKTsKLSAgICAgICAgfQorCX0KIAogCXJldHVybiBjcGh5OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby9teTMxMjYuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vbXkzMTI2LmMKaW5kZXggODJmZWQxZC4uODdkZGUzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9teTMxMjYuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL215MzEyNi5jCkBAIC0xMCwyNSArMTAsMjUgQEAKIAkgKiBUaGlzIGNhbiBiZSBkb25lIHRocm91Z2ggcmVnaXN0ZXJzLiAgSXQgaXMgbm90IHJlcXVpcmVkIHNpbmNlCiAJICogYSBmdWxsIGNoaXAgcmVzZXQgaXMgdXNlZC4KIAkgKi8KLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG15MzEyNl9pbnRlcnJ1cHRfZW5hYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQogewogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY3BoeS0+cGh5X3VwZGF0ZSwgSFovMzApOwogCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgJmNwaHktPmVsbWVyX2dwbyk7Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBteTMxMjZfaW50ZXJydXB0X2Rpc2FibGUoc3RydWN0IGNwaHkgKmNwaHkpCiB7CiAJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmY3BoeS0+cGh5X3VwZGF0ZSk7Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBteTMxMjZfaW50ZXJydXB0X2NsZWFyKHN0cnVjdCBjcGh5ICpjcGh5KQogewotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgT0ZGU0VUKFJFR19BRERSKSAgICAoUkVHX0FERFIgPDwgMikKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiBzdGF0aWMgaW50IG15MzEyNl9zZXRfbG9vcGJhY2soc3RydWN0IGNwaHkgKmNwaHksIGludCBvbikKIHsKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiAvKiBUbyBjaGVjayB0aGUgYWN0aXZpdHkgTEVEICovCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlpZiAoZmMpCiAJCSpmYyA9IFBBVVNFX1JYIHwgUEFVU0VfVFg7CiAKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBteTMxMjZfZGVzdHJveShzdHJ1Y3QgY3BoeSAqY3BoeSkKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCUlOSVRfREVMQVlFRF9XT1JLKCZjcGh5LT5waHlfdXBkYXRlLCBteTMyMTZfcG9sbCk7CiAJY3BoeS0+Ym1zciA9IDA7CiAKLQlyZXR1cm4gKGNwaHkpOworCXJldHVybiBjcGh5OwogfQogCiAvKiBDaGlwIFJlc2V0ICovCkBAIC0xOTgsNyArMTk4LDcgQEAKIAl2YWwgfD0gMHg4MDAwOwogCXQxX3RwaV93cml0ZShhZGFwdGVyLCBBX0VMTUVSMF9HUE8sIHZhbCk7CiAJdWRlbGF5KDEwMCk7Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGdwaHkgdDFfbXkzMTI2X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vcG0zMzkzLmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3BtMzM5My5jCmluZGV4IDYzY2FiZWIuLjY5MTI5ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vcG0zMzkzLmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby9wbTMzOTMuYwpAQCAtNDQ2LDE3ICs0NDYsNTEgQEAKIAkJKnZhbCArPSAxdWxsIDw8IDQwOwogfQogCi0jZGVmaW5lIFJNT05fVVBEQVRFKG1hYywgbmFtZSwgc3RhdF9uYW1lKSBcCi0JcG0zMzkzX3Jtb25fdXBkYXRlKChtYWMpLT5hZGFwdGVyLCBPRkZTRVQobmFtZSksIAkJXAotCQkJICAgJihtYWMpLT5zdGF0cy5zdGF0X25hbWUsCQkJXAotCQkgICAocm8gJigobmFtZSAtIFNVTkkxeDEwR0VYUF9SRUdfTVNUQVRfQ09VTlRFUl8wX0xPVykgPj4gMikpKQotCi0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY21hY19zdGF0aXN0aWNzICpwbTMzOTNfdXBkYXRlX3N0YXRpc3RpY3Moc3RydWN0IGNtYWMgKm1hYywKIAkJCQkJCQkgICAgICBpbnQgZmxhZykKIHsKLQl1NjQJcm87Ci0JdTMyCXZhbDAsIHZhbDEsIHZhbDIsIHZhbDM7CisJc3RhdGljIHN0cnVjdCB7CisJCXVuc2lnbmVkIGludCByZWc7CisJCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJfSBod19zdGF0cyBbXSA9IHsKKworI2RlZmluZSBIV19TVEFUKG5hbWUsIHN0YXRfbmFtZSkgXAorCXsgbmFtZSwgKCYoKHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MgKilOVUxMKS0+c3RhdF9uYW1lKSAtICh1NjQgKilOVUxMIH0KKworCQkvKiBSeCBzdGF0cyAqLworCQlIV19TVEFUKFJ4T2N0ZXRzUmVjZWl2ZWRPSywgUnhPY3RldHNPSyksCisJCUhXX1NUQVQoUnhVbmljYXN0RnJhbWVzUmVjZWl2ZWRPSywgUnhVbmljYXN0RnJhbWVzT0spLAorCQlIV19TVEFUKFJ4TXVsdGljYXN0RnJhbWVzUmVjZWl2ZWRPSywgUnhNdWx0aWNhc3RGcmFtZXNPSyksCisJCUhXX1NUQVQoUnhCcm9hZGNhc3RGcmFtZXNSZWNlaXZlZE9LLCBSeEJyb2FkY2FzdEZyYW1lc09LKSwKKwkJSFdfU1RBVChSeFBBVVNFTUFDQ3RybEZyYW1lc1JlY2VpdmVkLCBSeFBhdXNlRnJhbWVzKSwKKwkJSFdfU1RBVChSeEZyYW1lQ2hlY2tTZXF1ZW5jZUVycm9ycywgUnhGQ1NFcnJvcnMpLAorCQlIV19TVEFUKFJ4RnJhbWVzTG9zdER1ZVRvSW50ZXJuYWxNQUNFcnJvcnMsCisJCQkJUnhJbnRlcm5hbE1BQ1JjdkVycm9yKSwKKwkJSFdfU1RBVChSeFN5bWJvbEVycm9ycywgUnhTeW1ib2xFcnJvcnMpLAorCQlIV19TVEFUKFJ4SW5SYW5nZUxlbmd0aEVycm9ycywgUnhJblJhbmdlTGVuZ3RoRXJyb3JzKSwKKwkJSFdfU1RBVChSeEZyYW1lc1Rvb0xvbmdFcnJvcnMgLCBSeEZyYW1lVG9vTG9uZ0Vycm9ycyksCisJCUhXX1NUQVQoUnhKYWJiZXJzLCBSeEphYmJlckVycm9ycyksCisJCUhXX1NUQVQoUnhGcmFnbWVudHMsIFJ4UnVudEVycm9ycyksCisJCUhXX1NUQVQoUnhVbmRlcnNpemVkRnJhbWVzLCBSeFJ1bnRFcnJvcnMpLAorCQlIV19TVEFUKFJ4SnVtYm9GcmFtZXNSZWNlaXZlZE9LLCBSeEp1bWJvRnJhbWVzT0spLAorCQlIV19TVEFUKFJ4SnVtYm9PY3RldHNSZWNlaXZlZE9LLCBSeEp1bWJvT2N0ZXRzT0spLAorCisJCS8qIFR4IHN0YXRzICovCisJCUhXX1NUQVQoVHhPY3RldHNUcmFuc21pdHRlZE9LLCBUeE9jdGV0c09LKSwKKwkJSFdfU1RBVChUeEZyYW1lc0xvc3REdWVUb0ludGVybmFsTUFDVHJhbnNtaXNzaW9uRXJyb3IsCisJCQkJVHhJbnRlcm5hbE1BQ1htaXRFcnJvciksCisJCUhXX1NUQVQoVHhUcmFuc21pdFN5c3RlbUVycm9yLCBUeEZDU0Vycm9ycyksCisJCUhXX1NUQVQoVHhVbmljYXN0RnJhbWVzVHJhbnNtaXR0ZWRPSywgVHhVbmljYXN0RnJhbWVzT0spLAorCQlIV19TVEFUKFR4TXVsdGljYXN0RnJhbWVzVHJhbnNtaXR0ZWRPSywgVHhNdWx0aWNhc3RGcmFtZXNPSyksCisJCUhXX1NUQVQoVHhCcm9hZGNhc3RGcmFtZXNUcmFuc21pdHRlZE9LLCBUeEJyb2FkY2FzdEZyYW1lc09LKSwKKwkJSFdfU1RBVChUeFBBVVNFTUFDQ3RybEZyYW1lc1RyYW5zbWl0dGVkLCBUeFBhdXNlRnJhbWVzKSwKKwkJSFdfU1RBVChUeEp1bWJvRnJhbWVzUmVjZWl2ZWRPSywgVHhKdW1ib0ZyYW1lc09LKSwKKwkJSFdfU1RBVChUeEp1bWJvT2N0ZXRzUmVjZWl2ZWRPSywgVHhKdW1ib09jdGV0c09LKQorCX0sICpwID0gaHdfc3RhdHM7CisJdTY0IHJvOworCXUzMiB2YWwwLCB2YWwxLCB2YWwyLCB2YWwzOworCXU2NCAqc3RhdHMgPSAodTY0ICopICZtYWMtPnN0YXRzOworCXVuc2lnbmVkIGludCBpOwogCiAJLyogU25hcCB0aGUgY291bnRlcnMgKi8KIAlwbXdyaXRlKG1hYywgU1VOSTF4MTBHRVhQX1JFR19NU1RBVF9DT05UUk9MLApAQCAtNDcwLDM1ICs1MDQsMTQgQEAKIAlybyA9ICgodTY0KXZhbDAgJiAweGZmZmYpIHwgKCgodTY0KXZhbDEgJiAweGZmZmYpIDw8IDE2KSB8CiAJCSgoKHU2NCl2YWwyICYgMHhmZmZmKSA8PCAzMikgfCAoKCh1NjQpdmFsMyAmIDB4ZmZmZikgPDwgNDgpOwogCi0JLyogUnggc3RhdHMgKi8KLQlSTU9OX1VQREFURShtYWMsIFJ4T2N0ZXRzUmVjZWl2ZWRPSywgUnhPY3RldHNPSyk7Ci0JUk1PTl9VUERBVEUobWFjLCBSeFVuaWNhc3RGcmFtZXNSZWNlaXZlZE9LLCBSeFVuaWNhc3RGcmFtZXNPSyk7Ci0JUk1PTl9VUERBVEUobWFjLCBSeE11bHRpY2FzdEZyYW1lc1JlY2VpdmVkT0ssIFJ4TXVsdGljYXN0RnJhbWVzT0spOwotCVJNT05fVVBEQVRFKG1hYywgUnhCcm9hZGNhc3RGcmFtZXNSZWNlaXZlZE9LLCBSeEJyb2FkY2FzdEZyYW1lc09LKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4UEFVU0VNQUNDdHJsRnJhbWVzUmVjZWl2ZWQsIFJ4UGF1c2VGcmFtZXMpOwotCVJNT05fVVBEQVRFKG1hYywgUnhGcmFtZUNoZWNrU2VxdWVuY2VFcnJvcnMsIFJ4RkNTRXJyb3JzKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4RnJhbWVzTG9zdER1ZVRvSW50ZXJuYWxNQUNFcnJvcnMsCi0JCQkJUnhJbnRlcm5hbE1BQ1JjdkVycm9yKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4U3ltYm9sRXJyb3JzLCBSeFN5bWJvbEVycm9ycyk7Ci0JUk1PTl9VUERBVEUobWFjLCBSeEluUmFuZ2VMZW5ndGhFcnJvcnMsIFJ4SW5SYW5nZUxlbmd0aEVycm9ycyk7Ci0JUk1PTl9VUERBVEUobWFjLCBSeEZyYW1lc1Rvb0xvbmdFcnJvcnMgLCBSeEZyYW1lVG9vTG9uZ0Vycm9ycyk7Ci0JUk1PTl9VUERBVEUobWFjLCBSeEphYmJlcnMsIFJ4SmFiYmVyRXJyb3JzKTsKLQlSTU9OX1VQREFURShtYWMsIFJ4RnJhZ21lbnRzLCBSeFJ1bnRFcnJvcnMpOwotCVJNT05fVVBEQVRFKG1hYywgUnhVbmRlcnNpemVkRnJhbWVzLCBSeFJ1bnRFcnJvcnMpOwotCVJNT05fVVBEQVRFKG1hYywgUnhKdW1ib0ZyYW1lc1JlY2VpdmVkT0ssIFJ4SnVtYm9GcmFtZXNPSyk7Ci0JUk1PTl9VUERBVEUobWFjLCBSeEp1bWJvT2N0ZXRzUmVjZWl2ZWRPSywgUnhKdW1ib09jdGV0c09LKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShod19zdGF0cyk7IGkrKykgeworCQl1bnNpZ25lZCByZWcgPSBwLT5yZWcgLSBTVU5JMXgxMEdFWFBfUkVHX01TVEFUX0NPVU5URVJfMF9MT1c7CiAKLQkvKiBUeCBzdGF0cyAqLwotCVJNT05fVVBEQVRFKG1hYywgVHhPY3RldHNUcmFuc21pdHRlZE9LLCBUeE9jdGV0c09LKTsKLQlSTU9OX1VQREFURShtYWMsIFR4RnJhbWVzTG9zdER1ZVRvSW50ZXJuYWxNQUNUcmFuc21pc3Npb25FcnJvciwKLQkJCQlUeEludGVybmFsTUFDWG1pdEVycm9yKTsKLQlSTU9OX1VQREFURShtYWMsIFR4VHJhbnNtaXRTeXN0ZW1FcnJvciwgVHhGQ1NFcnJvcnMpOwotCVJNT05fVVBEQVRFKG1hYywgVHhVbmljYXN0RnJhbWVzVHJhbnNtaXR0ZWRPSywgVHhVbmljYXN0RnJhbWVzT0spOwotCVJNT05fVVBEQVRFKG1hYywgVHhNdWx0aWNhc3RGcmFtZXNUcmFuc21pdHRlZE9LLCBUeE11bHRpY2FzdEZyYW1lc09LKTsKLQlSTU9OX1VQREFURShtYWMsIFR4QnJvYWRjYXN0RnJhbWVzVHJhbnNtaXR0ZWRPSywgVHhCcm9hZGNhc3RGcmFtZXNPSyk7Ci0JUk1PTl9VUERBVEUobWFjLCBUeFBBVVNFTUFDQ3RybEZyYW1lc1RyYW5zbWl0dGVkLCBUeFBhdXNlRnJhbWVzKTsKLQlSTU9OX1VQREFURShtYWMsIFR4SnVtYm9GcmFtZXNSZWNlaXZlZE9LLCBUeEp1bWJvRnJhbWVzT0spOwotCVJNT05fVVBEQVRFKG1hYywgVHhKdW1ib09jdGV0c1JlY2VpdmVkT0ssIFR4SnVtYm9PY3RldHNPSyk7CisJCXBtMzM5M19ybW9uX3VwZGF0ZSgobWFjKS0+YWRhcHRlciwgT0ZGU0VUKHAtPnJlZyksCisJCQkJICAgc3RhdHMgKyBwLT5vZmZzZXQsIHJvICYgKHJlZyA+PiAyKSk7CisJfQorCisKIAogCXJldHVybiAmbWFjLT5zdGF0czsKIH0KQEAgLTUzNCw5ICs1NDcsOSBAQAogCS8qIFN0b3JlIGxvY2FsIGNvcHkgKi8KIAltZW1jcHkoY21hYy0+aW5zdGFuY2UtPm1hY19hZGRyLCBtYSwgNik7CiAKLQlsbyA9ICgodTMyKSBtYVsxXSA8PCA4KSB8ICh1MzIpIG1hWzBdOworCWxvICA9ICgodTMyKSBtYVsxXSA8PCA4KSB8ICh1MzIpIG1hWzBdOwogCW1pZCA9ICgodTMyKSBtYVszXSA8PCA4KSB8ICh1MzIpIG1hWzJdOwotCWhpID0gKCh1MzIpIG1hWzVdIDw8IDgpIHwgKHUzMikgbWFbNF07CisJaGkgID0gKCh1MzIpIG1hWzVdIDw8IDgpIHwgKHUzMikgbWFbNF07CiAKIAkvKiBEaXNhYmxlIFJ4L1R4IE1BQyBiZWZvcmUgY29uZmlndXJpbmcgaXQuICovCiAJaWYgKGVuYWJsZWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYwppbmRleCA2NTljYjIyLi44OWE2ODI3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jCkBAIC03MSwxMiArNzEsOSBAQAogI2RlZmluZSBTR0VfRlJFRUxfUkVGSUxMX1RIUkVTSAkxNgogI2RlZmluZSBTR0VfUkVTUFFfRV9OCQkxMDI0CiAjZGVmaW5lIFNHRV9JTlRSVElNRVJfTlJFUwkxMDAwCi0jZGVmaW5lIFNHRV9SWF9DT1BZX1RIUkVTCTI1NgogI2RlZmluZSBTR0VfUlhfU01fQlVGX1NJWkUJMTUzNgogI2RlZmluZSBTR0VfVFhfREVTQ19NQVhfUExFTgkxNjM4NAogCi0jIGRlZmluZSBTR0VfUlhfRFJPUF9USFJFUyAyCi0KICNkZWZpbmUgU0dFX1JFU1BRX1JFUExFTklTSF9USFJFUyAoU0dFX1JFU1BRX0VfTiAvIDQpCiAKIC8qCkBAIC04NSwxMCArODIsNiBAQAogICovCiAjZGVmaW5lIFRYX1JFQ0xBSU1fUEVSSU9EIChIWiAvIDQpCiAKLSNpZm5kZWYgTkVUX0lQX0FMSUdOCi0jIGRlZmluZSBORVRfSVBfQUxJR04gMgotI2VuZGlmCi0KICNkZWZpbmUgTV9DTURfTEVOICAgICAgIDB4N2ZmZmZmZmYKICNkZWZpbmUgVl9DTURfTEVOKHYpICAgICh2KQogI2RlZmluZSBHX0NNRF9MRU4odikgICAgKCh2KSAmIE1fQ01EX0xFTikKQEAgLTE5NSw3ICsxODgsNyBAQAogCXN0cnVjdCBjbWRRX2UgICplbnRyaWVzOyAgICAgICAgLyogSFcgY29tbWFuZCBkZXNjcmlwdG9yIFEgKi8KIAlzdHJ1Y3QgY21kUV9jZSAqY2VudHJpZXM7ICAgICAgIC8qIFNXIGNvbW1hbmQgY29udGV4dCBkZXNjcmlwdG9yIFEgKi8KIAlkbWFfYWRkcl90CWRtYV9hZGRyOyAgICAgICAvKiBETUEgYWRkciBIVyBjb21tYW5kIGRlc2NyaXB0b3IgUSAqLwotIAlzcGlubG9ja190CWxvY2s7ICAgICAgICAgICAvKiBMb2NrIHRvIHByb3RlY3QgY21kUSBlbnF1ZXVpbmcgKi8KKwlzcGlubG9ja190CWxvY2s7ICAgICAgICAgICAvKiBMb2NrIHRvIHByb3RlY3QgY21kUSBlbnF1ZXVpbmcgKi8KIH07CiAKIHN0cnVjdCBmcmVlbFEgewpAQCAtMjQxLDkgKzIzNCw5IEBACiAvKiBQZXIgVDIwNCBkZXZpY2UgKi8KIHN0cnVjdCBzY2hlZCB7CiAJa3RpbWVfdCAgICAgICAgIGxhc3RfdXBkYXRlZDsgICAvKiBsYXN0IHRpbWUgcXVvdGFzIHdlcmUgY29tcHV0ZWQgKi8KLQl1bnNpZ25lZCBpbnQgCW1heF9hdmFpbDsJLyogbWF4IGJpdHMgdG8gYmUgc2VudCB0byBhbnkgcG9ydCAqLwotCXVuc2lnbmVkIGludCAJcG9ydDsJCS8qIHBvcnQgaW5kZXggKHJvdW5kIHJvYmluIHBvcnRzKSAqLwotCXVuc2lnbmVkIGludCAJbnVtOwkJLyogbnVtIHNrYnMgaW4gcGVyIHBvcnQgcXVldWVzICovCisJdW5zaWduZWQgaW50CW1heF9hdmFpbDsJLyogbWF4IGJpdHMgdG8gYmUgc2VudCB0byBhbnkgcG9ydCAqLworCXVuc2lnbmVkIGludAlwb3J0OwkJLyogcG9ydCBpbmRleCAocm91bmQgcm9iaW4gcG9ydHMpICovCisJdW5zaWduZWQgaW50CW51bTsJCS8qIG51bSBza2JzIGluIHBlciBwb3J0IHF1ZXVlcyAqLwogCXN0cnVjdCBzY2hlZF9wb3J0IHBbTUFYX05QT1JUU107CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHNjaGVkX3RzazsvKiB0YXNrbGV0IHVzZWQgdG8gcnVuIHNjaGVkdWxlciAqLwogfTsKQEAgLTI1OSwxMCArMjUyLDEwIEBACiAgKiBjb250ZW50aW9uLgogICovCiBzdHJ1Y3Qgc2dlIHsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsgCS8qIGFkYXB0ZXIgYmFja3BvaW50ZXIgKi8KKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsJLyogYWRhcHRlciBiYWNrcG9pbnRlciAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAgLyogbmV0ZGV2aWNlIGJhY2twb2ludGVyICovCi0Jc3RydWN0IGZyZWVsUSAJZnJlZWxRW1NHRV9GUkVFTFFfTl07IC8qIGJ1ZmZlciBmcmVlIGxpc3RzICovCi0Jc3RydWN0IHJlc3BRIAlyZXNwUTsJCS8qIHJlc3BvbnNlIFEgKi8KKwlzdHJ1Y3QgZnJlZWxRCWZyZWVsUVtTR0VfRlJFRUxRX05dOyAvKiBidWZmZXIgZnJlZSBsaXN0cyAqLworCXN0cnVjdCByZXNwUQlyZXNwUTsJCS8qIHJlc3BvbnNlIFEgKi8KIAl1bnNpZ25lZCBsb25nICAgc3RvcHBlZF90eF9xdWV1ZXM7IC8qIGJpdG1hcCBvZiBzdXNwZW5kZWQgVHggcXVldWVzICovCiAJdW5zaWduZWQgaW50CXJ4X3BrdF9wYWQ7ICAgICAvKiBSWCBwYWRkaW5nIGZvciBMMiBwYWNrZXRzICovCiAJdW5zaWduZWQgaW50CWp1bWJvX2ZsOyAgICAgICAvKiBqdW1ibyBmcmVlbGlzdCBRIGluZGV4ICovCkBAIC00NjAsNyArNDUzLDcgQEAKIAlpZiAoY3JlZGl0cyA8IE1BWF9TS0JfRlJBR1MgKyAxKQogCQlnb3RvIG91dDsKIAotIGFnYWluOgorYWdhaW46CiAJZm9yIChpID0gMDsgaSA8IE1BWF9OUE9SVFM7IGkrKykgewogCQlzLT5wb3J0ID0gKytzLT5wb3J0ICYgKE1BWF9OUE9SVFMgLSAxKTsKIAkJc2ticSA9ICZzLT5wW3MtPnBvcnRdLnNrYnE7CkBAIC00ODMsOCArNDc2LDggQEAKIAlpZiAodXBkYXRlLS0gJiYgc2NoZWRfdXBkYXRlX2F2YWlsKHNnZSkpCiAJCWdvdG8gYWdhaW47CiAKLSBvdXQ6Ci0gCS8qIElmIHRoZXJlIGFyZSBtb3JlIHBlbmRpbmcgc2ticywgd2UgdXNlIHRoZSBoYXJkd2FyZSB0byBzY2hlZHVsZSB1cworb3V0OgorCS8qIElmIHRoZXJlIGFyZSBtb3JlIHBlbmRpbmcgc2ticywgd2UgdXNlIHRoZSBoYXJkd2FyZSB0byBzY2hlZHVsZSB1cwogCSAqIGFnYWluLgogCSAqLwogCWlmIChzLT5udW0gJiYgIXNrYikgewpAQCAtNTc1LDExICs1NjgsMTAgQEAKIAkJcS0+c2l6ZSA9IHAtPmZyZWVsUV9zaXplW2ldOwogCQlxLT5kbWFfb2Zmc2V0ID0gc2dlLT5yeF9wa3RfcGFkID8gMCA6IE5FVF9JUF9BTElHTjsKIAkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnJlZWxRX2UpICogcS0+c2l6ZTsKLQkJcS0+ZW50cmllcyA9IChzdHJ1Y3QgZnJlZWxRX2UgKikKLQkJCSAgICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemUsICZxLT5kbWFfYWRkcik7CisJCXEtPmVudHJpZXMgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplLCAmcS0+ZG1hX2FkZHIpOwogCQlpZiAoIXEtPmVudHJpZXMpCiAJCQlnb3RvIGVycl9ub19tZW07Ci0JCW1lbXNldChxLT5lbnRyaWVzLCAwLCBzaXplKTsKKwogCQlzaXplID0gc2l6ZW9mKHN0cnVjdCBmcmVlbFFfY2UpICogcS0+c2l6ZTsKIAkJcS0+Y2VudHJpZXMgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIXEtPmNlbnRyaWVzKQpAQCAtNjEzLDExICs2MDUsMTAgQEAKIAlzZ2UtPnJlc3BRLnNpemUgPSBTR0VfUkVTUFFfRV9OOwogCXNnZS0+cmVzcFEuY3JlZGl0cyA9IDA7CiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVzcFFfZSkgKiBzZ2UtPnJlc3BRLnNpemU7Ci0Jc2dlLT5yZXNwUS5lbnRyaWVzID0gKHN0cnVjdCByZXNwUV9lICopCisJc2dlLT5yZXNwUS5lbnRyaWVzID0KIAkJcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZSwgJnNnZS0+cmVzcFEuZG1hX2FkZHIpOwogCWlmICghc2dlLT5yZXNwUS5lbnRyaWVzKQogCQlnb3RvIGVycl9ub19tZW07Ci0JbWVtc2V0KHNnZS0+cmVzcFEuZW50cmllcywgMCwgc2l6ZSk7CiAJcmV0dXJuIDA7CiAKIGVycl9ub19tZW06CkBAIC02MzcsMjAgKzYyOCwxMiBAQAogCXEtPmluX3VzZSAtPSBuOwogCWNlID0gJnEtPmNlbnRyaWVzW2NpZHhdOwogCXdoaWxlIChuLS0pIHsKLQkJaWYgKHEtPnNvcCkgewotCQkJaWYgKGxpa2VseShwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSkpIHsKLQkJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsCi0JCQkJCQkgcGNpX3VubWFwX2FkZHIoY2UsIGRtYV9hZGRyKSwKLQkJCSAJCQkgcGNpX3VubWFwX2xlbihjZSwgZG1hX2xlbiksCi0JCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCWlmIChsaWtlbHkocGNpX3VubWFwX2xlbihjZSwgZG1hX2xlbikpKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKHBkZXYsIHBjaV91bm1hcF9hZGRyKGNlLCBkbWFfYWRkciksCisJCQkJCSBwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSwKKwkJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJaWYgKHEtPnNvcCkKIAkJCQlxLT5zb3AgPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGxpa2VseShwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSkpIHsKLQkJCQlwY2lfdW5tYXBfcGFnZShwZGV2LCBwY2lfdW5tYXBfYWRkcihjZSwgZG1hX2FkZHIpLAotCQkJIAkJICAgICAgIHBjaV91bm1hcF9sZW4oY2UsIGRtYV9sZW4pLAotCQkJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JCQl9CiAJCX0KIAkJaWYgKGNlLT5za2IpIHsKIAkJCWRldl9rZnJlZV9za2JfYW55KGNlLT5za2IpOwpAQCAtNzExLDExICs2OTQsMTAgQEAKIAkJcS0+c3RvcF90aHJlcyA9IDA7CiAJCXNwaW5fbG9ja19pbml0KCZxLT5sb2NrKTsKIAkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY21kUV9lKSAqIHEtPnNpemU7Ci0JCXEtPmVudHJpZXMgPSAoc3RydWN0IGNtZFFfZSAqKQotCQkJICAgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZSwgJnEtPmRtYV9hZGRyKTsKKwkJcS0+ZW50cmllcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemUsICZxLT5kbWFfYWRkcik7CiAJCWlmICghcS0+ZW50cmllcykKIAkJCWdvdG8gZXJyX25vX21lbTsKLQkJbWVtc2V0KHEtPmVudHJpZXMsIDAsIHNpemUpOworCiAJCXNpemUgPSBzaXplb2Yoc3RydWN0IGNtZFFfY2UpICogcS0+c2l6ZTsKIAkJcS0+Y2VudHJpZXMgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIXEtPmNlbnRyaWVzKQpAQCAtNzcwLDcgKzc1Miw3IEBACiBzdGF0aWMgdm9pZCBjb25maWd1cmVfc2dlKHN0cnVjdCBzZ2UgKnNnZSwgc3RydWN0IHNnZV9wYXJhbXMgKnApCiB7CiAJc3RydWN0IGFkYXB0ZXIgKmFwID0gc2dlLT5hZGFwdGVyOwotCQorCiAJd3JpdGVsKDAsIGFwLT5yZWdzICsgQV9TR19DT05UUk9MKTsKIAlzZXR1cF9yaW5nX3BhcmFtcyhhcCwgc2dlLT5jbWRRWzBdLmRtYV9hZGRyLCBzZ2UtPmNtZFFbMF0uc2l6ZSwKIAkJCSAgQV9TR19DTUQwQkFTRUxXUiwgQV9TR19DTUQwQkFTRVVQUiwgQV9TR19DTUQwU0laRSk7CkBAIC04NTAsNyArODMyLDYgQEAKIAlzdHJ1Y3QgZnJlZWxRX2UgKmUgPSAmcS0+ZW50cmllc1txLT5waWR4XTsKIAl1bnNpZ25lZCBpbnQgZG1hX2xlbiA9IHEtPnJ4X2J1ZmZlcl9zaXplIC0gcS0+ZG1hX29mZnNldDsKIAotCiAJd2hpbGUgKHEtPmNyZWRpdHMgPCBxLT5zaXplKSB7CiAJCXN0cnVjdCBza19idWZmICpza2I7CiAJCWRtYV9hZGRyX3QgbWFwcGluZzsKQEAgLTg2Miw2ICs4NDMsOCBAQAogCQlza2JfcmVzZXJ2ZShza2IsIHEtPmRtYV9vZmZzZXQpOwogCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocGRldiwgc2tiLT5kYXRhLCBkbWFfbGVuLAogCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBzZ2UtPnJ4X3BrdF9wYWQpOworCiAJCWNlLT5za2IgPSBza2I7CiAJCXBjaV91bm1hcF9hZGRyX3NldChjZSwgZG1hX2FkZHIsIG1hcHBpbmcpOwogCQlwY2lfdW5tYXBfbGVuX3NldChjZSwgZG1hX2xlbiwgZG1hX2xlbik7CkBAIC04ODEsNyArODY0LDYgQEAKIAkJfQogCQlxLT5jcmVkaXRzKys7CiAJfQotCiB9CiAKIC8qCkBAIC0xMDQxLDYgKzEwMjMsMTAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgY29weWJyZWFrIF9fcmVhZF9tb3N0bHkgPSAyNTY7Cittb2R1bGVfcGFyYW0oY29weWJyZWFrLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjb3B5YnJlYWssICJSZWNlaXZlIGNvcHkgdGhyZXNob2xkIik7CisKIC8qKgogICoJZ2V0X3BhY2tldCAtIHJldHVybiB0aGUgbmV4dCBpbmdyZXNzIHBhY2tldCBidWZmZXIKICAqCUBwZGV2OiB0aGUgUENJIGRldmljZSB0aGF0IHJlY2VpdmVkIHRoZSBwYWNrZXQKQEAgLTEwNjAsNDUgKzEwNDYsNDIgQEAKICAqCWJlIGNvcGllZCBidXQgdGhlcmUgaXMgbm8gbWVtb3J5IGZvciB0aGUgY29weS4KICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqZ2V0X3BhY2tldChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJIHN0cnVjdCBmcmVlbFEgKmZsLCB1bnNpZ25lZCBpbnQgbGVuLAotCQkJCQkgaW50IGRtYV9wYWQsIGludCBza2JfcGFkLAotCQkJCQkgdW5zaWduZWQgaW50IGNvcHlfdGhyZXMsCi0JCQkJCSB1bnNpZ25lZCBpbnQgZHJvcF90aHJlcykKKwkJCQkJIHN0cnVjdCBmcmVlbFEgKmZsLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGZyZWVsUV9jZSAqY2UgPSAmZmwtPmNlbnRyaWVzW2ZsLT5jaWR4XTsKKwljb25zdCBzdHJ1Y3QgZnJlZWxRX2NlICpjZSA9ICZmbC0+Y2VudHJpZXNbZmwtPmNpZHhdOwogCi0JaWYgKGxlbiA8IGNvcHlfdGhyZXMpIHsKLQkJc2tiID0gYWxsb2Nfc2tiKGxlbiArIHNrYl9wYWQsIEdGUF9BVE9NSUMpOwotCQlpZiAobGlrZWx5KHNrYiAhPSBOVUxMKSkgewotCQkJc2tiX3Jlc2VydmUoc2tiLCBza2JfcGFkKTsKLQkJCXNrYl9wdXQoc2tiLCBsZW4pOwotCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHBkZXYsCi0JCQkJCSAgICBwY2lfdW5tYXBfYWRkcihjZSwgZG1hX2FkZHIpLAotIAkJCQkJICAgIHBjaV91bm1hcF9sZW4oY2UsIGRtYV9sZW4pLAotCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCW1lbWNweShza2ItPmRhdGEsIGNlLT5za2ItPmRhdGEgKyBkbWFfcGFkLCBsZW4pOwotCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBkZXYsCi0JCQkJCSAgICBwY2lfdW5tYXBfYWRkcihjZSwgZG1hX2FkZHIpLAotIAkJCQkJICAgIHBjaV91bm1hcF9sZW4oY2UsIGRtYV9sZW4pLAotCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJfSBlbHNlIGlmICghZHJvcF90aHJlcykKKwlpZiAobGVuIDwgY29weWJyZWFrKSB7CisJCXNrYiA9IGFsbG9jX3NrYihsZW4gKyAyLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpCiAJCQlnb3RvIHVzZV9vcmlnX2J1ZjsKIAorCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBhbGlnbiBJUCBoZWFkZXIgKi8KKwkJc2tiX3B1dChza2IsIGxlbik7CisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwZGV2LAorCQkJCQkgICAgcGNpX3VubWFwX2FkZHIoY2UsIGRtYV9hZGRyKSwKKwkJCQkJICAgIHBjaV91bm1hcF9sZW4oY2UsIGRtYV9sZW4pLAorCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJbWVtY3B5KHNrYi0+ZGF0YSwgY2UtPnNrYi0+ZGF0YSwgbGVuKTsKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBkZXYsCisJCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihjZSwgZG1hX2FkZHIpLAorCQkJCQkgICAgICAgcGNpX3VubWFwX2xlbihjZSwgZG1hX2xlbiksCisJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlyZWN5Y2xlX2ZsX2J1ZihmbCwgZmwtPmNpZHgpOwogCQlyZXR1cm4gc2tiOwogCX0KIAotCWlmIChmbC0+Y3JlZGl0cyA8IGRyb3BfdGhyZXMpIHsKK3VzZV9vcmlnX2J1ZjoKKwlpZiAoZmwtPmNyZWRpdHMgPCAyKSB7CiAJCXJlY3ljbGVfZmxfYnVmKGZsLCBmbC0+Y2lkeCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotdXNlX29yaWdfYnVmOgogCXBjaV91bm1hcF9zaW5nbGUocGRldiwgcGNpX3VubWFwX2FkZHIoY2UsIGRtYV9hZGRyKSwKIAkJCSBwY2lfdW5tYXBfbGVuKGNlLCBkbWFfbGVuKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAlza2IgPSBjZS0+c2tiOwotCXNrYl9yZXNlcnZlKHNrYiwgZG1hX3BhZCk7CisJcHJlZmV0Y2goc2tiLT5kYXRhKTsKKwogCXNrYl9wdXQoc2tiLCBsZW4pOwogCXJldHVybiBza2I7CiB9CkBAIC0xMTM3LDYgKzExMjAsNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY29tcHV0ZV9sYXJnZV9wYWdlX3R4X2Rlc2NzKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwogCWlmIChQQUdFX1NJWkUgPiBTR0VfVFhfREVTQ19NQVhfUExFTikgewogCQl1bnNpZ25lZCBpbnQgbmZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKIAkJdW5zaWduZWQgaW50IGksIGxlbiA9IHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbjsKQEAgLTEzNDMsNyArMTMyNyw3IEBACiAJd2hpbGUgKChza2IgPSBzY2hlZF9za2Ioc2dlLCBOVUxMLCBjcmVkaXRzKSkgIT0gTlVMTCkgewogCQl1bnNpZ25lZCBpbnQgZ2VuYml0LCBwaWR4LCBjb3VudDsKIAkgICAgICAgIGNvdW50ID0gMSArIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7Ci0gICAgICAgCQljb3VudCArPSBjb21wdXRlX2xhcmdlX3BhZ2VfdHhfZGVzY3Moc2tiKTsKKwkJY291bnQgKz0gY29tcHV0ZV9sYXJnZV9wYWdlX3R4X2Rlc2NzKHNrYik7CiAJCXEtPmluX3VzZSArPSBjb3VudDsKIAkJZ2VuYml0ID0gcS0+Z2VuYml0OwogCQlwaWR4ID0gcS0+cGlkeDsKQEAgLTEzNzUsMjcgKzEzNTksMjUgQEAKICAqCiAgKglQcm9jZXNzIGFuIGluZ3Jlc3MgZXRoZXJuZXQgcGFrY2V0IGFuZCBkZWxpdmVyIGl0IHRvIHRoZSBzdGFjay4KICAqLwotc3RhdGljIGludCBzZ2Vfcngoc3RydWN0IHNnZSAqc2dlLCBzdHJ1Y3QgZnJlZWxRICpmbCwgdW5zaWduZWQgaW50IGxlbikKK3N0YXRpYyB2b2lkIHNnZV9yeChzdHJ1Y3Qgc2dlICpzZ2UsIHN0cnVjdCBmcmVlbFEgKmZsLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGNwbF9yeF9wa3QgKnA7CisJY29uc3Qgc3RydWN0IGNwbF9yeF9wa3QgKnA7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBzZ2UtPmFkYXB0ZXI7CiAJc3RydWN0IHNnZV9wb3J0X3N0YXRzICpzdDsKIAotCXNrYiA9IGdldF9wYWNrZXQoYWRhcHRlci0+cGRldiwgZmwsIGxlbiAtIHNnZS0+cnhfcGt0X3BhZCwKLQkJCSBzZ2UtPnJ4X3BrdF9wYWQsIDIsIFNHRV9SWF9DT1BZX1RIUkVTLAotCQkJIFNHRV9SWF9EUk9QX1RIUkVTKTsKKwlza2IgPSBnZXRfcGFja2V0KGFkYXB0ZXItPnBkZXYsIGZsLCBsZW4gLSBzZ2UtPnJ4X3BrdF9wYWQpOwogCWlmICh1bmxpa2VseSghc2tiKSkgewogCQlzZ2UtPnN0YXRzLnJ4X2Ryb3BzKys7Ci0JCXJldHVybiAwOworCQlyZXR1cm47CiAJfQogCi0JcCA9IChzdHJ1Y3QgY3BsX3J4X3BrdCAqKXNrYi0+ZGF0YTsKLQlza2JfcHVsbChza2IsIHNpemVvZigqcCkpOworCXAgPSAoY29uc3Qgc3RydWN0IGNwbF9yeF9wa3QgKikgc2tiLT5kYXRhOwogCWlmIChwLT5pZmYgPj0gYWRhcHRlci0+cGFyYW1zLm5wb3J0cykgewogCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAl9CisJX19za2JfcHVsbChza2IsIHNpemVvZigqcCkpOwogCiAJc2tiLT5kZXYgPSBhZGFwdGVyLT5wb3J0W3AtPmlmZl0uZGV2OwogCXNrYi0+ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKQEAgLTE0MjcsNyArMTQwOSw2IEBACiAJCW5ldGlmX3J4KHNrYik7CiAjZW5kaWYKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNDQ4LDI5ICsxNDI5LDI4IEBACiBzdGF0aWMgdm9pZCByZXN0YXJ0X3R4X3F1ZXVlcyhzdHJ1Y3Qgc2dlICpzZ2UpCiB7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBzZ2UtPmFkYXB0ZXI7CisJaW50IGk7CiAKLQlpZiAoZW5vdWdoX2ZyZWVfVHhfZGVzY3MoJnNnZS0+Y21kUVswXSkpIHsKLQkJaW50IGk7CisJaWYgKCFlbm91Z2hfZnJlZV9UeF9kZXNjcygmc2dlLT5jbWRRWzBdKSkKKwkJcmV0dXJuOwogCi0JCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgewotCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5kID0gYWRhcC0+cG9ydFtpXS5kZXY7CisJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpuZCA9IGFkYXAtPnBvcnRbaV0uZGV2OwogCi0JCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KG5kLT5pZl9wb3J0LAotCQkJCQkgICAgICAgJnNnZS0+c3RvcHBlZF90eF9xdWV1ZXMpICYmCi0JCQkgICAgbmV0aWZfcnVubmluZyhuZCkpIHsKLQkJCQlzZ2UtPnN0YXRzLmNtZFFfcmVzdGFydGVkWzJdKys7Ci0JCQkJbmV0aWZfd2FrZV9xdWV1ZShuZCk7Ci0JCQl9CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQobmQtPmlmX3BvcnQsICZzZ2UtPnN0b3BwZWRfdHhfcXVldWVzKSAmJgorCQkgICAgbmV0aWZfcnVubmluZyhuZCkpIHsKKwkJCXNnZS0+c3RhdHMuY21kUV9yZXN0YXJ0ZWRbMl0rKzsKKwkJCW5ldGlmX3dha2VfcXVldWUobmQpOwogCQl9CiAJfQogfQogCiAvKgotICogdXBkYXRlX3R4X2luZm8gaXMgY2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyL05BUEkgdG8gcmV0dXJuIGNtZFEwIAorICogdXBkYXRlX3R4X2luZm8gaXMgY2FsbGVkIGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyL05BUEkgdG8gcmV0dXJuIGNtZFEwCiAgKiBpbmZvcm1hdGlvbi4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCB1cGRhdGVfdHhfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgCi0JCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzLCAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXBkYXRlX3R4X2luZm8oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzLAogCQkJCQkgIHVuc2lnbmVkIGludCBwcjApCiB7CiAJc3RydWN0IHNnZSAqc2dlID0gYWRhcHRlci0+c2dlOwpAQCAtMTUxMCwyOSArMTQ5MCwzMCBAQAogCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKIAlzdHJ1Y3QgcmVzcFEgKnEgPSAmc2dlLT5yZXNwUTsKIAlzdHJ1Y3QgcmVzcFFfZSAqZSA9ICZxLT5lbnRyaWVzW3EtPmNpZHhdOwotCWludCBidWRnZXRfbGVmdCA9IGJ1ZGdldDsKKwlpbnQgZG9uZSA9IDA7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKIAl1bnNpZ25lZCBpbnQgY21kcV9wcm9jZXNzZWRbU0dFX0NNRFFfTl0gPSB7MCwgMH07Ci0JCiAKLQl3aGlsZSAobGlrZWx5KGJ1ZGdldF9sZWZ0ICYmIGUtPkdlbmVyYXRpb25CaXQgPT0gcS0+Z2VuYml0KSkgeworCXdoaWxlIChkb25lIDwgYnVkZ2V0ICYmIGUtPkdlbmVyYXRpb25CaXQgPT0gcS0+Z2VuYml0KSB7CiAJCWZsYWdzIHw9IGUtPlFzbGVlcGluZzsKLQkJCisKIAkJY21kcV9wcm9jZXNzZWRbMF0gKz0gZS0+Q21kcTBDcmVkaXRSZXR1cm47CiAJCWNtZHFfcHJvY2Vzc2VkWzFdICs9IGUtPkNtZHExQ3JlZGl0UmV0dXJuOwotCQkKKwogCQkvKiBXZSBiYXRjaCB1cGRhdGVzIHRvIHRoZSBUWCBzaWRlIHRvIGF2b2lkIGNhY2hlbGluZQogCQkgKiBwaW5nLXBvbmcgb2YgVFggc3RhdGUgaW5mb3JtYXRpb24gb24gTVAgd2hlcmUgdGhlIHNlbmRlcgogCQkgKiBtaWdodCBydW4gb24gYSBkaWZmZXJlbnQgQ1BVIHRoYW4gdGhpcyBmdW5jdGlvbi4uLgogCQkgKi8KLQkJaWYgKHVubGlrZWx5KGZsYWdzICYgRl9DTURRMF9FTkFCTEUgfHwgY21kcV9wcm9jZXNzZWRbMF0gPiA2NCkpIHsKKwkJaWYgKHVubGlrZWx5KChmbGFncyAmIEZfQ01EUTBfRU5BQkxFKSB8fCBjbWRxX3Byb2Nlc3NlZFswXSA+IDY0KSkgewogCQkJZmxhZ3MgPSB1cGRhdGVfdHhfaW5mbyhhZGFwdGVyLCBmbGFncywgY21kcV9wcm9jZXNzZWRbMF0pOwogCQkJY21kcV9wcm9jZXNzZWRbMF0gPSAwOwogCQl9CisKIAkJaWYgKHVubGlrZWx5KGNtZHFfcHJvY2Vzc2VkWzFdID4gMTYpKSB7CiAJCQlzZ2UtPmNtZFFbMV0ucHJvY2Vzc2VkICs9IGNtZHFfcHJvY2Vzc2VkWzFdOwogCQkJY21kcV9wcm9jZXNzZWRbMV0gPSAwOwogCQl9CisKIAkJaWYgKGxpa2VseShlLT5EYXRhVmFsaWQpKSB7CiAJCQlzdHJ1Y3QgZnJlZWxRICpmbCA9ICZzZ2UtPmZyZWVsUVtlLT5GcmVlbGlzdFFpZF07CiAKQEAgLTE1NDIsMTIgKzE1MjMsMTYgQEAKIAkJCWVsc2UKIAkJCQlzZ2Vfcngoc2dlLCBmbCwgZS0+QnVmZmVyTGVuZ3RoKTsKIAorCQkJKytkb25lOworCiAJCQkvKgogCQkJICogTm90ZTogdGhpcyBkZXBlbmRzIG9uIGVhY2ggcGFja2V0IGNvbnN1bWluZyBhCiAJCQkgKiBzaW5nbGUgZnJlZS1saXN0IGJ1ZmZlcjsgY2YuIHRoZSBCVUcgYWJvdmUuCiAJCQkgKi8KIAkJCWlmICgrK2ZsLT5jaWR4ID09IGZsLT5zaXplKQogCQkJCWZsLT5jaWR4ID0gMDsKKwkJCXByZWZldGNoKGZsLT5jZW50cmllc1tmbC0+Y2lkeF0uc2tiKTsKKwogCQkJaWYgKHVubGlrZWx5KC0tZmwtPmNyZWRpdHMgPAogCQkJCSAgICAgZmwtPnNpemUgLSBTR0VfRlJFRUxfUkVGSUxMX1RIUkVTSCkpCiAJCQkJcmVmaWxsX2ZyZWVfbGlzdChzZ2UsIGZsKTsKQEAgLTE1NjYsMTQgKzE1NTEsMjAgQEAKIAkJCXdyaXRlbChxLT5jcmVkaXRzLCBhZGFwdGVyLT5yZWdzICsgQV9TR19SU1BRVUVVRUNSRURJVCk7CiAJCQlxLT5jcmVkaXRzID0gMDsKIAkJfQotCQktLWJ1ZGdldF9sZWZ0OwogCX0KIAotCWZsYWdzID0gdXBkYXRlX3R4X2luZm8oYWRhcHRlciwgZmxhZ3MsIGNtZHFfcHJvY2Vzc2VkWzBdKTsgCisJZmxhZ3MgPSB1cGRhdGVfdHhfaW5mbyhhZGFwdGVyLCBmbGFncywgY21kcV9wcm9jZXNzZWRbMF0pOwogCXNnZS0+Y21kUVsxXS5wcm9jZXNzZWQgKz0gY21kcV9wcm9jZXNzZWRbMV07CiAKLQlidWRnZXQgLT0gYnVkZ2V0X2xlZnQ7Ci0JcmV0dXJuIGJ1ZGdldDsKKwlyZXR1cm4gZG9uZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVzcG9uc2VzX3BlbmRpbmcoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJY29uc3Qgc3RydWN0IHJlc3BRICpRID0gJmFkYXB0ZXItPnNnZS0+cmVzcFE7CisJY29uc3Qgc3RydWN0IHJlc3BRX2UgKmUgPSAmUS0+ZW50cmllc1tRLT5jaWR4XTsKKworCXJldHVybiAoZS0+R2VuZXJhdGlvbkJpdCA9PSBRLT5nZW5iaXQpOwogfQogCiAjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfTkFQSQpAQCAtMTU4NSwxOSArMTU3NiwyNSBAQAogICogd2hpY2ggdGhlIGNhbGxlciBtdXN0IGVuc3VyZSBpcyBhIHZhbGlkIHB1cmUgcmVzcG9uc2UuICBSZXR1cm5zIDEgaWYgaXQKICAqIGVuY291bnRlcnMgYSB2YWxpZCBkYXRhLWNhcnJ5aW5nIHJlc3BvbnNlLCAwIG90aGVyd2lzZS4KICAqLwotc3RhdGljIGludCBwcm9jZXNzX3B1cmVfcmVzcG9uc2VzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgcmVzcFFfZSAqZSkKK3N0YXRpYyBpbnQgcHJvY2Vzc19wdXJlX3Jlc3BvbnNlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3Qgc2dlICpzZ2UgPSBhZGFwdGVyLT5zZ2U7CiAJc3RydWN0IHJlc3BRICpxID0gJnNnZS0+cmVzcFE7CisJc3RydWN0IHJlc3BRX2UgKmUgPSAmcS0+ZW50cmllc1txLT5jaWR4XTsKKwljb25zdCBzdHJ1Y3QgZnJlZWxRICpmbCA9ICZzZ2UtPmZyZWVsUVtlLT5GcmVlbGlzdFFpZF07CiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKIAl1bnNpZ25lZCBpbnQgY21kcV9wcm9jZXNzZWRbU0dFX0NNRFFfTl0gPSB7MCwgMH07CiAKKwlwcmVmZXRjaChmbC0+Y2VudHJpZXNbZmwtPmNpZHhdLnNrYik7CisJaWYgKGUtPkRhdGFWYWxpZCkKKwkJcmV0dXJuIDE7CisKIAlkbyB7CiAJCWZsYWdzIHw9IGUtPlFzbGVlcGluZzsKIAogCQljbWRxX3Byb2Nlc3NlZFswXSArPSBlLT5DbWRxMENyZWRpdFJldHVybjsKIAkJY21kcV9wcm9jZXNzZWRbMV0gKz0gZS0+Q21kcTFDcmVkaXRSZXR1cm47Ci0JCQorCiAJCWUrKzsKIAkJaWYgKHVubGlrZWx5KCsrcS0+Y2lkeCA9PSBxLT5zaXplKSkgewogCQkJcS0+Y2lkeCA9IDA7CkBAIC0xNjEzLDcgKzE2MTAsNyBAQAogCQlzZ2UtPnN0YXRzLnB1cmVfcnNwcysrOwogCX0gd2hpbGUgKGUtPkdlbmVyYXRpb25CaXQgPT0gcS0+Z2VuYml0ICYmICFlLT5EYXRhVmFsaWQpOwogCi0JZmxhZ3MgPSB1cGRhdGVfdHhfaW5mbyhhZGFwdGVyLCBmbGFncywgY21kcV9wcm9jZXNzZWRbMF0pOyAKKwlmbGFncyA9IHVwZGF0ZV90eF9pbmZvKGFkYXB0ZXIsIGZsYWdzLCBjbWRxX3Byb2Nlc3NlZFswXSk7CiAJc2dlLT5jbWRRWzFdLnByb2Nlc3NlZCArPSBjbWRxX3Byb2Nlc3NlZFsxXTsKIAogCXJldHVybiBlLT5HZW5lcmF0aW9uQml0ID09IHEtPmdlbmJpdDsKQEAgLTE2MjcsMjMgKzE2MjQsMjAgQEAKIGludCB0MV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OwotCWludCBlZmZlY3RpdmVfYnVkZ2V0ID0gbWluKCpidWRnZXQsIGRldi0+cXVvdGEpOwotCWludCB3b3JrX2RvbmUgPSBwcm9jZXNzX3Jlc3BvbnNlcyhhZGFwdGVyLCBlZmZlY3RpdmVfYnVkZ2V0KTsKKwlpbnQgd29ya19kb25lOwogCisJd29ya19kb25lID0gcHJvY2Vzc19yZXNwb25zZXMoYWRhcHRlciwgbWluKCpidWRnZXQsIGRldi0+cXVvdGEpKTsKIAkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKIAlkZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKIAotCWlmICh3b3JrX2RvbmUgPj0gZWZmZWN0aXZlX2J1ZGdldCkKKwlpZiAodW5saWtlbHkocmVzcG9uc2VzX3BlbmRpbmcoYWRhcHRlcikpKQogCQlyZXR1cm4gMTsKIAotIAlzcGluX2xvY2tfaXJxKCZhZGFwdGVyLT5hc3luY19sb2NrKTsKLQlfX25ldGlmX3J4X2NvbXBsZXRlKGRldik7CisJbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKIAl3cml0ZWwoYWRhcHRlci0+c2dlLT5yZXNwUS5jaWR4LCBhZGFwdGVyLT5yZWdzICsgQV9TR19TTEVFUElORyk7Ci0Jd3JpdGVsKGFkYXB0ZXItPnNsb3dfaW50cl9tYXNrIHwgRl9QTF9JTlRSX1NHRV9EQVRBLAotCSAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOwotIAlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPmFzeW5jX2xvY2spOwogCiAJcmV0dXJuIDA7CisKIH0KIAogLyoKQEAgLTE2NTIsNDQgKzE2NDYsMzMgQEAKIGlycXJldHVybl90IHQxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGF0YTsKLSAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXB0ZXItPnNnZS0+bmV0ZGV2OwogCXN0cnVjdCBzZ2UgKnNnZSA9IGFkYXB0ZXItPnNnZTsKLSAJdTMyIGNhdXNlOwotCWludCBoYW5kbGVkID0gMDsKKwlpbnQgaGFuZGxlZDsKIAotCWNhdXNlID0gcmVhZGwoYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOwotCWlmIChjYXVzZSA9PSAwIHx8IGNhdXNlID09IH4wKQotCQlyZXR1cm4gSVJRX05PTkU7CisJaWYgKGxpa2VseShyZXNwb25zZXNfcGVuZGluZyhhZGFwdGVyKSkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNnZS0+bmV0ZGV2OworCisJCXdyaXRlbChGX1BMX0lOVFJfU0dFX0RBVEEsIGFkYXB0ZXItPnJlZ3MgKyBBX1BMX0NBVVNFKTsKKworCQlpZiAoX19uZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKKwkJCWlmIChwcm9jZXNzX3B1cmVfcmVzcG9uc2VzKGFkYXB0ZXIpKQorCQkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwkJCWVsc2UgeworCQkJCS8qIG5vIGRhdGEsIG5vIE5BUEkgbmVlZGVkICovCisJCQkJd3JpdGVsKHNnZS0+cmVzcFEuY2lkeCwgYWRhcHRlci0+cmVncyArIEFfU0dfU0xFRVBJTkcpOworCQkJCW5ldGlmX3BvbGxfZW5hYmxlKGRldik7CS8qIHVuZG8gc2NoZWR1bGVfcHJlcCAqLworCQkJfQorCQl9CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CiAKIAlzcGluX2xvY2soJmFkYXB0ZXItPmFzeW5jX2xvY2spOwotIAlpZiAoY2F1c2UgJiBGX1BMX0lOVFJfU0dFX0RBVEEpIHsKLQkJc3RydWN0IHJlc3BRICpxID0gJmFkYXB0ZXItPnNnZS0+cmVzcFE7Ci0JCXN0cnVjdCByZXNwUV9lICplID0gJnEtPmVudHJpZXNbcS0+Y2lkeF07Ci0KLSAJCWhhbmRsZWQgPSAxOwotIAkJd3JpdGVsKEZfUExfSU5UUl9TR0VfREFUQSwgYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOwotCi0JCWlmIChlLT5HZW5lcmF0aW9uQml0ID09IHEtPmdlbmJpdCAmJgotCQkgICAgX19uZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpIHsKLQkJCWlmIChlLT5EYXRhVmFsaWQgfHwgcHJvY2Vzc19wdXJlX3Jlc3BvbnNlcyhhZGFwdGVyLCBlKSkgewotCQkJCS8qIG1hc2sgb2ZmIGRhdGEgSVJRICovCi0JCQkJd3JpdGVsKGFkYXB0ZXItPnNsb3dfaW50cl9tYXNrLAotCQkJCSAgICAgICBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOwotCQkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoc2dlLT5uZXRkZXYpOwotCQkJCWdvdG8gdW5sb2NrOwotCQkJfQotCQkJLyogbm8gZGF0YSwgbm8gTkFQSSBuZWVkZWQgKi8KLQkJCW5ldGlmX3BvbGxfZW5hYmxlKGRldik7Ci0KLQkJfQotCQl3cml0ZWwocS0+Y2lkeCwgYWRhcHRlci0+cmVncyArIEFfU0dfU0xFRVBJTkcpOwotCX0gZWxzZQotCQloYW5kbGVkID0gdDFfc2xvd19pbnRyX2hhbmRsZXIoYWRhcHRlcik7CisJaGFuZGxlZCA9IHQxX3Nsb3dfaW50cl9oYW5kbGVyKGFkYXB0ZXIpOworCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5hc3luY19sb2NrKTsKIAogCWlmICghaGFuZGxlZCkKIAkJc2dlLT5zdGF0cy51bmhhbmRsZWRfaXJxcysrOwotdW5sb2NrOgotCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5hc3luY19sb2NrKTsKKwogCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQgIT0gMCk7CiB9CiAKQEAgLTE3MTIsMTcgKzE2OTUsMTMgQEAKIGlycXJldHVybl90IHQxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpjb29raWUpCiB7CiAJaW50IHdvcmtfZG9uZTsKLQlzdHJ1Y3QgcmVzcFFfZSAqZTsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGNvb2tpZTsKLQlzdHJ1Y3QgcmVzcFEgKlEgPSAmYWRhcHRlci0+c2dlLT5yZXNwUTsKIAogCXNwaW5fbG9jaygmYWRhcHRlci0+YXN5bmNfbG9jayk7Ci0JZSA9ICZRLT5lbnRyaWVzW1EtPmNpZHhdOwotCXByZWZldGNoKGUpOwogCiAJd3JpdGVsKEZfUExfSU5UUl9TR0VfREFUQSwgYWRhcHRlci0+cmVncyArIEFfUExfQ0FVU0UpOwogCi0JaWYgKGxpa2VseShlLT5HZW5lcmF0aW9uQml0ID09IFEtPmdlbmJpdCkpCisJaWYgKGxpa2VseShyZXNwb25zZXNfcGVuZGluZyhhZGFwdGVyKSkpCiAJCXdvcmtfZG9uZSA9IHByb2Nlc3NfcmVzcG9uc2VzKGFkYXB0ZXIsIC0xKTsKIAllbHNlCiAJCXdvcmtfZG9uZSA9IHQxX3Nsb3dfaW50cl9oYW5kbGVyKGFkYXB0ZXIpOwpAQCAtMTc5Niw3ICsxNzc1LDcgQEAKIAkgKiB0aHJvdWdoIHRoZSBzY2hlZHVsZXIuCiAJICovCiAJaWYgKHNnZS0+dHhfc2NoZWQgJiYgIXFpZCAmJiBza2ItPmRldikgewotCXVzZV9zY2hlZDoKK3VzZV9zY2hlZDoKIAkJdXNlX3NjaGVkX3NrYiA9IDE7CiAJCS8qIE5vdGUgdGhhdCB0aGUgc2NoZWR1bGVyIG1pZ2h0IHJldHVybiBhIGRpZmZlcmVudCBza2IgdGhhbgogCQkgKiB0aGUgb25lIHBhc3NlZCBpbi4KQEAgLTE5MDAsNyArMTg3OSw3IEBACiAJCWNwbCA9IChzdHJ1Y3QgY3BsX3R4X3BrdCAqKWhkcjsKIAl9IGVsc2UgewogCQkvKgotCSAJICogUGFja2V0cyBzaG9ydGVyIHRoYW4gRVRIX0hMRU4gY2FuIGJyZWFrIHRoZSBNQUMsIGRyb3AgdGhlbQorCQkgKiBQYWNrZXRzIHNob3J0ZXIgdGhhbiBFVEhfSExFTiBjYW4gYnJlYWsgdGhlIE1BQywgZHJvcCB0aGVtCiAJCSAqIGVhcmx5LiAgQWxzbywgd2UgbWF5IGdldCBvdmVyc2l6ZWQgcGFja2V0cyBiZWNhdXNlIHNvbWUKIAkJICogcGFydHMgb2YgdGhlIGtlcm5lbCBkb24ndCBoYW5kbGUgb3VyIHVudXN1YWwgaGFyZF9oZWFkZXJfbGVuCiAJCSAqIHJpZ2h0LCBkcm9wIHRob3NlIHRvby4KQEAgLTE5ODQsOSArMTk2Myw5IEBACiAJICogdGhlbiBzaWxlbnRseSBkaXNjYXJkIHRvIGF2b2lkIGxlYWsuCiAJICovCiAJaWYgKHVubGlrZWx5KHJldCAhPSBORVRERVZfVFhfT0sgJiYgc2tiICE9IG9yaWdfc2tiKSkgewotIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJcmV0ID0gTkVUREVWX1RYX09LOwotIAl9CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIwOTksMzEgKzIwNzgsMzUgQEAKIAogCWlmIChhZGFwdGVyLT5vcGVuX2RldmljZV9tYXAgJiBQT1JUX01BU0spIHsKIAkJaW50IGk7Ci0JCWlmICh0MV9lc3BpX2dldF9tb25fdDIwNChhZGFwdGVyLCAmKHNlb3BbMF0pLCAwKSA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbnBvcnRzOyBpKyspIHsKLQkgICAgICAgIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2dlLT5lc3BpYnVnX3NrYltpXTsKLQkJCWlmICggKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+cG9ydFtpXS5kZXYpKSAmJgotCQkJICAgICAhKG5ldGlmX3F1ZXVlX3N0b3BwZWQoYWRhcHRlci0+cG9ydFtpXS5kZXYpKSAmJgotCQkJICAgICAoc2VvcFtpXSAmJiAoKHNlb3BbaV0gJiAweGZmZikgPT0gMCkpICYmCi0JCQkgICAgIHNrYiApIHsKLQkgICAgICAgICAgICAgICAgCWlmICghc2tiLT5jYlswXSkgewotCSAgICAgICAgICAgICAgICAgICAgICAgIAl1OCBjaF9tYWNfYWRkcltFVEhfQUxFTl0gPQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJezB4MCwgMHg3LCAweDQzLCAweDAsIDB4MCwgMHgwfTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAJbWVtY3B5KHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAljaF9tYWNfYWRkciwgRVRIX0FMRU4pOwotCSAgICAgICAgICAgICAgICAgICAgICAgIAltZW1jcHkoc2tiLT5kYXRhICsgc2tiLT5sZW4gLSAxMCwKLQkJCQkJCWNoX21hY19hZGRyLCBFVEhfQUxFTik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgCXNrYi0+Y2JbMF0gPSAweGZmOwotCSAgICAgICAgICAgICAgICAJfQogCi0JICAgICAgICAgICAgICAgIAkvKiBidW1wIHRoZSByZWZlcmVuY2UgY291bnQgdG8gYXZvaWQgZnJlZWluZyBvZgotCSAgICAgICAgICAgICAgICAgCSAqIHRoZSBza2Igb25jZSB0aGUgRE1BIGhhcyBjb21wbGV0ZWQuCi0JICAgICAgICAgICAgICAgICAJICovCi0JICAgICAgICAgICAgICAgIAlza2IgPSBza2JfZ2V0KHNrYik7Ci0JICAgICAgICAgICAgICAgIAl0MV9zZ2VfdHgoc2tiLCBhZGFwdGVyLCAwLCBhZGFwdGVyLT5wb3J0W2ldLmRldik7CisJCWlmICh0MV9lc3BpX2dldF9tb25fdDIwNChhZGFwdGVyLCAmKHNlb3BbMF0pLCAwKSA8IDApCisJCQlyZXR1cm47CisKKwkJZm9yIChpID0gMDsgaSA8IG5wb3J0czsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2dlLT5lc3BpYnVnX3NrYltpXTsKKworCQkJaWYgKCFuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPnBvcnRbaV0uZGV2KSB8fAorCQkJICAgIG5ldGlmX3F1ZXVlX3N0b3BwZWQoYWRhcHRlci0+cG9ydFtpXS5kZXYpIHx8CisJCQkgICAgIXNlb3BbaV0gfHwgKChzZW9wW2ldICYgMHhmZmYpICE9IDApIHx8ICFza2IpCisJCQkJY29udGludWU7CisKKwkJCWlmICghc2tiLT5jYlswXSkgeworCQkJCXU4IGNoX21hY19hZGRyW0VUSF9BTEVOXSA9IHsKKwkJCQkJMHgwLCAweDcsIDB4NDMsIDB4MCwgMHgwLCAweDAKKwkJCQl9OworCisJCQkJbWVtY3B5KHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCksCisJCQkJCWNoX21hY19hZGRyLCBFVEhfQUxFTik7CisJCQkJbWVtY3B5KHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gMTAsCisJCQkJCWNoX21hY19hZGRyLCBFVEhfQUxFTik7CisJCQkJc2tiLT5jYlswXSA9IDB4ZmY7CiAJCQl9CisKKwkJCS8qIGJ1bXAgdGhlIHJlZmVyZW5jZSBjb3VudCB0byBhdm9pZCBmcmVlaW5nIG9mCisJCQkgKiB0aGUgc2tiIG9uY2UgdGhlIERNQSBoYXMgY29tcGxldGVkLgorCQkJICovCisJCQlza2IgPSBza2JfZ2V0KHNrYik7CisJCQl0MV9zZ2VfdHgoc2tiLCBhZGFwdGVyLCAwLCBhZGFwdGVyLT5wb3J0W2ldLmRldik7CiAJCX0KIAl9CiAJbW9kX3RpbWVyKCZzZ2UtPmVzcGlidWdfdGltZXIsIGppZmZpZXMgKyBzZ2UtPmVzcGlidWdfdGltZW91dCk7CkBAIC0yMTkyLDkgKzIxNzUsOCBAQAogCQlpZiAoYWRhcHRlci0+cGFyYW1zLm5wb3J0cyA+IDEpIHsKIAkJCXR4X3NjaGVkX2luaXQoc2dlKTsKIAkJCXNnZS0+ZXNwaWJ1Z190aW1lci5mdW5jdGlvbiA9IGVzcGlidWdfd29ya2Fyb3VuZF90MjA0OwotCQl9IGVsc2UgeworCQl9IGVsc2UKIAkJCXNnZS0+ZXNwaWJ1Z190aW1lci5mdW5jdGlvbiA9IGVzcGlidWdfd29ya2Fyb3VuZDsKLQkJfQogCQlzZ2UtPmVzcGlidWdfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXNnZS0+YWRhcHRlcjsKIAogCQlzZ2UtPmVzcGlidWdfdGltZW91dCA9IDE7CkBAIC0yMjAyLDcgKzIxODQsNyBAQAogCQlpZiAoYWRhcHRlci0+cGFyYW1zLm5wb3J0cyA+IDEpCiAJCQlzZ2UtPmVzcGlidWdfdGltZW91dCA9IEhaLzEwMDsKIAl9Ci0JIAorCiAKIAlwLT5jbWRRX3NpemVbMF0gPSBTR0VfQ01EUTBfRV9OOwogCXAtPmNtZFFfc2l6ZVsxXSA9IFNHRV9DTURRMV9FX047CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3N1YnIuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jCmluZGV4IDIyZWQ5YTMuLmMyNTIyY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc3Vici5jCkBAIC0yMjMsMTMgKzIyMywxMyBAQAogCQl0MV9zZ2VfaW50cl9lcnJvcl9oYW5kbGVyKGFkYXB0ZXItPnNnZSk7CiAKIAlpZiAoY2F1c2UgJiBGUEdBX1BDSVhfSU5URVJSVVBUX0dNQUMpCi0gICAgICAgICAgICAgICAgZnBnYV9waHlfaW50cl9oYW5kbGVyKGFkYXB0ZXIpOworCQlmcGdhX3BoeV9pbnRyX2hhbmRsZXIoYWRhcHRlcik7CiAKIAlpZiAoY2F1c2UgJiBGUEdBX1BDSVhfSU5URVJSVVBUX1RQKSB7Ci0gICAgICAgICAgICAgICAgLyoKKwkJLyoKIAkJICogRlBHQSBkb2Vzbid0IHN1cHBvcnQgTUM0IGludGVycnVwdHMgYW5kIGl0IHJlcXVpcmVzCiAJCSAqIHRoaXMgb2RkIGxheWVyIG9mIGluZGlyZWN0aW9uIGZvciBNQzUuCi0gICAgICAgICAgICAgICAgICovCisJCSAqLwogCQl1MzIgdHBfY2F1c2UgPSByZWFkbChhZGFwdGVyLT5yZWdzICsgRlBHQV9UUF9BRERSX0lOVEVSUlVQVF9DQVVTRSk7CiAKIAkJLyogQ2xlYXIgVFAgaW50ZXJydXB0ICovCkBAIC0yNjIsOCArMjYyLDcgQEAKIAkJCXVkZWxheSgxMCk7CiAJfSB3aGlsZSAoYnVzeSAmJiAtLWF0dGVtcHRzKTsKIAlpZiAoYnVzeSkKLQkJQ0hfQUxFUlQoIiVzOiBNRElPIG9wZXJhdGlvbiB0aW1lZCBvdXRcbiIsCi0JCQkgYWRhcHRlci0+bmFtZSk7CisJCUNIX0FMRVJUKCIlczogTURJTyBvcGVyYXRpb24gdGltZWQgb3V0XG4iLCBhZGFwdGVyLT5uYW1lKTsKIAlyZXR1cm4gYnVzeTsKIH0KIApAQCAtNjA1LDIyICs2MDQsMjMgQEAKIAogCXN3aXRjaCAoYm9hcmRfaW5mbyhhZGFwdGVyKS0+Ym9hcmQpIHsKICNpZmRlZiBDT05GSUdfQ0hFTFNJT19UMV8xRwotICAgICAgICBjYXNlIENIQlRfQk9BUkRfQ0hUMjA0OgotICAgICAgICBjYXNlIENIQlRfQk9BUkRfQ0hUMjA0RToKLSAgICAgICAgY2FzZSBDSEJUX0JPQVJEX0NITjIwNDoKLSAgICAgICAgY2FzZSBDSEJUX0JPQVJEX0NIVDIwNFY6IHsKLSAgICAgICAgICAgICAgICBpbnQgaSwgcG9ydF9iaXQ7CisJY2FzZSBDSEJUX0JPQVJEX0NIVDIwNDoKKwljYXNlIENIQlRfQk9BUkRfQ0hUMjA0RToKKwljYXNlIENIQlRfQk9BUkRfQ0hOMjA0OgorCWNhc2UgQ0hCVF9CT0FSRF9DSFQyMDRWOiB7CisJCWludCBpLCBwb3J0X2JpdDsKIAkJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CiAJCQlwb3J0X2JpdCA9IGkgKyAxOwotCQkJaWYgKCEoY2F1c2UgJiAoMSA8PCBwb3J0X2JpdCkpKSBjb250aW51ZTsKKwkJCWlmICghKGNhdXNlICYgKDEgPDwgcG9ydF9iaXQpKSkKKwkJCQljb250aW51ZTsKIAotCSAgICAgICAgICAgICAgICBwaHkgPSBhZGFwdGVyLT5wb3J0W2ldLnBoeTsKKwkJCXBoeSA9IGFkYXB0ZXItPnBvcnRbaV0ucGh5OwogCQkJcGh5X2NhdXNlID0gcGh5LT5vcHMtPmludGVycnVwdF9oYW5kbGVyKHBoeSk7CiAJCQlpZiAocGh5X2NhdXNlICYgY3BoeV9jYXVzZV9saW5rX2NoYW5nZSkKIAkJCQl0MV9saW5rX2NoYW5nZWQoYWRhcHRlciwgaSk7CiAJCX0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorCQlicmVhazsKKwl9CiAJY2FzZSBDSEJUX0JPQVJEX0NIVDEwMToKIAkJaWYgKGNhdXNlICYgRUxNRVIwX0dQX0JJVDEpIHsgLyogTWFydmVsbCA4OEUxMTExIGludGVycnVwdCAqLwogCQkJcGh5ID0gYWRhcHRlci0+cG9ydFswXS5waHk7CkBAIC02MzEsMTMgKzYzMSwxMyBAQAogCQlicmVhazsKIAljYXNlIENIQlRfQk9BUkRfNzUwMDogewogCQlpbnQgcDsKLSAgICAJCS8qCisJCS8qCiAJCSAqIEVsbWVyMCdzIGludGVycnVwdCBjYXVzZSBpc24ndCB1c2VmdWwgaGVyZSBiZWNhdXNlIHRoZXJlIGlzCiAJCSAqIG9ubHkgb25lIGJpdCB0aGF0IGNhbiBiZSBzZXQgZm9yIGFsbCA0IHBvcnRzLiAgVGhpcyBtZWFucwogCQkgKiB3ZSBhcmUgZm9yY2VkIHRvIGNoZWNrIGV2ZXJ5IFBIWSdzIGludGVycnVwdCBzdGF0dXMKIAkJICogcmVnaXN0ZXIgdG8gc2VlIHdobyBpbml0aWF0ZWQgdGhlIGludGVycnVwdC4KLSAgICAgCQkgKi8KLSAgICAJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgcCkgeworCQkgKi8KKwkJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBwKSB7CiAJCQlwaHkgPSBhZGFwdGVyLT5wb3J0W3BdLnBoeTsKIAkJCXBoeV9jYXVzZSA9IHBoeS0+b3BzLT5pbnRlcnJ1cHRfaGFuZGxlcihwaHkpOwogCQkJaWYgKHBoeV9jYXVzZSAmIGNwaHlfY2F1c2VfbGlua19jaGFuZ2UpCkBAIC02NTgsNyArNjU4LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBDSEJUX0JPQVJEXzgwMDA6CiAJY2FzZSBDSEJUX0JPQVJEX0NIVDExMDoKLSAgICAJCUNIX0RCRyhhZGFwdGVyLCBJTlRSLCAiRXh0ZXJuYWwgaW50ZXJydXB0IGNhdXNlIDB4JXhcbiIsCisJCUNIX0RCRyhhZGFwdGVyLCBJTlRSLCAiRXh0ZXJuYWwgaW50ZXJydXB0IGNhdXNlIDB4JXhcbiIsCiAJCSAgICAgICBjYXVzZSk7CiAJCWlmIChjYXVzZSAmIEVMTUVSMF9HUF9CSVQxKSB7ICAgICAgICAvKiBQTUMzMzkzIElOVEIgKi8KIAkJCXN0cnVjdCBjbWFjICptYWMgPSBhZGFwdGVyLT5wb3J0WzBdLm1hYzsKQEAgLTY3MCw5ICs2NzAsOSBAQAogCiAJCQl0MV90cGlfcmVhZChhZGFwdGVyLAogCQkJCQlBX0VMTUVSMF9HUElfU1RBVCwgJm1vZF9kZXRlY3QpOwotCSAgICAJCUNIX01TRyhhZGFwdGVyLCBJTkZPLCBMSU5LLCAiWFBBSyAlc1xuIiwKKwkJCUNIX01TRyhhZGFwdGVyLCBJTkZPLCBMSU5LLCAiWFBBSyAlc1xuIiwKIAkJCSAgICAgICBtb2RfZGV0ZWN0ID8gInJlbW92ZWQiIDogImluc2VydGVkIik7Ci0gICAgCQl9CisJCX0KIAkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfQ09VR0FSCiAJY2FzZSBDSEJUX0JPQVJEX0NPVUdBUjoKQEAgLTY4OCw3ICs2ODgsOCBAQAogCiAJCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKIAkJCQlwb3J0X2JpdCA9IGkgPyBpICsgMSA6IDA7Ci0JCQkJaWYgKCEoY2F1c2UgJiAoMSA8PCBwb3J0X2JpdCkpKSBjb250aW51ZTsKKwkJCQlpZiAoIShjYXVzZSAmICgxIDw8IHBvcnRfYml0KSkpCisJCQkJCWNvbnRpbnVlOwogCiAJCQkJcGh5ID0gYWRhcHRlci0+cG9ydFtpXS5waHk7CiAJCQkJcGh5X2NhdXNlID0gcGh5LT5vcHMtPmludGVycnVwdF9oYW5kbGVyKHBoeSk7CkBAIC03NTUsNyArNzU2LDcgQEAKIAogCS8qIERpc2FibGUgUENJWCAmIGV4dGVybmFsIGNoaXAgaW50ZXJydXB0cy4gKi8KIAlpZiAodDFfaXNfYXNpYyhhZGFwdGVyKSkKLQkgICAgCXdyaXRlbCgwLCBhZGFwdGVyLT5yZWdzICsgQV9QTF9FTkFCTEUpOworCQl3cml0ZWwoMCwgYWRhcHRlci0+cmVncyArIEFfUExfRU5BQkxFKTsKIAogCS8qIFBDSS1YIGludGVycnVwdHMgKi8KIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsIEFfUENJQ0ZHX0lOVFJfRU5BQkxFLCAwKTsKQEAgLTgzMCwxMSArODMxLDExIEBACiAvKiBQb3dlciBzZXF1ZW5jaW5nIGlzIGEgd29yay1hcm91bmQgZm9yIEludGVsJ3MgWFBBS3MuICovCiBzdGF0aWMgdm9pZCBwb3dlcl9zZXF1ZW5jZV94cGFrKGFkYXB0ZXJfdCogYWRhcHRlcikKIHsKLSAgICAJdTMyIG1vZF9kZXRlY3Q7Ci0gICAgCXUzMiBncG87CisJdTMyIG1vZF9kZXRlY3Q7CisJdTMyIGdwbzsKIAotICAgIAkvKiBDaGVjayBmb3IgWFBBSyAqLwotICAgIAl0MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9HUElfU1RBVCwgJm1vZF9kZXRlY3QpOworCS8qIENoZWNrIGZvciBYUEFLICovCisJdDFfdHBpX3JlYWQoYWRhcHRlciwgQV9FTE1FUjBfR1BJX1NUQVQsICZtb2RfZGV0ZWN0KTsKIAlpZiAoIShFTE1FUjBfR1BfQklUNSAmIG1vZF9kZXRlY3QpKSB7CiAJCS8qIFhQQUsgaXMgcHJlc2VudCAqLwogCQl0MV90cGlfcmVhZChhZGFwdGVyLCBBX0VMTUVSMF9HUE8sICZncG8pOwpAQCAtODc3LDMxICs4NzgsMzEgQEAKIAljYXNlIENIQlRfQk9BUkRfTjIxMDoKIAljYXNlIENIQlRfQk9BUkRfQ0hUMjEwOgogCWNhc2UgQ0hCVF9CT0FSRF9DT1VHQVI6Ci0gICAgCQl0MV90cGlfcGFyKGFkYXB0ZXIsIDB4Zik7Ci0gICAgCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAweDgwMCk7CisJCXQxX3RwaV9wYXIoYWRhcHRlciwgMHhmKTsKKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgMHg4MDApOwogCQlicmVhazsKIAljYXNlIENIQlRfQk9BUkRfQ0hUMTEwOgotICAgIAkJdDFfdHBpX3BhcihhZGFwdGVyLCAweGYpOwotICAgIAkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgMHgxODAwKTsKKwkJdDFfdHBpX3BhcihhZGFwdGVyLCAweGYpOworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAweDE4MDApOwogCi0gICAgCQkvKiBUQkQgWFhYIE1pZ2h0IG5vdCBuZWVkLiAgVGhpcyBmaXhlcyBhIHByb2JsZW0KLSAgICAgCQkgKiAgICAgICAgIGRlc2NyaWJlZCBpbiB0aGUgSW50ZWwgU1IgWFBBSyBlcnJhdGEuCi0gICAgIAkJICovCi0gICAgCQlwb3dlcl9zZXF1ZW5jZV94cGFrKGFkYXB0ZXIpOworCQkvKiBUQkQgWFhYIE1pZ2h0IG5vdCBuZWVkLiAgVGhpcyBmaXhlcyBhIHByb2JsZW0KKwkJICogICAgICAgICBkZXNjcmliZWQgaW4gdGhlIEludGVsIFNSIFhQQUsgZXJyYXRhLgorCQkgKi8KKwkJcG93ZXJfc2VxdWVuY2VfeHBhayhhZGFwdGVyKTsKIAkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfMUcKLSAgICBjYXNlIENIQlRfQk9BUkRfQ0hUMjA0RToKLQkJICAgICAgICAvKiBhZGQgY29uZmlnIHNwYWNlIHdyaXRlIGhlcmUgKi8KKwljYXNlIENIQlRfQk9BUkRfQ0hUMjA0RToKKwkJLyogYWRkIGNvbmZpZyBzcGFjZSB3cml0ZSBoZXJlICovCiAJY2FzZSBDSEJUX0JPQVJEX0NIVDIwNDoKIAljYXNlIENIQlRfQk9BUkRfQ0hUMjA0VjoKIAljYXNlIENIQlRfQk9BUkRfQ0hOMjA0OgotICAgICAgICAgICAgICAgIHQxX3RwaV9wYXIoYWRhcHRlciwgMHhmKTsKLSAgICAgICAgICAgICAgICB0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAweDgwNCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisJCXQxX3RwaV9wYXIoYWRhcHRlciwgMHhmKTsKKwkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgMHg4MDQpOworCQlicmVhazsKIAljYXNlIENIQlRfQk9BUkRfQ0hUMTAxOgogCWNhc2UgQ0hCVF9CT0FSRF83NTAwOgotICAgIAkJdDFfdHBpX3BhcihhZGFwdGVyLCAweGYpOwotICAgIAkJdDFfdHBpX3dyaXRlKGFkYXB0ZXIsIEFfRUxNRVIwX0dQTywgMHgxODA0KTsKKwkJdDFfdHBpX3BhcihhZGFwdGVyLCAweGYpOworCQl0MV90cGlfd3JpdGUoYWRhcHRlciwgQV9FTE1FUjBfR1BPLCAweDE4MDQpOwogCQlicmVhazsKICNlbmRpZgogCX0KQEAgLTk0MSw3ICs5NDIsNyBAQAogCQlnb3RvIG91dF9lcnI7CiAKIAllcnIgPSAwOwotIG91dF9lcnI6CitvdXRfZXJyOgogCXJldHVybiBlcnI7CiB9CiAKQEAgLTk4Myw3ICs5ODQsNyBAQAogCWlmIChhZGFwdGVyLT5lc3BpKQogCQl0MV9lc3BpX2Rlc3Ryb3koYWRhcHRlci0+ZXNwaSk7CiAjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDFfQ09VR0FSCi0gICAgICAgIGlmIChhZGFwdGVyLT5jc3BpKQorCWlmIChhZGFwdGVyLT5jc3BpKQogCQl0MV9jc3BpX2Rlc3Ryb3koYWRhcHRlci0+Y3NwaSk7CiAjZW5kaWYKIH0KQEAgLTEwMTAsNyArMTAxMSw3IEBACiAJCUNIX0VSUigiJXM6IENTUEkgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iLAogCQkgICAgICAgYWRhcHRlci0+bmFtZSk7CiAJCWdvdG8gZXJyb3I7Ci0gICAgICAgIH0KKwl9CiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vdHAuYyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vdHAuYwppbmRleCAwY2EwYjZlLi42MjIyZDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL3RwLmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby90cC5jCkBAIC0xNywzOSArMTcsMzYgQEAKIHN0YXRpYyB2b2lkIHRwX2luaXQoYWRhcHRlcl90ICogYXAsIGNvbnN0IHN0cnVjdCB0cF9wYXJhbXMgKnAsCiAJCSAgICB1bnNpZ25lZCBpbnQgdHBfY2xrKQogewotCWlmICh0MV9pc19hc2ljKGFwKSkgewotCQl1MzIgdmFsOworCXUzMiB2YWw7CiAKLQkJdmFsID0gRl9UUF9JTl9DU1BJX0NQTCB8IEZfVFBfSU5fQ1NQSV9DSEVDS19JUF9DU1VNIHwKLQkJICAgIEZfVFBfSU5fQ1NQSV9DSEVDS19UQ1BfQ1NVTSB8IEZfVFBfSU5fRVNQSV9FVEhFUk5FVDsKLQkJaWYgKCFwLT5wbV9zaXplKQotCQkJdmFsIHw9IEZfT0ZGTE9BRF9ESVNBQkxFOwotCQllbHNlCi0JCQl2YWwgfD0gRl9UUF9JTl9FU1BJX0NIRUNLX0lQX0NTVU0gfAotCQkJICAgIEZfVFBfSU5fRVNQSV9DSEVDS19UQ1BfQ1NVTTsKLQkJd3JpdGVsKHZhbCwgYXAtPnJlZ3MgKyBBX1RQX0lOX0NPTkZJRyk7Ci0JCXdyaXRlbChGX1RQX09VVF9DU1BJX0NQTCB8Ci0JCSAgICAgICBGX1RQX09VVF9FU1BJX0VUSEVSTkVUIHwKLQkJICAgICAgIEZfVFBfT1VUX0VTUElfR0VORVJBVEVfSVBfQ1NVTSB8Ci0JCSAgICAgICBGX1RQX09VVF9FU1BJX0dFTkVSQVRFX1RDUF9DU1VNLAotCQkgICAgICAgYXAtPnJlZ3MgKyBBX1RQX09VVF9DT05GSUcpOwotCQl3cml0ZWwoVl9JUF9UVEwoNjQpIHwKLQkJICAgICAgIEZfUEFUSF9NVFUgLyogSVAgREYgYml0ICovICB8Ci0JCSAgICAgICBWXzVUVVBMRV9MT09LVVAocC0+dXNlXzV0dXBsZV9tb2RlKSB8Ci0JCSAgICAgICBWX1NZTl9DT09LSUVfUEFSQU1FVEVSKDI5KSwKLQkJICAgICAgIGFwLT5yZWdzICsgQV9UUF9HTE9CQUxfQ09ORklHKTsKLQkJLyoKLQkJICogRW5hYmxlIHBhdXNlIGZyYW1lIGRlYWRsb2NrIHByZXZlbnRpb24uCi0JCSAqLwotCQlpZiAoaXNfVDIoYXApICYmIGFwLT5wYXJhbXMubnBvcnRzID4gMSkgewotCQkJdTMyIGRyb3BfdGlja3MgPSBEUk9QX01TRUMgKiAodHBfY2xrIC8gMTAwMCk7CisJaWYgKCF0MV9pc19hc2ljKGFwKSkKKwkJcmV0dXJuOwogCi0JCQl3cml0ZWwoRl9FTkFCTEVfVFhfRFJPUCB8IEZfRU5BQkxFX1RYX0VSUk9SIHwKLQkJCSAgICAgICBWX0RST1BfVElDS1NfQ05UKGRyb3BfdGlja3MpIHwKLQkJCSAgICAgICBWX05VTV9QS1RTX0RST1BQRUQoRFJPUF9QS1RTX0NOVCksCi0JCQkgICAgICAgYXAtPnJlZ3MgKyBBX1RQX1RYX0RST1BfQ09ORklHKTsKLQkJfQorCXZhbCA9IEZfVFBfSU5fQ1NQSV9DUEwgfCBGX1RQX0lOX0NTUElfQ0hFQ0tfSVBfQ1NVTSB8CisJCUZfVFBfSU5fQ1NQSV9DSEVDS19UQ1BfQ1NVTSB8IEZfVFBfSU5fRVNQSV9FVEhFUk5FVDsKKwlpZiAoIXAtPnBtX3NpemUpCisJCXZhbCB8PSBGX09GRkxPQURfRElTQUJMRTsKKwllbHNlCisJCXZhbCB8PSBGX1RQX0lOX0VTUElfQ0hFQ0tfSVBfQ1NVTSB8IEZfVFBfSU5fRVNQSV9DSEVDS19UQ1BfQ1NVTTsKKwl3cml0ZWwodmFsLCBhcC0+cmVncyArIEFfVFBfSU5fQ09ORklHKTsKKwl3cml0ZWwoRl9UUF9PVVRfQ1NQSV9DUEwgfAorCSAgICAgICBGX1RQX09VVF9FU1BJX0VUSEVSTkVUIHwKKwkgICAgICAgRl9UUF9PVVRfRVNQSV9HRU5FUkFURV9JUF9DU1VNIHwKKwkgICAgICAgRl9UUF9PVVRfRVNQSV9HRU5FUkFURV9UQ1BfQ1NVTSwgYXAtPnJlZ3MgKyBBX1RQX09VVF9DT05GSUcpOworCXdyaXRlbChWX0lQX1RUTCg2NCkgfAorCSAgICAgICBGX1BBVEhfTVRVIC8qIElQIERGIGJpdCAqLyAgfAorCSAgICAgICBWXzVUVVBMRV9MT09LVVAocC0+dXNlXzV0dXBsZV9tb2RlKSB8CisJICAgICAgIFZfU1lOX0NPT0tJRV9QQVJBTUVURVIoMjkpLCBhcC0+cmVncyArIEFfVFBfR0xPQkFMX0NPTkZJRyk7CisJLyoKKwkgKiBFbmFibGUgcGF1c2UgZnJhbWUgZGVhZGxvY2sgcHJldmVudGlvbi4KKwkgKi8KKwlpZiAoaXNfVDIoYXApICYmIGFwLT5wYXJhbXMubnBvcnRzID4gMSkgeworCQl1MzIgZHJvcF90aWNrcyA9IERST1BfTVNFQyAqICh0cF9jbGsgLyAxMDAwKTsKIAorCQl3cml0ZWwoRl9FTkFCTEVfVFhfRFJPUCB8IEZfRU5BQkxFX1RYX0VSUk9SIHwKKwkJICAgICAgIFZfRFJPUF9USUNLU19DTlQoZHJvcF90aWNrcykgfAorCQkgICAgICAgVl9OVU1fUEtUU19EUk9QUEVEKERST1BfUEtUU19DTlQpLAorCQkgICAgICAgYXAtPnJlZ3MgKyBBX1RQX1RYX0RST1BfQ09ORklHKTsKIAl9CiB9CiAKQEAgLTYxLDYgKzU4LDcgQEAKIHN0cnVjdCBwZXRwICpfX2RldmluaXQgdDFfdHBfY3JlYXRlKGFkYXB0ZXJfdCAqIGFkYXB0ZXIsIHN0cnVjdCB0cF9wYXJhbXMgKnApCiB7CiAJc3RydWN0IHBldHAgKnRwID0ga3phbGxvYyhzaXplb2YoKnRwKSwgR0ZQX0tFUk5FTCk7CisKIAlpZiAoIXRwKQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2hlbHNpby92c2M3MzI2LmMgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzczMjYuYwppbmRleCA4NWRjM2IxLi41MzRmZmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzczMjYuYworKysgYi9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzczMjYuYwpAQCAtMjI2LDIyICsyMjYsMjEgQEAKIAkJaWYgKGliW2ldLmFkZHIgPT0gSU5JVEJMT0NLX1NMRUVQKSB7CiAJCQl1ZGVsYXkoIGliW2ldLmRhdGEgKTsKIAkJCUNIX0VSUigic2xlZXAgJWQgdXNcbiIsaWJbaV0uZGF0YSk7Ci0JCX0gZWxzZSB7CisJCX0gZWxzZQogCQkJdnNjX3dyaXRlKCBhZGFwdGVyLCBpYltpXS5hZGRyLCBpYltpXS5kYXRhICk7Ci0JCX0KIAl9CiB9CiAKIHN0YXRpYyBpbnQgYmlzdF9yZChhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBtb2R1bGVpZCwgaW50IGFkZHJlc3MpCiB7Ci0JaW50IGRhdGE9MDsKLQl1MzIgcmVzdWx0PTA7CisJaW50IGRhdGEgPSAwOworCXUzMiByZXN1bHQgPSAwOwogCi0JaWYoCShhZGRyZXNzICE9IDB4MCkgJiYKLQkJKGFkZHJlc3MgIT0gMHgxKSAmJgotCQkoYWRkcmVzcyAhPSAweDIpICYmCi0JCShhZGRyZXNzICE9IDB4ZCkgJiYKLQkJKGFkZHJlc3MgIT0gMHhlKSkKKwlpZiAoKGFkZHJlc3MgIT0gMHgwKSAmJgorCSAgICAoYWRkcmVzcyAhPSAweDEpICYmCisJICAgIChhZGRyZXNzICE9IDB4MikgJiYKKwkgICAgKGFkZHJlc3MgIT0gMHhkKSAmJgorCSAgICAoYWRkcmVzcyAhPSAweGUpKQogCQkJQ0hfRVJSKCJObyBiaXN0IGFkZHJlc3M6IDB4JXhcbiIsIGFkZHJlc3MpOwogCiAJZGF0YSA9ICgoMHgwMCA8PCAyNCkgfCAoKGFkZHJlc3MgJiAweGZmKSA8PCAxNikgfCAoMHgwMCA8PCA4KSB8CkBAIC0yNTEsMjcgKzI1MCwyNyBAQAogCXVkZWxheSgxMCk7CiAKIAl2c2NfcmVhZChhZGFwdGVyLCBSRUdfUkFNX0JJU1RfUkVTVUxULCAmcmVzdWx0KTsKLQlpZigocmVzdWx0ICYgKDE8PDkpKSAhPSAweDApCisJaWYgKChyZXN1bHQgJiAoMSA8PCA5KSkgIT0gMHgwKQogCQlDSF9FUlIoIlN0aWxsIGluIGJpc3QgcmVhZDogMHgleFxuIiwgcmVzdWx0KTsKLQllbHNlIGlmKChyZXN1bHQgJiAoMTw8OCkpICE9IDB4MCkKKwllbHNlIGlmICgocmVzdWx0ICYgKDEgPDwgOCkpICE9IDB4MCkKIAkJQ0hfRVJSKCJiaXN0IHJlYWQgZXJyb3I6IDB4JXhcbiIsIHJlc3VsdCk7CiAKLQlyZXR1cm4ocmVzdWx0ICYgMHhmZik7CisJcmV0dXJuIChyZXN1bHQgJiAweGZmKTsKIH0KIAogc3RhdGljIGludCBiaXN0X3dyKGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IG1vZHVsZWlkLCBpbnQgYWRkcmVzcywgaW50IHZhbHVlKQogewotCWludCBkYXRhPTA7Ci0JdTMyIHJlc3VsdD0wOworCWludCBkYXRhID0gMDsKKwl1MzIgcmVzdWx0ID0gMDsKIAotCWlmKAkoYWRkcmVzcyAhPSAweDApICYmCi0JCShhZGRyZXNzICE9IDB4MSkgJiYKLQkJKGFkZHJlc3MgIT0gMHgyKSAmJgotCQkoYWRkcmVzcyAhPSAweGQpICYmCi0JCShhZGRyZXNzICE9IDB4ZSkpCisJaWYgKChhZGRyZXNzICE9IDB4MCkgJiYKKwkgICAgKGFkZHJlc3MgIT0gMHgxKSAmJgorCSAgICAoYWRkcmVzcyAhPSAweDIpICYmCisJICAgIChhZGRyZXNzICE9IDB4ZCkgJiYKKwkgICAgKGFkZHJlc3MgIT0gMHhlKSkKIAkJCUNIX0VSUigiTm8gYmlzdCBhZGRyZXNzOiAweCV4XG4iLCBhZGRyZXNzKTsKIAotCWlmKCB2YWx1ZT4yNTUgKQorCWlmICh2YWx1ZSA+IDI1NSkKIAkJQ0hfRVJSKCJTdXNwaWNpb3VzIHdyaXRlIG91dCBvZiByYW5nZSB2YWx1ZTogMHgleFxuIiwgdmFsdWUpOwogCiAJZGF0YSA9ICgoMHgwMSA8PCAyNCkgfCAoKGFkZHJlc3MgJiAweGZmKSA8PCAxNikgfCAodmFsdWUgPDwgOCkgfApAQCAtMjgxLDEyICsyODAsMTIgQEAKIAl1ZGVsYXkoNSk7CiAKIAl2c2NfcmVhZChhZGFwdGVyLCBSRUdfUkFNX0JJU1RfQ01ELCAmcmVzdWx0KTsKLQlpZigocmVzdWx0ICYgKDE8PDI3KSkgIT0gMHgwKQorCWlmICgocmVzdWx0ICYgKDEgPDwgMjcpKSAhPSAweDApCiAJCUNIX0VSUigiU3RpbGwgaW4gYmlzdCB3cml0ZTogMHgleFxuIiwgcmVzdWx0KTsKLQllbHNlIGlmKChyZXN1bHQgJiAoMTw8MjYpKSAhPSAweDApCisJZWxzZSBpZiAoKHJlc3VsdCAmICgxIDw8IDI2KSkgIT0gMHgwKQogCQlDSF9FUlIoImJpc3Qgd3JpdGUgZXJyb3I6IDB4JXhcbiIsIHJlc3VsdCk7CiAKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcnVuX2Jpc3QoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgbW9kdWxlaWQpCkBAIC0yOTUsNyArMjk0LDcgQEAKIAkodm9pZCkgYmlzdF93cihhZGFwdGVyLG1vZHVsZWlkLCAweDAwLCAweDAyKTsKIAkodm9pZCkgYmlzdF93cihhZGFwdGVyLG1vZHVsZWlkLCAweDAxLCAweDAxKTsKIAotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjaGVja19iaXN0KGFkYXB0ZXJfdCAqYWRhcHRlciwgaW50IG1vZHVsZWlkKQpAQCAtMzA5LDI3ICszMDgsMjYgQEAKIAlpZiAoKHJlc3VsdCAmIDMpICE9IDB4MykKIAkJQ0hfRVJSKCJSZXN1bHQ6IDB4JXggIEJJU1QgZXJyb3IgaW4gcmFtICVkLCBjb2x1bW46IDB4JTA0eFxuIiwKIAkJCXJlc3VsdCwgbW9kdWxlaWQsIGNvbHVtbik7Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGVuYWJsZV9tZW0oYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgbW9kdWxlaWQpCiB7CiAJLyplbmFibGUgbWVtKi8KIAkodm9pZCkgYmlzdF93cihhZGFwdGVyLG1vZHVsZWlkLCAweDAwLCAweDAwKTsKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcnVuX2Jpc3RfYWxsKGFkYXB0ZXJfdCAqYWRhcHRlcikKIHsKLQlpbnQgcG9ydD0wOwotCXUzMiB2YWw9MDsKKwlpbnQgcG9ydCA9IDA7CisJdTMyIHZhbCA9IDA7CiAKIAl2c2Nfd3JpdGUoYWRhcHRlciwgUkVHX01FTV9CSVNULCAweDUpOwogCXZzY19yZWFkKGFkYXB0ZXIsIFJFR19NRU1fQklTVCwgJnZhbCk7CiAKLQlmb3IocG9ydD0wOyBwb3J0PDEyOyBwb3J0KyspeworCWZvciAocG9ydCA9IDA7IHBvcnQgPCAxMjsgcG9ydCsrKQogCQl2c2Nfd3JpdGUoYWRhcHRlciwgUkVHX0RFVl9TRVRVUChwb3J0KSwgMHgwKTsKLQl9CiAKIAl1ZGVsYXkoMzAwKTsKIAl2c2Nfd3JpdGUoYWRhcHRlciwgUkVHX1NQSTRfTUlTQywgMHgwMDA0MDQwOSk7CkBAIC0zNTIsMTMgKzM1MCwxMyBAQAogCXVkZWxheSgzMDApOwogCXZzY193cml0ZShhZGFwdGVyLCBSRUdfU1BJNF9NSVNDLCAweDYwMDQwNDAwKTsKIAl1ZGVsYXkoMzAwKTsKLQlmb3IocG9ydD0wOyBwb3J0PDEyOyBwb3J0KyspeworCWZvciAocG9ydCA9IDA7IHBvcnQgPCAxMjsgcG9ydCsrKQogCQl2c2Nfd3JpdGUoYWRhcHRlciwgUkVHX0RFVl9TRVRVUChwb3J0KSwgMHgxKTsKLQl9CisKIAl1ZGVsYXkoMzAwKTsKIAl2c2Nfd3JpdGUoYWRhcHRlciwgUkVHX01FTV9CSVNULCAweDApOwogCW1kZWxheSgxMCk7Ci0JcmV0dXJuKDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1hY19pbnRyX2hhbmRsZXIoc3RydWN0IGNtYWMgKm1hYykKQEAgLTU5MSw0MCArNTg5LDQ2IEBACiAKIHN0YXRpYyB2b2lkIHBvcnRfc3RhdHNfdXBkYXRlKHN0cnVjdCBjbWFjICptYWMpCiB7Ci0JaW50IHBvcnQgPSBtYWMtPmluc3RhbmNlLT5pbmRleDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgcmVnOworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCX0gaHdfc3RhdHNbXSA9IHsKIAotCS8qIFJ4IHN0YXRzICovCisjZGVmaW5lIEhXX1NUQVQocmVnLCBzdGF0X25hbWUpIFwKKwl7IHJlZywgKCYoKHN0cnVjdCBjbWFjX3N0YXRpc3RpY3MgKilOVUxMKS0+c3RhdF9uYW1lKSAtICh1NjQgKilOVUxMIH0KKworCQkvKiBSeCBzdGF0cyAqLworCQlIV19TVEFUKFJ4VW5pY2FzdCwgUnhVbmljYXN0RnJhbWVzT0spLAorCQlIV19TVEFUKFJ4TXVsdGljYXN0LCBSeE11bHRpY2FzdEZyYW1lc09LKSwKKwkJSFdfU1RBVChSeEJyb2FkY2FzdCwgUnhCcm9hZGNhc3RGcmFtZXNPSyksCisJCUhXX1NUQVQoQ3JjLCBSeEZDU0Vycm9ycyksCisJCUhXX1NUQVQoUnhBbGlnbm1lbnQsIFJ4QWxpZ25FcnJvcnMpLAorCQlIV19TVEFUKFJ4T3ZlcnNpemUsIFJ4RnJhbWVUb29Mb25nRXJyb3JzKSwKKwkJSFdfU1RBVChSeFBhdXNlLCBSeFBhdXNlRnJhbWVzKSwKKwkJSFdfU1RBVChSeEphYmJlcnMsIFJ4SmFiYmVyRXJyb3JzKSwKKwkJSFdfU1RBVChSeEZyYWdtZW50cywgUnhSdW50RXJyb3JzKSwKKwkJSFdfU1RBVChSeFVuZGVyc2l6ZSwgUnhSdW50RXJyb3JzKSwKKwkJSFdfU1RBVChSeFN5bWJvbENhcnJpZXIsIFJ4U3ltYm9sRXJyb3JzKSwKKwkJSFdfU1RBVChSeFNpemUxNTE5VG9NYXgsIFJ4SnVtYm9GcmFtZXNPSyksCisKKwkJLyogVHggc3RhdHMgKHNraXAgY29sbGlzaW9uIHN0YXRzIGFzIHdlIGFyZSBmdWxsLWR1cGxleCBvbmx5KSAqLworCQlIV19TVEFUKFR4VW5pY2FzdCwgVHhVbmljYXN0RnJhbWVzT0spLAorCQlIV19TVEFUKFR4TXVsdGljYXN0LCBUeE11bHRpY2FzdEZyYW1lc09LKSwKKwkJSFdfU1RBVChUeEJyb2FkY2FzdCwgVHhCcm9hZGNhc3RGcmFtZXNPSyksCisJCUhXX1NUQVQoVHhQYXVzZSwgVHhQYXVzZUZyYW1lcyksCisJCUhXX1NUQVQoVHhVbmRlcnJ1biwgVHhVbmRlcnJ1biksCisJCUhXX1NUQVQoVHhTaXplMTUxOVRvTWF4LCBUeEp1bWJvRnJhbWVzT0spLAorCX0sICpwID0gaHdfc3RhdHM7CisJdW5zaWduZWQgaW50IHBvcnQgPSBtYWMtPmluc3RhbmNlLT5pbmRleDsKKwl1NjQgKnN0YXRzID0gKHU2NCAqKSZtYWMtPnN0YXRzOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHdfc3RhdHMpOyBpKyspCisJCXJtb25fdXBkYXRlKG1hYywgQ1JBKDB4NCwgcG9ydCwgcC0+cmVnKSwgc3RhdHMgKyBwLT5vZmZzZXQpOworCisJcm1vbl91cGRhdGUobWFjLCBSRUdfVFhfT0tfQllURVMocG9ydCksICZtYWMtPnN0YXRzLlR4T2N0ZXRzT0spOwogCXJtb25fdXBkYXRlKG1hYywgUkVHX1JYX09LX0JZVEVTKHBvcnQpLCAmbWFjLT5zdGF0cy5SeE9jdGV0c09LKTsKIAlybW9uX3VwZGF0ZShtYWMsIFJFR19SWF9CQURfQllURVMocG9ydCksICZtYWMtPnN0YXRzLlJ4T2N0ZXRzQmFkKTsKLQlybW9uX3VwZGF0ZShtYWMsIFJFR19SWF9VTklDQVNUKHBvcnQpLCAmbWFjLT5zdGF0cy5SeFVuaWNhc3RGcmFtZXNPSyk7Ci0Jcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfTVVMVElDQVNUKHBvcnQpLAotCQkgICAgJm1hYy0+c3RhdHMuUnhNdWx0aWNhc3RGcmFtZXNPSyk7Ci0Jcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfQlJPQURDQVNUKHBvcnQpLAotCQkgICAgJm1hYy0+c3RhdHMuUnhCcm9hZGNhc3RGcmFtZXNPSyk7Ci0Jcm1vbl91cGRhdGUobWFjLCBSRUdfQ1JDKHBvcnQpLCAmbWFjLT5zdGF0cy5SeEZDU0Vycm9ycyk7Ci0Jcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfQUxJR05NRU5UKHBvcnQpLCAmbWFjLT5zdGF0cy5SeEFsaWduRXJyb3JzKTsKLQlybW9uX3VwZGF0ZShtYWMsIFJFR19SWF9PVkVSU0laRShwb3J0KSwKLQkJICAgICZtYWMtPnN0YXRzLlJ4RnJhbWVUb29Mb25nRXJyb3JzKTsKLQlybW9uX3VwZGF0ZShtYWMsIFJFR19SWF9QQVVTRShwb3J0KSwgJm1hYy0+c3RhdHMuUnhQYXVzZUZyYW1lcyk7Ci0Jcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfSkFCQkVSUyhwb3J0KSwgJm1hYy0+c3RhdHMuUnhKYWJiZXJFcnJvcnMpOwotCXJtb25fdXBkYXRlKG1hYywgUkVHX1JYX0ZSQUdNRU5UUyhwb3J0KSwgJm1hYy0+c3RhdHMuUnhSdW50RXJyb3JzKTsKLQlybW9uX3VwZGF0ZShtYWMsIFJFR19SWF9VTkRFUlNJWkUocG9ydCksICZtYWMtPnN0YXRzLlJ4UnVudEVycm9ycyk7Ci0Jcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfU1lNQk9MX0NBUlJJRVIocG9ydCksCi0JCSAgICAmbWFjLT5zdGF0cy5SeFN5bWJvbEVycm9ycyk7Ci0Jcm1vbl91cGRhdGUobWFjLCBSRUdfUlhfU0laRV8xNTE5X1RPX01BWChwb3J0KSwKLSAgICAgICAgICAgICZtYWMtPnN0YXRzLlJ4SnVtYm9GcmFtZXNPSyk7Ci0KLQkvKiBUeCBzdGF0cyAoc2tpcCBjb2xsaXNpb24gc3RhdHMgYXMgd2UgYXJlIGZ1bGwtZHVwbGV4IG9ubHkpICovCi0Jcm1vbl91cGRhdGUobWFjLCBSRUdfVFhfT0tfQllURVMocG9ydCksICZtYWMtPnN0YXRzLlR4T2N0ZXRzT0spOwotCXJtb25fdXBkYXRlKG1hYywgUkVHX1RYX1VOSUNBU1QocG9ydCksICZtYWMtPnN0YXRzLlR4VW5pY2FzdEZyYW1lc09LKTsKLQlybW9uX3VwZGF0ZShtYWMsIFJFR19UWF9NVUxUSUNBU1QocG9ydCksCi0JCSAgICAmbWFjLT5zdGF0cy5UeE11bHRpY2FzdEZyYW1lc09LKTsKLQlybW9uX3VwZGF0ZShtYWMsIFJFR19UWF9CUk9BRENBU1QocG9ydCksCi0JCSAgICAmbWFjLT5zdGF0cy5UeEJyb2FkY2FzdEZyYW1lc09LKTsKLQlybW9uX3VwZGF0ZShtYWMsIFJFR19UWF9QQVVTRShwb3J0KSwgJm1hYy0+c3RhdHMuVHhQYXVzZUZyYW1lcyk7Ci0Jcm1vbl91cGRhdGUobWFjLCBSRUdfVFhfVU5ERVJSVU4ocG9ydCksICZtYWMtPnN0YXRzLlR4VW5kZXJydW4pOwotCXJtb25fdXBkYXRlKG1hYywgUkVHX1RYX1NJWkVfMTUxOV9UT19NQVgocG9ydCksCi0gICAgICAgICAgICAmbWFjLT5zdGF0cy5UeEp1bWJvRnJhbWVzT0spOwogfQogCiAvKgpAQCAtNjg2LDcgKzY5MCw4IEBACiAJaW50IGk7CiAKIAltYWMgPSBremFsbG9jKHNpemVvZigqbWFjKSArIHNpemVvZihjbWFjX2luc3RhbmNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYWMpIHJldHVybiBOVUxMOworCWlmICghbWFjKQorCQlyZXR1cm4gTlVMTDsKIAogCW1hYy0+b3BzID0gJnZzYzczMjZfb3BzOwogCW1hYy0+aW5zdGFuY2UgPSAoY21hY19pbnN0YW5jZSAqKShtYWMgKyAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vdnNjNzMyNl9yZWcuaCBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vdnNjNzMyNl9yZWcuaAppbmRleCA0OTFiY2Y3Li40NzllZGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL3ZzYzczMjZfcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby92c2M3MzI2X3JlZy5oCkBAIC0xOTIsNzMgKzE5Miw4NCBAQAogI2RlZmluZSBSRUdfSERYKHBuKQkJQ1JBKDB4MSxwbiwweDE5KQkvKiBIYWxmLWR1cGxleCBjb25maWcgKi8KIAogLyogU3RhdGlzdGljcyAqLworLyogQ1JBKDB4NCxwbixyZWcpICovCisvKiByZWcgYmVsb3cgKi8KIC8qIHBuID0gcG9ydCBudW1iZXIsIDAtYSwgYSA9IDEwR2JFICovCi0jZGVmaW5lIFJFR19SWF9JTl9CWVRFUyhwbikJQ1JBKDB4NCxwbiwweDAwKQkvKiAjIFJ4IGluIG9jdGV0cyAqLwotI2RlZmluZSBSRUdfUlhfU1lNQk9MX0NBUlJJRVIocG4pIENSQSgweDQscG4sMHgwMSkJLyogRnJhbWVzIHcvIHN5bWJvbCBlcnJvcnMgKi8KLSNkZWZpbmUgUkVHX1JYX1BBVVNFKHBuKQlDUkEoMHg0LHBuLDB4MDIpCS8qICMgcGF1c2UgZnJhbWVzIHJlY2VpdmVkICovCi0jZGVmaW5lIFJFR19SWF9VTlNVUF9PUENPREUocG4pCUNSQSgweDQscG4sMHgwMykJLyogIyBjb250cm9sIGZyYW1lcyB3aXRoIHVuc3VwcG9ydGVkIG9wY29kZSAqLwotI2RlZmluZSBSRUdfUlhfT0tfQllURVMocG4pCUNSQSgweDQscG4sMHgwNCkJLyogIyBvY3RldHMgaW4gZ29vZCBmcmFtZXMgKi8KLSNkZWZpbmUgUkVHX1JYX0JBRF9CWVRFUyhwbikJQ1JBKDB4NCxwbiwweDA1KQkvKiAjIG9jdGV0cyBpbiBiYWQgZnJhbWVzICovCi0jZGVmaW5lIFJFR19SWF9VTklDQVNUKHBuKQlDUkEoMHg0LHBuLDB4MDYpCS8qICMgZ29vZCB1bmljYXN0IGZyYW1lcyAqLwotI2RlZmluZSBSRUdfUlhfTVVMVElDQVNUKHBuKQlDUkEoMHg0LHBuLDB4MDcpCS8qICMgZ29vZCBtdWx0aWNhc3QgZnJhbWVzICovCi0jZGVmaW5lIFJFR19SWF9CUk9BRENBU1QocG4pCUNSQSgweDQscG4sMHgwOCkJLyogIyBnb29kIGJyb2FkY2FzdCBmcmFtZXMgKi8KLSNkZWZpbmUgUkVHX0NSQyhwbikJCUNSQSgweDQscG4sMHgwOSkJLyogIyBmcmFtZXMgdy8gYmFkIENSQyBvbmx5ICovCi0jZGVmaW5lIFJFR19SWF9BTElHTk1FTlQocG4pCUNSQSgweDQscG4sMHgwYSkJLyogIyBmcmFtZXMgdy8gYWxpZ25tZW50IGVyciAqLwotI2RlZmluZSBSRUdfUlhfVU5ERVJTSVpFKHBuKQlDUkEoMHg0LHBuLDB4MGIpCS8qICMgZnJhbWVzIHVuZGVyc2l6ZSAqLwotI2RlZmluZSBSRUdfUlhfRlJBR01FTlRTKHBuKQlDUkEoMHg0LHBuLDB4MGMpCS8qICMgZnJhbWVzIHVuZGVyc2l6ZSB3LyBjcmMgZXJyICovCi0jZGVmaW5lIFJFR19SWF9JTl9SQU5HRV9MRU5HVEhfRVJST1IocG4pIENSQSgweDQscG4sMHgwZCkJLyogIyBmcmFtZXMgd2l0aCBsZW5ndGggZXJyb3IgKi8KLSNkZWZpbmUgUkVHX1JYX09VVF9PRl9SQU5HRV9FUlJPUihwbikgQ1JBKDB4NCxwbiwweDBlKQkvKiAjIGZyYW1lcyB3aXRoIGlsbGVnYWwgbGVuZ3RoIGZpZWxkICovCi0jZGVmaW5lIFJFR19SWF9PVkVSU0laRShwbikJQ1JBKDB4NCxwbiwweDBmKQkvKiAjIGZyYW1lcyBvdmVyc2l6ZSAqLwotI2RlZmluZSBSRUdfUlhfSkFCQkVSUyhwbikJQ1JBKDB4NCxwbiwweDEwKQkvKiAjIGZyYW1lcyBvdmVyc2l6ZSB3LyBjcmMgZXJyICovCi0jZGVmaW5lIFJFR19SWF9TSVpFXzY0KHBuKQlDUkEoMHg0LHBuLDB4MTEpCS8qICMgZnJhbWVzIDY0IG9jdGV0cyBsb25nICovCi0jZGVmaW5lIFJFR19SWF9TSVpFXzY1X1RPXzEyNyhwbikgQ1JBKDB4NCxwbiwweDEyKQkvKiAjIGZyYW1lcyA2NS0xMjcgb2N0ZXRzICovCi0jZGVmaW5lIFJFR19SWF9TSVpFXzEyOF9UT18yNTUocG4pIENSQSgweDQscG4sMHgxMykJLyogIyBmcmFtZXMgMTI4LTI1NSAqLwotI2RlZmluZSBSRUdfUlhfU0laRV8yNTZfVE9fNTExKHBuKSBDUkEoMHg0LHBuLDB4MTQpCS8qICMgZnJhbWVzIDI1Ni01MTEgKi8KLSNkZWZpbmUgUkVHX1JYX1NJWkVfNTEyX1RPXzEwMjMocG4pIENSQSgweDQscG4sMHgxNSkJLyogIyBmcmFtZXMgNTEyLTEwMjMgKi8KLSNkZWZpbmUgUkVHX1JYX1NJWkVfMTAyNF9UT18xNTE4KHBuKSBDUkEoMHg0LHBuLDB4MTYpCS8qICMgZnJhbWVzIDEwMjQtMTUxOCAqLwotI2RlZmluZSBSRUdfUlhfU0laRV8xNTE5X1RPX01BWChwbikgQ1JBKDB4NCxwbiwweDE3KQkvKiAjIGZyYW1lcyAxNTE5LW1heCAqLwogCi0jZGVmaW5lIFJFR19UWF9PVVRfQllURVMocG4pCUNSQSgweDQscG4sMHgxOCkJLyogIyBvY3RldHMgdHggKi8KLSNkZWZpbmUgUkVHX1RYX1BBVVNFKHBuKQlDUkEoMHg0LHBuLDB4MTkpCS8qICMgcGF1c2UgZnJhbWVzIHNlbnQgKi8KLSNkZWZpbmUgUkVHX1RYX09LX0JZVEVTKHBuKQlDUkEoMHg0LHBuLDB4MWEpCS8qICMgb2N0ZXRzIHR4IE9LICovCi0jZGVmaW5lIFJFR19UWF9VTklDQVNUKHBuKQlDUkEoMHg0LHBuLDB4MWIpCS8qICMgZnJhbWVzIHVuaWNhc3QgKi8KLSNkZWZpbmUgUkVHX1RYX01VTFRJQ0FTVChwbikJQ1JBKDB4NCxwbiwweDFjKQkvKiAjIGZyYW1lcyBtdWx0aWNhc3QgKi8KLSNkZWZpbmUgUkVHX1RYX0JST0FEQ0FTVChwbikJQ1JBKDB4NCxwbiwweDFkKQkvKiAjIGZyYW1lcyBicm9hZGNhc3QgKi8KLSNkZWZpbmUgUkVHX1RYX01VTFRJUExFX0NPTEwocG4pIENSQSgweDQscG4sMHgxZSkJLyogIyBmcmFtZXMgdHggYWZ0ZXIgbXVsdGlwbGUgY29sbGlzaW9ucyAqLwotI2RlZmluZSBSRUdfVFhfTEFURV9DT0xMKHBuKQlDUkEoMHg0LHBuLDB4MWYpCS8qICMgbGF0ZSBjb2xsaXNpb25zIGRldGVjdGVkICovCi0jZGVmaW5lIFJFR19UWF9YQ09MTChwbikJQ1JBKDB4NCxwbiwweDIwKQkvKiAjIGZyYW1lcyBsb3N0LCBleGNlc3NpdmUgY29sbGlzaW9ucyAqLwotI2RlZmluZSBSRUdfVFhfREVGRVIocG4pCUNSQSgweDQscG4sMHgyMSkJLyogIyBmcmFtZXMgZGVmZXJyZWQgb24gZmlyc3QgdHggYXR0ZW1wdCAqLwotI2RlZmluZSBSRUdfVFhfWERFRkVSKHBuKQlDUkEoMHg0LHBuLDB4MjIpCS8qICMgZnJhbWVzIGV4Y2Vzc2l2ZWx5IGRlZmVycmVkICovCi0jZGVmaW5lIFJFR19UWF9DU0VOU0UocG4pCUNSQSgweDQscG4sMHgyMykJLyogY2FycmllciBzZW5zZSBlcnJvcnMgYXQgZnJhbWUgZW5kICovCi0jZGVmaW5lIFJFR19UWF9TSVpFXzY0KHBuKQlDUkEoMHg0LHBuLDB4MjQpCS8qICMgZnJhbWVzIDY0IG9jdGV0cyBsb25nICovCi0jZGVmaW5lIFJFR19UWF9TSVpFXzY1X1RPXzEyNyhwbikgQ1JBKDB4NCxwbiwweDI1KQkvKiAjIGZyYW1lcyA2NS0xMjcgb2N0ZXRzICovCi0jZGVmaW5lIFJFR19UWF9TSVpFXzEyOF9UT18yNTUocG4pIENSQSgweDQscG4sMHgyNikJLyogIyBmcmFtZXMgMTI4LTI1NSAqLwotI2RlZmluZSBSRUdfVFhfU0laRV8yNTZfVE9fNTExKHBuKSBDUkEoMHg0LHBuLDB4MjcpCS8qICMgZnJhbWVzIDI1Ni01MTEgKi8KLSNkZWZpbmUgUkVHX1RYX1NJWkVfNTEyX1RPXzEwMjMocG4pIENSQSgweDQscG4sMHgyOCkJLyogIyBmcmFtZXMgNTEyLTEwMjMgKi8KLSNkZWZpbmUgUkVHX1RYX1NJWkVfMTAyNF9UT18xNTE4KHBuKSBDUkEoMHg0LHBuLDB4MjkpCS8qICMgZnJhbWVzIDEwMjQtMTUxOCAqLwotI2RlZmluZSBSRUdfVFhfU0laRV8xNTE5X1RPX01BWChwbikgQ1JBKDB4NCxwbiwweDJhKQkvKiAjIGZyYW1lcyAxNTE5LW1heCAqLwotI2RlZmluZSBSRUdfVFhfU0lOR0xFX0NPTEwocG4pCUNSQSgweDQscG4sMHgyYikJLyogIyBmcmFtZXMgdHggYWZ0ZXIgc2luZ2xlIGNvbGxpc2lvbiAqLwotI2RlZmluZSBSRUdfVFhfQkFDS09GRjIocG4pCUNSQSgweDQscG4sMHgyYykJLyogIyBmcmFtZXMgdHggb2sgYWZ0ZXIgMiBiYWNrb2Zmcy9jb2xsaXNpb25zICovCi0jZGVmaW5lIFJFR19UWF9CQUNLT0ZGMyhwbikJQ1JBKDB4NCxwbiwweDJkKQkvKiAgIGFmdGVyIDMgYmFja29mZnMvY29sbGlzaW9ucyAqLwotI2RlZmluZSBSRUdfVFhfQkFDS09GRjQocG4pCUNSQSgweDQscG4sMHgyZSkJLyogICBhZnRlciA0ICovCi0jZGVmaW5lIFJFR19UWF9CQUNLT0ZGNShwbikJQ1JBKDB4NCxwbiwweDJmKQkvKiAgIGFmdGVyIDUgKi8KLSNkZWZpbmUgUkVHX1RYX0JBQ0tPRkY2KHBuKQlDUkEoMHg0LHBuLDB4MzApCS8qICAgYWZ0ZXIgNiAqLwotI2RlZmluZSBSRUdfVFhfQkFDS09GRjcocG4pCUNSQSgweDQscG4sMHgzMSkJLyogICBhZnRlciA3ICovCi0jZGVmaW5lIFJFR19UWF9CQUNLT0ZGOChwbikJQ1JBKDB4NCxwbiwweDMyKQkvKiAgIGFmdGVyIDggKi8KLSNkZWZpbmUgUkVHX1RYX0JBQ0tPRkY5KHBuKQlDUkEoMHg0LHBuLDB4MzMpCS8qICAgYWZ0ZXIgOSAqLwotI2RlZmluZSBSRUdfVFhfQkFDS09GRjEwKHBuKQlDUkEoMHg0LHBuLDB4MzQpCS8qICAgYWZ0ZXIgMTAgKi8KLSNkZWZpbmUgUkVHX1RYX0JBQ0tPRkYxMShwbikJQ1JBKDB4NCxwbiwweDM1KQkvKiAgIGFmdGVyIDExICovCi0jZGVmaW5lIFJFR19UWF9CQUNLT0ZGMTIocG4pCUNSQSgweDQscG4sMHgzNikJLyogICBhZnRlciAxMiAqLwotI2RlZmluZSBSRUdfVFhfQkFDS09GRjEzKHBuKQlDUkEoMHg0LHBuLDB4MzcpCS8qICAgYWZ0ZXIgMTMgKi8KLSNkZWZpbmUgUkVHX1RYX0JBQ0tPRkYxNChwbikJQ1JBKDB4NCxwbiwweDM4KQkvKiAgIGFmdGVyIDE0ICovCi0jZGVmaW5lIFJFR19UWF9CQUNLT0ZGMTUocG4pCUNSQSgweDQscG4sMHgzOSkJLyogICBhZnRlciAxNSAqLwotI2RlZmluZSBSRUdfVFhfVU5ERVJSVU4ocG4pCUNSQSgweDQscG4sMHgzYSkJLyogIyBmcmFtZXMgZHJvcHBlZCBmcm9tIHVuZGVycnVuICovCi0jZGVmaW5lIFJFR19SWF9YR01JSV9QUk9UX0VSUglDUkEoMHg0LDB4YSwweDNiKQkvKiAjIHByb3RvY29sIGVycm9ycyBkZXRlY3RlZCBvbiBYR01JSSBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgUkVHX1JYX0lQR19TSFJJTksocG4pCUNSQSgweDQscG4sMHgzYykJLyogIyBvZiBJUEcgc2hyaW5rcyBkZXRlY3RlZCAqLworZW51bSB7CisJUnhJbkJ5dGVzCQk9IDB4MDAsCS8vICMgUnggaW4gb2N0ZXRzCisJUnhTeW1ib2xDYXJyaWVyCQk9IDB4MDEsCS8vIEZyYW1lcyB3LyBzeW1ib2wgZXJyb3JzCisJUnhQYXVzZQkJCT0gMHgwMiwJLy8gIyBwYXVzZSBmcmFtZXMgcmVjZWl2ZWQKKwlSeFVuc3VwT3Bjb2RlCQk9IDB4MDMsCS8vICMgY29udHJvbCBmcmFtZXMgd2l0aCB1bnN1cHBvcnRlZCBvcGNvZGUKKwlSeE9rQnl0ZXMJCT0gMHgwNCwJLy8gIyBvY3RldHMgaW4gZ29vZCBmcmFtZXMKKwlSeEJhZEJ5dGVzCQk9IDB4MDUsCS8vICMgb2N0ZXRzIGluIGJhZCBmcmFtZXMKKwlSeFVuaWNhc3QJCT0gMHgwNiwJLy8gIyBnb29kIHVuaWNhc3QgZnJhbWVzCisJUnhNdWx0aWNhc3QJCT0gMHgwNywJLy8gIyBnb29kIG11bHRpY2FzdCBmcmFtZXMKKwlSeEJyb2FkY2FzdAkJPSAweDA4LAkvLyAjIGdvb2QgYnJvYWRjYXN0IGZyYW1lcworCUNyYwkJCT0gMHgwOSwJLy8gIyBmcmFtZXMgdy8gYmFkIENSQyBvbmx5CisJUnhBbGlnbm1lbnQJCT0gMHgwYSwJLy8gIyBmcmFtZXMgdy8gYWxpZ25tZW50IGVycgorCVJ4VW5kZXJzaXplCQk9IDB4MGIsCS8vICMgZnJhbWVzIHVuZGVyc2l6ZQorCVJ4RnJhZ21lbnRzCQk9IDB4MGMsCS8vICMgZnJhbWVzIHVuZGVyc2l6ZSB3LyBjcmMgZXJyCisJUnhJblJhbmdlTGVuZ3RoRXJyb3IJPSAweDBkLAkvLyAjIGZyYW1lcyB3aXRoIGxlbmd0aCBlcnJvcgorCVJ4T3V0T2ZSYW5nZUVycm9yCT0gMHgwZSwJLy8gIyBmcmFtZXMgd2l0aCBpbGxlZ2FsIGxlbmd0aCBmaWVsZAorCVJ4T3ZlcnNpemUJCT0gMHgwZiwJLy8gIyBmcmFtZXMgb3ZlcnNpemUKKwlSeEphYmJlcnMJCT0gMHgxMCwJLy8gIyBmcmFtZXMgb3ZlcnNpemUgdy8gY3JjIGVycgorCVJ4U2l6ZTY0CQk9IDB4MTEsCS8vICMgZnJhbWVzIDY0IG9jdGV0cyBsb25nCisJUnhTaXplNjVUbzEyNwkJPSAweDEyLAkvLyAjIGZyYW1lcyA2NS0xMjcgb2N0ZXRzCisJUnhTaXplMTI4VG8yNTUJCT0gMHgxMywJLy8gIyBmcmFtZXMgMTI4LTI1NQorCVJ4U2l6ZTI1NlRvNTExCQk9IDB4MTQsCS8vICMgZnJhbWVzIDI1Ni01MTEKKwlSeFNpemU1MTJUbzEwMjMJCT0gMHgxNSwJLy8gIyBmcmFtZXMgNTEyLTEwMjMKKwlSeFNpemUxMDI0VG8xNTE4CT0gMHgxNiwJLy8gIyBmcmFtZXMgMTAyNC0xNTE4CisJUnhTaXplMTUxOVRvTWF4CQk9IDB4MTcsCS8vICMgZnJhbWVzIDE1MTktbWF4CiAKLSNkZWZpbmUgUkVHX1NUQVRfU1RJQ0tZMUcocG4pCUNSQSgweDQscG4sMHgzZSkJLyogdHJpLXNwZWVkIHN0aWNreSBiaXRzICovCi0jZGVmaW5lIFJFR19TVEFUX1NUSUNLWTEwRwlDUkEoMHg0LDB4YSwweDNlKQkvKiAxMEdiRSBzdGlja3kgYml0cyAqLwotI2RlZmluZSBSRUdfU1RBVF9JTklUKHBuKQlDUkEoMHg0LHBuLDB4M2YpCS8qIENsZWFyIGFsbCBzdGF0aXN0aWNzICovCisJVHhPdXRCeXRlcwkJPSAweDE4LAkvLyAjIG9jdGV0cyB0eAorCVR4UGF1c2UJCQk9IDB4MTksCS8vICMgcGF1c2UgZnJhbWVzIHNlbnQKKwlUeE9rQnl0ZXMJCT0gMHgxYSwgLy8gIyBvY3RldHMgdHggT0sKKwlUeFVuaWNhc3QJCT0gMHgxYiwJLy8gIyBmcmFtZXMgdW5pY2FzdAorCVR4TXVsdGljYXN0CQk9IDB4MWMsCS8vICMgZnJhbWVzIG11bHRpY2FzdAorCVR4QnJvYWRjYXN0CQk9IDB4MWQsCS8vICMgZnJhbWVzIGJyb2FkY2FzdAorCVR4TXVsdGlwbGVDb2xsCQk9IDB4MWUsCS8vICMgZnJhbWVzIHR4IGFmdGVyIG11bHRpcGxlIGNvbGxpc2lvbnMKKwlUeExhdGVDb2xsCQk9IDB4MWYsCS8vICMgbGF0ZSBjb2xsaXNpb25zIGRldGVjdGVkCisJVHhYY29sbAkJCT0gMHgyMCwJLy8gIyBmcmFtZXMgbG9zdCwgZXhjZXNzaXZlIGNvbGxpc2lvbnMKKwlUeERlZmVyCQkJPSAweDIxLAkvLyAjIGZyYW1lcyBkZWZlcnJlZCBvbiBmaXJzdCB0eCBhdHRlbXB0CisJVHhYZGVmZXIJCT0gMHgyMiwJLy8gIyBmcmFtZXMgZXhjZXNzaXZlbHkgZGVmZXJyZWQKKwlUeENzZW5zZQkJPSAweDIzLAkvLyBjYXJyaWVyIHNlbnNlIGVycm9ycyBhdCBmcmFtZSBlbmQKKwlUeFNpemU2NAkJPSAweDI0LAkvLyAjIGZyYW1lcyA2NCBvY3RldHMgbG9uZworCVR4U2l6ZTY1VG8xMjcJCT0gMHgyNSwJLy8gIyBmcmFtZXMgNjUtMTI3IG9jdGV0cworCVR4U2l6ZTEyOFRvMjU1CQk9IDB4MjYsCS8vICMgZnJhbWVzIDEyOC0yNTUKKwlUeFNpemUyNTZUbzUxMQkJPSAweDI3LAkvLyAjIGZyYW1lcyAyNTYtNTExCisJVHhTaXplNTEyVG8xMDIzCQk9IDB4MjgsCS8vICMgZnJhbWVzIDUxMi0xMDIzCisJVHhTaXplMTAyNFRvMTUxOAk9IDB4MjksCS8vICMgZnJhbWVzIDEwMjQtMTUxOAorCVR4U2l6ZTE1MTlUb01heAkJPSAweDJhLAkvLyAjIGZyYW1lcyAxNTE5LW1heAorCVR4U2luZ2xlQ29sbAkJPSAweDJiLAkvLyAjIGZyYW1lcyB0eCBhZnRlciBzaW5nbGUgY29sbGlzaW9uCisJVHhCYWNrb2ZmMgkJPSAweDJjLAkvLyAjIGZyYW1lcyB0eCBvayBhZnRlciAyIGJhY2tvZmZzL2NvbGxpc2lvbnMKKwlUeEJhY2tvZmYzCQk9IDB4MmQsCS8vICAgYWZ0ZXIgMyBiYWNrb2Zmcy9jb2xsaXNpb25zCisJVHhCYWNrb2ZmNAkJPSAweDJlLAkvLyAgIGFmdGVyIDQKKwlUeEJhY2tvZmY1CQk9IDB4MmYsCS8vICAgYWZ0ZXIgNQorCVR4QmFja29mZjYJCT0gMHgzMCwJLy8gICBhZnRlciA2CisJVHhCYWNrb2ZmNwkJPSAweDMxLAkvLyAgIGFmdGVyIDcKKwlUeEJhY2tvZmY4CQk9IDB4MzIsCS8vICAgYWZ0ZXIgOAorCVR4QmFja29mZjkJCT0gMHgzMywJLy8gICBhZnRlciA5CisJVHhCYWNrb2ZmMTAJCT0gMHgzNCwJLy8gICBhZnRlciAxMAorCVR4QmFja29mZjExCQk9IDB4MzUsCS8vICAgYWZ0ZXIgMTEKKwlUeEJhY2tvZmYxMgkJPSAweDM2LAkvLyAgIGFmdGVyIDEyCisJVHhCYWNrb2ZmMTMJCT0gMHgzNywJLy8gICBhZnRlciAxMworCVR4QmFja29mZjE0CQk9IDB4MzgsCS8vICAgYWZ0ZXIgMTQKKwlUeEJhY2tvZmYxNQkJPSAweDM5LAkvLyAgIGFmdGVyIDE1CisJVHhVbmRlcnJ1bgkJPSAweDNhLAkvLyAjIGZyYW1lcyBkcm9wcGVkIGZyb20gdW5kZXJydW4KKwkvLyBIb2xlLiBTZWUgUkVHX1JYX1hHTUlJX1BST1RfRVJSIGJlbG93LgorCVJ4SXBnU2hyaW5rCQk9IDB4M2MsCS8vICMgb2YgSVBHIHNocmlua3MgZGV0ZWN0ZWQKKwkvLyBEdXBsaWNhdGUuIFNlZSBSRUdfU1RBVF9TVElDS1kxMEcgYmVsb3cuCisJU3RhdFN0aWNreTFHCQk9IDB4M2UsCS8vIHRyaS1zcGVlZCBzdGlja3kgYml0cworCVN0YXRJbml0CQk9IDB4M2YJLy8gQ2xlYXIgYWxsIHN0YXRpc3RpY3MKK307CisKKyNkZWZpbmUgUkVHX1JYX1hHTUlJX1BST1RfRVJSCUNSQSgweDQsMHhhLDB4M2IpCQkvKiAjIHByb3RvY29sIGVycm9ycyBkZXRlY3RlZCBvbiBYR01JSSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgUkVHX1NUQVRfU1RJQ0tZMTBHCUNSQSgweDQsMHhhLFN0YXRTdGlja3kxRykJLyogMTBHYkUgc3RpY2t5IGJpdHMgKi8KKworI2RlZmluZSBSRUdfUlhfT0tfQllURVMocG4pCUNSQSgweDQscG4sUnhPa0J5dGVzKQorI2RlZmluZSBSRUdfUlhfQkFEX0JZVEVTKHBuKQlDUkEoMHg0LHBuLFJ4QmFkQnl0ZXMpCisjZGVmaW5lIFJFR19UWF9PS19CWVRFUyhwbikJQ1JBKDB4NCxwbixUeE9rQnl0ZXMpCiAKIC8qIE1JSS1NYW5hZ2VtZW50IEJsb2NrIHJlZ2lzdGVycyAqLwogLyogVGhlc2UgYXJlIGZvciBNSUktTSBpbnRlcmZhY2UgMCwgd2hpY2ggaXMgdGhlIGJpZGlyZWN0aW9uYWwgTFZUVEwgb25lLiAgSWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NoZWxzaW8vdnNjODI0NC5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby92c2M4MjQ0LmMKaW5kZXggYzQ5M2U3OC4uMjUxZDQ4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2hlbHNpby92c2M4MjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvY2hlbHNpby92c2M4MjQ0LmMKQEAgLTU0LDcgKzU0LDcgQEAKIH07CiAKICNkZWZpbmUgQ0ZHX0NIR19JTlRSX01BU0sgKFZTQ19JTlRSX0xJTktfQ0hHIHwgVlNDX0lOVFJfTkVHX0VSUiB8IFwKLQkgCQkgICBWU0NfSU5UUl9ORUdfRE9ORSkKKwkJCSAgIFZTQ19JTlRSX05FR19ET05FKQogI2RlZmluZSBJTlRSX01BU0sgKENGR19DSEdfSU5UUl9NQVNLIHwgVlNDX0lOVFJfVFhfRklGTyB8IFZTQ19JTlRSX1JYX0ZJRk8gfCBcCiAJCSAgIFZTQ19JTlRSX0VOQUJMRSkKIApAQCAtOTQsMTkgKzk0LDE4IEBACiB7CiAJc2ltcGxlX21kaW9fd3JpdGUoY3BoeSwgVlNDODI0NF9JTlRSX0VOQUJMRSwgSU5UUl9NQVNLKTsKIAotICAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzIHRocm91Z2ggRWxtZXIgKi8KKwkvKiBFbmFibGUgaW50ZXJydXB0cyB0aHJvdWdoIEVsbWVyICovCiAJaWYgKHQxX2lzX2FzaWMoY3BoeS0+YWRhcHRlcikpIHsKIAkJdTMyIGVsbWVyOwogCiAJCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9FTkFCTEUsICZlbG1lcik7CiAJCWVsbWVyIHw9IEVMTUVSMF9HUF9CSVQxOwotCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpIHsKKwkJaWYgKGlzX1QyKGNwaHktPmFkYXB0ZXIpKQogCQkgICAgZWxtZXIgfD0gRUxNRVIwX0dQX0JJVDJ8RUxNRVIwX0dQX0JJVDN8RUxNRVIwX0dQX0JJVDQ7Ci0gICAgICAgICAgICAgICAgfQogCQl0MV90cGlfd3JpdGUoY3BoeS0+YWRhcHRlciwgQV9FTE1FUjBfSU5UX0VOQUJMRSwgZWxtZXIpOwogCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZzYzgyNDRfaW50cl9kaXNhYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQpAQCAtMTE4LDE5ICsxMTcsMTggQEAKIAogCQl0MV90cGlfcmVhZChjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCAmZWxtZXIpOwogCQllbG1lciAmPSB+RUxNRVIwX0dQX0JJVDE7Ci0JCWlmIChpc19UMihjcGh5LT5hZGFwdGVyKSkgeworCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpCiAJCSAgICBlbG1lciAmPSB+KEVMTUVSMF9HUF9CSVQyfEVMTUVSMF9HUF9CSVQzfEVMTUVSMF9HUF9CSVQ0KTsKLSAgICAgICAgICAgICAgICB9CiAJCXQxX3RwaV93cml0ZShjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfRU5BQkxFLCBlbG1lcik7CiAJfQogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdnNjODI0NF9pbnRyX2NsZWFyKHN0cnVjdCBjcGh5ICpjcGh5KQogewogCXUzMiB2YWw7Ci0gICAgdTMyIGVsbWVyOworCXUzMiBlbG1lcjsKIAogCS8qIENsZWFyIFBIWSBpbnRlcnJ1cHRzIGJ5IHJlYWRpbmcgdGhlIHJlZ2lzdGVyLiAqLwogCXNpbXBsZV9tZGlvX3JlYWQoY3BoeSwgVlNDODI0NF9JTlRSX0VOQUJMRSwgJnZhbCk7CkBAIC0xMzgsMTMgKzEzNiwxMiBAQAogCWlmICh0MV9pc19hc2ljKGNwaHktPmFkYXB0ZXIpKSB7CiAJCXQxX3RwaV9yZWFkKGNwaHktPmFkYXB0ZXIsIEFfRUxNRVIwX0lOVF9DQVVTRSwgJmVsbWVyKTsKIAkJZWxtZXIgfD0gRUxNRVIwX0dQX0JJVDE7Ci0JCWlmIChpc19UMihjcGh5LT5hZGFwdGVyKSkgeworCQlpZiAoaXNfVDIoY3BoeS0+YWRhcHRlcikpCiAJCSAgICBlbG1lciB8PSBFTE1FUjBfR1BfQklUMnxFTE1FUjBfR1BfQklUM3xFTE1FUjBfR1BfQklUNDsKLSAgICAgICAgICAgICAgICB9CiAJCXQxX3RwaV93cml0ZShjcGh5LT5hZGFwdGVyLCBBX0VMTUVSMF9JTlRfQ0FVU0UsIGVsbWVyKTsKIAl9CiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE3OSwxMyArMTc2LDEzIEBACiAKIGludCB0MV9tZGlvX3NldF9iaXRzKHN0cnVjdCBjcGh5ICpwaHksIGludCBtbWQsIGludCByZWcsIHVuc2lnbmVkIGludCBiaXRzKQogewotICAgIGludCByZXQ7Ci0gICAgdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCB2YWw7CiAKLSAgICByZXQgPSBtZGlvX3JlYWQocGh5LCBtbWQsIHJlZywgJnZhbCk7Ci0gICAgaWYgKCFyZXQpCi0gICAgICAgIHJldCA9IG1kaW9fd3JpdGUocGh5LCBtbWQsIHJlZywgdmFsIHwgYml0cyk7Ci0gICAgcmV0dXJuIHJldDsKKwlyZXQgPSBtZGlvX3JlYWQocGh5LCBtbWQsIHJlZywgJnZhbCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG1kaW9fd3JpdGUocGh5LCBtbWQsIHJlZywgdmFsIHwgYml0cyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCB2c2M4MjQ0X2F1dG9uZWdfZW5hYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQpAQCAtMjM1LDcgKzIzMiw3IEBACiB9CiAKIHN0YXRpYyBpbnQgdnNjODI0NF9nZXRfbGlua19zdGF0dXMoc3RydWN0IGNwaHkgKmNwaHksIGludCAqbGlua19vaywKLQkJCQkgICAgIGludCAqc3BlZWQsIGludCAqZHVwbGV4LCBpbnQgKmZjKQorCQkJCSAgIGludCAqc3BlZWQsIGludCAqZHVwbGV4LCBpbnQgKmZjKQogewogCXVuc2lnbmVkIGludCBibWNyLCBzdGF0dXMsIGxwYSwgYWR2OwogCWludCBlcnIsIHNwID0gLTEsIGRwbHggPSAtMSwgcGF1c2UgPSAwOwpAQCAtMzQzLDExICszNDAsMTMgQEAKIAkuZ2V0X2xpbmtfc3RhdHVzICAgICAgPSB2c2M4MjQ0X2dldF9saW5rX3N0YXR1cwogfTsKIAotc3RhdGljIHN0cnVjdCBjcGh5KiB2c2M4MjQ0X3BoeV9jcmVhdGUoYWRhcHRlcl90ICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpCitzdGF0aWMgc3RydWN0IGNwaHkqIHZzYzgyNDRfcGh5X2NyZWF0ZShhZGFwdGVyX3QgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwKKwkJCQkgICAgICAgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKIHsKIAlzdHJ1Y3QgY3BoeSAqY3BoeSA9IGt6YWxsb2Moc2l6ZW9mKCpjcGh5KSwgR0ZQX0tFUk5FTCk7CiAKLQlpZiAoIWNwaHkpIHJldHVybiBOVUxMOworCWlmICghY3BoeSkKKwkJcmV0dXJuIE5VTEw7CiAKIAljcGh5X2luaXQoY3BoeSwgYWRhcHRlciwgcGh5X2FkZHIsICZ2c2M4MjQ0X29wcywgbWRpb19vcHMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2N4Z2IzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzQ2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgQ2hlbHNpbyBUMyBkcml2ZXIKKyMKKworb2JqLSQoQ09ORklHX0NIRUxTSU9fVDMpICs9IGN4Z2IzLm8KKworY3hnYjMtb2JqcyA6PSBjeGdiM19tYWluLm8gYWVsMTAwMi5vIHZzYzgyMTEubyB0M19ody5vIG1jNS5vIFwKKwkgICAgICB4Z21hYy5vIHNnZS5vIGwydC5vIGN4Z2IzX29mZmxvYWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvYWRhcHRlci5oIGIvZHJpdmVycy9uZXQvY3hnYjMvYWRhcHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTdhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9hZGFwdGVyLmgKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisvKiBUaGlzIGZpbGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBkaXJlY3RseS4gIEluY2x1ZGUgY29tbW9uLmggaW5zdGVhZC4gKi8KKworI2lmbmRlZiBfX1QzX0FEQVBURVJfSF9fCisjZGVmaW5lIF9fVDNfQURBUFRFUl9IX18KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSAidDNjZGV2LmgiCisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKwordHlwZWRlZiBpcnFyZXR1cm5fdCgqaW50cl9oYW5kbGVyX3QpIChpbnQsIHZvaWQgKik7CisKK3N0cnVjdCB2bGFuX2dyb3VwOworCitzdHJ1Y3QgcG9ydF9pbmZvIHsKKwlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncnA7CisJY29uc3Qgc3RydWN0IHBvcnRfdHlwZV9pbmZvICpwb3J0X3R5cGU7CisJdTggcG9ydF9pZDsKKwl1OCByeF9jc3VtX29mZmxvYWQ7CisJdTggbnFzZXRzOworCXU4IGZpcnN0X3FzZXQ7CisJc3RydWN0IGNwaHkgcGh5OworCXN0cnVjdCBjbWFjIG1hYzsKKwlzdHJ1Y3QgbGlua19jb25maWcgbGlua19jb25maWc7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0c3RhdHM7CisJaW50IGFjdGl2aXR5OworfTsKKworZW51bSB7CQkJCS8qIGFkYXB0ZXIgZmxhZ3MgKi8KKwlGVUxMX0lOSVRfRE9ORSA9ICgxIDw8IDApLAorCVVTSU5HX01TSSA9ICgxIDw8IDEpLAorCVVTSU5HX01TSVggPSAoMSA8PCAyKSwKKwlRVUVVRVNfQk9VTkQgPSAoMSA8PCAzKSwKK307CisKK3N0cnVjdCByeF9kZXNjOworc3RydWN0IHJ4X3N3X2Rlc2M7CisKK3N0cnVjdCBzZ2VfZmwgewkJCS8qIFNHRSBwZXIgZnJlZS1idWZmZXIgbGlzdCBzdGF0ZSAqLworCXVuc2lnbmVkIGludCBidWZfc2l6ZTsJLyogc2l6ZSBvZiBlYWNoIFJ4IGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCBjcmVkaXRzOwkvKiAjIG9mIGF2YWlsYWJsZSBSeCBidWZmZXJzICovCisJdW5zaWduZWQgaW50IHNpemU7CS8qIGNhcGFjaXR5IG9mIGZyZWUgbGlzdCAqLworCXVuc2lnbmVkIGludCBjaWR4OwkvKiBjb25zdW1lciBpbmRleCAqLworCXVuc2lnbmVkIGludCBwaWR4OwkvKiBwcm9kdWNlciBpbmRleCAqLworCXVuc2lnbmVkIGludCBnZW47CS8qIGZyZWUgbGlzdCBnZW5lcmF0aW9uICovCisJc3RydWN0IHJ4X2Rlc2MgKmRlc2M7CS8qIGFkZHJlc3Mgb2YgSFcgUnggZGVzY3JpcHRvciByaW5nICovCisJc3RydWN0IHJ4X3N3X2Rlc2MgKnNkZXNjOwkvKiBhZGRyZXNzIG9mIFNXIFJ4IGRlc2NyaXB0b3IgcmluZyAqLworCWRtYV9hZGRyX3QgcGh5c19hZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIEhXIHJpbmcgc3RhcnQgKi8KKwl1bnNpZ25lZCBpbnQgY250eHRfaWQ7CS8qIFNHRSBjb250ZXh0IGlkIGZvciB0aGUgZnJlZSBsaXN0ICovCisJdW5zaWduZWQgbG9uZyBlbXB0eTsJLyogIyBvZiB0aW1lcyBxdWV1ZSByYW4gb3V0IG9mIGJ1ZmZlcnMgKi8KK307CisKKy8qCisgKiBCdW5kbGUgc2l6ZSBmb3IgZ3JvdXBpbmcgb2ZmbG9hZCBSWCBwYWNrZXRzIGZvciBkZWxpdmVyeSB0byB0aGUgc3RhY2suCisgKiBEb24ndCBtYWtlIHRoaXMgdG9vIGJpZyBhcyB3ZSBkbyBwcmVmZXRjaCBvbiBlYWNoIHBhY2tldCBpbiBhIGJ1bmRsZS4KKyAqLworIyBkZWZpbmUgUlhfQlVORExFX1NJWkUgOAorCitzdHJ1Y3QgcnNwX2Rlc2M7CisKK3N0cnVjdCBzZ2VfcnNwcSB7CQkvKiBzdGF0ZSBmb3IgYW4gU0dFIHJlc3BvbnNlIHF1ZXVlICovCisJdW5zaWduZWQgaW50IGNyZWRpdHM7CS8qICMgb2YgcGVuZGluZyByZXNwb25zZSBjcmVkaXRzICovCisJdW5zaWduZWQgaW50IHNpemU7CS8qIGNhcGFjaXR5IG9mIHJlc3BvbnNlIHF1ZXVlICovCisJdW5zaWduZWQgaW50IGNpZHg7CS8qIGNvbnN1bWVyIGluZGV4ICovCisJdW5zaWduZWQgaW50IGdlbjsJLyogY3VycmVudCBnZW5lcmF0aW9uIGJpdCAqLworCXVuc2lnbmVkIGludCBwb2xsaW5nOwkvKiBpcyB0aGUgcXVldWUgc2VydmljZWQgdGhyb3VnaCBOQVBJPyAqLworCXVuc2lnbmVkIGludCBob2xkb2ZmX3RtcjsJLyogaW50ZXJydXB0IGhvbGRvZmYgdGltZXIgaW4gMTAwbnMgKi8KKwl1bnNpZ25lZCBpbnQgbmV4dF9ob2xkb2ZmOwkvKiBob2xkb2ZmIHRpbWUgZm9yIG5leHQgaW50ZXJydXB0ICovCisJc3RydWN0IHJzcF9kZXNjICpkZXNjOwkvKiBhZGRyZXNzIG9mIEhXIHJlc3BvbnNlIHJpbmcgKi8KKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcmluZyAqLworCXVuc2lnbmVkIGludCBjbnR4dF9pZDsJLyogU0dFIGNvbnRleHQgaWQgZm9yIHRoZSByZXNwb25zZSBxICovCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBndWFyZHMgcmVzcG9uc2UgcHJvY2Vzc2luZyAqLworCXN0cnVjdCBza19idWZmICpyeF9oZWFkOwkvKiBvZmZsb2FkIHBhY2tldCByZWNlaXZlIHF1ZXVlIGhlYWQgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfdGFpbDsJLyogb2ZmbG9hZCBwYWNrZXQgcmVjZWl2ZSBxdWV1ZSB0YWlsICovCisKKwl1bnNpZ25lZCBsb25nIG9mZmxvYWRfcGt0czsKKwl1bnNpZ25lZCBsb25nIG9mZmxvYWRfYnVuZGxlczsKKwl1bnNpZ25lZCBsb25nIGV0aF9wa3RzOwkvKiAjIG9mIGV0aGVybmV0IHBhY2tldHMgKi8KKwl1bnNpZ25lZCBsb25nIHB1cmVfcnNwczsJLyogIyBvZiBwdXJlIChub24tZGF0YSkgcmVzcG9uc2VzICovCisJdW5zaWduZWQgbG9uZyBpbW1fZGF0YTsJLyogcmVzcG9uc2VzIHdpdGggaW1tZWRpYXRlIGRhdGEgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Ryb3BzOwkvKiAjIG9mIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8gbm8gbWVtICovCisJdW5zaWduZWQgbG9uZyBhc3luY19ub3RpZjsgLyogIyBvZiBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9uIGV2ZW50cyAqLworCXVuc2lnbmVkIGxvbmcgZW1wdHk7CS8qICMgb2YgdGltZXMgcXVldWUgcmFuIG91dCBvZiBjcmVkaXRzICovCisJdW5zaWduZWQgbG9uZyBub21lbTsJLyogIyBvZiByZXNwb25zZXMgZGVmZXJyZWQgZHVlIHRvIG5vIG1lbSAqLworCXVuc2lnbmVkIGxvbmcgdW5oYW5kbGVkX2lycXM7CS8qICMgb2Ygc3B1cmlvdXMgaW50cnMgKi8KK307CisKK3N0cnVjdCB0eF9kZXNjOworc3RydWN0IHR4X3N3X2Rlc2M7CisKK3N0cnVjdCBzZ2VfdHhxIHsJCS8qIHN0YXRlIGZvciBhbiBTR0UgVHggcXVldWUgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBIVyBETUEgZmV0Y2ggc3RhdHVzICovCisJdW5zaWduZWQgaW50IGluX3VzZTsJLyogIyBvZiBpbi11c2UgVHggZGVzY3JpcHRvcnMgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogIyBvZiBkZXNjcmlwdG9ycyAqLworCXVuc2lnbmVkIGludCBwcm9jZXNzZWQ7CS8qIHRvdGFsICMgb2YgZGVzY3MgSFcgaGFzIHByb2Nlc3NlZCAqLworCXVuc2lnbmVkIGludCBjbGVhbmVkOwkvKiB0b3RhbCAjIG9mIGRlc2NzIFNXIGhhcyByZWNsYWltZWQgKi8KKwl1bnNpZ25lZCBpbnQgc3RvcF90aHJlczsJLyogU1cgVFggcXVldWUgc3VzcGVuZCB0aHJlc2hvbGQgKi8KKwl1bnNpZ25lZCBpbnQgY2lkeDsJLyogY29uc3VtZXIgaW5kZXggKi8KKwl1bnNpZ25lZCBpbnQgcGlkeDsJLyogcHJvZHVjZXIgaW5kZXggKi8KKwl1bnNpZ25lZCBpbnQgZ2VuOwkvKiBjdXJyZW50IHZhbHVlIG9mIGdlbmVyYXRpb24gYml0ICovCisJdW5zaWduZWQgaW50IHVuYWNrZWQ7CS8qIFR4IGRlc2NyaXB0b3JzIHVzZWQgc2luY2UgbGFzdCBDT01QTCAqLworCXN0cnVjdCB0eF9kZXNjICpkZXNjOwkvKiBhZGRyZXNzIG9mIEhXIFR4IGRlc2NyaXB0b3IgcmluZyAqLworCXN0cnVjdCB0eF9zd19kZXNjICpzZGVzYzsJLyogYWRkcmVzcyBvZiBTVyBUeCBkZXNjcmlwdG9yIHJpbmcgKi8KKwlzcGlubG9ja190IGxvY2s7CS8qIGd1YXJkcyBlbnF1ZXVlaW5nIG9mIG5ldyBwYWNrZXRzICovCisJdW5zaWduZWQgaW50IHRva2VuOwkvKiBXUiB0b2tlbiAqLworCWRtYV9hZGRyX3QgcGh5c19hZGRyOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSByaW5nICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZCBzZW5kcTsJLyogTGlzdCBvZiBiYWNrcHJlc3N1cmVkIG9mZmxvYWQgcGFja2V0cyAqLworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBxcmVzdW1lX3RzazsJLyogcmVzdGFydHMgdGhlIHF1ZXVlICovCisJdW5zaWduZWQgaW50IGNudHh0X2lkOwkvKiBTR0UgY29udGV4dCBpZCBmb3IgdGhlIFR4IHEgKi8KKwl1bnNpZ25lZCBsb25nIHN0b3BzOwkvKiAjIG9mIHRpbWVzIHEgaGFzIGJlZW4gc3RvcHBlZCAqLworCXVuc2lnbmVkIGxvbmcgcmVzdGFydHM7CS8qICMgb2YgcXVldWUgcmVzdGFydHMgKi8KK307CisKK2VudW0gewkJCQkvKiBwZXIgcG9ydCBTR0Ugc3RhdGlzdGljcyAqLworCVNHRV9QU1RBVF9UU08sCQkvKiAjIG9mIFRTTyByZXF1ZXN0cyAqLworCVNHRV9QU1RBVF9SWF9DU1VNX0dPT0QsCS8qICMgb2Ygc3VjY2Vzc2Z1bCBSWCBjc3VtIG9mZmxvYWRzICovCisJU0dFX1BTVEFUX1RYX0NTVU0sCS8qICMgb2YgVFggY2hlY2tzdW0gb2ZmbG9hZHMgKi8KKwlTR0VfUFNUQVRfVkxBTkVYLAkvKiAjIG9mIFZMQU4gdGFnIGV4dHJhY3Rpb25zICovCisJU0dFX1BTVEFUX1ZMQU5JTlMsCS8qICMgb2YgVkxBTiB0YWcgaW5zZXJ0aW9ucyAqLworCisJU0dFX1BTVEFUX01BWAkJLyogbXVzdCBiZSBsYXN0ICovCit9OworCitzdHJ1Y3Qgc2dlX3FzZXQgewkJLyogYW4gU0dFIHF1ZXVlIHNldCAqLworCXN0cnVjdCBzZ2VfcnNwcSByc3BxOworCXN0cnVjdCBzZ2VfZmwgZmxbU0dFX1JYUV9QRVJfU0VUXTsKKwlzdHJ1Y3Qgc2dlX3R4cSB0eHFbU0dFX1RYUV9QRVJfU0VUXTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwkvKiBhc3NvY2lhdGVkIG5ldCBkZXZpY2UgKi8KKwl1bnNpZ25lZCBsb25nIHR4cV9zdG9wcGVkOwkvKiB3aGljaCBUeCBxdWV1ZXMgYXJlIHN0b3BwZWQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCB0eF9yZWNsYWltX3RpbWVyOwkvKiByZWNsYWltcyBUWCBidWZmZXJzICovCisJdW5zaWduZWQgbG9uZyBwb3J0X3N0YXRzW1NHRV9QU1RBVF9NQVhdOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0cnVjdCBzZ2UgeworCXN0cnVjdCBzZ2VfcXNldCBxc1tTR0VfUVNFVFNdOworCXNwaW5sb2NrX3QgcmVnX2xvY2s7CS8qIGd1YXJkcyBub24tYXRvbWljIFNHRSByZWdpc3RlcnMgKGVnIGNvbnRleHQpICovCit9OworCitzdHJ1Y3QgYWRhcHRlciB7CisJc3RydWN0IHQzY2RldiB0ZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgYWRhcHRlcl9saXN0OworCXZvaWQgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1bnNpZ25lZCBsb25nIHJlZ2lzdGVyZWRfZGV2aWNlX21hcDsKKwl1bnNpZ25lZCBsb25nIG9wZW5fZGV2aWNlX21hcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbXNnX2VuYWJsZTsKKwl1bnNpZ25lZCBpbnQgbW1pb19sZW47CisKKwlzdHJ1Y3QgYWRhcHRlcl9wYXJhbXMgcGFyYW1zOworCXVuc2lnbmVkIGludCBzbG93X2ludHJfbWFzazsKKwl1bnNpZ25lZCBsb25nIGlycV9zdGF0c1tJUlFfTlVNX1NUQVRTXTsKKworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0IHZlYzsKKwkJY2hhciBkZXNjWzIyXTsKKwl9IG1zaXhfaW5mb1tTR0VfUVNFVFMgKyAxXTsKKworCS8qIFQzIG1vZHVsZXMgKi8KKwlzdHJ1Y3Qgc2dlIHNnZTsKKwlzdHJ1Y3QgbWM3IHBtcng7CisJc3RydWN0IG1jNyBwbXR4OworCXN0cnVjdCBtYzcgY207CisJc3RydWN0IG1jNSBtYzU7CisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcG9ydFtNQVhfTlBPUlRTXTsKKwl1bnNpZ25lZCBpbnQgY2hlY2tfdGFza19jbnQ7CisJc3RydWN0IGRlbGF5ZWRfd29yayBhZGFwX2NoZWNrX3Rhc2s7CisJc3RydWN0IHdvcmtfc3RydWN0IGV4dF9pbnRyX2hhbmRsZXJfdGFzazsKKworCS8qCisJICogRHVtbXkgbmV0ZGV2aWNlcyBhcmUgbmVlZGVkIHdoZW4gdXNpbmcgbXVsdGlwbGUgcmVjZWl2ZSBxdWV1ZXMgd2l0aAorCSAqIE5BUEkgYXMgZWFjaCBuZXRkZXZpY2UgY2FuIHNlcnZpY2Ugb25seSBvbmUgcXVldWUuCisJICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmR1bW15X25ldGRldltTR0VfUVNFVFMgLSAxXTsKKworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcm9vdDsKKworCXN0cnVjdCBtdXRleCBtZGlvX2xvY2s7CisJc3BpbmxvY2tfdCBzdGF0c19sb2NrOworCXNwaW5sb2NrX3Qgd29ya19sb2NrOworfTsKKworc3RhdGljIGlubGluZSB1MzIgdDNfcmVhZF9yZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiByZWdfYWRkcikKK3sKKwl1MzIgdmFsID0gcmVhZGwoYWRhcHRlci0+cmVncyArIHJlZ19hZGRyKTsKKworCUNIX0RCRyhhZGFwdGVyLCBNTUlPLCAicmVhZCByZWdpc3RlciAweCV4IHZhbHVlIDB4JXhcbiIsIHJlZ19hZGRyLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0M193cml0ZV9yZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiByZWdfYWRkciwgdTMyIHZhbCkKK3sKKwlDSF9EQkcoYWRhcHRlciwgTU1JTywgInNldHRpbmcgcmVnaXN0ZXIgMHgleCB0byAweCV4XG4iLCByZWdfYWRkciwgdmFsKTsKKwl3cml0ZWwodmFsLCBhZGFwdGVyLT5yZWdzICsgcmVnX2FkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3J0X2luZm8gKmFkYXAycGluZm8oc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGludCBpZHgpCit7CisJcmV0dXJuIG5ldGRldl9wcml2KGFkYXAtPnBvcnRbaWR4XSk7Cit9CisKKy8qCisgKiBXZSB1c2UgdGhlIHNwYXJlIGF0YWxrX3B0ciB0byBtYXAgYSBuZXQgZGV2aWNlIHRvIGl0cyBTR0UgcXVldWUgc2V0LgorICogVGhpcyBpcyBhIG1hY3JvIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGwtdmFsdWUuCisgKi8KKyNkZWZpbmUgZGV2MnFzZXQobmV0ZGV2KSAoKG5ldGRldiktPmF0YWxrX3B0cikKKworI2RlZmluZSBPRkZMT0FEX0RFVk1BUF9CSVQgMTUKKworI2RlZmluZSB0ZGV2MmFkYXAoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBhZGFwdGVyLCB0ZGV2KQorCitzdGF0aWMgaW5saW5lIGludCBvZmZsb2FkX3J1bm5pbmcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIHRlc3RfYml0KE9GRkxPQURfREVWTUFQX0JJVCwgJmFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCk7Cit9CisKK2ludCB0M19vZmZsb2FkX3R4KHN0cnVjdCB0M2NkZXYgKnRkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCit2b2lkIHQzX29zX2V4dF9pbnRyX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCB0M19vc19saW5rX2NoYW5nZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0X2lkLCBpbnQgbGlua19zdGF0dXMsCisJCQlpbnQgc3BlZWQsIGludCBkdXBsZXgsIGludCBmYyk7CisKK3ZvaWQgdDNfc2dlX3N0YXJ0KHN0cnVjdCBhZGFwdGVyICphZGFwKTsKK3ZvaWQgdDNfc2dlX3N0b3Aoc3RydWN0IGFkYXB0ZXIgKmFkYXApOwordm9pZCB0M19mcmVlX3NnZV9yZXNvdXJjZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXApOwordm9pZCB0M19zZ2VfZXJyX2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CitpbnRyX2hhbmRsZXJfdCB0M19pbnRyX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGludCBwb2xsaW5nKTsKK2ludCB0M19ldGhfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCB0M19tZ210X3R4KHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgdDNfdXBkYXRlX3FzZXRfY29hbGVzY2Uoc3RydWN0IHNnZV9xc2V0ICpxcywgY29uc3Qgc3RydWN0IHFzZXRfcGFyYW1zICpwKTsKK2ludCB0M19zZ2VfYWxsb2NfcXNldChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGlkLCBpbnQgbnBvcnRzLAorCQkgICAgICBpbnQgaXJxX3ZlY19pZHgsIGNvbnN0IHN0cnVjdCBxc2V0X3BhcmFtcyAqcCwKKwkJICAgICAgaW50IG50eHEsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworaW50IHQzX2dldF9kZXNjKGNvbnN0IHN0cnVjdCBzZ2VfcXNldCAqcXMsIHVuc2lnbmVkIGludCBxbnVtLCB1bnNpZ25lZCBpbnQgaWR4LAorCQl1bnNpZ25lZCBjaGFyICpkYXRhKTsKK2lycXJldHVybl90IHQzX3NnZV9pbnRyX21zaXgoaW50IGlycSwgdm9pZCAqY29va2llKTsKKworI2VuZGlmCQkJCS8qIF9fVDNfQURBUFRFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2FlbDEwMDIuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2FlbDEwMDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E0MWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvYWVsMTAwMi5jCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJyZWdzLmgiCisKK2VudW0geworCUFFTDEwMFhfVFhfRElTQUJMRSA9IDksCisJQUVMMTAwWF9UWF9DT05GSUcxID0gMHhjMDAyLAorCUFFTDEwMDJfUFdSX0RPV05fSEkgPSAweGMwMTEsCisJQUVMMTAwMl9QV1JfRE9XTl9MTyA9IDB4YzAxMiwKKwlBRUwxMDAyX1hGSV9FUUwgPSAweGMwMTUsCisJQUVMMTAwMl9MQl9FTiA9IDB4YzAxNywKKworCUxBU0lfQ1RSTCA9IDB4OTAwMiwKKwlMQVNJX1NUQVQgPSAweDkwMDUKK307CisKK3N0YXRpYyB2b2lkIGFlbDEwMHhfdHhvbihzdHJ1Y3QgY3BoeSAqcGh5KQoreworCWludCB0eF9vbl9ncGlvID0gcGh5LT5hZGRyID09IDAgPyBGX0dQSU83X09VVF9WQUwgOiBGX0dQSU8yX09VVF9WQUw7CisKKwltc2xlZXAoMTAwKTsKKwl0M19zZXRfcmVnX2ZpZWxkKHBoeS0+YWRhcHRlciwgQV9UM0RCR19HUElPX0VOLCAwLCB0eF9vbl9ncGlvKTsKKwltc2xlZXAoMzApOworfQorCitzdGF0aWMgaW50IGFlbDEwMDJfcG93ZXJfZG93bihzdHJ1Y3QgY3BoeSAqcGh5LCBpbnQgZW5hYmxlKQoreworCWludCBlcnI7CisKKwllcnIgPSBtZGlvX3dyaXRlKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgQUVMMTAwWF9UWF9ESVNBQkxFLCAhIWVuYWJsZSk7CisJaWYgKCFlcnIpCisJCWVyciA9IHQzX21kaW9fY2hhbmdlX2JpdHMocGh5LCBNRElPX0RFVl9QTUFfUE1ELCBNSUlfQk1DUiwKKwkJCQkJICBCTUNSX1BET1dOLCBlbmFibGUgPyBCTUNSX1BET1dOIDogMCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhZWwxMDAyX3Jlc2V0KHN0cnVjdCBjcGh5ICpwaHksIGludCB3YWl0KQoreworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGFlbDEwMDJfcG93ZXJfZG93bihwaHksIDApKSB8fAorCSAgICAoZXJyID0gbWRpb193cml0ZShwaHksIE1ESU9fREVWX1BNQV9QTUQsIEFFTDEwMFhfVFhfQ09ORklHMSwgMSkpIHx8CisJICAgIChlcnIgPSBtZGlvX3dyaXRlKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgQUVMMTAwMl9QV1JfRE9XTl9ISSwgMCkpIHx8CisJICAgIChlcnIgPSBtZGlvX3dyaXRlKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgQUVMMTAwMl9QV1JfRE9XTl9MTywgMCkpIHx8CisJICAgIChlcnIgPSBtZGlvX3dyaXRlKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgQUVMMTAwMl9YRklfRVFMLCAweDE4KSkgfHwKKwkgICAgKGVyciA9IHQzX21kaW9fY2hhbmdlX2JpdHMocGh5LCBNRElPX0RFVl9QTUFfUE1ELCBBRUwxMDAyX0xCX0VOLAorCQkJCSAgICAgICAwLCAxIDw8IDUpKSkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZWwxMDAyX2ludHJfbm9vcChzdHJ1Y3QgY3BoeSAqcGh5KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFlbDEwMHhfZ2V0X2xpbmtfc3RhdHVzKHN0cnVjdCBjcGh5ICpwaHksIGludCAqbGlua19vaywKKwkJCQkgICBpbnQgKnNwZWVkLCBpbnQgKmR1cGxleCwgaW50ICpmYykKK3sKKwlpZiAobGlua19vaykgeworCQl1bnNpZ25lZCBpbnQgc3RhdHVzOworCQlpbnQgZXJyID0gbWRpb19yZWFkKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgTUlJX0JNU1IsICZzdGF0dXMpOworCisJCS8qCisJCSAqIEJNU1JfTFNUQVRVUyBpcyBsYXRjaC1sb3csIHNvIGlmIGl0IGlzIDAgd2UgbmVlZCB0byByZWFkIGl0CisJCSAqIG9uY2UgbW9yZSB0byBnZXQgdGhlIGN1cnJlbnQgbGluayBzdGF0ZS4KKwkJICovCisJCWlmICghZXJyICYmICEoc3RhdHVzICYgQk1TUl9MU1RBVFVTKSkKKwkJCWVyciA9IG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIE1JSV9CTVNSLAorCQkJCQkmc3RhdHVzKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCSpsaW5rX29rID0gISEoc3RhdHVzICYgQk1TUl9MU1RBVFVTKTsKKwl9CisJaWYgKHNwZWVkKQorCQkqc3BlZWQgPSBTUEVFRF8xMDAwMDsKKwlpZiAoZHVwbGV4KQorCQkqZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3BoeV9vcHMgYWVsMTAwMl9vcHMgPSB7CisJLnJlc2V0ID0gYWVsMTAwMl9yZXNldCwKKwkuaW50cl9lbmFibGUgPSBhZWwxMDAyX2ludHJfbm9vcCwKKwkuaW50cl9kaXNhYmxlID0gYWVsMTAwMl9pbnRyX25vb3AsCisJLmludHJfY2xlYXIgPSBhZWwxMDAyX2ludHJfbm9vcCwKKwkuaW50cl9oYW5kbGVyID0gYWVsMTAwMl9pbnRyX25vb3AsCisJLmdldF9saW5rX3N0YXR1cyA9IGFlbDEwMHhfZ2V0X2xpbmtfc3RhdHVzLAorCS5wb3dlcl9kb3duID0gYWVsMTAwMl9wb3dlcl9kb3duLAorfTsKKwordm9pZCB0M19hZWwxMDAyX3BoeV9wcmVwKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJIGludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKK3sKKwljcGh5X2luaXQocGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJmFlbDEwMDJfb3BzLCBtZGlvX29wcyk7CisJYWVsMTAweF90eG9uKHBoeSk7Cit9CisKK3N0YXRpYyBpbnQgYWVsMTAwNl9yZXNldChzdHJ1Y3QgY3BoeSAqcGh5LCBpbnQgd2FpdCkKK3sKKwlyZXR1cm4gdDNfcGh5X3Jlc2V0KHBoeSwgTURJT19ERVZfUE1BX1BNRCwgd2FpdCk7Cit9CisKK3N0YXRpYyBpbnQgYWVsMTAwNl9pbnRyX2VuYWJsZShzdHJ1Y3QgY3BoeSAqcGh5KQoreworCXJldHVybiBtZGlvX3dyaXRlKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgTEFTSV9DVFJMLCAxKTsKK30KKworc3RhdGljIGludCBhZWwxMDA2X2ludHJfZGlzYWJsZShzdHJ1Y3QgY3BoeSAqcGh5KQoreworCXJldHVybiBtZGlvX3dyaXRlKHBoeSwgTURJT19ERVZfUE1BX1BNRCwgTEFTSV9DVFJMLCAwKTsKK30KKworc3RhdGljIGludCBhZWwxMDA2X2ludHJfY2xlYXIoc3RydWN0IGNwaHkgKnBoeSkKK3sKKwl1MzIgdmFsOworCisJcmV0dXJuIG1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIExBU0lfU1RBVCwgJnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgYWVsMTAwNl9pbnRyX2hhbmRsZXIoc3RydWN0IGNwaHkgKnBoeSkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCWludCBlcnIgPSBtZGlvX3JlYWQocGh5LCBNRElPX0RFVl9QTUFfUE1ELCBMQVNJX1NUQVQsICZzdGF0dXMpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gKHN0YXR1cyAmIDEpID8gY3BoeV9jYXVzZV9saW5rX2NoYW5nZSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgYWVsMTAwNl9wb3dlcl9kb3duKHN0cnVjdCBjcGh5ICpwaHksIGludCBlbmFibGUpCit7CisJcmV0dXJuIHQzX21kaW9fY2hhbmdlX2JpdHMocGh5LCBNRElPX0RFVl9QTUFfUE1ELCBNSUlfQk1DUiwKKwkJCQkgICBCTUNSX1BET1dOLCBlbmFibGUgPyBCTUNSX1BET1dOIDogMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3BoeV9vcHMgYWVsMTAwNl9vcHMgPSB7CisJLnJlc2V0ID0gYWVsMTAwNl9yZXNldCwKKwkuaW50cl9lbmFibGUgPSBhZWwxMDA2X2ludHJfZW5hYmxlLAorCS5pbnRyX2Rpc2FibGUgPSBhZWwxMDA2X2ludHJfZGlzYWJsZSwKKwkuaW50cl9jbGVhciA9IGFlbDEwMDZfaW50cl9jbGVhciwKKwkuaW50cl9oYW5kbGVyID0gYWVsMTAwNl9pbnRyX2hhbmRsZXIsCisJLmdldF9saW5rX3N0YXR1cyA9IGFlbDEwMHhfZ2V0X2xpbmtfc3RhdHVzLAorCS5wb3dlcl9kb3duID0gYWVsMTAwNl9wb3dlcl9kb3duLAorfTsKKwordm9pZCB0M19hZWwxMDA2X3BoeV9wcmVwKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJIGludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKK3sKKwljcGh5X2luaXQocGh5LCBhZGFwdGVyLCBwaHlfYWRkciwgJmFlbDEwMDZfb3BzLCBtZGlvX29wcyk7CisJYWVsMTAweF90eG9uKHBoeSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3BoeV9vcHMgcXQyMDQ1X29wcyA9IHsKKwkucmVzZXQgPSBhZWwxMDA2X3Jlc2V0LAorCS5pbnRyX2VuYWJsZSA9IGFlbDEwMDZfaW50cl9lbmFibGUsCisJLmludHJfZGlzYWJsZSA9IGFlbDEwMDZfaW50cl9kaXNhYmxlLAorCS5pbnRyX2NsZWFyID0gYWVsMTAwNl9pbnRyX2NsZWFyLAorCS5pbnRyX2hhbmRsZXIgPSBhZWwxMDA2X2ludHJfaGFuZGxlciwKKwkuZ2V0X2xpbmtfc3RhdHVzID0gYWVsMTAweF9nZXRfbGlua19zdGF0dXMsCisJLnBvd2VyX2Rvd24gPSBhZWwxMDA2X3Bvd2VyX2Rvd24sCit9OworCit2b2lkIHQzX3F0MjA0NV9waHlfcHJlcChzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCWludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdDsKKworCWNwaHlfaW5pdChwaHksIGFkYXB0ZXIsIHBoeV9hZGRyLCAmcXQyMDQ1X29wcywgbWRpb19vcHMpOworCisJLyoKKwkgKiBTb21lIGNhcmRzIHdoZXJlIHRoZSBQSFkgaXMgc3VwcG9zZWQgdG8gYmUgYXQgYWRkcmVzcyAwIGFjdHVhbGx5CisJICogaGF2ZSBpdCBhdCAxLgorCSAqLworCWlmICghcGh5X2FkZHIgJiYgIW1kaW9fcmVhZChwaHksIE1ESU9fREVWX1BNQV9QTUQsIE1JSV9CTVNSLCAmc3RhdCkgJiYKKwkgICAgc3RhdCA9PSAweGZmZmYpCisJCXBoeS0+YWRkciA9IDE7Cit9CisKK3N0YXRpYyBpbnQgeGF1aV9kaXJlY3RfcmVzZXQoc3RydWN0IGNwaHkgKnBoeSwgaW50IHdhaXQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGF1aV9kaXJlY3RfZ2V0X2xpbmtfc3RhdHVzKHN0cnVjdCBjcGh5ICpwaHksIGludCAqbGlua19vaywKKwkJCQkgICAgICAgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgsIGludCAqZmMpCit7CisJaWYgKGxpbmtfb2spIHsKKwkJdW5zaWduZWQgaW50IHN0YXR1czsKKworCQlzdGF0dXMgPSB0M19yZWFkX3JlZyhwaHktPmFkYXB0ZXIsCisJCQkJICAgICBYR01fUkVHKEFfWEdNX1NFUkRFU19TVEFUMCwgcGh5LT5hZGRyKSk7CisJCSpsaW5rX29rID0gIShzdGF0dXMgJiBGX0xPV1NJRzApOworCX0KKwlpZiAoc3BlZWQpCisJCSpzcGVlZCA9IFNQRUVEXzEwMDAwOworCWlmIChkdXBsZXgpCisJCSpkdXBsZXggPSBEVVBMRVhfRlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4YXVpX2RpcmVjdF9wb3dlcl9kb3duKHN0cnVjdCBjcGh5ICpwaHksIGludCBlbmFibGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3BoeV9vcHMgeGF1aV9kaXJlY3Rfb3BzID0geworCS5yZXNldCA9IHhhdWlfZGlyZWN0X3Jlc2V0LAorCS5pbnRyX2VuYWJsZSA9IGFlbDEwMDJfaW50cl9ub29wLAorCS5pbnRyX2Rpc2FibGUgPSBhZWwxMDAyX2ludHJfbm9vcCwKKwkuaW50cl9jbGVhciA9IGFlbDEwMDJfaW50cl9ub29wLAorCS5pbnRyX2hhbmRsZXIgPSBhZWwxMDAyX2ludHJfbm9vcCwKKwkuZ2V0X2xpbmtfc3RhdHVzID0geGF1aV9kaXJlY3RfZ2V0X2xpbmtfc3RhdHVzLAorCS5wb3dlcl9kb3duID0geGF1aV9kaXJlY3RfcG93ZXJfZG93biwKK307CisKK3ZvaWQgdDNfeGF1aV9kaXJlY3RfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgIGludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcykKK3sKKwljcGh5X2luaXQocGh5LCBhZGFwdGVyLCAxLCAmeGF1aV9kaXJlY3Rfb3BzLCBtZGlvX29wcyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jb21tb24uaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyM2RlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9jb21tb24uaApAQCAtMCwwICsxLDcyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9fQ0hFTFNJT19DT01NT05fSAorI2RlZmluZSBfX0NIRUxTSU9fQ09NTU9OX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjZGVmaW5lIENIX0VSUihhZGFwLCBmbXQsIC4uLikgICBkZXZfZXJyKCZhZGFwLT5wZGV2LT5kZXYsIGZtdCwgIyMgX19WQV9BUkdTX18pCisjZGVmaW5lIENIX1dBUk4oYWRhcCwgZm10LCAuLi4pICBkZXZfd2FybigmYWRhcC0+cGRldi0+ZGV2LCBmbXQsICMjIF9fVkFfQVJHU19fKQorI2RlZmluZSBDSF9BTEVSVChhZGFwLCBmbXQsIC4uLikgXAorCWRldl9wcmludGsoS0VSTl9BTEVSVCwgJmFkYXAtPnBkZXYtPmRldiwgZm10LCAjIyBfX1ZBX0FSR1NfXykKKworLyoKKyAqIE1vcmUgcG93ZXJmdWwgbWFjcm8gdGhhdCBzZWxlY3RpdmVseSBwcmludHMgbWVzc2FnZXMgYmFzZWQgb24gbXNnX2VuYWJsZS4KKyAqIEZvciBpbmZvIGFuZCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisgKi8KKyNkZWZpbmUgQ0hfTVNHKGFkYXB0ZXIsIGxldmVsLCBjYXRlZ29yeSwgZm10LCAuLi4pIGRvIHsgXAorCWlmICgoYWRhcHRlciktPm1zZ19lbmFibGUgJiBORVRJRl9NU0dfIyNjYXRlZ29yeSkgXAorCQlkZXZfcHJpbnRrKEtFUk5fIyNsZXZlbCwgJmFkYXB0ZXItPnBkZXYtPmRldiwgZm10LCBcCisJCQkgICAjIyBfX1ZBX0FSR1NfXyk7IFwKK30gd2hpbGUgKDApCisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgQ0hfREJHKGFkYXB0ZXIsIGNhdGVnb3J5LCBmbXQsIC4uLikgXAorCUNIX01TRyhhZGFwdGVyLCBERUJVRywgY2F0ZWdvcnksIGZtdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorIyBkZWZpbmUgQ0hfREJHKGFkYXB0ZXIsIGNhdGVnb3J5LCBmbXQsIC4uLikKKyNlbmRpZgorCisvKiBBZGRpdGlvbmFsIE5FVElGX01TR18qIGNhdGVnb3JpZXMgKi8KKyNkZWZpbmUgTkVUSUZfTVNHX01NSU8gMHg4MDAwMDAwCisKK3N0cnVjdCB0M19yeF9tb2RlIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OworCXVuc2lnbmVkIGludCBpZHg7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9yeF9tb2RlKHN0cnVjdCB0M19yeF9tb2RlICpwLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0KQoreworCXAtPmRldiA9IGRldjsKKwlwLT5tY2xpc3QgPSBtY2xpc3Q7CisJcC0+aWR4ID0gMDsKK30KKworc3RhdGljIGlubGluZSB1OCAqdDNfZ2V0X25leHRfbWNhZGRyKHN0cnVjdCB0M19yeF9tb2RlICpybSkKK3sKKwl1OCAqYWRkciA9IE5VTEw7CisKKwlpZiAocm0tPm1jbGlzdCAmJiBybS0+aWR4IDwgcm0tPmRldi0+bWNfY291bnQpIHsKKwkJYWRkciA9IHJtLT5tY2xpc3QtPmRtaV9hZGRyOworCQlybS0+bWNsaXN0ID0gcm0tPm1jbGlzdC0+bmV4dDsKKwkJcm0tPmlkeCsrOworCX0KKwlyZXR1cm4gYWRkcjsKK30KKworZW51bSB7CisJTUFYX05QT1JUUyA9IDIsCQkvKiBtYXggIyBvZiBwb3J0cyAqLworCU1BWF9GUkFNRV9TSVpFID0gMTAyNDAsCS8qIG1heCBNQUMgZnJhbWUgc2l6ZSwgaW5jbHVkaW5nIGhlYWRlciArIEZDUyAqLworCUVFUFJPTVNJWkUgPSA4MTkyLAkvKiBTZXJpYWwgRUVQUk9NIHNpemUgKi8KKwlSU1NfVEFCTEVfU0laRSA9IDY0LAkvKiBzaXplIG9mIFJTUyBsb29rdXAgYW5kIG1hcHBpbmcgdGFibGVzICovCisJVENCX1NJWkUgPSAxMjgsCQkvKiBUQ0Igc2l6ZSAqLworCU5NVFVTID0gMTYsCQkvKiBzaXplIG9mIE1UVSB0YWJsZSAqLworCU5DQ1RSTF9XSU4gPSAzMiwJLyogIyBvZiBjb25nZXN0aW9uIGNvbnRyb2wgd2luZG93cyAqLworfTsKKworI2RlZmluZSBNQVhfUlhfQ09BTEVTQ0lOR19MRU4gMTYyMjRVCisKK2VudW0geworCVBBVVNFX1JYID0gMSA8PCAwLAorCVBBVVNFX1RYID0gMSA8PCAxLAorCVBBVVNFX0FVVE9ORUcgPSAxIDw8IDIKK307CisKK2VudW0geworCVNVUFBPUlRFRF9PRkZMT0FEID0gMSA8PCAyNCwKKwlTVVBQT1JURURfSVJRID0gMSA8PCAyNQorfTsKKworZW51bSB7CQkJCS8qIGFkYXB0ZXIgaW50ZXJydXB0LW1haW50YWluZWQgc3RhdGlzdGljcyAqLworCVNUQVRfVUxQX0NIMF9QQkxfT09CLAorCVNUQVRfVUxQX0NIMV9QQkxfT09CLAorCVNUQVRfUENJX0NPUlJfRUNDLAorCisJSVJRX05VTV9TVEFUUwkJLyoga2VlcCBsYXN0ICovCit9OworCitlbnVtIHsKKwlTR0VfUVNFVFMgPSA4LAkJLyogIyBvZiBTR0UgVHgvUngvUnNwUSBzZXRzICovCisJU0dFX1JYUV9QRVJfU0VUID0gMiwJLyogIyBvZiBSeCBxdWV1ZXMgcGVyIHNldCAqLworCVNHRV9UWFFfUEVSX1NFVCA9IDMJLyogIyBvZiBUeCBxdWV1ZXMgcGVyIHNldCAqLworfTsKKworZW51bSBzZ2VfY29udGV4dF90eXBlIHsJCS8qIFNHRSBlZ3Jlc3MgY29udGV4dCB0eXBlcyAqLworCVNHRV9DTlRYVF9SRE1BID0gMCwKKwlTR0VfQ05UWFRfRVRIID0gMiwKKwlTR0VfQ05UWFRfT0ZMRCA9IDQsCisJU0dFX0NOVFhUX0NUUkwgPSA1Cit9OworCitlbnVtIHsKKwlBTl9QS1RfU0laRSA9IDMyLAkvKiBhc3luYyBub3RpZmljYXRpb24gcGFja2V0IHNpemUgKi8KKwlJTU1FRF9QS1RfU0laRSA9IDQ4CS8qIHBhY2tldCBzaXplIGZvciBpbW1lZGlhdGUgZGF0YSAqLworfTsKKworc3RydWN0IHNnX2VudCB7CQkJLyogU0dFIHNjYXR0ZXIvZ2F0aGVyIGVudHJ5ICovCisJdTMyIGxlblsyXTsKKwl1NjQgYWRkclsyXTsKK307CisKKyNpZm5kZWYgU0dFX05VTV9HRU5CSVRTCisvKiBNdXN0IGJlIDEgb3IgMiAqLworIyBkZWZpbmUgU0dFX05VTV9HRU5CSVRTIDIKKyNlbmRpZgorCisjZGVmaW5lIFRYX0RFU0NfRkxJVFMgMTZVCisjZGVmaW5lIFdSX0ZMSVRTIChUWF9ERVNDX0ZMSVRTICsgMSAtIFNHRV9OVU1fR0VOQklUUykKKworc3RydWN0IGNwaHk7CitzdHJ1Y3QgYWRhcHRlcjsKKworc3RydWN0IG1kaW9fb3BzIHsKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBoeV9hZGRyLCBpbnQgbW1kX2FkZHIsCisJCSAgICBpbnQgcmVnX2FkZHIsIHVuc2lnbmVkIGludCAqdmFsKTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwgaW50IG1tZF9hZGRyLAorCQkgICAgIGludCByZWdfYWRkciwgdW5zaWduZWQgaW50IHZhbCk7Cit9OworCitzdHJ1Y3QgYWRhcHRlcl9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIG5wb3J0czsJLyogIyBvZiBwb3J0cyAqLworCXVuc2lnbmVkIGNoYXIgcGh5X2Jhc2VfYWRkcjsJLyogTURJTyBQSFkgYmFzZSBhZGRyZXNzICovCisJdW5zaWduZWQgY2hhciBtZGllbjsKKwl1bnNpZ25lZCBjaGFyIG1kaWludjsKKwl1bnNpZ25lZCBpbnQgZ3Bpb19vdXQ7CS8qIEdQSU8gb3V0cHV0IHNldHRpbmdzICovCisJdW5zaWduZWQgaW50IGdwaW9faW50cjsJLyogR1BJTyBJUlEgZW5hYmxlIG1hc2sgKi8KKwl1bnNpZ25lZCBsb25nIGNhcHM7CS8qIGFkYXB0ZXIgY2FwYWJpbGl0aWVzICovCisJY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wczsJLyogTURJTyBvcGVyYXRpb25zICovCisJY29uc3QgY2hhciAqZGVzYzsJLyogcHJvZHVjdCBkZXNjcmlwdGlvbiAqLworfTsKKworc3RydWN0IHBvcnRfdHlwZV9pbmZvIHsKKwl2b2lkICgqcGh5X3ByZXApKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJIGludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICpvcHMpOworCXVuc2lnbmVkIGludCBjYXBzOworCWNvbnN0IGNoYXIgKmRlc2M7Cit9OworCitzdHJ1Y3QgbWM1X3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIHBhcml0eV9lcnI7CisJdW5zaWduZWQgbG9uZyBhY3RpdmVfcmduX2Z1bGw7CisJdW5zaWduZWQgbG9uZyBuZmFfc3JjaF9lcnI7CisJdW5zaWduZWQgbG9uZyB1bmtub3duX2NtZDsKKwl1bnNpZ25lZCBsb25nIHJlcXFfcGFyaXR5X2VycjsKKwl1bnNpZ25lZCBsb25nIGRpc3BxX3Bhcml0eV9lcnI7CisJdW5zaWduZWQgbG9uZyBkZWxfYWN0X2VtcHR5OworfTsKKworc3RydWN0IG1jN19zdGF0cyB7CisJdW5zaWduZWQgbG9uZyBjb3JyX2VycjsKKwl1bnNpZ25lZCBsb25nIHVuY29ycl9lcnI7CisJdW5zaWduZWQgbG9uZyBwYXJpdHlfZXJyOworCXVuc2lnbmVkIGxvbmcgYWRkcl9lcnI7Cit9OworCitzdHJ1Y3QgbWFjX3N0YXRzIHsKKwl1NjQgdHhfb2N0ZXRzOwkJLyogdG90YWwgIyBvZiBvY3RldHMgaW4gZ29vZCBmcmFtZXMgKi8KKwl1NjQgdHhfb2N0ZXRzX2JhZDsJLyogdG90YWwgIyBvZiBvY3RldHMgaW4gZXJyb3IgZnJhbWVzICovCisJdTY0IHR4X2ZyYW1lczsJCS8qIGFsbCBnb29kIGZyYW1lcyAqLworCXU2NCB0eF9tY2FzdF9mcmFtZXM7CS8qIGdvb2QgbXVsdGljYXN0IGZyYW1lcyAqLworCXU2NCB0eF9iY2FzdF9mcmFtZXM7CS8qIGdvb2QgYnJvYWRjYXN0IGZyYW1lcyAqLworCXU2NCB0eF9wYXVzZTsJCS8qICMgb2YgdHJhbnNtaXR0ZWQgcGF1c2UgZnJhbWVzICovCisJdTY0IHR4X2RlZmVycmVkOwkvKiBmcmFtZXMgd2l0aCBkZWZlcnJlZCB0cmFuc21pc3Npb25zICovCisJdTY0IHR4X2xhdGVfY29sbGlzaW9uczsJLyogIyBvZiBsYXRlIGNvbGxpc2lvbnMgKi8KKwl1NjQgdHhfdG90YWxfY29sbGlzaW9uczsJLyogIyBvZiB0b3RhbCBjb2xsaXNpb25zICovCisJdTY0IHR4X2V4Y2Vzc19jb2xsaXNpb25zOwkvKiBmcmFtZSBlcnJvcnMgZnJvbSBleGNlc3NpdmUgY29sbGlzc2lvbnMgKi8KKwl1NjQgdHhfdW5kZXJydW47CS8qICMgb2YgVHggRklGTyB1bmRlcnJ1bnMgKi8KKwl1NjQgdHhfbGVuX2VycnM7CS8qICMgb2YgVHggbGVuZ3RoIGVycm9ycyAqLworCXU2NCB0eF9tYWNfaW50ZXJuYWxfZXJyczsJLyogIyBvZiBpbnRlcm5hbCBNQUMgZXJyb3JzIG9uIFR4ICovCisJdTY0IHR4X2V4Y2Vzc19kZWZlcnJhbDsJLyogIyBvZiBmcmFtZXMgd2l0aCBleGNlc3NpdmUgZGVmZXJyYWwgKi8KKwl1NjQgdHhfZmNzX2VycnM7CS8qICMgb2YgZnJhbWVzIHdpdGggYmFkIEZDUyAqLworCisJdTY0IHR4X2ZyYW1lc182NDsJLyogIyBvZiBUeCBmcmFtZXMgaW4gYSBwYXJ0aWN1bGFyIHJhbmdlICovCisJdTY0IHR4X2ZyYW1lc182NV8xMjc7CisJdTY0IHR4X2ZyYW1lc18xMjhfMjU1OworCXU2NCB0eF9mcmFtZXNfMjU2XzUxMTsKKwl1NjQgdHhfZnJhbWVzXzUxMl8xMDIzOworCXU2NCB0eF9mcmFtZXNfMTAyNF8xNTE4OworCXU2NCB0eF9mcmFtZXNfMTUxOV9tYXg7CisKKwl1NjQgcnhfb2N0ZXRzOwkJLyogdG90YWwgIyBvZiBvY3RldHMgaW4gZ29vZCBmcmFtZXMgKi8KKwl1NjQgcnhfb2N0ZXRzX2JhZDsJLyogdG90YWwgIyBvZiBvY3RldHMgaW4gZXJyb3IgZnJhbWVzICovCisJdTY0IHJ4X2ZyYW1lczsJCS8qIGFsbCBnb29kIGZyYW1lcyAqLworCXU2NCByeF9tY2FzdF9mcmFtZXM7CS8qIGdvb2QgbXVsdGljYXN0IGZyYW1lcyAqLworCXU2NCByeF9iY2FzdF9mcmFtZXM7CS8qIGdvb2QgYnJvYWRjYXN0IGZyYW1lcyAqLworCXU2NCByeF9wYXVzZTsJCS8qICMgb2YgcmVjZWl2ZWQgcGF1c2UgZnJhbWVzICovCisJdTY0IHJ4X2Zjc19lcnJzOwkvKiAjIG9mIHJlY2VpdmVkIGZyYW1lcyB3aXRoIGJhZCBGQ1MgKi8KKwl1NjQgcnhfYWxpZ25fZXJyczsJLyogYWxpZ25tZW50IGVycm9ycyAqLworCXU2NCByeF9zeW1ib2xfZXJyczsJLyogc3ltYm9sIGVycm9ycyAqLworCXU2NCByeF9kYXRhX2VycnM7CS8qIGRhdGEgZXJyb3JzICovCisJdTY0IHJ4X3NlcXVlbmNlX2VycnM7CS8qIHNlcXVlbmNlIGVycm9ycyAqLworCXU2NCByeF9ydW50OwkJLyogIyBvZiBydW50IGZyYW1lcyAqLworCXU2NCByeF9qYWJiZXI7CQkvKiAjIG9mIGphYmJlciBmcmFtZXMgKi8KKwl1NjQgcnhfc2hvcnQ7CQkvKiAjIG9mIHNob3J0IGZyYW1lcyAqLworCXU2NCByeF90b29fbG9uZzsJLyogIyBvZiBvdmVyc2l6ZWQgZnJhbWVzICovCisJdTY0IHJ4X21hY19pbnRlcm5hbF9lcnJzOwkvKiAjIG9mIGludGVybmFsIE1BQyBlcnJvcnMgb24gUnggKi8KKworCXU2NCByeF9mcmFtZXNfNjQ7CS8qICMgb2YgUnggZnJhbWVzIGluIGEgcGFydGljdWxhciByYW5nZSAqLworCXU2NCByeF9mcmFtZXNfNjVfMTI3OworCXU2NCByeF9mcmFtZXNfMTI4XzI1NTsKKwl1NjQgcnhfZnJhbWVzXzI1Nl81MTE7CisJdTY0IHJ4X2ZyYW1lc181MTJfMTAyMzsKKwl1NjQgcnhfZnJhbWVzXzEwMjRfMTUxODsKKwl1NjQgcnhfZnJhbWVzXzE1MTlfbWF4OworCisJdTY0IHJ4X2NvbmdfZHJvcHM7CS8qICMgb2YgUnggZHJvcHMgZHVlIHRvIFNHRSBjb25nZXN0aW9uICovCisKKwl1bnNpZ25lZCBsb25nIHR4X2ZpZm9fcGFyaXR5X2VycjsKKwl1bnNpZ25lZCBsb25nIHJ4X2ZpZm9fcGFyaXR5X2VycjsKKwl1bnNpZ25lZCBsb25nIHR4X2ZpZm9fdXJ1bjsKKwl1bnNpZ25lZCBsb25nIHJ4X2ZpZm9fb3ZmbDsKKwl1bnNpZ25lZCBsb25nIHNlcmRlc19zaWduYWxfbG9zczsKKwl1bnNpZ25lZCBsb25nIHhhdWlfcGNzX2N0Y19lcnI7CisJdW5zaWduZWQgbG9uZyB4YXVpX3Bjc19hbGlnbl9jaGFuZ2U7Cit9OworCitzdHJ1Y3QgdHBfbWliX3N0YXRzIHsKKwl1MzIgaXBJblJlY2VpdmVfaGk7CisJdTMyIGlwSW5SZWNlaXZlX2xvOworCXUzMiBpcEluSGRyRXJyb3JzX2hpOworCXUzMiBpcEluSGRyRXJyb3JzX2xvOworCXUzMiBpcEluQWRkckVycm9yc19oaTsKKwl1MzIgaXBJbkFkZHJFcnJvcnNfbG87CisJdTMyIGlwSW5Vbmtub3duUHJvdG9zX2hpOworCXUzMiBpcEluVW5rbm93blByb3Rvc19sbzsKKwl1MzIgaXBJbkRpc2NhcmRzX2hpOworCXUzMiBpcEluRGlzY2FyZHNfbG87CisJdTMyIGlwSW5EZWxpdmVyc19oaTsKKwl1MzIgaXBJbkRlbGl2ZXJzX2xvOworCXUzMiBpcE91dFJlcXVlc3RzX2hpOworCXUzMiBpcE91dFJlcXVlc3RzX2xvOworCXUzMiBpcE91dERpc2NhcmRzX2hpOworCXUzMiBpcE91dERpc2NhcmRzX2xvOworCXUzMiBpcE91dE5vUm91dGVzX2hpOworCXUzMiBpcE91dE5vUm91dGVzX2xvOworCXUzMiBpcFJlYXNtVGltZW91dDsKKwl1MzIgaXBSZWFzbVJlcWRzOworCXUzMiBpcFJlYXNtT0tzOworCXUzMiBpcFJlYXNtRmFpbHM7CisKKwl1MzIgcmVzZXJ2ZWRbOF07CisKKwl1MzIgdGNwQWN0aXZlT3BlbnM7CisJdTMyIHRjcFBhc3NpdmVPcGVuczsKKwl1MzIgdGNwQXR0ZW1wdEZhaWxzOworCXUzMiB0Y3BFc3RhYlJlc2V0czsKKwl1MzIgdGNwT3V0UnN0czsKKwl1MzIgdGNwQ3VyckVzdGFiOworCXUzMiB0Y3BJblNlZ3NfaGk7CisJdTMyIHRjcEluU2Vnc19sbzsKKwl1MzIgdGNwT3V0U2Vnc19oaTsKKwl1MzIgdGNwT3V0U2Vnc19sbzsKKwl1MzIgdGNwUmV0cmFuc1NlZ19oaTsKKwl1MzIgdGNwUmV0cmFuc1NlZ19sbzsKKwl1MzIgdGNwSW5FcnJzX2hpOworCXUzMiB0Y3BJbkVycnNfbG87CisJdTMyIHRjcFJ0b01pbjsKKwl1MzIgdGNwUnRvTWF4OworfTsKKworc3RydWN0IHRwX3BhcmFtcyB7CisJdW5zaWduZWQgaW50IG5jaGFuOwkvKiAjIG9mIGNoYW5uZWxzICovCisJdW5zaWduZWQgaW50IHBtcnhfc2l6ZTsJLyogdG90YWwgUE1SWCBjYXBhY2l0eSAqLworCXVuc2lnbmVkIGludCBwbXR4X3NpemU7CS8qIHRvdGFsIFBNVFggY2FwYWNpdHkgKi8KKwl1bnNpZ25lZCBpbnQgY21fc2l6ZTsJLyogdG90YWwgQ00gY2FwYWNpdHkgKi8KKwl1bnNpZ25lZCBpbnQgY2hhbl9yeF9zaXplOwkvKiBwZXIgY2hhbm5lbCBSeCBzaXplICovCisJdW5zaWduZWQgaW50IGNoYW5fdHhfc2l6ZTsJLyogcGVyIGNoYW5uZWwgVHggc2l6ZSAqLworCXVuc2lnbmVkIGludCByeF9wZ19zaXplOwkvKiBSeCBwYWdlIHNpemUgKi8KKwl1bnNpZ25lZCBpbnQgdHhfcGdfc2l6ZTsJLyogVHggcGFnZSBzaXplICovCisJdW5zaWduZWQgaW50IHJ4X251bV9wZ3M7CS8qICMgb2YgUnggcGFnZXMgKi8KKwl1bnNpZ25lZCBpbnQgdHhfbnVtX3BnczsJLyogIyBvZiBUeCBwYWdlcyAqLworCXVuc2lnbmVkIGludCBudGltZXJfcXM7CS8qICMgb2YgdGltZXIgcXVldWVzICovCit9OworCitzdHJ1Y3QgcXNldF9wYXJhbXMgewkJLyogU0dFIHF1ZXVlIHNldCBwYXJhbWV0ZXJzICovCisJdW5zaWduZWQgaW50IHBvbGxpbmc7CS8qIHBvbGxpbmcvaW50ZXJydXB0IHNlcnZpY2UgZm9yIHJzcHEgKi8KKwl1bnNpZ25lZCBpbnQgY29hbGVzY2VfdXNlY3M7CS8qIGlycSBjb2FsZXNjaW5nIHRpbWVyICovCisJdW5zaWduZWQgaW50IHJzcHFfc2l6ZTsJLyogIyBvZiBlbnRyaWVzIGluIHJlc3BvbnNlIHF1ZXVlICovCisJdW5zaWduZWQgaW50IGZsX3NpemU7CS8qICMgb2YgZW50cmllcyBpbiByZWd1bGFyIGZyZWUgbGlzdCAqLworCXVuc2lnbmVkIGludCBqdW1ib19zaXplOwkvKiAjIG9mIGVudHJpZXMgaW4ganVtYm8gZnJlZSBsaXN0ICovCisJdW5zaWduZWQgaW50IHR4cV9zaXplW1NHRV9UWFFfUEVSX1NFVF07CS8qIFR4IHF1ZXVlIHNpemVzICovCisJdW5zaWduZWQgaW50IGNvbmdfdGhyZXM7CS8qIEZMIGNvbmdlc3Rpb24gdGhyZXNob2xkICovCit9OworCitzdHJ1Y3Qgc2dlX3BhcmFtcyB7CisJdW5zaWduZWQgaW50IG1heF9wa3Rfc2l6ZTsJLyogbWF4IG9mZmxvYWQgcGt0IHNpemUgKi8KKwlzdHJ1Y3QgcXNldF9wYXJhbXMgcXNldFtTR0VfUVNFVFNdOworfTsKKworc3RydWN0IG1jNV9wYXJhbXMgeworCXVuc2lnbmVkIGludCBtb2RlOwkvKiBzZWxlY3RzIE1DNSB3aWR0aCAqLworCXVuc2lnbmVkIGludCBuc2VydmVyczsJLyogc2l6ZSBvZiBzZXJ2ZXIgcmVnaW9uICovCisJdW5zaWduZWQgaW50IG5maWx0ZXJzOwkvKiBzaXplIG9mIGZpbHRlciByZWdpb24gKi8KKwl1bnNpZ25lZCBpbnQgbnJvdXRlczsJLyogc2l6ZSBvZiByb3V0aW5nIHJlZ2lvbiAqLworfTsKKworLyogRGVmYXVsdCBNQzUgcmVnaW9uIHNpemVzICovCitlbnVtIHsKKwlERUZBVUxUX05TRVJWRVJTID0gNTEyLAorCURFRkFVTFRfTkZJTFRFUlMgPSAxMjgKK307CisKKy8qIE1DNSBtb2RlcywgdGhlc2UgbXVzdCBiZSBub24tMCAqLworZW51bSB7CisJTUM1X01PREVfMTQ0X0JJVCA9IDEsCisJTUM1X01PREVfNzJfQklUID0gMgorfTsKKworc3RydWN0IHZwZF9wYXJhbXMgeworCXVuc2lnbmVkIGludCBjY2xrOworCXVuc2lnbmVkIGludCBtY2xrOworCXVuc2lnbmVkIGludCB1Y2xrOworCXVuc2lnbmVkIGludCBtZGM7CisJdW5zaWduZWQgaW50IG1lbV90aW1pbmc7CisJdTggZXRoX2Jhc2VbNl07CisJdTggcG9ydF90eXBlW01BWF9OUE9SVFNdOworCXVuc2lnbmVkIHNob3J0IHhhdWljZmdbMl07Cit9OworCitzdHJ1Y3QgcGNpX3BhcmFtcyB7CisJdW5zaWduZWQgaW50IHZwZF9jYXBfYWRkcjsKKwl1bnNpZ25lZCBpbnQgcGNpZV9jYXBfYWRkcjsKKwl1bnNpZ25lZCBzaG9ydCBzcGVlZDsKKwl1bnNpZ25lZCBjaGFyIHdpZHRoOworCXVuc2lnbmVkIGNoYXIgdmFyaWFudDsKK307CisKK2VudW0geworCVBDSV9WQVJJQU5UX1BDSSwKKwlQQ0lfVkFSSUFOVF9QQ0lYX01PREUxX1BBUklUWSwKKwlQQ0lfVkFSSUFOVF9QQ0lYX01PREUxX0VDQywKKwlQQ0lfVkFSSUFOVF9QQ0lYXzI2Nl9NT0RFMiwKKwlQQ0lfVkFSSUFOVF9QQ0lFCit9OworCitzdHJ1Y3QgYWRhcHRlcl9wYXJhbXMgeworCXN0cnVjdCBzZ2VfcGFyYW1zIHNnZTsKKwlzdHJ1Y3QgbWM1X3BhcmFtcyBtYzU7CisJc3RydWN0IHRwX3BhcmFtcyB0cDsKKwlzdHJ1Y3QgdnBkX3BhcmFtcyB2cGQ7CisJc3RydWN0IHBjaV9wYXJhbXMgcGNpOworCisJY29uc3Qgc3RydWN0IGFkYXB0ZXJfaW5mbyAqaW5mbzsKKworCXVuc2lnbmVkIHNob3J0IG10dXNbTk1UVVNdOworCXVuc2lnbmVkIHNob3J0IGFfd25kW05DQ1RSTF9XSU5dOworCXVuc2lnbmVkIHNob3J0IGJfd25kW05DQ1RSTF9XSU5dOworCisJdW5zaWduZWQgaW50IG5wb3J0czsJLyogIyBvZiBldGhlcm5ldCBwb3J0cyAqLworCXVuc2lnbmVkIGludCBzdGF0c191cGRhdGVfcGVyaW9kOwkvKiBNQUMgc3RhdHMgYWNjdW11bGF0aW9uIHBlcmlvZCAqLworCXVuc2lnbmVkIGludCBsaW5rcG9sbF9wZXJpb2Q7CS8qIGxpbmsgcG9sbCBwZXJpb2QgaW4gMC4xcyAqLworCXVuc2lnbmVkIGludCByZXY7CS8qIGNoaXAgcmV2aXNpb24gKi8KK307CisKK3N0cnVjdCB0cmFjZV9wYXJhbXMgeworCXUzMiBzaXA7CisJdTMyIHNpcF9tYXNrOworCXUzMiBkaXA7CisJdTMyIGRpcF9tYXNrOworCXUxNiBzcG9ydDsKKwl1MTYgc3BvcnRfbWFzazsKKwl1MTYgZHBvcnQ7CisJdTE2IGRwb3J0X21hc2s7CisJdTMyIHZsYW46MTI7CisJdTMyIHZsYW5fbWFzazoxMjsKKwl1MzIgaW50Zjo0OworCXUzMiBpbnRmX21hc2s6NDsKKwl1OCBwcm90bzsKKwl1OCBwcm90b19tYXNrOworfTsKKworc3RydWN0IGxpbmtfY29uZmlnIHsKKwl1bnNpZ25lZCBpbnQgc3VwcG9ydGVkOwkvKiBsaW5rIGNhcGFiaWxpdGllcyAqLworCXVuc2lnbmVkIGludCBhZHZlcnRpc2luZzsJLyogYWR2ZXJ0aXNlZCBjYXBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCByZXF1ZXN0ZWRfc3BlZWQ7CS8qIHNwZWVkIHVzZXIgaGFzIHJlcXVlc3RlZCAqLworCXVuc2lnbmVkIHNob3J0IHNwZWVkOwkvKiBhY3R1YWwgbGluayBzcGVlZCAqLworCXVuc2lnbmVkIGNoYXIgcmVxdWVzdGVkX2R1cGxleDsJLyogZHVwbGV4IHVzZXIgaGFzIHJlcXVlc3RlZCAqLworCXVuc2lnbmVkIGNoYXIgZHVwbGV4OwkvKiBhY3R1YWwgbGluayBkdXBsZXggKi8KKwl1bnNpZ25lZCBjaGFyIHJlcXVlc3RlZF9mYzsJLyogZmxvdyBjb250cm9sIHVzZXIgaGFzIHJlcXVlc3RlZCAqLworCXVuc2lnbmVkIGNoYXIgZmM7CS8qIGFjdHVhbCBsaW5rIGZsb3cgY29udHJvbCAqLworCXVuc2lnbmVkIGNoYXIgYXV0b25lZzsJLyogYXV0b25lZ290aWF0aW5nPyAqLworCXVuc2lnbmVkIGludCBsaW5rX29rOwkvKiBsaW5rIHVwPyAqLworfTsKKworI2RlZmluZSBTUEVFRF9JTlZBTElEICAgMHhmZmZmCisjZGVmaW5lIERVUExFWF9JTlZBTElEICAweGZmCisKK3N0cnVjdCBtYzUgeworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyOworCXVuc2lnbmVkIGludCB0Y2FtX3NpemU7CisJdW5zaWduZWQgY2hhciBwYXJ0X3R5cGU7CisJdW5zaWduZWQgY2hhciBwYXJpdHlfZW5hYmxlZDsKKwl1bnNpZ25lZCBjaGFyIG1vZGU7CisJc3RydWN0IG1jNV9zdGF0cyBzdGF0czsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHQzX21jNV9zaXplKGNvbnN0IHN0cnVjdCBtYzUgKnApCit7CisJcmV0dXJuIHAtPnRjYW1fc2l6ZTsKK30KKworc3RydWN0IG1jNyB7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXI7CS8qIGJhY2twb2ludGVyIHRvIGFkYXB0ZXIgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogbWVtb3J5IHNpemUgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQgd2lkdGg7CS8qIE1DNyBpbnRlcmZhY2Ugd2lkdGggKi8KKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwkvKiByZWdpc3RlciBhZGRyZXNzIG9mZnNldCBmb3IgTUM3IGluc3RhbmNlICovCisJY29uc3QgY2hhciAqbmFtZTsJLyogbmFtZSBvZiBNQzcgaW5zdGFuY2UgKi8KKwlzdHJ1Y3QgbWM3X3N0YXRzIHN0YXRzOwkvKiBNQzcgc3RhdGlzdGljcyAqLworfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdDNfbWM3X3NpemUoY29uc3Qgc3RydWN0IG1jNyAqcCkKK3sKKwlyZXR1cm4gcC0+c2l6ZTsKK30KKworc3RydWN0IGNtYWMgeworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IG51Y2FzdDsJLyogIyBvZiBhZGRyZXNzIGZpbHRlcnMgZm9yIHVuaWNhc3QgTUFDcyAqLworCXN0cnVjdCBtYWNfc3RhdHMgc3RhdHM7Cit9OworCitlbnVtIHsKKwlNQUNfRElSRUNUSU9OX1JYID0gMSwKKwlNQUNfRElSRUNUSU9OX1RYID0gMiwKKwlNQUNfUlhGSUZPX1NJWkUgPSAzMjc2OAorfTsKKworLyogSUVFRSA4MDIuM2FlIHNwZWNpZmllZCBNRElPIGRldmljZXMgKi8KK2VudW0geworCU1ESU9fREVWX1BNQV9QTUQgPSAxLAorCU1ESU9fREVWX1dJUyA9IDIsCisJTURJT19ERVZfUENTID0gMywKKwlNRElPX0RFVl9YR1hTID0gNAorfTsKKworLyogUEhZIGxvb3BiYWNrIGRpcmVjdGlvbiAqLworZW51bSB7CisJUEhZX0xPT1BCQUNLX1RYID0gMSwKKwlQSFlfTE9PUEJBQ0tfUlggPSAyCit9OworCisvKiBQSFkgaW50ZXJydXB0IHR5cGVzICovCitlbnVtIHsKKwljcGh5X2NhdXNlX2xpbmtfY2hhbmdlID0gMSwKKwljcGh5X2NhdXNlX2ZpZm9fZXJyb3IgPSAyCit9OworCisvKiBQSFkgb3BlcmF0aW9ucyAqLworc3RydWN0IGNwaHlfb3BzIHsKKwl2b2lkICgqZGVzdHJveSkoc3RydWN0IGNwaHkgKnBoeSk7CisJaW50ICgqcmVzZXQpKHN0cnVjdCBjcGh5ICpwaHksIGludCB3YWl0KTsKKworCWludCAoKmludHJfZW5hYmxlKShzdHJ1Y3QgY3BoeSAqcGh5KTsKKwlpbnQgKCppbnRyX2Rpc2FibGUpKHN0cnVjdCBjcGh5ICpwaHkpOworCWludCAoKmludHJfY2xlYXIpKHN0cnVjdCBjcGh5ICpwaHkpOworCWludCAoKmludHJfaGFuZGxlcikoc3RydWN0IGNwaHkgKnBoeSk7CisKKwlpbnQgKCphdXRvbmVnX2VuYWJsZSkoc3RydWN0IGNwaHkgKnBoeSk7CisJaW50ICgqYXV0b25lZ19yZXN0YXJ0KShzdHJ1Y3QgY3BoeSAqcGh5KTsKKworCWludCAoKmFkdmVydGlzZSkoc3RydWN0IGNwaHkgKnBoeSwgdW5zaWduZWQgaW50IGFkdmVydGlzZV9tYXApOworCWludCAoKnNldF9sb29wYmFjaykoc3RydWN0IGNwaHkgKnBoeSwgaW50IG1tZCwgaW50IGRpciwgaW50IGVuYWJsZSk7CisJaW50ICgqc2V0X3NwZWVkX2R1cGxleCkoc3RydWN0IGNwaHkgKnBoeSwgaW50IHNwZWVkLCBpbnQgZHVwbGV4KTsKKwlpbnQgKCpnZXRfbGlua19zdGF0dXMpKHN0cnVjdCBjcGh5ICpwaHksIGludCAqbGlua19vaywgaW50ICpzcGVlZCwKKwkJCSAgICAgICBpbnQgKmR1cGxleCwgaW50ICpmYyk7CisJaW50ICgqcG93ZXJfZG93bikoc3RydWN0IGNwaHkgKnBoeSwgaW50IGVuYWJsZSk7Cit9OworCisvKiBBIFBIWSBpbnN0YW5jZSAqLworc3RydWN0IGNwaHkgeworCWludCBhZGRyOwkJLyogUEhZIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsJLyogYXNzb2NpYXRlZCBhZGFwdGVyICovCisJdW5zaWduZWQgbG9uZyBmaWZvX2Vycm9yczsJLyogRklGTyBvdmVyL3VuZGVyLWZsb3dzICovCisJY29uc3Qgc3RydWN0IGNwaHlfb3BzICpvcHM7CS8qIFBIWSBvcGVyYXRpb25zICovCisJaW50ICgqbWRpb19yZWFkKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBoeV9hZGRyLCBpbnQgbW1kX2FkZHIsCisJCQkgaW50IHJlZ19hZGRyLCB1bnNpZ25lZCBpbnQgKnZhbCk7CisJaW50ICgqbWRpb193cml0ZSkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwgaW50IG1tZF9hZGRyLAorCQkJICBpbnQgcmVnX2FkZHIsIHVuc2lnbmVkIGludCB2YWwpOworfTsKKworLyogQ29udmVuaWVuY2UgTURJTyByZWFkL3dyaXRlIHdyYXBwZXJzICovCitzdGF0aWMgaW5saW5lIGludCBtZGlvX3JlYWQoc3RydWN0IGNwaHkgKnBoeSwgaW50IG1tZCwgaW50IHJlZywKKwkJCSAgICB1bnNpZ25lZCBpbnQgKnZhbHApCit7CisJcmV0dXJuIHBoeS0+bWRpb19yZWFkKHBoeS0+YWRhcHRlciwgcGh5LT5hZGRyLCBtbWQsIHJlZywgdmFscCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1kaW9fd3JpdGUoc3RydWN0IGNwaHkgKnBoeSwgaW50IG1tZCwgaW50IHJlZywKKwkJCSAgICAgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlyZXR1cm4gcGh5LT5tZGlvX3dyaXRlKHBoeS0+YWRhcHRlciwgcGh5LT5hZGRyLCBtbWQsIHJlZywgdmFsKTsKK30KKworLyogQ29udmVuaWVuY2UgaW5pdGlhbGl6ZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcGh5X2luaXQoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgIGludCBwaHlfYWRkciwgc3RydWN0IGNwaHlfb3BzICpwaHlfb3BzLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQoreworCXBoeS0+YWRhcHRlciA9IGFkYXB0ZXI7CisJcGh5LT5hZGRyID0gcGh5X2FkZHI7CisJcGh5LT5vcHMgPSBwaHlfb3BzOworCWlmIChtZGlvX29wcykgeworCQlwaHktPm1kaW9fcmVhZCA9IG1kaW9fb3BzLT5yZWFkOworCQlwaHktPm1kaW9fd3JpdGUgPSBtZGlvX29wcy0+d3JpdGU7CisJfQorfQorCisvKiBBY2N1bXVsYXRlIE1BQyBzdGF0aXN0aWNzIGV2ZXJ5IDE4MCBzZWNvbmRzLiAgRm9yIDFHIHdlIG11bHRpcGx5IGJ5IDEwLiAqLworI2RlZmluZSBNQUNfU1RBVFNfQUNDVU1fU0VDUyAxODAKKworI2RlZmluZSBYR01fUkVHKHJlZ19hZGRyLCBpZHgpIFwKKwkoKHJlZ19hZGRyKSArIChpZHgpICogKFhHTUFDMF8xX0JBU0VfQUREUiAtIFhHTUFDMF8wX0JBU0VfQUREUikpCisKK3N0cnVjdCBhZGRyX3ZhbF9wYWlyIHsKKwl1bnNpZ25lZCBpbnQgcmVnX2FkZHI7CisJdW5zaWduZWQgaW50IHZhbDsKK307CisKKyNpbmNsdWRlICJhZGFwdGVyLmgiCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9DSEVMU0lPCisjIGRlZmluZSBQQ0lfVkVORE9SX0lEX0NIRUxTSU8gMHgxNDI1CisjZW5kaWYKKworI2RlZmluZSBmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGl0ZXIpIFwKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgKGFkYXB0ZXIpLT5wYXJhbXMubnBvcnRzOyArK2l0ZXIpCisKKyNkZWZpbmUgYWRhcHRlcl9pbmZvKGFkYXApICgoYWRhcCktPnBhcmFtcy5pbmZvKQorCitzdGF0aWMgaW5saW5lIGludCB1c2VzX3hhdWkoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIGFkYXB0ZXJfaW5mbyhhZGFwKS0+Y2FwcyAmIFNVUFBPUlRFRF9BVUk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzXzEwRyhjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gYWRhcHRlcl9pbmZvKGFkYXApLT5jYXBzICYgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfb2ZmbG9hZChjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gYWRhcHRlcl9pbmZvKGFkYXApLT5jYXBzICYgU1VQUE9SVEVEX09GRkxPQUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNvcmVfdGlja3NfcGVyX3VzZWMoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIGFkYXAtPnBhcmFtcy52cGQuY2NsayAvIDEwMDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlzX3BjaWUoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIGFkYXAtPnBhcmFtcy5wY2kudmFyaWFudCA9PSBQQ0lfVkFSSUFOVF9QQ0lFOworfQorCit2b2lkIHQzX3NldF9yZWdfZmllbGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBhZGRyLCB1MzIgbWFzaywKKwkJICAgICAgdTMyIHZhbCk7Cit2b2lkIHQzX3dyaXRlX3JlZ3Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHN0cnVjdCBhZGRyX3ZhbF9wYWlyICpwLAorCQkgICBpbnQgbiwgdW5zaWduZWQgaW50IG9mZnNldCk7CitpbnQgdDNfd2FpdF9vcF9kb25lX3ZhbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHJlZywgdTMyIG1hc2ssCisJCQlpbnQgcG9sYXJpdHksIGludCBhdHRlbXB0cywgaW50IGRlbGF5LCB1MzIgKnZhbHApOworc3RhdGljIGlubGluZSBpbnQgdDNfd2FpdF9vcF9kb25lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcmVnLCB1MzIgbWFzaywKKwkJCQkgIGludCBwb2xhcml0eSwgaW50IGF0dGVtcHRzLCBpbnQgZGVsYXkpCit7CisJcmV0dXJuIHQzX3dhaXRfb3BfZG9uZV92YWwoYWRhcHRlciwgcmVnLCBtYXNrLCBwb2xhcml0eSwgYXR0ZW1wdHMsCisJCQkJICAgZGVsYXksIE5VTEwpOworfQoraW50IHQzX21kaW9fY2hhbmdlX2JpdHMoc3RydWN0IGNwaHkgKnBoeSwgaW50IG1tZCwgaW50IHJlZywgdW5zaWduZWQgaW50IGNsZWFyLAorCQkJdW5zaWduZWQgaW50IHNldCk7CitpbnQgdDNfcGh5X3Jlc2V0KHN0cnVjdCBjcGh5ICpwaHksIGludCBtbWQsIGludCB3YWl0KTsKK2ludCB0M19waHlfYWR2ZXJ0aXNlKHN0cnVjdCBjcGh5ICpwaHksIHVuc2lnbmVkIGludCBhZHZlcnQpOworaW50IHQzX3NldF9waHlfc3BlZWRfZHVwbGV4KHN0cnVjdCBjcGh5ICpwaHksIGludCBzcGVlZCwgaW50IGR1cGxleCk7CisKK3ZvaWQgdDNfaW50cl9lbmFibGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCB0M19pbnRyX2Rpc2FibGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCB0M19pbnRyX2NsZWFyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgdDNfcG9ydF9pbnRyX2VuYWJsZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGlkeCk7Cit2b2lkIHQzX3BvcnRfaW50cl9kaXNhYmxlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgaWR4KTsKK3ZvaWQgdDNfcG9ydF9pbnRyX2NsZWFyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgaWR4KTsKK2ludCB0M19zbG93X2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CitpbnQgdDNfcGh5X2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CisKK3ZvaWQgdDNfbGlua19jaGFuZ2VkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcG9ydF9pZCk7CitpbnQgdDNfbGlua19zdGFydChzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgY21hYyAqbWFjLCBzdHJ1Y3QgbGlua19jb25maWcgKmxjKTsKK2NvbnN0IHN0cnVjdCBhZGFwdGVyX2luZm8gKnQzX2dldF9hZGFwdGVyX2luZm8odW5zaWduZWQgaW50IGJvYXJkX2lkKTsKK2ludCB0M19zZWVwcm9tX3JlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgKmRhdGEpOworaW50IHQzX3NlZXByb21fd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgZGF0YSk7CitpbnQgdDNfc2VlcHJvbV93cChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGVuYWJsZSk7CitpbnQgdDNfcmVhZF9mbGFzaChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGFkZHIsCisJCSAgdW5zaWduZWQgaW50IG53b3JkcywgdTMyICpkYXRhLCBpbnQgYnl0ZV9vcmllbnRlZCk7CitpbnQgdDNfbG9hZF9mdyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKiBmd19kYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitpbnQgdDNfZ2V0X2Z3X3ZlcnNpb24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiAqdmVycyk7CitpbnQgdDNfY2hlY2tfZndfdmVyc2lvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CitpbnQgdDNfaW5pdF9odyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGZ3X3BhcmFtcyk7Cit2b2lkIG1hY19wcmVwKHN0cnVjdCBjbWFjICptYWMsIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgaW5kZXgpOwordm9pZCBlYXJseV9od19pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjb25zdCBzdHJ1Y3QgYWRhcHRlcl9pbmZvICphaSk7CitpbnQgdDNfcHJlcF9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjb25zdCBzdHJ1Y3QgYWRhcHRlcl9pbmZvICphaSwKKwkJICAgIGludCByZXNldCk7Cit2b2lkIHQzX2xlZF9yZWFkeShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIHQzX2ZhdGFsX2VycihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIHQzX3NldF92bGFuX2FjY2VsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgcG9ydHMsIGludCBvbik7Cit2b2lkIHQzX2NvbmZpZ19yc3Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCByc3NfY29uZmlnLAorCQkgICBjb25zdCB1OCAqIGNwdXMsIGNvbnN0IHUxNiAqcnNwcSk7CitpbnQgdDNfcmVhZF9yc3Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4ICogbGt1cCwgdTE2ICptYXApOworaW50IHQzX21wc19zZXRfYWN0aXZlX3BvcnRzKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgcG9ydF9tYXNrKTsKK2ludCB0M19jaW1fY3RsX2Jsa19yZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgYWRkciwKKwkJCXVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgKnZhbHApOworaW50IHQzX21jN19iZF9yZWFkKHN0cnVjdCBtYzcgKm1jNywgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgbiwKKwkJICAgdTY0ICpidWYpOworCitpbnQgdDNfbWFjX3Jlc2V0KHN0cnVjdCBjbWFjICptYWMpOwordm9pZCB0M2JfcGNzX3Jlc2V0KHN0cnVjdCBjbWFjICptYWMpOworaW50IHQzX21hY19lbmFibGUoc3RydWN0IGNtYWMgKm1hYywgaW50IHdoaWNoKTsKK2ludCB0M19tYWNfZGlzYWJsZShzdHJ1Y3QgY21hYyAqbWFjLCBpbnQgd2hpY2gpOworaW50IHQzX21hY19zZXRfbXR1KHN0cnVjdCBjbWFjICptYWMsIHVuc2lnbmVkIGludCBtdHUpOworaW50IHQzX21hY19zZXRfcnhfbW9kZShzdHJ1Y3QgY21hYyAqbWFjLCBzdHJ1Y3QgdDNfcnhfbW9kZSAqcm0pOworaW50IHQzX21hY19zZXRfYWRkcmVzcyhzdHJ1Y3QgY21hYyAqbWFjLCB1bnNpZ25lZCBpbnQgaWR4LCB1OCBhZGRyWzZdKTsKK2ludCB0M19tYWNfc2V0X251bV91Y2FzdChzdHJ1Y3QgY21hYyAqbWFjLCBpbnQgbik7Citjb25zdCBzdHJ1Y3QgbWFjX3N0YXRzICp0M19tYWNfdXBkYXRlX3N0YXRzKHN0cnVjdCBjbWFjICptYWMpOworaW50IHQzX21hY19zZXRfc3BlZWRfZHVwbGV4X2ZjKHN0cnVjdCBjbWFjICptYWMsIGludCBzcGVlZCwgaW50IGR1cGxleCwgaW50IGZjKTsKKwordm9pZCB0M19tYzVfcHJlcChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IG1jNSAqbWM1LCBpbnQgbW9kZSk7CitpbnQgdDNfbWM1X2luaXQoc3RydWN0IG1jNSAqbWM1LCB1bnNpZ25lZCBpbnQgbnNlcnZlcnMsIHVuc2lnbmVkIGludCBuZmlsdGVycywKKwkJdW5zaWduZWQgaW50IG5yb3V0ZXMpOwordm9pZCB0M19tYzVfaW50cl9oYW5kbGVyKHN0cnVjdCBtYzUgKm1jNSk7CitpbnQgdDNfcmVhZF9tYzVfcmFuZ2UoY29uc3Qgc3RydWN0IG1jNSAqbWM1LCB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBuLAorCQkgICAgICB1MzIgKmJ1Zik7CisKK2ludCB0M190cF9zZXRfY29hbGVzY2luZ19zaXplKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IHBzaCk7Cit2b2lkIHQzX3RwX3NldF9tYXhfcnhzaXplKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgc2l6ZSk7Cit2b2lkIHQzX3RwX3NldF9vZmZsb2FkX21vZGUoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGludCBlbmFibGUpOwordm9pZCB0M190cF9nZXRfbWliX3N0YXRzKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3QgdHBfbWliX3N0YXRzICp0cHMpOwordm9pZCB0M19sb2FkX210dXMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIHNob3J0IG10dXNbTk1UVVNdLAorCQkgIHVuc2lnbmVkIHNob3J0IGFscGhhW05DQ1RSTF9XSU5dLAorCQkgIHVuc2lnbmVkIHNob3J0IGJldGFbTkNDVFJMX1dJTl0sIHVuc2lnbmVkIHNob3J0IG10dV9jYXApOwordm9pZCB0M19yZWFkX2h3X210dXMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIHNob3J0IG10dXNbTk1UVVNdKTsKK3ZvaWQgdDNfZ2V0X2NvbmdfY250bF90YWIoc3RydWN0IGFkYXB0ZXIgKmFkYXAsCisJCQkgIHVuc2lnbmVkIHNob3J0IGluY3JbTk1UVVNdW05DQ1RSTF9XSU5dKTsKK3ZvaWQgdDNfY29uZmlnX3RyYWNlX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgdHJhY2VfcGFyYW1zICp0cCwgaW50IGZpbHRlcl9pbmRleCwKKwkJCSAgICBpbnQgaW52ZXJ0LCBpbnQgZW5hYmxlKTsKK2ludCB0M19jb25maWdfc2NoZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBrYnBzLCBpbnQgc2NoZWQpOworCit2b2lkIHQzX3NnZV9wcmVwKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX3BhcmFtcyAqcCk7Cit2b2lkIHQzX3NnZV9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX3BhcmFtcyAqcCk7CitpbnQgdDNfc2dlX2luaXRfZWNudHh0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQsIGludCBndHNfZW5hYmxlLAorCQkgICAgICAgZW51bSBzZ2VfY29udGV4dF90eXBlIHR5cGUsIGludCByZXNwcSwgdTY0IGJhc2VfYWRkciwKKwkJICAgICAgIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgdG9rZW4sIGludCBnZW4sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY2lkeCk7CitpbnQgdDNfc2dlX2luaXRfZmxjbnR4dChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGlkLAorCQkJaW50IGd0c19lbmFibGUsIHU2NCBiYXNlX2FkZHIsIHVuc2lnbmVkIGludCBzaXplLAorCQkJdW5zaWduZWQgaW50IGVzaXplLCB1bnNpZ25lZCBpbnQgY29uZ190aHJlcywgaW50IGdlbiwKKwkJCXVuc2lnbmVkIGludCBjaWR4KTsKK2ludCB0M19zZ2VfaW5pdF9yc3BjbnR4dChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGlkLAorCQkJIGludCBpcnFfdmVjX2lkeCwgdTY0IGJhc2VfYWRkciwgdW5zaWduZWQgaW50IHNpemUsCisJCQkgdW5zaWduZWQgaW50IGZsX3RocmVzLCBpbnQgZ2VuLCB1bnNpZ25lZCBpbnQgY2lkeCk7CitpbnQgdDNfc2dlX2luaXRfY3FjbnR4dChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGlkLCB1NjQgYmFzZV9hZGRyLAorCQkJdW5zaWduZWQgaW50IHNpemUsIGludCByc3BxLCBpbnQgb3ZmbF9tb2RlLAorCQkJdW5zaWduZWQgaW50IGNyZWRpdHMsIHVuc2lnbmVkIGludCBjcmVkaXRfdGhyZXMpOworaW50IHQzX3NnZV9lbmFibGVfZWNudHh0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQsIGludCBlbmFibGUpOworaW50IHQzX3NnZV9kaXNhYmxlX2ZsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQpOworaW50IHQzX3NnZV9kaXNhYmxlX3JzcGNudHh0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQpOworaW50IHQzX3NnZV9kaXNhYmxlX2NxY250eHQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBpZCk7CitpbnQgdDNfc2dlX3JlYWRfZWNudHh0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQsIHUzMiBkYXRhWzRdKTsKK2ludCB0M19zZ2VfcmVhZF9mbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGlkLCB1MzIgZGF0YVs0XSk7CitpbnQgdDNfc2dlX3JlYWRfY3Eoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBpZCwgdTMyIGRhdGFbNF0pOworaW50IHQzX3NnZV9yZWFkX3JzcHEoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBpZCwgdTMyIGRhdGFbNF0pOworaW50IHQzX3NnZV9jcWNudHh0X29wKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBvcCwKKwkJICAgICAgdW5zaWduZWQgaW50IGNyZWRpdHMpOworCit2b2lkIHQzX3ZzYzgyMTFfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgaW50IHBoeV9hZGRyLCBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKTsKK3ZvaWQgdDNfYWVsMTAwMl9waHlfcHJlcChzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCSBpbnQgcGh5X2FkZHIsIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpOwordm9pZCB0M19hZWwxMDA2X3BoeV9wcmVwKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJIGludCBwaHlfYWRkciwgY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcyk7Cit2b2lkIHQzX3F0MjA0NV9waHlfcHJlcChzdHJ1Y3QgY3BoeSAqcGh5LCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBoeV9hZGRyLAorCQkJY29uc3Qgc3RydWN0IG1kaW9fb3BzICptZGlvX29wcyk7Cit2b2lkIHQzX3hhdWlfZGlyZWN0X3BoeV9wcmVwKHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJICAgICBpbnQgcGh5X2FkZHIsIGNvbnN0IHN0cnVjdCBtZGlvX29wcyAqbWRpb19vcHMpOworI2VuZGlmCQkJCS8qIF9fQ0hFTFNJT19DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfY3RsX2RlZnMuaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2N0bF9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5NWRkYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2N0bF9kZWZzLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfQ1hHQjNfT0ZGTE9BRF9DVExfREVGU19ICisjZGVmaW5lIF9DWEdCM19PRkZMT0FEX0NUTF9ERUZTX0gKKworZW51bSB7CisJR0VUX01BWF9PVVRTVEFORElOR19XUiwKKwlHRVRfVFhfTUFYX0NIVU5LLAorCUdFVF9USURfUkFOR0UsCisJR0VUX1NUSURfUkFOR0UsCisJR0VUX1JUQkxfUkFOR0UsCisJR0VUX0wyVF9DQVBBQ0lUWSwKKwlHRVRfTVRVUywKKwlHRVRfV1JfTEVOLAorCUdFVF9JRkZfRlJPTV9NQUMsCisJR0VUX0REUF9QQVJBTVMsCisJR0VUX1BPUlRTLAorCisJVUxQX0lTQ1NJX0dFVF9QQVJBTVMsCisJVUxQX0lTQ1NJX1NFVF9QQVJBTVMsCisKKwlSRE1BX0dFVF9QQVJBTVMsCisJUkRNQV9DUV9PUCwKKwlSRE1BX0NRX1NFVFVQLAorCVJETUFfQ1FfRElTQUJMRSwKKwlSRE1BX0NUUkxfUVBfU0VUVVAsCisJUkRNQV9HRVRfTUVNLAorfTsKKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgVElEIHJhbmdlLiAgVmFsaWQgVElEcyBhcmUgW2Jhc2UsIGJhc2UrbnVtKS4KKyAqLworc3RydWN0IHRpZF9yYW5nZSB7CisJdW5zaWduZWQgaW50IGJhc2U7CS8qIGZpcnN0IFRJRCAqLworCXVuc2lnbmVkIGludCBudW07CS8qIG51bWJlciBvZiBUSURzIGluIHJhbmdlICovCit9OworCisvKgorICogU3RydWN0dXJlIHVzZWQgdG8gcmVxdWVzdCB0aGUgc2l6ZSBhbmQgY29udGVudHMgb2YgdGhlIE1UVSB0YWJsZS4KKyAqLworc3RydWN0IG10dXRhYiB7CisJdW5zaWduZWQgaW50IHNpemU7CS8qICMgb2YgZW50cmllcyBpbiB0aGUgTVRVIHRhYmxlICovCisJY29uc3QgdW5zaWduZWQgc2hvcnQgKm10dXM7CS8qIHRoZSBNVFUgdGFibGUgdmFsdWVzICovCit9OworCitzdHJ1Y3QgbmV0X2RldmljZTsKKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIHJlcXVlc3QgdGhlIGFkYXB0ZXIgbmV0X2RldmljZSBvd25pbmcgYSBnaXZlbiBNQUMgYWRkcmVzcy4KKyAqLworc3RydWN0IGlmZl9tYWMgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CS8qIHRoZSBuZXRfZGV2aWNlICovCisJY29uc3QgdW5zaWduZWQgY2hhciAqbWFjX2FkZHI7CS8qIE1BQyBhZGRyZXNzIHRvIGxvb2t1cCAqLworCXUxNiB2bGFuX3RhZzsKK307CisKK3N0cnVjdCBwY2lfZGV2OworCisvKgorICogU3RydWN0dXJlIHVzZWQgdG8gcmVxdWVzdCB0aGUgVENQIEREUCBwYXJhbWV0ZXJzLgorICovCitzdHJ1Y3QgZGRwX3BhcmFtcyB7CisJdW5zaWduZWQgaW50IGxsaW1pdDsJLyogVEREUCByZWdpb24gc3RhcnQgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCB1bGltaXQ7CS8qIFRERFAgcmVnaW9uIGVuZCBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IHRhZ19tYXNrOwkvKiBURERQIHRhZyBtYXNrICovCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7Cit9OworCitzdHJ1Y3QgYWRhcF9wb3J0cyB7CisJdW5zaWduZWQgaW50IG5wb3J0czsJLyogbnVtYmVyIG9mIHBvcnRzIG9uIHRoaXMgYWRhcHRlciAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpsbGRldnNbMl07Cit9OworCisvKgorICogU3RydWN0dXJlIHVzZWQgdG8gcmV0dXJuIGluZm9ybWF0aW9uIHRvIHRoZSBpc2NzaSBsYXllci4KKyAqLworc3RydWN0IHVscF9pc2NzaV9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBsbGltaXQ7CisJdW5zaWduZWQgaW50IHVsaW1pdDsKKwl1bnNpZ25lZCBpbnQgdGFnbWFzazsKKwl1bnNpZ25lZCBpbnQgcGdzejM7CisJdW5zaWduZWQgaW50IHBnc3oyOworCXVuc2lnbmVkIGludCBwZ3N6MTsKKwl1bnNpZ25lZCBpbnQgcGdzejA7CisJdW5zaWduZWQgaW50IG1heF9yeHN6OworCXVuc2lnbmVkIGludCBtYXhfdHhzejsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byByZXR1cm4gaW5mb3JtYXRpb24gdG8gdGhlIFJETUEgbGF5ZXIuCisgKi8KK3N0cnVjdCByZG1hX2luZm8geworCXVuc2lnbmVkIGludCB0cHRfYmFzZTsJLyogVFBUIGJhc2UgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCB0cHRfdG9wOwkvKiBUUFQgbGFzdCBlbnRyeSBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IHBibF9iYXNlOwkvKiBQQkwgYmFzZSBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IHBibF90b3A7CS8qIFBCTCBsYXN0IGVudHJ5IGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgcnF0X2Jhc2U7CS8qIFJRVCBiYXNlIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgcnF0X3RvcDsJLyogUlFUIGxhc3QgZW50cnkgYWRkcmVzcyAqLworCXVuc2lnbmVkIGludCB1ZGJlbGxfbGVuOwkvKiB1c2VyIGRvb3JiZWxsIHJlZ2lvbiBsZW5ndGggKi8KKwl1bnNpZ25lZCBsb25nIHVkYmVsbF9waHlzYmFzZTsJLyogdXNlciBkb29yYmVsbCBwaHlzaWNhbCBzdGFydCBhZGRyICovCisJdm9pZCBfX2lvbWVtICprZGJfYWRkcjsJLyoga2VybmVsIGRvb3JiZWxsIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLyogYXNzb2NpYXRlZCBQQ0kgZGV2aWNlICovCit9OworCisvKgorICogU3RydWN0dXJlIHVzZWQgdG8gcmVxdWVzdCBhbiBvcGVyYXRpb24gb24gYW4gUkRNQSBjb21wbGV0aW9uIHF1ZXVlLgorICovCitzdHJ1Y3QgcmRtYV9jcV9vcCB7CisJdW5zaWduZWQgaW50IGlkOworCXVuc2lnbmVkIGludCBvcDsKKwl1bnNpZ25lZCBpbnQgY3JlZGl0czsKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBzZXR1cCBSRE1BIGNvbXBsZXRpb24gcXVldWVzLgorICovCitzdHJ1Y3QgcmRtYV9jcV9zZXR1cCB7CisJdW5zaWduZWQgaW50IGlkOworCXVuc2lnbmVkIGxvbmcgbG9uZyBiYXNlX2FkZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IGNyZWRpdHM7CisJdW5zaWduZWQgaW50IGNyZWRpdF90aHJlczsKKwl1bnNpZ25lZCBpbnQgb3ZmbF9tb2RlOworfTsKKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIHNldHVwIHRoZSBSRE1BIGNvbnRyb2wgZWdyZXNzIGNvbnRleHQuCisgKi8KK3N0cnVjdCByZG1hX2N0cmxxcF9zZXR1cCB7CisJdW5zaWduZWQgbG9uZyBsb25nIGJhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK307CisjZW5kaWYJCQkJLyogX0NYR0IzX09GRkxPQURfQ1RMX0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfZGVmcy5oIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTAwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19kZWZzLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IE9wZW4gR3JpZCBDb21wdXRpbmcsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9DSEVMU0lPX0RFRlNfSAorI2RlZmluZSBfQ0hFTFNJT19ERUZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworI2luY2x1ZGUgInQzY2Rldi5oIgorCisjaW5jbHVkZSAiY3hnYjNfb2ZmbG9hZC5oIgorCisjZGVmaW5lIFZBTElEQVRFX1RJRCAxCisKK3ZvaWQgKmN4Z2JfYWxsb2NfbWVtKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Cit2b2lkIGN4Z2JfZnJlZV9tZW0odm9pZCAqYWRkcik7Cit2b2lkIGN4Z2JfbmVpZ2hfdXBkYXRlKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKTsKK3ZvaWQgY3hnYl9yZWRpcmVjdChzdHJ1Y3QgZHN0X2VudHJ5ICpvbGQsIHN0cnVjdCBkc3RfZW50cnkgKm5ldyk7CisKKy8qCisgKiBNYXAgYW4gQVRJRCBvciBTVElEIHRvIHRoZWlyIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgVElEIHRhYmxlcy4KKyAqLworc3RhdGljIGlubGluZSB1bmlvbiBhY3RpdmVfb3Blbl9lbnRyeSAqYXRpZDJlbnRyeShjb25zdCBzdHJ1Y3QgdGlkX2luZm8gKnQsCisJCQkJCQkgIHVuc2lnbmVkIGludCBhdGlkKQoreworCXJldHVybiAmdC0+YXRpZF90YWJbYXRpZCAtIHQtPmF0aWRfYmFzZV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5pb24gbGlzdGVuX2VudHJ5ICpzdGlkMmVudHJ5KGNvbnN0IHN0cnVjdCB0aWRfaW5mbyAqdCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RpZCkKK3sKKwlyZXR1cm4gJnQtPnN0aWRfdGFiW3N0aWQgLSB0LT5zdGlkX2Jhc2VdOworfQorCisvKgorICogRmluZCB0aGUgY29ubmVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgVElELgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0M2NfdGlkX2VudHJ5ICpsb29rdXBfdGlkKGNvbnN0IHN0cnVjdCB0aWRfaW5mbyAqdCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCB0aWQpCit7CisJcmV0dXJuIHRpZCA8IHQtPm50aWRzID8gJih0LT50aWRfdGFiW3RpZF0pIDogTlVMTDsKK30KKworLyoKKyAqIEZpbmQgdGhlIGNvbm5lY3Rpb24gY29ycmVzcG9uZGluZyB0byBhIHNlcnZlciBUSUQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHQzY190aWRfZW50cnkgKmxvb2t1cF9zdGlkKGNvbnN0IHN0cnVjdCB0aWRfaW5mbyAqdCwKKwkJCQkJCXVuc2lnbmVkIGludCB0aWQpCit7CisJaWYgKHRpZCA8IHQtPnN0aWRfYmFzZSB8fCB0aWQgPj0gdC0+c3RpZF9iYXNlICsgdC0+bnN0aWRzKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJihzdGlkMmVudHJ5KHQsIHRpZCktPnQzY190aWQpOworfQorCisvKgorICogRmluZCB0aGUgY29ubmVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIGFuIGFjdGl2ZS1vcGVuIFRJRC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgdDNjX3RpZF9lbnRyeSAqbG9va3VwX2F0aWQoY29uc3Qgc3RydWN0IHRpZF9pbmZvICp0LAorCQkJCQkJdW5zaWduZWQgaW50IHRpZCkKK3sKKwlpZiAodGlkIDwgdC0+YXRpZF9iYXNlIHx8IHRpZCA+PSB0LT5hdGlkX2Jhc2UgKyB0LT5uYXRpZHMpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmKGF0aWQyZW50cnkodCwgdGlkKS0+dDNjX3RpZCk7Cit9CisKK2ludCBwcm9jZXNzX3J4KHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKipza2JzLCBpbnQgbik7CitpbnQgYXR0YWNoX3QzY2RldihzdHJ1Y3QgdDNjZGV2ICpkZXYpOwordm9pZCBkZXRhY2hfdDNjZGV2KHN0cnVjdCB0M2NkZXYgKmRldik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX2lvY3RsLmggYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19pb2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NDI4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19pb2N0bC5oCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX19DSElPQ1RMX0hfXworI2RlZmluZSBfX0NISU9DVExfSF9fCisKKy8qCisgKiBJb2N0bCBjb21tYW5kcyBzcGVjaWZpYyB0byB0aGlzIGRyaXZlci4KKyAqLworZW51bSB7CisJQ0hFTFNJT19TRVRSRUcgPSAxMDI0LAorCUNIRUxTSU9fR0VUUkVHLAorCUNIRUxTSU9fU0VUVFBJLAorCUNIRUxTSU9fR0VUVFBJLAorCUNIRUxTSU9fR0VUTVRVVEFCLAorCUNIRUxTSU9fU0VUTVRVVEFCLAorCUNIRUxTSU9fR0VUTVRVLAorCUNIRUxTSU9fU0VUX1BNLAorCUNIRUxTSU9fR0VUX1BNLAorCUNIRUxTSU9fR0VUX1RDQU0sCisJQ0hFTFNJT19TRVRfVENBTSwKKwlDSEVMU0lPX0dFVF9UQ0IsCisJQ0hFTFNJT19HRVRfTUVNLAorCUNIRUxTSU9fTE9BRF9GVywKKwlDSEVMU0lPX0dFVF9QUk9UTywKKwlDSEVMU0lPX1NFVF9QUk9UTywKKwlDSEVMU0lPX1NFVF9UUkFDRV9GSUxURVIsCisJQ0hFTFNJT19TRVRfUVNFVF9QQVJBTVMsCisJQ0hFTFNJT19HRVRfUVNFVF9QQVJBTVMsCisJQ0hFTFNJT19TRVRfUVNFVF9OVU0sCisJQ0hFTFNJT19HRVRfUVNFVF9OVU0sCisJQ0hFTFNJT19TRVRfUEtUU0NIRUQsCit9OworCitzdHJ1Y3QgY2hfcmVnIHsKKwl1aW50MzJfdCBjbWQ7CisJdWludDMyX3QgYWRkcjsKKwl1aW50MzJfdCB2YWw7Cit9OworCitzdHJ1Y3QgY2hfY250eHQgeworCXVpbnQzMl90IGNtZDsKKwl1aW50MzJfdCBjbnR4dF90eXBlOworCXVpbnQzMl90IGNudHh0X2lkOworCXVpbnQzMl90IGRhdGFbNF07Cit9OworCisvKiBjb250ZXh0IHR5cGVzICovCitlbnVtIHsgQ05UWFRfVFlQRV9FR1JFU1MsIENOVFhUX1RZUEVfRkwsIENOVFhUX1RZUEVfUlNQLCBDTlRYVF9UWVBFX0NRIH07CisKK3N0cnVjdCBjaF9kZXNjIHsKKwl1aW50MzJfdCBjbWQ7CisJdWludDMyX3QgcXVldWVfbnVtOworCXVpbnQzMl90IGlkeDsKKwl1aW50MzJfdCBzaXplOworCXVpbnQ4X3QgZGF0YVsxMjhdOworfTsKKworc3RydWN0IGNoX21lbV9yYW5nZSB7CisJdWludDMyX3QgY21kOworCXVpbnQzMl90IG1lbV9pZDsKKwl1aW50MzJfdCBhZGRyOworCXVpbnQzMl90IGxlbjsKKwl1aW50MzJfdCB2ZXJzaW9uOworCXVpbnQ4X3QgYnVmWzBdOworfTsKKworc3RydWN0IGNoX3FzZXRfcGFyYW1zIHsKKwl1aW50MzJfdCBjbWQ7CisJdWludDMyX3QgcXNldF9pZHg7CisJaW50MzJfdCB0eHFfc2l6ZVszXTsKKwlpbnQzMl90IHJzcHFfc2l6ZTsKKwlpbnQzMl90IGZsX3NpemVbMl07CisJaW50MzJfdCBpbnRyX2xhdDsKKwlpbnQzMl90IHBvbGxpbmc7CisJaW50MzJfdCBjb25nX3RocmVzOworfTsKKworc3RydWN0IGNoX3BrdHNjaGVkX3BhcmFtcyB7CisJdWludDMyX3QgY21kOworCXVpbnQ4X3Qgc2NoZWQ7CisJdWludDhfdCBpZHg7CisJdWludDhfdCBtaW47CisJdWludDhfdCBtYXg7CisJdWludDhfdCBiaW5kaW5nOworfTsKKworI2lmbmRlZiBUQ0JfU0laRQorIyBkZWZpbmUgVENCX1NJWkUgICAxMjgKKyNlbmRpZgorCisvKiBUQ0Igc2l6ZSBpbiAzMi1iaXQgd29yZHMgKi8KKyNkZWZpbmUgVENCX1dPUkRTIChUQ0JfU0laRSAvIDQpCisKK2VudW0geyBNRU1fQ00sIE1FTV9QTVJYLCBNRU1fUE1UWCB9OwkvKiBjaF9tZW1fcmFuZ2UubWVtX2lkIHZhbHVlcyAqLworCitzdHJ1Y3QgY2hfbXR1cyB7CisJdWludDMyX3QgY21kOworCXVpbnQzMl90IG5tdHVzOworCXVpbnQxNl90IG10dXNbTk1UVVNdOworfTsKKworc3RydWN0IGNoX3BtIHsKKwl1aW50MzJfdCBjbWQ7CisJdWludDMyX3QgdHhfcGdfc3o7CisJdWludDMyX3QgdHhfbnVtX3BnOworCXVpbnQzMl90IHJ4X3BnX3N6OworCXVpbnQzMl90IHJ4X251bV9wZzsKKwl1aW50MzJfdCBwbV90b3RhbDsKK307CisKK3N0cnVjdCBjaF90Y2FtIHsKKwl1aW50MzJfdCBjbWQ7CisJdWludDMyX3QgdGNhbV9zaXplOworCXVpbnQzMl90IG5zZXJ2ZXJzOworCXVpbnQzMl90IG5yb3V0ZXM7CisJdWludDMyX3QgbmZpbHRlcnM7Cit9OworCitzdHJ1Y3QgY2hfdGNiIHsKKwl1aW50MzJfdCBjbWQ7CisJdWludDMyX3QgdGNiX2luZGV4OworCXVpbnQzMl90IHRjYl9kYXRhW1RDQl9XT1JEU107Cit9OworCitzdHJ1Y3QgY2hfdGNhbV93b3JkIHsKKwl1aW50MzJfdCBjbWQ7CisJdWludDMyX3QgYWRkcjsKKwl1aW50MzJfdCBidWZbM107Cit9OworCitzdHJ1Y3QgY2hfdHJhY2UgeworCXVpbnQzMl90IGNtZDsKKwl1aW50MzJfdCBzaXA7CisJdWludDMyX3Qgc2lwX21hc2s7CisJdWludDMyX3QgZGlwOworCXVpbnQzMl90IGRpcF9tYXNrOworCXVpbnQxNl90IHNwb3J0OworCXVpbnQxNl90IHNwb3J0X21hc2s7CisJdWludDE2X3QgZHBvcnQ7CisJdWludDE2X3QgZHBvcnRfbWFzazsKKwl1aW50MzJfdCB2bGFuOjEyOworCXVpbnQzMl90IHZsYW5fbWFzazoxMjsKKwl1aW50MzJfdCBpbnRmOjQ7CisJdWludDMyX3QgaW50Zl9tYXNrOjQ7CisJdWludDhfdCBwcm90bzsKKwl1aW50OF90IHByb3RvX21hc2s7CisJdWludDhfdCBpbnZlcnRfbWF0Y2g6MTsKKwl1aW50OF90IGNvbmZpZ190eDoxOworCXVpbnQ4X3QgY29uZmlnX3J4OjE7CisJdWludDhfdCB0cmFjZV90eDoxOworCXVpbnQ4X3QgdHJhY2Vfcng6MTsKK307CisKKyNkZWZpbmUgU0lPQ0NISU9DVEwgU0lPQ0RFVlBSSVZBVEUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhMDM1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX21haW4uYwpAQCAtMCwwICsxLDI1MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiY3hnYjNfaW9jdGwuaCIKKyNpbmNsdWRlICJyZWdzLmgiCisjaW5jbHVkZSAiY3hnYjNfb2ZmbG9hZC5oIgorI2luY2x1ZGUgInZlcnNpb24uaCIKKworI2luY2x1ZGUgImN4Z2IzX2N0bF9kZWZzLmgiCisjaW5jbHVkZSAidDNfY3BsLmgiCisjaW5jbHVkZSAiZmlybXdhcmVfZXhwb3J0cy5oIgorCitlbnVtIHsKKwlNQVhfVFhRX0VOVFJJRVMgPSAxNjM4NCwKKwlNQVhfQ1RSTF9UWFFfRU5UUklFUyA9IDEwMjQsCisJTUFYX1JTUFFfRU5UUklFUyA9IDE2Mzg0LAorCU1BWF9SWF9CVUZGRVJTID0gMTYzODQsCisJTUFYX1JYX0pVTUJPX0JVRkZFUlMgPSAxNjM4NCwKKwlNSU5fVFhRX0VOVFJJRVMgPSA0LAorCU1JTl9DVFJMX1RYUV9FTlRSSUVTID0gNCwKKwlNSU5fUlNQUV9FTlRSSUVTID0gMzIsCisJTUlOX0ZMX0VOVFJJRVMgPSAzMgorfTsKKworI2RlZmluZSBQT1JUX01BU0sgKCgxIDw8IE1BWF9OUE9SVFMpIC0gMSkKKworI2RlZmluZSBERkxUX01TR19FTkFCTEUgKE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfTElOSyB8IFwKKwkJCSBORVRJRl9NU0dfVElNRVIgfCBORVRJRl9NU0dfSUZET1dOIHwgTkVUSUZfTVNHX0lGVVAgfFwKKwkJCSBORVRJRl9NU0dfUlhfRVJSIHwgTkVUSUZfTVNHX1RYX0VSUikKKworI2RlZmluZSBFRVBST01fTUFHSUMgMHgzOEUyRjEwQworCisjZGVmaW5lIHRvX25ldF9kZXYoY2xhc3MpIGNvbnRhaW5lcl9vZihjbGFzcywgc3RydWN0IG5ldF9kZXZpY2UsIGNsYXNzX2RldikKKworI2RlZmluZSBDSF9ERVZJQ0UoZGV2aWQsIHNzaWQsIGlkeCkgXAorCXsgUENJX1ZFTkRPUl9JRF9DSEVMU0lPLCBkZXZpZCwgUENJX0FOWV9JRCwgc3NpZCwgMCwgMCwgaWR4IH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGN4Z2IzX3BjaV90YmxbXSA9IHsKKwlDSF9ERVZJQ0UoMHgyMCwgMSwgMCksCS8qIFBFOTAwMCAqLworCUNIX0RFVklDRSgweDIxLCAxLCAxKSwJLyogVDMwMkUgKi8KKwlDSF9ERVZJQ0UoMHgyMiwgMSwgMiksCS8qIFQzMTBFICovCisJQ0hfREVWSUNFKDB4MjMsIDEsIDMpLAkvKiBUMzIwWCAqLworCUNIX0RFVklDRSgweDI0LCAxLCAxKSwJLyogVDMwMlggKi8KKwlDSF9ERVZJQ0UoMHgyNSwgMSwgMyksCS8qIFQzMjBFICovCisJQ0hfREVWSUNFKDB4MjYsIDEsIDIpLAkvKiBUMzEwWCAqLworCUNIX0RFVklDRSgweDMwLCAxLCAyKSwJLyogVDNCMTAgKi8KKwlDSF9ERVZJQ0UoMHgzMSwgMSwgMyksCS8qIFQzQjIwICovCisJQ0hfREVWSUNFKDB4MzIsIDEsIDEpLAkvKiBUM0IwMiAqLworCXswLH0KK307CisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQyk7CitNT0RVTEVfQVVUSE9SKCJDaGVsc2lvIENvbW11bmljYXRpb25zIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY3hnYjNfcGNpX3RibCk7CisKK3N0YXRpYyBpbnQgZGZsdF9tc2dfZW5hYmxlID0gREZMVF9NU0dfRU5BQkxFOworCittb2R1bGVfcGFyYW0oZGZsdF9tc2dfZW5hYmxlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZmx0X21zZ19lbmFibGUsICJDaGVsc2lvIFQzIGRlZmF1bHQgbWVzc2FnZSBlbmFibGUgYml0bWFwIik7CisKKy8qCisgKiBUaGUgZHJpdmVyIHVzZXMgdGhlIGJlc3QgaW50ZXJydXB0IHNjaGVtZSBhdmFpbGFibGUgb24gYSBwbGF0Zm9ybSBpbiB0aGUKKyAqIG9yZGVyIE1TSS1YLCBNU0ksIGxlZ2FjeSBwaW4gaW50ZXJydXB0cy4gIFRoaXMgcGFyYW1ldGVyIGRldGVybWluZXMgd2hpY2gKKyAqIG9mIHRoZXNlIHNjaGVtZXMgdGhlIGRyaXZlciBtYXkgY29uc2lkZXIgYXMgZm9sbG93czoKKyAqCisgKiBtc2kgPSAyOiBjaG9vc2UgZnJvbSBhbW9uZyBhbGwgdGhyZWUgb3B0aW9ucworICogbXNpID0gMTogb25seSBjb25zaWRlciBNU0kgYW5kIHBpbiBpbnRlcnJ1cHRzCisgKiBtc2kgPSAwOiBmb3JjZSBwaW4gaW50ZXJydXB0cworICovCitzdGF0aWMgaW50IG1zaSA9IDI7CisKK21vZHVsZV9wYXJhbShtc2ksIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1zaSwgIndoZXRoZXIgdG8gdXNlIE1TSSBvciBNU0ktWCIpOworCisvKgorICogVGhlIGRyaXZlciBlbmFibGVzIG9mZmxvYWQgYXMgYSBkZWZhdWx0LgorICogVG8gZGlzYWJsZSBpdCwgdXNlIG9mbGRfZGlzYWJsZSA9IDEuCisgKi8KKworc3RhdGljIGludCBvZmxkX2Rpc2FibGUgPSAwOworCittb2R1bGVfcGFyYW0ob2ZsZF9kaXNhYmxlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhvZmxkX2Rpc2FibGUsICJ3aGV0aGVyIHRvIGVuYWJsZSBvZmZsb2FkIGF0IGluaXQgdGltZSBvciBub3QiKTsKKworLyoKKyAqIFdlIGhhdmUgd29yayBlbGVtZW50cyB0aGF0IHdlIG5lZWQgdG8gY2FuY2VsIHdoZW4gYW4gaW50ZXJmYWNlIGlzIHRha2VuCisgKiBkb3duLiAgTm9ybWFsbHkgdGhlIHdvcmsgZWxlbWVudHMgd291bGQgYmUgZXhlY3V0ZWQgYnkga2V2ZW50ZCBidXQgdGhhdAorICogY2FuIGRlYWRsb2NrIGJlY2F1c2Ugb2YgbGlua3dhdGNoLiAgSWYgb3VyIGNsb3NlIG1ldGhvZCB0YWtlcyB0aGUgcnRubAorICogbG9jayBhbmQgbGlua3dhdGNoIGlzIGFoZWFkIG9mIG91ciB3b3JrIGVsZW1lbnRzIGluIGtldmVudGQsIGxpbmt3YXRjaAorICogd2lsbCBibG9jayBrZXZlbnRkIGFzIGl0IG5lZWRzIHRoZSBydG5sIGxvY2ssIGFuZCB3ZSdsbCBkZWFkbG9jayB3YWl0aW5nCisgKiBmb3Igb3VyIHdvcmsgdG8gY29tcGxldGUuICBHZXQgb3VyIG93biB3b3JrIHF1ZXVlIHRvIHNvbHZlIHRoaXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY3hnYjNfd3E7CisKKy8qKgorICoJbGlua19yZXBvcnQgLSBzaG93IGxpbmsgc3RhdHVzIGFuZCBsaW5rIHNwZWVkL2R1cGxleAorICoJQHA6IHRoZSBwb3J0IHdob3NlIHNldHRpbmdzIGFyZSB0byBiZSByZXBvcnRlZAorICoKKyAqCVNob3dzIHRoZSBsaW5rIHN0YXR1cywgc3BlZWQsIGFuZCBkdXBsZXggb2YgYSBwb3J0LgorICovCitzdGF0aWMgdm9pZCBsaW5rX3JlcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBkb3duXG4iLCBkZXYtPm5hbWUpOworCWVsc2UgeworCQljb25zdCBjaGFyICpzID0gIjEwTWJwcyI7CisJCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCXN3aXRjaCAocC0+bGlua19jb25maWcuc3BlZWQpIHsKKwkJY2FzZSBTUEVFRF8xMDAwMDoKKwkJCXMgPSAiMTBHYnBzIjsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDA6CisJCQlzID0gIjEwMDBNYnBzIjsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDoKKwkJCXMgPSAiMTAwTWJwcyI7CisJCQlicmVhazsKKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBsaW5rIHVwLCAlcywgJXMtZHVwbGV4XG4iLCBkZXYtPm5hbWUsIHMsCisJCSAgICAgICBwLT5saW5rX2NvbmZpZy5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgPyAiZnVsbCIgOiAiaGFsZiIpOworCX0KK30KKworLyoqCisgKgl0M19vc19saW5rX2NoYW5nZWQgLSBoYW5kbGUgbGluayBzdGF0dXMgY2hhbmdlcworICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluayBjaGFuZ2UKKyAqCUBwb3J0X2lkOiB0aGUgcG9ydCBpbmRleCB3aG9zZSBsaW1rIHN0YXR1cyBoYXMgY2hhbmdlZAorICoJQGxpbmtfc3RhdDogdGhlIG5ldyBzdGF0dXMgb2YgdGhlIGxpbmsKKyAqCUBzcGVlZDogdGhlIG5ldyBzcGVlZCBzZXR0aW5nCisgKglAZHVwbGV4OiB0aGUgbmV3IGR1cGxleCBzZXR0aW5nCisgKglAcGF1c2U6IHRoZSBuZXcgZmxvdy1jb250cm9sIHNldHRpbmcKKyAqCisgKglUaGlzIGlzIHRoZSBPUy1kZXBlbmRlbnQgaGFuZGxlciBmb3IgbGluayBzdGF0dXMgY2hhbmdlcy4gIFRoZSBPUworICoJbmV1dHJhbCBoYW5kbGVyIHRha2VzIGNhcmUgb2YgbW9zdCBvZiB0aGUgcHJvY2Vzc2luZyBmb3IgdGhlc2UgZXZlbnRzLAorICoJdGhlbiBjYWxscyB0aGlzIGhhbmRsZXIgZm9yIGFueSBPUy1zcGVjaWZpYyBwcm9jZXNzaW5nLgorICovCit2b2lkIHQzX29zX2xpbmtfY2hhbmdlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnRfaWQsIGludCBsaW5rX3N0YXQsCisJCQlpbnQgc3BlZWQsIGludCBkdXBsZXgsIGludCBwYXVzZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRhcHRlci0+cG9ydFtwb3J0X2lkXTsKKworCS8qIFNraXAgY2hhbmdlcyBmcm9tIGRpc2FibGVkIHBvcnRzLiAqLworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm47CisKKwlpZiAobGlua19zdGF0ICE9IG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQlpZiAobGlua19zdGF0KQorCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQllbHNlCisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQlsaW5rX3JlcG9ydChkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgY3hnYl9zZXRfcnhtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHQzX3J4X21vZGUgcm07CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaW5pdF9yeF9tb2RlKCZybSwgZGV2LCBkZXYtPm1jX2xpc3QpOworCXQzX21hY19zZXRfcnhfbW9kZSgmcGktPm1hYywgJnJtKTsKK30KKworLyoqCisgKglsaW5rX3N0YXJ0IC0gZW5hYmxlIGEgcG9ydAorICoJQGRldjogdGhlIGRldmljZSB0byBlbmFibGUKKyAqCisgKglQZXJmb3JtcyB0aGUgTUFDIGFuZCBQSFkgYWN0aW9ucyBuZWVkZWQgdG8gZW5hYmxlIGEgcG9ydC4KKyAqLworc3RhdGljIHZvaWQgbGlua19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0M19yeF9tb2RlIHJtOworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgY21hYyAqbWFjID0gJnBpLT5tYWM7CisKKwlpbml0X3J4X21vZGUoJnJtLCBkZXYsIGRldi0+bWNfbGlzdCk7CisJdDNfbWFjX3Jlc2V0KG1hYyk7CisJdDNfbWFjX3NldF9tdHUobWFjLCBkZXYtPm10dSk7CisJdDNfbWFjX3NldF9hZGRyZXNzKG1hYywgMCwgZGV2LT5kZXZfYWRkcik7CisJdDNfbWFjX3NldF9yeF9tb2RlKG1hYywgJnJtKTsKKwl0M19saW5rX3N0YXJ0KCZwaS0+cGh5LCBtYWMsICZwaS0+bGlua19jb25maWcpOworCXQzX21hY19lbmFibGUobWFjLCBNQUNfRElSRUNUSU9OX1JYIHwgTUFDX0RJUkVDVElPTl9UWCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjeGdiX2Rpc2FibGVfbXNpKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCWlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSVgpIHsKKwkJcGNpX2Rpc2FibGVfbXNpeChhZGFwdGVyLT5wZGV2KTsKKwkJYWRhcHRlci0+ZmxhZ3MgJj0gflVTSU5HX01TSVg7CisJfSBlbHNlIGlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSSkgeworCQlwY2lfZGlzYWJsZV9tc2koYWRhcHRlci0+cGRldik7CisJCWFkYXB0ZXItPmZsYWdzICY9IH5VU0lOR19NU0k7CisJfQorfQorCisvKgorICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIGFzeW5jaHJvbm91cyBldmVudHMgdXNlZCB3aXRoIE1TSS1YLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdDNfYXN5bmNfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmNvb2tpZSkKK3sKKwl0M19zbG93X2ludHJfaGFuZGxlcihjb29raWUpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIE5hbWUgdGhlIE1TSS1YIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIG5hbWVfbXNpeF92ZWNzKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCWludCBpLCBqLCBtc2lfaWR4ID0gMSwgbiA9IHNpemVvZihhZGFwLT5tc2l4X2luZm9bMF0uZGVzYykgLSAxOworCisJc25wcmludGYoYWRhcC0+bXNpeF9pbmZvWzBdLmRlc2MsIG4sICIlcyIsIGFkYXAtPm5hbWUpOworCWFkYXAtPm1zaXhfaW5mb1swXS5kZXNjW25dID0gMDsKKworCWZvcl9lYWNoX3BvcnQoYWRhcCwgaikgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZCA9IGFkYXAtPnBvcnRbal07CisJCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZCk7CisKKwkJZm9yIChpID0gMDsgaSA8IHBpLT5ucXNldHM7IGkrKywgbXNpX2lkeCsrKSB7CisJCQlzbnByaW50ZihhZGFwLT5tc2l4X2luZm9bbXNpX2lkeF0uZGVzYywgbiwKKwkJCQkgIiVzIChxdWV1ZSAlZCkiLCBkLT5uYW1lLCBpKTsKKwkJCWFkYXAtPm1zaXhfaW5mb1ttc2lfaWR4XS5kZXNjW25dID0gMDsKKwkJfQorIAl9Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9tc2l4X2RhdGFfaXJxcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlpbnQgaSwgaiwgZXJyLCBxaWR4ID0gMDsKKworCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgeworCQlpbnQgbnFzZXRzID0gYWRhcDJwaW5mbyhhZGFwLCBpKS0+bnFzZXRzOworCisJCWZvciAoaiA9IDA7IGogPCBucXNldHM7ICsraikgeworCQkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcC0+bXNpeF9pbmZvW3FpZHggKyAxXS52ZWMsCisJCQkJCSAgdDNfaW50cl9oYW5kbGVyKGFkYXAsCisJCQkJCQkJICBhZGFwLT5zZ2UucXNbcWlkeF0uCisJCQkJCQkJICByc3BxLnBvbGxpbmcpLCAwLAorCQkJCQkgIGFkYXAtPm1zaXhfaW5mb1txaWR4ICsgMV0uZGVzYywKKwkJCQkJICAmYWRhcC0+c2dlLnFzW3FpZHhdKTsKKwkJCWlmIChlcnIpIHsKKwkJCQl3aGlsZSAoLS1xaWR4ID49IDApCisJCQkJCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1txaWR4ICsgMV0udmVjLAorCQkJCQkJICZhZGFwLT5zZ2UucXNbcWlkeF0pOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQlxaWR4Kys7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc2V0dXBfcnNzIC0gY29uZmlndXJlIFJTUworICoJQGFkYXA6IHRoZSBhZGFwdGVyCisgKgorICoJU2V0cyB1cCBSU1MgdG8gZGlzdHJpYnV0ZSBwYWNrZXRzIHRvIG11bHRpcGxlIHJlY2VpdmUgcXVldWVzLiAgV2UKKyAqCWNvbmZpZ3VyZSB0aGUgUlNTIENQVSBsb29rdXAgdGFibGUgdG8gZGlzdHJpYnV0ZSB0byB0aGUgbnVtYmVyIG9mIEhXCisgKglyZWNlaXZlIHF1ZXVlcywgYW5kIHRoZSByZXNwb25zZSBxdWV1ZSBsb29rdXAgdGFibGUgdG8gbmFycm93IHRoYXQKKyAqCWRvd24gdG8gdGhlIHJlc3BvbnNlIHF1ZXVlcyBhY3R1YWxseSBjb25maWd1cmVkIGZvciBlYWNoIHBvcnQuCisgKglXZSBhbHdheXMgY29uZmlndXJlIHRoZSBSU1MgbWFwcGluZyBmb3IgdHdvIHBvcnRzIHNpbmNlIHRoZSBtYXBwaW5nCisgKgl0YWJsZSBoYXMgcGxlbnR5IG9mIGVudHJpZXMuCisgKi8KK3N0YXRpYyB2b2lkIHNldHVwX3JzcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbnEwID0gYWRhcDJwaW5mbyhhZGFwLCAwKS0+bnFzZXRzOworCXVuc2lnbmVkIGludCBucTEgPSBhZGFwLT5wb3J0WzFdID8gYWRhcDJwaW5mbyhhZGFwLCAxKS0+bnFzZXRzIDogMTsKKwl1OCBjcHVzW1NHRV9RU0VUUyArIDFdOworCXUxNiByc3BxX21hcFtSU1NfVEFCTEVfU0laRV07CisKKwlmb3IgKGkgPSAwOyBpIDwgU0dFX1FTRVRTOyArK2kpCisJCWNwdXNbaV0gPSBpOworCWNwdXNbU0dFX1FTRVRTXSA9IDB4ZmY7CS8qIHRlcm1pbmF0b3IgKi8KKworCWZvciAoaSA9IDA7IGkgPCBSU1NfVEFCTEVfU0laRSAvIDI7ICsraSkgeworCQlyc3BxX21hcFtpXSA9IGkgJSBucTA7CisJCXJzcHFfbWFwW2kgKyBSU1NfVEFCTEVfU0laRSAvIDJdID0gKGkgJSBucTEpICsgbnEwOworCX0KKworCXQzX2NvbmZpZ19yc3MoYWRhcCwgRl9SUUZFRURCQUNLRU5BQkxFIHwgRl9UTkxMS1BFTiB8IEZfVE5MTUFQRU4gfAorCQkgICAgICBGX1ROTFBSVEVOIHwgRl9UTkwyVFVQRU4gfCBGX1ROTDRUVVBFTiB8CisJCSAgICAgIFZfUlJDUExDUFVTSVpFKDYpLCBjcHVzLCByc3BxX21hcCk7Cit9CisKKy8qCisgKiBJZiB3ZSBoYXZlIG11bHRpcGxlIHJlY2VpdmUgcXVldWVzIHBlciBwb3J0IHNlcnZpY2VkIGJ5IE5BUEkgd2UgbmVlZCBvbmUKKyAqIG5ldGRldmljZSBwZXIgcXVldWUgYXMgTkFQSSBvcGVyYXRlcyBvbiBuZXRkZXZpY2VzLiAgV2UgYWxyZWFkeSBoYXZlIG9uZQorICogbmV0ZGV2aWNlLCBuYW1lbHkgdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVyZmFjZSwgc28gd2UgdXNlIGR1bW15CisgKiBvbmVzIGZvciBhbnkgYWRkaXRpb25hbCBxdWV1ZXMuICBOb3RlIHRoYXQgdGhlc2UgbmV0ZGV2aWNlcyBleGlzdCBwdXJlbHkKKyAqIHNvIHRoYXQgTkFQSSBoYXMgc29tZXRoaW5nIHRvIHdvcmsgd2l0aCwgdGhleSBkbyBub3QgcmVwcmVzZW50IG5ldHdvcmsKKyAqIHBvcnRzIGFuZCBhcmUgbm90IHJlZ2lzdGVyZWQuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9kdW1teV9uZXRkZXZzKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCWludCBpLCBqLCBkdW1teV9pZHggPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZDsKKworCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRhcC0+cG9ydFtpXTsKKwkJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCWZvciAoaiA9IDA7IGogPCBwaS0+bnFzZXRzIC0gMTsgaisrKSB7CisJCQlpZiAoIWFkYXAtPmR1bW15X25ldGRldltkdW1teV9pZHhdKSB7CisJCQkJbmQgPSBhbGxvY19uZXRkZXYoMCwgIiIsIGV0aGVyX3NldHVwKTsKKwkJCQlpZiAoIW5kKQorCQkJCQlnb3RvIGZyZWVfYWxsOworCisJCQkJbmQtPnByaXYgPSBhZGFwOworCQkJCW5kLT53ZWlnaHQgPSA2NDsKKwkJCQlzZXRfYml0KF9fTElOS19TVEFURV9TVEFSVCwgJm5kLT5zdGF0ZSk7CisJCQkJYWRhcC0+ZHVtbXlfbmV0ZGV2W2R1bW15X2lkeF0gPSBuZDsKKwkJCX0KKwkJCXN0cmNweShhZGFwLT5kdW1teV9uZXRkZXZbZHVtbXlfaWR4XS0+bmFtZSwgZGV2LT5uYW1lKTsKKwkJCWR1bW15X2lkeCsrOworCQl9CisJfQorCXJldHVybiAwOworCitmcmVlX2FsbDoKKwl3aGlsZSAoLS1kdW1teV9pZHggPj0gMCkgeworCQlmcmVlX25ldGRldihhZGFwLT5kdW1teV9uZXRkZXZbZHVtbXlfaWR4XSk7CisJCWFkYXAtPmR1bW15X25ldGRldltkdW1teV9pZHhdID0gTlVMTDsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBXYWl0IHVudGlsIGFsbCBOQVBJIGhhbmRsZXJzIGFyZSBkZXNjaGVkdWxlZC4gIFRoaXMgaW5jbHVkZXMgdGhlIGhhbmRsZXJzIG9mCisgKiBib3RoIG5ldGRldmljZXMgcmVwcmVzZW50aW5nIGludGVyZmFjZXMgYW5kIHRoZSBkdW1teSBvbmVzIGZvciB0aGUgZXh0cmEKKyAqIHF1ZXVlcy4KKyAqLworc3RhdGljIHZvaWQgcXVpZXNjZV9yeChzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CisJCWRldiA9IGFkYXAtPnBvcnRbaV07CisJCXdoaWxlICh0ZXN0X2JpdChfX0xJTktfU1RBVEVfUlhfU0NIRUQsICZkZXYtPnN0YXRlKSkKKwkJCW1zbGVlcCgxKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZGFwLT5kdW1teV9uZXRkZXYpOyBpKyspIHsKKwkJZGV2ID0gYWRhcC0+ZHVtbXlfbmV0ZGV2W2ldOworCQlpZiAoZGV2KQorCQkJd2hpbGUgKHRlc3RfYml0KF9fTElOS19TVEFURV9SWF9TQ0hFRCwgJmRldi0+c3RhdGUpKQorCQkJCW1zbGVlcCgxKTsKKwl9Cit9CisKKy8qKgorICoJc2V0dXBfc2dlX3FzZXRzIC0gY29uZmlndXJlIFNHRSBUeC9SeC9yZXNwb25zZSBxdWV1ZXMKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoKKyAqCURldGVybWluZXMgaG93IG1hbnkgc2V0cyBvZiBTR0UgcXVldWVzIHRvIHVzZSBhbmQgaW5pdGlhbGl6ZXMgdGhlbS4KKyAqCVdlIHN1cHBvcnQgbXVsdGlwbGUgcXVldWUgc2V0cyBwZXIgcG9ydCBpZiB3ZSBoYXZlIE1TSS1YLCBvdGhlcndpc2UKKyAqCWp1c3Qgb25lIHF1ZXVlIHNldCBwZXIgcG9ydC4KKyAqLworc3RhdGljIGludCBzZXR1cF9zZ2VfcXNldHMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJaW50IGksIGosIGVyciwgaXJxX2lkeCA9IDAsIHFzZXRfaWR4ID0gMCwgZHVtbXlfZGV2X2lkeCA9IDA7CisJdW5zaWduZWQgaW50IG50eHEgPSBpc19vZmZsb2FkKGFkYXApID8gU0dFX1RYUV9QRVJfU0VUIDogMTsKKworCWlmIChhZGFwLT5wYXJhbXMucmV2ID4gMCAmJiAhKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJKSkKKwkJaXJxX2lkeCA9IC0xOworCisJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwLT5wb3J0W2ldOworCQljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwkJZm9yIChqID0gMDsgaiA8IHBpLT5ucXNldHM7ICsraiwgKytxc2V0X2lkeCkgeworCQkJZXJyID0gdDNfc2dlX2FsbG9jX3FzZXQoYWRhcCwgcXNldF9pZHgsIDEsCisJCQkJKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkgPyBxc2V0X2lkeCArIDEgOgorCQkJCQkJCSAgICAgaXJxX2lkeCwKKwkJCQkmYWRhcC0+cGFyYW1zLnNnZS5xc2V0W3FzZXRfaWR4XSwgbnR4cSwKKwkJCQlqID09IDAgPyBkZXYgOgorCQkJCQkgYWRhcC0+IGR1bW15X25ldGRldltkdW1teV9kZXZfaWR4KytdKTsKKwkJCWlmIChlcnIpIHsKKwkJCQl0M19mcmVlX3NnZV9yZXNvdXJjZXMoYWRhcCk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhdHRyX3Nob3coc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZiwKKwkJCSBzc2l6ZV90KCpmb3JtYXQpIChzdHJ1Y3QgYWRhcHRlciAqLCBjaGFyICopKQoreworCXNzaXplX3QgbGVuOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gdG9fbmV0X2RldihjZCktPnByaXY7CisKKwkvKiBTeW5jaHJvbml6ZSB3aXRoIGlvY3RscyB0aGF0IG1heSBzaHV0IGRvd24gdGhlIGRldmljZSAqLworCXJ0bmxfbG9jaygpOworCWxlbiA9ICgqZm9ybWF0KSAoYWRhcCwgYnVmKTsKKwlydG5sX3VubG9jaygpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0dHJfc3RvcmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCSAgc3NpemVfdCgqc2V0KSAoc3RydWN0IGFkYXB0ZXIgKiwgdW5zaWduZWQgaW50KSwKKwkJCSAgdW5zaWduZWQgaW50IG1pbl92YWwsIHVuc2lnbmVkIGludCBtYXhfdmFsKQoreworCWNoYXIgKmVuZHA7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHRvX25ldF9kZXYoY2QpLT5wcml2OworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7CisJaWYgKGVuZHAgPT0gYnVmIHx8IHZhbCA8IG1pbl92YWwgfHwgdmFsID4gbWF4X3ZhbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlydG5sX2xvY2soKTsKKwlyZXQgPSAoKnNldCkgKGFkYXAsIHZhbCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGxlbjsKKwlydG5sX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgQ1hHQjNfU0hPVyhuYW1lLCB2YWxfZXhwcikgXAorc3RhdGljIHNzaXplX3QgZm9ybWF0XyMjbmFtZShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsX2V4cHIpOyBcCit9IFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpIFwKK3sgXAorCXJldHVybiBhdHRyX3Nob3coY2QsIGJ1ZiwgZm9ybWF0XyMjbmFtZSk7IFwKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X25maWx0ZXJzKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQorCQlyZXR1cm4gLUVCVVNZOworCWlmICh2YWwgJiYgYWRhcC0+cGFyYW1zLnJldiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsID4gdDNfbWM1X3NpemUoJmFkYXAtPm1jNSkgLSBhZGFwLT5wYXJhbXMubWM1Lm5zZXJ2ZXJzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlhZGFwLT5wYXJhbXMubWM1Lm5maWx0ZXJzID0gdmFsOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9uZmlsdGVycyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY29uc3QgY2hhciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYXR0cl9zdG9yZShjZCwgYnVmLCBsZW4sIHNldF9uZmlsdGVycywgMCwgfjApOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfbnNlcnZlcnMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCXJldHVybiAtRUJVU1k7CisJaWYgKHZhbCA+IHQzX21jNV9zaXplKCZhZGFwLT5tYzUpIC0gYWRhcC0+cGFyYW1zLm1jNS5uZmlsdGVycykKKwkJcmV0dXJuIC1FSU5WQUw7CisJYWRhcC0+cGFyYW1zLm1jNS5uc2VydmVycyA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfbnNlcnZlcnMoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGF0dHJfc3RvcmUoY2QsIGJ1ZiwgbGVuLCBzZXRfbnNlcnZlcnMsIDAsIH4wKTsKK30KKworI2RlZmluZSBDWEdCM19BVFRSX1IobmFtZSwgdmFsX2V4cHIpIFwKK0NYR0IzX1NIT1cobmFtZSwgdmFsX2V4cHIpIFwKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93XyMjbmFtZSwgTlVMTCkKKworI2RlZmluZSBDWEdCM19BVFRSX1JXKG5hbWUsIHZhbF9leHByLCBzdG9yZV9tZXRob2QpIFwKK0NYR0IzX1NIT1cobmFtZSwgdmFsX2V4cHIpIFwKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd18jI25hbWUsIHN0b3JlX21ldGhvZCkKKworQ1hHQjNfQVRUUl9SKGNhbV9zaXplLCB0M19tYzVfc2l6ZSgmYWRhcC0+bWM1KSk7CitDWEdCM19BVFRSX1JXKG5maWx0ZXJzLCBhZGFwLT5wYXJhbXMubWM1Lm5maWx0ZXJzLCBzdG9yZV9uZmlsdGVycyk7CitDWEdCM19BVFRSX1JXKG5zZXJ2ZXJzLCBhZGFwLT5wYXJhbXMubWM1Lm5zZXJ2ZXJzLCBzdG9yZV9uc2VydmVycyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjeGdiM19hdHRyc1tdID0geworCSZjbGFzc19kZXZpY2VfYXR0cl9jYW1fc2l6ZS5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9uZmlsdGVycy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9uc2VydmVycy5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGN4Z2IzX2F0dHJfZ3JvdXAgPSB7LmF0dHJzID0gY3hnYjNfYXR0cnMgfTsKKworc3RhdGljIHNzaXplX3QgdG1fYXR0cl9zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYsIGludCBzY2hlZCkKK3sKKwlzc2l6ZV90IGxlbjsKKwl1bnNpZ25lZCBpbnQgdiwgYWRkciwgYnB0LCBjcHQ7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSB0b19uZXRfZGV2KGNkKS0+cHJpdjsKKworCWFkZHIgPSBBX1RQX1RYX01PRF9RMV9RMF9SQVRFX0xJTUlUIC0gc2NoZWQgLyAyOworCXJ0bmxfbG9jaygpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1RNX1BJT19BRERSLCBhZGRyKTsKKwl2ID0gdDNfcmVhZF9yZWcoYWRhcCwgQV9UUF9UTV9QSU9fREFUQSk7CisJaWYgKHNjaGVkICYgMSkKKwkJdiA+Pj0gMTY7CisJYnB0ID0gKHYgPj4gOCkgJiAweGZmOworCWNwdCA9IHYgJiAweGZmOworCWlmICghY3B0KQorCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgImRpc2FibGVkXG4iKTsKKwllbHNlIHsKKwkJdiA9IChhZGFwLT5wYXJhbXMudnBkLmNjbGsgKiAxMDAwKSAvIGNwdDsKKwkJbGVuID0gc3ByaW50ZihidWYsICIldSBLYnBzXG4iLCAodiAqIGJwdCkgLyAxMjUpOworCX0KKwlydG5sX3VubG9jaygpOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRtX2F0dHJfc3RvcmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgc2l6ZV90IGxlbiwgaW50IHNjaGVkKQoreworCWNoYXIgKmVuZHA7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHRvX25ldF9kZXYoY2QpLT5wcml2OworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZW5kcCwgMCk7CisJaWYgKGVuZHAgPT0gYnVmIHx8IHZhbCA+IDEwMDAwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ0bmxfbG9jaygpOworCXJldCA9IHQzX2NvbmZpZ19zY2hlZChhZGFwLCB2YWwsIHNjaGVkKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gbGVuOworCXJ0bmxfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBUTV9BVFRSKG5hbWUsIHNjaGVkKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKSBcCit7IFwKKwlyZXR1cm4gdG1fYXR0cl9zaG93KGNkLCBidWYsIHNjaGVkKTsgXAorfSBcCitzdGF0aWMgc3NpemVfdCBzdG9yZV8jI25hbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgXAoreyBcCisJcmV0dXJuIHRtX2F0dHJfc3RvcmUoY2QsIGJ1ZiwgbGVuLCBzY2hlZCk7IFwKK30gXAorc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93XyMjbmFtZSwgc3RvcmVfIyNuYW1lKQorCitUTV9BVFRSKHNjaGVkMCwgMCk7CitUTV9BVFRSKHNjaGVkMSwgMSk7CitUTV9BVFRSKHNjaGVkMiwgMik7CitUTV9BVFRSKHNjaGVkMywgMyk7CitUTV9BVFRSKHNjaGVkNCwgNCk7CitUTV9BVFRSKHNjaGVkNSwgNSk7CitUTV9BVFRSKHNjaGVkNiwgNik7CitUTV9BVFRSKHNjaGVkNywgNyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpvZmZsb2FkX2F0dHJzW10gPSB7CisJJmNsYXNzX2RldmljZV9hdHRyX3NjaGVkMC5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9zY2hlZDEuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfc2NoZWQyLmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3NjaGVkMy5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9zY2hlZDQuYXR0ciwKKwkmY2xhc3NfZGV2aWNlX2F0dHJfc2NoZWQ1LmF0dHIsCisJJmNsYXNzX2RldmljZV9hdHRyX3NjaGVkNi5hdHRyLAorCSZjbGFzc19kZXZpY2VfYXR0cl9zY2hlZDcuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBvZmZsb2FkX2F0dHJfZ3JvdXAgPSB7LmF0dHJzID0gb2ZmbG9hZF9hdHRycyB9OworCisvKgorICogU2VuZHMgYW4gc2tfYnVmZiB0byBhbiBvZmZsb2FkIHF1ZXVlIGRyaXZlcgorICogYWZ0ZXIgZGVhbGluZyB3aXRoIGFueSBhY3RpdmUgbmV0d29yayB0YXBzLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZmZsb2FkX3R4KHN0cnVjdCB0M2NkZXYgKnRkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJldDsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlyZXQgPSB0M19vZmZsb2FkX3R4KHRkZXYsIHNrYik7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3cml0ZV9zbXRfZW50cnkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBpZHgpCit7CisJc3RydWN0IGNwbF9zbXRfd3JpdGVfcmVxICpyZXE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihzaXplb2YoKnJlcSksIEdGUF9LRVJORUwpOworCisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVxID0gKHN0cnVjdCBjcGxfc210X3dyaXRlX3JlcSAqKV9fc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7CisJcmVxLT53ci53cl9oaSA9IGh0b25sKFZfV1JfT1AoRldfV1JPUENPREVfRk9SV0FSRCkpOworCU9QQ09ERV9USUQocmVxKSA9IGh0b25sKE1LX09QQ09ERV9USUQoQ1BMX1NNVF9XUklURV9SRVEsIGlkeCkpOworCXJlcS0+bXR1X2lkeCA9IE5NVFVTIC0gMTsJLyogc2hvdWxkIGJlIDAgYnV0IHRoZXJlJ3MgYSBUMyBidWcgKi8KKwlyZXEtPmlmZiA9IGlkeDsKKwltZW1zZXQocmVxLT5zcmNfbWFjMSwgMCwgc2l6ZW9mKHJlcS0+c3JjX21hYzEpKTsKKwltZW1jcHkocmVxLT5zcmNfbWFjMCwgYWRhcHRlci0+cG9ydFtpZHhdLT5kZXZfYWRkciwgRVRIX0FMRU4pOworCXNrYi0+cHJpb3JpdHkgPSAxOworCW9mZmxvYWRfdHgoJmFkYXB0ZXItPnRkZXYsIHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zbXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCisJICAgIHdyaXRlX3NtdF9lbnRyeShhZGFwdGVyLCBpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9wb3J0X210dXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgaW50IG10dXMgPSBhZGFwdGVyLT5wb3J0WzBdLT5tdHU7CisKKwlpZiAoYWRhcHRlci0+cG9ydFsxXSkKKwkJbXR1cyB8PSBhZGFwdGVyLT5wb3J0WzFdLT5tdHUgPDwgMTY7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfVFBfTVRVX1BPUlRfVEFCTEUsIG10dXMpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3BrdHNjaGVkX2NtZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgaW50IHNjaGVkLCBpbnQgcWlkeCwgaW50IGxvLAorCQkJICAgICAgaW50IGhpLCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBtbmd0X3BrdHNjaGVkX3dyICpyZXE7CisKKwlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKCpyZXEpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9GQUlMKTsKKwlyZXEgPSAoc3RydWN0IG1uZ3RfcGt0c2NoZWRfd3IgKilza2JfcHV0KHNrYiwgc2l6ZW9mKCpyZXEpKTsKKwlyZXEtPndyX2hpID0gaHRvbmwoVl9XUl9PUChGV19XUk9QQ09ERV9NTkdUKSk7CisJcmVxLT5tbmd0X29wY29kZSA9IEZXX01OR1RPUENPREVfUEtUU0NIRURfU0VUOworCXJlcS0+c2NoZWQgPSBzY2hlZDsKKwlyZXEtPmlkeCA9IHFpZHg7CisJcmVxLT5taW4gPSBsbzsKKwlyZXEtPm1heCA9IGhpOworCXJlcS0+YmluZGluZyA9IHBvcnQ7CisJdDNfbWdtdF90eChhZGFwLCBza2IpOworfQorCitzdGF0aWMgdm9pZCBiaW5kX3FzZXRzKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCWludCBpLCBqOworCisJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CisJCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gYWRhcDJwaW5mbyhhZGFwLCBpKTsKKworCQlmb3IgKGogPSAwOyBqIDwgcGktPm5xc2V0czsgKytqKQorCQkJc2VuZF9wa3RzY2hlZF9jbWQoYWRhcCwgMSwgcGktPmZpcnN0X3FzZXQgKyBqLCAtMSwKKwkJCQkJICAtMSwgaSk7CisJfQorfQorCisvKioKKyAqCWN4Z2JfdXAgLSBlbmFibGUgdGhlIGFkYXB0ZXIKKyAqCUBhZGFwdGVyOiBhZGFwdGVyIGJlaW5nIGVuYWJsZWQKKyAqCisgKglDYWxsZWQgd2hlbiB0aGUgZmlyc3QgcG9ydCBpcyBlbmFibGVkLCB0aGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZQorICoJYWN0aW9ucyBuZWNlc3NhcnkgdG8gbWFrZSBhbiBhZGFwdGVyIG9wZXJhdGlvbmFsLCBzdWNoIGFzIGNvbXBsZXRpbmcKKyAqCXRoZSBpbml0aWFsaXphdGlvbiBvZiBIVyBtb2R1bGVzLCBhbmQgZW5hYmxpbmcgaW50ZXJydXB0cy4KKyAqCisgKglNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBydG5sIGxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBjeGdiX3VwKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCWludCBlcnIgPSAwOworCisJaWYgKCEoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkpIHsKKwkJZXJyID0gdDNfY2hlY2tfZndfdmVyc2lvbihhZGFwKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWVyciA9IGluaXRfZHVtbXlfbmV0ZGV2cyhhZGFwKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWVyciA9IHQzX2luaXRfaHcoYWRhcCwgMCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQllcnIgPSBzZXR1cF9zZ2VfcXNldHMoYWRhcCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQlzZXR1cF9yc3MoYWRhcCk7CisJCWFkYXAtPmZsYWdzIHw9IEZVTExfSU5JVF9ET05FOworCX0KKworCXQzX2ludHJfY2xlYXIoYWRhcCk7CisKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKSB7CisJCW5hbWVfbXNpeF92ZWNzKGFkYXApOworCQllcnIgPSByZXF1ZXN0X2lycShhZGFwLT5tc2l4X2luZm9bMF0udmVjLAorCQkJCSAgdDNfYXN5bmNfaW50cl9oYW5kbGVyLCAwLAorCQkJCSAgYWRhcC0+bXNpeF9pbmZvWzBdLmRlc2MsIGFkYXApOworCQlpZiAoZXJyKQorCQkJZ290byBpcnFfZXJyOworCisJCWlmIChyZXF1ZXN0X21zaXhfZGF0YV9pcnFzKGFkYXApKSB7CisJCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bMF0udmVjLCBhZGFwKTsKKwkJCWdvdG8gaXJxX2VycjsKKwkJfQorCX0gZWxzZSBpZiAoKGVyciA9IHJlcXVlc3RfaXJxKGFkYXAtPnBkZXYtPmlycSwKKwkJCQkgICAgICB0M19pbnRyX2hhbmRsZXIoYWRhcCwKKwkJCQkJCSAgICAgIGFkYXAtPnNnZS5xc1swXS5yc3BxLgorCQkJCQkJICAgICAgcG9sbGluZyksCisJCQkJICAgICAgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJKSA/IDAgOiBTQV9TSElSUSwKKwkJCQkgICAgICBhZGFwLT5uYW1lLCBhZGFwKSkpCisJCWdvdG8gaXJxX2VycjsKKworCXQzX3NnZV9zdGFydChhZGFwKTsKKwl0M19pbnRyX2VuYWJsZShhZGFwKTsKKworCWlmICgoYWRhcC0+ZmxhZ3MgJiAoVVNJTkdfTVNJWCB8IFFVRVVFU19CT1VORCkpID09IFVTSU5HX01TSVgpCisJCWJpbmRfcXNldHMoYWRhcCk7CisJYWRhcC0+ZmxhZ3MgfD0gUVVFVUVTX0JPVU5EOworCitvdXQ6CisJcmV0dXJuIGVycjsKK2lycV9lcnI6CisJQ0hfRVJSKGFkYXAsICJyZXF1ZXN0X2lycSBmYWlsZWQsIGVyciAlZFxuIiwgZXJyKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIFJlbGVhc2UgcmVzb3VyY2VzIHdoZW4gYWxsIHRoZSBwb3J0cyBhbmQgb2ZmbG9hZGluZyBoYXZlIGJlZW4gc3RvcHBlZC4KKyAqLworc3RhdGljIHZvaWQgY3hnYl9kb3duKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXQzX3NnZV9zdG9wKGFkYXB0ZXIpOworCXNwaW5fbG9ja19pcnEoJmFkYXB0ZXItPndvcmtfbG9jayk7CS8qIHN5bmMgd2l0aCBQSFkgaW50ciB0YXNrICovCisJdDNfaW50cl9kaXNhYmxlKGFkYXB0ZXIpOworCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+d29ya19sb2NrKTsKKworCWlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSVgpIHsKKwkJaW50IGksIG4gPSAwOworCisJCWZyZWVfaXJxKGFkYXB0ZXItPm1zaXhfaW5mb1swXS52ZWMsIGFkYXB0ZXIpOworCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCisJCSAgICBuICs9IGFkYXAycGluZm8oYWRhcHRlciwgaSktPm5xc2V0czsKKworCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorCQkJZnJlZV9pcnEoYWRhcHRlci0+bXNpeF9pbmZvW2kgKyAxXS52ZWMsCisJCQkJICZhZGFwdGVyLT5zZ2UucXNbaV0pOworCX0gZWxzZQorCQlmcmVlX2lycShhZGFwdGVyLT5wZGV2LT5pcnEsIGFkYXB0ZXIpOworCisJZmx1c2hfd29ya3F1ZXVlKGN4Z2IzX3dxKTsJLyogd2FpdCBmb3IgZXh0ZXJuYWwgSVJRIGhhbmRsZXIgKi8KKwlxdWllc2NlX3J4KGFkYXB0ZXIpOworfQorCitzdGF0aWMgdm9pZCBzY2hlZHVsZV9jaGtfdGFzayhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwl1bnNpZ25lZCBpbnQgdGltZW87CisKKwl0aW1lbyA9IGFkYXAtPnBhcmFtcy5saW5rcG9sbF9wZXJpb2QgPworCSAgICAoSFogKiBhZGFwLT5wYXJhbXMubGlua3BvbGxfcGVyaW9kKSAvIDEwIDoKKwkgICAgYWRhcC0+cGFyYW1zLnN0YXRzX3VwZGF0ZV9wZXJpb2QgKiBIWjsKKwlpZiAodGltZW8pCisJCXF1ZXVlX2RlbGF5ZWRfd29yayhjeGdiM193cSwgJmFkYXAtPmFkYXBfY2hlY2tfdGFzaywgdGltZW8pOworfQorCitzdGF0aWMgaW50IG9mZmxvYWRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCB0M2NkZXYgKnRkZXYgPSBUM0NERVYoZGV2KTsKKwlpbnQgYWRhcF91cCA9IGFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCAmIFBPUlRfTUFTSzsKKwlpbnQgZXJyID0gMDsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KE9GRkxPQURfREVWTUFQX0JJVCwgJmFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCkpCisJCXJldHVybiAwOworCisJaWYgKCFhZGFwX3VwICYmIChlcnIgPSBjeGdiX3VwKGFkYXB0ZXIpKSA8IDApCisJCXJldHVybiBlcnI7CisKKwl0M190cF9zZXRfb2ZmbG9hZF9tb2RlKGFkYXB0ZXIsIDEpOworCXRkZXYtPmxsZGV2ID0gYWRhcHRlci0+cG9ydFswXTsKKwllcnIgPSBjeGdiM19vZmZsb2FkX2FjdGl2YXRlKGFkYXB0ZXIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaW5pdF9wb3J0X210dXMoYWRhcHRlcik7CisJdDNfbG9hZF9tdHVzKGFkYXB0ZXIsIGFkYXB0ZXItPnBhcmFtcy5tdHVzLCBhZGFwdGVyLT5wYXJhbXMuYV93bmQsCisJCSAgICAgYWRhcHRlci0+cGFyYW1zLmJfd25kLAorCQkgICAgIGFkYXB0ZXItPnBhcmFtcy5yZXYgPT0gMCA/CisJCSAgICAgYWRhcHRlci0+cG9ydFswXS0+bXR1IDogMHhmZmZmKTsKKwlpbml0X3NtdChhZGFwdGVyKTsKKworCS8qIE5ldmVyIG1pbmQgaWYgdGhlIG5leHQgc3RlcCBmYWlscyAqLworCXN5c2ZzX2NyZWF0ZV9ncm91cCgmdGRldi0+bGxkZXYtPmNsYXNzX2Rldi5rb2JqLCAmb2ZmbG9hZF9hdHRyX2dyb3VwKTsKKworCS8qIENhbGwgYmFjayBhbGwgcmVnaXN0ZXJlZCBjbGllbnRzICovCisJY3hnYjNfYWRkX2NsaWVudHModGRldik7CisKK291dDoKKwkvKiByZXN0b3JlIHRoZW0gaW4gY2FzZSB0aGUgb2ZmbG9hZCBtb2R1bGUgaGFzIGNoYW5nZWQgdGhlbSAqLworCWlmIChlcnIpIHsKKwkJdDNfdHBfc2V0X29mZmxvYWRfbW9kZShhZGFwdGVyLCAwKTsKKwkJY2xlYXJfYml0KE9GRkxPQURfREVWTUFQX0JJVCwgJmFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCk7CisJCWN4Z2IzX3NldF9kdW1teV9vcHModGRldik7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb2ZmbG9hZF9jbG9zZShzdHJ1Y3QgdDNjZGV2ICp0ZGV2KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gdGRldjJhZGFwKHRkZXYpOworCisJaWYgKCF0ZXN0X2JpdChPRkZMT0FEX0RFVk1BUF9CSVQsICZhZGFwdGVyLT5vcGVuX2RldmljZV9tYXApKQorCQlyZXR1cm4gMDsKKworCS8qIENhbGwgYmFjayBhbGwgcmVnaXN0ZXJlZCBjbGllbnRzICovCisJY3hnYjNfcmVtb3ZlX2NsaWVudHModGRldik7CisKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnRkZXYtPmxsZGV2LT5jbGFzc19kZXYua29iaiwgJm9mZmxvYWRfYXR0cl9ncm91cCk7CisKKwl0ZGV2LT5sbGRldiA9IE5VTEw7CisJY3hnYjNfc2V0X2R1bW15X29wcyh0ZGV2KTsKKwl0M190cF9zZXRfb2ZmbG9hZF9tb2RlKGFkYXB0ZXIsIDApOworCWNsZWFyX2JpdChPRkZMT0FEX0RFVk1BUF9CSVQsICZhZGFwdGVyLT5vcGVuX2RldmljZV9tYXApOworCisJaWYgKCFhZGFwdGVyLT5vcGVuX2RldmljZV9tYXApCisJCWN4Z2JfZG93bihhZGFwdGVyKTsKKworCWN4Z2IzX29mZmxvYWRfZGVhY3RpdmF0ZShhZGFwdGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeGdiX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgb3RoZXJfcG9ydHMgPSBhZGFwdGVyLT5vcGVuX2RldmljZV9tYXAgJiBQT1JUX01BU0s7CisKKwlpZiAoIWFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCAmJiAoZXJyID0gY3hnYl91cChhZGFwdGVyKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc2V0X2JpdChwaS0+cG9ydF9pZCwgJmFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCk7CisJaWYgKCFvZmxkX2Rpc2FibGUpIHsKKwkJZXJyID0gb2ZmbG9hZF9vcGVuKGRldik7CisJCWlmIChlcnIpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkNvdWxkIG5vdCBpbml0aWFsaXplIG9mZmxvYWQgY2FwYWJpbGl0aWVzXG4iKTsKKwl9CisKKwlsaW5rX3N0YXJ0KGRldik7CisJdDNfcG9ydF9pbnRyX2VuYWJsZShhZGFwdGVyLCBwaS0+cG9ydF9pZCk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwlpZiAoIW90aGVyX3BvcnRzKQorCQlzY2hlZHVsZV9jaGtfdGFzayhhZGFwdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4Z2JfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXQzX3BvcnRfaW50cl9kaXNhYmxlKGFkYXB0ZXIsIHAtPnBvcnRfaWQpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlwLT5waHkub3BzLT5wb3dlcl9kb3duKCZwLT5waHksIDEpOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJdDNfbWFjX2Rpc2FibGUoJnAtPm1hYywgTUFDX0RJUkVDVElPTl9UWCB8IE1BQ19ESVJFQ1RJT05fUlgpOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT53b3JrX2xvY2spOwkvKiBzeW5jIHdpdGggdXBkYXRlIHRhc2sgKi8KKwljbGVhcl9iaXQocC0+cG9ydF9pZCwgJmFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCk7CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPndvcmtfbG9jayk7CisKKwlpZiAoIShhZGFwdGVyLT5vcGVuX2RldmljZV9tYXAgJiBQT1JUX01BU0spKQorCQljYW5jZWxfcmVhcm1pbmdfZGVsYXllZF93b3JrcXVldWUoY3hnYjNfd3EsCisJCQkJCQkgICZhZGFwdGVyLT5hZGFwX2NoZWNrX3Rhc2spOworCisJaWYgKCFhZGFwdGVyLT5vcGVuX2RldmljZV9tYXApCisJCWN4Z2JfZG93bihhZGFwdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmN4Z2JfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJc3RydWN0IHBvcnRfaW5mbyAqcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5zID0gJnAtPm5ldHN0YXRzOworCWNvbnN0IHN0cnVjdCBtYWNfc3RhdHMgKnBzdGF0czsKKworCXNwaW5fbG9jaygmYWRhcHRlci0+c3RhdHNfbG9jayk7CisJcHN0YXRzID0gdDNfbWFjX3VwZGF0ZV9zdGF0cygmcC0+bWFjKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+c3RhdHNfbG9jayk7CisKKwlucy0+dHhfYnl0ZXMgPSBwc3RhdHMtPnR4X29jdGV0czsKKwlucy0+dHhfcGFja2V0cyA9IHBzdGF0cy0+dHhfZnJhbWVzOworCW5zLT5yeF9ieXRlcyA9IHBzdGF0cy0+cnhfb2N0ZXRzOworCW5zLT5yeF9wYWNrZXRzID0gcHN0YXRzLT5yeF9mcmFtZXM7CisJbnMtPm11bHRpY2FzdCA9IHBzdGF0cy0+cnhfbWNhc3RfZnJhbWVzOworCisJbnMtPnR4X2Vycm9ycyA9IHBzdGF0cy0+dHhfdW5kZXJydW47CisJbnMtPnJ4X2Vycm9ycyA9IHBzdGF0cy0+cnhfc3ltYm9sX2VycnMgKyBwc3RhdHMtPnJ4X2Zjc19lcnJzICsKKwkgICAgcHN0YXRzLT5yeF90b29fbG9uZyArIHBzdGF0cy0+cnhfamFiYmVyICsgcHN0YXRzLT5yeF9zaG9ydCArCisJICAgIHBzdGF0cy0+cnhfZmlmb19vdmZsOworCisJLyogZGV0YWlsZWQgcnhfZXJyb3JzICovCisJbnMtPnJ4X2xlbmd0aF9lcnJvcnMgPSBwc3RhdHMtPnJ4X2phYmJlciArIHBzdGF0cy0+cnhfdG9vX2xvbmc7CisJbnMtPnJ4X292ZXJfZXJyb3JzID0gMDsKKwlucy0+cnhfY3JjX2Vycm9ycyA9IHBzdGF0cy0+cnhfZmNzX2VycnM7CisJbnMtPnJ4X2ZyYW1lX2Vycm9ycyA9IHBzdGF0cy0+cnhfc3ltYm9sX2VycnM7CisJbnMtPnJ4X2ZpZm9fZXJyb3JzID0gcHN0YXRzLT5yeF9maWZvX292Zmw7CisJbnMtPnJ4X21pc3NlZF9lcnJvcnMgPSBwc3RhdHMtPnJ4X2NvbmdfZHJvcHM7CisKKwkvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKwlucy0+dHhfYWJvcnRlZF9lcnJvcnMgPSAwOworCW5zLT50eF9jYXJyaWVyX2Vycm9ycyA9IDA7CisJbnMtPnR4X2ZpZm9fZXJyb3JzID0gcHN0YXRzLT50eF91bmRlcnJ1bjsKKwlucy0+dHhfaGVhcnRiZWF0X2Vycm9ycyA9IDA7CisJbnMtPnR4X3dpbmRvd19lcnJvcnMgPSAwOworCXJldHVybiBuczsKK30KKworc3RhdGljIHUzMiBnZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCXJldHVybiBhZGFwdGVyLT5tc2dfZW5hYmxlOworfQorCitzdGF0aWMgdm9pZCBzZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCWFkYXB0ZXItPm1zZ19lbmFibGUgPSB2YWw7Cit9CisKK3N0YXRpYyBjaGFyIHN0YXRzX3N0cmluZ3NbXVtFVEhfR1NUUklOR19MRU5dID0geworCSJUeE9jdGV0c09LICAgICAgICAgIiwKKwkiVHhGcmFtZXNPSyAgICAgICAgICIsCisJIlR4TXVsdGljYXN0RnJhbWVzT0siLAorCSJUeEJyb2FkY2FzdEZyYW1lc09LIiwKKwkiVHhQYXVzZUZyYW1lcyAgICAgICIsCisJIlR4VW5kZXJydW4gICAgICAgICAiLAorCSJUeEV4dFVuZGVycnVuICAgICAgIiwKKworCSJUeEZyYW1lczY0ICAgICAgICAgIiwKKwkiVHhGcmFtZXM2NVRvMTI3ICAgICIsCisJIlR4RnJhbWVzMTI4VG8yNTUgICAiLAorCSJUeEZyYW1lczI1NlRvNTExICAgIiwKKwkiVHhGcmFtZXM1MTJUbzEwMjMgICIsCisJIlR4RnJhbWVzMTAyNFRvMTUxOCAiLAorCSJUeEZyYW1lczE1MTlUb01heCAgIiwKKworCSJSeE9jdGV0c09LICAgICAgICAgIiwKKwkiUnhGcmFtZXNPSyAgICAgICAgICIsCisJIlJ4TXVsdGljYXN0RnJhbWVzT0siLAorCSJSeEJyb2FkY2FzdEZyYW1lc09LIiwKKwkiUnhQYXVzZUZyYW1lcyAgICAgICIsCisJIlJ4RkNTRXJyb3JzICAgICAgICAiLAorCSJSeFN5bWJvbEVycm9ycyAgICAgIiwKKwkiUnhTaG9ydEVycm9ycyAgICAgICIsCisJIlJ4SmFiYmVyRXJyb3JzICAgICAiLAorCSJSeExlbmd0aEVycm9ycyAgICAgIiwKKwkiUnhGSUZPb3ZlcmZsb3cgICAgICIsCisKKwkiUnhGcmFtZXM2NCAgICAgICAgICIsCisJIlJ4RnJhbWVzNjVUbzEyNyAgICAiLAorCSJSeEZyYW1lczEyOFRvMjU1ICAgIiwKKwkiUnhGcmFtZXMyNTZUbzUxMSAgICIsCisJIlJ4RnJhbWVzNTEyVG8xMDIzICAiLAorCSJSeEZyYW1lczEwMjRUbzE1MTggIiwKKwkiUnhGcmFtZXMxNTE5VG9NYXggICIsCisKKwkiUGh5RklGT0Vycm9ycyAgICAgICIsCisJIlRTTyAgICAgICAgICAgICAgICAiLAorCSJWTEFOZXh0cmFjdGlvbnMgICAgIiwKKwkiVkxBTmluc2VydGlvbnMgICAgICIsCisJIlR4Q3N1bU9mZmxvYWQgICAgICAiLAorCSJSeENzdW1Hb29kICAgICAgICAgIiwKKwkiUnhEcm9wcyAgICAgICAgICAgICIKK307CisKK3N0YXRpYyBpbnQgZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIEFSUkFZX1NJWkUoc3RhdHNfc3RyaW5ncyk7Cit9CisKKyNkZWZpbmUgVDNfUkVHTUFQX1NJWkUgKDMgKiAxMDI0KQorCitzdGF0aWMgaW50IGdldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBUM19SRUdNQVBfU0laRTsKK30KKworc3RhdGljIGludCBnZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBFRVBST01TSVpFOworfQorCitzdGF0aWMgdm9pZCBnZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXUzMiBmd192ZXJzID0gMDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCXQzX2dldF9md192ZXJzaW9uKGFkYXB0ZXIsICZmd192ZXJzKTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldikpOworCWlmICghZndfdmVycykKKwkJc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiKTsKKwllbHNlIHsKKwkJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pLAorCQkJICIlcyAldS4ldS4ldSIsCisJCQkgR19GV19WRVJTSU9OX1RZUEUoZndfdmVycykgPyAiVCIgOiAiTiIsCisJCQkgR19GV19WRVJTSU9OX01BSk9SKGZ3X3ZlcnMpLAorCQkJIEdfRldfVkVSU0lPTl9NSU5PUihmd192ZXJzKSwKKwkJCSBHX0ZXX1ZFUlNJT05fTUlDUk8oZndfdmVycykpOworCX0KK30KKworc3RhdGljIHZvaWQgZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKiBkYXRhKQoreworCWlmIChzdHJpbmdzZXQgPT0gRVRIX1NTX1NUQVRTKQorCQltZW1jcHkoZGF0YSwgc3RhdHNfc3RyaW5ncywgc2l6ZW9mKHN0YXRzX3N0cmluZ3MpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29sbGVjdF9zZ2VfcG9ydF9zdGF0cyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJICAgIHN0cnVjdCBwb3J0X2luZm8gKnAsIGludCBpZHgpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyB0b3QgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHAtPm5xc2V0czsgKytpKQorCQl0b3QgKz0gYWRhcHRlci0+c2dlLnFzW2kgKyBwLT5maXJzdF9xc2V0XS5wb3J0X3N0YXRzW2lkeF07CisJcmV0dXJuIHRvdDsKK30KKworc3RhdGljIHZvaWQgZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywKKwkJICAgICAgdTY0ICpkYXRhKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCBzdHJ1Y3QgbWFjX3N0YXRzICpzOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5zdGF0c19sb2NrKTsKKwlzID0gdDNfbWFjX3VwZGF0ZV9zdGF0cygmcGktPm1hYyk7CisJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnN0YXRzX2xvY2spOworCisJKmRhdGErKyA9IHMtPnR4X29jdGV0czsKKwkqZGF0YSsrID0gcy0+dHhfZnJhbWVzOworCSpkYXRhKysgPSBzLT50eF9tY2FzdF9mcmFtZXM7CisJKmRhdGErKyA9IHMtPnR4X2JjYXN0X2ZyYW1lczsKKwkqZGF0YSsrID0gcy0+dHhfcGF1c2U7CisJKmRhdGErKyA9IHMtPnR4X3VuZGVycnVuOworCSpkYXRhKysgPSBzLT50eF9maWZvX3VydW47CisKKwkqZGF0YSsrID0gcy0+dHhfZnJhbWVzXzY0OworCSpkYXRhKysgPSBzLT50eF9mcmFtZXNfNjVfMTI3OworCSpkYXRhKysgPSBzLT50eF9mcmFtZXNfMTI4XzI1NTsKKwkqZGF0YSsrID0gcy0+dHhfZnJhbWVzXzI1Nl81MTE7CisJKmRhdGErKyA9IHMtPnR4X2ZyYW1lc181MTJfMTAyMzsKKwkqZGF0YSsrID0gcy0+dHhfZnJhbWVzXzEwMjRfMTUxODsKKwkqZGF0YSsrID0gcy0+dHhfZnJhbWVzXzE1MTlfbWF4OworCisJKmRhdGErKyA9IHMtPnJ4X29jdGV0czsKKwkqZGF0YSsrID0gcy0+cnhfZnJhbWVzOworCSpkYXRhKysgPSBzLT5yeF9tY2FzdF9mcmFtZXM7CisJKmRhdGErKyA9IHMtPnJ4X2JjYXN0X2ZyYW1lczsKKwkqZGF0YSsrID0gcy0+cnhfcGF1c2U7CisJKmRhdGErKyA9IHMtPnJ4X2Zjc19lcnJzOworCSpkYXRhKysgPSBzLT5yeF9zeW1ib2xfZXJyczsKKwkqZGF0YSsrID0gcy0+cnhfc2hvcnQ7CisJKmRhdGErKyA9IHMtPnJ4X2phYmJlcjsKKwkqZGF0YSsrID0gcy0+cnhfdG9vX2xvbmc7CisJKmRhdGErKyA9IHMtPnJ4X2ZpZm9fb3ZmbDsKKworCSpkYXRhKysgPSBzLT5yeF9mcmFtZXNfNjQ7CisJKmRhdGErKyA9IHMtPnJ4X2ZyYW1lc182NV8xMjc7CisJKmRhdGErKyA9IHMtPnJ4X2ZyYW1lc18xMjhfMjU1OworCSpkYXRhKysgPSBzLT5yeF9mcmFtZXNfMjU2XzUxMTsKKwkqZGF0YSsrID0gcy0+cnhfZnJhbWVzXzUxMl8xMDIzOworCSpkYXRhKysgPSBzLT5yeF9mcmFtZXNfMTAyNF8xNTE4OworCSpkYXRhKysgPSBzLT5yeF9mcmFtZXNfMTUxOV9tYXg7CisKKwkqZGF0YSsrID0gcGktPnBoeS5maWZvX2Vycm9yczsKKworCSpkYXRhKysgPSBjb2xsZWN0X3NnZV9wb3J0X3N0YXRzKGFkYXB0ZXIsIHBpLCBTR0VfUFNUQVRfVFNPKTsKKwkqZGF0YSsrID0gY29sbGVjdF9zZ2VfcG9ydF9zdGF0cyhhZGFwdGVyLCBwaSwgU0dFX1BTVEFUX1ZMQU5FWCk7CisJKmRhdGErKyA9IGNvbGxlY3Rfc2dlX3BvcnRfc3RhdHMoYWRhcHRlciwgcGksIFNHRV9QU1RBVF9WTEFOSU5TKTsKKwkqZGF0YSsrID0gY29sbGVjdF9zZ2VfcG9ydF9zdGF0cyhhZGFwdGVyLCBwaSwgU0dFX1BTVEFUX1RYX0NTVU0pOworCSpkYXRhKysgPSBjb2xsZWN0X3NnZV9wb3J0X3N0YXRzKGFkYXB0ZXIsIHBpLCBTR0VfUFNUQVRfUlhfQ1NVTV9HT09EKTsKKwkqZGF0YSsrID0gcy0+cnhfY29uZ19kcm9wczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlZ19ibG9ja19kdW1wKHN0cnVjdCBhZGFwdGVyICphcCwgdm9pZCAqYnVmLAorCQkJCSAgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5kKQoreworCXUzMiAqcCA9IGJ1ZiArIHN0YXJ0OworCisJZm9yICg7IHN0YXJ0IDw9IGVuZDsgc3RhcnQgKz0gc2l6ZW9mKHUzMikpCisJCSpwKysgPSB0M19yZWFkX3JlZyhhcCwgc3RhcnQpOworfQorCitzdGF0aWMgdm9pZCBnZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLAorCQkgICAgIHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYXAgPSBkZXYtPnByaXY7CisKKwkvKgorCSAqIFZlcnNpb24gc2NoZW1lOgorCSAqIGJpdHMgMC4uOTogY2hpcCB2ZXJzaW9uCisJICogYml0cyAxMC4uMTU6IGNoaXAgcmV2aXNpb24KKwkgKiBiaXQgMzE6IHNldCBmb3IgUENJZSBjYXJkcworCSAqLworCXJlZ3MtPnZlcnNpb24gPSAzIHwgKGFwLT5wYXJhbXMucmV2IDw8IDEwKSB8IChpc19wY2llKGFwKSA8PCAzMSk7CisKKwkvKgorCSAqIFdlIHNraXAgdGhlIE1BQyBzdGF0aXN0aWNzIHJlZ2lzdGVycyBiZWNhdXNlIHRoZXkgYXJlIGNsZWFyLW9uLXJlYWQuCisJICogQWxzbyByZWFkaW5nIG11bHRpLXJlZ2lzdGVyIHN0YXRzIHdvdWxkIG5lZWQgdG8gc3luY2hyb25pemUgd2l0aCB0aGUKKwkgKiBwZXJpb2RpYyBtYWMgc3RhdHMgYWNjdW11bGF0aW9uLiAgSGFyZCB0byBqdXN0aWZ5IHRoZSBjb21wbGV4aXR5LgorCSAqLworCW1lbXNldChidWYsIDAsIFQzX1JFR01BUF9TSVpFKTsKKwlyZWdfYmxvY2tfZHVtcChhcCwgYnVmLCAwLCBBX1NHX1JTUFFfQ1JFRElUX1JFVFVSTik7CisJcmVnX2Jsb2NrX2R1bXAoYXAsIGJ1ZiwgQV9TR19ISV9EUkJfSElfVEhSU0gsIEFfVUxQUlhfUEJMX1VMSU1JVCk7CisJcmVnX2Jsb2NrX2R1bXAoYXAsIGJ1ZiwgQV9VTFBUWF9DT05GSUcsIEFfTVBTX0lOVF9DQVVTRSk7CisJcmVnX2Jsb2NrX2R1bXAoYXAsIGJ1ZiwgQV9DUExfU1dJVENIX0NOVFJMLCBBX0NQTF9NQVBfVEJMX0RBVEEpOworCXJlZ19ibG9ja19kdW1wKGFwLCBidWYsIEFfU01CX0dMT0JBTF9USU1FX0NGRywgQV9YR01fU0VSREVTX1NUQVQzKTsKKwlyZWdfYmxvY2tfZHVtcChhcCwgYnVmLCBBX1hHTV9TRVJERVNfU1RBVFVTMCwKKwkJICAgICAgIFhHTV9SRUcoQV9YR01fU0VSREVTX1NUQVQzLCAxKSk7CisJcmVnX2Jsb2NrX2R1bXAoYXAsIGJ1ZiwgWEdNX1JFRyhBX1hHTV9TRVJERVNfU1RBVFVTMCwgMSksCisJCSAgICAgICBYR01fUkVHKEFfWEdNX1JYX1NQSTRfU09QX0VPUF9DTlQsIDEpKTsKK30KKworc3RhdGljIGludCByZXN0YXJ0X2F1dG9uZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAocC0+bGlua19jb25maWcuYXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcC0+cGh5Lm9wcy0+YXV0b25lZ19yZXN0YXJ0KCZwLT5waHkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4Z2IzX3BoeXNfaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCit7CisJaW50IGk7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisKKwlpZiAoZGF0YSA9PSAwKQorCQlkYXRhID0gMjsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhICogMjsgaSsrKSB7CisJCXQzX3NldF9yZWdfZmllbGQoYWRhcHRlciwgQV9UM0RCR19HUElPX0VOLCBGX0dQSU8wX09VVF9WQUwsCisJCQkJIChpICYgMSkgPyBGX0dQSU8wX09VVF9WQUwgOiAwKTsKKwkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKDUwMCkpCisJCQlicmVhazsKKwl9CisJdDNfc2V0X3JlZ19maWVsZChhZGFwdGVyLCBBX1QzREJHX0dQSU9fRU4sIEZfR1BJTzBfT1VUX1ZBTCwKKwkJCSBGX0dQSU8wX09VVF9WQUwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWNtZC0+c3VwcG9ydGVkID0gcC0+bGlua19jb25maWcuc3VwcG9ydGVkOworCWNtZC0+YWR2ZXJ0aXNpbmcgPSBwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZzsKKworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwkJY21kLT5zcGVlZCA9IHAtPmxpbmtfY29uZmlnLnNwZWVkOworCQljbWQtPmR1cGxleCA9IHAtPmxpbmtfY29uZmlnLmR1cGxleDsKKwl9IGVsc2UgeworCQljbWQtPnNwZWVkID0gLTE7CisJCWNtZC0+ZHVwbGV4ID0gLTE7CisJfQorCisJY21kLT5wb3J0ID0gKGNtZC0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX1RQKSA/IFBPUlRfVFAgOiBQT1JUX0ZJQlJFOworCWNtZC0+cGh5X2FkZHJlc3MgPSBwLT5waHkuYWRkcjsKKwljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9FWFRFUk5BTDsKKwljbWQtPmF1dG9uZWcgPSBwLT5saW5rX2NvbmZpZy5hdXRvbmVnOworCWNtZC0+bWF4dHhwa3QgPSAwOworCWNtZC0+bWF4cnhwa3QgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwZWVkX2R1cGxleF90b19jYXBzKGludCBzcGVlZCwgaW50IGR1cGxleCkKK3sKKwlpbnQgY2FwID0gMDsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwOgorCQlpZiAoZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJY2FwID0gU1VQUE9SVEVEXzEwYmFzZVRfRnVsbDsKKwkJZWxzZQorCQkJY2FwID0gU1VQUE9SVEVEXzEwYmFzZVRfSGFsZjsKKwkJYnJlYWs7CisJY2FzZSBTUEVFRF8xMDA6CisJCWlmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQljYXAgPSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKKwkJZWxzZQorCQkJY2FwID0gU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGY7CisJCWJyZWFrOworCWNhc2UgU1BFRURfMTAwMDoKKwkJaWYgKGR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCWNhcCA9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKwkJZWxzZQorCQkJY2FwID0gU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmOworCQlicmVhazsKKwljYXNlIFNQRUVEXzEwMDAwOgorCQlpZiAoZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJY2FwID0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbDsKKwl9CisJcmV0dXJuIGNhcDsKK30KKworI2RlZmluZSBBRFZFUlRJU0VEX01BU0sgKEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwgfCBcCisJCSAgICAgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8IFwKKwkJICAgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfCBcCisJCSAgICAgIEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsKQorCitzdGF0aWMgaW50IHNldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbGlua19jb25maWcgKmxjID0gJnAtPmxpbmtfY29uZmlnOworCisJaWYgKCEobGMtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9BdXRvbmVnKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwkvKiBjYW4ndCBjaGFuZ2Ugc3BlZWQvZHVwbGV4ICovCisKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSkgeworCQlpbnQgY2FwID0gc3BlZWRfZHVwbGV4X3RvX2NhcHMoY21kLT5zcGVlZCwgY21kLT5kdXBsZXgpOworCisJCWlmICghKGxjLT5zdXBwb3J0ZWQgJiBjYXApIHx8IGNtZC0+c3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlsYy0+cmVxdWVzdGVkX3NwZWVkID0gY21kLT5zcGVlZDsKKwkJbGMtPnJlcXVlc3RlZF9kdXBsZXggPSBjbWQtPmR1cGxleDsKKwkJbGMtPmFkdmVydGlzaW5nID0gMDsKKwl9IGVsc2UgeworCQljbWQtPmFkdmVydGlzaW5nICY9IEFEVkVSVElTRURfTUFTSzsKKwkJY21kLT5hZHZlcnRpc2luZyAmPSBsYy0+c3VwcG9ydGVkOworCQlpZiAoIWNtZC0+YWR2ZXJ0aXNpbmcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbGMtPnJlcXVlc3RlZF9zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJCWxjLT5yZXF1ZXN0ZWRfZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7CisJCWxjLT5hZHZlcnRpc2luZyA9IGNtZC0+YWR2ZXJ0aXNpbmcgfCBBRFZFUlRJU0VEX0F1dG9uZWc7CisJfQorCWxjLT5hdXRvbmVnID0gY21kLT5hdXRvbmVnOworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXQzX2xpbmtfc3RhcnQoJnAtPnBoeSwgJnAtPm1hYywgbGMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZXBhdXNlKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJZXBhdXNlLT5hdXRvbmVnID0gKHAtPmxpbmtfY29uZmlnLnJlcXVlc3RlZF9mYyAmIFBBVVNFX0FVVE9ORUcpICE9IDA7CisJZXBhdXNlLT5yeF9wYXVzZSA9IChwLT5saW5rX2NvbmZpZy5mYyAmIFBBVVNFX1JYKSAhPSAwOworCWVwYXVzZS0+dHhfcGF1c2UgPSAocC0+bGlua19jb25maWcuZmMgJiBQQVVTRV9UWCkgIT0gMDsKK30KKworc3RhdGljIGludCBzZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplcGF1c2UpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGxpbmtfY29uZmlnICpsYyA9ICZwLT5saW5rX2NvbmZpZzsKKworCWlmIChlcGF1c2UtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKQorCQlsYy0+cmVxdWVzdGVkX2ZjID0gMDsKKwllbHNlIGlmIChsYy0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX0F1dG9uZWcpCisJCWxjLT5yZXF1ZXN0ZWRfZmMgPSBQQVVTRV9BVVRPTkVHOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZXBhdXNlLT5yeF9wYXVzZSkKKwkJbGMtPnJlcXVlc3RlZF9mYyB8PSBQQVVTRV9SWDsKKwlpZiAoZXBhdXNlLT50eF9wYXVzZSkKKwkJbGMtPnJlcXVlc3RlZF9mYyB8PSBQQVVTRV9UWDsKKwlpZiAobGMtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXQzX2xpbmtfc3RhcnQoJnAtPnBoeSwgJnAtPm1hYywgbGMpOworCX0gZWxzZSB7CisJCWxjLT5mYyA9IGxjLT5yZXF1ZXN0ZWRfZmMgJiAoUEFVU0VfUlggfCBQQVVTRV9UWCk7CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCQl0M19tYWNfc2V0X3NwZWVkX2R1cGxleF9mYygmcC0+bWFjLCAtMSwgLTEsIGxjLT5mYyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGdldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gcC0+cnhfY3N1bV9vZmZsb2FkOworfQorCitzdGF0aWMgaW50IHNldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcC0+cnhfY3N1bV9vZmZsb2FkID0gZGF0YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X3NnZV9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmUpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisKKwllLT5yeF9tYXhfcGVuZGluZyA9IE1BWF9SWF9CVUZGRVJTOworCWUtPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSAwOworCWUtPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gTUFYX1JYX0pVTUJPX0JVRkZFUlM7CisJZS0+dHhfbWF4X3BlbmRpbmcgPSBNQVhfVFhRX0VOVFJJRVM7CisKKwllLT5yeF9wZW5kaW5nID0gYWRhcHRlci0+cGFyYW1zLnNnZS5xc2V0WzBdLmZsX3NpemU7CisJZS0+cnhfbWluaV9wZW5kaW5nID0gYWRhcHRlci0+cGFyYW1zLnNnZS5xc2V0WzBdLnJzcHFfc2l6ZTsKKwllLT5yeF9qdW1ib19wZW5kaW5nID0gYWRhcHRlci0+cGFyYW1zLnNnZS5xc2V0WzBdLmp1bWJvX3NpemU7CisJZS0+dHhfcGVuZGluZyA9IGFkYXB0ZXItPnBhcmFtcy5zZ2UucXNldFswXS50eHFfc2l6ZVswXTsKK30KKworc3RhdGljIGludCBzZXRfc2dlX3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCWlmIChlLT5yeF9wZW5kaW5nID4gTUFYX1JYX0JVRkZFUlMgfHwKKwkgICAgZS0+cnhfanVtYm9fcGVuZGluZyA+IE1BWF9SWF9KVU1CT19CVUZGRVJTIHx8CisJICAgIGUtPnR4X3BlbmRpbmcgPiBNQVhfVFhRX0VOVFJJRVMgfHwKKwkgICAgZS0+cnhfbWluaV9wZW5kaW5nID4gTUFYX1JTUFFfRU5UUklFUyB8fAorCSAgICBlLT5yeF9taW5pX3BlbmRpbmcgPCBNSU5fUlNQUV9FTlRSSUVTIHx8CisJICAgIGUtPnJ4X3BlbmRpbmcgPCBNSU5fRkxfRU5UUklFUyB8fAorCSAgICBlLT5yeF9qdW1ib19wZW5kaW5nIDwgTUlOX0ZMX0VOVFJJRVMgfHwKKwkgICAgZS0+dHhfcGVuZGluZyA8IGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMgKiBNSU5fVFhRX0VOVFJJRVMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCXJldHVybiAtRUJVU1k7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0dFX1FTRVRTOyArK2kpIHsKKwkJc3RydWN0IHFzZXRfcGFyYW1zICpxID0gJmFkYXB0ZXItPnBhcmFtcy5zZ2UucXNldFtpXTsKKworCQlxLT5yc3BxX3NpemUgPSBlLT5yeF9taW5pX3BlbmRpbmc7CisJCXEtPmZsX3NpemUgPSBlLT5yeF9wZW5kaW5nOworCQlxLT5qdW1ib19zaXplID0gZS0+cnhfanVtYm9fcGVuZGluZzsKKwkJcS0+dHhxX3NpemVbMF0gPSBlLT50eF9wZW5kaW5nOworCQlxLT50eHFfc2l6ZVsxXSA9IGUtPnR4X3BlbmRpbmc7CisJCXEtPnR4cV9zaXplWzJdID0gZS0+dHhfcGVuZGluZzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBxc2V0X3BhcmFtcyAqcXNwID0gJmFkYXB0ZXItPnBhcmFtcy5zZ2UucXNldFswXTsKKwlzdHJ1Y3Qgc2dlX3FzZXQgKnFzID0gJmFkYXB0ZXItPnNnZS5xc1swXTsKKworCWlmIChjLT5yeF9jb2FsZXNjZV91c2VjcyAqIDEwID4gTV9ORVdUSU1FUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlxc3AtPmNvYWxlc2NlX3VzZWNzID0gYy0+cnhfY29hbGVzY2VfdXNlY3M7CisJdDNfdXBkYXRlX3FzZXRfY29hbGVzY2UocXMsIHFzcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBxc2V0X3BhcmFtcyAqcSA9IGFkYXB0ZXItPnBhcmFtcy5zZ2UucXNldDsKKworCWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gcS0+Y29hbGVzY2VfdXNlY3M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmUsCisJCSAgICAgIHU4ICogZGF0YSkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGRldi0+cHJpdjsKKworCXU4ICpidWYgPSBrbWFsbG9jKEVFUFJPTVNJWkUsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWUtPm1hZ2ljID0gRUVQUk9NX01BR0lDOworCWZvciAoaSA9IGUtPm9mZnNldCAmIH4zOyAhZXJyICYmIGkgPCBlLT5vZmZzZXQgKyBlLT5sZW47IGkgKz0gNCkKKwkJZXJyID0gdDNfc2VlcHJvbV9yZWFkKGFkYXB0ZXIsIGksICh1MzIgKikgJiBidWZbaV0pOworCisJaWYgKCFlcnIpCisJCW1lbWNweShkYXRhLCBidWYgKyBlLT5vZmZzZXQsIGUtPmxlbik7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sCisJCSAgICAgIHU4ICogZGF0YSkKK3sKKwl1OCAqYnVmOworCWludCBlcnIgPSAwOworCXUzMiBhbGlnbmVkX29mZnNldCwgYWxpZ25lZF9sZW4sICpwOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCisJaWYgKGVlcHJvbS0+bWFnaWMgIT0gRUVQUk9NX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFsaWduZWRfb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQgJiB+MzsKKwlhbGlnbmVkX2xlbiA9IChlZXByb20tPmxlbiArIChlZXByb20tPm9mZnNldCAmIDMpICsgMykgJiB+MzsKKworCWlmIChhbGlnbmVkX29mZnNldCAhPSBlZXByb20tPm9mZnNldCB8fCBhbGlnbmVkX2xlbiAhPSBlZXByb20tPmxlbikgeworCQlidWYgPSBrbWFsbG9jKGFsaWduZWRfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gdDNfc2VlcHJvbV9yZWFkKGFkYXB0ZXIsIGFsaWduZWRfb2Zmc2V0LCAodTMyICopIGJ1Zik7CisJCWlmICghZXJyICYmIGFsaWduZWRfbGVuID4gNCkKKwkJCWVyciA9IHQzX3NlZXByb21fcmVhZChhZGFwdGVyLAorCQkJCQkgICAgICBhbGlnbmVkX29mZnNldCArIGFsaWduZWRfbGVuIC0gNCwKKwkJCQkJICAgICAgKHUzMiAqKSAmIGJ1ZlthbGlnbmVkX2xlbiAtIDRdKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQltZW1jcHkoYnVmICsgKGVlcHJvbS0+b2Zmc2V0ICYgMyksIGRhdGEsIGVlcHJvbS0+bGVuKTsKKwl9IGVsc2UKKwkJYnVmID0gZGF0YTsKKworCWVyciA9IHQzX3NlZXByb21fd3AoYWRhcHRlciwgMCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlmb3IgKHAgPSAodTMyICopIGJ1ZjsgIWVyciAmJiBhbGlnbmVkX2xlbjsgYWxpZ25lZF9sZW4gLT0gNCwgcCsrKSB7CisJCWVyciA9IHQzX3NlZXByb21fd3JpdGUoYWRhcHRlciwgYWxpZ25lZF9vZmZzZXQsICpwKTsKKwkJYWxpZ25lZF9vZmZzZXQgKz0gNDsKKwl9CisKKwlpZiAoIWVycikKKwkJZXJyID0gdDNfc2VlcHJvbV93cChhZGFwdGVyLCAxKTsKK291dDoKKwlpZiAoYnVmICE9IGRhdGEpCisJCWtmcmVlKGJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJd29sLT5zdXBwb3J0ZWQgPSAwOworCXdvbC0+d29sb3B0cyA9IDA7CisJbWVtc2V0KCZ3b2wtPnNvcGFzcywgMCwgc2l6ZW9mKHdvbC0+c29wYXNzKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgY3hnYl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0gZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MgPSBzZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvID0gZ2V0X2RydmluZm8sCisJLmdldF9tc2dsZXZlbCA9IGdldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsID0gc2V0X21zZ2xldmVsLAorCS5nZXRfcmluZ3BhcmFtID0gZ2V0X3NnZV9wYXJhbSwKKwkuc2V0X3JpbmdwYXJhbSA9IHNldF9zZ2VfcGFyYW0sCisJLmdldF9jb2FsZXNjZSA9IGdldF9jb2FsZXNjZSwKKwkuc2V0X2NvYWxlc2NlID0gc2V0X2NvYWxlc2NlLAorCS5nZXRfZWVwcm9tX2xlbiA9IGdldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tID0gZ2V0X2VlcHJvbSwKKwkuc2V0X2VlcHJvbSA9IHNldF9lZXByb20sCisJLmdldF9wYXVzZXBhcmFtID0gZ2V0X3BhdXNlcGFyYW0sCisJLnNldF9wYXVzZXBhcmFtID0gc2V0X3BhdXNlcGFyYW0sCisJLmdldF9yeF9jc3VtID0gZ2V0X3J4X2NzdW0sCisJLnNldF9yeF9jc3VtID0gc2V0X3J4X2NzdW0sCisJLmdldF90eF9jc3VtID0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0gPSBldGh0b29sX29wX3NldF90eF9jc3VtLAorCS5nZXRfc2cgPSBldGh0b29sX29wX2dldF9zZywKKwkuc2V0X3NnID0gZXRodG9vbF9vcF9zZXRfc2csCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X3N0cmluZ3MgPSBnZXRfc3RyaW5ncywKKwkucGh5c19pZCA9IGN4Z2IzX3BoeXNfaWQsCisJLm53YXlfcmVzZXQgPSByZXN0YXJ0X2F1dG9uZWcsCisJLmdldF9zdGF0c19jb3VudCA9IGdldF9zdGF0c19jb3VudCwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBnZXRfc3RhdHMsCisJLmdldF9yZWdzX2xlbiA9IGdldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MgPSBnZXRfcmVncywKKwkuZ2V0X3dvbCA9IGdldF93b2wsCisJLmdldF90c28gPSBldGh0b29sX29wX2dldF90c28sCisJLnNldF90c28gPSBldGh0b29sX29wX3NldF90c28sCisJLmdldF9wZXJtX2FkZHIgPSBldGh0b29sX29wX2dldF9wZXJtX2FkZHIKK307CisKK3N0YXRpYyBpbnQgaW5fcmFuZ2UoaW50IHZhbCwgaW50IGxvLCBpbnQgaGkpCit7CisJcmV0dXJuIHZhbCA8IDAgfHwgKHZhbCA8PSBoaSAmJiB2YWwgPj0gbG8pOworfQorCitzdGF0aWMgaW50IGN4Z2JfZXh0ZW5zaW9uX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3sKKwlpbnQgcmV0OworCXUzMiBjbWQ7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgdXNlcmFkZHIsIHNpemVvZihjbWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQ0hFTFNJT19TRVRSRUc6eworCQlzdHJ1Y3QgY2hfcmVnIGVkYXRhOworCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZWRhdGEsIHVzZXJhZGRyLCBzaXplb2YoZWRhdGEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKGVkYXRhLmFkZHIgJiAzKSAhPSAwCisJCQl8fCBlZGF0YS5hZGRyID49IGFkYXB0ZXItPm1taW9fbGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXdyaXRlbChlZGF0YS52YWwsIGFkYXB0ZXItPnJlZ3MgKyBlZGF0YS5hZGRyKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQ0hFTFNJT19HRVRSRUc6eworCQlzdHJ1Y3QgY2hfcmVnIGVkYXRhOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZWRhdGEsIHVzZXJhZGRyLCBzaXplb2YoZWRhdGEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKGVkYXRhLmFkZHIgJiAzKSAhPSAwCisJCQl8fCBlZGF0YS5hZGRyID49IGFkYXB0ZXItPm1taW9fbGVuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVkYXRhLnZhbCA9IHJlYWRsKGFkYXB0ZXItPnJlZ3MgKyBlZGF0YS5hZGRyKTsKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgJmVkYXRhLCBzaXplb2YoZWRhdGEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwl9CisJY2FzZSBDSEVMU0lPX1NFVF9RU0VUX1BBUkFNUzp7CisJCWludCBpOworCQlzdHJ1Y3QgcXNldF9wYXJhbXMgKnE7CisJCXN0cnVjdCBjaF9xc2V0X3BhcmFtcyB0OworCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdCwgdXNlcmFkZHIsIHNpemVvZih0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHQucXNldF9pZHggPj0gU0dFX1FTRVRTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghaW5fcmFuZ2UodC5pbnRyX2xhdCwgMCwgTV9ORVdUSU1FUikgfHwKKwkJCSFpbl9yYW5nZSh0LmNvbmdfdGhyZXMsIDAsIDI1NSkgfHwKKwkJCSFpbl9yYW5nZSh0LnR4cV9zaXplWzBdLCBNSU5fVFhRX0VOVFJJRVMsCisJCQkJTUFYX1RYUV9FTlRSSUVTKSB8fAorCQkJIWluX3JhbmdlKHQudHhxX3NpemVbMV0sIE1JTl9UWFFfRU5UUklFUywKKwkJCQlNQVhfVFhRX0VOVFJJRVMpIHx8CisJCQkhaW5fcmFuZ2UodC50eHFfc2l6ZVsyXSwgTUlOX0NUUkxfVFhRX0VOVFJJRVMsCisJCQkJTUFYX0NUUkxfVFhRX0VOVFJJRVMpIHx8CisJCQkhaW5fcmFuZ2UodC5mbF9zaXplWzBdLCBNSU5fRkxfRU5UUklFUywKKwkJCQlNQVhfUlhfQlVGRkVSUykKKwkJCXx8ICFpbl9yYW5nZSh0LmZsX3NpemVbMV0sIE1JTl9GTF9FTlRSSUVTLAorCQkJCQlNQVhfUlhfSlVNQk9fQlVGRkVSUykKKwkJCXx8ICFpbl9yYW5nZSh0LnJzcHFfc2l6ZSwgTUlOX1JTUFFfRU5UUklFUywKKwkJCQkJTUFYX1JTUFFfRU5UUklFUykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKChhZGFwdGVyLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKSAmJgorCQkJKHQucnNwcV9zaXplID49IDAgfHwgdC5mbF9zaXplWzBdID49IDAgfHwKKwkJCXQuZmxfc2l6ZVsxXSA+PSAwIHx8IHQudHhxX3NpemVbMF0gPj0gMCB8fAorCQkJdC50eHFfc2l6ZVsxXSA+PSAwIHx8IHQudHhxX3NpemVbMl0gPj0gMCB8fAorCQkJdC5wb2xsaW5nID49IDAgfHwgdC5jb25nX3RocmVzID49IDApKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlxID0gJmFkYXB0ZXItPnBhcmFtcy5zZ2UucXNldFt0LnFzZXRfaWR4XTsKKworCQlpZiAodC5yc3BxX3NpemUgPj0gMCkKKwkJCXEtPnJzcHFfc2l6ZSA9IHQucnNwcV9zaXplOworCQlpZiAodC5mbF9zaXplWzBdID49IDApCisJCQlxLT5mbF9zaXplID0gdC5mbF9zaXplWzBdOworCQlpZiAodC5mbF9zaXplWzFdID49IDApCisJCQlxLT5qdW1ib19zaXplID0gdC5mbF9zaXplWzFdOworCQlpZiAodC50eHFfc2l6ZVswXSA+PSAwKQorCQkJcS0+dHhxX3NpemVbMF0gPSB0LnR4cV9zaXplWzBdOworCQlpZiAodC50eHFfc2l6ZVsxXSA+PSAwKQorCQkJcS0+dHhxX3NpemVbMV0gPSB0LnR4cV9zaXplWzFdOworCQlpZiAodC50eHFfc2l6ZVsyXSA+PSAwKQorCQkJcS0+dHhxX3NpemVbMl0gPSB0LnR4cV9zaXplWzJdOworCQlpZiAodC5jb25nX3RocmVzID49IDApCisJCQlxLT5jb25nX3RocmVzID0gdC5jb25nX3RocmVzOworCQlpZiAodC5pbnRyX2xhdCA+PSAwKSB7CisJCQlzdHJ1Y3Qgc2dlX3FzZXQgKnFzID0KKwkJCQkmYWRhcHRlci0+c2dlLnFzW3QucXNldF9pZHhdOworCisJCQlxLT5jb2FsZXNjZV91c2VjcyA9IHQuaW50cl9sYXQ7CisJCQl0M191cGRhdGVfcXNldF9jb2FsZXNjZShxcywgcSk7CisJCX0KKwkJaWYgKHQucG9sbGluZyA+PSAwKSB7CisJCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQkJCXEtPnBvbGxpbmcgPSB0LnBvbGxpbmc7CisJCQllbHNlIHsKKwkJCQkvKiBObyBwb2xsaW5nIHdpdGggSU5UeCBmb3IgVDNBICovCisJCQkJaWYgKGFkYXB0ZXItPnBhcmFtcy5yZXYgPT0gMCAmJgorCQkJCQkhKGFkYXB0ZXItPmZsYWdzICYgVVNJTkdfTVNJKSkKKwkJCQkJdC5wb2xsaW5nID0gMDsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBTR0VfUVNFVFM7IGkrKykgeworCQkJCQlxID0gJmFkYXB0ZXItPnBhcmFtcy5zZ2UuCisJCQkJCQlxc2V0W2ldOworCQkJCQlxLT5wb2xsaW5nID0gdC5wb2xsaW5nOworCQkJCX0KKwkJCX0KKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBDSEVMU0lPX0dFVF9RU0VUX1BBUkFNUzp7CisJCXN0cnVjdCBxc2V0X3BhcmFtcyAqcTsKKwkJc3RydWN0IGNoX3FzZXRfcGFyYW1zIHQ7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0LCB1c2VyYWRkciwgc2l6ZW9mKHQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodC5xc2V0X2lkeCA+PSBTR0VfUVNFVFMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlxID0gJmFkYXB0ZXItPnBhcmFtcy5zZ2UucXNldFt0LnFzZXRfaWR4XTsKKwkJdC5yc3BxX3NpemUgPSBxLT5yc3BxX3NpemU7CisJCXQudHhxX3NpemVbMF0gPSBxLT50eHFfc2l6ZVswXTsKKwkJdC50eHFfc2l6ZVsxXSA9IHEtPnR4cV9zaXplWzFdOworCQl0LnR4cV9zaXplWzJdID0gcS0+dHhxX3NpemVbMl07CisJCXQuZmxfc2l6ZVswXSA9IHEtPmZsX3NpemU7CisJCXQuZmxfc2l6ZVsxXSA9IHEtPmp1bWJvX3NpemU7CisJCXQucG9sbGluZyA9IHEtPnBvbGxpbmc7CisJCXQuaW50cl9sYXQgPSBxLT5jb2FsZXNjZV91c2VjczsKKwkJdC5jb25nX3RocmVzID0gcS0+Y29uZ190aHJlczsKKworCQlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmdCwgc2l6ZW9mKHQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwl9CisJY2FzZSBDSEVMU0lPX1NFVF9RU0VUX05VTTp7CisJCXN0cnVjdCBjaF9yZWcgZWRhdGE7CisJCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJdW5zaWduZWQgaW50IGksIGZpcnN0X3FzZXQgPSAwLCBvdGhlcl9xc2V0cyA9IDA7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCQlyZXR1cm4gLUVCVVNZOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmVkYXRhLCB1c2VyYWRkciwgc2l6ZW9mKGVkYXRhKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGVkYXRhLnZhbCA8IDEgfHwKKwkJCShlZGF0YS52YWwgPiAxICYmICEoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0lYKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCisJCQlpZiAoYWRhcHRlci0+cG9ydFtpXSAmJiBhZGFwdGVyLT5wb3J0W2ldICE9IGRldikKKwkJCQlvdGhlcl9xc2V0cyArPSBhZGFwMnBpbmZvKGFkYXB0ZXIsIGkpLT5ucXNldHM7CisKKwkJaWYgKGVkYXRhLnZhbCArIG90aGVyX3FzZXRzID4gU0dFX1FTRVRTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcGktPm5xc2V0cyA9IGVkYXRhLnZhbDsKKworCQlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCisJCQlpZiAoYWRhcHRlci0+cG9ydFtpXSkgeworCQkJCXBpID0gYWRhcDJwaW5mbyhhZGFwdGVyLCBpKTsKKwkJCQlwaS0+Zmlyc3RfcXNldCA9IGZpcnN0X3FzZXQ7CisJCQkJZmlyc3RfcXNldCArPSBwaS0+bnFzZXRzOworCQkJfQorCQlicmVhazsKKwl9CisJY2FzZSBDSEVMU0lPX0dFVF9RU0VUX05VTTp7CisJCXN0cnVjdCBjaF9yZWcgZWRhdGE7CisJCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQllZGF0YS5jbWQgPSBDSEVMU0lPX0dFVF9RU0VUX05VTTsKKwkJZWRhdGEudmFsID0gcGktPm5xc2V0czsKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgJmVkYXRhLCBzaXplb2YoZWRhdGEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwl9CisJY2FzZSBDSEVMU0lPX0xPQURfRlc6eworCQl1OCAqZndfZGF0YTsKKwkJc3RydWN0IGNoX21lbV9yYW5nZSB0OworCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdCwgdXNlcmFkZHIsIHNpemVvZih0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlmd19kYXRhID0ga21hbGxvYyh0LmxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghZndfZGF0YSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJKGZ3X2RhdGEsIHVzZXJhZGRyICsgc2l6ZW9mKHQpLCB0LmxlbikpIHsKKwkJCWtmcmVlKGZ3X2RhdGEpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlyZXQgPSB0M19sb2FkX2Z3KGFkYXB0ZXIsIGZ3X2RhdGEsIHQubGVuKTsKKwkJa2ZyZWUoZndfZGF0YSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwl9CisJY2FzZSBDSEVMU0lPX1NFVE1UVVRBQjp7CisJCXN0cnVjdCBjaF9tdHVzIG07CisJCWludCBpOworCisJCWlmICghaXNfb2ZmbG9hZChhZGFwdGVyKSkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKG9mZmxvYWRfcnVubmluZyhhZGFwdGVyKSkKKwkJCXJldHVybiAtRUJVU1k7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbSwgdXNlcmFkZHIsIHNpemVvZihtKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKG0ubm10dXMgIT0gTk1UVVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG0ubXR1c1swXSA8IDgxKQkvKiBhY2NvbW1vZGF0ZSBTQUNLICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBNVFVzIG11c3QgYmUgaW4gYXNjZW5kaW5nIG9yZGVyICovCisJCWZvciAoaSA9IDE7IGkgPCBOTVRVUzsgKytpKQorCQkJaWYgKG0ubXR1c1tpXSA8IG0ubXR1c1tpIC0gMV0pCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJbWVtY3B5KGFkYXB0ZXItPnBhcmFtcy5tdHVzLCBtLm10dXMsCisJCQlzaXplb2YoYWRhcHRlci0+cGFyYW1zLm10dXMpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQ0hFTFNJT19HRVRfUE06eworCQlzdHJ1Y3QgdHBfcGFyYW1zICpwID0gJmFkYXB0ZXItPnBhcmFtcy50cDsKKwkJc3RydWN0IGNoX3BtIG0gPSB7LmNtZCA9IENIRUxTSU9fR0VUX1BNIH07CisKKwkJaWYgKCFpc19vZmZsb2FkKGFkYXB0ZXIpKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQltLnR4X3BnX3N6ID0gcC0+dHhfcGdfc2l6ZTsKKwkJbS50eF9udW1fcGcgPSBwLT50eF9udW1fcGdzOworCQltLnJ4X3BnX3N6ID0gcC0+cnhfcGdfc2l6ZTsKKwkJbS5yeF9udW1fcGcgPSBwLT5yeF9udW1fcGdzOworCQltLnBtX3RvdGFsID0gcC0+cG10eF9zaXplICsgcC0+Y2hhbl9yeF9zaXplICogcC0+bmNoYW47CisJCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsICZtLCBzaXplb2YobSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKwljYXNlIENIRUxTSU9fU0VUX1BNOnsKKwkJc3RydWN0IGNoX3BtIG07CisJCXN0cnVjdCB0cF9wYXJhbXMgKnAgPSAmYWRhcHRlci0+cGFyYW1zLnRwOworCisJCWlmICghaXNfb2ZmbG9hZChhZGFwdGVyKSkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKGFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCQlyZXR1cm4gLUVCVVNZOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm0sIHVzZXJhZGRyLCBzaXplb2YobSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICghbS5yeF9wZ19zeiB8fCAobS5yeF9wZ19zeiAmIChtLnJ4X3BnX3N6IC0gMSkpIHx8CisJCQkhbS50eF9wZ19zeiB8fCAobS50eF9wZ19zeiAmIChtLnR4X3BnX3N6IC0gMSkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CS8qIG5vdCBwb3dlciBvZiAyICovCisJCWlmICghKG0ucnhfcGdfc3ogJiAweDE0MDAwKSkKKwkJCXJldHVybiAtRUlOVkFMOwkvKiBub3QgMTZLQiBvciA2NEtCICovCisJCWlmICghKG0udHhfcGdfc3ogJiAweDE1NTQwMDApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChtLnR4X251bV9wZyA9PSAtMSkKKwkJCW0udHhfbnVtX3BnID0gcC0+dHhfbnVtX3BnczsKKwkJaWYgKG0ucnhfbnVtX3BnID09IC0xKQorCQkJbS5yeF9udW1fcGcgPSBwLT5yeF9udW1fcGdzOworCQlpZiAobS50eF9udW1fcGcgJSAyNCB8fCBtLnJ4X251bV9wZyAlIDI0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChtLnJ4X251bV9wZyAqIG0ucnhfcGdfc3ogPiBwLT5jaGFuX3J4X3NpemUgfHwKKwkJCW0udHhfbnVtX3BnICogbS50eF9wZ19zeiA+IHAtPmNoYW5fdHhfc2l6ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlwLT5yeF9wZ19zaXplID0gbS5yeF9wZ19zejsKKwkJcC0+dHhfcGdfc2l6ZSA9IG0udHhfcGdfc3o7CisJCXAtPnJ4X251bV9wZ3MgPSBtLnJ4X251bV9wZzsKKwkJcC0+dHhfbnVtX3BncyA9IG0udHhfbnVtX3BnOworCQlicmVhazsKKwl9CisJY2FzZSBDSEVMU0lPX0dFVF9NRU06eworCQlzdHJ1Y3QgY2hfbWVtX3JhbmdlIHQ7CisJCXN0cnVjdCBtYzcgKm1lbTsKKwkJdTY0IGJ1ZlszMl07CisKKwkJaWYgKCFpc19vZmZsb2FkKGFkYXB0ZXIpKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKSkKKwkJCXJldHVybiAtRUlPOwkvKiBuZWVkIHRoZSBtZW1vcnkgY29udHJvbGxlcnMgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0LCB1c2VyYWRkciwgc2l6ZW9mKHQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoKHQuYWRkciAmIDcpIHx8ICh0LmxlbiAmIDcpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh0Lm1lbV9pZCA9PSBNRU1fQ00pCisJCQltZW0gPSAmYWRhcHRlci0+Y207CisJCWVsc2UgaWYgKHQubWVtX2lkID09IE1FTV9QTVJYKQorCQkJbWVtID0gJmFkYXB0ZXItPnBtcng7CisJCWVsc2UgaWYgKHQubWVtX2lkID09IE1FTV9QTVRYKQorCQkJbWVtID0gJmFkYXB0ZXItPnBtdHg7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCS8qCisJCQkqIFZlcnNpb24gc2NoZW1lOgorCQkJKiBiaXRzIDAuLjk6IGNoaXAgdmVyc2lvbgorCQkJKiBiaXRzIDEwLi4xNTogY2hpcCByZXZpc2lvbgorCQkJKi8KKwkJdC52ZXJzaW9uID0gMyB8IChhZGFwdGVyLT5wYXJhbXMucmV2IDw8IDEwKTsKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgJnQsIHNpemVvZih0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKgorCQkgKiBSZWFkIDI1NiBieXRlcyBhdCBhIHRpbWUgYXMgbGVuIGNhbiBiZSBsYXJnZSBhbmQgd2UgZG9uJ3QKKwkJICogd2FudCB0byB1c2UgaHVnZSBpbnRlcm1lZGlhdGUgYnVmZmVycy4KKwkJICovCisJCXVzZXJhZGRyICs9IHNpemVvZih0KTsJLyogYWR2YW5jZSB0byBzdGFydCBvZiBidWZmZXIgKi8KKwkJd2hpbGUgKHQubGVuKSB7CisJCQl1bnNpZ25lZCBpbnQgY2h1bmsgPQorCQkJCW1pbl90KHVuc2lnbmVkIGludCwgdC5sZW4sIHNpemVvZihidWYpKTsKKworCQkJcmV0ID0KKwkJCQl0M19tYzdfYmRfcmVhZChtZW0sIHQuYWRkciAvIDgsIGNodW5rIC8gOCwKKwkJCQkJCWJ1Zik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCBidWYsIGNodW5rKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVzZXJhZGRyICs9IGNodW5rOworCQkJdC5hZGRyICs9IGNodW5rOworCQkJdC5sZW4gLT0gY2h1bms7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgQ0hFTFNJT19TRVRfVFJBQ0VfRklMVEVSOnsKKwkJc3RydWN0IGNoX3RyYWNlIHQ7CisJCWNvbnN0IHN0cnVjdCB0cmFjZV9wYXJhbXMgKnRwOworCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmICghb2ZmbG9hZF9ydW5uaW5nKGFkYXB0ZXIpKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdCwgdXNlcmFkZHIsIHNpemVvZih0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQl0cCA9IChjb25zdCBzdHJ1Y3QgdHJhY2VfcGFyYW1zICopJnQuc2lwOworCQlpZiAodC5jb25maWdfdHgpCisJCQl0M19jb25maWdfdHJhY2VfZmlsdGVyKGFkYXB0ZXIsIHRwLCAwLAorCQkJCQkJdC5pbnZlcnRfbWF0Y2gsCisJCQkJCQl0LnRyYWNlX3R4KTsKKwkJaWYgKHQuY29uZmlnX3J4KQorCQkJdDNfY29uZmlnX3RyYWNlX2ZpbHRlcihhZGFwdGVyLCB0cCwgMSwKKwkJCQkJCXQuaW52ZXJ0X21hdGNoLAorCQkJCQkJdC50cmFjZV9yeCk7CisJCWJyZWFrOworCX0KKwljYXNlIENIRUxTSU9fU0VUX1BLVFNDSEVEOnsKKwkJc3RydWN0IGNoX3BrdHNjaGVkX3BhcmFtcyBwOworCisJCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoIWFkYXB0ZXItPm9wZW5fZGV2aWNlX21hcCkKKwkJCQlyZXR1cm4gLUVBR0FJTjsJLyogdVAgYW5kIFNHRSBtdXN0IGJlIHJ1bm5pbmcgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCB1c2VyYWRkciwgc2l6ZW9mKHApKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2VuZF9wa3RzY2hlZF9jbWQoYWRhcHRlciwgcC5zY2hlZCwgcC5pZHgsIHAubWluLCBwLm1heCwKKwkJCQkgIHAuYmluZGluZyk7CisJCWJyZWFrOworCQkJCisJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3hnYl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJlcSwgaW50IGNtZCkKK3sKKwlpbnQgcmV0LCBtbWQ7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqZGF0YSA9IGlmX21paShyZXEpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NHTUlJUEhZOgorCQlkYXRhLT5waHlfaWQgPSBwaS0+cGh5LmFkZHI7CisJCS8qIEZBTExUSFJVICovCisJY2FzZSBTSU9DR01JSVJFRzp7CisJCXUzMiB2YWw7CisJCXN0cnVjdCBjcGh5ICpwaHkgPSAmcGktPnBoeTsKKworCQlpZiAoIXBoeS0+bWRpb19yZWFkKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlpZiAoaXNfMTBHKGFkYXB0ZXIpKSB7CisJCQltbWQgPSBkYXRhLT5waHlfaWQgPj4gODsKKwkJCWlmICghbW1kKQorCQkJCW1tZCA9IE1ESU9fREVWX1BDUzsKKwkJCWVsc2UgaWYgKG1tZCA+IE1ESU9fREVWX1hHWFMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXJldCA9CisJCQkJcGh5LT5tZGlvX3JlYWQoYWRhcHRlciwgZGF0YS0+cGh5X2lkICYgMHgxZiwKKwkJCQkJCW1tZCwgZGF0YS0+cmVnX251bSwgJnZhbCk7CisJCX0gZWxzZQorCQkJcmV0ID0KKwkJCQlwaHktPm1kaW9fcmVhZChhZGFwdGVyLCBkYXRhLT5waHlfaWQgJiAweDFmLAorCQkJCQkJMCwgZGF0YS0+cmVnX251bSAmIDB4MWYsCisJCQkJCQkmdmFsKTsKKwkJaWYgKCFyZXQpCisJCQlkYXRhLT52YWxfb3V0ID0gdmFsOworCQlicmVhazsKKwl9CisJY2FzZSBTSU9DU01JSVJFRzp7CisJCXN0cnVjdCBjcGh5ICpwaHkgPSAmcGktPnBoeTsKKworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoIXBoeS0+bWRpb193cml0ZSkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJaWYgKGlzXzEwRyhhZGFwdGVyKSkgeworCQkJbW1kID0gZGF0YS0+cGh5X2lkID4+IDg7CisJCQlpZiAoIW1tZCkKKwkJCQltbWQgPSBNRElPX0RFVl9QQ1M7CisJCQllbHNlIGlmIChtbWQgPiBNRElPX0RFVl9YR1hTKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlyZXQgPQorCQkJCXBoeS0+bWRpb193cml0ZShhZGFwdGVyLAorCQkJCQkJZGF0YS0+cGh5X2lkICYgMHgxZiwgbW1kLAorCQkJCQkJZGF0YS0+cmVnX251bSwKKwkJCQkJCWRhdGEtPnZhbF9pbik7CisJCX0gZWxzZQorCQkJcmV0ID0KKwkJCQlwaHktPm1kaW9fd3JpdGUoYWRhcHRlciwKKwkJCQkJCWRhdGEtPnBoeV9pZCAmIDB4MWYsIDAsCisJCQkJCQlkYXRhLT5yZWdfbnVtICYgMHgxZiwKKwkJCQkJCWRhdGEtPnZhbF9pbik7CisJCWJyZWFrOworCX0KKwljYXNlIFNJT0NDSElPQ1RMOgorCQlyZXR1cm4gY3hnYl9leHRlbnNpb25faW9jdGwoZGV2LCByZXEtPmlmcl9kYXRhKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY3hnYl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWludCByZXQ7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG5ld19tdHUgPCA4MSkJLyogYWNjb21tb2RhdGUgU0FDSyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoKHJldCA9IHQzX21hY19zZXRfbXR1KCZwaS0+bWFjLCBuZXdfbXR1KSkpCisJCXJldHVybiByZXQ7CisJZGV2LT5tdHUgPSBuZXdfbXR1OworCWluaXRfcG9ydF9tdHVzKGFkYXB0ZXIpOworCWlmIChhZGFwdGVyLT5wYXJhbXMucmV2ID09IDAgJiYgb2ZmbG9hZF9ydW5uaW5nKGFkYXB0ZXIpKQorCQl0M19sb2FkX210dXMoYWRhcHRlciwgYWRhcHRlci0+cGFyYW1zLm10dXMsCisJCQkgICAgIGFkYXB0ZXItPnBhcmFtcy5hX3duZCwgYWRhcHRlci0+cGFyYW1zLmJfd25kLAorCQkJICAgICBhZGFwdGVyLT5wb3J0WzBdLT5tdHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4Z2Jfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOworCXQzX21hY19zZXRfYWRkcmVzcygmcGktPm1hYywgMCwgZGV2LT5kZXZfYWRkcik7CisJaWYgKG9mZmxvYWRfcnVubmluZyhhZGFwdGVyKSkKKwkJd3JpdGVfc210X2VudHJ5KGFkYXB0ZXIsIHBpLT5wb3J0X2lkKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0M19zeW5jaHJvbml6ZV9yeCAtIHdhaXQgZm9yIGN1cnJlbnQgUnggcHJvY2Vzc2luZyBvbiBhIHBvcnQgdG8gY29tcGxldGUKKyAqIEBhZGFwOiB0aGUgYWRhcHRlcgorICogQHA6IHRoZSBwb3J0CisgKgorICogRW5zdXJlcyB0aGF0IGN1cnJlbnQgUnggcHJvY2Vzc2luZyBvbiBhbnkgb2YgdGhlIHF1ZXVlcyBhc3NvY2lhdGVkIHdpdGgKKyAqIHRoZSBnaXZlbiBwb3J0IGNvbXBsZXRlcyBiZWZvcmUgcmV0dXJuaW5nLiAgV2UgZG8gdGhpcyBieSBhY3F1aXJpbmcgYW5kCisgKiByZWxlYXNpbmcgdGhlIGxvY2tzIG9mIHRoZSByZXNwb25zZSBxdWV1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb3J0LgorICovCitzdGF0aWMgdm9pZCB0M19zeW5jaHJvbml6ZV9yeChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwLT5ucXNldHM7IGkrKykgeworCQlzdHJ1Y3Qgc2dlX3JzcHEgKnEgPSAmYWRhcC0+c2dlLnFzW2kgKyBwLT5maXJzdF9xc2V0XS5yc3BxOworCisJCXNwaW5fbG9ja19pcnEoJnEtPmxvY2spOworCQlzcGluX3VubG9ja19pcnEoJnEtPmxvY2spOworCX0KK30KKworc3RhdGljIHZvaWQgdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXBpLT52bGFuX2dycCA9IGdycDsKKwlpZiAoYWRhcHRlci0+cGFyYW1zLnJldiA+IDApCisJCXQzX3NldF92bGFuX2FjY2VsKGFkYXB0ZXIsIDEgPDwgcGktPnBvcnRfaWQsIGdycCAhPSBOVUxMKTsKKwllbHNlIHsKKwkJLyogc2luZ2xlIGNvbnRyb2wgZm9yIGFsbCBwb3J0cyAqLworCQl1bnNpZ25lZCBpbnQgaSwgaGF2ZV92bGFucyA9IDA7CisJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkKKwkJICAgIGhhdmVfdmxhbnMgfD0gYWRhcDJwaW5mbyhhZGFwdGVyLCBpKS0+dmxhbl9ncnAgIT0gTlVMTDsKKworCQl0M19zZXRfdmxhbl9hY2NlbChhZGFwdGVyLCAxLCBoYXZlX3ZsYW5zKTsKKwl9CisJdDNfc3luY2hyb25pemVfcngoYWRhcHRlciwgcGkpOworfQorCitzdGF0aWMgdm9pZCB2bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwkvKiBub3RoaW5nICovCit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgY3hnYl9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisJc3RydWN0IHNnZV9xc2V0ICpxcyA9IGRldjJxc2V0KGRldik7CisKKwl0M19pbnRyX2hhbmRsZXIoYWRhcHRlciwgcXMtPnJzcHEucG9sbGluZykgKGFkYXB0ZXItPnBkZXYtPmlycSwKKwkJCQkJCSAgICBhZGFwdGVyKTsKK30KKyNlbmRpZgorCisvKgorICogUGVyaW9kaWMgYWNjdW11bGF0aW9uIG9mIE1BQyBzdGF0aXN0aWNzLgorICovCitzdGF0aWMgdm9pZCBtYWNfc3RhdHNfdXBkYXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhZGFwdGVyLT5wb3J0W2ldOworCQlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCQlzcGluX2xvY2soJmFkYXB0ZXItPnN0YXRzX2xvY2spOworCQkJdDNfbWFjX3VwZGF0ZV9zdGF0cygmcC0+bWFjKTsKKwkJCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5zdGF0c19sb2NrKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfbGlua19zdGF0dXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXB0ZXItPnBvcnRbaV07CisJCXN0cnVjdCBwb3J0X2luZm8gKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCWlmICghKHAtPnBvcnRfdHlwZS0+Y2FwcyAmIFNVUFBPUlRFRF9JUlEpICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXQzX2xpbmtfY2hhbmdlZChhZGFwdGVyLCBpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHQzX2FkYXBfY2hlY2tfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFkYXB0ZXIsCisJCQkJCSAgICAgICBhZGFwX2NoZWNrX3Rhc2sud29yayk7CisJY29uc3Qgc3RydWN0IGFkYXB0ZXJfcGFyYW1zICpwID0gJmFkYXB0ZXItPnBhcmFtczsKKworCWFkYXB0ZXItPmNoZWNrX3Rhc2tfY250Kys7CisKKwkvKiBDaGVjayBsaW5rIHN0YXR1cyBmb3IgUEhZcyB3aXRob3V0IGludGVycnVwdHMgKi8KKwlpZiAocC0+bGlua3BvbGxfcGVyaW9kKQorCQljaGVja19saW5rX3N0YXR1cyhhZGFwdGVyKTsKKworCS8qIEFjY3VtdWxhdGUgTUFDIHN0YXRzIGlmIG5lZWRlZCAqLworCWlmICghcC0+bGlua3BvbGxfcGVyaW9kIHx8CisJICAgIChhZGFwdGVyLT5jaGVja190YXNrX2NudCAqIHAtPmxpbmtwb2xsX3BlcmlvZCkgLyAxMCA+PQorCSAgICBwLT5zdGF0c191cGRhdGVfcGVyaW9kKSB7CisJCW1hY19zdGF0c191cGRhdGUoYWRhcHRlcik7CisJCWFkYXB0ZXItPmNoZWNrX3Rhc2tfY250ID0gMDsKKwl9CisKKwkvKiBTY2hlZHVsZSB0aGUgbmV4dCBjaGVjayB1cGRhdGUgaWYgYW55IHBvcnQgaXMgYWN0aXZlLiAqLworCXNwaW5fbG9jaygmYWRhcHRlci0+d29ya19sb2NrKTsKKwlpZiAoYWRhcHRlci0+b3Blbl9kZXZpY2VfbWFwICYgUE9SVF9NQVNLKQorCQlzY2hlZHVsZV9jaGtfdGFzayhhZGFwdGVyKTsKKwlzcGluX3VubG9jaygmYWRhcHRlci0+d29ya19sb2NrKTsKK30KKworLyoKKyAqIFByb2Nlc3NlcyBleHRlcm5hbCAoUEhZKSBpbnRlcnJ1cHRzIGluIHByb2Nlc3MgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgZXh0X2ludHJfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFkYXB0ZXIsCisJCQkJCSAgICAgICBleHRfaW50cl9oYW5kbGVyX3Rhc2spOworCisJdDNfcGh5X2ludHJfaGFuZGxlcihhZGFwdGVyKTsKKworCS8qIE5vdyByZWVuYWJsZSBleHRlcm5hbCBpbnRlcnJ1cHRzICovCisJc3Bpbl9sb2NrX2lycSgmYWRhcHRlci0+d29ya19sb2NrKTsKKwlpZiAoYWRhcHRlci0+c2xvd19pbnRyX21hc2spIHsKKwkJYWRhcHRlci0+c2xvd19pbnRyX21hc2sgfD0gRl9UM0RCRzsKKwkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfUExfSU5UX0NBVVNFMCwgRl9UM0RCRyk7CisJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1BMX0lOVF9FTkFCTEUwLAorCQkJICAgICBhZGFwdGVyLT5zbG93X2ludHJfbWFzayk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmYWRhcHRlci0+d29ya19sb2NrKTsKK30KKworLyoKKyAqIEludGVycnVwdC1jb250ZXh0IGhhbmRsZXIgZm9yIGV4dGVybmFsIChQSFkpIGludGVycnVwdHMuCisgKi8KK3ZvaWQgdDNfb3NfZXh0X2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKgorCSAqIFNjaGVkdWxlIGEgdGFzayB0byBoYW5kbGUgZXh0ZXJuYWwgaW50ZXJydXB0cyBhcyB0aGV5IG1heSBiZSBzbG93CisJICogYW5kIHdlIHVzZSBhIG11dGV4IHRvIHByb3RlY3QgTURJTyByZWdpc3RlcnMuICBXZSBkaXNhYmxlIFBIWQorCSAqIGludGVycnVwdHMgaW4gdGhlIG1lYW50aW1lIGFuZCBsZXQgdGhlIHRhc2sgcmVlbmFibGUgdGhlbSB3aGVuCisJICogaXQncyBkb25lLgorCSAqLworCXNwaW5fbG9jaygmYWRhcHRlci0+d29ya19sb2NrKTsKKwlpZiAoYWRhcHRlci0+c2xvd19pbnRyX21hc2spIHsKKwkJYWRhcHRlci0+c2xvd19pbnRyX21hc2sgJj0gfkZfVDNEQkc7CisJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1BMX0lOVF9FTkFCTEUwLAorCQkJICAgICBhZGFwdGVyLT5zbG93X2ludHJfbWFzayk7CisJCXF1ZXVlX3dvcmsoY3hnYjNfd3EsICZhZGFwdGVyLT5leHRfaW50cl9oYW5kbGVyX3Rhc2spOworCX0KKwlzcGluX3VubG9jaygmYWRhcHRlci0+d29ya19sb2NrKTsKK30KKwordm9pZCB0M19mYXRhbF9lcnIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgaW50IGZ3X3N0YXR1c1s0XTsKKworCWlmIChhZGFwdGVyLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKSB7CisJCXQzX3NnZV9zdG9wKGFkYXB0ZXIpOworCQl0M19pbnRyX2Rpc2FibGUoYWRhcHRlcik7CisJfQorCUNIX0FMRVJUKGFkYXB0ZXIsICJlbmNvdW50ZXJlZCBmYXRhbCBlcnJvciwgb3BlcmF0aW9uIHN1c3BlbmRlZFxuIik7CisJaWYgKCF0M19jaW1fY3RsX2Jsa19yZWFkKGFkYXB0ZXIsIDB4YTAsIDQsIGZ3X3N0YXR1cykpCisJCUNIX0FMRVJUKGFkYXB0ZXIsICJGVyBzdGF0dXM6IDB4JXgsIDB4JXgsIDB4JXgsIDB4JXhcbiIsCisJCQkgZndfc3RhdHVzWzBdLCBmd19zdGF0dXNbMV0sCisJCQkgZndfc3RhdHVzWzJdLCBmd19zdGF0dXNbM10pOworCit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGN4Z2JfZW5hYmxlX21zaXgoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IG1zaXhfZW50cnkgZW50cmllc1tTR0VfUVNFVFMgKyAxXTsKKwlpbnQgaSwgZXJyOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZW50cmllcyk7ICsraSkKKwkJZW50cmllc1tpXS5lbnRyeSA9IGk7CisKKwllcnIgPSBwY2lfZW5hYmxlX21zaXgoYWRhcC0+cGRldiwgZW50cmllcywgQVJSQVlfU0laRShlbnRyaWVzKSk7CisJaWYgKCFlcnIpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZW50cmllcyk7ICsraSkKKwkJCWFkYXAtPm1zaXhfaW5mb1tpXS52ZWMgPSBlbnRyaWVzW2ldLnZlY3RvcjsKKwl9IGVsc2UgaWYgKGVyciA+IDApCisJCWRldl9pbmZvKCZhZGFwLT5wZGV2LT5kZXYsCisJCSAgICAgICAib25seSAlZCBNU0ktWCB2ZWN0b3JzIGxlZnQsIG5vdCB1c2luZyBNU0ktWFxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcHJpbnRfcG9ydF9pbmZvKHN0cnVjdCBhZGFwdGVyICphZGFwLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhZGFwdGVyX2luZm8gKmFpKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpwY2lfdmFyaWFudFtdID0geworCQkiUENJIiwgIlBDSS1YIiwgIlBDSS1YIEVDQyIsICJQQ0ktWCAyNjYiLCAiUENJIEV4cHJlc3MiCisJfTsKKworCWludCBpOworCWNoYXIgYnVmWzgwXTsKKworCWlmIChpc19wY2llKGFkYXApKQorCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMgeCVkIiwKKwkJCSBwY2lfdmFyaWFudFthZGFwLT5wYXJhbXMucGNpLnZhcmlhbnRdLAorCQkJIGFkYXAtPnBhcmFtcy5wY2kud2lkdGgpOworCWVsc2UKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzICVkTUh6LyVkLWJpdCIsCisJCQkgcGNpX3ZhcmlhbnRbYWRhcC0+cGFyYW1zLnBjaS52YXJpYW50XSwKKwkJCSBhZGFwLT5wYXJhbXMucGNpLnNwZWVkLCBhZGFwLT5wYXJhbXMucGNpLndpZHRoKTsKKworCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRhcC0+cG9ydFtpXTsKKwkJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCWlmICghdGVzdF9iaXQoaSwgJmFkYXAtPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCkpCisJCQljb250aW51ZTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzICVzIFJOSUMgKHJldiAlZCkgJXMlc1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgYWktPmRlc2MsIHBpLT5wb3J0X3R5cGUtPmRlc2MsCisJCSAgICAgICBhZGFwLT5wYXJhbXMucmV2LCBidWYsCisJCSAgICAgICAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKSA/ICIgTVNJLVgiIDoKKwkJICAgICAgIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSSkgPyAiIE1TSSIgOiAiIik7CisJCWlmIChhZGFwLT5uYW1lID09IGRldi0+bmFtZSAmJiBhZGFwLT5wYXJhbXMudnBkLm1jbGspCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogJXVNQiBDTSwgJXVNQiBQTVRYLCAldU1CIFBNUlhcbiIsCisJCQkgICAgICAgYWRhcC0+bmFtZSwgdDNfbWM3X3NpemUoJmFkYXAtPmNtKSA+PiAyMCwKKwkJCSAgICAgICB0M19tYzdfc2l6ZSgmYWRhcC0+cG10eCkgPj4gMjAsCisJCQkgICAgICAgdDNfbWM3X3NpemUoJmFkYXAtPnBtcngpID4+IDIwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IHZlcnNpb25fcHJpbnRlZDsKKworCWludCBpLCBlcnIsIHBjaV91c2luZ19kYWMgPSAwOworCXVuc2lnbmVkIGxvbmcgbW1pb19zdGFydCwgbW1pb19sZW47CisJY29uc3Qgc3RydWN0IGFkYXB0ZXJfaW5mbyAqYWk7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCisJaWYgKCF2ZXJzaW9uX3ByaW50ZWQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgLSB2ZXJzaW9uICVzXG4iLCBEUlZfREVTQywgRFJWX1ZFUlNJT04pOworCQkrK3ZlcnNpb25fcHJpbnRlZDsKKwl9CisKKwlpZiAoIWN4Z2IzX3dxKSB7CisJCWN4Z2IzX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoRFJWX05BTUUpOworCQlpZiAoIWN4Z2IzX3dxKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJCSAgICAgICAiOiBjYW5ub3QgaW5pdGlhbGl6ZSB3b3JrIHF1ZXVlXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKGVycikgeworCQkvKiBKdXN0IGluZm8sIHNvbWUgb3RoZXIgZHJpdmVyIG1heSBoYXZlIGNsYWltZWQgdGhlIGRldmljZS4gKi8KKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgImNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgeworCQlwY2lfdXNpbmdfZGFjID0gMTsKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIG9idGFpbiA2NC1iaXQgRE1BIGZvciAiCisJCQkgICAgICAgImNvaGVyZW50IGFsbG9jYXRpb25zXG4iKTsKKwkJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOworCQl9CisJfSBlbHNlIGlmICgoZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iKTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwltbWlvX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCW1taW9fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKKwlhaSA9IHQzX2dldF9hZGFwdGVyX2luZm8oZW50LT5kcml2ZXJfZGF0YSk7CisKKwlhZGFwdGVyID0ga3phbGxvYyhzaXplb2YoKmFkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJYWRhcHRlci0+cmVncyA9IGlvcmVtYXBfbm9jYWNoZShtbWlvX3N0YXJ0LCBtbWlvX2xlbik7CisJaWYgKCFhZGFwdGVyLT5yZWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVyc1xuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfYWRhcHRlcjsKKwl9CisKKwlhZGFwdGVyLT5wZGV2ID0gcGRldjsKKwlhZGFwdGVyLT5uYW1lID0gcGNpX25hbWUocGRldik7CisJYWRhcHRlci0+bXNnX2VuYWJsZSA9IGRmbHRfbXNnX2VuYWJsZTsKKwlhZGFwdGVyLT5tbWlvX2xlbiA9IG1taW9fbGVuOworCisJbXV0ZXhfaW5pdCgmYWRhcHRlci0+bWRpb19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+d29ya19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+c3RhdHNfbG9jayk7CisKKwlJTklUX0xJU1RfSEVBRCgmYWRhcHRlci0+YWRhcHRlcl9saXN0KTsKKwlJTklUX1dPUksoJmFkYXB0ZXItPmV4dF9pbnRyX2hhbmRsZXJfdGFzaywgZXh0X2ludHJfdGFzayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmFkYXB0ZXItPmFkYXBfY2hlY2tfdGFzaywgdDNfYWRhcF9jaGVja190YXNrKTsKKworCWZvciAoaSA9IDA7IGkgPCBhaS0+bnBvcnRzOyArK2kpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCQluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHBvcnRfaW5mbykpOworCQlpZiAoIW5ldGRldikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2ZyZWVfZGV2OworCQl9CisKKwkJU0VUX01PRFVMRV9PV05FUihuZXRkZXYpOworCQlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJCWFkYXB0ZXItPnBvcnRbaV0gPSBuZXRkZXY7CisJCXBpID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwkJcGktPnJ4X2NzdW1fb2ZmbG9hZCA9IDE7CisJCXBpLT5ucXNldHMgPSAxOworCQlwaS0+Zmlyc3RfcXNldCA9IGk7CisJCXBpLT5hY3Rpdml0eSA9IDA7CisJCXBpLT5wb3J0X2lkID0gaTsKKwkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJbmV0ZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJCW5ldGRldi0+bWVtX3N0YXJ0ID0gbW1pb19zdGFydDsKKwkJbmV0ZGV2LT5tZW1fZW5kID0gbW1pb19zdGFydCArIG1taW9fbGVuIC0gMTsKKwkJbmV0ZGV2LT5wcml2ID0gYWRhcHRlcjsKKwkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9UU087CisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MTFRYOworCQlpZiAocGNpX3VzaW5nX2RhYykKKwkJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCisJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOworCQluZXRkZXYtPnZsYW5fcnhfcmVnaXN0ZXIgPSB2bGFuX3J4X3JlZ2lzdGVyOworCQluZXRkZXYtPnZsYW5fcnhfa2lsbF92aWQgPSB2bGFuX3J4X2tpbGxfdmlkOworCisJCW5ldGRldi0+b3BlbiA9IGN4Z2Jfb3BlbjsKKwkJbmV0ZGV2LT5zdG9wID0gY3hnYl9jbG9zZTsKKwkJbmV0ZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSB0M19ldGhfeG1pdDsKKwkJbmV0ZGV2LT5nZXRfc3RhdHMgPSBjeGdiX2dldF9zdGF0czsKKwkJbmV0ZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBjeGdiX3NldF9yeG1vZGU7CisJCW5ldGRldi0+ZG9faW9jdGwgPSBjeGdiX2lvY3RsOworCQluZXRkZXYtPmNoYW5nZV9tdHUgPSBjeGdiX2NoYW5nZV9tdHU7CisJCW5ldGRldi0+c2V0X21hY19hZGRyZXNzID0gY3hnYl9zZXRfbWFjX2FkZHI7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkJbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBjeGdiX25ldHBvbGw7CisjZW5kaWYKKwkJbmV0ZGV2LT53ZWlnaHQgPSA2NDsKKworCQlTRVRfRVRIVE9PTF9PUFMobmV0ZGV2LCAmY3hnYl9ldGh0b29sX29wcyk7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXItPnBvcnRbMF0pOworCWlmICh0M19wcmVwX2FkYXB0ZXIoYWRhcHRlciwgYWksIDEpIDwgMCkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9mcmVlX2RldjsKKwl9CisKKwkvKgorCSAqIFRoZSBjYXJkIGlzIG5vdyByZWFkeSB0byBnby4gIElmIGFueSBlcnJvcnMgb2NjdXIgZHVyaW5nIGRldmljZQorCSAqIHJlZ2lzdHJhdGlvbiB3ZSBkbyBub3QgZmFpbCB0aGUgd2hvbGUgY2FyZCBidXQgcmF0aGVyIHByb2NlZWQgb25seQorCSAqIHdpdGggdGhlIHBvcnRzIHdlIG1hbmFnZSB0byByZWdpc3RlciBzdWNjZXNzZnVsbHkuICBIb3dldmVyIHdlIG11c3QKKwkgKiByZWdpc3RlciBhdCBsZWFzdCBvbmUgbmV0IGRldmljZS4KKwkgKi8KKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbaV0pOworCQlpZiAoZXJyKQorCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCQkgImNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlICVzLCBza2lwcGluZ1xuIiwKKwkJCQkgYWRhcHRlci0+cG9ydFtpXS0+bmFtZSk7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIENoYW5nZSB0aGUgbmFtZSB3ZSB1c2UgZm9yIG1lc3NhZ2VzIHRvIHRoZSBuYW1lIG9mCisJCQkgKiB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgaW50ZXJmYWNlLgorCQkJICovCisJCQlpZiAoIWFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCkKKwkJCQlhZGFwdGVyLT5uYW1lID0gYWRhcHRlci0+cG9ydFtpXS0+bmFtZTsKKworCQkJX19zZXRfYml0KGksICZhZGFwdGVyLT5yZWdpc3RlcmVkX2RldmljZV9tYXApOworCQl9CisJfQorCWlmICghYWRhcHRlci0+cmVnaXN0ZXJlZF9kZXZpY2VfbWFwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBhbnkgbmV0IGRldmljZXNcbiIpOworCQlnb3RvIG91dF9mcmVlX2RldjsKKwl9CisKKwkvKiBEcml2ZXIncyByZWFkeS4gUmVmbGVjdCBpdCBvbiBMRURzICovCisJdDNfbGVkX3JlYWR5KGFkYXB0ZXIpOworCisJaWYgKGlzX29mZmxvYWQoYWRhcHRlcikpIHsKKwkJX19zZXRfYml0KE9GRkxPQURfREVWTUFQX0JJVCwgJmFkYXB0ZXItPnJlZ2lzdGVyZWRfZGV2aWNlX21hcCk7CisJCWN4Z2IzX2FkYXB0ZXJfb2ZsZChhZGFwdGVyKTsKKwl9CisKKwkvKiBTZWUgd2hhdCBpbnRlcnJ1cHRzIHdlJ2xsIGJlIHVzaW5nICovCisJaWYgKG1zaSA+IDEgJiYgY3hnYl9lbmFibGVfbXNpeChhZGFwdGVyKSA9PSAwKQorCQlhZGFwdGVyLT5mbGFncyB8PSBVU0lOR19NU0lYOworCWVsc2UgaWYgKG1zaSA+IDAgJiYgcGNpX2VuYWJsZV9tc2kocGRldikgPT0gMCkKKwkJYWRhcHRlci0+ZmxhZ3MgfD0gVVNJTkdfTVNJOworCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZhZGFwdGVyLT5wb3J0WzBdLT5jbGFzc19kZXYua29iaiwKKwkJCQkgJmN4Z2IzX2F0dHJfZ3JvdXApOworCisJcHJpbnRfcG9ydF9pbmZvKGFkYXB0ZXIsIGFpKTsKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWVfZGV2OgorCWlvdW5tYXAoYWRhcHRlci0+cmVncyk7CisJZm9yIChpID0gYWktPm5wb3J0cyAtIDE7IGkgPj0gMDsgLS1pKQorCQlpZiAoYWRhcHRlci0+cG9ydFtpXSkKKwkJCWZyZWVfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbaV0pOworCitvdXRfZnJlZV9hZGFwdGVyOgorCWtmcmVlKGFkYXB0ZXIpOworCitvdXRfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0X3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKGRldikgeworCQlpbnQgaTsKKwkJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPnByaXY7CisKKwkJdDNfc2dlX3N0b3AoYWRhcHRlcik7CisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmYWRhcHRlci0+cG9ydFswXS0+Y2xhc3NfZGV2LmtvYmosCisJCQkJICAgJmN4Z2IzX2F0dHJfZ3JvdXApOworCisJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkKKwkJICAgIGlmICh0ZXN0X2JpdChpLCAmYWRhcHRlci0+cmVnaXN0ZXJlZF9kZXZpY2VfbWFwKSkKKwkJCXVucmVnaXN0ZXJfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbaV0pOworCisJCWlmIChpc19vZmZsb2FkKGFkYXB0ZXIpKSB7CisJCQljeGdiM19hZGFwdGVyX3Vub2ZsZChhZGFwdGVyKTsKKwkJCWlmICh0ZXN0X2JpdChPRkZMT0FEX0RFVk1BUF9CSVQsCisJCQkJICAgICAmYWRhcHRlci0+b3Blbl9kZXZpY2VfbWFwKSkKKwkJCQlvZmZsb2FkX2Nsb3NlKCZhZGFwdGVyLT50ZGV2KTsKKwkJfQorCisJCXQzX2ZyZWVfc2dlX3Jlc291cmNlcyhhZGFwdGVyKTsKKwkJY3hnYl9kaXNhYmxlX21zaShhZGFwdGVyKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZGFwdGVyLT5kdW1teV9uZXRkZXYpOyBpKyspCisJCQlpZiAoYWRhcHRlci0+ZHVtbXlfbmV0ZGV2W2ldKSB7CisJCQkJZnJlZV9uZXRkZXYoYWRhcHRlci0+ZHVtbXlfbmV0ZGV2W2ldKTsKKwkJCQlhZGFwdGVyLT5kdW1teV9uZXRkZXZbaV0gPSBOVUxMOworCQkJfQorCisJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkKKwkJCWlmIChhZGFwdGVyLT5wb3J0W2ldKQorCQkJCWZyZWVfbmV0ZGV2KGFkYXB0ZXItPnBvcnRbaV0pOworCisJCWlvdW5tYXAoYWRhcHRlci0+cmVncyk7CisJCWtmcmVlKGFkYXB0ZXIpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBjeGdiM19wY2lfdGJsLAorCS5wcm9iZSA9IGluaXRfb25lLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChyZW1vdmVfb25lKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGN4Z2IzX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldDsKKworCWN4Z2IzX29mZmxvYWRfaW5pdCgpOworCisJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3hnYjNfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7CisJaWYgKGN4Z2IzX3dxKQorCQlkZXN0cm95X3dvcmtxdWV1ZShjeGdiM193cSk7Cit9CisKK21vZHVsZV9pbml0KGN4Z2IzX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGN4Z2IzX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2N4Z2IzX29mZmxvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2EwMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5jCkBAIC0wLDAgKzEsMTIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IE9wZW4gR3JpZCBDb21wdXRpbmcsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bmV0L25ldGV2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInJlZ3MuaCIKKyNpbmNsdWRlICJjeGdiM19pb2N0bC5oIgorI2luY2x1ZGUgImN4Z2IzX2N0bF9kZWZzLmgiCisjaW5jbHVkZSAiY3hnYjNfZGVmcy5oIgorI2luY2x1ZGUgImwydC5oIgorI2luY2x1ZGUgImZpcm13YXJlX2V4cG9ydHMuaCIKKyNpbmNsdWRlICJjeGdiM19vZmZsb2FkLmgiCisKK3N0YXRpYyBMSVNUX0hFQUQoY2xpZW50X2xpc3QpOworc3RhdGljIExJU1RfSEVBRChvZmxkX2Rldl9saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY3hnYjNfZGJfbG9jayk7CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKGFkYXB0ZXJfbGlzdF9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoYWRhcHRlcl9saXN0KTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNQVhfQVRJRFMgPSA2NCAqIDEwMjQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEFUSURfQkFTRSA9IDB4MTAwMDAwOworCitzdGF0aWMgaW5saW5lIGludCBvZmZsb2FkX2FjdGl2YXRlZChzdHJ1Y3QgdDNjZGV2ICp0ZGV2KQoreworCWNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gdGRldjJhZGFwKHRkZXYpOworCisJcmV0dXJuICh0ZXN0X2JpdChPRkZMT0FEX0RFVk1BUF9CSVQsICZhZGFwdGVyLT5vcGVuX2RldmljZV9tYXApKTsKK30KKworLyoqCisgKgljeGdiM19yZWdpc3Rlcl9jbGllbnQgLSByZWdpc3RlciBhbiBvZmZsb2FkIGNsaWVudAorICoJQGNsaWVudDogdGhlIGNsaWVudAorICoKKyAqCUFkZCB0aGUgY2xpZW50IHRvIHRoZSBjbGllbnQgbGlzdCwKKyAqCWFuZCBjYWxsIGJhY2tzIHRoZSBjbGllbnQgZm9yIGVhY2ggYWN0aXZhdGVkIG9mZmxvYWQgZGV2aWNlCisgKi8KK3ZvaWQgY3hnYjNfcmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBjeGdiM19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdDNjZGV2ICp0ZGV2OworCisJbXV0ZXhfbG9jaygmY3hnYjNfZGJfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY2xpZW50LT5jbGllbnRfbGlzdCwgJmNsaWVudF9saXN0KTsKKworCWlmIChjbGllbnQtPmFkZCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRkZXYsICZvZmxkX2Rldl9saXN0LCBvZmxkX2Rldl9saXN0KSB7CisJCQlpZiAob2ZmbG9hZF9hY3RpdmF0ZWQodGRldikpCisJCQkJY2xpZW50LT5hZGQodGRldik7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZjeGdiM19kYl9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChjeGdiM19yZWdpc3Rlcl9jbGllbnQpOworCisvKioKKyAqCWN4Z2IzX3VucmVnaXN0ZXJfY2xpZW50IC0gdW5yZWdpc3RlciBhbiBvZmZsb2FkIGNsaWVudAorICoJQGNsaWVudDogdGhlIGNsaWVudAorICoKKyAqCVJlbW92ZSB0aGUgY2xpZW50IHRvIHRoZSBjbGllbnQgbGlzdCwKKyAqCWFuZCBjYWxsIGJhY2tzIHRoZSBjbGllbnQgZm9yIGVhY2ggYWN0aXZhdGVkIG9mZmxvYWQgZGV2aWNlLgorICovCit2b2lkIGN4Z2IzX3VucmVnaXN0ZXJfY2xpZW50KHN0cnVjdCBjeGdiM19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdDNjZGV2ICp0ZGV2OworCisJbXV0ZXhfbG9jaygmY3hnYjNfZGJfbG9jayk7CisJbGlzdF9kZWwoJmNsaWVudC0+Y2xpZW50X2xpc3QpOworCisJaWYgKGNsaWVudC0+cmVtb3ZlKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkodGRldiwgJm9mbGRfZGV2X2xpc3QsIG9mbGRfZGV2X2xpc3QpIHsKKwkJCWlmIChvZmZsb2FkX2FjdGl2YXRlZCh0ZGV2KSkKKwkJCQljbGllbnQtPnJlbW92ZSh0ZGV2KTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmN4Z2IzX2RiX2xvY2spOworfQorCitFWFBPUlRfU1lNQk9MKGN4Z2IzX3VucmVnaXN0ZXJfY2xpZW50KTsKKworLyoqCisgKgljeGdiM19hZGRfY2xpZW50cyAtIGFjdGl2YXRlIHJlZ2lzdGVyZWQgY2xpZW50cyBmb3IgYW4gb2ZmbG9hZCBkZXZpY2UKKyAqCUB0ZGV2OiB0aGUgb2ZmbG9hZCBkZXZpY2UKKyAqCisgKglDYWxsIGJhY2tzIGFsbCByZWdpc3RlcmVkIGNsaWVudHMgb25jZSBhIG9mZmxvYWQgZGV2aWNlIGlzIGFjdGl2YXRlZAorICovCit2b2lkIGN4Z2IzX2FkZF9jbGllbnRzKHN0cnVjdCB0M2NkZXYgKnRkZXYpCit7CisJc3RydWN0IGN4Z2IzX2NsaWVudCAqY2xpZW50OworCisJbXV0ZXhfbG9jaygmY3hnYjNfZGJfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGllbnQsICZjbGllbnRfbGlzdCwgY2xpZW50X2xpc3QpIHsKKwkJaWYgKGNsaWVudC0+YWRkKQorCQkJY2xpZW50LT5hZGQodGRldik7CisJfQorCW11dGV4X3VubG9jaygmY3hnYjNfZGJfbG9jayk7Cit9CisKKy8qKgorICoJY3hnYjNfcmVtb3ZlX2NsaWVudHMgLSBkZWFjdGl2YXRlcyByZWdpc3RlcmVkIGNsaWVudHMKKyAqCQkJICAgICAgIGZvciBhbiBvZmZsb2FkIGRldmljZQorICoJQHRkZXY6IHRoZSBvZmZsb2FkIGRldmljZQorICoKKyAqCUNhbGwgYmFja3MgYWxsIHJlZ2lzdGVyZWQgY2xpZW50cyBvbmNlIGEgb2ZmbG9hZCBkZXZpY2UgaXMgZGVhY3RpdmF0ZWQKKyAqLwordm9pZCBjeGdiM19yZW1vdmVfY2xpZW50cyhzdHJ1Y3QgdDNjZGV2ICp0ZGV2KQoreworCXN0cnVjdCBjeGdiM19jbGllbnQgKmNsaWVudDsKKworCW11dGV4X2xvY2soJmN4Z2IzX2RiX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xpZW50LCAmY2xpZW50X2xpc3QsIGNsaWVudF9saXN0KSB7CisJCWlmIChjbGllbnQtPnJlbW92ZSkKKwkJCWNsaWVudC0+cmVtb3ZlKHRkZXYpOworCX0KKwltdXRleF91bmxvY2soJmN4Z2IzX2RiX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmdldF9pZmZfZnJvbV9tYWMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hYywKKwkJCQkJICAgdW5zaWduZWQgaW50IHZsYW4pCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpIHsKKwkJY29uc3Qgc3RydWN0IHZsYW5fZ3JvdXAgKmdycDsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXB0ZXItPnBvcnRbaV07CisJCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCWlmICghbWVtY21wKGRldi0+ZGV2X2FkZHIsIG1hYywgRVRIX0FMRU4pKSB7CisJCQlpZiAodmxhbiAmJiB2bGFuICE9IFZMQU5fVklEX01BU0spIHsKKwkJCQlncnAgPSBwLT52bGFuX2dycDsKKwkJCQlkZXYgPSBncnAgPyBncnAtPnZsYW5fZGV2aWNlc1t2bGFuXSA6IE5VTEw7CisJCQl9IGVsc2UKKwkJCQl3aGlsZSAoZGV2LT5tYXN0ZXIpCisJCQkJCWRldiA9IGRldi0+bWFzdGVyOworCQkJcmV0dXJuIGRldjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBjeGdiX3VscF9pc2NzaV9jdGwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCByZXEsCisJCQkgICAgICB2b2lkICpkYXRhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCB1bHBfaXNjc2lfaW5mbyAqdWlpcCA9IGRhdGE7CisKKwlzd2l0Y2ggKHJlcSkgeworCWNhc2UgVUxQX0lTQ1NJX0dFVF9QQVJBTVM6CisJCXVpaXAtPnBkZXYgPSBhZGFwdGVyLT5wZGV2OworCQl1aWlwLT5sbGltaXQgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1VMUFJYX0lTQ1NJX0xMSU1JVCk7CisJCXVpaXAtPnVsaW1pdCA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfVUxQUlhfSVNDU0lfVUxJTUlUKTsKKwkJdWlpcC0+dGFnbWFzayA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfVUxQUlhfSVNDU0lfVEFHTUFTSyk7CisJCS8qCisJCSAqIE9uIHR4LCB0aGUgaXNjc2kgcGR1IGhhcyB0byBiZSA8PSB0eCBwYWdlIHNpemUgYW5kIGhhcyB0bworCQkgKiBmaXQgaW50byB0aGUgVHggUE0gRklGTy4KKwkJICovCisJCXVpaXAtPm1heF90eHN6ID0gbWluKGFkYXB0ZXItPnBhcmFtcy50cC50eF9wZ19zaXplLAorCQkJCSAgICAgdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9QTTFfVFhfQ0ZHKSA+PiAxNyk7CisJCS8qIG9uIHJ4LCB0aGUgaXNjc2kgcGR1IGhhcyB0byBiZSA8IHJ4IHBhZ2Ugc2l6ZSBhbmQgdGhlCisJCSAgIHdob2xlIHBkdSArIGNwbCBoZWFkZXJzIGhhcyB0byBmaXQgaW50byBvbmUgc2dlIGJ1ZmZlciAqLworCQl1aWlwLT5tYXhfcnhzeiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkgICAgICAgYWRhcHRlci0+cGFyYW1zLnRwLnJ4X3BnX3NpemUsCisJCQkJICAgICAgIChhZGFwdGVyLT5zZ2UucXNbMF0uZmxbMV0uYnVmX3NpemUgLQorCQkJCQlzaXplb2Yoc3RydWN0IGNwbF9yeF9kYXRhKSAqIDIgLQorCQkJCQlzaXplb2Yoc3RydWN0IGNwbF9yeF9kYXRhX2RkcCkpKTsKKwkJYnJlYWs7CisJY2FzZSBVTFBfSVNDU0lfU0VUX1BBUkFNUzoKKwkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfVUxQUlhfSVNDU0lfVEFHTUFTSywgdWlpcC0+dGFnbWFzayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBSZXNwb25zZSBxdWV1ZSB1c2VkIGZvciBSRE1BIGV2ZW50cy4gKi8KKyNkZWZpbmUgQVNZTkNfTk9USUZfUlNQUSAwCisKK3N0YXRpYyBpbnQgY3hnYl9yZG1hX2N0bChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IHJlcSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocmVxKSB7CisJY2FzZSBSRE1BX0dFVF9QQVJBTVM6eworCQlzdHJ1Y3QgcmRtYV9pbmZvICpyZXEgPSBkYXRhOworCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwkJcmVxLT51ZGJlbGxfcGh5c2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMik7CisJCXJlcS0+dWRiZWxsX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMik7CisJCXJlcS0+dHB0X2Jhc2UgPQorCQkJdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9VTFBUWF9UUFRfTExJTUlUKTsKKwkJcmVxLT50cHRfdG9wID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9VTFBUWF9UUFRfVUxJTUlUKTsKKwkJcmVxLT5wYmxfYmFzZSA9CisJCQl0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1VMUFRYX1BCTF9MTElNSVQpOworCQlyZXEtPnBibF90b3AgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1VMUFRYX1BCTF9VTElNSVQpOworCQlyZXEtPnJxdF9iYXNlID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9VTFBSWF9SUV9MTElNSVQpOworCQlyZXEtPnJxdF90b3AgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1VMUFJYX1JRX1VMSU1JVCk7CisJCXJlcS0+a2RiX2FkZHIgPSBhZGFwdGVyLT5yZWdzICsgQV9TR19LRE9PUkJFTEw7CisJCXJlcS0+cGRldiA9IHBkZXY7CisJCWJyZWFrOworCX0KKwljYXNlIFJETUFfQ1FfT1A6eworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlzdHJ1Y3QgcmRtYV9jcV9vcCAqcmVxID0gZGF0YTsKKworCQkvKiBtYXkgYmUgY2FsbGVkIGluIGFueSBjb250ZXh0ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5zZ2UucmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0ID0gdDNfc2dlX2NxY250eHRfb3AoYWRhcHRlciwgcmVxLT5pZCwgcmVxLT5vcCwKKwkJCQkJcmVxLT5jcmVkaXRzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c2dlLnJlZ19sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCX0KKwljYXNlIFJETUFfR0VUX01FTTp7CisJCXN0cnVjdCBjaF9tZW1fcmFuZ2UgKnQgPSBkYXRhOworCQlzdHJ1Y3QgbWM3ICptZW07CisKKwkJaWYgKCh0LT5hZGRyICYgNykgfHwgKHQtPmxlbiAmIDcpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICh0LT5tZW1faWQgPT0gTUVNX0NNKQorCQkJbWVtID0gJmFkYXB0ZXItPmNtOworCQllbHNlIGlmICh0LT5tZW1faWQgPT0gTUVNX1BNUlgpCisJCQltZW0gPSAmYWRhcHRlci0+cG1yeDsKKwkJZWxzZSBpZiAodC0+bWVtX2lkID09IE1FTV9QTVRYKQorCQkJbWVtID0gJmFkYXB0ZXItPnBtdHg7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldCA9CisJCQl0M19tYzdfYmRfcmVhZChtZW0sIHQtPmFkZHIgLyA4LCB0LT5sZW4gLyA4LAorCQkJCQkodTY0ICopIHQtPmJ1Zik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwl9CisJY2FzZSBSRE1BX0NRX1NFVFVQOnsKKwkJc3RydWN0IHJkbWFfY3Ffc2V0dXAgKnJlcSA9IGRhdGE7CisKKwkJc3Bpbl9sb2NrX2lycSgmYWRhcHRlci0+c2dlLnJlZ19sb2NrKTsKKwkJcmV0ID0KKwkJCXQzX3NnZV9pbml0X2NxY250eHQoYWRhcHRlciwgcmVxLT5pZCwKKwkJCQkJcmVxLT5iYXNlX2FkZHIsIHJlcS0+c2l6ZSwKKwkJCQkJQVNZTkNfTk9USUZfUlNQUSwKKwkJCQkJcmVxLT5vdmZsX21vZGUsIHJlcS0+Y3JlZGl0cywKKwkJCQkJcmVxLT5jcmVkaXRfdGhyZXMpOworCQlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPnNnZS5yZWdfbG9jayk7CisJCWJyZWFrOworCX0KKwljYXNlIFJETUFfQ1FfRElTQUJMRToKKwkJc3Bpbl9sb2NrX2lycSgmYWRhcHRlci0+c2dlLnJlZ19sb2NrKTsKKwkJcmV0ID0gdDNfc2dlX2Rpc2FibGVfY3FjbnR4dChhZGFwdGVyLCAqKHVuc2lnbmVkIGludCAqKWRhdGEpOworCQlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPnNnZS5yZWdfbG9jayk7CisJCWJyZWFrOworCWNhc2UgUkRNQV9DVFJMX1FQX1NFVFVQOnsKKwkJc3RydWN0IHJkbWFfY3RybHFwX3NldHVwICpyZXEgPSBkYXRhOworCisJCXNwaW5fbG9ja19pcnEoJmFkYXB0ZXItPnNnZS5yZWdfbG9jayk7CisJCXJldCA9IHQzX3NnZV9pbml0X2VjbnR4dChhZGFwdGVyLCBGV19SSV9TR0VFQ19TVEFSVCwgMCwKKwkJCQkJCVNHRV9DTlRYVF9SRE1BLAorCQkJCQkJQVNZTkNfTk9USUZfUlNQUSwKKwkJCQkJCXJlcS0+YmFzZV9hZGRyLCByZXEtPnNpemUsCisJCQkJCQlGV19SSV9USURfU1RBUlQsIDEsIDApOworCQlzcGluX3VubG9ja19pcnEoJmFkYXB0ZXItPnNnZS5yZWdfbG9jayk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjeGdiX29mZmxvYWRfY3RsKHN0cnVjdCB0M2NkZXYgKnRkZXYsIHVuc2lnbmVkIGludCByZXEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSB0ZGV2MmFkYXAodGRldik7CisJc3RydWN0IHRpZF9yYW5nZSAqdGlkOworCXN0cnVjdCBtdHV0YWIgKm10dXA7CisJc3RydWN0IGlmZl9tYWMgKmlmZm1hY3A7CisJc3RydWN0IGRkcF9wYXJhbXMgKmRkcHA7CisJc3RydWN0IGFkYXBfcG9ydHMgKnBvcnRzOworCWludCBpOworCisJc3dpdGNoIChyZXEpIHsKKwljYXNlIEdFVF9NQVhfT1VUU1RBTkRJTkdfV1I6CisJCSoodW5zaWduZWQgaW50ICopZGF0YSA9IEZXX1dSX05VTTsKKwkJYnJlYWs7CisJY2FzZSBHRVRfV1JfTEVOOgorCQkqKHVuc2lnbmVkIGludCAqKWRhdGEgPSBXUl9GTElUUzsKKwkJYnJlYWs7CisJY2FzZSBHRVRfVFhfTUFYX0NIVU5LOgorCQkqKHVuc2lnbmVkIGludCAqKWRhdGEgPSAxIDw8IDIwOwkvKiAxTUIgKi8KKwkJYnJlYWs7CisJY2FzZSBHRVRfVElEX1JBTkdFOgorCQl0aWQgPSBkYXRhOworCQl0aWQtPm51bSA9IHQzX21jNV9zaXplKCZhZGFwdGVyLT5tYzUpIC0KKwkJICAgIGFkYXB0ZXItPnBhcmFtcy5tYzUubnJvdXRlcyAtCisJCSAgICBhZGFwdGVyLT5wYXJhbXMubWM1Lm5maWx0ZXJzIC0gYWRhcHRlci0+cGFyYW1zLm1jNS5uc2VydmVyczsKKwkJdGlkLT5iYXNlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBHRVRfU1RJRF9SQU5HRToKKwkJdGlkID0gZGF0YTsKKwkJdGlkLT5udW0gPSBhZGFwdGVyLT5wYXJhbXMubWM1Lm5zZXJ2ZXJzOworCQl0aWQtPmJhc2UgPSB0M19tYzVfc2l6ZSgmYWRhcHRlci0+bWM1KSAtIHRpZC0+bnVtIC0KKwkJICAgIGFkYXB0ZXItPnBhcmFtcy5tYzUubmZpbHRlcnMgLSBhZGFwdGVyLT5wYXJhbXMubWM1Lm5yb3V0ZXM7CisJCWJyZWFrOworCWNhc2UgR0VUX0wyVF9DQVBBQ0lUWToKKwkJKih1bnNpZ25lZCBpbnQgKilkYXRhID0gMjA0ODsKKwkJYnJlYWs7CisJY2FzZSBHRVRfTVRVUzoKKwkJbXR1cCA9IGRhdGE7CisJCW10dXAtPnNpemUgPSBOTVRVUzsKKwkJbXR1cC0+bXR1cyA9IGFkYXB0ZXItPnBhcmFtcy5tdHVzOworCQlicmVhazsKKwljYXNlIEdFVF9JRkZfRlJPTV9NQUM6CisJCWlmZm1hY3AgPSBkYXRhOworCQlpZmZtYWNwLT5kZXYgPSBnZXRfaWZmX2Zyb21fbWFjKGFkYXB0ZXIsIGlmZm1hY3AtPm1hY19hZGRyLAorCQkJCQkJaWZmbWFjcC0+dmxhbl90YWcgJgorCQkJCQkJVkxBTl9WSURfTUFTSyk7CisJCWJyZWFrOworCWNhc2UgR0VUX0REUF9QQVJBTVM6CisJCWRkcHAgPSBkYXRhOworCQlkZHBwLT5sbGltaXQgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1VMUFJYX1RERFBfTExJTUlUKTsKKwkJZGRwcC0+dWxpbWl0ID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9VTFBSWF9URERQX1VMSU1JVCk7CisJCWRkcHAtPnRhZ19tYXNrID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9VTFBSWF9URERQX1RBR01BU0spOworCQlicmVhazsKKwljYXNlIEdFVF9QT1JUUzoKKwkJcG9ydHMgPSBkYXRhOworCQlwb3J0cy0+bnBvcnRzID0gYWRhcHRlci0+cGFyYW1zLm5wb3J0czsKKwkJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKQorCQkJcG9ydHMtPmxsZGV2c1tpXSA9IGFkYXB0ZXItPnBvcnRbaV07CisJCWJyZWFrOworCWNhc2UgVUxQX0lTQ1NJX0dFVF9QQVJBTVM6CisJY2FzZSBVTFBfSVNDU0lfU0VUX1BBUkFNUzoKKwkJaWYgKCFvZmZsb2FkX3J1bm5pbmcoYWRhcHRlcikpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJcmV0dXJuIGN4Z2JfdWxwX2lzY3NpX2N0bChhZGFwdGVyLCByZXEsIGRhdGEpOworCWNhc2UgUkRNQV9HRVRfUEFSQU1TOgorCWNhc2UgUkRNQV9DUV9PUDoKKwljYXNlIFJETUFfQ1FfU0VUVVA6CisJY2FzZSBSRE1BX0NRX0RJU0FCTEU6CisJY2FzZSBSRE1BX0NUUkxfUVBfU0VUVVA6CisJY2FzZSBSRE1BX0dFVF9NRU06CisJCWlmICghb2ZmbG9hZF9ydW5uaW5nKGFkYXB0ZXIpKQorCQkJcmV0dXJuIC1FQUdBSU47CisJCXJldHVybiBjeGdiX3JkbWFfY3RsKGFkYXB0ZXIsIHJlcSwgZGF0YSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIER1bW15IGhhbmRsZXIgZm9yIFJ4IG9mZmxvYWQgcGFja2V0cyBpbiBjYXNlIHdlIGdldCBhbiBvZmZsb2FkIHBhY2tldCBiZWZvcmUKKyAqIHByb3BlciBwcm9jZXNzaW5nIGlzIHNldHVwLiAgVGhpcyBjb21wbGFpbnMgYW5kIGRyb3BzIHRoZSBwYWNrZXQgYXMgaXQgaXNuJ3QKKyAqIG5vcm1hbCB0byBnZXQgb2ZmbG9hZCBwYWNrZXRzIGF0IHRoaXMgc3RhZ2UuCisgKi8KK3N0YXRpYyBpbnQgcnhfb2ZmbG9hZF9ibGFja2hvbGUoc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYnMsCisJCQkJaW50IG4pCit7CisJQ0hfRVJSKHRkZXYyYWRhcChkZXYpLCAiJWQgdW5leHBlY3RlZCBvZmZsb2FkIHBhY2tldHMsIGZpcnN0IGRhdGEgJXVcbiIsCisJICAgICAgIG4sIG50b2hsKCoodTMyICopc2tic1swXS0+ZGF0YSkpOworCXdoaWxlIChuLS0pCisJCWRldl9rZnJlZV9za2JfYW55KHNrYnNbbl0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1teV9uZWlnaF91cGRhdGUoc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKK3sKK30KKwordm9pZCBjeGdiM19zZXRfZHVtbXlfb3BzKHN0cnVjdCB0M2NkZXYgKmRldikKK3sKKwlkZXYtPnJlY3YgPSByeF9vZmZsb2FkX2JsYWNraG9sZTsKKwlkZXYtPm5laWdoX3VwZGF0ZSA9IGR1bW15X25laWdoX3VwZGF0ZTsKK30KKworLyoKKyAqIEZyZWUgYW4gYWN0aXZlLW9wZW4gVElELgorICovCit2b2lkICpjeGdiM19mcmVlX2F0aWQoc3RydWN0IHQzY2RldiAqdGRldiwgaW50IGF0aWQpCit7CisJc3RydWN0IHRpZF9pbmZvICp0ID0gJihUM0NfREFUQSh0ZGV2KSktPnRpZF9tYXBzOworCXVuaW9uIGFjdGl2ZV9vcGVuX2VudHJ5ICpwID0gYXRpZDJlbnRyeSh0LCBhdGlkKTsKKwl2b2lkICpjdHggPSBwLT50M2NfdGlkLmN0eDsKKworCXNwaW5fbG9ja19iaCgmdC0+YXRpZF9sb2NrKTsKKwlwLT5uZXh0ID0gdC0+YWZyZWU7CisJdC0+YWZyZWUgPSBwOworCXQtPmF0aWRzX2luX3VzZS0tOworCXNwaW5fdW5sb2NrX2JoKCZ0LT5hdGlkX2xvY2spOworCisJcmV0dXJuIGN0eDsKK30KKworRVhQT1JUX1NZTUJPTChjeGdiM19mcmVlX2F0aWQpOworCisvKgorICogRnJlZSBhIHNlcnZlciBUSUQgYW5kIHJldHVybiBpdCB0byB0aGUgZnJlZSBwb29sLgorICovCit2b2lkIGN4Z2IzX2ZyZWVfc3RpZChzdHJ1Y3QgdDNjZGV2ICp0ZGV2LCBpbnQgc3RpZCkKK3sKKwlzdHJ1Y3QgdGlkX2luZm8gKnQgPSAmKFQzQ19EQVRBKHRkZXYpKS0+dGlkX21hcHM7CisJdW5pb24gbGlzdGVuX2VudHJ5ICpwID0gc3RpZDJlbnRyeSh0LCBzdGlkKTsKKworCXNwaW5fbG9ja19iaCgmdC0+c3RpZF9sb2NrKTsKKwlwLT5uZXh0ID0gdC0+c2ZyZWU7CisJdC0+c2ZyZWUgPSBwOworCXQtPnN0aWRzX2luX3VzZS0tOworCXNwaW5fdW5sb2NrX2JoKCZ0LT5zdGlkX2xvY2spOworfQorCitFWFBPUlRfU1lNQk9MKGN4Z2IzX2ZyZWVfc3RpZCk7CisKK3ZvaWQgY3hnYjNfaW5zZXJ0X3RpZChzdHJ1Y3QgdDNjZGV2ICp0ZGV2LCBzdHJ1Y3QgY3hnYjNfY2xpZW50ICpjbGllbnQsCisJCSAgICAgIHZvaWQgKmN0eCwgdW5zaWduZWQgaW50IHRpZCkKK3sKKwlzdHJ1Y3QgdGlkX2luZm8gKnQgPSAmKFQzQ19EQVRBKHRkZXYpKS0+dGlkX21hcHM7CisKKwl0LT50aWRfdGFiW3RpZF0uY2xpZW50ID0gY2xpZW50OworCXQtPnRpZF90YWJbdGlkXS5jdHggPSBjdHg7CisJYXRvbWljX2luYygmdC0+dGlkc19pbl91c2UpOworfQorCitFWFBPUlRfU1lNQk9MKGN4Z2IzX2luc2VydF90aWQpOworCisvKgorICogUG9wdWxhdGUgYSBUSURfUkVMRUFTRSBXUi4gIFRoZSBza2IgbXVzdCBiZSBhbHJlYWR5IHByb3BlbHkgc2l6ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBta190aWRfcmVsZWFzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgdGlkKQoreworCXN0cnVjdCBjcGxfdGlkX3JlbGVhc2UgKnJlcTsKKworCXNrYi0+cHJpb3JpdHkgPSBDUExfUFJJT1JJVFlfU0VUVVA7CisJcmVxID0gKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UgKilfX3NrYl9wdXQoc2tiLCBzaXplb2YoKnJlcSkpOworCXJlcS0+d3Iud3JfaGkgPSBodG9ubChWX1dSX09QKEZXX1dST1BDT0RFX0ZPUldBUkQpKTsKKwlPUENPREVfVElEKHJlcSkgPSBodG9ubChNS19PUENPREVfVElEKENQTF9USURfUkVMRUFTRSwgdGlkKSk7Cit9CisKK3N0YXRpYyB2b2lkIHQzX3Byb2Nlc3NfdGlkX3JlbGVhc2VfbGlzdChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHQzY19kYXRhICp0ZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdDNjX2RhdGEsCisJCQkJCSAgIHRpZF9yZWxlYXNlX3Rhc2spOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHQzY2RldiAqdGRldiA9IHRkLT5kZXY7CisJCisKKwlzcGluX2xvY2tfYmgoJnRkLT50aWRfcmVsZWFzZV9sb2NrKTsKKwl3aGlsZSAodGQtPnRpZF9yZWxlYXNlX2xpc3QpIHsKKwkJc3RydWN0IHQzY190aWRfZW50cnkgKnAgPSB0ZC0+dGlkX3JlbGVhc2VfbGlzdDsKKworCQl0ZC0+dGlkX3JlbGVhc2VfbGlzdCA9IChzdHJ1Y3QgdDNjX3RpZF9lbnRyeSAqKXAtPmN0eDsKKwkJc3Bpbl91bmxvY2tfYmgoJnRkLT50aWRfcmVsZWFzZV9sb2NrKTsKKworCQlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UpLAorCQkJCUdGUF9LRVJORUwgfCBfX0dGUF9OT0ZBSUwpOworCQlta190aWRfcmVsZWFzZShza2IsIHAgLSB0ZC0+dGlkX21hcHMudGlkX3RhYik7CisJCWN4Z2IzX29mbGRfc2VuZCh0ZGV2LCBza2IpOworCQlwLT5jdHggPSBOVUxMOworCQlzcGluX2xvY2tfYmgoJnRkLT50aWRfcmVsZWFzZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJnRkLT50aWRfcmVsZWFzZV9sb2NrKTsKK30KKworLyogdXNlIGN0eCBhcyBhIG5leHQgcG9pbnRlciBpbiB0aGUgdGlkIHJlbGVhc2UgbGlzdCAqLwordm9pZCBjeGdiM19xdWV1ZV90aWRfcmVsZWFzZShzdHJ1Y3QgdDNjZGV2ICp0ZGV2LCB1bnNpZ25lZCBpbnQgdGlkKQoreworCXN0cnVjdCB0M2NfZGF0YSAqdGQgPSBUM0NfREFUQSh0ZGV2KTsKKwlzdHJ1Y3QgdDNjX3RpZF9lbnRyeSAqcCA9ICZ0ZC0+dGlkX21hcHMudGlkX3RhYlt0aWRdOworCisJc3Bpbl9sb2NrX2JoKCZ0ZC0+dGlkX3JlbGVhc2VfbG9jayk7CisJcC0+Y3R4ID0gKHZvaWQgKil0ZC0+dGlkX3JlbGVhc2VfbGlzdDsKKwl0ZC0+dGlkX3JlbGVhc2VfbGlzdCA9IHA7CisJaWYgKCFwLT5jdHgpCisJCXNjaGVkdWxlX3dvcmsoJnRkLT50aWRfcmVsZWFzZV90YXNrKTsKKwlzcGluX3VubG9ja19iaCgmdGQtPnRpZF9yZWxlYXNlX2xvY2spOworfQorCitFWFBPUlRfU1lNQk9MKGN4Z2IzX3F1ZXVlX3RpZF9yZWxlYXNlKTsKKworLyoKKyAqIFJlbW92ZSBhIHRpZCBmcm9tIHRoZSBUSUQgdGFibGUuICBBIGNsaWVudCBtYXkgZGVmZXIgcHJvY2Vzc2luZyBpdHMgbGFzdAorICogQ1BMIG1lc3NhZ2UgaWYgaXQgaXMgbG9ja2VkIGF0IHRoZSB0aW1lIGl0IGFycml2ZXMsIGFuZCB3aGlsZSB0aGUgbWVzc2FnZQorICogc2l0cyBpbiB0aGUgY2xpZW50J3MgYmFja2xvZyB0aGUgVElEIG1heSBiZSByZXVzZWQgZm9yIGFub3RoZXIgY29ubmVjdGlvbi4KKyAqIFRvIGhhbmRsZSB0aGlzIHdlIGF0b21pY2FsbHkgc3dpdGNoIHRoZSBUSUQgYXNzb2NpYXRpb24gaWYgaXQgc3RpbGwgcG9pbnRzCisgKiB0byB0aGUgb3JpZ2luYWwgY2xpZW50IGNvbnRleHQuCisgKi8KK3ZvaWQgY3hnYjNfcmVtb3ZlX3RpZChzdHJ1Y3QgdDNjZGV2ICp0ZGV2LCB2b2lkICpjdHgsIHVuc2lnbmVkIGludCB0aWQpCit7CisJc3RydWN0IHRpZF9pbmZvICp0ID0gJihUM0NfREFUQSh0ZGV2KSktPnRpZF9tYXBzOworCisJQlVHX09OKHRpZCA+PSB0LT5udGlkcyk7CisJaWYgKHRkZXYtPnR5cGUgPT0gVDNBKQorCQkodm9pZCljbXB4Y2hnKCZ0LT50aWRfdGFiW3RpZF0uY3R4LCBjdHgsIE5VTEwpOworCWVsc2UgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IGNwbF90aWRfcmVsZWFzZSksIEdGUF9BVE9NSUMpOworCQlpZiAobGlrZWx5KHNrYikpIHsKKwkJCW1rX3RpZF9yZWxlYXNlKHNrYiwgdGlkKTsKKwkJCWN4Z2IzX29mbGRfc2VuZCh0ZGV2LCBza2IpOworCQkJdC0+dGlkX3RhYlt0aWRdLmN0eCA9IE5VTEw7CisJCX0gZWxzZQorCQkJY3hnYjNfcXVldWVfdGlkX3JlbGVhc2UodGRldiwgdGlkKTsKKwl9CisJYXRvbWljX2RlYygmdC0+dGlkc19pbl91c2UpOworfQorCitFWFBPUlRfU1lNQk9MKGN4Z2IzX3JlbW92ZV90aWQpOworCitpbnQgY3hnYjNfYWxsb2NfYXRpZChzdHJ1Y3QgdDNjZGV2ICp0ZGV2LCBzdHJ1Y3QgY3hnYjNfY2xpZW50ICpjbGllbnQsCisJCSAgICAgdm9pZCAqY3R4KQoreworCWludCBhdGlkID0gLTE7CisJc3RydWN0IHRpZF9pbmZvICp0ID0gJihUM0NfREFUQSh0ZGV2KSktPnRpZF9tYXBzOworCisJc3Bpbl9sb2NrX2JoKCZ0LT5hdGlkX2xvY2spOworCWlmICh0LT5hZnJlZSkgeworCQl1bmlvbiBhY3RpdmVfb3Blbl9lbnRyeSAqcCA9IHQtPmFmcmVlOworCisJCWF0aWQgPSAocCAtIHQtPmF0aWRfdGFiKSArIHQtPmF0aWRfYmFzZTsKKwkJdC0+YWZyZWUgPSBwLT5uZXh0OworCQlwLT50M2NfdGlkLmN0eCA9IGN0eDsKKwkJcC0+dDNjX3RpZC5jbGllbnQgPSBjbGllbnQ7CisJCXQtPmF0aWRzX2luX3VzZSsrOworCX0KKwlzcGluX3VubG9ja19iaCgmdC0+YXRpZF9sb2NrKTsKKwlyZXR1cm4gYXRpZDsKK30KKworRVhQT1JUX1NZTUJPTChjeGdiM19hbGxvY19hdGlkKTsKKworaW50IGN4Z2IzX2FsbG9jX3N0aWQoc3RydWN0IHQzY2RldiAqdGRldiwgc3RydWN0IGN4Z2IzX2NsaWVudCAqY2xpZW50LAorCQkgICAgIHZvaWQgKmN0eCkKK3sKKwlpbnQgc3RpZCA9IC0xOworCXN0cnVjdCB0aWRfaW5mbyAqdCA9ICYoVDNDX0RBVEEodGRldikpLT50aWRfbWFwczsKKworCXNwaW5fbG9ja19iaCgmdC0+c3RpZF9sb2NrKTsKKwlpZiAodC0+c2ZyZWUpIHsKKwkJdW5pb24gbGlzdGVuX2VudHJ5ICpwID0gdC0+c2ZyZWU7CisKKwkJc3RpZCA9IChwIC0gdC0+c3RpZF90YWIpICsgdC0+c3RpZF9iYXNlOworCQl0LT5zZnJlZSA9IHAtPm5leHQ7CisJCXAtPnQzY190aWQuY3R4ID0gY3R4OworCQlwLT50M2NfdGlkLmNsaWVudCA9IGNsaWVudDsKKwkJdC0+c3RpZHNfaW5fdXNlKys7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZ0LT5zdGlkX2xvY2spOworCXJldHVybiBzdGlkOworfQorCitFWFBPUlRfU1lNQk9MKGN4Z2IzX2FsbG9jX3N0aWQpOworCitzdGF0aWMgaW50IGRvX3NtdF93cml0ZV9ycGwoc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjcGxfc210X3dyaXRlX3JwbCAqcnBsID0gY3BsaGRyKHNrYik7CisKKwlpZiAocnBsLT5zdGF0dXMgIT0gQ1BMX0VSUl9OT05FKQorCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJVbmV4cGVjdGVkIFNNVF9XUklURV9SUEwgc3RhdHVzICV1IGZvciBlbnRyeSAldVxuIiwKKwkJICAgICAgIHJwbC0+c3RhdHVzLCBHRVRfVElEKHJwbCkpOworCisJcmV0dXJuIENQTF9SRVRfQlVGX0RPTkU7Cit9CisKK3N0YXRpYyBpbnQgZG9fbDJ0X3dyaXRlX3JwbChzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGNwbF9sMnRfd3JpdGVfcnBsICpycGwgPSBjcGxoZHIoc2tiKTsKKworCWlmIChycGwtPnN0YXR1cyAhPSBDUExfRVJSX05PTkUpCisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIlVuZXhwZWN0ZWQgTDJUX1dSSVRFX1JQTCBzdGF0dXMgJXUgZm9yIGVudHJ5ICV1XG4iLAorCQkgICAgICAgcnBsLT5zdGF0dXMsIEdFVF9USUQocnBsKSk7CisKKwlyZXR1cm4gQ1BMX1JFVF9CVUZfRE9ORTsKK30KKworc3RhdGljIGludCBkb19hY3Rfb3Blbl9ycGwoc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjcGxfYWN0X29wZW5fcnBsICpycGwgPSBjcGxoZHIoc2tiKTsKKwl1bnNpZ25lZCBpbnQgYXRpZCA9IEdfVElEKG50b2hsKHJwbC0+YXRpZCkpOworCXN0cnVjdCB0M2NfdGlkX2VudHJ5ICp0M2NfdGlkOworCisJdDNjX3RpZCA9IGxvb2t1cF9hdGlkKCYoVDNDX0RBVEEoZGV2KSktPnRpZF9tYXBzLCBhdGlkKTsKKwlpZiAodDNjX3RpZC0+Y3R4ICYmIHQzY190aWQtPmNsaWVudCAmJiB0M2NfdGlkLT5jbGllbnQtPmhhbmRsZXJzICYmCisJICAgIHQzY190aWQtPmNsaWVudC0+aGFuZGxlcnNbQ1BMX0FDVF9PUEVOX1JQTF0pIHsKKwkJcmV0dXJuIHQzY190aWQtPmNsaWVudC0+aGFuZGxlcnNbQ1BMX0FDVF9PUEVOX1JQTF0gKGRldiwgc2tiLAorCQkJCQkJCQkgICAgdDNjX3RpZC0+CisJCQkJCQkJCSAgICBjdHgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlY2VpdmVkIGNsaWVudGxlc3MgQ1BMIGNvbW1hbmQgMHgleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgQ1BMX0FDVF9PUEVOX1JQTCk7CisJCXJldHVybiBDUExfUkVUX0JVRl9ET05FIHwgQ1BMX1JFVF9CQURfTVNHOworCX0KK30KKworc3RhdGljIGludCBkb19zdGlkX3JwbChzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5pb24gb3Bjb2RlX3RpZCAqcCA9IGNwbGhkcihza2IpOworCXVuc2lnbmVkIGludCBzdGlkID0gR19USUQobnRvaGwocC0+b3Bjb2RlX3RpZCkpOworCXN0cnVjdCB0M2NfdGlkX2VudHJ5ICp0M2NfdGlkOworCisJdDNjX3RpZCA9IGxvb2t1cF9zdGlkKCYoVDNDX0RBVEEoZGV2KSktPnRpZF9tYXBzLCBzdGlkKTsKKwlpZiAodDNjX3RpZC0+Y3R4ICYmIHQzY190aWQtPmNsaWVudC0+aGFuZGxlcnMgJiYKKwkgICAgdDNjX3RpZC0+Y2xpZW50LT5oYW5kbGVyc1twLT5vcGNvZGVdKSB7CisJCXJldHVybiB0M2NfdGlkLT5jbGllbnQtPmhhbmRsZXJzW3AtPm9wY29kZV0gKGRldiwgc2tiLAorCQkJCQkJCSAgICAgdDNjX3RpZC0+Y3R4KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWNlaXZlZCBjbGllbnRsZXNzIENQTCBjb21tYW5kIDB4JXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHAtPm9wY29kZSk7CisJCXJldHVybiBDUExfUkVUX0JVRl9ET05FIHwgQ1BMX1JFVF9CQURfTVNHOworCX0KK30KKworc3RhdGljIGludCBkb19od3RpZF9ycGwoc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuaW9uIG9wY29kZV90aWQgKnAgPSBjcGxoZHIoc2tiKTsKKwl1bnNpZ25lZCBpbnQgaHd0aWQgPSBHX1RJRChudG9obChwLT5vcGNvZGVfdGlkKSk7CisJc3RydWN0IHQzY190aWRfZW50cnkgKnQzY190aWQ7CisKKwl0M2NfdGlkID0gbG9va3VwX3RpZCgmKFQzQ19EQVRBKGRldikpLT50aWRfbWFwcywgaHd0aWQpOworCWlmICh0M2NfdGlkLT5jdHggJiYgdDNjX3RpZC0+Y2xpZW50LT5oYW5kbGVycyAmJgorCSAgICB0M2NfdGlkLT5jbGllbnQtPmhhbmRsZXJzW3AtPm9wY29kZV0pIHsKKwkJcmV0dXJuIHQzY190aWQtPmNsaWVudC0+aGFuZGxlcnNbcC0+b3Bjb2RlXQorCQkgICAgKGRldiwgc2tiLCB0M2NfdGlkLT5jdHgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlY2VpdmVkIGNsaWVudGxlc3MgQ1BMIGNvbW1hbmQgMHgleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgcC0+b3Bjb2RlKTsKKwkJcmV0dXJuIENQTF9SRVRfQlVGX0RPTkUgfCBDUExfUkVUX0JBRF9NU0c7CisJfQorfQorCitzdGF0aWMgaW50IGRvX2NyKHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgY3BsX3Bhc3NfYWNjZXB0X3JlcSAqcmVxID0gY3BsaGRyKHNrYik7CisJdW5zaWduZWQgaW50IHN0aWQgPSBHX1BBU1NfT1BFTl9USUQobnRvaGwocmVxLT50b3NfdGlkKSk7CisJc3RydWN0IHQzY190aWRfZW50cnkgKnQzY190aWQ7CisKKwl0M2NfdGlkID0gbG9va3VwX3N0aWQoJihUM0NfREFUQShkZXYpKS0+dGlkX21hcHMsIHN0aWQpOworCWlmICh0M2NfdGlkLT5jdHggJiYgdDNjX3RpZC0+Y2xpZW50LT5oYW5kbGVycyAmJgorCSAgICB0M2NfdGlkLT5jbGllbnQtPmhhbmRsZXJzW0NQTF9QQVNTX0FDQ0VQVF9SRVFdKSB7CisJCXJldHVybiB0M2NfdGlkLT5jbGllbnQtPmhhbmRsZXJzW0NQTF9QQVNTX0FDQ0VQVF9SRVFdCisJCSAgICAoZGV2LCBza2IsIHQzY190aWQtPmN0eCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcmVjZWl2ZWQgY2xpZW50bGVzcyBDUEwgY29tbWFuZCAweCV4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBDUExfUEFTU19BQ0NFUFRfUkVRKTsKKwkJcmV0dXJuIENQTF9SRVRfQlVGX0RPTkUgfCBDUExfUkVUX0JBRF9NU0c7CisJfQorfQorCitzdGF0aWMgaW50IGRvX2Fib3J0X3JlcV9yc3Moc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuaW9uIG9wY29kZV90aWQgKnAgPSBjcGxoZHIoc2tiKTsKKwl1bnNpZ25lZCBpbnQgaHd0aWQgPSBHX1RJRChudG9obChwLT5vcGNvZGVfdGlkKSk7CisJc3RydWN0IHQzY190aWRfZW50cnkgKnQzY190aWQ7CisKKwl0M2NfdGlkID0gbG9va3VwX3RpZCgmKFQzQ19EQVRBKGRldikpLT50aWRfbWFwcywgaHd0aWQpOworCWlmICh0M2NfdGlkLT5jdHggJiYgdDNjX3RpZC0+Y2xpZW50LT5oYW5kbGVycyAmJgorCSAgICB0M2NfdGlkLT5jbGllbnQtPmhhbmRsZXJzW3AtPm9wY29kZV0pIHsKKwkJcmV0dXJuIHQzY190aWQtPmNsaWVudC0+aGFuZGxlcnNbcC0+b3Bjb2RlXQorCQkgICAgKGRldiwgc2tiLCB0M2NfdGlkLT5jdHgpOworCX0gZWxzZSB7CisJCXN0cnVjdCBjcGxfYWJvcnRfcmVxX3JzcyAqcmVxID0gY3BsaGRyKHNrYik7CisJCXN0cnVjdCBjcGxfYWJvcnRfcnBsICpycGw7CisKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9CisJCSAgICBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBjcGxfYWJvcnRfcnBsKSwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKSB7CisJCQlwcmludGsoImRvX2Fib3J0X3JlcV9yc3M6IGNvdWxkbid0IGdldCBza2IhXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNrYi0+cHJpb3JpdHkgPSBDUExfUFJJT1JJVFlfREFUQTsKKwkJX19za2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBjcGxfYWJvcnRfcnBsKSk7CisJCXJwbCA9IGNwbGhkcihza2IpOworCQlycGwtPndyLndyX2hpID0KKwkJICAgIGh0b25sKFZfV1JfT1AoRldfV1JPUENPREVfT0ZMRF9IT1NUX0FCT1JUX0NPTl9SUEwpKTsKKwkJcnBsLT53ci53cl9sbyA9IGh0b25sKFZfV1JfVElEKEdFVF9USUQocmVxKSkpOworCQlPUENPREVfVElEKHJwbCkgPQorCQkgICAgaHRvbmwoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUlBMLCBHRVRfVElEKHJlcSkpKTsKKwkJcnBsLT5jbWQgPSByZXEtPnN0YXR1czsKKwkJY3hnYjNfb2ZsZF9zZW5kKGRldiwgc2tiKTsKK291dDoKKwkJcmV0dXJuIENQTF9SRVRfQlVGX0RPTkU7CisJfQorfQorCitzdGF0aWMgaW50IGRvX2FjdF9lc3RhYmxpc2goc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjcGxfYWN0X2VzdGFibGlzaCAqcmVxID0gY3BsaGRyKHNrYik7CisJdW5zaWduZWQgaW50IGF0aWQgPSBHX1BBU1NfT1BFTl9USUQobnRvaGwocmVxLT50b3NfdGlkKSk7CisJc3RydWN0IHQzY190aWRfZW50cnkgKnQzY190aWQ7CisKKwl0M2NfdGlkID0gbG9va3VwX2F0aWQoJihUM0NfREFUQShkZXYpKS0+dGlkX21hcHMsIGF0aWQpOworCWlmICh0M2NfdGlkLT5jdHggJiYgdDNjX3RpZC0+Y2xpZW50LT5oYW5kbGVycyAmJgorCSAgICB0M2NfdGlkLT5jbGllbnQtPmhhbmRsZXJzW0NQTF9BQ1RfRVNUQUJMSVNIXSkgeworCQlyZXR1cm4gdDNjX3RpZC0+Y2xpZW50LT5oYW5kbGVyc1tDUExfQUNUX0VTVEFCTElTSF0KKwkJICAgIChkZXYsIHNrYiwgdDNjX3RpZC0+Y3R4KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiByZWNlaXZlZCBjbGllbnRsZXNzIENQTCBjb21tYW5kIDB4JXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIENQTF9QQVNTX0FDQ0VQVF9SRVEpOworCQlyZXR1cm4gQ1BMX1JFVF9CVUZfRE9ORSB8IENQTF9SRVRfQkFEX01TRzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZG9fc2V0X3RjYl9ycGwoc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBjcGxfc2V0X3RjYl9ycGwgKnJwbCA9IGNwbGhkcihza2IpOworCisJaWYgKHJwbC0+c3RhdHVzICE9IENQTF9FUlJfTk9ORSkKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiVW5leHBlY3RlZCBTRVRfVENCX1JQTCBzdGF0dXMgJXUgZm9yIHRpZCAldVxuIiwKKwkJICAgICAgIHJwbC0+c3RhdHVzLCBHRVRfVElEKHJwbCkpOworCXJldHVybiBDUExfUkVUX0JVRl9ET05FOworfQorCitzdGF0aWMgaW50IGRvX3RyYWNlKHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgY3BsX3RyYWNlX3BrdCAqcCA9IGNwbGhkcihza2IpOworCisJc2tiLT5wcm90b2NvbCA9IDB4ZmZmZjsKKwlza2ItPmRldiA9IGRldi0+bGxkZXY7CisJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnApKTsKKwlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb190ZXJtKHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBpbnQgaHd0aWQgPSBudG9obChza2ItPnByaW9yaXR5KSA+PiA4ICYgMHhmZmZmZjsKKwl1bnNpZ25lZCBpbnQgb3Bjb2RlID0gR19PUENPREUobnRvaGwoc2tiLT5jc3VtKSk7CisJc3RydWN0IHQzY190aWRfZW50cnkgKnQzY190aWQ7CisKKwl0M2NfdGlkID0gbG9va3VwX3RpZCgmKFQzQ19EQVRBKGRldikpLT50aWRfbWFwcywgaHd0aWQpOworCWlmICh0M2NfdGlkLT5jdHggJiYgdDNjX3RpZC0+Y2xpZW50LT5oYW5kbGVycyAmJgorCSAgICB0M2NfdGlkLT5jbGllbnQtPmhhbmRsZXJzW29wY29kZV0pIHsKKwkJcmV0dXJuIHQzY190aWQtPmNsaWVudC0+aGFuZGxlcnNbb3Bjb2RlXSAoZGV2LCBza2IsCisJCQkJCQkJICB0M2NfdGlkLT5jdHgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlY2VpdmVkIGNsaWVudGxlc3MgQ1BMIGNvbW1hbmQgMHgleFxuIiwKKwkJICAgICAgIGRldi0+bmFtZSwgb3Bjb2RlKTsKKwkJcmV0dXJuIENQTF9SRVRfQlVGX0RPTkUgfCBDUExfUkVUX0JBRF9NU0c7CisJfQorfQorCitzdGF0aWMgaW50IG5iX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJICAgICAgIHZvaWQgKmN0eCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSAoTkVURVZFTlRfTkVJR0hfVVBEQVRFKTp7CisJCWN4Z2JfbmVpZ2hfdXBkYXRlKChzdHJ1Y3QgbmVpZ2hib3VyICopY3R4KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgKE5FVEVWRU5UX1BNVFVfVVBEQVRFKToKKwkJYnJlYWs7CisJY2FzZSAoTkVURVZFTlRfUkVESVJFQ1QpOnsKKwkJc3RydWN0IG5ldGV2ZW50X3JlZGlyZWN0ICpuciA9IGN0eDsKKwkJY3hnYl9yZWRpcmVjdChuci0+b2xkLCBuci0+bmV3KTsKKwkJY3hnYl9uZWlnaF91cGRhdGUobnItPm5ldy0+bmVpZ2hib3VyKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBuYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IG5iX2NhbGxiYWNrCit9OworCisvKgorICogUHJvY2VzcyBhIHJlY2VpdmVkIHBhY2tldCB3aXRoIGFuIHVua25vd24vdW5leHBlY3RlZCBDUEwgb3Bjb2RlLgorICovCitzdGF0aWMgaW50IGRvX2JhZF9jcGwoc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXByaW50ayhLRVJOX0VSUiAiJXM6IHJlY2VpdmVkIGJhZCBDUEwgY29tbWFuZCAweCV4XG4iLCBkZXYtPm5hbWUsCisJICAgICAgICpza2ItPmRhdGEpOworCXJldHVybiBDUExfUkVUX0JVRl9ET05FIHwgQ1BMX1JFVF9CQURfTVNHOworfQorCisvKgorICogSGFuZGxlcnMgZm9yIGVhY2ggQ1BMIG9wY29kZQorICovCitzdGF0aWMgY3BsX2hhbmRsZXJfZnVuYyBjcGxfaGFuZGxlcnNbTlVNX0NQTF9DTURTXTsKKworLyoKKyAqIEFkZCBhIG5ldyBoYW5kbGVyIHRvIHRoZSBDUEwgZGlzcGF0Y2ggdGFibGUuICBBIE5VTEwgaGFuZGxlciBtYXkgYmUgc3VwcGxpZWQKKyAqIHRvIHVucmVnaXN0ZXIgYW4gZXhpc3RpbmcgaGFuZGxlci4KKyAqLwordm9pZCB0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcih1bnNpZ25lZCBpbnQgb3Bjb2RlLCBjcGxfaGFuZGxlcl9mdW5jIGgpCit7CisJaWYgKG9wY29kZSA8IE5VTV9DUExfQ01EUykKKwkJY3BsX2hhbmRsZXJzW29wY29kZV0gPSBoID8gaCA6IGRvX2JhZF9jcGw7CisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIgIlQzQzogaGFuZGxlciByZWdpc3RyYXRpb24gZm9yICIKKwkJICAgICAgICJvcGNvZGUgJXggZmFpbGVkXG4iLCBvcGNvZGUpOworfQorCitFWFBPUlRfU1lNQk9MKHQzX3JlZ2lzdGVyX2NwbF9oYW5kbGVyKTsKKworLyoKKyAqIFQzQ0RFVidzIHJlY2VpdmUgbWV0aG9kLgorICovCitpbnQgcHJvY2Vzc19yeChzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICoqc2ticywgaW50IG4pCit7CisJd2hpbGUgKG4tLSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKnNrYnMrKzsKKwkJdW5zaWduZWQgaW50IG9wY29kZSA9IEdfT1BDT0RFKG50b2hsKHNrYi0+Y3N1bSkpOworCQlpbnQgcmV0ID0gY3BsX2hhbmRsZXJzW29wY29kZV0gKGRldiwgc2tiKTsKKworI2lmIFZBTElEQVRFX1RJRAorCQlpZiAocmV0ICYgQ1BMX1JFVF9VTktOT1dOX1RJRCkgeworCQkJdW5pb24gb3Bjb2RlX3RpZCAqcCA9IGNwbGhkcihza2IpOworCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDUEwgbWVzc2FnZSAob3Bjb2RlICV1KSBoYWQgIgorCQkJICAgICAgICJ1bmtub3duIFRJRCAldVxuIiwgZGV2LT5uYW1lLCBvcGNvZGUsCisJCQkgICAgICAgR19USUQobnRvaGwocC0+b3Bjb2RlX3RpZCkpKTsKKwkJfQorI2VuZGlmCisJCWlmIChyZXQgJiBDUExfUkVUX0JVRl9ET05FKQorCQkJa2ZyZWVfc2tiKHNrYik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU2VuZHMgYW4gc2tfYnVmZiB0byBhIFQzQyBkcml2ZXIgYWZ0ZXIgZGVhbGluZyB3aXRoIGFueSBhY3RpdmUgbmV0d29yayB0YXBzLgorICovCitpbnQgY3hnYjNfb2ZsZF9zZW5kKHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcjsKKworCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwlyID0gZGV2LT5zZW5kKGRldiwgc2tiKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwlyZXR1cm4gcjsKK30KKworRVhQT1JUX1NZTUJPTChjeGdiM19vZmxkX3NlbmQpOworCitzdGF0aWMgaW50IGlzX29mZmxvYWRpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsKKwlpbnQgaTsKKworCXJlYWRfbG9ja19iaCgmYWRhcHRlcl9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcHRlciwgJmFkYXB0ZXJfbGlzdCwgYWRhcHRlcl9saXN0KSB7CisJCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgeworCQkJaWYgKGRldiA9PSBhZGFwdGVyLT5wb3J0W2ldKSB7CisJCQkJcmVhZF91bmxvY2tfYmgoJmFkYXB0ZXJfbGlzdF9sb2NrKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlyZWFkX3VubG9ja19iaCgmYWRhcHRlcl9saXN0X2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIGN4Z2JfbmVpZ2hfdXBkYXRlKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OworCisJaWYgKGRldiAmJiAoaXNfb2ZmbG9hZGluZyhkZXYpKSkgeworCQlzdHJ1Y3QgdDNjZGV2ICp0ZGV2ID0gVDNDREVWKGRldik7CisKKwkJQlVHX09OKCF0ZGV2KTsKKwkJdDNfbDJ0X3VwZGF0ZSh0ZGV2LCBuZWlnaCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfbDJ0X2l4KHN0cnVjdCB0M2NkZXYgKnRkZXYsIHUzMiB0aWQsIHN0cnVjdCBsMnRfZW50cnkgKmUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgY3BsX3NldF90Y2JfZmllbGQgKnJlcTsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKnJlcSksIEdGUF9BVE9NSUMpOworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbm5vdCBhbGxvY2F0ZSBza2IhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCXNrYi0+cHJpb3JpdHkgPSBDUExfUFJJT1JJVFlfQ09OVFJPTDsKKwlyZXEgPSAoc3RydWN0IGNwbF9zZXRfdGNiX2ZpZWxkICopc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7CisJcmVxLT53ci53cl9oaSA9IGh0b25sKFZfV1JfT1AoRldfV1JPUENPREVfRk9SV0FSRCkpOworCU9QQ09ERV9USUQocmVxKSA9IGh0b25sKE1LX09QQ09ERV9USUQoQ1BMX1NFVF9UQ0JfRklFTEQsIHRpZCkpOworCXJlcS0+cmVwbHkgPSAwOworCXJlcS0+Y3B1X2lkeCA9IDA7CisJcmVxLT53b3JkID0gaHRvbnMoV19UQ0JfTDJUX0lYKTsKKwlyZXEtPm1hc2sgPSBjcHVfdG9fYmU2NChWX1RDQl9MMlRfSVgoTV9UQ0JfTDJUX0lYKSk7CisJcmVxLT52YWwgPSBjcHVfdG9fYmU2NChWX1RDQl9MMlRfSVgoZS0+aWR4KSk7CisJdGRldi0+c2VuZCh0ZGV2LCBza2IpOworfQorCit2b2lkIGN4Z2JfcmVkaXJlY3Qoc3RydWN0IGRzdF9lbnRyeSAqb2xkLCBzdHJ1Y3QgZHN0X2VudHJ5ICpuZXcpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm9sZGRldiwgKm5ld2RldjsKKwlzdHJ1Y3QgdGlkX2luZm8gKnRpOworCXN0cnVjdCB0M2NkZXYgKnRkZXY7CisJdTMyIHRpZDsKKwlpbnQgdXBkYXRlX3RjYjsKKwlzdHJ1Y3QgbDJ0X2VudHJ5ICplOworCXN0cnVjdCB0M2NfdGlkX2VudHJ5ICp0ZTsKKworCW9sZGRldiA9IG9sZC0+bmVpZ2hib3VyLT5kZXY7CisJbmV3ZGV2ID0gbmV3LT5uZWlnaGJvdXItPmRldjsKKwlpZiAoIWlzX29mZmxvYWRpbmcob2xkZGV2KSkKKwkJcmV0dXJuOworCWlmICghaXNfb2ZmbG9hZGluZyhuZXdkZXYpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZWRpcmVjdCB0byBub24tb2ZmbG9hZCIKKwkJICAgICAgICJkZXZpY2UgaWdub3JlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJdGRldiA9IFQzQ0RFVihvbGRkZXYpOworCUJVR19PTighdGRldik7CisJaWYgKHRkZXYgIT0gVDNDREVWKG5ld2RldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlZGlyZWN0IHRvIGRpZmZlcmVudCAiCisJCSAgICAgICAib2ZmbG9hZCBkZXZpY2UgaWdub3JlZC5cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBZGQgbmV3IEwyVCBlbnRyeSAqLworCWUgPSB0M19sMnRfZ2V0KHRkZXYsIG5ldy0+bmVpZ2hib3VyLCBuZXdkZXYpOworCWlmICghZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBuZXcgbDJ0IGVudHJ5IVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBXYWxrIHRpZCB0YWJsZSBhbmQgbm90aWZ5IGNsaWVudHMgb2YgZHN0IGNoYW5nZS4gKi8KKwl0aSA9ICYoVDNDX0RBVEEodGRldikpLT50aWRfbWFwczsKKwlmb3IgKHRpZCA9IDA7IHRpZCA8IHRpLT5udGlkczsgdGlkKyspIHsKKwkJdGUgPSBsb29rdXBfdGlkKHRpLCB0aWQpOworCQlCVUdfT04oIXRlKTsKKwkJaWYgKHRlLT5jdHggJiYgdGUtPmNsaWVudCAmJiB0ZS0+Y2xpZW50LT5yZWRpcmVjdCkgeworCQkJdXBkYXRlX3RjYiA9IHRlLT5jbGllbnQtPnJlZGlyZWN0KHRlLT5jdHgsIG9sZCwgbmV3LCBlKTsKKwkJCWlmICh1cGRhdGVfdGNiKSB7CisJCQkJbDJ0X2hvbGQoTDJEQVRBKHRkZXYpLCBlKTsKKwkJCQlzZXRfbDJ0X2l4KHRkZXYsIHRpZCwgZSk7CisJCQl9CisJCX0KKwl9CisJbDJ0X3JlbGVhc2UoTDJEQVRBKHRkZXYpLCBlKTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgY2h1bmsgb2YgbWVtb3J5IHVzaW5nIGttYWxsb2Mgb3IsIGlmIHRoYXQgZmFpbHMsIHZtYWxsb2MuCisgKiBUaGUgYWxsb2NhdGVkIG1lbW9yeSBpcyBjbGVhcmVkLgorICovCit2b2lkICpjeGdiX2FsbG9jX21lbSh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXApCisJCXAgPSB2bWFsbG9jKHNpemUpOworCWlmIChwKQorCQltZW1zZXQocCwgMCwgc2l6ZSk7CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgdGhyb3VnaCB0M19hbGxvY19tZW0oKS4KKyAqLwordm9pZCBjeGdiX2ZyZWVfbWVtKHZvaWQgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKKworCWlmIChwID49IFZNQUxMT0NfU1RBUlQgJiYgcCA8IFZNQUxMT0NfRU5EKQorCQl2ZnJlZShhZGRyKTsKKwllbHNlCisJCWtmcmVlKGFkZHIpOworfQorCisvKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIFRJRCB0YWJsZXMuICBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBpbml0X3RpZF90YWJzKHN0cnVjdCB0aWRfaW5mbyAqdCwgdW5zaWduZWQgaW50IG50aWRzLAorCQkJIHVuc2lnbmVkIGludCBuYXRpZHMsIHVuc2lnbmVkIGludCBuc3RpZHMsCisJCQkgdW5zaWduZWQgaW50IGF0aWRfYmFzZSwgdW5zaWduZWQgaW50IHN0aWRfYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBudGlkcyAqIHNpemVvZigqdC0+dGlkX3RhYikgKworCSAgICBuYXRpZHMgKiBzaXplb2YoKnQtPmF0aWRfdGFiKSArIG5zdGlkcyAqIHNpemVvZigqdC0+c3RpZF90YWIpOworCisJdC0+dGlkX3RhYiA9IGN4Z2JfYWxsb2NfbWVtKHNpemUpOworCWlmICghdC0+dGlkX3RhYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0LT5zdGlkX3RhYiA9ICh1bmlvbiBsaXN0ZW5fZW50cnkgKikmdC0+dGlkX3RhYltudGlkc107CisJdC0+YXRpZF90YWIgPSAodW5pb24gYWN0aXZlX29wZW5fZW50cnkgKikmdC0+c3RpZF90YWJbbnN0aWRzXTsKKwl0LT5udGlkcyA9IG50aWRzOworCXQtPm5zdGlkcyA9IG5zdGlkczsKKwl0LT5zdGlkX2Jhc2UgPSBzdGlkX2Jhc2U7CisJdC0+c2ZyZWUgPSBOVUxMOworCXQtPm5hdGlkcyA9IG5hdGlkczsKKwl0LT5hdGlkX2Jhc2UgPSBhdGlkX2Jhc2U7CisJdC0+YWZyZWUgPSBOVUxMOworCXQtPnN0aWRzX2luX3VzZSA9IHQtPmF0aWRzX2luX3VzZSA9IDA7CisJYXRvbWljX3NldCgmdC0+dGlkc19pbl91c2UsIDApOworCXNwaW5fbG9ja19pbml0KCZ0LT5zdGlkX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZ0LT5hdGlkX2xvY2spOworCisJLyoKKwkgKiBTZXR1cCB0aGUgZnJlZSBsaXN0cyBmb3Igc3RpZF90YWIgYW5kIGF0aWRfdGFiLgorCSAqLworCWlmIChuc3RpZHMpIHsKKwkJd2hpbGUgKC0tbnN0aWRzKQorCQkJdC0+c3RpZF90YWJbbnN0aWRzIC0gMV0ubmV4dCA9ICZ0LT5zdGlkX3RhYltuc3RpZHNdOworCQl0LT5zZnJlZSA9IHQtPnN0aWRfdGFiOworCX0KKwlpZiAobmF0aWRzKSB7CisJCXdoaWxlICgtLW5hdGlkcykKKwkJCXQtPmF0aWRfdGFiW25hdGlkcyAtIDFdLm5leHQgPSAmdC0+YXRpZF90YWJbbmF0aWRzXTsKKwkJdC0+YWZyZWUgPSB0LT5hdGlkX3RhYjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdGlkX21hcHMoc3RydWN0IHRpZF9pbmZvICp0KQoreworCWN4Z2JfZnJlZV9tZW0odC0+dGlkX3RhYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfYWRhcHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwl3cml0ZV9sb2NrX2JoKCZhZGFwdGVyX2xpc3RfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmYWRhcC0+YWRhcHRlcl9saXN0LCAmYWRhcHRlcl9saXN0KTsKKwl3cml0ZV91bmxvY2tfYmgoJmFkYXB0ZXJfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXdyaXRlX2xvY2tfYmgoJmFkYXB0ZXJfbGlzdF9sb2NrKTsKKwlsaXN0X2RlbCgmYWRhcC0+YWRhcHRlcl9saXN0KTsKKwl3cml0ZV91bmxvY2tfYmgoJmFkYXB0ZXJfbGlzdF9sb2NrKTsKK30KKworaW50IGN4Z2IzX29mZmxvYWRfYWN0aXZhdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHQzY2RldiAqZGV2ID0gJmFkYXB0ZXItPnRkZXY7CisJaW50IG5hdGlkcywgZXJyOworCXN0cnVjdCB0M2NfZGF0YSAqdDsKKwlzdHJ1Y3QgdGlkX3JhbmdlIHN0aWRfcmFuZ2UsIHRpZF9yYW5nZTsKKwlzdHJ1Y3QgbXR1dGFiIG10dXRhYjsKKwl1bnNpZ25lZCBpbnQgbDJ0X2NhcGFjaXR5OworCisJdCA9IGtjYWxsb2MoMSwgc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IC1FT1BOT1RTVVBQOworCWlmIChkZXYtPmN0bChkZXYsIEdFVF9UWF9NQVhfQ0hVTkssICZ0LT50eF9tYXhfY2h1bmspIDwgMCB8fAorCSAgICBkZXYtPmN0bChkZXYsIEdFVF9NQVhfT1VUU1RBTkRJTkdfV1IsICZ0LT5tYXhfd3JzKSA8IDAgfHwKKwkgICAgZGV2LT5jdGwoZGV2LCBHRVRfTDJUX0NBUEFDSVRZLCAmbDJ0X2NhcGFjaXR5KSA8IDAgfHwKKwkgICAgZGV2LT5jdGwoZGV2LCBHRVRfTVRVUywgJm10dXRhYikgPCAwIHx8CisJICAgIGRldi0+Y3RsKGRldiwgR0VUX1RJRF9SQU5HRSwgJnRpZF9yYW5nZSkgPCAwIHx8CisJICAgIGRldi0+Y3RsKGRldiwgR0VUX1NUSURfUkFOR0UsICZzdGlkX3JhbmdlKSA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwllcnIgPSAtRU5PTUVNOworCUwyREFUQShkZXYpID0gdDNfaW5pdF9sMnQobDJ0X2NhcGFjaXR5KTsKKwlpZiAoIUwyREFUQShkZXYpKQorCQlnb3RvIG91dF9mcmVlOworCisJbmF0aWRzID0gbWluKHRpZF9yYW5nZS5udW0gLyAyLCBNQVhfQVRJRFMpOworCWVyciA9IGluaXRfdGlkX3RhYnMoJnQtPnRpZF9tYXBzLCB0aWRfcmFuZ2UubnVtLCBuYXRpZHMsCisJCQkgICAgc3RpZF9yYW5nZS5udW0sIEFUSURfQkFTRSwgc3RpZF9yYW5nZS5iYXNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2wydDsKKworCXQtPm10dXMgPSBtdHV0YWIubXR1czsKKwl0LT5ubXR1cyA9IG10dXRhYi5zaXplOworCisJSU5JVF9XT1JLKCZ0LT50aWRfcmVsZWFzZV90YXNrLCB0M19wcm9jZXNzX3RpZF9yZWxlYXNlX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZ0LT50aWRfcmVsZWFzZV9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmdC0+bGlzdF9ub2RlKTsKKwl0LT5kZXYgPSBkZXY7CisKKwlUM0NfREFUQShkZXYpID0gdDsKKwlkZXYtPnJlY3YgPSBwcm9jZXNzX3J4OworCWRldi0+bmVpZ2hfdXBkYXRlID0gdDNfbDJ0X3VwZGF0ZTsKKworCS8qIFJlZ2lzdGVyIG5ldGV2ZW50IGhhbmRsZXIgb25jZSAqLworCWlmIChsaXN0X2VtcHR5KCZhZGFwdGVyX2xpc3QpKQorCQlyZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcigmbmIpOworCisJYWRkX2FkYXB0ZXIoYWRhcHRlcik7CisJcmV0dXJuIDA7CisKK291dF9mcmVlX2wydDoKKwl0M19mcmVlX2wydChMMkRBVEEoZGV2KSk7CisJTDJEQVRBKGRldikgPSBOVUxMOworb3V0X2ZyZWU6CisJa2ZyZWUodCk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBjeGdiM19vZmZsb2FkX2RlYWN0aXZhdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHQzY2RldiAqdGRldiA9ICZhZGFwdGVyLT50ZGV2OworCXN0cnVjdCB0M2NfZGF0YSAqdCA9IFQzQ19EQVRBKHRkZXYpOworCisJcmVtb3ZlX2FkYXB0ZXIoYWRhcHRlcik7CisJaWYgKGxpc3RfZW1wdHkoJmFkYXB0ZXJfbGlzdCkpCisJCXVucmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJm5iKTsKKworCWZyZWVfdGlkX21hcHMoJnQtPnRpZF9tYXBzKTsKKwlUM0NfREFUQSh0ZGV2KSA9IE5VTEw7CisJdDNfZnJlZV9sMnQoTDJEQVRBKHRkZXYpKTsKKwlMMkRBVEEodGRldikgPSBOVUxMOworCWtmcmVlKHQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVnaXN0ZXJfdGRldihzdHJ1Y3QgdDNjZGV2ICp0ZGV2KQoreworCXN0YXRpYyBpbnQgdW5pdDsKKworCW11dGV4X2xvY2soJmN4Z2IzX2RiX2xvY2spOworCXNucHJpbnRmKHRkZXYtPm5hbWUsIHNpemVvZih0ZGV2LT5uYW1lKSwgIm9mbGRfZGV2JWQiLCB1bml0KyspOworCWxpc3RfYWRkX3RhaWwoJnRkZXYtPm9mbGRfZGV2X2xpc3QsICZvZmxkX2Rldl9saXN0KTsKKwltdXRleF91bmxvY2soJmN4Z2IzX2RiX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5yZWdpc3Rlcl90ZGV2KHN0cnVjdCB0M2NkZXYgKnRkZXYpCit7CisJbXV0ZXhfbG9jaygmY3hnYjNfZGJfbG9jayk7CisJbGlzdF9kZWwoJnRkZXYtPm9mbGRfZGV2X2xpc3QpOworCW11dGV4X3VubG9jaygmY3hnYjNfZGJfbG9jayk7Cit9CisKK3ZvaWQgX19kZXZpbml0IGN4Z2IzX2FkYXB0ZXJfb2ZsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgdDNjZGV2ICp0ZGV2ID0gJmFkYXB0ZXItPnRkZXY7CisKKwlJTklUX0xJU1RfSEVBRCgmdGRldi0+b2ZsZF9kZXZfbGlzdCk7CisKKwljeGdiM19zZXRfZHVtbXlfb3BzKHRkZXYpOworCXRkZXYtPnNlbmQgPSB0M19vZmZsb2FkX3R4OworCXRkZXYtPmN0bCA9IGN4Z2Jfb2ZmbG9hZF9jdGw7CisJdGRldi0+dHlwZSA9IGFkYXB0ZXItPnBhcmFtcy5yZXYgPT0gMCA/IFQzQSA6IFQzQjsKKworCXJlZ2lzdGVyX3RkZXYodGRldik7Cit9CisKK3ZvaWQgX19kZXZleGl0IGN4Z2IzX2FkYXB0ZXJfdW5vZmxkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCB0M2NkZXYgKnRkZXYgPSAmYWRhcHRlci0+dGRldjsKKworCXRkZXYtPnJlY3YgPSBOVUxMOworCXRkZXYtPm5laWdoX3VwZGF0ZSA9IE5VTEw7CisKKwl1bnJlZ2lzdGVyX3RkZXYodGRldik7Cit9CisKK3ZvaWQgX19pbml0IGN4Z2IzX29mZmxvYWRfaW5pdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9DUExfQ01EUzsgKytpKQorCQljcGxfaGFuZGxlcnNbaV0gPSBkb19iYWRfY3BsOworCisJdDNfcmVnaXN0ZXJfY3BsX2hhbmRsZXIoQ1BMX1NNVF9XUklURV9SUEwsIGRvX3NtdF93cml0ZV9ycGwpOworCXQzX3JlZ2lzdGVyX2NwbF9oYW5kbGVyKENQTF9MMlRfV1JJVEVfUlBMLCBkb19sMnRfd3JpdGVfcnBsKTsKKwl0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcihDUExfUEFTU19PUEVOX1JQTCwgZG9fc3RpZF9ycGwpOworCXQzX3JlZ2lzdGVyX2NwbF9oYW5kbGVyKENQTF9DTE9TRV9MSVNUU1JWX1JQTCwgZG9fc3RpZF9ycGwpOworCXQzX3JlZ2lzdGVyX2NwbF9oYW5kbGVyKENQTF9QQVNTX0FDQ0VQVF9SRVEsIGRvX2NyKTsKKwl0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcihDUExfUEFTU19FU1RBQkxJU0gsIGRvX2h3dGlkX3JwbCk7CisJdDNfcmVnaXN0ZXJfY3BsX2hhbmRsZXIoQ1BMX0FCT1JUX1JQTF9SU1MsIGRvX2h3dGlkX3JwbCk7CisJdDNfcmVnaXN0ZXJfY3BsX2hhbmRsZXIoQ1BMX0FCT1JUX1JQTCwgZG9faHd0aWRfcnBsKTsKKwl0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcihDUExfUlhfVVJHX05PVElGWSwgZG9faHd0aWRfcnBsKTsKKwl0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcihDUExfUlhfREFUQSwgZG9faHd0aWRfcnBsKTsKKwl0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcihDUExfVFhfREFUQV9BQ0ssIGRvX2h3dGlkX3JwbCk7CisJdDNfcmVnaXN0ZXJfY3BsX2hhbmRsZXIoQ1BMX1RYX0RNQV9BQ0ssIGRvX2h3dGlkX3JwbCk7CisJdDNfcmVnaXN0ZXJfY3BsX2hhbmRsZXIoQ1BMX0FDVF9PUEVOX1JQTCwgZG9fYWN0X29wZW5fcnBsKTsKKwl0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcihDUExfUEVFUl9DTE9TRSwgZG9faHd0aWRfcnBsKTsKKwl0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcihDUExfQ0xPU0VfQ09OX1JQTCwgZG9faHd0aWRfcnBsKTsKKwl0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcihDUExfQUJPUlRfUkVRX1JTUywgZG9fYWJvcnRfcmVxX3Jzcyk7CisJdDNfcmVnaXN0ZXJfY3BsX2hhbmRsZXIoQ1BMX0FDVF9FU1RBQkxJU0gsIGRvX2FjdF9lc3RhYmxpc2gpOworCXQzX3JlZ2lzdGVyX2NwbF9oYW5kbGVyKENQTF9TRVRfVENCX1JQTCwgZG9fc2V0X3RjYl9ycGwpOworCXQzX3JlZ2lzdGVyX2NwbF9oYW5kbGVyKENQTF9SRE1BX1RFUk1JTkFURSwgZG9fdGVybSk7CisJdDNfcmVnaXN0ZXJfY3BsX2hhbmRsZXIoQ1BMX1JETUFfRUNfU1RBVFVTLCBkb19od3RpZF9ycGwpOworCXQzX3JlZ2lzdGVyX2NwbF9oYW5kbGVyKENQTF9UUkFDRV9QS1QsIGRvX3RyYWNlKTsKKwl0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcihDUExfUlhfREFUQV9ERFAsIGRvX2h3dGlkX3JwbCk7CisJdDNfcmVnaXN0ZXJfY3BsX2hhbmRsZXIoQ1BMX1JYX0REUF9DT01QTEVURSwgZG9faHd0aWRfcnBsKTsKKwl0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcihDUExfSVNDU0lfSERSLCBkb19od3RpZF9ycGwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5oIGIvZHJpdmVycy9uZXQvY3hnYjMvY3hnYjNfb2ZmbG9hZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNmJlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9jeGdiM19vZmZsb2FkLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBPcGVuIEdyaWQgQ29tcHV0aW5nLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfQ1hHQjNfT0ZGTE9BRF9ICisjZGVmaW5lIF9DWEdCM19PRkZMT0FEX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgImwydC5oIgorCisjaW5jbHVkZSAidDNjZGV2LmgiCisjaW5jbHVkZSAidDNfY3BsLmgiCisKK3N0cnVjdCBhZGFwdGVyOworCit2b2lkIGN4Z2IzX29mZmxvYWRfaW5pdCh2b2lkKTsKKwordm9pZCBjeGdiM19hZGFwdGVyX29mbGQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCBjeGdiM19hZGFwdGVyX3Vub2ZsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CitpbnQgY3hnYjNfb2ZmbG9hZF9hY3RpdmF0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Cit2b2lkIGN4Z2IzX29mZmxvYWRfZGVhY3RpdmF0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CisKK3ZvaWQgY3hnYjNfc2V0X2R1bW15X29wcyhzdHJ1Y3QgdDNjZGV2ICpkZXYpOworCisvKgorICogQ2xpZW50IHJlZ2lzdHJhdGlvbi4gIFVzZXJzIG9mIFQzIGRyaXZlciBtdXN0IHJlZ2lzdGVyIHRoZW1zZWx2ZXMuCisgKiBUaGUgVDMgZHJpdmVyIHdpbGwgY2FsbCB0aGUgYWRkIGZ1bmN0aW9uIG9mIGV2ZXJ5IGNsaWVudCBmb3IgZWFjaCBUMworICogYWRhcHRlciBhY3RpdmF0ZWQsIHBhc3NpbmcgdXAgdGhlIHQzY2RldiBwdHIuICBFYWNoIGNsaWVudCBmaWxscyBvdXQgYW4KKyAqIGFycmF5IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byBwcm9jZXNzIENQTCBtZXNzYWdlcy4KKyAqLworCit2b2lkIGN4Z2IzX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgY3hnYjNfY2xpZW50ICpjbGllbnQpOwordm9pZCBjeGdiM191bnJlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgY3hnYjNfY2xpZW50ICpjbGllbnQpOwordm9pZCBjeGdiM19hZGRfY2xpZW50cyhzdHJ1Y3QgdDNjZGV2ICp0ZGV2KTsKK3ZvaWQgY3hnYjNfcmVtb3ZlX2NsaWVudHMoc3RydWN0IHQzY2RldiAqdGRldik7CisKK3R5cGVkZWYgaW50ICgqY3hnYjNfY3BsX2hhbmRsZXJfZnVuYykoc3RydWN0IHQzY2RldiAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKmN0eCk7CisKK3N0cnVjdCBjeGdiM19jbGllbnQgeworCWNoYXIgKm5hbWU7CisJdm9pZCAoKmFkZCkgKHN0cnVjdCB0M2NkZXYgKik7CisJdm9pZCAoKnJlbW92ZSkgKHN0cnVjdCB0M2NkZXYgKik7CisJY3hnYjNfY3BsX2hhbmRsZXJfZnVuYyAqaGFuZGxlcnM7CisJaW50ICgqcmVkaXJlY3QpKHZvaWQgKmN0eCwgc3RydWN0IGRzdF9lbnRyeSAqb2xkLAorCQkJc3RydWN0IGRzdF9lbnRyeSAqbmV3LCBzdHJ1Y3QgbDJ0X2VudHJ5ICpsMnQpOworCXN0cnVjdCBsaXN0X2hlYWQgY2xpZW50X2xpc3Q7Cit9OworCisvKgorICogVElEIGFsbG9jYXRpb24gc2VydmljZXMuCisgKi8KK2ludCBjeGdiM19hbGxvY19hdGlkKHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IGN4Z2IzX2NsaWVudCAqY2xpZW50LAorCQkgICAgIHZvaWQgKmN0eCk7CitpbnQgY3hnYjNfYWxsb2Nfc3RpZChzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBjeGdiM19jbGllbnQgKmNsaWVudCwKKwkJICAgICB2b2lkICpjdHgpOwordm9pZCAqY3hnYjNfZnJlZV9hdGlkKHN0cnVjdCB0M2NkZXYgKmRldiwgaW50IGF0aWQpOwordm9pZCBjeGdiM19mcmVlX3N0aWQoc3RydWN0IHQzY2RldiAqZGV2LCBpbnQgc3RpZCk7Cit2b2lkIGN4Z2IzX2luc2VydF90aWQoc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3QgY3hnYjNfY2xpZW50ICpjbGllbnQsCisJCSAgICAgIHZvaWQgKmN0eCwgdW5zaWduZWQgaW50IHRpZCk7Cit2b2lkIGN4Z2IzX3F1ZXVlX3RpZF9yZWxlYXNlKHN0cnVjdCB0M2NkZXYgKmRldiwgdW5zaWduZWQgaW50IHRpZCk7Cit2b2lkIGN4Z2IzX3JlbW92ZV90aWQoc3RydWN0IHQzY2RldiAqZGV2LCB2b2lkICpjdHgsIHVuc2lnbmVkIGludCB0aWQpOworCitzdHJ1Y3QgdDNjX3RpZF9lbnRyeSB7CisJc3RydWN0IGN4Z2IzX2NsaWVudCAqY2xpZW50OworCXZvaWQgKmN0eDsKK307CisKKy8qIENQTCBtZXNzYWdlIHByaW9yaXR5IGxldmVscyAqLworZW51bSB7CisJQ1BMX1BSSU9SSVRZX0RBVEEgPSAwLAkvKiBkYXRhIG1lc3NhZ2VzICovCisJQ1BMX1BSSU9SSVRZX1NFVFVQID0gMSwJLyogY29ubmVjdGlvbiBzZXR1cCBtZXNzYWdlcyAqLworCUNQTF9QUklPUklUWV9URUFSRE9XTiA9IDAsCS8qIGNvbm5lY3Rpb24gdGVhcmRvd24gbWVzc2FnZXMgKi8KKwlDUExfUFJJT1JJVFlfTElTVEVOID0gMSwJLyogbGlzdGVuIHN0YXJ0L3N0b3AgbWVzc2FnZXMgKi8KKwlDUExfUFJJT1JJVFlfQUNLID0gMSwJLyogUlggQUNLIG1lc3NhZ2VzICovCisJQ1BMX1BSSU9SSVRZX0NPTlRST0wgPSAxCS8qIG9mZmxvYWQgY29udHJvbCBtZXNzYWdlcyAqLworfTsKKworLyogRmxhZ3MgZm9yIHJldHVybiB2YWx1ZSBvZiBDUEwgbWVzc2FnZSBoYW5kbGVycyAqLworZW51bSB7CisJQ1BMX1JFVF9CVUZfRE9ORSA9IDEsIC8qIGJ1ZmZlciBwcm9jZXNzaW5nIGRvbmUsIGJ1ZmZlciBtYXkgYmUgZnJlZWQgKi8KKwlDUExfUkVUX0JBRF9NU0cgPSAyLCAgLyogYmFkIENQTCBtZXNzYWdlIChlLmcuLCB1bmtub3duIG9wY29kZSkgKi8KKwlDUExfUkVUX1VOS05PV05fVElEID0gNAkvKiB1bmV4cGVjdGVkIHVua25vd24gVElEICovCit9OworCit0eXBlZGVmIGludCAoKmNwbF9oYW5kbGVyX2Z1bmMpKHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgQ1BMIGhlYWRlciBpbiBhbiBza19idWZmIHRoYXQKKyAqIGNvbnRhaW5zIGEgQ1BMIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqY3BsaGRyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+ZGF0YTsKK30KKwordm9pZCB0M19yZWdpc3Rlcl9jcGxfaGFuZGxlcih1bnNpZ25lZCBpbnQgb3Bjb2RlLCBjcGxfaGFuZGxlcl9mdW5jIGgpOworCit1bmlvbiBsaXN0ZW5fZW50cnkgeworCXN0cnVjdCB0M2NfdGlkX2VudHJ5IHQzY190aWQ7CisJdW5pb24gbGlzdGVuX2VudHJ5ICpuZXh0OworfTsKKwordW5pb24gYWN0aXZlX29wZW5fZW50cnkgeworCXN0cnVjdCB0M2NfdGlkX2VudHJ5IHQzY190aWQ7CisJdW5pb24gYWN0aXZlX29wZW5fZW50cnkgKm5leHQ7Cit9OworCisvKgorICogSG9sZHMgdGhlIHNpemUsIGJhc2UgYWRkcmVzcywgZnJlZSBsaXN0IHN0YXJ0LCBldGMgb2YgdGhlIFRJRCwgc2VydmVyIFRJRCwKKyAqIGFuZCBhY3RpdmUtb3BlbiBUSUQgdGFibGVzIGZvciBhIG9mZmxvYWQgZGV2aWNlLgorICogVGhlIHRhYmxlcyB0aGVtc2VsdmVzIGFyZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCisgKi8KK3N0cnVjdCB0aWRfaW5mbyB7CisJc3RydWN0IHQzY190aWRfZW50cnkgKnRpZF90YWI7CisJdW5zaWduZWQgaW50IG50aWRzOworCWF0b21pY190IHRpZHNfaW5fdXNlOworCisJdW5pb24gbGlzdGVuX2VudHJ5ICpzdGlkX3RhYjsKKwl1bnNpZ25lZCBpbnQgbnN0aWRzOworCXVuc2lnbmVkIGludCBzdGlkX2Jhc2U7CisKKwl1bmlvbiBhY3RpdmVfb3Blbl9lbnRyeSAqYXRpZF90YWI7CisJdW5zaWduZWQgaW50IG5hdGlkczsKKwl1bnNpZ25lZCBpbnQgYXRpZF9iYXNlOworCisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIG1lbWJlcnMgYXJlIGFjY2Vzc2VkIFIvVyBzbyB3ZSBwdXQgdGhlbSBpbiB0aGVpciBvd24KKwkgKiBjYWNoZSBsaW5lcy4KKwkgKgorCSAqIFhYWCBXZSBjb3VsZCBjb21iaW5lIHRoZSBhdGlkIGZpZWxkcyBhYm92ZSB3aXRoIHRoZSBsb2NrIGhlcmUgc2luY2UKKwkgKiBhdGlkcyBhcmUgdXNlIG9uY2UgKHVubGlrZSBvdGhlciB0aWRzKS4gIE9UT0ggdGhlIGFib3ZlIGZpZWxkcyBhcmUKKwkgKiB1c3VhbGx5IGluIGNhY2hlIGR1ZSB0byB0aWRfdGFiLgorCSAqLworCXNwaW5sb2NrX3QgYXRpZF9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisJdW5pb24gYWN0aXZlX29wZW5fZW50cnkgKmFmcmVlOworCXVuc2lnbmVkIGludCBhdGlkc19pbl91c2U7CisKKwlzcGlubG9ja190IHN0aWRfbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisJdW5pb24gbGlzdGVuX2VudHJ5ICpzZnJlZTsKKwl1bnNpZ25lZCBpbnQgc3RpZHNfaW5fdXNlOworfTsKKworc3RydWN0IHQzY19kYXRhIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Rfbm9kZTsKKwlzdHJ1Y3QgdDNjZGV2ICpkZXY7CisJdW5zaWduZWQgaW50IHR4X21heF9jaHVuazsJLyogbWF4IHBheWxvYWQgZm9yIFRYX0RBVEEgKi8KKwl1bnNpZ25lZCBpbnQgbWF4X3dyczsJLyogbWF4IGluLWZsaWdodCBXUnMgcGVyIGNvbm5lY3Rpb24gKi8KKwl1bnNpZ25lZCBpbnQgbm10dXM7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgKm10dXM7CisJc3RydWN0IHRpZF9pbmZvIHRpZF9tYXBzOworCisJc3RydWN0IHQzY190aWRfZW50cnkgKnRpZF9yZWxlYXNlX2xpc3Q7CisJc3BpbmxvY2tfdCB0aWRfcmVsZWFzZV9sb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB0aWRfcmVsZWFzZV90YXNrOworfTsKKworLyoKKyAqIHQzY2RldiAtPiB0M2NfZGF0YSBhY2Nlc3NvcgorICovCisjZGVmaW5lIFQzQ19EQVRBKGRldikgKCooc3RydWN0IHQzY19kYXRhICoqKSYoZGV2KS0+bDRvcHQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvZmlybXdhcmVfZXhwb3J0cy5oIGIvZHJpdmVycy9uZXQvY3hnYjMvZmlybXdhcmVfZXhwb3J0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhODM1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9maXJtd2FyZV9leHBvcnRzLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfRklSTVdBUkVfRVhQT1JUU19IXworI2RlZmluZSBfRklSTVdBUkVfRVhQT1JUU19IXworCisvKiBXUiBPUENPREVTIHN1cHBvcnRlZCBieSB0aGUgZmlybXdhcmUuCisgKi8KKyNkZWZpbmUJRldfV1JPUENPREVfRk9SV0FSRAkJCTB4MDEKKyNkZWZpbmUgRldfV1JPUENPREVfQllQQVNTCQkJMHgwNQorCisjZGVmaW5lIEZXX1dST1BDT0RFX1RVTk5FTF9UWF9QS1QJCTB4MDMKKworI2RlZmluZSBGV19XUk9QT0NERV9VTFBUWF9EQVRBX1NHTAkJMHgwMAorI2RlZmluZSBGV19XUk9QQ09ERV9VTFBUWF9NRU1fUkVBRAkJMHgwMgorI2RlZmluZSBGV19XUk9QQ09ERV9VTFBUWF9QS1QJCQkweDA0CisjZGVmaW5lIEZXX1dST1BDT0RFX1VMUFRYX0lOVkFMSURBVEUJCTB4MDYKKworI2RlZmluZSBGV19XUk9QQ09ERV9UVU5ORUxfUlhfUEtUCQkweDA3CisKKyNkZWZpbmUgRldfV1JPUENPREVfT0ZMRF9HRVRUQ0JfUlBMCQkweDA4CisjZGVmaW5lIEZXX1dST1BDT0RFX09GTERfQ0xPU0VfQ09OCQkweDA5CisjZGVmaW5lIEZXX1dST1BDT0RFX09GTERfVFBfQUJPUlRfQ09OX1JFUQkweDBBCisjZGVmaW5lIEZXX1dST1BDT0RFX09GTERfSE9TVF9BQk9SVF9DT05fUlBMCTB4MEYKKyNkZWZpbmUgRldfV1JPUENPREVfT0ZMRF9IT1NUX0FCT1JUX0NPTl9SRVEJMHgwQgorI2RlZmluZSBGV19XUk9QQ09ERV9PRkxEX1RQX0FCT1JUX0NPTl9SUEwJMHgwQworI2RlZmluZSBGV19XUk9QQ09ERV9PRkxEX1RYX0RBVEEJCTB4MEQKKyNkZWZpbmUgRldfV1JPUENPREVfT0ZMRF9UWF9EQVRBX0FDSwkJMHgwRQorCisjZGVmaW5lIEZXX1dST1BDT0RFX1JJX1JETUFfSU5JVAkJMHgxMAorI2RlZmluZSBGV19XUk9QQ09ERV9SSV9SRE1BX1dSSVRFCQkweDExCisjZGVmaW5lIEZXX1dST1BDT0RFX1JJX1JETUFfUkVBRF9SRVEJCTB4MTIKKyNkZWZpbmUgRldfV1JPUENPREVfUklfUkRNQV9SRUFEX1JFU1AJCTB4MTMKKyNkZWZpbmUgRldfV1JPUENPREVfUklfU0VORAkJCTB4MTQKKyNkZWZpbmUgRldfV1JPUENPREVfUklfVEVSTUlOQVRFCQkweDE1CisjZGVmaW5lIEZXX1dST1BDT0RFX1JJX1JETUFfUkVBRAkJMHgxNgorI2RlZmluZSBGV19XUk9QQ09ERV9SSV9SRUNFSVZFCQkJMHgxNworI2RlZmluZSBGV19XUk9QQ09ERV9SSV9CSU5EX01XCQkJMHgxOAorI2RlZmluZSBGV19XUk9QQ09ERV9SSV9GQVNUUkVHSVNURVJfTVIJCTB4MTkKKyNkZWZpbmUgRldfV1JPUENPREVfUklfTE9DQUxfSU5WCQkweDFBCisjZGVmaW5lIEZXX1dST1BDT0RFX1JJX01PRElGWV9RUAkJMHgxQgorI2RlZmluZSBGV19XUk9QQ09ERV9SSV9CWVBBU1MJCQkweDFDCisKKyNkZWZpbmUgRldfV1JPUE9DREVfUlNWRAkJCTB4MUUKKworI2RlZmluZSBGV19XUk9QQ09ERV9TR0VfRUdSRVNTQ09OVEVYVF9SUgkweDFGCisKKyNkZWZpbmUgRldfV1JPUENPREVfTU5HVAkJCTB4MUQKKyNkZWZpbmUgRldfTU5HVE9QQ09ERV9QS1RTQ0hFRF9TRVQJCTB4MDAKKworLyogTWF4aW11bSBzaXplIG9mIGEgV1Igc2VudCBmcm9tIHRoZSBob3N0LCBsaW1pdGVkIGJ5IHRoZSBTR0UuIAorICoKKyAqIE5vdGU6IFdSIGNvbWluZyBmcm9tIFVMUCBvciBUUCBhcmUgb25seSBsaW1pdGVkIGJ5IENJTS4gCisgKi8KKyNkZWZpbmUgRldfV1JfU0laRQkJCTEyOAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBvdXRzdGFuZGluZyBXUnMgc2VudCBmcm9tIHRoZSBob3N0LiBWYWx1ZSBtdXN0IGJlCisgKiBwcm9ncmFtbWVkIGluIHRoZSBDVFJML1RVTk5FTC9RUCBTR0UgRWdyZXNzIENvbnRleHQgYW5kIHVzZWQgYnkgCisgKiBvZmZsb2FkIG1vZHVsZXMgdG8gbGltaXQgdGhlIG51bWJlciBvZiBXUnMgcGVyIGNvbm5lY3Rpb24uCisgKi8KKyNkZWZpbmUgRldfVDNfV1JfTlVNCQkJMTYKKyNkZWZpbmUgRldfTjNfV1JfTlVNCQkJNworCisjaWZuZGVmIE4zCisjIGRlZmluZSBGV19XUl9OVU0JCQlGV19UM19XUl9OVU0KKyNlbHNlCisjIGRlZmluZSBGV19XUl9OVU0JCQlGV19OM19XUl9OVU0KKyNlbmRpZgorCisvKiBGV19UVU5ORUxfTlVNIGNvcnJlc3BvbmRzIHRvIHRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIFRVTk5FTCBRdWV1ZXMuIFRoZXNlCisgKiBxdWV1ZXMgbXVzdCBzdGFydCBhdCBTR0UgRWdyZXNzIENvbnRleHQgRldfVFVOTkVMX1NHRUVDX1NUQVJUIGFuZCBtdXN0CisgKiBzdGFydCBhdCAnVElEJyAob3IgJ3VQIFRva2VuJykgRldfVFVOTkVMX1RJRF9TVEFSVC4KKyAqCisgKiBJbmdyZXNzIFRyYWZmaWMgKGUuZy4gRE1BIGNvbXBsZXRpb24gY3JlZGl0KSAgZm9yIFRVTk5FTCBRdWV1ZVtpXSBpcyBzZW50IAorICogdG8gUkVTUCBRdWV1ZVtpXS4KKyAqLworI2RlZmluZSBGV19UVU5ORUxfTlVNCQkJOAorI2RlZmluZSBGV19UVU5ORUxfU0dFRUNfU1RBUlQJCTgKKyNkZWZpbmUgRldfVFVOTkVMX1RJRF9TVEFSVAkJNjU1NDQKKworLyogRldfQ1RSTF9OVU0gY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZiBzdXBwb3J0ZWQgQ1RSTCBRdWV1ZXMuIFRoZXNlIHF1ZXVlcworICogbXVzdCBzdGFydCBhdCBTR0UgRWdyZXNzIENvbnRleHQgRldfQ1RSTF9TR0VFQ19TVEFSVCBhbmQgbXVzdCBzdGFydCBhdCAnVElEJworICogKG9yICd1UCBUb2tlbicpIEZXX0NUUkxfVElEX1NUQVJULgorICoKKyAqIEluZ3Jlc3MgVHJhZmZpYyBmb3IgQ1RSTCBRdWV1ZVtpXSBpcyBzZW50IHRvIFJFU1AgUXVldWVbaV0uCisgKi8KKyNkZWZpbmUgRldfQ1RSTF9OVU0JCQk4CisjZGVmaW5lIEZXX0NUUkxfU0dFRUNfU1RBUlQJCTY1NTI4CisjZGVmaW5lIEZXX0NUUkxfVElEX1NUQVJUCQk2NTUzNgorCisvKiBGV19PRkxEX05VTSBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIHN1cHBvcnRlZCBPRkZMT0FEIFF1ZXVlcy4gVGhlc2UgCisgKiBxdWV1ZXMgbXVzdCBzdGFydCBhdCBTR0UgRWdyZXNzIENvbnRleHQgRldfT0ZMRF9TR0VFQ19TVEFSVC4gCisgKiAKKyAqIE5vdGU6IHRoZSAndVAgVG9rZW4nIGluIHRoZSBTR0UgRWdyZXNzIENvbnRleHQgZmllbGRzIGlzIGlycmVsZXZhbnQgZm9yIAorICogT0ZGTE9BRCBRdWV1ZXMsIGFzIHRoZSBob3N0IGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgdGhlIGNvcnJlY3QgVElEIGluCisgKiBldmVyeSBXUi4KKyAqCisgKiBJbmdyZXNzIFRyYWZmZmljIGZvciBPRkZMT0FEIFF1ZXVlW2ldIGlzIHNlbnQgdG8gUkVTUCBRdWV1ZVtpXS4KKyAqLworI2RlZmluZSBGV19PRkxEX05VTQkJCTgKKyNkZWZpbmUgRldfT0ZMRF9TR0VFQ19TVEFSVAkJMAorCisvKgorICogCisgKi8KKyNkZWZpbmUgRldfUklfTlVNCQkJMQorI2RlZmluZSBGV19SSV9TR0VFQ19TVEFSVAkJNjU1MjcKKyNkZWZpbmUgRldfUklfVElEX1NUQVJUCQkJNjU1NTIKKworLyoKKyAqIFRoZSBSWF9QS1RfVElEIAorICovCisjZGVmaW5lIEZXX1JYX1BLVF9OVU0JCQkxCisjZGVmaW5lIEZXX1JYX1BLVF9USURfU1RBUlQJCTY1NTUzCisKKy8qIEZXX1dSQ19OVU0gY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZiBXb3JrIFJlcXVlc3QgQ29udGV4dCB0aGF0IHN1cHBvcnRlZAorICogYnkgdGhlIGZpcm13YXJlLgorICovCisjZGVmaW5lIEZXX1dSQ19OVU0JCQlcCisgICAgKDY1NTM2ICsgRldfVFVOTkVMX05VTSArIEZXX0NUUkxfTlVNICsgRldfUklfTlVNICsgRldfUlhfUEtUX05VTSkKKworLyoKKyAqIEZXIHR5cGUgYW5kIHZlcnNpb24uCisgKi8KKyNkZWZpbmUgU19GV19WRVJTSU9OX1RZUEUJCTI4CisjZGVmaW5lIE1fRldfVkVSU0lPTl9UWVBFCQkweEYKKyNkZWZpbmUgVl9GV19WRVJTSU9OX1RZUEUoeCkJCSgoeCkgPDwgU19GV19WRVJTSU9OX1RZUEUpCisjZGVmaW5lIEdfRldfVkVSU0lPTl9UWVBFKHgpCQlcCisgICAgKCgoeCkgPj4gU19GV19WRVJTSU9OX1RZUEUpICYgTV9GV19WRVJTSU9OX1RZUEUpCisKKyNkZWZpbmUgU19GV19WRVJTSU9OX01BSk9SCQkxNgorI2RlZmluZSBNX0ZXX1ZFUlNJT05fTUFKT1IJCTB4RkZGCisjZGVmaW5lIFZfRldfVkVSU0lPTl9NQUpPUih4KQkJKCh4KSA8PCBTX0ZXX1ZFUlNJT05fTUFKT1IpCisjZGVmaW5lIEdfRldfVkVSU0lPTl9NQUpPUih4KQkJXAorICAgICgoKHgpID4+IFNfRldfVkVSU0lPTl9NQUpPUikgJiBNX0ZXX1ZFUlNJT05fTUFKT1IpCisKKyNkZWZpbmUgU19GV19WRVJTSU9OX01JTk9SCQk4CisjZGVmaW5lIE1fRldfVkVSU0lPTl9NSU5PUgkJMHhGRgorI2RlZmluZSBWX0ZXX1ZFUlNJT05fTUlOT1IoeCkJCSgoeCkgPDwgU19GV19WRVJTSU9OX01JTk9SKQorI2RlZmluZSBHX0ZXX1ZFUlNJT05fTUlOT1IoeCkJCVwKKyAgICAoKCh4KSA+PiBTX0ZXX1ZFUlNJT05fTUlOT1IpICYgTV9GV19WRVJTSU9OX01JTk9SKQorCisjZGVmaW5lIFNfRldfVkVSU0lPTl9NSUNSTwkJMAorI2RlZmluZSBNX0ZXX1ZFUlNJT05fTUlDUk8JCTB4RkYKKyNkZWZpbmUgVl9GV19WRVJTSU9OX01JQ1JPKHgpCQkoKHgpIDw8IFNfRldfVkVSU0lPTl9NSUNSTykKKyNkZWZpbmUgR19GV19WRVJTSU9OX01JQ1JPKHgpCQlcCisgICAgKCgoeCkgPj4gU19GV19WRVJTSU9OX01JQ1JPKSAmIE1fRldfVkVSU0lPTl9NSUNSTykKKworI2VuZGlmCQkJCS8qIF9GSVJNV0FSRV9FWFBPUlRTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9sMnQuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL2wydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMGNiODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9sMnQuYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IE9wZW4gR3JpZCBDb21wdXRpbmcsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAidDNjZGV2LmgiCisjaW5jbHVkZSAiY3hnYjNfZGVmcy5oIgorI2luY2x1ZGUgImwydC5oIgorI2luY2x1ZGUgInQzX2NwbC5oIgorI2luY2x1ZGUgImZpcm13YXJlX2V4cG9ydHMuaCIKKworI2RlZmluZSBWTEFOX05PTkUgMHhmZmYKKworLyoKKyAqIE1vZHVsZSBsb2NraW5nIG5vdGVzOiAgVGhlcmUgaXMgYSBSVyBsb2NrIHByb3RlY3RpbmcgdGhlIEwyIHRhYmxlIGFzIGEKKyAqIHdob2xlIHBsdXMgYSBzcGlubG9jayBwZXIgTDJUIGVudHJ5LiAgRW50cnkgbG9va3VwcyBhbmQgYWxsb2NhdGlvbnMgaGFwcGVuCisgKiB1bmRlciB0aGUgcHJvdGVjdGlvbiBvZiB0aGUgdGFibGUgbG9jaywgaW5kaXZpZHVhbCBlbnRyeSBjaGFuZ2VzIGhhcHBlbgorICogd2hpbGUgaG9sZGluZyB0aGF0IGVudHJ5J3Mgc3BpbmxvY2suICBUaGUgdGFibGUgbG9jayBuZXN0cyBvdXRzaWRlIHRoZQorICogZW50cnkgbG9ja3MuICBBbGxvY2F0aW9ucyBvZiBuZXcgZW50cmllcyB0YWtlIHRoZSB0YWJsZSBsb2NrIGFzIHdyaXRlcnMgc28KKyAqIG5vIG90aGVyIGxvb2t1cHMgY2FuIGhhcHBlbiB3aGlsZSBhbGxvY2F0aW5nIG5ldyBlbnRyaWVzLiAgRW50cnkgdXBkYXRlcworICogdGFrZSB0aGUgdGFibGUgbG9jayBhcyByZWFkZXJzIHNvIG11bHRpcGxlIGVudHJpZXMgY2FuIGJlIHVwZGF0ZWQgaW4KKyAqIHBhcmFsbGVsLiAgQW4gTDJUIGVudHJ5IGNhbiBiZSBkcm9wcGVkIGJ5IGRlY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50CisgKiBhbmQgdGhlcmVmb3JlIGNhbiBoYXBwZW4gaW4gcGFyYWxsZWwgd2l0aCBlbnRyeSBhbGxvY2F0aW9uIGJ1dCBubyBlbnRyeQorICogY2FuIGNoYW5nZSBzdGF0ZSBvciBpbmNyZW1lbnQgaXRzIHJlZiBjb3VudCBkdXJpbmcgYWxsb2NhdGlvbiBhcyBib3RoIG9mCisgKiB0aGVzZSBwZXJmb3JtIGxvb2t1cHMuCisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdmxhbl9wcmlvKGNvbnN0IHN0cnVjdCBsMnRfZW50cnkgKmUpCit7CisJcmV0dXJuIGUtPnZsYW4gPj4gMTM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFycF9oYXNoKHUzMiBrZXksIGludCBpZmluZGV4LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbDJ0X2RhdGEgKmQpCit7CisJcmV0dXJuIGpoYXNoXzJ3b3JkcyhrZXksIGlmaW5kZXgsIDApICYgKGQtPm5lbnRyaWVzIC0gMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZWlnaF9yZXBsYWNlKHN0cnVjdCBsMnRfZW50cnkgKmUsIHN0cnVjdCBuZWlnaGJvdXIgKm4pCit7CisJbmVpZ2hfaG9sZChuKTsKKwlpZiAoZS0+bmVpZ2gpCisJCW5laWdoX3JlbGVhc2UoZS0+bmVpZ2gpOworCWUtPm5laWdoID0gbjsKK30KKworLyoKKyAqIFNldCB1cCBhbiBMMlQgZW50cnkgYW5kIHNlbmQgYW55IHBhY2tldHMgd2FpdGluZyBpbiB0aGUgYXJwIHF1ZXVlLiAgVGhlCisgKiBzdXBwbGllZCBza2IgaXMgdXNlZCBmb3IgdGhlIENQTF9MMlRfV1JJVEVfUkVRLiAgTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUKKyAqIGVudHJ5IGxvY2tlZC4KKyAqLworc3RhdGljIGludCBzZXR1cF9sMmVfc2VuZF9wZW5kaW5nKHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBsMnRfZW50cnkgKmUpCit7CisJc3RydWN0IGNwbF9sMnRfd3JpdGVfcmVxICpyZXE7CisKKwlpZiAoIXNrYikgeworCQlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKCpyZXEpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXEgPSAoc3RydWN0IGNwbF9sMnRfd3JpdGVfcmVxICopX19za2JfcHV0KHNrYiwgc2l6ZW9mKCpyZXEpKTsKKwlyZXEtPndyLndyX2hpID0gaHRvbmwoVl9XUl9PUChGV19XUk9QQ09ERV9GT1JXQVJEKSk7CisJT1BDT0RFX1RJRChyZXEpID0gaHRvbmwoTUtfT1BDT0RFX1RJRChDUExfTDJUX1dSSVRFX1JFUSwgZS0+aWR4KSk7CisJcmVxLT5wYXJhbXMgPSBodG9ubChWX0wyVF9XX0lEWChlLT5pZHgpIHwgVl9MMlRfV19JRkYoZS0+c210X2lkeCkgfAorCQkJICAgIFZfTDJUX1dfVkxBTihlLT52bGFuICYgVkxBTl9WSURfTUFTSykgfAorCQkJICAgIFZfTDJUX1dfUFJJTyh2bGFuX3ByaW8oZSkpKTsKKwltZW1jcHkoZS0+ZG1hYywgZS0+bmVpZ2gtPmhhLCBzaXplb2YoZS0+ZG1hYykpOworCW1lbWNweShyZXEtPmRzdF9tYWMsIGUtPmRtYWMsIHNpemVvZihyZXEtPmRzdF9tYWMpKTsKKwlza2ItPnByaW9yaXR5ID0gQ1BMX1BSSU9SSVRZX0NPTlRST0w7CisJY3hnYjNfb2ZsZF9zZW5kKGRldiwgc2tiKTsKKwl3aGlsZSAoZS0+YXJwcV9oZWFkKSB7CisJCXNrYiA9IGUtPmFycHFfaGVhZDsKKwkJZS0+YXJwcV9oZWFkID0gc2tiLT5uZXh0OworCQlza2ItPm5leHQgPSBOVUxMOworCQljeGdiM19vZmxkX3NlbmQoZGV2LCBza2IpOworCX0KKwllLT5hcnBxX3RhaWwgPSBOVUxMOworCWUtPnN0YXRlID0gTDJUX1NUQVRFX1ZBTElEOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQgYSBwYWNrZXQgdG8gdGhlIGFuIEwyVCBlbnRyeSdzIHF1ZXVlIG9mIHBhY2tldHMgYXdhaXRpbmcgcmVzb2x1dGlvbi4KKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGVudHJ5J3MgbG9jayBoZWxkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXJwcV9lbnF1ZXVlKHN0cnVjdCBsMnRfZW50cnkgKmUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc2tiLT5uZXh0ID0gTlVMTDsKKwlpZiAoZS0+YXJwcV9oZWFkKQorCQllLT5hcnBxX3RhaWwtPm5leHQgPSBza2I7CisJZWxzZQorCQllLT5hcnBxX2hlYWQgPSBza2I7CisJZS0+YXJwcV90YWlsID0gc2tiOworfQorCitpbnQgdDNfbDJ0X3NlbmRfc2xvdyhzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgc3RydWN0IGwydF9lbnRyeSAqZSkKK3sKK2FnYWluOgorCXN3aXRjaCAoZS0+c3RhdGUpIHsKKwljYXNlIEwyVF9TVEFURV9TVEFMRToJLyogZW50cnkgaXMgc3RhbGUsIGtpY2sgb2ZmIHJldmFsaWRhdGlvbiAqLworCQluZWlnaF9ldmVudF9zZW5kKGUtPm5laWdoLCBOVUxMKTsKKwkJc3Bpbl9sb2NrX2JoKCZlLT5sb2NrKTsKKwkJaWYgKGUtPnN0YXRlID09IEwyVF9TVEFURV9TVEFMRSkKKwkJCWUtPnN0YXRlID0gTDJUX1NUQVRFX1ZBTElEOworCQlzcGluX3VubG9ja19iaCgmZS0+bG9jayk7CisJY2FzZSBMMlRfU1RBVEVfVkFMSUQ6CS8qIGZhc3QtcGF0aCwgc2VuZCB0aGUgcGFja2V0IG9uICovCisJCXJldHVybiBjeGdiM19vZmxkX3NlbmQoZGV2LCBza2IpOworCWNhc2UgTDJUX1NUQVRFX1JFU09MVklORzoKKwkJc3Bpbl9sb2NrX2JoKCZlLT5sb2NrKTsKKwkJaWYgKGUtPnN0YXRlICE9IEwyVF9TVEFURV9SRVNPTFZJTkcpIHsKKwkJCS8qIEFSUCBhbHJlYWR5IGNvbXBsZXRlZCAqLworCQkJc3Bpbl91bmxvY2tfYmgoJmUtPmxvY2spOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlhcnBxX2VucXVldWUoZSwgc2tiKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmUtPmxvY2spOworCisJCS8qCisJCSAqIE9ubHkgdGhlIGZpcnN0IHBhY2tldCBhZGRlZCB0byB0aGUgYXJwcSBzaG91bGQga2ljayBvZmYKKwkJICogcmVzb2x1dGlvbi4gIEhvd2V2ZXIsIGJlY2F1c2UgdGhlIGFsbG9jX3NrYiBiZWxvdyBjYW4gZmFpbCwKKwkJICogd2UgYWxsb3cgZWFjaCBwYWNrZXQgYWRkZWQgdG8gdGhlIGFycHEgdG8gcmV0cnkgcmVzb2x1dGlvbgorCQkgKiBhcyBhIHdheSBvZiByZWNvdmVyaW5nIGZyb20gdHJhbnNpZW50IG1lbW9yeSBleGhhdXN0aW9uLgorCQkgKiBBIGJldHRlciB3YXkgd291bGQgYmUgdG8gdXNlIGEgd29yayByZXF1ZXN0IHRvIHJldHJ5IEwyVAorCQkgKiBlbnRyaWVzIHdoZW4gdGhlcmUncyBubyBtZW1vcnkuCisJCSAqLworCQlpZiAoIW5laWdoX2V2ZW50X3NlbmQoZS0+bmVpZ2gsIE5VTEwpKSB7CisJCQlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBjcGxfbDJ0X3dyaXRlX3JlcSksCisJCQkJCUdGUF9BVE9NSUMpOworCQkJaWYgKCFza2IpCisJCQkJYnJlYWs7CisKKwkJCXNwaW5fbG9ja19iaCgmZS0+bG9jayk7CisJCQlpZiAoZS0+YXJwcV9oZWFkKQorCQkJCXNldHVwX2wyZV9zZW5kX3BlbmRpbmcoZGV2LCBza2IsIGUpOworCQkJZWxzZQkvKiB3ZSBsb3N0IHRoZSByYWNlICovCisJCQkJX19rZnJlZV9za2Ioc2tiKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZlLT5sb2NrKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTCh0M19sMnRfc2VuZF9zbG93KTsKKwordm9pZCB0M19sMnRfc2VuZF9ldmVudChzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBsMnRfZW50cnkgKmUpCit7CithZ2FpbjoKKwlzd2l0Y2ggKGUtPnN0YXRlKSB7CisJY2FzZSBMMlRfU1RBVEVfU1RBTEU6CS8qIGVudHJ5IGlzIHN0YWxlLCBraWNrIG9mZiByZXZhbGlkYXRpb24gKi8KKwkJbmVpZ2hfZXZlbnRfc2VuZChlLT5uZWlnaCwgTlVMTCk7CisJCXNwaW5fbG9ja19iaCgmZS0+bG9jayk7CisJCWlmIChlLT5zdGF0ZSA9PSBMMlRfU1RBVEVfU1RBTEUpIHsKKwkJCWUtPnN0YXRlID0gTDJUX1NUQVRFX1ZBTElEOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZlLT5sb2NrKTsKKwkJcmV0dXJuOworCWNhc2UgTDJUX1NUQVRFX1ZBTElEOgkvKiBmYXN0LXBhdGgsIHNlbmQgdGhlIHBhY2tldCBvbiAqLworCQlyZXR1cm47CisJY2FzZSBMMlRfU1RBVEVfUkVTT0xWSU5HOgorCQlzcGluX2xvY2tfYmgoJmUtPmxvY2spOworCQlpZiAoZS0+c3RhdGUgIT0gTDJUX1NUQVRFX1JFU09MVklORykgeworCQkJLyogQVJQIGFscmVhZHkgY29tcGxldGVkICovCisJCQlzcGluX3VubG9ja19iaCgmZS0+bG9jayk7CisJCQlnb3RvIGFnYWluOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZlLT5sb2NrKTsKKworCQkvKgorCQkgKiBPbmx5IHRoZSBmaXJzdCBwYWNrZXQgYWRkZWQgdG8gdGhlIGFycHEgc2hvdWxkIGtpY2sgb2ZmCisJCSAqIHJlc29sdXRpb24uICBIb3dldmVyLCBiZWNhdXNlIHRoZSBhbGxvY19za2IgYmVsb3cgY2FuIGZhaWwsCisJCSAqIHdlIGFsbG93IGVhY2ggcGFja2V0IGFkZGVkIHRvIHRoZSBhcnBxIHRvIHJldHJ5IHJlc29sdXRpb24KKwkJICogYXMgYSB3YXkgb2YgcmVjb3ZlcmluZyBmcm9tIHRyYW5zaWVudCBtZW1vcnkgZXhoYXVzdGlvbi4KKwkJICogQSBiZXR0ZXIgd2F5IHdvdWxkIGJlIHRvIHVzZSBhIHdvcmsgcmVxdWVzdCB0byByZXRyeSBMMlQKKwkJICogZW50cmllcyB3aGVuIHRoZXJlJ3Mgbm8gbWVtb3J5LgorCQkgKi8KKwkJbmVpZ2hfZXZlbnRfc2VuZChlLT5uZWlnaCwgTlVMTCk7CisJfQorCXJldHVybjsKK30KKworRVhQT1JUX1NZTUJPTCh0M19sMnRfc2VuZF9ldmVudCk7CisKKy8qCisgKiBBbGxvY2F0ZSBhIGZyZWUgTDJUIGVudHJ5LiAgTXVzdCBiZSBjYWxsZWQgd2l0aCBsMnRfZGF0YS5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbDJ0X2VudHJ5ICphbGxvY19sMmUoc3RydWN0IGwydF9kYXRhICpkKQoreworCXN0cnVjdCBsMnRfZW50cnkgKmVuZCwgKmUsICoqcDsKKworCWlmICghYXRvbWljX3JlYWQoJmQtPm5mcmVlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiB0aGVyZSdzIGRlZmluaXRlbHkgYSBmcmVlIGVudHJ5ICovCisJZm9yIChlID0gZC0+cm92ZXIsIGVuZCA9ICZkLT5sMnRhYltkLT5uZW50cmllc107IGUgIT0gZW5kOyArK2UpCisJCWlmIChhdG9taWNfcmVhZCgmZS0+cmVmY250KSA9PSAwKQorCQkJZ290byBmb3VuZDsKKworCWZvciAoZSA9ICZkLT5sMnRhYlsxXTsgYXRvbWljX3JlYWQoJmUtPnJlZmNudCk7ICsrZSkgOworZm91bmQ6CisJZC0+cm92ZXIgPSBlICsgMTsKKwlhdG9taWNfZGVjKCZkLT5uZnJlZSk7CisKKwkvKgorCSAqIFRoZSBlbnRyeSB3ZSBmb3VuZCBtYXkgYmUgYW4gaW5hY3RpdmUgZW50cnkgdGhhdCBpcworCSAqIHByZXNlbnRseSBpbiB0aGUgaGFzaCB0YWJsZS4gIFdlIG5lZWQgdG8gcmVtb3ZlIGl0LgorCSAqLworCWlmIChlLT5zdGF0ZSAhPSBMMlRfU1RBVEVfVU5VU0VEKSB7CisJCWludCBoYXNoID0gYXJwX2hhc2goZS0+YWRkciwgZS0+aWZpbmRleCwgZCk7CisKKwkJZm9yIChwID0gJmQtPmwydGFiW2hhc2hdLmZpcnN0OyAqcDsgcCA9ICYoKnApLT5uZXh0KQorCQkJaWYgKCpwID09IGUpIHsKKwkJCQkqcCA9IGUtPm5leHQ7CisJCQkJYnJlYWs7CisJCQl9CisJCWUtPnN0YXRlID0gTDJUX1NUQVRFX1VOVVNFRDsKKwl9CisJcmV0dXJuIGU7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhbiBMMlQgZW50cnkgaGFzIG5vIG1vcmUgdXNlcnMuICBUaGUgZW50cnkgaXMgbGVmdCBpbiB0aGUgaGFzaAorICogdGFibGUgc2luY2UgaXQgaXMgbGlrZWx5IHRvIGJlIHJldXNlZCBidXQgd2UgYWxzbyBidW1wIG5mcmVlIHRvIGluZGljYXRlCisgKiB0aGF0IHRoZSBlbnRyeSBjYW4gYmUgcmVhbGxvY2F0ZWQgZm9yIGEgZGlmZmVyZW50IG5laWdoYm9yLiAgV2UgYWxzbyBkcm9wCisgKiB0aGUgZXhpc3RpbmcgbmVpZ2hib3IgcmVmZXJlbmNlIGluIGNhc2UgdGhlIG5laWdoYm9yIGlzIGdvaW5nIGF3YXkgYW5kIGlzCisgKiB3YWl0aW5nIG9uIG91ciByZWZlcmVuY2UuCisgKgorICogQmVjYXVzZSBlbnRyaWVzIGNhbiBiZSByZWFsbG9jYXRlZCB0byBvdGhlciBuZWlnaGJvcnMgb25jZSB0aGVpciByZWYgY291bnQKKyAqIGRyb3BzIHRvIDAgd2UgbmVlZCB0byB0YWtlIHRoZSBlbnRyeSdzIGxvY2sgdG8gYXZvaWQgcmFjZXMgd2l0aCBhIG5ldworICogaW5jYXJuYXRpb24uCisgKi8KK3ZvaWQgdDNfbDJlX2ZyZWUoc3RydWN0IGwydF9kYXRhICpkLCBzdHJ1Y3QgbDJ0X2VudHJ5ICplKQoreworCXNwaW5fbG9ja19iaCgmZS0+bG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZlLT5yZWZjbnQpID09IDApIHsJLyogaGFzbid0IGJlZW4gcmVjeWNsZWQgKi8KKwkJaWYgKGUtPm5laWdoKSB7CisJCQluZWlnaF9yZWxlYXNlKGUtPm5laWdoKTsKKwkJCWUtPm5laWdoID0gTlVMTDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmZS0+bG9jayk7CisJYXRvbWljX2luYygmZC0+bmZyZWUpOworfQorCitFWFBPUlRfU1lNQk9MKHQzX2wyZV9mcmVlKTsKKworLyoKKyAqIFVwZGF0ZSBhbiBMMlQgZW50cnkgdGhhdCB3YXMgcHJldmlvdXNseSB1c2VkIGZvciB0aGUgc2FtZSBuZXh0IGhvcCBhcyBuZWlnaC4KKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggc29mdGlycXMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZXVzZV9lbnRyeShzdHJ1Y3QgbDJ0X2VudHJ5ICplLCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKK3sKKwl1bnNpZ25lZCBpbnQgbnVkX3N0YXRlOworCisJc3Bpbl9sb2NrKCZlLT5sb2NrKTsJLyogYXZvaWQgcmFjZSB3aXRoIHQzX2wydF9mcmVlICovCisKKwlpZiAobmVpZ2ggIT0gZS0+bmVpZ2gpCisJCW5laWdoX3JlcGxhY2UoZSwgbmVpZ2gpOworCW51ZF9zdGF0ZSA9IG5laWdoLT5udWRfc3RhdGU7CisJaWYgKG1lbWNtcChlLT5kbWFjLCBuZWlnaC0+aGEsIHNpemVvZihlLT5kbWFjKSkgfHwKKwkgICAgIShudWRfc3RhdGUgJiBOVURfVkFMSUQpKQorCQllLT5zdGF0ZSA9IEwyVF9TVEFURV9SRVNPTFZJTkc7CisJZWxzZSBpZiAobnVkX3N0YXRlICYgTlVEX0NPTk5FQ1RFRCkKKwkJZS0+c3RhdGUgPSBMMlRfU1RBVEVfVkFMSUQ7CisJZWxzZQorCQllLT5zdGF0ZSA9IEwyVF9TVEFURV9TVEFMRTsKKwlzcGluX3VubG9jaygmZS0+bG9jayk7Cit9CisKK3N0cnVjdCBsMnRfZW50cnkgKnQzX2wydF9nZXQoc3RydWN0IHQzY2RldiAqY2Rldiwgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCisJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGwydF9lbnRyeSAqZTsKKwlzdHJ1Y3QgbDJ0X2RhdGEgKmQgPSBMMkRBVEEoY2Rldik7CisJdTMyIGFkZHIgPSAqKHUzMiAqKSBuZWlnaC0+cHJpbWFyeV9rZXk7CisJaW50IGlmaWR4ID0gbmVpZ2gtPmRldi0+aWZpbmRleDsKKwlpbnQgaGFzaCA9IGFycF9oYXNoKGFkZHIsIGlmaWR4LCBkKTsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgc210X2lkeCA9IHAtPnBvcnRfaWQ7CisKKwl3cml0ZV9sb2NrX2JoKCZkLT5sb2NrKTsKKwlmb3IgKGUgPSBkLT5sMnRhYltoYXNoXS5maXJzdDsgZTsgZSA9IGUtPm5leHQpCisJCWlmIChlLT5hZGRyID09IGFkZHIgJiYgZS0+aWZpbmRleCA9PSBpZmlkeCAmJgorCQkgICAgZS0+c210X2lkeCA9PSBzbXRfaWR4KSB7CisJCQlsMnRfaG9sZChkLCBlKTsKKwkJCWlmIChhdG9taWNfcmVhZCgmZS0+cmVmY250KSA9PSAxKQorCQkJCXJldXNlX2VudHJ5KGUsIG5laWdoKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJLyogTmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBlbnRyeSAqLworCWUgPSBhbGxvY19sMmUoZCk7CisJaWYgKGUpIHsKKwkJc3Bpbl9sb2NrKCZlLT5sb2NrKTsJLyogYXZvaWQgcmFjZSB3aXRoIHQzX2wydF9mcmVlICovCisJCWUtPm5leHQgPSBkLT5sMnRhYltoYXNoXS5maXJzdDsKKwkJZC0+bDJ0YWJbaGFzaF0uZmlyc3QgPSBlOworCQllLT5zdGF0ZSA9IEwyVF9TVEFURV9SRVNPTFZJTkc7CisJCWUtPmFkZHIgPSBhZGRyOworCQllLT5pZmluZGV4ID0gaWZpZHg7CisJCWUtPnNtdF9pZHggPSBzbXRfaWR4OworCQlhdG9taWNfc2V0KCZlLT5yZWZjbnQsIDEpOworCQluZWlnaF9yZXBsYWNlKGUsIG5laWdoKTsKKwkJaWYgKG5laWdoLT5kZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pCisJCQllLT52bGFuID0gVkxBTl9ERVZfSU5GTyhuZWlnaC0+ZGV2KS0+dmxhbl9pZDsKKwkJZWxzZQorCQkJZS0+dmxhbiA9IFZMQU5fTk9ORTsKKwkJc3Bpbl91bmxvY2soJmUtPmxvY2spOworCX0KK2RvbmU6CisJd3JpdGVfdW5sb2NrX2JoKCZkLT5sb2NrKTsKKwlyZXR1cm4gZTsKK30KKworRVhQT1JUX1NZTUJPTCh0M19sMnRfZ2V0KTsKKworLyoKKyAqIENhbGxlZCB3aGVuIGFkZHJlc3MgcmVzb2x1dGlvbiBmYWlscyBmb3IgYW4gTDJUIGVudHJ5IHRvIGhhbmRsZSBwYWNrZXRzCisgKiBvbiB0aGUgYXJwcSBoZWFkLiAgSWYgYSBwYWNrZXQgc3BlY2lmaWVzIGEgZmFpbHVyZSBoYW5kbGVyIGl0IGlzIGludm9rZWQsCisgKiBvdGhlcndpc2UgdGhlIHBhY2tldHMgaXMgc2VudCB0byB0aGUgb2ZmbG9hZCBkZXZpY2UuCisgKgorICogWFhYOiBtYXliZSB3ZSBzaG91bGQgYWJhbmRvbiB0aGUgbGF0dGVyIGJlaGF2aW9yIGFuZCBqdXN0IHJlcXVpcmUgYSBmYWlsdXJlCisgKiBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBoYW5kbGVfZmFpbGVkX3Jlc29sdXRpb24oc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqYXJwcSkKK3sKKwl3aGlsZSAoYXJwcSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYXJwcTsKKwkJc3RydWN0IGwydF9za2JfY2IgKmNiID0gTDJUX1NLQl9DQihza2IpOworCisJCWFycHEgPSBza2ItPm5leHQ7CisJCXNrYi0+bmV4dCA9IE5VTEw7CisJCWlmIChjYi0+YXJwX2ZhaWx1cmVfaGFuZGxlcikKKwkJCWNiLT5hcnBfZmFpbHVyZV9oYW5kbGVyKGRldiwgc2tiKTsKKwkJZWxzZQorCQkJY3hnYjNfb2ZsZF9zZW5kKGRldiwgc2tiKTsKKwl9Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgaG9zdCdzIEFSUCBsYXllciBtYWtlcyBhIGNoYW5nZSB0byBzb21lIGVudHJ5IHRoYXQgaXMKKyAqIGxvYWRlZCBpbnRvIHRoZSBIVyBMMiB0YWJsZS4KKyAqLwordm9pZCB0M19sMnRfdXBkYXRlKHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gpCit7CisJc3RydWN0IGwydF9lbnRyeSAqZTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqYXJwcSA9IE5VTEw7CisJc3RydWN0IGwydF9kYXRhICpkID0gTDJEQVRBKGRldik7CisJdTMyIGFkZHIgPSAqKHUzMiAqKSBuZWlnaC0+cHJpbWFyeV9rZXk7CisJaW50IGlmaWR4ID0gbmVpZ2gtPmRldi0+aWZpbmRleDsKKwlpbnQgaGFzaCA9IGFycF9oYXNoKGFkZHIsIGlmaWR4LCBkKTsKKworCXJlYWRfbG9ja19iaCgmZC0+bG9jayk7CisJZm9yIChlID0gZC0+bDJ0YWJbaGFzaF0uZmlyc3Q7IGU7IGUgPSBlLT5uZXh0KQorCQlpZiAoZS0+YWRkciA9PSBhZGRyICYmIGUtPmlmaW5kZXggPT0gaWZpZHgpIHsKKwkJCXNwaW5fbG9jaygmZS0+bG9jayk7CisJCQlnb3RvIGZvdW5kOworCQl9CisJcmVhZF91bmxvY2tfYmgoJmQtPmxvY2spOworCXJldHVybjsKKworZm91bmQ6CisJcmVhZF91bmxvY2soJmQtPmxvY2spOworCWlmIChhdG9taWNfcmVhZCgmZS0+cmVmY250KSkgeworCQlpZiAobmVpZ2ggIT0gZS0+bmVpZ2gpCisJCQluZWlnaF9yZXBsYWNlKGUsIG5laWdoKTsKKworCQlpZiAoZS0+c3RhdGUgPT0gTDJUX1NUQVRFX1JFU09MVklORykgeworCQkJaWYgKG5laWdoLT5udWRfc3RhdGUgJiBOVURfRkFJTEVEKSB7CisJCQkJYXJwcSA9IGUtPmFycHFfaGVhZDsKKwkJCQllLT5hcnBxX2hlYWQgPSBlLT5hcnBxX3RhaWwgPSBOVUxMOworCQkJfSBlbHNlIGlmIChuZWlnaF9pc19jb25uZWN0ZWQobmVpZ2gpKQorCQkJCXNldHVwX2wyZV9zZW5kX3BlbmRpbmcoZGV2LCBOVUxMLCBlKTsKKwkJfSBlbHNlIHsKKwkJCWUtPnN0YXRlID0gbmVpZ2hfaXNfY29ubmVjdGVkKG5laWdoKSA/CisJCQkgICAgTDJUX1NUQVRFX1ZBTElEIDogTDJUX1NUQVRFX1NUQUxFOworCQkJaWYgKG1lbWNtcChlLT5kbWFjLCBuZWlnaC0+aGEsIDYpKQorCQkJCXNldHVwX2wyZV9zZW5kX3BlbmRpbmcoZGV2LCBOVUxMLCBlKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmZS0+bG9jayk7CisKKwlpZiAoYXJwcSkKKwkJaGFuZGxlX2ZhaWxlZF9yZXNvbHV0aW9uKGRldiwgYXJwcSk7Cit9CisKK3N0cnVjdCBsMnRfZGF0YSAqdDNfaW5pdF9sMnQodW5zaWduZWQgaW50IGwydF9jYXBhY2l0eSkKK3sKKwlzdHJ1Y3QgbDJ0X2RhdGEgKmQ7CisJaW50IGksIHNpemUgPSBzaXplb2YoKmQpICsgbDJ0X2NhcGFjaXR5ICogc2l6ZW9mKHN0cnVjdCBsMnRfZW50cnkpOworCisJZCA9IGN4Z2JfYWxsb2NfbWVtKHNpemUpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlkLT5uZW50cmllcyA9IGwydF9jYXBhY2l0eTsKKwlkLT5yb3ZlciA9ICZkLT5sMnRhYlsxXTsJLyogZW50cnkgMCBpcyBub3QgdXNlZCAqLworCWF0b21pY19zZXQoJmQtPm5mcmVlLCBsMnRfY2FwYWNpdHkgLSAxKTsKKwlyd2xvY2tfaW5pdCgmZC0+bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbDJ0X2NhcGFjaXR5OyArK2kpIHsKKwkJZC0+bDJ0YWJbaV0uaWR4ID0gaTsKKwkJZC0+bDJ0YWJbaV0uc3RhdGUgPSBMMlRfU1RBVEVfVU5VU0VEOworCQlzcGluX2xvY2tfaW5pdCgmZC0+bDJ0YWJbaV0ubG9jayk7CisJCWF0b21pY19zZXQoJmQtPmwydGFiW2ldLnJlZmNudCwgMCk7CisJfQorCXJldHVybiBkOworfQorCit2b2lkIHQzX2ZyZWVfbDJ0KHN0cnVjdCBsMnRfZGF0YSAqZCkKK3sKKwljeGdiX2ZyZWVfbWVtKGQpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy9sMnQuaCBiL2RyaXZlcnMvbmV0L2N4Z2IzL2wydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNWQyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9sMnQuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3IE9wZW4gR3JpZCBDb21wdXRpbmcsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9DSEVMU0lPX0wyVF9ICisjZGVmaW5lIF9DSEVMU0lPX0wyVF9ICisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInQzY2Rldi5oIgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworZW51bSB7CisJTDJUX1NUQVRFX1ZBTElELAkvKiBlbnRyeSBpcyB1cCB0byBkYXRlICovCisJTDJUX1NUQVRFX1NUQUxFLAkvKiBlbnRyeSBtYXkgYmUgdXNlZCBidXQgbmVlZHMgcmV2YWxpZGF0aW9uICovCisJTDJUX1NUQVRFX1JFU09MVklORywJLyogZW50cnkgbmVlZHMgYWRkcmVzcyByZXNvbHV0aW9uICovCisJTDJUX1NUQVRFX1VOVVNFRAkvKiBlbnRyeSBub3QgaW4gdXNlICovCit9OworCitzdHJ1Y3QgbmVpZ2hib3VyOworc3RydWN0IHNrX2J1ZmY7CisKKy8qCisgKiBFYWNoIEwyVCBlbnRyeSBwbGF5cyBtdWx0aXBsZSByb2xlcy4gIEZpcnN0IG9mIGFsbCwgaXQga2VlcHMgc3RhdGUgZm9yIHRoZQorICogY29ycmVzcG9uZGluZyBlbnRyeSBvZiB0aGUgSFcgTDIgdGFibGUgYW5kIG1haW50YWlucyBhIHF1ZXVlIG9mIG9mZmxvYWQKKyAqIHBhY2tldHMgYXdhaXRpbmcgYWRkcmVzcyByZXNvbHV0aW9uLiAgU2Vjb25kLCBpdCBpcyBhIG5vZGUgb2YgYSBoYXNoIHRhYmxlCisgKiBjaGFpbiwgd2hlcmUgdGhlIG5vZGVzIG9mIHRoZSBjaGFpbiBhcmUgbGlua2VkIHRvZ2V0aGVyIHRocm91Z2ggdGhlaXIgbmV4dAorICogcG9pbnRlci4gIEZpbmFsbHksIGVhY2ggbm9kZSBpcyBhIGJ1Y2tldCBvZiBhIGhhc2ggdGFibGUsIHBvaW50aW5nIHRvIHRoZQorICogZmlyc3QgZWxlbWVudCBpbiBpdHMgY2hhaW4gdGhyb3VnaCBpdHMgZmlyc3QgcG9pbnRlci4KKyAqLworc3RydWN0IGwydF9lbnRyeSB7CisJdTE2IHN0YXRlOwkJLyogZW50cnkgc3RhdGUgKi8KKwl1MTYgaWR4OwkJLyogZW50cnkgaW5kZXggKi8KKwl1MzIgYWRkcjsJCS8qIGRlc3QgSVAgYWRkcmVzcyAqLworCWludCBpZmluZGV4OwkJLyogbmVpZ2hib3IncyBuZXRfZGV2aWNlJ3MgaWZpbmRleCAqLworCXUxNiBzbXRfaWR4OwkJLyogU01UIGluZGV4ICovCisJdTE2IHZsYW47CQkvKiBWTEFOIFRDSSAoaWQ6IGJpdHMgMC0xMSwgcHJpbzogMTMtMTUgKi8KKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsJLyogYXNzb2NpYXRlZCBuZWlnaGJvdXIgKi8KKwlzdHJ1Y3QgbDJ0X2VudHJ5ICpmaXJzdDsJLyogc3RhcnQgb2YgaGFzaCBjaGFpbiAqLworCXN0cnVjdCBsMnRfZW50cnkgKm5leHQ7CS8qIG5leHQgbDJ0X2VudHJ5IG9uIGNoYWluICovCisJc3RydWN0IHNrX2J1ZmYgKmFycHFfaGVhZDsJLyogcXVldWUgb2YgcGFja2V0cyBhd2FpdGluZyByZXNvbHV0aW9uICovCisJc3RydWN0IHNrX2J1ZmYgKmFycHFfdGFpbDsKKwlzcGlubG9ja190IGxvY2s7CisJYXRvbWljX3QgcmVmY250OwkvKiBlbnRyeSByZWZlcmVuY2UgY291bnQgKi8KKwl1OCBkbWFjWzZdOwkJLyogbmVpZ2hib3VyJ3MgTUFDIGFkZHJlc3MgKi8KK307CisKK3N0cnVjdCBsMnRfZGF0YSB7CisJdW5zaWduZWQgaW50IG5lbnRyaWVzOwkvKiBudW1iZXIgb2YgZW50cmllcyAqLworCXN0cnVjdCBsMnRfZW50cnkgKnJvdmVyOwkvKiBzdGFydGluZyBwb2ludCBmb3IgbmV4dCBhbGxvY2F0aW9uICovCisJYXRvbWljX3QgbmZyZWU7CQkvKiBudW1iZXIgb2YgZnJlZSBlbnRyaWVzICovCisJcndsb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbDJ0X2VudHJ5IGwydGFiWzBdOworfTsKKwordHlwZWRlZiB2b2lkICgqYXJwX2ZhaWx1cmVfaGFuZGxlcl9mdW5jKShzdHJ1Y3QgdDNjZGV2ICogZGV2LAorCQkJCQkgc3RydWN0IHNrX2J1ZmYgKiBza2IpOworCisvKgorICogQ2FsbGJhY2sgc3RvcmVkIGluIGFuIHNrYiB0byBoYW5kbGUgYWRkcmVzcyByZXNvbHV0aW9uIGZhaWx1cmUuCisgKi8KK3N0cnVjdCBsMnRfc2tiX2NiIHsKKwlhcnBfZmFpbHVyZV9oYW5kbGVyX2Z1bmMgYXJwX2ZhaWx1cmVfaGFuZGxlcjsKK307CisKKyNkZWZpbmUgTDJUX1NLQl9DQihza2IpICgoc3RydWN0IGwydF9za2JfY2IgKikoc2tiKS0+Y2IpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXJwX2ZhaWx1cmVfaGFuZGxlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICBhcnBfZmFpbHVyZV9oYW5kbGVyX2Z1bmMgaG5kKQoreworCUwyVF9TS0JfQ0Ioc2tiKS0+YXJwX2ZhaWx1cmVfaGFuZGxlciA9IGhuZDsKK30KKworLyoKKyAqIEdldHRpbmcgdG8gdGhlIEwyIGRhdGEgZnJvbSBhbiBvZmZsb2FkIGRldmljZS4KKyAqLworI2RlZmluZSBMMkRBVEEoZGV2KSAoKGRldiktPmwyb3B0KQorCisjZGVmaW5lIFdfVENCX0wyVF9JWCAgICAwCisjZGVmaW5lIFNfVENCX0wyVF9JWCAgICA3CisjZGVmaW5lIE1fVENCX0wyVF9JWCAgICAweDdmZlVMTAorI2RlZmluZSBWX1RDQl9MMlRfSVgoeCkgKCh4KSA8PCBTX1RDQl9MMlRfSVgpCisKK3ZvaWQgdDNfbDJlX2ZyZWUoc3RydWN0IGwydF9kYXRhICpkLCBzdHJ1Y3QgbDJ0X2VudHJ5ICplKTsKK3ZvaWQgdDNfbDJ0X3VwZGF0ZShzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKTsKK3N0cnVjdCBsMnRfZW50cnkgKnQzX2wydF9nZXQoc3RydWN0IHQzY2RldiAqY2Rldiwgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCisJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IHQzX2wydF9zZW5kX3Nsb3coc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgIHN0cnVjdCBsMnRfZW50cnkgKmUpOwordm9pZCB0M19sMnRfc2VuZF9ldmVudChzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBsMnRfZW50cnkgKmUpOworc3RydWN0IGwydF9kYXRhICp0M19pbml0X2wydCh1bnNpZ25lZCBpbnQgbDJ0X2NhcGFjaXR5KTsKK3ZvaWQgdDNfZnJlZV9sMnQoc3RydWN0IGwydF9kYXRhICpkKTsKKworaW50IGN4Z2IzX29mbGRfc2VuZChzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgaW5saW5lIGludCBsMnRfc2VuZChzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBzdHJ1Y3QgbDJ0X2VudHJ5ICplKQoreworCWlmIChsaWtlbHkoZS0+c3RhdGUgPT0gTDJUX1NUQVRFX1ZBTElEKSkKKwkJcmV0dXJuIGN4Z2IzX29mbGRfc2VuZChkZXYsIHNrYik7CisJcmV0dXJuIHQzX2wydF9zZW5kX3Nsb3coZGV2LCBza2IsIGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbDJ0X3JlbGVhc2Uoc3RydWN0IGwydF9kYXRhICpkLCBzdHJ1Y3QgbDJ0X2VudHJ5ICplKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZlLT5yZWZjbnQpKQorCQl0M19sMmVfZnJlZShkLCBlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGwydF9ob2xkKHN0cnVjdCBsMnRfZGF0YSAqZCwgc3RydWN0IGwydF9lbnRyeSAqZSkKK3sKKwlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJmUtPnJlZmNudCkgPT0gMSkJLyogMCAtPiAxIHRyYW5zaXRpb24gKi8KKwkJYXRvbWljX2RlYygmZC0+bmZyZWUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL21jNS5jIGIvZHJpdmVycy9uZXQvY3hnYjMvbWM1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0ZDYyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL21jNS5jCkBAIC0wLDAgKzEsNDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJyZWdzLmgiCisKK2VudW0geworCUlEVDc1UDUyMTAwID0gNCwKKwlJRFQ3NU40MzEwMiA9IDUKK307CisKKy8qIERCR0kgY29tbWFuZCBtb2RlICovCitlbnVtIHsKKwlEQkdJX01PREVfTUJVUyA9IDAsCisJREJHSV9NT0RFX0lEVDUyMTAwID0gNQorfTsKKworLyogSURUIDc1UDUyMTAwIGNvbW1hbmRzICovCisjZGVmaW5lIElEVF9DTURfUkVBRCAgIDAKKyNkZWZpbmUgSURUX0NNRF9XUklURSAgMQorI2RlZmluZSBJRFRfQ01EX1NFQVJDSCAyCisjZGVmaW5lIElEVF9DTURfTEVBUk4gIDMKKworLyogSURUIExBUiByZWdpc3RlciBhZGRyZXNzIGFuZCB2YWx1ZSBmb3IgMTQ0LWJpdCBtb2RlIChsb3cgMzIgYml0cykgKi8KKyNkZWZpbmUgSURUX0xBUl9BRFIwICAgCTB4MTgwMDA2CisjZGVmaW5lIElEVF9MQVJfTU9ERTE0NAkweGZmZmYwMDAwCisKKy8qIElEVCBTQ1IgYW5kIFNTUiBhZGRyZXNzZXMgKGxvdyAzMiBiaXRzKSAqLworI2RlZmluZSBJRFRfU0NSX0FEUjAgIDB4MTgwMDAwCisjZGVmaW5lIElEVF9TU1IwX0FEUjAgMHgxODAwMDIKKyNkZWZpbmUgSURUX1NTUjFfQURSMCAweDE4MDAwNAorCisvKiBJRFQgR01SIGJhc2UgYWRkcmVzcyAobG93IDMyIGJpdHMpICovCisjZGVmaW5lIElEVF9HTVJfQkFTRV9BRFIwIDB4MTgwMDIwCisKKy8qIElEVCBkYXRhIGFuZCBtYXNrIGFycmF5IGJhc2UgYWRkcmVzc2VzIChsb3cgMzIgYml0cykgKi8KKyNkZWZpbmUgSURUX0RBVEFSWV9CQVNFX0FEUjAgMAorI2RlZmluZSBJRFRfTVNLQVJZX0JBU0VfQURSMCAweDgwMDAwCisKKy8qIElEVCA3NU40MzEwMiBjb21tYW5kcyAqLworI2RlZmluZSBJRFQ0X0NNRF9TRUFSQ0gxNDQgMworI2RlZmluZSBJRFQ0X0NNRF9XUklURSAgICAgNAorI2RlZmluZSBJRFQ0X0NNRF9SRUFEICAgICAgNQorCisvKiBJRFQgNzVONDMxMDIgU0NSIGFkZHJlc3MgKGxvdyAzMiBiaXRzKSAqLworI2RlZmluZSBJRFQ0X1NDUl9BRFIwICAweDMKKworLyogSURUIDc1TjQzMTAyIEdNUiBiYXNlIGFkZHJlc3NlcyAobG93IDMyIGJpdHMpICovCisjZGVmaW5lIElEVDRfR01SX0JBU0UwIDB4MTAKKyNkZWZpbmUgSURUNF9HTVJfQkFTRTEgMHgyMAorI2RlZmluZSBJRFQ0X0dNUl9CQVNFMiAweDMwCisKKy8qIElEVCA3NU40MzEwMiBkYXRhIGFuZCBtYXNrIGFycmF5IGJhc2UgYWRkcmVzc2VzIChsb3cgMzIgYml0cykgKi8KKyNkZWZpbmUgSURUNF9EQVRBUllfQkFTRV9BRFIwIDB4MTAwMDAwMAorI2RlZmluZSBJRFQ0X01TS0FSWV9CQVNFX0FEUjAgMHgyMDAwMDAwCisKKyNkZWZpbmUgTUFYX1dSSVRFX0FUVEVNUFRTIDUKKworI2RlZmluZSBNQVhfUk9VVEVTIDIwNDgKKworLyoKKyAqIElzc3VlIGEgY29tbWFuZCB0byB0aGUgVENBTSBhbmQgd2FpdCBmb3IgaXRzIGNvbXBsZXRpb24uICBUaGUgYWRkcmVzcyBhbmQKKyAqIGFueSBkYXRhIHJlcXVpcmVkIGJ5IHRoZSBjb21tYW5kIG11c3QgaGF2ZSBiZWVuIHNldHVwIGJ5IHRoZSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbnQgbWM1X2NtZF93cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGNtZCkKK3sKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NQzVfREJfREJHSV9SRVFfQ01ELCBjbWQpOworCXJldHVybiB0M193YWl0X29wX2RvbmUoYWRhcHRlciwgQV9NQzVfREJfREJHSV9SU1BfU1RBVFVTLAorCQkJICAgICAgIEZfREJHSVJTUFZBTElELCAxLCBNQVhfV1JJVEVfQVRURU1QVFMsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGJnaV93cl9hZGRyMyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIHYxLCB1MzIgdjIsCisJCQkJIHUzMiB2MykKK3sKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NQzVfREJfREJHSV9SRVFfQUREUjAsIHYxKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NQzVfREJfREJHSV9SRVFfQUREUjEsIHYyKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NQzVfREJfREJHSV9SRVFfQUREUjIsIHYzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRiZ2lfd3JfZGF0YTMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiB2MSwgdTMyIHYyLAorCQkJCSB1MzIgdjMpCit7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUM1X0RCX0RCR0lfUkVRX0RBVEEwLCB2MSk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUM1X0RCX0RCR0lfUkVRX0RBVEExLCB2Mik7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUM1X0RCX0RCR0lfUkVRX0RBVEEyLCB2Myk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYmdpX3JkX3JzcDMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiAqdjEsIHUzMiAqdjIsCisJCQkJdTMyICp2MykKK3sKKwkqdjEgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX01DNV9EQl9EQkdJX1JTUF9EQVRBMCk7CisJKnYyID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9NQzVfREJfREJHSV9SU1BfREFUQTEpOworCSp2MyA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfTUM1X0RCX0RCR0lfUlNQX0RBVEEyKTsKK30KKworLyoKKyAqIFdyaXRlIGRhdGEgdG8gdGhlIFRDQU0gcmVnaXN0ZXIgYXQgYWRkcmVzcyAoMCwgMCwgYWRkcl9sbykgdXNpbmcgdGhlIFRDQU0KKyAqIGNvbW1hbmQgY21kLiAgVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBtdXN0IGhhdmUgYmVlbiBzZXQgdXAgYnkgdGhlIGNhbGxlci4KKyAqIFJldHVybnMgLTEgb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IG1jNV93cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHJfbG8sIHUzMiBjbWQpCit7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUM1X0RCX0RCR0lfUkVRX0FERFIwLCBhZGRyX2xvKTsKKwlpZiAobWM1X2NtZF93cml0ZShhZGFwdGVyLCBjbWQpID09IDApCisJCXJldHVybiAwOworCUNIX0VSUihhZGFwdGVyLCAiTUM1IHRpbWVvdXQgd3JpdGluZyB0byBUQ0FNIGFkZHJlc3MgMHgleFxuIiwKKwkgICAgICAgYWRkcl9sbyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGluaXRfbWFza19kYXRhX2FycmF5KHN0cnVjdCBtYzUgKm1jNSwgdTMyIG1hc2tfYXJyYXlfYmFzZSwKKwkJCQl1MzIgZGF0YV9hcnJheV9iYXNlLCB1MzIgd3JpdGVfY21kLAorCQkJCWludCBhZGRyX3NoaWZ0KQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gbWM1LT5hZGFwdGVyOworCisJLyoKKwkgKiBXZSBuZWVkIHRoZSBzaXplIG9mIHRoZSBUQ0FNIGRhdGEgYW5kIG1hc2sgYXJyYXlzIGluIHRlcm1zIG9mCisJICogNzItYml0IGVudHJpZXMuCisJICovCisJdW5zaWduZWQgaW50IHNpemU3MiA9IG1jNS0+dGNhbV9zaXplOworCXVuc2lnbmVkIGludCBzZXJ2ZXJfYmFzZSA9IHQzX3JlYWRfcmVnKGFkYXAsIEFfTUM1X0RCX1NFUlZFUl9JTkRFWCk7CisKKwlpZiAobWM1LT5tb2RlID09IE1DNV9NT0RFXzE0NF9CSVQpIHsKKwkJc2l6ZTcyICo9IDI7CS8qIDEgMTQ0LWJpdCBlbnRyeSBpcyAyIDcyLWJpdCBlbnRyaWVzICovCisJCXNlcnZlcl9iYXNlICo9IDI7CisJfQorCisJLyogQ2xlYXIgdGhlIGRhdGEgYXJyYXkgKi8KKwlkYmdpX3dyX2RhdGEzKGFkYXAsIDAsIDAsIDApOworCWZvciAoaSA9IDA7IGkgPCBzaXplNzI7IGkrKykKKwkJaWYgKG1jNV93cml0ZShhZGFwLCBkYXRhX2FycmF5X2Jhc2UgKyAoaSA8PCBhZGRyX3NoaWZ0KSwKKwkJCSAgICAgIHdyaXRlX2NtZCkpCisJCQlyZXR1cm4gLTE7CisKKwkvKiBJbml0aWFsaXplIHRoZSBtYXNrIGFycmF5LiAqLworCWRiZ2lfd3JfZGF0YTMoYWRhcCwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZik7CisJZm9yIChpID0gMDsgaSA8IHNpemU3MjsgaSsrKSB7CisJCWlmIChpID09IHNlcnZlcl9iYXNlKQkvKiBlbnRlcmluZyBzZXJ2ZXIgb3Igcm91dGluZyByZWdpb24gKi8KKwkJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9EQkdJX1JFUV9EQVRBMCwKKwkJCQkgICAgIG1jNS0+bW9kZSA9PSBNQzVfTU9ERV8xNDRfQklUID8KKwkJCQkgICAgIDB4ZmZmZmZmZjkgOiAweGZmZmZmZmZkKTsKKwkJaWYgKG1jNV93cml0ZShhZGFwLCBtYXNrX2FycmF5X2Jhc2UgKyAoaSA8PCBhZGRyX3NoaWZ0KSwKKwkJCSAgICAgIHdyaXRlX2NtZCkpCisJCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfaWR0NTIxMDAoc3RydWN0IG1jNSAqbWM1KQoreworCWludCBpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gbWM1LT5hZGFwdGVyOworCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUM1X0RCX1JTUF9MQVRFTkNZLAorCQkgICAgIFZfUkRMQVQoMHgxNSkgfCBWX0xSTkxBVCgweDE1KSB8IFZfU1JDSExBVCgweDE1KSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUM1X0RCX1BBUlRfSURfSU5ERVgsIDIpOworCisJLyoKKwkgKiBVc2UgR01ScyAxNC0xNSBmb3IgRUxPT0tVUCwgR01ScyAxMi0xMyBmb3IgU1lOIGxvb2t1cHMsIGFuZAorCSAqIEdNUnMgOC05IGZvciBBQ0stIGFuZCBBT1BFTiBzZWFyY2hlcy4KKwkgKi8KKwl0M193cml0ZV9yZWcoYWRhcCwgQV9NQzVfREJfUE9QRU5fREFUQV9XUl9DTUQsIElEVF9DTURfV1JJVEUpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9QT1BFTl9NQVNLX1dSX0NNRCwgSURUX0NNRF9XUklURSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUM1X0RCX0FPUEVOX1NSQ0hfQ01ELCBJRFRfQ01EX1NFQVJDSCk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUM1X0RCX0FPUEVOX0xSTl9DTUQsIElEVF9DTURfTEVBUk4pOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9TWU5fU1JDSF9DTUQsIElEVF9DTURfU0VBUkNIIHwgMHg2MDAwKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9NQzVfREJfU1lOX0xSTl9DTUQsIElEVF9DTURfTEVBUk4pOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9BQ0tfU1JDSF9DTUQsIElEVF9DTURfU0VBUkNIKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9NQzVfREJfQUNLX0xSTl9DTUQsIElEVF9DTURfTEVBUk4pOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9JTE9PS1VQX0NNRCwgSURUX0NNRF9TRUFSQ0gpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9FTE9PS1VQX0NNRCwgSURUX0NNRF9TRUFSQ0ggfCAweDcwMDApOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9EQVRBX1dSSVRFX0NNRCwgSURUX0NNRF9XUklURSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUM1X0RCX0RBVEFfUkVBRF9DTUQsIElEVF9DTURfUkVBRCk7CisKKwkvKiBTZXQgREJHSSBjb21tYW5kIG1vZGUgZm9yIElEVCBUQ0FNLiAqLworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9EQkdJX0NPTkZJRywgREJHSV9NT0RFX0lEVDUyMTAwKTsKKworCS8qIFNldCB1cCBMQVIgKi8KKwlkYmdpX3dyX2RhdGEzKGFkYXAsIElEVF9MQVJfTU9ERTE0NCwgMCwgMCk7CisJaWYgKG1jNV93cml0ZShhZGFwLCBJRFRfTEFSX0FEUjAsIElEVF9DTURfV1JJVEUpKQorCQlnb3RvIGVycjsKKworCS8qIFNldCB1cCBTU1JzICovCisJZGJnaV93cl9kYXRhMyhhZGFwLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAwKTsKKwlpZiAobWM1X3dyaXRlKGFkYXAsIElEVF9TU1IwX0FEUjAsIElEVF9DTURfV1JJVEUpIHx8CisJICAgIG1jNV93cml0ZShhZGFwLCBJRFRfU1NSMV9BRFIwLCBJRFRfQ01EX1dSSVRFKSkKKwkJZ290byBlcnI7CisKKwkvKiBTZXQgdXAgR01ScyAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7CisJCWlmIChpID49IDEyICYmIGkgPCAxNSkKKwkJCWRiZ2lfd3JfZGF0YTMoYWRhcCwgMHhmZmZmZmZmOSwgMHhmZmZmZmZmZiwgMHhmZik7CisJCWVsc2UgaWYgKGkgPT0gMTUpCisJCQlkYmdpX3dyX2RhdGEzKGFkYXAsIDB4ZmZmZmZmZjksIDB4ZmZmZjgwMDcsIDB4ZmYpOworCQllbHNlCisJCQlkYmdpX3dyX2RhdGEzKGFkYXAsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmYpOworCisJCWlmIChtYzVfd3JpdGUoYWRhcCwgSURUX0dNUl9CQVNFX0FEUjAgKyBpLCBJRFRfQ01EX1dSSVRFKSkKKwkJCWdvdG8gZXJyOworCX0KKworCS8qIFNldCB1cCBTQ1IgKi8KKwlkYmdpX3dyX2RhdGEzKGFkYXAsIDEsIDAsIDApOworCWlmIChtYzVfd3JpdGUoYWRhcCwgSURUX1NDUl9BRFIwLCBJRFRfQ01EX1dSSVRFKSkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gaW5pdF9tYXNrX2RhdGFfYXJyYXkobWM1LCBJRFRfTVNLQVJZX0JBU0VfQURSMCwKKwkJCQkgICAgSURUX0RBVEFSWV9CQVNFX0FEUjAsIElEVF9DTURfV1JJVEUsIDApOworZXJyOgorCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGluaXRfaWR0NDMxMDIoc3RydWN0IG1jNSAqbWM1KQoreworCWludCBpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gbWM1LT5hZGFwdGVyOworCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUM1X0RCX1JTUF9MQVRFTkNZLAorCQkgICAgIGFkYXAtPnBhcmFtcy5yZXYgPT0gMCA/IFZfUkRMQVQoMHhkKSB8IFZfU1JDSExBVCgweDExKSA6CisJCSAgICAgVl9SRExBVCgweGQpIHwgVl9TUkNITEFUKDB4MTIpKTsKKworCS8qCisJICogVXNlIEdNUnMgMjQtMjUgZm9yIEVMT09LVVAsIEdNUnMgMjAtMjEgZm9yIFNZTiBsb29rdXBzLCBhbmQgbm8gbWFzaworCSAqIGZvciBBQ0stIGFuZCBBT1BFTiBzZWFyY2hlcy4KKwkgKi8KKwl0M193cml0ZV9yZWcoYWRhcCwgQV9NQzVfREJfUE9QRU5fREFUQV9XUl9DTUQsIElEVDRfQ01EX1dSSVRFKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9NQzVfREJfUE9QRU5fTUFTS19XUl9DTUQsIElEVDRfQ01EX1dSSVRFKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9NQzVfREJfQU9QRU5fU1JDSF9DTUQsCisJCSAgICAgSURUNF9DTURfU0VBUkNIMTQ0IHwgMHgzODAwKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9NQzVfREJfU1lOX1NSQ0hfQ01ELCBJRFQ0X0NNRF9TRUFSQ0gxNDQpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9BQ0tfU1JDSF9DTUQsIElEVDRfQ01EX1NFQVJDSDE0NCB8IDB4MzgwMCk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUM1X0RCX0lMT09LVVBfQ01ELCBJRFQ0X0NNRF9TRUFSQ0gxNDQgfCAweDM4MDApOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9FTE9PS1VQX0NNRCwgSURUNF9DTURfU0VBUkNIMTQ0IHwgMHg4MDApOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9EQVRBX1dSSVRFX0NNRCwgSURUNF9DTURfV1JJVEUpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9EQVRBX1JFQURfQ01ELCBJRFQ0X0NNRF9SRUFEKTsKKworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9QQVJUX0lEX0lOREVYLCAzKTsKKworCS8qIFNldCBEQkdJIGNvbW1hbmQgbW9kZSBmb3IgSURUIFRDQU0uICovCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUM1X0RCX0RCR0lfQ09ORklHLCBEQkdJX01PREVfSURUNTIxMDApOworCisJLyogU2V0IHVwIEdNUnMgKi8KKwlkYmdpX3dyX2RhdGEzKGFkYXAsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmYpOworCWZvciAoaSA9IDA7IGkgPCA3OyArK2kpCisJCWlmIChtYzVfd3JpdGUoYWRhcCwgSURUNF9HTVJfQkFTRTAgKyBpLCBJRFQ0X0NNRF9XUklURSkpCisJCQlnb3RvIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisJCWlmIChtYzVfd3JpdGUoYWRhcCwgSURUNF9HTVJfQkFTRTIgKyBpLCBJRFQ0X0NNRF9XUklURSkpCisJCQlnb3RvIGVycjsKKworCWRiZ2lfd3JfZGF0YTMoYWRhcCwgMHhmZmZmZmZmOSwgMHhmZmZmZmZmZiwgMHhmZik7CisJaWYgKG1jNV93cml0ZShhZGFwLCBJRFQ0X0dNUl9CQVNFMSwgSURUNF9DTURfV1JJVEUpIHx8CisJICAgIG1jNV93cml0ZShhZGFwLCBJRFQ0X0dNUl9CQVNFMSArIDEsIElEVDRfQ01EX1dSSVRFKSB8fAorCSAgICBtYzVfd3JpdGUoYWRhcCwgSURUNF9HTVJfQkFTRTEgKyA0LCBJRFQ0X0NNRF9XUklURSkpCisJCWdvdG8gZXJyOworCisJZGJnaV93cl9kYXRhMyhhZGFwLCAweGZmZmZmZmY5LCAweGZmZmY4MDA3LCAweGZmKTsKKwlpZiAobWM1X3dyaXRlKGFkYXAsIElEVDRfR01SX0JBU0UxICsgNSwgSURUNF9DTURfV1JJVEUpKQorCQlnb3RvIGVycjsKKworCS8qIFNldCB1cCBTQ1IgKi8KKwlkYmdpX3dyX2RhdGEzKGFkYXAsIDB4ZjAwMDAwMDAsIDAsIDApOworCWlmIChtYzVfd3JpdGUoYWRhcCwgSURUNF9TQ1JfQURSMCwgSURUNF9DTURfV1JJVEUpKQorCQlnb3RvIGVycjsKKworCXJldHVybiBpbml0X21hc2tfZGF0YV9hcnJheShtYzUsIElEVDRfTVNLQVJZX0JBU0VfQURSMCwKKwkJCQkgICAgSURUNF9EQVRBUllfQkFTRV9BRFIwLCBJRFQ0X0NNRF9XUklURSwgMSk7CitlcnI6CisJcmV0dXJuIC1FSU87Cit9CisKKy8qIFB1dCBNQzUgaW4gREJHSSBtb2RlLiAqLworc3RhdGljIGlubGluZSB2b2lkIG1jNV9kYmdpX21vZGVfZW5hYmxlKGNvbnN0IHN0cnVjdCBtYzUgKm1jNSkKK3sKKwl0M193cml0ZV9yZWcobWM1LT5hZGFwdGVyLCBBX01DNV9EQl9DT05GSUcsCisJCSAgICAgVl9UTU1PREUobWM1LT5tb2RlID09IE1DNV9NT0RFXzcyX0JJVCkgfCBGX0RCR0lFTik7Cit9CisKKy8qIFB1dCBNQzUgaW4gTS1CdXMgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIG1jNV9kYmdpX21vZGVfZGlzYWJsZShjb25zdCBzdHJ1Y3QgbWM1ICptYzUpCit7CisJdDNfd3JpdGVfcmVnKG1jNS0+YWRhcHRlciwgQV9NQzVfREJfQ09ORklHLAorCQkgICAgIFZfVE1NT0RFKG1jNS0+bW9kZSA9PSBNQzVfTU9ERV83Ml9CSVQpIHwKKwkJICAgICBWX0NPTVBFTihtYzUtPm1vZGUgPT0gTUM1X01PREVfNzJfQklUKSB8CisJCSAgICAgVl9QUlRZRU4obWM1LT5wYXJpdHlfZW5hYmxlZCkgfCBGX01CVVNFTik7Cit9CisKKy8qCisgKiBJbml0aWFsaXphdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSBPUyBhbmQgcHJvdG9jb2wgbGF5ZXJzIHRvIGFscmVhZHkKKyAqIGJlIGludGlhbGl6ZWQgZ29lcyBoZXJlLgorICovCitpbnQgdDNfbWM1X2luaXQoc3RydWN0IG1jNSAqbWM1LCB1bnNpZ25lZCBpbnQgbnNlcnZlcnMsIHVuc2lnbmVkIGludCBuZmlsdGVycywKKwkJdW5zaWduZWQgaW50IG5yb3V0ZXMpCit7CisJdTMyIGNmZzsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCB0Y2FtX3NpemUgPSBtYzUtPnRjYW1fc2l6ZTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG1jNS0+YWRhcHRlcjsKKworCWlmIChucm91dGVzID4gTUFYX1JPVVRFUyB8fCBucm91dGVzICsgbnNlcnZlcnMgKyBuZmlsdGVycyA+IHRjYW1fc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBSZXNldCB0aGUgVENBTSAqLworCWNmZyA9IHQzX3JlYWRfcmVnKGFkYXAsIEFfTUM1X0RCX0NPTkZJRykgJiB+Rl9UTU1PREU7CisJY2ZnIHw9IFZfVE1NT0RFKG1jNS0+bW9kZSA9PSBNQzVfTU9ERV83Ml9CSVQpIHwgRl9UTVJTVDsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9NQzVfREJfQ09ORklHLCBjZmcpOworCWlmICh0M193YWl0X29wX2RvbmUoYWRhcCwgQV9NQzVfREJfQ09ORklHLCBGX1RNUkRZLCAxLCA1MDAsIDApKSB7CisJCUNIX0VSUihhZGFwLCAiVENBTSByZXNldCB0aW1lZCBvdXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUM1X0RCX1JPVVRJTkdfVEFCTEVfSU5ERVgsIHRjYW1fc2l6ZSAtIG5yb3V0ZXMpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9GSUxURVJfVEFCTEUsCisJCSAgICAgdGNhbV9zaXplIC0gbnJvdXRlcyAtIG5maWx0ZXJzKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9NQzVfREJfU0VSVkVSX0lOREVYLAorCQkgICAgIHRjYW1fc2l6ZSAtIG5yb3V0ZXMgLSBuZmlsdGVycyAtIG5zZXJ2ZXJzKTsKKworCW1jNS0+cGFyaXR5X2VuYWJsZWQgPSAxOworCisJLyogQWxsIHRoZSBUQ0FNIGFkZHJlc3NlcyB3ZSBhY2Nlc3MgaGF2ZSBvbmx5IHRoZSBsb3cgMzIgYml0cyBub24gMCAqLworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9EQkdJX1JFUV9BRERSMSwgMCk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUM1X0RCX0RCR0lfUkVRX0FERFIyLCAwKTsKKworCW1jNV9kYmdpX21vZGVfZW5hYmxlKG1jNSk7CisKKwlzd2l0Y2ggKG1jNS0+cGFydF90eXBlKSB7CisJY2FzZSBJRFQ3NVA1MjEwMDoKKwkJZXJyID0gaW5pdF9pZHQ1MjEwMChtYzUpOworCQlicmVhazsKKwljYXNlIElEVDc1TjQzMTAyOgorCQllcnIgPSBpbml0X2lkdDQzMTAyKG1jNSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUNIX0VSUihhZGFwLCAiVW5zdXBwb3J0ZWQgVENBTSB0eXBlICVkXG4iLCBtYzUtPnBhcnRfdHlwZSk7CisJCWVyciA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCW1jNV9kYmdpX21vZGVfZGlzYWJsZShtYzUpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglyZWFkX21jNV9yYW5nZSAtIGR1bXAgYSBwYXJ0IG9mIHRoZSBtZW1vcnkgbWFuYWdlZCBieSBNQzUKKyAqCUBtYzU6IHRoZSBNQzUgaGFuZGxlCisgKglAc3RhcnQ6IHRoZSBzdGFydCBhZGRyZXNzIGZvciB0aGUgZHVtcAorICoJQG46IG51bWJlciBvZiA3Mi1iaXQgd29yZHMgdG8gcmVhZAorICoJQGJ1ZjogcmVzdWx0IGJ1ZmZlcgorICoKKyAqCVJlYWQgbiA3Mi1iaXQgd29yZHMgZnJvbSBNQzUgbWVtb3J5IGZyb20gdGhlIGdpdmVuIHN0YXJ0IGxvY2F0aW9uLgorICovCitpbnQgdDNfcmVhZF9tYzVfcmFuZ2UoY29uc3Qgc3RydWN0IG1jNSAqbWM1LCB1bnNpZ25lZCBpbnQgc3RhcnQsCisJCSAgICAgIHVuc2lnbmVkIGludCBuLCB1MzIgKmJ1ZikKK3sKKwl1MzIgcmVhZF9jbWQ7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBtYzUtPmFkYXB0ZXI7CisKKwlpZiAobWM1LT5wYXJ0X3R5cGUgPT0gSURUNzVQNTIxMDApCisJCXJlYWRfY21kID0gSURUX0NNRF9SRUFEOworCWVsc2UgaWYgKG1jNS0+cGFydF90eXBlID09IElEVDc1TjQzMTAyKQorCQlyZWFkX2NtZCA9IElEVDRfQ01EX1JFQUQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1jNV9kYmdpX21vZGVfZW5hYmxlKG1jNSk7CisKKwl3aGlsZSAobi0tKSB7CisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01DNV9EQl9EQkdJX1JFUV9BRERSMCwgc3RhcnQrKyk7CisJCWlmIChtYzVfY21kX3dyaXRlKGFkYXAsIHJlYWRfY21kKSkgeworCQkJZXJyID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWRiZ2lfcmRfcnNwMyhhZGFwLCBidWYgKyAyLCBidWYgKyAxLCBidWYpOworCQlidWYgKz0gMzsKKwl9CisKKwltYzVfZGJnaV9tb2RlX2Rpc2FibGUobWM1KTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNQzVfSU5UX0ZBVEFMIChGX1BBUklUWUVSUiB8IEZfUkVRUVBBUkVSUiB8IEZfRElTUFFQQVJFUlIpCisKKy8qCisgKiBNQzUgaW50ZXJydXB0IGhhbmRsZXIKKyAqLwordm9pZCB0M19tYzVfaW50cl9oYW5kbGVyKHN0cnVjdCBtYzUgKm1jNSkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG1jNS0+YWRhcHRlcjsKKwl1MzIgY2F1c2UgPSB0M19yZWFkX3JlZyhhZGFwLCBBX01DNV9EQl9JTlRfQ0FVU0UpOworCisJaWYgKChjYXVzZSAmIEZfUEFSSVRZRVJSKSAmJiBtYzUtPnBhcml0eV9lbmFibGVkKSB7CisJCUNIX0FMRVJUKGFkYXAsICJNQzUgcGFyaXR5IGVycm9yXG4iKTsKKwkJbWM1LT5zdGF0cy5wYXJpdHlfZXJyKys7CisJfQorCisJaWYgKGNhdXNlICYgRl9SRVFRUEFSRVJSKSB7CisJCUNIX0FMRVJUKGFkYXAsICJNQzUgcmVxdWVzdCBxdWV1ZSBwYXJpdHkgZXJyb3JcbiIpOworCQltYzUtPnN0YXRzLnJlcXFfcGFyaXR5X2VycisrOworCX0KKworCWlmIChjYXVzZSAmIEZfRElTUFFQQVJFUlIpIHsKKwkJQ0hfQUxFUlQoYWRhcCwgIk1DNSBkaXNwYXRjaCBxdWV1ZSBwYXJpdHkgZXJyb3JcbiIpOworCQltYzUtPnN0YXRzLmRpc3BxX3Bhcml0eV9lcnIrKzsKKwl9CisKKwlpZiAoY2F1c2UgJiBGX0FDVFJHTkZVTEwpCisJCW1jNS0+c3RhdHMuYWN0aXZlX3Jnbl9mdWxsKys7CisJaWYgKGNhdXNlICYgRl9ORkFTUkNIRkFJTCkKKwkJbWM1LT5zdGF0cy5uZmFfc3JjaF9lcnIrKzsKKwlpZiAoY2F1c2UgJiBGX1VOS05PV05DTUQpCisJCW1jNS0+c3RhdHMudW5rbm93bl9jbWQrKzsKKwlpZiAoY2F1c2UgJiBGX0RFTEFDVEVNUFRZKQorCQltYzUtPnN0YXRzLmRlbF9hY3RfZW1wdHkrKzsKKwlpZiAoY2F1c2UgJiBNQzVfSU5UX0ZBVEFMKQorCQl0M19mYXRhbF9lcnIoYWRhcCk7CisKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9NQzVfREJfSU5UX0NBVVNFLCBjYXVzZSk7Cit9CisKK3ZvaWQgX19kZXZpbml0IHQzX21jNV9wcmVwKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgbWM1ICptYzUsIGludCBtb2RlKQoreworI2RlZmluZSBLICogMTAyNAorCisJc3RhdGljIHVuc2lnbmVkIGludCB0Y2FtX3BhcnRfc2l6ZVtdID0gewkvKiBpbiBLIDcyLWJpdCBlbnRyaWVzICovCisJCTY0IEssIDEyOCBLLCAyNTYgSywgMzIgSworCX07CisKKyN1bmRlZiBLCisKKwl1MzIgY2ZnID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9NQzVfREJfQ09ORklHKTsKKworCW1jNS0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbWM1LT5tb2RlID0gKHVuc2lnbmVkIGNoYXIpbW9kZTsKKwltYzUtPnBhcnRfdHlwZSA9ICh1bnNpZ25lZCBjaGFyKUdfVE1UWVBFKGNmZyk7CisJaWYgKGNmZyAmIEZfVE1UWVBFSEkpCisJCW1jNS0+cGFydF90eXBlIHw9IDQ7CisKKwltYzUtPnRjYW1fc2l6ZSA9IHRjYW1fcGFydF9zaXplW0dfVE1QQVJUU0laRShjZmcpXTsKKwlpZiAobW9kZSA9PSBNQzVfTU9ERV8xNDRfQklUKQorCQltYzUtPnRjYW1fc2l6ZSAvPSAyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvcmVncy5oIGIvZHJpdmVycy9uZXQvY3hnYjMvcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NmM1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9yZWdzLmgKQEAgLTAsMCArMSwyMTk1IEBACisjZGVmaW5lIEFfU0dfQ09OVFJPTCAweDAKKworI2RlZmluZSBTX0RST1BQS1QgICAgMjAKKyNkZWZpbmUgVl9EUk9QUEtUKHgpICgoeCkgPDwgU19EUk9QUEtUKQorI2RlZmluZSBGX0RST1BQS1QgICAgVl9EUk9QUEtUKDFVKQorCisjZGVmaW5lIFNfRUdSR0VOQ1RSTCAgICAxOQorI2RlZmluZSBWX0VHUkdFTkNUUkwoeCkgKCh4KSA8PCBTX0VHUkdFTkNUUkwpCisjZGVmaW5lIEZfRUdSR0VOQ1RSTCAgICBWX0VHUkdFTkNUUkwoMVUpCisKKyNkZWZpbmUgU19VU0VSU1BBQ0VTSVpFICAgIDE0CisjZGVmaW5lIE1fVVNFUlNQQUNFU0laRSAgICAweDFmCisjZGVmaW5lIFZfVVNFUlNQQUNFU0laRSh4KSAoKHgpIDw8IFNfVVNFUlNQQUNFU0laRSkKKworI2RlZmluZSBTX0hPU1RQQUdFU0laRSAgICAxMQorI2RlZmluZSBNX0hPU1RQQUdFU0laRSAgICAweDcKKyNkZWZpbmUgVl9IT1NUUEFHRVNJWkUoeCkgKCh4KSA8PCBTX0hPU1RQQUdFU0laRSkKKworI2RlZmluZSBTX0ZMTU9ERSAgICA5CisjZGVmaW5lIFZfRkxNT0RFKHgpICgoeCkgPDwgU19GTE1PREUpCisjZGVmaW5lIEZfRkxNT0RFICAgIFZfRkxNT0RFKDFVKQorCisjZGVmaW5lIFNfUEtUU0hJRlQgICAgNgorI2RlZmluZSBNX1BLVFNISUZUICAgIDB4NworI2RlZmluZSBWX1BLVFNISUZUKHgpICgoeCkgPDwgU19QS1RTSElGVCkKKworI2RlZmluZSBTX09ORUlOVE1VTFRRICAgIDUKKyNkZWZpbmUgVl9PTkVJTlRNVUxUUSh4KSAoKHgpIDw8IFNfT05FSU5UTVVMVFEpCisjZGVmaW5lIEZfT05FSU5UTVVMVFEgICAgVl9PTkVJTlRNVUxUUSgxVSkKKworI2RlZmluZSBTX0JJR0VORElBTklOR1JFU1MgICAgMgorI2RlZmluZSBWX0JJR0VORElBTklOR1JFU1MoeCkgKCh4KSA8PCBTX0JJR0VORElBTklOR1JFU1MpCisjZGVmaW5lIEZfQklHRU5ESUFOSU5HUkVTUyAgICBWX0JJR0VORElBTklOR1JFU1MoMVUpCisKKyNkZWZpbmUgU19JU0NTSUNPQUxFU0NJTkcgICAgMQorI2RlZmluZSBWX0lTQ1NJQ09BTEVTQ0lORyh4KSAoKHgpIDw8IFNfSVNDU0lDT0FMRVNDSU5HKQorI2RlZmluZSBGX0lTQ1NJQ09BTEVTQ0lORyAgICBWX0lTQ1NJQ09BTEVTQ0lORygxVSkKKworI2RlZmluZSBTX0dMT0JBTEVOQUJMRSAgICAwCisjZGVmaW5lIFZfR0xPQkFMRU5BQkxFKHgpICgoeCkgPDwgU19HTE9CQUxFTkFCTEUpCisjZGVmaW5lIEZfR0xPQkFMRU5BQkxFICAgIFZfR0xPQkFMRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfQVZPSURDUU9WRkwgICAgMjQKKyNkZWZpbmUgVl9BVk9JRENRT1ZGTCh4KSAoKHgpIDw8IFNfQVZPSURDUU9WRkwpCisjZGVmaW5lIEZfQVZPSURDUU9WRkwgICAgVl9BVk9JRENRT1ZGTCgxVSkKKworI2RlZmluZSBTX09QVE9ORUlOVE1VTFRRICAgIDIzCisjZGVmaW5lIFZfT1BUT05FSU5UTVVMVFEoeCkgKCh4KSA8PCBTX09QVE9ORUlOVE1VTFRRKQorI2RlZmluZSBGX09QVE9ORUlOVE1VTFRRICAgIFZfT1BUT05FSU5UTVVMVFEoMVUpCisKKyNkZWZpbmUgU19DUUNSRFRDVFJMICAgIDIyCisjZGVmaW5lIFZfQ1FDUkRUQ1RSTCh4KSAoKHgpIDw8IFNfQ1FDUkRUQ1RSTCkKKyNkZWZpbmUgRl9DUUNSRFRDVFJMICAgIFZfQ1FDUkRUQ1RSTCgxVSkKKworI2RlZmluZSBBX1NHX0tET09SQkVMTCAweDQKKworI2RlZmluZSBTX1NFTEVHUkNOVFggICAgMzEKKyNkZWZpbmUgVl9TRUxFR1JDTlRYKHgpICgoeCkgPDwgU19TRUxFR1JDTlRYKQorI2RlZmluZSBGX1NFTEVHUkNOVFggICAgVl9TRUxFR1JDTlRYKDFVKQorCisjZGVmaW5lIFNfRUdSQ05UWCAgICAwCisjZGVmaW5lIE1fRUdSQ05UWCAgICAweGZmZmYKKyNkZWZpbmUgVl9FR1JDTlRYKHgpICgoeCkgPDwgU19FR1JDTlRYKQorCisjZGVmaW5lIEFfU0dfR1RTIDB4OAorCisjZGVmaW5lIFNfUlNQUSAgICAyOQorI2RlZmluZSBNX1JTUFEgICAgMHg3CisjZGVmaW5lIFZfUlNQUSh4KSAoKHgpIDw8IFNfUlNQUSkKKyNkZWZpbmUgR19SU1BRKHgpICgoKHgpID4+IFNfUlNQUSkgJiBNX1JTUFEpCisKKyNkZWZpbmUgU19ORVdUSU1FUiAgICAxNgorI2RlZmluZSBNX05FV1RJTUVSICAgIDB4MWZmZgorI2RlZmluZSBWX05FV1RJTUVSKHgpICgoeCkgPDwgU19ORVdUSU1FUikKKworI2RlZmluZSBTX05FV0lOREVYICAgIDAKKyNkZWZpbmUgTV9ORVdJTkRFWCAgICAweGZmZmYKKyNkZWZpbmUgVl9ORVdJTkRFWCh4KSAoKHgpIDw8IFNfTkVXSU5ERVgpCisKKyNkZWZpbmUgQV9TR19DT05URVhUX0NNRCAweGMKKworI2RlZmluZSBTX0NPTlRFWFRfQ01EX09QQ09ERSAgICAyOAorI2RlZmluZSBNX0NPTlRFWFRfQ01EX09QQ09ERSAgICAweGYKKyNkZWZpbmUgVl9DT05URVhUX0NNRF9PUENPREUoeCkgKCh4KSA8PCBTX0NPTlRFWFRfQ01EX09QQ09ERSkKKworI2RlZmluZSBTX0NPTlRFWFRfQ01EX0JVU1kgICAgMjcKKyNkZWZpbmUgVl9DT05URVhUX0NNRF9CVVNZKHgpICgoeCkgPDwgU19DT05URVhUX0NNRF9CVVNZKQorI2RlZmluZSBGX0NPTlRFWFRfQ01EX0JVU1kgICAgVl9DT05URVhUX0NNRF9CVVNZKDFVKQorCisjZGVmaW5lIFNfQ1FfQ1JFRElUICAgIDIwCisKKyNkZWZpbmUgTV9DUV9DUkVESVQgICAgMHg3ZgorCisjZGVmaW5lIFZfQ1FfQ1JFRElUKHgpICgoeCkgPDwgU19DUV9DUkVESVQpCisKKyNkZWZpbmUgR19DUV9DUkVESVQoeCkgKCgoeCkgPj4gU19DUV9DUkVESVQpICYgTV9DUV9DUkVESVQpCisKKyNkZWZpbmUgU19DUSAgICAxOQorCisjZGVmaW5lIFZfQ1EoeCkgKCh4KSA8PCBTX0NRKQorI2RlZmluZSBGX0NRICAgIFZfQ1EoMVUpCisKKyNkZWZpbmUgU19SRVNQT05TRVEgICAgMTgKKyNkZWZpbmUgVl9SRVNQT05TRVEoeCkgKCh4KSA8PCBTX1JFU1BPTlNFUSkKKyNkZWZpbmUgRl9SRVNQT05TRVEgICAgVl9SRVNQT05TRVEoMVUpCisKKyNkZWZpbmUgU19FR1JFU1MgICAgMTcKKyNkZWZpbmUgVl9FR1JFU1MoeCkgKCh4KSA8PCBTX0VHUkVTUykKKyNkZWZpbmUgRl9FR1JFU1MgICAgVl9FR1JFU1MoMVUpCisKKyNkZWZpbmUgU19GUkVFTElTVCAgICAxNgorI2RlZmluZSBWX0ZSRUVMSVNUKHgpICgoeCkgPDwgU19GUkVFTElTVCkKKyNkZWZpbmUgRl9GUkVFTElTVCAgICBWX0ZSRUVMSVNUKDFVKQorCisjZGVmaW5lIFNfQ09OVEVYVCAgICAwCisjZGVmaW5lIE1fQ09OVEVYVCAgICAweGZmZmYKKyNkZWZpbmUgVl9DT05URVhUKHgpICgoeCkgPDwgU19DT05URVhUKQorCisjZGVmaW5lIEdfQ09OVEVYVCh4KSAoKCh4KSA+PiBTX0NPTlRFWFQpICYgTV9DT05URVhUKQorCisjZGVmaW5lIEFfU0dfQ09OVEVYVF9EQVRBMCAweDEwCisKKyNkZWZpbmUgQV9TR19DT05URVhUX0RBVEExIDB4MTQKKworI2RlZmluZSBBX1NHX0NPTlRFWFRfREFUQTIgMHgxOAorCisjZGVmaW5lIEFfU0dfQ09OVEVYVF9EQVRBMyAweDFjCisKKyNkZWZpbmUgQV9TR19DT05URVhUX01BU0swIDB4MjAKKworI2RlZmluZSBBX1NHX0NPTlRFWFRfTUFTSzEgMHgyNAorCisjZGVmaW5lIEFfU0dfQ09OVEVYVF9NQVNLMiAweDI4CisKKyNkZWZpbmUgQV9TR19DT05URVhUX01BU0szIDB4MmMKKworI2RlZmluZSBBX1NHX1JTUFFfQ1JFRElUX1JFVFVSTiAweDMwCisKKyNkZWZpbmUgU19DUkVESVRTICAgIDAKKyNkZWZpbmUgTV9DUkVESVRTICAgIDB4ZmZmZgorI2RlZmluZSBWX0NSRURJVFMoeCkgKCh4KSA8PCBTX0NSRURJVFMpCisKKyNkZWZpbmUgQV9TR19EQVRBX0lOVFIgMHgzNAorCisjZGVmaW5lIFNfRVJSSU5UUiAgICAzMQorI2RlZmluZSBWX0VSUklOVFIoeCkgKCh4KSA8PCBTX0VSUklOVFIpCisjZGVmaW5lIEZfRVJSSU5UUiAgICBWX0VSUklOVFIoMVUpCisKKyNkZWZpbmUgQV9TR19ISV9EUkJfSElfVEhSU0ggMHgzOAorCisjZGVmaW5lIEFfU0dfSElfRFJCX0xPX1RIUlNIIDB4M2MKKworI2RlZmluZSBBX1NHX0xPX0RSQl9ISV9USFJTSCAweDQwCisKKyNkZWZpbmUgQV9TR19MT19EUkJfTE9fVEhSU0ggMHg0NAorCisjZGVmaW5lIEFfU0dfUlNQUV9GTF9TVEFUVVMgMHg0YworCisjZGVmaW5lIFNfUlNQUTBESVNBQkxFRCAgICA4CisKKyNkZWZpbmUgQV9TR19FR1JfUkNRX0RSQl9USFJTSCAweDU0CisKKyNkZWZpbmUgU19ISVJDUURSQlRIUlNIICAgIDE2CisjZGVmaW5lIE1fSElSQ1FEUkJUSFJTSCAgICAweDdmZgorI2RlZmluZSBWX0hJUkNRRFJCVEhSU0goeCkgKCh4KSA8PCBTX0hJUkNRRFJCVEhSU0gpCisKKyNkZWZpbmUgU19MT1JDUURSQlRIUlNIICAgIDAKKyNkZWZpbmUgTV9MT1JDUURSQlRIUlNIICAgIDB4N2ZmCisjZGVmaW5lIFZfTE9SQ1FEUkJUSFJTSCh4KSAoKHgpIDw8IFNfTE9SQ1FEUkJUSFJTSCkKKworI2RlZmluZSBBX1NHX0VHUl9DTlRYX0JBRERSIDB4NTgKKworI2RlZmluZSBBX1NHX0lOVF9DQVVTRSAweDVjCisKKyNkZWZpbmUgU19SU1BRRElTQUJMRUQgICAgMworI2RlZmluZSBWX1JTUFFESVNBQkxFRCh4KSAoKHgpIDw8IFNfUlNQUURJU0FCTEVEKQorI2RlZmluZSBGX1JTUFFESVNBQkxFRCAgICBWX1JTUFFESVNBQkxFRCgxVSkKKworI2RlZmluZSBTX1JTUFFDUkVESVRPVkVSRk9XICAgIDIKKyNkZWZpbmUgVl9SU1BRQ1JFRElUT1ZFUkZPVyh4KSAoKHgpIDw8IFNfUlNQUUNSRURJVE9WRVJGT1cpCisjZGVmaW5lIEZfUlNQUUNSRURJVE9WRVJGT1cgICAgVl9SU1BRQ1JFRElUT1ZFUkZPVygxVSkKKworI2RlZmluZSBBX1NHX0lOVF9FTkFCTEUgMHg2MAorCisjZGVmaW5lIEFfU0dfQ01EUV9DUkVESVRfVEggMHg2NAorCisjZGVmaW5lIFNfVElNRU9VVCAgICA4CisjZGVmaW5lIE1fVElNRU9VVCAgICAweGZmZmZmZgorI2RlZmluZSBWX1RJTUVPVVQoeCkgKCh4KSA8PCBTX1RJTUVPVVQpCisKKyNkZWZpbmUgU19USFJFU0hPTEQgICAgMAorI2RlZmluZSBNX1RIUkVTSE9MRCAgICAweGZmCisjZGVmaW5lIFZfVEhSRVNIT0xEKHgpICgoeCkgPDwgU19USFJFU0hPTEQpCisKKyNkZWZpbmUgQV9TR19USU1FUl9USUNLIDB4NjgKKworI2RlZmluZSBBX1NHX0NRX0NPTlRFWFRfQkFERFIgMHg2YworCisjZGVmaW5lIEFfU0dfT0NPX0JBU0UgMHg3MAorCisjZGVmaW5lIFNfQkFTRTEgICAgMTYKKyNkZWZpbmUgTV9CQVNFMSAgICAweGZmZmYKKyNkZWZpbmUgVl9CQVNFMSh4KSAoKHgpIDw8IFNfQkFTRTEpCisKKyNkZWZpbmUgQV9TR19EUkJfUFJJX1RIUkVTSCAweDc0CisKKyNkZWZpbmUgQV9QQ0lYX0lOVF9FTkFCTEUgMHg4MAorCisjZGVmaW5lIFNfTVNJWFBBUkVSUiAgICAyMgorI2RlZmluZSBNX01TSVhQQVJFUlIgICAgMHg3CisKKyNkZWZpbmUgVl9NU0lYUEFSRVJSKHgpICgoeCkgPDwgU19NU0lYUEFSRVJSKQorCisjZGVmaW5lIFNfQ0ZQQVJFUlIgICAgMTgKKyNkZWZpbmUgTV9DRlBBUkVSUiAgICAweGYKKworI2RlZmluZSBWX0NGUEFSRVJSKHgpICgoeCkgPDwgU19DRlBBUkVSUikKKworI2RlZmluZSBTX1JGUEFSRVJSICAgIDE0CisjZGVmaW5lIE1fUkZQQVJFUlIgICAgMHhmCisKKyNkZWZpbmUgVl9SRlBBUkVSUih4KSAoKHgpIDw8IFNfUkZQQVJFUlIpCisKKyNkZWZpbmUgU19XRlBBUkVSUiAgICAxMgorI2RlZmluZSBNX1dGUEFSRVJSICAgIDB4MworCisjZGVmaW5lIFZfV0ZQQVJFUlIoeCkgKCh4KSA8PCBTX1dGUEFSRVJSKQorCisjZGVmaW5lIFNfUElPUEFSRVJSICAgIDExCisjZGVmaW5lIFZfUElPUEFSRVJSKHgpICgoeCkgPDwgU19QSU9QQVJFUlIpCisjZGVmaW5lIEZfUElPUEFSRVJSICAgIFZfUElPUEFSRVJSKDFVKQorCisjZGVmaW5lIFNfREVUVU5DRUNDRVJSICAgIDEwCisjZGVmaW5lIFZfREVUVU5DRUNDRVJSKHgpICgoeCkgPDwgU19ERVRVTkNFQ0NFUlIpCisjZGVmaW5lIEZfREVUVU5DRUNDRVJSICAgIFZfREVUVU5DRUNDRVJSKDFVKQorCisjZGVmaW5lIFNfREVUQ09SRUNDRVJSICAgIDkKKyNkZWZpbmUgVl9ERVRDT1JFQ0NFUlIoeCkgKCh4KSA8PCBTX0RFVENPUkVDQ0VSUikKKyNkZWZpbmUgRl9ERVRDT1JFQ0NFUlIgICAgVl9ERVRDT1JFQ0NFUlIoMVUpCisKKyNkZWZpbmUgU19SQ1ZTUExDTVBFUlIgICAgOAorI2RlZmluZSBWX1JDVlNQTENNUEVSUih4KSAoKHgpIDw8IFNfUkNWU1BMQ01QRVJSKQorI2RlZmluZSBGX1JDVlNQTENNUEVSUiAgICBWX1JDVlNQTENNUEVSUigxVSkKKworI2RlZmluZSBTX1VOWFNQTENNUCAgICA3CisjZGVmaW5lIFZfVU5YU1BMQ01QKHgpICgoeCkgPDwgU19VTlhTUExDTVApCisjZGVmaW5lIEZfVU5YU1BMQ01QICAgIFZfVU5YU1BMQ01QKDFVKQorCisjZGVmaW5lIFNfU1BMQ01QRElTICAgIDYKKyNkZWZpbmUgVl9TUExDTVBESVMoeCkgKCh4KSA8PCBTX1NQTENNUERJUykKKyNkZWZpbmUgRl9TUExDTVBESVMgICAgVl9TUExDTVBESVMoMVUpCisKKyNkZWZpbmUgU19ERVRQQVJFUlIgICAgNQorI2RlZmluZSBWX0RFVFBBUkVSUih4KSAoKHgpIDw8IFNfREVUUEFSRVJSKQorI2RlZmluZSBGX0RFVFBBUkVSUiAgICBWX0RFVFBBUkVSUigxVSkKKworI2RlZmluZSBTX1NJR1NZU0VSUiAgICA0CisjZGVmaW5lIFZfU0lHU1lTRVJSKHgpICgoeCkgPDwgU19TSUdTWVNFUlIpCisjZGVmaW5lIEZfU0lHU1lTRVJSICAgIFZfU0lHU1lTRVJSKDFVKQorCisjZGVmaW5lIFNfUkNWTVNUQUJUICAgIDMKKyNkZWZpbmUgVl9SQ1ZNU1RBQlQoeCkgKCh4KSA8PCBTX1JDVk1TVEFCVCkKKyNkZWZpbmUgRl9SQ1ZNU1RBQlQgICAgVl9SQ1ZNU1RBQlQoMVUpCisKKyNkZWZpbmUgU19SQ1ZUQVJBQlQgICAgMgorI2RlZmluZSBWX1JDVlRBUkFCVCh4KSAoKHgpIDw8IFNfUkNWVEFSQUJUKQorI2RlZmluZSBGX1JDVlRBUkFCVCAgICBWX1JDVlRBUkFCVCgxVSkKKworI2RlZmluZSBTX1NJR1RBUkFCVCAgICAxCisjZGVmaW5lIFZfU0lHVEFSQUJUKHgpICgoeCkgPDwgU19TSUdUQVJBQlQpCisjZGVmaW5lIEZfU0lHVEFSQUJUICAgIFZfU0lHVEFSQUJUKDFVKQorCisjZGVmaW5lIFNfTVNUREVUUEFSRVJSICAgIDAKKyNkZWZpbmUgVl9NU1RERVRQQVJFUlIoeCkgKCh4KSA8PCBTX01TVERFVFBBUkVSUikKKyNkZWZpbmUgRl9NU1RERVRQQVJFUlIgICAgVl9NU1RERVRQQVJFUlIoMVUpCisKKyNkZWZpbmUgQV9QQ0lYX0lOVF9DQVVTRSAweDg0CisKKyNkZWZpbmUgQV9QQ0lYX0NGRyAweDg4CisKKyNkZWZpbmUgU19DTElERUNFTiAgICAxOAorI2RlZmluZSBWX0NMSURFQ0VOKHgpICgoeCkgPDwgU19DTElERUNFTikKKyNkZWZpbmUgRl9DTElERUNFTiAgICBWX0NMSURFQ0VOKDFVKQorCisjZGVmaW5lIEFfUENJWF9NT0RFIDB4OGMKKworI2RlZmluZSBTX1BDTEtSQU5HRSAgICA2CisjZGVmaW5lIE1fUENMS1JBTkdFICAgIDB4MworI2RlZmluZSBWX1BDTEtSQU5HRSh4KSAoKHgpIDw8IFNfUENMS1JBTkdFKQorI2RlZmluZSBHX1BDTEtSQU5HRSh4KSAoKCh4KSA+PiBTX1BDTEtSQU5HRSkgJiBNX1BDTEtSQU5HRSkKKworI2RlZmluZSBTX1BDSVhJTklUUEFUICAgIDIKKyNkZWZpbmUgTV9QQ0lYSU5JVFBBVCAgICAweGYKKyNkZWZpbmUgVl9QQ0lYSU5JVFBBVCh4KSAoKHgpIDw8IFNfUENJWElOSVRQQVQpCisjZGVmaW5lIEdfUENJWElOSVRQQVQoeCkgKCgoeCkgPj4gU19QQ0lYSU5JVFBBVCkgJiBNX1BDSVhJTklUUEFUKQorCisjZGVmaW5lIFNfNjRCSVQgICAgMAorI2RlZmluZSBWXzY0QklUKHgpICgoeCkgPDwgU182NEJJVCkKKyNkZWZpbmUgRl82NEJJVCAgICBWXzY0QklUKDFVKQorCisjZGVmaW5lIEFfUENJRV9JTlRfRU5BQkxFIDB4ODAKKworI2RlZmluZSBTX0JJU1RFUlIgICAgMTUKKyNkZWZpbmUgTV9CSVNURVJSICAgIDB4ZmYKKworI2RlZmluZSBWX0JJU1RFUlIoeCkgKCh4KSA8PCBTX0JJU1RFUlIpCisKKyNkZWZpbmUgU19QQ0lFX01TSVhQQVJFUlIgICAgMTIKKyNkZWZpbmUgTV9QQ0lFX01TSVhQQVJFUlIgICAgMHg3CisKKyNkZWZpbmUgVl9QQ0lFX01TSVhQQVJFUlIoeCkgKCh4KSA8PCBTX1BDSUVfTVNJWFBBUkVSUikKKworI2RlZmluZSBTX1BDSUVfQ0ZQQVJFUlIgICAgMTEKKyNkZWZpbmUgVl9QQ0lFX0NGUEFSRVJSKHgpICgoeCkgPDwgU19QQ0lFX0NGUEFSRVJSKQorI2RlZmluZSBGX1BDSUVfQ0ZQQVJFUlIgICAgVl9QQ0lFX0NGUEFSRVJSKDFVKQorCisjZGVmaW5lIFNfUENJRV9SRlBBUkVSUiAgICAxMAorI2RlZmluZSBWX1BDSUVfUkZQQVJFUlIoeCkgKCh4KSA8PCBTX1BDSUVfUkZQQVJFUlIpCisjZGVmaW5lIEZfUENJRV9SRlBBUkVSUiAgICBWX1BDSUVfUkZQQVJFUlIoMVUpCisKKyNkZWZpbmUgU19QQ0lFX1dGUEFSRVJSICAgIDkKKyNkZWZpbmUgVl9QQ0lFX1dGUEFSRVJSKHgpICgoeCkgPDwgU19QQ0lFX1dGUEFSRVJSKQorI2RlZmluZSBGX1BDSUVfV0ZQQVJFUlIgICAgVl9QQ0lFX1dGUEFSRVJSKDFVKQorCisjZGVmaW5lIFNfUENJRV9QSU9QQVJFUlIgICAgOAorI2RlZmluZSBWX1BDSUVfUElPUEFSRVJSKHgpICgoeCkgPDwgU19QQ0lFX1BJT1BBUkVSUikKKyNkZWZpbmUgRl9QQ0lFX1BJT1BBUkVSUiAgICBWX1BDSUVfUElPUEFSRVJSKDFVKQorCisjZGVmaW5lIFNfVU5YU1BMQ1BMRVJSQyAgICA3CisjZGVmaW5lIFZfVU5YU1BMQ1BMRVJSQyh4KSAoKHgpIDw8IFNfVU5YU1BMQ1BMRVJSQykKKyNkZWZpbmUgRl9VTlhTUExDUExFUlJDICAgIFZfVU5YU1BMQ1BMRVJSQygxVSkKKworI2RlZmluZSBTX1VOWFNQTENQTEVSUlIgICAgNgorI2RlZmluZSBWX1VOWFNQTENQTEVSUlIoeCkgKCh4KSA8PCBTX1VOWFNQTENQTEVSUlIpCisjZGVmaW5lIEZfVU5YU1BMQ1BMRVJSUiAgICBWX1VOWFNQTENQTEVSUlIoMVUpCisKKyNkZWZpbmUgU19QRVhFUlIgICAgMAorI2RlZmluZSBWX1BFWEVSUih4KSAoKHgpIDw8IFNfUEVYRVJSKQorI2RlZmluZSBGX1BFWEVSUiAgICBWX1BFWEVSUigxVSkKKworI2RlZmluZSBBX1BDSUVfSU5UX0NBVVNFIDB4ODQKKworI2RlZmluZSBBX1BDSUVfQ0ZHIDB4ODgKKworI2RlZmluZSBTX1BDSUVfQ0xJREVDRU4gICAgMTYKKyNkZWZpbmUgVl9QQ0lFX0NMSURFQ0VOKHgpICgoeCkgPDwgU19QQ0lFX0NMSURFQ0VOKQorI2RlZmluZSBGX1BDSUVfQ0xJREVDRU4gICAgVl9QQ0lFX0NMSURFQ0VOKDFVKQorCisjZGVmaW5lIFNfQ1JTVFdSTU1PREUgICAgMAorI2RlZmluZSBWX0NSU1RXUk1NT0RFKHgpICgoeCkgPDwgU19DUlNUV1JNTU9ERSkKKyNkZWZpbmUgRl9DUlNUV1JNTU9ERSAgICBWX0NSU1RXUk1NT0RFKDFVKQorCisjZGVmaW5lIEFfUENJRV9NT0RFIDB4OGMKKworI2RlZmluZSBTX05VTUZTVFRSTlNFUVJYICAgIDEwCisjZGVmaW5lIE1fTlVNRlNUVFJOU0VRUlggICAgMHhmZgorI2RlZmluZSBWX05VTUZTVFRSTlNFUVJYKHgpICgoeCkgPDwgU19OVU1GU1RUUk5TRVFSWCkKKyNkZWZpbmUgR19OVU1GU1RUUk5TRVFSWCh4KSAoKCh4KSA+PiBTX05VTUZTVFRSTlNFUVJYKSAmIE1fTlVNRlNUVFJOU0VRUlgpCisKKyNkZWZpbmUgQV9QQ0lFX1BFWF9DVFJMMCAweDk4CisKKyNkZWZpbmUgU19OVU1GU1RUUk5TRVEgICAgMjIKKyNkZWZpbmUgTV9OVU1GU1RUUk5TRVEgICAgMHhmZgorI2RlZmluZSBWX05VTUZTVFRSTlNFUSh4KSAoKHgpIDw8IFNfTlVNRlNUVFJOU0VRKQorI2RlZmluZSBHX05VTUZTVFRSTlNFUSh4KSAoKCh4KSA+PiBTX05VTUZTVFRSTlNFUSkgJiBNX05VTUZTVFRSTlNFUSkKKworI2RlZmluZSBTX1JFUExBWUxNVCAgICAyCisjZGVmaW5lIE1fUkVQTEFZTE1UICAgIDB4ZmZmZmYKKworI2RlZmluZSBWX1JFUExBWUxNVCh4KSAoKHgpIDw8IFNfUkVQTEFZTE1UKQorCisjZGVmaW5lIEFfUENJRV9QRVhfQ1RSTDEgMHg5YworCisjZGVmaW5lIFNfVDNBX0FDS0xBVCAgICAwCisjZGVmaW5lIE1fVDNBX0FDS0xBVCAgICAweDdmZgorCisjZGVmaW5lIFZfVDNBX0FDS0xBVCh4KSAoKHgpIDw8IFNfVDNBX0FDS0xBVCkKKworI2RlZmluZSBTX0FDS0xBVCAgICAwCisjZGVmaW5lIE1fQUNLTEFUICAgIDB4MWZmZgorCisjZGVmaW5lIFZfQUNLTEFUKHgpICgoeCkgPDwgU19BQ0tMQVQpCisKKyNkZWZpbmUgQV9QQ0lFX1BFWF9FUlIgMHhhNAorCisjZGVmaW5lIEFfVDNEQkdfR1BJT19FTiAweGQwCisKKyNkZWZpbmUgU19HUElPMTFfT0VOICAgIDI3CisjZGVmaW5lIFZfR1BJTzExX09FTih4KSAoKHgpIDw8IFNfR1BJTzExX09FTikKKyNkZWZpbmUgRl9HUElPMTFfT0VOICAgIFZfR1BJTzExX09FTigxVSkKKworI2RlZmluZSBTX0dQSU8xMF9PRU4gICAgMjYKKyNkZWZpbmUgVl9HUElPMTBfT0VOKHgpICgoeCkgPDwgU19HUElPMTBfT0VOKQorI2RlZmluZSBGX0dQSU8xMF9PRU4gICAgVl9HUElPMTBfT0VOKDFVKQorCisjZGVmaW5lIFNfR1BJTzdfT0VOICAgIDIzCisjZGVmaW5lIFZfR1BJTzdfT0VOKHgpICgoeCkgPDwgU19HUElPN19PRU4pCisjZGVmaW5lIEZfR1BJTzdfT0VOICAgIFZfR1BJTzdfT0VOKDFVKQorCisjZGVmaW5lIFNfR1BJTzZfT0VOICAgIDIyCisjZGVmaW5lIFZfR1BJTzZfT0VOKHgpICgoeCkgPDwgU19HUElPNl9PRU4pCisjZGVmaW5lIEZfR1BJTzZfT0VOICAgIFZfR1BJTzZfT0VOKDFVKQorCisjZGVmaW5lIFNfR1BJTzVfT0VOICAgIDIxCisjZGVmaW5lIFZfR1BJTzVfT0VOKHgpICgoeCkgPDwgU19HUElPNV9PRU4pCisjZGVmaW5lIEZfR1BJTzVfT0VOICAgIFZfR1BJTzVfT0VOKDFVKQorCisjZGVmaW5lIFNfR1BJTzRfT0VOICAgIDIwCisjZGVmaW5lIFZfR1BJTzRfT0VOKHgpICgoeCkgPDwgU19HUElPNF9PRU4pCisjZGVmaW5lIEZfR1BJTzRfT0VOICAgIFZfR1BJTzRfT0VOKDFVKQorCisjZGVmaW5lIFNfR1BJTzJfT0VOICAgIDE4CisjZGVmaW5lIFZfR1BJTzJfT0VOKHgpICgoeCkgPDwgU19HUElPMl9PRU4pCisjZGVmaW5lIEZfR1BJTzJfT0VOICAgIFZfR1BJTzJfT0VOKDFVKQorCisjZGVmaW5lIFNfR1BJTzFfT0VOICAgIDE3CisjZGVmaW5lIFZfR1BJTzFfT0VOKHgpICgoeCkgPDwgU19HUElPMV9PRU4pCisjZGVmaW5lIEZfR1BJTzFfT0VOICAgIFZfR1BJTzFfT0VOKDFVKQorCisjZGVmaW5lIFNfR1BJTzBfT0VOICAgIDE2CisjZGVmaW5lIFZfR1BJTzBfT0VOKHgpICgoeCkgPDwgU19HUElPMF9PRU4pCisjZGVmaW5lIEZfR1BJTzBfT0VOICAgIFZfR1BJTzBfT0VOKDFVKQorCisjZGVmaW5lIFNfR1BJTzEwX09VVF9WQUwgICAgMTAKKyNkZWZpbmUgVl9HUElPMTBfT1VUX1ZBTCh4KSAoKHgpIDw8IFNfR1BJTzEwX09VVF9WQUwpCisjZGVmaW5lIEZfR1BJTzEwX09VVF9WQUwgICAgVl9HUElPMTBfT1VUX1ZBTCgxVSkKKworI2RlZmluZSBTX0dQSU83X09VVF9WQUwgICAgNworI2RlZmluZSBWX0dQSU83X09VVF9WQUwoeCkgKCh4KSA8PCBTX0dQSU83X09VVF9WQUwpCisjZGVmaW5lIEZfR1BJTzdfT1VUX1ZBTCAgICBWX0dQSU83X09VVF9WQUwoMVUpCisKKyNkZWZpbmUgU19HUElPNl9PVVRfVkFMICAgIDYKKyNkZWZpbmUgVl9HUElPNl9PVVRfVkFMKHgpICgoeCkgPDwgU19HUElPNl9PVVRfVkFMKQorI2RlZmluZSBGX0dQSU82X09VVF9WQUwgICAgVl9HUElPNl9PVVRfVkFMKDFVKQorCisjZGVmaW5lIFNfR1BJTzVfT1VUX1ZBTCAgICA1CisjZGVmaW5lIFZfR1BJTzVfT1VUX1ZBTCh4KSAoKHgpIDw8IFNfR1BJTzVfT1VUX1ZBTCkKKyNkZWZpbmUgRl9HUElPNV9PVVRfVkFMICAgIFZfR1BJTzVfT1VUX1ZBTCgxVSkKKworI2RlZmluZSBTX0dQSU80X09VVF9WQUwgICAgNAorI2RlZmluZSBWX0dQSU80X09VVF9WQUwoeCkgKCh4KSA8PCBTX0dQSU80X09VVF9WQUwpCisjZGVmaW5lIEZfR1BJTzRfT1VUX1ZBTCAgICBWX0dQSU80X09VVF9WQUwoMVUpCisKKyNkZWZpbmUgU19HUElPMl9PVVRfVkFMICAgIDIKKyNkZWZpbmUgVl9HUElPMl9PVVRfVkFMKHgpICgoeCkgPDwgU19HUElPMl9PVVRfVkFMKQorI2RlZmluZSBGX0dQSU8yX09VVF9WQUwgICAgVl9HUElPMl9PVVRfVkFMKDFVKQorCisjZGVmaW5lIFNfR1BJTzFfT1VUX1ZBTCAgICAxCisjZGVmaW5lIFZfR1BJTzFfT1VUX1ZBTCh4KSAoKHgpIDw8IFNfR1BJTzFfT1VUX1ZBTCkKKyNkZWZpbmUgRl9HUElPMV9PVVRfVkFMICAgIFZfR1BJTzFfT1VUX1ZBTCgxVSkKKworI2RlZmluZSBTX0dQSU8wX09VVF9WQUwgICAgMAorI2RlZmluZSBWX0dQSU8wX09VVF9WQUwoeCkgKCh4KSA8PCBTX0dQSU8wX09VVF9WQUwpCisjZGVmaW5lIEZfR1BJTzBfT1VUX1ZBTCAgICBWX0dQSU8wX09VVF9WQUwoMVUpCisKKyNkZWZpbmUgQV9UM0RCR19JTlRfRU5BQkxFIDB4ZDgKKworI2RlZmluZSBTX0dQSU8xMSAgICAxMQorI2RlZmluZSBWX0dQSU8xMSh4KSAoKHgpIDw8IFNfR1BJTzExKQorI2RlZmluZSBGX0dQSU8xMSAgICBWX0dQSU8xMSgxVSkKKworI2RlZmluZSBTX0dQSU8xMCAgICAxMAorI2RlZmluZSBWX0dQSU8xMCh4KSAoKHgpIDw8IFNfR1BJTzEwKQorI2RlZmluZSBGX0dQSU8xMCAgICBWX0dQSU8xMCgxVSkKKworI2RlZmluZSBTX0dQSU83ICAgIDcKKyNkZWZpbmUgVl9HUElPNyh4KSAoKHgpIDw8IFNfR1BJTzcpCisjZGVmaW5lIEZfR1BJTzcgICAgVl9HUElPNygxVSkKKworI2RlZmluZSBTX0dQSU82ICAgIDYKKyNkZWZpbmUgVl9HUElPNih4KSAoKHgpIDw8IFNfR1BJTzYpCisjZGVmaW5lIEZfR1BJTzYgICAgVl9HUElPNigxVSkKKworI2RlZmluZSBTX0dQSU81ICAgIDUKKyNkZWZpbmUgVl9HUElPNSh4KSAoKHgpIDw8IFNfR1BJTzUpCisjZGVmaW5lIEZfR1BJTzUgICAgVl9HUElPNSgxVSkKKworI2RlZmluZSBTX0dQSU80ICAgIDQKKyNkZWZpbmUgVl9HUElPNCh4KSAoKHgpIDw8IFNfR1BJTzQpCisjZGVmaW5lIEZfR1BJTzQgICAgVl9HUElPNCgxVSkKKworI2RlZmluZSBTX0dQSU8zICAgIDMKKyNkZWZpbmUgVl9HUElPMyh4KSAoKHgpIDw8IFNfR1BJTzMpCisjZGVmaW5lIEZfR1BJTzMgICAgVl9HUElPMygxVSkKKworI2RlZmluZSBTX0dQSU8yICAgIDIKKyNkZWZpbmUgVl9HUElPMih4KSAoKHgpIDw8IFNfR1BJTzIpCisjZGVmaW5lIEZfR1BJTzIgICAgVl9HUElPMigxVSkKKworI2RlZmluZSBTX0dQSU8xICAgIDEKKyNkZWZpbmUgVl9HUElPMSh4KSAoKHgpIDw8IFNfR1BJTzEpCisjZGVmaW5lIEZfR1BJTzEgICAgVl9HUElPMSgxVSkKKworI2RlZmluZSBTX0dQSU8wICAgIDAKKyNkZWZpbmUgVl9HUElPMCh4KSAoKHgpIDw8IFNfR1BJTzApCisjZGVmaW5lIEZfR1BJTzAgICAgVl9HUElPMCgxVSkKKworI2RlZmluZSBBX1QzREJHX0lOVF9DQVVTRSAweGRjCisKKyNkZWZpbmUgQV9UM0RCR19HUElPX0FDVF9MT1cgMHhmMAorCisjZGVmaW5lIE1DN19QTVJYX0JBU0VfQUREUiAweDEwMAorCisjZGVmaW5lIEFfTUM3X0NGRyAweDEwMAorCisjZGVmaW5lIFNfSUZFTiAgICAxMworI2RlZmluZSBWX0lGRU4oeCkgKCh4KSA8PCBTX0lGRU4pCisjZGVmaW5lIEZfSUZFTiAgICBWX0lGRU4oMVUpCisKKyNkZWZpbmUgU19URVJNMTUwICAgIDExCisjZGVmaW5lIFZfVEVSTTE1MCh4KSAoKHgpIDw8IFNfVEVSTTE1MCkKKyNkZWZpbmUgRl9URVJNMTUwICAgIFZfVEVSTTE1MCgxVSkKKworI2RlZmluZSBTX1NMT1cgICAgMTAKKyNkZWZpbmUgVl9TTE9XKHgpICgoeCkgPDwgU19TTE9XKQorI2RlZmluZSBGX1NMT1cgICAgVl9TTE9XKDFVKQorCisjZGVmaW5lIFNfV0lEVEggICAgOAorI2RlZmluZSBNX1dJRFRIICAgIDB4MworI2RlZmluZSBWX1dJRFRIKHgpICgoeCkgPDwgU19XSURUSCkKKyNkZWZpbmUgR19XSURUSCh4KSAoKCh4KSA+PiBTX1dJRFRIKSAmIE1fV0lEVEgpCisKKyNkZWZpbmUgU19CS1MgICAgNgorI2RlZmluZSBWX0JLUyh4KSAoKHgpIDw8IFNfQktTKQorI2RlZmluZSBGX0JLUyAgICBWX0JLUygxVSkKKworI2RlZmluZSBTX09SRyAgICA1CisjZGVmaW5lIFZfT1JHKHgpICgoeCkgPDwgU19PUkcpCisjZGVmaW5lIEZfT1JHICAgIFZfT1JHKDFVKQorCisjZGVmaW5lIFNfREVOICAgIDIKKyNkZWZpbmUgTV9ERU4gICAgMHg3CisjZGVmaW5lIFZfREVOKHgpICgoeCkgPDwgU19ERU4pCisjZGVmaW5lIEdfREVOKHgpICgoKHgpID4+IFNfREVOKSAmIE1fREVOKQorCisjZGVmaW5lIFNfUkRZICAgIDEKKyNkZWZpbmUgVl9SRFkoeCkgKCh4KSA8PCBTX1JEWSkKKyNkZWZpbmUgRl9SRFkgICAgVl9SRFkoMVUpCisKKyNkZWZpbmUgU19DTEtFTiAgICAwCisjZGVmaW5lIFZfQ0xLRU4oeCkgKCh4KSA8PCBTX0NMS0VOKQorI2RlZmluZSBGX0NMS0VOICAgIFZfQ0xLRU4oMVUpCisKKyNkZWZpbmUgQV9NQzdfTU9ERSAweDEwNAorCisjZGVmaW5lIFNfQlVTWSAgICAzMQorI2RlZmluZSBWX0JVU1koeCkgKCh4KSA8PCBTX0JVU1kpCisjZGVmaW5lIEZfQlVTWSAgICBWX0JVU1koMVUpCisKKyNkZWZpbmUgU19CVVNZICAgIDMxCisjZGVmaW5lIFZfQlVTWSh4KSAoKHgpIDw8IFNfQlVTWSkKKyNkZWZpbmUgRl9CVVNZICAgIFZfQlVTWSgxVSkKKworI2RlZmluZSBBX01DN19FWFRfTU9ERTEgMHgxMDgKKworI2RlZmluZSBBX01DN19FWFRfTU9ERTIgMHgxMGMKKworI2RlZmluZSBBX01DN19FWFRfTU9ERTMgMHgxMTAKKworI2RlZmluZSBBX01DN19QUkUgMHgxMTQKKworI2RlZmluZSBBX01DN19SRUYgMHgxMTgKKworI2RlZmluZSBTX1BSRVJFRkRJViAgICAxCisjZGVmaW5lIE1fUFJFUkVGRElWICAgIDB4M2ZmZgorI2RlZmluZSBWX1BSRVJFRkRJVih4KSAoKHgpIDw8IFNfUFJFUkVGRElWKQorCisjZGVmaW5lIFNfUEVSUkVGRU4gICAgMAorI2RlZmluZSBWX1BFUlJFRkVOKHgpICgoeCkgPDwgU19QRVJSRUZFTikKKyNkZWZpbmUgRl9QRVJSRUZFTiAgICBWX1BFUlJFRkVOKDFVKQorCisjZGVmaW5lIEFfTUM3X0RMTCAweDExYworCisjZGVmaW5lIFNfRExMRU5CICAgIDEKKyNkZWZpbmUgVl9ETExFTkIoeCkgKCh4KSA8PCBTX0RMTEVOQikKKyNkZWZpbmUgRl9ETExFTkIgICAgVl9ETExFTkIoMVUpCisKKyNkZWZpbmUgU19ETExSU1QgICAgMAorI2RlZmluZSBWX0RMTFJTVCh4KSAoKHgpIDw8IFNfRExMUlNUKQorI2RlZmluZSBGX0RMTFJTVCAgICBWX0RMTFJTVCgxVSkKKworI2RlZmluZSBBX01DN19QQVJNIDB4MTIwCisKKyNkZWZpbmUgU19BQ1RUT1BSRURMWSAgICAyNgorI2RlZmluZSBNX0FDVFRPUFJFRExZICAgIDB4ZgorI2RlZmluZSBWX0FDVFRPUFJFRExZKHgpICgoeCkgPDwgU19BQ1RUT1BSRURMWSkKKworI2RlZmluZSBTX0FDVFRPUkRXUkRMWSAgICAyMworI2RlZmluZSBNX0FDVFRPUkRXUkRMWSAgICAweDcKKyNkZWZpbmUgVl9BQ1RUT1JEV1JETFkoeCkgKCh4KSA8PCBTX0FDVFRPUkRXUkRMWSkKKworI2RlZmluZSBTX1BSRUNZQyAgICAyMAorI2RlZmluZSBNX1BSRUNZQyAgICAweDcKKyNkZWZpbmUgVl9QUkVDWUMoeCkgKCh4KSA8PCBTX1BSRUNZQykKKworI2RlZmluZSBTX1JFRkNZQyAgICAxMworI2RlZmluZSBNX1JFRkNZQyAgICAweDdmCisjZGVmaW5lIFZfUkVGQ1lDKHgpICgoeCkgPDwgU19SRUZDWUMpCisKKyNkZWZpbmUgU19CS0NZQyAgICA4CisjZGVmaW5lIE1fQktDWUMgICAgMHgxZgorI2RlZmluZSBWX0JLQ1lDKHgpICgoeCkgPDwgU19CS0NZQykKKworI2RlZmluZSBTX1dSVE9SRERMWSAgICA0CisjZGVmaW5lIE1fV1JUT1JERExZICAgIDB4ZgorI2RlZmluZSBWX1dSVE9SRERMWSh4KSAoKHgpIDw8IFNfV1JUT1JERExZKQorCisjZGVmaW5lIFNfUkRUT1dSRExZICAgIDAKKyNkZWZpbmUgTV9SRFRPV1JETFkgICAgMHhmCisjZGVmaW5lIFZfUkRUT1dSRExZKHgpICgoeCkgPDwgU19SRFRPV1JETFkpCisKKyNkZWZpbmUgQV9NQzdfQ0FMIDB4MTI4CisKKyNkZWZpbmUgU19CVVNZICAgIDMxCisjZGVmaW5lIFZfQlVTWSh4KSAoKHgpIDw8IFNfQlVTWSkKKyNkZWZpbmUgRl9CVVNZICAgIFZfQlVTWSgxVSkKKworI2RlZmluZSBTX0JVU1kgICAgMzEKKyNkZWZpbmUgVl9CVVNZKHgpICgoeCkgPDwgU19CVVNZKQorI2RlZmluZSBGX0JVU1kgICAgVl9CVVNZKDFVKQorCisjZGVmaW5lIFNfQ0FMX0ZBVUxUICAgIDMwCisjZGVmaW5lIFZfQ0FMX0ZBVUxUKHgpICgoeCkgPDwgU19DQUxfRkFVTFQpCisjZGVmaW5lIEZfQ0FMX0ZBVUxUICAgIFZfQ0FMX0ZBVUxUKDFVKQorCisjZGVmaW5lIFNfU0dMX0NBTF9FTiAgICAyMAorI2RlZmluZSBWX1NHTF9DQUxfRU4oeCkgKCh4KSA8PCBTX1NHTF9DQUxfRU4pCisjZGVmaW5lIEZfU0dMX0NBTF9FTiAgICBWX1NHTF9DQUxfRU4oMVUpCisKKyNkZWZpbmUgQV9NQzdfRVJSX0FERFIgMHgxMmMKKworI2RlZmluZSBBX01DN19FQ0MgMHgxMzAKKworI2RlZmluZSBTX0VDQ0NIS0VOICAgIDEKKyNkZWZpbmUgVl9FQ0NDSEtFTih4KSAoKHgpIDw8IFNfRUNDQ0hLRU4pCisjZGVmaW5lIEZfRUNDQ0hLRU4gICAgVl9FQ0NDSEtFTigxVSkKKworI2RlZmluZSBTX0VDQ0dFTkVOICAgIDAKKyNkZWZpbmUgVl9FQ0NHRU5FTih4KSAoKHgpIDw8IFNfRUNDR0VORU4pCisjZGVmaW5lIEZfRUNDR0VORU4gICAgVl9FQ0NHRU5FTigxVSkKKworI2RlZmluZSBBX01DN19DRV9BRERSIDB4MTM0CisKKyNkZWZpbmUgQV9NQzdfQ0VfREFUQTAgMHgxMzgKKworI2RlZmluZSBBX01DN19DRV9EQVRBMSAweDEzYworCisjZGVmaW5lIEFfTUM3X0NFX0RBVEEyIDB4MTQwCisKKyNkZWZpbmUgU19EQVRBICAgIDAKKyNkZWZpbmUgTV9EQVRBICAgIDB4ZmYKKworI2RlZmluZSBHX0RBVEEoeCkgKCgoeCkgPj4gU19EQVRBKSAmIE1fREFUQSkKKworI2RlZmluZSBBX01DN19VRV9BRERSIDB4MTQ0CisKKyNkZWZpbmUgQV9NQzdfVUVfREFUQTAgMHgxNDgKKworI2RlZmluZSBBX01DN19VRV9EQVRBMSAweDE0YworCisjZGVmaW5lIEFfTUM3X1VFX0RBVEEyIDB4MTUwCisKKyNkZWZpbmUgQV9NQzdfQkRfQUREUiAweDE1NAorCisjZGVmaW5lIFNfQUREUiAgICAzCisKKyNkZWZpbmUgTV9BRERSICAgIDB4MWZmZmZmZmYKKworI2RlZmluZSBBX01DN19CRF9EQVRBMCAweDE1OAorCisjZGVmaW5lIEFfTUM3X0JEX0RBVEExIDB4MTVjCisKKyNkZWZpbmUgQV9NQzdfQkRfT1AgMHgxNjQKKworI2RlZmluZSBTX09QICAgIDAKKworI2RlZmluZSBWX09QKHgpICgoeCkgPDwgU19PUCkKKyNkZWZpbmUgRl9PUCAgICBWX09QKDFVKQorCisjZGVmaW5lIEZfT1AgICAgVl9PUCgxVSkKKyNkZWZpbmUgQV9TRl9PUCAweDZkYworCisjZGVmaW5lIEFfTUM3X0JJU1RfQUREUl9CRUcgMHgxNjgKKworI2RlZmluZSBBX01DN19CSVNUX0FERFJfRU5EIDB4MTZjCisKKyNkZWZpbmUgQV9NQzdfQklTVF9EQVRBIDB4MTcwCisKKyNkZWZpbmUgQV9NQzdfQklTVF9PUCAweDE3NAorCisjZGVmaW5lIFNfQ09OVCAgICAzCisjZGVmaW5lIFZfQ09OVCh4KSAoKHgpIDw8IFNfQ09OVCkKKyNkZWZpbmUgRl9DT05UICAgIFZfQ09OVCgxVSkKKworI2RlZmluZSBGX0NPTlQgICAgVl9DT05UKDFVKQorCisjZGVmaW5lIEFfTUM3X0lOVF9FTkFCTEUgMHgxNzgKKworI2RlZmluZSBTX0FFICAgIDE3CisjZGVmaW5lIFZfQUUoeCkgKCh4KSA8PCBTX0FFKQorI2RlZmluZSBGX0FFICAgIFZfQUUoMVUpCisKKyNkZWZpbmUgU19QRSAgICAyCisjZGVmaW5lIE1fUEUgICAgMHg3ZmZmCisKKyNkZWZpbmUgVl9QRSh4KSAoKHgpIDw8IFNfUEUpCisKKyNkZWZpbmUgR19QRSh4KSAoKCh4KSA+PiBTX1BFKSAmIE1fUEUpCisKKyNkZWZpbmUgU19VRSAgICAxCisjZGVmaW5lIFZfVUUoeCkgKCh4KSA8PCBTX1VFKQorI2RlZmluZSBGX1VFICAgIFZfVUUoMVUpCisKKyNkZWZpbmUgU19DRSAgICAwCisjZGVmaW5lIFZfQ0UoeCkgKCh4KSA8PCBTX0NFKQorI2RlZmluZSBGX0NFICAgIFZfQ0UoMVUpCisKKyNkZWZpbmUgQV9NQzdfSU5UX0NBVVNFIDB4MTdjCisKKyNkZWZpbmUgTUM3X1BNVFhfQkFTRV9BRERSIDB4MTgwCisKKyNkZWZpbmUgTUM3X0NNX0JBU0VfQUREUiAweDIwMAorCisjZGVmaW5lIEFfQ0lNX0JPT1RfQ0ZHIDB4MjgwCisKKyNkZWZpbmUgU19CT09UQUREUiAgICAyCisjZGVmaW5lIE1fQk9PVEFERFIgICAgMHgzZmZmZmZmZgorI2RlZmluZSBWX0JPT1RBRERSKHgpICgoeCkgPDwgU19CT09UQUREUikKKworI2RlZmluZSBBX0NJTV9TRFJBTV9CQVNFX0FERFIgMHgyOGMKKworI2RlZmluZSBBX0NJTV9TRFJBTV9BRERSX1NJWkUgMHgyOTAKKworI2RlZmluZSBBX0NJTV9IT1NUX0lOVF9FTkFCTEUgMHgyOTgKKworI2RlZmluZSBBX0NJTV9IT1NUX0lOVF9DQVVTRSAweDI5YworCisjZGVmaW5lIFNfQkxLV1JQTElOVCAgICAxMgorI2RlZmluZSBWX0JMS1dSUExJTlQoeCkgKCh4KSA8PCBTX0JMS1dSUExJTlQpCisjZGVmaW5lIEZfQkxLV1JQTElOVCAgICBWX0JMS1dSUExJTlQoMVUpCisKKyNkZWZpbmUgU19CTEtSRFBMSU5UICAgIDExCisjZGVmaW5lIFZfQkxLUkRQTElOVCh4KSAoKHgpIDw8IFNfQkxLUkRQTElOVCkKKyNkZWZpbmUgRl9CTEtSRFBMSU5UICAgIFZfQkxLUkRQTElOVCgxVSkKKworI2RlZmluZSBTX0JMS1dSQ1RMSU5UICAgIDEwCisjZGVmaW5lIFZfQkxLV1JDVExJTlQoeCkgKCh4KSA8PCBTX0JMS1dSQ1RMSU5UKQorI2RlZmluZSBGX0JMS1dSQ1RMSU5UICAgIFZfQkxLV1JDVExJTlQoMVUpCisKKyNkZWZpbmUgU19CTEtSRENUTElOVCAgICA5CisjZGVmaW5lIFZfQkxLUkRDVExJTlQoeCkgKCh4KSA8PCBTX0JMS1JEQ1RMSU5UKQorI2RlZmluZSBGX0JMS1JEQ1RMSU5UICAgIFZfQkxLUkRDVExJTlQoMVUpCisKKyNkZWZpbmUgU19CTEtXUkZMQVNISU5UICAgIDgKKyNkZWZpbmUgVl9CTEtXUkZMQVNISU5UKHgpICgoeCkgPDwgU19CTEtXUkZMQVNISU5UKQorI2RlZmluZSBGX0JMS1dSRkxBU0hJTlQgICAgVl9CTEtXUkZMQVNISU5UKDFVKQorCisjZGVmaW5lIFNfQkxLUkRGTEFTSElOVCAgICA3CisjZGVmaW5lIFZfQkxLUkRGTEFTSElOVCh4KSAoKHgpIDw8IFNfQkxLUkRGTEFTSElOVCkKKyNkZWZpbmUgRl9CTEtSREZMQVNISU5UICAgIFZfQkxLUkRGTEFTSElOVCgxVSkKKworI2RlZmluZSBTX1NHTFdSRkxBU0hJTlQgICAgNgorI2RlZmluZSBWX1NHTFdSRkxBU0hJTlQoeCkgKCh4KSA8PCBTX1NHTFdSRkxBU0hJTlQpCisjZGVmaW5lIEZfU0dMV1JGTEFTSElOVCAgICBWX1NHTFdSRkxBU0hJTlQoMVUpCisKKyNkZWZpbmUgU19XUkJMS0ZMQVNISU5UICAgIDUKKyNkZWZpbmUgVl9XUkJMS0ZMQVNISU5UKHgpICgoeCkgPDwgU19XUkJMS0ZMQVNISU5UKQorI2RlZmluZSBGX1dSQkxLRkxBU0hJTlQgICAgVl9XUkJMS0ZMQVNISU5UKDFVKQorCisjZGVmaW5lIFNfQkxLV1JCT09USU5UICAgIDQKKyNkZWZpbmUgVl9CTEtXUkJPT1RJTlQoeCkgKCh4KSA8PCBTX0JMS1dSQk9PVElOVCkKKyNkZWZpbmUgRl9CTEtXUkJPT1RJTlQgICAgVl9CTEtXUkJPT1RJTlQoMVUpCisKKyNkZWZpbmUgU19GTEFTSFJBTkdFSU5UICAgIDIKKyNkZWZpbmUgVl9GTEFTSFJBTkdFSU5UKHgpICgoeCkgPDwgU19GTEFTSFJBTkdFSU5UKQorI2RlZmluZSBGX0ZMQVNIUkFOR0VJTlQgICAgVl9GTEFTSFJBTkdFSU5UKDFVKQorCisjZGVmaW5lIFNfU0RSQU1SQU5HRUlOVCAgICAxCisjZGVmaW5lIFZfU0RSQU1SQU5HRUlOVCh4KSAoKHgpIDw8IFNfU0RSQU1SQU5HRUlOVCkKKyNkZWZpbmUgRl9TRFJBTVJBTkdFSU5UICAgIFZfU0RSQU1SQU5HRUlOVCgxVSkKKworI2RlZmluZSBTX1JTVkRTUEFDRUlOVCAgICAwCisjZGVmaW5lIFZfUlNWRFNQQUNFSU5UKHgpICgoeCkgPDwgU19SU1ZEU1BBQ0VJTlQpCisjZGVmaW5lIEZfUlNWRFNQQUNFSU5UICAgIFZfUlNWRFNQQUNFSU5UKDFVKQorCisjZGVmaW5lIEFfQ0lNX0hPU1RfQUNDX0NUUkwgMHgyYjAKKworI2RlZmluZSBTX0hPU1RCVVNZICAgIDE3CisjZGVmaW5lIFZfSE9TVEJVU1koeCkgKCh4KSA8PCBTX0hPU1RCVVNZKQorI2RlZmluZSBGX0hPU1RCVVNZICAgIFZfSE9TVEJVU1koMVUpCisKKyNkZWZpbmUgQV9DSU1fSE9TVF9BQ0NfREFUQSAweDJiNAorCisjZGVmaW5lIEFfVFBfSU5fQ09ORklHIDB4MzAwCisKKyNkZWZpbmUgU19OSUNNT0RFICAgIDE0CisjZGVmaW5lIFZfTklDTU9ERSh4KSAoKHgpIDw8IFNfTklDTU9ERSkKKyNkZWZpbmUgRl9OSUNNT0RFICAgIFZfTklDTU9ERSgxVSkKKworI2RlZmluZSBGX05JQ01PREUgICAgVl9OSUNNT0RFKDFVKQorCisjZGVmaW5lIFNfSVBWNkVOQUJMRSAgICAxNQorI2RlZmluZSBWX0lQVjZFTkFCTEUoeCkgKCh4KSA8PCBTX0lQVjZFTkFCTEUpCisjZGVmaW5lIEZfSVBWNkVOQUJMRSAgICBWX0lQVjZFTkFCTEUoMVUpCisKKyNkZWZpbmUgQV9UUF9PVVRfQ09ORklHIDB4MzA0CisKKyNkZWZpbmUgU19WTEFORVhUUkFDVElPTkVOQUJMRSAgICAxMgorCisjZGVmaW5lIEFfVFBfR0xPQkFMX0NPTkZJRyAweDMwOAorCisjZGVmaW5lIFNfVFhQQUNJTkdFTkFCTEUgICAgMjQKKyNkZWZpbmUgVl9UWFBBQ0lOR0VOQUJMRSh4KSAoKHgpIDw8IFNfVFhQQUNJTkdFTkFCTEUpCisjZGVmaW5lIEZfVFhQQUNJTkdFTkFCTEUgICAgVl9UWFBBQ0lOR0VOQUJMRSgxVSkKKworI2RlZmluZSBTX1BBVEhNVFUgICAgMTUKKyNkZWZpbmUgVl9QQVRITVRVKHgpICgoeCkgPDwgU19QQVRITVRVKQorI2RlZmluZSBGX1BBVEhNVFUgICAgVl9QQVRITVRVKDFVKQorCisjZGVmaW5lIFNfSVBDSEVDS1NVTU9GRkxPQUQgICAgMTMKKyNkZWZpbmUgVl9JUENIRUNLU1VNT0ZGTE9BRCh4KSAoKHgpIDw8IFNfSVBDSEVDS1NVTU9GRkxPQUQpCisjZGVmaW5lIEZfSVBDSEVDS1NVTU9GRkxPQUQgICAgVl9JUENIRUNLU1VNT0ZGTE9BRCgxVSkKKworI2RlZmluZSBTX1VEUENIRUNLU1VNT0ZGTE9BRCAgICAxMgorI2RlZmluZSBWX1VEUENIRUNLU1VNT0ZGTE9BRCh4KSAoKHgpIDw8IFNfVURQQ0hFQ0tTVU1PRkZMT0FEKQorI2RlZmluZSBGX1VEUENIRUNLU1VNT0ZGTE9BRCAgICBWX1VEUENIRUNLU1VNT0ZGTE9BRCgxVSkKKworI2RlZmluZSBTX1RDUENIRUNLU1VNT0ZGTE9BRCAgICAxMQorI2RlZmluZSBWX1RDUENIRUNLU1VNT0ZGTE9BRCh4KSAoKHgpIDw8IFNfVENQQ0hFQ0tTVU1PRkZMT0FEKQorI2RlZmluZSBGX1RDUENIRUNLU1VNT0ZGTE9BRCAgICBWX1RDUENIRUNLU1VNT0ZGTE9BRCgxVSkKKworI2RlZmluZSBTX0lQVFRMICAgIDAKKyNkZWZpbmUgTV9JUFRUTCAgICAweGZmCisjZGVmaW5lIFZfSVBUVEwoeCkgKCh4KSA8PCBTX0lQVFRMKQorCisjZGVmaW5lIEFfVFBfQ01NX01NX0JBU0UgMHgzMTQKKworI2RlZmluZSBBX1RQX0NNTV9USU1FUl9CQVNFIDB4MzE4CisKKyNkZWZpbmUgU19DTVRJTUVSTUFYTlVNICAgIDI4CisjZGVmaW5lIE1fQ01USU1FUk1BWE5VTSAgICAweDMKKyNkZWZpbmUgVl9DTVRJTUVSTUFYTlVNKHgpICgoeCkgPDwgU19DTVRJTUVSTUFYTlVNKQorCisjZGVmaW5lIEFfVFBfUE1NX1NJWkUgMHgzMWMKKworI2RlZmluZSBBX1RQX1BNTV9UWF9CQVNFIDB4MzIwCisKKyNkZWZpbmUgQV9UUF9QTU1fUlhfQkFTRSAweDMyOAorCisjZGVmaW5lIEFfVFBfUE1NX1JYX1BBR0VfU0laRSAweDMyYworCisjZGVmaW5lIEFfVFBfUE1NX1JYX01BWF9QQUdFIDB4MzMwCisKKyNkZWZpbmUgQV9UUF9QTU1fVFhfUEFHRV9TSVpFIDB4MzM0CisKKyNkZWZpbmUgQV9UUF9QTU1fVFhfTUFYX1BBR0UgMHgzMzgKKworI2RlZmluZSBBX1RQX1RDUF9PUFRJT05TIDB4MzQwCisKKyNkZWZpbmUgU19NVFVERUZBVUxUICAgIDE2CisjZGVmaW5lIE1fTVRVREVGQVVMVCAgICAweGZmZmYKKyNkZWZpbmUgVl9NVFVERUZBVUxUKHgpICgoeCkgPDwgU19NVFVERUZBVUxUKQorCisjZGVmaW5lIFNfTVRVRU5BQkxFICAgIDEwCisjZGVmaW5lIFZfTVRVRU5BQkxFKHgpICgoeCkgPDwgU19NVFVFTkFCTEUpCisjZGVmaW5lIEZfTVRVRU5BQkxFICAgIFZfTVRVRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfU0FDS1JYICAgIDgKKyNkZWZpbmUgVl9TQUNLUlgoeCkgKCh4KSA8PCBTX1NBQ0tSWCkKKyNkZWZpbmUgRl9TQUNLUlggICAgVl9TQUNLUlgoMVUpCisKKyNkZWZpbmUgU19TQUNLTU9ERSAgICA0CisKKyNkZWZpbmUgTV9TQUNLTU9ERSAgICAweDMKKworI2RlZmluZSBWX1NBQ0tNT0RFKHgpICgoeCkgPDwgU19TQUNLTU9ERSkKKworI2RlZmluZSBTX1dJTkRPV1NDQUxFTU9ERSAgICAyCisjZGVmaW5lIE1fV0lORE9XU0NBTEVNT0RFICAgIDB4MworI2RlZmluZSBWX1dJTkRPV1NDQUxFTU9ERSh4KSAoKHgpIDw8IFNfV0lORE9XU0NBTEVNT0RFKQorCisjZGVmaW5lIFNfVElNRVNUQU1QU01PREUgICAgMAorCisjZGVmaW5lIE1fVElNRVNUQU1QU01PREUgICAgMHgzCisKKyNkZWZpbmUgVl9USU1FU1RBTVBTTU9ERSh4KSAoKHgpIDw8IFNfVElNRVNUQU1QU01PREUpCisKKyNkZWZpbmUgQV9UUF9EQUNLX0NPTkZJRyAweDM0NAorCisjZGVmaW5lIFNfQVVUT1NUQVRFMyAgICAzMAorI2RlZmluZSBNX0FVVE9TVEFURTMgICAgMHgzCisjZGVmaW5lIFZfQVVUT1NUQVRFMyh4KSAoKHgpIDw8IFNfQVVUT1NUQVRFMykKKworI2RlZmluZSBTX0FVVE9TVEFURTIgICAgMjgKKyNkZWZpbmUgTV9BVVRPU1RBVEUyICAgIDB4MworI2RlZmluZSBWX0FVVE9TVEFURTIoeCkgKCh4KSA8PCBTX0FVVE9TVEFURTIpCisKKyNkZWZpbmUgU19BVVRPU1RBVEUxICAgIDI2CisjZGVmaW5lIE1fQVVUT1NUQVRFMSAgICAweDMKKyNkZWZpbmUgVl9BVVRPU1RBVEUxKHgpICgoeCkgPDwgU19BVVRPU1RBVEUxKQorCisjZGVmaW5lIFNfQllURVRIUkVTSE9MRCAgICA1CisjZGVmaW5lIE1fQllURVRIUkVTSE9MRCAgICAweGZmZmZmCisjZGVmaW5lIFZfQllURVRIUkVTSE9MRCh4KSAoKHgpIDw8IFNfQllURVRIUkVTSE9MRCkKKworI2RlZmluZSBTX01TU1RIUkVTSE9MRCAgICAzCisjZGVmaW5lIE1fTVNTVEhSRVNIT0xEICAgIDB4MworI2RlZmluZSBWX01TU1RIUkVTSE9MRCh4KSAoKHgpIDw8IFNfTVNTVEhSRVNIT0xEKQorCisjZGVmaW5lIFNfQVVUT0NBUkVGVUwgICAgMgorI2RlZmluZSBWX0FVVE9DQVJFRlVMKHgpICgoeCkgPDwgU19BVVRPQ0FSRUZVTCkKKyNkZWZpbmUgRl9BVVRPQ0FSRUZVTCAgICBWX0FVVE9DQVJFRlVMKDFVKQorCisjZGVmaW5lIFNfQVVUT0VOQUJMRSAgICAxCisjZGVmaW5lIFZfQVVUT0VOQUJMRSh4KSAoKHgpIDw8IFNfQVVUT0VOQUJMRSkKKyNkZWZpbmUgRl9BVVRPRU5BQkxFICAgIFZfQVVUT0VOQUJMRSgxVSkKKworI2RlZmluZSBTX0RBQ0tfTU9ERSAgICAwCisjZGVmaW5lIFZfREFDS19NT0RFKHgpICgoeCkgPDwgU19EQUNLX01PREUpCisjZGVmaW5lIEZfREFDS19NT0RFICAgIFZfREFDS19NT0RFKDFVKQorCisjZGVmaW5lIEFfVFBfUENfQ09ORklHIDB4MzQ4CisKKyNkZWZpbmUgU19UWFRPU1FVRVVFTUFQTU9ERSAgICAyNgorI2RlZmluZSBWX1RYVE9TUVVFVUVNQVBNT0RFKHgpICgoeCkgPDwgU19UWFRPU1FVRVVFTUFQTU9ERSkKKyNkZWZpbmUgRl9UWFRPU1FVRVVFTUFQTU9ERSAgICBWX1RYVE9TUVVFVUVNQVBNT0RFKDFVKQorCisjZGVmaW5lIFNfRU5BQkxFRVBDTURBRlVMTCAgICAyMworI2RlZmluZSBWX0VOQUJMRUVQQ01EQUZVTEwoeCkgKCh4KSA8PCBTX0VOQUJMRUVQQ01EQUZVTEwpCisjZGVmaW5lIEZfRU5BQkxFRVBDTURBRlVMTCAgICBWX0VOQUJMRUVQQ01EQUZVTEwoMVUpCisKKyNkZWZpbmUgU19NT0RVTEFURVVOSU9OTU9ERSAgICAyMgorI2RlZmluZSBWX01PRFVMQVRFVU5JT05NT0RFKHgpICgoeCkgPDwgU19NT0RVTEFURVVOSU9OTU9ERSkKKyNkZWZpbmUgRl9NT0RVTEFURVVOSU9OTU9ERSAgICBWX01PRFVMQVRFVU5JT05NT0RFKDFVKQorCisjZGVmaW5lIFNfVFhERUZFUkVOQUJMRSAgICAyMAorI2RlZmluZSBWX1RYREVGRVJFTkFCTEUoeCkgKCh4KSA8PCBTX1RYREVGRVJFTkFCTEUpCisjZGVmaW5lIEZfVFhERUZFUkVOQUJMRSAgICBWX1RYREVGRVJFTkFCTEUoMVUpCisKKyNkZWZpbmUgU19SWENPTkdFU1RJT05NT0RFICAgIDE5CisjZGVmaW5lIFZfUlhDT05HRVNUSU9OTU9ERSh4KSAoKHgpIDw8IFNfUlhDT05HRVNUSU9OTU9ERSkKKyNkZWZpbmUgRl9SWENPTkdFU1RJT05NT0RFICAgIFZfUlhDT05HRVNUSU9OTU9ERSgxVSkKKworI2RlZmluZSBTX0hFQVJCRUFUREFDSyAgICAxNgorI2RlZmluZSBWX0hFQVJCRUFUREFDSyh4KSAoKHgpIDw8IFNfSEVBUkJFQVREQUNLKQorI2RlZmluZSBGX0hFQVJCRUFUREFDSyAgICBWX0hFQVJCRUFUREFDSygxVSkKKworI2RlZmluZSBTX1RYQ09OR0VTVElPTk1PREUgICAgMTUKKyNkZWZpbmUgVl9UWENPTkdFU1RJT05NT0RFKHgpICgoeCkgPDwgU19UWENPTkdFU1RJT05NT0RFKQorI2RlZmluZSBGX1RYQ09OR0VTVElPTk1PREUgICAgVl9UWENPTkdFU1RJT05NT0RFKDFVKQorCisjZGVmaW5lIFNfRU5BQkxFT0NTUElGVUxMICAgIDMwCisjZGVmaW5lIFZfRU5BQkxFT0NTUElGVUxMKHgpICgoeCkgPDwgU19FTkFCTEVPQ1NQSUZVTEwpCisjZGVmaW5lIEZfRU5BQkxFT0NTUElGVUxMICAgIFZfRU5BQkxFT0NTUElGVUxMKDFVKQorCisjZGVmaW5lIFNfTE9DS1RJRCAgICAyOAorI2RlZmluZSBWX0xPQ0tUSUQoeCkgKCh4KSA8PCBTX0xPQ0tUSUQpCisjZGVmaW5lIEZfTE9DS1RJRCAgICBWX0xPQ0tUSUQoMVUpCisKKyNkZWZpbmUgQV9UUF9QQ19DT05GSUcyIDB4MzRjCisKKyNkZWZpbmUgU19DSERSQUZVTEwgICAgNAorI2RlZmluZSBWX0NIRFJBRlVMTCh4KSAoKHgpIDw8IFNfQ0hEUkFGVUxMKQorI2RlZmluZSBGX0NIRFJBRlVMTCAgICBWX0NIRFJBRlVMTCgxVSkKKworI2RlZmluZSBBX1RQX1RDUF9CQUNLT0ZGX1JFRzAgMHgzNTAKKworI2RlZmluZSBBX1RQX1RDUF9CQUNLT0ZGX1JFRzEgMHgzNTQKKworI2RlZmluZSBBX1RQX1RDUF9CQUNLT0ZGX1JFRzIgMHgzNTgKKworI2RlZmluZSBBX1RQX1RDUF9CQUNLT0ZGX1JFRzMgMHgzNWMKKworI2RlZmluZSBBX1RQX1BBUkFfUkVHMiAweDM2OAorCisjZGVmaW5lIFNfTUFYUlhEQVRBICAgIDE2CisjZGVmaW5lIE1fTUFYUlhEQVRBICAgIDB4ZmZmZgorI2RlZmluZSBWX01BWFJYREFUQSh4KSAoKHgpIDw8IFNfTUFYUlhEQVRBKQorCisjZGVmaW5lIFNfUlhDT0FMRVNDRVNJWkUgICAgMAorI2RlZmluZSBNX1JYQ09BTEVTQ0VTSVpFICAgIDB4ZmZmZgorI2RlZmluZSBWX1JYQ09BTEVTQ0VTSVpFKHgpICgoeCkgPDwgU19SWENPQUxFU0NFU0laRSkKKworI2RlZmluZSBBX1RQX1BBUkFfUkVHMyAweDM2YworCisjZGVmaW5lIFNfVFhEQVRBQUNLSURYICAgIDE2CisjZGVmaW5lIE1fVFhEQVRBQUNLSURYICAgIDB4ZgorCisjZGVmaW5lIFZfVFhEQVRBQUNLSURYKHgpICgoeCkgPDwgU19UWERBVEFBQ0tJRFgpCisKKyNkZWZpbmUgU19UWFBBQ0VBVVRPU1RSSUNUICAgIDEwCisjZGVmaW5lIFZfVFhQQUNFQVVUT1NUUklDVCh4KSAoKHgpIDw8IFNfVFhQQUNFQVVUT1NUUklDVCkKKyNkZWZpbmUgRl9UWFBBQ0VBVVRPU1RSSUNUICAgIFZfVFhQQUNFQVVUT1NUUklDVCgxVSkKKworI2RlZmluZSBTX1RYUEFDRUZJWEVEICAgIDkKKyNkZWZpbmUgVl9UWFBBQ0VGSVhFRCh4KSAoKHgpIDw8IFNfVFhQQUNFRklYRUQpCisjZGVmaW5lIEZfVFhQQUNFRklYRUQgICAgVl9UWFBBQ0VGSVhFRCgxVSkKKworI2RlZmluZSBTX1RYUEFDRUFVVE8gICAgOAorI2RlZmluZSBWX1RYUEFDRUFVVE8oeCkgKCh4KSA8PCBTX1RYUEFDRUFVVE8pCisjZGVmaW5lIEZfVFhQQUNFQVVUTyAgICBWX1RYUEFDRUFVVE8oMVUpCisKKyNkZWZpbmUgU19SWENPQUxFU0NFRU5BQkxFICAgIDEKKyNkZWZpbmUgVl9SWENPQUxFU0NFRU5BQkxFKHgpICgoeCkgPDwgU19SWENPQUxFU0NFRU5BQkxFKQorI2RlZmluZSBGX1JYQ09BTEVTQ0VFTkFCTEUgICAgVl9SWENPQUxFU0NFRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfUlhDT0FMRVNDRVBTSEVOICAgIDAKKyNkZWZpbmUgVl9SWENPQUxFU0NFUFNIRU4oeCkgKCh4KSA8PCBTX1JYQ09BTEVTQ0VQU0hFTikKKyNkZWZpbmUgRl9SWENPQUxFU0NFUFNIRU4gICAgVl9SWENPQUxFU0NFUFNIRU4oMVUpCisKKyNkZWZpbmUgQV9UUF9QQVJBX1JFRzQgMHgzNzAKKworI2RlZmluZSBBX1RQX1BBUkFfUkVHNiAweDM3OAorCisjZGVmaW5lIFNfVDNBX0VOQUJMRUVTTkQgICAgMTMKKyNkZWZpbmUgVl9UM0FfRU5BQkxFRVNORCh4KSAoKHgpIDw8IFNfVDNBX0VOQUJMRUVTTkQpCisjZGVmaW5lIEZfVDNBX0VOQUJMRUVTTkQgICAgVl9UM0FfRU5BQkxFRVNORCgxVSkKKworI2RlZmluZSBTX0VOQUJMRUVTTkQgICAgMTEKKyNkZWZpbmUgVl9FTkFCTEVFU05EKHgpICgoeCkgPDwgU19FTkFCTEVFU05EKQorI2RlZmluZSBGX0VOQUJMRUVTTkQgICAgVl9FTkFCTEVFU05EKDFVKQorCisjZGVmaW5lIEFfVFBfUEFSQV9SRUc3IDB4MzdjCisKKyNkZWZpbmUgU19QTU1BWFhGRVJMRU4xICAgIDE2CisjZGVmaW5lIE1fUE1NQVhYRkVSTEVOMSAgICAweGZmZmYKKyNkZWZpbmUgVl9QTU1BWFhGRVJMRU4xKHgpICgoeCkgPDwgU19QTU1BWFhGRVJMRU4xKQorCisjZGVmaW5lIFNfUE1NQVhYRkVSTEVOMCAgICAwCisjZGVmaW5lIE1fUE1NQVhYRkVSTEVOMCAgICAweGZmZmYKKyNkZWZpbmUgVl9QTU1BWFhGRVJMRU4wKHgpICgoeCkgPDwgU19QTU1BWFhGRVJMRU4wKQorCisjZGVmaW5lIEFfVFBfVElNRVJfUkVTT0xVVElPTiAweDM5MAorCisjZGVmaW5lIFNfVElNRVJSRVNPTFVUSU9OICAgIDE2CisjZGVmaW5lIE1fVElNRVJSRVNPTFVUSU9OICAgIDB4ZmYKKyNkZWZpbmUgVl9USU1FUlJFU09MVVRJT04oeCkgKCh4KSA8PCBTX1RJTUVSUkVTT0xVVElPTikKKworI2RlZmluZSBTX1RJTUVTVEFNUFJFU09MVVRJT04gICAgOAorI2RlZmluZSBNX1RJTUVTVEFNUFJFU09MVVRJT04gICAgMHhmZgorI2RlZmluZSBWX1RJTUVTVEFNUFJFU09MVVRJT04oeCkgKCh4KSA8PCBTX1RJTUVTVEFNUFJFU09MVVRJT04pCisKKyNkZWZpbmUgU19ERUxBWUVEQUNLUkVTT0xVVElPTiAgICAwCisjZGVmaW5lIE1fREVMQVlFREFDS1JFU09MVVRJT04gICAgMHhmZgorI2RlZmluZSBWX0RFTEFZRURBQ0tSRVNPTFVUSU9OKHgpICgoeCkgPDwgU19ERUxBWUVEQUNLUkVTT0xVVElPTikKKworI2RlZmluZSBBX1RQX01TTCAweDM5NAorCisjZGVmaW5lIEFfVFBfUlhUX01JTiAweDM5OAorCisjZGVmaW5lIEFfVFBfUlhUX01BWCAweDM5YworCisjZGVmaW5lIEFfVFBfUEVSU19NSU4gMHgzYTAKKworI2RlZmluZSBBX1RQX1BFUlNfTUFYIDB4M2E0CisKKyNkZWZpbmUgQV9UUF9LRUVQX0lETEUgMHgzYTgKKworI2RlZmluZSBBX1RQX0tFRVBfSU5UVkwgMHgzYWMKKworI2RlZmluZSBBX1RQX0lOSVRfU1JUVCAweDNiMAorCisjZGVmaW5lIEFfVFBfREFDS19USU1FUiAweDNiNAorCisjZGVmaW5lIEFfVFBfRklOV0FJVDJfVElNRVIgMHgzYjgKKworI2RlZmluZSBBX1RQX1NISUZUX0NOVCAweDNjMAorCisjZGVmaW5lIFNfU1lOU0hJRlRNQVggICAgMjQKKworI2RlZmluZSBNX1NZTlNISUZUTUFYICAgIDB4ZmYKKworI2RlZmluZSBWX1NZTlNISUZUTUFYKHgpICgoeCkgPDwgU19TWU5TSElGVE1BWCkKKworI2RlZmluZSBTX1JYVFNISUZUTUFYUjEgICAgMjAKKworI2RlZmluZSBNX1JYVFNISUZUTUFYUjEgICAgMHhmCisKKyNkZWZpbmUgVl9SWFRTSElGVE1BWFIxKHgpICgoeCkgPDwgU19SWFRTSElGVE1BWFIxKQorCisjZGVmaW5lIFNfUlhUU0hJRlRNQVhSMiAgICAxNgorCisjZGVmaW5lIE1fUlhUU0hJRlRNQVhSMiAgICAweGYKKworI2RlZmluZSBWX1JYVFNISUZUTUFYUjIoeCkgKCh4KSA8PCBTX1JYVFNISUZUTUFYUjIpCisKKyNkZWZpbmUgU19QRVJTSElGVEJBQ0tPRkZNQVggICAgMTIKKyNkZWZpbmUgTV9QRVJTSElGVEJBQ0tPRkZNQVggICAgMHhmCisjZGVmaW5lIFZfUEVSU0hJRlRCQUNLT0ZGTUFYKHgpICgoeCkgPDwgU19QRVJTSElGVEJBQ0tPRkZNQVgpCisKKyNkZWZpbmUgU19QRVJTSElGVE1BWCAgICA4CisjZGVmaW5lIE1fUEVSU0hJRlRNQVggICAgMHhmCisjZGVmaW5lIFZfUEVSU0hJRlRNQVgoeCkgKCh4KSA8PCBTX1BFUlNISUZUTUFYKQorCisjZGVmaW5lIFNfS0VFUEFMSVZFTUFYICAgIDAKKworI2RlZmluZSBNX0tFRVBBTElWRU1BWCAgICAweGZmCisKKyNkZWZpbmUgVl9LRUVQQUxJVkVNQVgoeCkgKCh4KSA8PCBTX0tFRVBBTElWRU1BWCkKKworI2RlZmluZSBBX1RQX01UVV9QT1JUX1RBQkxFIDB4M2QwCisKKyNkZWZpbmUgQV9UUF9DQ1RSTF9UQUJMRSAweDNkYworCisjZGVmaW5lIEFfVFBfTVRVX1RBQkxFIDB4M2U0CisKKyNkZWZpbmUgQV9UUF9SU1NfTUFQX1RBQkxFIDB4M2U4CisKKyNkZWZpbmUgQV9UUF9SU1NfTEtQX1RBQkxFIDB4M2VjCisKKyNkZWZpbmUgQV9UUF9SU1NfQ09ORklHIDB4M2YwCisKKyNkZWZpbmUgU19UTkw0VFVQRU4gICAgMjkKKyNkZWZpbmUgVl9UTkw0VFVQRU4oeCkgKCh4KSA8PCBTX1ROTDRUVVBFTikKKyNkZWZpbmUgRl9UTkw0VFVQRU4gICAgVl9UTkw0VFVQRU4oMVUpCisKKyNkZWZpbmUgU19UTkwyVFVQRU4gICAgMjgKKyNkZWZpbmUgVl9UTkwyVFVQRU4oeCkgKCh4KSA8PCBTX1ROTDJUVVBFTikKKyNkZWZpbmUgRl9UTkwyVFVQRU4gICAgVl9UTkwyVFVQRU4oMVUpCisKKyNkZWZpbmUgU19UTkxQUlRFTiAgICAyNgorI2RlZmluZSBWX1ROTFBSVEVOKHgpICgoeCkgPDwgU19UTkxQUlRFTikKKyNkZWZpbmUgRl9UTkxQUlRFTiAgICBWX1ROTFBSVEVOKDFVKQorCisjZGVmaW5lIFNfVE5MTUFQRU4gICAgMjUKKyNkZWZpbmUgVl9UTkxNQVBFTih4KSAoKHgpIDw8IFNfVE5MTUFQRU4pCisjZGVmaW5lIEZfVE5MTUFQRU4gICAgVl9UTkxNQVBFTigxVSkKKworI2RlZmluZSBTX1ROTExLUEVOICAgIDI0CisjZGVmaW5lIFZfVE5MTEtQRU4oeCkgKCh4KSA8PCBTX1ROTExLUEVOKQorI2RlZmluZSBGX1ROTExLUEVOICAgIFZfVE5MTEtQRU4oMVUpCisKKyNkZWZpbmUgU19SUkNQTENQVVNJWkUgICAgNAorI2RlZmluZSBNX1JSQ1BMQ1BVU0laRSAgICAweDcKKyNkZWZpbmUgVl9SUkNQTENQVVNJWkUoeCkgKCh4KSA8PCBTX1JSQ1BMQ1BVU0laRSkKKworI2RlZmluZSBTX1JRRkVFREJBQ0tFTkFCTEUgICAgMworI2RlZmluZSBWX1JRRkVFREJBQ0tFTkFCTEUoeCkgKCh4KSA8PCBTX1JRRkVFREJBQ0tFTkFCTEUpCisjZGVmaW5lIEZfUlFGRUVEQkFDS0VOQUJMRSAgICBWX1JRRkVFREJBQ0tFTkFCTEUoMVUpCisKKyNkZWZpbmUgU19ESVNBQkxFICAgIDAKKworI2RlZmluZSBBX1RQX1RNX1BJT19BRERSIDB4NDE4CisKKyNkZWZpbmUgQV9UUF9UTV9QSU9fREFUQSAweDQxYworCisjZGVmaW5lIEFfVFBfVFhfTU9EX1FVRV9UQUJMRSAweDQyMAorCisjZGVmaW5lIEFfVFBfVFhfUkVTT1VSQ0VfTElNSVQgMHg0MjQKKworI2RlZmluZSBBX1RQX1RYX01PRF9RVUVVRV9SRVFfTUFQIDB4NDI4CisKKyNkZWZpbmUgU19UWF9NT0RfUVVFVUVfUkVRX01BUCAgICAwCisjZGVmaW5lIE1fVFhfTU9EX1FVRVVFX1JFUV9NQVAgICAgMHhmZgorI2RlZmluZSBWX1RYX01PRF9RVUVVRV9SRVFfTUFQKHgpICgoeCkgPDwgU19UWF9NT0RfUVVFVUVfUkVRX01BUCkKKworI2RlZmluZSBBX1RQX1RYX01PRF9RVUVVRV9XRUlHSFQxIDB4NDJjCisKKyNkZWZpbmUgQV9UUF9UWF9NT0RfUVVFVUVfV0VJR0hUMCAweDQzMAorCisjZGVmaW5lIEFfVFBfTU9EX0NIQU5ORUxfV0VJR0hUIDB4NDM0CisKKyNkZWZpbmUgQV9UUF9QSU9fQUREUiAweDQ0MAorCisjZGVmaW5lIEFfVFBfUElPX0RBVEEgMHg0NDQKKworI2RlZmluZSBBX1RQX1JFU0VUIDB4NDRjCisKKyNkZWZpbmUgU19GTFNUSU5JVEVOQUJMRSAgICAxCisjZGVmaW5lIFZfRkxTVElOSVRFTkFCTEUoeCkgKCh4KSA8PCBTX0ZMU1RJTklURU5BQkxFKQorI2RlZmluZSBGX0ZMU1RJTklURU5BQkxFICAgIFZfRkxTVElOSVRFTkFCTEUoMVUpCisKKyNkZWZpbmUgU19UUFJFU0VUICAgIDAKKyNkZWZpbmUgVl9UUFJFU0VUKHgpICgoeCkgPDwgU19UUFJFU0VUKQorI2RlZmluZSBGX1RQUkVTRVQgICAgVl9UUFJFU0VUKDFVKQorCisjZGVmaW5lIEFfVFBfQ01NX01NX1JYX0ZMU1RfQkFTRSAweDQ2MAorCisjZGVmaW5lIEFfVFBfQ01NX01NX1RYX0ZMU1RfQkFTRSAweDQ2NAorCisjZGVmaW5lIEFfVFBfQ01NX01NX1BTX0ZMU1RfQkFTRSAweDQ2OAorCisjZGVmaW5lIEFfVFBfTUlCX0lOREVYIDB4NDUwCisKKyNkZWZpbmUgQV9UUF9NSUJfUkRBVEEgMHg0NTQKKworI2RlZmluZSBBX1RQX0NNTV9NTV9NQVhfUFNUUlVDVCAweDQ2YworCisjZGVmaW5lIEFfVFBfSU5UX0VOQUJMRSAweDQ3MAorCisjZGVmaW5lIEFfVFBfSU5UX0NBVVNFIDB4NDc0CisKKyNkZWZpbmUgQV9UUF9UWF9NT0RfUTFfUTBfUkFURV9MSU1JVCAweDgKKworI2RlZmluZSBBX1RQX1RYX0RST1BfQ0ZHX0NIMCAweDEyYgorCisjZGVmaW5lIEFfVFBfVFhfRFJPUF9NT0RFIDB4MTJmCisKKyNkZWZpbmUgQV9UUF9FR1JFU1NfQ09ORklHIDB4MTQ1CisKKyNkZWZpbmUgU19SRVdSSVRFRk9SQ0VUT1NJWkUgICAgMAorI2RlZmluZSBWX1JFV1JJVEVGT1JDRVRPU0laRSh4KSAoKHgpIDw8IFNfUkVXUklURUZPUkNFVE9TSVpFKQorI2RlZmluZSBGX1JFV1JJVEVGT1JDRVRPU0laRSAgICBWX1JFV1JJVEVGT1JDRVRPU0laRSgxVSkKKworI2RlZmluZSBBX1RQX1RYX1RSQ19LRVkwIDB4MjAKKworI2RlZmluZSBBX1RQX1JYX1RSQ19LRVkwIDB4MTIwCisKKyNkZWZpbmUgQV9VTFBSWF9DVEwgMHg1MDAKKworI2RlZmluZSBTX1JPVU5EX1JPQklOICAgIDQKKyNkZWZpbmUgVl9ST1VORF9ST0JJTih4KSAoKHgpIDw8IFNfUk9VTkRfUk9CSU4pCisjZGVmaW5lIEZfUk9VTkRfUk9CSU4gICAgVl9ST1VORF9ST0JJTigxVSkKKworI2RlZmluZSBBX1VMUFJYX0lOVF9FTkFCTEUgMHg1MDQKKworI2RlZmluZSBTX1BBUkVSUiAgICAwCisjZGVmaW5lIFZfUEFSRVJSKHgpICgoeCkgPDwgU19QQVJFUlIpCisjZGVmaW5lIEZfUEFSRVJSICAgIFZfUEFSRVJSKDFVKQorCisjZGVmaW5lIEFfVUxQUlhfSU5UX0NBVVNFIDB4NTA4CisKKyNkZWZpbmUgQV9VTFBSWF9JU0NTSV9MTElNSVQgMHg1MGMKKworI2RlZmluZSBBX1VMUFJYX0lTQ1NJX1VMSU1JVCAweDUxMAorCisjZGVmaW5lIEFfVUxQUlhfSVNDU0lfVEFHTUFTSyAweDUxNAorCisjZGVmaW5lIEFfVUxQUlhfVEREUF9MTElNSVQgMHg1MWMKKworI2RlZmluZSBBX1VMUFJYX1RERFBfVUxJTUlUIDB4NTIwCisKKyNkZWZpbmUgQV9VTFBSWF9TVEFHX0xMSU1JVCAweDUyYworCisjZGVmaW5lIEFfVUxQUlhfU1RBR19VTElNSVQgMHg1MzAKKworI2RlZmluZSBBX1VMUFJYX1JRX0xMSU1JVCAweDUzNAorI2RlZmluZSBBX1VMUFJYX1JRX0xMSU1JVCAweDUzNAorCisjZGVmaW5lIEFfVUxQUlhfUlFfVUxJTUlUIDB4NTM4CisjZGVmaW5lIEFfVUxQUlhfUlFfVUxJTUlUIDB4NTM4CisKKyNkZWZpbmUgQV9VTFBSWF9QQkxfTExJTUlUIDB4NTNjCisKKyNkZWZpbmUgQV9VTFBSWF9QQkxfVUxJTUlUIDB4NTQwCisjZGVmaW5lIEFfVUxQUlhfUEJMX1VMSU1JVCAweDU0MAorCisjZGVmaW5lIEFfVUxQUlhfVEREUF9UQUdNQVNLIDB4NTI0CisKKyNkZWZpbmUgQV9VTFBSWF9SUV9MTElNSVQgMHg1MzQKKyNkZWZpbmUgQV9VTFBSWF9SUV9MTElNSVQgMHg1MzQKKworI2RlZmluZSBBX1VMUFJYX1JRX1VMSU1JVCAweDUzOAorI2RlZmluZSBBX1VMUFJYX1JRX1VMSU1JVCAweDUzOAorCisjZGVmaW5lIEFfVUxQUlhfUEJMX1VMSU1JVCAweDU0MAorI2RlZmluZSBBX1VMUFJYX1BCTF9VTElNSVQgMHg1NDAKKworI2RlZmluZSBBX1VMUFRYX0NPTkZJRyAweDU4MAorCisjZGVmaW5lIFNfQ0ZHX1JSX0FSQiAgICAwCisjZGVmaW5lIFZfQ0ZHX1JSX0FSQih4KSAoKHgpIDw8IFNfQ0ZHX1JSX0FSQikKKyNkZWZpbmUgRl9DRkdfUlJfQVJCICAgIFZfQ0ZHX1JSX0FSQigxVSkKKworI2RlZmluZSBBX1VMUFRYX0lOVF9FTkFCTEUgMHg1ODQKKworI2RlZmluZSBTX1BCTF9CT1VORF9FUlJfQ0gxICAgIDEKKyNkZWZpbmUgVl9QQkxfQk9VTkRfRVJSX0NIMSh4KSAoKHgpIDw8IFNfUEJMX0JPVU5EX0VSUl9DSDEpCisjZGVmaW5lIEZfUEJMX0JPVU5EX0VSUl9DSDEgICAgVl9QQkxfQk9VTkRfRVJSX0NIMSgxVSkKKworI2RlZmluZSBTX1BCTF9CT1VORF9FUlJfQ0gwICAgIDAKKyNkZWZpbmUgVl9QQkxfQk9VTkRfRVJSX0NIMCh4KSAoKHgpIDw8IFNfUEJMX0JPVU5EX0VSUl9DSDApCisjZGVmaW5lIEZfUEJMX0JPVU5EX0VSUl9DSDAgICAgVl9QQkxfQk9VTkRfRVJSX0NIMCgxVSkKKworI2RlZmluZSBBX1VMUFRYX0lOVF9DQVVTRSAweDU4OAorCisjZGVmaW5lIEFfVUxQVFhfVFBUX0xMSU1JVCAweDU4YworCisjZGVmaW5lIEFfVUxQVFhfVFBUX1VMSU1JVCAweDU5MAorCisjZGVmaW5lIEFfVUxQVFhfUEJMX0xMSU1JVCAweDU5NAorCisjZGVmaW5lIEFfVUxQVFhfUEJMX1VMSU1JVCAweDU5OAorCisjZGVmaW5lIEFfVUxQVFhfRE1BX1dFSUdIVCAweDVhYworCisjZGVmaW5lIFNfRDFfV0VJR0hUICAgIDE2CisjZGVmaW5lIE1fRDFfV0VJR0hUICAgIDB4ZmZmZgorI2RlZmluZSBWX0QxX1dFSUdIVCh4KSAoKHgpIDw8IFNfRDFfV0VJR0hUKQorCisjZGVmaW5lIFNfRDBfV0VJR0hUICAgIDAKKyNkZWZpbmUgTV9EMF9XRUlHSFQgICAgMHhmZmZmCisjZGVmaW5lIFZfRDBfV0VJR0hUKHgpICgoeCkgPDwgU19EMF9XRUlHSFQpCisKKyNkZWZpbmUgQV9QTTFfUlhfQ0ZHIDB4NWMwCisKKyNkZWZpbmUgQV9QTTFfUlhfSU5UX0VOQUJMRSAweDVkOAorCisjZGVmaW5lIFNfWkVST19FX0NNRF9FUlJPUiAgICAxOAorI2RlZmluZSBWX1pFUk9fRV9DTURfRVJST1IoeCkgKCh4KSA8PCBTX1pFUk9fRV9DTURfRVJST1IpCisjZGVmaW5lIEZfWkVST19FX0NNRF9FUlJPUiAgICBWX1pFUk9fRV9DTURfRVJST1IoMVUpCisKKyNkZWZpbmUgU19JRVNQSTBfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IgICAgMTcKKyNkZWZpbmUgVl9JRVNQSTBfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX0lFU1BJMF9GSUZPMlhfUlhfRlJBTUlOR19FUlJPUikKKyNkZWZpbmUgRl9JRVNQSTBfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IgICAgVl9JRVNQSTBfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19JRVNQSTFfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IgICAgMTYKKyNkZWZpbmUgVl9JRVNQSTFfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX0lFU1BJMV9GSUZPMlhfUlhfRlJBTUlOR19FUlJPUikKKyNkZWZpbmUgRl9JRVNQSTFfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IgICAgVl9JRVNQSTFfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19JRVNQSTBfUlhfRlJBTUlOR19FUlJPUiAgICAxNQorI2RlZmluZSBWX0lFU1BJMF9SWF9GUkFNSU5HX0VSUk9SKHgpICgoeCkgPDwgU19JRVNQSTBfUlhfRlJBTUlOR19FUlJPUikKKyNkZWZpbmUgRl9JRVNQSTBfUlhfRlJBTUlOR19FUlJPUiAgICBWX0lFU1BJMF9SWF9GUkFNSU5HX0VSUk9SKDFVKQorCisjZGVmaW5lIFNfSUVTUEkxX1JYX0ZSQU1JTkdfRVJST1IgICAgMTQKKyNkZWZpbmUgVl9JRVNQSTFfUlhfRlJBTUlOR19FUlJPUih4KSAoKHgpIDw8IFNfSUVTUEkxX1JYX0ZSQU1JTkdfRVJST1IpCisjZGVmaW5lIEZfSUVTUEkxX1JYX0ZSQU1JTkdfRVJST1IgICAgVl9JRVNQSTFfUlhfRlJBTUlOR19FUlJPUigxVSkKKworI2RlZmluZSBTX0lFU1BJMF9UWF9GUkFNSU5HX0VSUk9SICAgIDEzCisjZGVmaW5lIFZfSUVTUEkwX1RYX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX0lFU1BJMF9UWF9GUkFNSU5HX0VSUk9SKQorI2RlZmluZSBGX0lFU1BJMF9UWF9GUkFNSU5HX0VSUk9SICAgIFZfSUVTUEkwX1RYX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19JRVNQSTFfVFhfRlJBTUlOR19FUlJPUiAgICAxMgorI2RlZmluZSBWX0lFU1BJMV9UWF9GUkFNSU5HX0VSUk9SKHgpICgoeCkgPDwgU19JRVNQSTFfVFhfRlJBTUlOR19FUlJPUikKKyNkZWZpbmUgRl9JRVNQSTFfVFhfRlJBTUlOR19FUlJPUiAgICBWX0lFU1BJMV9UWF9GUkFNSU5HX0VSUk9SKDFVKQorCisjZGVmaW5lIFNfT0NTUEkwX1JYX0ZSQU1JTkdfRVJST1IgICAgMTEKKyNkZWZpbmUgVl9PQ1NQSTBfUlhfRlJBTUlOR19FUlJPUih4KSAoKHgpIDw8IFNfT0NTUEkwX1JYX0ZSQU1JTkdfRVJST1IpCisjZGVmaW5lIEZfT0NTUEkwX1JYX0ZSQU1JTkdfRVJST1IgICAgVl9PQ1NQSTBfUlhfRlJBTUlOR19FUlJPUigxVSkKKworI2RlZmluZSBTX09DU1BJMV9SWF9GUkFNSU5HX0VSUk9SICAgIDEwCisjZGVmaW5lIFZfT0NTUEkxX1JYX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX09DU1BJMV9SWF9GUkFNSU5HX0VSUk9SKQorI2RlZmluZSBGX09DU1BJMV9SWF9GUkFNSU5HX0VSUk9SICAgIFZfT0NTUEkxX1JYX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19PQ1NQSTBfVFhfRlJBTUlOR19FUlJPUiAgICA5CisjZGVmaW5lIFZfT0NTUEkwX1RYX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX09DU1BJMF9UWF9GUkFNSU5HX0VSUk9SKQorI2RlZmluZSBGX09DU1BJMF9UWF9GUkFNSU5HX0VSUk9SICAgIFZfT0NTUEkwX1RYX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19PQ1NQSTFfVFhfRlJBTUlOR19FUlJPUiAgICA4CisjZGVmaW5lIFZfT0NTUEkxX1RYX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX09DU1BJMV9UWF9GUkFNSU5HX0VSUk9SKQorI2RlZmluZSBGX09DU1BJMV9UWF9GUkFNSU5HX0VSUk9SICAgIFZfT0NTUEkxX1RYX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19PQ1NQSTBfT0ZJRk8yWF9UWF9GUkFNSU5HX0VSUk9SICAgIDcKKyNkZWZpbmUgVl9PQ1NQSTBfT0ZJRk8yWF9UWF9GUkFNSU5HX0VSUk9SKHgpICgoeCkgPDwgU19PQ1NQSTBfT0ZJRk8yWF9UWF9GUkFNSU5HX0VSUk9SKQorI2RlZmluZSBGX09DU1BJMF9PRklGTzJYX1RYX0ZSQU1JTkdfRVJST1IgICAgVl9PQ1NQSTBfT0ZJRk8yWF9UWF9GUkFNSU5HX0VSUk9SKDFVKQorCisjZGVmaW5lIFNfT0NTUEkxX09GSUZPMlhfVFhfRlJBTUlOR19FUlJPUiAgICA2CisjZGVmaW5lIFZfT0NTUEkxX09GSUZPMlhfVFhfRlJBTUlOR19FUlJPUih4KSAoKHgpIDw8IFNfT0NTUEkxX09GSUZPMlhfVFhfRlJBTUlOR19FUlJPUikKKyNkZWZpbmUgRl9PQ1NQSTFfT0ZJRk8yWF9UWF9GUkFNSU5HX0VSUk9SICAgIFZfT0NTUEkxX09GSUZPMlhfVFhfRlJBTUlOR19FUlJPUigxVSkKKworI2RlZmluZSBTX0lFU1BJX1BBUl9FUlJPUiAgICAzCisjZGVmaW5lIE1fSUVTUElfUEFSX0VSUk9SICAgIDB4NworCisjZGVmaW5lIFZfSUVTUElfUEFSX0VSUk9SKHgpICgoeCkgPDwgU19JRVNQSV9QQVJfRVJST1IpCisKKyNkZWZpbmUgU19PQ1NQSV9QQVJfRVJST1IgICAgMAorI2RlZmluZSBNX09DU1BJX1BBUl9FUlJPUiAgICAweDcKKworI2RlZmluZSBWX09DU1BJX1BBUl9FUlJPUih4KSAoKHgpIDw8IFNfT0NTUElfUEFSX0VSUk9SKQorCisjZGVmaW5lIEFfUE0xX1JYX0lOVF9DQVVTRSAweDVkYworCisjZGVmaW5lIEFfUE0xX1RYX0NGRyAweDVlMAorCisjZGVmaW5lIEFfUE0xX1RYX0lOVF9FTkFCTEUgMHg1ZjgKKworI2RlZmluZSBTX1pFUk9fQ19DTURfRVJST1IgICAgMTgKKyNkZWZpbmUgVl9aRVJPX0NfQ01EX0VSUk9SKHgpICgoeCkgPDwgU19aRVJPX0NfQ01EX0VSUk9SKQorI2RlZmluZSBGX1pFUk9fQ19DTURfRVJST1IgICAgVl9aRVJPX0NfQ01EX0VSUk9SKDFVKQorCisjZGVmaW5lIFNfSUNTUEkwX0ZJRk8yWF9SWF9GUkFNSU5HX0VSUk9SICAgIDE3CisjZGVmaW5lIFZfSUNTUEkwX0ZJRk8yWF9SWF9GUkFNSU5HX0VSUk9SKHgpICgoeCkgPDwgU19JQ1NQSTBfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IpCisjZGVmaW5lIEZfSUNTUEkwX0ZJRk8yWF9SWF9GUkFNSU5HX0VSUk9SICAgIFZfSUNTUEkwX0ZJRk8yWF9SWF9GUkFNSU5HX0VSUk9SKDFVKQorCisjZGVmaW5lIFNfSUNTUEkxX0ZJRk8yWF9SWF9GUkFNSU5HX0VSUk9SICAgIDE2CisjZGVmaW5lIFZfSUNTUEkxX0ZJRk8yWF9SWF9GUkFNSU5HX0VSUk9SKHgpICgoeCkgPDwgU19JQ1NQSTFfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IpCisjZGVmaW5lIEZfSUNTUEkxX0ZJRk8yWF9SWF9GUkFNSU5HX0VSUk9SICAgIFZfSUNTUEkxX0ZJRk8yWF9SWF9GUkFNSU5HX0VSUk9SKDFVKQorCisjZGVmaW5lIFNfSUNTUEkwX1JYX0ZSQU1JTkdfRVJST1IgICAgMTUKKyNkZWZpbmUgVl9JQ1NQSTBfUlhfRlJBTUlOR19FUlJPUih4KSAoKHgpIDw8IFNfSUNTUEkwX1JYX0ZSQU1JTkdfRVJST1IpCisjZGVmaW5lIEZfSUNTUEkwX1JYX0ZSQU1JTkdfRVJST1IgICAgVl9JQ1NQSTBfUlhfRlJBTUlOR19FUlJPUigxVSkKKworI2RlZmluZSBTX0lDU1BJMV9SWF9GUkFNSU5HX0VSUk9SICAgIDE0CisjZGVmaW5lIFZfSUNTUEkxX1JYX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX0lDU1BJMV9SWF9GUkFNSU5HX0VSUk9SKQorI2RlZmluZSBGX0lDU1BJMV9SWF9GUkFNSU5HX0VSUk9SICAgIFZfSUNTUEkxX1JYX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19JQ1NQSTBfVFhfRlJBTUlOR19FUlJPUiAgICAxMworI2RlZmluZSBWX0lDU1BJMF9UWF9GUkFNSU5HX0VSUk9SKHgpICgoeCkgPDwgU19JQ1NQSTBfVFhfRlJBTUlOR19FUlJPUikKKyNkZWZpbmUgRl9JQ1NQSTBfVFhfRlJBTUlOR19FUlJPUiAgICBWX0lDU1BJMF9UWF9GUkFNSU5HX0VSUk9SKDFVKQorCisjZGVmaW5lIFNfSUNTUEkxX1RYX0ZSQU1JTkdfRVJST1IgICAgMTIKKyNkZWZpbmUgVl9JQ1NQSTFfVFhfRlJBTUlOR19FUlJPUih4KSAoKHgpIDw8IFNfSUNTUEkxX1RYX0ZSQU1JTkdfRVJST1IpCisjZGVmaW5lIEZfSUNTUEkxX1RYX0ZSQU1JTkdfRVJST1IgICAgVl9JQ1NQSTFfVFhfRlJBTUlOR19FUlJPUigxVSkKKworI2RlZmluZSBTX09FU1BJMF9SWF9GUkFNSU5HX0VSUk9SICAgIDExCisjZGVmaW5lIFZfT0VTUEkwX1JYX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX09FU1BJMF9SWF9GUkFNSU5HX0VSUk9SKQorI2RlZmluZSBGX09FU1BJMF9SWF9GUkFNSU5HX0VSUk9SICAgIFZfT0VTUEkwX1JYX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19PRVNQSTFfUlhfRlJBTUlOR19FUlJPUiAgICAxMAorI2RlZmluZSBWX09FU1BJMV9SWF9GUkFNSU5HX0VSUk9SKHgpICgoeCkgPDwgU19PRVNQSTFfUlhfRlJBTUlOR19FUlJPUikKKyNkZWZpbmUgRl9PRVNQSTFfUlhfRlJBTUlOR19FUlJPUiAgICBWX09FU1BJMV9SWF9GUkFNSU5HX0VSUk9SKDFVKQorCisjZGVmaW5lIFNfT0VTUEkwX1RYX0ZSQU1JTkdfRVJST1IgICAgOQorI2RlZmluZSBWX09FU1BJMF9UWF9GUkFNSU5HX0VSUk9SKHgpICgoeCkgPDwgU19PRVNQSTBfVFhfRlJBTUlOR19FUlJPUikKKyNkZWZpbmUgRl9PRVNQSTBfVFhfRlJBTUlOR19FUlJPUiAgICBWX09FU1BJMF9UWF9GUkFNSU5HX0VSUk9SKDFVKQorCisjZGVmaW5lIFNfT0VTUEkxX1RYX0ZSQU1JTkdfRVJST1IgICAgOAorI2RlZmluZSBWX09FU1BJMV9UWF9GUkFNSU5HX0VSUk9SKHgpICgoeCkgPDwgU19PRVNQSTFfVFhfRlJBTUlOR19FUlJPUikKKyNkZWZpbmUgRl9PRVNQSTFfVFhfRlJBTUlOR19FUlJPUiAgICBWX09FU1BJMV9UWF9GUkFNSU5HX0VSUk9SKDFVKQorCisjZGVmaW5lIFNfT0VTUEkwX09GSUZPMlhfVFhfRlJBTUlOR19FUlJPUiAgICA3CisjZGVmaW5lIFZfT0VTUEkwX09GSUZPMlhfVFhfRlJBTUlOR19FUlJPUih4KSAoKHgpIDw8IFNfT0VTUEkwX09GSUZPMlhfVFhfRlJBTUlOR19FUlJPUikKKyNkZWZpbmUgRl9PRVNQSTBfT0ZJRk8yWF9UWF9GUkFNSU5HX0VSUk9SICAgIFZfT0VTUEkwX09GSUZPMlhfVFhfRlJBTUlOR19FUlJPUigxVSkKKworI2RlZmluZSBTX09FU1BJMV9PRklGTzJYX1RYX0ZSQU1JTkdfRVJST1IgICAgNgorI2RlZmluZSBWX09FU1BJMV9PRklGTzJYX1RYX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX09FU1BJMV9PRklGTzJYX1RYX0ZSQU1JTkdfRVJST1IpCisjZGVmaW5lIEZfT0VTUEkxX09GSUZPMlhfVFhfRlJBTUlOR19FUlJPUiAgICBWX09FU1BJMV9PRklGTzJYX1RYX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19JQ1NQSV9QQVJfRVJST1IgICAgMworI2RlZmluZSBNX0lDU1BJX1BBUl9FUlJPUiAgICAweDcKKworI2RlZmluZSBWX0lDU1BJX1BBUl9FUlJPUih4KSAoKHgpIDw8IFNfSUNTUElfUEFSX0VSUk9SKQorCisjZGVmaW5lIFNfT0VTUElfUEFSX0VSUk9SICAgIDAKKyNkZWZpbmUgTV9PRVNQSV9QQVJfRVJST1IgICAgMHg3CisKKyNkZWZpbmUgVl9PRVNQSV9QQVJfRVJST1IoeCkgKCh4KSA8PCBTX09FU1BJX1BBUl9FUlJPUikKKworI2RlZmluZSBBX1BNMV9UWF9JTlRfQ0FVU0UgMHg1ZmMKKworI2RlZmluZSBBX01QU19DRkcgMHg2MDAKKworI2RlZmluZSBTX1RQUlhQT1JURU4gICAgNAorI2RlZmluZSBWX1RQUlhQT1JURU4oeCkgKCh4KSA8PCBTX1RQUlhQT1JURU4pCisjZGVmaW5lIEZfVFBSWFBPUlRFTiAgICBWX1RQUlhQT1JURU4oMVUpCisKKyNkZWZpbmUgU19UUFRYUE9SVDFFTiAgICAzCisjZGVmaW5lIFZfVFBUWFBPUlQxRU4oeCkgKCh4KSA8PCBTX1RQVFhQT1JUMUVOKQorI2RlZmluZSBGX1RQVFhQT1JUMUVOICAgIFZfVFBUWFBPUlQxRU4oMVUpCisKKyNkZWZpbmUgU19UUFRYUE9SVDBFTiAgICAyCisjZGVmaW5lIFZfVFBUWFBPUlQwRU4oeCkgKCh4KSA8PCBTX1RQVFhQT1JUMEVOKQorI2RlZmluZSBGX1RQVFhQT1JUMEVOICAgIFZfVFBUWFBPUlQwRU4oMVUpCisKKyNkZWZpbmUgU19QT1JUMUFDVElWRSAgICAxCisjZGVmaW5lIFZfUE9SVDFBQ1RJVkUoeCkgKCh4KSA8PCBTX1BPUlQxQUNUSVZFKQorI2RlZmluZSBGX1BPUlQxQUNUSVZFICAgIFZfUE9SVDFBQ1RJVkUoMVUpCisKKyNkZWZpbmUgU19QT1JUMEFDVElWRSAgICAwCisjZGVmaW5lIFZfUE9SVDBBQ1RJVkUoeCkgKCh4KSA8PCBTX1BPUlQwQUNUSVZFKQorI2RlZmluZSBGX1BPUlQwQUNUSVZFICAgIFZfUE9SVDBBQ1RJVkUoMVUpCisKKyNkZWZpbmUgU19FTkZPUkNFUEtUICAgIDExCisjZGVmaW5lIFZfRU5GT1JDRVBLVCh4KSAoKHgpIDw8IFNfRU5GT1JDRVBLVCkKKyNkZWZpbmUgRl9FTkZPUkNFUEtUICAgIFZfRU5GT1JDRVBLVCgxVSkKKworI2RlZmluZSBBX01QU19JTlRfRU5BQkxFIDB4NjFjCisKKyNkZWZpbmUgU19NQ0FQQVJFUlJFTkIgICAgNgorI2RlZmluZSBNX01DQVBBUkVSUkVOQiAgICAweDcKKworI2RlZmluZSBWX01DQVBBUkVSUkVOQih4KSAoKHgpIDw8IFNfTUNBUEFSRVJSRU5CKQorCisjZGVmaW5lIFNfUlhUUFBBUkVSUkVOQiAgICA0CisjZGVmaW5lIE1fUlhUUFBBUkVSUkVOQiAgICAweDMKKworI2RlZmluZSBWX1JYVFBQQVJFUlJFTkIoeCkgKCh4KSA8PCBTX1JYVFBQQVJFUlJFTkIpCisKKyNkZWZpbmUgU19UWDFUUFBBUkVSUkVOQiAgICAyCisjZGVmaW5lIE1fVFgxVFBQQVJFUlJFTkIgICAgMHgzCisKKyNkZWZpbmUgVl9UWDFUUFBBUkVSUkVOQih4KSAoKHgpIDw8IFNfVFgxVFBQQVJFUlJFTkIpCisKKyNkZWZpbmUgU19UWDBUUFBBUkVSUkVOQiAgICAwCisjZGVmaW5lIE1fVFgwVFBQQVJFUlJFTkIgICAgMHgzCisKKyNkZWZpbmUgVl9UWDBUUFBBUkVSUkVOQih4KSAoKHgpIDw8IFNfVFgwVFBQQVJFUlJFTkIpCisKKyNkZWZpbmUgQV9NUFNfSU5UX0NBVVNFIDB4NjIwCisKKyNkZWZpbmUgU19NQ0FQQVJFUlIgICAgNgorI2RlZmluZSBNX01DQVBBUkVSUiAgICAweDcKKworI2RlZmluZSBWX01DQVBBUkVSUih4KSAoKHgpIDw8IFNfTUNBUEFSRVJSKQorCisjZGVmaW5lIFNfUlhUUFBBUkVSUiAgICA0CisjZGVmaW5lIE1fUlhUUFBBUkVSUiAgICAweDMKKworI2RlZmluZSBWX1JYVFBQQVJFUlIoeCkgKCh4KSA8PCBTX1JYVFBQQVJFUlIpCisKKyNkZWZpbmUgU19UWDFUUFBBUkVSUiAgICAyCisjZGVmaW5lIE1fVFgxVFBQQVJFUlIgICAgMHgzCisKKyNkZWZpbmUgVl9UWDFUUFBBUkVSUih4KSAoKHgpIDw8IFNfVFgxVFBQQVJFUlIpCisKKyNkZWZpbmUgU19UWDBUUFBBUkVSUiAgICAwCisjZGVmaW5lIE1fVFgwVFBQQVJFUlIgICAgMHgzCisKKyNkZWZpbmUgVl9UWDBUUFBBUkVSUih4KSAoKHgpIDw8IFNfVFgwVFBQQVJFUlIpCisKKyNkZWZpbmUgQV9DUExfU1dJVENIX0NOVFJMIDB4NjQwCisKKyNkZWZpbmUgQV9DUExfSU5UUl9FTkFCTEUgMHg2NTAKKworI2RlZmluZSBTX0NJTV9PVkZMX0VSUk9SICAgIDQKKyNkZWZpbmUgVl9DSU1fT1ZGTF9FUlJPUih4KSAoKHgpIDw8IFNfQ0lNX09WRkxfRVJST1IpCisjZGVmaW5lIEZfQ0lNX09WRkxfRVJST1IgICAgVl9DSU1fT1ZGTF9FUlJPUigxVSkKKworI2RlZmluZSBTX1RQX0ZSQU1JTkdfRVJST1IgICAgMworI2RlZmluZSBWX1RQX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX1RQX0ZSQU1JTkdfRVJST1IpCisjZGVmaW5lIEZfVFBfRlJBTUlOR19FUlJPUiAgICBWX1RQX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19TR0VfRlJBTUlOR19FUlJPUiAgICAyCisjZGVmaW5lIFZfU0dFX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX1NHRV9GUkFNSU5HX0VSUk9SKQorI2RlZmluZSBGX1NHRV9GUkFNSU5HX0VSUk9SICAgIFZfU0dFX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19DSU1fRlJBTUlOR19FUlJPUiAgICAxCisjZGVmaW5lIFZfQ0lNX0ZSQU1JTkdfRVJST1IoeCkgKCh4KSA8PCBTX0NJTV9GUkFNSU5HX0VSUk9SKQorI2RlZmluZSBGX0NJTV9GUkFNSU5HX0VSUk9SICAgIFZfQ0lNX0ZSQU1JTkdfRVJST1IoMVUpCisKKyNkZWZpbmUgU19aRVJPX1NXSVRDSF9FUlJPUiAgICAwCisjZGVmaW5lIFZfWkVST19TV0lUQ0hfRVJST1IoeCkgKCh4KSA8PCBTX1pFUk9fU1dJVENIX0VSUk9SKQorI2RlZmluZSBGX1pFUk9fU1dJVENIX0VSUk9SICAgIFZfWkVST19TV0lUQ0hfRVJST1IoMVUpCisKKyNkZWZpbmUgQV9DUExfSU5UUl9DQVVTRSAweDY1NAorCisjZGVmaW5lIEFfQ1BMX01BUF9UQkxfREFUQSAweDY1YworCisjZGVmaW5lIEFfU01CX0dMT0JBTF9USU1FX0NGRyAweDY2MAorCisjZGVmaW5lIEFfSTJDX0NGRyAweDZhMAorCisjZGVmaW5lIFNfSTJDX0NMS0RJViAgICAwCisjZGVmaW5lIE1fSTJDX0NMS0RJViAgICAweGZmZgorI2RlZmluZSBWX0kyQ19DTEtESVYoeCkgKCh4KSA8PCBTX0kyQ19DTEtESVYpCisKKyNkZWZpbmUgQV9NSTFfQ0ZHIDB4NmIwCisKKyNkZWZpbmUgU19DTEtESVYgICAgNQorI2RlZmluZSBNX0NMS0RJViAgICAweGZmCisjZGVmaW5lIFZfQ0xLRElWKHgpICgoeCkgPDwgU19DTEtESVYpCisKKyNkZWZpbmUgU19TVCAgICAzCisKKyNkZWZpbmUgTV9TVCAgICAweDMKKworI2RlZmluZSBWX1NUKHgpICgoeCkgPDwgU19TVCkKKworI2RlZmluZSBHX1NUKHgpICgoKHgpID4+IFNfU1QpICYgTV9TVCkKKworI2RlZmluZSBTX1BSRUVOICAgIDIKKyNkZWZpbmUgVl9QUkVFTih4KSAoKHgpIDw8IFNfUFJFRU4pCisjZGVmaW5lIEZfUFJFRU4gICAgVl9QUkVFTigxVSkKKworI2RlZmluZSBTX01ESUlOViAgICAxCisjZGVmaW5lIFZfTURJSU5WKHgpICgoeCkgPDwgU19NRElJTlYpCisjZGVmaW5lIEZfTURJSU5WICAgIFZfTURJSU5WKDFVKQorCisjZGVmaW5lIFNfTURJRU4gICAgMAorI2RlZmluZSBWX01ESUVOKHgpICgoeCkgPDwgU19NRElFTikKKyNkZWZpbmUgRl9NRElFTiAgICBWX01ESUVOKDFVKQorCisjZGVmaW5lIEFfTUkxX0FERFIgMHg2YjQKKworI2RlZmluZSBTX1BIWUFERFIgICAgNQorI2RlZmluZSBNX1BIWUFERFIgICAgMHgxZgorI2RlZmluZSBWX1BIWUFERFIoeCkgKCh4KSA8PCBTX1BIWUFERFIpCisKKyNkZWZpbmUgU19SRUdBRERSICAgIDAKKyNkZWZpbmUgTV9SRUdBRERSICAgIDB4MWYKKyNkZWZpbmUgVl9SRUdBRERSKHgpICgoeCkgPDwgU19SRUdBRERSKQorCisjZGVmaW5lIEFfTUkxX0RBVEEgMHg2YjgKKworI2RlZmluZSBBX01JMV9PUCAweDZiYworCisjZGVmaW5lIFNfTURJX09QICAgIDAKKyNkZWZpbmUgTV9NRElfT1AgICAgMHgzCisjZGVmaW5lIFZfTURJX09QKHgpICgoeCkgPDwgU19NRElfT1ApCisKKyNkZWZpbmUgQV9TRl9EQVRBIDB4NmQ4CisKKyNkZWZpbmUgQV9TRl9PUCAweDZkYworCisjZGVmaW5lIFNfQllURUNOVCAgICAxCisjZGVmaW5lIE1fQllURUNOVCAgICAweDMKKyNkZWZpbmUgVl9CWVRFQ05UKHgpICgoeCkgPDwgU19CWVRFQ05UKQorCisjZGVmaW5lIEFfUExfSU5UX0VOQUJMRTAgMHg2ZTAKKworI2RlZmluZSBTX1QzREJHICAgIDIzCisjZGVmaW5lIFZfVDNEQkcoeCkgKCh4KSA8PCBTX1QzREJHKQorI2RlZmluZSBGX1QzREJHICAgIFZfVDNEQkcoMVUpCisKKyNkZWZpbmUgU19YR01BQzBfMSAgICAyMAorI2RlZmluZSBWX1hHTUFDMF8xKHgpICgoeCkgPDwgU19YR01BQzBfMSkKKyNkZWZpbmUgRl9YR01BQzBfMSAgICBWX1hHTUFDMF8xKDFVKQorCisjZGVmaW5lIFNfWEdNQUMwXzAgICAgMTkKKyNkZWZpbmUgVl9YR01BQzBfMCh4KSAoKHgpIDw8IFNfWEdNQUMwXzApCisjZGVmaW5lIEZfWEdNQUMwXzAgICAgVl9YR01BQzBfMCgxVSkKKworI2RlZmluZSBTX01DNUEgICAgMTgKKyNkZWZpbmUgVl9NQzVBKHgpICgoeCkgPDwgU19NQzVBKQorI2RlZmluZSBGX01DNUEgICAgVl9NQzVBKDFVKQorCisjZGVmaW5lIFNfQ1BMX1NXSVRDSCAgICAxMgorI2RlZmluZSBWX0NQTF9TV0lUQ0goeCkgKCh4KSA8PCBTX0NQTF9TV0lUQ0gpCisjZGVmaW5lIEZfQ1BMX1NXSVRDSCAgICBWX0NQTF9TV0lUQ0goMVUpCisKKyNkZWZpbmUgU19NUFMwICAgIDExCisjZGVmaW5lIFZfTVBTMCh4KSAoKHgpIDw8IFNfTVBTMCkKKyNkZWZpbmUgRl9NUFMwICAgIFZfTVBTMCgxVSkKKworI2RlZmluZSBTX1BNMV9UWCAgICAxMAorI2RlZmluZSBWX1BNMV9UWCh4KSAoKHgpIDw8IFNfUE0xX1RYKQorI2RlZmluZSBGX1BNMV9UWCAgICBWX1BNMV9UWCgxVSkKKworI2RlZmluZSBTX1BNMV9SWCAgICA5CisjZGVmaW5lIFZfUE0xX1JYKHgpICgoeCkgPDwgU19QTTFfUlgpCisjZGVmaW5lIEZfUE0xX1JYICAgIFZfUE0xX1JYKDFVKQorCisjZGVmaW5lIFNfVUxQMl9UWCAgICA4CisjZGVmaW5lIFZfVUxQMl9UWCh4KSAoKHgpIDw8IFNfVUxQMl9UWCkKKyNkZWZpbmUgRl9VTFAyX1RYICAgIFZfVUxQMl9UWCgxVSkKKworI2RlZmluZSBTX1VMUDJfUlggICAgNworI2RlZmluZSBWX1VMUDJfUlgoeCkgKCh4KSA8PCBTX1VMUDJfUlgpCisjZGVmaW5lIEZfVUxQMl9SWCAgICBWX1VMUDJfUlgoMVUpCisKKyNkZWZpbmUgU19UUDEgICAgNgorI2RlZmluZSBWX1RQMSh4KSAoKHgpIDw8IFNfVFAxKQorI2RlZmluZSBGX1RQMSAgICBWX1RQMSgxVSkKKworI2RlZmluZSBTX0NJTSAgICA1CisjZGVmaW5lIFZfQ0lNKHgpICgoeCkgPDwgU19DSU0pCisjZGVmaW5lIEZfQ0lNICAgIFZfQ0lNKDFVKQorCisjZGVmaW5lIFNfTUM3X0NNICAgIDQKKyNkZWZpbmUgVl9NQzdfQ00oeCkgKCh4KSA8PCBTX01DN19DTSkKKyNkZWZpbmUgRl9NQzdfQ00gICAgVl9NQzdfQ00oMVUpCisKKyNkZWZpbmUgU19NQzdfUE1UWCAgICAzCisjZGVmaW5lIFZfTUM3X1BNVFgoeCkgKCh4KSA8PCBTX01DN19QTVRYKQorI2RlZmluZSBGX01DN19QTVRYICAgIFZfTUM3X1BNVFgoMVUpCisKKyNkZWZpbmUgU19NQzdfUE1SWCAgICAyCisjZGVmaW5lIFZfTUM3X1BNUlgoeCkgKCh4KSA8PCBTX01DN19QTVJYKQorI2RlZmluZSBGX01DN19QTVJYICAgIFZfTUM3X1BNUlgoMVUpCisKKyNkZWZpbmUgU19QQ0lNMCAgICAxCisjZGVmaW5lIFZfUENJTTAoeCkgKCh4KSA8PCBTX1BDSU0wKQorI2RlZmluZSBGX1BDSU0wICAgIFZfUENJTTAoMVUpCisKKyNkZWZpbmUgU19TR0UzICAgIDAKKyNkZWZpbmUgVl9TR0UzKHgpICgoeCkgPDwgU19TR0UzKQorI2RlZmluZSBGX1NHRTMgICAgVl9TR0UzKDFVKQorCisjZGVmaW5lIEFfUExfSU5UX0NBVVNFMCAweDZlNAorCisjZGVmaW5lIEFfUExfUlNUIDB4NmYwCisKKyNkZWZpbmUgU19DUlNUV1JNICAgIDEKKyNkZWZpbmUgVl9DUlNUV1JNKHgpICgoeCkgPDwgU19DUlNUV1JNKQorI2RlZmluZSBGX0NSU1RXUk0gICAgVl9DUlNUV1JNKDFVKQorCisjZGVmaW5lIEFfUExfUkVWIDB4NmY0CisKKyNkZWZpbmUgQV9QTF9DTEkgMHg2ZjgKKworI2RlZmluZSBBX01DNV9EQl9DT05GSUcgMHg3MDQKKworI2RlZmluZSBTX1RNVFlQRUhJICAgIDMwCisjZGVmaW5lIFZfVE1UWVBFSEkoeCkgKCh4KSA8PCBTX1RNVFlQRUhJKQorI2RlZmluZSBGX1RNVFlQRUhJICAgIFZfVE1UWVBFSEkoMVUpCisKKyNkZWZpbmUgU19UTVBBUlRTSVpFICAgIDI4CisjZGVmaW5lIE1fVE1QQVJUU0laRSAgICAweDMKKyNkZWZpbmUgVl9UTVBBUlRTSVpFKHgpICgoeCkgPDwgU19UTVBBUlRTSVpFKQorI2RlZmluZSBHX1RNUEFSVFNJWkUoeCkgKCgoeCkgPj4gU19UTVBBUlRTSVpFKSAmIE1fVE1QQVJUU0laRSkKKworI2RlZmluZSBTX1RNVFlQRSAgICAyNgorI2RlZmluZSBNX1RNVFlQRSAgICAweDMKKyNkZWZpbmUgVl9UTVRZUEUoeCkgKCh4KSA8PCBTX1RNVFlQRSkKKyNkZWZpbmUgR19UTVRZUEUoeCkgKCgoeCkgPj4gU19UTVRZUEUpICYgTV9UTVRZUEUpCisKKyNkZWZpbmUgU19DT01QRU4gICAgMTcKKyNkZWZpbmUgVl9DT01QRU4oeCkgKCh4KSA8PCBTX0NPTVBFTikKKyNkZWZpbmUgRl9DT01QRU4gICAgVl9DT01QRU4oMVUpCisKKyNkZWZpbmUgU19QUlRZRU4gICAgNgorI2RlZmluZSBWX1BSVFlFTih4KSAoKHgpIDw8IFNfUFJUWUVOKQorI2RlZmluZSBGX1BSVFlFTiAgICBWX1BSVFlFTigxVSkKKworI2RlZmluZSBTX01CVVNFTiAgICA1CisjZGVmaW5lIFZfTUJVU0VOKHgpICgoeCkgPDwgU19NQlVTRU4pCisjZGVmaW5lIEZfTUJVU0VOICAgIFZfTUJVU0VOKDFVKQorCisjZGVmaW5lIFNfREJHSUVOICAgIDQKKyNkZWZpbmUgVl9EQkdJRU4oeCkgKCh4KSA8PCBTX0RCR0lFTikKKyNkZWZpbmUgRl9EQkdJRU4gICAgVl9EQkdJRU4oMVUpCisKKyNkZWZpbmUgU19UTVJEWSAgICAyCisjZGVmaW5lIFZfVE1SRFkoeCkgKCh4KSA8PCBTX1RNUkRZKQorI2RlZmluZSBGX1RNUkRZICAgIFZfVE1SRFkoMVUpCisKKyNkZWZpbmUgU19UTVJTVCAgICAxCisjZGVmaW5lIFZfVE1SU1QoeCkgKCh4KSA8PCBTX1RNUlNUKQorI2RlZmluZSBGX1RNUlNUICAgIFZfVE1SU1QoMVUpCisKKyNkZWZpbmUgU19UTU1PREUgICAgMAorI2RlZmluZSBWX1RNTU9ERSh4KSAoKHgpIDw8IFNfVE1NT0RFKQorI2RlZmluZSBGX1RNTU9ERSAgICBWX1RNTU9ERSgxVSkKKworI2RlZmluZSBGX1RNTU9ERSAgICBWX1RNTU9ERSgxVSkKKworI2RlZmluZSBBX01DNV9EQl9ST1VUSU5HX1RBQkxFX0lOREVYIDB4NzBjCisKKyNkZWZpbmUgQV9NQzVfREJfRklMVEVSX1RBQkxFIDB4NzEwCisKKyNkZWZpbmUgQV9NQzVfREJfU0VSVkVSX0lOREVYIDB4NzE0CisKKyNkZWZpbmUgQV9NQzVfREJfUlNQX0xBVEVOQ1kgMHg3MjAKKworI2RlZmluZSBTX1JETEFUICAgIDE2CisjZGVmaW5lIE1fUkRMQVQgICAgMHgxZgorI2RlZmluZSBWX1JETEFUKHgpICgoeCkgPDwgU19SRExBVCkKKworI2RlZmluZSBTX0xSTkxBVCAgICA4CisjZGVmaW5lIE1fTFJOTEFUICAgIDB4MWYKKyNkZWZpbmUgVl9MUk5MQVQoeCkgKCh4KSA8PCBTX0xSTkxBVCkKKworI2RlZmluZSBTX1NSQ0hMQVQgICAgMAorI2RlZmluZSBNX1NSQ0hMQVQgICAgMHgxZgorI2RlZmluZSBWX1NSQ0hMQVQoeCkgKCh4KSA8PCBTX1NSQ0hMQVQpCisKKyNkZWZpbmUgQV9NQzVfREJfUEFSVF9JRF9JTkRFWCAweDcyYworCisjZGVmaW5lIEFfTUM1X0RCX0lOVF9FTkFCTEUgMHg3NDAKKworI2RlZmluZSBTX0RFTEFDVEVNUFRZICAgIDE4CisjZGVmaW5lIFZfREVMQUNURU1QVFkoeCkgKCh4KSA8PCBTX0RFTEFDVEVNUFRZKQorI2RlZmluZSBGX0RFTEFDVEVNUFRZICAgIFZfREVMQUNURU1QVFkoMVUpCisKKyNkZWZpbmUgU19ESVNQUVBBUkVSUiAgICAxNworI2RlZmluZSBWX0RJU1BRUEFSRVJSKHgpICgoeCkgPDwgU19ESVNQUVBBUkVSUikKKyNkZWZpbmUgRl9ESVNQUVBBUkVSUiAgICBWX0RJU1BRUEFSRVJSKDFVKQorCisjZGVmaW5lIFNfUkVRUVBBUkVSUiAgICAxNgorI2RlZmluZSBWX1JFUVFQQVJFUlIoeCkgKCh4KSA8PCBTX1JFUVFQQVJFUlIpCisjZGVmaW5lIEZfUkVRUVBBUkVSUiAgICBWX1JFUVFQQVJFUlIoMVUpCisKKyNkZWZpbmUgU19VTktOT1dOQ01EICAgIDE1CisjZGVmaW5lIFZfVU5LTk9XTkNNRCh4KSAoKHgpIDw8IFNfVU5LTk9XTkNNRCkKKyNkZWZpbmUgRl9VTktOT1dOQ01EICAgIFZfVU5LTk9XTkNNRCgxVSkKKworI2RlZmluZSBTX05GQVNSQ0hGQUlMICAgIDgKKyNkZWZpbmUgVl9ORkFTUkNIRkFJTCh4KSAoKHgpIDw8IFNfTkZBU1JDSEZBSUwpCisjZGVmaW5lIEZfTkZBU1JDSEZBSUwgICAgVl9ORkFTUkNIRkFJTCgxVSkKKworI2RlZmluZSBTX0FDVFJHTkZVTEwgICAgNworI2RlZmluZSBWX0FDVFJHTkZVTEwoeCkgKCh4KSA8PCBTX0FDVFJHTkZVTEwpCisjZGVmaW5lIEZfQUNUUkdORlVMTCAgICBWX0FDVFJHTkZVTEwoMVUpCisKKyNkZWZpbmUgU19QQVJJVFlFUlIgICAgNgorI2RlZmluZSBWX1BBUklUWUVSUih4KSAoKHgpIDw8IFNfUEFSSVRZRVJSKQorI2RlZmluZSBGX1BBUklUWUVSUiAgICBWX1BBUklUWUVSUigxVSkKKworI2RlZmluZSBBX01DNV9EQl9JTlRfQ0FVU0UgMHg3NDQKKworI2RlZmluZSBBX01DNV9EQl9EQkdJX0NPTkZJRyAweDc3NAorCisjZGVmaW5lIEFfTUM1X0RCX0RCR0lfUkVRX0NNRCAweDc3OAorCisjZGVmaW5lIEFfTUM1X0RCX0RCR0lfUkVRX0FERFIwIDB4NzdjCisKKyNkZWZpbmUgQV9NQzVfREJfREJHSV9SRVFfQUREUjEgMHg3ODAKKworI2RlZmluZSBBX01DNV9EQl9EQkdJX1JFUV9BRERSMiAweDc4NAorCisjZGVmaW5lIEFfTUM1X0RCX0RCR0lfUkVRX0RBVEEwIDB4Nzg4CisKKyNkZWZpbmUgQV9NQzVfREJfREJHSV9SRVFfREFUQTEgMHg3OGMKKworI2RlZmluZSBBX01DNV9EQl9EQkdJX1JFUV9EQVRBMiAweDc5MAorCisjZGVmaW5lIEFfTUM1X0RCX0RCR0lfUlNQX1NUQVRVUyAweDdiMAorCisjZGVmaW5lIFNfREJHSVJTUFZBTElEICAgIDAKKyNkZWZpbmUgVl9EQkdJUlNQVkFMSUQoeCkgKCh4KSA8PCBTX0RCR0lSU1BWQUxJRCkKKyNkZWZpbmUgRl9EQkdJUlNQVkFMSUQgICAgVl9EQkdJUlNQVkFMSUQoMVUpCisKKyNkZWZpbmUgQV9NQzVfREJfREJHSV9SU1BfREFUQTAgMHg3YjQKKworI2RlZmluZSBBX01DNV9EQl9EQkdJX1JTUF9EQVRBMSAweDdiOAorCisjZGVmaW5lIEFfTUM1X0RCX0RCR0lfUlNQX0RBVEEyIDB4N2JjCisKKyNkZWZpbmUgQV9NQzVfREJfUE9QRU5fREFUQV9XUl9DTUQgMHg3Y2MKKworI2RlZmluZSBBX01DNV9EQl9QT1BFTl9NQVNLX1dSX0NNRCAweDdkMAorCisjZGVmaW5lIEFfTUM1X0RCX0FPUEVOX1NSQ0hfQ01EIDB4N2Q0CisKKyNkZWZpbmUgQV9NQzVfREJfQU9QRU5fTFJOX0NNRCAweDdkOAorCisjZGVmaW5lIEFfTUM1X0RCX1NZTl9TUkNIX0NNRCAweDdkYworCisjZGVmaW5lIEFfTUM1X0RCX1NZTl9MUk5fQ01EIDB4N2UwCisKKyNkZWZpbmUgQV9NQzVfREJfQUNLX1NSQ0hfQ01EIDB4N2U0CisKKyNkZWZpbmUgQV9NQzVfREJfQUNLX0xSTl9DTUQgMHg3ZTgKKworI2RlZmluZSBBX01DNV9EQl9JTE9PS1VQX0NNRCAweDdlYworCisjZGVmaW5lIEFfTUM1X0RCX0VMT09LVVBfQ01EIDB4N2YwCisKKyNkZWZpbmUgQV9NQzVfREJfREFUQV9XUklURV9DTUQgMHg3ZjQKKworI2RlZmluZSBBX01DNV9EQl9EQVRBX1JFQURfQ01EIDB4N2Y4CisKKyNkZWZpbmUgWEdNQUMwXzBfQkFTRV9BRERSIDB4ODAwCisKKyNkZWZpbmUgQV9YR01fVFhfQ1RSTCAweDgwMAorCisjZGVmaW5lIFNfVFhFTiAgICAwCisjZGVmaW5lIFZfVFhFTih4KSAoKHgpIDw8IFNfVFhFTikKKyNkZWZpbmUgRl9UWEVOICAgIFZfVFhFTigxVSkKKworI2RlZmluZSBBX1hHTV9UWF9DRkcgMHg4MDQKKworI2RlZmluZSBTX1RYUEFVU0VFTiAgICAwCisjZGVmaW5lIFZfVFhQQVVTRUVOKHgpICgoeCkgPDwgU19UWFBBVVNFRU4pCisjZGVmaW5lIEZfVFhQQVVTRUVOICAgIFZfVFhQQVVTRUVOKDFVKQorCisjZGVmaW5lIEFfWEdNX1JYX0NUUkwgMHg4MGMKKworI2RlZmluZSBTX1JYRU4gICAgMAorI2RlZmluZSBWX1JYRU4oeCkgKCh4KSA8PCBTX1JYRU4pCisjZGVmaW5lIEZfUlhFTiAgICBWX1JYRU4oMVUpCisKKyNkZWZpbmUgQV9YR01fUlhfQ0ZHIDB4ODEwCisKKyNkZWZpbmUgU19ESVNQQVVTRUZSQU1FUyAgICA5CisjZGVmaW5lIFZfRElTUEFVU0VGUkFNRVMoeCkgKCh4KSA8PCBTX0RJU1BBVVNFRlJBTUVTKQorI2RlZmluZSBGX0RJU1BBVVNFRlJBTUVTICAgIFZfRElTUEFVU0VGUkFNRVMoMVUpCisKKyNkZWZpbmUgU19FTjE1MzZCRlJBTUVTICAgIDgKKyNkZWZpbmUgVl9FTjE1MzZCRlJBTUVTKHgpICgoeCkgPDwgU19FTjE1MzZCRlJBTUVTKQorI2RlZmluZSBGX0VOMTUzNkJGUkFNRVMgICAgVl9FTjE1MzZCRlJBTUVTKDFVKQorCisjZGVmaW5lIFNfRU5KVU1CTyAgICA3CisjZGVmaW5lIFZfRU5KVU1CTyh4KSAoKHgpIDw8IFNfRU5KVU1CTykKKyNkZWZpbmUgRl9FTkpVTUJPICAgIFZfRU5KVU1CTygxVSkKKworI2RlZmluZSBTX1JNRkNTICAgIDYKKyNkZWZpbmUgVl9STUZDUyh4KSAoKHgpIDw8IFNfUk1GQ1MpCisjZGVmaW5lIEZfUk1GQ1MgICAgVl9STUZDUygxVSkKKworI2RlZmluZSBTX0VOSEFTSE1DQVNUICAgIDIKKyNkZWZpbmUgVl9FTkhBU0hNQ0FTVCh4KSAoKHgpIDw8IFNfRU5IQVNITUNBU1QpCisjZGVmaW5lIEZfRU5IQVNITUNBU1QgICAgVl9FTkhBU0hNQ0FTVCgxVSkKKworI2RlZmluZSBTX0NPUFlBTExGUkFNRVMgICAgMAorI2RlZmluZSBWX0NPUFlBTExGUkFNRVMoeCkgKCh4KSA8PCBTX0NPUFlBTExGUkFNRVMpCisjZGVmaW5lIEZfQ09QWUFMTEZSQU1FUyAgICBWX0NPUFlBTExGUkFNRVMoMVUpCisKKyNkZWZpbmUgQV9YR01fUlhfSEFTSF9MT1cgMHg4MTQKKworI2RlZmluZSBBX1hHTV9SWF9IQVNIX0hJR0ggMHg4MTgKKworI2RlZmluZSBBX1hHTV9SWF9FWEFDVF9NQVRDSF9MT1dfMSAweDgxYworCisjZGVmaW5lIEFfWEdNX1JYX0VYQUNUX01BVENIX0hJR0hfMSAweDgyMAorCisjZGVmaW5lIEFfWEdNX1JYX0VYQUNUX01BVENIX0xPV18yIDB4ODI0CisKKyNkZWZpbmUgQV9YR01fUlhfRVhBQ1RfTUFUQ0hfTE9XXzMgMHg4MmMKKworI2RlZmluZSBBX1hHTV9SWF9FWEFDVF9NQVRDSF9MT1dfNCAweDgzNAorCisjZGVmaW5lIEFfWEdNX1JYX0VYQUNUX01BVENIX0xPV181IDB4ODNjCisKKyNkZWZpbmUgQV9YR01fUlhfRVhBQ1RfTUFUQ0hfTE9XXzYgMHg4NDQKKworI2RlZmluZSBBX1hHTV9SWF9FWEFDVF9NQVRDSF9MT1dfNyAweDg0YworCisjZGVmaW5lIEFfWEdNX1JYX0VYQUNUX01BVENIX0xPV184IDB4ODU0CisKKyNkZWZpbmUgQV9YR01fU1RBVF9DVFJMIDB4ODgwCisKKyNkZWZpbmUgU19DTFJTVEFUUyAgICAyCisjZGVmaW5lIFZfQ0xSU1RBVFMoeCkgKCh4KSA8PCBTX0NMUlNUQVRTKQorI2RlZmluZSBGX0NMUlNUQVRTICAgIFZfQ0xSU1RBVFMoMVUpCisKKyNkZWZpbmUgQV9YR01fUlhGSUZPX0NGRyAweDg4NAorCisjZGVmaW5lIFNfUlhGSUZPUEFVU0VIV00gICAgMTcKKyNkZWZpbmUgTV9SWEZJRk9QQVVTRUhXTSAgICAweGZmZgorCisjZGVmaW5lIFZfUlhGSUZPUEFVU0VIV00oeCkgKCh4KSA8PCBTX1JYRklGT1BBVVNFSFdNKQorCisjZGVmaW5lIEdfUlhGSUZPUEFVU0VIV00oeCkgKCgoeCkgPj4gU19SWEZJRk9QQVVTRUhXTSkgJiBNX1JYRklGT1BBVVNFSFdNKQorCisjZGVmaW5lIFNfUlhGSUZPUEFVU0VMV00gICAgNQorI2RlZmluZSBNX1JYRklGT1BBVVNFTFdNICAgIDB4ZmZmCisKKyNkZWZpbmUgVl9SWEZJRk9QQVVTRUxXTSh4KSAoKHgpIDw8IFNfUlhGSUZPUEFVU0VMV00pCisKKyNkZWZpbmUgR19SWEZJRk9QQVVTRUxXTSh4KSAoKCh4KSA+PiBTX1JYRklGT1BBVVNFTFdNKSAmIE1fUlhGSUZPUEFVU0VMV00pCisKKyNkZWZpbmUgU19SWFNUUkZSV1JEICAgIDEKKyNkZWZpbmUgVl9SWFNUUkZSV1JEKHgpICgoeCkgPDwgU19SWFNUUkZSV1JEKQorI2RlZmluZSBGX1JYU1RSRlJXUkQgICAgVl9SWFNUUkZSV1JEKDFVKQorCisjZGVmaW5lIFNfRElTRVJSRlJBTUVTICAgIDAKKyNkZWZpbmUgVl9ESVNFUlJGUkFNRVMoeCkgKCh4KSA8PCBTX0RJU0VSUkZSQU1FUykKKyNkZWZpbmUgRl9ESVNFUlJGUkFNRVMgICAgVl9ESVNFUlJGUkFNRVMoMVUpCisKKyNkZWZpbmUgQV9YR01fVFhGSUZPX0NGRyAweDg4OAorCisjZGVmaW5lIFNfVFhGSUZPVEhSRVNIICAgIDQKKyNkZWZpbmUgTV9UWEZJRk9USFJFU0ggICAgMHgxZmYKKworI2RlZmluZSBWX1RYRklGT1RIUkVTSCh4KSAoKHgpIDw8IFNfVFhGSUZPVEhSRVNIKQorCisjZGVmaW5lIEFfWEdNX1NFUkRFU19DVFJMIDB4ODkwCisjZGVmaW5lIEFfWEdNX1NFUkRFU19DVFJMMCAweDhlMAorCisjZGVmaW5lIFNfU0VSREVTUkVTRVRfICAgIDI0CisjZGVmaW5lIFZfU0VSREVTUkVTRVRfKHgpICgoeCkgPDwgU19TRVJERVNSRVNFVF8pCisjZGVmaW5lIEZfU0VSREVTUkVTRVRfICAgIFZfU0VSREVTUkVTRVRfKDFVKQorCisjZGVmaW5lIFNfUlhFTkFCTEUgICAgNAorI2RlZmluZSBWX1JYRU5BQkxFKHgpICgoeCkgPDwgU19SWEVOQUJMRSkKKyNkZWZpbmUgRl9SWEVOQUJMRSAgICBWX1JYRU5BQkxFKDFVKQorCisjZGVmaW5lIFNfVFhFTkFCTEUgICAgMworI2RlZmluZSBWX1RYRU5BQkxFKHgpICgoeCkgPDwgU19UWEVOQUJMRSkKKyNkZWZpbmUgRl9UWEVOQUJMRSAgICBWX1RYRU5BQkxFKDFVKQorCisjZGVmaW5lIEFfWEdNX1BBVVNFX1RJTUVSIDB4ODkwCisKKyNkZWZpbmUgQV9YR01fUkdNSUlfSU1QIDB4ODljCisKKyNkZWZpbmUgU19YR01fSU1QU0VUVVBEQVRFICAgIDYKKyNkZWZpbmUgVl9YR01fSU1QU0VUVVBEQVRFKHgpICgoeCkgPDwgU19YR01fSU1QU0VUVVBEQVRFKQorI2RlZmluZSBGX1hHTV9JTVBTRVRVUERBVEUgICAgVl9YR01fSU1QU0VUVVBEQVRFKDFVKQorCisjZGVmaW5lIFNfUkdNSUlJTVBQRCAgICAzCisjZGVmaW5lIE1fUkdNSUlJTVBQRCAgICAweDcKKyNkZWZpbmUgVl9SR01JSUlNUFBEKHgpICgoeCkgPDwgU19SR01JSUlNUFBEKQorCisjZGVmaW5lIFNfUkdNSUlJTVBQVSAgICAwCisjZGVmaW5lIE1fUkdNSUlJTVBQVSAgICAweDcKKyNkZWZpbmUgVl9SR01JSUlNUFBVKHgpICgoeCkgPDwgU19SR01JSUlNUFBVKQorCisjZGVmaW5lIFNfQ0FMUkVTRVQgICAgOAorI2RlZmluZSBWX0NBTFJFU0VUKHgpICgoeCkgPDwgU19DQUxSRVNFVCkKKyNkZWZpbmUgRl9DQUxSRVNFVCAgICBWX0NBTFJFU0VUKDFVKQorCisjZGVmaW5lIFNfQ0FMVVBEQVRFICAgIDcKKyNkZWZpbmUgVl9DQUxVUERBVEUoeCkgKCh4KSA8PCBTX0NBTFVQREFURSkKKyNkZWZpbmUgRl9DQUxVUERBVEUgICAgVl9DQUxVUERBVEUoMVUpCisKKyNkZWZpbmUgQV9YR01fWEFVSV9JTVAgMHg4YTAKKworI2RlZmluZSBTX0NBTEJVU1kgICAgMzEKKyNkZWZpbmUgVl9DQUxCVVNZKHgpICgoeCkgPDwgU19DQUxCVVNZKQorI2RlZmluZSBGX0NBTEJVU1kgICAgVl9DQUxCVVNZKDFVKQorCisjZGVmaW5lIFNfWEdNX0NBTEZBVUxUICAgIDI5CisjZGVmaW5lIFZfWEdNX0NBTEZBVUxUKHgpICgoeCkgPDwgU19YR01fQ0FMRkFVTFQpCisjZGVmaW5lIEZfWEdNX0NBTEZBVUxUICAgIFZfWEdNX0NBTEZBVUxUKDFVKQorCisjZGVmaW5lIFNfQ0FMSU1QICAgIDI0CisjZGVmaW5lIE1fQ0FMSU1QICAgIDB4MWYKKyNkZWZpbmUgVl9DQUxJTVAoeCkgKCh4KSA8PCBTX0NBTElNUCkKKyNkZWZpbmUgR19DQUxJTVAoeCkgKCgoeCkgPj4gU19DQUxJTVApICYgTV9DQUxJTVApCisKKyNkZWZpbmUgU19YQVVJSU1QICAgIDAKKyNkZWZpbmUgTV9YQVVJSU1QICAgIDB4NworI2RlZmluZSBWX1hBVUlJTVAoeCkgKCh4KSA8PCBTX1hBVUlJTVApCisKKyNkZWZpbmUgQV9YR01fUlhfTUFYX1BLVF9TSVpFIDB4OGE4CisjZGVmaW5lIEFfWEdNX1JYX01BWF9QS1RfU0laRV9FUlJfQ05UIDB4OWE0CisKKyNkZWZpbmUgQV9YR01fUkVTRVRfQ1RSTCAweDhhYworCisjZGVmaW5lIFNfWEcyR19SRVNFVF8gICAgMworI2RlZmluZSBWX1hHMkdfUkVTRVRfKHgpICgoeCkgPDwgU19YRzJHX1JFU0VUXykKKyNkZWZpbmUgRl9YRzJHX1JFU0VUXyAgICBWX1hHMkdfUkVTRVRfKDFVKQorCisjZGVmaW5lIFNfUkdNSUlfUkVTRVRfICAgIDIKKyNkZWZpbmUgVl9SR01JSV9SRVNFVF8oeCkgKCh4KSA8PCBTX1JHTUlJX1JFU0VUXykKKyNkZWZpbmUgRl9SR01JSV9SRVNFVF8gICAgVl9SR01JSV9SRVNFVF8oMVUpCisKKyNkZWZpbmUgU19QQ1NfUkVTRVRfICAgIDEKKyNkZWZpbmUgVl9QQ1NfUkVTRVRfKHgpICgoeCkgPDwgU19QQ1NfUkVTRVRfKQorI2RlZmluZSBGX1BDU19SRVNFVF8gICAgVl9QQ1NfUkVTRVRfKDFVKQorCisjZGVmaW5lIFNfTUFDX1JFU0VUXyAgICAwCisjZGVmaW5lIFZfTUFDX1JFU0VUXyh4KSAoKHgpIDw8IFNfTUFDX1JFU0VUXykKKyNkZWZpbmUgRl9NQUNfUkVTRVRfICAgIFZfTUFDX1JFU0VUXygxVSkKKworI2RlZmluZSBBX1hHTV9QT1JUX0NGRyAweDhiOAorCisjZGVmaW5lIFNfQ0xLRElWUkVTRVRfICAgIDMKKyNkZWZpbmUgVl9DTEtESVZSRVNFVF8oeCkgKCh4KSA8PCBTX0NMS0RJVlJFU0VUXykKKyNkZWZpbmUgRl9DTEtESVZSRVNFVF8gICAgVl9DTEtESVZSRVNFVF8oMVUpCisKKyNkZWZpbmUgU19QT1JUU1BFRUQgICAgMQorI2RlZmluZSBNX1BPUlRTUEVFRCAgICAweDMKKworI2RlZmluZSBWX1BPUlRTUEVFRCh4KSAoKHgpIDw8IFNfUE9SVFNQRUVEKQorCisjZGVmaW5lIFNfRU5SR01JSSAgICAwCisjZGVmaW5lIFZfRU5SR01JSSh4KSAoKHgpIDw8IFNfRU5SR01JSSkKKyNkZWZpbmUgRl9FTlJHTUlJICAgIFZfRU5SR01JSSgxVSkKKworI2RlZmluZSBBX1hHTV9JTlRfRU5BQkxFIDB4OGQ0CisKKyNkZWZpbmUgU19UWEZJRk9fUFJUWV9FUlIgICAgMTcKKyNkZWZpbmUgTV9UWEZJRk9fUFJUWV9FUlIgICAgMHg3CisKKyNkZWZpbmUgVl9UWEZJRk9fUFJUWV9FUlIoeCkgKCh4KSA8PCBTX1RYRklGT19QUlRZX0VSUikKKworI2RlZmluZSBTX1JYRklGT19QUlRZX0VSUiAgICAxNAorI2RlZmluZSBNX1JYRklGT19QUlRZX0VSUiAgICAweDcKKworI2RlZmluZSBWX1JYRklGT19QUlRZX0VSUih4KSAoKHgpIDw8IFNfUlhGSUZPX1BSVFlfRVJSKQorCisjZGVmaW5lIFNfVFhGSUZPX1VOREVSUlVOICAgIDEzCisjZGVmaW5lIFZfVFhGSUZPX1VOREVSUlVOKHgpICgoeCkgPDwgU19UWEZJRk9fVU5ERVJSVU4pCisjZGVmaW5lIEZfVFhGSUZPX1VOREVSUlVOICAgIFZfVFhGSUZPX1VOREVSUlVOKDFVKQorCisjZGVmaW5lIFNfUlhGSUZPX09WRVJGTE9XICAgIDEyCisjZGVmaW5lIFZfUlhGSUZPX09WRVJGTE9XKHgpICgoeCkgPDwgU19SWEZJRk9fT1ZFUkZMT1cpCisjZGVmaW5lIEZfUlhGSUZPX09WRVJGTE9XICAgIFZfUlhGSUZPX09WRVJGTE9XKDFVKQorCisjZGVmaW5lIFNfU0VSREVTX0xPUyAgICA0CisjZGVmaW5lIE1fU0VSREVTX0xPUyAgICAweGYKKworI2RlZmluZSBWX1NFUkRFU19MT1MoeCkgKCh4KSA8PCBTX1NFUkRFU19MT1MpCisKKyNkZWZpbmUgU19YQVVJUENTQ1RDRVJSICAgIDMKKyNkZWZpbmUgVl9YQVVJUENTQ1RDRVJSKHgpICgoeCkgPDwgU19YQVVJUENTQ1RDRVJSKQorI2RlZmluZSBGX1hBVUlQQ1NDVENFUlIgICAgVl9YQVVJUENTQ1RDRVJSKDFVKQorCisjZGVmaW5lIFNfWEFVSVBDU0FMSUdOQ0hBTkdFICAgIDIKKyNkZWZpbmUgVl9YQVVJUENTQUxJR05DSEFOR0UoeCkgKCh4KSA8PCBTX1hBVUlQQ1NBTElHTkNIQU5HRSkKKyNkZWZpbmUgRl9YQVVJUENTQUxJR05DSEFOR0UgICAgVl9YQVVJUENTQUxJR05DSEFOR0UoMVUpCisKKyNkZWZpbmUgQV9YR01fSU5UX0NBVVNFIDB4OGQ4CisKKyNkZWZpbmUgQV9YR01fWEFVSV9BQ1RfQ1RSTCAweDhkYworCisjZGVmaW5lIFNfVFhBQ1RFTkFCTEUgICAgMQorI2RlZmluZSBWX1RYQUNURU5BQkxFKHgpICgoeCkgPDwgU19UWEFDVEVOQUJMRSkKKyNkZWZpbmUgRl9UWEFDVEVOQUJMRSAgICBWX1RYQUNURU5BQkxFKDFVKQorCisjZGVmaW5lIEFfWEdNX1NFUkRFU19DVFJMMCAweDhlMAorCisjZGVmaW5lIFNfUkVTRVQzICAgIDIzCisjZGVmaW5lIFZfUkVTRVQzKHgpICgoeCkgPDwgU19SRVNFVDMpCisjZGVmaW5lIEZfUkVTRVQzICAgIFZfUkVTRVQzKDFVKQorCisjZGVmaW5lIFNfUkVTRVQyICAgIDIyCisjZGVmaW5lIFZfUkVTRVQyKHgpICgoeCkgPDwgU19SRVNFVDIpCisjZGVmaW5lIEZfUkVTRVQyICAgIFZfUkVTRVQyKDFVKQorCisjZGVmaW5lIFNfUkVTRVQxICAgIDIxCisjZGVmaW5lIFZfUkVTRVQxKHgpICgoeCkgPDwgU19SRVNFVDEpCisjZGVmaW5lIEZfUkVTRVQxICAgIFZfUkVTRVQxKDFVKQorCisjZGVmaW5lIFNfUkVTRVQwICAgIDIwCisjZGVmaW5lIFZfUkVTRVQwKHgpICgoeCkgPDwgU19SRVNFVDApCisjZGVmaW5lIEZfUkVTRVQwICAgIFZfUkVTRVQwKDFVKQorCisjZGVmaW5lIFNfUFdSRE4zICAgIDE5CisjZGVmaW5lIFZfUFdSRE4zKHgpICgoeCkgPDwgU19QV1JETjMpCisjZGVmaW5lIEZfUFdSRE4zICAgIFZfUFdSRE4zKDFVKQorCisjZGVmaW5lIFNfUFdSRE4yICAgIDE4CisjZGVmaW5lIFZfUFdSRE4yKHgpICgoeCkgPDwgU19QV1JETjIpCisjZGVmaW5lIEZfUFdSRE4yICAgIFZfUFdSRE4yKDFVKQorCisjZGVmaW5lIFNfUFdSRE4xICAgIDE3CisjZGVmaW5lIFZfUFdSRE4xKHgpICgoeCkgPDwgU19QV1JETjEpCisjZGVmaW5lIEZfUFdSRE4xICAgIFZfUFdSRE4xKDFVKQorCisjZGVmaW5lIFNfUFdSRE4wICAgIDE2CisjZGVmaW5lIFZfUFdSRE4wKHgpICgoeCkgPDwgU19QV1JETjApCisjZGVmaW5lIEZfUFdSRE4wICAgIFZfUFdSRE4wKDFVKQorCisjZGVmaW5lIFNfUkVTRVRQTEwyMyAgICAxNQorI2RlZmluZSBWX1JFU0VUUExMMjMoeCkgKCh4KSA8PCBTX1JFU0VUUExMMjMpCisjZGVmaW5lIEZfUkVTRVRQTEwyMyAgICBWX1JFU0VUUExMMjMoMVUpCisKKyNkZWZpbmUgU19SRVNFVFBMTDAxICAgIDE0CisjZGVmaW5lIFZfUkVTRVRQTEwwMSh4KSAoKHgpIDw8IFNfUkVTRVRQTEwwMSkKKyNkZWZpbmUgRl9SRVNFVFBMTDAxICAgIFZfUkVTRVRQTEwwMSgxVSkKKworI2RlZmluZSBBX1hHTV9TRVJERVNfU1RBVDAgMHg4ZjAKKworI2RlZmluZSBTX0xPV1NJRzAgICAgMAorI2RlZmluZSBWX0xPV1NJRzAoeCkgKCh4KSA8PCBTX0xPV1NJRzApCisjZGVmaW5lIEZfTE9XU0lHMCAgICBWX0xPV1NJRzAoMVUpCisKKyNkZWZpbmUgQV9YR01fU0VSREVTX1NUQVQzIDB4OGZjCisKKyNkZWZpbmUgQV9YR01fU1RBVF9UWF9CWVRFX0xPVyAweDkwMAorCisjZGVmaW5lIEFfWEdNX1NUQVRfVFhfQllURV9ISUdIIDB4OTA0CisKKyNkZWZpbmUgQV9YR01fU1RBVF9UWF9GUkFNRV9MT1cgMHg5MDgKKworI2RlZmluZSBBX1hHTV9TVEFUX1RYX0ZSQU1FX0hJR0ggMHg5MGMKKworI2RlZmluZSBBX1hHTV9TVEFUX1RYX0JDQVNUIDB4OTEwCisKKyNkZWZpbmUgQV9YR01fU1RBVF9UWF9NQ0FTVCAweDkxNAorCisjZGVmaW5lIEFfWEdNX1NUQVRfVFhfUEFVU0UgMHg5MTgKKworI2RlZmluZSBBX1hHTV9TVEFUX1RYXzY0Ql9GUkFNRVMgMHg5MWMKKworI2RlZmluZSBBX1hHTV9TVEFUX1RYXzY1XzEyN0JfRlJBTUVTIDB4OTIwCisKKyNkZWZpbmUgQV9YR01fU1RBVF9UWF8xMjhfMjU1Ql9GUkFNRVMgMHg5MjQKKworI2RlZmluZSBBX1hHTV9TVEFUX1RYXzI1Nl81MTFCX0ZSQU1FUyAweDkyOAorCisjZGVmaW5lIEFfWEdNX1NUQVRfVFhfNTEyXzEwMjNCX0ZSQU1FUyAweDkyYworCisjZGVmaW5lIEFfWEdNX1NUQVRfVFhfMTAyNF8xNTE4Ql9GUkFNRVMgMHg5MzAKKworI2RlZmluZSBBX1hHTV9TVEFUX1RYXzE1MTlfTUFYQl9GUkFNRVMgMHg5MzQKKworI2RlZmluZSBBX1hHTV9TVEFUX1RYX0VSUl9GUkFNRVMgMHg5MzgKKworI2RlZmluZSBBX1hHTV9TVEFUX1JYX0JZVEVTX0xPVyAweDkzYworCisjZGVmaW5lIEFfWEdNX1NUQVRfUlhfQllURVNfSElHSCAweDk0MAorCisjZGVmaW5lIEFfWEdNX1NUQVRfUlhfRlJBTUVTX0xPVyAweDk0NAorCisjZGVmaW5lIEFfWEdNX1NUQVRfUlhfRlJBTUVTX0hJR0ggMHg5NDgKKworI2RlZmluZSBBX1hHTV9TVEFUX1JYX0JDQVNUX0ZSQU1FUyAweDk0YworCisjZGVmaW5lIEFfWEdNX1NUQVRfUlhfTUNBU1RfRlJBTUVTIDB4OTUwCisKKyNkZWZpbmUgQV9YR01fU1RBVF9SWF9QQVVTRV9GUkFNRVMgMHg5NTQKKworI2RlZmluZSBBX1hHTV9TVEFUX1JYXzY0Ql9GUkFNRVMgMHg5NTgKKworI2RlZmluZSBBX1hHTV9TVEFUX1JYXzY1XzEyN0JfRlJBTUVTIDB4OTVjCisKKyNkZWZpbmUgQV9YR01fU1RBVF9SWF8xMjhfMjU1Ql9GUkFNRVMgMHg5NjAKKworI2RlZmluZSBBX1hHTV9TVEFUX1JYXzI1Nl81MTFCX0ZSQU1FUyAweDk2NAorCisjZGVmaW5lIEFfWEdNX1NUQVRfUlhfNTEyXzEwMjNCX0ZSQU1FUyAweDk2OAorCisjZGVmaW5lIEFfWEdNX1NUQVRfUlhfMTAyNF8xNTE4Ql9GUkFNRVMgMHg5NmMKKworI2RlZmluZSBBX1hHTV9TVEFUX1JYXzE1MTlfTUFYQl9GUkFNRVMgMHg5NzAKKworI2RlZmluZSBBX1hHTV9TVEFUX1JYX1NIT1JUX0ZSQU1FUyAweDk3NAorCisjZGVmaW5lIEFfWEdNX1NUQVRfUlhfT1ZFUlNJWkVfRlJBTUVTIDB4OTc4CisKKyNkZWZpbmUgQV9YR01fU1RBVF9SWF9KQUJCRVJfRlJBTUVTIDB4OTdjCisKKyNkZWZpbmUgQV9YR01fU1RBVF9SWF9DUkNfRVJSX0ZSQU1FUyAweDk4MAorCisjZGVmaW5lIEFfWEdNX1NUQVRfUlhfTEVOR1RIX0VSUl9GUkFNRVMgMHg5ODQKKworI2RlZmluZSBBX1hHTV9TVEFUX1JYX1NZTV9DT0RFX0VSUl9GUkFNRVMgMHg5ODgKKworI2RlZmluZSBBX1hHTV9TRVJERVNfU1RBVFVTMCAweDk4YworCisjZGVmaW5lIEFfWEdNX1NFUkRFU19TVEFUVVMxIDB4OTkwCisKKyNkZWZpbmUgU19DTVVMT0NLICAgIDMxCisjZGVmaW5lIFZfQ01VTE9DSyh4KSAoKHgpIDw8IFNfQ01VTE9DSykKKyNkZWZpbmUgRl9DTVVMT0NLICAgIFZfQ01VTE9DSygxVSkKKworI2RlZmluZSBBX1hHTV9SWF9NQVhfUEtUX1NJWkVfRVJSX0NOVCAweDlhNAorCisjZGVmaW5lIEFfWEdNX1JYX1NQSTRfU09QX0VPUF9DTlQgMHg5YWMKKworI2RlZmluZSBYR01BQzBfMV9CQVNFX0FERFIgMHhhMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jIGIvZHJpdmVycy9uZXQvY3hnYjMvc2dlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyY2Y4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZS5jCkBAIC0wLDAgKzEsMjY4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IENoZWxzaW8sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgInJlZ3MuaCIKKyNpbmNsdWRlICJzZ2VfZGVmcy5oIgorI2luY2x1ZGUgInQzX2NwbC5oIgorI2luY2x1ZGUgImZpcm13YXJlX2V4cG9ydHMuaCIKKworI2RlZmluZSBVU0VfR1RTIDAKKworI2RlZmluZSBTR0VfUlhfU01fQlVGX1NJWkUgMTUzNgorI2RlZmluZSBTR0VfUlhfQ09QWV9USFJFUyAgMjU2CisKKyMgZGVmaW5lIFNHRV9SWF9EUk9QX1RIUkVTIDE2CisKKy8qCisgKiBQZXJpb2Qgb2YgdGhlIFR4IGJ1ZmZlciByZWNsYWltIHRpbWVyLiAgVGhpcyB0aW1lciBkb2VzIG5vdCBuZWVkIHRvIHJ1bgorICogZnJlcXVlbnRseSBhcyBUeCBidWZmZXJzIGFyZSB1c3VhbGx5IHJlY2xhaW1lZCBieSBuZXcgVHggcGFja2V0cy4KKyAqLworI2RlZmluZSBUWF9SRUNMQUlNX1BFUklPRCAoSFogLyA0KQorCisvKiBXUiBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lIFdSX0xFTiAoV1JfRkxJVFMgKiA4KQorCisvKgorICogVHlwZXMgb2YgVHggcXVldWVzIGluIGVhY2ggcXVldWUgc2V0LiAgT3JkZXIgaGVyZSBtYXR0ZXJzLCBkbyBub3QgY2hhbmdlLgorICovCitlbnVtIHsgVFhRX0VUSCwgVFhRX09GTEQsIFRYUV9DVFJMIH07CisKKy8qIFZhbHVlcyBmb3Igc2dlX3R4cS5mbGFncyAqLworZW51bSB7CisJVFhRX1JVTk5JTkcgPSAxIDw8IDAsCS8qIGZldGNoIGVuZ2luZSBpcyBydW5uaW5nICovCisJVFhRX0xBU1RfUEtUX0RCID0gMSA8PCAxLAkvKiBsYXN0IHBhY2tldCByYW5nIHRoZSBkb29yYmVsbCAqLworfTsKKworc3RydWN0IHR4X2Rlc2MgeworCXU2NCBmbGl0W1RYX0RFU0NfRkxJVFNdOworfTsKKworc3RydWN0IHJ4X2Rlc2MgeworCV9fYmUzMiBhZGRyX2xvOworCV9fYmUzMiBsZW5fZ2VuOworCV9fYmUzMiBnZW4yOworCV9fYmUzMiBhZGRyX2hpOworfTsKKworc3RydWN0IHR4X3N3X2Rlc2MgewkJLyogU1cgc3RhdGUgcGVyIFR4IGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworfTsKKworc3RydWN0IHJ4X3N3X2Rlc2MgewkJLyogU1cgc3RhdGUgcGVyIFJ4IGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCSBERUNMQVJFX1BDSV9VTk1BUF9BRERSKGRtYV9hZGRyKTsKK307CisKK3N0cnVjdCByc3BfZGVzYyB7CQkvKiByZXNwb25zZSBxdWV1ZSBkZXNjcmlwdG9yICovCisJc3RydWN0IHJzc19oZWFkZXIgcnNzX2hkcjsKKwlfX2JlMzIgZmxhZ3M7CisJX19iZTMyIGxlbl9jcTsKKwl1OCBpbW1fZGF0YVs0N107CisJdTggaW50cl9nZW47Cit9OworCitzdHJ1Y3QgdW5tYXBfaW5mbyB7CQkvKiBwYWNrZXQgdW5tYXBwaW5nIGluZm8sIG92ZXJsYXlzIHNrYi0+Y2IgKi8KKwlpbnQgc2ZsaXQ7CQkvKiBzdGFydCBmbGl0IG9mIGZpcnN0IFNHTCBlbnRyeSBpbiBUeCBkZXNjcmlwdG9yICovCisJdTE2IGZyYWdpZHg7CQkvKiBmaXJzdCBwYWdlIGZyYWdtZW50IGluIGN1cnJlbnQgVHggZGVzY3JpcHRvciAqLworCXUxNiBhZGRyX2lkeDsJCS8qIGJ1ZmZlciBpbmRleCBvZiBmaXJzdCBTR0wgZW50cnkgaW4gZGVzY3JpcHRvciAqLworCXUzMiBsZW47CQkvKiBtYXBwZWQgbGVuZ3RoIG9mIHNrYiBtYWluIGJvZHkgKi8KK307CisKKy8qCisgKiBNYXBzIGEgbnVtYmVyIG9mIGZsaXRzIHRvIHRoZSBudW1iZXIgb2YgVHggZGVzY3JpcHRvcnMgdGhhdCBjYW4gaG9sZCB0aGVtLgorICogVGhlIGZvcm11bGEgaXMKKyAqCisgKiBkZXNjID0gMSArIChmbGl0cyAtIDIpIC8gKFdSX0ZMSVRTIC0gMSkuCisgKgorICogSFcgYWxsb3dzIHVwIHRvIDQgZGVzY3JpcHRvcnMgdG8gYmUgY29tYmluZWQgaW50byBhIFdSLgorICovCitzdGF0aWMgdTggZmxpdF9kZXNjX21hcFtdID0geworCTAsCisjaWYgU0dFX05VTV9HRU5CSVRTID09IDEKKwkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCTIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisJMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKwk0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0CisjZWxpZiBTR0VfTlVNX0dFTkJJVFMgPT0gMgorCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKwkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisjZWxzZQorIyBlcnJvciAiU0dFX05VTV9HRU5CSVRTIG11c3QgYmUgMSBvciAyIgorI2VuZGlmCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzZ2VfcXNldCAqZmxfdG9fcXNldChjb25zdCBzdHJ1Y3Qgc2dlX2ZsICpxLCBpbnQgcWlkeCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHEsIHN0cnVjdCBzZ2VfcXNldCwgZmxbcWlkeF0pOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzZ2VfcXNldCAqcnNwcV90b19xc2V0KGNvbnN0IHN0cnVjdCBzZ2VfcnNwcSAqcSkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHEsIHN0cnVjdCBzZ2VfcXNldCwgcnNwcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNnZV9xc2V0ICp0eHFfdG9fcXNldChjb25zdCBzdHJ1Y3Qgc2dlX3R4cSAqcSwgaW50IHFpZHgpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihxLCBzdHJ1Y3Qgc2dlX3FzZXQsIHR4cVtxaWR4XSk7Cit9CisKKy8qKgorICoJcmVmaWxsX3JzcHEgLSByZXBsZW5pc2ggYW4gU0dFIHJlc3BvbnNlIHF1ZXVlCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBxOiB0aGUgcmVzcG9uc2UgcXVldWUgdG8gcmVwbGVuaXNoCisgKglAY3JlZGl0czogaG93IG1hbnkgbmV3IHJlc3BvbnNlcyB0byBtYWtlIGF2YWlsYWJsZQorICoKKyAqCVJlcGxlbmlzaGVzIGEgcmVzcG9uc2UgcXVldWUgYnkgbWFraW5nIHRoZSBzdXBwbGllZCBudW1iZXIgb2YgcmVzcG9uc2VzCisgKglhdmFpbGFibGUgdG8gSFcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZWZpbGxfcnNwcShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2dlX3JzcHEgKnEsIHVuc2lnbmVkIGludCBjcmVkaXRzKQoreworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX1JTUFFfQ1JFRElUX1JFVFVSTiwKKwkJICAgICBWX1JTUFEocS0+Y250eHRfaWQpIHwgVl9DUkVESVRTKGNyZWRpdHMpKTsKK30KKworLyoqCisgKgluZWVkX3NrYl91bm1hcCAtIGRvZXMgdGhlIHBsYXRmb3JtIG5lZWQgdW5tYXBwaW5nIG9mIHNrX2J1ZmZzPworICoKKyAqCVJldHVybnMgdHJ1ZSBpZiB0aGUgcGxhdGZyb20gbmVlZHMgc2tfYnVmZiB1bm1hcHBpbmcuICBUaGUgY29tcGlsZXIKKyAqCW9wdGltaXplcyBhd2F5IHVuZWNlc3NhcnkgY29kZSBpZiB0aGlzIHJldHVybnMgdHJ1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmVlZF9za2JfdW5tYXAodm9pZCkKK3sKKwkvKgorCSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gdGVsbCBpZiB0aGUgcGxhdGZyb20gbmVlZHMgYnVmZmVyCisJICogdW5tYXBwaW5nIGJ5IGNoZWNraW5nIGlmIERFQ0xBUkVfUENJX1VOTUFQX0FERFIgZGVmaW5lcyBhbnl0aGluZy4KKwkgKi8KKwlzdHJ1Y3QgZHVtbXkgeworCQlERUNMQVJFX1BDSV9VTk1BUF9BRERSKGFkZHIpOworCX07CisKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBkdW1teSkgIT0gMDsKK30KKworLyoqCisgKgl1bm1hcF9za2IgLSB1bm1hcCBhIHBhY2tldCBtYWluIGJvZHkgYW5kIGl0cyBwYWdlIGZyYWdtZW50cworICoJQHNrYjogdGhlIHBhY2tldAorICoJQHE6IHRoZSBUeCBxdWV1ZSBjb250YWluaW5nIFR4IGRlc2NyaXB0b3JzIGZvciB0aGUgcGFja2V0CisgKglAY2lkeDogaW5kZXggb2YgVHggZGVzY3JpcHRvcgorICoJQHBkZXY6IHRoZSBQQ0kgZGV2aWNlCisgKgorICoJVW5tYXAgdGhlIG1haW4gYm9keSBvZiBhbiBza19idWZmIGFuZCBpdHMgcGFnZSBmcmFnbWVudHMsIGlmIGFueS4KKyAqCUJlY2F1c2Ugb2YgdGhlIGZhaXJseSBjb21wbGljYXRlZCBzdHJ1Y3R1cmUgb2Ygb3VyIFNHTHMgYW5kIHRoZSBkZXNpcmUKKyAqCXRvIGNvbnNlcnZlIHNwYWNlIGZvciBtZXRhZGF0YSwgd2Uga2VlcCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvCisgKgl1bm1hcCBhbiBza19idWZmIHBhcnRseSBpbiB0aGUgc2tfYnVmZiBpdHNlbGYgKGluIGl0cyBjYiksIGFuZCBwYXJ0bHkKKyAqCWluIHRoZSBUeCBkZXNjcmlwdG9ycyAodGhlIHBoeXNpY2FsIGFkZHJlc3NlcyBvZiB0aGUgdmFyaW91cyBkYXRhCisgKglidWZmZXJzKS4gIFRoZSBzZW5kIGZ1bmN0aW9ucyBpbml0aWFsaXplIHRoZSBzdGF0ZSBpbiBza2ItPmNiIHNvIHdlCisgKgljYW4gdW5tYXAgdGhlIGJ1ZmZlcnMgaGVsZCBpbiB0aGUgZmlyc3QgVHggZGVzY3JpcHRvciBoZXJlLCBhbmQgd2UKKyAqCWhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIGF0IHRoaXMgcG9pbnQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBmb3IgdGhlIG5leHQKKyAqCVR4IGRlc2NyaXB0b3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bm1hcF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNnZV90eHEgKnEsCisJCQkgICAgIHVuc2lnbmVkIGludCBjaWR4LCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc2dfZW50ICpzZ3A7CisJc3RydWN0IHVubWFwX2luZm8gKnVpID0gKHN0cnVjdCB1bm1hcF9pbmZvICopc2tiLT5jYjsKKwlpbnQgbmZyYWdzLCBmcmFnX2lkeCwgY3VyZmxpdCwgaiA9IHVpLT5hZGRyX2lkeDsKKworCXNncCA9IChzdHJ1Y3Qgc2dfZW50ICopJnEtPmRlc2NbY2lkeF0uZmxpdFt1aS0+c2ZsaXRdOworCisJaWYgKHVpLT5sZW4pIHsKKwkJcGNpX3VubWFwX3NpbmdsZShwZGV2LCBiZTY0X3RvX2NwdShzZ3AtPmFkZHJbMF0pLCB1aS0+bGVuLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJdWktPmxlbiA9IDA7CS8qIHNvIHdlIGtub3cgZm9yIG5leHQgZGVzY3JpcHRvciBmb3IgdGhpcyBza2IgKi8KKwkJaiA9IDE7CisJfQorCisJZnJhZ19pZHggPSB1aS0+ZnJhZ2lkeDsKKwljdXJmbGl0ID0gdWktPnNmbGl0ICsgMSArIGo7CisJbmZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCXdoaWxlIChmcmFnX2lkeCA8IG5mcmFncyAmJiBjdXJmbGl0IDwgV1JfRkxJVFMpIHsKKwkJcGNpX3VubWFwX3BhZ2UocGRldiwgYmU2NF90b19jcHUoc2dwLT5hZGRyW2pdKSwKKwkJCSAgICAgICBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ZyYWdfaWR4XS5zaXplLAorCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlqIF49IDE7CisJCWlmIChqID09IDApIHsKKwkJCXNncCsrOworCQkJY3VyZmxpdCsrOworCQl9CisJCWN1cmZsaXQrKzsKKwkJZnJhZ19pZHgrKzsKKwl9CisKKwlpZiAoZnJhZ19pZHggPCBuZnJhZ3MpIHsJLyogU0dMIGNvbnRpbnVlcyBpbnRvIG5leHQgVHggZGVzY3JpcHRvciAqLworCQl1aS0+ZnJhZ2lkeCA9IGZyYWdfaWR4OworCQl1aS0+YWRkcl9pZHggPSBqOworCQl1aS0+c2ZsaXQgPSBjdXJmbGl0IC0gV1JfRkxJVFMgLSBqOwkvKiBzZmxpdCBjYW4gYmUgLTEgKi8KKwl9Cit9CisKKy8qKgorICoJZnJlZV90eF9kZXNjIC0gcmVjbGFpbXMgVHggZGVzY3JpcHRvcnMgYW5kIHRoZWlyIGJ1ZmZlcnMKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHE6IHRoZSBUeCBxdWV1ZSB0byByZWNsYWltIGRlc2NyaXB0b3JzIGZyb20KKyAqCUBuOiB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRvIHJlY2xhaW0KKyAqCisgKglSZWNsYWltcyBUeCBkZXNjcmlwdG9ycyBmcm9tIGFuIFNHRSBUeCBxdWV1ZSBhbmQgZnJlZXMgdGhlIGFzc29jaWF0ZWQKKyAqCVR4IGJ1ZmZlcnMuICBDYWxsZWQgd2l0aCB0aGUgVHggcXVldWUgbG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBmcmVlX3R4X2Rlc2Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBzZ2VfdHhxICpxLAorCQkJIHVuc2lnbmVkIGludCBuKQoreworCXN0cnVjdCB0eF9zd19kZXNjICpkOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwl1bnNpZ25lZCBpbnQgY2lkeCA9IHEtPmNpZHg7CisKKwlkID0gJnEtPnNkZXNjW2NpZHhdOworCXdoaWxlIChuLS0pIHsKKwkJaWYgKGQtPnNrYikgewkvKiBhbiBTR0wgaXMgcHJlc2VudCAqLworCQkJaWYgKG5lZWRfc2tiX3VubWFwKCkpCisJCQkJdW5tYXBfc2tiKGQtPnNrYiwgcSwgY2lkeCwgcGRldik7CisJCQlpZiAoZC0+c2tiLT5wcmlvcml0eSA9PSBjaWR4KQorCQkJCWtmcmVlX3NrYihkLT5za2IpOworCQl9CisJCSsrZDsKKwkJaWYgKCsrY2lkeCA9PSBxLT5zaXplKSB7CisJCQljaWR4ID0gMDsKKwkJCWQgPSBxLT5zZGVzYzsKKwkJfQorCX0KKwlxLT5jaWR4ID0gY2lkeDsKK30KKworLyoqCisgKglyZWNsYWltX2NvbXBsZXRlZF90eCAtIHJlY2xhaW1zIGNvbXBsZXRlZCBUeCBkZXNjcmlwdG9ycworICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAcTogdGhlIFR4IHF1ZXVlIHRvIHJlY2xhaW0gY29tcGxldGVkIGRlc2NyaXB0b3JzIGZyb20KKyAqCisgKglSZWNsYWltcyBUeCBkZXNjcmlwdG9ycyB0aGF0IHRoZSBTR0UgaGFzIGluZGljYXRlZCBpdCBoYXMgcHJvY2Vzc2VkLAorICoJYW5kIGZyZWVzIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlcnMgaWYgcG9zc2libGUuICBDYWxsZWQgd2l0aCB0aGUgVHgKKyAqCXF1ZXVlJ3MgbG9jayBoZWxkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVjbGFpbV9jb21wbGV0ZWRfdHgoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJCXN0cnVjdCBzZ2VfdHhxICpxKQoreworCXVuc2lnbmVkIGludCByZWNsYWltID0gcS0+cHJvY2Vzc2VkIC0gcS0+Y2xlYW5lZDsKKworCWlmIChyZWNsYWltKSB7CisJCWZyZWVfdHhfZGVzYyhhZGFwdGVyLCBxLCByZWNsYWltKTsKKwkJcS0+Y2xlYW5lZCArPSByZWNsYWltOworCQlxLT5pbl91c2UgLT0gcmVjbGFpbTsKKwl9Cit9CisKKy8qKgorICoJc2hvdWxkX3Jlc3RhcnRfdHggLSBhcmUgdGhlcmUgZW5vdWdoIHJlc291cmNlcyB0byByZXN0YXJ0IGEgVHggcXVldWU/CisgKglAcTogdGhlIFR4IHF1ZXVlCisgKgorICoJQ2hlY2tzIGlmIHRoZXJlIGFyZSBlbm91Z2ggZGVzY3JpcHRvcnMgdG8gcmVzdGFydCBhIHN1c3BlbmRlZCBUeCBxdWV1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2hvdWxkX3Jlc3RhcnRfdHgoY29uc3Qgc3RydWN0IHNnZV90eHEgKnEpCit7CisJdW5zaWduZWQgaW50IHIgPSBxLT5wcm9jZXNzZWQgLSBxLT5jbGVhbmVkOworCisJcmV0dXJuIHEtPmluX3VzZSAtIHIgPCAocS0+c2l6ZSA+PiAxKTsKK30KKworLyoqCisgKglmcmVlX3J4X2J1ZnMgLSBmcmVlIHRoZSBSeCBidWZmZXJzIG9uIGFuIFNHRSBmcmVlIGxpc3QKKyAqCUBwZGV2OiB0aGUgUENJIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFkYXB0ZXIKKyAqCUByeHE6IHRoZSBTR0UgZnJlZSBsaXN0IHRvIGNsZWFuIHVwCisgKgorICoJUmVsZWFzZSB0aGUgYnVmZmVycyBvbiBhbiBTR0UgZnJlZS1idWZmZXIgUnggcXVldWUuICBIVyBmZXRjaGluZyBmcm9tCisgKgl0aGlzIHF1ZXVlIHNob3VsZCBiZSBzdG9wcGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGZyZWVfcnhfYnVmcyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHNnZV9mbCAqcSkKK3sKKwl1bnNpZ25lZCBpbnQgY2lkeCA9IHEtPmNpZHg7CisKKwl3aGlsZSAocS0+Y3JlZGl0cy0tKSB7CisJCXN0cnVjdCByeF9zd19kZXNjICpkID0gJnEtPnNkZXNjW2NpZHhdOworCisJCXBjaV91bm1hcF9zaW5nbGUocGRldiwgcGNpX3VubWFwX2FkZHIoZCwgZG1hX2FkZHIpLAorCQkJCSBxLT5idWZfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJa2ZyZWVfc2tiKGQtPnNrYik7CisJCWQtPnNrYiA9IE5VTEw7CisJCWlmICgrK2NpZHggPT0gcS0+c2l6ZSkKKwkJCWNpZHggPSAwOworCX0KK30KKworLyoqCisgKglhZGRfb25lX3J4X2J1ZiAtIGFkZCBhIHBhY2tldCBidWZmZXIgdG8gYSBmcmVlLWJ1ZmZlciBsaXN0CisgKglAc2tiOiB0aGUgYnVmZmVyIHRvIGFkZAorICoJQGxlbjogdGhlIGJ1ZmZlciBsZW5ndGgKKyAqCUBkOiB0aGUgSFcgUnggZGVzY3JpcHRvciB0byB3cml0ZQorICoJQHNkOiB0aGUgU1cgUnggZGVzY3JpcHRvciB0byB3cml0ZQorICoJQGdlbjogdGhlIGdlbmVyYXRpb24gYml0IHZhbHVlCisgKglAcGRldjogdGhlIFBDSSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBhZGFwdGVyCisgKgorICoJQWRkIGEgYnVmZmVyIG9mIHRoZSBnaXZlbiBsZW5ndGggdG8gdGhlIHN1cHBsaWVkIEhXIGFuZCBTVyBSeAorICoJZGVzY3JpcHRvcnMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfb25lX3J4X2J1ZihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSAgc3RydWN0IHJ4X2Rlc2MgKmQsIHN0cnVjdCByeF9zd19kZXNjICpzZCwKKwkJCQkgIHVuc2lnbmVkIGludCBnZW4sIHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWRtYV9hZGRyX3QgbWFwcGluZzsKKworCXNkLT5za2IgPSBza2I7CisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXBjaV91bm1hcF9hZGRyX3NldChzZCwgZG1hX2FkZHIsIG1hcHBpbmcpOworCisJZC0+YWRkcl9sbyA9IGNwdV90b19iZTMyKG1hcHBpbmcpOworCWQtPmFkZHJfaGkgPSBjcHVfdG9fYmUzMigodTY0KSBtYXBwaW5nID4+IDMyKTsKKwl3bWIoKTsKKwlkLT5sZW5fZ2VuID0gY3B1X3RvX2JlMzIoVl9GTERfR0VOMShnZW4pKTsKKwlkLT5nZW4yID0gY3B1X3RvX2JlMzIoVl9GTERfR0VOMihnZW4pKTsKK30KKworLyoqCisgKglyZWZpbGxfZmwgLSByZWZpbGwgYW4gU0dFIGZyZWUtYnVmZmVyIGxpc3QKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHE6IHRoZSBmcmVlLWxpc3QgdG8gcmVmaWxsCisgKglAbjogdGhlIG51bWJlciBvZiBuZXcgYnVmZmVycyB0byBhbGxvY2F0ZQorICoJQGdmcDogdGhlIGdmcCBmbGFncyBmb3IgYWxsb2NhdGluZyBuZXcgYnVmZmVycworICoKKyAqCShSZSlwb3B1bGF0ZSBhbiBTR0UgZnJlZS1idWZmZXIgbGlzdCB3aXRoIHVwIHRvIEBuIG5ldyBwYWNrZXQgYnVmZmVycywKKyAqCWFsbG9jYXRlZCB3aXRoIHRoZSBzdXBwbGllZCBnZnAgZmxhZ3MuICBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoYXQKKyAqCUBuIGRvZXMgbm90IGV4Y2VlZCB0aGUgcXVldWUncyBjYXBhY2l0eS4KKyAqLworc3RhdGljIHZvaWQgcmVmaWxsX2ZsKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX2ZsICpxLCBpbnQgbiwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCByeF9zd19kZXNjICpzZCA9ICZxLT5zZGVzY1txLT5waWR4XTsKKwlzdHJ1Y3QgcnhfZGVzYyAqZCA9ICZxLT5kZXNjW3EtPnBpZHhdOworCisJd2hpbGUgKG4tLSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKHEtPmJ1Zl9zaXplLCBnZnApOworCisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJYWRkX29uZV9yeF9idWYoc2tiLCBxLT5idWZfc2l6ZSwgZCwgc2QsIHEtPmdlbiwgYWRhcC0+cGRldik7CisJCWQrKzsKKwkJc2QrKzsKKwkJaWYgKCsrcS0+cGlkeCA9PSBxLT5zaXplKSB7CisJCQlxLT5waWR4ID0gMDsKKwkJCXEtPmdlbiBePSAxOworCQkJc2QgPSBxLT5zZGVzYzsKKwkJCWQgPSBxLT5kZXNjOworCQl9CisJCXEtPmNyZWRpdHMrKzsKKwl9CisKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9TR19LRE9PUkJFTEwsIFZfRUdSQ05UWChxLT5jbnR4dF9pZCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19yZWZpbGxfZmwoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfZmwgKmZsKQoreworCXJlZmlsbF9mbChhZGFwLCBmbCwgbWluKDE2VSwgZmwtPnNpemUgLSBmbC0+Y3JlZGl0cyksIEdGUF9BVE9NSUMpOworfQorCisvKioKKyAqCXJlY3ljbGVfcnhfYnVmIC0gcmVjeWNsZSBhIHJlY2VpdmUgYnVmZmVyCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBxOiB0aGUgU0dFIGZyZWUgbGlzdAorICoJQGlkeDogaW5kZXggb2YgYnVmZmVyIHRvIHJlY3ljbGUKKyAqCisgKglSZWN5Y2xlcyB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBvbiB0aGUgZ2l2ZW4gZnJlZSBsaXN0IGJ5IGFkZGluZyBpdCBhdAorICoJdGhlIG5leHQgYXZhaWxhYmxlIHNsb3Qgb24gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIHJlY3ljbGVfcnhfYnVmKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX2ZsICpxLAorCQkJICAgdW5zaWduZWQgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgcnhfZGVzYyAqZnJvbSA9ICZxLT5kZXNjW2lkeF07CisJc3RydWN0IHJ4X2Rlc2MgKnRvID0gJnEtPmRlc2NbcS0+cGlkeF07CisKKwlxLT5zZGVzY1txLT5waWR4XSA9IHEtPnNkZXNjW2lkeF07CisJdG8tPmFkZHJfbG8gPSBmcm9tLT5hZGRyX2xvOwkvKiBhbHJlYWR5IGJpZyBlbmRpYW4gKi8KKwl0by0+YWRkcl9oaSA9IGZyb20tPmFkZHJfaGk7CS8qIGxpa2V3aXNlICovCisJd21iKCk7CisJdG8tPmxlbl9nZW4gPSBjcHVfdG9fYmUzMihWX0ZMRF9HRU4xKHEtPmdlbikpOworCXRvLT5nZW4yID0gY3B1X3RvX2JlMzIoVl9GTERfR0VOMihxLT5nZW4pKTsKKwlxLT5jcmVkaXRzKys7CisKKwlpZiAoKytxLT5waWR4ID09IHEtPnNpemUpIHsKKwkJcS0+cGlkeCA9IDA7CisJCXEtPmdlbiBePSAxOworCX0KKwl0M193cml0ZV9yZWcoYWRhcCwgQV9TR19LRE9PUkJFTEwsIFZfRUdSQ05UWChxLT5jbnR4dF9pZCkpOworfQorCisvKioKKyAqCWFsbG9jX3JpbmcgLSBhbGxvY2F0ZSByZXNvdXJjZXMgZm9yIGFuIFNHRSBkZXNjcmlwdG9yIHJpbmcKKyAqCUBwZGV2OiB0aGUgUENJIGRldmljZQorICoJQG5lbGVtOiB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzCisgKglAZWxlbV9zaXplOiB0aGUgc2l6ZSBvZiBlYWNoIGRlc2NyaXB0b3IKKyAqCUBzd19zaXplOiB0aGUgc2l6ZSBvZiB0aGUgU1cgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcmluZyBlbGVtZW50CisgKglAcGh5czogdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCByaW5nCisgKglAbWV0YWRhdGE6IGFkZHJlc3Mgb2YgdGhlIGFycmF5IGhvbGRpbmcgdGhlIFNXIHN0YXRlIGZvciB0aGUgcmluZworICoKKyAqCUFsbG9jYXRlcyByZXNvdXJjZXMgZm9yIGFuIFNHRSBkZXNjcmlwdG9yIHJpbmcsIHN1Y2ggYXMgVHggcXVldWVzLAorICoJZnJlZSBidWZmZXIgbGlzdHMsIG9yIHJlc3BvbnNlIHF1ZXVlcy4gIEVhY2ggU0dFIHJpbmcgcmVxdWlyZXMKKyAqCXNwYWNlIGZvciBpdHMgSFcgZGVzY3JpcHRvcnMgcGx1cywgb3B0aW9uYWxseSwgc3BhY2UgZm9yIHRoZSBTVyBzdGF0ZQorICoJYXNzb2NpYXRlZCB3aXRoIGVhY2ggSFcgZW50cnkgKHRoZSBtZXRhZGF0YSkuICBUaGUgZnVuY3Rpb24gcmV0dXJucworICoJdGhyZWUgdmFsdWVzOiB0aGUgdmlydHVhbCBhZGRyZXNzIGZvciB0aGUgSFcgcmluZyAodGhlIHJldHVybiB2YWx1ZQorICoJb2YgdGhlIGZ1bmN0aW9uKSwgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEhXIHJpbmcsIGFuZCB0aGUgYWRkcmVzcworICoJb2YgdGhlIFNXIHJpbmcuCisgKi8KK3N0YXRpYyB2b2lkICphbGxvY19yaW5nKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbGVtX3NpemUsCisJCQlzaXplX3Qgc3dfc2l6ZSwgZG1hX2FkZHJfdCAqcGh5cywgdm9pZCAqbWV0YWRhdGEpCit7CisJc2l6ZV90IGxlbiA9IG5lbGVtICogZWxlbV9zaXplOworCXZvaWQgKnMgPSBOVUxMOworCXZvaWQgKnAgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgbGVuLCBwaHlzLCBHRlBfS0VSTkVMKTsKKworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN3X3NpemUpIHsKKwkJcyA9IGtjYWxsb2MobmVsZW0sIHN3X3NpemUsIEdGUF9LRVJORUwpOworCisJCWlmICghcykgeworCQkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgbGVuLCBwLCAqcGh5cyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlpZiAobWV0YWRhdGEpCisJCSoodm9pZCAqKiltZXRhZGF0YSA9IHM7CisJbWVtc2V0KHAsIDAsIGxlbik7CisJcmV0dXJuIHA7Cit9CisKKy8qKgorICoJZnJlZV9xc2V0IC0gZnJlZSB0aGUgcmVzb3VyY2VzIG9mIGFuIFNHRSBxdWV1ZSBzZXQKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlciBvd25pbmcgdGhlIHF1ZXVlIHNldAorICoJQHE6IHRoZSBxdWV1ZSBzZXQKKyAqCisgKglSZWxlYXNlIHRoZSBIVyBhbmQgU1cgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhbiBTR0UgcXVldWUgc2V0LCBzdWNoCisgKglhcyBIVyBjb250ZXh0cywgcGFja2V0IGJ1ZmZlcnMsIGFuZCBkZXNjcmlwdG9yIHJpbmdzLiAgVHJhZmZpYyB0byB0aGUKKyAqCXF1ZXVlIHNldCBtdXN0IGJlIHF1aWVzY2VkIHByaW9yIHRvIGNhbGxpbmcgdGhpcy4KKyAqLwordm9pZCB0M19mcmVlX3FzZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBzZ2VfcXNldCAqcSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisKKwlpZiAocS0+dHhfcmVjbGFpbV90aW1lci5mdW5jdGlvbikKKwkJZGVsX3RpbWVyX3N5bmMoJnEtPnR4X3JlY2xhaW1fdGltZXIpOworCisJZm9yIChpID0gMDsgaSA8IFNHRV9SWFFfUEVSX1NFVDsgKytpKQorCQlpZiAocS0+ZmxbaV0uZGVzYykgeworCQkJc3Bpbl9sb2NrKCZhZGFwdGVyLT5zZ2UucmVnX2xvY2spOworCQkJdDNfc2dlX2Rpc2FibGVfZmwoYWRhcHRlciwgcS0+ZmxbaV0uY250eHRfaWQpOworCQkJc3Bpbl91bmxvY2soJmFkYXB0ZXItPnNnZS5yZWdfbG9jayk7CisJCQlmcmVlX3J4X2J1ZnMocGRldiwgJnEtPmZsW2ldKTsKKwkJCWtmcmVlKHEtPmZsW2ldLnNkZXNjKTsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkJCSAgcS0+ZmxbaV0uc2l6ZSAqCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCByeF9kZXNjKSwgcS0+ZmxbaV0uZGVzYywKKwkJCQkJICBxLT5mbFtpXS5waHlzX2FkZHIpOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0dFX1RYUV9QRVJfU0VUOyArK2kpCisJCWlmIChxLT50eHFbaV0uZGVzYykgeworCQkJc3Bpbl9sb2NrKCZhZGFwdGVyLT5zZ2UucmVnX2xvY2spOworCQkJdDNfc2dlX2VuYWJsZV9lY250eHQoYWRhcHRlciwgcS0+dHhxW2ldLmNudHh0X2lkLCAwKTsKKwkJCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5zZ2UucmVnX2xvY2spOworCQkJaWYgKHEtPnR4cVtpXS5zZGVzYykgeworCQkJCWZyZWVfdHhfZGVzYyhhZGFwdGVyLCAmcS0+dHhxW2ldLAorCQkJCQkgICAgIHEtPnR4cVtpXS5pbl91c2UpOworCQkJCWtmcmVlKHEtPnR4cVtpXS5zZGVzYyk7CisJCQl9CisJCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJCQkgIHEtPnR4cVtpXS5zaXplICoKKwkJCQkJICBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpLAorCQkJCQkgIHEtPnR4cVtpXS5kZXNjLCBxLT50eHFbaV0ucGh5c19hZGRyKTsKKwkJCV9fc2tiX3F1ZXVlX3B1cmdlKCZxLT50eHFbaV0uc2VuZHEpOworCQl9CisKKwlpZiAocS0+cnNwcS5kZXNjKSB7CisJCXNwaW5fbG9jaygmYWRhcHRlci0+c2dlLnJlZ19sb2NrKTsKKwkJdDNfc2dlX2Rpc2FibGVfcnNwY250eHQoYWRhcHRlciwgcS0+cnNwcS5jbnR4dF9pZCk7CisJCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5zZ2UucmVnX2xvY2spOworCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJCSAgcS0+cnNwcS5zaXplICogc2l6ZW9mKHN0cnVjdCByc3BfZGVzYyksCisJCQkJICBxLT5yc3BxLmRlc2MsIHEtPnJzcHEucGh5c19hZGRyKTsKKwl9CisKKwlpZiAocS0+bmV0ZGV2KQorCQlxLT5uZXRkZXYtPmF0YWxrX3B0ciA9IE5VTEw7CisKKwltZW1zZXQocSwgMCwgc2l6ZW9mKCpxKSk7Cit9CisKKy8qKgorICoJaW5pdF9xc2V0X2NudHh0IC0gaW5pdGlhbGl6ZSBhbiBTR0UgcXVldWUgc2V0IGNvbnRleHQgaW5mbworICoJQHFzOiB0aGUgcXVldWUgc2V0CisgKglAaWQ6IHRoZSBxdWV1ZSBzZXQgaWQKKyAqCisgKglJbml0aWFsaXplcyB0aGUgVElEcyBhbmQgY29udGV4dCBpZHMgZm9yIHRoZSBxdWV1ZXMgb2YgYSBxdWV1ZSBzZXQuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcXNldF9jbnR4dChzdHJ1Y3Qgc2dlX3FzZXQgKnFzLCB1bnNpZ25lZCBpbnQgaWQpCit7CisJcXMtPnJzcHEuY250eHRfaWQgPSBpZDsKKwlxcy0+ZmxbMF0uY250eHRfaWQgPSAyICogaWQ7CisJcXMtPmZsWzFdLmNudHh0X2lkID0gMiAqIGlkICsgMTsKKwlxcy0+dHhxW1RYUV9FVEhdLmNudHh0X2lkID0gRldfVFVOTkVMX1NHRUVDX1NUQVJUICsgaWQ7CisJcXMtPnR4cVtUWFFfRVRIXS50b2tlbiA9IEZXX1RVTk5FTF9USURfU1RBUlQgKyBpZDsKKwlxcy0+dHhxW1RYUV9PRkxEXS5jbnR4dF9pZCA9IEZXX09GTERfU0dFRUNfU1RBUlQgKyBpZDsKKwlxcy0+dHhxW1RYUV9DVFJMXS5jbnR4dF9pZCA9IEZXX0NUUkxfU0dFRUNfU1RBUlQgKyBpZDsKKwlxcy0+dHhxW1RYUV9DVFJMXS50b2tlbiA9IEZXX0NUUkxfVElEX1NUQVJUICsgaWQ7Cit9CisKKy8qKgorICoJc2dsX2xlbiAtIGNhbGN1bGF0ZXMgdGhlIHNpemUgb2YgYW4gU0dMIG9mIHRoZSBnaXZlbiBjYXBhY2l0eQorICoJQG46IHRoZSBudW1iZXIgb2YgU0dMIGVudHJpZXMKKyAqCisgKglDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZmxpdHMgbmVlZGVkIGZvciBhIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgdGhhdAorICoJY2FuIGhvbGQgdGhlIGdpdmVuIG51bWJlciBvZiBlbnRyaWVzLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZ2xfbGVuKHVuc2lnbmVkIGludCBuKQoreworCS8qIGFsdGVybmF0aXZlbHk6IDMgKiAobiAvIDIpICsgMiAqIChuICYgMSkgKi8KKwlyZXR1cm4gKDMgKiBuKSAvIDIgKyAobiAmIDEpOworfQorCisvKioKKyAqCWZsaXRzX3RvX2Rlc2MgLSByZXR1cm5zIHRoZSBudW0gb2YgVHggZGVzY3JpcHRvcnMgZm9yIHRoZSBnaXZlbiBmbGl0cworICoJQG46IHRoZSBudW1iZXIgb2YgZmxpdHMKKyAqCisgKglDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgVHggZGVzY3JpcHRvcnMgbmVlZGVkIGZvciB0aGUgc3VwcGxpZWQgbnVtYmVyCisgKglvZiBmbGl0cy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZmxpdHNfdG9fZGVzYyh1bnNpZ25lZCBpbnQgbikKK3sKKwlCVUdfT04obiA+PSBBUlJBWV9TSVpFKGZsaXRfZGVzY19tYXApKTsKKwlyZXR1cm4gZmxpdF9kZXNjX21hcFtuXTsKK30KKworLyoqCisgKglnZXRfcGFja2V0IC0gcmV0dXJuIHRoZSBuZXh0IGluZ3Jlc3MgcGFja2V0IGJ1ZmZlciBmcm9tIGEgZnJlZSBsaXN0CisgKglAYWRhcDogdGhlIGFkYXB0ZXIgdGhhdCByZWNlaXZlZCB0aGUgcGFja2V0CisgKglAZmw6IHRoZSBTR0UgZnJlZSBsaXN0IGhvbGRpbmcgdGhlIHBhY2tldAorICoJQGxlbjogdGhlIHBhY2tldCBsZW5ndGggaW5jbHVkaW5nIGFueSBTR0UgcGFkZGluZworICoJQGRyb3BfdGhyZXM6ICMgb2YgcmVtYWluaW5nIGJ1ZmZlcnMgYmVmb3JlIHdlIHN0YXJ0IGRyb3BwaW5nIHBhY2tldHMKKyAqCisgKglHZXQgdGhlIG5leHQgcGFja2V0IGZyb20gYSBmcmVlIGxpc3QgYW5kIGNvbXBsZXRlIHNldHVwIG9mIHRoZQorICoJc2tfYnVmZi4gIElmIHRoZSBwYWNrZXQgaXMgc21hbGwgd2UgbWFrZSBhIGNvcHkgYW5kIHJlY3ljbGUgdGhlCisgKglvcmlnaW5hbCBidWZmZXIsIG90aGVyd2lzZSB3ZSB1c2UgdGhlIG9yaWdpbmFsIGJ1ZmZlciBpdHNlbGYuICBJZiBhCisgKglwb3NpdGl2ZSBkcm9wIHRocmVzaG9sZCBpcyBzdXBwbGllZCBwYWNrZXRzIGFyZSBkcm9wcGVkIGFuZCB0aGVpcgorICoJYnVmZmVycyByZWN5Y2xlZCBpZiAoYSkgdGhlIG51bWJlciBvZiByZW1haW5pbmcgYnVmZmVycyBpcyB1bmRlciB0aGUKKyAqCXRocmVzaG9sZCBhbmQgdGhlIHBhY2tldCBpcyB0b28gYmlnIHRvIGNvcHksIG9yIChiKSB0aGUgcGFja2V0IHNob3VsZAorICoJYmUgY29waWVkIGJ1dCB0aGVyZSBpcyBubyBtZW1vcnkgZm9yIHRoZSBjb3B5LgorICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmdldF9wYWNrZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfZmwgKmZsLAorCQkJCSAgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGRyb3BfdGhyZXMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IHJ4X3N3X2Rlc2MgKnNkID0gJmZsLT5zZGVzY1tmbC0+Y2lkeF07CisKKwlwcmVmZXRjaChzZC0+c2tiLT5kYXRhKTsKKworCWlmIChsZW4gPD0gU0dFX1JYX0NPUFlfVEhSRVMpIHsKKwkJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CisJCWlmIChsaWtlbHkoc2tiICE9IE5VTEwpKSB7CisJCQlfX3NrYl9wdXQoc2tiLCBsZW4pOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGFkYXAtPnBkZXYsCisJCQkJCQkgICAgcGNpX3VubWFwX2FkZHIoc2QsCisJCQkJCQkJCSAgIGRtYV9hZGRyKSwKKwkJCQkJCSAgICBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQltZW1jcHkoc2tiLT5kYXRhLCBzZC0+c2tiLT5kYXRhLCBsZW4pOworCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGFkYXAtPnBkZXYsCisJCQkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIoc2QsCisJCQkJCQkJCSAgICAgIGRtYV9hZGRyKSwKKwkJCQkJCSAgICAgICBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCX0gZWxzZSBpZiAoIWRyb3BfdGhyZXMpCisJCQlnb3RvIHVzZV9vcmlnX2J1ZjsKKwkgICAgICByZWN5Y2xlOgorCQlyZWN5Y2xlX3J4X2J1ZihhZGFwLCBmbCwgZmwtPmNpZHgpOworCQlyZXR1cm4gc2tiOworCX0KKworCWlmICh1bmxpa2VseShmbC0+Y3JlZGl0cyA8IGRyb3BfdGhyZXMpKQorCQlnb3RvIHJlY3ljbGU7CisKKyAgICAgIHVzZV9vcmlnX2J1ZjoKKwlwY2lfdW5tYXBfc2luZ2xlKGFkYXAtPnBkZXYsIHBjaV91bm1hcF9hZGRyKHNkLCBkbWFfYWRkciksCisJCQkgZmwtPmJ1Zl9zaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXNrYiA9IHNkLT5za2I7CisJc2tiX3B1dChza2IsIGxlbik7CisJX19yZWZpbGxfZmwoYWRhcCwgZmwpOworCXJldHVybiBza2I7Cit9CisKKy8qKgorICoJZ2V0X2ltbV9wYWNrZXQgLSByZXR1cm4gdGhlIG5leHQgaW5ncmVzcyBwYWNrZXQgYnVmZmVyIGZyb20gYSByZXNwb25zZQorICoJQHJlc3A6IHRoZSByZXNwb25zZSBkZXNjcmlwdG9yIGNvbnRhaW5pbmcgdGhlIHBhY2tldCBkYXRhCisgKgorICoJUmV0dXJuIGEgcGFja2V0IGNvbnRhaW5pbmcgdGhlIGltbWVkaWF0ZSBkYXRhIG9mIHRoZSBnaXZlbiByZXNwb25zZS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqZ2V0X2ltbV9wYWNrZXQoY29uc3Qgc3RydWN0IHJzcF9kZXNjICpyZXNwKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2IoSU1NRURfUEtUX1NJWkUsIEdGUF9BVE9NSUMpOworCisJaWYgKHNrYikgeworCQlfX3NrYl9wdXQoc2tiLCBJTU1FRF9QS1RfU0laRSk7CisJCW1lbWNweShza2ItPmRhdGEsIHJlc3AtPmltbV9kYXRhLCBJTU1FRF9QS1RfU0laRSk7CisJfQorCXJldHVybiBza2I7Cit9CisKKy8qKgorICoJY2FsY190eF9kZXNjcyAtIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIFR4IGRlc2NyaXB0b3JzIGZvciBhIHBhY2tldAorICoJQHNrYjogdGhlIHBhY2tldAorICoKKyAqIAlSZXR1cm5zIHRoZSBudW1iZXIgb2YgVHggZGVzY3JpcHRvcnMgbmVlZGVkIGZvciB0aGUgZ2l2ZW4gRXRoZXJuZXQKKyAqIAlwYWNrZXQuICBFdGhlcm5ldCBwYWNrZXRzIHJlcXVpcmUgYWRkaXRpb24gb2YgV1IgYW5kIENQTCBoZWFkZXJzLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjYWxjX3R4X2Rlc2NzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJdW5zaWduZWQgaW50IGZsaXRzOworCisJaWYgKHNrYi0+bGVuIDw9IFdSX0xFTiAtIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdCkpCisJCXJldHVybiAxOworCisJZmxpdHMgPSBzZ2xfbGVuKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKSArIDI7CisJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpCisJCWZsaXRzKys7CisJcmV0dXJuIGZsaXRzX3RvX2Rlc2MoZmxpdHMpOworfQorCisvKioKKyAqCW1ha2Vfc2dsIC0gcG9wdWxhdGUgYSBzY2F0dGVyL2dhdGhlciBsaXN0IGZvciBhIHBhY2tldAorICoJQHNrYjogdGhlIHBhY2tldAorICoJQHNncDogdGhlIFNHTCB0byBwb3B1bGF0ZQorICoJQHN0YXJ0OiBzdGFydCBhZGRyZXNzIG9mIHNrYiBtYWluIGJvZHkgZGF0YSB0byBpbmNsdWRlIGluIHRoZSBTR0wKKyAqCUBsZW46IGxlbmd0aCBvZiBza2IgbWFpbiBib2R5IGRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgU0dMCisgKglAcGRldjogdGhlIFBDSSBkZXZpY2UKKyAqCisgKglHZW5lcmF0ZXMgYSBzY2F0dGVyL2dhdGhlciBsaXN0IGZvciB0aGUgYnVmZmVycyB0aGF0IG1ha2UgdXAgYSBwYWNrZXQKKyAqCWFuZCByZXR1cm5zIHRoZSBTR0wgc2l6ZSBpbiA4LWJ5dGUgd29yZHMuICBUaGUgY2FsbGVyIG11c3Qgc2l6ZSB0aGUgU0dMCisgKglhcHByb3ByaWF0ZWx5LgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtYWtlX3NnbChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICBzdHJ1Y3Qgc2dfZW50ICpzZ3AsIHVuc2lnbmVkIGNoYXIgKnN0YXJ0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbGVuLCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlkbWFfYWRkcl90IG1hcHBpbmc7CisJdW5zaWduZWQgaW50IGksIGogPSAwLCBuZnJhZ3M7CisKKwlpZiAobGVuKSB7CisJCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBzdGFydCwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJc2dwLT5sZW5bMF0gPSBjcHVfdG9fYmUzMihsZW4pOworCQlzZ3AtPmFkZHJbMF0gPSBjcHVfdG9fYmU2NChtYXBwaW5nKTsKKwkJaiA9IDE7CisJfQorCisJbmZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwlmb3IgKGkgPSAwOyBpIDwgbmZyYWdzOyBpKyspIHsKKwkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCisJCW1hcHBpbmcgPSBwY2lfbWFwX3BhZ2UocGRldiwgZnJhZy0+cGFnZSwgZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJICAgICAgIGZyYWctPnNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlzZ3AtPmxlbltqXSA9IGNwdV90b19iZTMyKGZyYWctPnNpemUpOworCQlzZ3AtPmFkZHJbal0gPSBjcHVfdG9fYmU2NChtYXBwaW5nKTsKKwkJaiBePSAxOworCQlpZiAoaiA9PSAwKQorCQkJKytzZ3A7CisJfQorCWlmIChqKQorCQlzZ3AtPmxlbltqXSA9IDA7CisJcmV0dXJuICgobmZyYWdzICsgKGxlbiAhPSAwKSkgKiAzKSAvIDIgKyBqOworfQorCisvKioKKyAqCWNoZWNrX3JpbmdfdHhfZGIgLSBjaGVjayBhbmQgcG90ZW50aWFsbHkgcmluZyBhIFR4IHF1ZXVlJ3MgZG9vcmJlbGwKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQHE6IHRoZSBUeCBxdWV1ZQorICoKKyAqCVJpbmcgdGhlIGRvb3JiZWwgaWYgYSBUeCBxdWV1ZSBpcyBhc2xlZXAuICBUaGVyZSBpcyBhIG5hdHVyYWwgcmFjZSwKKyAqCXdoZXJlIHRoZSBIVyBpcyBnb2luZyB0byBzbGVlcCBqdXN0IGFmdGVyIHdlIGNoZWNrZWQsIGhvd2V2ZXIsCisgKgl0aGVuIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIGRldGVjdCB0aGUgb3V0c3RhbmRpbmcgVFggcGFja2V0CisgKglhbmQgcmluZyB0aGUgZG9vcmJlbGwgZm9yIHVzLgorICoKKyAqCVdoZW4gR1RTIGlzIGRpc2FibGVkIHdlIHVuY29uZGl0aW9uYWxseSByaW5nIHRoZSBkb29yYmVsbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3JpbmdfdHhfZGIoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfdHhxICpxKQoreworI2lmIFVTRV9HVFMKKwljbGVhcl9iaXQoVFhRX0xBU1RfUEtUX0RCLCAmcS0+ZmxhZ3MpOworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFRYUV9SVU5OSU5HLCAmcS0+ZmxhZ3MpID09IDApIHsKKwkJc2V0X2JpdChUWFFfTEFTVF9QS1RfREIsICZxLT5mbGFncyk7CisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1NHX0tET09SQkVMTCwKKwkJCSAgICAgRl9TRUxFR1JDTlRYIHwgVl9FR1JDTlRYKHEtPmNudHh0X2lkKSk7CisJfQorI2Vsc2UKKwl3bWIoKTsJCQkvKiB3cml0ZSBkZXNjcmlwdG9ycyBiZWZvcmUgdGVsbGluZyBIVyAqLworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1NHX0tET09SQkVMTCwKKwkJICAgICBGX1NFTEVHUkNOVFggfCBWX0VHUkNOVFgocS0+Y250eHRfaWQpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JfZ2VuMihzdHJ1Y3QgdHhfZGVzYyAqZCwgdW5zaWduZWQgaW50IGdlbikKK3sKKyNpZiBTR0VfTlVNX0dFTkJJVFMgPT0gMgorCWQtPmZsaXRbVFhfREVTQ19GTElUUyAtIDFdID0gY3B1X3RvX2JlNjQoZ2VuKTsKKyNlbmRpZgorfQorCisvKioKKyAqCXdyaXRlX3dyX2hkcl9zZ2wgLSB3cml0ZSBhIFdSIGhlYWRlciBhbmQsIG9wdGlvbmFsbHksIFNHTAorICoJQG5kZXNjOiBudW1iZXIgb2YgVHggZGVzY3JpcHRvcnMgc3Bhbm5lZCBieSB0aGUgU0dMCisgKglAc2tiOiB0aGUgcGFja2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFdSCisgKglAZDogZmlyc3QgVHggZGVzY3JpcHRvciB0byBiZSB3cml0dGVuCisgKglAcGlkeDogaW5kZXggb2YgYWJvdmUgZGVzY3JpcHRvcnMKKyAqCUBxOiB0aGUgU0dFIFR4IHF1ZXVlCisgKglAc2dsOiB0aGUgU0dMCisgKglAZmxpdHM6IG51bWJlciBvZiBmbGl0cyB0byB0aGUgc3RhcnQgb2YgdGhlIFNHTCBpbiB0aGUgZmlyc3QgZGVzY3JpcHRvcgorICoJQHNnbF9mbGl0czogdGhlIFNHTCBzaXplIGluIGZsaXRzCisgKglAZ2VuOiB0aGUgVHggZGVzY3JpcHRvciBnZW5lcmF0aW9uCisgKglAd3JfaGk6IHRvcCAzMiBiaXRzIG9mIFdSIGhlYWRlciBiYXNlZCBvbiBXUiB0eXBlIChiaWcgZW5kaWFuKQorICoJQHdyX2xvOiBsb3cgMzIgYml0cyBvZiBXUiBoZWFkZXIgYmFzZWQgb24gV1IgdHlwZSAoYmlnIGVuZGlhbikKKyAqCisgKglXcml0ZSBhIHdvcmsgcmVxdWVzdCBoZWFkZXIgYW5kIGFuIGFzc29jaWF0ZWQgU0dMLiAgSWYgdGhlIFNHTCBpcworICoJc21hbGwgZW5vdWdoIHRvIGZpdCBpbnRvIG9uZSBUeCBkZXNjcmlwdG9yIGl0IGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbgorICoJYW5kIHdlIGp1c3QgbmVlZCB0byB3cml0ZSB0aGUgV1IgaGVhZGVyLiAgT3RoZXJ3aXNlIHdlIGRpc3RyaWJ1dGUgdGhlCisgKglTR0wgYWNyb3NzIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgaXQgc3BhbnMuCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3dyX2hkcl9zZ2wodW5zaWduZWQgaW50IG5kZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgdHhfZGVzYyAqZCwgdW5zaWduZWQgaW50IHBpZHgsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBzZ2VfdHhxICpxLAorCQkJICAgICBjb25zdCBzdHJ1Y3Qgc2dfZW50ICpzZ2wsCisJCQkgICAgIHVuc2lnbmVkIGludCBmbGl0cywgdW5zaWduZWQgaW50IHNnbF9mbGl0cywKKwkJCSAgICAgdW5zaWduZWQgaW50IGdlbiwgdW5zaWduZWQgaW50IHdyX2hpLAorCQkJICAgICB1bnNpZ25lZCBpbnQgd3JfbG8pCit7CisJc3RydWN0IHdvcmtfcmVxdWVzdF9oZHIgKndycCA9IChzdHJ1Y3Qgd29ya19yZXF1ZXN0X2hkciAqKWQ7CisJc3RydWN0IHR4X3N3X2Rlc2MgKnNkID0gJnEtPnNkZXNjW3BpZHhdOworCisJc2QtPnNrYiA9IHNrYjsKKwlpZiAobmVlZF9za2JfdW5tYXAoKSkgeworCQlzdHJ1Y3QgdW5tYXBfaW5mbyAqdWkgPSAoc3RydWN0IHVubWFwX2luZm8gKilza2ItPmNiOworCisJCXVpLT5mcmFnaWR4ID0gMDsKKwkJdWktPmFkZHJfaWR4ID0gMDsKKwkJdWktPnNmbGl0ID0gZmxpdHM7CisJfQorCisJaWYgKGxpa2VseShuZGVzYyA9PSAxKSkgeworCQlza2ItPnByaW9yaXR5ID0gcGlkeDsKKwkJd3JwLT53cl9oaSA9IGh0b25sKEZfV1JfU09QIHwgRl9XUl9FT1AgfCBWX1dSX0RBVEFUWVBFKDEpIHwKKwkJCQkgICBWX1dSX1NHTFNGTFQoZmxpdHMpKSB8IHdyX2hpOworCQl3bWIoKTsKKwkJd3JwLT53cl9sbyA9IGh0b25sKFZfV1JfTEVOKGZsaXRzICsgc2dsX2ZsaXRzKSB8CisJCQkJICAgVl9XUl9HRU4oZ2VuKSkgfCB3cl9sbzsKKwkJd3JfZ2VuMihkLCBnZW4pOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBvZ2VuID0gZ2VuOworCQljb25zdCB1NjQgKmZwID0gKGNvbnN0IHU2NCAqKXNnbDsKKwkJc3RydWN0IHdvcmtfcmVxdWVzdF9oZHIgKndwID0gd3JwOworCisJCXdycC0+d3JfaGkgPSBodG9ubChGX1dSX1NPUCB8IFZfV1JfREFUQVRZUEUoMSkgfAorCQkJCSAgIFZfV1JfU0dMU0ZMVChmbGl0cykpIHwgd3JfaGk7CisKKwkJd2hpbGUgKHNnbF9mbGl0cykgeworCQkJdW5zaWduZWQgaW50IGF2YWlsID0gV1JfRkxJVFMgLSBmbGl0czsKKworCQkJaWYgKGF2YWlsID4gc2dsX2ZsaXRzKQorCQkJCWF2YWlsID0gc2dsX2ZsaXRzOworCQkJbWVtY3B5KCZkLT5mbGl0W2ZsaXRzXSwgZnAsIGF2YWlsICogc2l6ZW9mKCpmcCkpOworCQkJc2dsX2ZsaXRzIC09IGF2YWlsOworCQkJbmRlc2MtLTsKKwkJCWlmICghc2dsX2ZsaXRzKQorCQkJCWJyZWFrOworCisJCQlmcCArPSBhdmFpbDsKKwkJCWQrKzsKKwkJCXNkKys7CisJCQlpZiAoKytwaWR4ID09IHEtPnNpemUpIHsKKwkJCQlwaWR4ID0gMDsKKwkJCQlnZW4gXj0gMTsKKwkJCQlkID0gcS0+ZGVzYzsKKwkJCQlzZCA9IHEtPnNkZXNjOworCQkJfQorCisJCQlzZC0+c2tiID0gc2tiOworCQkJd3JwID0gKHN0cnVjdCB3b3JrX3JlcXVlc3RfaGRyICopZDsKKwkJCXdycC0+d3JfaGkgPSBodG9ubChWX1dSX0RBVEFUWVBFKDEpIHwKKwkJCQkJICAgVl9XUl9TR0xTRkxUKDEpKSB8IHdyX2hpOworCQkJd3JwLT53cl9sbyA9IGh0b25sKFZfV1JfTEVOKG1pbihXUl9GTElUUywKKwkJCQkJCQlzZ2xfZmxpdHMgKyAxKSkgfAorCQkJCQkgICBWX1dSX0dFTihnZW4pKSB8IHdyX2xvOworCQkJd3JfZ2VuMihkLCBnZW4pOworCQkJZmxpdHMgPSAxOworCQl9CisJCXNrYi0+cHJpb3JpdHkgPSBwaWR4OworCQl3cnAtPndyX2hpIHw9IGh0b25sKEZfV1JfRU9QKTsKKwkJd21iKCk7CisJCXdwLT53cl9sbyA9IGh0b25sKFZfV1JfTEVOKFdSX0ZMSVRTKSB8IFZfV1JfR0VOKG9nZW4pKSB8IHdyX2xvOworCQl3cl9nZW4yKChzdHJ1Y3QgdHhfZGVzYyAqKXdwLCBvZ2VuKTsKKwkJV0FSTl9PTihuZGVzYyAhPSAwKTsKKwl9Cit9CisKKy8qKgorICoJd3JpdGVfdHhfcGt0X3dyIC0gd3JpdGUgYSBUWF9QS1Qgd29yayByZXF1ZXN0CisgKglAYWRhcDogdGhlIGFkYXB0ZXIKKyAqCUBza2I6IHRoZSBwYWNrZXQgdG8gc2VuZAorICoJQHBpOiB0aGUgZWdyZXNzIGludGVyZmFjZQorICoJQHBpZHg6IGluZGV4IG9mIHRoZSBmaXJzdCBUeCBkZXNjcmlwdG9yIHRvIHdyaXRlCisgKglAZ2VuOiB0aGUgZ2VuZXJhdGlvbiB2YWx1ZSB0byB1c2UKKyAqCUBxOiB0aGUgVHggcXVldWUKKyAqCUBuZGVzYzogbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHRoZSBwYWNrZXQgd2lsbCBvY2N1cHkKKyAqCUBjb21wbDogdGhlIHZhbHVlIG9mIHRoZSBDT01QTCBiaXQgdG8gdXNlCisgKgorICoJR2VuZXJhdGUgYSBUWF9QS1Qgd29yayByZXF1ZXN0IHRvIHNlbmQgdGhlIHN1cHBsaWVkIHBhY2tldC4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfdHhfcGt0X3dyKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIGNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpLAorCQkJICAgIHVuc2lnbmVkIGludCBwaWR4LCB1bnNpZ25lZCBpbnQgZ2VuLAorCQkJICAgIHN0cnVjdCBzZ2VfdHhxICpxLCB1bnNpZ25lZCBpbnQgbmRlc2MsCisJCQkgICAgdW5zaWduZWQgaW50IGNvbXBsKQoreworCXVuc2lnbmVkIGludCBmbGl0cywgc2dsX2ZsaXRzLCBjbnRybCwgdHNvX2luZm87CisJc3RydWN0IHNnX2VudCAqc2dwLCBzZ2xbTUFYX1NLQl9GUkFHUyAvIDIgKyAxXTsKKwlzdHJ1Y3QgdHhfZGVzYyAqZCA9ICZxLT5kZXNjW3BpZHhdOworCXN0cnVjdCBjcGxfdHhfcGt0ICpjcGwgPSAoc3RydWN0IGNwbF90eF9wa3QgKilkOworCisJY3BsLT5sZW4gPSBodG9ubChza2ItPmxlbiB8IDB4ODAwMDAwMDApOworCWNudHJsID0gVl9UWFBLVF9JTlRGKHBpLT5wb3J0X2lkKTsKKworCWlmICh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikgJiYgcGktPnZsYW5fZ3JwKQorCQljbnRybCB8PSBGX1RYUEtUX1ZMQU5fVkxEIHwgVl9UWFBLVF9WTEFOKHZsYW5fdHhfdGFnX2dldChza2IpKTsKKworCXRzb19pbmZvID0gVl9MU09fTVNTKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpOworCWlmICh0c29faW5mbykgeworCQlpbnQgZXRoX3R5cGU7CisJCXN0cnVjdCBjcGxfdHhfcGt0X2xzbyAqaGRyID0gKHN0cnVjdCBjcGxfdHhfcGt0X2xzbyAqKWNwbDsKKworCQlkLT5mbGl0WzJdID0gMDsKKwkJY250cmwgfD0gVl9UWFBLVF9PUENPREUoQ1BMX1RYX1BLVF9MU08pOworCQloZHItPmNudHJsID0gaHRvbmwoY250cmwpOworCQlldGhfdHlwZSA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhID09IEVUSF9ITEVOID8KKwkJICAgIENQTF9FVEhfSUkgOiBDUExfRVRIX0lJX1ZMQU47CisJCXRzb19pbmZvIHw9IFZfTFNPX0VUSF9UWVBFKGV0aF90eXBlKSB8CisJCSAgICBWX0xTT19JUEhEUl9XT1JEUyhza2ItPm5oLmlwaC0+aWhsKSB8CisJCSAgICBWX0xTT19UQ1BIRFJfV09SRFMoc2tiLT5oLnRoLT5kb2ZmKTsKKwkJaGRyLT5sc29faW5mbyA9IGh0b25sKHRzb19pbmZvKTsKKwkJZmxpdHMgPSAzOworCX0gZWxzZSB7CisJCWNudHJsIHw9IFZfVFhQS1RfT1BDT0RFKENQTF9UWF9QS1QpOworCQljbnRybCB8PSBGX1RYUEtUX0lQQ1NVTV9ESVM7CS8qIFNXIGNhbGN1bGF0ZXMgSVAgY3N1bSAqLworCQljbnRybCB8PSBWX1RYUEtUX0w0Q1NVTV9ESVMoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCk7CisJCWNwbC0+Y250cmwgPSBodG9ubChjbnRybCk7CisKKwkJaWYgKHNrYi0+bGVuIDw9IFdSX0xFTiAtIHNpemVvZigqY3BsKSkgeworCQkJcS0+c2Rlc2NbcGlkeF0uc2tiID0gTlVMTDsKKwkJCWlmICghc2tiLT5kYXRhX2xlbikKKwkJCQltZW1jcHkoJmQtPmZsaXRbMl0sIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJZWxzZQorCQkJCXNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmZC0+ZmxpdFsyXSwgc2tiLT5sZW4pOworCisJCQlmbGl0cyA9IChza2ItPmxlbiArIDcpIC8gOCArIDI7CisJCQljcGwtPndyLndyX2hpID0gaHRvbmwoVl9XUl9CQ05UTEZMVChza2ItPmxlbiAmIDcpIHwKKwkJCQkJICAgICAgVl9XUl9PUChGV19XUk9QQ09ERV9UVU5ORUxfVFhfUEtUKQorCQkJCQkgICAgICB8IEZfV1JfU09QIHwgRl9XUl9FT1AgfCBjb21wbCk7CisJCQl3bWIoKTsKKwkJCWNwbC0+d3Iud3JfbG8gPSBodG9ubChWX1dSX0xFTihmbGl0cykgfCBWX1dSX0dFTihnZW4pIHwKKwkJCQkJICAgICAgVl9XUl9USUQocS0+dG9rZW4pKTsKKwkJCXdyX2dlbjIoZCwgZ2VuKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuOworCQl9CisKKwkJZmxpdHMgPSAyOworCX0KKworCXNncCA9IG5kZXNjID09IDEgPyAoc3RydWN0IHNnX2VudCAqKSZkLT5mbGl0W2ZsaXRzXSA6IHNnbDsKKwlzZ2xfZmxpdHMgPSBtYWtlX3NnbChza2IsIHNncCwgc2tiLT5kYXRhLCBza2JfaGVhZGxlbihza2IpLCBhZGFwLT5wZGV2KTsKKwlpZiAobmVlZF9za2JfdW5tYXAoKSkKKwkJKChzdHJ1Y3QgdW5tYXBfaW5mbyAqKXNrYi0+Y2IpLT5sZW4gPSBza2JfaGVhZGxlbihza2IpOworCisJd3JpdGVfd3JfaGRyX3NnbChuZGVzYywgc2tiLCBkLCBwaWR4LCBxLCBzZ2wsIGZsaXRzLCBzZ2xfZmxpdHMsIGdlbiwKKwkJCSBodG9ubChWX1dSX09QKEZXX1dST1BDT0RFX1RVTk5FTF9UWF9QS1QpIHwgY29tcGwpLAorCQkJIGh0b25sKFZfV1JfVElEKHEtPnRva2VuKSkpOworfQorCisvKioKKyAqCWV0aF94bWl0IC0gYWRkIGEgcGFja2V0IHRvIHRoZSBFdGhlcm5ldCBUeCBxdWV1ZQorICoJQHNrYjogdGhlIHBhY2tldAorICoJQGRldjogdGhlIGVncmVzcyBuZXQgZGV2aWNlCisgKgorICoJQWRkIGEgcGFja2V0IHRvIGFuIFNHRSBUeCBxdWV1ZS4gIFJ1bnMgd2l0aCBzb2Z0aXJxcyBkaXNhYmxlZC4KKyAqLworaW50IHQzX2V0aF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IG5kZXNjLCBwaWR4LCBjcmVkaXRzLCBnZW4sIGNvbXBsOworCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3Qgc2dlX3FzZXQgKnFzID0gZGV2MnFzZXQoZGV2KTsKKwlzdHJ1Y3Qgc2dlX3R4cSAqcSA9ICZxcy0+dHhxW1RYUV9FVEhdOworCisJLyoKKwkgKiBUaGUgY2hpcCBtaW4gcGFja2V0IGxlbmd0aCBpcyA5IG9jdGV0cyBidXQgcGxheSBzYWZlIGFuZCByZWplY3QKKwkgKiBhbnl0aGluZyBzaG9ydGVyIHRoYW4gYW4gRXRoZXJuZXQgaGVhZGVyLgorCSAqLworCWlmICh1bmxpa2VseShza2ItPmxlbiA8IEVUSF9ITEVOKSkgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJc3Bpbl9sb2NrKCZxLT5sb2NrKTsKKwlyZWNsYWltX2NvbXBsZXRlZF90eChhZGFwLCBxKTsKKworCWNyZWRpdHMgPSBxLT5zaXplIC0gcS0+aW5fdXNlOworCW5kZXNjID0gY2FsY190eF9kZXNjcyhza2IpOworCisJaWYgKHVubGlrZWx5KGNyZWRpdHMgPCBuZGVzYykpIHsKKwkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpIHsKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCXNldF9iaXQoVFhRX0VUSCwgJnFzLT50eHFfc3RvcHBlZCk7CisJCQlxLT5zdG9wcysrOworCQkJZGV2X2VycigmYWRhcC0+cGRldi0+ZGV2LAorCQkJCSIlczogVHggcmluZyAldSBmdWxsIHdoaWxlIHF1ZXVlIGF3YWtlIVxuIiwKKwkJCQlkZXYtPm5hbWUsIHEtPmNudHh0X2lkICYgNyk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnEtPmxvY2spOworCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CisJfQorCisJcS0+aW5fdXNlICs9IG5kZXNjOworCWlmICh1bmxpa2VseShjcmVkaXRzIC0gbmRlc2MgPCBxLT5zdG9wX3RocmVzKSkgeworCQlxLT5zdG9wcysrOworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJCXNldF9iaXQoVFhRX0VUSCwgJnFzLT50eHFfc3RvcHBlZCk7CisjaWYgIVVTRV9HVFMKKwkJaWYgKHNob3VsZF9yZXN0YXJ0X3R4KHEpICYmCisJCSAgICB0ZXN0X2FuZF9jbGVhcl9iaXQoVFhRX0VUSCwgJnFzLT50eHFfc3RvcHBlZCkpIHsKKwkJCXEtPnJlc3RhcnRzKys7CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCX0KKyNlbmRpZgorCX0KKworCWdlbiA9IHEtPmdlbjsKKwlxLT51bmFja2VkICs9IG5kZXNjOworCWNvbXBsID0gKHEtPnVuYWNrZWQgJiA4KSA8PCAoU19XUl9DT01QTCAtIDMpOworCXEtPnVuYWNrZWQgJj0gNzsKKwlwaWR4ID0gcS0+cGlkeDsKKwlxLT5waWR4ICs9IG5kZXNjOworCWlmIChxLT5waWR4ID49IHEtPnNpemUpIHsKKwkJcS0+cGlkeCAtPSBxLT5zaXplOworCQlxLT5nZW4gXj0gMTsKKwl9CisKKwkvKiB1cGRhdGUgcG9ydCBzdGF0aXN0aWNzICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQlxcy0+cG9ydF9zdGF0c1tTR0VfUFNUQVRfVFhfQ1NVTV0rKzsKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkKKwkJcXMtPnBvcnRfc3RhdHNbU0dFX1BTVEFUX1RTT10rKzsKKwlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpICYmIHBpLT52bGFuX2dycCkKKwkJcXMtPnBvcnRfc3RhdHNbU0dFX1BTVEFUX1ZMQU5JTlNdKys7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwlzcGluX3VubG9jaygmcS0+bG9jayk7CisKKwkvKgorCSAqIFdlIGRvIG5vdCB1c2UgVHggY29tcGxldGlvbiBpbnRlcnJ1cHRzIHRvIGZyZWUgRE1BZCBUeCBwYWNrZXRzLgorCSAqIFRoaXMgaXMgZ29vZCBmb3IgcGVyZm9ybWFtY2UgYnV0IG1lYW5zIHRoYXQgd2UgcmVseSBvbiBuZXcgVHgKKwkgKiBwYWNrZXRzIGFycml2aW5nIHRvIHJ1biB0aGUgZGVzdHJ1Y3RvcnMgb2YgY29tcGxldGVkIHBhY2tldHMsCisJICogd2hpY2ggb3BlbiB1cCBzcGFjZSBpbiB0aGVpciBzb2NrZXRzJyBzZW5kIHF1ZXVlcy4gIFNvbWV0aW1lcworCSAqIHdlIGRvIG5vdCBnZXQgc3VjaCBuZXcgcGFja2V0cyBjYXVzaW5nIFR4IHRvIHN0YWxsLiAgQSBzaW5nbGUKKwkgKiBVRFAgdHJhbnNtaXR0ZXIgaXMgYSBnb29kIGV4YW1wbGUgb2YgdGhpcyBzaXR1YXRpb24uICBXZSBoYXZlCisJICogYSBjbGVhbiB1cCB0aW1lciB0aGF0IHBlcmlvZGljYWxseSByZWNsYWltcyBjb21wbGV0ZWQgcGFja2V0cworCSAqIGJ1dCBpdCBkb2Vzbid0IHJ1biBvZnRlbiBlbm91Z2ggKG5vciBkbyB3ZSB3YW50IGl0IHRvKSB0byBwcmV2ZW50CisJICogbGVuZ3RoeSBzdGFsbHMuICBBIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbSBpcyB0byBydW4gdGhlCisJICogZGVzdHJ1Y3RvciBlYXJseSwgYWZ0ZXIgdGhlIHBhY2tldCBpcyBxdWV1ZWQgYnV0IGJlZm9yZSBpdCdzIERNQWQuCisJICogQSBjb25zIGlzIHRoYXQgd2UgbGllIHRvIHNvY2tldCBtZW1vcnkgYWNjb3VudGluZywgYnV0IHRoZSBhbW91bnQKKwkgKiBvZiBleHRyYSBtZW1vcnkgaXMgcmVhc29uYWJsZSAobGltaXRlZCBieSB0aGUgbnVtYmVyIG9mIFR4CisJICogZGVzY3JpcHRvcnMpLCB0aGUgcGFja2V0cyBkbyBhY3R1YWxseSBnZXQgZnJlZWQgcXVpY2tseSBieSBuZXcKKwkgKiBwYWNrZXRzIGFsbW9zdCBhbHdheXMsIGFuZCBmb3IgcHJvdG9jb2xzIGxpa2UgVENQIHRoYXQgd2FpdCBmb3IKKwkgKiBhY2tzIHRvIHJlYWxseSBmcmVlIHVwIHRoZSBkYXRhIHRoZSBleHRyYSBtZW1vcnkgaXMgZXZlbiBsZXNzLgorCSAqIE9uIHRoZSBwb3NpdGl2ZSBzaWRlIHdlIHJ1biB0aGUgZGVzdHJ1Y3RvcnMgb24gdGhlIHNlbmRpbmcgQ1BVCisJICogcmF0aGVyIHRoYW4gb24gYSBwb3RlbnRpYWxseSBkaWZmZXJlbnQgY29tcGxldGluZyBDUFUsIHVzdWFsbHkgYQorCSAqIGdvb2QgdGhpbmcuICBXZSBhbHNvIHJ1biB0aGVtIHdpdGhvdXQgaG9sZGluZyBvdXIgVHggcXVldWUgbG9jaywKKwkgKiB1bmxpa2Ugd2hhdCByZWNsYWltX2NvbXBsZXRlZF90eCgpIHdvdWxkIG90aGVyd2lzZSBkby4KKwkgKgorCSAqIFJ1biB0aGUgZGVzdHJ1Y3RvciBiZWZvcmUgdGVsbGluZyB0aGUgRE1BIGVuZ2luZSBhYm91dCB0aGUgcGFja2V0CisJICogdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgY29tcGxldGUgYW5kIGdldCBmcmVlZCBwcmVtYXR1cmVseS4KKwkgKi8KKwlpZiAobGlrZWx5KCFza2Jfc2hhcmVkKHNrYikpKQorCQlza2Jfb3JwaGFuKHNrYik7CisKKwl3cml0ZV90eF9wa3Rfd3IoYWRhcCwgc2tiLCBwaSwgcGlkeCwgZ2VuLCBxLCBuZGVzYywgY29tcGwpOworCWNoZWNrX3JpbmdfdHhfZGIoYWRhcCwgcSk7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworLyoqCisgKgl3cml0ZV9pbW0gLSB3cml0ZSBhIHBhY2tldCBpbnRvIGEgVHggZGVzY3JpcHRvciBhcyBpbW1lZGlhdGUgZGF0YQorICoJQGQ6IHRoZSBUeCBkZXNjcmlwdG9yIHRvIHdyaXRlCisgKglAc2tiOiB0aGUgcGFja2V0CisgKglAbGVuOiB0aGUgbGVuZ3RoIG9mIHBhY2tldCBkYXRhIHRvIHdyaXRlIGFzIGltbWVkaWF0ZSBkYXRhCisgKglAZ2VuOiB0aGUgZ2VuZXJhdGlvbiBiaXQgdmFsdWUgdG8gd3JpdGUKKyAqCisgKglXcml0ZXMgYSBwYWNrZXQgYXMgaW1tZWRpYXRlIGRhdGEgaW50byBhIFR4IGRlc2NyaXB0b3IuICBUaGUgcGFja2V0CisgKgljb250YWlucyBhIHdvcmsgcmVxdWVzdCBhdCBpdHMgYmVnaW5uaW5nLiAgV2UgbXVzdCB3cml0ZSB0aGUgcGFja2V0CisgKgljYXJlZnVsbHkgc28gdGhlIFNHRSBkb2Vzbid0IHJlYWQgYWNjaWRlbnRhbGx5IGJlZm9yZSBpdCdzIHdyaXR0ZW4gaW4KKyAqCWl0cyBlbnRpcmV0eS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2ltbShzdHJ1Y3QgdHhfZGVzYyAqZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGdlbikKK3sKKwlzdHJ1Y3Qgd29ya19yZXF1ZXN0X2hkciAqZnJvbSA9IChzdHJ1Y3Qgd29ya19yZXF1ZXN0X2hkciAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3Qgd29ya19yZXF1ZXN0X2hkciAqdG8gPSAoc3RydWN0IHdvcmtfcmVxdWVzdF9oZHIgKilkOworCisJbWVtY3B5KCZ0b1sxXSwgJmZyb21bMV0sIGxlbiAtIHNpemVvZigqZnJvbSkpOworCXRvLT53cl9oaSA9IGZyb20tPndyX2hpIHwgaHRvbmwoRl9XUl9TT1AgfCBGX1dSX0VPUCB8CisJCQkJCVZfV1JfQkNOVExGTFQobGVuICYgNykpOworCXdtYigpOworCXRvLT53cl9sbyA9IGZyb20tPndyX2xvIHwgaHRvbmwoVl9XUl9HRU4oZ2VuKSB8CisJCQkJCVZfV1JfTEVOKChsZW4gKyA3KSAvIDgpKTsKKwl3cl9nZW4yKGQsIGdlbik7CisJa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qKgorICoJY2hlY2tfZGVzY19hdmFpbCAtIGNoZWNrIGRlc2NyaXB0b3IgYXZhaWxhYmlsaXR5IG9uIGEgc2VuZCBxdWV1ZQorICoJQGFkYXA6IHRoZSBhZGFwdGVyCisgKglAcTogdGhlIHNlbmQgcXVldWUKKyAqCUBza2I6IHRoZSBwYWNrZXQgbmVlZGluZyB0aGUgZGVzY3JpcHRvcnMKKyAqCUBuZGVzYzogdGhlIG51bWJlciBvZiBUeCBkZXNjcmlwdG9ycyBuZWVkZWQKKyAqCUBxaWQ6IHRoZSBUeCBxdWV1ZSBudW1iZXIgaW4gaXRzIHF1ZXVlIHNldCAoVFhRX09GTEQgb3IgVFhRX0NUUkwpCisgKgorICoJQ2hlY2tzIGlmIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIFR4IGRlc2NyaXB0b3JzIGlzIGF2YWlsYWJsZSBvbiBhbgorICoJU0dFIHNlbmQgcXVldWUuICBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBzdXNwZW5kZWQgb3Igbm90IGVub3VnaAorICoJZGVzY3JpcHRvcnMgYXJlIGF2YWlsYWJsZSB0aGUgcGFja2V0IGlzIHF1ZXVlZCBmb3IgbGF0ZXIgdHJhbnNtaXNzaW9uLgorICoJTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgVHggcXVldWUgbG9ja2VkLgorICoKKyAqCVJldHVybnMgMCBpZiBlbm91Z2ggZGVzY3JpcHRvcnMgYXJlIGF2YWlsYWJsZSwgMSBpZiB0aGVyZSBhcmVuJ3QKKyAqCWVub3VnaCBkZXNjcmlwdG9ycyBhbmQgdGhlIHBhY2tldCBoYXMgYmVlbiBxdWV1ZWQsIGFuZCAyIGlmIHRoZSBjYWxsZXIKKyAqCW5lZWRzIHRvIHJldHJ5IGJlY2F1c2UgdGhlcmUgd2VyZW4ndCBlbm91Z2ggZGVzY3JpcHRvcnMgYXQgdGhlCisgKgliZWdpbm5pbmcgb2YgdGhlIGNhbGwgYnV0IHNvbWUgZnJlZWQgdXAgaW4gdGhlIG1lYW4gdGltZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfZGVzY19hdmFpbChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV90eHEgKnEsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG5kZXNjLAorCQkJCSAgIHVuc2lnbmVkIGludCBxaWQpCit7CisJaWYgKHVubGlrZWx5KCFza2JfcXVldWVfZW1wdHkoJnEtPnNlbmRxKSkpIHsKKwkgICAgICBhZGRxX2V4aXQ6X19za2JfcXVldWVfdGFpbCgmcS0+c2VuZHEsIHNrYik7CisJCXJldHVybiAxOworCX0KKwlpZiAodW5saWtlbHkocS0+c2l6ZSAtIHEtPmluX3VzZSA8IG5kZXNjKSkgeworCQlzdHJ1Y3Qgc2dlX3FzZXQgKnFzID0gdHhxX3RvX3FzZXQocSwgcWlkKTsKKworCQlzZXRfYml0KHFpZCwgJnFzLT50eHFfc3RvcHBlZCk7CisJCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisKKwkJaWYgKHNob3VsZF9yZXN0YXJ0X3R4KHEpICYmCisJCSAgICB0ZXN0X2FuZF9jbGVhcl9iaXQocWlkLCAmcXMtPnR4cV9zdG9wcGVkKSkKKwkJCXJldHVybiAyOworCisJCXEtPnN0b3BzKys7CisJCWdvdG8gYWRkcV9leGl0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglyZWNsYWltX2NvbXBsZXRlZF90eF9pbW0gLSByZWNsYWltIGNvbXBsZXRlZCBjb250cm9sLXF1ZXVlIFR4IGRlc2NzCisgKglAcTogdGhlIFNHRSBjb250cm9sIFR4IHF1ZXVlCisgKgorICoJVGhpcyBpcyBhIHZhcmlhbnQgb2YgcmVjbGFpbV9jb21wbGV0ZWRfdHgoKSB0aGF0IGlzIHVzZWQgZm9yIFR4IHF1ZXVlcworICoJdGhhdCBzZW5kIG9ubHkgaW1tZWRpYXRlIGRhdGEgKHByZXNlbnRseSBqdXN0IHRoZSBjb250cm9sIHF1ZXVlcykgYW5kCisgKgl0aHVzIGRvIG5vdCBoYXZlIGFueSBza19idWZmcyB0byByZWxlYXNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVjbGFpbV9jb21wbGV0ZWRfdHhfaW1tKHN0cnVjdCBzZ2VfdHhxICpxKQoreworCXVuc2lnbmVkIGludCByZWNsYWltID0gcS0+cHJvY2Vzc2VkIC0gcS0+Y2xlYW5lZDsKKworCXEtPmluX3VzZSAtPSByZWNsYWltOworCXEtPmNsZWFuZWQgKz0gcmVjbGFpbTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW1tZWRpYXRlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bGVuIDw9IFdSX0xFTiAmJiAhc2tiLT5kYXRhX2xlbjsKK30KKworLyoqCisgKgljdHJsX3htaXQgLSBzZW5kIGEgcGFja2V0IHRocm91Z2ggYW4gU0dFIGNvbnRyb2wgVHggcXVldWUKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQHE6IHRoZSBjb250cm9sIHF1ZXVlCisgKglAc2tiOiB0aGUgcGFja2V0CisgKgorICoJU2VuZCBhIHBhY2tldCB0aHJvdWdoIGFuIFNHRSBjb250cm9sIFR4IHF1ZXVlLiAgUGFja2V0cyBzZW50IHRocm91Z2gKKyAqCWEgY29udHJvbCBxdWV1ZSBtdXN0IGZpdCBlbnRpcmVseSBhcyBpbW1lZGlhdGUgZGF0YSBpbiBhIHNpbmdsZSBUeAorICoJZGVzY3JpcHRvciBhbmQgaGF2ZSBubyBwYWdlIGZyYWdtZW50cy4KKyAqLworc3RhdGljIGludCBjdHJsX3htaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfdHhxICpxLAorCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgd29ya19yZXF1ZXN0X2hkciAqd3JwID0gKHN0cnVjdCB3b3JrX3JlcXVlc3RfaGRyICopc2tiLT5kYXRhOworCisJaWYgKHVubGlrZWx5KCFpbW1lZGlhdGUoc2tiKSkpIHsKKwkJV0FSTl9PTigxKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKKwl9CisKKwl3cnAtPndyX2hpIHw9IGh0b25sKEZfV1JfU09QIHwgRl9XUl9FT1ApOworCXdycC0+d3JfbG8gPSBodG9ubChWX1dSX1RJRChxLT50b2tlbikpOworCisJc3Bpbl9sb2NrKCZxLT5sb2NrKTsKKyAgICAgIGFnYWluOnJlY2xhaW1fY29tcGxldGVkX3R4X2ltbShxKTsKKworCXJldCA9IGNoZWNrX2Rlc2NfYXZhaWwoYWRhcCwgcSwgc2tiLCAxLCBUWFFfQ1RSTCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJaWYgKHJldCA9PSAxKSB7CisJCQlzcGluX3VubG9jaygmcS0+bG9jayk7CisJCQlyZXR1cm4gTkVUX1hNSVRfQ047CisJCX0KKwkJZ290byBhZ2FpbjsKKwl9CisKKwl3cml0ZV9pbW0oJnEtPmRlc2NbcS0+cGlkeF0sIHNrYiwgc2tiLT5sZW4sIHEtPmdlbik7CisKKwlxLT5pbl91c2UrKzsKKwlpZiAoKytxLT5waWR4ID49IHEtPnNpemUpIHsKKwkJcS0+cGlkeCA9IDA7CisJCXEtPmdlbiBePSAxOworCX0KKwlzcGluX3VubG9jaygmcS0+bG9jayk7CisJd21iKCk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfU0dfS0RPT1JCRUxMLAorCQkgICAgIEZfU0VMRUdSQ05UWCB8IFZfRUdSQ05UWChxLT5jbnR4dF9pZCkpOworCXJldHVybiBORVRfWE1JVF9TVUNDRVNTOworfQorCisvKioKKyAqCXJlc3RhcnRfY3RybHEgLSByZXN0YXJ0IGEgc3VzcGVuZGVkIGNvbnRyb2wgcXVldWUKKyAqCUBxczogdGhlIHF1ZXVlIHNldCBjb3RhaW5pbmcgdGhlIGNvbnRyb2wgcXVldWUKKyAqCisgKglSZXN1bWVzIHRyYW5zbWlzc2lvbiBvbiBhIHN1c3BlbmRlZCBUeCBjb250cm9sIHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCByZXN0YXJ0X2N0cmxxKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBzZ2VfcXNldCAqcXMgPSAoc3RydWN0IHNnZV9xc2V0ICopZGF0YTsKKwlzdHJ1Y3Qgc2dlX3R4cSAqcSA9ICZxcy0+dHhxW1RYUV9DVFJMXTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHFzLT5uZXRkZXYtPnByaXY7CisKKwlzcGluX2xvY2soJnEtPmxvY2spOworICAgICAgYWdhaW46cmVjbGFpbV9jb21wbGV0ZWRfdHhfaW1tKHEpOworCisJd2hpbGUgKHEtPmluX3VzZSA8IHEtPnNpemUgJiYgKHNrYiA9IF9fc2tiX2RlcXVldWUoJnEtPnNlbmRxKSkgIT0gTlVMTCkgeworCisJCXdyaXRlX2ltbSgmcS0+ZGVzY1txLT5waWR4XSwgc2tiLCBza2ItPmxlbiwgcS0+Z2VuKTsKKworCQlpZiAoKytxLT5waWR4ID49IHEtPnNpemUpIHsKKwkJCXEtPnBpZHggPSAwOworCQkJcS0+Z2VuIF49IDE7CisJCX0KKwkJcS0+aW5fdXNlKys7CisJfQorCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnEtPnNlbmRxKSkgeworCQlzZXRfYml0KFRYUV9DVFJMLCAmcXMtPnR4cV9zdG9wcGVkKTsKKwkJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKworCQlpZiAoc2hvdWxkX3Jlc3RhcnRfdHgocSkgJiYKKwkJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChUWFFfQ1RSTCwgJnFzLT50eHFfc3RvcHBlZCkpCisJCQlnb3RvIGFnYWluOworCQlxLT5zdG9wcysrOworCX0KKworCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9TR19LRE9PUkJFTEwsCisJCSAgICAgRl9TRUxFR1JDTlRYIHwgVl9FR1JDTlRYKHEtPmNudHh0X2lkKSk7Cit9CisKKy8qCisgKiBTZW5kIGEgbWFuYWdlbWVudCBtZXNzYWdlIHRocm91Z2ggY29udHJvbCBxdWV1ZSAwCisgKi8KK2ludCB0M19tZ210X3R4KHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBjdHJsX3htaXQoYWRhcCwgJmFkYXAtPnNnZS5xc1swXS50eHFbVFhRX0NUUkxdLCBza2IpOworfQorCisvKioKKyAqCXdyaXRlX29mbGRfd3IgLSB3cml0ZSBhbiBvZmZsb2FkIHdvcmsgcmVxdWVzdAorICoJQGFkYXA6IHRoZSBhZGFwdGVyCisgKglAc2tiOiB0aGUgcGFja2V0IHRvIHNlbmQKKyAqCUBxOiB0aGUgVHggcXVldWUKKyAqCUBwaWR4OiBpbmRleCBvZiB0aGUgZmlyc3QgVHggZGVzY3JpcHRvciB0byB3cml0ZQorICoJQGdlbjogdGhlIGdlbmVyYXRpb24gdmFsdWUgdG8gdXNlCisgKglAbmRlc2M6IG51bWJlciBvZiBkZXNjcmlwdG9ycyB0aGUgcGFja2V0IHdpbGwgb2NjdXB5CisgKgorICoJV3JpdGUgYW4gb2ZmbG9hZCB3b3JrIHJlcXVlc3QgdG8gc2VuZCB0aGUgc3VwcGxpZWQgcGFja2V0LiAgVGhlIHBhY2tldAorICoJZGF0YSBhbHJlYWR5IGNhcnJ5IHRoZSB3b3JrIHJlcXVlc3Qgd2l0aCBtb3N0IGZpZWxkcyBwb3B1bGF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX29mbGRfd3Ioc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIHN0cnVjdCBzZ2VfdHhxICpxLCB1bnNpZ25lZCBpbnQgcGlkeCwKKwkJCSAgdW5zaWduZWQgaW50IGdlbiwgdW5zaWduZWQgaW50IG5kZXNjKQoreworCXVuc2lnbmVkIGludCBzZ2xfZmxpdHMsIGZsaXRzOworCXN0cnVjdCB3b3JrX3JlcXVlc3RfaGRyICpmcm9tOworCXN0cnVjdCBzZ19lbnQgKnNncCwgc2dsW01BWF9TS0JfRlJBR1MgLyAyICsgMV07CisJc3RydWN0IHR4X2Rlc2MgKmQgPSAmcS0+ZGVzY1twaWR4XTsKKworCWlmIChpbW1lZGlhdGUoc2tiKSkgeworCQlxLT5zZGVzY1twaWR4XS5za2IgPSBOVUxMOworCQl3cml0ZV9pbW0oZCwgc2tiLCBza2ItPmxlbiwgZ2VuKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE9ubHkgVFhfREFUQSBidWlsZHMgU0dMcyAqLworCisJZnJvbSA9IChzdHJ1Y3Qgd29ya19yZXF1ZXN0X2hkciAqKXNrYi0+ZGF0YTsKKwltZW1jcHkoJmQtPmZsaXRbMV0sICZmcm9tWzFdLCBza2ItPmgucmF3IC0gc2tiLT5kYXRhIC0gc2l6ZW9mKCpmcm9tKSk7CisKKwlmbGl0cyA9IChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSAvIDg7CisJc2dwID0gbmRlc2MgPT0gMSA/IChzdHJ1Y3Qgc2dfZW50ICopJmQtPmZsaXRbZmxpdHNdIDogc2dsOworCXNnbF9mbGl0cyA9IG1ha2Vfc2dsKHNrYiwgc2dwLCBza2ItPmgucmF3LCBza2ItPnRhaWwgLSBza2ItPmgucmF3LAorCQkJICAgICBhZGFwLT5wZGV2KTsKKwlpZiAobmVlZF9za2JfdW5tYXAoKSkKKwkJKChzdHJ1Y3QgdW5tYXBfaW5mbyAqKXNrYi0+Y2IpLT5sZW4gPSBza2ItPnRhaWwgLSBza2ItPmgucmF3OworCisJd3JpdGVfd3JfaGRyX3NnbChuZGVzYywgc2tiLCBkLCBwaWR4LCBxLCBzZ2wsIGZsaXRzLCBzZ2xfZmxpdHMsCisJCQkgZ2VuLCBmcm9tLT53cl9oaSwgZnJvbS0+d3JfbG8pOworfQorCisvKioKKyAqCWNhbGNfdHhfZGVzY3Nfb2ZsZCAtIGNhbGN1bGF0ZSAjIG9mIFR4IGRlc2NyaXB0b3JzIGZvciBhbiBvZmZsb2FkIHBhY2tldAorICoJQHNrYjogdGhlIHBhY2tldAorICoKKyAqIAlSZXR1cm5zIHRoZSBudW1iZXIgb2YgVHggZGVzY3JpcHRvcnMgbmVlZGVkIGZvciB0aGUgZ2l2ZW4gb2ZmbG9hZAorICogCXBhY2tldC4gIFRoZXNlIHBhY2tldHMgYXJlIGFscmVhZHkgZnVsbHkgY29uc3RydWN0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNhbGNfdHhfZGVzY3Nfb2ZsZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXVuc2lnbmVkIGludCBmbGl0cywgY250ID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKworCWlmIChza2ItPmxlbiA8PSBXUl9MRU4gJiYgY250ID09IDApCisJCXJldHVybiAxOwkvKiBwYWNrZXQgZml0cyBhcyBpbW1lZGlhdGUgZGF0YSAqLworCisJZmxpdHMgPSAoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgLyA4OwkvKiBoZWFkZXJzICovCisJaWYgKHNrYi0+dGFpbCAhPSBza2ItPmgucmF3KQorCQljbnQrKzsKKwlyZXR1cm4gZmxpdHNfdG9fZGVzYyhmbGl0cyArIHNnbF9sZW4oY250KSk7Cit9CisKKy8qKgorICoJb2ZsZF94bWl0IC0gc2VuZCBhIHBhY2tldCB0aHJvdWdoIGFuIG9mZmxvYWQgcXVldWUKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQHE6IHRoZSBUeCBvZmZsb2FkIHF1ZXVlCisgKglAc2tiOiB0aGUgcGFja2V0CisgKgorICoJU2VuZCBhbiBvZmZsb2FkIHBhY2tldCB0aHJvdWdoIGFuIFNHRSBvZmZsb2FkIHF1ZXVlLgorICovCitzdGF0aWMgaW50IG9mbGRfeG1pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV90eHEgKnEsCisJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBuZGVzYyA9IGNhbGNfdHhfZGVzY3Nfb2ZsZChza2IpLCBwaWR4LCBnZW47CisKKwlzcGluX2xvY2soJnEtPmxvY2spOworICAgICAgYWdhaW46cmVjbGFpbV9jb21wbGV0ZWRfdHgoYWRhcCwgcSk7CisKKwlyZXQgPSBjaGVja19kZXNjX2F2YWlsKGFkYXAsIHEsIHNrYiwgbmRlc2MsIFRYUV9PRkxEKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlpZiAocmV0ID09IDEpIHsKKwkJCXNrYi0+cHJpb3JpdHkgPSBuZGVzYzsJLyogc2F2ZSBmb3IgcmVzdGFydCAqLworCQkJc3Bpbl91bmxvY2soJnEtPmxvY2spOworCQkJcmV0dXJuIE5FVF9YTUlUX0NOOworCQl9CisJCWdvdG8gYWdhaW47CisJfQorCisJZ2VuID0gcS0+Z2VuOworCXEtPmluX3VzZSArPSBuZGVzYzsKKwlwaWR4ID0gcS0+cGlkeDsKKwlxLT5waWR4ICs9IG5kZXNjOworCWlmIChxLT5waWR4ID49IHEtPnNpemUpIHsKKwkJcS0+cGlkeCAtPSBxLT5zaXplOworCQlxLT5nZW4gXj0gMTsKKwl9CisJc3Bpbl91bmxvY2soJnEtPmxvY2spOworCisJd3JpdGVfb2ZsZF93cihhZGFwLCBza2IsIHEsIHBpZHgsIGdlbiwgbmRlc2MpOworCWNoZWNrX3JpbmdfdHhfZGIoYWRhcCwgcSk7CisJcmV0dXJuIE5FVF9YTUlUX1NVQ0NFU1M7Cit9CisKKy8qKgorICoJcmVzdGFydF9vZmZsb2FkcSAtIHJlc3RhcnQgYSBzdXNwZW5kZWQgb2ZmbG9hZCBxdWV1ZQorICoJQHFzOiB0aGUgcXVldWUgc2V0IGNvdGFpbmluZyB0aGUgb2ZmbG9hZCBxdWV1ZQorICoKKyAqCVJlc3VtZXMgdHJhbnNtaXNzaW9uIG9uIGEgc3VzcGVuZGVkIFR4IG9mZmxvYWQgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIHJlc3RhcnRfb2ZmbG9hZHEodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNnZV9xc2V0ICpxcyA9IChzdHJ1Y3Qgc2dlX3FzZXQgKilkYXRhOworCXN0cnVjdCBzZ2VfdHhxICpxID0gJnFzLT50eHFbVFhRX09GTERdOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcXMtPm5ldGRldi0+cHJpdjsKKworCXNwaW5fbG9jaygmcS0+bG9jayk7CisgICAgICBhZ2FpbjpyZWNsYWltX2NvbXBsZXRlZF90eChhZGFwLCBxKTsKKworCXdoaWxlICgoc2tiID0gc2tiX3BlZWsoJnEtPnNlbmRxKSkgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBpbnQgZ2VuLCBwaWR4OworCQl1bnNpZ25lZCBpbnQgbmRlc2MgPSBza2ItPnByaW9yaXR5OworCisJCWlmICh1bmxpa2VseShxLT5zaXplIC0gcS0+aW5fdXNlIDwgbmRlc2MpKSB7CisJCQlzZXRfYml0KFRYUV9PRkxELCAmcXMtPnR4cV9zdG9wcGVkKTsKKwkJCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisKKwkJCWlmIChzaG91bGRfcmVzdGFydF90eChxKSAmJgorCQkJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChUWFFfT0ZMRCwgJnFzLT50eHFfc3RvcHBlZCkpCisJCQkJZ290byBhZ2FpbjsKKwkJCXEtPnN0b3BzKys7CisJCQlicmVhazsKKwkJfQorCisJCWdlbiA9IHEtPmdlbjsKKwkJcS0+aW5fdXNlICs9IG5kZXNjOworCQlwaWR4ID0gcS0+cGlkeDsKKwkJcS0+cGlkeCArPSBuZGVzYzsKKwkJaWYgKHEtPnBpZHggPj0gcS0+c2l6ZSkgeworCQkJcS0+cGlkeCAtPSBxLT5zaXplOworCQkJcS0+Z2VuIF49IDE7CisJCX0KKwkJX19za2JfdW5saW5rKHNrYiwgJnEtPnNlbmRxKTsKKwkJc3Bpbl91bmxvY2soJnEtPmxvY2spOworCisJCXdyaXRlX29mbGRfd3IoYWRhcCwgc2tiLCBxLCBwaWR4LCBnZW4sIG5kZXNjKTsKKwkJc3Bpbl9sb2NrKCZxLT5sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJnEtPmxvY2spOworCisjaWYgVVNFX0dUUworCXNldF9iaXQoVFhRX1JVTk5JTkcsICZxLT5mbGFncyk7CisJc2V0X2JpdChUWFFfTEFTVF9QS1RfREIsICZxLT5mbGFncyk7CisjZW5kaWYKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9TR19LRE9PUkJFTEwsCisJCSAgICAgRl9TRUxFR1JDTlRYIHwgVl9FR1JDTlRYKHEtPmNudHh0X2lkKSk7Cit9CisKKy8qKgorICoJcXVldWVfc2V0IC0gcmV0dXJuIHRoZSBxdWV1ZSBzZXQgYSBwYWNrZXQgc2hvdWxkIHVzZQorICoJQHNrYjogdGhlIHBhY2tldAorICoKKyAqCU1hcHMgYSBwYWNrZXQgdG8gdGhlIFNHRSBxdWV1ZSBzZXQgaXQgc2hvdWxkIHVzZS4gIFRoZSBkZXNpcmVkIHF1ZXVlCisgKglzZXQgaXMgY2FycmllZCBpbiBiaXRzIDEtMyBpbiB0aGUgcGFja2V0J3MgcHJpb3JpdHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHF1ZXVlX3NldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPnByaW9yaXR5ID4+IDE7Cit9CisKKy8qKgorICoJaXNfY3RybF9wa3QgLSByZXR1cm4gd2hldGhlciBhbiBvZmZsb2FkIHBhY2tldCBpcyBhIGNvbnRyb2wgcGFja2V0CisgKglAc2tiOiB0aGUgcGFja2V0CisgKgorICoJRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9mZmxvYWQgcGFja2V0IHNob3VsZCB1c2UgYW4gT0ZMRCBvciBhIENUUkwKKyAqCVR4IHF1ZXVlLiAgVGhpcyBpcyBpbmRpY2F0ZWQgYnkgYml0IDAgaW4gdGhlIHBhY2tldCdzIHByaW9yaXR5LgorICovCitzdGF0aWMgaW5saW5lIGludCBpc19jdHJsX3BrdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPnByaW9yaXR5ICYgMTsKK30KKworLyoqCisgKgl0M19vZmZsb2FkX3R4IC0gc2VuZCBhbiBvZmZsb2FkIHBhY2tldAorICoJQHRkZXY6IHRoZSBvZmZsb2FkIGRldmljZSB0byBzZW5kIHRvCisgKglAc2tiOiB0aGUgcGFja2V0CisgKgorICoJU2VuZHMgYW4gb2ZmbG9hZCBwYWNrZXQuICBXZSB1c2UgdGhlIHBhY2tldCBwcmlvcml0eSB0byBzZWxlY3QgdGhlCisgKglhcHByb3ByaWF0ZSBUeCBxdWV1ZSBhcyBmb2xsb3dzOiBiaXQgMCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcGFja2V0CisgKglzaG91bGQgYmUgc2VudCBhcyByZWd1bGFyIG9yIGNvbnRyb2wsIGJpdHMgMS0zIHNlbGVjdCB0aGUgcXVldWUgc2V0LgorICovCitpbnQgdDNfb2ZmbG9hZF90eChzdHJ1Y3QgdDNjZGV2ICp0ZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gdGRldjJhZGFwKHRkZXYpOworCXN0cnVjdCBzZ2VfcXNldCAqcXMgPSAmYWRhcC0+c2dlLnFzW3F1ZXVlX3NldChza2IpXTsKKworCWlmICh1bmxpa2VseShpc19jdHJsX3BrdChza2IpKSkKKwkJcmV0dXJuIGN0cmxfeG1pdChhZGFwLCAmcXMtPnR4cVtUWFFfQ1RSTF0sIHNrYik7CisKKwlyZXR1cm4gb2ZsZF94bWl0KGFkYXAsICZxcy0+dHhxW1RYUV9PRkxEXSwgc2tiKTsKK30KKworLyoqCisgKglvZmZsb2FkX2VucXVldWUgLSBhZGQgYW4gb2ZmbG9hZCBwYWNrZXQgdG8gYW4gU0dFIG9mZmxvYWQgcmVjZWl2ZSBxdWV1ZQorICoJQHE6IHRoZSBTR0UgcmVzcG9uc2UgcXVldWUKKyAqCUBza2I6IHRoZSBwYWNrZXQKKyAqCisgKglBZGQgYSBuZXcgb2ZmbG9hZCBwYWNrZXQgdG8gYW4gU0dFIHJlc3BvbnNlIHF1ZXVlJ3Mgb2ZmbG9hZCBwYWNrZXQKKyAqCXF1ZXVlLiAgSWYgdGhlIHBhY2tldCBpcyB0aGUgZmlyc3Qgb24gdGhlIHF1ZXVlIGl0IHNjaGVkdWxlcyB0aGUgUlgKKyAqCXNvZnRpcnEgdG8gcHJvY2VzcyB0aGUgcXVldWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBvZmZsb2FkX2VucXVldWUoc3RydWN0IHNnZV9yc3BxICpxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYi0+bmV4dCA9IHNrYi0+cHJldiA9IE5VTEw7CisJaWYgKHEtPnJ4X3RhaWwpCisJCXEtPnJ4X3RhaWwtPm5leHQgPSBza2I7CisJZWxzZSB7CisJCXN0cnVjdCBzZ2VfcXNldCAqcXMgPSByc3BxX3RvX3FzZXQocSk7CisKKwkJaWYgKF9fbmV0aWZfcnhfc2NoZWR1bGVfcHJlcChxcy0+bmV0ZGV2KSkKKwkJCV9fbmV0aWZfcnhfc2NoZWR1bGUocXMtPm5ldGRldik7CisJCXEtPnJ4X2hlYWQgPSBza2I7CisJfQorCXEtPnJ4X3RhaWwgPSBza2I7Cit9CisKKy8qKgorICoJZGVsaXZlcl9wYXJ0aWFsX2J1bmRsZSAtIGRlbGl2ZXIgYSAocGFydGlhbCkgYnVuZGxlIG9mIFJ4IG9mZmxvYWQgcGt0cworICoJQHRkZXY6IHRoZSBvZmZsb2FkIGRldmljZSB0aGF0IHdpbGwgYmUgcmVjZWl2aW5nIHRoZSBwYWNrZXRzCisgKglAcTogdGhlIFNHRSByZXNwb25zZSBxdWV1ZSB0aGF0IGFzc2VtYmxlZCB0aGUgYnVuZGxlCisgKglAc2ticzogdGhlIHBhcnRpYWwgYnVuZGxlCisgKglAbjogdGhlIG51bWJlciBvZiBwYWNrZXRzIGluIHRoZSBidW5kbGUKKyAqCisgKglEZWxpdmVycyBhIChwYXJ0aWFsKSBidW5kbGUgb2YgUnggb2ZmbG9hZCBwYWNrZXRzIHRvIGFuIG9mZmxvYWQgZGV2aWNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsaXZlcl9wYXJ0aWFsX2J1bmRsZShzdHJ1Y3QgdDNjZGV2ICp0ZGV2LAorCQkJCQkgIHN0cnVjdCBzZ2VfcnNwcSAqcSwKKwkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tic1tdLCBpbnQgbikKK3sKKwlpZiAobikgeworCQlxLT5vZmZsb2FkX2J1bmRsZXMrKzsKKwkJdGRldi0+cmVjdih0ZGV2LCBza2JzLCBuKTsKKwl9Cit9CisKKy8qKgorICoJb2ZsZF9wb2xsIC0gTkFQSSBoYW5kbGVyIGZvciBvZmZsb2FkIHBhY2tldHMgaW4gaW50ZXJydXB0IG1vZGUKKyAqCUBkZXY6IHRoZSBuZXR3b3JrIGRldmljZSBkb2luZyB0aGUgcG9sbGluZworICoJQGJ1ZGdldDogcG9sbGluZyBidWRnZXQKKyAqCisgKglUaGUgTkFQSSBoYW5kbGVyIGZvciBvZmZsb2FkIHBhY2tldHMgd2hlbiBhIHJlc3BvbnNlIHF1ZXVlIGlzIHNlcnZpY2VkCisgKglieSB0aGUgaGFyZCBpbnRlcnJ1cHQgaGFuZGxlciwgaS5lLiwgd2hlbiBpdCdzIG9wZXJhdGluZyBpbiBub24tcG9sbGluZworICoJbW9kZS4gIENyZWF0ZXMgc21hbGwgcGFja2V0IGJhdGNoZXMgYW5kIHNlbmRzIHRoZW0gdGhyb3VnaCB0aGUgb2ZmbG9hZAorICoJcmVjZWl2ZSBoYW5kbGVyLiAgQmF0Y2hlcyBuZWVkIHRvIGJlIG9mIG1vZGVzdCBzaXplIGFzIHdlIGRvIHByZWZldGNoZXMKKyAqCW9uIHRoZSBwYWNrZXRzIGluIGVhY2guCisgKi8KK3N0YXRpYyBpbnQgb2ZsZF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5wcml2OworCXN0cnVjdCBzZ2VfcXNldCAqcXMgPSBkZXYycXNldChkZXYpOworCXN0cnVjdCBzZ2VfcnNwcSAqcSA9ICZxcy0+cnNwcTsKKwlpbnQgd29ya19kb25lLCBsaW1pdCA9IG1pbigqYnVkZ2V0LCBkZXYtPnF1b3RhKSwgYXZhaWwgPSBsaW1pdDsKKworCXdoaWxlIChhdmFpbCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqaGVhZCwgKnRhaWwsICpza2JzW1JYX0JVTkRMRV9TSVpFXTsKKwkJaW50IG5nYXRoZXJlZDsKKworCQlzcGluX2xvY2tfaXJxKCZxLT5sb2NrKTsKKwkJaGVhZCA9IHEtPnJ4X2hlYWQ7CisJCWlmICghaGVhZCkgeworCQkJd29ya19kb25lID0gbGltaXQgLSBhdmFpbDsKKwkJCSpidWRnZXQgLT0gd29ya19kb25lOworCQkJZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7CisJCQlfX25ldGlmX3J4X2NvbXBsZXRlKGRldik7CisJCQlzcGluX3VubG9ja19pcnEoJnEtPmxvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKworCQl0YWlsID0gcS0+cnhfdGFpbDsKKwkJcS0+cnhfaGVhZCA9IHEtPnJ4X3RhaWwgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnEoJnEtPmxvY2spOworCisJCWZvciAobmdhdGhlcmVkID0gMDsgYXZhaWwgJiYgaGVhZDsgYXZhaWwtLSkgeworCQkJcHJlZmV0Y2goaGVhZC0+ZGF0YSk7CisJCQlza2JzW25nYXRoZXJlZF0gPSBoZWFkOworCQkJaGVhZCA9IGhlYWQtPm5leHQ7CisJCQlza2JzW25nYXRoZXJlZF0tPm5leHQgPSBOVUxMOworCQkJaWYgKCsrbmdhdGhlcmVkID09IFJYX0JVTkRMRV9TSVpFKSB7CisJCQkJcS0+b2ZmbG9hZF9idW5kbGVzKys7CisJCQkJYWRhcHRlci0+dGRldi5yZWN2KCZhZGFwdGVyLT50ZGV2LCBza2JzLAorCQkJCQkJICAgbmdhdGhlcmVkKTsKKwkJCQluZ2F0aGVyZWQgPSAwOworCQkJfQorCQl9CisJCWlmIChoZWFkKSB7CS8qIHNwbGljZSByZW1haW5pbmcgcGFja2V0cyBiYWNrIG9udG8gUnggcXVldWUgKi8KKwkJCXNwaW5fbG9ja19pcnEoJnEtPmxvY2spOworCQkJdGFpbC0+bmV4dCA9IHEtPnJ4X2hlYWQ7CisJCQlpZiAoIXEtPnJ4X2hlYWQpCisJCQkJcS0+cnhfdGFpbCA9IHRhaWw7CisJCQlxLT5yeF9oZWFkID0gaGVhZDsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcS0+bG9jayk7CisJCX0KKwkJZGVsaXZlcl9wYXJ0aWFsX2J1bmRsZSgmYWRhcHRlci0+dGRldiwgcSwgc2ticywgbmdhdGhlcmVkKTsKKwl9CisJd29ya19kb25lID0gbGltaXQgLSBhdmFpbDsKKwkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKKwlkZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglyeF9vZmZsb2FkIC0gcHJvY2VzcyBhIHJlY2VpdmVkIG9mZmxvYWQgcGFja2V0CisgKglAdGRldjogdGhlIG9mZmxvYWQgZGV2aWNlIHJlY2VpdmluZyB0aGUgcGFja2V0CisgKglAcnE6IHRoZSByZXNwb25zZSBxdWV1ZSB0aGF0IHJlY2VpdmVkIHRoZSBwYWNrZXQKKyAqCUBza2I6IHRoZSBwYWNrZXQKKyAqCUByeF9nYXRoZXI6IGEgZ2F0aGVyIGxpc3Qgb2YgcGFja2V0cyBpZiB3ZSBhcmUgYnVpbGRpbmcgYSBidW5kbGUKKyAqCUBnYXRoZXJfaWR4OiBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgc2xvdCBpbiB0aGUgYnVuZGxlCisgKgorICoJUHJvY2VzcyBhbiBpbmdyZXNzIG9mZmxvYWQgcGFrY2V0IGFuZCBhZGQgaXQgdG8gdGhlIG9mZmxvYWQgaW5ncmVzcworICoJcXVldWUuIAlSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBhdmFpbGFibGUgc2xvdCBpbiB0aGUgYnVuZGxlLgorICovCitzdGF0aWMgaW5saW5lIGludCByeF9vZmZsb2FkKHN0cnVjdCB0M2NkZXYgKnRkZXYsIHN0cnVjdCBzZ2VfcnNwcSAqcnEsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICpyeF9nYXRoZXJbXSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGdhdGhlcl9pZHgpCit7CisJcnEtPm9mZmxvYWRfcGt0cysrOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+bmgucmF3ID0gc2tiLT5oLnJhdyA9IHNrYi0+ZGF0YTsKKworCWlmIChycS0+cG9sbGluZykgeworCQlyeF9nYXRoZXJbZ2F0aGVyX2lkeCsrXSA9IHNrYjsKKwkJaWYgKGdhdGhlcl9pZHggPT0gUlhfQlVORExFX1NJWkUpIHsKKwkJCXRkZXYtPnJlY3YodGRldiwgcnhfZ2F0aGVyLCBSWF9CVU5ETEVfU0laRSk7CisJCQlnYXRoZXJfaWR4ID0gMDsKKwkJCXJxLT5vZmZsb2FkX2J1bmRsZXMrKzsKKwkJfQorCX0gZWxzZQorCQlvZmZsb2FkX2VucXVldWUocnEsIHNrYik7CisKKwlyZXR1cm4gZ2F0aGVyX2lkeDsKK30KKworLyoqCisgKglyZXN0YXJ0X3R4IC0gY2hlY2sgd2hldGhlciB0byByZXN0YXJ0IHN1c3BlbmRlZCBUeCBxdWV1ZXMKKyAqCUBxczogdGhlIHF1ZXVlIHNldCB0byByZXN1bWUKKyAqCisgKglSZXN0YXJ0cyBzdXNwZW5kZWQgVHggcXVldWVzIG9mIGFuIFNHRSBxdWV1ZSBzZXQgaWYgdGhleSBoYXZlIGVub3VnaAorICoJZnJlZSByZXNvdXJjZXMgdG8gcmVzdW1lIG9wZXJhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcmVzdGFydF90eChzdHJ1Y3Qgc2dlX3FzZXQgKnFzKQoreworCWlmICh0ZXN0X2JpdChUWFFfRVRILCAmcXMtPnR4cV9zdG9wcGVkKSAmJgorCSAgICBzaG91bGRfcmVzdGFydF90eCgmcXMtPnR4cVtUWFFfRVRIXSkgJiYKKwkgICAgdGVzdF9hbmRfY2xlYXJfYml0KFRYUV9FVEgsICZxcy0+dHhxX3N0b3BwZWQpKSB7CisJCXFzLT50eHFbVFhRX0VUSF0ucmVzdGFydHMrKzsKKwkJaWYgKG5ldGlmX3J1bm5pbmcocXMtPm5ldGRldikpCisJCQluZXRpZl93YWtlX3F1ZXVlKHFzLT5uZXRkZXYpOworCX0KKworCWlmICh0ZXN0X2JpdChUWFFfT0ZMRCwgJnFzLT50eHFfc3RvcHBlZCkgJiYKKwkgICAgc2hvdWxkX3Jlc3RhcnRfdHgoJnFzLT50eHFbVFhRX09GTERdKSAmJgorCSAgICB0ZXN0X2FuZF9jbGVhcl9iaXQoVFhRX09GTEQsICZxcy0+dHhxX3N0b3BwZWQpKSB7CisJCXFzLT50eHFbVFhRX09GTERdLnJlc3RhcnRzKys7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnFzLT50eHFbVFhRX09GTERdLnFyZXN1bWVfdHNrKTsKKwl9CisJaWYgKHRlc3RfYml0KFRYUV9DVFJMLCAmcXMtPnR4cV9zdG9wcGVkKSAmJgorCSAgICBzaG91bGRfcmVzdGFydF90eCgmcXMtPnR4cVtUWFFfQ1RSTF0pICYmCisJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChUWFFfQ1RSTCwgJnFzLT50eHFfc3RvcHBlZCkpIHsKKwkJcXMtPnR4cVtUWFFfQ1RSTF0ucmVzdGFydHMrKzsKKwkJdGFza2xldF9zY2hlZHVsZSgmcXMtPnR4cVtUWFFfQ1RSTF0ucXJlc3VtZV90c2spOworCX0KK30KKworLyoqCisgKglyeF9ldGggLSBwcm9jZXNzIGFuIGluZ3Jlc3MgZXRoZXJuZXQgcGFja2V0CisgKglAYWRhcDogdGhlIGFkYXB0ZXIKKyAqCUBycTogdGhlIHJlc3BvbnNlIHF1ZXVlIHRoYXQgcmVjZWl2ZWQgdGhlIHBhY2tldAorICoJQHNrYjogdGhlIHBhY2tldAorICoJQHBhZDogYW1vdW50IG9mIHBhZGRpbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIKKyAqCisgKglQcm9jZXNzIGFuIGluZ3Jlc3MgZXRoZXJuZXQgcGFrY2V0IGFuZCBkZWxpdmVyIGl0IHRvIHRoZSBzdGFjay4KKyAqCVRoZSBwYWRkaW5nIGlzIDIgaWYgdGhlIHBhY2tldCB3YXMgZGVsaXZlcmVkIGluIGFuIFJ4IGJ1ZmZlciBhbmQgMAorICoJaWYgaXQgd2FzIGltbWVkaWF0ZSBkYXRhIGluIGEgcmVzcG9uc2UuCisgKi8KK3N0YXRpYyB2b2lkIHJ4X2V0aChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9yc3BxICpycSwKKwkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBhZCkKK3sKKwlzdHJ1Y3QgY3BsX3J4X3BrdCAqcCA9IChzdHJ1Y3QgY3BsX3J4X3BrdCAqKShza2ItPmRhdGEgKyBwYWQpOworCXN0cnVjdCBwb3J0X2luZm8gKnBpOworCisJcnEtPmV0aF9wa3RzKys7CisJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnApICsgcGFkKTsKKwlza2ItPmRldiA9IGFkYXAtPnBvcnRbcC0+aWZmXTsKKwlza2ItPmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworCXBpID0gbmV0ZGV2X3ByaXYoc2tiLT5kZXYpOworCWlmIChwaS0+cnhfY3N1bV9vZmZsb2FkICYmIHAtPmNzdW1fdmFsaWQgJiYgcC0+Y3N1bSA9PSAweGZmZmYgJiYKKwkgICAgIXAtPmZyYWdtZW50KSB7CisJCXJzcHFfdG9fcXNldChycSktPnBvcnRfc3RhdHNbU0dFX1BTVEFUX1JYX0NTVU1fR09PRF0rKzsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwl9IGVsc2UKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJaWYgKHVubGlrZWx5KHAtPnZsYW5fdmFsaWQpKSB7CisJCXN0cnVjdCB2bGFuX2dyb3VwICpncnAgPSBwaS0+dmxhbl9ncnA7CisKKwkJcnNwcV90b19xc2V0KHJxKS0+cG9ydF9zdGF0c1tTR0VfUFNUQVRfVkxBTkVYXSsrOworCQlpZiAobGlrZWx5KGdycCkpCisJCQlfX3ZsYW5faHdhY2NlbF9yeChza2IsIGdycCwgbnRvaHMocC0+dmxhbiksCisJCQkJCSAgcnEtPnBvbGxpbmcpOworCQllbHNlCisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCX0gZWxzZSBpZiAocnEtPnBvbGxpbmcpCisJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJZWxzZQorCQluZXRpZl9yeChza2IpOworfQorCisvKioKKyAqCWhhbmRsZV9yc3BfY250cmxfaW5mbyAtIGhhbmRsZXMgY29udHJvbCBpbmZvcm1hdGlvbiBpbiBhIHJlc3BvbnNlCisgKglAcXM6IHRoZSBxdWV1ZSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzcG9uc2UKKyAqCUBmbGFnczogdGhlIHJlc3BvbnNlIGNvbnRyb2wgZmxhZ3MKKyAqCisgKglIYW5kbGVzIHRoZSBjb250cm9sIGluZm9ybWF0aW9uIG9mIGFuIFNHRSByZXNwb25zZSwgc3VjaCBhcyBHVFMKKyAqCWluZGljYXRpb25zIGFuZCBjb21wbGV0aW9uIGNyZWRpdHMgZm9yIHRoZSBxdWV1ZSBzZXQncyBUeCBxdWV1ZXMuCisgKglIVyBjb2FsZXNjZXMgY3JlZGl0cywgd2UgZG9uJ3QgZG8gYW55IGV4dHJhIFNXIGNvYWxlc2NpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfcnNwX2NudHJsX2luZm8oc3RydWN0IHNnZV9xc2V0ICpxcywgdTMyIGZsYWdzKQoreworCXVuc2lnbmVkIGludCBjcmVkaXRzOworCisjaWYgVVNFX0dUUworCWlmIChmbGFncyAmIEZfUlNQRF9UWFEwX0dUUykKKwkJY2xlYXJfYml0KFRYUV9SVU5OSU5HLCAmcXMtPnR4cVtUWFFfRVRIXS5mbGFncyk7CisjZW5kaWYKKworCWNyZWRpdHMgPSBHX1JTUERfVFhRMF9DUihmbGFncyk7CisJaWYgKGNyZWRpdHMpCisJCXFzLT50eHFbVFhRX0VUSF0ucHJvY2Vzc2VkICs9IGNyZWRpdHM7CisKKwljcmVkaXRzID0gR19SU1BEX1RYUTJfQ1IoZmxhZ3MpOworCWlmIChjcmVkaXRzKQorCQlxcy0+dHhxW1RYUV9DVFJMXS5wcm9jZXNzZWQgKz0gY3JlZGl0czsKKworIyBpZiBVU0VfR1RTCisJaWYgKGZsYWdzICYgRl9SU1BEX1RYUTFfR1RTKQorCQljbGVhcl9iaXQoVFhRX1JVTk5JTkcsICZxcy0+dHhxW1RYUV9PRkxEXS5mbGFncyk7CisjIGVuZGlmCisJY3JlZGl0cyA9IEdfUlNQRF9UWFExX0NSKGZsYWdzKTsKKwlpZiAoY3JlZGl0cykKKwkJcXMtPnR4cVtUWFFfT0ZMRF0ucHJvY2Vzc2VkICs9IGNyZWRpdHM7Cit9CisKKy8qKgorICoJY2hlY2tfcmluZ19kYiAtIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmluZyBhbnkgZG9vcmJlbGxzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBxczogdGhlIHF1ZXVlIHNldCB3aG9zZSBUeCBxdWV1ZXMgYXJlIHRvIGJlIGV4YW1pbmVkCisgKglAc2xlZXBpbmc6IGluZGljYXRlcyB3aGljaCBUeCBxdWV1ZSBzZW50IEdUUworICoKKyAqCUNoZWNrcyBpZiBzb21lIG9mIGEgcXVldWUgc2V0J3MgVHggcXVldWVzIG5lZWQgdG8gcmluZyB0aGVpciBkb29yYmVsbHMKKyAqCXRvIHJlc3VtZSB0cmFuc21pc3Npb24gYWZ0ZXIgaWRsaW5nIHdoaWxlIHRoZXkgc3RpbGwgaGF2ZSB1bnByb2Nlc3NlZAorICoJZGVzY3JpcHRvcnMuCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3JpbmdfZGIoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfcXNldCAqcXMsCisJCQkgIHVuc2lnbmVkIGludCBzbGVlcGluZykKK3sKKwlpZiAoc2xlZXBpbmcgJiBGX1JTUERfVFhRMF9HVFMpIHsKKwkJc3RydWN0IHNnZV90eHEgKnR4cSA9ICZxcy0+dHhxW1RYUV9FVEhdOworCisJCWlmICh0eHEtPmNsZWFuZWQgKyB0eHEtPmluX3VzZSAhPSB0eHEtPnByb2Nlc3NlZCAmJgorCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoVFhRX0xBU1RfUEtUX0RCLCAmdHhxLT5mbGFncykpIHsKKwkJCXNldF9iaXQoVFhRX1JVTk5JTkcsICZ0eHEtPmZsYWdzKTsKKwkJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1NHX0tET09SQkVMTCwgRl9TRUxFR1JDTlRYIHwKKwkJCQkgICAgIFZfRUdSQ05UWCh0eHEtPmNudHh0X2lkKSk7CisJCX0KKwl9CisKKwlpZiAoc2xlZXBpbmcgJiBGX1JTUERfVFhRMV9HVFMpIHsKKwkJc3RydWN0IHNnZV90eHEgKnR4cSA9ICZxcy0+dHhxW1RYUV9PRkxEXTsKKworCQlpZiAodHhxLT5jbGVhbmVkICsgdHhxLT5pbl91c2UgIT0gdHhxLT5wcm9jZXNzZWQgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfYml0KFRYUV9MQVNUX1BLVF9EQiwgJnR4cS0+ZmxhZ3MpKSB7CisJCQlzZXRfYml0KFRYUV9SVU5OSU5HLCAmdHhxLT5mbGFncyk7CisJCQl0M193cml0ZV9yZWcoYWRhcCwgQV9TR19LRE9PUkJFTEwsIEZfU0VMRUdSQ05UWCB8CisJCQkJICAgICBWX0VHUkNOVFgodHhxLT5jbnR4dF9pZCkpOworCQl9CisJfQorfQorCisvKioKKyAqCWlzX25ld19yZXNwb25zZSAtIGNoZWNrIGlmIGEgcmVzcG9uc2UgaXMgbmV3bHkgd3JpdHRlbgorICoJQHI6IHRoZSByZXNwb25zZSBkZXNjcmlwdG9yCisgKglAcTogdGhlIHJlc3BvbnNlIHF1ZXVlCisgKgorICoJUmV0dXJucyB0cnVlIGlmIGEgcmVzcG9uc2UgZGVzY3JpcHRvciBjb250YWlucyBhIHlldCB1bnByb2Nlc3NlZAorICoJcmVzcG9uc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX25ld19yZXNwb25zZShjb25zdCBzdHJ1Y3QgcnNwX2Rlc2MgKnIsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc2dlX3JzcHEgKnEpCit7CisJcmV0dXJuIChyLT5pbnRyX2dlbiAmIEZfUlNQRF9HRU4yKSA9PSBxLT5nZW47Cit9CisKKyNkZWZpbmUgUlNQRF9HVFNfTUFTSyAgKEZfUlNQRF9UWFEwX0dUUyB8IEZfUlNQRF9UWFExX0dUUykKKyNkZWZpbmUgUlNQRF9DVFJMX01BU0sgKFJTUERfR1RTX01BU0sgfCBcCisJCQlWX1JTUERfVFhRMF9DUihNX1JTUERfVFhRMF9DUikgfCBcCisJCQlWX1JTUERfVFhRMV9DUihNX1JTUERfVFhRMV9DUikgfCBcCisJCQlWX1JTUERfVFhRMl9DUihNX1JTUERfVFhRMl9DUikpCisKKy8qIEhvdyBsb25nIHRvIGRlbGF5IHRoZSBuZXh0IGludGVycnVwdCBpbiBjYXNlIG9mIG1lbW9yeSBzaG9ydGFnZSwgaW4gMC4xdXMuICovCisjZGVmaW5lIE5PTUVNX0lOVFJfREVMQVkgMjUwMAorCisvKioKKyAqCXByb2Nlc3NfcmVzcG9uc2VzIC0gcHJvY2VzcyByZXNwb25zZXMgZnJvbSBhbiBTR0UgcmVzcG9uc2UgcXVldWUKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQHFzOiB0aGUgcXVldWUgc2V0IHRvIHdoaWNoIHRoZSByZXNwb25zZSBxdWV1ZSBiZWxvbmdzCisgKglAYnVkZ2V0OiBob3cgbWFueSByZXNwb25zZXMgY2FuIGJlIHByb2Nlc3NlZCBpbiB0aGlzIHJvdW5kCisgKgorICoJUHJvY2VzcyByZXNwb25zZXMgZnJvbSBhbiBTR0UgcmVzcG9uc2UgcXVldWUgdXAgdG8gdGhlIHN1cHBsaWVkIGJ1ZGdldC4KKyAqCVJlc3BvbnNlcyBpbmNsdWRlIHJlY2VpdmVkIHBhY2tldHMgYXMgd2VsbCBhcyBjcmVkaXRzIGFuZCBvdGhlciBldmVudHMKKyAqCWZvciB0aGUgcXVldWVzIHRoYXQgYmVsb25nIHRvIHRoZSByZXNwb25zZSBxdWV1ZSdzIHF1ZXVlIHNldC4KKyAqCUEgbmVnYXRpdmUgYnVkZ2V0IGlzIGVmZmVjdGl2ZWx5IHVubGltaXRlZC4KKyAqCisgKglBZGRpdGlvbmFsbHkgY2hvb3NlIHRoZSBpbnRlcnJ1cHQgaG9sZG9mZiB0aW1lIGZvciB0aGUgbmV4dCBpbnRlcnJ1cHQKKyAqCW9uIHRoaXMgcXVldWUuICBJZiB0aGUgc3lzdGVtIGlzIHVuZGVyIG1lbW9yeSBzaG9ydGFnZSB1c2UgYSBmYWlybHkKKyAqCWxvbmcgZGVsYXkgdG8gaGVscCByZWNvdmVyeS4KKyAqLworc3RhdGljIGludCBwcm9jZXNzX3Jlc3BvbnNlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9xc2V0ICpxcywKKwkJCSAgICAgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3Qgc2dlX3JzcHEgKnEgPSAmcXMtPnJzcHE7CisJc3RydWN0IHJzcF9kZXNjICpyID0gJnEtPmRlc2NbcS0+Y2lkeF07CisJaW50IGJ1ZGdldF9sZWZ0ID0gYnVkZ2V0OworCXVuc2lnbmVkIGludCBzbGVlcGluZyA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKm9mZmxvYWRfc2tic1tSWF9CVU5ETEVfU0laRV07CisJaW50IG5nYXRoZXJlZCA9IDA7CisKKwlxLT5uZXh0X2hvbGRvZmYgPSBxLT5ob2xkb2ZmX3RtcjsKKworCXdoaWxlIChsaWtlbHkoYnVkZ2V0X2xlZnQgJiYgaXNfbmV3X3Jlc3BvbnNlKHIsIHEpKSkgeworCQlpbnQgZXRoLCBldGhwYWQgPSAwOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwkJdTMyIGxlbiwgZmxhZ3MgPSBudG9obChyLT5mbGFncyk7CisJCXUzMiByc3NfaGkgPSAqKGNvbnN0IHUzMiAqKXIsIHJzc19sbyA9IHItPnJzc19oZHIucnNzX2hhc2hfdmFsOworCisJCWV0aCA9IHItPnJzc19oZHIub3Bjb2RlID09IENQTF9SWF9QS1Q7CisKKwkJaWYgKHVubGlrZWx5KGZsYWdzICYgRl9SU1BEX0FTWU5DX05PVElGKSkgeworCQkJc2tiID0gYWxsb2Nfc2tiKEFOX1BLVF9TSVpFLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghc2tiKQorCQkJCWdvdG8gbm9fbWVtOworCisJCQltZW1jcHkoX19za2JfcHV0KHNrYiwgQU5fUEtUX1NJWkUpLCByLCBBTl9QS1RfU0laRSk7CisJCQlza2ItPmRhdGFbMF0gPSBDUExfQVNZTkNfTk9USUY7CisJCQlyc3NfaGkgPSBodG9ubChDUExfQVNZTkNfTk9USUYgPDwgMjQpOworCQkJcS0+YXN5bmNfbm90aWYrKzsKKwkJfSBlbHNlIGlmIChmbGFncyAmIEZfUlNQRF9JTU1fREFUQV9WQUxJRCkgeworCQkJc2tiID0gZ2V0X2ltbV9wYWNrZXQocik7CisJCQlpZiAodW5saWtlbHkoIXNrYikpIHsKKwkJCSAgICAgIG5vX21lbToKKwkJCQlxLT5uZXh0X2hvbGRvZmYgPSBOT01FTV9JTlRSX0RFTEFZOworCQkJCXEtPm5vbWVtKys7CisJCQkJLyogY29uc3VtZSBvbmUgY3JlZGl0IHNpbmNlIHdlIHRyaWVkICovCisJCQkJYnVkZ2V0X2xlZnQtLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXEtPmltbV9kYXRhKys7CisJCX0gZWxzZSBpZiAoKGxlbiA9IG50b2hsKHItPmxlbl9jcSkpICE9IDApIHsKKwkJCXN0cnVjdCBzZ2VfZmwgKmZsOworCisJCQlmbCA9IChsZW4gJiBGX1JTUERfRkxRKSA/ICZxcy0+ZmxbMV0gOiAmcXMtPmZsWzBdOworCQkJZmwtPmNyZWRpdHMtLTsKKwkJCXNrYiA9IGdldF9wYWNrZXQoYWRhcCwgZmwsIEdfUlNQRF9MRU4obGVuKSwKKwkJCQkJIGV0aCA/IFNHRV9SWF9EUk9QX1RIUkVTIDogMCk7CisJCQlpZiAoIXNrYikKKwkJCQlxLT5yeF9kcm9wcysrOworCQkJZWxzZSBpZiAoci0+cnNzX2hkci5vcGNvZGUgPT0gQ1BMX1RSQUNFX1BLVCkKKwkJCQlfX3NrYl9wdWxsKHNrYiwgMik7CisJCQlldGhwYWQgPSAyOworCQkJaWYgKCsrZmwtPmNpZHggPT0gZmwtPnNpemUpCisJCQkJZmwtPmNpZHggPSAwOworCQl9IGVsc2UKKwkJCXEtPnB1cmVfcnNwcysrOworCisJCWlmIChmbGFncyAmIFJTUERfQ1RSTF9NQVNLKSB7CisJCQlzbGVlcGluZyB8PSBmbGFncyAmIFJTUERfR1RTX01BU0s7CisJCQloYW5kbGVfcnNwX2NudHJsX2luZm8ocXMsIGZsYWdzKTsKKwkJfQorCisJCXIrKzsKKwkJaWYgKHVubGlrZWx5KCsrcS0+Y2lkeCA9PSBxLT5zaXplKSkgeworCQkJcS0+Y2lkeCA9IDA7CisJCQlxLT5nZW4gXj0gMTsKKwkJCXIgPSBxLT5kZXNjOworCQl9CisJCXByZWZldGNoKHIpOworCisJCWlmICgrK3EtPmNyZWRpdHMgPj0gKHEtPnNpemUgLyA0KSkgeworCQkJcmVmaWxsX3JzcHEoYWRhcCwgcSwgcS0+Y3JlZGl0cyk7CisJCQlxLT5jcmVkaXRzID0gMDsKKwkJfQorCisJCWlmIChsaWtlbHkoc2tiICE9IE5VTEwpKSB7CisJCQlpZiAoZXRoKQorCQkJCXJ4X2V0aChhZGFwLCBxLCBza2IsIGV0aHBhZCk7CisJCQllbHNlIHsKKwkJCQkvKiBQcmVzZXJ2ZSB0aGUgUlNTIGluZm8gaW4gY3N1bSAmIHByaW9yaXR5ICovCisJCQkJc2tiLT5jc3VtID0gcnNzX2hpOworCQkJCXNrYi0+cHJpb3JpdHkgPSByc3NfbG87CisJCQkJbmdhdGhlcmVkID0gcnhfb2ZmbG9hZCgmYWRhcC0+dGRldiwgcSwgc2tiLAorCQkJCQkJICAgICAgIG9mZmxvYWRfc2ticywgbmdhdGhlcmVkKTsKKwkJCX0KKwkJfQorCisJCS0tYnVkZ2V0X2xlZnQ7CisJfQorCisJZGVsaXZlcl9wYXJ0aWFsX2J1bmRsZSgmYWRhcC0+dGRldiwgcSwgb2ZmbG9hZF9za2JzLCBuZ2F0aGVyZWQpOworCWlmIChzbGVlcGluZykKKwkJY2hlY2tfcmluZ19kYihhZGFwLCBxcywgc2xlZXBpbmcpOworCisJc21wX21iKCk7CQkvKiBjb21taXQgVHggcXVldWUgLnByb2Nlc3NlZCB1cGRhdGVzICovCisJaWYgKHVubGlrZWx5KHFzLT50eHFfc3RvcHBlZCAhPSAwKSkKKwkJcmVzdGFydF90eChxcyk7CisKKwlidWRnZXQgLT0gYnVkZ2V0X2xlZnQ7CisJcmV0dXJuIGJ1ZGdldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfcHVyZV9yZXNwb25zZShjb25zdCBzdHJ1Y3QgcnNwX2Rlc2MgKnIpCit7CisJdTMyIG4gPSBudG9obChyLT5mbGFncykgJiAoRl9SU1BEX0FTWU5DX05PVElGIHwgRl9SU1BEX0lNTV9EQVRBX1ZBTElEKTsKKworCXJldHVybiAobiB8IHItPmxlbl9jcSkgPT0gMDsKK30KKworLyoqCisgKgluYXBpX3J4X2hhbmRsZXIgLSB0aGUgTkFQSSBoYW5kbGVyIGZvciBSeCBwcm9jZXNzaW5nCisgKglAZGV2OiB0aGUgbmV0IGRldmljZQorICoJQGJ1ZGdldDogaG93IG1hbnkgcGFja2V0cyB3ZSBjYW4gcHJvY2VzcyBpbiB0aGlzIHJvdW5kCisgKgorICoJSGFuZGxlciBmb3IgbmV3IGRhdGEgZXZlbnRzIHdoZW4gdXNpbmcgTkFQSS4KKyAqLworc3RhdGljIGludCBuYXBpX3J4X2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50ICpidWRnZXQpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBkZXYtPnByaXY7CisJc3RydWN0IHNnZV9xc2V0ICpxcyA9IGRldjJxc2V0KGRldik7CisJaW50IGVmZmVjdGl2ZV9idWRnZXQgPSBtaW4oKmJ1ZGdldCwgZGV2LT5xdW90YSk7CisKKwlpbnQgd29ya19kb25lID0gcHJvY2Vzc19yZXNwb25zZXMoYWRhcCwgcXMsIGVmZmVjdGl2ZV9idWRnZXQpOworCSpidWRnZXQgLT0gd29ya19kb25lOworCWRldi0+cXVvdGEgLT0gd29ya19kb25lOworCisJaWYgKHdvcmtfZG9uZSA+PSBlZmZlY3RpdmVfYnVkZ2V0KQorCQlyZXR1cm4gMTsKKworCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisKKwkvKgorCSAqIEJlY2F1c2Ugd2UgZG9uJ3QgYXRvbWljYWxseSBmbHVzaCB0aGUgZm9sbG93aW5nIHdyaXRlIGl0IGlzCisJICogcG9zc2libGUgdGhhdCBpbiB2ZXJ5IHJhcmUgY2FzZXMgaXQgY2FuIHJlYWNoIHRoZSBkZXZpY2UgaW4gYSB3YXkKKwkgKiB0aGF0IHJhY2VzIHdpdGggYSBuZXcgcmVzcG9uc2UgYmVpbmcgd3JpdHRlbiBwbHVzIGFuIGVycm9yIGludGVycnVwdAorCSAqIGNhdXNpbmcgdGhlIE5BUEkgaW50ZXJydXB0IGhhbmRsZXIgYmVsb3cgdG8gcmV0dXJuIHVuaGFuZGxlZCBzdGF0dXMKKwkgKiB0byB0aGUgT1MuICBUbyBwcm90ZWN0IGFnYWluc3QgdGhpcyB3b3VsZCByZXF1aXJlIGZsdXNoaW5nIHRoZSB3cml0ZQorCSAqIGFuZCBkb2luZyBib3RoIHRoZSB3cml0ZSBhbmQgdGhlIGZsdXNoIHdpdGggaW50ZXJydXB0cyBvZmYuICBXYXkgdG9vCisJICogZXhwZW5zaXZlIGFuZCB1bmp1c3RpZmlhYmxlIGdpdmVuIHRoZSByYXJpdHkgb2YgdGhlIHJhY2UuCisJICoKKwkgKiBUaGUgcmFjZSBjYW5ub3QgaGFwcGVuIGF0IGFsbCB3aXRoIE1TSS1YLgorCSAqLworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1NHX0dUUywgVl9SU1BRKHFzLT5yc3BxLmNudHh0X2lkKSB8CisJCSAgICAgVl9ORVdUSU1FUihxcy0+cnNwcS5uZXh0X2hvbGRvZmYpIHwKKwkJICAgICBWX05FV0lOREVYKHFzLT5yc3BxLmNpZHgpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGFscmVhZHkgc2NoZWR1bGVkIGZvciBwb2xsaW5nLgorICovCitzdGF0aWMgaW5saW5lIGludCBuYXBpX2lzX3NjaGVkdWxlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiB0ZXN0X2JpdChfX0xJTktfU1RBVEVfUlhfU0NIRUQsICZkZXYtPnN0YXRlKTsKK30KKworLyoqCisgKglwcm9jZXNzX3B1cmVfcmVzcG9uc2VzIC0gcHJvY2VzcyBwdXJlIHJlc3BvbnNlcyBmcm9tIGEgcmVzcG9uc2UgcXVldWUKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQHFzOiB0aGUgcXVldWUgc2V0IG93bmluZyB0aGUgcmVzcG9uc2UgcXVldWUKKyAqCUByOiB0aGUgZmlyc3QgcHVyZSByZXNwb25zZSB0byBwcm9jZXNzCisgKgorICoJQSBzaW1wbGVyIHZlcnNpb24gb2YgcHJvY2Vzc19yZXNwb25zZXMoKSB0aGF0IGhhbmRsZXMgb25seSBwdXJlIChpLmUuLAorICoJbm9uIGRhdGEtY2FycnlpbmcpIHJlc3BvbnNlcy4gIFN1Y2ggcmVzcG9uZXMgYXJlIHRvbyBsaWdodC13ZWlnaHQgdG8KKyAqCWp1c3RpZnkgY2FsbGluZyBhIHNvZnRpcnEgdW5kZXIgTkFQSSwgc28gd2UgaGFuZGxlIHRoZW0gc3BlY2lhbGx5IGluCisgKgl0aGUgaW50ZXJydXB0IGhhbmRsZXIuICBUaGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYSBwb2ludGVyIHRvIGEKKyAqCXJlc3BvbnNlLCB3aGljaCB0aGUgY2FsbGVyIG11c3QgZW5zdXJlIGlzIGEgdmFsaWQgcHVyZSByZXNwb25zZS4KKyAqCisgKglSZXR1cm5zIDEgaWYgaXQgZW5jb3VudGVycyBhIHZhbGlkIGRhdGEtY2FycnlpbmcgcmVzcG9uc2UsIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHByb2Nlc3NfcHVyZV9yZXNwb25zZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfcXNldCAqcXMsCisJCQkJICBzdHJ1Y3QgcnNwX2Rlc2MgKnIpCit7CisJc3RydWN0IHNnZV9yc3BxICpxID0gJnFzLT5yc3BxOworCXVuc2lnbmVkIGludCBzbGVlcGluZyA9IDA7CisKKwlkbyB7CisJCXUzMiBmbGFncyA9IG50b2hsKHItPmZsYWdzKTsKKworCQlyKys7CisJCWlmICh1bmxpa2VseSgrK3EtPmNpZHggPT0gcS0+c2l6ZSkpIHsKKwkJCXEtPmNpZHggPSAwOworCQkJcS0+Z2VuIF49IDE7CisJCQlyID0gcS0+ZGVzYzsKKwkJfQorCQlwcmVmZXRjaChyKTsKKworCQlpZiAoZmxhZ3MgJiBSU1BEX0NUUkxfTUFTSykgeworCQkJc2xlZXBpbmcgfD0gZmxhZ3MgJiBSU1BEX0dUU19NQVNLOworCQkJaGFuZGxlX3JzcF9jbnRybF9pbmZvKHFzLCBmbGFncyk7CisJCX0KKworCQlxLT5wdXJlX3JzcHMrKzsKKwkJaWYgKCsrcS0+Y3JlZGl0cyA+PSAocS0+c2l6ZSAvIDQpKSB7CisJCQlyZWZpbGxfcnNwcShhZGFwLCBxLCBxLT5jcmVkaXRzKTsKKwkJCXEtPmNyZWRpdHMgPSAwOworCQl9CisJfSB3aGlsZSAoaXNfbmV3X3Jlc3BvbnNlKHIsIHEpICYmIGlzX3B1cmVfcmVzcG9uc2UocikpOworCisJaWYgKHNsZWVwaW5nKQorCQljaGVja19yaW5nX2RiKGFkYXAsIHFzLCBzbGVlcGluZyk7CisKKwlzbXBfbWIoKTsJCS8qIGNvbW1pdCBUeCBxdWV1ZSAucHJvY2Vzc2VkIHVwZGF0ZXMgKi8KKwlpZiAodW5saWtlbHkocXMtPnR4cV9zdG9wcGVkICE9IDApKQorCQlyZXN0YXJ0X3R4KHFzKTsKKworCXJldHVybiBpc19uZXdfcmVzcG9uc2UociwgcSk7Cit9CisKKy8qKgorICoJaGFuZGxlX3Jlc3BvbnNlcyAtIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggbmV3IHJlc3BvbnNlcyBpbiBOQVBJIG1vZGUKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQHE6IHRoZSByZXNwb25zZSBxdWV1ZQorICoKKyAqCVRoaXMgaXMgdXNlZCBieSB0aGUgTkFQSSBpbnRlcnJ1cHQgaGFuZGxlcnMgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aAorICoJbmV3IFNHRSByZXNwb25zZXMuICBJZiB0aGVyZSBhcmUgbm8gbmV3IHJlc3BvbnNlcyBpdCByZXR1cm5zIC0xLiAgSWYKKyAqCXRoZXJlIGFyZSBuZXcgcmVzcG9uc2VzIGFuZCB0aGV5IGFyZSBwdXJlIChpLmUuLCBub24tZGF0YSBjYXJyeWluZykKKyAqCWl0IGhhbmRsZXMgdGhlbSBzdHJhaWdodCBpbiBoYXJkIGludGVycnVwdCBjb250ZXh0IGFzIHRoZXkgYXJlIHZlcnkKKyAqCWNoZWFwIGFuZCBkb24ndCBkZWxpdmVyIGFueSBwYWNrZXRzLiAgRmluYWxseSwgaWYgdGhlcmUgYXJlIGFueSBkYXRhCisgKglzaWduYWxpbmcgcmVzcG9uc2VzIGl0IHNjaGVkdWxlcyB0aGUgTkFQSSBoYW5kbGVyLiAgUmV0dXJucyAxIGlmIGl0CisgKglzY2hlZHVsZXMgTkFQSSwgMCBpZiBhbGwgbmV3IHJlc3BvbnNlcyB3ZXJlIHB1cmUuCisgKgorICoJVGhlIGNhbGxlciBtdXN0IGFzY2VydGFpbiBOQVBJIGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhhbmRsZV9yZXNwb25zZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBzZ2VfcnNwcSAqcSkKK3sKKwlzdHJ1Y3Qgc2dlX3FzZXQgKnFzID0gcnNwcV90b19xc2V0KHEpOworCXN0cnVjdCByc3BfZGVzYyAqciA9ICZxLT5kZXNjW3EtPmNpZHhdOworCisJaWYgKCFpc19uZXdfcmVzcG9uc2UociwgcSkpCisJCXJldHVybiAtMTsKKwlpZiAoaXNfcHVyZV9yZXNwb25zZShyKSAmJiBwcm9jZXNzX3B1cmVfcmVzcG9uc2VzKGFkYXAsIHFzLCByKSA9PSAwKSB7CisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1NHX0dUUywgVl9SU1BRKHEtPmNudHh0X2lkKSB8CisJCQkgICAgIFZfTkVXVElNRVIocS0+aG9sZG9mZl90bXIpIHwgVl9ORVdJTkRFWChxLT5jaWR4KSk7CisJCXJldHVybiAwOworCX0KKwlpZiAobGlrZWx5KF9fbmV0aWZfcnhfc2NoZWR1bGVfcHJlcChxcy0+bmV0ZGV2KSkpCisJCV9fbmV0aWZfcnhfc2NoZWR1bGUocXMtPm5ldGRldik7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgTVNJLVggaW50ZXJydXB0IGhhbmRsZXIgZm9yIGFuIFNHRSByZXNwb25zZSBxdWV1ZSBmb3IgdGhlIG5vbi1OQVBJIGNhc2UKKyAqIChpLmUuLCByZXNwb25zZSBxdWV1ZSBzZXJ2aWNlZCBpbiBoYXJkIGludGVycnVwdCkuCisgKi8KK2lycXJldHVybl90IHQzX3NnZV9pbnRyX21zaXgoaW50IGlycSwgdm9pZCAqY29va2llKQoreworCXN0cnVjdCBzZ2VfcXNldCAqcXMgPSBjb29raWU7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBxcy0+bmV0ZGV2LT5wcml2OworCXN0cnVjdCBzZ2VfcnNwcSAqcSA9ICZxcy0+cnNwcTsKKworCXNwaW5fbG9jaygmcS0+bG9jayk7CisJaWYgKHByb2Nlc3NfcmVzcG9uc2VzKGFkYXAsIHFzLCAtMSkgPT0gMCkKKwkJcS0+dW5oYW5kbGVkX2lycXMrKzsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9TR19HVFMsIFZfUlNQUShxLT5jbnR4dF9pZCkgfAorCQkgICAgIFZfTkVXVElNRVIocS0+bmV4dF9ob2xkb2ZmKSB8IFZfTkVXSU5ERVgocS0+Y2lkeCkpOworCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBUaGUgTVNJLVggaW50ZXJydXB0IGhhbmRsZXIgZm9yIGFuIFNHRSByZXNwb25zZSBxdWV1ZSBmb3IgdGhlIE5BUEkgY2FzZQorICogKGkuZS4sIHJlc3BvbnNlIHF1ZXVlIHNlcnZpY2VkIGJ5IE5BUEkgcG9sbGluZykuCisgKi8KK2lycXJldHVybl90IHQzX3NnZV9pbnRyX21zaXhfbmFwaShpbnQgaXJxLCB2b2lkICpjb29raWUpCit7CisJc3RydWN0IHNnZV9xc2V0ICpxcyA9IGNvb2tpZTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHFzLT5uZXRkZXYtPnByaXY7CisJc3RydWN0IHNnZV9yc3BxICpxID0gJnFzLT5yc3BxOworCisJc3Bpbl9sb2NrKCZxLT5sb2NrKTsKKwlCVUdfT04obmFwaV9pc19zY2hlZHVsZWQocXMtPm5ldGRldikpOworCisJaWYgKGhhbmRsZV9yZXNwb25zZXMoYWRhcCwgcSkgPCAwKQorCQlxLT51bmhhbmRsZWRfaXJxcysrOworCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBUaGUgbm9uLU5BUEkgTVNJIGludGVycnVwdCBoYW5kbGVyLiAgVGhpcyBuZWVkcyB0byBoYW5kbGUgZGF0YSBldmVudHMgZnJvbQorICogU0dFIHJlc3BvbnNlIHF1ZXVlcyBhcyB3ZWxsIGFzIGVycm9yIGFuZCBvdGhlciBhc3luYyBldmVudHMgYXMgdGhleSBhbGwgdXNlCisgKiB0aGUgc2FtZSBNU0kgdmVjdG9yLiAgV2UgdXNlIG9uZSBTR0UgcmVzcG9uc2UgcXVldWUgcGVyIHBvcnQgaW4gdGhpcyBtb2RlCisgKiBhbmQgcHJvdGVjdCBhbGwgcmVzcG9uc2UgcXVldWVzIHdpdGggcXVldWUgMCdzIGxvY2suCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0M19pbnRyX21zaShpbnQgaXJxLCB2b2lkICpjb29raWUpCit7CisJaW50IG5ld19wYWNrZXRzID0gMDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IGNvb2tpZTsKKwlzdHJ1Y3Qgc2dlX3JzcHEgKnEgPSAmYWRhcC0+c2dlLnFzWzBdLnJzcHE7CisKKwlzcGluX2xvY2soJnEtPmxvY2spOworCisJaWYgKHByb2Nlc3NfcmVzcG9uc2VzKGFkYXAsICZhZGFwLT5zZ2UucXNbMF0sIC0xKSkgeworCQl0M193cml0ZV9yZWcoYWRhcCwgQV9TR19HVFMsIFZfUlNQUShxLT5jbnR4dF9pZCkgfAorCQkJICAgICBWX05FV1RJTUVSKHEtPm5leHRfaG9sZG9mZikgfCBWX05FV0lOREVYKHEtPmNpZHgpKTsKKwkJbmV3X3BhY2tldHMgPSAxOworCX0KKworCWlmIChhZGFwLT5wYXJhbXMubnBvcnRzID09IDIgJiYKKwkgICAgcHJvY2Vzc19yZXNwb25zZXMoYWRhcCwgJmFkYXAtPnNnZS5xc1sxXSwgLTEpKSB7CisJCXN0cnVjdCBzZ2VfcnNwcSAqcTEgPSAmYWRhcC0+c2dlLnFzWzFdLnJzcHE7CisKKwkJdDNfd3JpdGVfcmVnKGFkYXAsIEFfU0dfR1RTLCBWX1JTUFEocTEtPmNudHh0X2lkKSB8CisJCQkgICAgIFZfTkVXVElNRVIocTEtPm5leHRfaG9sZG9mZikgfAorCQkJICAgICBWX05FV0lOREVYKHExLT5jaWR4KSk7CisJCW5ld19wYWNrZXRzID0gMTsKKwl9CisKKwlpZiAoIW5ld19wYWNrZXRzICYmIHQzX3Nsb3dfaW50cl9oYW5kbGVyKGFkYXApID09IDApCisJCXEtPnVuaGFuZGxlZF9pcnFzKys7CisKKwlzcGluX3VubG9jaygmcS0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHJzcHFfY2hlY2tfbmFwaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2dlX3JzcHEgKnEpCit7CisJaWYgKCFuYXBpX2lzX3NjaGVkdWxlZChkZXYpICYmIGlzX25ld19yZXNwb25zZSgmcS0+ZGVzY1txLT5jaWR4XSwgcSkpIHsKKwkJaWYgKGxpa2VseShfX25ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkpCisJCQlfX25ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBNU0kgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBOQVBJIGNhc2UgKGkuZS4sIHJlc3BvbnNlIHF1ZXVlcyBzZXJ2aWNlZAorICogYnkgTkFQSSBwb2xsaW5nKS4gIEhhbmRsZXMgZGF0YSBldmVudHMgZnJvbSBTR0UgcmVzcG9uc2UgcXVldWVzIGFzIHdlbGwgYXMKKyAqIGVycm9yIGFuZCBvdGhlciBhc3luYyBldmVudHMgYXMgdGhleSBhbGwgdXNlIHRoZSBzYW1lIE1TSSB2ZWN0b3IuICBXZSB1c2UKKyAqIG9uZSBTR0UgcmVzcG9uc2UgcXVldWUgcGVyIHBvcnQgaW4gdGhpcyBtb2RlIGFuZCBwcm90ZWN0IGFsbCByZXNwb25zZQorICogcXVldWVzIHdpdGggcXVldWUgMCdzIGxvY2suCisgKi8KK2lycXJldHVybl90IHQzX2ludHJfbXNpX25hcGkoaW50IGlycSwgdm9pZCAqY29va2llKQoreworCWludCBuZXdfcGFja2V0czsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IGNvb2tpZTsKKwlzdHJ1Y3Qgc2dlX3JzcHEgKnEgPSAmYWRhcC0+c2dlLnFzWzBdLnJzcHE7CisKKwlzcGluX2xvY2soJnEtPmxvY2spOworCisJbmV3X3BhY2tldHMgPSByc3BxX2NoZWNrX25hcGkoYWRhcC0+c2dlLnFzWzBdLm5ldGRldiwgcSk7CisJaWYgKGFkYXAtPnBhcmFtcy5ucG9ydHMgPT0gMikKKwkJbmV3X3BhY2tldHMgKz0gcnNwcV9jaGVja19uYXBpKGFkYXAtPnNnZS5xc1sxXS5uZXRkZXYsCisJCQkJCSAgICAgICAmYWRhcC0+c2dlLnFzWzFdLnJzcHEpOworCWlmICghbmV3X3BhY2tldHMgJiYgdDNfc2xvd19pbnRyX2hhbmRsZXIoYWRhcCkgPT0gMCkKKwkJcS0+dW5oYW5kbGVkX2lycXMrKzsKKworCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBBIGhlbHBlciBmdW5jdGlvbiB0aGF0IHByb2Nlc3NlcyByZXNwb25zZXMgYW5kIGlzc3VlcyBHVFMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHByb2Nlc3NfcmVzcG9uc2VzX2d0cyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwKKwkJCQkJc3RydWN0IHNnZV9yc3BxICpycSkKK3sKKwlpbnQgd29yazsKKworCXdvcmsgPSBwcm9jZXNzX3Jlc3BvbnNlcyhhZGFwLCByc3BxX3RvX3FzZXQocnEpLCAtMSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfU0dfR1RTLCBWX1JTUFEocnEtPmNudHh0X2lkKSB8CisJCSAgICAgVl9ORVdUSU1FUihycS0+bmV4dF9ob2xkb2ZmKSB8IFZfTkVXSU5ERVgocnEtPmNpZHgpKTsKKwlyZXR1cm4gd29yazsKK30KKworLyoKKyAqIFRoZSBsZWdhY3kgSU5UeCBpbnRlcnJ1cHQgaGFuZGxlci4gIFRoaXMgbmVlZHMgdG8gaGFuZGxlIGRhdGEgZXZlbnRzIGZyb20KKyAqIFNHRSByZXNwb25zZSBxdWV1ZXMgYXMgd2VsbCBhcyBlcnJvciBhbmQgb3RoZXIgYXN5bmMgZXZlbnRzIGFzIHRoZXkgYWxsIHVzZQorICogdGhlIHNhbWUgaW50ZXJydXB0IHBpbi4gIFdlIHVzZSBvbmUgU0dFIHJlc3BvbnNlIHF1ZXVlIHBlciBwb3J0IGluIHRoaXMgbW9kZQorICogYW5kIHByb3RlY3QgYWxsIHJlc3BvbnNlIHF1ZXVlcyB3aXRoIHF1ZXVlIDAncyBsb2NrLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgdDNfaW50cihpbnQgaXJxLCB2b2lkICpjb29raWUpCit7CisJaW50IHdvcmtfZG9uZSwgdzAsIHcxOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gY29va2llOworCXN0cnVjdCBzZ2VfcnNwcSAqcTAgPSAmYWRhcC0+c2dlLnFzWzBdLnJzcHE7CisJc3RydWN0IHNnZV9yc3BxICpxMSA9ICZhZGFwLT5zZ2UucXNbMV0ucnNwcTsKKworCXNwaW5fbG9jaygmcTAtPmxvY2spOworCisJdzAgPSBpc19uZXdfcmVzcG9uc2UoJnEwLT5kZXNjW3EwLT5jaWR4XSwgcTApOworCXcxID0gYWRhcC0+cGFyYW1zLm5wb3J0cyA9PSAyICYmCisJICAgIGlzX25ld19yZXNwb25zZSgmcTEtPmRlc2NbcTEtPmNpZHhdLCBxMSk7CisKKwlpZiAobGlrZWx5KHcwIHwgdzEpKSB7CisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1BMX0NMSSwgMCk7CisJCXQzX3JlYWRfcmVnKGFkYXAsIEFfUExfQ0xJKTsJLyogZmx1c2ggKi8KKworCQlpZiAobGlrZWx5KHcwKSkKKwkJCXByb2Nlc3NfcmVzcG9uc2VzX2d0cyhhZGFwLCBxMCk7CisKKwkJaWYgKHcxKQorCQkJcHJvY2Vzc19yZXNwb25zZXNfZ3RzKGFkYXAsIHExKTsKKworCQl3b3JrX2RvbmUgPSB3MCB8IHcxOworCX0gZWxzZQorCQl3b3JrX2RvbmUgPSB0M19zbG93X2ludHJfaGFuZGxlcihhZGFwKTsKKworCXNwaW5fdW5sb2NrKCZxMC0+bG9jayk7CisJcmV0dXJuIElSUV9SRVRWQUwod29ya19kb25lICE9IDApOworfQorCisvKgorICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIGxlZ2FjeSBJTlR4IGludGVycnVwdHMgZm9yIFQzQi1iYXNlZCBjYXJkcy4KKyAqIEhhbmRsZXMgZGF0YSBldmVudHMgZnJvbSBTR0UgcmVzcG9uc2UgcXVldWVzIGFzIHdlbGwgYXMgZXJyb3IgYW5kIG90aGVyCisgKiBhc3luYyBldmVudHMgYXMgdGhleSBhbGwgdXNlIHRoZSBzYW1lIGludGVycnVwdCBwaW4uICBXZSB1c2Ugb25lIFNHRQorICogcmVzcG9uc2UgcXVldWUgcGVyIHBvcnQgaW4gdGhpcyBtb2RlIGFuZCBwcm90ZWN0IGFsbCByZXNwb25zZSBxdWV1ZXMgd2l0aAorICogcXVldWUgMCdzIGxvY2suCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB0M2JfaW50cihpbnQgaXJxLCB2b2lkICpjb29raWUpCit7CisJdTMyIG1hcDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IGNvb2tpZTsKKwlzdHJ1Y3Qgc2dlX3JzcHEgKnEwID0gJmFkYXAtPnNnZS5xc1swXS5yc3BxOworCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfUExfQ0xJLCAwKTsKKwltYXAgPSB0M19yZWFkX3JlZyhhZGFwLCBBX1NHX0RBVEFfSU5UUik7CisKKwlpZiAodW5saWtlbHkoIW1hcCkpCS8qIHNoYXJlZCBpbnRlcnJ1cHQsIG1vc3QgbGlrZWx5ICovCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmcTAtPmxvY2spOworCisJaWYgKHVubGlrZWx5KG1hcCAmIEZfRVJSSU5UUikpCisJCXQzX3Nsb3dfaW50cl9oYW5kbGVyKGFkYXApOworCisJaWYgKGxpa2VseShtYXAgJiAxKSkKKwkJcHJvY2Vzc19yZXNwb25zZXNfZ3RzKGFkYXAsIHEwKTsKKworCWlmIChtYXAgJiAyKQorCQlwcm9jZXNzX3Jlc3BvbnNlc19ndHMoYWRhcCwgJmFkYXAtPnNnZS5xc1sxXS5yc3BxKTsKKworCXNwaW5fdW5sb2NrKCZxMC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogTkFQSSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgbGVnYWN5IElOVHggaW50ZXJydXB0cyBmb3IgVDNCLWJhc2VkIGNhcmRzLgorICogSGFuZGxlcyBkYXRhIGV2ZW50cyBmcm9tIFNHRSByZXNwb25zZSBxdWV1ZXMgYXMgd2VsbCBhcyBlcnJvciBhbmQgb3RoZXIKKyAqIGFzeW5jIGV2ZW50cyBhcyB0aGV5IGFsbCB1c2UgdGhlIHNhbWUgaW50ZXJydXB0IHBpbi4gIFdlIHVzZSBvbmUgU0dFCisgKiByZXNwb25zZSBxdWV1ZSBwZXIgcG9ydCBpbiB0aGlzIG1vZGUgYW5kIHByb3RlY3QgYWxsIHJlc3BvbnNlIHF1ZXVlcyB3aXRoCisgKiBxdWV1ZSAwJ3MgbG9jay4KKyAqLworc3RhdGljIGlycXJldHVybl90IHQzYl9pbnRyX25hcGkoaW50IGlycSwgdm9pZCAqY29va2llKQoreworCXUzMiBtYXA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IGNvb2tpZTsKKwlzdHJ1Y3Qgc2dlX3JzcHEgKnEwID0gJmFkYXAtPnNnZS5xc1swXS5yc3BxOworCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfUExfQ0xJLCAwKTsKKwltYXAgPSB0M19yZWFkX3JlZyhhZGFwLCBBX1NHX0RBVEFfSU5UUik7CisKKwlpZiAodW5saWtlbHkoIW1hcCkpCS8qIHNoYXJlZCBpbnRlcnJ1cHQsIG1vc3QgbGlrZWx5ICovCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmcTAtPmxvY2spOworCisJaWYgKHVubGlrZWx5KG1hcCAmIEZfRVJSSU5UUikpCisJCXQzX3Nsb3dfaW50cl9oYW5kbGVyKGFkYXApOworCisJaWYgKGxpa2VseShtYXAgJiAxKSkgeworCQlkZXYgPSBhZGFwLT5zZ2UucXNbMF0ubmV0ZGV2OworCisJCWlmIChsaWtlbHkoX19uZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpKQorCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCX0KKwlpZiAobWFwICYgMikgeworCQlkZXYgPSBhZGFwLT5zZ2UucXNbMV0ubmV0ZGV2OworCisJCWlmIChsaWtlbHkoX19uZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGRldikpKQorCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCX0KKworCXNwaW5fdW5sb2NrKCZxMC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqCXQzX2ludHJfaGFuZGxlciAtIHNlbGVjdCB0aGUgdG9wLWxldmVsIGludGVycnVwdCBoYW5kbGVyCisgKglAYWRhcDogdGhlIGFkYXB0ZXIKKyAqCUBwb2xsaW5nOiB3aGV0aGVyIHVzaW5nIE5BUEkgdG8gc2VydmljZSByZXNwb25zZSBxdWV1ZXMKKyAqCisgKglTZWxlY3RzIHRoZSB0b3AtbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIgYmFzZWQgb24gdGhlIHR5cGUgb2YgaW50ZXJydXB0cworICoJKE1TSS1YLCBNU0ksIG9yIGxlZ2FjeSkgYW5kIHdoZXRoZXIgTkFQSSB3aWxsIGJlIHVzZWQgdG8gc2VydmljZSB0aGUKKyAqCXJlc3BvbnNlIHF1ZXVlcy4KKyAqLworaW50cl9oYW5kbGVyX3QgdDNfaW50cl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwLCBpbnQgcG9sbGluZykKK3sKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQlyZXR1cm4gcG9sbGluZyA/IHQzX3NnZV9pbnRyX21zaXhfbmFwaSA6IHQzX3NnZV9pbnRyX21zaXg7CisJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJKQorCQlyZXR1cm4gcG9sbGluZyA/IHQzX2ludHJfbXNpX25hcGkgOiB0M19pbnRyX21zaTsKKwlpZiAoYWRhcC0+cGFyYW1zLnJldiA+IDApCisJCXJldHVybiBwb2xsaW5nID8gdDNiX2ludHJfbmFwaSA6IHQzYl9pbnRyOworCXJldHVybiB0M19pbnRyOworfQorCisvKioKKyAqCXQzX3NnZV9lcnJfaW50cl9oYW5kbGVyIC0gU0dFIGFzeW5jIGV2ZW50IGludGVycnVwdCBoYW5kbGVyCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCisgKglJbnRlcnJ1cHQgaGFuZGxlciBmb3IgU0dFIGFzeW5jaHJvbm91cyAobm9uLWRhdGEpIGV2ZW50cy4KKyAqLwordm9pZCB0M19zZ2VfZXJyX2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBpbnQgdiwgc3RhdHVzID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9TR19JTlRfQ0FVU0UpOworCisJaWYgKHN0YXR1cyAmIEZfUlNQUUNSRURJVE9WRVJGT1cpCisJCUNIX0FMRVJUKGFkYXB0ZXIsICJTR0UgcmVzcG9uc2UgcXVldWUgY3JlZGl0IG92ZXJmbG93XG4iKTsKKworCWlmIChzdGF0dXMgJiBGX1JTUFFESVNBQkxFRCkgeworCQl2ID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9TR19SU1BRX0ZMX1NUQVRVUyk7CisKKwkJQ0hfQUxFUlQoYWRhcHRlciwKKwkJCSAicGFja2V0IGRlbGl2ZXJlZCB0byBkaXNhYmxlZCByZXNwb25zZSBxdWV1ZSAiCisJCQkgIigweCV4KVxuIiwgKHYgPj4gU19SU1BRMERJU0FCTEVEKSAmIDB4ZmYpOworCX0KKworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0lOVF9DQVVTRSwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzICYgKEZfUlNQUUNSRURJVE9WRVJGT1cgfCBGX1JTUFFESVNBQkxFRCkpCisJCXQzX2ZhdGFsX2VycihhZGFwdGVyKTsKK30KKworLyoqCisgKglzZ2VfdGltZXJfY2IgLSBwZXJmb3JtIHBlcmlvZGljIG1haW50ZW5hbmNlIG9mIGFuIFNHRSBxc2V0CisgKglAZGF0YTogdGhlIFNHRSBxdWV1ZSBzZXQgdG8gbWFpbnRhaW4KKyAqCisgKglSdW5zIHBlcmlvZGljYWxseSBmcm9tIGEgdGltZXIgdG8gcGVyZm9ybSBtYWludGVuYW5jZSBvZiBhbiBTR0UgcXVldWUKKyAqCXNldC4gIEl0IHBlcmZvcm1zIHR3byB0YXNrczoKKyAqCisgKglhKSBDbGVhbnMgdXAgYW55IGNvbXBsZXRlZCBUeCBkZXNjcmlwdG9ycyB0aGF0IG1heSBzdGlsbCBiZSBwZW5kaW5nLgorICoJTm9ybWFsIGRlc2NyaXB0b3IgY2xlYW51cCBoYXBwZW5zIHdoZW4gbmV3IHBhY2tldHMgYXJlIGFkZGVkIHRvIGEgVHgKKyAqCXF1ZXVlIHNvIHRoaXMgdGltZXIgaXMgcmVsYXRpdmVseSBpbmZyZXF1ZW50IGFuZCBkb2VzIGFueSBjbGVhbnVwIG9ubHkKKyAqCWlmIHRoZSBUeCBxdWV1ZSBoYXMgbm90IHNlZW4gYW55IG5ldyBwYWNrZXRzIGluIGEgd2hpbGUuICBXZSBtYWtlIGEKKyAqCWJlc3QgZWZmb3J0IGF0dGVtcHQgdG8gcmVjbGFpbSBkZXNjcmlwdG9ycywgaW4gdGhhdCB3ZSBkb24ndCB3YWl0CisgKglhcm91bmQgaWYgd2UgY2Fubm90IGdldCBhIHF1ZXVlJ3MgbG9jayAod2hpY2ggbW9zdCBsaWtlbHkgaXMgYmVjYXVzZQorICoJc29tZW9uZSBlbHNlIGlzIHF1ZXVlaW5nIG5ldyBwYWNrZXRzIGFuZCBzbyB3aWxsIGFsc28gaGFuZGxlIHRoZSBjbGVhbgorICoJdXApLiAgU2luY2UgY29udHJvbCBxdWV1ZXMgdXNlIGltbWVkaWF0ZSBkYXRhIGV4Y2x1c2l2ZWx5IHdlIGRvbid0CisgKglib3RoZXIgY2xlYW5pbmcgdGhlbSB1cCBoZXJlLgorICoKKyAqCWIpIFJlcGxlbmlzaGVzIFJ4IHF1ZXVlcyB0aGF0IGhhdmUgcnVuIG91dCBkdWUgdG8gbWVtb3J5IHNob3J0YWdlLgorICoJTm9ybWFsbHkgbmV3IFJ4IGJ1ZmZlcnMgYXJlIGFkZGVkIHdoZW4gZXhpc3Rpbmcgb25lcyBhcmUgY29uc3VtZWQgYnV0CisgKgl3aGVuIG91dCBvZiBtZW1vcnkgYSBxdWV1ZSBjYW4gYmVjb21lIGVtcHR5LiAgV2UgdHJ5IHRvIGFkZCBvbmx5IGEgZmV3CisgKglidWZmZXJzIGhlcmUsIHRoZSBxdWV1ZSB3aWxsIGJlIHJlcGxlbmlzaGVkIGZ1bGx5IGFzIHRoZXNlIG5ldyBidWZmZXJzCisgKglhcmUgdXNlZCB1cCBpZiBtZW1vcnkgc2hvcnRhZ2UgaGFzIHN1YnNpZGVkLgorICovCitzdGF0aWMgdm9pZCBzZ2VfdGltZXJfY2IodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXNwaW5sb2NrX3QgKmxvY2s7CisJc3RydWN0IHNnZV9xc2V0ICpxcyA9IChzdHJ1Y3Qgc2dlX3FzZXQgKilkYXRhOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcXMtPm5ldGRldi0+cHJpdjsKKworCWlmIChzcGluX3RyeWxvY2soJnFzLT50eHFbVFhRX0VUSF0ubG9jaykpIHsKKwkJcmVjbGFpbV9jb21wbGV0ZWRfdHgoYWRhcCwgJnFzLT50eHFbVFhRX0VUSF0pOworCQlzcGluX3VubG9jaygmcXMtPnR4cVtUWFFfRVRIXS5sb2NrKTsKKwl9CisJaWYgKHNwaW5fdHJ5bG9jaygmcXMtPnR4cVtUWFFfT0ZMRF0ubG9jaykpIHsKKwkJcmVjbGFpbV9jb21wbGV0ZWRfdHgoYWRhcCwgJnFzLT50eHFbVFhRX09GTERdKTsKKwkJc3Bpbl91bmxvY2soJnFzLT50eHFbVFhRX09GTERdLmxvY2spOworCX0KKwlsb2NrID0gKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkgPyAmcXMtPnJzcHEubG9jayA6CisJICAgICZhZGFwLT5zZ2UucXNbMF0ucnNwcS5sb2NrOworCWlmIChzcGluX3RyeWxvY2tfaXJxKGxvY2spKSB7CisJCWlmICghbmFwaV9pc19zY2hlZHVsZWQocXMtPm5ldGRldikpIHsKKwkJCWlmIChxcy0+ZmxbMF0uY3JlZGl0cyA8IHFzLT5mbFswXS5zaXplKQorCQkJCV9fcmVmaWxsX2ZsKGFkYXAsICZxcy0+ZmxbMF0pOworCQkJaWYgKHFzLT5mbFsxXS5jcmVkaXRzIDwgcXMtPmZsWzFdLnNpemUpCisJCQkJX19yZWZpbGxfZmwoYWRhcCwgJnFzLT5mbFsxXSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxKGxvY2spOworCX0KKwltb2RfdGltZXIoJnFzLT50eF9yZWNsYWltX3RpbWVyLCBqaWZmaWVzICsgVFhfUkVDTEFJTV9QRVJJT0QpOworfQorCisvKioKKyAqCXQzX3VwZGF0ZV9xc2V0X2NvYWxlc2NlIC0gdXBkYXRlIGNvYWxlc2Npbmcgc2V0dGluZ3MgZm9yIGEgcXVldWUgc2V0CisgKglAcXM6IHRoZSBTR0UgcXVldWUgc2V0CisgKglAcDogbmV3IHF1ZXVlIHNldCBwYXJhbWV0ZXJzCisgKgorICoJVXBkYXRlIHRoZSBjb2FsZXNjaW5nIHNldHRpbmdzIGZvciBhbiBTR0UgcXVldWUgc2V0LiAgTm90aGluZyBpcyBkb25lCisgKglpZiB0aGUgcXVldWUgc2V0IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuCisgKi8KK3ZvaWQgdDNfdXBkYXRlX3FzZXRfY29hbGVzY2Uoc3RydWN0IHNnZV9xc2V0ICpxcywgY29uc3Qgc3RydWN0IHFzZXRfcGFyYW1zICpwKQoreworCWlmICghcXMtPm5ldGRldikKKwkJcmV0dXJuOworCisJcXMtPnJzcHEuaG9sZG9mZl90bXIgPSBtYXgocC0+Y29hbGVzY2VfdXNlY3MgKiAxMCwgMVUpOy8qIGNhbid0IGJlIDAgKi8KKwlxcy0+cnNwcS5wb2xsaW5nID0gcC0+cG9sbGluZzsKKwlxcy0+bmV0ZGV2LT5wb2xsID0gcC0+cG9sbGluZyA/IG5hcGlfcnhfaGFuZGxlciA6IG9mbGRfcG9sbDsKK30KKworLyoqCisgKgl0M19zZ2VfYWxsb2NfcXNldCAtIGluaXRpYWxpemUgYW4gU0dFIHF1ZXVlIHNldAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAaWQ6IHRoZSBxdWV1ZSBzZXQgaWQKKyAqCUBucG9ydHM6IGhvdyBtYW55IEV0aGVybmV0IHBvcnRzIHdpbGwgYmUgdXNpbmcgdGhpcyBxdWV1ZSBzZXQKKyAqCUBpcnFfdmVjX2lkeDogdGhlIElSUSB2ZWN0b3IgaW5kZXggZm9yIHJlc3BvbnNlIHF1ZXVlIGludGVycnVwdHMKKyAqCUBwOiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMgcXVldWUgc2V0CisgKglAbnR4cTogbnVtYmVyIG9mIFR4IHF1ZXVlcyBmb3IgdGhlIHF1ZXVlIHNldAorICoJQG5ldGRldjogbmV0IGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBxdWV1ZSBzZXQKKyAqCisgKglBbGxvY2F0ZSByZXNvdXJjZXMgYW5kIGluaXRpYWxpemUgYW4gU0dFIHF1ZXVlIHNldC4gIEEgcXVldWUgc2V0CisgKgljb21wcmlzZXMgYSByZXNwb25zZSBxdWV1ZSwgdHdvIFJ4IGZyZWUtYnVmZmVyIHF1ZXVlcywgYW5kIHVwIHRvIDMKKyAqCVR4IHF1ZXVlcy4gIFRoZSBUeCBxdWV1ZXMgYXJlIGFzc2lnbmVkIHJvbGVzIGluIHRoZSBvcmRlciBFdGhlcm5ldAorICoJcXVldWUsIG9mZmxvYWQgcXVldWUsIGFuZCBjb250cm9sIHF1ZXVlLgorICovCitpbnQgdDNfc2dlX2FsbG9jX3FzZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBpZCwgaW50IG5wb3J0cywKKwkJICAgICAgaW50IGlycV92ZWNfaWR4LCBjb25zdCBzdHJ1Y3QgcXNldF9wYXJhbXMgKnAsCisJCSAgICAgIGludCBudHhxLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCWludCBpLCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCBzZ2VfcXNldCAqcSA9ICZhZGFwdGVyLT5zZ2UucXNbaWRdOworCisJaW5pdF9xc2V0X2NudHh0KHEsIGlkKTsKKwlpbml0X3RpbWVyKCZxLT50eF9yZWNsYWltX3RpbWVyKTsKKwlxLT50eF9yZWNsYWltX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylxOworCXEtPnR4X3JlY2xhaW1fdGltZXIuZnVuY3Rpb24gPSBzZ2VfdGltZXJfY2I7CisKKwlxLT5mbFswXS5kZXNjID0gYWxsb2NfcmluZyhhZGFwdGVyLT5wZGV2LCBwLT5mbF9zaXplLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcnhfZGVzYyksCisJCQkJICAgc2l6ZW9mKHN0cnVjdCByeF9zd19kZXNjKSwKKwkJCQkgICAmcS0+ZmxbMF0ucGh5c19hZGRyLCAmcS0+ZmxbMF0uc2Rlc2MpOworCWlmICghcS0+ZmxbMF0uZGVzYykKKwkJZ290byBlcnI7CisKKwlxLT5mbFsxXS5kZXNjID0gYWxsb2NfcmluZyhhZGFwdGVyLT5wZGV2LCBwLT5qdW1ib19zaXplLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgcnhfZGVzYyksCisJCQkJICAgc2l6ZW9mKHN0cnVjdCByeF9zd19kZXNjKSwKKwkJCQkgICAmcS0+ZmxbMV0ucGh5c19hZGRyLCAmcS0+ZmxbMV0uc2Rlc2MpOworCWlmICghcS0+ZmxbMV0uZGVzYykKKwkJZ290byBlcnI7CisKKwlxLT5yc3BxLmRlc2MgPSBhbGxvY19yaW5nKGFkYXB0ZXItPnBkZXYsIHAtPnJzcHFfc2l6ZSwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgcnNwX2Rlc2MpLCAwLAorCQkJCSAgJnEtPnJzcHEucGh5c19hZGRyLCBOVUxMKTsKKwlpZiAoIXEtPnJzcHEuZGVzYykKKwkJZ290byBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnR4cTsgKytpKSB7CisJCS8qCisJCSAqIFRoZSBjb250cm9sIHF1ZXVlIGFsd2F5cyB1c2VzIGltbWVkaWF0ZSBkYXRhIHNvIGRvZXMgbm90CisJCSAqIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBhbnkgc2tfYnVmZnMuCisJCSAqLworCQlzaXplX3Qgc3ogPSBpID09IFRYUV9DVFJMID8gMCA6IHNpemVvZihzdHJ1Y3QgdHhfc3dfZGVzYyk7CisKKwkJcS0+dHhxW2ldLmRlc2MgPSBhbGxvY19yaW5nKGFkYXB0ZXItPnBkZXYsIHAtPnR4cV9zaXplW2ldLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSwgc3osCisJCQkJCSAgICAmcS0+dHhxW2ldLnBoeXNfYWRkciwKKwkJCQkJICAgICZxLT50eHFbaV0uc2Rlc2MpOworCQlpZiAoIXEtPnR4cVtpXS5kZXNjKQorCQkJZ290byBlcnI7CisKKwkJcS0+dHhxW2ldLmdlbiA9IDE7CisJCXEtPnR4cVtpXS5zaXplID0gcC0+dHhxX3NpemVbaV07CisJCXNwaW5fbG9ja19pbml0KCZxLT50eHFbaV0ubG9jayk7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnEtPnR4cVtpXS5zZW5kcSk7CisJfQorCisJdGFza2xldF9pbml0KCZxLT50eHFbVFhRX09GTERdLnFyZXN1bWVfdHNrLCByZXN0YXJ0X29mZmxvYWRxLAorCQkgICAgICh1bnNpZ25lZCBsb25nKXEpOworCXRhc2tsZXRfaW5pdCgmcS0+dHhxW1RYUV9DVFJMXS5xcmVzdW1lX3RzaywgcmVzdGFydF9jdHJscSwKKwkJICAgICAodW5zaWduZWQgbG9uZylxKTsKKworCXEtPmZsWzBdLmdlbiA9IHEtPmZsWzFdLmdlbiA9IDE7CisJcS0+ZmxbMF0uc2l6ZSA9IHAtPmZsX3NpemU7CisJcS0+ZmxbMV0uc2l6ZSA9IHAtPmp1bWJvX3NpemU7CisKKwlxLT5yc3BxLmdlbiA9IDE7CisJcS0+cnNwcS5zaXplID0gcC0+cnNwcV9zaXplOworCXNwaW5fbG9ja19pbml0KCZxLT5yc3BxLmxvY2spOworCisJcS0+dHhxW1RYUV9FVEhdLnN0b3BfdGhyZXMgPSBucG9ydHMgKgorCSAgICBmbGl0c190b19kZXNjKHNnbF9sZW4oTUFYX1NLQl9GUkFHUyArIDEpICsgMyk7CisKKwlpZiAobnR4cSA9PSAxKSB7CisJCXEtPmZsWzBdLmJ1Zl9zaXplID0gU0dFX1JYX1NNX0JVRl9TSVpFICsgMiArCisJCSAgICBzaXplb2Yoc3RydWN0IGNwbF9yeF9wa3QpOworCQlxLT5mbFsxXS5idWZfc2l6ZSA9IE1BWF9GUkFNRV9TSVpFICsgMiArCisJCSAgICBzaXplb2Yoc3RydWN0IGNwbF9yeF9wa3QpOworCX0gZWxzZSB7CisJCXEtPmZsWzBdLmJ1Zl9zaXplID0gU0dFX1JYX1NNX0JVRl9TSVpFICsKKwkJICAgIHNpemVvZihzdHJ1Y3QgY3BsX3J4X2RhdGEpOworCQlxLT5mbFsxXS5idWZfc2l6ZSA9ICgxNiAqIDEwMjQpIC0KKwkJICAgIFNLQl9EQVRBX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSk7CisJfQorCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT5zZ2UucmVnX2xvY2spOworCisJLyogRkwgdGhyZXNob2xkIGNvbXBhcmlzb24gdXNlcyA8ICovCisJcmV0ID0gdDNfc2dlX2luaXRfcnNwY250eHQoYWRhcHRlciwgcS0+cnNwcS5jbnR4dF9pZCwgaXJxX3ZlY19pZHgsCisJCQkJICAgcS0+cnNwcS5waHlzX2FkZHIsIHEtPnJzcHEuc2l6ZSwKKwkJCQkgICBxLT5mbFswXS5idWZfc2l6ZSwgMSwgMCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdW5sb2NrOworCisJZm9yIChpID0gMDsgaSA8IFNHRV9SWFFfUEVSX1NFVDsgKytpKSB7CisJCXJldCA9IHQzX3NnZV9pbml0X2ZsY250eHQoYWRhcHRlciwgcS0+ZmxbaV0uY250eHRfaWQsIDAsCisJCQkJCSAgcS0+ZmxbaV0ucGh5c19hZGRyLCBxLT5mbFtpXS5zaXplLAorCQkJCQkgIHEtPmZsW2ldLmJ1Zl9zaXplLCBwLT5jb25nX3RocmVzLCAxLAorCQkJCQkgIDApOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfdW5sb2NrOworCX0KKworCXJldCA9IHQzX3NnZV9pbml0X2VjbnR4dChhZGFwdGVyLCBxLT50eHFbVFhRX0VUSF0uY250eHRfaWQsIFVTRV9HVFMsCisJCQkJIFNHRV9DTlRYVF9FVEgsIGlkLCBxLT50eHFbVFhRX0VUSF0ucGh5c19hZGRyLAorCQkJCSBxLT50eHFbVFhRX0VUSF0uc2l6ZSwgcS0+dHhxW1RYUV9FVEhdLnRva2VuLAorCQkJCSAxLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bmxvY2s7CisKKwlpZiAobnR4cSA+IDEpIHsKKwkJcmV0ID0gdDNfc2dlX2luaXRfZWNudHh0KGFkYXB0ZXIsIHEtPnR4cVtUWFFfT0ZMRF0uY250eHRfaWQsCisJCQkJCSBVU0VfR1RTLCBTR0VfQ05UWFRfT0ZMRCwgaWQsCisJCQkJCSBxLT50eHFbVFhRX09GTERdLnBoeXNfYWRkciwKKwkJCQkJIHEtPnR4cVtUWFFfT0ZMRF0uc2l6ZSwgMCwgMSwgMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl91bmxvY2s7CisJfQorCisJaWYgKG50eHEgPiAyKSB7CisJCXJldCA9IHQzX3NnZV9pbml0X2VjbnR4dChhZGFwdGVyLCBxLT50eHFbVFhRX0NUUkxdLmNudHh0X2lkLCAwLAorCQkJCQkgU0dFX0NOVFhUX0NUUkwsIGlkLAorCQkJCQkgcS0+dHhxW1RYUV9DVFJMXS5waHlzX2FkZHIsCisJCQkJCSBxLT50eHFbVFhRX0NUUkxdLnNpemUsCisJCQkJCSBxLT50eHFbVFhRX0NUUkxdLnRva2VuLCAxLCAwKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3VubG9jazsKKwl9CisKKwlzcGluX3VubG9jaygmYWRhcHRlci0+c2dlLnJlZ19sb2NrKTsKKwlxLT5uZXRkZXYgPSBuZXRkZXY7CisJdDNfdXBkYXRlX3FzZXRfY29hbGVzY2UocSwgcCk7CisKKwkvKgorCSAqIFdlIHVzZSBhdGFsa19wdHIgYXMgYSBiYWNrcG9pbnRlciB0byBhIHFzZXQuICBJbiBjYXNlIGEgZGV2aWNlIGlzCisJICogYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIHF1ZXVlIHNldHMgb25seSB0aGUgZmlyc3Qgb25lIHNldHMKKwkgKiBhdGFsa19wdHIuCisJICovCisJaWYgKG5ldGRldi0+YXRhbGtfcHRyID09IE5VTEwpCisJCW5ldGRldi0+YXRhbGtfcHRyID0gcTsKKworCXJlZmlsbF9mbChhZGFwdGVyLCAmcS0+ZmxbMF0sIHEtPmZsWzBdLnNpemUsIEdGUF9LRVJORUwpOworCXJlZmlsbF9mbChhZGFwdGVyLCAmcS0+ZmxbMV0sIHEtPmZsWzFdLnNpemUsIEdGUF9LRVJORUwpOworCXJlZmlsbF9yc3BxKGFkYXB0ZXIsICZxLT5yc3BxLCBxLT5yc3BxLnNpemUgLSAxKTsKKworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0dUUywgVl9SU1BRKHEtPnJzcHEuY250eHRfaWQpIHwKKwkJICAgICBWX05FV1RJTUVSKHEtPnJzcHEuaG9sZG9mZl90bXIpKTsKKworCW1vZF90aW1lcigmcS0+dHhfcmVjbGFpbV90aW1lciwgamlmZmllcyArIFRYX1JFQ0xBSU1fUEVSSU9EKTsKKwlyZXR1cm4gMDsKKworICAgICAgZXJyX3VubG9jazoKKwlzcGluX3VubG9jaygmYWRhcHRlci0+c2dlLnJlZ19sb2NrKTsKKyAgICAgIGVycjoKKwl0M19mcmVlX3FzZXQoYWRhcHRlciwgcSk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgl0M19mcmVlX3NnZV9yZXNvdXJjZXMgLSBmcmVlIFNHRSByZXNvdXJjZXMKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoKKyAqCUZyZWVzIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBTR0UgcXVldWUgc2V0cy4KKyAqLwordm9pZCB0M19mcmVlX3NnZV9yZXNvdXJjZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0dFX1FTRVRTOyArK2kpCisJCXQzX2ZyZWVfcXNldChhZGFwLCAmYWRhcC0+c2dlLnFzW2ldKTsKK30KKworLyoqCisgKgl0M19zZ2Vfc3RhcnQgLSBlbmFibGUgU0dFCisgKglAYWRhcDogdGhlIGFkYXB0ZXIKKyAqCisgKglFbmFibGVzIHRoZSBTR0UgZm9yIERNQXMuICBUaGlzIGlzIHRoZSBsYXN0IHN0ZXAgaW4gc3RhcnRpbmcgcGFja2V0CisgKgl0cmFuc2ZlcnMuCisgKi8KK3ZvaWQgdDNfc2dlX3N0YXJ0KHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXQzX3NldF9yZWdfZmllbGQoYWRhcCwgQV9TR19DT05UUk9MLCBGX0dMT0JBTEVOQUJMRSwgRl9HTE9CQUxFTkFCTEUpOworfQorCisvKioKKyAqCXQzX3NnZV9zdG9wIC0gZGlzYWJsZSBTR0Ugb3BlcmF0aW9uCisgKglAYWRhcDogdGhlIGFkYXB0ZXIKKyAqCisgKglEaXNhYmxlcyB0aGUgRE1BIGVuZ2luZS4gIFRoaXMgY2FuIGJlIGNhbGxlZCBpbiBlbWVyZWdlbmNpZXMgKGUuZy4sCisgKglmcm9tIGVycm9yIGludGVycnVwdHMpIG9yIGZyb20gbm9ybWFsIHByb2Nlc3MgY29udGV4dC4gIEluIHRoZSBsYXR0ZXIKKyAqCWNhc2UgaXQgYWxzbyBkaXNhYmxlcyBhbnkgcGVuZGluZyBxdWV1ZSByZXN0YXJ0IHRhc2tsZXRzLiAgTm90ZSB0aGF0CisgKglpZiBpdCBpcyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQgaXQgY2Fubm90IGRpc2FibGUgdGhlIHJlc3RhcnQKKyAqCXRhc2tsZXRzIGFzIGl0IGNhbm5vdCB3YWl0LCBob3dldmVyIHRoZSB0YXNrbGV0cyB3aWxsIGhhdmUgbm8gZWZmZWN0CisgKglzaW5jZSB0aGUgZG9vcmJlbGxzIGFyZSBkaXNhYmxlZCBhbmQgdGhlIGRyaXZlciB3aWxsIGNhbGwgdGhpcyBhZ2FpbgorICoJbGF0ZXIgZnJvbSBwcm9jZXNzIGNvbnRleHQsIGF0IHdoaWNoIHRpbWUgdGhlIHRhc2tsZXRzIHdpbGwgYmUgc3RvcHBlZAorICoJaWYgdGhleSBhcmUgc3RpbGwgcnVubmluZy4KKyAqLwordm9pZCB0M19zZ2Vfc3RvcChzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfU0dfQ09OVFJPTCwgRl9HTE9CQUxFTkFCTEUsIDApOworCWlmICghaW5faW50ZXJydXB0KCkpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IFNHRV9RU0VUUzsgKytpKSB7CisJCQlzdHJ1Y3Qgc2dlX3FzZXQgKnFzID0gJmFkYXAtPnNnZS5xc1tpXTsKKworCQkJdGFza2xldF9raWxsKCZxcy0+dHhxW1RYUV9PRkxEXS5xcmVzdW1lX3Rzayk7CisJCQl0YXNrbGV0X2tpbGwoJnFzLT50eHFbVFhRX0NUUkxdLnFyZXN1bWVfdHNrKTsKKwkJfQorCX0KK30KKworLyoqCisgKgl0M19zZ2VfaW5pdCAtIGluaXRpYWxpemUgU0dFCisgKglAYWRhcDogdGhlIGFkYXB0ZXIKKyAqCUBwOiB0aGUgU0dFIHBhcmFtZXRlcnMKKyAqCisgKglQZXJmb3JtcyBTR0UgaW5pdGlhbGl6YXRpb24gbmVlZGVkIGV2ZXJ5IHRpbWUgYWZ0ZXIgYSBjaGlwIHJlc2V0LgorICoJV2UgZG8gbm90IGluaXRpYWxpemUgYW55IG9mIHRoZSBxdWV1ZSBzZXRzIGhlcmUsIGluc3RlYWQgdGhlIGRyaXZlcgorICoJdG9wLWxldmVsIG11c3QgcmVxdWVzdCB0aG9zZSBpbmRpdmlkdWFsbHkuICBXZSBhbHNvIGRvIG5vdCBlbmFibGUgRE1BCisgKgloZXJlLCB0aGF0IHNob3VsZCBiZSBkb25lIGFmdGVyIHRoZSBxdWV1ZXMgaGF2ZSBiZWVuIHNldCB1cC4KKyAqLwordm9pZCB0M19zZ2VfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9wYXJhbXMgKnApCit7CisJdW5zaWduZWQgaW50IGN0cmwsIHVwcyA9IGZmcyhwY2lfcmVzb3VyY2VfbGVuKGFkYXAtPnBkZXYsIDIpID4+IDEyKTsKKworCWN0cmwgPSBGX0RST1BQS1QgfCBWX1BLVFNISUZUKDIpIHwgRl9GTE1PREUgfCBGX0FWT0lEQ1FPVkZMIHwKKwkgICAgRl9DUUNSRFRDVFJMIHwKKwkgICAgVl9IT1NUUEFHRVNJWkUoUEFHRV9TSElGVCAtIDExKSB8IEZfQklHRU5ESUFOSU5HUkVTUyB8CisJICAgIFZfVVNFUlNQQUNFU0laRSh1cHMgPyB1cHMgLSAxIDogMCkgfCBGX0lTQ1NJQ09BTEVTQ0lORzsKKyNpZiBTR0VfTlVNX0dFTkJJVFMgPT0gMQorCWN0cmwgfD0gRl9FR1JHRU5DVFJMOworI2VuZGlmCisJaWYgKGFkYXAtPnBhcmFtcy5yZXYgPiAwKSB7CisJCWlmICghKGFkYXAtPmZsYWdzICYgKFVTSU5HX01TSVggfCBVU0lOR19NU0kpKSkKKwkJCWN0cmwgfD0gRl9PTkVJTlRNVUxUUSB8IEZfT1BUT05FSU5UTVVMVFE7CisJCWN0cmwgfD0gRl9DUUNSRFRDVFJMIHwgRl9BVk9JRENRT1ZGTDsKKwl9CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfU0dfQ09OVFJPTCwgY3RybCk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfU0dfRUdSX1JDUV9EUkJfVEhSU0gsIFZfSElSQ1FEUkJUSFJTSCg1MTIpIHwKKwkJICAgICBWX0xPUkNRRFJCVEhSU0goNTEyKSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfU0dfVElNRVJfVElDSywgY29yZV90aWNrc19wZXJfdXNlYyhhZGFwKSAvIDEwKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9TR19DTURRX0NSRURJVF9USCwgVl9USFJFU0hPTEQoMzIpIHwKKwkJICAgICBWX1RJTUVPVVQoMjAwICogY29yZV90aWNrc19wZXJfdXNlYyhhZGFwKSkpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1NHX0hJX0RSQl9ISV9USFJTSCwgMTAwMCk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfU0dfSElfRFJCX0xPX1RIUlNILCAyNTYpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1NHX0xPX0RSQl9ISV9USFJTSCwgMTAwMCk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfU0dfTE9fRFJCX0xPX1RIUlNILCAyNTYpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1NHX09DT19CQVNFLCBWX0JBU0UxKDB4ZmZmKSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfU0dfRFJCX1BSSV9USFJFU0gsIDYzICogMTAyNCk7Cit9CisKKy8qKgorICoJdDNfc2dlX3ByZXAgLSBvbmUtdGltZSBTR0UgaW5pdGlhbGl6YXRpb24KKyAqCUBhZGFwOiB0aGUgYXNzb2NpYXRlZCBhZGFwdGVyCisgKglAcDogU0dFIHBhcmFtZXRlcnMKKyAqCisgKglQZXJmb3JtcyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiBvZiBTR0UgU1cgc3RhdGUuICBJbmNsdWRlcyBkZXRlcm1pbmluZworICoJZGVmYXVsdHMgZm9yIHRoZSBhc3NvcnRlZCBTR0UgcGFyYW1ldGVycywgd2hpY2ggYWRtaW5zIGNhbiBjaGFuZ2UgdW50aWwKKyAqCXRoZXkgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgU0dFLgorICovCit2b2lkIF9fZGV2aW5pdCB0M19zZ2VfcHJlcChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9wYXJhbXMgKnApCit7CisJaW50IGk7CisKKwlwLT5tYXhfcGt0X3NpemUgPSAoMTYgKiAxMDI0KSAtIHNpemVvZihzdHJ1Y3QgY3BsX3J4X2RhdGEpIC0KKwkgICAgU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKTsKKworCWZvciAoaSA9IDA7IGkgPCBTR0VfUVNFVFM7ICsraSkgeworCQlzdHJ1Y3QgcXNldF9wYXJhbXMgKnEgPSBwLT5xc2V0ICsgaTsKKworCQlxLT5wb2xsaW5nID0gYWRhcC0+cGFyYW1zLnJldiA+IDA7CisJCXEtPmNvYWxlc2NlX3VzZWNzID0gNTsKKwkJcS0+cnNwcV9zaXplID0gMTAyNDsKKwkJcS0+Zmxfc2l6ZSA9IDQwOTY7CisJCXEtPmp1bWJvX3NpemUgPSA1MTI7CisJCXEtPnR4cV9zaXplW1RYUV9FVEhdID0gMTAyNDsKKwkJcS0+dHhxX3NpemVbVFhRX09GTERdID0gMTAyNDsKKwkJcS0+dHhxX3NpemVbVFhRX0NUUkxdID0gMjU2OworCQlxLT5jb25nX3RocmVzID0gMDsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmYWRhcC0+c2dlLnJlZ19sb2NrKTsKK30KKworLyoqCisgKgl0M19nZXRfZGVzYyAtIGR1bXAgYW4gU0dFIGRlc2NyaXB0b3IgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcworICoJQHFzOiB0aGUgcXVldWUgc2V0CisgKglAcW51bTogaWRlbnRpZmllcyB0aGUgc3BlY2lmaWMgcXVldWUgKDAuLjI6IFR4LCAzOnJlc3BvbnNlLCA0Li41OiBSeCkKKyAqCUBpZHg6IHRoZSBkZXNjcmlwdG9yIGluZGV4IGluIHRoZSBxdWV1ZQorICoJQGRhdGE6IHdoZXJlIHRvIGR1bXAgdGhlIGRlc2NyaXB0b3IgY29udGVudHMKKyAqCisgKglEdW1wcyB0aGUgY29udGVudHMgb2YgYSBIVyBkZXNjcmlwdG9yIG9mIGFuIFNHRSBxdWV1ZS4gIFJldHVybnMgdGhlCisgKglzaXplIG9mIHRoZSBkZXNjcmlwdG9yLgorICovCitpbnQgdDNfZ2V0X2Rlc2MoY29uc3Qgc3RydWN0IHNnZV9xc2V0ICpxcywgdW5zaWduZWQgaW50IHFudW0sIHVuc2lnbmVkIGludCBpZHgsCisJCXVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisJaWYgKHFudW0gPj0gNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocW51bSA8IDMpIHsKKwkJaWYgKCFxcy0+dHhxW3FudW1dLmRlc2MgfHwgaWR4ID49IHFzLT50eHFbcW51bV0uc2l6ZSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1jcHkoZGF0YSwgJnFzLT50eHFbcW51bV0uZGVzY1tpZHhdLCBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpKTsKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgdHhfZGVzYyk7CisJfQorCisJaWYgKHFudW0gPT0gMykgeworCQlpZiAoIXFzLT5yc3BxLmRlc2MgfHwgaWR4ID49IHFzLT5yc3BxLnNpemUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWVtY3B5KGRhdGEsICZxcy0+cnNwcS5kZXNjW2lkeF0sIHNpemVvZihzdHJ1Y3QgcnNwX2Rlc2MpKTsKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcnNwX2Rlc2MpOworCX0KKworCXFudW0gLT0gNDsKKwlpZiAoIXFzLT5mbFtxbnVtXS5kZXNjIHx8IGlkeCA+PSBxcy0+ZmxbcW51bV0uc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtY3B5KGRhdGEsICZxcy0+ZmxbcW51bV0uZGVzY1tpZHhdLCBzaXplb2Yoc3RydWN0IHJ4X2Rlc2MpKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByeF9kZXNjKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3NnZV9kZWZzLmggYi9kcml2ZXJzL25ldC9jeGdiMy9zZ2VfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDg2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy9zZ2VfZGVmcy5oCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIC0tLSBhbnkgY2hhbmdlcyB3aWxsIGJlIGxvc3QuCisgKi8KKworI2lmbmRlZiBfU0dFX0RFRlNfSAorI2RlZmluZSBfU0dFX0RFRlNfSAorCisjZGVmaW5lIFNfRUNfQ1JFRElUUyAgICAwCisjZGVmaW5lIE1fRUNfQ1JFRElUUyAgICAweDdGRkYKKyNkZWZpbmUgVl9FQ19DUkVESVRTKHgpICgoeCkgPDwgU19FQ19DUkVESVRTKQorI2RlZmluZSBHX0VDX0NSRURJVFMoeCkgKCgoeCkgPj4gU19FQ19DUkVESVRTKSAmIE1fRUNfQ1JFRElUUykKKworI2RlZmluZSBTX0VDX0dUUyAgICAxNQorI2RlZmluZSBWX0VDX0dUUyh4KSAoKHgpIDw8IFNfRUNfR1RTKQorI2RlZmluZSBGX0VDX0dUUyAgICBWX0VDX0dUUygxVSkKKworI2RlZmluZSBTX0VDX0lOREVYICAgIDE2CisjZGVmaW5lIE1fRUNfSU5ERVggICAgMHhGRkZGCisjZGVmaW5lIFZfRUNfSU5ERVgoeCkgKCh4KSA8PCBTX0VDX0lOREVYKQorI2RlZmluZSBHX0VDX0lOREVYKHgpICgoKHgpID4+IFNfRUNfSU5ERVgpICYgTV9FQ19JTkRFWCkKKworI2RlZmluZSBTX0VDX1NJWkUgICAgMAorI2RlZmluZSBNX0VDX1NJWkUgICAgMHhGRkZGCisjZGVmaW5lIFZfRUNfU0laRSh4KSAoKHgpIDw8IFNfRUNfU0laRSkKKyNkZWZpbmUgR19FQ19TSVpFKHgpICgoKHgpID4+IFNfRUNfU0laRSkgJiBNX0VDX1NJWkUpCisKKyNkZWZpbmUgU19FQ19CQVNFX0xPICAgIDE2CisjZGVmaW5lIE1fRUNfQkFTRV9MTyAgICAweEZGRkYKKyNkZWZpbmUgVl9FQ19CQVNFX0xPKHgpICgoeCkgPDwgU19FQ19CQVNFX0xPKQorI2RlZmluZSBHX0VDX0JBU0VfTE8oeCkgKCgoeCkgPj4gU19FQ19CQVNFX0xPKSAmIE1fRUNfQkFTRV9MTykKKworI2RlZmluZSBTX0VDX0JBU0VfSEkgICAgMAorI2RlZmluZSBNX0VDX0JBU0VfSEkgICAgMHhGCisjZGVmaW5lIFZfRUNfQkFTRV9ISSh4KSAoKHgpIDw8IFNfRUNfQkFTRV9ISSkKKyNkZWZpbmUgR19FQ19CQVNFX0hJKHgpICgoKHgpID4+IFNfRUNfQkFTRV9ISSkgJiBNX0VDX0JBU0VfSEkpCisKKyNkZWZpbmUgU19FQ19SRVNQUSAgICA0CisjZGVmaW5lIE1fRUNfUkVTUFEgICAgMHg3CisjZGVmaW5lIFZfRUNfUkVTUFEoeCkgKCh4KSA8PCBTX0VDX1JFU1BRKQorI2RlZmluZSBHX0VDX1JFU1BRKHgpICgoKHgpID4+IFNfRUNfUkVTUFEpICYgTV9FQ19SRVNQUSkKKworI2RlZmluZSBTX0VDX1RZUEUgICAgNworI2RlZmluZSBNX0VDX1RZUEUgICAgMHg3CisjZGVmaW5lIFZfRUNfVFlQRSh4KSAoKHgpIDw8IFNfRUNfVFlQRSkKKyNkZWZpbmUgR19FQ19UWVBFKHgpICgoKHgpID4+IFNfRUNfVFlQRSkgJiBNX0VDX1RZUEUpCisKKyNkZWZpbmUgU19FQ19HRU4gICAgMTAKKyNkZWZpbmUgVl9FQ19HRU4oeCkgKCh4KSA8PCBTX0VDX0dFTikKKyNkZWZpbmUgRl9FQ19HRU4gICAgVl9FQ19HRU4oMVUpCisKKyNkZWZpbmUgU19FQ19VUF9UT0tFTiAgICAxMQorI2RlZmluZSBNX0VDX1VQX1RPS0VOICAgIDB4RkZGRkYKKyNkZWZpbmUgVl9FQ19VUF9UT0tFTih4KSAoKHgpIDw8IFNfRUNfVVBfVE9LRU4pCisjZGVmaW5lIEdfRUNfVVBfVE9LRU4oeCkgKCgoeCkgPj4gU19FQ19VUF9UT0tFTikgJiBNX0VDX1VQX1RPS0VOKQorCisjZGVmaW5lIFNfRUNfVkFMSUQgICAgMzEKKyNkZWZpbmUgVl9FQ19WQUxJRCh4KSAoKHgpIDw8IFNfRUNfVkFMSUQpCisjZGVmaW5lIEZfRUNfVkFMSUQgICAgVl9FQ19WQUxJRCgxVSkKKworI2RlZmluZSBTX1JRX01TSV9WRUMgICAgMjAKKyNkZWZpbmUgTV9SUV9NU0lfVkVDICAgIDB4M0YKKyNkZWZpbmUgVl9SUV9NU0lfVkVDKHgpICgoeCkgPDwgU19SUV9NU0lfVkVDKQorI2RlZmluZSBHX1JRX01TSV9WRUMoeCkgKCgoeCkgPj4gU19SUV9NU0lfVkVDKSAmIE1fUlFfTVNJX1ZFQykKKworI2RlZmluZSBTX1JRX0lOVFJfRU4gICAgMjYKKyNkZWZpbmUgVl9SUV9JTlRSX0VOKHgpICgoeCkgPDwgU19SUV9JTlRSX0VOKQorI2RlZmluZSBGX1JRX0lOVFJfRU4gICAgVl9SUV9JTlRSX0VOKDFVKQorCisjZGVmaW5lIFNfUlFfR0VOICAgIDI4CisjZGVmaW5lIFZfUlFfR0VOKHgpICgoeCkgPDwgU19SUV9HRU4pCisjZGVmaW5lIEZfUlFfR0VOICAgIFZfUlFfR0VOKDFVKQorCisjZGVmaW5lIFNfQ1FfSU5ERVggICAgMAorI2RlZmluZSBNX0NRX0lOREVYICAgIDB4RkZGRgorI2RlZmluZSBWX0NRX0lOREVYKHgpICgoeCkgPDwgU19DUV9JTkRFWCkKKyNkZWZpbmUgR19DUV9JTkRFWCh4KSAoKCh4KSA+PiBTX0NRX0lOREVYKSAmIE1fQ1FfSU5ERVgpCisKKyNkZWZpbmUgU19DUV9TSVpFICAgIDE2CisjZGVmaW5lIE1fQ1FfU0laRSAgICAweEZGRkYKKyNkZWZpbmUgVl9DUV9TSVpFKHgpICgoeCkgPDwgU19DUV9TSVpFKQorI2RlZmluZSBHX0NRX1NJWkUoeCkgKCgoeCkgPj4gU19DUV9TSVpFKSAmIE1fQ1FfU0laRSkKKworI2RlZmluZSBTX0NRX0JBU0VfSEkgICAgMAorI2RlZmluZSBNX0NRX0JBU0VfSEkgICAgMHhGRkZGRgorI2RlZmluZSBWX0NRX0JBU0VfSEkoeCkgKCh4KSA8PCBTX0NRX0JBU0VfSEkpCisjZGVmaW5lIEdfQ1FfQkFTRV9ISSh4KSAoKCh4KSA+PiBTX0NRX0JBU0VfSEkpICYgTV9DUV9CQVNFX0hJKQorCisjZGVmaW5lIFNfQ1FfUlNQUSAgICAyMAorI2RlZmluZSBNX0NRX1JTUFEgICAgMHgzRgorI2RlZmluZSBWX0NRX1JTUFEoeCkgKCh4KSA8PCBTX0NRX1JTUFEpCisjZGVmaW5lIEdfQ1FfUlNQUSh4KSAoKCh4KSA+PiBTX0NRX1JTUFEpICYgTV9DUV9SU1BRKQorCisjZGVmaW5lIFNfQ1FfQVNZTkNfTk9USUYgICAgMjYKKyNkZWZpbmUgVl9DUV9BU1lOQ19OT1RJRih4KSAoKHgpIDw8IFNfQ1FfQVNZTkNfTk9USUYpCisjZGVmaW5lIEZfQ1FfQVNZTkNfTk9USUYgICAgVl9DUV9BU1lOQ19OT1RJRigxVSkKKworI2RlZmluZSBTX0NRX0FSTUVEICAgIDI3CisjZGVmaW5lIFZfQ1FfQVJNRUQoeCkgKCh4KSA8PCBTX0NRX0FSTUVEKQorI2RlZmluZSBGX0NRX0FSTUVEICAgIFZfQ1FfQVJNRUQoMVUpCisKKyNkZWZpbmUgU19DUV9BU1lOQ19OT1RJRl9TT0wgICAgMjgKKyNkZWZpbmUgVl9DUV9BU1lOQ19OT1RJRl9TT0woeCkgKCh4KSA8PCBTX0NRX0FTWU5DX05PVElGX1NPTCkKKyNkZWZpbmUgRl9DUV9BU1lOQ19OT1RJRl9TT0wgICAgVl9DUV9BU1lOQ19OT1RJRl9TT0woMVUpCisKKyNkZWZpbmUgU19DUV9HRU4gICAgMjkKKyNkZWZpbmUgVl9DUV9HRU4oeCkgKCh4KSA8PCBTX0NRX0dFTikKKyNkZWZpbmUgRl9DUV9HRU4gICAgVl9DUV9HRU4oMVUpCisKKyNkZWZpbmUgU19DUV9PVkVSRkxPV19NT0RFICAgIDMxCisjZGVmaW5lIFZfQ1FfT1ZFUkZMT1dfTU9ERSh4KSAoKHgpIDw8IFNfQ1FfT1ZFUkZMT1dfTU9ERSkKKyNkZWZpbmUgRl9DUV9PVkVSRkxPV19NT0RFICAgIFZfQ1FfT1ZFUkZMT1dfTU9ERSgxVSkKKworI2RlZmluZSBTX0NRX0NSRURJVFMgICAgMAorI2RlZmluZSBNX0NRX0NSRURJVFMgICAgMHhGRkZGCisjZGVmaW5lIFZfQ1FfQ1JFRElUUyh4KSAoKHgpIDw8IFNfQ1FfQ1JFRElUUykKKyNkZWZpbmUgR19DUV9DUkVESVRTKHgpICgoKHgpID4+IFNfQ1FfQ1JFRElUUykgJiBNX0NRX0NSRURJVFMpCisKKyNkZWZpbmUgU19DUV9DUkVESVRfVEhSRVMgICAgMTYKKyNkZWZpbmUgTV9DUV9DUkVESVRfVEhSRVMgICAgMHgxRkZGCisjZGVmaW5lIFZfQ1FfQ1JFRElUX1RIUkVTKHgpICgoeCkgPDwgU19DUV9DUkVESVRfVEhSRVMpCisjZGVmaW5lIEdfQ1FfQ1JFRElUX1RIUkVTKHgpICgoKHgpID4+IFNfQ1FfQ1JFRElUX1RIUkVTKSAmIE1fQ1FfQ1JFRElUX1RIUkVTKQorCisjZGVmaW5lIFNfRkxfQkFTRV9ISSAgICAwCisjZGVmaW5lIE1fRkxfQkFTRV9ISSAgICAweEZGRkZGCisjZGVmaW5lIFZfRkxfQkFTRV9ISSh4KSAoKHgpIDw8IFNfRkxfQkFTRV9ISSkKKyNkZWZpbmUgR19GTF9CQVNFX0hJKHgpICgoKHgpID4+IFNfRkxfQkFTRV9ISSkgJiBNX0ZMX0JBU0VfSEkpCisKKyNkZWZpbmUgU19GTF9JTkRFWF9MTyAgICAyMAorI2RlZmluZSBNX0ZMX0lOREVYX0xPICAgIDB4RkZGCisjZGVmaW5lIFZfRkxfSU5ERVhfTE8oeCkgKCh4KSA8PCBTX0ZMX0lOREVYX0xPKQorI2RlZmluZSBHX0ZMX0lOREVYX0xPKHgpICgoKHgpID4+IFNfRkxfSU5ERVhfTE8pICYgTV9GTF9JTkRFWF9MTykKKworI2RlZmluZSBTX0ZMX0lOREVYX0hJICAgIDAKKyNkZWZpbmUgTV9GTF9JTkRFWF9ISSAgICAweEYKKyNkZWZpbmUgVl9GTF9JTkRFWF9ISSh4KSAoKHgpIDw8IFNfRkxfSU5ERVhfSEkpCisjZGVmaW5lIEdfRkxfSU5ERVhfSEkoeCkgKCgoeCkgPj4gU19GTF9JTkRFWF9ISSkgJiBNX0ZMX0lOREVYX0hJKQorCisjZGVmaW5lIFNfRkxfU0laRSAgICA0CisjZGVmaW5lIE1fRkxfU0laRSAgICAweEZGRkYKKyNkZWZpbmUgVl9GTF9TSVpFKHgpICgoeCkgPDwgU19GTF9TSVpFKQorI2RlZmluZSBHX0ZMX1NJWkUoeCkgKCgoeCkgPj4gU19GTF9TSVpFKSAmIE1fRkxfU0laRSkKKworI2RlZmluZSBTX0ZMX0dFTiAgICAyMAorI2RlZmluZSBWX0ZMX0dFTih4KSAoKHgpIDw8IFNfRkxfR0VOKQorI2RlZmluZSBGX0ZMX0dFTiAgICBWX0ZMX0dFTigxVSkKKworI2RlZmluZSBTX0ZMX0VOVFJZX1NJWkVfTE8gICAgMjEKKyNkZWZpbmUgTV9GTF9FTlRSWV9TSVpFX0xPICAgIDB4N0ZGCisjZGVmaW5lIFZfRkxfRU5UUllfU0laRV9MTyh4KSAoKHgpIDw8IFNfRkxfRU5UUllfU0laRV9MTykKKyNkZWZpbmUgR19GTF9FTlRSWV9TSVpFX0xPKHgpICgoKHgpID4+IFNfRkxfRU5UUllfU0laRV9MTykgJiBNX0ZMX0VOVFJZX1NJWkVfTE8pCisKKyNkZWZpbmUgU19GTF9FTlRSWV9TSVpFX0hJICAgIDAKKyNkZWZpbmUgTV9GTF9FTlRSWV9TSVpFX0hJICAgIDB4MUZGRkZGCisjZGVmaW5lIFZfRkxfRU5UUllfU0laRV9ISSh4KSAoKHgpIDw8IFNfRkxfRU5UUllfU0laRV9ISSkKKyNkZWZpbmUgR19GTF9FTlRSWV9TSVpFX0hJKHgpICgoKHgpID4+IFNfRkxfRU5UUllfU0laRV9ISSkgJiBNX0ZMX0VOVFJZX1NJWkVfSEkpCisKKyNkZWZpbmUgU19GTF9DT05HX1RIUkVTICAgIDIxCisjZGVmaW5lIE1fRkxfQ09OR19USFJFUyAgICAweDNGRgorI2RlZmluZSBWX0ZMX0NPTkdfVEhSRVMoeCkgKCh4KSA8PCBTX0ZMX0NPTkdfVEhSRVMpCisjZGVmaW5lIEdfRkxfQ09OR19USFJFUyh4KSAoKCh4KSA+PiBTX0ZMX0NPTkdfVEhSRVMpICYgTV9GTF9DT05HX1RIUkVTKQorCisjZGVmaW5lIFNfRkxfR1RTICAgIDMxCisjZGVmaW5lIFZfRkxfR1RTKHgpICgoeCkgPDwgU19GTF9HVFMpCisjZGVmaW5lIEZfRkxfR1RTICAgIFZfRkxfR1RTKDFVKQorCisjZGVmaW5lIFNfRkxEX0dFTjEgICAgMzEKKyNkZWZpbmUgVl9GTERfR0VOMSh4KSAoKHgpIDw8IFNfRkxEX0dFTjEpCisjZGVmaW5lIEZfRkxEX0dFTjEgICAgVl9GTERfR0VOMSgxVSkKKworI2RlZmluZSBTX0ZMRF9HRU4yICAgIDAKKyNkZWZpbmUgVl9GTERfR0VOMih4KSAoKHgpIDw8IFNfRkxEX0dFTjIpCisjZGVmaW5lIEZfRkxEX0dFTjIgICAgVl9GTERfR0VOMigxVSkKKworI2RlZmluZSBTX1JTUERfVFhRMV9DUiAgICAwCisjZGVmaW5lIE1fUlNQRF9UWFExX0NSICAgIDB4N0YKKyNkZWZpbmUgVl9SU1BEX1RYUTFfQ1IoeCkgKCh4KSA8PCBTX1JTUERfVFhRMV9DUikKKyNkZWZpbmUgR19SU1BEX1RYUTFfQ1IoeCkgKCgoeCkgPj4gU19SU1BEX1RYUTFfQ1IpICYgTV9SU1BEX1RYUTFfQ1IpCisKKyNkZWZpbmUgU19SU1BEX1RYUTFfR1RTICAgIDcKKyNkZWZpbmUgVl9SU1BEX1RYUTFfR1RTKHgpICgoeCkgPDwgU19SU1BEX1RYUTFfR1RTKQorI2RlZmluZSBGX1JTUERfVFhRMV9HVFMgICAgVl9SU1BEX1RYUTFfR1RTKDFVKQorCisjZGVmaW5lIFNfUlNQRF9UWFEyX0NSICAgIDgKKyNkZWZpbmUgTV9SU1BEX1RYUTJfQ1IgICAgMHg3RgorI2RlZmluZSBWX1JTUERfVFhRMl9DUih4KSAoKHgpIDw8IFNfUlNQRF9UWFEyX0NSKQorI2RlZmluZSBHX1JTUERfVFhRMl9DUih4KSAoKCh4KSA+PiBTX1JTUERfVFhRMl9DUikgJiBNX1JTUERfVFhRMl9DUikKKworI2RlZmluZSBTX1JTUERfVFhRMl9HVFMgICAgMTUKKyNkZWZpbmUgVl9SU1BEX1RYUTJfR1RTKHgpICgoeCkgPDwgU19SU1BEX1RYUTJfR1RTKQorI2RlZmluZSBGX1JTUERfVFhRMl9HVFMgICAgVl9SU1BEX1RYUTJfR1RTKDFVKQorCisjZGVmaW5lIFNfUlNQRF9UWFEwX0NSICAgIDE2CisjZGVmaW5lIE1fUlNQRF9UWFEwX0NSICAgIDB4N0YKKyNkZWZpbmUgVl9SU1BEX1RYUTBfQ1IoeCkgKCh4KSA8PCBTX1JTUERfVFhRMF9DUikKKyNkZWZpbmUgR19SU1BEX1RYUTBfQ1IoeCkgKCgoeCkgPj4gU19SU1BEX1RYUTBfQ1IpICYgTV9SU1BEX1RYUTBfQ1IpCisKKyNkZWZpbmUgU19SU1BEX1RYUTBfR1RTICAgIDIzCisjZGVmaW5lIFZfUlNQRF9UWFEwX0dUUyh4KSAoKHgpIDw8IFNfUlNQRF9UWFEwX0dUUykKKyNkZWZpbmUgRl9SU1BEX1RYUTBfR1RTICAgIFZfUlNQRF9UWFEwX0dUUygxVSkKKworI2RlZmluZSBTX1JTUERfRU9QICAgIDI0CisjZGVmaW5lIFZfUlNQRF9FT1AoeCkgKCh4KSA8PCBTX1JTUERfRU9QKQorI2RlZmluZSBGX1JTUERfRU9QICAgIFZfUlNQRF9FT1AoMVUpCisKKyNkZWZpbmUgU19SU1BEX1NPUCAgICAyNQorI2RlZmluZSBWX1JTUERfU09QKHgpICgoeCkgPDwgU19SU1BEX1NPUCkKKyNkZWZpbmUgRl9SU1BEX1NPUCAgICBWX1JTUERfU09QKDFVKQorCisjZGVmaW5lIFNfUlNQRF9BU1lOQ19OT1RJRiAgICAyNgorI2RlZmluZSBWX1JTUERfQVNZTkNfTk9USUYoeCkgKCh4KSA8PCBTX1JTUERfQVNZTkNfTk9USUYpCisjZGVmaW5lIEZfUlNQRF9BU1lOQ19OT1RJRiAgICBWX1JTUERfQVNZTkNfTk9USUYoMVUpCisKKyNkZWZpbmUgU19SU1BEX0ZMMF9HVFMgICAgMjcKKyNkZWZpbmUgVl9SU1BEX0ZMMF9HVFMoeCkgKCh4KSA8PCBTX1JTUERfRkwwX0dUUykKKyNkZWZpbmUgRl9SU1BEX0ZMMF9HVFMgICAgVl9SU1BEX0ZMMF9HVFMoMVUpCisKKyNkZWZpbmUgU19SU1BEX0ZMMV9HVFMgICAgMjgKKyNkZWZpbmUgVl9SU1BEX0ZMMV9HVFMoeCkgKCh4KSA8PCBTX1JTUERfRkwxX0dUUykKKyNkZWZpbmUgRl9SU1BEX0ZMMV9HVFMgICAgVl9SU1BEX0ZMMV9HVFMoMVUpCisKKyNkZWZpbmUgU19SU1BEX0lNTV9EQVRBX1ZBTElEICAgIDI5CisjZGVmaW5lIFZfUlNQRF9JTU1fREFUQV9WQUxJRCh4KSAoKHgpIDw8IFNfUlNQRF9JTU1fREFUQV9WQUxJRCkKKyNkZWZpbmUgRl9SU1BEX0lNTV9EQVRBX1ZBTElEICAgIFZfUlNQRF9JTU1fREFUQV9WQUxJRCgxVSkKKworI2RlZmluZSBTX1JTUERfT0ZGTE9BRCAgICAzMAorI2RlZmluZSBWX1JTUERfT0ZGTE9BRCh4KSAoKHgpIDw8IFNfUlNQRF9PRkZMT0FEKQorI2RlZmluZSBGX1JTUERfT0ZGTE9BRCAgICBWX1JTUERfT0ZGTE9BRCgxVSkKKworI2RlZmluZSBTX1JTUERfR0VOMSAgICAzMQorI2RlZmluZSBWX1JTUERfR0VOMSh4KSAoKHgpIDw8IFNfUlNQRF9HRU4xKQorI2RlZmluZSBGX1JTUERfR0VOMSAgICBWX1JTUERfR0VOMSgxVSkKKworI2RlZmluZSBTX1JTUERfTEVOICAgIDAKKyNkZWZpbmUgTV9SU1BEX0xFTiAgICAweDdGRkZGRkZGCisjZGVmaW5lIFZfUlNQRF9MRU4oeCkgKCh4KSA8PCBTX1JTUERfTEVOKQorI2RlZmluZSBHX1JTUERfTEVOKHgpICgoKHgpID4+IFNfUlNQRF9MRU4pICYgTV9SU1BEX0xFTikKKworI2RlZmluZSBTX1JTUERfRkxRICAgIDMxCisjZGVmaW5lIFZfUlNQRF9GTFEoeCkgKCh4KSA8PCBTX1JTUERfRkxRKQorI2RlZmluZSBGX1JTUERfRkxRICAgIFZfUlNQRF9GTFEoMVUpCisKKyNkZWZpbmUgU19SU1BEX0dFTjIgICAgMAorI2RlZmluZSBWX1JTUERfR0VOMih4KSAoKHgpIDw8IFNfUlNQRF9HRU4yKQorI2RlZmluZSBGX1JTUERfR0VOMiAgICBWX1JTUERfR0VOMigxVSkKKworI2RlZmluZSBTX1JTUERfSU5SX1ZFQyAgICAxCisjZGVmaW5lIE1fUlNQRF9JTlJfVkVDICAgIDB4N0YKKyNkZWZpbmUgVl9SU1BEX0lOUl9WRUMoeCkgKCh4KSA8PCBTX1JTUERfSU5SX1ZFQykKKyNkZWZpbmUgR19SU1BEX0lOUl9WRUMoeCkgKCgoeCkgPj4gU19SU1BEX0lOUl9WRUMpICYgTV9SU1BEX0lOUl9WRUMpCisKKyNlbmRpZgkJCQkvKiBfU0dFX0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvdDNfY3BsLmggYi9kcml2ZXJzL25ldC9jeGdiMy90M19jcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ExYTMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvdDNfY3BsLmgKQEAgLTAsMCArMSwxNDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgVDNfQ1BMX0gKKyNkZWZpbmUgVDNfQ1BMX0gKKworI2lmICFkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkgJiYgIWRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQorIyBpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjZW5kaWYKKworZW51bSBDUExfb3Bjb2RlIHsKKwlDUExfUEFTU19PUEVOX1JFUSA9IDB4MSwKKwlDUExfUEFTU19BQ0NFUFRfUlBMID0gMHgyLAorCUNQTF9BQ1RfT1BFTl9SRVEgPSAweDMsCisJQ1BMX1NFVF9UQ0IgPSAweDQsCisJQ1BMX1NFVF9UQ0JfRklFTEQgPSAweDUsCisJQ1BMX0dFVF9UQ0IgPSAweDYsCisJQ1BMX1BDTUQgPSAweDcsCisJQ1BMX0NMT1NFX0NPTl9SRVEgPSAweDgsCisJQ1BMX0NMT1NFX0xJU1RTUlZfUkVRID0gMHg5LAorCUNQTF9BQk9SVF9SRVEgPSAweEEsCisJQ1BMX0FCT1JUX1JQTCA9IDB4QiwKKwlDUExfVFhfREFUQSA9IDB4QywKKwlDUExfUlhfREFUQV9BQ0sgPSAweEQsCisJQ1BMX1RYX1BLVCA9IDB4RSwKKwlDUExfUlRFX0RFTEVURV9SRVEgPSAweEYsCisJQ1BMX1JURV9XUklURV9SRVEgPSAweDEwLAorCUNQTF9SVEVfUkVBRF9SRVEgPSAweDExLAorCUNQTF9MMlRfV1JJVEVfUkVRID0gMHgxMiwKKwlDUExfTDJUX1JFQURfUkVRID0gMHgxMywKKwlDUExfU01UX1dSSVRFX1JFUSA9IDB4MTQsCisJQ1BMX1NNVF9SRUFEX1JFUSA9IDB4MTUsCisJQ1BMX1RYX1BLVF9MU08gPSAweDE2LAorCUNQTF9QQ01EX1JFQUQgPSAweDE3LAorCUNQTF9CQVJSSUVSID0gMHgxOCwKKwlDUExfVElEX1JFTEVBU0UgPSAweDFBLAorCisJQ1BMX0NMT1NFX0xJU1RTUlZfUlBMID0gMHgyMCwKKwlDUExfRVJST1IgPSAweDIxLAorCUNQTF9HRVRfVENCX1JQTCA9IDB4MjIsCisJQ1BMX0wyVF9XUklURV9SUEwgPSAweDIzLAorCUNQTF9QQ01EX1JFQURfUlBMID0gMHgyNCwKKwlDUExfUENNRF9SUEwgPSAweDI1LAorCUNQTF9QRUVSX0NMT1NFID0gMHgyNiwKKwlDUExfUlRFX0RFTEVURV9SUEwgPSAweDI3LAorCUNQTF9SVEVfV1JJVEVfUlBMID0gMHgyOCwKKwlDUExfUlhfRERQX0NPTVBMRVRFID0gMHgyOSwKKwlDUExfUlhfUEhZU19BRERSID0gMHgyQSwKKwlDUExfUlhfUEtUID0gMHgyQiwKKwlDUExfUlhfVVJHX05PVElGWSA9IDB4MkMsCisJQ1BMX1NFVF9UQ0JfUlBMID0gMHgyRCwKKwlDUExfU01UX1dSSVRFX1JQTCA9IDB4MkUsCisJQ1BMX1RYX0RBVEFfQUNLID0gMHgyRiwKKworCUNQTF9BQk9SVF9SRVFfUlNTID0gMHgzMCwKKwlDUExfQUJPUlRfUlBMX1JTUyA9IDB4MzEsCisJQ1BMX0NMT1NFX0NPTl9SUEwgPSAweDMyLAorCUNQTF9JU0NTSV9IRFIgPSAweDMzLAorCUNQTF9MMlRfUkVBRF9SUEwgPSAweDM0LAorCUNQTF9SRE1BX0NRRSA9IDB4MzUsCisJQ1BMX1JETUFfQ1FFX1JFQURfUlNQID0gMHgzNiwKKwlDUExfUkRNQV9DUUVfRVJSID0gMHgzNywKKwlDUExfUlRFX1JFQURfUlBMID0gMHgzOCwKKwlDUExfUlhfREFUQSA9IDB4MzksCisKKwlDUExfQUNUX09QRU5fUlBMID0gMHg0MCwKKwlDUExfUEFTU19PUEVOX1JQTCA9IDB4NDEsCisJQ1BMX1JYX0RBVEFfRERQID0gMHg0MiwKKwlDUExfU01UX1JFQURfUlBMID0gMHg0MywKKworCUNQTF9BQ1RfRVNUQUJMSVNIID0gMHg1MCwKKwlDUExfUEFTU19FU1RBQkxJU0ggPSAweDUxLAorCisJQ1BMX1BBU1NfQUNDRVBUX1JFUSA9IDB4NzAsCisKKwlDUExfQVNZTkNfTk9USUYgPSAweDgwLAkvKiBmYWtlIG9wY29kZSBmb3IgYXN5bmMgbm90aWZpY2F0aW9ucyAqLworCisJQ1BMX1RYX0RNQV9BQ0sgPSAweEEwLAorCUNQTF9SRE1BX1JFQURfUkVRID0gMHhBMSwKKwlDUExfUkRNQV9URVJNSU5BVEUgPSAweEEyLAorCUNQTF9UUkFDRV9QS1QgPSAweEEzLAorCUNQTF9SRE1BX0VDX1NUQVRVUyA9IDB4QTUsCisKKwlOVU1fQ1BMX0NNRFMJCS8qIG11c3QgYmUgbGFzdCBhbmQgcHJldmlvdXMgZW50cmllcyBtdXN0IGJlIHNvcnRlZCAqLworfTsKKworZW51bSBDUExfZXJyb3IgeworCUNQTF9FUlJfTk9ORSA9IDAsCisJQ1BMX0VSUl9UQ0FNX1BBUklUWSA9IDEsCisJQ1BMX0VSUl9UQ0FNX0ZVTEwgPSAzLAorCUNQTF9FUlJfQ09OTl9SRVNFVCA9IDIwLAorCUNQTF9FUlJfQ09OTl9FWElTVCA9IDIyLAorCUNQTF9FUlJfQVJQX01JU1MgPSAyMywKKwlDUExfRVJSX0JBRF9TWU4gPSAyNCwKKwlDUExfRVJSX0NPTk5fVElNRURPVVQgPSAzMCwKKwlDUExfRVJSX1hNSVRfVElNRURPVVQgPSAzMSwKKwlDUExfRVJSX1BFUlNJU1RfVElNRURPVVQgPSAzMiwKKwlDUExfRVJSX0ZJTldBSVQyX1RJTUVET1VUID0gMzMsCisJQ1BMX0VSUl9LRUVQQUxJVkVfVElNRURPVVQgPSAzNCwKKwlDUExfRVJSX1JUWF9ORUdfQURWSUNFID0gMzUsCisJQ1BMX0VSUl9QRVJTSVNUX05FR19BRFZJQ0UgPSAzNiwKKwlDUExfRVJSX0FCT1JUX0ZBSUxFRCA9IDQyLAorCUNQTF9FUlJfR0VORVJBTCA9IDk5Cit9OworCitlbnVtIHsKKwlDUExfQ09OTl9QT0xJQ1lfQVVUTyA9IDAsCisJQ1BMX0NPTk5fUE9MSUNZX0FTSyA9IDEsCisJQ1BMX0NPTk5fUE9MSUNZX0RFTlkgPSAzCit9OworCitlbnVtIHsKKwlVTFBfTU9ERV9OT05FID0gMCwKKwlVTFBfTU9ERV9JU0NTSSA9IDIsCisJVUxQX01PREVfUkRNQSA9IDQsCisJVUxQX01PREVfVENQRERQID0gNQorfTsKKworZW51bSB7CisJVUxQX0NSQ19IRUFERVIgPSAxIDw8IDAsCisJVUxQX0NSQ19EQVRBID0gMSA8PCAxCit9OworCitlbnVtIHsKKwlDUExfUEFTU19PUEVOX0FDQ0VQVCwKKwlDUExfUEFTU19PUEVOX1JFSkVDVAorfTsKKworZW51bSB7CisJQ1BMX0FCT1JUX1NFTkRfUlNUID0gMCwKKwlDUExfQUJPUlRfTk9fUlNULAorCUNQTF9BQk9SVF9QT1NUX0NMT1NFX1JFUSA9IDIKK307CisKK2VudW0gewkJCQkvKiBUWF9QS1RfTFNPIGV0aGVybmV0IHR5cGVzICovCisJQ1BMX0VUSF9JSSwKKwlDUExfRVRIX0lJX1ZMQU4sCisJQ1BMX0VUSF84MDJfMywKKwlDUExfRVRIXzgwMl8zX1ZMQU4KK307CisKK2VudW0gewkJCQkvKiBUQ1AgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobXMgKi8KKwlDT05HX0FMR19SRU5PLAorCUNPTkdfQUxHX1RBSE9FLAorCUNPTkdfQUxHX05FV1JFTk8sCisJQ09OR19BTEdfSElHSFNQRUVECit9OworCit1bmlvbiBvcGNvZGVfdGlkIHsKKwlfX2JlMzIgb3Bjb2RlX3RpZDsKKwlfX3U4IG9wY29kZTsKK307CisKKyNkZWZpbmUgU19PUENPREUgMjQKKyNkZWZpbmUgVl9PUENPREUoeCkgKCh4KSA8PCBTX09QQ09ERSkKKyNkZWZpbmUgR19PUENPREUoeCkgKCgoeCkgPj4gU19PUENPREUpICYgMHhGRikKKyNkZWZpbmUgR19USUQoeCkgICAgKCh4KSAmIDB4RkZGRkZGKQorCisvKiB0aWQgaXMgYXNzdW1lZCB0byBiZSAyNC1iaXRzICovCisjZGVmaW5lIE1LX09QQ09ERV9USUQob3Bjb2RlLCB0aWQpIChWX09QQ09ERShvcGNvZGUpIHwgKHRpZCkpCisKKyNkZWZpbmUgT1BDT0RFX1RJRChjbWQpICgoY21kKS0+b3Qub3Bjb2RlX3RpZCkKKworLyogZXh0cmFjdCB0aGUgVElEIGZyb20gYSBDUEwgY29tbWFuZCAqLworI2RlZmluZSBHRVRfVElEKGNtZCkgKEdfVElEKG50b2hsKE9QQ09ERV9USUQoY21kKSkpKQorCitzdHJ1Y3QgdGNwX29wdGlvbnMgeworCV9fYmUxNiBtc3M7CisJX191OCB3c2Y7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJIF9fdTg6NTsKKwlfX3U4IGVjbjoxOworCV9fdTggc2FjazoxOworCV9fdTggdHN0YW1wOjE7CisjZWxzZQorCV9fdTggdHN0YW1wOjE7CisJX191OCBzYWNrOjE7CisJX191OCBlY246MTsKKwkgX191ODo1OworI2VuZGlmCit9OworCitzdHJ1Y3QgcnNzX2hlYWRlciB7CisJX191OCBvcGNvZGU7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBjcHVfaWR4OjY7CisJX191OCBoYXNoX3R5cGU6MjsKKyNlbHNlCisJX191OCBoYXNoX3R5cGU6MjsKKwlfX3U4IGNwdV9pZHg6NjsKKyNlbmRpZgorCV9fYmUxNiBjcV9pZHg7CisJX19iZTMyIHJzc19oYXNoX3ZhbDsKK307CisKKyNpZm5kZWYgQ0hFTFNJT19GVworc3RydWN0IHdvcmtfcmVxdWVzdF9oZHIgeworCV9fYmUzMiB3cl9oaTsKKwlfX2JlMzIgd3JfbG87Cit9OworCisvKiB3cl9oaSBmaWVsZHMgKi8KKyNkZWZpbmUgU19XUl9TR0VfQ1JFRElUUyAgICAwCisjZGVmaW5lIE1fV1JfU0dFX0NSRURJVFMgICAgMHhGRgorI2RlZmluZSBWX1dSX1NHRV9DUkVESVRTKHgpICgoeCkgPDwgU19XUl9TR0VfQ1JFRElUUykKKyNkZWZpbmUgR19XUl9TR0VfQ1JFRElUUyh4KSAoKCh4KSA+PiBTX1dSX1NHRV9DUkVESVRTKSAmIE1fV1JfU0dFX0NSRURJVFMpCisKKyNkZWZpbmUgU19XUl9TR0xTRkxUICAgIDgKKyNkZWZpbmUgTV9XUl9TR0xTRkxUICAgIDB4RkYKKyNkZWZpbmUgVl9XUl9TR0xTRkxUKHgpICgoeCkgPDwgU19XUl9TR0xTRkxUKQorI2RlZmluZSBHX1dSX1NHTFNGTFQoeCkgKCgoeCkgPj4gU19XUl9TR0xTRkxUKSAmIE1fV1JfU0dMU0ZMVCkKKworI2RlZmluZSBTX1dSX0JDTlRMRkxUICAgIDE2CisjZGVmaW5lIE1fV1JfQkNOVExGTFQgICAgMHhGCisjZGVmaW5lIFZfV1JfQkNOVExGTFQoeCkgKCh4KSA8PCBTX1dSX0JDTlRMRkxUKQorI2RlZmluZSBHX1dSX0JDTlRMRkxUKHgpICgoKHgpID4+IFNfV1JfQkNOVExGTFQpICYgTV9XUl9CQ05UTEZMVCkKKworI2RlZmluZSBTX1dSX0RBVEFUWVBFICAgIDIwCisjZGVmaW5lIFZfV1JfREFUQVRZUEUoeCkgKCh4KSA8PCBTX1dSX0RBVEFUWVBFKQorI2RlZmluZSBGX1dSX0RBVEFUWVBFICAgIFZfV1JfREFUQVRZUEUoMVUpCisKKyNkZWZpbmUgU19XUl9DT01QTCAgICAyMQorI2RlZmluZSBWX1dSX0NPTVBMKHgpICgoeCkgPDwgU19XUl9DT01QTCkKKyNkZWZpbmUgRl9XUl9DT01QTCAgICBWX1dSX0NPTVBMKDFVKQorCisjZGVmaW5lIFNfV1JfRU9QICAgIDIyCisjZGVmaW5lIFZfV1JfRU9QKHgpICgoeCkgPDwgU19XUl9FT1ApCisjZGVmaW5lIEZfV1JfRU9QICAgIFZfV1JfRU9QKDFVKQorCisjZGVmaW5lIFNfV1JfU09QICAgIDIzCisjZGVmaW5lIFZfV1JfU09QKHgpICgoeCkgPDwgU19XUl9TT1ApCisjZGVmaW5lIEZfV1JfU09QICAgIFZfV1JfU09QKDFVKQorCisjZGVmaW5lIFNfV1JfT1AgICAgMjQKKyNkZWZpbmUgTV9XUl9PUCAgICAweEZGCisjZGVmaW5lIFZfV1JfT1AoeCkgKCh4KSA8PCBTX1dSX09QKQorI2RlZmluZSBHX1dSX09QKHgpICgoKHgpID4+IFNfV1JfT1ApICYgTV9XUl9PUCkKKworLyogd3JfbG8gZmllbGRzICovCisjZGVmaW5lIFNfV1JfTEVOICAgIDAKKyNkZWZpbmUgTV9XUl9MRU4gICAgMHhGRgorI2RlZmluZSBWX1dSX0xFTih4KSAoKHgpIDw8IFNfV1JfTEVOKQorI2RlZmluZSBHX1dSX0xFTih4KSAoKCh4KSA+PiBTX1dSX0xFTikgJiBNX1dSX0xFTikKKworI2RlZmluZSBTX1dSX1RJRCAgICA4CisjZGVmaW5lIE1fV1JfVElEICAgIDB4RkZGRkYKKyNkZWZpbmUgVl9XUl9USUQoeCkgKCh4KSA8PCBTX1dSX1RJRCkKKyNkZWZpbmUgR19XUl9USUQoeCkgKCgoeCkgPj4gU19XUl9USUQpICYgTV9XUl9USUQpCisKKyNkZWZpbmUgU19XUl9DUl9GTFVTSCAgICAzMAorI2RlZmluZSBWX1dSX0NSX0ZMVVNIKHgpICgoeCkgPDwgU19XUl9DUl9GTFVTSCkKKyNkZWZpbmUgRl9XUl9DUl9GTFVTSCAgICBWX1dSX0NSX0ZMVVNIKDFVKQorCisjZGVmaW5lIFNfV1JfR0VOICAgIDMxCisjZGVmaW5lIFZfV1JfR0VOKHgpICgoeCkgPDwgU19XUl9HRU4pCisjZGVmaW5lIEZfV1JfR0VOICAgIFZfV1JfR0VOKDFVKQorCisjIGRlZmluZSBXUl9IRFIgc3RydWN0IHdvcmtfcmVxdWVzdF9oZHIgd3IKKyMgZGVmaW5lIFJTU19IRFIKKyNlbHNlCisjIGRlZmluZSBXUl9IRFIKKyMgZGVmaW5lIFJTU19IRFIgc3RydWN0IHJzc19oZWFkZXIgcnNzX2hkcjsKKyNlbmRpZgorCisvKiBvcHRpb24gMCBsb3dlci1oYWxmIGZpZWxkcyAqLworI2RlZmluZSBTX0NQTF9TVEFUVVMgICAgMAorI2RlZmluZSBNX0NQTF9TVEFUVVMgICAgMHhGRgorI2RlZmluZSBWX0NQTF9TVEFUVVMoeCkgKCh4KSA8PCBTX0NQTF9TVEFUVVMpCisjZGVmaW5lIEdfQ1BMX1NUQVRVUyh4KSAoKCh4KSA+PiBTX0NQTF9TVEFUVVMpICYgTV9DUExfU1RBVFVTKQorCisjZGVmaW5lIFNfSU5KRUNUX1RJTUVSICAgIDYKKyNkZWZpbmUgVl9JTkpFQ1RfVElNRVIoeCkgKCh4KSA8PCBTX0lOSkVDVF9USU1FUikKKyNkZWZpbmUgRl9JTkpFQ1RfVElNRVIgICAgVl9JTkpFQ1RfVElNRVIoMVUpCisKKyNkZWZpbmUgU19OT19PRkZMT0FEICAgIDcKKyNkZWZpbmUgVl9OT19PRkZMT0FEKHgpICgoeCkgPDwgU19OT19PRkZMT0FEKQorI2RlZmluZSBGX05PX09GRkxPQUQgICAgVl9OT19PRkZMT0FEKDFVKQorCisjZGVmaW5lIFNfVUxQX01PREUgICAgOAorI2RlZmluZSBNX1VMUF9NT0RFICAgIDB4RgorI2RlZmluZSBWX1VMUF9NT0RFKHgpICgoeCkgPDwgU19VTFBfTU9ERSkKKyNkZWZpbmUgR19VTFBfTU9ERSh4KSAoKCh4KSA+PiBTX1VMUF9NT0RFKSAmIE1fVUxQX01PREUpCisKKyNkZWZpbmUgU19SQ1ZfQlVGU0laICAgIDEyCisjZGVmaW5lIE1fUkNWX0JVRlNJWiAgICAweDNGRkYKKyNkZWZpbmUgVl9SQ1ZfQlVGU0laKHgpICgoeCkgPDwgU19SQ1ZfQlVGU0laKQorI2RlZmluZSBHX1JDVl9CVUZTSVooeCkgKCgoeCkgPj4gU19SQ1ZfQlVGU0laKSAmIE1fUkNWX0JVRlNJWikKKworI2RlZmluZSBTX1RPUyAgICAyNgorI2RlZmluZSBNX1RPUyAgICAweDNGCisjZGVmaW5lIFZfVE9TKHgpICgoeCkgPDwgU19UT1MpCisjZGVmaW5lIEdfVE9TKHgpICgoKHgpID4+IFNfVE9TKSAmIE1fVE9TKQorCisvKiBvcHRpb24gMCB1cHBlci1oYWxmIGZpZWxkcyAqLworI2RlZmluZSBTX0RFTEFDSyAgICAwCisjZGVmaW5lIFZfREVMQUNLKHgpICgoeCkgPDwgU19ERUxBQ0spCisjZGVmaW5lIEZfREVMQUNLICAgIFZfREVMQUNLKDFVKQorCisjZGVmaW5lIFNfTk9fQ09ORyAgICAxCisjZGVmaW5lIFZfTk9fQ09ORyh4KSAoKHgpIDw8IFNfTk9fQ09ORykKKyNkZWZpbmUgRl9OT19DT05HICAgIFZfTk9fQ09ORygxVSkKKworI2RlZmluZSBTX1NSQ19NQUNfU0VMICAgIDIKKyNkZWZpbmUgTV9TUkNfTUFDX1NFTCAgICAweDMKKyNkZWZpbmUgVl9TUkNfTUFDX1NFTCh4KSAoKHgpIDw8IFNfU1JDX01BQ19TRUwpCisjZGVmaW5lIEdfU1JDX01BQ19TRUwoeCkgKCgoeCkgPj4gU19TUkNfTUFDX1NFTCkgJiBNX1NSQ19NQUNfU0VMKQorCisjZGVmaW5lIFNfTDJUX0lEWCAgICA0CisjZGVmaW5lIE1fTDJUX0lEWCAgICAweDdGRgorI2RlZmluZSBWX0wyVF9JRFgoeCkgKCh4KSA8PCBTX0wyVF9JRFgpCisjZGVmaW5lIEdfTDJUX0lEWCh4KSAoKCh4KSA+PiBTX0wyVF9JRFgpICYgTV9MMlRfSURYKQorCisjZGVmaW5lIFNfVFhfQ0hBTk5FTCAgICAxNQorI2RlZmluZSBWX1RYX0NIQU5ORUwoeCkgKCh4KSA8PCBTX1RYX0NIQU5ORUwpCisjZGVmaW5lIEZfVFhfQ0hBTk5FTCAgICBWX1RYX0NIQU5ORUwoMVUpCisKKyNkZWZpbmUgU19UQ0FNX0JZUEFTUyAgICAxNgorI2RlZmluZSBWX1RDQU1fQllQQVNTKHgpICgoeCkgPDwgU19UQ0FNX0JZUEFTUykKKyNkZWZpbmUgRl9UQ0FNX0JZUEFTUyAgICBWX1RDQU1fQllQQVNTKDFVKQorCisjZGVmaW5lIFNfTkFHTEUgICAgMTcKKyNkZWZpbmUgVl9OQUdMRSh4KSAoKHgpIDw8IFNfTkFHTEUpCisjZGVmaW5lIEZfTkFHTEUgICAgVl9OQUdMRSgxVSkKKworI2RlZmluZSBTX1dORF9TQ0FMRSAgICAxOAorI2RlZmluZSBNX1dORF9TQ0FMRSAgICAweEYKKyNkZWZpbmUgVl9XTkRfU0NBTEUoeCkgKCh4KSA8PCBTX1dORF9TQ0FMRSkKKyNkZWZpbmUgR19XTkRfU0NBTEUoeCkgKCgoeCkgPj4gU19XTkRfU0NBTEUpICYgTV9XTkRfU0NBTEUpCisKKyNkZWZpbmUgU19LRUVQX0FMSVZFICAgIDIyCisjZGVmaW5lIFZfS0VFUF9BTElWRSh4KSAoKHgpIDw8IFNfS0VFUF9BTElWRSkKKyNkZWZpbmUgRl9LRUVQX0FMSVZFICAgIFZfS0VFUF9BTElWRSgxVSkKKworI2RlZmluZSBTX01BWF9SRVRSQU5TICAgIDIzCisjZGVmaW5lIE1fTUFYX1JFVFJBTlMgICAgMHhGCisjZGVmaW5lIFZfTUFYX1JFVFJBTlMoeCkgKCh4KSA8PCBTX01BWF9SRVRSQU5TKQorI2RlZmluZSBHX01BWF9SRVRSQU5TKHgpICgoKHgpID4+IFNfTUFYX1JFVFJBTlMpICYgTV9NQVhfUkVUUkFOUykKKworI2RlZmluZSBTX01BWF9SRVRSQU5TX09WRVJSSURFICAgIDI3CisjZGVmaW5lIFZfTUFYX1JFVFJBTlNfT1ZFUlJJREUoeCkgKCh4KSA8PCBTX01BWF9SRVRSQU5TX09WRVJSSURFKQorI2RlZmluZSBGX01BWF9SRVRSQU5TX09WRVJSSURFICAgIFZfTUFYX1JFVFJBTlNfT1ZFUlJJREUoMVUpCisKKyNkZWZpbmUgU19NU1NfSURYICAgIDI4CisjZGVmaW5lIE1fTVNTX0lEWCAgICAweEYKKyNkZWZpbmUgVl9NU1NfSURYKHgpICgoeCkgPDwgU19NU1NfSURYKQorI2RlZmluZSBHX01TU19JRFgoeCkgKCgoeCkgPj4gU19NU1NfSURYKSAmIE1fTVNTX0lEWCkKKworLyogb3B0aW9uIDEgZmllbGRzICovCisjZGVmaW5lIFNfUlNTX0VOQUJMRSAgICAwCisjZGVmaW5lIFZfUlNTX0VOQUJMRSh4KSAoKHgpIDw8IFNfUlNTX0VOQUJMRSkKKyNkZWZpbmUgRl9SU1NfRU5BQkxFICAgIFZfUlNTX0VOQUJMRSgxVSkKKworI2RlZmluZSBTX1JTU19NQVNLX0xFTiAgICAxCisjZGVmaW5lIE1fUlNTX01BU0tfTEVOICAgIDB4NworI2RlZmluZSBWX1JTU19NQVNLX0xFTih4KSAoKHgpIDw8IFNfUlNTX01BU0tfTEVOKQorI2RlZmluZSBHX1JTU19NQVNLX0xFTih4KSAoKCh4KSA+PiBTX1JTU19NQVNLX0xFTikgJiBNX1JTU19NQVNLX0xFTikKKworI2RlZmluZSBTX0NQVV9JRFggICAgNAorI2RlZmluZSBNX0NQVV9JRFggICAgMHgzRgorI2RlZmluZSBWX0NQVV9JRFgoeCkgKCh4KSA8PCBTX0NQVV9JRFgpCisjZGVmaW5lIEdfQ1BVX0lEWCh4KSAoKCh4KSA+PiBTX0NQVV9JRFgpICYgTV9DUFVfSURYKQorCisjZGVmaW5lIFNfTUFDX01BVENIX1ZBTElEICAgIDE4CisjZGVmaW5lIFZfTUFDX01BVENIX1ZBTElEKHgpICgoeCkgPDwgU19NQUNfTUFUQ0hfVkFMSUQpCisjZGVmaW5lIEZfTUFDX01BVENIX1ZBTElEICAgIFZfTUFDX01BVENIX1ZBTElEKDFVKQorCisjZGVmaW5lIFNfQ09OTl9QT0xJQ1kgICAgMTkKKyNkZWZpbmUgTV9DT05OX1BPTElDWSAgICAweDMKKyNkZWZpbmUgVl9DT05OX1BPTElDWSh4KSAoKHgpIDw8IFNfQ09OTl9QT0xJQ1kpCisjZGVmaW5lIEdfQ09OTl9QT0xJQ1koeCkgKCgoeCkgPj4gU19DT05OX1BPTElDWSkgJiBNX0NPTk5fUE9MSUNZKQorCisjZGVmaW5lIFNfU1lOX0RFRkVOU0UgICAgMjEKKyNkZWZpbmUgVl9TWU5fREVGRU5TRSh4KSAoKHgpIDw8IFNfU1lOX0RFRkVOU0UpCisjZGVmaW5lIEZfU1lOX0RFRkVOU0UgICAgVl9TWU5fREVGRU5TRSgxVSkKKworI2RlZmluZSBTX1ZMQU5fUFJJICAgIDIyCisjZGVmaW5lIE1fVkxBTl9QUkkgICAgMHgzCisjZGVmaW5lIFZfVkxBTl9QUkkoeCkgKCh4KSA8PCBTX1ZMQU5fUFJJKQorI2RlZmluZSBHX1ZMQU5fUFJJKHgpICgoKHgpID4+IFNfVkxBTl9QUkkpICYgTV9WTEFOX1BSSSkKKworI2RlZmluZSBTX1ZMQU5fUFJJX1ZBTElEICAgIDI0CisjZGVmaW5lIFZfVkxBTl9QUklfVkFMSUQoeCkgKCh4KSA8PCBTX1ZMQU5fUFJJX1ZBTElEKQorI2RlZmluZSBGX1ZMQU5fUFJJX1ZBTElEICAgIFZfVkxBTl9QUklfVkFMSUQoMVUpCisKKyNkZWZpbmUgU19QS1RfVFlQRSAgICAyNQorI2RlZmluZSBNX1BLVF9UWVBFICAgIDB4MworI2RlZmluZSBWX1BLVF9UWVBFKHgpICgoeCkgPDwgU19QS1RfVFlQRSkKKyNkZWZpbmUgR19QS1RfVFlQRSh4KSAoKCh4KSA+PiBTX1BLVF9UWVBFKSAmIE1fUEtUX1RZUEUpCisKKyNkZWZpbmUgU19NQUNfTUFUQ0ggICAgMjcKKyNkZWZpbmUgTV9NQUNfTUFUQ0ggICAgMHgxRgorI2RlZmluZSBWX01BQ19NQVRDSCh4KSAoKHgpIDw8IFNfTUFDX01BVENIKQorI2RlZmluZSBHX01BQ19NQVRDSCh4KSAoKCh4KSA+PiBTX01BQ19NQVRDSCkgJiBNX01BQ19NQVRDSCkKKworLyogb3B0aW9uIDIgZmllbGRzICovCisjZGVmaW5lIFNfQ1BVX0lOREVYICAgIDAKKyNkZWZpbmUgTV9DUFVfSU5ERVggICAgMHg3RgorI2RlZmluZSBWX0NQVV9JTkRFWCh4KSAoKHgpIDw8IFNfQ1BVX0lOREVYKQorI2RlZmluZSBHX0NQVV9JTkRFWCh4KSAoKCh4KSA+PiBTX0NQVV9JTkRFWCkgJiBNX0NQVV9JTkRFWCkKKworI2RlZmluZSBTX0NQVV9JTkRFWF9WQUxJRCAgICA3CisjZGVmaW5lIFZfQ1BVX0lOREVYX1ZBTElEKHgpICgoeCkgPDwgU19DUFVfSU5ERVhfVkFMSUQpCisjZGVmaW5lIEZfQ1BVX0lOREVYX1ZBTElEICAgIFZfQ1BVX0lOREVYX1ZBTElEKDFVKQorCisjZGVmaW5lIFNfUlhfQ09BTEVTQ0UgICAgOAorI2RlZmluZSBNX1JYX0NPQUxFU0NFICAgIDB4MworI2RlZmluZSBWX1JYX0NPQUxFU0NFKHgpICgoeCkgPDwgU19SWF9DT0FMRVNDRSkKKyNkZWZpbmUgR19SWF9DT0FMRVNDRSh4KSAoKCh4KSA+PiBTX1JYX0NPQUxFU0NFKSAmIE1fUlhfQ09BTEVTQ0UpCisKKyNkZWZpbmUgU19SWF9DT0FMRVNDRV9WQUxJRCAgICAxMAorI2RlZmluZSBWX1JYX0NPQUxFU0NFX1ZBTElEKHgpICgoeCkgPDwgU19SWF9DT0FMRVNDRV9WQUxJRCkKKyNkZWZpbmUgRl9SWF9DT0FMRVNDRV9WQUxJRCAgICBWX1JYX0NPQUxFU0NFX1ZBTElEKDFVKQorCisjZGVmaW5lIFNfQ09OR19DT05UUk9MX0ZMQVZPUiAgICAxMQorI2RlZmluZSBNX0NPTkdfQ09OVFJPTF9GTEFWT1IgICAgMHgzCisjZGVmaW5lIFZfQ09OR19DT05UUk9MX0ZMQVZPUih4KSAoKHgpIDw8IFNfQ09OR19DT05UUk9MX0ZMQVZPUikKKyNkZWZpbmUgR19DT05HX0NPTlRST0xfRkxBVk9SKHgpICgoKHgpID4+IFNfQ09OR19DT05UUk9MX0ZMQVZPUikgJiBNX0NPTkdfQ09OVFJPTF9GTEFWT1IpCisKKyNkZWZpbmUgU19QQUNJTkdfRkxBVk9SICAgIDEzCisjZGVmaW5lIE1fUEFDSU5HX0ZMQVZPUiAgICAweDMKKyNkZWZpbmUgVl9QQUNJTkdfRkxBVk9SKHgpICgoeCkgPDwgU19QQUNJTkdfRkxBVk9SKQorI2RlZmluZSBHX1BBQ0lOR19GTEFWT1IoeCkgKCgoeCkgPj4gU19QQUNJTkdfRkxBVk9SKSAmIE1fUEFDSU5HX0ZMQVZPUikKKworI2RlZmluZSBTX0ZMQVZPUlNfVkFMSUQgICAgMTUKKyNkZWZpbmUgVl9GTEFWT1JTX1ZBTElEKHgpICgoeCkgPDwgU19GTEFWT1JTX1ZBTElEKQorI2RlZmluZSBGX0ZMQVZPUlNfVkFMSUQgICAgVl9GTEFWT1JTX1ZBTElEKDFVKQorCisjZGVmaW5lIFNfUlhfRkNfRElTQUJMRSAgICAxNgorI2RlZmluZSBWX1JYX0ZDX0RJU0FCTEUoeCkgKCh4KSA8PCBTX1JYX0ZDX0RJU0FCTEUpCisjZGVmaW5lIEZfUlhfRkNfRElTQUJMRSAgICBWX1JYX0ZDX0RJU0FCTEUoMVUpCisKKyNkZWZpbmUgU19SWF9GQ19WQUxJRCAgICAxNworI2RlZmluZSBWX1JYX0ZDX1ZBTElEKHgpICgoeCkgPDwgU19SWF9GQ19WQUxJRCkKKyNkZWZpbmUgRl9SWF9GQ19WQUxJRCAgICBWX1JYX0ZDX1ZBTElEKDFVKQorCitzdHJ1Y3QgY3BsX3Bhc3Nfb3Blbl9yZXEgeworCVdSX0hEUjsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUxNiBsb2NhbF9wb3J0OworCV9fYmUxNiBwZWVyX3BvcnQ7CisJX19iZTMyIGxvY2FsX2lwOworCV9fYmUzMiBwZWVyX2lwOworCV9fYmUzMiBvcHQwaDsKKwlfX2JlMzIgb3B0MGw7CisJX19iZTMyIHBlZXJfbmV0bWFzazsKKwlfX2JlMzIgb3B0MTsKK307CisKK3N0cnVjdCBjcGxfcGFzc19vcGVuX3JwbCB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUxNiBsb2NhbF9wb3J0OworCV9fYmUxNiBwZWVyX3BvcnQ7CisJX19iZTMyIGxvY2FsX2lwOworCV9fYmUzMiBwZWVyX2lwOworCV9fdTggcmVzdmRbN107CisJX191OCBzdGF0dXM7Cit9OworCitzdHJ1Y3QgY3BsX3Bhc3NfZXN0YWJsaXNoIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX19iZTE2IGxvY2FsX3BvcnQ7CisJX19iZTE2IHBlZXJfcG9ydDsKKwlfX2JlMzIgbG9jYWxfaXA7CisJX19iZTMyIHBlZXJfaXA7CisJX19iZTMyIHRvc190aWQ7CisJX19iZTE2IGwydF9pZHg7CisJX19iZTE2IHRjcF9vcHQ7CisJX19iZTMyIHNuZF9pc247CisJX19iZTMyIHJjdl9pc247Cit9OworCisvKiBjcGxfcGFzc19lc3RhYmxpc2gudG9zX3RpZCBmaWVsZHMgKi8KKyNkZWZpbmUgU19QQVNTX09QRU5fVElEICAgIDAKKyNkZWZpbmUgTV9QQVNTX09QRU5fVElEICAgIDB4RkZGRkZGCisjZGVmaW5lIFZfUEFTU19PUEVOX1RJRCh4KSAoKHgpIDw8IFNfUEFTU19PUEVOX1RJRCkKKyNkZWZpbmUgR19QQVNTX09QRU5fVElEKHgpICgoKHgpID4+IFNfUEFTU19PUEVOX1RJRCkgJiBNX1BBU1NfT1BFTl9USUQpCisKKyNkZWZpbmUgU19QQVNTX09QRU5fVE9TICAgIDI0CisjZGVmaW5lIE1fUEFTU19PUEVOX1RPUyAgICAweEZGCisjZGVmaW5lIFZfUEFTU19PUEVOX1RPUyh4KSAoKHgpIDw8IFNfUEFTU19PUEVOX1RPUykKKyNkZWZpbmUgR19QQVNTX09QRU5fVE9TKHgpICgoKHgpID4+IFNfUEFTU19PUEVOX1RPUykgJiBNX1BBU1NfT1BFTl9UT1MpCisKKy8qIGNwbF9wYXNzX2VzdGFibGlzaC5sMnRfaWR4IGZpZWxkcyAqLworI2RlZmluZSBTX0wyVF9JRFgxNiAgICA1CisjZGVmaW5lIE1fTDJUX0lEWDE2ICAgIDB4N0ZGCisjZGVmaW5lIFZfTDJUX0lEWDE2KHgpICgoeCkgPDwgU19MMlRfSURYMTYpCisjZGVmaW5lIEdfTDJUX0lEWDE2KHgpICgoKHgpID4+IFNfTDJUX0lEWDE2KSAmIE1fTDJUX0lEWDE2KQorCisvKiBjcGxfcGFzc19lc3RhYmxpc2gudGNwX29wdCBmaWVsZHMgKGFsc28gYXBwbGllcyBhY3Rfb3Blbl9lc3RhYmxpc2gpICovCisjZGVmaW5lIEdfVENQT1BUX1dTQ0FMRV9PSyh4KSAgKCgoeCkgPj4gNSkgJiAxKQorI2RlZmluZSBHX1RDUE9QVF9TQUNLKHgpICAgICAgICgoKHgpID4+IDYpICYgMSkKKyNkZWZpbmUgR19UQ1BPUFRfVFNUQU1QKHgpICAgICAoKCh4KSA+PiA3KSAmIDEpCisjZGVmaW5lIEdfVENQT1BUX1NORF9XU0NBTEUoeCkgKCgoeCkgPj4gOCkgJiAweGYpCisjZGVmaW5lIEdfVENQT1BUX01TUyh4KSAgICAgICAgKCgoeCkgPj4gMTIpICYgMHhmKQorCitzdHJ1Y3QgY3BsX3Bhc3NfYWNjZXB0X3JlcSB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUxNiBsb2NhbF9wb3J0OworCV9fYmUxNiBwZWVyX3BvcnQ7CisJX19iZTMyIGxvY2FsX2lwOworCV9fYmUzMiBwZWVyX2lwOworCV9fYmUzMiB0b3NfdGlkOworCXN0cnVjdCB0Y3Bfb3B0aW9ucyB0Y3Bfb3B0aW9uczsKKwlfX3U4IGRzdF9tYWNbNl07CisJX19iZTE2IHZsYW5fdGFnOworCV9fdTggc3JjX21hY1s2XTsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwkgX191ODozOworCV9fdTggYWRkcl9pZHg6MzsKKwlfX3U4IHBvcnRfaWR4OjE7CisJX191OCBleGFjdF9tYXRjaDoxOworI2Vsc2UKKwlfX3U4IGV4YWN0X21hdGNoOjE7CisJX191OCBwb3J0X2lkeDoxOworCV9fdTggYWRkcl9pZHg6MzsKKwkgX191ODozOworI2VuZGlmCisJX191OCByc3ZkOworCV9fYmUzMiByY3ZfaXNuOworCV9fYmUzMiByc3ZkMjsKK307CisKK3N0cnVjdCBjcGxfcGFzc19hY2NlcHRfcnBsIHsKKwlXUl9IRFI7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwlfX2JlMzIgb3B0MjsKKwlfX2JlMzIgcnN2ZDsKKwlfX2JlMzIgcGVlcl9pcDsKKwlfX2JlMzIgb3B0MGg7CisJX19iZTMyIG9wdDBsX3N0YXR1czsKK307CisKK3N0cnVjdCBjcGxfYWN0X29wZW5fcmVxIHsKKwlXUl9IRFI7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwlfX2JlMTYgbG9jYWxfcG9ydDsKKwlfX2JlMTYgcGVlcl9wb3J0OworCV9fYmUzMiBsb2NhbF9pcDsKKwlfX2JlMzIgcGVlcl9pcDsKKwlfX2JlMzIgb3B0MGg7CisJX19iZTMyIG9wdDBsOworCV9fYmUzMiBwYXJhbXM7CisJX19iZTMyIG9wdDI7Cit9OworCisvKiBjcGxfYWN0X29wZW5fcmVxLnBhcmFtcyBmaWVsZHMgKi8KKyNkZWZpbmUgU19BT1BFTl9WTEFOX1BSSSAgICA5CisjZGVmaW5lIE1fQU9QRU5fVkxBTl9QUkkgICAgMHgzCisjZGVmaW5lIFZfQU9QRU5fVkxBTl9QUkkoeCkgKCh4KSA8PCBTX0FPUEVOX1ZMQU5fUFJJKQorI2RlZmluZSBHX0FPUEVOX1ZMQU5fUFJJKHgpICgoKHgpID4+IFNfQU9QRU5fVkxBTl9QUkkpICYgTV9BT1BFTl9WTEFOX1BSSSkKKworI2RlZmluZSBTX0FPUEVOX1ZMQU5fUFJJX1ZBTElEICAgIDExCisjZGVmaW5lIFZfQU9QRU5fVkxBTl9QUklfVkFMSUQoeCkgKCh4KSA8PCBTX0FPUEVOX1ZMQU5fUFJJX1ZBTElEKQorI2RlZmluZSBGX0FPUEVOX1ZMQU5fUFJJX1ZBTElEICAgIFZfQU9QRU5fVkxBTl9QUklfVkFMSUQoMVUpCisKKyNkZWZpbmUgU19BT1BFTl9QS1RfVFlQRSAgICAxMgorI2RlZmluZSBNX0FPUEVOX1BLVF9UWVBFICAgIDB4MworI2RlZmluZSBWX0FPUEVOX1BLVF9UWVBFKHgpICgoeCkgPDwgU19BT1BFTl9QS1RfVFlQRSkKKyNkZWZpbmUgR19BT1BFTl9QS1RfVFlQRSh4KSAoKCh4KSA+PiBTX0FPUEVOX1BLVF9UWVBFKSAmIE1fQU9QRU5fUEtUX1RZUEUpCisKKyNkZWZpbmUgU19BT1BFTl9NQUNfTUFUQ0ggICAgMTQKKyNkZWZpbmUgTV9BT1BFTl9NQUNfTUFUQ0ggICAgMHgxRgorI2RlZmluZSBWX0FPUEVOX01BQ19NQVRDSCh4KSAoKHgpIDw8IFNfQU9QRU5fTUFDX01BVENIKQorI2RlZmluZSBHX0FPUEVOX01BQ19NQVRDSCh4KSAoKCh4KSA+PiBTX0FPUEVOX01BQ19NQVRDSCkgJiBNX0FPUEVOX01BQ19NQVRDSCkKKworI2RlZmluZSBTX0FPUEVOX01BQ19NQVRDSF9WQUxJRCAgICAxOQorI2RlZmluZSBWX0FPUEVOX01BQ19NQVRDSF9WQUxJRCh4KSAoKHgpIDw8IFNfQU9QRU5fTUFDX01BVENIX1ZBTElEKQorI2RlZmluZSBGX0FPUEVOX01BQ19NQVRDSF9WQUxJRCAgICBWX0FPUEVOX01BQ19NQVRDSF9WQUxJRCgxVSkKKworI2RlZmluZSBTX0FPUEVOX0lGRl9WTEFOICAgIDIwCisjZGVmaW5lIE1fQU9QRU5fSUZGX1ZMQU4gICAgMHhGRkYKKyNkZWZpbmUgVl9BT1BFTl9JRkZfVkxBTih4KSAoKHgpIDw8IFNfQU9QRU5fSUZGX1ZMQU4pCisjZGVmaW5lIEdfQU9QRU5fSUZGX1ZMQU4oeCkgKCgoeCkgPj4gU19BT1BFTl9JRkZfVkxBTikgJiBNX0FPUEVOX0lGRl9WTEFOKQorCitzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JwbCB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUxNiBsb2NhbF9wb3J0OworCV9fYmUxNiBwZWVyX3BvcnQ7CisJX19iZTMyIGxvY2FsX2lwOworCV9fYmUzMiBwZWVyX2lwOworCV9fYmUzMiBhdGlkOworCV9fdTggcnN2ZFszXTsKKwlfX3U4IHN0YXR1czsKK307CisKK3N0cnVjdCBjcGxfYWN0X2VzdGFibGlzaCB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUxNiBsb2NhbF9wb3J0OworCV9fYmUxNiBwZWVyX3BvcnQ7CisJX19iZTMyIGxvY2FsX2lwOworCV9fYmUzMiBwZWVyX2lwOworCV9fYmUzMiB0b3NfdGlkOworCV9fYmUxNiBsMnRfaWR4OworCV9fYmUxNiB0Y3Bfb3B0OworCV9fYmUzMiBzbmRfaXNuOworCV9fYmUzMiByY3ZfaXNuOworfTsKKworc3RydWN0IGNwbF9nZXRfdGNiIHsKKwlXUl9IRFI7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwlfX2JlMTYgY3B1bm87CisJX19iZTE2IHJzdmQ7Cit9OworCitzdHJ1Y3QgY3BsX2dldF90Y2JfcnBsIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX191OCByc3ZkOworCV9fdTggc3RhdHVzOworCV9fYmUxNiBsZW47Cit9OworCitzdHJ1Y3QgY3BsX3NldF90Y2IgeworCVdSX0hEUjsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fdTggcmVwbHk7CisJX191OCBjcHVfaWR4OworCV9fYmUxNiBsZW47Cit9OworCisvKiBjcGxfc2V0X3RjYi5yZXBseSBmaWVsZHMgKi8KKyNkZWZpbmUgU19OT19SRVBMWSAgICA3CisjZGVmaW5lIFZfTk9fUkVQTFkoeCkgKCh4KSA8PCBTX05PX1JFUExZKQorI2RlZmluZSBGX05PX1JFUExZICAgIFZfTk9fUkVQTFkoMVUpCisKK3N0cnVjdCBjcGxfc2V0X3RjYl9maWVsZCB7CisJV1JfSERSOworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJX191OCByZXBseTsKKwlfX3U4IGNwdV9pZHg7CisJX19iZTE2IHdvcmQ7CisJX19iZTY0IG1hc2s7CisJX19iZTY0IHZhbDsKK307CisKK3N0cnVjdCBjcGxfc2V0X3RjYl9ycGwgeworCVJTU19IRFIgdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwlfX3U4IHJzdmRbM107CisJX191OCBzdGF0dXM7Cit9OworCitzdHJ1Y3QgY3BsX3BjbWQgeworCVdSX0hEUjsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fdTggcnN2ZFszXTsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHNyYzoxOworCV9fdTggYnVuZGxlOjE7CisJX191OCBjaGFubmVsOjE7CisJIF9fdTg6NTsKKyNlbHNlCisJIF9fdTg6NTsKKwlfX3U4IGNoYW5uZWw6MTsKKwlfX3U4IGJ1bmRsZToxOworCV9fdTggc3JjOjE7CisjZW5kaWYKKwlfX2JlMzIgcGNtZF9wYXJtWzJdOworfTsKKworc3RydWN0IGNwbF9wY21kX3JlcGx5IHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX191OCBzdGF0dXM7CisJX191OCByc3ZkOworCV9fYmUxNiBsZW47Cit9OworCitzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEgeworCVdSX0hEUjsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUzMiByc3ZkOworfTsKKworc3RydWN0IGNwbF9jbG9zZV9jb25fcnBsIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX191OCByc3ZkWzNdOworCV9fdTggc3RhdHVzOworCV9fYmUzMiBzbmRfbnh0OworCV9fYmUzMiByY3Zfbnh0OworfTsKKworc3RydWN0IGNwbF9jbG9zZV9saXN0c2Vydl9yZXEgeworCVdSX0hEUjsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fdTggcnN2ZDA7CisJX191OCBjcHVfaWR4OworCV9fYmUxNiByc3ZkMTsKK307CisKK3N0cnVjdCBjcGxfY2xvc2VfbGlzdHNlcnZfcnBsIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX191OCByc3ZkWzNdOworCV9fdTggc3RhdHVzOworfTsKKworc3RydWN0IGNwbF9hYm9ydF9yZXFfcnNzIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX19iZTMyIHJzdmQwOworCV9fdTggcnN2ZDE7CisJX191OCBzdGF0dXM7CisJX191OCByc3ZkMls2XTsKK307CisKK3N0cnVjdCBjcGxfYWJvcnRfcmVxIHsKKwlXUl9IRFI7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwlfX2JlMzIgcnN2ZDA7CisJX191OCByc3ZkMTsKKwlfX3U4IGNtZDsKKwlfX3U4IHJzdmQyWzZdOworfTsKKworc3RydWN0IGNwbF9hYm9ydF9ycGxfcnNzIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX19iZTMyIHJzdmQwOworCV9fdTggcnN2ZDE7CisJX191OCBzdGF0dXM7CisJX191OCByc3ZkMls2XTsKK307CisKK3N0cnVjdCBjcGxfYWJvcnRfcnBsIHsKKwlXUl9IRFI7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwlfX2JlMzIgcnN2ZDA7CisJX191OCByc3ZkMTsKKwlfX3U4IGNtZDsKKwlfX3U4IHJzdmQyWzZdOworfTsKKworc3RydWN0IGNwbF9wZWVyX2Nsb3NlIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX19iZTMyIHJjdl9ueHQ7Cit9OworCitzdHJ1Y3QgdHhfZGF0YV93ciB7CisJX19iZTMyIHdyX2hpOworCV9fYmUzMiB3cl9sbzsKKwlfX2JlMzIgbGVuOworCV9fYmUzMiBmbGFnczsKKwlfX2JlMzIgc25kc2VxOworCV9fYmUzMiBwYXJhbTsKK307CisKKy8qIHR4X2RhdGFfd3IucGFyYW0gZmllbGRzICovCisjZGVmaW5lIFNfVFhfUE9SVCAgICAwCisjZGVmaW5lIE1fVFhfUE9SVCAgICAweDcKKyNkZWZpbmUgVl9UWF9QT1JUKHgpICgoeCkgPDwgU19UWF9QT1JUKQorI2RlZmluZSBHX1RYX1BPUlQoeCkgKCgoeCkgPj4gU19UWF9QT1JUKSAmIE1fVFhfUE9SVCkKKworI2RlZmluZSBTX1RYX01TUyAgICA0CisjZGVmaW5lIE1fVFhfTVNTICAgIDB4RgorI2RlZmluZSBWX1RYX01TUyh4KSAoKHgpIDw8IFNfVFhfTVNTKQorI2RlZmluZSBHX1RYX01TUyh4KSAoKCh4KSA+PiBTX1RYX01TUykgJiBNX1RYX01TUykKKworI2RlZmluZSBTX1RYX1FPUyAgICA4CisjZGVmaW5lIE1fVFhfUU9TICAgIDB4RkYKKyNkZWZpbmUgVl9UWF9RT1MoeCkgKCh4KSA8PCBTX1RYX1FPUykKKyNkZWZpbmUgR19UWF9RT1MoeCkgKCgoeCkgPj4gU19UWF9RT1MpICYgTV9UWF9RT1MpCisKKyNkZWZpbmUgU19UWF9TTkRCVUYgMTYKKyNkZWZpbmUgTV9UWF9TTkRCVUYgMHhGRkZGCisjZGVmaW5lIFZfVFhfU05EQlVGKHgpICgoeCkgPDwgU19UWF9TTkRCVUYpCisjZGVmaW5lIEdfVFhfU05EQlVGKHgpICgoKHgpID4+IFNfVFhfU05EQlVGKSAmIE1fVFhfU05EQlVGKQorCitzdHJ1Y3QgY3BsX3R4X2RhdGEgeworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJX19iZTMyIGxlbjsKKwlfX2JlMzIgcnN2ZDsKKwlfX2JlMTYgdXJnOworCV9fYmUxNiBmbGFnczsKK307CisKKy8qIGNwbF90eF9kYXRhLmZsYWdzIGZpZWxkcyAqLworI2RlZmluZSBTX1RYX1VMUF9TVUJNT0RFICAgIDYKKyNkZWZpbmUgTV9UWF9VTFBfU1VCTU9ERSAgICAweEYKKyNkZWZpbmUgVl9UWF9VTFBfU1VCTU9ERSh4KSAoKHgpIDw8IFNfVFhfVUxQX1NVQk1PREUpCisjZGVmaW5lIEdfVFhfVUxQX1NVQk1PREUoeCkgKCgoeCkgPj4gU19UWF9VTFBfU1VCTU9ERSkgJiBNX1RYX1VMUF9TVUJNT0RFKQorCisjZGVmaW5lIFNfVFhfVUxQX01PREUgICAgMTAKKyNkZWZpbmUgTV9UWF9VTFBfTU9ERSAgICAweEYKKyNkZWZpbmUgVl9UWF9VTFBfTU9ERSh4KSAoKHgpIDw8IFNfVFhfVUxQX01PREUpCisjZGVmaW5lIEdfVFhfVUxQX01PREUoeCkgKCgoeCkgPj4gU19UWF9VTFBfTU9ERSkgJiBNX1RYX1VMUF9NT0RFKQorCisjZGVmaW5lIFNfVFhfU0hPVkUgICAgMTQKKyNkZWZpbmUgVl9UWF9TSE9WRSh4KSAoKHgpIDw8IFNfVFhfU0hPVkUpCisjZGVmaW5lIEZfVFhfU0hPVkUgICAgVl9UWF9TSE9WRSgxVSkKKworI2RlZmluZSBTX1RYX01PUkUgICAgMTUKKyNkZWZpbmUgVl9UWF9NT1JFKHgpICgoeCkgPDwgU19UWF9NT1JFKQorI2RlZmluZSBGX1RYX01PUkUgICAgVl9UWF9NT1JFKDFVKQorCisvKiBhZGRpdGlvbmFsIHR4X2RhdGFfd3IuZmxhZ3MgZmllbGRzICovCisjZGVmaW5lIFNfVFhfQ1BVX0lEWCAgICAwCisjZGVmaW5lIE1fVFhfQ1BVX0lEWCAgICAweDNGCisjZGVmaW5lIFZfVFhfQ1BVX0lEWCh4KSAoKHgpIDw8IFNfVFhfQ1BVX0lEWCkKKyNkZWZpbmUgR19UWF9DUFVfSURYKHgpICgoKHgpID4+IFNfVFhfQ1BVX0lEWCkgJiBNX1RYX0NQVV9JRFgpCisKKyNkZWZpbmUgU19UWF9VUkcgICAgMTYKKyNkZWZpbmUgVl9UWF9VUkcoeCkgKCh4KSA8PCBTX1RYX1VSRykKKyNkZWZpbmUgRl9UWF9VUkcgICAgVl9UWF9VUkcoMVUpCisKKyNkZWZpbmUgU19UWF9DTE9TRSAgICAxNworI2RlZmluZSBWX1RYX0NMT1NFKHgpICgoeCkgPDwgU19UWF9DTE9TRSkKKyNkZWZpbmUgRl9UWF9DTE9TRSAgICBWX1RYX0NMT1NFKDFVKQorCisjZGVmaW5lIFNfVFhfSU5JVCAgICAxOAorI2RlZmluZSBWX1RYX0lOSVQoeCkgKCh4KSA8PCBTX1RYX0lOSVQpCisjZGVmaW5lIEZfVFhfSU5JVCAgICBWX1RYX0lOSVQoMVUpCisKKyNkZWZpbmUgU19UWF9JTU1fQUNLICAgIDE5CisjZGVmaW5lIFZfVFhfSU1NX0FDSyh4KSAoKHgpIDw8IFNfVFhfSU1NX0FDSykKKyNkZWZpbmUgRl9UWF9JTU1fQUNLICAgIFZfVFhfSU1NX0FDSygxVSkKKworI2RlZmluZSBTX1RYX0lNTV9ETUEgICAgMjAKKyNkZWZpbmUgVl9UWF9JTU1fRE1BKHgpICgoeCkgPDwgU19UWF9JTU1fRE1BKQorI2RlZmluZSBGX1RYX0lNTV9ETUEgICAgVl9UWF9JTU1fRE1BKDFVKQorCitzdHJ1Y3QgY3BsX3R4X2RhdGFfYWNrIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX19iZTMyIGFja19zZXE7Cit9OworCitzdHJ1Y3QgY3BsX3dyX2FjayB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUxNiBjcmVkaXRzOworCV9fYmUxNiByc3ZkOworCV9fYmUzMiBzbmRfbnh0OworCV9fYmUzMiBzbmRfdW5hOworfTsKKworc3RydWN0IGNwbF9yZG1hX2VjX3N0YXR1cyB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fdTggcnN2ZFszXTsKKwlfX3U4IHN0YXR1czsKK307CisKK3N0cnVjdCBtbmd0X3BrdHNjaGVkX3dyIHsKKwlfX2JlMzIgd3JfaGk7CisJX19iZTMyIHdyX2xvOworCV9fdTggbW5ndF9vcGNvZGU7CisJX191OCByc3ZkWzddOworCV9fdTggc2NoZWQ7CisJX191OCBpZHg7CisJX191OCBtaW47CisJX191OCBtYXg7CisJX191OCBiaW5kaW5nOworCV9fdTggcnN2ZDFbM107Cit9OworCitzdHJ1Y3QgY3BsX2lzY3NpX2hkciB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUxNiBwZHVfbGVuX2RkcDsKKwlfX2JlMTYgbGVuOworCV9fYmUzMiBzZXE7CisJX19iZTE2IHVyZzsKKwlfX3U4IHJzdmQ7CisJX191OCBzdGF0dXM7Cit9OworCisvKiBjcGxfaXNjc2lfaGRyLnBkdV9sZW5fZGRwIGZpZWxkcyAqLworI2RlZmluZSBTX0lTQ1NJX1BEVV9MRU4gICAgMAorI2RlZmluZSBNX0lTQ1NJX1BEVV9MRU4gICAgMHg3RkZGCisjZGVmaW5lIFZfSVNDU0lfUERVX0xFTih4KSAoKHgpIDw8IFNfSVNDU0lfUERVX0xFTikKKyNkZWZpbmUgR19JU0NTSV9QRFVfTEVOKHgpICgoKHgpID4+IFNfSVNDU0lfUERVX0xFTikgJiBNX0lTQ1NJX1BEVV9MRU4pCisKKyNkZWZpbmUgU19JU0NTSV9ERFAgICAgMTUKKyNkZWZpbmUgVl9JU0NTSV9ERFAoeCkgKCh4KSA8PCBTX0lTQ1NJX0REUCkKKyNkZWZpbmUgRl9JU0NTSV9ERFAgICAgVl9JU0NTSV9ERFAoMVUpCisKK3N0cnVjdCBjcGxfcnhfZGF0YSB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUxNiByc3ZkOworCV9fYmUxNiBsZW47CisJX19iZTMyIHNlcTsKKwlfX2JlMTYgdXJnOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggZGFja19tb2RlOjI7CisJX191OCBwc2g6MTsKKwlfX3U4IGhlYXJ0YmVhdDoxOworCSBfX3U4OjQ7CisjZWxzZQorCSBfX3U4OjQ7CisJX191OCBoZWFydGJlYXQ6MTsKKwlfX3U4IHBzaDoxOworCV9fdTggZGFja19tb2RlOjI7CisjZW5kaWYKKwlfX3U4IHN0YXR1czsKK307CisKK3N0cnVjdCBjcGxfcnhfZGF0YV9hY2sgeworCVdSX0hEUjsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUzMiBjcmVkaXRfZGFjazsKK307CisKKy8qIGNwbF9yeF9kYXRhX2Fjay5hY2tfc2VxIGZpZWxkcyAqLworI2RlZmluZSBTX1JYX0NSRURJVFMgICAgMAorI2RlZmluZSBNX1JYX0NSRURJVFMgICAgMHg3RkZGRkZGCisjZGVmaW5lIFZfUlhfQ1JFRElUUyh4KSAoKHgpIDw8IFNfUlhfQ1JFRElUUykKKyNkZWZpbmUgR19SWF9DUkVESVRTKHgpICgoKHgpID4+IFNfUlhfQ1JFRElUUykgJiBNX1JYX0NSRURJVFMpCisKKyNkZWZpbmUgU19SWF9NT0RVTEFURSAgICAyNworI2RlZmluZSBWX1JYX01PRFVMQVRFKHgpICgoeCkgPDwgU19SWF9NT0RVTEFURSkKKyNkZWZpbmUgRl9SWF9NT0RVTEFURSAgICBWX1JYX01PRFVMQVRFKDFVKQorCisjZGVmaW5lIFNfUlhfRk9SQ0VfQUNLICAgIDI4CisjZGVmaW5lIFZfUlhfRk9SQ0VfQUNLKHgpICgoeCkgPDwgU19SWF9GT1JDRV9BQ0spCisjZGVmaW5lIEZfUlhfRk9SQ0VfQUNLICAgIFZfUlhfRk9SQ0VfQUNLKDFVKQorCisjZGVmaW5lIFNfUlhfREFDS19NT0RFICAgIDI5CisjZGVmaW5lIE1fUlhfREFDS19NT0RFICAgIDB4MworI2RlZmluZSBWX1JYX0RBQ0tfTU9ERSh4KSAoKHgpIDw8IFNfUlhfREFDS19NT0RFKQorI2RlZmluZSBHX1JYX0RBQ0tfTU9ERSh4KSAoKCh4KSA+PiBTX1JYX0RBQ0tfTU9ERSkgJiBNX1JYX0RBQ0tfTU9ERSkKKworI2RlZmluZSBTX1JYX0RBQ0tfQ0hBTkdFICAgIDMxCisjZGVmaW5lIFZfUlhfREFDS19DSEFOR0UoeCkgKCh4KSA8PCBTX1JYX0RBQ0tfQ0hBTkdFKQorI2RlZmluZSBGX1JYX0RBQ0tfQ0hBTkdFICAgIFZfUlhfREFDS19DSEFOR0UoMVUpCisKK3N0cnVjdCBjcGxfcnhfdXJnX25vdGlmeSB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUzMiBzZXE7Cit9OworCitzdHJ1Y3QgY3BsX3J4X2RkcF9jb21wbGV0ZSB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUzMiBkZHBfcmVwb3J0OworfTsKKworc3RydWN0IGNwbF9yeF9kYXRhX2RkcCB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUxNiB1cmc7CisJX19iZTE2IGxlbjsKKwlfX2JlMzIgc2VxOworCXVuaW9uIHsKKwkJX19iZTMyIG54dF9zZXE7CisJCV9fYmUzMiBkZHBfcmVwb3J0OworCX07CisJX19iZTMyIHVscF9jcmM7CisJX19iZTMyIGRkcHZsZF9zdGF0dXM7Cit9OworCisvKiBjcGxfcnhfZGF0YV9kZHAuZGRwdmxkX3N0YXR1cyBmaWVsZHMgKi8KKyNkZWZpbmUgU19ERFBfU1RBVFVTICAgIDAKKyNkZWZpbmUgTV9ERFBfU1RBVFVTICAgIDB4RkYKKyNkZWZpbmUgVl9ERFBfU1RBVFVTKHgpICgoeCkgPDwgU19ERFBfU1RBVFVTKQorI2RlZmluZSBHX0REUF9TVEFUVVMoeCkgKCgoeCkgPj4gU19ERFBfU1RBVFVTKSAmIE1fRERQX1NUQVRVUykKKworI2RlZmluZSBTX0REUF9WQUxJRCAgICAxNQorI2RlZmluZSBNX0REUF9WQUxJRCAgICAweDFGRkZGCisjZGVmaW5lIFZfRERQX1ZBTElEKHgpICgoeCkgPDwgU19ERFBfVkFMSUQpCisjZGVmaW5lIEdfRERQX1ZBTElEKHgpICgoKHgpID4+IFNfRERQX1ZBTElEKSAmIE1fRERQX1ZBTElEKQorCisjZGVmaW5lIFNfRERQX1BQT0RfTUlTTUFUQ0ggICAgMTUKKyNkZWZpbmUgVl9ERFBfUFBPRF9NSVNNQVRDSCh4KSAoKHgpIDw8IFNfRERQX1BQT0RfTUlTTUFUQ0gpCisjZGVmaW5lIEZfRERQX1BQT0RfTUlTTUFUQ0ggICAgVl9ERFBfUFBPRF9NSVNNQVRDSCgxVSkKKworI2RlZmluZSBTX0REUF9QRFUgICAgMTYKKyNkZWZpbmUgVl9ERFBfUERVKHgpICgoeCkgPDwgU19ERFBfUERVKQorI2RlZmluZSBGX0REUF9QRFUgICAgVl9ERFBfUERVKDFVKQorCisjZGVmaW5lIFNfRERQX0xMSU1JVF9FUlIgICAgMTcKKyNkZWZpbmUgVl9ERFBfTExJTUlUX0VSUih4KSAoKHgpIDw8IFNfRERQX0xMSU1JVF9FUlIpCisjZGVmaW5lIEZfRERQX0xMSU1JVF9FUlIgICAgVl9ERFBfTExJTUlUX0VSUigxVSkKKworI2RlZmluZSBTX0REUF9QUE9EX1BBUklUWV9FUlIgICAgMTgKKyNkZWZpbmUgVl9ERFBfUFBPRF9QQVJJVFlfRVJSKHgpICgoeCkgPDwgU19ERFBfUFBPRF9QQVJJVFlfRVJSKQorI2RlZmluZSBGX0REUF9QUE9EX1BBUklUWV9FUlIgICAgVl9ERFBfUFBPRF9QQVJJVFlfRVJSKDFVKQorCisjZGVmaW5lIFNfRERQX1BBRERJTkdfRVJSICAgIDE5CisjZGVmaW5lIFZfRERQX1BBRERJTkdfRVJSKHgpICgoeCkgPDwgU19ERFBfUEFERElOR19FUlIpCisjZGVmaW5lIEZfRERQX1BBRERJTkdfRVJSICAgIFZfRERQX1BBRERJTkdfRVJSKDFVKQorCisjZGVmaW5lIFNfRERQX0hEUkNSQ19FUlIgICAgMjAKKyNkZWZpbmUgVl9ERFBfSERSQ1JDX0VSUih4KSAoKHgpIDw8IFNfRERQX0hEUkNSQ19FUlIpCisjZGVmaW5lIEZfRERQX0hEUkNSQ19FUlIgICAgVl9ERFBfSERSQ1JDX0VSUigxVSkKKworI2RlZmluZSBTX0REUF9EQVRBQ1JDX0VSUiAgICAyMQorI2RlZmluZSBWX0REUF9EQVRBQ1JDX0VSUih4KSAoKHgpIDw8IFNfRERQX0RBVEFDUkNfRVJSKQorI2RlZmluZSBGX0REUF9EQVRBQ1JDX0VSUiAgICBWX0REUF9EQVRBQ1JDX0VSUigxVSkKKworI2RlZmluZSBTX0REUF9JTlZBTElEX1RBRyAgICAyMgorI2RlZmluZSBWX0REUF9JTlZBTElEX1RBRyh4KSAoKHgpIDw8IFNfRERQX0lOVkFMSURfVEFHKQorI2RlZmluZSBGX0REUF9JTlZBTElEX1RBRyAgICBWX0REUF9JTlZBTElEX1RBRygxVSkKKworI2RlZmluZSBTX0REUF9VTElNSVRfRVJSICAgIDIzCisjZGVmaW5lIFZfRERQX1VMSU1JVF9FUlIoeCkgKCh4KSA8PCBTX0REUF9VTElNSVRfRVJSKQorI2RlZmluZSBGX0REUF9VTElNSVRfRVJSICAgIFZfRERQX1VMSU1JVF9FUlIoMVUpCisKKyNkZWZpbmUgU19ERFBfT0ZGU0VUX0VSUiAgICAyNAorI2RlZmluZSBWX0REUF9PRkZTRVRfRVJSKHgpICgoeCkgPDwgU19ERFBfT0ZGU0VUX0VSUikKKyNkZWZpbmUgRl9ERFBfT0ZGU0VUX0VSUiAgICBWX0REUF9PRkZTRVRfRVJSKDFVKQorCisjZGVmaW5lIFNfRERQX0NPTE9SX0VSUiAgICAyNQorI2RlZmluZSBWX0REUF9DT0xPUl9FUlIoeCkgKCh4KSA8PCBTX0REUF9DT0xPUl9FUlIpCisjZGVmaW5lIEZfRERQX0NPTE9SX0VSUiAgICBWX0REUF9DT0xPUl9FUlIoMVUpCisKKyNkZWZpbmUgU19ERFBfVElEX01JU01BVENIICAgIDI2CisjZGVmaW5lIFZfRERQX1RJRF9NSVNNQVRDSCh4KSAoKHgpIDw8IFNfRERQX1RJRF9NSVNNQVRDSCkKKyNkZWZpbmUgRl9ERFBfVElEX01JU01BVENIICAgIFZfRERQX1RJRF9NSVNNQVRDSCgxVSkKKworI2RlZmluZSBTX0REUF9JTlZBTElEX1BQT0QgICAgMjcKKyNkZWZpbmUgVl9ERFBfSU5WQUxJRF9QUE9EKHgpICgoeCkgPDwgU19ERFBfSU5WQUxJRF9QUE9EKQorI2RlZmluZSBGX0REUF9JTlZBTElEX1BQT0QgICAgVl9ERFBfSU5WQUxJRF9QUE9EKDFVKQorCisjZGVmaW5lIFNfRERQX1VMUF9NT0RFICAgIDI4CisjZGVmaW5lIE1fRERQX1VMUF9NT0RFICAgIDB4RgorI2RlZmluZSBWX0REUF9VTFBfTU9ERSh4KSAoKHgpIDw8IFNfRERQX1VMUF9NT0RFKQorI2RlZmluZSBHX0REUF9VTFBfTU9ERSh4KSAoKCh4KSA+PiBTX0REUF9VTFBfTU9ERSkgJiBNX0REUF9VTFBfTU9ERSkKKworLyogY3BsX3J4X2RhdGFfZGRwLmRkcF9yZXBvcnQgZmllbGRzICovCisjZGVmaW5lIFNfRERQX09GRlNFVCAgICAwCisjZGVmaW5lIE1fRERQX09GRlNFVCAgICAweDNGRkZGRgorI2RlZmluZSBWX0REUF9PRkZTRVQoeCkgKCh4KSA8PCBTX0REUF9PRkZTRVQpCisjZGVmaW5lIEdfRERQX09GRlNFVCh4KSAoKCh4KSA+PiBTX0REUF9PRkZTRVQpICYgTV9ERFBfT0ZGU0VUKQorCisjZGVmaW5lIFNfRERQX1VSRyAgICAyNAorI2RlZmluZSBWX0REUF9VUkcoeCkgKCh4KSA8PCBTX0REUF9VUkcpCisjZGVmaW5lIEZfRERQX1VSRyAgICBWX0REUF9VUkcoMVUpCisKKyNkZWZpbmUgU19ERFBfUFNIICAgIDI1CisjZGVmaW5lIFZfRERQX1BTSCh4KSAoKHgpIDw8IFNfRERQX1BTSCkKKyNkZWZpbmUgRl9ERFBfUFNIICAgIFZfRERQX1BTSCgxVSkKKworI2RlZmluZSBTX0REUF9CVUZfQ09NUExFVEUgICAgMjYKKyNkZWZpbmUgVl9ERFBfQlVGX0NPTVBMRVRFKHgpICgoeCkgPDwgU19ERFBfQlVGX0NPTVBMRVRFKQorI2RlZmluZSBGX0REUF9CVUZfQ09NUExFVEUgICAgVl9ERFBfQlVGX0NPTVBMRVRFKDFVKQorCisjZGVmaW5lIFNfRERQX0JVRl9USU1FRF9PVVQgICAgMjcKKyNkZWZpbmUgVl9ERFBfQlVGX1RJTUVEX09VVCh4KSAoKHgpIDw8IFNfRERQX0JVRl9USU1FRF9PVVQpCisjZGVmaW5lIEZfRERQX0JVRl9USU1FRF9PVVQgICAgVl9ERFBfQlVGX1RJTUVEX09VVCgxVSkKKworI2RlZmluZSBTX0REUF9CVUZfSURYICAgIDI4CisjZGVmaW5lIFZfRERQX0JVRl9JRFgoeCkgKCh4KSA8PCBTX0REUF9CVUZfSURYKQorI2RlZmluZSBGX0REUF9CVUZfSURYICAgIFZfRERQX0JVRl9JRFgoMVUpCisKK3N0cnVjdCBjcGxfdHhfcGt0IHsKKwlXUl9IRFI7CisJX19iZTMyIGNudHJsOworCV9fYmUzMiBsZW47Cit9OworCitzdHJ1Y3QgY3BsX3R4X3BrdF9sc28geworCVdSX0hEUjsKKwlfX2JlMzIgY250cmw7CisJX19iZTMyIGxlbjsKKworCV9fYmUzMiByc3ZkOworCV9fYmUzMiBsc29faW5mbzsKK307CisKKy8qIGNwbF90eF9wa3QqLmNudHJsIGZpZWxkcyAqLworI2RlZmluZSBTX1RYUEtUX1ZMQU4gICAgMAorI2RlZmluZSBNX1RYUEtUX1ZMQU4gICAgMHhGRkZGCisjZGVmaW5lIFZfVFhQS1RfVkxBTih4KSAoKHgpIDw8IFNfVFhQS1RfVkxBTikKKyNkZWZpbmUgR19UWFBLVF9WTEFOKHgpICgoKHgpID4+IFNfVFhQS1RfVkxBTikgJiBNX1RYUEtUX1ZMQU4pCisKKyNkZWZpbmUgU19UWFBLVF9JTlRGICAgIDE2CisjZGVmaW5lIE1fVFhQS1RfSU5URiAgICAweEYKKyNkZWZpbmUgVl9UWFBLVF9JTlRGKHgpICgoeCkgPDwgU19UWFBLVF9JTlRGKQorI2RlZmluZSBHX1RYUEtUX0lOVEYoeCkgKCgoeCkgPj4gU19UWFBLVF9JTlRGKSAmIE1fVFhQS1RfSU5URikKKworI2RlZmluZSBTX1RYUEtUX0lQQ1NVTV9ESVMgICAgMjAKKyNkZWZpbmUgVl9UWFBLVF9JUENTVU1fRElTKHgpICgoeCkgPDwgU19UWFBLVF9JUENTVU1fRElTKQorI2RlZmluZSBGX1RYUEtUX0lQQ1NVTV9ESVMgICAgVl9UWFBLVF9JUENTVU1fRElTKDFVKQorCisjZGVmaW5lIFNfVFhQS1RfTDRDU1VNX0RJUyAgICAyMQorI2RlZmluZSBWX1RYUEtUX0w0Q1NVTV9ESVMoeCkgKCh4KSA8PCBTX1RYUEtUX0w0Q1NVTV9ESVMpCisjZGVmaW5lIEZfVFhQS1RfTDRDU1VNX0RJUyAgICBWX1RYUEtUX0w0Q1NVTV9ESVMoMVUpCisKKyNkZWZpbmUgU19UWFBLVF9WTEFOX1ZMRCAgICAyMgorI2RlZmluZSBWX1RYUEtUX1ZMQU5fVkxEKHgpICgoeCkgPDwgU19UWFBLVF9WTEFOX1ZMRCkKKyNkZWZpbmUgRl9UWFBLVF9WTEFOX1ZMRCAgICBWX1RYUEtUX1ZMQU5fVkxEKDFVKQorCisjZGVmaW5lIFNfVFhQS1RfTE9PUEJBQ0sgICAgMjMKKyNkZWZpbmUgVl9UWFBLVF9MT09QQkFDSyh4KSAoKHgpIDw8IFNfVFhQS1RfTE9PUEJBQ0spCisjZGVmaW5lIEZfVFhQS1RfTE9PUEJBQ0sgICAgVl9UWFBLVF9MT09QQkFDSygxVSkKKworI2RlZmluZSBTX1RYUEtUX09QQ09ERSAgICAyNAorI2RlZmluZSBNX1RYUEtUX09QQ09ERSAgICAweEZGCisjZGVmaW5lIFZfVFhQS1RfT1BDT0RFKHgpICgoeCkgPDwgU19UWFBLVF9PUENPREUpCisjZGVmaW5lIEdfVFhQS1RfT1BDT0RFKHgpICgoKHgpID4+IFNfVFhQS1RfT1BDT0RFKSAmIE1fVFhQS1RfT1BDT0RFKQorCisvKiBjcGxfdHhfcGt0X2xzby5sc29faW5mbyBmaWVsZHMgKi8KKyNkZWZpbmUgU19MU09fTVNTICAgIDAKKyNkZWZpbmUgTV9MU09fTVNTICAgIDB4M0ZGRgorI2RlZmluZSBWX0xTT19NU1MoeCkgKCh4KSA8PCBTX0xTT19NU1MpCisjZGVmaW5lIEdfTFNPX01TUyh4KSAoKCh4KSA+PiBTX0xTT19NU1MpICYgTV9MU09fTVNTKQorCisjZGVmaW5lIFNfTFNPX0VUSF9UWVBFICAgIDE0CisjZGVmaW5lIE1fTFNPX0VUSF9UWVBFICAgIDB4MworI2RlZmluZSBWX0xTT19FVEhfVFlQRSh4KSAoKHgpIDw8IFNfTFNPX0VUSF9UWVBFKQorI2RlZmluZSBHX0xTT19FVEhfVFlQRSh4KSAoKCh4KSA+PiBTX0xTT19FVEhfVFlQRSkgJiBNX0xTT19FVEhfVFlQRSkKKworI2RlZmluZSBTX0xTT19UQ1BIRFJfV09SRFMgICAgMTYKKyNkZWZpbmUgTV9MU09fVENQSERSX1dPUkRTICAgIDB4RgorI2RlZmluZSBWX0xTT19UQ1BIRFJfV09SRFMoeCkgKCh4KSA8PCBTX0xTT19UQ1BIRFJfV09SRFMpCisjZGVmaW5lIEdfTFNPX1RDUEhEUl9XT1JEUyh4KSAoKCh4KSA+PiBTX0xTT19UQ1BIRFJfV09SRFMpICYgTV9MU09fVENQSERSX1dPUkRTKQorCisjZGVmaW5lIFNfTFNPX0lQSERSX1dPUkRTICAgIDIwCisjZGVmaW5lIE1fTFNPX0lQSERSX1dPUkRTICAgIDB4RgorI2RlZmluZSBWX0xTT19JUEhEUl9XT1JEUyh4KSAoKHgpIDw8IFNfTFNPX0lQSERSX1dPUkRTKQorI2RlZmluZSBHX0xTT19JUEhEUl9XT1JEUyh4KSAoKCh4KSA+PiBTX0xTT19JUEhEUl9XT1JEUykgJiBNX0xTT19JUEhEUl9XT1JEUykKKworI2RlZmluZSBTX0xTT19JUFY2ICAgIDI0CisjZGVmaW5lIFZfTFNPX0lQVjYoeCkgKCh4KSA8PCBTX0xTT19JUFY2KQorI2RlZmluZSBGX0xTT19JUFY2ICAgIFZfTFNPX0lQVjYoMVUpCisKK3N0cnVjdCBjcGxfdHJhY2VfcGt0IHsKKyNpZmRlZiBDSEVMU0lPX0ZXCisJX191OCByc3Nfb3Bjb2RlOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggZXJyOjE7CisJIF9fdTg6NzsKKyNlbHNlCisJIF9fdTg6NzsKKwlfX3U4IGVycjoxOworI2VuZGlmCisJX191OCByc3ZkMDsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwlfX3U4IHFpZDo0OworCSBfX3U4OjQ7CisjZWxzZQorCSBfX3U4OjQ7CisJX191OCBxaWQ6NDsKKyNlbmRpZgorCV9fYmUzMiB0c3RhbXA7CisjZW5kaWYJCQkJLyogQ0hFTFNJT19GVyAqLworCisJX191OCBvcGNvZGU7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBpZmY6NDsKKwkgX191ODo0OworI2Vsc2UKKwkgX191ODo0OworCV9fdTggaWZmOjQ7CisjZW5kaWYKKwlfX3U4IHJzdmRbNF07CisJX19iZTE2IGxlbjsKK307CisKK3N0cnVjdCBjcGxfcnhfcGt0IHsKKwlSU1NfSERSIF9fdTggb3Bjb2RlOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggaWZmOjQ7CisJX191OCBjc3VtX3ZhbGlkOjE7CisJX191OCBpcG1pX3BrdDoxOworCV9fdTggdmxhbl92YWxpZDoxOworCV9fdTggZnJhZ21lbnQ6MTsKKyNlbHNlCisJX191OCBmcmFnbWVudDoxOworCV9fdTggdmxhbl92YWxpZDoxOworCV9fdTggaXBtaV9wa3Q6MTsKKwlfX3U4IGNzdW1fdmFsaWQ6MTsKKwlfX3U4IGlmZjo0OworI2VuZGlmCisJX19iZTE2IGNzdW07CisJX19iZTE2IHZsYW47CisJX19iZTE2IGxlbjsKK307CisKK3N0cnVjdCBjcGxfbDJ0X3dyaXRlX3JlcSB7CisJV1JfSERSOworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJX19iZTMyIHBhcmFtczsKKwlfX3U4IHJzdmRbMl07CisJX191OCBkc3RfbWFjWzZdOworfTsKKworLyogY3BsX2wydF93cml0ZV9yZXEucGFyYW1zIGZpZWxkcyAqLworI2RlZmluZSBTX0wyVF9XX0lEWCAgICAwCisjZGVmaW5lIE1fTDJUX1dfSURYICAgIDB4N0ZGCisjZGVmaW5lIFZfTDJUX1dfSURYKHgpICgoeCkgPDwgU19MMlRfV19JRFgpCisjZGVmaW5lIEdfTDJUX1dfSURYKHgpICgoKHgpID4+IFNfTDJUX1dfSURYKSAmIE1fTDJUX1dfSURYKQorCisjZGVmaW5lIFNfTDJUX1dfVkxBTiAgICAxMQorI2RlZmluZSBNX0wyVF9XX1ZMQU4gICAgMHhGRkYKKyNkZWZpbmUgVl9MMlRfV19WTEFOKHgpICgoeCkgPDwgU19MMlRfV19WTEFOKQorI2RlZmluZSBHX0wyVF9XX1ZMQU4oeCkgKCgoeCkgPj4gU19MMlRfV19WTEFOKSAmIE1fTDJUX1dfVkxBTikKKworI2RlZmluZSBTX0wyVF9XX0lGRiAgICAyMworI2RlZmluZSBNX0wyVF9XX0lGRiAgICAweEYKKyNkZWZpbmUgVl9MMlRfV19JRkYoeCkgKCh4KSA8PCBTX0wyVF9XX0lGRikKKyNkZWZpbmUgR19MMlRfV19JRkYoeCkgKCgoeCkgPj4gU19MMlRfV19JRkYpICYgTV9MMlRfV19JRkYpCisKKyNkZWZpbmUgU19MMlRfV19QUklPICAgIDI3CisjZGVmaW5lIE1fTDJUX1dfUFJJTyAgICAweDcKKyNkZWZpbmUgVl9MMlRfV19QUklPKHgpICgoeCkgPDwgU19MMlRfV19QUklPKQorI2RlZmluZSBHX0wyVF9XX1BSSU8oeCkgKCgoeCkgPj4gU19MMlRfV19QUklPKSAmIE1fTDJUX1dfUFJJTykKKworc3RydWN0IGNwbF9sMnRfd3JpdGVfcnBsIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX191OCBzdGF0dXM7CisJX191OCByc3ZkWzNdOworfTsKKworc3RydWN0IGNwbF9sMnRfcmVhZF9yZXEgeworCVdSX0hEUjsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUxNiByc3ZkOworCV9fYmUxNiBsMnRfaWR4OworfTsKKworc3RydWN0IGNwbF9sMnRfcmVhZF9ycGwgeworCVJTU19IRFIgdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwlfX2JlMzIgcGFyYW1zOworCV9fdTggcnN2ZFsyXTsKKwlfX3U4IGRzdF9tYWNbNl07Cit9OworCisvKiBjcGxfbDJ0X3JlYWRfcnBsLnBhcmFtcyBmaWVsZHMgKi8KKyNkZWZpbmUgU19MMlRfUl9QUklPICAgIDAKKyNkZWZpbmUgTV9MMlRfUl9QUklPICAgIDB4NworI2RlZmluZSBWX0wyVF9SX1BSSU8oeCkgKCh4KSA8PCBTX0wyVF9SX1BSSU8pCisjZGVmaW5lIEdfTDJUX1JfUFJJTyh4KSAoKCh4KSA+PiBTX0wyVF9SX1BSSU8pICYgTV9MMlRfUl9QUklPKQorCisjZGVmaW5lIFNfTDJUX1JfVkxBTiAgICA4CisjZGVmaW5lIE1fTDJUX1JfVkxBTiAgICAweEZGRgorI2RlZmluZSBWX0wyVF9SX1ZMQU4oeCkgKCh4KSA8PCBTX0wyVF9SX1ZMQU4pCisjZGVmaW5lIEdfTDJUX1JfVkxBTih4KSAoKCh4KSA+PiBTX0wyVF9SX1ZMQU4pICYgTV9MMlRfUl9WTEFOKQorCisjZGVmaW5lIFNfTDJUX1JfSUZGICAgIDIwCisjZGVmaW5lIE1fTDJUX1JfSUZGICAgIDB4RgorI2RlZmluZSBWX0wyVF9SX0lGRih4KSAoKHgpIDw8IFNfTDJUX1JfSUZGKQorI2RlZmluZSBHX0wyVF9SX0lGRih4KSAoKCh4KSA+PiBTX0wyVF9SX0lGRikgJiBNX0wyVF9SX0lGRikKKworI2RlZmluZSBTX0wyVF9TVEFUVVMgICAgMjQKKyNkZWZpbmUgTV9MMlRfU1RBVFVTICAgIDB4RkYKKyNkZWZpbmUgVl9MMlRfU1RBVFVTKHgpICgoeCkgPDwgU19MMlRfU1RBVFVTKQorI2RlZmluZSBHX0wyVF9TVEFUVVMoeCkgKCgoeCkgPj4gU19MMlRfU1RBVFVTKSAmIE1fTDJUX1NUQVRVUykKKworc3RydWN0IGNwbF9zbXRfd3JpdGVfcmVxIHsKKwlXUl9IRFI7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwlfX3U4IHJzdmQwOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggbXR1X2lkeDo0OworCV9fdTggaWZmOjQ7CisjZWxzZQorCV9fdTggaWZmOjQ7CisJX191OCBtdHVfaWR4OjQ7CisjZW5kaWYKKwlfX2JlMTYgcnN2ZDI7CisJX19iZTE2IHJzdmQzOworCV9fdTggc3JjX21hYzFbNl07CisJX19iZTE2IHJzdmQ0OworCV9fdTggc3JjX21hYzBbNl07Cit9OworCitzdHJ1Y3QgY3BsX3NtdF93cml0ZV9ycGwgeworCVJTU19IRFIgdW5pb24gb3Bjb2RlX3RpZCBvdDsKKwlfX3U4IHN0YXR1czsKKwlfX3U4IHJzdmRbM107Cit9OworCitzdHJ1Y3QgY3BsX3NtdF9yZWFkX3JlcSB7CisJV1JfSERSOworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJX191OCByc3ZkMDsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwkgX191ODo0OworCV9fdTggaWZmOjQ7CisjZWxzZQorCV9fdTggaWZmOjQ7CisJIF9fdTg6NDsKKyNlbmRpZgorCV9fYmUxNiByc3ZkMjsKK307CisKK3N0cnVjdCBjcGxfc210X3JlYWRfcnBsIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX191OCBzdGF0dXM7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJX191OCBtdHVfaWR4OjQ7CisJIF9fdTg6NDsKKyNlbHNlCisJIF9fdTg6NDsKKwlfX3U4IG10dV9pZHg6NDsKKyNlbmRpZgorCV9fYmUxNiByc3ZkMjsKKwlfX2JlMTYgcnN2ZDM7CisJX191OCBzcmNfbWFjMVs2XTsKKwlfX2JlMTYgcnN2ZDQ7CisJX191OCBzcmNfbWFjMFs2XTsKK307CisKK3N0cnVjdCBjcGxfcnRlX2RlbGV0ZV9yZXEgeworCVdSX0hEUjsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUzMiBwYXJhbXM7Cit9OworCisvKiB7IGNwbF9ydGVfZGVsZXRlX3JlcSwgY3BsX3J0ZV9yZWFkX3JlcSB9LnBhcmFtcyBmaWVsZHMgKi8KKyNkZWZpbmUgU19SVEVfUkVRX0xVVF9JWCAgICA4CisjZGVmaW5lIE1fUlRFX1JFUV9MVVRfSVggICAgMHg3RkYKKyNkZWZpbmUgVl9SVEVfUkVRX0xVVF9JWCh4KSAoKHgpIDw8IFNfUlRFX1JFUV9MVVRfSVgpCisjZGVmaW5lIEdfUlRFX1JFUV9MVVRfSVgoeCkgKCgoeCkgPj4gU19SVEVfUkVRX0xVVF9JWCkgJiBNX1JURV9SRVFfTFVUX0lYKQorCisjZGVmaW5lIFNfUlRFX1JFUV9MVVRfQkFTRSAgICAxOQorI2RlZmluZSBNX1JURV9SRVFfTFVUX0JBU0UgICAgMHg3RkYKKyNkZWZpbmUgVl9SVEVfUkVRX0xVVF9CQVNFKHgpICgoeCkgPDwgU19SVEVfUkVRX0xVVF9CQVNFKQorI2RlZmluZSBHX1JURV9SRVFfTFVUX0JBU0UoeCkgKCgoeCkgPj4gU19SVEVfUkVRX0xVVF9CQVNFKSAmIE1fUlRFX1JFUV9MVVRfQkFTRSkKKworI2RlZmluZSBTX1JURV9SRUFEX1JFUV9TRUxFQ1QgICAgMzEKKyNkZWZpbmUgVl9SVEVfUkVBRF9SRVFfU0VMRUNUKHgpICgoeCkgPDwgU19SVEVfUkVBRF9SRVFfU0VMRUNUKQorI2RlZmluZSBGX1JURV9SRUFEX1JFUV9TRUxFQ1QgICAgVl9SVEVfUkVBRF9SRVFfU0VMRUNUKDFVKQorCitzdHJ1Y3QgY3BsX3J0ZV9kZWxldGVfcnBsIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX191OCBzdGF0dXM7CisJX191OCByc3ZkWzNdOworfTsKKworc3RydWN0IGNwbF9ydGVfd3JpdGVfcmVxIHsKKwlXUl9IRFI7CisJdW5pb24gb3Bjb2RlX3RpZCBvdDsKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKKwkgX191ODo2OworCV9fdTggd3JpdGVfdGNhbToxOworCV9fdTggd3JpdGVfbDJ0X2x1dDoxOworI2Vsc2UKKwlfX3U4IHdyaXRlX2wydF9sdXQ6MTsKKwlfX3U4IHdyaXRlX3RjYW06MTsKKwkgX191ODo2OworI2VuZGlmCisJX191OCByc3ZkWzNdOworCV9fYmUzMiBsdXRfcGFyYW1zOworCV9fYmUxNiByc3ZkMjsKKwlfX2JlMTYgbDJ0X2lkeDsKKwlfX2JlMzIgbmV0bWFzazsKKwlfX2JlMzIgZmFkZHI7Cit9OworCisvKiBjcGxfcnRlX3dyaXRlX3JlcS5sdXRfcGFyYW1zIGZpZWxkcyAqLworI2RlZmluZSBTX1JURV9XUklURV9SRVFfTFVUX0lYICAgIDEwCisjZGVmaW5lIE1fUlRFX1dSSVRFX1JFUV9MVVRfSVggICAgMHg3RkYKKyNkZWZpbmUgVl9SVEVfV1JJVEVfUkVRX0xVVF9JWCh4KSAoKHgpIDw8IFNfUlRFX1dSSVRFX1JFUV9MVVRfSVgpCisjZGVmaW5lIEdfUlRFX1dSSVRFX1JFUV9MVVRfSVgoeCkgKCgoeCkgPj4gU19SVEVfV1JJVEVfUkVRX0xVVF9JWCkgJiBNX1JURV9XUklURV9SRVFfTFVUX0lYKQorCisjZGVmaW5lIFNfUlRFX1dSSVRFX1JFUV9MVVRfQkFTRSAgICAyMQorI2RlZmluZSBNX1JURV9XUklURV9SRVFfTFVUX0JBU0UgICAgMHg3RkYKKyNkZWZpbmUgVl9SVEVfV1JJVEVfUkVRX0xVVF9CQVNFKHgpICgoeCkgPDwgU19SVEVfV1JJVEVfUkVRX0xVVF9CQVNFKQorI2RlZmluZSBHX1JURV9XUklURV9SRVFfTFVUX0JBU0UoeCkgKCgoeCkgPj4gU19SVEVfV1JJVEVfUkVRX0xVVF9CQVNFKSAmIE1fUlRFX1dSSVRFX1JFUV9MVVRfQkFTRSkKKworc3RydWN0IGNwbF9ydGVfd3JpdGVfcnBsIHsKKwlSU1NfSERSIHVuaW9uIG9wY29kZV90aWQgb3Q7CisJX191OCBzdGF0dXM7CisJX191OCByc3ZkWzNdOworfTsKKworc3RydWN0IGNwbF9ydGVfcmVhZF9yZXEgeworCVdSX0hEUjsKKwl1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fYmUzMiBwYXJhbXM7Cit9OworCitzdHJ1Y3QgY3BsX3J0ZV9yZWFkX3JwbCB7CisJUlNTX0hEUiB1bmlvbiBvcGNvZGVfdGlkIG90OworCV9fdTggc3RhdHVzOworCV9fdTggcnN2ZDA7CisJX19iZTE2IGwydF9pZHg7CisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCisJIF9fdTg6NzsKKwlfX3U4IHNlbGVjdDoxOworI2Vsc2UKKwlfX3U4IHNlbGVjdDoxOworCSBfX3U4Ojc7CisjZW5kaWYKKwlfX3U4IHJzdmQyWzNdOworCV9fYmUzMiBhZGRyOworfTsKKworc3RydWN0IGNwbF90aWRfcmVsZWFzZSB7CisJV1JfSERSOworCXVuaW9uIG9wY29kZV90aWQgb3Q7CisJX19iZTMyIHJzdmQ7Cit9OworCitzdHJ1Y3QgY3BsX2JhcnJpZXIgeworCVdSX0hEUjsKKwlfX3U4IG9wY29kZTsKKwlfX3U4IHJzdmRbN107Cit9OworCitzdHJ1Y3QgY3BsX3JkbWFfcmVhZF9yZXEgeworCV9fdTggb3Bjb2RlOworCV9fdTggcnN2ZFsxNV07Cit9OworCitzdHJ1Y3QgY3BsX3JkbWFfdGVybWluYXRlIHsKKyNpZmRlZiBDSEVMU0lPX0ZXCisJX191OCBvcGNvZGU7CisJX191OCByc3ZkWzJdOworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorCV9fdTggcnNwcTozOworCSBfX3U4OjU7CisjZWxzZQorCSBfX3U4OjU7CisJX191OCByc3BxOjM7CisjZW5kaWYKKwlfX2JlMzIgdGlkX2xlbjsKKyNlbmRpZgorCV9fYmUzMiBtc247CisJX19iZTMyIG1vOworCV9fdTggZGF0YVswXTsKK307CisKKy8qIGNwbF9yZG1hX3Rlcm1pbmF0ZS50aWRfbGVuIGZpZWxkcyAqLworI2RlZmluZSBTX0ZMSVRfQ05UICAgIDAKKyNkZWZpbmUgTV9GTElUX0NOVCAgICAweEZGCisjZGVmaW5lIFZfRkxJVF9DTlQoeCkgKCh4KSA8PCBTX0ZMSVRfQ05UKQorI2RlZmluZSBHX0ZMSVRfQ05UKHgpICgoKHgpID4+IFNfRkxJVF9DTlQpICYgTV9GTElUX0NOVCkKKworI2RlZmluZSBTX1RFUk1fVElEICAgIDgKKyNkZWZpbmUgTV9URVJNX1RJRCAgICAweEZGRkZGCisjZGVmaW5lIFZfVEVSTV9USUQoeCkgKCh4KSA8PCBTX1RFUk1fVElEKQorI2RlZmluZSBHX1RFUk1fVElEKHgpICgoKHgpID4+IFNfVEVSTV9USUQpICYgTV9URVJNX1RJRCkKKyNlbmRpZgkJCQkvKiBUM19DUExfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvdDNfaHcuYyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3QzX2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1YTdmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3QzX2h3LmMKQEAgLTAsMCArMSwzMzc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJyZWdzLmgiCisjaW5jbHVkZSAic2dlX2RlZnMuaCIKKyNpbmNsdWRlICJmaXJtd2FyZV9leHBvcnRzLmgiCisKKy8qKgorICoJdDNfd2FpdF9vcF9kb25lX3ZhbCAtIHdhaXQgdW50aWwgYW4gb3BlcmF0aW9uIGlzIGNvbXBsZXRlZAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgorICoJQHJlZzogdGhlIHJlZ2lzdGVyIHRvIGNoZWNrIGZvciBjb21wbGV0aW9uCisgKglAbWFzazogYSBzaW5nbGUtYml0IGZpZWxkIHdpdGhpbiBAcmVnIHRoYXQgaW5kaWNhdGVzIGNvbXBsZXRpb24KKyAqCUBwb2xhcml0eTogdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkCisgKglAYXR0ZW1wdHM6IG51bWJlciBvZiBjaGVjayBpdGVyYXRpb25zCisgKglAZGVsYXk6IGRlbGF5IGluIHVzZWNzIGJldHdlZW4gaXRlcmF0aW9ucworICoJQHZhbHA6IHdoZXJlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgYXQgY29tcGxldGlvbiB0aW1lCisgKgorICoJV2FpdCB1bnRpbCBhbiBvcGVyYXRpb24gaXMgY29tcGxldGVkIGJ5IGNoZWNraW5nIGEgYml0IGluIGEgcmVnaXN0ZXIKKyAqCXVwIHRvIEBhdHRlbXB0cyB0aW1lcy4gIElmIEB2YWxwIGlzIG5vdCBOVUxMIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIKKyAqCWF0IHRoZSB0aW1lIGl0IGluZGljYXRlZCBjb21wbGV0aW9uIGlzIHN0b3JlZCB0aGVyZS4gIFJldHVybnMgMCBpZiB0aGUKKyAqCW9wZXJhdGlvbiBjb21wbGV0ZXMgYW5kIC1FQUdBSU4gb3RoZXJ3aXNlLgorICovCisKK2ludCB0M193YWl0X29wX2RvbmVfdmFsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcmVnLCB1MzIgbWFzaywKKwkJCWludCBwb2xhcml0eSwgaW50IGF0dGVtcHRzLCBpbnQgZGVsYXksIHUzMiAqdmFscCkKK3sKKwl3aGlsZSAoMSkgeworCQl1MzIgdmFsID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgcmVnKTsKKworCQlpZiAoISEodmFsICYgbWFzaykgPT0gcG9sYXJpdHkpIHsKKwkJCWlmICh2YWxwKQorCQkJCSp2YWxwID0gdmFsOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKC0tYXR0ZW1wdHMgPT0gMCkKKyAJCQlyZXR1cm4gLUVBR0FJTjsKKwkJaWYgKGRlbGF5KQorCQkJdWRlbGF5KGRlbGF5KTsKKwl9Cit9CisKKy8qKgorICoJdDNfd3JpdGVfcmVncyAtIHdyaXRlIGEgYnVuY2ggb2YgcmVnaXN0ZXJzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIgdG8gcHJvZ3JhbQorICoJQHA6IGFuIGFycmF5IG9mIHJlZ2lzdGVyIGFkZHJlc3MvcmVnaXN0ZXIgdmFsdWUgcGFpcnMKKyAqCUBuOiB0aGUgbnVtYmVyIG9mIGFkZHJlc3MvdmFsdWUgcGFpcnMKKyAqCUBvZmZzZXQ6IHJlZ2lzdGVyIGFkZHJlc3Mgb2Zmc2V0CisgKgorICoJVGFrZXMgYW4gYXJyYXkgb2YgcmVnaXN0ZXIgYWRkcmVzcy9yZWdpc3RlciB2YWx1ZSBwYWlycyBhbmQgd3JpdGVzIGVhY2gKKyAqCXZhbHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyLiAgUmVnaXN0ZXIgYWRkcmVzc2VzIGFyZSBhZGp1c3RlZAorICoJYnkgdGhlIHN1cHBsaWVkIG9mZnNldC4KKyAqLwordm9pZCB0M193cml0ZV9yZWdzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjb25zdCBzdHJ1Y3QgYWRkcl92YWxfcGFpciAqcCwKKwkJICAgaW50IG4sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJd2hpbGUgKG4tLSkgeworCQl0M193cml0ZV9yZWcoYWRhcHRlciwgcC0+cmVnX2FkZHIgKyBvZmZzZXQsIHAtPnZhbCk7CisJCXArKzsKKwl9Cit9CisKKy8qKgorICoJdDNfc2V0X3JlZ19maWVsZCAtIHNldCBhIHJlZ2lzdGVyIGZpZWxkIHRvIGEgdmFsdWUKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlciB0byBwcm9ncmFtCisgKglAYWRkcjogdGhlIHJlZ2lzdGVyIGFkZHJlc3MKKyAqCUBtYXNrOiBzcGVjaWZpZXMgdGhlIHBvcnRpb24gb2YgdGhlIHJlZ2lzdGVyIHRvIG1vZGlmeQorICoJQHZhbDogdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHJlZ2lzdGVyIGZpZWxkCisgKgorICoJU2V0cyBhIHJlZ2lzdGVyIGZpZWxkIHNwZWNpZmllZCBieSB0aGUgc3VwcGxpZWQgbWFzayB0byB0aGUKKyAqCWdpdmVuIHZhbHVlLgorICovCit2b2lkIHQzX3NldF9yZWdfZmllbGQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBhZGRyLCB1MzIgbWFzaywKKwkJICAgICAgdTMyIHZhbCkKK3sKKwl1MzIgdiA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIGFkZHIpICYgfm1hc2s7CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgYWRkciwgdiB8IHZhbCk7CisJdDNfcmVhZF9yZWcoYWRhcHRlciwgYWRkcik7CS8qIGZsdXNoICovCit9CisKKy8qKgorICoJdDNfcmVhZF9pbmRpcmVjdCAtIHJlYWQgaW5kaXJlY3RseSBhZGRyZXNzZWQgcmVnaXN0ZXJzCisgKglAYWRhcDogdGhlIGFkYXB0ZXIKKyAqCUBhZGRyX3JlZzogcmVnaXN0ZXIgaG9sZGluZyB0aGUgaW5kaXJlY3QgYWRkcmVzcworICoJQGRhdGFfcmVnOiByZWdpc3RlciBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgaW5kaXJlY3QgcmVnaXN0ZXIKKyAqCUB2YWxzOiB3aGVyZSB0aGUgcmVhZCByZWdpc3RlciB2YWx1ZXMgYXJlIHN0b3JlZAorICoJQHN0YXJ0X2lkeDogaW5kZXggb2YgZmlyc3QgaW5kaXJlY3QgcmVnaXN0ZXIgdG8gcmVhZAorICoJQG5yZWdzOiBob3cgbWFueSBpbmRpcmVjdCByZWdpc3RlcnMgdG8gcmVhZAorICoKKyAqCVJlYWRzIHJlZ2lzdGVycyB0aGF0IGFyZSBhY2Nlc3NlZCBpbmRpcmVjdGx5IHRocm91Z2ggYW4gYWRkcmVzcy9kYXRhCisgKglyZWdpc3RlciBwYWlyLgorICovCit2b2lkIHQzX3JlYWRfaW5kaXJlY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBhZGRyX3JlZywKKwkJICAgICAgdW5zaWduZWQgaW50IGRhdGFfcmVnLCB1MzIgKnZhbHMsIHVuc2lnbmVkIGludCBucmVncywKKwkJICAgICAgdW5zaWduZWQgaW50IHN0YXJ0X2lkeCkKK3sKKwl3aGlsZSAobnJlZ3MtLSkgeworCQl0M193cml0ZV9yZWcoYWRhcCwgYWRkcl9yZWcsIHN0YXJ0X2lkeCk7CisJCSp2YWxzKysgPSB0M19yZWFkX3JlZyhhZGFwLCBkYXRhX3JlZyk7CisJCXN0YXJ0X2lkeCsrOworCX0KK30KKworLyoqCisgKgl0M19tYzdfYmRfcmVhZCAtIHJlYWQgZnJvbSBNQzcgdGhyb3VnaCBiYWNrZG9vciBhY2Nlc3NlcworICoJQG1jNzogaWRlbnRpZmllcyBNQzcgdG8gcmVhZCBmcm9tCisgKglAc3RhcnQ6IGluZGV4IG9mIGZpcnN0IDY0LWJpdCB3b3JkIHRvIHJlYWQKKyAqCUBuOiBudW1iZXIgb2YgNjQtYml0IHdvcmRzIHRvIHJlYWQKKyAqCUBidWY6IHdoZXJlIHRvIHN0b3JlIHRoZSByZWFkIHJlc3VsdAorICoKKyAqCVJlYWQgbiA2NC1iaXQgd29yZHMgZnJvbSBNQzcgc3RhcnRpbmcgYXQgd29yZCBzdGFydCwgdXNpbmcgYmFja2Rvb3IKKyAqCWFjY2Vzc2VzLgorICovCitpbnQgdDNfbWM3X2JkX3JlYWQoc3RydWN0IG1jNyAqbWM3LCB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBuLAorCQkgICB1NjQgKmJ1ZikKK3sKKwlzdGF0aWMgY29uc3QgaW50IHNoaWZ0W10gPSB7IDAsIDAsIDE2LCAyNCB9OworCXN0YXRpYyBjb25zdCBpbnQgc3RlcFtdID0geyAwLCAzMiwgMTYsIDggfTsKKworCXVuc2lnbmVkIGludCBzaXplNjQgPSBtYzctPnNpemUgLyA4OwkvKiAjIG9mIDY0LWJpdCB3b3JkcyAqLworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gbWM3LT5hZGFwdGVyOworCisJaWYgKHN0YXJ0ID49IHNpemU2NCB8fCBzdGFydCArIG4gPiBzaXplNjQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhcnQgKj0gKDggPDwgbWM3LT53aWR0aCk7CisJd2hpbGUgKG4tLSkgeworCQlpbnQgaTsKKwkJdTY0IHZhbDY0ID0gMDsKKworCQlmb3IgKGkgPSAoMSA8PCBtYzctPndpZHRoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisJCQlpbnQgYXR0ZW1wdHMgPSAxMDsKKwkJCXUzMiB2YWw7CisKKwkJCXQzX3dyaXRlX3JlZyhhZGFwLCBtYzctPm9mZnNldCArIEFfTUM3X0JEX0FERFIsIHN0YXJ0KTsKKwkJCXQzX3dyaXRlX3JlZyhhZGFwLCBtYzctPm9mZnNldCArIEFfTUM3X0JEX09QLCAwKTsKKwkJCXZhbCA9IHQzX3JlYWRfcmVnKGFkYXAsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfQkRfT1ApOworCQkJd2hpbGUgKCh2YWwgJiBGX0JVU1kpICYmIGF0dGVtcHRzLS0pCisJCQkJdmFsID0gdDNfcmVhZF9yZWcoYWRhcCwKKwkJCQkJCSAgbWM3LT5vZmZzZXQgKyBBX01DN19CRF9PUCk7CisJCQlpZiAodmFsICYgRl9CVVNZKQorCQkJCXJldHVybiAtRUlPOworCisJCQl2YWwgPSB0M19yZWFkX3JlZyhhZGFwLCBtYzctPm9mZnNldCArIEFfTUM3X0JEX0RBVEExKTsKKwkJCWlmIChtYzctPndpZHRoID09IDApIHsKKwkJCQl2YWw2NCA9IHQzX3JlYWRfcmVnKGFkYXAsCisJCQkJCQkgICAgbWM3LT5vZmZzZXQgKworCQkJCQkJICAgIEFfTUM3X0JEX0RBVEEwKTsKKwkJCQl2YWw2NCB8PSAodTY0KSB2YWwgPDwgMzI7CisJCQl9IGVsc2UgeworCQkJCWlmIChtYzctPndpZHRoID4gMSkKKwkJCQkJdmFsID4+PSBzaGlmdFttYzctPndpZHRoXTsKKwkJCQl2YWw2NCB8PSAodTY0KSB2YWwgPDwgKHN0ZXBbbWM3LT53aWR0aF0gKiBpKTsKKwkJCX0KKwkJCXN0YXJ0ICs9IDg7CisJCX0KKwkJKmJ1ZisrID0gdmFsNjQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGl6ZSBNSTEuCisgKi8KK3N0YXRpYyB2b2lkIG1pMV9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwLCBjb25zdCBzdHJ1Y3QgYWRhcHRlcl9pbmZvICphaSkKK3sKKwl1MzIgY2xrZGl2ID0gYWRhcC0+cGFyYW1zLnZwZC5jY2xrIC8gKDIgKiBhZGFwLT5wYXJhbXMudnBkLm1kYykgLSAxOworCXUzMiB2YWwgPSBGX1BSRUVOIHwgVl9NRElJTlYoYWktPm1kaWludikgfCBWX01ESUVOKGFpLT5tZGllbikgfAorCSAgICBWX0NMS0RJVihjbGtkaXYpOworCisJaWYgKCEoYWktPmNhcHMgJiBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsKSkKKwkJdmFsIHw9IFZfU1QoMSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfTUkxX0NGRywgdmFsKTsKK30KKworI2RlZmluZSBNRElPX0FUVEVNUFRTIDEwCisKKy8qCisgKiBNSTEgcmVhZC93cml0ZSBvcGVyYXRpb25zIGZvciBkaXJlY3QtYWRkcmVzc2VkIFBIWXMuCisgKi8KK3N0YXRpYyBpbnQgbWkxX3JlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwaHlfYWRkciwgaW50IG1tZF9hZGRyLAorCQkgICAgaW50IHJlZ19hZGRyLCB1bnNpZ25lZCBpbnQgKnZhbHApCit7CisJaW50IHJldDsKKwl1MzIgYWRkciA9IFZfUkVHQUREUihyZWdfYWRkcikgfCBWX1BIWUFERFIocGh5X2FkZHIpOworCisJaWYgKG1tZF9hZGRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1kaW9fbG9jayk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX0FERFIsIGFkZHIpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX01JMV9PUCwgVl9NRElfT1AoMikpOworCXJldCA9IHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX01JMV9PUCwgRl9CVVNZLCAwLCBNRElPX0FUVEVNUFRTLCAyMCk7CisJaWYgKCFyZXQpCisJCSp2YWxwID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9NSTFfREFUQSk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tZGlvX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWkxX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIGludCBtbWRfYWRkciwKKwkJICAgICBpbnQgcmVnX2FkZHIsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IHJldDsKKwl1MzIgYWRkciA9IFZfUkVHQUREUihyZWdfYWRkcikgfCBWX1BIWUFERFIocGh5X2FkZHIpOworCisJaWYgKG1tZF9hZGRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1kaW9fbG9jayk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX0FERFIsIGFkZHIpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX01JMV9EQVRBLCB2YWwpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX01JMV9PUCwgVl9NRElfT1AoMSkpOworCXJldCA9IHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX01JMV9PUCwgRl9CVVNZLCAwLCBNRElPX0FUVEVNUFRTLCAyMCk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tZGlvX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgbWkxX21kaW9fb3BzID0geworCW1pMV9yZWFkLAorCW1pMV93cml0ZQorfTsKKworLyoKKyAqIE1JMSByZWFkL3dyaXRlIG9wZXJhdGlvbnMgZm9yIGluZGlyZWN0LWFkZHJlc3NlZCBQSFlzLgorICovCitzdGF0aWMgaW50IG1pMV9leHRfcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBoeV9hZGRyLCBpbnQgbW1kX2FkZHIsCisJCQlpbnQgcmVnX2FkZHIsIHVuc2lnbmVkIGludCAqdmFscCkKK3sKKwlpbnQgcmV0OworCXUzMiBhZGRyID0gVl9SRUdBRERSKG1tZF9hZGRyKSB8IFZfUEhZQUREUihwaHlfYWRkcik7CisKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tZGlvX2xvY2spOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX01JMV9BRERSLCBhZGRyKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NSTFfREFUQSwgcmVnX2FkZHIpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX01JMV9PUCwgVl9NRElfT1AoMCkpOworCXJldCA9IHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX01JMV9PUCwgRl9CVVNZLCAwLCBNRElPX0FUVEVNUFRTLCAyMCk7CisJaWYgKCFyZXQpIHsKKwkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX09QLCBWX01ESV9PUCgzKSk7CisJCXJldCA9IHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX01JMV9PUCwgRl9CVVNZLCAwLAorCQkJCSAgICAgIE1ESU9fQVRURU1QVFMsIDIwKTsKKwkJaWYgKCFyZXQpCisJCQkqdmFscCA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfTUkxX0RBVEEpOworCX0KKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1kaW9fbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtaTFfZXh0X3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgcGh5X2FkZHIsIGludCBtbWRfYWRkciwKKwkJCSBpbnQgcmVnX2FkZHIsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IHJldDsKKwl1MzIgYWRkciA9IFZfUkVHQUREUihtbWRfYWRkcikgfCBWX1BIWUFERFIocGh5X2FkZHIpOworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWRpb19sb2NrKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NSTFfQUREUiwgYWRkcik7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfTUkxX0RBVEEsIHJlZ19hZGRyKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NSTFfT1AsIFZfTURJX09QKDApKTsKKwlyZXQgPSB0M193YWl0X29wX2RvbmUoYWRhcHRlciwgQV9NSTFfT1AsIEZfQlVTWSwgMCwgTURJT19BVFRFTVBUUywgMjApOworCWlmICghcmV0KSB7CisJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX01JMV9EQVRBLCB2YWwpOworCQl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9NSTFfT1AsIFZfTURJX09QKDEpKTsKKwkJcmV0ID0gdDNfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfTUkxX09QLCBGX0JVU1ksIDAsCisJCQkJICAgICAgTURJT19BVFRFTVBUUywgMjApOworCX0KKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1kaW9fbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZGlvX29wcyBtaTFfbWRpb19leHRfb3BzID0geworCW1pMV9leHRfcmVhZCwKKwltaTFfZXh0X3dyaXRlCit9OworCisvKioKKyAqCXQzX21kaW9fY2hhbmdlX2JpdHMgLSBtb2RpZnkgdGhlIHZhbHVlIG9mIGEgUEhZIHJlZ2lzdGVyCisgKglAcGh5OiB0aGUgUEhZIHRvIG9wZXJhdGUgb24KKyAqCUBtbWQ6IHRoZSBkZXZpY2UgYWRkcmVzcworICoJQHJlZzogdGhlIHJlZ2lzdGVyIGFkZHJlc3MKKyAqCUBjbGVhcjogd2hhdCBwYXJ0IG9mIHRoZSByZWdpc3RlciB2YWx1ZSB0byBtYXNrIG9mZgorICoJQHNldDogd2hhdCBwYXJ0IG9mIHRoZSByZWdpc3RlciB2YWx1ZSB0byBzZXQKKyAqCisgKglDaGFuZ2VzIHRoZSB2YWx1ZSBvZiBhIFBIWSByZWdpc3RlciBieSBhcHBseWluZyBhIG1hc2sgdG8gaXRzIGN1cnJlbnQKKyAqCXZhbHVlIGFuZCBPUmluZyB0aGUgcmVzdWx0IHdpdGggYSBuZXcgdmFsdWUuCisgKi8KK2ludCB0M19tZGlvX2NoYW5nZV9iaXRzKHN0cnVjdCBjcGh5ICpwaHksIGludCBtbWQsIGludCByZWcsIHVuc2lnbmVkIGludCBjbGVhciwKKwkJCXVuc2lnbmVkIGludCBzZXQpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJcmV0ID0gbWRpb19yZWFkKHBoeSwgbW1kLCByZWcsICZ2YWwpOworCWlmICghcmV0KSB7CisJCXZhbCAmPSB+Y2xlYXI7CisJCXJldCA9IG1kaW9fd3JpdGUocGh5LCBtbWQsIHJlZywgdmFsIHwgc2V0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgl0M19waHlfcmVzZXQgLSByZXNldCBhIFBIWSBibG9jaworICoJQHBoeTogdGhlIFBIWSB0byBvcGVyYXRlIG9uCisgKglAbW1kOiB0aGUgZGV2aWNlIGFkZHJlc3Mgb2YgdGhlIFBIWSBibG9jayB0byByZXNldAorICoJQHdhaXQ6IGhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSByZXNldCB0byBjb21wbGV0ZSBpbiAxbXMgaW5jcmVtZW50cworICoKKyAqCVJlc2V0cyBhIFBIWSBibG9jayBhbmQgb3B0aW9uYWxseSB3YWl0cyBmb3IgdGhlIHJlc2V0IHRvIGNvbXBsZXRlLgorICoJQG1tZCBzaG91bGQgYmUgMCBmb3IgMTAvMTAwLzEwMDAgUEhZcyBhbmQgdGhlIGRldmljZSBhZGRyZXNzIHRvIHJlc2V0CisgKglmb3IgMTBHIFBIWXMuCisgKi8KK2ludCB0M19waHlfcmVzZXQoc3RydWN0IGNwaHkgKnBoeSwgaW50IG1tZCwgaW50IHdhaXQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgY3RsOworCisJZXJyID0gdDNfbWRpb19jaGFuZ2VfYml0cyhwaHksIG1tZCwgTUlJX0JNQ1IsIEJNQ1JfUERPV04sIEJNQ1JfUkVTRVQpOworCWlmIChlcnIgfHwgIXdhaXQpCisJCXJldHVybiBlcnI7CisKKwlkbyB7CisJCWVyciA9IG1kaW9fcmVhZChwaHksIG1tZCwgTUlJX0JNQ1IsICZjdGwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJY3RsICY9IEJNQ1JfUkVTRVQ7CisJCWlmIChjdGwpCisJCQltc2xlZXAoMSk7CisJfSB3aGlsZSAoY3RsICYmIC0td2FpdCk7CisKKwlyZXR1cm4gY3RsID8gLTEgOiAwOworfQorCisvKioKKyAqCXQzX3BoeV9hZHZlcnRpc2UgLSBzZXQgdGhlIFBIWSBhZHZlcnRpc2VtZW50IHJlZ2lzdGVycyBmb3IgYXV0b25lZworICoJQHBoeTogdGhlIFBIWSB0byBvcGVyYXRlIG9uCisgKglAYWR2ZXJ0OiBiaXRtYXAgb2YgY2FwYWJpbGl0aWVzIHRoZSBQSFkgc2hvdWxkIGFkdmVydGlzZQorICoKKyAqCVNldHMgYSAxMC8xMDAvMTAwMCBQSFkncyBhZHZlcnRpc2VtZW50IHJlZ2lzdGVycyB0byBhZHZlcnRpc2UgdGhlCisgKglyZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzLgorICovCitpbnQgdDNfcGh5X2FkdmVydGlzZShzdHJ1Y3QgY3BoeSAqcGh5LCB1bnNpZ25lZCBpbnQgYWR2ZXJ0KQoreworCWludCBlcnI7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisKKwllcnIgPSBtZGlvX3JlYWQocGh5LCAwLCBNSUlfQ1RSTDEwMDAsICZ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwl2YWwgJj0gfihBRFZFUlRJU0VfMTAwMEhBTEYgfCBBRFZFUlRJU0VfMTAwMEZVTEwpOworCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQorCQl2YWwgfD0gQURWRVJUSVNFXzEwMDBIQUxGOworCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQl2YWwgfD0gQURWRVJUSVNFXzEwMDBGVUxMOworCisJZXJyID0gbWRpb193cml0ZShwaHksIDAsIE1JSV9DVFJMMTAwMCwgdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJdmFsID0gMTsKKwlpZiAoYWR2ZXJ0ICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCXZhbCB8PSBBRFZFUlRJU0VfMTBIQUxGOworCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKKwkJdmFsIHw9IEFEVkVSVElTRV8xMEZVTEw7CisJaWYgKGFkdmVydCAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJdmFsIHw9IEFEVkVSVElTRV8xMDBIQUxGOworCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCisJCXZhbCB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKKwlpZiAoYWR2ZXJ0ICYgQURWRVJUSVNFRF9QYXVzZSkKKwkJdmFsIHw9IEFEVkVSVElTRV9QQVVTRV9DQVA7CisJaWYgKGFkdmVydCAmIEFEVkVSVElTRURfQXN5bV9QYXVzZSkKKwkJdmFsIHw9IEFEVkVSVElTRV9QQVVTRV9BU1lNOworCXJldHVybiBtZGlvX3dyaXRlKHBoeSwgMCwgTUlJX0FEVkVSVElTRSwgdmFsKTsKK30KKworLyoqCisgKgl0M19zZXRfcGh5X3NwZWVkX2R1cGxleCAtIGZvcmNlIFBIWSBzcGVlZCBhbmQgZHVwbGV4CisgKglAcGh5OiB0aGUgUEhZIHRvIG9wZXJhdGUgb24KKyAqCUBzcGVlZDogcmVxdWVzdGVkIFBIWSBzcGVlZAorICoJQGR1cGxleDogcmVxdWVzdGVkIFBIWSBkdXBsZXgKKyAqCisgKglGb3JjZSBhIDEwLzEwMC8xMDAwIFBIWSdzIHNwZWVkIGFuZCBkdXBsZXguICBUaGlzIGFsc28gZGlzYWJsZXMKKyAqCWF1dG8tbmVnb3RpYXRpb24gZXhjZXB0IGZvciBHaWdFLCB3aGVyZSBhdXRvLW5lZ290aWF0aW9uIGlzIG1hbmRhdG9yeS4KKyAqLworaW50IHQzX3NldF9waHlfc3BlZWRfZHVwbGV4KHN0cnVjdCBjcGh5ICpwaHksIGludCBzcGVlZCwgaW50IGR1cGxleCkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBjdGw7CisKKwllcnIgPSBtZGlvX3JlYWQocGh5LCAwLCBNSUlfQk1DUiwgJmN0bCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChzcGVlZCA+PSAwKSB7CisJCWN0bCAmPSB+KEJNQ1JfU1BFRUQxMDAgfCBCTUNSX1NQRUVEMTAwMCB8IEJNQ1JfQU5FTkFCTEUpOworCQlpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQorCQkJY3RsIHw9IEJNQ1JfU1BFRUQxMDA7CisJCWVsc2UgaWYgKHNwZWVkID09IFNQRUVEXzEwMDApCisJCQljdGwgfD0gQk1DUl9TUEVFRDEwMDA7CisJfQorCWlmIChkdXBsZXggPj0gMCkgeworCQljdGwgJj0gfihCTUNSX0ZVTExEUExYIHwgQk1DUl9BTkVOQUJMRSk7CisJCWlmIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQljdGwgfD0gQk1DUl9GVUxMRFBMWDsKKwl9CisJaWYgKGN0bCAmIEJNQ1JfU1BFRUQxMDAwKSAvKiBhdXRvLW5lZ290aWF0aW9uIHJlcXVpcmVkIGZvciBHaWdFICovCisJCWN0bCB8PSBCTUNSX0FORU5BQkxFOworCXJldHVybiBtZGlvX3dyaXRlKHBoeSwgMCwgTUlJX0JNQ1IsIGN0bCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWRhcHRlcl9pbmZvIHQzX2FkYXBfaW5mb1tdID0geworCXsyLCAwLCAwLCAwLAorCSBGX0dQSU8yX09FTiB8IEZfR1BJTzRfT0VOIHwKKwkgRl9HUElPMl9PVVRfVkFMIHwgRl9HUElPNF9PVVRfVkFMLCBGX0dQSU8zIHwgRl9HUElPNSwKKwkgU1VQUE9SVEVEX09GRkxPQUQsCisJICZtaTFfbWRpb19vcHMsICJDaGVsc2lvIFBFOTAwMCJ9LAorCXsyLCAwLCAwLCAwLAorCSBGX0dQSU8yX09FTiB8IEZfR1BJTzRfT0VOIHwKKwkgRl9HUElPMl9PVVRfVkFMIHwgRl9HUElPNF9PVVRfVkFMLCBGX0dQSU8zIHwgRl9HUElPNSwKKwkgU1VQUE9SVEVEX09GRkxPQUQsCisJICZtaTFfbWRpb19vcHMsICJDaGVsc2lvIFQzMDIifSwKKwl7MSwgMCwgMCwgMCwKKwkgRl9HUElPMV9PRU4gfCBGX0dQSU82X09FTiB8IEZfR1BJTzdfT0VOIHwgRl9HUElPMTBfT0VOIHwKKwkgRl9HUElPMV9PVVRfVkFMIHwgRl9HUElPNl9PVVRfVkFMIHwgRl9HUElPMTBfT1VUX1ZBTCwgMCwKKwkgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BVUkgfCBTVVBQT1JURURfT0ZGTE9BRCwKKwkgJm1pMV9tZGlvX2V4dF9vcHMsICJDaGVsc2lvIFQzMTAifSwKKwl7MiwgMCwgMCwgMCwKKwkgRl9HUElPMV9PRU4gfCBGX0dQSU8yX09FTiB8IEZfR1BJTzRfT0VOIHwgRl9HUElPNV9PRU4gfCBGX0dQSU82X09FTiB8CisJIEZfR1BJTzdfT0VOIHwgRl9HUElPMTBfT0VOIHwgRl9HUElPMTFfT0VOIHwgRl9HUElPMV9PVVRfVkFMIHwKKwkgRl9HUElPNV9PVVRfVkFMIHwgRl9HUElPNl9PVVRfVkFMIHwgRl9HUElPMTBfT1VUX1ZBTCwgMCwKKwkgU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BVUkgfCBTVVBQT1JURURfT0ZGTE9BRCwKKwkgJm1pMV9tZGlvX2V4dF9vcHMsICJDaGVsc2lvIFQzMjAifSwKK307CisKKy8qCisgKiBSZXR1cm4gdGhlIGFkYXB0ZXJfaW5mbyBzdHJ1Y3R1cmUgd2l0aCBhIGdpdmVuIGluZGV4LiAgT3V0LW9mLXJhbmdlIGluZGljZXMKKyAqIHJldHVybiBOVUxMLgorICovCitjb25zdCBzdHJ1Y3QgYWRhcHRlcl9pbmZvICp0M19nZXRfYWRhcHRlcl9pbmZvKHVuc2lnbmVkIGludCBpZCkKK3sKKwlyZXR1cm4gaWQgPCBBUlJBWV9TSVpFKHQzX2FkYXBfaW5mbykgPyAmdDNfYWRhcF9pbmZvW2lkXSA6IE5VTEw7Cit9CisKKyNkZWZpbmUgQ0FQU18xRyAoU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwgXAorCQkgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0F1dG9uZWcgfCBTVVBQT1JURURfTUlJKQorI2RlZmluZSBDQVBTXzEwRyAoU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BVUkpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG9ydF90eXBlX2luZm8gcG9ydF90eXBlc1tdID0geworCXtOVUxMfSwKKwl7dDNfYWVsMTAwMl9waHlfcHJlcCwgQ0FQU18xMEcgfCBTVVBQT1JURURfRklCUkUsCisJICIxMEdCQVNFLVhSIn0sCisJe3QzX3ZzYzgyMTFfcGh5X3ByZXAsIENBUFNfMUcgfCBTVVBQT1JURURfVFAgfCBTVVBQT1JURURfSVJRLAorCSAiMTAvMTAwLzEwMDBCQVNFLVQifSwKKwl7TlVMTCwgQ0FQU18xRyB8IFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9JUlEsCisJICIxMC8xMDAvMTAwMEJBU0UtVCJ9LAorCXt0M194YXVpX2RpcmVjdF9waHlfcHJlcCwgQ0FQU18xMEcgfCBTVVBQT1JURURfVFAsICIxMEdCQVNFLUNYNCJ9LAorCXtOVUxMLCBDQVBTXzEwRywgIjEwR0JBU0UtS1g0In0sCisJe3QzX3F0MjA0NV9waHlfcHJlcCwgQ0FQU18xMEcgfCBTVVBQT1JURURfVFAsICIxMEdCQVNFLUNYNCJ9LAorCXt0M19hZWwxMDA2X3BoeV9wcmVwLCBDQVBTXzEwRyB8IFNVUFBPUlRFRF9GSUJSRSwKKwkgIjEwR0JBU0UtU1IifSwKKwl7TlVMTCwgQ0FQU18xMEcgfCBTVVBQT1JURURfVFAsICIxMEdCQVNFLUNYNCJ9LAorfTsKKworI3VuZGVmIENBUFNfMUcKKyN1bmRlZiBDQVBTXzEwRworCisjZGVmaW5lIFZQRF9FTlRSWShuYW1lLCBsZW4pIFwKKwl1OCBuYW1lIyNfa3dvcmRbMl07IHU4IG5hbWUjI19sZW47IHU4IG5hbWUjI19kYXRhW2xlbl0KKworLyoKKyAqIFBhcnRpYWwgRUVQUk9NIFZpdGFsIFByb2R1Y3QgRGF0YSBzdHJ1Y3R1cmUuICBJbmNsdWRlcyBvbmx5IHRoZSBJRCBhbmQKKyAqIFZQRC1SIHNlY3Rpb25zLgorICovCitzdHJ1Y3QgdDNfdnBkIHsKKwl1OCBpZF90YWc7CisJdTggaWRfbGVuWzJdOworCXU4IGlkX2RhdGFbMTZdOworCXU4IHZwZHJfdGFnOworCXU4IHZwZHJfbGVuWzJdOworCVZQRF9FTlRSWShwbiwgMTYpOwkvKiBwYXJ0IG51bWJlciAqLworCVZQRF9FTlRSWShlYywgMTYpOwkvKiBFQyBsZXZlbCAqLworCVZQRF9FTlRSWShzbiwgMTYpOwkvKiBzZXJpYWwgbnVtYmVyICovCisJVlBEX0VOVFJZKG5hLCAxMik7CS8qIE1BQyBhZGRyZXNzIGJhc2UgKi8KKwlWUERfRU5UUlkoY2NsaywgNik7CS8qIGNvcmUgY2xvY2sgKi8KKwlWUERfRU5UUlkobWNsaywgNik7CS8qIG1lbSBjbG9jayAqLworCVZQRF9FTlRSWSh1Y2xrLCA2KTsJLyogdVAgY2xrICovCisJVlBEX0VOVFJZKG1kYywgNik7CS8qIE1ESU8gY2xrICovCisJVlBEX0VOVFJZKG10LCAyKTsJLyogbWVtIHRpbWluZyAqLworCVZQRF9FTlRSWSh4YXVpMGNmZywgNik7CS8qIFhBVUkwIGNvbmZpZyAqLworCVZQRF9FTlRSWSh4YXVpMWNmZywgNik7CS8qIFhBVUkxIGNvbmZpZyAqLworCVZQRF9FTlRSWShwb3J0MCwgMik7CS8qIFBIWTAgY29tcGxleCAqLworCVZQRF9FTlRSWShwb3J0MSwgMik7CS8qIFBIWTEgY29tcGxleCAqLworCVZQRF9FTlRSWShwb3J0MiwgMik7CS8qIFBIWTIgY29tcGxleCAqLworCVZQRF9FTlRSWShwb3J0MywgMik7CS8qIFBIWTMgY29tcGxleCAqLworCVZQRF9FTlRSWShydiwgMSk7CS8qIGNzdW0gKi8KKwl1MzIgcGFkOwkJLyogZm9yIG11bHRpcGxlLW9mLTQgc2l6aW5nIGFuZCBhbGlnbm1lbnQgKi8KK307CisKKyNkZWZpbmUgRUVQUk9NX01BWF9QT0xMICAgNAorI2RlZmluZSBFRVBST01fU1RBVF9BRERSICAweDQwMDAKKyNkZWZpbmUgVlBEX0JBU0UgICAgICAgICAgMHhjMDAKKworLyoqCisgKgl0M19zZWVwcm9tX3JlYWQgLSByZWFkIGEgVlBEIEVFUFJPTSBsb2NhdGlvbgorICoJQGFkYXB0ZXI6IGFkYXB0ZXIgdG8gcmVhZAorICoJQGFkZHI6IEVFUFJPTSBhZGRyZXNzCisgKglAZGF0YTogd2hlcmUgdG8gc3RvcmUgdGhlIHJlYWQgZGF0YQorICoKKyAqCVJlYWQgYSAzMi1iaXQgd29yZCBmcm9tIGEgbG9jYXRpb24gaW4gVlBEIEVFUFJPTSB1c2luZyB0aGUgY2FyZCdzIFBDSQorICoJVlBEIFJPTSBjYXBhYmlsaXR5LiAgQSB6ZXJvIGlzIHdyaXR0ZW4gdG8gdGhlIGZsYWcgYml0IHdoZW4gdGhlCisgKglhZGRyZXMgaXMgd3JpdHRlbiB0byB0aGUgY29udHJvbCByZWdpc3Rlci4gIFRoZSBoYXJkd2FyZSBkZXZpY2Ugd2lsbAorICoJc2V0IHRoZSBmbGFnIHRvIDEgd2hlbiA0IGJ5dGVzIGhhdmUgYmVlbiByZWFkIGludG8gdGhlIGRhdGEgcmVnaXN0ZXIuCisgKi8KK2ludCB0M19zZWVwcm9tX3JlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgKmRhdGEpCit7CisJdTE2IHZhbDsKKwlpbnQgYXR0ZW1wdHMgPSBFRVBST01fTUFYX1BPTEw7CisJdW5zaWduZWQgaW50IGJhc2UgPSBhZGFwdGVyLT5wYXJhbXMucGNpLnZwZF9jYXBfYWRkcjsKKworCWlmICgoYWRkciA+PSBFRVBST01TSVpFICYmIGFkZHIgIT0gRUVQUk9NX1NUQVRfQUREUikgfHwgKGFkZHIgJiAzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYWRhcHRlci0+cGRldiwgYmFzZSArIFBDSV9WUERfQUREUiwgYWRkcik7CisJZG8geworCQl1ZGVsYXkoMTApOworCQlwY2lfcmVhZF9jb25maWdfd29yZChhZGFwdGVyLT5wZGV2LCBiYXNlICsgUENJX1ZQRF9BRERSLCAmdmFsKTsKKwl9IHdoaWxlICghKHZhbCAmIFBDSV9WUERfQUREUl9GKSAmJiAtLWF0dGVtcHRzKTsKKworCWlmICghKHZhbCAmIFBDSV9WUERfQUREUl9GKSkgeworCQlDSF9FUlIoYWRhcHRlciwgInJlYWRpbmcgRUVQUk9NIGFkZHJlc3MgMHgleCBmYWlsZWRcbiIsIGFkZHIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsIGJhc2UgKyBQQ0lfVlBEX0RBVEEsIGRhdGEpOworCSpkYXRhID0gbGUzMl90b19jcHUoKmRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqCXQzX3NlZXByb21fd3JpdGUgLSB3cml0ZSBhIFZQRCBFRVBST00gbG9jYXRpb24KKyAqCUBhZGFwdGVyOiBhZGFwdGVyIHRvIHdyaXRlCisgKglAYWRkcjogRUVQUk9NIGFkZHJlc3MKKyAqCUBkYXRhOiB2YWx1ZSB0byB3cml0ZQorICoKKyAqCVdyaXRlIGEgMzItYml0IHdvcmQgdG8gYSBsb2NhdGlvbiBpbiBWUEQgRUVQUk9NIHVzaW5nIHRoZSBjYXJkJ3MgUENJCisgKglWUEQgUk9NIGNhcGFiaWxpdHkuCisgKi8KK2ludCB0M19zZWVwcm9tX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIGRhdGEpCit7CisJdTE2IHZhbDsKKwlpbnQgYXR0ZW1wdHMgPSBFRVBST01fTUFYX1BPTEw7CisJdW5zaWduZWQgaW50IGJhc2UgPSBhZGFwdGVyLT5wYXJhbXMucGNpLnZwZF9jYXBfYWRkcjsKKworCWlmICgoYWRkciA+PSBFRVBST01TSVpFICYmIGFkZHIgIT0gRUVQUk9NX1NUQVRfQUREUikgfHwgKGFkZHIgJiAzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsIGJhc2UgKyBQQ0lfVlBEX0RBVEEsCisJCQkgICAgICAgY3B1X3RvX2xlMzIoZGF0YSkpOworCXBjaV93cml0ZV9jb25maWdfd29yZChhZGFwdGVyLT5wZGV2LGJhc2UgKyBQQ0lfVlBEX0FERFIsCisJCQkgICAgICBhZGRyIHwgUENJX1ZQRF9BRERSX0YpOworCWRvIHsKKwkJbXNsZWVwKDEpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChhZGFwdGVyLT5wZGV2LCBiYXNlICsgUENJX1ZQRF9BRERSLCAmdmFsKTsKKwl9IHdoaWxlICgodmFsICYgUENJX1ZQRF9BRERSX0YpICYmIC0tYXR0ZW1wdHMpOworCisJaWYgKHZhbCAmIFBDSV9WUERfQUREUl9GKSB7CisJCUNIX0VSUihhZGFwdGVyLCAid3JpdGUgdG8gRUVQUk9NIGFkZHJlc3MgMHgleCBmYWlsZWRcbiIsIGFkZHIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJdDNfc2VlcHJvbV93cCAtIGVuYWJsZS9kaXNhYmxlIEVFUFJPTSB3cml0ZSBwcm90ZWN0aW9uCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBlbmFibGU6IDEgdG8gZW5hYmxlIHdyaXRlIHByb3RlY3Rpb24sIDAgdG8gZGlzYWJsZSBpdAorICoKKyAqCUVuYWJsZXMgb3IgZGlzYWJsZXMgd3JpdGUgcHJvdGVjdGlvbiBvbiB0aGUgc2VyaWFsIEVFUFJPTS4KKyAqLworaW50IHQzX3NlZXByb21fd3Aoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBlbmFibGUpCit7CisJcmV0dXJuIHQzX3NlZXByb21fd3JpdGUoYWRhcHRlciwgRUVQUk9NX1NUQVRfQUREUiwgZW5hYmxlID8gMHhjIDogMCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgY2hhcmFjdGVyIGhvbGRpbmcgYSBoZXggZGlnaXQgdG8gYSBudW1iZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGV4MmludCh1bnNpZ25lZCBjaGFyIGMpCit7CisJcmV0dXJuIGlzZGlnaXQoYykgPyBjIC0gJzAnIDogdG91cHBlcihjKSAtICdBJyArIDEwOworfQorCisvKioKKyAqCWdldF92cGRfcGFyYW1zIC0gcmVhZCBWUEQgcGFyYW1ldGVycyBmcm9tIFZQRCBFRVBST00KKyAqCUBhZGFwdGVyOiBhZGFwdGVyIHRvIHJlYWQKKyAqCUBwOiB3aGVyZSB0byBzdG9yZSB0aGUgcGFyYW1ldGVycworICoKKyAqCVJlYWRzIGNhcmQgcGFyYW1ldGVycyBzdG9yZWQgaW4gVlBEIEVFUFJPTS4KKyAqLworc3RhdGljIGludCBnZXRfdnBkX3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHZwZF9wYXJhbXMgKnApCit7CisJaW50IGksIGFkZHIsIHJldDsKKwlzdHJ1Y3QgdDNfdnBkIHZwZDsKKworCS8qCisJICogQ2FyZCBpbmZvcm1hdGlvbiBpcyBub3JtYWxseSBhdCBWUERfQkFTRSBidXQgc29tZSBlYXJseSBjYXJkcyBoYWQKKwkgKiBpdCBhdCAwLgorCSAqLworCXJldCA9IHQzX3NlZXByb21fcmVhZChhZGFwdGVyLCBWUERfQkFTRSwgKHUzMiAqKSZ2cGQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJYWRkciA9IHZwZC5pZF90YWcgPT0gMHg4MiA/IFZQRF9CQVNFIDogMDsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodnBkKTsgaSArPSA0KSB7CisJCXJldCA9IHQzX3NlZXByb21fcmVhZChhZGFwdGVyLCBhZGRyICsgaSwKKwkJCQkgICAgICAodTMyICopKCh1OCAqKSZ2cGQgKyBpKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXAtPmNjbGsgPSBzaW1wbGVfc3RydG91bCh2cGQuY2Nsa19kYXRhLCBOVUxMLCAxMCk7CisJcC0+bWNsayA9IHNpbXBsZV9zdHJ0b3VsKHZwZC5tY2xrX2RhdGEsIE5VTEwsIDEwKTsKKwlwLT51Y2xrID0gc2ltcGxlX3N0cnRvdWwodnBkLnVjbGtfZGF0YSwgTlVMTCwgMTApOworCXAtPm1kYyA9IHNpbXBsZV9zdHJ0b3VsKHZwZC5tZGNfZGF0YSwgTlVMTCwgMTApOworCXAtPm1lbV90aW1pbmcgPSBzaW1wbGVfc3RydG91bCh2cGQubXRfZGF0YSwgTlVMTCwgMTApOworCisJLyogT2xkIGVlcHJvbXMgZGlkbid0IGhhdmUgcG9ydCBpbmZvcm1hdGlvbiAqLworCWlmIChhZGFwdGVyLT5wYXJhbXMucmV2ID09IDAgJiYgIXZwZC5wb3J0MF9kYXRhWzBdKSB7CisJCXAtPnBvcnRfdHlwZVswXSA9IHVzZXNfeGF1aShhZGFwdGVyKSA/IDEgOiAyOworCQlwLT5wb3J0X3R5cGVbMV0gPSB1c2VzX3hhdWkoYWRhcHRlcikgPyA2IDogMjsKKwl9IGVsc2UgeworCQlwLT5wb3J0X3R5cGVbMF0gPSBoZXgyaW50KHZwZC5wb3J0MF9kYXRhWzBdKTsKKwkJcC0+cG9ydF90eXBlWzFdID0gaGV4MmludCh2cGQucG9ydDFfZGF0YVswXSk7CisJCXAtPnhhdWljZmdbMF0gPSBzaW1wbGVfc3RydG91bCh2cGQueGF1aTBjZmdfZGF0YSwgTlVMTCwgMTYpOworCQlwLT54YXVpY2ZnWzFdID0gc2ltcGxlX3N0cnRvdWwodnBkLnhhdWkxY2ZnX2RhdGEsIE5VTEwsIDE2KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQlwLT5ldGhfYmFzZVtpXSA9IGhleDJpbnQodnBkLm5hX2RhdGFbMiAqIGldKSAqIDE2ICsKKwkJCQkgaGV4MmludCh2cGQubmFfZGF0YVsyICogaSArIDFdKTsKKwlyZXR1cm4gMDsKK30KKworLyogc2VyaWFsIGZsYXNoIGFuZCBmaXJtd2FyZSBjb25zdGFudHMgKi8KK2VudW0geworCVNGX0FUVEVNUFRTID0gNSwJLyogbWF4IHJldHJpZXMgZm9yIFNGMSBvcGVyYXRpb25zICovCisJU0ZfU0VDX1NJWkUgPSA2NCAqIDEwMjQsCS8qIHNlcmlhbCBmbGFzaCBzZWN0b3Igc2l6ZSAqLworCVNGX1NJWkUgPSBTRl9TRUNfU0laRSAqIDgsCS8qIHNlcmlhbCBmbGFzaCBzaXplICovCisKKwkvKiBmbGFzaCBjb21tYW5kIG9wY29kZXMgKi8KKwlTRl9QUk9HX1BBR0UgPSAyLAkvKiBwcm9ncmFtIHBhZ2UgKi8KKwlTRl9XUl9ESVNBQkxFID0gNCwJLyogZGlzYWJsZSB3cml0ZXMgKi8KKwlTRl9SRF9TVEFUVVMgPSA1LAkvKiByZWFkIHN0YXR1cyByZWdpc3RlciAqLworCVNGX1dSX0VOQUJMRSA9IDYsCS8qIGVuYWJsZSB3cml0ZXMgKi8KKwlTRl9SRF9EQVRBX0ZBU1QgPSAweGIsCS8qIHJlYWQgZmxhc2ggKi8KKwlTRl9FUkFTRV9TRUNUT1IgPSAweGQ4LAkvKiBlcmFzZSBzZWN0b3IgKi8KKworCUZXX0ZMQVNIX0JPT1RfQUREUiA9IDB4NzAwMDAsCS8qIHN0YXJ0IGFkZHJlc3Mgb2YgRlcgaW4gZmxhc2ggKi8KKwlGV19WRVJTX0FERFIgPSAweDc3ZmZjCS8qIGZsYXNoIGFkZHJlc3MgaG9sZGluZyBGVyB2ZXJzaW9uICovCit9OworCisvKioKKyAqCXNmMV9yZWFkIC0gcmVhZCBkYXRhIGZyb20gdGhlIHNlcmlhbCBmbGFzaAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAYnl0ZV9jbnQ6IG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKglAY29udDogd2hldGhlciBhbm90aGVyIG9wZXJhdGlvbiB3aWxsIGJlIGNoYWluZWQKKyAqCUB2YWxwOiB3aGVyZSB0byBzdG9yZSB0aGUgcmVhZCBkYXRhCisgKgorICoJUmVhZHMgdXAgdG8gNCBieXRlcyBvZiBkYXRhIGZyb20gdGhlIHNlcmlhbCBmbGFzaC4gIFRoZSBsb2NhdGlvbiBvZgorICoJdGhlIHJlYWQgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBieSBpc3N1aW5nIHRoZQorICoJYXBwcm9wcmlhdGUgY29tbWFuZHMgdG8gdGhlIHNlcmlhbCBmbGFzaC4KKyAqLworc3RhdGljIGludCBzZjFfcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGJ5dGVfY250LCBpbnQgY29udCwKKwkJICAgIHUzMiAqdmFscCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFieXRlX2NudCB8fCBieXRlX2NudCA+IDQpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1NGX09QKSAmIEZfQlVTWSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TRl9PUCwgVl9DT05UKGNvbnQpIHwgVl9CWVRFQ05UKGJ5dGVfY250IC0gMSkpOworCXJldCA9IHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX1NGX09QLCBGX0JVU1ksIDAsIFNGX0FUVEVNUFRTLCAxMCk7CisJaWYgKCFyZXQpCisJCSp2YWxwID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9TRl9EQVRBKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCXNmMV93cml0ZSAtIHdyaXRlIGRhdGEgdG8gdGhlIHNlcmlhbCBmbGFzaAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAYnl0ZV9jbnQ6IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICoJQGNvbnQ6IHdoZXRoZXIgYW5vdGhlciBvcGVyYXRpb24gd2lsbCBiZSBjaGFpbmVkCisgKglAdmFsOiB2YWx1ZSB0byB3cml0ZQorICoKKyAqCVdyaXRlcyB1cCB0byA0IGJ5dGVzIG9mIGRhdGEgdG8gdGhlIHNlcmlhbCBmbGFzaC4gIFRoZSBsb2NhdGlvbiBvZgorICoJdGhlIHdyaXRlIG5lZWRzIHRvIGJlIHNwZWNpZmllZCBwcmlvciB0byBjYWxsaW5nIHRoaXMgYnkgaXNzdWluZyB0aGUKKyAqCWFwcHJvcHJpYXRlIGNvbW1hbmRzIHRvIHRoZSBzZXJpYWwgZmxhc2guCisgKi8KK3N0YXRpYyBpbnQgc2YxX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgYnl0ZV9jbnQsIGludCBjb250LAorCQkgICAgIHUzMiB2YWwpCit7CisJaWYgKCFieXRlX2NudCB8fCBieXRlX2NudCA+IDQpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1NGX09QKSAmIEZfQlVTWSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TRl9EQVRBLCB2YWwpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NGX09QLAorCQkgICAgIFZfQ09OVChjb250KSB8IFZfQllURUNOVChieXRlX2NudCAtIDEpIHwgVl9PUCgxKSk7CisJcmV0dXJuIHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX1NGX09QLCBGX0JVU1ksIDAsIFNGX0FUVEVNUFRTLCAxMCk7Cit9CisKKy8qKgorICoJZmxhc2hfd2FpdF9vcCAtIHdhaXQgZm9yIGEgZmxhc2ggb3BlcmF0aW9uIHRvIGNvbXBsZXRlCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBhdHRlbXB0czogbWF4IG51bWJlciBvZiBwb2xscyBvZiB0aGUgc3RhdHVzIHJlZ2lzdGVyCisgKglAZGVsYXk6IGRlbGF5IGJldHdlZW4gcG9sbHMgaW4gbXMKKyAqCisgKglXYWl0IGZvciBhIGZsYXNoIG9wZXJhdGlvbiB0byBjb21wbGV0ZSBieSBwb2xsaW5nIHRoZSBzdGF0dXMgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQgZmxhc2hfd2FpdF9vcChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGF0dGVtcHRzLCBpbnQgZGVsYXkpCit7CisJaW50IHJldDsKKwl1MzIgc3RhdHVzOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKChyZXQgPSBzZjFfd3JpdGUoYWRhcHRlciwgMSwgMSwgU0ZfUkRfU1RBVFVTKSkgIT0gMCB8fAorCQkgICAgKHJldCA9IHNmMV9yZWFkKGFkYXB0ZXIsIDEsIDAsICZzdGF0dXMpKSAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKCEoc3RhdHVzICYgMSkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKC0tYXR0ZW1wdHMgPT0gMCkKKwkJCXJldHVybiAtRUFHQUlOOworCQlpZiAoZGVsYXkpCisJCQltc2xlZXAoZGVsYXkpOworCX0KK30KKworLyoqCisgKgl0M19yZWFkX2ZsYXNoIC0gcmVhZCB3b3JkcyBmcm9tIHNlcmlhbCBmbGFzaAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAYWRkcjogdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIHRoZSByZWFkCisgKglAbndvcmRzOiBob3cgbWFueSAzMi1iaXQgd29yZHMgdG8gcmVhZAorICoJQGRhdGE6IHdoZXJlIHRvIHN0b3JlIHRoZSByZWFkIGRhdGEKKyAqCUBieXRlX29yaWVudGVkOiB3aGV0aGVyIHRvIHN0b3JlIGRhdGEgYXMgYnl0ZXMgb3IgYXMgd29yZHMKKyAqCisgKglSZWFkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyBmcm9tIHRoZSBzZXJpYWwgZmxhc2guCisgKglJZiBAYnl0ZV9vcmllbnRlZCBpcyBzZXQgdGhlIHJlYWQgZGF0YSBpcyBzdG9yZWQgYXMgYSBieXRlIGFycmF5CisgKgkoaS5lLiwgYmlnLWVuZGlhbiksIG90aGVyd2lzZSBhcyAzMi1iaXQgd29yZHMgaW4gdGhlIHBsYXRmb3JtJ3MKKyAqCW5hdHVyYWwgZW5kaWFuZXNzLgorICovCitpbnQgdDNfcmVhZF9mbGFzaChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGFkZHIsCisJCSAgdW5zaWduZWQgaW50IG53b3JkcywgdTMyICpkYXRhLCBpbnQgYnl0ZV9vcmllbnRlZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGFkZHIgKyBud29yZHMgKiBzaXplb2YodTMyKSA+IFNGX1NJWkUgfHwgKGFkZHIgJiAzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGRyID0gc3dhYjMyKGFkZHIpIHwgU0ZfUkRfREFUQV9GQVNUOworCisJaWYgKChyZXQgPSBzZjFfd3JpdGUoYWRhcHRlciwgNCwgMSwgYWRkcikpICE9IDAgfHwKKwkgICAgKHJldCA9IHNmMV9yZWFkKGFkYXB0ZXIsIDEsIDEsIGRhdGEpKSAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yICg7IG53b3JkczsgbndvcmRzLS0sIGRhdGErKykgeworCQlyZXQgPSBzZjFfcmVhZChhZGFwdGVyLCA0LCBud29yZHMgPiAxLCBkYXRhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChieXRlX29yaWVudGVkKQorCQkJKmRhdGEgPSBodG9ubCgqZGF0YSk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqCXQzX3dyaXRlX2ZsYXNoIC0gd3JpdGUgdXAgdG8gYSBwYWdlIG9mIGRhdGEgdG8gdGhlIHNlcmlhbCBmbGFzaAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAYWRkcjogdGhlIHN0YXJ0IGFkZHJlc3MgdG8gd3JpdGUKKyAqCUBuOiBsZW5ndGggb2YgZGF0YSB0byB3cml0ZQorICoJQGRhdGE6IHRoZSBkYXRhIHRvIHdyaXRlCisgKgorICoJV3JpdGVzIHVwIHRvIGEgcGFnZSBvZiBkYXRhICgyNTYgYnl0ZXMpIHRvIHRoZSBzZXJpYWwgZmxhc2ggc3RhcnRpbmcKKyAqCWF0IHRoZSBnaXZlbiBhZGRyZXNzLgorICovCitzdGF0aWMgaW50IHQzX3dyaXRlX2ZsYXNoKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgYWRkciwKKwkJCSAgdW5zaWduZWQgaW50IG4sIGNvbnN0IHU4ICpkYXRhKQoreworCWludCByZXQ7CisJdTMyIGJ1Zls2NF07CisJdW5zaWduZWQgaW50IGksIGMsIGxlZnQsIHZhbCwgb2Zmc2V0ID0gYWRkciAmIDB4ZmY7CisKKwlpZiAoYWRkciArIG4gPiBTRl9TSVpFIHx8IG9mZnNldCArIG4gPiAyNTYpCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsID0gc3dhYjMyKGFkZHIpIHwgU0ZfUFJPR19QQUdFOworCisJaWYgKChyZXQgPSBzZjFfd3JpdGUoYWRhcHRlciwgMSwgMCwgU0ZfV1JfRU5BQkxFKSkgIT0gMCB8fAorCSAgICAocmV0ID0gc2YxX3dyaXRlKGFkYXB0ZXIsIDQsIDEsIHZhbCkpICE9IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGxlZnQgPSBuOyBsZWZ0OyBsZWZ0IC09IGMpIHsKKwkJYyA9IG1pbihsZWZ0LCA0VSk7CisJCWZvciAodmFsID0gMCwgaSA9IDA7IGkgPCBjOyArK2kpCisJCQl2YWwgPSAodmFsIDw8IDgpICsgKmRhdGErKzsKKworCQlyZXQgPSBzZjFfd3JpdGUoYWRhcHRlciwgYywgYyAhPSBsZWZ0LCB2YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJaWYgKChyZXQgPSBmbGFzaF93YWl0X29wKGFkYXB0ZXIsIDUsIDEpKSAhPSAwKQorCQlyZXR1cm4gcmV0OworCisJLyogUmVhZCB0aGUgcGFnZSB0byB2ZXJpZnkgdGhlIHdyaXRlIHN1Y2NlZWRlZCAqLworCXJldCA9IHQzX3JlYWRfZmxhc2goYWRhcHRlciwgYWRkciAmIH4weGZmLCBBUlJBWV9TSVpFKGJ1ZiksIGJ1ZiwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChtZW1jbXAoZGF0YSAtIG4sICh1OCAqKSBidWYgKyBvZmZzZXQsIG4pKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworZW51bSBmd192ZXJzaW9uX3R5cGUgeworCUZXX1ZFUlNJT05fTjMsCisJRldfVkVSU0lPTl9UMworfTsKKworLyoqCisgKgl0M19nZXRfZndfdmVyc2lvbiAtIHJlYWQgdGhlIGZpcm13YXJlIHZlcnNpb24KKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHZlcnM6IHdoZXJlIHRvIHBsYWNlIHRoZSB2ZXJzaW9uCisgKgorICoJUmVhZHMgdGhlIEZXIHZlcnNpb24gZnJvbSBmbGFzaC4KKyAqLworaW50IHQzX2dldF9md192ZXJzaW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgKnZlcnMpCit7CisJcmV0dXJuIHQzX3JlYWRfZmxhc2goYWRhcHRlciwgRldfVkVSU19BRERSLCAxLCB2ZXJzLCAwKTsKK30KKworLyoqCisgKgl0M19jaGVja19md192ZXJzaW9uIC0gY2hlY2sgaWYgdGhlIEZXIGlzIGNvbXBhdGlibGUgd2l0aCB0aGlzIGRyaXZlcgorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKgorICoJQ2hlY2tzIGlmIGFuIGFkYXB0ZXIncyBGVyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGRyaXZlci4gIFJldHVybnMgMAorICoJaWYgdGhlIHZlcnNpb25zIGFyZSBjb21wYXRpYmxlLCBhIG5lZ2F0aXZlIGVycm9yIG90aGVyd2lzZS4KKyAqLworaW50IHQzX2NoZWNrX2Z3X3ZlcnNpb24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJldDsKKwl1MzIgdmVyczsKKwl1bnNpZ25lZCBpbnQgdHlwZSwgbWFqb3IsIG1pbm9yOworCisJcmV0ID0gdDNfZ2V0X2Z3X3ZlcnNpb24oYWRhcHRlciwgJnZlcnMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0eXBlID0gR19GV19WRVJTSU9OX1RZUEUodmVycyk7CisJbWFqb3IgPSBHX0ZXX1ZFUlNJT05fTUFKT1IodmVycyk7CisJbWlub3IgPSBHX0ZXX1ZFUlNJT05fTUlOT1IodmVycyk7CisKKwlpZiAodHlwZSA9PSBGV19WRVJTSU9OX1QzICYmIG1ham9yID09IDMgJiYgbWlub3IgPT0gMSkKKwkJcmV0dXJuIDA7CisKKwlDSF9FUlIoYWRhcHRlciwgImZvdW5kIHdyb25nIEZXIHZlcnNpb24oJXUuJXUpLCAiCisJICAgICAgICJkcml2ZXIgbmVlZHMgdmVyc2lvbiAzLjFcbiIsIG1ham9yLCBtaW5vcik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICoJdDNfZmxhc2hfZXJhc2Vfc2VjdG9ycyAtIGVyYXNlIGEgcmFuZ2Ugb2YgZmxhc2ggc2VjdG9ycworICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAc3RhcnQ6IHRoZSBmaXJzdCBzZWN0b3IgdG8gZXJhc2UKKyAqCUBlbmQ6IHRoZSBsYXN0IHNlY3RvciB0byBlcmFzZQorICoKKyAqCUVyYXNlcyB0aGUgc2VjdG9ycyBpbiB0aGUgZ2l2ZW4gcmFuZ2UuCisgKi8KK3N0YXRpYyBpbnQgdDNfZmxhc2hfZXJhc2Vfc2VjdG9ycyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHN0YXJ0LCBpbnQgZW5kKQoreworCXdoaWxlIChzdGFydCA8PSBlbmQpIHsKKwkJaW50IHJldDsKKworCQlpZiAoKHJldCA9IHNmMV93cml0ZShhZGFwdGVyLCAxLCAwLCBTRl9XUl9FTkFCTEUpKSAhPSAwIHx8CisJCSAgICAocmV0ID0gc2YxX3dyaXRlKGFkYXB0ZXIsIDQsIDAsCisJCQkJICAgICBTRl9FUkFTRV9TRUNUT1IgfCAoc3RhcnQgPDwgOCkpKSAhPSAwIHx8CisJCSAgICAocmV0ID0gZmxhc2hfd2FpdF9vcChhZGFwdGVyLCA1LCA1MDApKSAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwkJc3RhcnQrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgl0M19sb2FkX2Z3IC0gZG93bmxvYWQgZmlybXdhcmUKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQGZ3X2RhdGE6IHRoZSBmaXJyd2FyZSBpbWFnZSB0byB3cml0ZQorICoJQHNpemU6IGltYWdlIHNpemUKKyAqCisgKglXcml0ZSB0aGUgc3VwcGxpZWQgZmlybXdhcmUgaW1hZ2UgdG8gdGhlIGNhcmQncyBzZXJpYWwgZmxhc2guCisgKglUaGUgRlcgaW1hZ2UgaGFzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6IEBzaXplIC0gOCBieXRlcyBvZiBjb2RlIGFuZAorICoJZGF0YSwgZm9sbG93ZWQgYnkgNCBieXRlcyBvZiBGVyB2ZXJzaW9uLCBmb2xsb3dlZCBieSB0aGUgMzItYml0CisgKgkxJ3MgY29tcGxlbWVudCBjaGVja3N1bSBvZiB0aGUgd2hvbGUgaW1hZ2UuCisgKi8KK2ludCB0M19sb2FkX2Z3KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqZndfZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCit7CisJdTMyIGNzdW07CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgdTMyICpwID0gKGNvbnN0IHUzMiAqKWZ3X2RhdGE7CisJaW50IHJldCwgYWRkciwgZndfc2VjdG9yID0gRldfRkxBU0hfQk9PVF9BRERSID4+IDE2OworCisJaWYgKHNpemUgJiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2l6ZSA+IEZXX1ZFUlNfQUREUiArIDggLSBGV19GTEFTSF9CT09UX0FERFIpCisJCXJldHVybiAtRUZCSUc7CisKKwlmb3IgKGNzdW0gPSAwLCBpID0gMDsgaSA8IHNpemUgLyBzaXplb2YoY3N1bSk7IGkrKykKKwkJY3N1bSArPSBudG9obChwW2ldKTsKKwlpZiAoY3N1bSAhPSAweGZmZmZmZmZmKSB7CisJCUNIX0VSUihhZGFwdGVyLCAiY29ycnVwdGVkIGZpcm13YXJlIGltYWdlLCBjaGVja3N1bSAldVxuIiwKKwkJICAgICAgIGNzdW0pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSB0M19mbGFzaF9lcmFzZV9zZWN0b3JzKGFkYXB0ZXIsIGZ3X3NlY3RvciwgZndfc2VjdG9yKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXNpemUgLT0gODsJCS8qIHRyaW0gb2ZmIHZlcnNpb24gYW5kIGNoZWNrc3VtICovCisJZm9yIChhZGRyID0gRldfRkxBU0hfQk9PVF9BRERSOyBzaXplOykgeworCQl1bnNpZ25lZCBpbnQgY2h1bmtfc2l6ZSA9IG1pbihzaXplLCAyNTZVKTsKKworCQlyZXQgPSB0M193cml0ZV9mbGFzaChhZGFwdGVyLCBhZGRyLCBjaHVua19zaXplLCBmd19kYXRhKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCWFkZHIgKz0gY2h1bmtfc2l6ZTsKKwkJZndfZGF0YSArPSBjaHVua19zaXplOworCQlzaXplIC09IGNodW5rX3NpemU7CisJfQorCisJcmV0ID0gdDNfd3JpdGVfZmxhc2goYWRhcHRlciwgRldfVkVSU19BRERSLCA0LCBmd19kYXRhKTsKK291dDoKKwlpZiAocmV0KQorCQlDSF9FUlIoYWRhcHRlciwgImZpcm13YXJlIGRvd25sb2FkIGZhaWxlZCwgZXJyb3IgJWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBDSU1fQ1RMX0JBU0UgMHgyMDAwCisKKy8qKgorICogICAgICB0M19jaW1fY3RsX2Jsa19yZWFkIC0gcmVhZCBhIGJsb2NrIGZyb20gQ0lNIGNvbnRyb2wgcmVnaW9uCisgKgorICogICAgICBAYWRhcDogdGhlIGFkYXB0ZXIKKyAqICAgICAgQGFkZHI6IHRoZSBzdGFydCBhZGRyZXNzIHdpdGhpbiB0aGUgQ0lNIGNvbnRyb2wgcmVnaW9uCisgKiAgICAgIEBuOiBudW1iZXIgb2Ygd29yZHMgdG8gcmVhZAorICogICAgICBAdmFscDogd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdAorICoKKyAqICAgICAgUmVhZHMgYSBibG9jayBvZiA0LWJ5dGUgd29yZHMgZnJvbSB0aGUgQ0lNIGNvbnRyb2wgcmVnaW9uLgorICovCitpbnQgdDNfY2ltX2N0bF9ibGtfcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IGFkZHIsCisJCQl1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50ICp2YWxwKQoreworCWludCByZXQgPSAwOworCisJaWYgKHQzX3JlYWRfcmVnKGFkYXAsIEFfQ0lNX0hPU1RfQUNDX0NUUkwpICYgRl9IT1NUQlVTWSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWZvciAoIDsgIXJldCAmJiBuLS07IGFkZHIgKz0gNCkgeworCQl0M193cml0ZV9yZWcoYWRhcCwgQV9DSU1fSE9TVF9BQ0NfQ1RSTCwgQ0lNX0NUTF9CQVNFICsgYWRkcik7CisJCXJldCA9IHQzX3dhaXRfb3BfZG9uZShhZGFwLCBBX0NJTV9IT1NUX0FDQ19DVFJMLCBGX0hPU1RCVVNZLAorCQkJCSAgICAgIDAsIDUsIDIpOworCQlpZiAoIXJldCkKKwkJCSp2YWxwKysgPSB0M19yZWFkX3JlZyhhZGFwLCBBX0NJTV9IT1NUX0FDQ19EQVRBKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqCXQzX2xpbmtfY2hhbmdlZCAtIGhhbmRsZSBpbnRlcmZhY2UgbGluayBjaGFuZ2VzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBwb3J0X2lkOiB0aGUgcG9ydCBpbmRleCB0aGF0IGNoYW5nZWQgbGluayBzdGF0ZQorICoKKyAqCUNhbGxlZCB3aGVuIGEgcG9ydCdzIGxpbmsgc2V0dGluZ3MgY2hhbmdlIHRvIHByb3BhZ2F0ZSB0aGUgbmV3IHZhbHVlcworICoJdG8gdGhlIGFzc29jaWF0ZWQgUEhZIGFuZCBNQUMuICBBZnRlciBwZXJmb3JtaW5nIHRoZSBjb21tb24gdGFza3MgaXQKKyAqCWludm9rZXMgYW4gT1Mtc3BlY2lmaWMgaGFuZGxlci4KKyAqLwordm9pZCB0M19saW5rX2NoYW5nZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBwb3J0X2lkKQoreworCWludCBsaW5rX29rLCBzcGVlZCwgZHVwbGV4LCBmYzsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IGFkYXAycGluZm8oYWRhcHRlciwgcG9ydF9pZCk7CisJc3RydWN0IGNwaHkgKnBoeSA9ICZwaS0+cGh5OworCXN0cnVjdCBjbWFjICptYWMgPSAmcGktPm1hYzsKKwlzdHJ1Y3QgbGlua19jb25maWcgKmxjID0gJnBpLT5saW5rX2NvbmZpZzsKKworCXBoeS0+b3BzLT5nZXRfbGlua19zdGF0dXMocGh5LCAmbGlua19vaywgJnNwZWVkLCAmZHVwbGV4LCAmZmMpOworCisJaWYgKGxpbmtfb2sgIT0gbGMtPmxpbmtfb2sgJiYgYWRhcHRlci0+cGFyYW1zLnJldiA+IDAgJiYKKwkgICAgdXNlc194YXVpKGFkYXB0ZXIpKSB7CisJCWlmIChsaW5rX29rKQorCQkJdDNiX3Bjc19yZXNldChtYWMpOworCQl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9YR01fWEFVSV9BQ1RfQ1RSTCArIG1hYy0+b2Zmc2V0LAorCQkJICAgICBsaW5rX29rID8gRl9UWEFDVEVOQUJMRSB8IEZfUlhFTiA6IDApOworCX0KKwlsYy0+bGlua19vayA9IGxpbmtfb2s7CisJbGMtPnNwZWVkID0gc3BlZWQgPCAwID8gU1BFRURfSU5WQUxJRCA6IHNwZWVkOworCWxjLT5kdXBsZXggPSBkdXBsZXggPCAwID8gRFVQTEVYX0lOVkFMSUQgOiBkdXBsZXg7CisJaWYgKGxjLT5yZXF1ZXN0ZWRfZmMgJiBQQVVTRV9BVVRPTkVHKQorCQlmYyAmPSBsYy0+cmVxdWVzdGVkX2ZjOworCWVsc2UKKwkJZmMgPSBsYy0+cmVxdWVzdGVkX2ZjICYgKFBBVVNFX1JYIHwgUEFVU0VfVFgpOworCisJaWYgKGxpbmtfb2sgJiYgc3BlZWQgPj0gMCAmJiBsYy0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkvKiBTZXQgTUFDIHNwZWVkLCBkdXBsZXgsIGFuZCBmbG93IGNvbnRyb2wgdG8gbWF0Y2ggUEhZLiAqLworCQl0M19tYWNfc2V0X3NwZWVkX2R1cGxleF9mYyhtYWMsIHNwZWVkLCBkdXBsZXgsIGZjKTsKKwkJbGMtPmZjID0gZmM7CisJfQorCisJdDNfb3NfbGlua19jaGFuZ2VkKGFkYXB0ZXIsIHBvcnRfaWQsIGxpbmtfb2ssIHNwZWVkLCBkdXBsZXgsIGZjKTsKK30KKworLyoqCisgKgl0M19saW5rX3N0YXJ0IC0gYXBwbHkgbGluayBjb25maWd1cmF0aW9uIHRvIE1BQy9QSFkKKyAqCUBwaHk6IHRoZSBQSFkgdG8gc2V0dXAKKyAqCUBtYWM6IHRoZSBNQUMgdG8gc2V0dXAKKyAqCUBsYzogdGhlIHJlcXVlc3RlZCBsaW5rIGNvbmZpZ3VyYXRpb24KKyAqCisgKglTZXQgdXAgYSBwb3J0J3MgTUFDIGFuZCBQSFkgYWNjb3JkaW5nIHRvIGEgZGVzaXJlZCBsaW5rIGNvbmZpZ3VyYXRpb24uCisgKgktIElmIHRoZSBQSFkgY2FuIGF1dG8tbmVnb3RpYXRlIGZpcnN0IGRlY2lkZSB3aGF0IHRvIGFkdmVydGlzZSwgdGhlbgorICoJICBlbmFibGUvZGlzYWJsZSBhdXRvLW5lZ290aWF0aW9uIGFzIGRlc2lyZWQsIGFuZCByZXNldC4KKyAqCS0gSWYgdGhlIFBIWSBkb2VzIG5vdCBhdXRvLW5lZ290aWF0ZSBqdXN0IHJlc2V0IGl0LgorICoJLSBJZiBhdXRvLW5lZ290aWF0aW9uIGlzIG9mZiBzZXQgdGhlIE1BQyB0byB0aGUgcHJvcGVyIHNwZWVkL2R1cGxleC9GQywKKyAqCSAgb3RoZXJ3aXNlIGRvIGl0IGxhdGVyIGJhc2VkIG9uIHRoZSBvdXRjb21lIG9mIGF1dG8tbmVnb3RpYXRpb24uCisgKi8KK2ludCB0M19saW5rX3N0YXJ0KHN0cnVjdCBjcGh5ICpwaHksIHN0cnVjdCBjbWFjICptYWMsIHN0cnVjdCBsaW5rX2NvbmZpZyAqbGMpCit7CisJdW5zaWduZWQgaW50IGZjID0gbGMtPnJlcXVlc3RlZF9mYyAmIChQQVVTRV9SWCB8IFBBVVNFX1RYKTsKKworCWxjLT5saW5rX29rID0gMDsKKwlpZiAobGMtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9BdXRvbmVnKSB7CisJCWxjLT5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRURfQXN5bV9QYXVzZSB8IEFEVkVSVElTRURfUGF1c2UpOworCQlpZiAoZmMpIHsKKwkJCWxjLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisJCQlpZiAoZmMgJiBQQVVTRV9SWCkKKwkJCQlsYy0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QYXVzZTsKKwkJfQorCQlwaHktPm9wcy0+YWR2ZXJ0aXNlKHBoeSwgbGMtPmFkdmVydGlzaW5nKTsKKworCQlpZiAobGMtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CisJCQlsYy0+c3BlZWQgPSBsYy0+cmVxdWVzdGVkX3NwZWVkOworCQkJbGMtPmR1cGxleCA9IGxjLT5yZXF1ZXN0ZWRfZHVwbGV4OworCQkJbGMtPmZjID0gKHVuc2lnbmVkIGNoYXIpZmM7CisJCQl0M19tYWNfc2V0X3NwZWVkX2R1cGxleF9mYyhtYWMsIGxjLT5zcGVlZCwgbGMtPmR1cGxleCwKKwkJCQkJCSAgIGZjKTsKKwkJCS8qIEFsc28gZGlzYWJsZXMgYXV0b25lZyAqLworCQkJcGh5LT5vcHMtPnNldF9zcGVlZF9kdXBsZXgocGh5LCBsYy0+c3BlZWQsIGxjLT5kdXBsZXgpOworCQkJcGh5LT5vcHMtPnJlc2V0KHBoeSwgMCk7CisJCX0gZWxzZQorCQkJcGh5LT5vcHMtPmF1dG9uZWdfZW5hYmxlKHBoeSk7CisJfSBlbHNlIHsKKwkJdDNfbWFjX3NldF9zcGVlZF9kdXBsZXhfZmMobWFjLCAtMSwgLTEsIGZjKTsKKwkJbGMtPmZjID0gKHVuc2lnbmVkIGNoYXIpZmM7CisJCXBoeS0+b3BzLT5yZXNldChwaHksIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl0M19zZXRfdmxhbl9hY2NlbCAtIGNvbnRyb2wgSFcgVkxBTiBleHRyYWN0aW9uCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBwb3J0czogYml0bWFwIG9mIGFkYXB0ZXIgcG9ydHMgdG8gb3BlcmF0ZSBvbgorICoJQG9uOiBlbmFibGUgKDEpIG9yIGRpc2FibGUgKDApIEhXIFZMQU4gZXh0cmFjdGlvbgorICoKKyAqCUVuYWJsZXMgb3IgZGlzYWJsZXMgSFcgZXh0cmFjdGlvbiBvZiBWTEFOIHRhZ3MgZm9yIHRoZSBnaXZlbiBwb3J0LgorICovCit2b2lkIHQzX3NldF92bGFuX2FjY2VsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgcG9ydHMsIGludCBvbikKK3sKKwl0M19zZXRfcmVnX2ZpZWxkKGFkYXB0ZXIsIEFfVFBfT1VUX0NPTkZJRywKKwkJCSBwb3J0cyA8PCBTX1ZMQU5FWFRSQUNUSU9ORU5BQkxFLAorCQkJIG9uID8gKHBvcnRzIDw8IFNfVkxBTkVYVFJBQ1RJT05FTkFCTEUpIDogMCk7Cit9CisKK3N0cnVjdCBpbnRyX2luZm8geworCXVuc2lnbmVkIGludCBtYXNrOwkvKiBiaXRzIHRvIGNoZWNrIGluIGludGVycnVwdCBzdGF0dXMgKi8KKwljb25zdCBjaGFyICptc2c7CS8qIG1lc3NhZ2UgdG8gcHJpbnQgb3IgTlVMTCAqLworCXNob3J0IHN0YXRfaWR4OwkJLyogc3RhdCBjb3VudGVyIHRvIGluY3JlbWVudCBvciAtMSAqLworCXVuc2lnbmVkIHNob3J0IGZhdGFsOjE7CS8qIHdoZXRoZXIgdGhlIGNvbmRpdGlvbiByZXBvcnRlZCBpcyBmYXRhbCAqLworfTsKKworLyoqCisgKgl0M19oYW5kbGVfaW50cl9zdGF0dXMgLSB0YWJsZSBkcml2ZW4gaW50ZXJydXB0IGhhbmRsZXIKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlciB0aGF0IGdlbmVyYXRlZCB0aGUgaW50ZXJydXB0CisgKglAcmVnOiB0aGUgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciB0byBwcm9jZXNzCisgKglAbWFzazogYSBtYXNrIHRvIGFwcGx5IHRvIHRoZSBpbnRlcnJ1cHQgc3RhdHVzCisgKglAYWN0czogdGFibGUgb2YgaW50ZXJydXB0IGFjdGlvbnMKKyAqCUBzdGF0czogc3RhdGlzdGljcyBjb3VudGVycyB0cmFja2luZyBpbnRlcnJ1cHQgb2NjdXJlbmNlcworICoKKyAqCUEgdGFibGUgZHJpdmVuIGludGVycnVwdCBoYW5kbGVyIHRoYXQgYXBwbGllcyBhIHNldCBvZiBtYXNrcyB0byBhbgorICoJaW50ZXJydXB0IHN0YXR1cyB3b3JkIGFuZCBwZXJmb3JtcyB0aGUgY29ycmVzcG9uZGluZyBhY3Rpb25zIGlmIHRoZQorICoJaW50ZXJydXB0cyBkZXNjcmliZWQgYnkgdGhlIG1hc2sgaGF2ZSBvY2N1cmVkLiAgVGhlIGFjdGlvbnMgaW5jbHVkZQorICoJb3B0aW9uYWxseSBwcmludGluZyBhIHdhcm5pbmcgb3IgYWxlcnQgbWVzc2FnZSwgYW5kIG9wdGlvbmFsbHkKKyAqCWluY3JlbWVudGluZyBhIHN0YXQgY291bnRlci4gIFRoZSB0YWJsZSBpcyB0ZXJtaW5hdGVkIGJ5IGFuIGVudHJ5CisgKglzcGVjaWZ5aW5nIG1hc2sgMC4gIFJldHVybnMgdGhlIG51bWJlciBvZiBmYXRhbCBpbnRlcnJ1cHQgY29uZGl0aW9ucy4KKyAqLworc3RhdGljIGludCB0M19oYW5kbGVfaW50cl9zdGF0dXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCByZWcsCisJCQkJIHVuc2lnbmVkIGludCBtYXNrLAorCQkJCSBjb25zdCBzdHJ1Y3QgaW50cl9pbmZvICphY3RzLAorCQkJCSB1bnNpZ25lZCBsb25nICpzdGF0cykKK3sKKwlpbnQgZmF0YWwgPSAwOworCXVuc2lnbmVkIGludCBzdGF0dXMgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCByZWcpICYgbWFzazsKKworCWZvciAoOyBhY3RzLT5tYXNrOyArK2FjdHMpIHsKKwkJaWYgKCEoc3RhdHVzICYgYWN0cy0+bWFzaykpCisJCQljb250aW51ZTsKKwkJaWYgKGFjdHMtPmZhdGFsKSB7CisJCQlmYXRhbCsrOworCQkJQ0hfQUxFUlQoYWRhcHRlciwgIiVzICgweCV4KVxuIiwKKwkJCQkgYWN0cy0+bXNnLCBzdGF0dXMgJiBhY3RzLT5tYXNrKTsKKwkJfSBlbHNlIGlmIChhY3RzLT5tc2cpCisJCQlDSF9XQVJOKGFkYXB0ZXIsICIlcyAoMHgleClcbiIsCisJCQkJYWN0cy0+bXNnLCBzdGF0dXMgJiBhY3RzLT5tYXNrKTsKKwkJaWYgKGFjdHMtPnN0YXRfaWR4ID49IDApCisJCQlzdGF0c1thY3RzLT5zdGF0X2lkeF0rKzsKKwl9CisJaWYgKHN0YXR1cykJCS8qIGNsZWFyIHByb2Nlc3NlZCBpbnRlcnJ1cHRzICovCisJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCByZWcsIHN0YXR1cyk7CisJcmV0dXJuIGZhdGFsOworfQorCisjZGVmaW5lIFNHRV9JTlRSX01BU0sgKEZfUlNQUURJU0FCTEVEKQorI2RlZmluZSBNQzVfSU5UUl9NQVNLIChGX1BBUklUWUVSUiB8IEZfQUNUUkdORlVMTCB8IEZfVU5LTk9XTkNNRCB8IFwKKwkJICAgICAgIEZfUkVRUVBBUkVSUiB8IEZfRElTUFFQQVJFUlIgfCBGX0RFTEFDVEVNUFRZIHwgXAorCQkgICAgICAgRl9ORkFTUkNIRkFJTCkKKyNkZWZpbmUgTUM3X0lOVFJfTUFTSyAoRl9BRSB8IEZfVUUgfCBGX0NFIHwgVl9QRShNX1BFKSkKKyNkZWZpbmUgWEdNX0lOVFJfTUFTSyAoVl9UWEZJRk9fUFJUWV9FUlIoTV9UWEZJRk9fUFJUWV9FUlIpIHwgXAorCQkgICAgICAgVl9SWEZJRk9fUFJUWV9FUlIoTV9SWEZJRk9fUFJUWV9FUlIpIHwgXAorCQkgICAgICAgRl9UWEZJRk9fVU5ERVJSVU4gfCBGX1JYRklGT19PVkVSRkxPVykKKyNkZWZpbmUgUENJWF9JTlRSX01BU0sgKEZfTVNUREVUUEFSRVJSIHwgRl9TSUdUQVJBQlQgfCBGX1JDVlRBUkFCVCB8IFwKKwkJCUZfUkNWTVNUQUJUIHwgRl9TSUdTWVNFUlIgfCBGX0RFVFBBUkVSUiB8IFwKKwkJCUZfU1BMQ01QRElTIHwgRl9VTlhTUExDTVAgfCBGX1JDVlNQTENNUEVSUiB8IFwKKwkJCUZfREVUQ09SRUNDRVJSIHwgRl9ERVRVTkNFQ0NFUlIgfCBGX1BJT1BBUkVSUiB8IFwKKwkJCVZfV0ZQQVJFUlIoTV9XRlBBUkVSUikgfCBWX1JGUEFSRVJSKE1fUkZQQVJFUlIpIHwgXAorCQkJVl9DRlBBUkVSUihNX0NGUEFSRVJSKSAvKiB8IFZfTVNJWFBBUkVSUihNX01TSVhQQVJFUlIpICovKQorI2RlZmluZSBQQ0lFX0lOVFJfTUFTSyAoRl9VTlhTUExDUExFUlJSIHwgRl9VTlhTUExDUExFUlJDIHwgRl9QQ0lFX1BJT1BBUkVSUiB8XAorCQkJRl9QQ0lFX1dGUEFSRVJSIHwgRl9QQ0lFX1JGUEFSRVJSIHwgRl9QQ0lFX0NGUEFSRVJSIHwgXAorCQkJLyogVl9QQ0lFX01TSVhQQVJFUlIoTV9QQ0lFX01TSVhQQVJFUlIpIHwgKi8gXAorCQkJVl9CSVNURVJSKE1fQklTVEVSUikgfCBGX1BFWEVSUikKKyNkZWZpbmUgVUxQUlhfSU5UUl9NQVNLIEZfUEFSRVJSCisjZGVmaW5lIFVMUFRYX0lOVFJfTUFTSyAwCisjZGVmaW5lIENQTFNXX0lOVFJfTUFTSyAoRl9UUF9GUkFNSU5HX0VSUk9SIHwgXAorCQkJIEZfU0dFX0ZSQU1JTkdfRVJST1IgfCBGX0NJTV9GUkFNSU5HX0VSUk9SIHwgXAorCQkJIEZfWkVST19TV0lUQ0hfRVJST1IpCisjZGVmaW5lIENJTV9JTlRSX01BU0sgKEZfQkxLV1JQTElOVCB8IEZfQkxLUkRQTElOVCB8IEZfQkxLV1JDVExJTlQgfCBcCisJCSAgICAgICBGX0JMS1JEQ1RMSU5UIHwgRl9CTEtXUkZMQVNISU5UIHwgRl9CTEtSREZMQVNISU5UIHwgXAorCQkgICAgICAgRl9TR0xXUkZMQVNISU5UIHwgRl9XUkJMS0ZMQVNISU5UIHwgRl9CTEtXUkJPT1RJTlQgfCBcCisJIAkgICAgICAgRl9GTEFTSFJBTkdFSU5UIHwgRl9TRFJBTVJBTkdFSU5UIHwgRl9SU1ZEU1BBQ0VJTlQpCisjZGVmaW5lIFBNVFhfSU5UUl9NQVNLIChGX1pFUk9fQ19DTURfRVJST1IgfCBJQ1NQSV9GUk1fRVJSIHwgT0VTUElfRlJNX0VSUiB8IFwKKwkJCVZfSUNTUElfUEFSX0VSUk9SKE1fSUNTUElfUEFSX0VSUk9SKSB8IFwKKwkJCVZfT0VTUElfUEFSX0VSUk9SKE1fT0VTUElfUEFSX0VSUk9SKSkKKyNkZWZpbmUgUE1SWF9JTlRSX01BU0sgKEZfWkVST19FX0NNRF9FUlJPUiB8IElFU1BJX0ZSTV9FUlIgfCBPQ1NQSV9GUk1fRVJSIHwgXAorCQkJVl9JRVNQSV9QQVJfRVJST1IoTV9JRVNQSV9QQVJfRVJST1IpIHwgXAorCQkJVl9PQ1NQSV9QQVJfRVJST1IoTV9PQ1NQSV9QQVJfRVJST1IpKQorI2RlZmluZSBNUFNfSU5UUl9NQVNLIChWX1RYMFRQUEFSRVJSRU5CKE1fVFgwVFBQQVJFUlJFTkIpIHwgXAorCQkgICAgICAgVl9UWDFUUFBBUkVSUkVOQihNX1RYMVRQUEFSRVJSRU5CKSB8IFwKKwkJICAgICAgIFZfUlhUUFBBUkVSUkVOQihNX1JYVFBQQVJFUlJFTkIpIHwgXAorCQkgICAgICAgVl9NQ0FQQVJFUlJFTkIoTV9NQ0FQQVJFUlJFTkIpKQorI2RlZmluZSBQTF9JTlRSX01BU0sgKEZfVDNEQkcgfCBGX1hHTUFDMF8wIHwgRl9YR01BQzBfMSB8IEZfTUM1QSB8IEZfUE0xX1RYIHwgXAorCQkgICAgICBGX1BNMV9SWCB8IEZfVUxQMl9UWCB8IEZfVUxQMl9SWCB8IEZfVFAxIHwgRl9DSU0gfCBcCisJCSAgICAgIEZfTUM3X0NNIHwgRl9NQzdfUE1UWCB8IEZfTUM3X1BNUlggfCBGX1NHRTMgfCBGX1BDSU0wIHwgXAorCQkgICAgICBGX01QUzAgfCBGX0NQTF9TV0lUQ0gpCisKKy8qCisgKiBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIFBDSVgxIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgcGNpX2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGludHJfaW5mbyBwY2l4MV9pbnRyX2luZm9bXSA9IHsKKwkJe0ZfTVNUREVUUEFSRVJSLCAiUENJIG1hc3RlciBkZXRlY3RlZCBwYXJpdHkgZXJyb3IiLCAtMSwgMX0sCisJCXtGX1NJR1RBUkFCVCwgIlBDSSBzaWduYWxlZCB0YXJnZXQgYWJvcnQiLCAtMSwgMX0sCisJCXtGX1JDVlRBUkFCVCwgIlBDSSByZWNlaXZlZCB0YXJnZXQgYWJvcnQiLCAtMSwgMX0sCisJCXtGX1JDVk1TVEFCVCwgIlBDSSByZWNlaXZlZCBtYXN0ZXIgYWJvcnQiLCAtMSwgMX0sCisJCXtGX1NJR1NZU0VSUiwgIlBDSSBzaWduYWxlZCBzeXN0ZW0gZXJyb3IiLCAtMSwgMX0sCisJCXtGX0RFVFBBUkVSUiwgIlBDSSBkZXRlY3RlZCBwYXJpdHkgZXJyb3IiLCAtMSwgMX0sCisJCXtGX1NQTENNUERJUywgIlBDSSBzcGxpdCBjb21wbGV0aW9uIGRpc2NhcmRlZCIsIC0xLCAxfSwKKwkJe0ZfVU5YU1BMQ01QLCAiUENJIHVuZXhwZWN0ZWQgc3BsaXQgY29tcGxldGlvbiBlcnJvciIsIC0xLCAxfSwKKwkJe0ZfUkNWU1BMQ01QRVJSLCAiUENJIHJlY2VpdmVkIHNwbGl0IGNvbXBsZXRpb24gZXJyb3IiLCAtMSwKKwkJIDF9LAorCQl7Rl9ERVRDT1JFQ0NFUlIsICJQQ0kgY29ycmVjdGFibGUgRUNDIGVycm9yIiwKKwkJIFNUQVRfUENJX0NPUlJfRUNDLCAwfSwKKwkJe0ZfREVUVU5DRUNDRVJSLCAiUENJIHVuY29ycmVjdGFibGUgRUNDIGVycm9yIiwgLTEsIDF9LAorCQl7Rl9QSU9QQVJFUlIsICJQQ0kgUElPIEZJRk8gcGFyaXR5IGVycm9yIiwgLTEsIDF9LAorCQl7Vl9XRlBBUkVSUihNX1dGUEFSRVJSKSwgIlBDSSB3cml0ZSBGSUZPIHBhcml0eSBlcnJvciIsIC0xLAorCQkgMX0sCisJCXtWX1JGUEFSRVJSKE1fUkZQQVJFUlIpLCAiUENJIHJlYWQgRklGTyBwYXJpdHkgZXJyb3IiLCAtMSwKKwkJIDF9LAorCQl7Vl9DRlBBUkVSUihNX0NGUEFSRVJSKSwgIlBDSSBjb21tYW5kIEZJRk8gcGFyaXR5IGVycm9yIiwgLTEsCisJCSAxfSwKKwkJe1ZfTVNJWFBBUkVSUihNX01TSVhQQVJFUlIpLCAiUENJIE1TSS1YIHRhYmxlL1BCQSBwYXJpdHkgIgorCQkgImVycm9yIiwgLTEsIDF9LAorCQl7MH0KKwl9OworCisJaWYgKHQzX2hhbmRsZV9pbnRyX3N0YXR1cyhhZGFwdGVyLCBBX1BDSVhfSU5UX0NBVVNFLCBQQ0lYX0lOVFJfTUFTSywKKwkJCQkgIHBjaXgxX2ludHJfaW5mbywgYWRhcHRlci0+aXJxX3N0YXRzKSkKKwkJdDNfZmF0YWxfZXJyKGFkYXB0ZXIpOworfQorCisvKgorICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBQQ0lFIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQgcGNpZV9pbnRyX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRyX2luZm8gcGNpZV9pbnRyX2luZm9bXSA9IHsKKwkJe0ZfUEVYRVJSLCAiUENJIFBFWCBlcnJvciIsIC0xLCAxfSwKKwkJe0ZfVU5YU1BMQ1BMRVJSUiwKKwkJICJQQ0kgdW5leHBlY3RlZCBzcGxpdCBjb21wbGV0aW9uIERNQSByZWFkIGVycm9yIiwgLTEsIDF9LAorCQl7Rl9VTlhTUExDUExFUlJDLAorCQkgIlBDSSB1bmV4cGVjdGVkIHNwbGl0IGNvbXBsZXRpb24gRE1BIGNvbW1hbmQgZXJyb3IiLCAtMSwgMX0sCisJCXtGX1BDSUVfUElPUEFSRVJSLCAiUENJIFBJTyBGSUZPIHBhcml0eSBlcnJvciIsIC0xLCAxfSwKKwkJe0ZfUENJRV9XRlBBUkVSUiwgIlBDSSB3cml0ZSBGSUZPIHBhcml0eSBlcnJvciIsIC0xLCAxfSwKKwkJe0ZfUENJRV9SRlBBUkVSUiwgIlBDSSByZWFkIEZJRk8gcGFyaXR5IGVycm9yIiwgLTEsIDF9LAorCQl7Rl9QQ0lFX0NGUEFSRVJSLCAiUENJIGNvbW1hbmQgRklGTyBwYXJpdHkgZXJyb3IiLCAtMSwgMX0sCisJCXtWX1BDSUVfTVNJWFBBUkVSUihNX1BDSUVfTVNJWFBBUkVSUiksCisJCSAiUENJIE1TSS1YIHRhYmxlL1BCQSBwYXJpdHkgZXJyb3IiLCAtMSwgMX0sCisJCXtWX0JJU1RFUlIoTV9CSVNURVJSKSwgIlBDSSBCSVNUIGVycm9yIiwgLTEsIDF9LAorCQl7MH0KKwl9OworCisJaWYgKHQzX2hhbmRsZV9pbnRyX3N0YXR1cyhhZGFwdGVyLCBBX1BDSUVfSU5UX0NBVVNFLCBQQ0lFX0lOVFJfTUFTSywKKwkJCQkgIHBjaWVfaW50cl9pbmZvLCBhZGFwdGVyLT5pcnFfc3RhdHMpKQorCQl0M19mYXRhbF9lcnIoYWRhcHRlcik7Cit9CisKKy8qCisgKiBUUCBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgdHBfaW50cl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50cl9pbmZvIHRwX2ludHJfaW5mb1tdID0geworCQl7MHhmZmZmZmYsICJUUCBwYXJpdHkgZXJyb3IiLCAtMSwgMX0sCisJCXsweDEwMDAwMDAsICJUUCBvdXQgb2YgUnggcGFnZXMiLCAtMSwgMX0sCisJCXsweDIwMDAwMDAsICJUUCBvdXQgb2YgVHggcGFnZXMiLCAtMSwgMX0sCisJCXswfQorCX07CisKKwlpZiAodDNfaGFuZGxlX2ludHJfc3RhdHVzKGFkYXB0ZXIsIEFfVFBfSU5UX0NBVVNFLCAweGZmZmZmZmZmLAorCQkJCSAgdHBfaW50cl9pbmZvLCBOVUxMKSkKKwkJdDNfZmF0YWxfZXJyKGFkYXB0ZXIpOworfQorCisvKgorICogQ0lNIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBjaW1faW50cl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50cl9pbmZvIGNpbV9pbnRyX2luZm9bXSA9IHsKKwkJe0ZfUlNWRFNQQUNFSU5ULCAiQ0lNIHJlc2VydmVkIHNwYWNlIHdyaXRlIiwgLTEsIDF9LAorCQl7Rl9TRFJBTVJBTkdFSU5ULCAiQ0lNIFNEUkFNIGFkZHJlc3Mgb3V0IG9mIHJhbmdlIiwgLTEsIDF9LAorCQl7Rl9GTEFTSFJBTkdFSU5ULCAiQ0lNIGZsYXNoIGFkZHJlc3Mgb3V0IG9mIHJhbmdlIiwgLTEsIDF9LAorCQl7Rl9CTEtXUkJPT1RJTlQsICJDSU0gYmxvY2sgd3JpdGUgdG8gYm9vdCBzcGFjZSIsIC0xLCAxfSwKKwkJe0ZfV1JCTEtGTEFTSElOVCwgIkNJTSB3cml0ZSB0byBjYWNoZWQgZmxhc2ggc3BhY2UiLCAtMSwgMX0sCisJCXtGX1NHTFdSRkxBU0hJTlQsICJDSU0gc2luZ2xlIHdyaXRlIHRvIGZsYXNoIHNwYWNlIiwgLTEsIDF9LAorCQl7Rl9CTEtSREZMQVNISU5ULCAiQ0lNIGJsb2NrIHJlYWQgZnJvbSBmbGFzaCBzcGFjZSIsIC0xLCAxfSwKKwkJe0ZfQkxLV1JGTEFTSElOVCwgIkNJTSBibG9jayB3cml0ZSB0byBmbGFzaCBzcGFjZSIsIC0xLCAxfSwKKwkJe0ZfQkxLUkRDVExJTlQsICJDSU0gYmxvY2sgcmVhZCBmcm9tIENUTCBzcGFjZSIsIC0xLCAxfSwKKwkJe0ZfQkxLV1JDVExJTlQsICJDSU0gYmxvY2sgd3JpdGUgdG8gQ1RMIHNwYWNlIiwgLTEsIDF9LAorCQl7Rl9CTEtSRFBMSU5ULCAiQ0lNIGJsb2NrIHJlYWQgZnJvbSBQTCBzcGFjZSIsIC0xLCAxfSwKKwkJe0ZfQkxLV1JQTElOVCwgIkNJTSBibG9jayB3cml0ZSB0byBQTCBzcGFjZSIsIC0xLCAxfSwKKwkJezB9CisJfTsKKworCWlmICh0M19oYW5kbGVfaW50cl9zdGF0dXMoYWRhcHRlciwgQV9DSU1fSE9TVF9JTlRfQ0FVU0UsIDB4ZmZmZmZmZmYsCisJCQkJICBjaW1faW50cl9pbmZvLCBOVUxMKSkKKwkJdDNfZmF0YWxfZXJyKGFkYXB0ZXIpOworfQorCisvKgorICogVUxQIFJYIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCB1bHByeF9pbnRyX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRyX2luZm8gdWxwcnhfaW50cl9pbmZvW10gPSB7CisJCXtGX1BBUkVSUiwgIlVMUCBSWCBwYXJpdHkgZXJyb3IiLCAtMSwgMX0sCisJCXswfQorCX07CisKKwlpZiAodDNfaGFuZGxlX2ludHJfc3RhdHVzKGFkYXB0ZXIsIEFfVUxQUlhfSU5UX0NBVVNFLCAweGZmZmZmZmZmLAorCQkJCSAgdWxwcnhfaW50cl9pbmZvLCBOVUxMKSkKKwkJdDNfZmF0YWxfZXJyKGFkYXB0ZXIpOworfQorCisvKgorICogVUxQIFRYIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCB1bHB0eF9pbnRyX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRyX2luZm8gdWxwdHhfaW50cl9pbmZvW10gPSB7CisJCXtGX1BCTF9CT1VORF9FUlJfQ0gwLCAiVUxQIFRYIGNoYW5uZWwgMCBQQkwgb3V0IG9mIGJvdW5kcyIsCisJCSBTVEFUX1VMUF9DSDBfUEJMX09PQiwgMH0sCisJCXtGX1BCTF9CT1VORF9FUlJfQ0gxLCAiVUxQIFRYIGNoYW5uZWwgMSBQQkwgb3V0IG9mIGJvdW5kcyIsCisJCSBTVEFUX1VMUF9DSDFfUEJMX09PQiwgMH0sCisJCXswfQorCX07CisKKwlpZiAodDNfaGFuZGxlX2ludHJfc3RhdHVzKGFkYXB0ZXIsIEFfVUxQVFhfSU5UX0NBVVNFLCAweGZmZmZmZmZmLAorCQkJCSAgdWxwdHhfaW50cl9pbmZvLCBhZGFwdGVyLT5pcnFfc3RhdHMpKQorCQl0M19mYXRhbF9lcnIoYWRhcHRlcik7Cit9CisKKyNkZWZpbmUgSUNTUElfRlJNX0VSUiAoRl9JQ1NQSTBfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IgfCBcCisJRl9JQ1NQSTFfRklGTzJYX1JYX0ZSQU1JTkdfRVJST1IgfCBGX0lDU1BJMF9SWF9GUkFNSU5HX0VSUk9SIHwgXAorCUZfSUNTUEkxX1JYX0ZSQU1JTkdfRVJST1IgfCBGX0lDU1BJMF9UWF9GUkFNSU5HX0VSUk9SIHwgXAorCUZfSUNTUEkxX1RYX0ZSQU1JTkdfRVJST1IpCisjZGVmaW5lIE9FU1BJX0ZSTV9FUlIgKEZfT0VTUEkwX1JYX0ZSQU1JTkdfRVJST1IgfCBcCisJRl9PRVNQSTFfUlhfRlJBTUlOR19FUlJPUiB8IEZfT0VTUEkwX1RYX0ZSQU1JTkdfRVJST1IgfCBcCisJRl9PRVNQSTFfVFhfRlJBTUlOR19FUlJPUiB8IEZfT0VTUEkwX09GSUZPMlhfVFhfRlJBTUlOR19FUlJPUiB8IFwKKwlGX09FU1BJMV9PRklGTzJYX1RYX0ZSQU1JTkdfRVJST1IpCisKKy8qCisgKiBQTSBUWCBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIHZvaWQgcG10eF9pbnRyX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRyX2luZm8gcG10eF9pbnRyX2luZm9bXSA9IHsKKwkJe0ZfWkVST19DX0NNRF9FUlJPUiwgIlBNVFggMC1sZW5ndGggcGNtZCIsIC0xLCAxfSwKKwkJe0lDU1BJX0ZSTV9FUlIsICJQTVRYIGlzcGkgZnJhbWluZyBlcnJvciIsIC0xLCAxfSwKKwkJe09FU1BJX0ZSTV9FUlIsICJQTVRYIG9zcGkgZnJhbWluZyBlcnJvciIsIC0xLCAxfSwKKwkJe1ZfSUNTUElfUEFSX0VSUk9SKE1fSUNTUElfUEFSX0VSUk9SKSwKKwkJICJQTVRYIGlzcGkgcGFyaXR5IGVycm9yIiwgLTEsIDF9LAorCQl7Vl9PRVNQSV9QQVJfRVJST1IoTV9PRVNQSV9QQVJfRVJST1IpLAorCQkgIlBNVFggb3NwaSBwYXJpdHkgZXJyb3IiLCAtMSwgMX0sCisJCXswfQorCX07CisKKwlpZiAodDNfaGFuZGxlX2ludHJfc3RhdHVzKGFkYXB0ZXIsIEFfUE0xX1RYX0lOVF9DQVVTRSwgMHhmZmZmZmZmZiwKKwkJCQkgIHBtdHhfaW50cl9pbmZvLCBOVUxMKSkKKwkJdDNfZmF0YWxfZXJyKGFkYXB0ZXIpOworfQorCisjZGVmaW5lIElFU1BJX0ZSTV9FUlIgKEZfSUVTUEkwX0ZJRk8yWF9SWF9GUkFNSU5HX0VSUk9SIHwgXAorCUZfSUVTUEkxX0ZJRk8yWF9SWF9GUkFNSU5HX0VSUk9SIHwgRl9JRVNQSTBfUlhfRlJBTUlOR19FUlJPUiB8IFwKKwlGX0lFU1BJMV9SWF9GUkFNSU5HX0VSUk9SIHwgRl9JRVNQSTBfVFhfRlJBTUlOR19FUlJPUiB8IFwKKwlGX0lFU1BJMV9UWF9GUkFNSU5HX0VSUk9SKQorI2RlZmluZSBPQ1NQSV9GUk1fRVJSIChGX09DU1BJMF9SWF9GUkFNSU5HX0VSUk9SIHwgXAorCUZfT0NTUEkxX1JYX0ZSQU1JTkdfRVJST1IgfCBGX09DU1BJMF9UWF9GUkFNSU5HX0VSUk9SIHwgXAorCUZfT0NTUEkxX1RYX0ZSQU1JTkdfRVJST1IgfCBGX09DU1BJMF9PRklGTzJYX1RYX0ZSQU1JTkdfRVJST1IgfCBcCisJRl9PQ1NQSTFfT0ZJRk8yWF9UWF9GUkFNSU5HX0VSUk9SKQorCisvKgorICogUE0gUlggaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIHBtcnhfaW50cl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50cl9pbmZvIHBtcnhfaW50cl9pbmZvW10gPSB7CisJCXtGX1pFUk9fRV9DTURfRVJST1IsICJQTVJYIDAtbGVuZ3RoIHBjbWQiLCAtMSwgMX0sCisJCXtJRVNQSV9GUk1fRVJSLCAiUE1SWCBpc3BpIGZyYW1pbmcgZXJyb3IiLCAtMSwgMX0sCisJCXtPQ1NQSV9GUk1fRVJSLCAiUE1SWCBvc3BpIGZyYW1pbmcgZXJyb3IiLCAtMSwgMX0sCisJCXtWX0lFU1BJX1BBUl9FUlJPUihNX0lFU1BJX1BBUl9FUlJPUiksCisJCSAiUE1SWCBpc3BpIHBhcml0eSBlcnJvciIsIC0xLCAxfSwKKwkJe1ZfT0NTUElfUEFSX0VSUk9SKE1fT0NTUElfUEFSX0VSUk9SKSwKKwkJICJQTVJYIG9zcGkgcGFyaXR5IGVycm9yIiwgLTEsIDF9LAorCQl7MH0KKwl9OworCisJaWYgKHQzX2hhbmRsZV9pbnRyX3N0YXR1cyhhZGFwdGVyLCBBX1BNMV9SWF9JTlRfQ0FVU0UsIDB4ZmZmZmZmZmYsCisJCQkJICBwbXJ4X2ludHJfaW5mbywgTlVMTCkpCisJCXQzX2ZhdGFsX2VycihhZGFwdGVyKTsKK30KKworLyoKKyAqIENQTCBzd2l0Y2ggaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIGNwbHN3X2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGludHJfaW5mbyBjcGxzd19pbnRyX2luZm9bXSA9IHsKKy8qCQl7IEZfQ0lNX09WRkxfRVJST1IsICJDUEwgc3dpdGNoIENJTSBvdmVyZmxvdyIsIC0xLCAxIH0sICovCisJCXtGX1RQX0ZSQU1JTkdfRVJST1IsICJDUEwgc3dpdGNoIFRQIGZyYW1pbmcgZXJyb3IiLCAtMSwgMX0sCisJCXtGX1NHRV9GUkFNSU5HX0VSUk9SLCAiQ1BMIHN3aXRjaCBTR0UgZnJhbWluZyBlcnJvciIsIC0xLCAxfSwKKwkJe0ZfQ0lNX0ZSQU1JTkdfRVJST1IsICJDUEwgc3dpdGNoIENJTSBmcmFtaW5nIGVycm9yIiwgLTEsIDF9LAorCQl7Rl9aRVJPX1NXSVRDSF9FUlJPUiwgIkNQTCBzd2l0Y2ggbm8tc3dpdGNoIGVycm9yIiwgLTEsIDF9LAorCQl7MH0KKwl9OworCisJaWYgKHQzX2hhbmRsZV9pbnRyX3N0YXR1cyhhZGFwdGVyLCBBX0NQTF9JTlRSX0NBVVNFLCAweGZmZmZmZmZmLAorCQkJCSAgY3Bsc3dfaW50cl9pbmZvLCBOVUxMKSkKKwkJdDNfZmF0YWxfZXJyKGFkYXB0ZXIpOworfQorCisvKgorICogTVBTIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBtcHNfaW50cl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50cl9pbmZvIG1wc19pbnRyX2luZm9bXSA9IHsKKwkJezB4MWZmLCAiTVBTIHBhcml0eSBlcnJvciIsIC0xLCAxfSwKKwkJezB9CisJfTsKKworCWlmICh0M19oYW5kbGVfaW50cl9zdGF0dXMoYWRhcHRlciwgQV9NUFNfSU5UX0NBVVNFLCAweGZmZmZmZmZmLAorCQkJCSAgbXBzX2ludHJfaW5mbywgTlVMTCkpCisJCXQzX2ZhdGFsX2VycihhZGFwdGVyKTsKK30KKworI2RlZmluZSBNQzdfSU5UUl9GQVRBTCAoRl9VRSB8IFZfUEUoTV9QRSkgfCBGX0FFKQorCisvKgorICogTUM3IGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBtYzdfaW50cl9oYW5kbGVyKHN0cnVjdCBtYzcgKm1jNykKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG1jNy0+YWRhcHRlcjsKKwl1MzIgY2F1c2UgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0lOVF9DQVVTRSk7CisKKwlpZiAoY2F1c2UgJiBGX0NFKSB7CisJCW1jNy0+c3RhdHMuY29ycl9lcnIrKzsKKwkJQ0hfV0FSTihhZGFwdGVyLCAiJXMgTUM3IGNvcnJlY3RhYmxlIGVycm9yIGF0IGFkZHIgMHgleCwgIgorCQkJImRhdGEgMHgleCAweCV4IDB4JXhcbiIsIG1jNy0+bmFtZSwKKwkJCXQzX3JlYWRfcmVnKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfQ0VfQUREUiksCisJCQl0M19yZWFkX3JlZyhhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0NFX0RBVEEwKSwKKwkJCXQzX3JlYWRfcmVnKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfQ0VfREFUQTEpLAorCQkJdDNfcmVhZF9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19DRV9EQVRBMikpOworCX0KKworCWlmIChjYXVzZSAmIEZfVUUpIHsKKwkJbWM3LT5zdGF0cy51bmNvcnJfZXJyKys7CisJCUNIX0FMRVJUKGFkYXB0ZXIsICIlcyBNQzcgdW5jb3JyZWN0YWJsZSBlcnJvciBhdCBhZGRyIDB4JXgsICIKKwkJCSAiZGF0YSAweCV4IDB4JXggMHgleFxuIiwgbWM3LT5uYW1lLAorCQkJIHQzX3JlYWRfcmVnKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfVUVfQUREUiksCisJCQkgdDNfcmVhZF9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19VRV9EQVRBMCksCisJCQkgdDNfcmVhZF9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19VRV9EQVRBMSksCisJCQkgdDNfcmVhZF9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19VRV9EQVRBMikpOworCX0KKworCWlmIChHX1BFKGNhdXNlKSkgeworCQltYzctPnN0YXRzLnBhcml0eV9lcnIrKzsKKwkJQ0hfQUxFUlQoYWRhcHRlciwgIiVzIE1DNyBwYXJpdHkgZXJyb3IgMHgleFxuIiwKKwkJCSBtYzctPm5hbWUsIEdfUEUoY2F1c2UpKTsKKwl9CisKKwlpZiAoY2F1c2UgJiBGX0FFKSB7CisJCXUzMiBhZGRyID0gMDsKKworCQlpZiAoYWRhcHRlci0+cGFyYW1zLnJldiA+IDApCisJCQlhZGRyID0gdDNfcmVhZF9yZWcoYWRhcHRlciwKKwkJCQkJICAgbWM3LT5vZmZzZXQgKyBBX01DN19FUlJfQUREUik7CisJCW1jNy0+c3RhdHMuYWRkcl9lcnIrKzsKKwkJQ0hfQUxFUlQoYWRhcHRlciwgIiVzIE1DNyBhZGRyZXNzIGVycm9yOiAweCV4XG4iLAorCQkJIG1jNy0+bmFtZSwgYWRkcik7CisJfQorCisJaWYgKGNhdXNlICYgTUM3X0lOVFJfRkFUQUwpCisJCXQzX2ZhdGFsX2VycihhZGFwdGVyKTsKKworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0lOVF9DQVVTRSwgY2F1c2UpOworfQorCisjZGVmaW5lIFhHTV9JTlRSX0ZBVEFMIChWX1RYRklGT19QUlRZX0VSUihNX1RYRklGT19QUlRZX0VSUikgfCBcCisJCQlWX1JYRklGT19QUlRZX0VSUihNX1JYRklGT19QUlRZX0VSUikpCisvKgorICogWEdNQUMgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpbnQgbWFjX2ludHJfaGFuZGxlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgY21hYyAqbWFjID0gJmFkYXAycGluZm8oYWRhcCwgaWR4KS0+bWFjOworCXUzMiBjYXVzZSA9IHQzX3JlYWRfcmVnKGFkYXAsIEFfWEdNX0lOVF9DQVVTRSArIG1hYy0+b2Zmc2V0KTsKKworCWlmIChjYXVzZSAmIFZfVFhGSUZPX1BSVFlfRVJSKE1fVFhGSUZPX1BSVFlfRVJSKSkgeworCQltYWMtPnN0YXRzLnR4X2ZpZm9fcGFyaXR5X2VycisrOworCQlDSF9BTEVSVChhZGFwLCAicG9ydCVkOiBNQUMgVFggRklGTyBwYXJpdHkgZXJyb3JcbiIsIGlkeCk7CisJfQorCWlmIChjYXVzZSAmIFZfUlhGSUZPX1BSVFlfRVJSKE1fUlhGSUZPX1BSVFlfRVJSKSkgeworCQltYWMtPnN0YXRzLnJ4X2ZpZm9fcGFyaXR5X2VycisrOworCQlDSF9BTEVSVChhZGFwLCAicG9ydCVkOiBNQUMgUlggRklGTyBwYXJpdHkgZXJyb3JcbiIsIGlkeCk7CisJfQorCWlmIChjYXVzZSAmIEZfVFhGSUZPX1VOREVSUlVOKQorCQltYWMtPnN0YXRzLnR4X2ZpZm9fdXJ1bisrOworCWlmIChjYXVzZSAmIEZfUlhGSUZPX09WRVJGTE9XKQorCQltYWMtPnN0YXRzLnJ4X2ZpZm9fb3ZmbCsrOworCWlmIChjYXVzZSAmIFZfU0VSREVTX0xPUyhNX1NFUkRFU19MT1MpKQorCQltYWMtPnN0YXRzLnNlcmRlc19zaWduYWxfbG9zcysrOworCWlmIChjYXVzZSAmIEZfWEFVSVBDU0NUQ0VSUikKKwkJbWFjLT5zdGF0cy54YXVpX3Bjc19jdGNfZXJyKys7CisJaWYgKGNhdXNlICYgRl9YQVVJUENTQUxJR05DSEFOR0UpCisJCW1hYy0+c3RhdHMueGF1aV9wY3NfYWxpZ25fY2hhbmdlKys7CisKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9YR01fSU5UX0NBVVNFICsgbWFjLT5vZmZzZXQsIGNhdXNlKTsKKwlpZiAoY2F1c2UgJiBYR01fSU5UUl9GQVRBTCkKKwkJdDNfZmF0YWxfZXJyKGFkYXApOworCXJldHVybiBjYXVzZSAhPSAwOworfQorCisvKgorICogSW50ZXJydXB0IGhhbmRsZXIgZm9yIFBIWSBldmVudHMuCisgKi8KK2ludCB0M19waHlfaW50cl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0YXRpYyBjb25zdCBpbnQgaW50cl9ncGlvX2JpdHNbXSA9IHsgOCwgMHgyMCB9OworCisJdTMyIGksIGNhdXNlID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9UM0RCR19JTlRfQ0FVU0UpOworCisJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKSB7CisJCWlmIChjYXVzZSAmIGludHJfZ3Bpb19iaXRzW2ldKSB7CisJCQlzdHJ1Y3QgY3BoeSAqcGh5ID0gJmFkYXAycGluZm8oYWRhcHRlciwgaSktPnBoeTsKKwkJCWludCBwaHlfY2F1c2UgPSBwaHktPm9wcy0+aW50cl9oYW5kbGVyKHBoeSk7CisKKwkJCWlmIChwaHlfY2F1c2UgJiBjcGh5X2NhdXNlX2xpbmtfY2hhbmdlKQorCQkJCXQzX2xpbmtfY2hhbmdlZChhZGFwdGVyLCBpKTsKKwkJCWlmIChwaHlfY2F1c2UgJiBjcGh5X2NhdXNlX2ZpZm9fZXJyb3IpCisJCQkJcGh5LT5maWZvX2Vycm9ycysrOworCQl9CisJfQorCisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfVDNEQkdfSU5UX0NBVVNFLCBjYXVzZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUMyBzbG93IHBhdGggKG5vbi1kYXRhKSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworaW50IHQzX3Nsb3dfaW50cl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXUzMiBjYXVzZSA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfUExfSU5UX0NBVVNFMCk7CisKKwljYXVzZSAmPSBhZGFwdGVyLT5zbG93X2ludHJfbWFzazsKKwlpZiAoIWNhdXNlKQorCQlyZXR1cm4gMDsKKwlpZiAoY2F1c2UgJiBGX1BDSU0wKSB7CisJCWlmIChpc19wY2llKGFkYXB0ZXIpKQorCQkJcGNpZV9pbnRyX2hhbmRsZXIoYWRhcHRlcik7CisJCWVsc2UKKwkJCXBjaV9pbnRyX2hhbmRsZXIoYWRhcHRlcik7CisJfQorCWlmIChjYXVzZSAmIEZfU0dFMykKKwkJdDNfc2dlX2Vycl9pbnRyX2hhbmRsZXIoYWRhcHRlcik7CisJaWYgKGNhdXNlICYgRl9NQzdfUE1SWCkKKwkJbWM3X2ludHJfaGFuZGxlcigmYWRhcHRlci0+cG1yeCk7CisJaWYgKGNhdXNlICYgRl9NQzdfUE1UWCkKKwkJbWM3X2ludHJfaGFuZGxlcigmYWRhcHRlci0+cG10eCk7CisJaWYgKGNhdXNlICYgRl9NQzdfQ00pCisJCW1jN19pbnRyX2hhbmRsZXIoJmFkYXB0ZXItPmNtKTsKKwlpZiAoY2F1c2UgJiBGX0NJTSkKKwkJY2ltX2ludHJfaGFuZGxlcihhZGFwdGVyKTsKKwlpZiAoY2F1c2UgJiBGX1RQMSkKKwkJdHBfaW50cl9oYW5kbGVyKGFkYXB0ZXIpOworCWlmIChjYXVzZSAmIEZfVUxQMl9SWCkKKwkJdWxwcnhfaW50cl9oYW5kbGVyKGFkYXB0ZXIpOworCWlmIChjYXVzZSAmIEZfVUxQMl9UWCkKKwkJdWxwdHhfaW50cl9oYW5kbGVyKGFkYXB0ZXIpOworCWlmIChjYXVzZSAmIEZfUE0xX1JYKQorCQlwbXJ4X2ludHJfaGFuZGxlcihhZGFwdGVyKTsKKwlpZiAoY2F1c2UgJiBGX1BNMV9UWCkKKwkJcG10eF9pbnRyX2hhbmRsZXIoYWRhcHRlcik7CisJaWYgKGNhdXNlICYgRl9DUExfU1dJVENIKQorCQljcGxzd19pbnRyX2hhbmRsZXIoYWRhcHRlcik7CisJaWYgKGNhdXNlICYgRl9NUFMwKQorCQltcHNfaW50cl9oYW5kbGVyKGFkYXB0ZXIpOworCWlmIChjYXVzZSAmIEZfTUM1QSkKKwkJdDNfbWM1X2ludHJfaGFuZGxlcigmYWRhcHRlci0+bWM1KTsKKwlpZiAoY2F1c2UgJiBGX1hHTUFDMF8wKQorCQltYWNfaW50cl9oYW5kbGVyKGFkYXB0ZXIsIDApOworCWlmIChjYXVzZSAmIEZfWEdNQUMwXzEpCisJCW1hY19pbnRyX2hhbmRsZXIoYWRhcHRlciwgMSk7CisJaWYgKGNhdXNlICYgRl9UM0RCRykKKwkJdDNfb3NfZXh0X2ludHJfaGFuZGxlcihhZGFwdGVyKTsKKworCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHRzIGp1c3QgcHJvY2Vzc2VkLiAqLworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1BMX0lOVF9DQVVTRTAsIGNhdXNlKTsKKwl0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1BMX0lOVF9DQVVTRTApOwkvKiBmbHVzaCAqLworCXJldHVybiAxOworfQorCisvKioKKyAqCXQzX2ludHJfZW5hYmxlIC0gZW5hYmxlIGludGVycnVwdHMKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlciB3aG9zZSBpbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkCisgKgorICoJRW5hYmxlIGludGVycnVwdHMgYnkgc2V0dGluZyB0aGUgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlcnMgb2YgdGhlCisgKgl2YXJpb3VzIEhXIG1vZHVsZXMgYW5kIHRoZW4gZW5hYmxpbmcgdGhlIHRvcC1sZXZlbCBpbnRlcnJ1cHQKKyAqCWNvbmNlbnRyYXRvci4KKyAqLwordm9pZCB0M19pbnRyX2VuYWJsZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJfdmFsX3BhaXIgaW50cl9lbl9hdnBbXSA9IHsKKwkJe0FfU0dfSU5UX0VOQUJMRSwgU0dFX0lOVFJfTUFTS30sCisJCXtBX01DN19JTlRfRU5BQkxFLCBNQzdfSU5UUl9NQVNLfSwKKwkJe0FfTUM3X0lOVF9FTkFCTEUgLSBNQzdfUE1SWF9CQVNFX0FERFIgKyBNQzdfUE1UWF9CQVNFX0FERFIsCisJCSBNQzdfSU5UUl9NQVNLfSwKKwkJe0FfTUM3X0lOVF9FTkFCTEUgLSBNQzdfUE1SWF9CQVNFX0FERFIgKyBNQzdfQ01fQkFTRV9BRERSLAorCQkgTUM3X0lOVFJfTUFTS30sCisJCXtBX01DNV9EQl9JTlRfRU5BQkxFLCBNQzVfSU5UUl9NQVNLfSwKKwkJe0FfVUxQUlhfSU5UX0VOQUJMRSwgVUxQUlhfSU5UUl9NQVNLfSwKKwkJe0FfVFBfSU5UX0VOQUJMRSwgMHgzYmZmZmZmfSwKKwkJe0FfUE0xX1RYX0lOVF9FTkFCTEUsIFBNVFhfSU5UUl9NQVNLfSwKKwkJe0FfUE0xX1JYX0lOVF9FTkFCTEUsIFBNUlhfSU5UUl9NQVNLfSwKKwkJe0FfQ0lNX0hPU1RfSU5UX0VOQUJMRSwgQ0lNX0lOVFJfTUFTS30sCisJCXtBX01QU19JTlRfRU5BQkxFLCBNUFNfSU5UUl9NQVNLfSwKKwl9OworCisJYWRhcHRlci0+c2xvd19pbnRyX21hc2sgPSBQTF9JTlRSX01BU0s7CisKKwl0M193cml0ZV9yZWdzKGFkYXB0ZXIsIGludHJfZW5fYXZwLCBBUlJBWV9TSVpFKGludHJfZW5fYXZwKSwgMCk7CisKKwlpZiAoYWRhcHRlci0+cGFyYW1zLnJldiA+IDApIHsKKwkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfQ1BMX0lOVFJfRU5BQkxFLAorCQkJICAgICBDUExTV19JTlRSX01BU0sgfCBGX0NJTV9PVkZMX0VSUk9SKTsKKwkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfVUxQVFhfSU5UX0VOQUJMRSwKKwkJCSAgICAgVUxQVFhfSU5UUl9NQVNLIHwgRl9QQkxfQk9VTkRfRVJSX0NIMCB8CisJCQkgICAgIEZfUEJMX0JPVU5EX0VSUl9DSDEpOworCX0gZWxzZSB7CisJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX0NQTF9JTlRSX0VOQUJMRSwgQ1BMU1dfSU5UUl9NQVNLKTsKKwkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfVUxQVFhfSU5UX0VOQUJMRSwgVUxQVFhfSU5UUl9NQVNLKTsKKwl9CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9UM0RCR19HUElPX0FDVF9MT1csCisJCSAgICAgYWRhcHRlcl9pbmZvKGFkYXB0ZXIpLT5ncGlvX2ludHIpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1QzREJHX0lOVF9FTkFCTEUsCisJCSAgICAgYWRhcHRlcl9pbmZvKGFkYXB0ZXIpLT5ncGlvX2ludHIpOworCWlmIChpc19wY2llKGFkYXB0ZXIpKQorCQl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9QQ0lFX0lOVF9FTkFCTEUsIFBDSUVfSU5UUl9NQVNLKTsKKwllbHNlCisJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1BDSVhfSU5UX0VOQUJMRSwgUENJWF9JTlRSX01BU0spOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1BMX0lOVF9FTkFCTEUwLCBhZGFwdGVyLT5zbG93X2ludHJfbWFzayk7CisJdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9QTF9JTlRfRU5BQkxFMCk7CS8qIGZsdXNoICovCit9CisKKy8qKgorICoJdDNfaW50cl9kaXNhYmxlIC0gZGlzYWJsZSBhIGNhcmQncyBpbnRlcnJ1cHRzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIgd2hvc2UgaW50ZXJydXB0cyBzaG91bGQgYmUgZGlzYWJsZWQKKyAqCisgKglEaXNhYmxlIGludGVycnVwdHMuICBXZSBvbmx5IGRpc2FibGUgdGhlIHRvcC1sZXZlbCBpbnRlcnJ1cHQKKyAqCWNvbmNlbnRyYXRvciBhbmQgdGhlIFNHRSBkYXRhIGludGVycnVwdHMuCisgKi8KK3ZvaWQgdDNfaW50cl9kaXNhYmxlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1BMX0lOVF9FTkFCTEUwLCAwKTsKKwl0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1BMX0lOVF9FTkFCTEUwKTsJLyogZmx1c2ggKi8KKwlhZGFwdGVyLT5zbG93X2ludHJfbWFzayA9IDA7Cit9CisKKy8qKgorICoJdDNfaW50cl9jbGVhciAtIGNsZWFyIGFsbCBpbnRlcnJ1cHRzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIgd2hvc2UgaW50ZXJydXB0cyBzaG91bGQgYmUgY2xlYXJlZAorICoKKyAqCUNsZWFycyBhbGwgaW50ZXJydXB0cy4KKyAqLwordm9pZCB0M19pbnRyX2NsZWFyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY2F1c2VfcmVnX2FkZHJbXSA9IHsKKwkJQV9TR19JTlRfQ0FVU0UsCisJCUFfU0dfUlNQUV9GTF9TVEFUVVMsCisJCUFfUENJWF9JTlRfQ0FVU0UsCisJCUFfTUM3X0lOVF9DQVVTRSwKKwkJQV9NQzdfSU5UX0NBVVNFIC0gTUM3X1BNUlhfQkFTRV9BRERSICsgTUM3X1BNVFhfQkFTRV9BRERSLAorCQlBX01DN19JTlRfQ0FVU0UgLSBNQzdfUE1SWF9CQVNFX0FERFIgKyBNQzdfQ01fQkFTRV9BRERSLAorCQlBX0NJTV9IT1NUX0lOVF9DQVVTRSwKKwkJQV9UUF9JTlRfQ0FVU0UsCisJCUFfTUM1X0RCX0lOVF9DQVVTRSwKKwkJQV9VTFBSWF9JTlRfQ0FVU0UsCisJCUFfVUxQVFhfSU5UX0NBVVNFLAorCQlBX0NQTF9JTlRSX0NBVVNFLAorCQlBX1BNMV9UWF9JTlRfQ0FVU0UsCisJCUFfUE0xX1JYX0lOVF9DQVVTRSwKKwkJQV9NUFNfSU5UX0NBVVNFLAorCQlBX1QzREJHX0lOVF9DQVVTRSwKKwl9OworCXVuc2lnbmVkIGludCBpOworCisJLyogQ2xlYXIgUEhZIGFuZCBNQUMgaW50ZXJydXB0cyBmb3IgZWFjaCBwb3J0LiAqLworCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkKKwkgICAgdDNfcG9ydF9pbnRyX2NsZWFyKGFkYXB0ZXIsIGkpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2F1c2VfcmVnX2FkZHIpOyArK2kpCisJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBjYXVzZV9yZWdfYWRkcltpXSwgMHhmZmZmZmZmZik7CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9QTF9JTlRfQ0FVU0UwLCAweGZmZmZmZmZmKTsKKwl0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1BMX0lOVF9DQVVTRTApOwkvKiBmbHVzaCAqLworfQorCisvKioKKyAqCXQzX3BvcnRfaW50cl9lbmFibGUgLSBlbmFibGUgcG9ydC1zcGVjaWZpYyBpbnRlcnJ1cHRzCisgKglAYWRhcHRlcjogYXNzb2NpYXRlZCBhZGFwdGVyCisgKglAaWR4OiBpbmRleCBvZiBwb3J0IHdob3NlIGludGVycnVwdHMgc2hvdWxkIGJlIGVuYWJsZWQKKyAqCisgKglFbmFibGUgcG9ydC1zcGVjaWZpYyAoaS5lLiwgTUFDIGFuZCBQSFkpIGludGVycnVwdHMgZm9yIHRoZSBnaXZlbgorICoJYWRhcHRlciBwb3J0LgorICovCit2b2lkIHQzX3BvcnRfaW50cl9lbmFibGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBpZHgpCit7CisJc3RydWN0IGNwaHkgKnBoeSA9ICZhZGFwMnBpbmZvKGFkYXB0ZXIsIGlkeCktPnBoeTsKKworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBYR01fUkVHKEFfWEdNX0lOVF9FTkFCTEUsIGlkeCksIFhHTV9JTlRSX01BU0spOworCXQzX3JlYWRfcmVnKGFkYXB0ZXIsIFhHTV9SRUcoQV9YR01fSU5UX0VOQUJMRSwgaWR4KSk7IC8qIGZsdXNoICovCisJcGh5LT5vcHMtPmludHJfZW5hYmxlKHBoeSk7Cit9CisKKy8qKgorICoJdDNfcG9ydF9pbnRyX2Rpc2FibGUgLSBkaXNhYmxlIHBvcnQtc3BlY2lmaWMgaW50ZXJydXB0cworICoJQGFkYXB0ZXI6IGFzc29jaWF0ZWQgYWRhcHRlcgorICoJQGlkeDogaW5kZXggb2YgcG9ydCB3aG9zZSBpbnRlcnJ1cHRzIHNob3VsZCBiZSBkaXNhYmxlZAorICoKKyAqCURpc2FibGUgcG9ydC1zcGVjaWZpYyAoaS5lLiwgTUFDIGFuZCBQSFkpIGludGVycnVwdHMgZm9yIHRoZSBnaXZlbgorICoJYWRhcHRlciBwb3J0LgorICovCit2b2lkIHQzX3BvcnRfaW50cl9kaXNhYmxlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgaWR4KQoreworCXN0cnVjdCBjcGh5ICpwaHkgPSAmYWRhcDJwaW5mbyhhZGFwdGVyLCBpZHgpLT5waHk7CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgWEdNX1JFRyhBX1hHTV9JTlRfRU5BQkxFLCBpZHgpLCAwKTsKKwl0M19yZWFkX3JlZyhhZGFwdGVyLCBYR01fUkVHKEFfWEdNX0lOVF9FTkFCTEUsIGlkeCkpOyAvKiBmbHVzaCAqLworCXBoeS0+b3BzLT5pbnRyX2Rpc2FibGUocGh5KTsKK30KKworLyoqCisgKgl0M19wb3J0X2ludHJfY2xlYXIgLSBjbGVhciBwb3J0LXNwZWNpZmljIGludGVycnVwdHMKKyAqCUBhZGFwdGVyOiBhc3NvY2lhdGVkIGFkYXB0ZXIKKyAqCUBpZHg6IGluZGV4IG9mIHBvcnQgd2hvc2UgaW50ZXJydXB0cyB0byBjbGVhcgorICoKKyAqCUNsZWFyIHBvcnQtc3BlY2lmaWMgKGkuZS4sIE1BQyBhbmQgUEhZKSBpbnRlcnJ1cHRzIGZvciB0aGUgZ2l2ZW4KKyAqCWFkYXB0ZXIgcG9ydC4KKyAqLwordm9pZCB0M19wb3J0X2ludHJfY2xlYXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBpZHgpCit7CisJc3RydWN0IGNwaHkgKnBoeSA9ICZhZGFwMnBpbmZvKGFkYXB0ZXIsIGlkeCktPnBoeTsKKworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBYR01fUkVHKEFfWEdNX0lOVF9DQVVTRSwgaWR4KSwgMHhmZmZmZmZmZik7CisJdDNfcmVhZF9yZWcoYWRhcHRlciwgWEdNX1JFRyhBX1hHTV9JTlRfQ0FVU0UsIGlkeCkpOyAvKiBmbHVzaCAqLworCXBoeS0+b3BzLT5pbnRyX2NsZWFyKHBoeSk7Cit9CisKKy8qKgorICogCXQzX3NnZV93cml0ZV9jb250ZXh0IC0gd3JpdGUgYW4gU0dFIGNvbnRleHQKKyAqIAlAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqIAlAaWQ6IHRoZSBjb250ZXh0IGlkCisgKiAJQHR5cGU6IHRoZSBjb250ZXh0IHR5cGUKKyAqCisgKiAJUHJvZ3JhbSBhbiBTR0UgY29udGV4dCB3aXRoIHRoZSB2YWx1ZXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlCisgKiAJQ09OVEVYVF9EQVRBPyByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyBpbnQgdDNfc2dlX3dyaXRlX2NvbnRleHQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBpZCwKKwkJCQl1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0swLCAweGZmZmZmZmZmKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0sxLCAweGZmZmZmZmZmKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0syLCAweGZmZmZmZmZmKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0szLCAweGZmZmZmZmZmKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCwKKwkJICAgICBWX0NPTlRFWFRfQ01EX09QQ09ERSgxKSB8IHR5cGUgfCBWX0NPTlRFWFQoaWQpKTsKKwlyZXR1cm4gdDNfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9DTUQsIEZfQ09OVEVYVF9DTURfQlVTWSwKKwkJCSAgICAgICAwLCA1LCAxKTsKK30KKworLyoqCisgKgl0M19zZ2VfaW5pdF9lY250eHQgLSBpbml0aWFsaXplIGFuIFNHRSBlZ3Jlc3MgY29udGV4dAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyIHRvIGNvbmZpZ3VyZQorICoJQGlkOiB0aGUgY29udGV4dCBpZAorICoJQGd0c19lbmFibGU6IHdoZXRoZXIgdG8gZW5hYmxlIEdUUyBmb3IgdGhlIGNvbnRleHQKKyAqCUB0eXBlOiB0aGUgZWdyZXNzIGNvbnRleHQgdHlwZQorICoJQHJlc3BxOiBhc3NvY2lhdGVkIHJlc3BvbnNlIHF1ZXVlCisgKglAYmFzZV9hZGRyOiBiYXNlIGFkZHJlc3Mgb2YgcXVldWUKKyAqCUBzaXplOiBudW1iZXIgb2YgcXVldWUgZW50cmllcworICoJQHRva2VuOiB1UCB0b2tlbgorICoJQGdlbjogaW5pdGlhbCBnZW5lcmF0aW9uIHZhbHVlIGZvciB0aGUgY29udGV4dAorICoJQGNpZHg6IGNvbnN1bWVyIHBvaW50ZXIKKyAqCisgKglJbml0aWFsaXplIGFuIFNHRSBlZ3Jlc3MgY29udGV4dCBhbmQgbWFrZSBpdCByZWFkeSBmb3IgdXNlLiAgSWYgdGhlCisgKglwbGF0Zm9ybSBhbGxvd3MgY29uY3VycmVudCBjb250ZXh0IG9wZXJhdGlvbnMsIHRoZSBjYWxsZXIgaXMKKyAqCXJlc3BvbnNpYmxlIGZvciBhcHByb3ByaWF0ZSBsb2NraW5nLgorICovCitpbnQgdDNfc2dlX2luaXRfZWNudHh0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQsIGludCBndHNfZW5hYmxlLAorCQkgICAgICAgZW51bSBzZ2VfY29udGV4dF90eXBlIHR5cGUsIGludCByZXNwcSwgdTY0IGJhc2VfYWRkciwKKwkJICAgICAgIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgdG9rZW4sIGludCBnZW4sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY2lkeCkKK3sKKwl1bnNpZ25lZCBpbnQgY3JlZGl0cyA9IHR5cGUgPT0gU0dFX0NOVFhUX09GTEQgPyAwIDogRldfV1JfTlVNOworCisJaWYgKGJhc2VfYWRkciAmIDB4ZmZmKQkvKiBtdXN0IGJlIDRLIGFsaWduZWQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9DTUQpICYgRl9DT05URVhUX0NNRF9CVVNZKQorCQlyZXR1cm4gLUVCVVNZOworCisJYmFzZV9hZGRyID4+PSAxMjsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0RBVEEwLCBWX0VDX0lOREVYKGNpZHgpIHwKKwkJICAgICBWX0VDX0NSRURJVFMoY3JlZGl0cykgfCBWX0VDX0dUUyhndHNfZW5hYmxlKSk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9EQVRBMSwgVl9FQ19TSVpFKHNpemUpIHwKKwkJICAgICBWX0VDX0JBU0VfTE8oYmFzZV9hZGRyICYgMHhmZmZmKSk7CisJYmFzZV9hZGRyID4+PSAxNjsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0RBVEEyLCBiYXNlX2FkZHIpOworCWJhc2VfYWRkciA+Pj0gMzI7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9EQVRBMywKKwkJICAgICBWX0VDX0JBU0VfSEkoYmFzZV9hZGRyICYgMHhmKSB8IFZfRUNfUkVTUFEocmVzcHEpIHwKKwkJICAgICBWX0VDX1RZUEUodHlwZSkgfCBWX0VDX0dFTihnZW4pIHwgVl9FQ19VUF9UT0tFTih0b2tlbikgfAorCQkgICAgIEZfRUNfVkFMSUQpOworCXJldHVybiB0M19zZ2Vfd3JpdGVfY29udGV4dChhZGFwdGVyLCBpZCwgRl9FR1JFU1MpOworfQorCisvKioKKyAqCXQzX3NnZV9pbml0X2ZsY250eHQgLSBpbml0aWFsaXplIGFuIFNHRSBmcmVlLWJ1ZmZlciBsaXN0IGNvbnRleHQKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlciB0byBjb25maWd1cmUKKyAqCUBpZDogdGhlIGNvbnRleHQgaWQKKyAqCUBndHNfZW5hYmxlOiB3aGV0aGVyIHRvIGVuYWJsZSBHVFMgZm9yIHRoZSBjb250ZXh0CisgKglAYmFzZV9hZGRyOiBiYXNlIGFkZHJlc3Mgb2YgcXVldWUKKyAqCUBzaXplOiBudW1iZXIgb2YgcXVldWUgZW50cmllcworICoJQGJzaXplOiBzaXplIG9mIGVhY2ggYnVmZmVyIGZvciB0aGlzIHF1ZXVlCisgKglAY29uZ190aHJlczogdGhyZXNob2xkIHRvIHNpZ25hbCBjb25nZXN0aW9uIHRvIHVwc3RyZWFtIHByb2R1Y2VycworICoJQGdlbjogaW5pdGlhbCBnZW5lcmF0aW9uIHZhbHVlIGZvciB0aGUgY29udGV4dAorICoJQGNpZHg6IGNvbnN1bWVyIHBvaW50ZXIKKyAqCisgKglJbml0aWFsaXplIGFuIFNHRSBmcmVlIGxpc3QgY29udGV4dCBhbmQgbWFrZSBpdCByZWFkeSBmb3IgdXNlLiAgVGhlCisgKgljYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIG9ubHkgb25lIGNvbnRleHQgb3BlcmF0aW9uIG9jY3VycworICoJYXQgYSB0aW1lLgorICovCitpbnQgdDNfc2dlX2luaXRfZmxjbnR4dChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGlkLAorCQkJaW50IGd0c19lbmFibGUsIHU2NCBiYXNlX2FkZHIsIHVuc2lnbmVkIGludCBzaXplLAorCQkJdW5zaWduZWQgaW50IGJzaXplLCB1bnNpZ25lZCBpbnQgY29uZ190aHJlcywgaW50IGdlbiwKKwkJCXVuc2lnbmVkIGludCBjaWR4KQoreworCWlmIChiYXNlX2FkZHIgJiAweGZmZikJLyogbXVzdCBiZSA0SyBhbGlnbmVkICovCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfQ01EKSAmIEZfQ09OVEVYVF9DTURfQlVTWSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWJhc2VfYWRkciA+Pj0gMTI7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9EQVRBMCwgYmFzZV9hZGRyKTsKKwliYXNlX2FkZHIgPj49IDMyOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfREFUQTEsCisJCSAgICAgVl9GTF9CQVNFX0hJKCh1MzIpIGJhc2VfYWRkcikgfAorCQkgICAgIFZfRkxfSU5ERVhfTE8oY2lkeCAmIE1fRkxfSU5ERVhfTE8pKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0RBVEEyLCBWX0ZMX1NJWkUoc2l6ZSkgfAorCQkgICAgIFZfRkxfR0VOKGdlbikgfCBWX0ZMX0lOREVYX0hJKGNpZHggPj4gMTIpIHwKKwkJICAgICBWX0ZMX0VOVFJZX1NJWkVfTE8oYnNpemUgJiBNX0ZMX0VOVFJZX1NJWkVfTE8pKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0RBVEEzLAorCQkgICAgIFZfRkxfRU5UUllfU0laRV9ISShic2l6ZSA+PiAoMzIgLSBTX0ZMX0VOVFJZX1NJWkVfTE8pKSB8CisJCSAgICAgVl9GTF9DT05HX1RIUkVTKGNvbmdfdGhyZXMpIHwgVl9GTF9HVFMoZ3RzX2VuYWJsZSkpOworCXJldHVybiB0M19zZ2Vfd3JpdGVfY29udGV4dChhZGFwdGVyLCBpZCwgRl9GUkVFTElTVCk7Cit9CisKKy8qKgorICoJdDNfc2dlX2luaXRfcnNwY250eHQgLSBpbml0aWFsaXplIGFuIFNHRSByZXNwb25zZSBxdWV1ZSBjb250ZXh0CisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIgdG8gY29uZmlndXJlCisgKglAaWQ6IHRoZSBjb250ZXh0IGlkCisgKglAaXJxX3ZlY19pZHg6IE1TSS1YIGludGVycnVwdCB2ZWN0b3IgaW5kZXgsIDAgaWYgbm8gTVNJLVgsIC0xIGlmIG5vIElSUQorICoJQGJhc2VfYWRkcjogYmFzZSBhZGRyZXNzIG9mIHF1ZXVlCisgKglAc2l6ZTogbnVtYmVyIG9mIHF1ZXVlIGVudHJpZXMKKyAqCUBmbF90aHJlczogdGhyZXNob2xkIGZvciBzZWxlY3RpbmcgdGhlIG5vcm1hbCBvciBqdW1ibyBmcmVlIGxpc3QKKyAqCUBnZW46IGluaXRpYWwgZ2VuZXJhdGlvbiB2YWx1ZSBmb3IgdGhlIGNvbnRleHQKKyAqCUBjaWR4OiBjb25zdW1lciBwb2ludGVyCisgKgorICoJSW5pdGlhbGl6ZSBhbiBTR0UgcmVzcG9uc2UgcXVldWUgY29udGV4dCBhbmQgbWFrZSBpdCByZWFkeSBmb3IgdXNlLgorICoJVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgb25seSBvbmUgY29udGV4dCBvcGVyYXRpb24KKyAqCW9jY3VycyBhdCBhIHRpbWUuCisgKi8KK2ludCB0M19zZ2VfaW5pdF9yc3BjbnR4dChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGlkLAorCQkJIGludCBpcnFfdmVjX2lkeCwgdTY0IGJhc2VfYWRkciwgdW5zaWduZWQgaW50IHNpemUsCisJCQkgdW5zaWduZWQgaW50IGZsX3RocmVzLCBpbnQgZ2VuLCB1bnNpZ25lZCBpbnQgY2lkeCkKK3sKKwl1bnNpZ25lZCBpbnQgaW50ciA9IDA7CisKKwlpZiAoYmFzZV9hZGRyICYgMHhmZmYpCS8qIG11c3QgYmUgNEsgYWxpZ25lZCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodDNfcmVhZF9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCkgJiBGX0NPTlRFWFRfQ01EX0JVU1kpCisJCXJldHVybiAtRUJVU1k7CisKKwliYXNlX2FkZHIgPj49IDEyOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfREFUQTAsIFZfQ1FfU0laRShzaXplKSB8CisJCSAgICAgVl9DUV9JTkRFWChjaWR4KSk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9EQVRBMSwgYmFzZV9hZGRyKTsKKwliYXNlX2FkZHIgPj49IDMyOworCWlmIChpcnFfdmVjX2lkeCA+PSAwKQorCQlpbnRyID0gVl9SUV9NU0lfVkVDKGlycV92ZWNfaWR4KSB8IEZfUlFfSU5UUl9FTjsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0RBVEEyLAorCQkgICAgIFZfQ1FfQkFTRV9ISSgodTMyKSBiYXNlX2FkZHIpIHwgaW50ciB8IFZfUlFfR0VOKGdlbikpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfREFUQTMsIGZsX3RocmVzKTsKKwlyZXR1cm4gdDNfc2dlX3dyaXRlX2NvbnRleHQoYWRhcHRlciwgaWQsIEZfUkVTUE9OU0VRKTsKK30KKworLyoqCisgKgl0M19zZ2VfaW5pdF9jcWNudHh0IC0gaW5pdGlhbGl6ZSBhbiBTR0UgY29tcGxldGlvbiBxdWV1ZSBjb250ZXh0CisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIgdG8gY29uZmlndXJlCisgKglAaWQ6IHRoZSBjb250ZXh0IGlkCisgKglAYmFzZV9hZGRyOiBiYXNlIGFkZHJlc3Mgb2YgcXVldWUKKyAqCUBzaXplOiBudW1iZXIgb2YgcXVldWUgZW50cmllcworICoJQHJzcHE6IHJlc3BvbnNlIHF1ZXVlIGZvciBhc3luYyBub3RpZmljYXRpb25zCisgKglAb3ZmbF9tb2RlOiBDUSBvdmVyZmxvdyBtb2RlCisgKglAY3JlZGl0czogY29tcGxldGlvbiBxdWV1ZSBjcmVkaXRzCisgKglAY3JlZGl0X3RocmVzOiB0aGUgY3JlZGl0IHRocmVzaG9sZAorICoKKyAqCUluaXRpYWxpemUgYW4gU0dFIGNvbXBsZXRpb24gcXVldWUgY29udGV4dCBhbmQgbWFrZSBpdCByZWFkeSBmb3IgdXNlLgorICoJVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgb25seSBvbmUgY29udGV4dCBvcGVyYXRpb24KKyAqCW9jY3VycyBhdCBhIHRpbWUuCisgKi8KK2ludCB0M19zZ2VfaW5pdF9jcWNudHh0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQsIHU2NCBiYXNlX2FkZHIsCisJCQl1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IHJzcHEsIGludCBvdmZsX21vZGUsCisJCQl1bnNpZ25lZCBpbnQgY3JlZGl0cywgdW5zaWduZWQgaW50IGNyZWRpdF90aHJlcykKK3sKKwlpZiAoYmFzZV9hZGRyICYgMHhmZmYpCS8qIG11c3QgYmUgNEsgYWxpZ25lZCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodDNfcmVhZF9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCkgJiBGX0NPTlRFWFRfQ01EX0JVU1kpCisJCXJldHVybiAtRUJVU1k7CisKKwliYXNlX2FkZHIgPj49IDEyOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfREFUQTAsIFZfQ1FfU0laRShzaXplKSk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9EQVRBMSwgYmFzZV9hZGRyKTsKKwliYXNlX2FkZHIgPj49IDMyOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfREFUQTIsCisJCSAgICAgVl9DUV9CQVNFX0hJKCh1MzIpIGJhc2VfYWRkcikgfCBWX0NRX1JTUFEocnNwcSkgfAorCQkgICAgIFZfQ1FfR0VOKDEpIHwgVl9DUV9PVkVSRkxPV19NT0RFKG92ZmxfbW9kZSkpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfREFUQTMsIFZfQ1FfQ1JFRElUUyhjcmVkaXRzKSB8CisJCSAgICAgVl9DUV9DUkVESVRfVEhSRVMoY3JlZGl0X3RocmVzKSk7CisJcmV0dXJuIHQzX3NnZV93cml0ZV9jb250ZXh0KGFkYXB0ZXIsIGlkLCBGX0NRKTsKK30KKworLyoqCisgKgl0M19zZ2VfZW5hYmxlX2VjbnR4dCAtIGVuYWJsZS9kaXNhYmxlIGFuIFNHRSBlZ3Jlc3MgY29udGV4dAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAaWQ6IHRoZSBlZ3Jlc3MgY29udGV4dCBpZAorICoJQGVuYWJsZTogZW5hYmxlICgxKSBvciBkaXNhYmxlICgwKSB0aGUgY29udGV4dAorICoKKyAqCUVuYWJsZSBvciBkaXNhYmxlIGFuIFNHRSBlZ3Jlc3MgY29udGV4dC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgKgllbnN1cmluZyBvbmx5IG9uZSBjb250ZXh0IG9wZXJhdGlvbiBvY2N1cnMgYXQgYSB0aW1lLgorICovCitpbnQgdDNfc2dlX2VuYWJsZV9lY250eHQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBpZCwgaW50IGVuYWJsZSkKK3sKKwlpZiAodDNfcmVhZF9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCkgJiBGX0NPTlRFWFRfQ01EX0JVU1kpCisJCXJldHVybiAtRUJVU1k7CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0swLCAwKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0sxLCAwKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0syLCAwKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0szLCBGX0VDX1ZBTElEKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0RBVEEzLCBWX0VDX1ZBTElEKGVuYWJsZSkpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfQ01ELAorCQkgICAgIFZfQ09OVEVYVF9DTURfT1BDT0RFKDEpIHwgRl9FR1JFU1MgfCBWX0NPTlRFWFQoaWQpKTsKKwlyZXR1cm4gdDNfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9DTUQsIEZfQ09OVEVYVF9DTURfQlVTWSwKKwkJCSAgICAgICAwLCA1LCAxKTsKK30KKworLyoqCisgKgl0M19zZ2VfZGlzYWJsZV9mbCAtIGRpc2FibGUgYW4gU0dFIGZyZWUtYnVmZmVyIGxpc3QKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQGlkOiB0aGUgZnJlZSBsaXN0IGNvbnRleHQgaWQKKyAqCisgKglEaXNhYmxlIGFuIFNHRSBmcmVlLWJ1ZmZlciBsaXN0LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqCWVuc3VyaW5nIG9ubHkgb25lIGNvbnRleHQgb3BlcmF0aW9uIG9jY3VycyBhdCBhIHRpbWUuCisgKi8KK2ludCB0M19zZ2VfZGlzYWJsZV9mbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGlkKQoreworCWlmICh0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfQ01EKSAmIEZfQ09OVEVYVF9DTURfQlVTWSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfTUFTSzAsIDApOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfTUFTSzEsIDApOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfTUFTSzIsIFZfRkxfU0laRShNX0ZMX1NJWkUpKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0szLCAwKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0RBVEEyLCAwKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCwKKwkJICAgICBWX0NPTlRFWFRfQ01EX09QQ09ERSgxKSB8IEZfRlJFRUxJU1QgfCBWX0NPTlRFWFQoaWQpKTsKKwlyZXR1cm4gdDNfd2FpdF9vcF9kb25lKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9DTUQsIEZfQ09OVEVYVF9DTURfQlVTWSwKKwkJCSAgICAgICAwLCA1LCAxKTsKK30KKworLyoqCisgKgl0M19zZ2VfZGlzYWJsZV9yc3BjbnR4dCAtIGRpc2FibGUgYW4gU0dFIHJlc3BvbnNlIHF1ZXVlCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBpZDogdGhlIHJlc3BvbnNlIHF1ZXVlIGNvbnRleHQgaWQKKyAqCisgKglEaXNhYmxlIGFuIFNHRSByZXNwb25zZSBxdWV1ZS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCisgKgllbnN1cmluZyBvbmx5IG9uZSBjb250ZXh0IG9wZXJhdGlvbiBvY2N1cnMgYXQgYSB0aW1lLgorICovCitpbnQgdDNfc2dlX2Rpc2FibGVfcnNwY250eHQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlpZiAodDNfcmVhZF9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCkgJiBGX0NPTlRFWFRfQ01EX0JVU1kpCisJCXJldHVybiAtRUJVU1k7CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0swLCBWX0NRX1NJWkUoTV9DUV9TSVpFKSk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9NQVNLMSwgMCk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9NQVNLMiwgMCk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9NQVNLMywgMCk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9EQVRBMCwgMCk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9DTUQsCisJCSAgICAgVl9DT05URVhUX0NNRF9PUENPREUoMSkgfCBGX1JFU1BPTlNFUSB8IFZfQ09OVEVYVChpZCkpOworCXJldHVybiB0M193YWl0X29wX2RvbmUoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCwgRl9DT05URVhUX0NNRF9CVVNZLAorCQkJICAgICAgIDAsIDUsIDEpOworfQorCisvKioKKyAqCXQzX3NnZV9kaXNhYmxlX2NxY250eHQgLSBkaXNhYmxlIGFuIFNHRSBjb21wbGV0aW9uIHF1ZXVlCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBpZDogdGhlIGNvbXBsZXRpb24gcXVldWUgY29udGV4dCBpZAorICoKKyAqCURpc2FibGUgYW4gU0dFIGNvbXBsZXRpb24gcXVldWUuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICoJZW5zdXJpbmcgb25seSBvbmUgY29udGV4dCBvcGVyYXRpb24gb2NjdXJzIGF0IGEgdGltZS4KKyAqLworaW50IHQzX3NnZV9kaXNhYmxlX2NxY250eHQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlpZiAodDNfcmVhZF9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCkgJiBGX0NPTlRFWFRfQ01EX0JVU1kpCisJCXJldHVybiAtRUJVU1k7CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX01BU0swLCBWX0NRX1NJWkUoTV9DUV9TSVpFKSk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9NQVNLMSwgMCk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9NQVNLMiwgMCk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9NQVNLMywgMCk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9EQVRBMCwgMCk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9DTUQsCisJCSAgICAgVl9DT05URVhUX0NNRF9PUENPREUoMSkgfCBGX0NRIHwgVl9DT05URVhUKGlkKSk7CisJcmV0dXJuIHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX1NHX0NPTlRFWFRfQ01ELCBGX0NPTlRFWFRfQ01EX0JVU1ksCisJCQkgICAgICAgMCwgNSwgMSk7Cit9CisKKy8qKgorICoJdDNfc2dlX2NxY250eHRfb3AgLSBwZXJmb3JtIGFuIG9wZXJhdGlvbiBvbiBhIGNvbXBsZXRpb24gcXVldWUgY29udGV4dAorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAaWQ6IHRoZSBjb250ZXh0IGlkCisgKglAb3A6IHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybQorICoKKyAqCVBlcmZvcm0gdGhlIHNlbGVjdGVkIG9wZXJhdGlvbiBvbiBhbiBTR0UgY29tcGxldGlvbiBxdWV1ZSBjb250ZXh0LgorICoJVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgb25seSBvbmUgY29udGV4dCBvcGVyYXRpb24KKyAqCW9jY3VycyBhdCBhIHRpbWUuCisgKi8KK2ludCB0M19zZ2VfY3FjbnR4dF9vcChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgb3AsCisJCSAgICAgIHVuc2lnbmVkIGludCBjcmVkaXRzKQoreworCXUzMiB2YWw7CisKKwlpZiAodDNfcmVhZF9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCkgJiBGX0NPTlRFWFRfQ01EX0JVU1kpCisJCXJldHVybiAtRUJVU1k7CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0RBVEEwLCBjcmVkaXRzIDw8IDE2KTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCwgVl9DT05URVhUX0NNRF9PUENPREUob3ApIHwKKwkJICAgICBWX0NPTlRFWFQoaWQpIHwgRl9DUSk7CisJaWYgKHQzX3dhaXRfb3BfZG9uZV92YWwoYWRhcHRlciwgQV9TR19DT05URVhUX0NNRCwgRl9DT05URVhUX0NNRF9CVVNZLAorCQkJCTAsIDUsIDEsICZ2YWwpKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChvcCA+PSAyICYmIG9wIDwgNykgeworCQlpZiAoYWRhcHRlci0+cGFyYW1zLnJldiA+IDApCisJCQlyZXR1cm4gR19DUV9JTkRFWCh2YWwpOworCisJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfQ01ELAorCQkJICAgICBWX0NPTlRFWFRfQ01EX09QQ09ERSgwKSB8IEZfQ1EgfCBWX0NPTlRFWFQoaWQpKTsKKwkJaWYgKHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX1NHX0NPTlRFWFRfQ01ELAorCQkJCSAgICBGX0NPTlRFWFRfQ01EX0JVU1ksIDAsIDUsIDEpKQorCQkJcmV0dXJuIC1FSU87CisJCXJldHVybiBHX0NRX0lOREVYKHQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9EQVRBMCkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAJdDNfc2dlX3JlYWRfY29udGV4dCAtIHJlYWQgYW4gU0dFIGNvbnRleHQKKyAqIAlAdHlwZTogdGhlIGNvbnRleHQgdHlwZQorICogCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICogCUBpZDogdGhlIGNvbnRleHQgaWQKKyAqIAlAZGF0YTogaG9sZHMgdGhlIHJldHJpZXZlZCBjb250ZXh0CisgKgorICogCVJlYWQgYW4gU0dFIGVncmVzcyBjb250ZXh0LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcKKyAqIAlvbmx5IG9uZSBjb250ZXh0IG9wZXJhdGlvbiBvY2N1cnMgYXQgYSB0aW1lLgorICovCitzdGF0aWMgaW50IHQzX3NnZV9yZWFkX2NvbnRleHQodW5zaWduZWQgaW50IHR5cGUsIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBpZCwgdTMyIGRhdGFbNF0pCit7CisJaWYgKHQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9DTUQpICYgRl9DT05URVhUX0NNRF9CVVNZKQorCQlyZXR1cm4gLUVCVVNZOworCisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfU0dfQ09OVEVYVF9DTUQsCisJCSAgICAgVl9DT05URVhUX0NNRF9PUENPREUoMCkgfCB0eXBlIHwgVl9DT05URVhUKGlkKSk7CisJaWYgKHQzX3dhaXRfb3BfZG9uZShhZGFwdGVyLCBBX1NHX0NPTlRFWFRfQ01ELCBGX0NPTlRFWFRfQ01EX0JVU1ksIDAsCisJCQkgICAgNSwgMSkpCisJCXJldHVybiAtRUlPOworCWRhdGFbMF0gPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfREFUQTApOworCWRhdGFbMV0gPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfREFUQTEpOworCWRhdGFbMl0gPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfREFUQTIpOworCWRhdGFbM10gPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1NHX0NPTlRFWFRfREFUQTMpOworCXJldHVybiAwOworfQorCisvKioKKyAqIAl0M19zZ2VfcmVhZF9lY250eHQgLSByZWFkIGFuIFNHRSBlZ3Jlc3MgY29udGV4dAorICogCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICogCUBpZDogdGhlIGNvbnRleHQgaWQKKyAqIAlAZGF0YTogaG9sZHMgdGhlIHJldHJpZXZlZCBjb250ZXh0CisgKgorICogCVJlYWQgYW4gU0dFIGVncmVzcyBjb250ZXh0LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcKKyAqIAlvbmx5IG9uZSBjb250ZXh0IG9wZXJhdGlvbiBvY2N1cnMgYXQgYSB0aW1lLgorICovCitpbnQgdDNfc2dlX3JlYWRfZWNudHh0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQsIHUzMiBkYXRhWzRdKQoreworCWlmIChpZCA+PSA2NTUzNikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHQzX3NnZV9yZWFkX2NvbnRleHQoRl9FR1JFU1MsIGFkYXB0ZXIsIGlkLCBkYXRhKTsKK30KKworLyoqCisgKiAJdDNfc2dlX3JlYWRfY3EgLSByZWFkIGFuIFNHRSBDUSBjb250ZXh0CisgKiAJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKiAJQGlkOiB0aGUgY29udGV4dCBpZAorICogCUBkYXRhOiBob2xkcyB0aGUgcmV0cmlldmVkIGNvbnRleHQKKyAqCisgKiAJUmVhZCBhbiBTR0UgQ1EgY29udGV4dC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nCisgKiAJb25seSBvbmUgY29udGV4dCBvcGVyYXRpb24gb2NjdXJzIGF0IGEgdGltZS4KKyAqLworaW50IHQzX3NnZV9yZWFkX2NxKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQsIHUzMiBkYXRhWzRdKQoreworCWlmIChpZCA+PSA2NTUzNikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHQzX3NnZV9yZWFkX2NvbnRleHQoRl9DUSwgYWRhcHRlciwgaWQsIGRhdGEpOworfQorCisvKioKKyAqIAl0M19zZ2VfcmVhZF9mbCAtIHJlYWQgYW4gU0dFIGZyZWUtbGlzdCBjb250ZXh0CisgKiAJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKiAJQGlkOiB0aGUgY29udGV4dCBpZAorICogCUBkYXRhOiBob2xkcyB0aGUgcmV0cmlldmVkIGNvbnRleHQKKyAqCisgKiAJUmVhZCBhbiBTR0UgZnJlZS1saXN0IGNvbnRleHQuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZworICogCW9ubHkgb25lIGNvbnRleHQgb3BlcmF0aW9uIG9jY3VycyBhdCBhIHRpbWUuCisgKi8KK2ludCB0M19zZ2VfcmVhZF9mbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGlkLCB1MzIgZGF0YVs0XSkKK3sKKwlpZiAoaWQgPj0gU0dFX1FTRVRTICogMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHQzX3NnZV9yZWFkX2NvbnRleHQoRl9GUkVFTElTVCwgYWRhcHRlciwgaWQsIGRhdGEpOworfQorCisvKioKKyAqIAl0M19zZ2VfcmVhZF9yc3BxIC0gcmVhZCBhbiBTR0UgcmVzcG9uc2UgcXVldWUgY29udGV4dAorICogCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICogCUBpZDogdGhlIGNvbnRleHQgaWQKKyAqIAlAZGF0YTogaG9sZHMgdGhlIHJldHJpZXZlZCBjb250ZXh0CisgKgorICogCVJlYWQgYW4gU0dFIHJlc3BvbnNlIHF1ZXVlIGNvbnRleHQuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogCWVuc3VyaW5nIG9ubHkgb25lIGNvbnRleHQgb3BlcmF0aW9uIG9jY3VycyBhdCBhIHRpbWUuCisgKi8KK2ludCB0M19zZ2VfcmVhZF9yc3BxKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgaWQsIHUzMiBkYXRhWzRdKQoreworCWlmIChpZCA+PSBTR0VfUVNFVFMpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiB0M19zZ2VfcmVhZF9jb250ZXh0KEZfUkVTUE9OU0VRLCBhZGFwdGVyLCBpZCwgZGF0YSk7Cit9CisKKy8qKgorICoJdDNfY29uZmlnX3JzcyAtIGNvbmZpZ3VyZSBSeCBwYWNrZXQgc3RlZXJpbmcKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoJQHJzc19jb25maWc6IFJTUyBzZXR0aW5ncyAod3JpdHRlbiB0byBUUF9SU1NfQ09ORklHKQorICoJQGNwdXM6IHZhbHVlcyBmb3IgdGhlIENQVSBsb29rdXAgdGFibGUgKDB4ZmYgdGVybWluYXRlZCkKKyAqCUByc3BxOiB2YWx1ZXMgZm9yIHRoZSByZXNwb25zZSBxdWV1ZSBsb29rdXAgdGFibGUgKDB4ZmZmZiB0ZXJtaW5hdGVkKQorICoKKyAqCVByb2dyYW1zIHRoZSByZWNlaXZlIHBhY2tldCBzdGVlcmluZyBsb2dpYy4gIEBjcHVzIGFuZCBAcnNwcSBwcm92aWRlCisgKgl0aGUgdmFsdWVzIGZvciB0aGUgQ1BVIGFuZCByZXNwb25zZSBxdWV1ZSBsb29rdXAgdGFibGVzLiAgSWYgdGhleQorICoJcHJvdmlkZSBmZXdlciB2YWx1ZXMgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgdGFibGVzIHRoZSBzdXBwbGllZCB2YWx1ZXMKKyAqCWFyZSB1c2VkIHJlcGVhdGVkbHkgdW50aWwgdGhlIHRhYmxlcyBhcmUgZnVsbHkgcG9wdWxhdGVkLgorICovCit2b2lkIHQzX2NvbmZpZ19yc3Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCByc3NfY29uZmlnLAorCQkgICBjb25zdCB1OCAqIGNwdXMsIGNvbnN0IHUxNiAqcnNwcSkKK3sKKwlpbnQgaSwgaiwgY3B1X2lkeCA9IDAsIHFfaWR4ID0gMDsKKworCWlmIChjcHVzKQorCQlmb3IgKGkgPSAwOyBpIDwgUlNTX1RBQkxFX1NJWkU7ICsraSkgeworCQkJdTMyIHZhbCA9IGkgPDwgMTY7CisKKwkJCWZvciAoaiA9IDA7IGogPCAyOyArK2opIHsKKwkJCQl2YWwgfD0gKGNwdXNbY3B1X2lkeCsrXSAmIDB4M2YpIDw8ICg4ICogaik7CisJCQkJaWYgKGNwdXNbY3B1X2lkeF0gPT0gMHhmZikKKwkJCQkJY3B1X2lkeCA9IDA7CisJCQl9CisJCQl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9UUF9SU1NfTEtQX1RBQkxFLCB2YWwpOworCQl9CisKKwlpZiAocnNwcSkKKwkJZm9yIChpID0gMDsgaSA8IFJTU19UQUJMRV9TSVpFOyArK2kpIHsKKwkJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1RQX1JTU19NQVBfVEFCTEUsCisJCQkJICAgICAoaSA8PCAxNikgfCByc3BxW3FfaWR4KytdKTsKKwkJCWlmIChyc3BxW3FfaWR4XSA9PSAweGZmZmYpCisJCQkJcV9pZHggPSAwOworCQl9CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9UUF9SU1NfQ09ORklHLCByc3NfY29uZmlnKTsKK30KKworLyoqCisgKgl0M19yZWFkX3JzcyAtIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBSU1MgdGFibGVzCisgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKKyAqCUBsa3VwOiBob2xkcyB0aGUgY29udGVudHMgb2YgdGhlIFJTUyBsb29rdXAgdGFibGUKKyAqCUBtYXA6IGhvbGRzIHRoZSBjb250ZW50cyBvZiB0aGUgUlNTIG1hcCB0YWJsZQorICoKKyAqCVJlYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgcmVjZWl2ZSBwYWNrZXQgc3RlZXJpbmcgdGFibGVzLgorICovCitpbnQgdDNfcmVhZF9yc3Moc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4ICogbGt1cCwgdTE2ICptYXApCit7CisJaW50IGk7CisJdTMyIHZhbDsKKworCWlmIChsa3VwKQorCQlmb3IgKGkgPSAwOyBpIDwgUlNTX1RBQkxFX1NJWkU7ICsraSkgeworCQkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfVFBfUlNTX0xLUF9UQUJMRSwKKwkJCQkgICAgIDB4ZmZmZjAwMDAgfCBpKTsKKwkJCXZhbCA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfVFBfUlNTX0xLUF9UQUJMRSk7CisJCQlpZiAoISh2YWwgJiAweDgwMDAwMDAwKSkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCSpsa3VwKysgPSB2YWw7CisJCQkqbGt1cCsrID0gKHZhbCA+PiA4KTsKKwkJfQorCisJaWYgKG1hcCkKKwkJZm9yIChpID0gMDsgaSA8IFJTU19UQUJMRV9TSVpFOyArK2kpIHsKKwkJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1RQX1JTU19NQVBfVEFCTEUsCisJCQkJICAgICAweGZmZmYwMDAwIHwgaSk7CisJCQl2YWwgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1RQX1JTU19NQVBfVEFCTEUpOworCQkJaWYgKCEodmFsICYgMHg4MDAwMDAwMCkpCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQkqbWFwKysgPSB2YWw7CisJCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl0M190cF9zZXRfb2ZmbG9hZF9tb2RlIC0gcHV0IFRQIGluIE5JQy9vZmZsb2FkIG1vZGUKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQGVuYWJsZTogMSB0byBzZWxlY3Qgb2ZmbG9hZCBtb2RlLCAwIGZvciByZWd1bGFyIE5JQworICoKKyAqCVN3aXRjaGVzIFRQIHRvIE5JQy9vZmZsb2FkIG1vZGUuCisgKi8KK3ZvaWQgdDNfdHBfc2V0X29mZmxvYWRfbW9kZShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgaW50IGVuYWJsZSkKK3sKKwlpZiAoaXNfb2ZmbG9hZChhZGFwKSB8fCAhZW5hYmxlKQorCQl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfVFBfSU5fQ09ORklHLCBGX05JQ01PREUsCisJCQkJIFZfTklDTU9ERSghZW5hYmxlKSk7Cit9CisKKy8qKgorICoJcG1fbnVtX3BhZ2VzIC0gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFnZXMgb2YgdGhlIHBheWxvYWQgbWVtb3J5CisgKglAbWVtX3NpemU6IHRoZSBzaXplIG9mIHRoZSBwYXlsb2FkIG1lbW9yeQorICoJQHBnX3NpemU6IHRoZSBzaXplIG9mIGVhY2ggcGF5bG9hZCBtZW1vcnkgcGFnZQorICoKKyAqCUNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHBhZ2VzLCBlYWNoIG9mIHRoZSBnaXZlbiBzaXplLCB0aGF0IGZpdCBpbiBhCisgKgltZW1vcnkgb2YgdGhlIHNwZWNpZmllZCBzaXplLCByZXNwZWN0aW5nIHRoZSBIVyByZXF1aXJlbWVudCB0aGF0IHRoZQorICoJbnVtYmVyIG9mIHBhZ2VzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyNC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcG1fbnVtX3BhZ2VzKHVuc2lnbmVkIGludCBtZW1fc2l6ZSwKKwkJCQkJdW5zaWduZWQgaW50IHBnX3NpemUpCit7CisJdW5zaWduZWQgaW50IG4gPSBtZW1fc2l6ZSAvIHBnX3NpemU7CisKKwlyZXR1cm4gbiAtIG4gJSAyNDsKK30KKworI2RlZmluZSBtZW1fcmVnaW9uKGFkYXAsIHN0YXJ0LCBzaXplLCByZWcpIFwKKwl0M193cml0ZV9yZWcoKGFkYXApLCBBXyAjIyByZWcsIChzdGFydCkpOyBcCisJc3RhcnQgKz0gc2l6ZQorCisvKgorICoJcGFydGl0aW9uX21lbSAtIHBhcnRpdGlvbiBtZW1vcnkgYW5kIGNvbmZpZ3VyZSBUUCBtZW1vcnkgc2V0dGluZ3MKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQHA6IHRoZSBUUCBwYXJhbWV0ZXJzCisgKgorICoJUGFydGl0aW9ucyBjb250ZXh0IGFuZCBwYXlsb2FkIG1lbW9yeSBhbmQgY29uZmlndXJlcyBUUCdzIG1lbW9yeQorICoJcmVnaXN0ZXJzLgorICovCitzdGF0aWMgdm9pZCBwYXJ0aXRpb25fbWVtKHN0cnVjdCBhZGFwdGVyICphZGFwLCBjb25zdCBzdHJ1Y3QgdHBfcGFyYW1zICpwKQoreworCXVuc2lnbmVkIGludCBtLCBwc3RydWN0cywgdGlkcyA9IHQzX21jNV9zaXplKCZhZGFwLT5tYzUpOworCXVuc2lnbmVkIGludCB0aW1lcnMgPSAwLCB0aW1lcnNfc2hpZnQgPSAyMjsKKworCWlmIChhZGFwLT5wYXJhbXMucmV2ID4gMCkgeworCQlpZiAodGlkcyA8PSAxNiAqIDEwMjQpIHsKKwkJCXRpbWVycyA9IDE7CisJCQl0aW1lcnNfc2hpZnQgPSAxNjsKKwkJfSBlbHNlIGlmICh0aWRzIDw9IDY0ICogMTAyNCkgeworCQkJdGltZXJzID0gMjsKKwkJCXRpbWVyc19zaGlmdCA9IDE4OworCQl9IGVsc2UgaWYgKHRpZHMgPD0gMjU2ICogMTAyNCkgeworCQkJdGltZXJzID0gMzsKKwkJCXRpbWVyc19zaGlmdCA9IDIwOworCQl9CisJfQorCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfUE1NX1NJWkUsCisJCSAgICAgcC0+Y2hhbl9yeF9zaXplIHwgKHAtPmNoYW5fdHhfc2l6ZSA+PiAxNikpOworCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfUE1NX1RYX0JBU0UsIDApOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1BNTV9UWF9QQUdFX1NJWkUsIHAtPnR4X3BnX3NpemUpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1BNTV9UWF9NQVhfUEFHRSwgcC0+dHhfbnVtX3Bncyk7CisJdDNfc2V0X3JlZ19maWVsZChhZGFwLCBBX1RQX1BBUkFfUkVHMywgVl9UWERBVEFBQ0tJRFgoTV9UWERBVEFBQ0tJRFgpLAorCQkJIFZfVFhEQVRBQUNLSURYKGZscyhwLT50eF9wZ19zaXplKSAtIDEyKSk7CisKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9QTU1fUlhfQkFTRSwgMCk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfUE1NX1JYX1BBR0VfU0laRSwgcC0+cnhfcGdfc2l6ZSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfUE1NX1JYX01BWF9QQUdFLCBwLT5yeF9udW1fcGdzKTsKKworCXBzdHJ1Y3RzID0gcC0+cnhfbnVtX3BncyArIHAtPnR4X251bV9wZ3M7CisJLyogQWRkIGEgYml0IG9mIGhlYWRyb29tIGFuZCBtYWtlIG11bHRpcGxlIG9mIDI0ICovCisJcHN0cnVjdHMgKz0gNDg7CisJcHN0cnVjdHMgLT0gcHN0cnVjdHMgJSAyNDsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9DTU1fTU1fTUFYX1BTVFJVQ1QsIHBzdHJ1Y3RzKTsKKworCW0gPSB0aWRzICogVENCX1NJWkU7CisJbWVtX3JlZ2lvbihhZGFwLCBtLCAoNjQgPDwgMTApICogNjQsIFNHX0VHUl9DTlRYX0JBRERSKTsKKwltZW1fcmVnaW9uKGFkYXAsIG0sICg2NCA8PCAxMCkgKiA2NCwgU0dfQ1FfQ09OVEVYVF9CQUREUik7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfQ01NX1RJTUVSX0JBU0UsIFZfQ01USU1FUk1BWE5VTSh0aW1lcnMpIHwgbSk7CisJbSArPSAoKHAtPm50aW1lcl9xcyAtIDEpIDw8IHRpbWVyc19zaGlmdCkgKyAoMSA8PCAyMik7CisJbWVtX3JlZ2lvbihhZGFwLCBtLCBwc3RydWN0cyAqIDY0LCBUUF9DTU1fTU1fQkFTRSk7CisJbWVtX3JlZ2lvbihhZGFwLCBtLCA2NCAqIChwc3RydWN0cyAvIDI0KSwgVFBfQ01NX01NX1BTX0ZMU1RfQkFTRSk7CisJbWVtX3JlZ2lvbihhZGFwLCBtLCA2NCAqIChwLT5yeF9udW1fcGdzIC8gMjQpLCBUUF9DTU1fTU1fUlhfRkxTVF9CQVNFKTsKKwltZW1fcmVnaW9uKGFkYXAsIG0sIDY0ICogKHAtPnR4X251bV9wZ3MgLyAyNCksIFRQX0NNTV9NTV9UWF9GTFNUX0JBU0UpOworCisJbSA9IChtICsgNDA5NSkgJiB+MHhmZmY7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfQ0lNX1NEUkFNX0JBU0VfQUREUiwgbSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfQ0lNX1NEUkFNX0FERFJfU0laRSwgcC0+Y21fc2l6ZSAtIG0pOworCisJdGlkcyA9IChwLT5jbV9zaXplIC0gbSAtICgzIDw8IDIwKSkgLyAzMDcyIC0gMzI7CisJbSA9IHQzX21jNV9zaXplKCZhZGFwLT5tYzUpIC0gYWRhcC0+cGFyYW1zLm1jNS5uc2VydmVycyAtCisJICAgIGFkYXAtPnBhcmFtcy5tYzUubmZpbHRlcnMgLSBhZGFwLT5wYXJhbXMubWM1Lm5yb3V0ZXM7CisJaWYgKHRpZHMgPCBtKQorCQlhZGFwLT5wYXJhbXMubWM1Lm5zZXJ2ZXJzICs9IG0gLSB0aWRzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHBfd3JfaW5kaXJlY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBhZGRyLAorCQkJCSAgdTMyIHZhbCkKK3sKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9QSU9fQUREUiwgYWRkcik7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfUElPX0RBVEEsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHRwX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgY29uc3Qgc3RydWN0IHRwX3BhcmFtcyAqcCkKK3sKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9HTE9CQUxfQ09ORklHLCBGX1RYUEFDSU5HRU5BQkxFIHwgRl9QQVRITVRVIHwKKwkJICAgICBGX0lQQ0hFQ0tTVU1PRkZMT0FEIHwgRl9VRFBDSEVDS1NVTU9GRkxPQUQgfAorCQkgICAgIEZfVENQQ0hFQ0tTVU1PRkZMT0FEIHwgVl9JUFRUTCg2NCkpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1RDUF9PUFRJT05TLCBWX01UVURFRkFVTFQoNTc2KSB8CisJCSAgICAgRl9NVFVFTkFCTEUgfCBWX1dJTkRPV1NDQUxFTU9ERSgxKSB8CisJCSAgICAgVl9USU1FU1RBTVBTTU9ERSgxKSB8IFZfU0FDS01PREUoMSkgfCBWX1NBQ0tSWCgxKSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfREFDS19DT05GSUcsIFZfQVVUT1NUQVRFMygxKSB8CisJCSAgICAgVl9BVVRPU1RBVEUyKDEpIHwgVl9BVVRPU1RBVEUxKDApIHwKKwkJICAgICBWX0JZVEVUSFJFU0hPTEQoMTYzODQpIHwgVl9NU1NUSFJFU0hPTEQoMikgfAorCQkgICAgIEZfQVVUT0NBUkVGVUwgfCBGX0FVVE9FTkFCTEUgfCBWX0RBQ0tfTU9ERSgxKSk7CisJdDNfc2V0X3JlZ19maWVsZChhZGFwLCBBX1RQX0lOX0NPTkZJRywgRl9JUFY2RU5BQkxFIHwgRl9OSUNNT0RFLAorCQkJIEZfSVBWNkVOQUJMRSB8IEZfTklDTU9ERSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfVFhfUkVTT1VSQ0VfTElNSVQsIDB4MTgxNDE4MTQpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1BBUkFfUkVHNCwgMHg1MDUwMTA1KTsKKwl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfVFBfUEFSQV9SRUc2LAorCQkJIGFkYXAtPnBhcmFtcy5yZXYgPiAwID8gRl9FTkFCTEVFU05EIDogRl9UM0FfRU5BQkxFRVNORCwKKwkJCSAwKTsKKworCXQzX3NldF9yZWdfZmllbGQoYWRhcCwgQV9UUF9QQ19DT05GSUcsCisJCQkgRl9FTkFCTEVFUENNREFGVUxMIHwgRl9FTkFCTEVPQ1NQSUZVTEwsCisJCQkgRl9UWERFRkVSRU5BQkxFIHwgRl9IRUFSQkVBVERBQ0sgfCBGX1RYQ09OR0VTVElPTk1PREUgfAorCQkJIEZfUlhDT05HRVNUSU9OTU9ERSk7CisJdDNfc2V0X3JlZ19maWVsZChhZGFwLCBBX1RQX1BDX0NPTkZJRzIsIEZfQ0hEUkFGVUxMLCAwKTsKKworCWlmIChhZGFwLT5wYXJhbXMucmV2ID4gMCkgeworCQl0cF93cl9pbmRpcmVjdChhZGFwLCBBX1RQX0VHUkVTU19DT05GSUcsIEZfUkVXUklURUZPUkNFVE9TSVpFKTsKKwkJdDNfc2V0X3JlZ19maWVsZChhZGFwLCBBX1RQX1BBUkFfUkVHMywgRl9UWFBBQ0VBVVRPLAorCQkJCSBGX1RYUEFDRUFVVE8pOworCQl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfVFBfUENfQ09ORklHLCBGX0xPQ0tUSUQsIEZfTE9DS1RJRCk7CisJCXQzX3NldF9yZWdfZmllbGQoYWRhcCwgQV9UUF9QQVJBX1JFRzMsIDAsIEZfVFhQQUNFQVVUT1NUUklDVCk7CisJfSBlbHNlCisJCXQzX3NldF9yZWdfZmllbGQoYWRhcCwgQV9UUF9QQVJBX1JFRzMsIDAsIEZfVFhQQUNFRklYRUQpOworCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfVFhfTU9EX1FVRVVFX1dFSUdIVDEsIDB4MTIxMjEyMTIpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1RYX01PRF9RVUVVRV9XRUlHSFQwLCAweDEyMTIxMjEyKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9NT0RfQ0hBTk5FTF9XRUlHSFQsIDB4MTIxMik7Cit9CisKKy8qIERlc2lyZWQgVFAgdGltZXIgcmVzb2x1dGlvbiBpbiB1c2VjICovCisjZGVmaW5lIFRQX1RNUl9SRVMgNTAKKworLyogVENQIHRpbWVyIHZhbHVlcyBpbiBtcyAqLworI2RlZmluZSBUUF9EQUNLX1RJTUVSIDUwCisjZGVmaW5lIFRQX1JUT19NSU4gICAgMjUwCisKKy8qKgorICoJdHBfc2V0X3RpbWVycyAtIHNldCBUUCB0aW1pbmcgcGFyYW1ldGVycworICoJQGFkYXA6IHRoZSBhZGFwdGVyIHRvIHNldAorICoJQGNvcmVfY2xrOiB0aGUgY29yZSBjbG9jayBmcmVxdWVuY3kgaW4gSHoKKyAqCisgKglTZXQgVFAncyB0aW1pbmcgcGFyYW1ldGVycywgc3VjaCBhcyB0aGUgdmFyaW91cyB0aW1lciByZXNvbHV0aW9ucyBhbmQKKyAqCXRoZSBUQ1AgdGltZXIgdmFsdWVzLgorICovCitzdGF0aWMgdm9pZCB0cF9zZXRfdGltZXJzKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgY29yZV9jbGspCit7CisJdW5zaWduZWQgaW50IHRyZSA9IGZscyhjb3JlX2NsayAvICgxMDAwMDAwIC8gVFBfVE1SX1JFUykpIC0gMTsKKwl1bnNpZ25lZCBpbnQgZGFja19yZSA9IGZscyhjb3JlX2NsayAvIDUwMDApIC0gMTsJLyogMjAwdXMgKi8KKwl1bnNpZ25lZCBpbnQgdHN0YW1wX3JlID0gZmxzKGNvcmVfY2xrIC8gMTAwMCk7CS8qIDFtcywgYXQgbGVhc3QgKi8KKwl1bnNpZ25lZCBpbnQgdHBzID0gY29yZV9jbGsgPj4gdHJlOworCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfVElNRVJfUkVTT0xVVElPTiwgVl9USU1FUlJFU09MVVRJT04odHJlKSB8CisJCSAgICAgVl9ERUxBWUVEQUNLUkVTT0xVVElPTihkYWNrX3JlKSB8CisJCSAgICAgVl9USU1FU1RBTVBSRVNPTFVUSU9OKHRzdGFtcF9yZSkpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX0RBQ0tfVElNRVIsCisJCSAgICAgKGNvcmVfY2xrID4+IGRhY2tfcmUpIC8gKDEwMDAgLyBUUF9EQUNLX1RJTUVSKSk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfVENQX0JBQ0tPRkZfUkVHMCwgMHgzMDIwMTAwKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9UQ1BfQkFDS09GRl9SRUcxLCAweDcwNjA1MDQpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1RDUF9CQUNLT0ZGX1JFRzIsIDB4YjBhMDkwOCk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfVENQX0JBQ0tPRkZfUkVHMywgMHhmMGUwZDBjKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9TSElGVF9DTlQsIFZfU1lOU0hJRlRNQVgoNikgfAorCQkgICAgIFZfUlhUU0hJRlRNQVhSMSg0KSB8IFZfUlhUU0hJRlRNQVhSMigxNSkgfAorCQkgICAgIFZfUEVSU0hJRlRCQUNLT0ZGTUFYKDgpIHwgVl9QRVJTSElGVE1BWCg4KSB8CisJCSAgICAgVl9LRUVQQUxJVkVNQVgoOSkpOworCisjZGVmaW5lIFNFQ09ORFMgKiB0cHMKKworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX01TTCwgYWRhcC0+cGFyYW1zLnJldiA+IDAgPyAwIDogMiBTRUNPTkRTKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9SWFRfTUlOLCB0cHMgLyAoMTAwMCAvIFRQX1JUT19NSU4pKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9SWFRfTUFYLCA2NCBTRUNPTkRTKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9QRVJTX01JTiwgNSBTRUNPTkRTKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9QRVJTX01BWCwgNjQgU0VDT05EUyk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfS0VFUF9JRExFLCA3MjAwIFNFQ09ORFMpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX0tFRVBfSU5UVkwsIDc1IFNFQ09ORFMpOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX0lOSVRfU1JUVCwgMyBTRUNPTkRTKTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9GSU5XQUlUMl9USU1FUiwgNjAwIFNFQ09ORFMpOworCisjdW5kZWYgU0VDT05EUworfQorCisvKioKKyAqCXQzX3RwX3NldF9jb2FsZXNjaW5nX3NpemUgLSBzZXQgcmVjZWl2ZSBjb2FsZXNjaW5nIHNpemUKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQHNpemU6IHRoZSByZWNlaXZlIGNvYWxlc2Npbmcgc2l6ZQorICoJQHBzaDogd2hldGhlciBhIHNldCBQU0ggYml0IHNob3VsZCBkZWxpdmVyIGNvYWxlc2NlZCBkYXRhCisgKgorICoJU2V0IHRoZSByZWNlaXZlIGNvYWxlc2Npbmcgc2l6ZSBhbmQgUFNIIGJpdCBoYW5kbGluZy4KKyAqLworaW50IHQzX3RwX3NldF9jb2FsZXNjaW5nX3NpemUoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBzaXplLCBpbnQgcHNoKQoreworCXUzMiB2YWw7CisKKwlpZiAoc2l6ZSA+IE1BWF9SWF9DT0FMRVNDSU5HX0xFTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWwgPSB0M19yZWFkX3JlZyhhZGFwLCBBX1RQX1BBUkFfUkVHMyk7CisJdmFsICY9IH4oRl9SWENPQUxFU0NFRU5BQkxFIHwgRl9SWENPQUxFU0NFUFNIRU4pOworCisJaWYgKHNpemUpIHsKKwkJdmFsIHw9IEZfUlhDT0FMRVNDRUVOQUJMRTsKKwkJaWYgKHBzaCkKKwkJCXZhbCB8PSBGX1JYQ09BTEVTQ0VQU0hFTjsKKwkJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfUEFSQV9SRUcyLCBWX1JYQ09BTEVTQ0VTSVpFKHNpemUpIHwKKwkJCSAgICAgVl9NQVhSWERBVEEoTUFYX1JYX0NPQUxFU0NJTkdfTEVOKSk7CisJfQorCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1BBUkFfUkVHMywgdmFsKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl0M190cF9zZXRfbWF4X3J4c2l6ZSAtIHNldCB0aGUgbWF4IHJlY2VpdmUgc2l6ZQorICoJQGFkYXA6IHRoZSBhZGFwdGVyCisgKglAc2l6ZTogdGhlIG1heCByZWNlaXZlIHNpemUKKyAqCisgKglTZXQgVFAncyBtYXggcmVjZWl2ZSBzaXplLiAgVGhpcyBpcyB0aGUgbGltaXQgdGhhdCBhcHBsaWVzIHdoZW4KKyAqCXJlY2VpdmUgY29hbGVzY2luZyBpcyBkaXNhYmxlZC4KKyAqLwordm9pZCB0M190cF9zZXRfbWF4X3J4c2l6ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfUEFSQV9SRUc3LAorCQkgICAgIFZfUE1NQVhYRkVSTEVOMChzaXplKSB8IFZfUE1NQVhYRkVSTEVOMShzaXplKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X210dXModW5zaWduZWQgc2hvcnQgbXR1c1tdKQoreworCS8qCisJICogU2VlIGRyYWZ0LW1hdGhpcy1wbHBtdHVkLTAwLnR4dCBmb3IgdGhlIHZhbHVlcy4gIFRoZSBtaW4gaXMgODggc28KKwkgKiBpdCBjYW4gYWNjb21vZGF0ZSBtYXggc2l6ZSBUQ1AvSVAgaGVhZGVycyB3aGVuIFNBQ0sgYW5kIHRpbWVzdGFtcHMKKwkgKiBhcmUgZW5hYmxlZCBhbmQgc3RpbGwgaGF2ZSBhdCBsZWFzdCA4IGJ5dGVzIG9mIHBheWxvYWQuCisJICovCisJbXR1c1swXSA9IDg4OworCW10dXNbMV0gPSAyNTY7CisJbXR1c1syXSA9IDUxMjsKKwltdHVzWzNdID0gNTc2OworCW10dXNbNF0gPSA4MDg7CisJbXR1c1s1XSA9IDEwMjQ7CisJbXR1c1s2XSA9IDEyODA7CisJbXR1c1s3XSA9IDE0OTI7CisJbXR1c1s4XSA9IDE1MDA7CisJbXR1c1s5XSA9IDIwMDI7CisJbXR1c1sxMF0gPSAyMDQ4OworCW10dXNbMTFdID0gNDA5NjsKKwltdHVzWzEyXSA9IDQzNTI7CisJbXR1c1sxM10gPSA4MTkyOworCW10dXNbMTRdID0gOTAwMDsKKwltdHVzWzE1XSA9IDk2MDA7Cit9CisKKy8qCisgKiBJbml0aWFsIGNvbmdlc3Rpb24gY29udHJvbCBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9jb25nX2N0cmwodW5zaWduZWQgc2hvcnQgKmEsIHVuc2lnbmVkIHNob3J0ICpiKQoreworCWFbMF0gPSBhWzFdID0gYVsyXSA9IGFbM10gPSBhWzRdID0gYVs1XSA9IGFbNl0gPSBhWzddID0gYVs4XSA9IDE7CisJYVs5XSA9IDI7CisJYVsxMF0gPSAzOworCWFbMTFdID0gNDsKKwlhWzEyXSA9IDU7CisJYVsxM10gPSA2OworCWFbMTRdID0gNzsKKwlhWzE1XSA9IDg7CisJYVsxNl0gPSA5OworCWFbMTddID0gMTA7CisJYVsxOF0gPSAxNDsKKwlhWzE5XSA9IDE3OworCWFbMjBdID0gMjE7CisJYVsyMV0gPSAyNTsKKwlhWzIyXSA9IDMwOworCWFbMjNdID0gMzU7CisJYVsyNF0gPSA0NTsKKwlhWzI1XSA9IDYwOworCWFbMjZdID0gODA7CisJYVsyN10gPSAxMDA7CisJYVsyOF0gPSAyMDA7CisJYVsyOV0gPSAzMDA7CisJYVszMF0gPSA0MDA7CisJYVszMV0gPSA1MDA7CisKKwliWzBdID0gYlsxXSA9IGJbMl0gPSBiWzNdID0gYls0XSA9IGJbNV0gPSBiWzZdID0gYls3XSA9IGJbOF0gPSAwOworCWJbOV0gPSBiWzEwXSA9IDE7CisJYlsxMV0gPSBiWzEyXSA9IDI7CisJYlsxM10gPSBiWzE0XSA9IGJbMTVdID0gYlsxNl0gPSAzOworCWJbMTddID0gYlsxOF0gPSBiWzE5XSA9IGJbMjBdID0gYlsyMV0gPSA0OworCWJbMjJdID0gYlsyM10gPSBiWzI0XSA9IGJbMjVdID0gYlsyNl0gPSBiWzI3XSA9IDU7CisJYlsyOF0gPSBiWzI5XSA9IDY7CisJYlszMF0gPSBiWzMxXSA9IDc7Cit9CisKKy8qIFRoZSBtaW5pbXVtIGFkZGl0aXZlIGluY3JlbWVudCB2YWx1ZSBmb3IgdGhlIGNvbmdlc3Rpb24gY29udHJvbCB0YWJsZSAqLworI2RlZmluZSBDQ19NSU5fSU5DUiAyVQorCisvKioKKyAqCXQzX2xvYWRfbXR1cyAtIHdyaXRlIHRoZSBNVFUgYW5kIGNvbmdlc3Rpb24gY29udHJvbCBIVyB0YWJsZXMKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQG10dXM6IHRoZSB1bnJlc3RyaWN0ZWQgdmFsdWVzIGZvciB0aGUgTVRVIHRhYmxlCisgKglAYWxwaHM6IHRoZSB2YWx1ZXMgZm9yIHRoZSBjb25nZXN0aW9uIGNvbnRyb2wgYWxwaGEgcGFyYW1ldGVyCisgKglAYmV0YTogdGhlIHZhbHVlcyBmb3IgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBiZXRhIHBhcmFtZXRlcgorICoJQG10dV9jYXA6IHRoZSBtYXhpbXVtIHBlcm1pdHRlZCBlZmZlY3RpdmUgTVRVCisgKgorICoJV3JpdGUgdGhlIE1UVSB0YWJsZSB3aXRoIHRoZSBzdXBwbGllZCBNVFVzIGNhcHBpbmcgZWFjaCBhdCAmbXR1X2NhcC4KKyAqCVVwZGF0ZSB0aGUgaGlnaC1zcGVlZCBjb25nZXN0aW9uIGNvbnRyb2wgdGFibGUgd2l0aCB0aGUgc3VwcGxpZWQgYWxwaGEsCisgKiAJYmV0YSwgYW5kIE1UVXMuCisgKi8KK3ZvaWQgdDNfbG9hZF9tdHVzKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBzaG9ydCBtdHVzW05NVFVTXSwKKwkJICB1bnNpZ25lZCBzaG9ydCBhbHBoYVtOQ0NUUkxfV0lOXSwKKwkJICB1bnNpZ25lZCBzaG9ydCBiZXRhW05DQ1RSTF9XSU5dLCB1bnNpZ25lZCBzaG9ydCBtdHVfY2FwKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZnX3BrdHNbTkNDVFJMX1dJTl0gPSB7CisJCTIsIDYsIDEwLCAxNCwgMjAsIDI4LCA0MCwgNTYsIDgwLCAxMTIsIDE2MCwgMjI0LCAzMjAsIDQ0OCwgNjQwLAorCQk4OTYsIDEyODEsIDE3OTIsIDI1NjAsIDM1ODQsIDUxMjAsIDcxNjgsIDEwMjQwLCAxNDMzNiwgMjA0ODAsCisJCTI4NjcyLCA0MDk2MCwgNTczNDQsIDgxOTIwLCAxMTQ2ODgsIDE2Mzg0MCwgMjI5Mzc2CisJfTsKKworCXVuc2lnbmVkIGludCBpLCB3OworCisJZm9yIChpID0gMDsgaSA8IE5NVFVTOyArK2kpIHsKKwkJdW5zaWduZWQgaW50IG10dSA9IG1pbihtdHVzW2ldLCBtdHVfY2FwKTsKKwkJdW5zaWduZWQgaW50IGxvZzIgPSBmbHMobXR1KTsKKworCQlpZiAoIShtdHUgJiAoKDEgPDwgbG9nMikgPj4gMikpKQkvKiByb3VuZCAqLworCQkJbG9nMi0tOworCQl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9NVFVfVEFCTEUsCisJCQkgICAgIChpIDw8IDI0KSB8IChsb2cyIDw8IDE2KSB8IG10dSk7CisKKwkJZm9yICh3ID0gMDsgdyA8IE5DQ1RSTF9XSU47ICsrdykgeworCQkJdW5zaWduZWQgaW50IGluYzsKKworCQkJaW5jID0gbWF4KCgobXR1IC0gNDApICogYWxwaGFbd10pIC8gYXZnX3BrdHNbd10sCisJCQkJICBDQ19NSU5fSU5DUik7CisKKwkJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX0NDVFJMX1RBQkxFLCAoaSA8PCAyMSkgfAorCQkJCSAgICAgKHcgPDwgMTYpIHwgKGJldGFbd10gPDwgMTMpIHwgaW5jKTsKKwkJfQorCX0KK30KKworLyoqCisgKgl0M19yZWFkX2h3X210dXMgLSByZXR1cm5zIHRoZSB2YWx1ZXMgaW4gdGhlIEhXIE1UVSB0YWJsZQorICoJQGFkYXA6IHRoZSBhZGFwdGVyCisgKglAbXR1czogd2hlcmUgdG8gc3RvcmUgdGhlIEhXIE1UVSB2YWx1ZXMKKyAqCisgKglSZWFkcyB0aGUgSFcgTVRVIHRhYmxlLgorICovCit2b2lkIHQzX3JlYWRfaHdfbXR1cyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgc2hvcnQgbXR1c1tOTVRVU10pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTk1UVVM7ICsraSkgeworCQl1bnNpZ25lZCBpbnQgdmFsOworCisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX01UVV9UQUJMRSwgMHhmZjAwMDAwMCB8IGkpOworCQl2YWwgPSB0M19yZWFkX3JlZyhhZGFwLCBBX1RQX01UVV9UQUJMRSk7CisJCW10dXNbaV0gPSB2YWwgJiAweDNmZmY7CisJfQorfQorCisvKioKKyAqCXQzX2dldF9jb25nX2NudGxfdGFiIC0gcmVhZHMgdGhlIGNvbmdlc3Rpb24gY29udHJvbCB0YWJsZQorICoJQGFkYXA6IHRoZSBhZGFwdGVyCisgKglAaW5jcjogd2hlcmUgdG8gc3RvcmUgdGhlIGFscGhhIHZhbHVlcworICoKKyAqCVJlYWRzIHRoZSBhZGRpdGl2ZSBpbmNyZW1lbnRzIHByb2dyYW1tZWQgaW50byB0aGUgSFcgY29uZ2VzdGlvbgorICoJY29udHJvbCB0YWJsZS4KKyAqLwordm9pZCB0M19nZXRfY29uZ19jbnRsX3RhYihzdHJ1Y3QgYWRhcHRlciAqYWRhcCwKKwkJCSAgdW5zaWduZWQgc2hvcnQgaW5jcltOTVRVU11bTkNDVFJMX1dJTl0pCit7CisJdW5zaWduZWQgaW50IG10dSwgdzsKKworCWZvciAobXR1ID0gMDsgbXR1IDwgTk1UVVM7ICsrbXR1KQorCQlmb3IgKHcgPSAwOyB3IDwgTkNDVFJMX1dJTjsgKyt3KSB7CisJCQl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9DQ1RSTF9UQUJMRSwKKwkJCQkgICAgIDB4ZmZmZjAwMDAgfCAobXR1IDw8IDUpIHwgdyk7CisJCQlpbmNyW210dV1bd10gPSB0M19yZWFkX3JlZyhhZGFwLCBBX1RQX0NDVFJMX1RBQkxFKSAmCisJCQkJICAgICAgIDB4MWZmZjsKKwkJfQorfQorCisvKioKKyAqCXQzX3RwX2dldF9taWJfc3RhdHMgLSByZWFkIFRQJ3MgTUlCIGNvdW50ZXJzCisgKglAYWRhcDogdGhlIGFkYXB0ZXIKKyAqCUB0cHM6IGhvbGRzIHRoZSByZXR1cm5lZCBjb3VudGVyIHZhbHVlcworICoKKyAqCVJldHVybnMgdGhlIHZhbHVlcyBvZiBUUCdzIE1JQiBjb3VudGVycy4KKyAqLwordm9pZCB0M190cF9nZXRfbWliX3N0YXRzKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3QgdHBfbWliX3N0YXRzICp0cHMpCit7CisJdDNfcmVhZF9pbmRpcmVjdChhZGFwLCBBX1RQX01JQl9JTkRFWCwgQV9UUF9NSUJfUkRBVEEsICh1MzIgKikgdHBzLAorCQkJIHNpemVvZigqdHBzKSAvIHNpemVvZih1MzIpLCAwKTsKK30KKworI2RlZmluZSB1bHBfcmVnaW9uKGFkYXAsIG5hbWUsIHN0YXJ0LCBsZW4pIFwKKwl0M193cml0ZV9yZWcoKGFkYXApLCBBX1VMUFJYXyAjIyBuYW1lICMjIF9MTElNSVQsIChzdGFydCkpOyBcCisJdDNfd3JpdGVfcmVnKChhZGFwKSwgQV9VTFBSWF8gIyMgbmFtZSAjIyBfVUxJTUlULCBcCisJCSAgICAgKHN0YXJ0KSArIChsZW4pIC0gMSk7IFwKKwlzdGFydCArPSBsZW4KKworI2RlZmluZSB1bHB0eF9yZWdpb24oYWRhcCwgbmFtZSwgc3RhcnQsIGxlbikgXAorCXQzX3dyaXRlX3JlZygoYWRhcCksIEFfVUxQVFhfICMjIG5hbWUgIyMgX0xMSU1JVCwgKHN0YXJ0KSk7IFwKKwl0M193cml0ZV9yZWcoKGFkYXApLCBBX1VMUFRYXyAjIyBuYW1lICMjIF9VTElNSVQsIFwKKwkJICAgICAoc3RhcnQpICsgKGxlbikgLSAxKQorCitzdGF0aWMgdm9pZCB1bHBfY29uZmlnKHN0cnVjdCBhZGFwdGVyICphZGFwLCBjb25zdCBzdHJ1Y3QgdHBfcGFyYW1zICpwKQoreworCXVuc2lnbmVkIGludCBtID0gcC0+Y2hhbl9yeF9zaXplOworCisJdWxwX3JlZ2lvbihhZGFwLCBJU0NTSSwgbSwgcC0+Y2hhbl9yeF9zaXplIC8gOCk7CisJdWxwX3JlZ2lvbihhZGFwLCBURERQLCBtLCBwLT5jaGFuX3J4X3NpemUgLyA4KTsKKwl1bHB0eF9yZWdpb24oYWRhcCwgVFBULCBtLCBwLT5jaGFuX3J4X3NpemUgLyA0KTsKKwl1bHBfcmVnaW9uKGFkYXAsIFNUQUcsIG0sIHAtPmNoYW5fcnhfc2l6ZSAvIDQpOworCXVscF9yZWdpb24oYWRhcCwgUlEsIG0sIHAtPmNoYW5fcnhfc2l6ZSAvIDQpOworCXVscHR4X3JlZ2lvbihhZGFwLCBQQkwsIG0sIHAtPmNoYW5fcnhfc2l6ZSAvIDQpOworCXVscF9yZWdpb24oYWRhcCwgUEJMLCBtLCBwLT5jaGFuX3J4X3NpemUgLyA0KTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9VTFBSWF9URERQX1RBR01BU0ssIDB4ZmZmZmZmZmYpOworfQorCit2b2lkIHQzX2NvbmZpZ190cmFjZV9maWx0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgY29uc3Qgc3RydWN0IHRyYWNlX3BhcmFtcyAqdHAsIGludCBmaWx0ZXJfaW5kZXgsCisJCQkgICAgaW50IGludmVydCwgaW50IGVuYWJsZSkKK3sKKwl1MzIgYWRkciwga2V5WzRdLCBtYXNrWzRdOworCisJa2V5WzBdID0gdHAtPnNwb3J0IHwgKHRwLT5zaXAgPDwgMTYpOworCWtleVsxXSA9ICh0cC0+c2lwID4+IDE2KSB8ICh0cC0+ZHBvcnQgPDwgMTYpOworCWtleVsyXSA9IHRwLT5kaXA7CisJa2V5WzNdID0gdHAtPnByb3RvIHwgKHRwLT52bGFuIDw8IDgpIHwgKHRwLT5pbnRmIDw8IDIwKTsKKworCW1hc2tbMF0gPSB0cC0+c3BvcnRfbWFzayB8ICh0cC0+c2lwX21hc2sgPDwgMTYpOworCW1hc2tbMV0gPSAodHAtPnNpcF9tYXNrID4+IDE2KSB8ICh0cC0+ZHBvcnRfbWFzayA8PCAxNik7CisJbWFza1syXSA9IHRwLT5kaXBfbWFzazsKKwltYXNrWzNdID0gdHAtPnByb3RvX21hc2sgfCAodHAtPnZsYW5fbWFzayA8PCA4KSB8ICh0cC0+aW50Zl9tYXNrIDw8IDIwKTsKKworCWlmIChpbnZlcnQpCisJCWtleVszXSB8PSAoMSA8PCAyOSk7CisJaWYgKGVuYWJsZSkKKwkJa2V5WzNdIHw9ICgxIDw8IDI4KTsKKworCWFkZHIgPSBmaWx0ZXJfaW5kZXggPyBBX1RQX1JYX1RSQ19LRVkwIDogQV9UUF9UWF9UUkNfS0VZMDsKKwl0cF93cl9pbmRpcmVjdChhZGFwdGVyLCBhZGRyKyssIGtleVswXSk7CisJdHBfd3JfaW5kaXJlY3QoYWRhcHRlciwgYWRkcisrLCBtYXNrWzBdKTsKKwl0cF93cl9pbmRpcmVjdChhZGFwdGVyLCBhZGRyKyssIGtleVsxXSk7CisJdHBfd3JfaW5kaXJlY3QoYWRhcHRlciwgYWRkcisrLCBtYXNrWzFdKTsKKwl0cF93cl9pbmRpcmVjdChhZGFwdGVyLCBhZGRyKyssIGtleVsyXSk7CisJdHBfd3JfaW5kaXJlY3QoYWRhcHRlciwgYWRkcisrLCBtYXNrWzJdKTsKKwl0cF93cl9pbmRpcmVjdChhZGFwdGVyLCBhZGRyKyssIGtleVszXSk7CisJdHBfd3JfaW5kaXJlY3QoYWRhcHRlciwgYWRkciwgbWFza1szXSk7CisJdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9UUF9QSU9fREFUQSk7Cit9CisKKy8qKgorICoJdDNfY29uZmlnX3NjaGVkIC0gY29uZmlndXJlIGEgSFcgdHJhZmZpYyBzY2hlZHVsZXIKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQGticHM6IHRhcmdldCByYXRlIGluIEticHMKKyAqCUBzY2hlZDogdGhlIHNjaGVkdWxlciBpbmRleAorICoKKyAqCUNvbmZpZ3VyZSBhIEhXIHNjaGVkdWxlciBmb3IgdGhlIHRhcmdldCByYXRlCisgKi8KK2ludCB0M19jb25maWdfc2NoZWQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBrYnBzLCBpbnQgc2NoZWQpCit7CisJdW5zaWduZWQgaW50IHYsIHRwcywgY3B0LCBicHQsIGRlbHRhLCBtaW5kZWx0YSA9IH4wOworCXVuc2lnbmVkIGludCBjbGsgPSBhZGFwLT5wYXJhbXMudnBkLmNjbGsgKiAxMDAwOworCXVuc2lnbmVkIGludCBzZWxlY3RlZF9jcHQgPSAwLCBzZWxlY3RlZF9icHQgPSAwOworCisJaWYgKGticHMgPiAwKSB7CisJCWticHMgKj0gMTI1OwkvKiAtPiBieXRlcyAqLworCQlmb3IgKGNwdCA9IDE7IGNwdCA8PSAyNTU7IGNwdCsrKSB7CisJCQl0cHMgPSBjbGsgLyBjcHQ7CisJCQlicHQgPSAoa2JwcyArIHRwcyAvIDIpIC8gdHBzOworCQkJaWYgKGJwdCA+IDAgJiYgYnB0IDw9IDI1NSkgeworCQkJCXYgPSBicHQgKiB0cHM7CisJCQkJZGVsdGEgPSB2ID49IGticHMgPyB2IC0ga2JwcyA6IGticHMgLSB2OworCQkJCWlmIChkZWx0YSA8PSBtaW5kZWx0YSkgeworCQkJCQltaW5kZWx0YSA9IGRlbHRhOworCQkJCQlzZWxlY3RlZF9jcHQgPSBjcHQ7CisJCQkJCXNlbGVjdGVkX2JwdCA9IGJwdDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHNlbGVjdGVkX2NwdCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIXNlbGVjdGVkX2NwdCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9UTV9QSU9fQUREUiwKKwkJICAgICBBX1RQX1RYX01PRF9RMV9RMF9SQVRFX0xJTUlUIC0gc2NoZWQgLyAyKTsKKwl2ID0gdDNfcmVhZF9yZWcoYWRhcCwgQV9UUF9UTV9QSU9fREFUQSk7CisJaWYgKHNjaGVkICYgMSkKKwkJdiA9ICh2ICYgMHhmZmZmKSB8IChzZWxlY3RlZF9jcHQgPDwgMTYpIHwgKHNlbGVjdGVkX2JwdCA8PCAyNCk7CisJZWxzZQorCQl2ID0gKHYgJiAweGZmZmYwMDAwKSB8IHNlbGVjdGVkX2NwdCB8IChzZWxlY3RlZF9icHQgPDwgOCk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfVE1fUElPX0RBVEEsIHYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRwX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGNvbnN0IHN0cnVjdCB0cF9wYXJhbXMgKnApCit7CisJaW50IGJ1c3kgPSAwOworCisJdHBfY29uZmlnKGFkYXAsIHApOworCXQzX3NldF92bGFuX2FjY2VsKGFkYXAsIDMsIDApOworCisJaWYgKGlzX29mZmxvYWQoYWRhcCkpIHsKKwkJdHBfc2V0X3RpbWVycyhhZGFwLCBhZGFwLT5wYXJhbXMudnBkLmNjbGsgKiAxMDAwKTsKKwkJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfUkVTRVQsIEZfRkxTVElOSVRFTkFCTEUpOworCQlidXN5ID0gdDNfd2FpdF9vcF9kb25lKGFkYXAsIEFfVFBfUkVTRVQsIEZfRkxTVElOSVRFTkFCTEUsCisJCQkJICAgICAgIDAsIDEwMDAsIDUpOworCQlpZiAoYnVzeSkKKwkJCUNIX0VSUihhZGFwLCAiVFAgaW5pdGlhbGl6YXRpb24gdGltZWQgb3V0XG4iKTsKKwl9CisKKwlpZiAoIWJ1c3kpCisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1JFU0VULCBGX1RQUkVTRVQpOworCXJldHVybiBidXN5OworfQorCitpbnQgdDNfbXBzX3NldF9hY3RpdmVfcG9ydHMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBwb3J0X21hc2spCit7CisJaWYgKHBvcnRfbWFzayAmIH4oKDEgPDwgYWRhcC0+cGFyYW1zLm5wb3J0cykgLSAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdDNfc2V0X3JlZ19maWVsZChhZGFwLCBBX01QU19DRkcsIEZfUE9SVDFBQ1RJVkUgfCBGX1BPUlQwQUNUSVZFLAorCQkJIHBvcnRfbWFzayA8PCBTX1BPUlQwQUNUSVZFKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gdGhlIGJpdHMgb2YgSFcgaW5pdGlhbGl6YXRpb24gdGhhdCBhcmUgZGVwZW5kZW50IG9uIHRoZSBudW1iZXIKKyAqIG9mIGF2YWlsYWJsZSBwb3J0cy4KKyAqLworc3RhdGljIHZvaWQgaW5pdF9od19mb3JfYXZhaWxfcG9ydHMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGludCBucG9ydHMpCit7CisJaW50IGk7CisKKwlpZiAobnBvcnRzID09IDEpIHsKKwkJdDNfc2V0X3JlZ19maWVsZChhZGFwLCBBX1VMUFJYX0NUTCwgRl9ST1VORF9ST0JJTiwgMCk7CisJCXQzX3NldF9yZWdfZmllbGQoYWRhcCwgQV9VTFBUWF9DT05GSUcsIEZfQ0ZHX1JSX0FSQiwgMCk7CisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01QU19DRkcsIEZfVFBSWFBPUlRFTiB8IEZfVFBUWFBPUlQwRU4gfAorCQkJICAgICBGX1BPUlQwQUNUSVZFIHwgRl9FTkZPUkNFUEtUKTsKKwkJdDNfd3JpdGVfcmVnKGFkYXAsIEFfUE0xX1RYX0NGRywgMHhjMDAwYzAwMCk7CisJfSBlbHNlIHsKKwkJdDNfc2V0X3JlZ19maWVsZChhZGFwLCBBX1VMUFJYX0NUTCwgMCwgRl9ST1VORF9ST0JJTik7CisJCXQzX3NldF9yZWdfZmllbGQoYWRhcCwgQV9VTFBUWF9DT05GSUcsIDAsIEZfQ0ZHX1JSX0FSQik7CisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1VMUFRYX0RNQV9XRUlHSFQsCisJCQkgICAgIFZfRDFfV0VJR0hUKDE2KSB8IFZfRDBfV0VJR0hUKDE2KSk7CisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX01QU19DRkcsIEZfVFBUWFBPUlQwRU4gfCBGX1RQVFhQT1JUMUVOIHwKKwkJCSAgICAgRl9UUFJYUE9SVEVOIHwgRl9QT1JUMEFDVElWRSB8IEZfUE9SVDFBQ1RJVkUgfAorCQkJICAgICBGX0VORk9SQ0VQS1QpOworCQl0M193cml0ZV9yZWcoYWRhcCwgQV9QTTFfVFhfQ0ZHLCAweDgwMDA4MDAwKTsKKwkJdDNfc2V0X3JlZ19maWVsZChhZGFwLCBBX1RQX1BDX0NPTkZJRywgMCwgRl9UWFRPU1FVRVVFTUFQTU9ERSk7CisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1RYX01PRF9RVUVVRV9SRVFfTUFQLAorCQkJICAgICBWX1RYX01PRF9RVUVVRV9SRVFfTUFQKDB4YWEpKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9UWF9NT0RfUVVFX1RBQkxFLAorCQkJCSAgICAgKGkgPDwgMTYpIHwgMHgxMDEwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2FsaWJyYXRlX3hnbShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAodXNlc194YXVpKGFkYXB0ZXIpKSB7CisJCXVuc2lnbmVkIGludCB2LCBpOworCisJCWZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKKwkJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1hHTV9YQVVJX0lNUCwgMCk7CisJCQl0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1hHTV9YQVVJX0lNUCk7CisJCQltc2xlZXAoMSk7CisJCQl2ID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9YR01fWEFVSV9JTVApOworCQkJaWYgKCEodiAmIChGX1hHTV9DQUxGQVVMVCB8IEZfQ0FMQlVTWSkpKSB7CisJCQkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfWEdNX1hBVUlfSU1QLAorCQkJCQkgICAgIFZfWEFVSUlNUChHX0NBTElNUCh2KSA+PiAyKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJQ0hfRVJSKGFkYXB0ZXIsICJNQUMgY2FsaWJyYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1hHTV9SR01JSV9JTVAsCisJCQkgICAgIFZfUkdNSUlJTVBQRCgyKSB8IFZfUkdNSUlJTVBQVSgzKSk7CisJCXQzX3NldF9yZWdfZmllbGQoYWRhcHRlciwgQV9YR01fUkdNSUlfSU1QLCBGX1hHTV9JTVBTRVRVUERBVEUsCisJCQkJIEZfWEdNX0lNUFNFVFVQREFURSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjYWxpYnJhdGVfeGdtX3QzYihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIXVzZXNfeGF1aShhZGFwdGVyKSkgeworCQl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9YR01fUkdNSUlfSU1QLCBGX0NBTFJFU0VUIHwKKwkJCSAgICAgRl9DQUxVUERBVEUgfCBWX1JHTUlJSU1QUEQoMikgfCBWX1JHTUlJSU1QUFUoMykpOworCQl0M19zZXRfcmVnX2ZpZWxkKGFkYXB0ZXIsIEFfWEdNX1JHTUlJX0lNUCwgRl9DQUxSRVNFVCwgMCk7CisJCXQzX3NldF9yZWdfZmllbGQoYWRhcHRlciwgQV9YR01fUkdNSUlfSU1QLCAwLAorCQkJCSBGX1hHTV9JTVBTRVRVUERBVEUpOworCQl0M19zZXRfcmVnX2ZpZWxkKGFkYXB0ZXIsIEFfWEdNX1JHTUlJX0lNUCwgRl9YR01fSU1QU0VUVVBEQVRFLAorCQkJCSAwKTsKKwkJdDNfc2V0X3JlZ19maWVsZChhZGFwdGVyLCBBX1hHTV9SR01JSV9JTVAsIEZfQ0FMVVBEQVRFLCAwKTsKKwkJdDNfc2V0X3JlZ19maWVsZChhZGFwdGVyLCBBX1hHTV9SR01JSV9JTVAsIDAsIEZfQ0FMVVBEQVRFKTsKKwl9Cit9CisKK3N0cnVjdCBtYzdfdGltaW5nX3BhcmFtcyB7CisJdW5zaWduZWQgY2hhciBBY3RUb1ByZURseTsKKwl1bnNpZ25lZCBjaGFyIEFjdFRvUmRXckRseTsKKwl1bnNpZ25lZCBjaGFyIFByZUN5YzsKKwl1bnNpZ25lZCBjaGFyIFJlZkN5Y1s1XTsKKwl1bnNpZ25lZCBjaGFyIEJrQ3ljOworCXVuc2lnbmVkIGNoYXIgV3JUb1JkRGx5OworCXVuc2lnbmVkIGNoYXIgUmRUb1dyRGx5OworfTsKKworLyoKKyAqIFdyaXRlIGEgdmFsdWUgdG8gYSByZWdpc3RlciBhbmQgY2hlY2sgdGhhdCB0aGUgd3JpdGUgY29tcGxldGVkLiAgVGhlc2UKKyAqIHdyaXRlcyBub3JtYWxseSBjb21wbGV0ZSBpbiBhIGN5Y2xlIG9yIHR3bywgc28gb25lIHJlYWQgc2hvdWxkIHN1ZmZpY2UuCisgKiBUaGUgdmVyeSBmaXJzdCByZWFkIGV4aXN0cyB0byBmbHVzaCB0aGUgcG9zdGVkIHdyaXRlIHRvIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgd3JyZWdfd2FpdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGFkZHIsIHUzMiB2YWwpCit7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIGFkZHIsIHZhbCk7CisJdDNfcmVhZF9yZWcoYWRhcHRlciwgYWRkcik7CS8qIGZsdXNoICovCisJaWYgKCEodDNfcmVhZF9yZWcoYWRhcHRlciwgYWRkcikgJiBGX0JVU1kpKQorCQlyZXR1cm4gMDsKKwlDSF9FUlIoYWRhcHRlciwgIndyaXRlIHRvIE1DNyByZWdpc3RlciAweCV4IHRpbWVkIG91dFxuIiwgYWRkcik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgbWM3X2luaXQoc3RydWN0IG1jNyAqbWM3LCB1bnNpZ25lZCBpbnQgbWM3X2Nsb2NrLCBpbnQgbWVtX3R5cGUpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtYzdfbW9kZVtdID0geworCQkweDYzMiwgMHg2NDIsIDB4NjUyLCAweDQzMiwgMHg0NDIKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWM3X3RpbWluZ19wYXJhbXMgbWM3X3RpbWluZ3NbXSA9IHsKKwkJezEyLCAzLCA0LCB7MjAsIDI4LCAzNCwgNTIsIDB9LCAxNSwgNiwgNH0sCisJCXsxMiwgNCwgNSwgezIwLCAyOCwgMzQsIDUyLCAwfSwgMTYsIDcsIDR9LAorCQl7MTIsIDUsIDYsIHsyMCwgMjgsIDM0LCA1MiwgMH0sIDE3LCA4LCA0fSwKKwkJezksIDMsIDQsIHsxNSwgMjEsIDI2LCAzOSwgMH0sIDEyLCA2LCA0fSwKKwkJezksIDQsIDUsIHsxNSwgMjEsIDI2LCAzOSwgMH0sIDEzLCA3LCA0fQorCX07CisKKwl1MzIgdmFsOworCXVuc2lnbmVkIGludCB3aWR0aCwgZGVuc2l0eSwgc2xvdywgYXR0ZW1wdHM7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBtYzctPmFkYXB0ZXI7CisJY29uc3Qgc3RydWN0IG1jN190aW1pbmdfcGFyYW1zICpwID0gJm1jN190aW1pbmdzW21lbV90eXBlXTsKKworCXZhbCA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfQ0ZHKTsKKwlzbG93ID0gdmFsICYgRl9TTE9XOworCXdpZHRoID0gR19XSURUSCh2YWwpOworCWRlbnNpdHkgPSBHX0RFTih2YWwpOworCisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfQ0ZHLCB2YWwgfCBGX0lGRU4pOworCXZhbCA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfQ0ZHKTsJLyogZmx1c2ggKi8KKwltc2xlZXAoMSk7CisKKwlpZiAoIXNsb3cpIHsKKwkJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfQ0FMLCBGX1NHTF9DQUxfRU4pOworCQl0M19yZWFkX3JlZyhhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0NBTCk7CisJCW1zbGVlcCgxKTsKKwkJaWYgKHQzX3JlYWRfcmVnKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfQ0FMKSAmCisJCSAgICAoRl9CVVNZIHwgRl9TR0xfQ0FMX0VOIHwgRl9DQUxfRkFVTFQpKSB7CisJCQlDSF9FUlIoYWRhcHRlciwgIiVzIE1DNyBjYWxpYnJhdGlvbiB0aW1lZCBvdXRcbiIsCisJCQkgICAgICAgbWM3LT5uYW1lKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwl9CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19QQVJNLAorCQkgICAgIFZfQUNUVE9QUkVETFkocC0+QWN0VG9QcmVEbHkpIHwKKwkJICAgICBWX0FDVFRPUkRXUkRMWShwLT5BY3RUb1JkV3JEbHkpIHwgVl9QUkVDWUMocC0+UHJlQ3ljKSB8CisJCSAgICAgVl9SRUZDWUMocC0+UmVmQ3ljW2RlbnNpdHldKSB8IFZfQktDWUMocC0+QmtDeWMpIHwKKwkJICAgICBWX1dSVE9SRERMWShwLT5XclRvUmREbHkpIHwgVl9SRFRPV1JETFkocC0+UmRUb1dyRGx5KSk7CisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19DRkcsCisJCSAgICAgdmFsIHwgRl9DTEtFTiB8IEZfVEVSTTE1MCk7CisJdDNfcmVhZF9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19DRkcpOwkvKiBmbHVzaCAqLworCisJaWYgKCFzbG93KQorCQl0M19zZXRfcmVnX2ZpZWxkKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfRExMLCBGX0RMTEVOQiwKKwkJCQkgRl9ETExFTkIpOworCXVkZWxheSgxKTsKKworCXZhbCA9IHNsb3cgPyAzIDogNjsKKwlpZiAod3JyZWdfd2FpdChhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X1BSRSwgMCkgfHwKKwkgICAgd3JyZWdfd2FpdChhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0VYVF9NT0RFMiwgMCkgfHwKKwkgICAgd3JyZWdfd2FpdChhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0VYVF9NT0RFMywgMCkgfHwKKwkgICAgd3JyZWdfd2FpdChhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0VYVF9NT0RFMSwgdmFsKSkKKwkJZ290byBvdXRfZmFpbDsKKworCWlmICghc2xvdykgeworCQl0M193cml0ZV9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19NT0RFLCAweDEwMCk7CisJCXQzX3NldF9yZWdfZmllbGQoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19ETEwsIEZfRExMUlNULCAwKTsKKwkJdWRlbGF5KDUpOworCX0KKworCWlmICh3cnJlZ193YWl0KGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfUFJFLCAwKSB8fAorCSAgICB3cnJlZ193YWl0KGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfUkVGLCAwKSB8fAorCSAgICB3cnJlZ193YWl0KGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfUkVGLCAwKSB8fAorCSAgICB3cnJlZ193YWl0KGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfTU9ERSwKKwkJICAgICAgIG1jN19tb2RlW21lbV90eXBlXSkgfHwKKwkgICAgd3JyZWdfd2FpdChhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0VYVF9NT0RFMSwgdmFsIHwgMHgzODApIHx8CisJICAgIHdycmVnX3dhaXQoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19FWFRfTU9ERTEsIHZhbCkpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwkvKiBjbG9jayB2YWx1ZSBpcyBpbiBLSHogKi8KKwltYzdfY2xvY2sgPSBtYzdfY2xvY2sgKiA3ODEyICsgbWM3X2Nsb2NrIC8gMjsJLyogbnMgKi8KKwltYzdfY2xvY2sgLz0gMTAwMDAwMDsJLyogS0h6LT5NSHosIG5zLT51cyAqLworCisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfUkVGLAorCQkgICAgIEZfUEVSUkVGRU4gfCBWX1BSRVJFRkRJVihtYzdfY2xvY2spKTsKKwl0M19yZWFkX3JlZyhhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X1JFRik7CS8qIGZsdXNoICovCisKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19FQ0MsIEZfRUNDR0VORU4gfCBGX0VDQ0NIS0VOKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19CSVNUX0RBVEEsIDApOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0JJU1RfQUREUl9CRUcsIDApOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0JJU1RfQUREUl9FTkQsCisJCSAgICAgKG1jNy0+c2l6ZSA8PCB3aWR0aCkgLSAxKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgbWM3LT5vZmZzZXQgKyBBX01DN19CSVNUX09QLCBWX09QKDEpKTsKKwl0M19yZWFkX3JlZyhhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0JJU1RfT1ApOwkvKiBmbHVzaCAqLworCisJYXR0ZW1wdHMgPSA1MDsKKwlkbyB7CisJCW1zbGVlcCgyNTApOworCQl2YWwgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0JJU1RfT1ApOworCX0gd2hpbGUgKCh2YWwgJiBGX0JVU1kpICYmIC0tYXR0ZW1wdHMpOworCWlmICh2YWwgJiBGX0JVU1kpIHsKKwkJQ0hfRVJSKGFkYXB0ZXIsICIlcyBNQzcgQklTVCB0aW1lZCBvdXRcbiIsIG1jNy0+bmFtZSk7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJLyogRW5hYmxlIG5vcm1hbCBtZW1vcnkgYWNjZXNzZXMuICovCisJdDNfc2V0X3JlZ19maWVsZChhZGFwdGVyLCBtYzctPm9mZnNldCArIEFfTUM3X0NGRywgMCwgRl9SRFkpOworCXJldHVybiAwOworCitvdXRfZmFpbDoKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19wY2llKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXN0YXRpYyBjb25zdCB1MTYgYWNrX2xhdFs0XVs2XSA9IHsKKwkJezIzNywgNDE2LCA1NTksIDEwNzEsIDIwOTUsIDQxNDN9LAorCQl7MTI4LCAyMTcsIDI4OSwgNTQ1LCAxMDU3LCAyMDgxfSwKKwkJezczLCAxMTgsIDE1NCwgMjgyLCA1MzgsIDEwNTB9LAorCQl7NjcsIDEwNywgODYsIDE1MCwgMjc4LCA1MzR9CisJfTsKKwlzdGF0aWMgY29uc3QgdTE2IHJwbF90bXJbNF1bNl0gPSB7CisJCXs3MTEsIDEyNDgsIDE2NzcsIDMyMTMsIDYyODUsIDEyNDI5fSwKKwkJezM4NCwgNjUxLCA4NjcsIDE2MzUsIDMxNzEsIDYyNDN9LAorCQl7MjE5LCAzNTQsIDQ2MiwgODQ2LCAxNjE0LCAzMTUwfSwKKwkJezIwMSwgMzIxLCAyNTgsIDQ1MCwgODM0LCAxNjAyfQorCX07CisKKwl1MTYgdmFsOworCXVuc2lnbmVkIGludCBsb2cyX3dpZHRoLCBwbGRzaXplOworCXVuc2lnbmVkIGludCBmc3RfdHJuX3J4LCBmc3RfdHJuX3R4LCBhY2tsYXQsIHJwbGxtdDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFkYXAtPnBkZXYsCisJCQkgICAgIGFkYXAtPnBhcmFtcy5wY2kucGNpZV9jYXBfYWRkciArIFBDSV9FWFBfREVWQ1RMLAorCQkJICAgICAmdmFsKTsKKwlwbGRzaXplID0gKHZhbCAmIFBDSV9FWFBfREVWQ1RMX1BBWUxPQUQpID4+IDU7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWRhcC0+cGRldiwKKwkJCSAgICAgYWRhcC0+cGFyYW1zLnBjaS5wY2llX2NhcF9hZGRyICsgUENJX0VYUF9MTktDVEwsCisJCQkgICAgICZ2YWwpOworCisJZnN0X3Rybl90eCA9IEdfTlVNRlNUVFJOU0VRKHQzX3JlYWRfcmVnKGFkYXAsIEFfUENJRV9QRVhfQ1RSTDApKTsKKwlmc3RfdHJuX3J4ID0gYWRhcC0+cGFyYW1zLnJldiA9PSAwID8gZnN0X3Rybl90eCA6CisJICAgIEdfTlVNRlNUVFJOU0VRUlgodDNfcmVhZF9yZWcoYWRhcCwgQV9QQ0lFX01PREUpKTsKKwlsb2cyX3dpZHRoID0gZmxzKGFkYXAtPnBhcmFtcy5wY2kud2lkdGgpIC0gMTsKKwlhY2tsYXQgPSBhY2tfbGF0W2xvZzJfd2lkdGhdW3BsZHNpemVdOworCWlmICh2YWwgJiAxKQkJLyogY2hlY2sgTE9zRW5hYmxlICovCisJCWFja2xhdCArPSBmc3RfdHJuX3R4ICogNDsKKwlycGxsbXQgPSBycGxfdG1yW2xvZzJfd2lkdGhdW3BsZHNpemVdICsgZnN0X3Rybl9yeCAqIDQ7CisKKwlpZiAoYWRhcC0+cGFyYW1zLnJldiA9PSAwKQorCQl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfUENJRV9QRVhfQ1RSTDEsCisJCQkJIFZfVDNBX0FDS0xBVChNX1QzQV9BQ0tMQVQpLAorCQkJCSBWX1QzQV9BQ0tMQVQoYWNrbGF0KSk7CisJZWxzZQorCQl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfUENJRV9QRVhfQ1RSTDEsIFZfQUNLTEFUKE1fQUNLTEFUKSwKKwkJCQkgVl9BQ0tMQVQoYWNrbGF0KSk7CisKKwl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfUENJRV9QRVhfQ1RSTDAsIFZfUkVQTEFZTE1UKE1fUkVQTEFZTE1UKSwKKwkJCSBWX1JFUExBWUxNVChycGxsbXQpKTsKKworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1BDSUVfUEVYX0VSUiwgMHhmZmZmZmZmZik7CisJdDNfc2V0X3JlZ19maWVsZChhZGFwLCBBX1BDSUVfQ0ZHLCBGX1BDSUVfQ0xJREVDRU4sIEZfUENJRV9DTElERUNFTik7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgVDMgSFcgbW9kdWxlcy4gIFRoaXMgcGVyZm9ybXMgdGhlCisgKiBpbml0aWFsaXphdGlvbiBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgZG9uZSBvbmNlIGFmdGVyIGEgY2FyZCBpcyByZXNldC4KKyAqIE1BQyBhbmQgUEhZIGluaXRpYWxpemF0aW9uIGlzIGhhbmRsZWQgc2VwYXJhcmVseSB3aGVuZXZlciBhIHBvcnQgaXMgZW5hYmxlZC4KKyAqCisgKiBmd19wYXJhbXMgYXJlIHBhc3NlZCB0byBGVyBhbmQgdGhlaXIgdmFsdWUgaXMgcGxhdGZvcm0gZGVwZW5kZW50LiAgT25seSB0aGUKKyAqIHRvcCA4IGJpdHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlLCB0aGUgcmVzdCBtdXN0IGJlIDAuCisgKi8KK2ludCB0M19pbml0X2h3KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZndfcGFyYW1zKQoreworCWludCBlcnIgPSAtRUlPLCBhdHRlbXB0cyA9IDEwMDsKKwljb25zdCBzdHJ1Y3QgdnBkX3BhcmFtcyAqdnBkID0gJmFkYXB0ZXItPnBhcmFtcy52cGQ7CisKKwlpZiAoYWRhcHRlci0+cGFyYW1zLnJldiA+IDApCisJCWNhbGlicmF0ZV94Z21fdDNiKGFkYXB0ZXIpOworCWVsc2UgaWYgKGNhbGlicmF0ZV94Z20oYWRhcHRlcikpCisJCWdvdG8gb3V0X2VycjsKKworCWlmICh2cGQtPm1jbGspIHsKKwkJcGFydGl0aW9uX21lbShhZGFwdGVyLCAmYWRhcHRlci0+cGFyYW1zLnRwKTsKKworCQlpZiAobWM3X2luaXQoJmFkYXB0ZXItPnBtcngsIHZwZC0+bWNsaywgdnBkLT5tZW1fdGltaW5nKSB8fAorCQkgICAgbWM3X2luaXQoJmFkYXB0ZXItPnBtdHgsIHZwZC0+bWNsaywgdnBkLT5tZW1fdGltaW5nKSB8fAorCQkgICAgbWM3X2luaXQoJmFkYXB0ZXItPmNtLCB2cGQtPm1jbGssIHZwZC0+bWVtX3RpbWluZykgfHwKKwkJICAgIHQzX21jNV9pbml0KCZhZGFwdGVyLT5tYzUsIGFkYXB0ZXItPnBhcmFtcy5tYzUubnNlcnZlcnMsCisJCQkJYWRhcHRlci0+cGFyYW1zLm1jNS5uZmlsdGVycywKKwkJCQlhZGFwdGVyLT5wYXJhbXMubWM1Lm5yb3V0ZXMpKQorCQkJZ290byBvdXRfZXJyOworCX0KKworCWlmICh0cF9pbml0KGFkYXB0ZXIsICZhZGFwdGVyLT5wYXJhbXMudHApKQorCQlnb3RvIG91dF9lcnI7CisKKwl0M190cF9zZXRfY29hbGVzY2luZ19zaXplKGFkYXB0ZXIsCisJCQkJICBtaW4oYWRhcHRlci0+cGFyYW1zLnNnZS5tYXhfcGt0X3NpemUsCisJCQkJICAgICAgTUFYX1JYX0NPQUxFU0NJTkdfTEVOKSwgMSk7CisJdDNfdHBfc2V0X21heF9yeHNpemUoYWRhcHRlciwKKwkJCSAgICAgbWluKGFkYXB0ZXItPnBhcmFtcy5zZ2UubWF4X3BrdF9zaXplLCAxNjM4NFUpKTsKKwl1bHBfY29uZmlnKGFkYXB0ZXIsICZhZGFwdGVyLT5wYXJhbXMudHApOworCisJaWYgKGlzX3BjaWUoYWRhcHRlcikpCisJCWNvbmZpZ19wY2llKGFkYXB0ZXIpOworCWVsc2UKKwkJdDNfc2V0X3JlZ19maWVsZChhZGFwdGVyLCBBX1BDSVhfQ0ZHLCAwLCBGX0NMSURFQ0VOKTsKKworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1BNMV9SWF9DRkcsIDB4ZjAwMGYwMDApOworCWluaXRfaHdfZm9yX2F2YWlsX3BvcnRzKGFkYXB0ZXIsIGFkYXB0ZXItPnBhcmFtcy5ucG9ydHMpOworCXQzX3NnZV9pbml0KGFkYXB0ZXIsICZhZGFwdGVyLT5wYXJhbXMuc2dlKTsKKworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX0NJTV9IT1NUX0FDQ19EQVRBLCB2cGQtPnVjbGsgfCBmd19wYXJhbXMpOworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX0NJTV9CT09UX0NGRywKKwkJICAgICBWX0JPT1RBRERSKEZXX0ZMQVNIX0JPT1RfQUREUiA+PiAyKSk7CisJdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9DSU1fQk9PVF9DRkcpOwkvKiBmbHVzaCAqLworCisJZG8gewkJCS8qIHdhaXQgZm9yIHVQIHRvIGluaXRpYWxpemUgKi8KKwkJbXNsZWVwKDIwKTsKKwl9IHdoaWxlICh0M19yZWFkX3JlZyhhZGFwdGVyLCBBX0NJTV9IT1NUX0FDQ19EQVRBKSAmJiAtLWF0dGVtcHRzKTsKKwlpZiAoIWF0dGVtcHRzKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSAwOworb3V0X2VycjoKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqCWdldF9wY2lfbW9kZSAtIGRldGVybWluZSBhIGNhcmQncyBQQ0kgbW9kZQorICoJQGFkYXB0ZXI6IHRoZSBhZGFwdGVyCisgKglAcDogd2hlcmUgdG8gc3RvcmUgdGhlIFBDSSBzZXR0aW5ncworICoKKyAqCURldGVybWluZXMgYSBjYXJkJ3MgUENJIG1vZGUgYW5kIGFzc29jaWF0ZWQgcGFyYW1ldGVycywgc3VjaCBhcyBzcGVlZAorICoJYW5kIHdpZHRoLgorICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZ2V0X3BjaV9tb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJCSAgIHN0cnVjdCBwY2lfcGFyYW1zICpwKQoreworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzcGVlZF9tYXBbXSA9IHsgMzMsIDY2LCAxMDAsIDEzMyB9OworCXUzMiBwY2lfbW9kZSwgcGNpZV9jYXA7CisKKwlwY2llX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkoYWRhcHRlci0+cGRldiwgUENJX0NBUF9JRF9FWFApOworCWlmIChwY2llX2NhcCkgeworCQl1MTYgdmFsOworCisJCXAtPnZhcmlhbnQgPSBQQ0lfVkFSSUFOVF9QQ0lFOworCQlwLT5wY2llX2NhcF9hZGRyID0gcGNpZV9jYXA7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFkYXB0ZXItPnBkZXYsIHBjaWVfY2FwICsgUENJX0VYUF9MTktTVEEsCisJCQkJCSZ2YWwpOworCQlwLT53aWR0aCA9ICh2YWwgPj4gNCkgJiAweDNmOworCQlyZXR1cm47CisJfQorCisJcGNpX21vZGUgPSB0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1BDSVhfTU9ERSk7CisJcC0+c3BlZWQgPSBzcGVlZF9tYXBbR19QQ0xLUkFOR0UocGNpX21vZGUpXTsKKwlwLT53aWR0aCA9IChwY2lfbW9kZSAmIEZfNjRCSVQpID8gNjQgOiAzMjsKKwlwY2lfbW9kZSA9IEdfUENJWElOSVRQQVQocGNpX21vZGUpOworCWlmIChwY2lfbW9kZSA9PSAwKQorCQlwLT52YXJpYW50ID0gUENJX1ZBUklBTlRfUENJOworCWVsc2UgaWYgKHBjaV9tb2RlIDwgNCkKKwkJcC0+dmFyaWFudCA9IFBDSV9WQVJJQU5UX1BDSVhfTU9ERTFfUEFSSVRZOworCWVsc2UgaWYgKHBjaV9tb2RlIDwgOCkKKwkJcC0+dmFyaWFudCA9IFBDSV9WQVJJQU5UX1BDSVhfTU9ERTFfRUNDOworCWVsc2UKKwkJcC0+dmFyaWFudCA9IFBDSV9WQVJJQU5UX1BDSVhfMjY2X01PREUyOworfQorCisvKioKKyAqCWluaXRfbGlua19jb25maWcgLSBpbml0aWFsaXplIGEgbGluaydzIFNXIHN0YXRlCisgKglAbGM6IHN0cnVjdHVyZSBob2xkaW5nIHRoZSBsaW5rIHN0YXRlCisgKglAYWk6IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGNhcmQKKyAqCisgKglJbml0aWFsaXplcyB0aGUgU1cgc3RhdGUgbWFpbnRhaW5lZCBmb3IgZWFjaCBsaW5rLCBpbmNsdWRpbmcgdGhlIGxpbmsncworICoJY2FwYWJpbGl0aWVzIGFuZCBkZWZhdWx0IHNwZWVkL2R1cGxleC9mbG93LWNvbnRyb2wvYXV0b25lZ290aWF0aW9uCisgKglzZXR0aW5ncy4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfbGlua19jb25maWcoc3RydWN0IGxpbmtfY29uZmlnICpsYywKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGNhcHMpCit7CisJbGMtPnN1cHBvcnRlZCA9IGNhcHM7CisJbGMtPnJlcXVlc3RlZF9zcGVlZCA9IGxjLT5zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CisJbGMtPnJlcXVlc3RlZF9kdXBsZXggPSBsYy0+ZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7CisJbGMtPnJlcXVlc3RlZF9mYyA9IGxjLT5mYyA9IFBBVVNFX1JYIHwgUEFVU0VfVFg7CisJaWYgKGxjLT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfQXV0b25lZykgeworCQlsYy0+YWR2ZXJ0aXNpbmcgPSBsYy0+c3VwcG9ydGVkOworCQlsYy0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOworCQlsYy0+cmVxdWVzdGVkX2ZjIHw9IFBBVVNFX0FVVE9ORUc7CisJfSBlbHNlIHsKKwkJbGMtPmFkdmVydGlzaW5nID0gMDsKKwkJbGMtPmF1dG9uZWcgPSBBVVRPTkVHX0RJU0FCTEU7CisJfQorfQorCisvKioKKyAqCW1jN19jYWxjX3NpemUgLSBjYWxjdWxhdGUgTUM3IG1lbW9yeSBzaXplCisgKglAY2ZnOiB0aGUgTUM3IGNvbmZpZ3VyYXRpb24KKyAqCisgKglDYWxjdWxhdGVzIHRoZSBzaXplIG9mIGFuIE1DNyBtZW1vcnkgaW4gYnl0ZXMgZnJvbSB0aGUgdmFsdWUgb2YgaXRzCisgKgljb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBtYzdfY2FsY19zaXplKHUzMiBjZmcpCit7CisJdW5zaWduZWQgaW50IHdpZHRoID0gR19XSURUSChjZmcpOworCXVuc2lnbmVkIGludCBiYW5rcyA9ICEhKGNmZyAmIEZfQktTKSArIDE7CisJdW5zaWduZWQgaW50IG9yZyA9ICEhKGNmZyAmIEZfT1JHKSArIDE7CisJdW5zaWduZWQgaW50IGRlbnNpdHkgPSBHX0RFTihjZmcpOworCXVuc2lnbmVkIGludCBNQnMgPSAoKDI1NiA8PCBkZW5zaXR5KSAqIGJhbmtzKSAvIChvcmcgPDwgd2lkdGgpOworCisJcmV0dXJuIE1CcyA8PCAyMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IG1jN19wcmVwKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgbWM3ICptYzcsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGJhc2VfYWRkciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1MzIgY2ZnOworCisJbWM3LT5hZGFwdGVyID0gYWRhcHRlcjsKKwltYzctPm5hbWUgPSBuYW1lOworCW1jNy0+b2Zmc2V0ID0gYmFzZV9hZGRyIC0gTUM3X1BNUlhfQkFTRV9BRERSOworCWNmZyA9IHQzX3JlYWRfcmVnKGFkYXB0ZXIsIG1jNy0+b2Zmc2V0ICsgQV9NQzdfQ0ZHKTsKKwltYzctPnNpemUgPSBtYzdfY2FsY19zaXplKGNmZyk7CisJbWM3LT53aWR0aCA9IEdfV0lEVEgoY2ZnKTsKK30KKwordm9pZCBtYWNfcHJlcChzdHJ1Y3QgY21hYyAqbWFjLCBzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGluZGV4KQoreworCW1hYy0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbWFjLT5vZmZzZXQgPSAoWEdNQUMwXzFfQkFTRV9BRERSIC0gWEdNQUMwXzBfQkFTRV9BRERSKSAqIGluZGV4OworCW1hYy0+bnVjYXN0ID0gMTsKKworCWlmIChhZGFwdGVyLT5wYXJhbXMucmV2ID09IDAgJiYgdXNlc194YXVpKGFkYXB0ZXIpKSB7CisJCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1hHTV9TRVJERVNfQ1RSTCArIG1hYy0+b2Zmc2V0LAorCQkJICAgICBpc18xMEcoYWRhcHRlcikgPyAweDI5MDFjMDQgOiAweDIzMDFjMDQpOworCQl0M19zZXRfcmVnX2ZpZWxkKGFkYXB0ZXIsIEFfWEdNX1BPUlRfQ0ZHICsgbWFjLT5vZmZzZXQsCisJCQkJIEZfRU5SR01JSSwgMCk7CisJfQorfQorCit2b2lkIGVhcmx5X2h3X2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHN0cnVjdCBhZGFwdGVyX2luZm8gKmFpKQoreworCXUzMiB2YWwgPSBWX1BPUlRTUEVFRChpc18xMEcoYWRhcHRlcikgPyAzIDogMik7CisKKwltaTFfaW5pdChhZGFwdGVyLCBhaSk7CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfSTJDX0NGRywJLyogc2V0IGZvciA4MEtIeiAqLworCQkgICAgIFZfSTJDX0NMS0RJVihhZGFwdGVyLT5wYXJhbXMudnBkLmNjbGsgLyA4MCAtIDEpKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9UM0RCR19HUElPX0VOLAorCQkgICAgIGFpLT5ncGlvX291dCB8IEZfR1BJTzBfT0VOIHwgRl9HUElPMF9PVVRfVkFMKTsKKworCWlmIChhZGFwdGVyLT5wYXJhbXMucmV2ID09IDAgfHwgIXVzZXNfeGF1aShhZGFwdGVyKSkKKwkJdmFsIHw9IEZfRU5SR01JSTsKKworCS8qIEVuYWJsZSBNQUMgY2xvY2tzIHNvIHdlIGNhbiBhY2Nlc3MgdGhlIHJlZ2lzdGVycyAqLworCXQzX3dyaXRlX3JlZyhhZGFwdGVyLCBBX1hHTV9QT1JUX0NGRywgdmFsKTsKKwl0M19yZWFkX3JlZyhhZGFwdGVyLCBBX1hHTV9QT1JUX0NGRyk7CisKKwl2YWwgfD0gRl9DTEtESVZSRVNFVF87CisJdDNfd3JpdGVfcmVnKGFkYXB0ZXIsIEFfWEdNX1BPUlRfQ0ZHLCB2YWwpOworCXQzX3JlYWRfcmVnKGFkYXB0ZXIsIEFfWEdNX1BPUlRfQ0ZHKTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgWEdNX1JFRyhBX1hHTV9QT1JUX0NGRywgMSksIHZhbCk7CisJdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9YR01fUE9SVF9DRkcpOworfQorCisvKgorICogUmVzZXQgdGhlIGFkYXB0ZXIuICBQQ0llIGNhcmRzIGxvc2UgdGhlaXIgY29uZmlnIHNwYWNlIGR1cmluZyByZXNldCwgUENJLVgKKyAqIG9uZXMgZG9uJ3QuCisgKi8KK2ludCB0M19yZXNldF9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCXVpbnQxNl90IGRldmlkID0gMDsKKworCWlmIChpc19wY2llKGFkYXB0ZXIpKQorCQlwY2lfc2F2ZV9zdGF0ZShhZGFwdGVyLT5wZGV2KTsKKwl0M193cml0ZV9yZWcoYWRhcHRlciwgQV9QTF9SU1QsIEZfQ1JTVFdSTSB8IEZfQ1JTVFdSTU1PREUpOworCisJLyoKKwkgKiBEZWxheS4gR2l2ZSBTb21lIHRpbWUgdG8gZGV2aWNlIHRvIHJlc2V0IGZ1bGx5LgorCSAqIFhYWCBUaGUgZGVsYXkgdGltZSBzaG91bGQgYmUgbW9kaWZpZWQuCisJICovCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJbXNsZWVwKDUwKTsKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoYWRhcHRlci0+cGRldiwgMHgwMCwgJmRldmlkKTsKKwkJaWYgKGRldmlkID09IDB4MTQyNSkKKwkJCWJyZWFrOworCX0KKworCWlmIChkZXZpZCAhPSAweDE0MjUpCisJCXJldHVybiAtMTsKKworCWlmIChpc19wY2llKGFkYXB0ZXIpKQorCQlwY2lfcmVzdG9yZV9zdGF0ZShhZGFwdGVyLT5wZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYWRhcHRlciBTVyBzdGF0ZSBmb3IgdGhlIHZhcmlvdXMgSFcgbW9kdWxlcywgc2V0IGluaXRpYWwgdmFsdWVzCisgKiBmb3Igc29tZSBhZGFwdGVyIHR1bmFibGVzLCB0YWtlIFBIWXMgb3V0IG9mIHJlc2V0LCBhbmQgaW5pdGlhbGl6ZSB0aGUgTURJTworICogaW50ZXJmYWNlLgorICovCitpbnQgX19kZXZpbml0IHQzX3ByZXBfYWRhcHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBhZGFwdGVyX2luZm8gKmFpLCBpbnQgcmVzZXQpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaSwgaiA9IDA7CisKKwlnZXRfcGNpX21vZGUoYWRhcHRlciwgJmFkYXB0ZXItPnBhcmFtcy5wY2kpOworCisJYWRhcHRlci0+cGFyYW1zLmluZm8gPSBhaTsKKwlhZGFwdGVyLT5wYXJhbXMubnBvcnRzID0gYWktPm5wb3J0czsKKwlhZGFwdGVyLT5wYXJhbXMucmV2ID0gdDNfcmVhZF9yZWcoYWRhcHRlciwgQV9QTF9SRVYpOworCWFkYXB0ZXItPnBhcmFtcy5saW5rcG9sbF9wZXJpb2QgPSAwOworCWFkYXB0ZXItPnBhcmFtcy5zdGF0c191cGRhdGVfcGVyaW9kID0gaXNfMTBHKGFkYXB0ZXIpID8KKwkgICAgTUFDX1NUQVRTX0FDQ1VNX1NFQ1MgOiAoTUFDX1NUQVRTX0FDQ1VNX1NFQ1MgKiAxMCk7CisJYWRhcHRlci0+cGFyYW1zLnBjaS52cGRfY2FwX2FkZHIgPQorCSAgICBwY2lfZmluZF9jYXBhYmlsaXR5KGFkYXB0ZXItPnBkZXYsIFBDSV9DQVBfSURfVlBEKTsKKwlyZXQgPSBnZXRfdnBkX3BhcmFtcyhhZGFwdGVyLCAmYWRhcHRlci0+cGFyYW1zLnZwZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAocmVzZXQgJiYgdDNfcmVzZXRfYWRhcHRlcihhZGFwdGVyKSkKKwkJcmV0dXJuIC0xOworCisJdDNfc2dlX3ByZXAoYWRhcHRlciwgJmFkYXB0ZXItPnBhcmFtcy5zZ2UpOworCisJaWYgKGFkYXB0ZXItPnBhcmFtcy52cGQubWNsaykgeworCQlzdHJ1Y3QgdHBfcGFyYW1zICpwID0gJmFkYXB0ZXItPnBhcmFtcy50cDsKKworCQltYzdfcHJlcChhZGFwdGVyLCAmYWRhcHRlci0+cG1yeCwgTUM3X1BNUlhfQkFTRV9BRERSLCAiUE1SWCIpOworCQltYzdfcHJlcChhZGFwdGVyLCAmYWRhcHRlci0+cG10eCwgTUM3X1BNVFhfQkFTRV9BRERSLCAiUE1UWCIpOworCQltYzdfcHJlcChhZGFwdGVyLCAmYWRhcHRlci0+Y20sIE1DN19DTV9CQVNFX0FERFIsICJDTSIpOworCisJCXAtPm5jaGFuID0gYWktPm5wb3J0czsKKwkJcC0+cG1yeF9zaXplID0gdDNfbWM3X3NpemUoJmFkYXB0ZXItPnBtcngpOworCQlwLT5wbXR4X3NpemUgPSB0M19tYzdfc2l6ZSgmYWRhcHRlci0+cG10eCk7CisJCXAtPmNtX3NpemUgPSB0M19tYzdfc2l6ZSgmYWRhcHRlci0+Y20pOworCQlwLT5jaGFuX3J4X3NpemUgPSBwLT5wbXJ4X3NpemUgLyAyOwkvKiBvbmx5IDEgUnggY2hhbm5lbCAqLworCQlwLT5jaGFuX3R4X3NpemUgPSBwLT5wbXR4X3NpemUgLyBwLT5uY2hhbjsKKwkJcC0+cnhfcGdfc2l6ZSA9IDY0ICogMTAyNDsKKwkJcC0+dHhfcGdfc2l6ZSA9IGlzXzEwRyhhZGFwdGVyKSA/IDY0ICogMTAyNCA6IDE2ICogMTAyNDsKKwkJcC0+cnhfbnVtX3BncyA9IHBtX251bV9wYWdlcyhwLT5jaGFuX3J4X3NpemUsIHAtPnJ4X3BnX3NpemUpOworCQlwLT50eF9udW1fcGdzID0gcG1fbnVtX3BhZ2VzKHAtPmNoYW5fdHhfc2l6ZSwgcC0+dHhfcGdfc2l6ZSk7CisJCXAtPm50aW1lcl9xcyA9IHAtPmNtX3NpemUgPj0gKDEyOCA8PCAyMCkgfHwKKwkJICAgIGFkYXB0ZXItPnBhcmFtcy5yZXYgPiAwID8gMTIgOiA2OworCisJCWFkYXB0ZXItPnBhcmFtcy5tYzUubnNlcnZlcnMgPSBERUZBVUxUX05TRVJWRVJTOworCQlhZGFwdGVyLT5wYXJhbXMubWM1Lm5maWx0ZXJzID0gYWRhcHRlci0+cGFyYW1zLnJldiA+IDAgPworCQkgICAgREVGQVVMVF9ORklMVEVSUyA6IDA7CisJCWFkYXB0ZXItPnBhcmFtcy5tYzUubnJvdXRlcyA9IDA7CisJCXQzX21jNV9wcmVwKGFkYXB0ZXIsICZhZGFwdGVyLT5tYzUsIE1DNV9NT0RFXzE0NF9CSVQpOworCisJCWluaXRfbXR1cyhhZGFwdGVyLT5wYXJhbXMubXR1cyk7CisJCWluaXRfY29uZ19jdHJsKGFkYXB0ZXItPnBhcmFtcy5hX3duZCwgYWRhcHRlci0+cGFyYW1zLmJfd25kKTsKKwl9CisKKwllYXJseV9od19pbml0KGFkYXB0ZXIsIGFpKTsKKworCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgeworCQl1OCBod19hZGRyWzZdOworCQlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gYWRhcDJwaW5mbyhhZGFwdGVyLCBpKTsKKworCQl3aGlsZSAoIWFkYXB0ZXItPnBhcmFtcy52cGQucG9ydF90eXBlW2pdKQorCQkJKytqOworCisJCXAtPnBvcnRfdHlwZSA9ICZwb3J0X3R5cGVzW2FkYXB0ZXItPnBhcmFtcy52cGQucG9ydF90eXBlW2pdXTsKKwkJcC0+cG9ydF90eXBlLT5waHlfcHJlcCgmcC0+cGh5LCBhZGFwdGVyLCBhaS0+cGh5X2Jhc2VfYWRkciArIGosCisJCQkJICAgICAgIGFpLT5tZGlvX29wcyk7CisJCW1hY19wcmVwKCZwLT5tYWMsIGFkYXB0ZXIsIGopOworCQkrK2o7CisKKwkJLyoKKwkJICogVGhlIFZQRCBFRVBST00gc3RvcmVzIHRoZSBiYXNlIEV0aGVybmV0IGFkZHJlc3MgZm9yIHRoZQorCQkgKiBjYXJkLiAgQSBwb3J0J3MgYWRkcmVzcyBpcyBkZXJpdmVkIGZyb20gdGhlIGJhc2UgYnkgYWRkaW5nCisJCSAqIHRoZSBwb3J0J3MgaW5kZXggdG8gdGhlIGJhc2UncyBsb3cgb2N0ZXQuCisJCSAqLworCQltZW1jcHkoaHdfYWRkciwgYWRhcHRlci0+cGFyYW1zLnZwZC5ldGhfYmFzZSwgNSk7CisJCWh3X2FkZHJbNV0gPSBhZGFwdGVyLT5wYXJhbXMudnBkLmV0aF9iYXNlWzVdICsgaTsKKworCQltZW1jcHkoYWRhcHRlci0+cG9ydFtpXS0+ZGV2X2FkZHIsIGh3X2FkZHIsCisJCSAgICAgICBFVEhfQUxFTik7CisJCW1lbWNweShhZGFwdGVyLT5wb3J0W2ldLT5wZXJtX2FkZHIsIGh3X2FkZHIsCisJCSAgICAgICBFVEhfQUxFTik7CisJCWluaXRfbGlua19jb25maWcoJnAtPmxpbmtfY29uZmlnLCBwLT5wb3J0X3R5cGUtPmNhcHMpOworCQlwLT5waHkub3BzLT5wb3dlcl9kb3duKCZwLT5waHksIDEpOworCQlpZiAoIShwLT5wb3J0X3R5cGUtPmNhcHMgJiBTVVBQT1JURURfSVJRKSkKKwkJCWFkYXB0ZXItPnBhcmFtcy5saW5rcG9sbF9wZXJpb2QgPSAxMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCB0M19sZWRfcmVhZHkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdDNfc2V0X3JlZ19maWVsZChhZGFwdGVyLCBBX1QzREJHX0dQSU9fRU4sIEZfR1BJTzBfT1VUX1ZBTCwKKwkJCSBGX0dQSU8wX09VVF9WQUwpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvdDNjZGV2LmggYi9kcml2ZXJzL25ldC9jeGdiMy90M2NkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWYzYmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY3hnYjMvdDNjZGV2LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgT3BlbiBHcmlkIENvbXB1dGluZywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9UM0NERVZfSF8KKyNkZWZpbmUgX1QzQ0RFVl9IXworCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9uZWlnaGJvdXIuaD4KKworI2RlZmluZSBUM0NOQU1TSVogMTYKKworLyogR2V0IHRoZSB0M2NkZXYgYXNzb2NpYXRlZCB3aXRoIGEgbmV0X2RldmljZSAqLworI2RlZmluZSBUM0NERVYobmV0ZGV2KSAoc3RydWN0IHQzY2RldiAqKShuZXRkZXYtPnByaXYpCisKK3N0cnVjdCBjeGdiM19jbGllbnQ7CisKK2VudW0gdDNjdHlwZSB7CisJVDNBID0gMCwKKwlUM0IKK307CisKK3N0cnVjdCB0M2NkZXYgeworCWNoYXIgbmFtZVtUM0NOQU1TSVpdOwkvKiBUM0MgZGV2aWNlIG5hbWUgKi8KKwllbnVtIHQzY3R5cGUgdHlwZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG9mbGRfZGV2X2xpc3Q7CS8qIGZvciBsaXN0IGxpbmtpbmcgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqbGxkZXY7CS8qIExMIGRldiBhc3NvY2lhdGVkIHdpdGggVDNDIG1lc3NhZ2VzICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2RpcjsJLyogcm9vdCBvZiBwcm9jIGRpciBmb3IgdGhpcyBUM0MgKi8KKwlpbnQgKCpzZW5kKShzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCWludCAoKnJlY3YpKHN0cnVjdCB0M2NkZXYgKmRldiwgc3RydWN0IHNrX2J1ZmYgKipza2IsIGludCBuKTsKKwlpbnQgKCpjdGwpKHN0cnVjdCB0M2NkZXYgKmRldiwgdW5zaWduZWQgaW50IHJlcSwgdm9pZCAqZGF0YSk7CisJdm9pZCAoKm5laWdoX3VwZGF0ZSkoc3RydWN0IHQzY2RldiAqZGV2LCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCk7CisJdm9pZCAqcHJpdjsJCS8qIGRyaXZlciBwcml2YXRlIGRhdGEgKi8KKwl2b2lkICpsMm9wdDsJCS8qIG9wdGlvbmFsIGxheWVyIDIgZGF0YSAqLworCXZvaWQgKmwzb3B0OwkJLyogb3B0aW9uYWwgbGF5ZXIgMyBkYXRhICovCisJdm9pZCAqbDRvcHQ7CQkvKiBvcHRpb25hbCBsYXllciA0IGRhdGEgKi8KKwl2b2lkICp1bHA7CQkvKiB1bHAgc3R1ZmYgKi8KK307CisKKyNlbmRpZgkJCQkvKiBfVDNDREVWX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jeGdiMy92ZXJzaW9uLmggYi9kcml2ZXJzL25ldC9jeGdiMy92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2N2RkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2N4Z2IzL3ZlcnNpb24uaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKy8qICREYXRlOiAyMDA2LzEwLzMxIDE4OjU3OjUxICQgJFJDU2ZpbGU6IHZlcnNpb24uaCx2ICQgJFJldmlzaW9uOiAxLjMgJCAqLworI2lmbmRlZiBfX0NIRUxTSU9fVkVSU0lPTl9ICisjZGVmaW5lIF9fQ0hFTFNJT19WRVJTSU9OX0gKKyNkZWZpbmUgRFJWX0RFU0MgIkNoZWxzaW8gVDMgTmV0d29yayBEcml2ZXIiCisjZGVmaW5lIERSVl9OQU1FICJjeGdiMyIKKy8qIERyaXZlciB2ZXJzaW9uICovCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjAiCisjZW5kaWYJCQkJLyogX19DSEVMU0lPX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY3hnYjMvdnNjODIxMS5jIGIvZHJpdmVycy9uZXQvY3hnYjMvdnNjODIxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZTQyODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy92c2M4MjExLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBDaGVsc2lvLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorCisvKiBWU0M4MjExIFBIWSBzcGVjaWZpYyByZWdpc3RlcnMuICovCitlbnVtIHsKKwlWU0M4MjExX0lOVFJfRU5BQkxFID0gMjUsCisJVlNDODIxMV9JTlRSX1NUQVRVUyA9IDI2LAorCVZTQzgyMTFfQVVYX0NUUkxfU1RBVCA9IDI4LAorfTsKKworZW51bSB7CisJVlNDX0lOVFJfUlhfRVJSID0gMSA8PCAwLAorCVZTQ19JTlRSX01TX0VSUiA9IDEgPDwgMSwJLyogbWFzdGVyL3NsYXZlIHJlc29sdXRpb24gZXJyb3IgKi8KKwlWU0NfSU5UUl9DQUJMRSA9IDEgPDwgMiwJLyogY2FibGUgaW1wYWlybWVudCAqLworCVZTQ19JTlRSX0ZBTFNFX0NBUlIgPSAxIDw8IDMsCS8qIGZhbHNlIGNhcnJpZXIgKi8KKwlWU0NfSU5UUl9NRURJQV9DSEcgPSAxIDw8IDQsCS8qIEFNUyBtZWRpYSBjaGFuZ2UgKi8KKwlWU0NfSU5UUl9SWF9GSUZPID0gMSA8PCA1LAkvKiBSeCBGSUZPIG92ZXIvdW5kZXJmbG93ICovCisJVlNDX0lOVFJfVFhfRklGTyA9IDEgPDwgNiwJLyogVHggRklGTyBvdmVyL3VuZGVyZmxvdyAqLworCVZTQ19JTlRSX0RFU0NSQU1CTCA9IDEgPDwgNywJLyogZGVzY3JhbWJsZXIgbG9jay1sb3N0ICovCisJVlNDX0lOVFJfU1lNQk9MX0VSUiA9IDEgPDwgOCwJLyogc3ltYm9sIGVycm9yICovCisJVlNDX0lOVFJfTkVHX0RPTkUgPSAxIDw8IDEwLAkvKiBhdXRvbmVnIGRvbmUgKi8KKwlWU0NfSU5UUl9ORUdfRVJSID0gMSA8PCAxMSwJLyogYXV0b25lZyBlcnJvciAqLworCVZTQ19JTlRSX0xJTktfQ0hHID0gMSA8PCAxMywJLyogbGluayBjaGFuZ2UgKi8KKwlWU0NfSU5UUl9FTkFCTEUgPSAxIDw8IDE1LAkvKiBpbnRlcnJ1cHQgZW5hYmxlICovCit9OworCisjZGVmaW5lIENGR19DSEdfSU5UUl9NQVNLIChWU0NfSU5UUl9MSU5LX0NIRyB8IFZTQ19JTlRSX05FR19FUlIgfCBcCisJIAkJICAgVlNDX0lOVFJfTkVHX0RPTkUpCisjZGVmaW5lIElOVFJfTUFTSyAoQ0ZHX0NIR19JTlRSX01BU0sgfCBWU0NfSU5UUl9UWF9GSUZPIHwgVlNDX0lOVFJfUlhfRklGTyB8IFwKKwkJICAgVlNDX0lOVFJfRU5BQkxFKQorCisvKiBQSFkgc3BlY2lmaWMgYXV4aWxpYXJ5IGNvbnRyb2wgJiBzdGF0dXMgcmVnaXN0ZXIgZmllbGRzICovCisjZGVmaW5lIFNfQUNTUl9BQ1RJUEhZX1RNUiAgICAwCisjZGVmaW5lIE1fQUNTUl9BQ1RJUEhZX1RNUiAgICAweDMKKyNkZWZpbmUgVl9BQ1NSX0FDVElQSFlfVE1SKHgpICgoeCkgPDwgU19BQ1NSX0FDVElQSFlfVE1SKQorCisjZGVmaW5lIFNfQUNTUl9TUEVFRCAgICAzCisjZGVmaW5lIE1fQUNTUl9TUEVFRCAgICAweDMKKyNkZWZpbmUgR19BQ1NSX1NQRUVEKHgpICgoKHgpID4+IFNfQUNTUl9TUEVFRCkgJiBNX0FDU1JfU1BFRUQpCisKKyNkZWZpbmUgU19BQ1NSX0RVUExFWCA1CisjZGVmaW5lIEZfQUNTUl9EVVBMRVggKDEgPDwgU19BQ1NSX0RVUExFWCkKKworI2RlZmluZSBTX0FDU1JfQUNUSVBIWSA2CisjZGVmaW5lIEZfQUNTUl9BQ1RJUEhZICgxIDw8IFNfQUNTUl9BQ1RJUEhZKQorCisvKgorICogUmVzZXQgdGhlIFBIWS4gIFRoaXMgUEhZIGNvbXBsZXRlcyByZXNldCBpbW1lZGlhdGVseSBzbyB3ZSBuZXZlciB3YWl0LgorICovCitzdGF0aWMgaW50IHZzYzgyMTFfcmVzZXQoc3RydWN0IGNwaHkgKmNwaHksIGludCB3YWl0KQoreworCXJldHVybiB0M19waHlfcmVzZXQoY3BoeSwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdnNjODIxMV9pbnRyX2VuYWJsZShzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwlyZXR1cm4gbWRpb193cml0ZShjcGh5LCAwLCBWU0M4MjExX0lOVFJfRU5BQkxFLCBJTlRSX01BU0spOworfQorCitzdGF0aWMgaW50IHZzYzgyMTFfaW50cl9kaXNhYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCXJldHVybiBtZGlvX3dyaXRlKGNwaHksIDAsIFZTQzgyMTFfSU5UUl9FTkFCTEUsIDApOworfQorCitzdGF0aWMgaW50IHZzYzgyMTFfaW50cl9jbGVhcihzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwl1MzIgdmFsOworCisJLyogQ2xlYXIgUEhZIGludGVycnVwdHMgYnkgcmVhZGluZyB0aGUgcmVnaXN0ZXIuICovCisJcmV0dXJuIG1kaW9fcmVhZChjcGh5LCAwLCBWU0M4MjExX0lOVFJfU1RBVFVTLCAmdmFsKTsKK30KKworc3RhdGljIGludCB2c2M4MjExX2F1dG9uZWdfZW5hYmxlKHN0cnVjdCBjcGh5ICpjcGh5KQoreworCXJldHVybiB0M19tZGlvX2NoYW5nZV9iaXRzKGNwaHksIDAsIE1JSV9CTUNSLCBCTUNSX1BET1dOIHwgQk1DUl9JU09MQVRFLAorCQkJCSAgIEJNQ1JfQU5FTkFCTEUgfCBCTUNSX0FOUkVTVEFSVCk7Cit9CisKK3N0YXRpYyBpbnQgdnNjODIxMV9hdXRvbmVnX3Jlc3RhcnQoc3RydWN0IGNwaHkgKmNwaHkpCit7CisJcmV0dXJuIHQzX21kaW9fY2hhbmdlX2JpdHMoY3BoeSwgMCwgTUlJX0JNQ1IsIEJNQ1JfUERPV04gfCBCTUNSX0lTT0xBVEUsCisJCQkJICAgQk1DUl9BTlJFU1RBUlQpOworfQorCitzdGF0aWMgaW50IHZzYzgyMTFfZ2V0X2xpbmtfc3RhdHVzKHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgKmxpbmtfb2ssCisJCQkJICAgaW50ICpzcGVlZCwgaW50ICpkdXBsZXgsIGludCAqZmMpCit7CisJdW5zaWduZWQgaW50IGJtY3IsIHN0YXR1cywgbHBhLCBhZHY7CisJaW50IGVyciwgc3AgPSAtMSwgZHBseCA9IC0xLCBwYXVzZSA9IDA7CisKKwllcnIgPSBtZGlvX3JlYWQoY3BoeSwgMCwgTUlJX0JNQ1IsICZibWNyKTsKKwlpZiAoIWVycikKKwkJZXJyID0gbWRpb19yZWFkKGNwaHksIDAsIE1JSV9CTVNSLCAmc3RhdHVzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGxpbmtfb2spIHsKKwkJLyoKKwkJICogQk1TUl9MU1RBVFVTIGlzIGxhdGNoLWxvdywgc28gaWYgaXQgaXMgMCB3ZSBuZWVkIHRvIHJlYWQgaXQKKwkJICogb25jZSBtb3JlIHRvIGdldCB0aGUgY3VycmVudCBsaW5rIHN0YXRlLgorCQkgKi8KKwkJaWYgKCEoc3RhdHVzICYgQk1TUl9MU1RBVFVTKSkKKwkJCWVyciA9IG1kaW9fcmVhZChjcGh5LCAwLCBNSUlfQk1TUiwgJnN0YXR1cyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkqbGlua19vayA9IChzdGF0dXMgJiBCTVNSX0xTVEFUVVMpICE9IDA7CisJfQorCWlmICghKGJtY3IgJiBCTUNSX0FORU5BQkxFKSkgeworCQlkcGx4ID0gKGJtY3IgJiBCTUNSX0ZVTExEUExYKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJCWlmIChibWNyICYgQk1DUl9TUEVFRDEwMDApCisJCQlzcCA9IFNQRUVEXzEwMDA7CisJCWVsc2UgaWYgKGJtY3IgJiBCTUNSX1NQRUVEMTAwKQorCQkJc3AgPSBTUEVFRF8xMDA7CisJCWVsc2UKKwkJCXNwID0gU1BFRURfMTA7CisJfSBlbHNlIGlmIChzdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkgeworCQllcnIgPSBtZGlvX3JlYWQoY3BoeSwgMCwgVlNDODIxMV9BVVhfQ1RSTF9TVEFULCAmc3RhdHVzKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZHBseCA9IChzdGF0dXMgJiBGX0FDU1JfRFVQTEVYKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJCXNwID0gR19BQ1NSX1NQRUVEKHN0YXR1cyk7CisJCWlmIChzcCA9PSAwKQorCQkJc3AgPSBTUEVFRF8xMDsKKwkJZWxzZSBpZiAoc3AgPT0gMSkKKwkJCXNwID0gU1BFRURfMTAwOworCQllbHNlCisJCQlzcCA9IFNQRUVEXzEwMDA7CisKKwkJaWYgKGZjICYmIGRwbHggPT0gRFVQTEVYX0ZVTEwpIHsKKwkJCWVyciA9IG1kaW9fcmVhZChjcGh5LCAwLCBNSUlfTFBBLCAmbHBhKTsKKwkJCWlmICghZXJyKQorCQkJCWVyciA9IG1kaW9fcmVhZChjcGh5LCAwLCBNSUlfQURWRVJUSVNFLCAmYWR2KTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKworCQkJaWYgKGxwYSAmIGFkdiAmIEFEVkVSVElTRV9QQVVTRV9DQVApCisJCQkJcGF1c2UgPSBQQVVTRV9SWCB8IFBBVVNFX1RYOworCQkJZWxzZSBpZiAoKGxwYSAmIEFEVkVSVElTRV9QQVVTRV9DQVApICYmCisJCQkJIChscGEgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgJiYKKwkJCQkgKGFkdiAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSkKKwkJCQlwYXVzZSA9IFBBVVNFX1RYOworCQkJZWxzZSBpZiAoKGxwYSAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKSAmJgorCQkJCSAoYWR2ICYgQURWRVJUSVNFX1BBVVNFX0NBUCkpCisJCQkJcGF1c2UgPSBQQVVTRV9SWDsKKwkJfQorCX0KKwlpZiAoc3BlZWQpCisJCSpzcGVlZCA9IHNwOworCWlmIChkdXBsZXgpCisJCSpkdXBsZXggPSBkcGx4OworCWlmIChmYykKKwkJKmZjID0gcGF1c2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnNjODIxMV9wb3dlcl9kb3duKHN0cnVjdCBjcGh5ICpjcGh5LCBpbnQgZW5hYmxlKQoreworCXJldHVybiB0M19tZGlvX2NoYW5nZV9iaXRzKGNwaHksIDAsIE1JSV9CTUNSLCBCTUNSX1BET1dOLAorCQkJCSAgIGVuYWJsZSA/IEJNQ1JfUERPV04gOiAwKTsKK30KKworc3RhdGljIGludCB2c2M4MjExX2ludHJfaGFuZGxlcihzdHJ1Y3QgY3BoeSAqY3BoeSkKK3sKKwl1bnNpZ25lZCBpbnQgY2F1c2U7CisJaW50IGVyciwgY3BoeV9jYXVzZSA9IDA7CisKKwllcnIgPSBtZGlvX3JlYWQoY3BoeSwgMCwgVlNDODIxMV9JTlRSX1NUQVRVUywgJmNhdXNlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJY2F1c2UgJj0gSU5UUl9NQVNLOworCWlmIChjYXVzZSAmIENGR19DSEdfSU5UUl9NQVNLKQorCQljcGh5X2NhdXNlIHw9IGNwaHlfY2F1c2VfbGlua19jaGFuZ2U7CisJaWYgKGNhdXNlICYgKFZTQ19JTlRSX1JYX0ZJRk8gfCBWU0NfSU5UUl9UWF9GSUZPKSkKKwkJY3BoeV9jYXVzZSB8PSBjcGh5X2NhdXNlX2ZpZm9fZXJyb3I7CisJcmV0dXJuIGNwaHlfY2F1c2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3BoeV9vcHMgdnNjODIxMV9vcHMgPSB7CisJLnJlc2V0ID0gdnNjODIxMV9yZXNldCwKKwkuaW50cl9lbmFibGUgPSB2c2M4MjExX2ludHJfZW5hYmxlLAorCS5pbnRyX2Rpc2FibGUgPSB2c2M4MjExX2ludHJfZGlzYWJsZSwKKwkuaW50cl9jbGVhciA9IHZzYzgyMTFfaW50cl9jbGVhciwKKwkuaW50cl9oYW5kbGVyID0gdnNjODIxMV9pbnRyX2hhbmRsZXIsCisJLmF1dG9uZWdfZW5hYmxlID0gdnNjODIxMV9hdXRvbmVnX2VuYWJsZSwKKwkuYXV0b25lZ19yZXN0YXJ0ID0gdnNjODIxMV9hdXRvbmVnX3Jlc3RhcnQsCisJLmFkdmVydGlzZSA9IHQzX3BoeV9hZHZlcnRpc2UsCisJLnNldF9zcGVlZF9kdXBsZXggPSB0M19zZXRfcGh5X3NwZWVkX2R1cGxleCwKKwkuZ2V0X2xpbmtfc3RhdHVzID0gdnNjODIxMV9nZXRfbGlua19zdGF0dXMsCisJLnBvd2VyX2Rvd24gPSB2c2M4MjExX3Bvd2VyX2Rvd24sCit9OworCit2b2lkIHQzX3ZzYzgyMTFfcGh5X3ByZXAoc3RydWN0IGNwaHkgKnBoeSwgc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgaW50IHBoeV9hZGRyLCBjb25zdCBzdHJ1Y3QgbWRpb19vcHMgKm1kaW9fb3BzKQoreworCWNwaHlfaW5pdChwaHksIGFkYXB0ZXIsIHBoeV9hZGRyLCAmdnNjODIxMV9vcHMsIG1kaW9fb3BzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2N4Z2IzL3hnbWFjLmMgYi9kcml2ZXJzL25ldC9jeGdiMy94Z21hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwN2EyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jeGdiMy94Z21hYy5jCkBAIC0wLDAgKzEsNDA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQ2hlbHNpbywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJyZWdzLmgiCisKKy8qCisgKiAjIG9mIGV4YWN0IGFkZHJlc3MgZmlsdGVycy4gIFRoZSBmaXJzdCBvbmUgaXMgdXNlZCBmb3IgdGhlIHN0YXRpb24gYWRkcmVzcywKKyAqIHRoZSByZXN0IGFyZSBhdmFpbGFibGUgZm9yIG11bHRpY2FzdCBhZGRyZXNzZXMuCisgKi8KKyNkZWZpbmUgRVhBQ1RfQUREUl9GSUxURVJTIDgKKworc3RhdGljIGlubGluZSBpbnQgbWFjaWR4KGNvbnN0IHN0cnVjdCBjbWFjICptYWMpCit7CisJcmV0dXJuIG1hYy0+b2Zmc2V0IC8gKFhHTUFDMF8xX0JBU0VfQUREUiAtIFhHTUFDMF8wX0JBU0VfQUREUik7Cit9CisKK3N0YXRpYyB2b2lkIHhhdWlfc2VyZGVzX3Jlc2V0KHN0cnVjdCBjbWFjICptYWMpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjbGVhcltdID0geworCQlGX1BXUkROMCB8IEZfUFdSRE4xLCBGX1JFU0VUUExMMDEsIEZfUkVTRVQwIHwgRl9SRVNFVDEsCisJCUZfUFdSRE4yIHwgRl9QV1JETjMsIEZfUkVTRVRQTEwyMywgRl9SRVNFVDIgfCBGX1JFU0VUMworCX07CisKKwlpbnQgaTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG1hYy0+YWRhcHRlcjsKKwl1MzIgY3RybCA9IEFfWEdNX1NFUkRFU19DVFJMMCArIG1hYy0+b2Zmc2V0OworCisJdDNfd3JpdGVfcmVnKGFkYXAsIGN0cmwsIGFkYXAtPnBhcmFtcy52cGQueGF1aWNmZ1ttYWNpZHgobWFjKV0gfAorCQkgICAgIEZfUkVTRVQzIHwgRl9SRVNFVDIgfCBGX1JFU0VUMSB8IEZfUkVTRVQwIHwKKwkJICAgICBGX1BXUkROMyB8IEZfUFdSRE4yIHwgRl9QV1JETjEgfCBGX1BXUkROMCB8CisJCSAgICAgRl9SRVNFVFBMTDIzIHwgRl9SRVNFVFBMTDAxKTsKKwl0M19yZWFkX3JlZyhhZGFwLCBjdHJsKTsKKwl1ZGVsYXkoMTUpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xlYXIpOyBpKyspIHsKKwkJdDNfc2V0X3JlZ19maWVsZChhZGFwLCBjdHJsLCBjbGVhcltpXSwgMCk7CisJCXVkZWxheSgxNSk7CisJfQorfQorCit2b2lkIHQzYl9wY3NfcmVzZXQoc3RydWN0IGNtYWMgKm1hYykKK3sKKwl0M19zZXRfcmVnX2ZpZWxkKG1hYy0+YWRhcHRlciwgQV9YR01fUkVTRVRfQ1RSTCArIG1hYy0+b2Zmc2V0LAorCQkJIEZfUENTX1JFU0VUXywgMCk7CisJdWRlbGF5KDIwKTsKKwl0M19zZXRfcmVnX2ZpZWxkKG1hYy0+YWRhcHRlciwgQV9YR01fUkVTRVRfQ1RSTCArIG1hYy0+b2Zmc2V0LCAwLAorCQkJIEZfUENTX1JFU0VUXyk7Cit9CisKK2ludCB0M19tYWNfcmVzZXQoc3RydWN0IGNtYWMgKm1hYykKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJfdmFsX3BhaXIgbWFjX3Jlc2V0X2F2cFtdID0geworCQl7QV9YR01fVFhfQ1RSTCwgMH0sCisJCXtBX1hHTV9SWF9DVFJMLCAwfSwKKwkJe0FfWEdNX1JYX0NGRywgRl9ESVNQQVVTRUZSQU1FUyB8IEZfRU4xNTM2QkZSQU1FUyB8CisJCSBGX1JNRkNTIHwgRl9FTkpVTUJPIHwgRl9FTkhBU0hNQ0FTVH0sCisJCXtBX1hHTV9SWF9IQVNIX0xPVywgMH0sCisJCXtBX1hHTV9SWF9IQVNIX0hJR0gsIDB9LAorCQl7QV9YR01fUlhfRVhBQ1RfTUFUQ0hfTE9XXzEsIDB9LAorCQl7QV9YR01fUlhfRVhBQ1RfTUFUQ0hfTE9XXzIsIDB9LAorCQl7QV9YR01fUlhfRVhBQ1RfTUFUQ0hfTE9XXzMsIDB9LAorCQl7QV9YR01fUlhfRVhBQ1RfTUFUQ0hfTE9XXzQsIDB9LAorCQl7QV9YR01fUlhfRVhBQ1RfTUFUQ0hfTE9XXzUsIDB9LAorCQl7QV9YR01fUlhfRVhBQ1RfTUFUQ0hfTE9XXzYsIDB9LAorCQl7QV9YR01fUlhfRVhBQ1RfTUFUQ0hfTE9XXzcsIDB9LAorCQl7QV9YR01fUlhfRVhBQ1RfTUFUQ0hfTE9XXzgsIDB9LAorCQl7QV9YR01fU1RBVF9DVFJMLCBGX0NMUlNUQVRTfQorCX07CisJdTMyIHZhbDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG1hYy0+YWRhcHRlcjsKKwl1bnNpZ25lZCBpbnQgb2Z0ID0gbWFjLT5vZmZzZXQ7CisKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9YR01fUkVTRVRfQ1RSTCArIG9mdCwgRl9NQUNfUkVTRVRfKTsKKwl0M19yZWFkX3JlZyhhZGFwLCBBX1hHTV9SRVNFVF9DVFJMICsgb2Z0KTsJLyogZmx1c2ggKi8KKworCXQzX3dyaXRlX3JlZ3MoYWRhcCwgbWFjX3Jlc2V0X2F2cCwgQVJSQVlfU0laRShtYWNfcmVzZXRfYXZwKSwgb2Z0KTsKKwl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfWEdNX1JYRklGT19DRkcgKyBvZnQsCisJCQkgRl9SWFNUUkZSV1JEIHwgRl9ESVNFUlJGUkFNRVMsCisJCQkgdXNlc194YXVpKGFkYXApID8gMCA6IEZfUlhTVFJGUldSRCk7CisKKwlpZiAodXNlc194YXVpKGFkYXApKSB7CisJCWlmIChhZGFwLT5wYXJhbXMucmV2ID09IDApIHsKKwkJCXQzX3NldF9yZWdfZmllbGQoYWRhcCwgQV9YR01fU0VSREVTX0NUUkwgKyBvZnQsIDAsCisJCQkJCSBGX1JYRU5BQkxFIHwgRl9UWEVOQUJMRSk7CisJCQlpZiAodDNfd2FpdF9vcF9kb25lKGFkYXAsIEFfWEdNX1NFUkRFU19TVEFUVVMxICsgb2Z0LAorCQkJCQkgICAgRl9DTVVMT0NLLCAxLCA1LCAyKSkgeworCQkJCUNIX0VSUihhZGFwLAorCQkJCSAgICAgICAiTUFDICVkIFhBVUkgU0VSREVTIENNVSBsb2NrIGZhaWxlZFxuIiwKKwkJCQkgICAgICAgbWFjaWR4KG1hYykpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXQzX3NldF9yZWdfZmllbGQoYWRhcCwgQV9YR01fU0VSREVTX0NUUkwgKyBvZnQsIDAsCisJCQkJCSBGX1NFUkRFU1JFU0VUXyk7CisJCX0gZWxzZQorCQkJeGF1aV9zZXJkZXNfcmVzZXQobWFjKTsKKwl9CisKKwlpZiAoYWRhcC0+cGFyYW1zLnJldiA+IDApCisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1hHTV9QQVVTRV9USU1FUiArIG9mdCwgMHhmMDAwKTsKKworCXZhbCA9IEZfTUFDX1JFU0VUXzsKKwlpZiAoaXNfMTBHKGFkYXApKQorCQl2YWwgfD0gRl9QQ1NfUkVTRVRfOworCWVsc2UgaWYgKHVzZXNfeGF1aShhZGFwKSkKKwkJdmFsIHw9IEZfUENTX1JFU0VUXyB8IEZfWEcyR19SRVNFVF87CisJZWxzZQorCQl2YWwgfD0gRl9SR01JSV9SRVNFVF8gfCBGX1hHMkdfUkVTRVRfOworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1hHTV9SRVNFVF9DVFJMICsgb2Z0LCB2YWwpOworCXQzX3JlYWRfcmVnKGFkYXAsIEFfWEdNX1JFU0VUX0NUUkwgKyBvZnQpOwkvKiBmbHVzaCAqLworCWlmICgodmFsICYgRl9QQ1NfUkVTRVRfKSAmJiBhZGFwLT5wYXJhbXMucmV2KSB7CisJCW1zbGVlcCgxKTsKKwkJdDNiX3Bjc19yZXNldChtYWMpOworCX0KKworCW1lbXNldCgmbWFjLT5zdGF0cywgMCwgc2l6ZW9mKG1hYy0+c3RhdHMpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgZXhhY3QgbWF0Y2ggcmVnaXN0ZXIgJ2lkeCcgdG8gcmVjb2duaXplIHRoZSBnaXZlbiBFdGhlcm5ldCBhZGRyZXNzLgorICovCitzdGF0aWMgdm9pZCBzZXRfYWRkcl9maWx0ZXIoc3RydWN0IGNtYWMgKm1hYywgaW50IGlkeCwgY29uc3QgdTggKiBhZGRyKQoreworCXUzMiBhZGRyX2xvLCBhZGRyX2hpOworCXVuc2lnbmVkIGludCBvZnQgPSBtYWMtPm9mZnNldCArIGlkeCAqIDg7CisKKwlhZGRyX2xvID0gKGFkZHJbM10gPDwgMjQpIHwgKGFkZHJbMl0gPDwgMTYpIHwgKGFkZHJbMV0gPDwgOCkgfCBhZGRyWzBdOworCWFkZHJfaGkgPSAoYWRkcls1XSA8PCA4KSB8IGFkZHJbNF07CisKKwl0M193cml0ZV9yZWcobWFjLT5hZGFwdGVyLCBBX1hHTV9SWF9FWEFDVF9NQVRDSF9MT1dfMSArIG9mdCwgYWRkcl9sbyk7CisJdDNfd3JpdGVfcmVnKG1hYy0+YWRhcHRlciwgQV9YR01fUlhfRVhBQ1RfTUFUQ0hfSElHSF8xICsgb2Z0LCBhZGRyX2hpKTsKK30KKworLyogU2V0IG9uZSBvZiB0aGUgc3RhdGlvbidzIHVuaWNhc3QgTUFDIGFkZHJlc3Nlcy4gKi8KK2ludCB0M19tYWNfc2V0X2FkZHJlc3Moc3RydWN0IGNtYWMgKm1hYywgdW5zaWduZWQgaW50IGlkeCwgdTggYWRkcls2XSkKK3sKKwlpZiAoaWR4ID49IG1hYy0+bnVjYXN0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzZXRfYWRkcl9maWx0ZXIobWFjLCBpZHgsIGFkZHIpOworCXJldHVybiAwOworfQorCisvKgorICogU3BlY2lmeSB0aGUgbnVtYmVyIG9mIGV4YWN0IGFkZHJlc3MgZmlsdGVycyB0aGF0IHNob3VsZCBiZSByZXNlcnZlZCBmb3IKKyAqIHVuaWNhc3QgYWRkcmVzc2VzLiAgQ2FsbGVyIHNob3VsZCByZWxvYWQgdGhlIHVuaWNhc3QgYW5kIG11bHRpY2FzdCBhZGRyZXNzZXMKKyAqIGFmdGVyIGNhbGxpbmcgdGhpcy4KKyAqLworaW50IHQzX21hY19zZXRfbnVtX3VjYXN0KHN0cnVjdCBjbWFjICptYWMsIGludCBuKQoreworCWlmIChuID4gRVhBQ1RfQUREUl9GSUxURVJTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltYWMtPm51Y2FzdCA9IG47CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGN1bGF0ZSB0aGUgUlggaGFzaCBmaWx0ZXIgaW5kZXggb2YgYW4gRXRoZXJuZXQgYWRkcmVzcyAqLworc3RhdGljIGludCBoYXNoX2h3X2FkZHIoY29uc3QgdTggKiBhZGRyKQoreworCWludCBoYXNoID0gMCwgb2N0ZXQsIGJpdCwgaSA9IDAsIGM7CisKKwlmb3IgKG9jdGV0ID0gMDsgb2N0ZXQgPCA2OyArK29jdGV0KQorCQlmb3IgKGMgPSBhZGRyW29jdGV0XSwgYml0ID0gMDsgYml0IDwgODsgYyA+Pj0gMSwgKytiaXQpIHsKKwkJCWhhc2ggXj0gKGMgJiAxKSA8PCBpOworCQkJaWYgKCsraSA9PSA2KQorCQkJCWkgPSAwOworCQl9CisJcmV0dXJuIGhhc2g7Cit9CisKK2ludCB0M19tYWNfc2V0X3J4X21vZGUoc3RydWN0IGNtYWMgKm1hYywgc3RydWN0IHQzX3J4X21vZGUgKnJtKQoreworCXUzMiB2YWwsIGhhc2hfbG8sIGhhc2hfaGk7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBtYWMtPmFkYXB0ZXI7CisJdW5zaWduZWQgaW50IG9mdCA9IG1hYy0+b2Zmc2V0OworCisJdmFsID0gdDNfcmVhZF9yZWcoYWRhcCwgQV9YR01fUlhfQ0ZHICsgb2Z0KSAmIH5GX0NPUFlBTExGUkFNRVM7CisJaWYgKHJtLT5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCXZhbCB8PSBGX0NPUFlBTExGUkFNRVM7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfWEdNX1JYX0NGRyArIG9mdCwgdmFsKTsKKworCWlmIChybS0+ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKKwkJaGFzaF9sbyA9IGhhc2hfaGkgPSAweGZmZmZmZmZmOworCWVsc2UgeworCQl1OCAqYWRkcjsKKwkJaW50IGV4YWN0X2FkZHJfaWR4ID0gbWFjLT5udWNhc3Q7CisKKwkJaGFzaF9sbyA9IGhhc2hfaGkgPSAwOworCQl3aGlsZSAoKGFkZHIgPSB0M19nZXRfbmV4dF9tY2FkZHIocm0pKSkKKwkJCWlmIChleGFjdF9hZGRyX2lkeCA8IEVYQUNUX0FERFJfRklMVEVSUykKKwkJCQlzZXRfYWRkcl9maWx0ZXIobWFjLCBleGFjdF9hZGRyX2lkeCsrLCBhZGRyKTsKKwkJCWVsc2UgeworCQkJCWludCBoYXNoID0gaGFzaF9od19hZGRyKGFkZHIpOworCisJCQkJaWYgKGhhc2ggPCAzMikKKwkJCQkJaGFzaF9sbyB8PSAoMSA8PCBoYXNoKTsKKwkJCQllbHNlCisJCQkJCWhhc2hfaGkgfD0gKDEgPDwgKGhhc2ggLSAzMikpOworCQkJfQorCX0KKworCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1hHTV9SWF9IQVNIX0xPVyArIG9mdCwgaGFzaF9sbyk7CisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfWEdNX1JYX0hBU0hfSElHSCArIG9mdCwgaGFzaF9oaSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB0M19tYWNfc2V0X210dShzdHJ1Y3QgY21hYyAqbWFjLCB1bnNpZ25lZCBpbnQgbXR1KQoreworCWludCBod20sIGx3bTsKKwl1bnNpZ25lZCBpbnQgdGhyZXMsIHY7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBtYWMtPmFkYXB0ZXI7CisKKwkvKgorCSAqIE1BWF9GUkFNRV9TSVpFIGlubHVkZXMgaGVhZGVyICsgRkNTLCBtdHUgZG9lc24ndC4gIFRoZSBIVyBtYXgKKwkgKiBwYWNrZXQgc2l6ZSByZWdpc3RlciBpbmNsdWRlcyBoZWFkZXIsIGJ1dCBub3QgRkNTLgorCSAqLworCW10dSArPSAxNDsKKwlpZiAobXR1ID4gTUFYX0ZSQU1FX1NJWkUgLSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9YR01fUlhfTUFYX1BLVF9TSVpFICsgbWFjLT5vZmZzZXQsIG10dSk7CisKKwkvKgorCSAqIEFkanVzdCB0aGUgUEFVU0UgZnJhbWUgd2F0ZXJtYXJrcy4gIFdlIGFsd2F5cyBzZXQgdGhlIExXTSwgYW5kIHRoZQorCSAqIEhXTSBvbmx5IGlmIGZsb3ctY29udHJvbCBpcyBlbmFibGVkLgorCSAqLworCWh3bSA9IG1heChNQUNfUlhGSUZPX1NJWkUgLSAzICogbXR1LCBNQUNfUlhGSUZPX1NJWkUgLyAyVSk7CisJaHdtID0gbWluKGh3bSwgMyAqIE1BQ19SWEZJRk9fU0laRSAvIDQgKyAxMDI0KTsKKwlsd20gPSBod20gLSAxMDI0OworCXYgPSB0M19yZWFkX3JlZyhhZGFwLCBBX1hHTV9SWEZJRk9fQ0ZHICsgbWFjLT5vZmZzZXQpOworCXYgJj0gflZfUlhGSUZPUEFVU0VMV00oTV9SWEZJRk9QQVVTRUxXTSk7CisJdiB8PSBWX1JYRklGT1BBVVNFTFdNKGx3bSAvIDgpOworCWlmIChHX1JYRklGT1BBVVNFSFdNKHYpKQorCQl2ID0gKHYgJiB+Vl9SWEZJRk9QQVVTRUhXTShNX1JYRklGT1BBVVNFSFdNKSkgfAorCQkgICAgVl9SWEZJRk9QQVVTRUhXTShod20gLyA4KTsKKwl0M193cml0ZV9yZWcoYWRhcCwgQV9YR01fUlhGSUZPX0NGRyArIG1hYy0+b2Zmc2V0LCB2KTsKKworCS8qIEFkanVzdCB0aGUgVFggRklGTyB0aHJlc2hvbGQgYmFzZWQgb24gdGhlIE1UVSAqLworCXRocmVzID0gKGFkYXAtPnBhcmFtcy52cGQuY2NsayAqIDEwMDApIC8gMTU2MjU7CisJdGhyZXMgPSAodGhyZXMgKiBtdHUpIC8gMTAwMDsKKwlpZiAoaXNfMTBHKGFkYXApKQorCQl0aHJlcyAvPSAxMDsKKwl0aHJlcyA9IG10dSA+IHRocmVzID8gKG10dSAtIHRocmVzICsgNykgLyA4IDogMDsKKwl0aHJlcyA9IG1heCh0aHJlcywgOFUpOwkvKiBuZWVkIGF0IGxlYXN0IDggKi8KKwl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfWEdNX1RYRklGT19DRkcgKyBtYWMtPm9mZnNldCwKKwkJCSBWX1RYRklGT1RIUkVTSChNX1RYRklGT1RIUkVTSCksIFZfVFhGSUZPVEhSRVNIKHRocmVzKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB0M19tYWNfc2V0X3NwZWVkX2R1cGxleF9mYyhzdHJ1Y3QgY21hYyAqbWFjLCBpbnQgc3BlZWQsIGludCBkdXBsZXgsIGludCBmYykKK3sKKwl1MzIgdmFsOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gbWFjLT5hZGFwdGVyOworCXVuc2lnbmVkIGludCBvZnQgPSBtYWMtPm9mZnNldDsKKworCWlmIChkdXBsZXggPj0gMCAmJiBkdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzcGVlZCA+PSAwKSB7CisJCWlmIChzcGVlZCA9PSBTUEVFRF8xMCkKKwkJCXZhbCA9IFZfUE9SVFNQRUVEKDApOworCQllbHNlIGlmIChzcGVlZCA9PSBTUEVFRF8xMDApCisJCQl2YWwgPSBWX1BPUlRTUEVFRCgxKTsKKwkJZWxzZSBpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJCXZhbCA9IFZfUE9SVFNQRUVEKDIpOworCQllbHNlIGlmIChzcGVlZCA9PSBTUEVFRF8xMDAwMCkKKwkJCXZhbCA9IFZfUE9SVFNQRUVEKDMpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfWEdNX1BPUlRfQ0ZHICsgb2Z0LAorCQkJCSBWX1BPUlRTUEVFRChNX1BPUlRTUEVFRCksIHZhbCk7CisJfQorCisJdmFsID0gdDNfcmVhZF9yZWcoYWRhcCwgQV9YR01fUlhGSUZPX0NGRyArIG9mdCk7CisJdmFsICY9IH5WX1JYRklGT1BBVVNFSFdNKE1fUlhGSUZPUEFVU0VIV00pOworCWlmIChmYyAmIFBBVVNFX1RYKQorCQl2YWwgfD0gVl9SWEZJRk9QQVVTRUhXTShHX1JYRklGT1BBVVNFTFdNKHZhbCkgKyAxMjgpOwkvKiArMUtCICovCisJdDNfd3JpdGVfcmVnKGFkYXAsIEFfWEdNX1JYRklGT19DRkcgKyBvZnQsIHZhbCk7CisKKwl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfWEdNX1RYX0NGRyArIG9mdCwgRl9UWFBBVVNFRU4sCisJCQkgKGZjICYgUEFVU0VfUlgpID8gRl9UWFBBVVNFRU4gOiAwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHQzX21hY19lbmFibGUoc3RydWN0IGNtYWMgKm1hYywgaW50IHdoaWNoKQoreworCWludCBpZHggPSBtYWNpZHgobWFjKTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG1hYy0+YWRhcHRlcjsKKwl1bnNpZ25lZCBpbnQgb2Z0ID0gbWFjLT5vZmZzZXQ7CisKKwlpZiAod2hpY2ggJiBNQUNfRElSRUNUSU9OX1RYKSB7CisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1hHTV9UWF9DVFJMICsgb2Z0LCBGX1RYRU4pOworCQl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9QSU9fQUREUiwgQV9UUF9UWF9EUk9QX0NGR19DSDAgKyBpZHgpOworCQl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9QSU9fREFUQSwgMHhiZjAwMDAwMSk7CisJCXQzX3dyaXRlX3JlZyhhZGFwLCBBX1RQX1BJT19BRERSLCBBX1RQX1RYX0RST1BfTU9ERSk7CisJCXQzX3NldF9yZWdfZmllbGQoYWRhcCwgQV9UUF9QSU9fREFUQSwgMSA8PCBpZHgsIDEgPDwgaWR4KTsKKwl9CisJaWYgKHdoaWNoICYgTUFDX0RJUkVDVElPTl9SWCkKKwkJdDNfd3JpdGVfcmVnKGFkYXAsIEFfWEdNX1JYX0NUUkwgKyBvZnQsIEZfUlhFTik7CisJcmV0dXJuIDA7Cit9CisKK2ludCB0M19tYWNfZGlzYWJsZShzdHJ1Y3QgY21hYyAqbWFjLCBpbnQgd2hpY2gpCit7CisJaW50IGlkeCA9IG1hY2lkeChtYWMpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gbWFjLT5hZGFwdGVyOworCisJaWYgKHdoaWNoICYgTUFDX0RJUkVDVElPTl9UWCkgeworCQl0M193cml0ZV9yZWcoYWRhcCwgQV9YR01fVFhfQ1RSTCArIG1hYy0+b2Zmc2V0LCAwKTsKKwkJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfUElPX0FERFIsIEFfVFBfVFhfRFJPUF9DRkdfQ0gwICsgaWR4KTsKKwkJdDNfd3JpdGVfcmVnKGFkYXAsIEFfVFBfUElPX0RBVEEsIDB4YzAwMDAwMWYpOworCQl0M193cml0ZV9yZWcoYWRhcCwgQV9UUF9QSU9fQUREUiwgQV9UUF9UWF9EUk9QX01PREUpOworCQl0M19zZXRfcmVnX2ZpZWxkKGFkYXAsIEFfVFBfUElPX0RBVEEsIDEgPDwgaWR4LCAwKTsKKwl9CisJaWYgKHdoaWNoICYgTUFDX0RJUkVDVElPTl9SWCkKKwkJdDNfd3JpdGVfcmVnKGFkYXAsIEFfWEdNX1JYX0NUUkwgKyBtYWMtPm9mZnNldCwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgdG8gYWNjdW11bGF0ZSB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlCisgKiBSTU9OIGNvdW50ZXJzIGludG8gdGhlIHBvcnQgc3RhdGlzdGljcy4gIFNpbmNlIHRoZSBwYWNrZXQgY291bnRlcnMgYXJlIG9ubHkKKyAqIDMyIGJpdHMgdGhleSBjYW4gb3ZlcmZsb3cgaW4gfjI4NiBzZWNzIGF0IDEwRywgc28gdGhlIGZ1bmN0aW9uIHNob3VsZCBiZQorICogY2FsbGVkIG1vcmUgZnJlcXVlbnRseSB0aGFuIHRoYXQuICBUaGUgYnl0ZSBjb3VudGVycyBhcmUgNDUtYml0IHdpZGUsIHRoZXkKKyAqIHdvdWxkIG92ZXJmbG93IGluIH43LjggaG91cnMuCisgKi8KK2NvbnN0IHN0cnVjdCBtYWNfc3RhdHMgKnQzX21hY191cGRhdGVfc3RhdHMoc3RydWN0IGNtYWMgKm1hYykKK3sKKyNkZWZpbmUgUk1PTl9SRUFEKG1hYywgYWRkcikgdDNfcmVhZF9yZWcobWFjLT5hZGFwdGVyLCBhZGRyICsgbWFjLT5vZmZzZXQpCisjZGVmaW5lIFJNT05fVVBEQVRFKG1hYywgbmFtZSwgcmVnKSBcCisJKG1hYyktPnN0YXRzLm5hbWUgKz0gKHU2NClSTU9OX1JFQUQobWFjLCBBX1hHTV9TVEFUXyMjcmVnKQorI2RlZmluZSBSTU9OX1VQREFURTY0KG1hYywgbmFtZSwgcmVnX2xvLCByZWdfaGkpIFwKKwkobWFjKS0+c3RhdHMubmFtZSArPSBSTU9OX1JFQUQobWFjLCBBX1hHTV9TVEFUXyMjcmVnX2xvKSArIFwKKwkJCSAgICAgKCh1NjQpUk1PTl9SRUFEKG1hYywgQV9YR01fU1RBVF8jI3JlZ19oaSkgPDwgMzIpCisKKwl1MzIgdiwgbG87CisKKwlSTU9OX1VQREFURTY0KG1hYywgcnhfb2N0ZXRzLCBSWF9CWVRFU19MT1csIFJYX0JZVEVTX0hJR0gpOworCVJNT05fVVBEQVRFNjQobWFjLCByeF9mcmFtZXMsIFJYX0ZSQU1FU19MT1csIFJYX0ZSQU1FU19ISUdIKTsKKwlSTU9OX1VQREFURShtYWMsIHJ4X21jYXN0X2ZyYW1lcywgUlhfTUNBU1RfRlJBTUVTKTsKKwlSTU9OX1VQREFURShtYWMsIHJ4X2JjYXN0X2ZyYW1lcywgUlhfQkNBU1RfRlJBTUVTKTsKKwlSTU9OX1VQREFURShtYWMsIHJ4X2Zjc19lcnJzLCBSWF9DUkNfRVJSX0ZSQU1FUyk7CisJUk1PTl9VUERBVEUobWFjLCByeF9wYXVzZSwgUlhfUEFVU0VfRlJBTUVTKTsKKwlSTU9OX1VQREFURShtYWMsIHJ4X2phYmJlciwgUlhfSkFCQkVSX0ZSQU1FUyk7CisJUk1PTl9VUERBVEUobWFjLCByeF9zaG9ydCwgUlhfU0hPUlRfRlJBTUVTKTsKKwlSTU9OX1VQREFURShtYWMsIHJ4X3N5bWJvbF9lcnJzLCBSWF9TWU1fQ09ERV9FUlJfRlJBTUVTKTsKKworCVJNT05fVVBEQVRFKG1hYywgcnhfdG9vX2xvbmcsIFJYX09WRVJTSVpFX0ZSQU1FUyk7CisJbWFjLT5zdGF0cy5yeF90b29fbG9uZyArPSBSTU9OX1JFQUQobWFjLCBBX1hHTV9SWF9NQVhfUEtUX1NJWkVfRVJSX0NOVCk7CisKKwlSTU9OX1VQREFURShtYWMsIHJ4X2ZyYW1lc182NCwgUlhfNjRCX0ZSQU1FUyk7CisJUk1PTl9VUERBVEUobWFjLCByeF9mcmFtZXNfNjVfMTI3LCBSWF82NV8xMjdCX0ZSQU1FUyk7CisJUk1PTl9VUERBVEUobWFjLCByeF9mcmFtZXNfMTI4XzI1NSwgUlhfMTI4XzI1NUJfRlJBTUVTKTsKKwlSTU9OX1VQREFURShtYWMsIHJ4X2ZyYW1lc18yNTZfNTExLCBSWF8yNTZfNTExQl9GUkFNRVMpOworCVJNT05fVVBEQVRFKG1hYywgcnhfZnJhbWVzXzUxMl8xMDIzLCBSWF81MTJfMTAyM0JfRlJBTUVTKTsKKwlSTU9OX1VQREFURShtYWMsIHJ4X2ZyYW1lc18xMDI0XzE1MTgsIFJYXzEwMjRfMTUxOEJfRlJBTUVTKTsKKwlSTU9OX1VQREFURShtYWMsIHJ4X2ZyYW1lc18xNTE5X21heCwgUlhfMTUxOV9NQVhCX0ZSQU1FUyk7CisKKwlSTU9OX1VQREFURTY0KG1hYywgdHhfb2N0ZXRzLCBUWF9CWVRFX0xPVywgVFhfQllURV9ISUdIKTsKKwlSTU9OX1VQREFURTY0KG1hYywgdHhfZnJhbWVzLCBUWF9GUkFNRV9MT1csIFRYX0ZSQU1FX0hJR0gpOworCVJNT05fVVBEQVRFKG1hYywgdHhfbWNhc3RfZnJhbWVzLCBUWF9NQ0FTVCk7CisJUk1PTl9VUERBVEUobWFjLCB0eF9iY2FzdF9mcmFtZXMsIFRYX0JDQVNUKTsKKwlSTU9OX1VQREFURShtYWMsIHR4X3BhdXNlLCBUWF9QQVVTRSk7CisJLyogVGhpcyBjb3VudHMgZXJyb3IgZnJhbWVzIGluIGdlbmVyYWwgKGJhZCBGQ1MsIHVuZGVycnVuLCBldGMpLiAqLworCVJNT05fVVBEQVRFKG1hYywgdHhfdW5kZXJydW4sIFRYX0VSUl9GUkFNRVMpOworCisJUk1PTl9VUERBVEUobWFjLCB0eF9mcmFtZXNfNjQsIFRYXzY0Ql9GUkFNRVMpOworCVJNT05fVVBEQVRFKG1hYywgdHhfZnJhbWVzXzY1XzEyNywgVFhfNjVfMTI3Ql9GUkFNRVMpOworCVJNT05fVVBEQVRFKG1hYywgdHhfZnJhbWVzXzEyOF8yNTUsIFRYXzEyOF8yNTVCX0ZSQU1FUyk7CisJUk1PTl9VUERBVEUobWFjLCB0eF9mcmFtZXNfMjU2XzUxMSwgVFhfMjU2XzUxMUJfRlJBTUVTKTsKKwlSTU9OX1VQREFURShtYWMsIHR4X2ZyYW1lc181MTJfMTAyMywgVFhfNTEyXzEwMjNCX0ZSQU1FUyk7CisJUk1PTl9VUERBVEUobWFjLCB0eF9mcmFtZXNfMTAyNF8xNTE4LCBUWF8xMDI0XzE1MThCX0ZSQU1FUyk7CisJUk1PTl9VUERBVEUobWFjLCB0eF9mcmFtZXNfMTUxOV9tYXgsIFRYXzE1MTlfTUFYQl9GUkFNRVMpOworCisJLyogVGhlIG5leHQgc3RhdCBpc24ndCBjbGVhci1vbi1yZWFkLiAqLworCXQzX3dyaXRlX3JlZyhtYWMtPmFkYXB0ZXIsIEFfVFBfTUlCX0lOREVYLCBtYWMtPm9mZnNldCA/IDUxIDogNTApOworCXYgPSB0M19yZWFkX3JlZyhtYWMtPmFkYXB0ZXIsIEFfVFBfTUlCX1JEQVRBKTsKKwlsbyA9ICh1MzIpIG1hYy0+c3RhdHMucnhfY29uZ19kcm9wczsKKwltYWMtPnN0YXRzLnJ4X2NvbmdfZHJvcHMgKz0gKHU2NCkgKHYgLSBsbyk7CisKKwlyZXR1cm4gJm1hYy0+c3RhdHM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZWNsYW5jZS5jIGIvZHJpdmVycy9uZXQvZGVjbGFuY2UuYwppbmRleCA0YWUwZmVkLi45ZjdlMWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kZWNsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2RlY2xhbmNlLmMKQEAgLTUsNyArNSw3IEBACiAgKgogICogICAgICBhZG9wdGVkIGZyb20gc3VubGFuY2UuYyBieSBSaWNoYXJkIHZhbiBkZW4gQmVyZwogICoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA1ICBNYWNpZWogVy4gUm96eWNraQorICogICAgICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYgIE1hY2llaiBXLiBSb3p5Y2tpCiAgKgogICogICAgICBhZGRpdGlvbmFsIHNvdXJjZXM6CiAgKiAgICAgIC0gUE1BRC1BQSBUVVJCT2NoYW5uZWwgRXRoZXJuZXQgTW9kdWxlIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbiwKQEAgLTQ0LDYgKzQ0LDggQEAKICAqICAgICAgdjAuMDEwOiBGaXhlcyBmb3IgdGhlIFBNQUQgbWFwcGluZyBvZiB0aGUgTEFOQ0UgYnVmZmVyIGFuZCBmb3IgdGhlCiAgKiAgICAgICAgICAgICAgUE1BWCByZXF1aXJlbWVudCB0byBvbmx5IHVzZSBoYWxmd29yZCBhY2Nlc3NlcyB0byB0aGUKICAqICAgICAgICAgICAgICBidWZmZXIuIG1hY3JvCisgKgorICogICAgICB2MC4wMTE6IENvbnZlcnRlZCB0aGUgUE1BRCB0byB0aGUgZHJpdmVyIG1vZGVsLiBtYWNybwogICovCiAKICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgpAQCAtNTgsNiArNjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgpAQCAtNjksMTUgKzcyLDE2IEBACiAjaW5jbHVkZSA8YXNtL2RlYy9rbjAxLmg+CiAjaW5jbHVkZSA8YXNtL2RlYy9tYWNodHlwZS5oPgogI2luY2x1ZGUgPGFzbS9kZWMvc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2RlYy90Yy5oPgogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9Ci0iZGVjbGFuY2UuYzogdjAuMDEwIGJ5IExpbnV4IE1JUFMgREVDc3RhdGlvbiB0YXNrIGZvcmNlXG4iOworImRlY2xhbmNlLmM6IHYwLjAxMSBieSBMaW51eCBNSVBTIERFQ3N0YXRpb24gdGFzayBmb3JjZVxuIjsKIAogTU9EVUxFX0FVVEhPUigiTGludXggTUlQUyBERUNzdGF0aW9uIHRhc2sgZm9yY2UiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiREVDIExBTkNFIChERUNzdGF0aW9uIG9uYm9hcmQsIFBNQUQteHgpIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisjZGVmaW5lIF9fdW51c2VkIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKQorCiAvKgogICogY2FyZCB0eXBlcwogICovCkBAIC0yNDYsNyArMjUwLDYgQEAKIHN0cnVjdCBsYW5jZV9wcml2YXRlIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dDsKIAlpbnQgdHlwZTsKLQlpbnQgc2xvdDsKIAlpbnQgZG1hX2lycTsKIAl2b2xhdGlsZSBzdHJ1Y3QgbGFuY2VfcmVncyAqbGw7CiAKQEAgLTI4OCw2ICsyOTEsNyBAQAogCiBpbnQgZGVjX2xhbmNlX2RlYnVnID0gMjsKIAorc3RhdGljIHN0cnVjdCB0Y19kcml2ZXIgZGVjX2xhbmNlX3RjX2RyaXZlcjsKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqcm9vdF9sYW5jZV9kZXY7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZXJlZyh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcmVncHRyLCBzaG9ydCB2YWx1ZSkKQEAgLTEwMjMsNyArMTAyNyw3IEBACiAJbGFuY2Vfc2V0X211bHRpY2FzdChkZXYpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBkZWNfbGFuY2VfaW5pdChjb25zdCBpbnQgdHlwZSwgY29uc3QgaW50IHNsb3QpCitzdGF0aWMgaW50IF9faW5pdCBkZWNfbGFuY2VfcHJvYmUoc3RydWN0IGRldmljZSAqYmRldiwgY29uc3QgaW50IHR5cGUpCiB7CiAJc3RhdGljIHVuc2lnbmVkIHZlcnNpb25fcHJpbnRlZDsKIAlzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICJkZWNsYW5jZSVkIjsKQEAgLTEwMzEsNiArMTAzNSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHA7CiAJdm9sYXRpbGUgc3RydWN0IGxhbmNlX3JlZ3MgKmxsOworCXJlc291cmNlX3NpemVfdCBzdGFydCA9IDAsIGxlbiA9IDA7CiAJaW50IGksIHJldDsKIAl1bnNpZ25lZCBsb25nIGVzYXJfYmFzZTsKIAl1bnNpZ25lZCBjaGFyICplc2FyOwpAQCAtMTAzOCwxNCArMTA0MywxOCBAQAogCWlmIChkZWNfbGFuY2VfZGVidWcgJiYgdmVyc2lvbl9wcmludGVkKysgPT0gMCkKIAkJcHJpbnRrKHZlcnNpb24pOwogCi0JaSA9IDA7Ci0JZGV2ID0gcm9vdF9sYW5jZV9kZXY7Ci0Jd2hpbGUgKGRldikgewotCQlpKys7Ci0JCWxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OwotCQlkZXYgPSBscC0+bmV4dDsKKwlpZiAoYmRldikKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMiLCBiZGV2LT5idXNfaWQpOworCWVsc2UgeworCQlpID0gMDsKKwkJZGV2ID0gcm9vdF9sYW5jZV9kZXY7CisJCXdoaWxlIChkZXYpIHsKKwkJCWkrKzsKKwkJCWxwID0gKHN0cnVjdCBsYW5jZV9wcml2YXRlICopZGV2LT5wcml2OworCQkJZGV2ID0gbHAtPm5leHQ7CisJCX0KKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBmbXQsIGkpOwogCX0KLQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIGZtdCwgaSk7CiAKIAlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGxhbmNlX3ByaXZhdGUpKTsKIAlpZiAoIWRldikgewpAQCAtMTA2Myw3ICsxMDcyLDYgQEAKIAlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOwogCiAJbHAtPnR5cGUgPSB0eXBlOwotCWxwLT5zbG90ID0gc2xvdDsKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFTSUNfTEFOQ0U6CiAJCWRldi0+YmFzZV9hZGRyID0gQ0tTRUcxQUREUihkZWNfa25fc2xvdF9iYXNlICsgSU9BU0lDX0xBTkNFKTsKQEAgLTExMTAsMTIgKzExMTgsMjIgQEAKIAkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX1RDCiAJY2FzZSBQTUFEX0xBTkNFOgotCQljbGFpbV90Y19jYXJkKHNsb3QpOworCQlkZXZfc2V0X2RydmRhdGEoYmRldiwgZGV2KTsKIAotCQlkZXYtPm1lbV9zdGFydCA9IENLU0VHMUFERFIoZ2V0X3RjX2Jhc2VfYWRkcihzbG90KSk7CisJCXN0YXJ0ID0gdG9fdGNfZGV2KGJkZXYpLT5yZXNvdXJjZS5zdGFydDsKKwkJbGVuID0gdG9fdGNfZGV2KGJkZXYpLT5yZXNvdXJjZS5lbmQgLSBzdGFydCArIDE7CisJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHN0YXJ0LCBsZW4sIGJkZXYtPmJ1c19pZCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogVW5hYmxlIHRvIHJlc2VydmUgTU1JTyByZXNvdXJjZVxuIiwKKwkJCSAgICAgICBiZGV2LT5idXNfaWQpOworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBlcnJfb3V0X2RldjsKKwkJfQorCisJCWRldi0+bWVtX3N0YXJ0ID0gQ0tTRUcxQUREUihzdGFydCk7CiAJCWRldi0+bWVtX2VuZCA9IGRldi0+bWVtX3N0YXJ0ICsgMHgxMDAwMDA7CiAJCWRldi0+YmFzZV9hZGRyID0gZGV2LT5tZW1fc3RhcnQgKyAweDEwMDAwMDsKLQkJZGV2LT5pcnEgPSBnZXRfdGNfaXJxX25yKHNsb3QpOworCQlkZXYtPmlycSA9IHRvX3RjX2RldihiZGV2KS0+aW50ZXJydXB0OwogCQllc2FyX2Jhc2UgPSBkZXYtPm1lbV9zdGFydCArIDB4MWMwMDAyOwogCQlscC0+ZG1hX2lycSA9IC0xOwogCkBAIC0xMTc0LDcgKzExOTIsNyBAQAogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkZWNsYW5jZV9pbml0IGNhbGxlZCB3aXRoIHVua25vd24gdHlwZVxuIiwKIAkJCW5hbWUpOwogCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycl9vdXRfZnJlZV9kZXY7CisJCWdvdG8gZXJyX291dF9kZXY7CiAJfQogCiAJbGwgPSAoc3RydWN0IGxhbmNlX3JlZ3MgKikgZGV2LT5iYXNlX2FkZHI7CkBAIC0xMTg4LDcgKzEyMDYsNyBAQAogCQkJIiVzOiBFdGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MgcHJvbSBub3QgZm91bmQhXG4iLAogCQkJbmFtZSk7CiAJCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwkJZ290byBlcnJfb3V0X3Jlc291cmNlOwogCX0KIAkvKiBDaGVjayB0aGUgcHJvbSBjb250ZW50cyAqLwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKQEAgLTExOTgsNyArMTIxNiw3IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgIgogCQkJCSJldGhlcm5ldCBzdGF0aW9uIGFkZHJlc3MgcHJvbSFcbiIsIG5hbWUpOwogCQkJcmV0ID0gLUVOT0RFVjsKLQkJCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwkJCWdvdG8gZXJyX291dF9yZXNvdXJjZTsKIAkJfQogCX0KIApAQCAtMTI1NSw0OCArMTI3Myw1MSBAQAogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCQkiJXM6IFVuYWJsZSB0byByZWdpc3RlciBuZXRkZXYsIGFib3J0aW5nLlxuIiwgbmFtZSk7Ci0JCWdvdG8gZXJyX291dF9mcmVlX2RldjsKKwkJZ290byBlcnJfb3V0X3Jlc291cmNlOwogCX0KIAotCWxwLT5uZXh0ID0gcm9vdF9sYW5jZV9kZXY7Ci0Jcm9vdF9sYW5jZV9kZXYgPSBkZXY7CisJaWYgKCFiZGV2KSB7CisJCWxwLT5uZXh0ID0gcm9vdF9sYW5jZV9kZXY7CisJCXJvb3RfbGFuY2VfZGV2ID0gZGV2OworCX0KIAogCXByaW50aygiJXM6IHJlZ2lzdGVyZWQgYXMgJXMuXG4iLCBuYW1lLCBkZXYtPm5hbWUpOwogCXJldHVybiAwOwogCi1lcnJfb3V0X2ZyZWVfZGV2OgorZXJyX291dF9yZXNvdXJjZToKKwlpZiAoYmRldikKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHN0YXJ0LCBsZW4pOworCitlcnJfb3V0X2RldjoKIAlmcmVlX25ldGRldihkZXYpOwogCiBlcnJfb3V0OgogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZXhpdCBkZWNfbGFuY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YShiZGV2KTsKKwlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGxlbjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJc3RhcnQgPSB0b190Y19kZXYoYmRldiktPnJlc291cmNlLnN0YXJ0OworCWxlbiA9IHRvX3RjX2RldihiZGV2KS0+cmVzb3VyY2UuZW5kIC0gc3RhcnQgKyAxOworCXJlbGVhc2VfbWVtX3JlZ2lvbihzdGFydCwgbGVuKTsKKwlmcmVlX25ldGRldihkZXYpOworfQogCiAvKiBGaW5kIGFsbCB0aGUgbGFuY2UgY2FyZHMgb24gdGhlIHN5c3RlbSBhbmQgaW5pdGlhbGl6ZSB0aGVtICovCi1zdGF0aWMgaW50IF9faW5pdCBkZWNfbGFuY2VfcHJvYmUodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGRlY19sYW5jZV9wbGF0Zm9ybV9wcm9iZSh2b2lkKQogewogCWludCBjb3VudCA9IDA7CiAKLQkvKiBTY2FuIHNsb3RzIGZvciBQTUFELUFBIGNhcmRzIGZpcnN0LiAqLwotI2lmZGVmIENPTkZJR19UQwotCWlmIChUVVJCT0NIQU5ORUwpIHsKLQkJaW50IHNsb3Q7Ci0KLQkJd2hpbGUgKChzbG90ID0gc2VhcmNoX3RjX2NhcmQoIlBNQUQtQUEiKSkgPj0gMCkgewotCQkJaWYgKGRlY19sYW5jZV9pbml0KFBNQURfTEFOQ0UsIHNsb3QpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvdW50Kys7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIFRoZW4gaGFuZGxlIG9uYm9hcmQgZGV2aWNlcy4gKi8KIAlpZiAoZGVjX2ludGVycnVwdFtERUNfSVJRX0xBTkNFXSA+PSAwKSB7CiAJCWlmIChkZWNfaW50ZXJydXB0W0RFQ19JUlFfTEFOQ0VfTUVSUl0gPj0gMCkgewotCQkJaWYgKGRlY19sYW5jZV9pbml0KEFTSUNfTEFOQ0UsIC0xKSA+PSAwKQorCQkJaWYgKGRlY19sYW5jZV9wcm9iZShOVUxMLCBBU0lDX0xBTkNFKSA+PSAwKQogCQkJCWNvdW50Kys7CiAJCX0gZWxzZSBpZiAoIVRVUkJPQ0hBTk5FTCkgewotCQkJaWYgKGRlY19sYW5jZV9pbml0KFBNQVhfTEFOQ0UsIC0xKSA+PSAwKQorCQkJaWYgKGRlY19sYW5jZV9wcm9iZShOVUxMLCBQTUFYX0xBTkNFKSA+PSAwKQogCQkJCWNvdW50Kys7CiAJCX0KIAl9CkBAIC0xMzA0LDIxICsxMzI1LDcwIEBACiAJcmV0dXJuIChjb3VudCA+IDApID8gMCA6IC1FTk9ERVY7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBkZWNfbGFuY2VfY2xlYW51cCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGRlY19sYW5jZV9wbGF0Zm9ybV9yZW1vdmUodm9pZCkKIHsKIAl3aGlsZSAocm9vdF9sYW5jZV9kZXYpIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHJvb3RfbGFuY2VfZGV2OwogCQlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0jaWZkZWYgQ09ORklHX1RDCi0JCWlmIChscC0+c2xvdCA+PSAwKQotCQkJcmVsZWFzZV90Y19jYXJkKGxwLT5zbG90KTsKLSNlbmRpZgogCQlyb290X2xhbmNlX2RldiA9IGxwLT5uZXh0OwogCQlmcmVlX25ldGRldihkZXYpOwogCX0KIH0KIAotbW9kdWxlX2luaXQoZGVjX2xhbmNlX3Byb2JlKTsKLW1vZHVsZV9leGl0KGRlY19sYW5jZV9jbGVhbnVwKTsKKyNpZmRlZiBDT05GSUdfVEMKK3N0YXRpYyBpbnQgX19pbml0IGRlY19sYW5jZV90Y19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCBfX2V4aXQgZGVjX2xhbmNlX3RjX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRjX2RldmljZV9pZCBkZWNfbGFuY2VfdGNfdGFibGVbXSA9IHsKKwl7ICJERUMgICAgICIsICJQTUFELUFBICIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHRjLCBkZWNfbGFuY2VfdGNfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHRjX2RyaXZlciBkZWNfbGFuY2VfdGNfZHJpdmVyID0geworCS5pZF90YWJsZQk9IGRlY19sYW5jZV90Y190YWJsZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZGVjbGFuY2UiLAorCQkuYnVzCT0gJnRjX2J1c190eXBlLAorCQkucHJvYmUJPSBkZWNfbGFuY2VfdGNfcHJvYmUsCisJCS5yZW1vdmUJPSBfX2V4aXRfcChkZWNfbGFuY2VfdGNfcmVtb3ZlKSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGVjX2xhbmNlX3RjX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKyAgICAgICAgaW50IHN0YXR1cyA9IGRlY19sYW5jZV9wcm9iZShkZXYsIFBNQURfTEFOQ0UpOworICAgICAgICBpZiAoIXN0YXR1cykKKyAgICAgICAgICAgICAgICBnZXRfZGV2aWNlKGRldik7CisgICAgICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGRlY19sYW5jZV90Y19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworICAgICAgICBwdXRfZGV2aWNlKGRldik7CisgICAgICAgIGRlY19sYW5jZV9yZW1vdmUoZGV2KTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgZGVjX2xhbmNlX2luaXQodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gdGNfcmVnaXN0ZXJfZHJpdmVyKCZkZWNfbGFuY2VfdGNfZHJpdmVyKTsKKwlpZiAoIXN0YXR1cykKKwkJZGVjX2xhbmNlX3BsYXRmb3JtX3Byb2JlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRlY19sYW5jZV9leGl0KHZvaWQpCit7CisJZGVjX2xhbmNlX3BsYXRmb3JtX3JlbW92ZSgpOworCXRjX3VucmVnaXN0ZXJfZHJpdmVyKCZkZWNfbGFuY2VfdGNfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChkZWNfbGFuY2VfaW5pdCk7Cittb2R1bGVfZXhpdChkZWNfbGFuY2VfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaAppbmRleCBmMDkxMDQyLi42ODlmMTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKQEAgLTU5LDE3ICs1OSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaWZkZWYgTkVUSUZfRl9UU082CiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvdGNwLmg+CiAjaW5jbHVkZSA8bGludXgvdWRwLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpZmRlZiBORVRJRl9GX1RTTwogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvbWlpLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KQEAgLTI1Nyw3ICsyNTMsNiBAQAogCXNwaW5sb2NrX3QgdHhfcXVldWVfbG9jazsKICNlbmRpZgogCWF0b21pY190IGlycV9zZW07Ci0JdW5zaWduZWQgaW50IGRldGVjdF9saW5rOwogCXVuc2lnbmVkIGludCB0b3RhbF90eF9ieXRlczsKIAl1bnNpZ25lZCBpbnQgdG90YWxfdHhfcGFja2V0czsKIAl1bnNpZ25lZCBpbnQgdG90YWxfcnhfYnl0ZXM7CkBAIC0zNDgsOSArMzQzLDcgQEAKIAlib29sZWFuX3QgaGF2ZV9tc2k7CiAjZW5kaWYKIAkvKiB0byBub3QgbWVzcyB1cCBjYWNoZSBhbGlnbm1lbnQsIGFsd2F5cyBhZGQgdG8gdGhlIGJvdHRvbSAqLwotI2lmZGVmIE5FVElGX0ZfVFNPCiAJYm9vbGVhbl90IHRzb19mb3JjZTsKLSNlbmRpZgogCWJvb2xlYW5fdCBzbWFydF9wb3dlcl9kb3duOwkvKiBwaHkgc21hcnQgcG93ZXIgZG93biAqLwogCWJvb2xlYW5fdCBxdWFkX3BvcnRfYTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCmluZGV4IGZiOTZjODcuLjQ0ZWJjNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKQEAgLTMzOCw3ICszMzgsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgTkVUSUZfRl9UU08KIHN0YXRpYyBpbnQKIGUxMDAwX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKIHsKQEAgLTM1MiwxOCArMzUxLDE1IEBACiAJZWxzZQogCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzsKIAotI2lmZGVmIE5FVElGX0ZfVFNPNgogCWlmIChkYXRhKQogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKIAllbHNlCiAJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPNjsKLSNlbmRpZgogCiAJRFBSSU5USyhQUk9CRSwgSU5GTywgIlRTTyBpcyAlc1xuIiwgZGF0YSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwogCWFkYXB0ZXItPnRzb19mb3JjZSA9IFRSVUU7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogTkVUSUZfRl9UU08gKi8KIAogc3RhdGljIHVpbnQzMl90CiBlMTAwMF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKQEAgLTE5NzEsMTAgKzE5NjcsOCBAQAogCS5zZXRfdHhfY3N1bSAgICAgICAgICAgID0gZTEwMDBfc2V0X3R4X2NzdW0sCiAJLmdldF9zZyAgICAgICAgICAgICAgICAgPSBldGh0b29sX29wX2dldF9zZywKIAkuc2V0X3NnICAgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3Bfc2V0X3NnLAotI2lmZGVmIE5FVElGX0ZfVFNPCiAJLmdldF90c28gICAgICAgICAgICAgICAgPSBldGh0b29sX29wX2dldF90c28sCiAJLnNldF90c28gICAgICAgICAgICAgICAgPSBlMTAwMF9zZXRfdHNvLAotI2VuZGlmCiAJLnNlbGZfdGVzdF9jb3VudCAgICAgICAgPSBlMTAwMF9kaWFnX3Rlc3RfY291bnQsCiAJLnNlbGZfdGVzdCAgICAgICAgICAgICAgPSBlMTAwMF9kaWFnX3Rlc3QsCiAJLmdldF9zdHJpbmdzICAgICAgICAgICAgPSBlMTAwMF9nZXRfc3RyaW5ncywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwppbmRleCBjNjI1OWM3Li4yMjJmY2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCkBAIC0zNiw3ICszNiw3IEBACiAjZWxzZQogI2RlZmluZSBEUklWRVJOQVBJICItTkFQSSIKICNlbmRpZgotI2RlZmluZSBEUlZfVkVSU0lPTiAiNy4zLjE1LWsyIkRSSVZFUk5BUEkKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjcuMy4yMC1rMiJEUklWRVJOQVBJCiBjaGFyIGUxMDAwX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIHN0YXRpYyBjaGFyIGUxMDAwX2NvcHlyaWdodFtdID0gIkNvcHlyaWdodCAoYykgMTk5OS0yMDA2IEludGVsIENvcnBvcmF0aW9uLiI7CiAKQEAgLTk5MCwxNiArOTkwLDEyIEBACiAJCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX1ZMQU5fRklMVEVSOwogCX0KIAotI2lmZGVmIE5FVElGX0ZfVFNPCiAJaWYgKChhZGFwdGVyLT5ody5tYWNfdHlwZSA+PSBlMTAwMF84MjU0NCkgJiYKIAkgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgIT0gZTEwMDBfODI1NDcpKQogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwogCi0jaWZkZWYgTkVUSUZfRl9UU082CiAJaWYgKGFkYXB0ZXItPmh3Lm1hY190eXBlID4gZTEwMDBfODI1NDdfcmV2XzIpCiAJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OwotI2VuZGlmCi0jZW5kaWYKIAlpZiAocGNpX3VzaW5nX2RhYykKIAkJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAKQEAgLTI1ODMsMTUgKzI1NzksMjIgQEAKIAogCWlmIChsaW5rKSB7CiAJCWlmICghbmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CisJCQl1aW50MzJfdCBjdHJsOwogCQkJYm9vbGVhbl90IHR4YjJiID0gMTsKIAkJCWUxMDAwX2dldF9zcGVlZF9hbmRfZHVwbGV4KCZhZGFwdGVyLT5odywKIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGFwdGVyLT5saW5rX3NwZWVkLAogCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkYXB0ZXItPmxpbmtfZHVwbGV4KTsKIAotCQkJRFBSSU5USyhMSU5LLCBJTkZPLCAiTklDIExpbmsgaXMgVXAgJWQgTWJwcyAlc1xuIiwKLQkJCSAgICAgICBhZGFwdGVyLT5saW5rX3NwZWVkLAotCQkJICAgICAgIGFkYXB0ZXItPmxpbmtfZHVwbGV4ID09IEZVTExfRFVQTEVYID8KLQkJCSAgICAgICAiRnVsbCBEdXBsZXgiIDogIkhhbGYgRHVwbGV4Iik7CisJCQljdHJsID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBDVFJMKTsKKwkJCURQUklOVEsoTElOSywgSU5GTywgIk5JQyBMaW5rIGlzIFVwICVkIE1icHMgJXMsICIKKwkJCSAgICAgICAgIkZsb3cgQ29udHJvbDogJXNcbiIsCisJCQkgICAgICAgIGFkYXB0ZXItPmxpbmtfc3BlZWQsCisJCQkgICAgICAgIGFkYXB0ZXItPmxpbmtfZHVwbGV4ID09IEZVTExfRFVQTEVYID8KKwkJCSAgICAgICAgIkZ1bGwgRHVwbGV4IiA6ICJIYWxmIER1cGxleCIsCisJCQkgICAgICAgICgoY3RybCAmIEUxMDAwX0NUUkxfVEZDRSkgJiYgKGN0cmwgJgorCQkJICAgICAgICBFMTAwMF9DVFJMX1JGQ0UpKSA/ICJSWC9UWCIgOiAoKGN0cmwgJgorCQkJICAgICAgICBFMTAwMF9DVFJMX1JGQ0UpID8gIlJYIiA6ICgoY3RybCAmCisJCQkgICAgICAgIEUxMDAwX0NUUkxfVEZDRSkgPyAiVFgiIDogIk5vbmUiICkpKTsKIAogCQkJLyogdHdlYWsgdHhfcXVldWVfbGVuIGFjY29yZGluZyB0byBzcGVlZC9kdXBsZXgKIAkJCSAqIGFuZCBhZGp1c3QgdGhlIHRpbWVvdXQgZmFjdG9yICovCkBAIC0yNjE5LDcgKzI2MjIsNiBAQAogCQkJCUUxMDAwX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIFRBUkMwLCB0YXJjMCk7CiAJCQl9CiAKLSNpZmRlZiBORVRJRl9GX1RTTwogCQkJLyogZGlzYWJsZSBUU08gZm9yIHBjaWUgYW5kIDEwLzEwMCBzcGVlZHMsIHRvIGF2b2lkCiAJCQkgKiBzb21lIGhhcmR3YXJlIGlzc3VlcyAqLwogCQkJaWYgKCFhZGFwdGVyLT50c29fZm9yY2UgJiYKQEAgLTI2MzAsMjIgKzI2MzIsMTcgQEAKIAkJCQkJRFBSSU5USyhQUk9CRSxJTkZPLAogCQkJCSAgICAgICAgIjEwLzEwMCBzcGVlZDogZGlzYWJsaW5nIFRTT1xuIik7CiAJCQkJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPOwotI2lmZGVmIE5FVElGX0ZfVFNPNgogCQkJCQluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzY7Ci0jZW5kaWYKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBTUEVFRF8xMDAwOgogCQkJCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPOwotI2lmZGVmIE5FVElGX0ZfVFNPNgogCQkJCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKLSNlbmRpZgogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgogCQkJCQkvKiBvb3BzICovCiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KLSNlbmRpZgogCiAJCQkvKiBlbmFibGUgdHJhbnNtaXRzIGluIHRoZSBoYXJkd2FyZSwgbmVlZCB0byBkbyB0aGlzCiAJCQkgKiBhZnRlciBzZXR0aW5nIFRBUkMwICovCkBAIC0yODc1LDcgKzI4NzIsNiBAQAogZTEwMDBfdHNvKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgZTEwMDBfdHhfcmluZyAqdHhfcmluZywKICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotI2lmZGVmIE5FVElGX0ZfVFNPCiAJc3RydWN0IGUxMDAwX2NvbnRleHRfZGVzYyAqY29udGV4dF9kZXNjOwogCXN0cnVjdCBlMTAwMF9idWZmZXIgKmJ1ZmZlcl9pbmZvOwogCXVuc2lnbmVkIGludCBpOwpAQCAtMjkwNCw3ICsyOTAwLDYgQEAKIAkJCQkJCSAgIDApOwogCQkJY21kX2xlbmd0aCA9IEUxMDAwX1RYRF9DTURfSVA7CiAJCQlpcGNzZSA9IHNrYi0+aC5yYXcgLSBza2ItPmRhdGEgLSAxOwotI2lmZGVmIE5FVElGX0ZfVFNPNgogCQl9IGVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKIAkJCXNrYi0+bmguaXB2NmgtPnBheWxvYWRfbGVuID0gMDsKIAkJCXNrYi0+aC50aC0+Y2hlY2sgPQpAQCAtMjkxNCw3ICsyOTA5LDYgQEAKIAkJCQkJCSBJUFBST1RPX1RDUCwKIAkJCQkJCSAwKTsKIAkJCWlwY3NlID0gMDsKLSNlbmRpZgogCQl9CiAJCWlwY3NzID0gc2tiLT5uaC5yYXcgLSBza2ItPmRhdGE7CiAJCWlwY3NvID0gKHZvaWQgKikmKHNrYi0+bmguaXBoLT5jaGVjaykgLSAodm9pZCAqKXNrYi0+ZGF0YTsKQEAgLTI5NDcsOCArMjk0MSw2IEBACiAKIAkJcmV0dXJuIFRSVUU7CiAJfQotI2VuZGlmCi0KIAlyZXR1cm4gRkFMU0U7CiB9CiAKQEAgLTI5NjgsOCArMjk2MCw5IEBACiAJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwogCQljb250ZXh0X2Rlc2MgPSBFMTAwMF9DT05URVhUX0RFU0MoKnR4X3JpbmcsIGkpOwogCisJCWNvbnRleHRfZGVzYy0+bG93ZXJfc2V0dXAuaXBfY29uZmlnID0gMDsKIAkJY29udGV4dF9kZXNjLT51cHBlcl9zZXR1cC50Y3BfZmllbGRzLnR1Y3NzID0gY3NzOwotCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc28gPSBjc3MgKyBza2ItPmNzdW1fb2Zmc2V0OworCQljb250ZXh0X2Rlc2MtPnVwcGVyX3NldHVwLnRjcF9maWVsZHMudHVjc28gPSBjc3MgKyBza2ItPmNzdW07CiAJCWNvbnRleHRfZGVzYy0+dXBwZXJfc2V0dXAudGNwX2ZpZWxkcy50dWNzZSA9IDA7CiAJCWNvbnRleHRfZGVzYy0+dGNwX3NlZ19zZXR1cC5kYXRhID0gMDsKIAkJY29udGV4dF9kZXNjLT5jbWRfYW5kX2xlbmd0aCA9IGNwdV90b19sZTMyKEUxMDAwX1RYRF9DTURfREVYVCk7CkBAIC0zMDA1LDcgKzI5OTgsNiBAQAogCXdoaWxlIChsZW4pIHsKIAkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CiAJCXNpemUgPSBtaW4obGVuLCBtYXhfcGVyX3R4ZCk7Ci0jaWZkZWYgTkVUSUZfRl9UU08KIAkJLyogV29ya2Fyb3VuZCBmb3IgQ29udHJvbGxlciBlcnJhdHVtIC0tCiAJCSAqIGRlc2NyaXB0b3IgZm9yIG5vbi10c28gcGFja2V0IGluIGEgbGluZWFyIFNLQiB0aGF0IGZvbGxvd3MgYQogCQkgKiB0c28gZ2V0cyB3cml0dGVuIGJhY2sgcHJlbWF0dXJlbHkgYmVmb3JlIHRoZSBkYXRhIGlzIGZ1bGx5CkBAIC0zMDIwLDcgKzMwMTIsNiBAQAogCQkgKiBpbiBUU08gbW9kZS4gIEFwcGVuZCA0LWJ5dGUgc2VudGluZWwgZGVzYyAqLwogCQlpZiAodW5saWtlbHkobXNzICYmICFucl9mcmFncyAmJiBzaXplID09IGxlbiAmJiBzaXplID4gOCkpCiAJCQlzaXplIC09IDQ7Ci0jZW5kaWYKIAkJLyogd29yay1hcm91bmQgZm9yIGVycmF0YSAxMCBhbmQgaXQgYXBwbGllcwogCQkgKiB0byBhbGwgY29udHJvbGxlcnMgaW4gUENJLVggbW9kZQogCQkgKiBUaGUgZml4IGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIGEKQEAgLTMwNjIsMTIgKzMwNTMsMTAgQEAKIAkJd2hpbGUgKGxlbikgewogCQkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CiAJCQlzaXplID0gbWluKGxlbiwgbWF4X3Blcl90eGQpOwotI2lmZGVmIE5FVElGX0ZfVFNPCiAJCQkvKiBXb3JrYXJvdW5kIGZvciBwcmVtYXR1cmUgZGVzYyB3cml0ZS1iYWNrcwogCQkJICogaW4gVFNPIG1vZGUuICBBcHBlbmQgNC1ieXRlIHNlbnRpbmVsIGRlc2MgKi8KIAkJCWlmICh1bmxpa2VseShtc3MgJiYgZiA9PSAobnJfZnJhZ3MtMSkgJiYgc2l6ZSA9PSBsZW4gJiYgc2l6ZSA+IDgpKQogCQkJCXNpemUgLT0gNDsKLSNlbmRpZgogCQkJLyogV29ya2Fyb3VuZCBmb3IgcG90ZW50aWFsIDgyNTQ0IGhhbmcgaW4gUENJLVguCiAJCQkgKiBBdm9pZCB0ZXJtaW5hdGluZyBidWZmZXJzIHdpdGhpbiBldmVubHktYWxpZ25lZAogCQkJICogZHdvcmRzLiAqLwpAQCAtMzI5Miw3ICszMjgxLDYgQEAKIAlpZiAoYWRhcHRlci0+aHcubWFjX3R5cGUgPj0gZTEwMDBfODI1NzEpCiAJCW1heF9wZXJfdHhkID0gODE5MjsKIAotI2lmZGVmIE5FVElGX0ZfVFNPCiAJbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAkvKiBUaGUgY29udHJvbGxlciBkb2VzIGEgc2ltcGxlIGNhbGN1bGF0aW9uIHRvCiAJICogbWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tIGluIHRoZSBGSUZPIGJlZm9yZQpAQCAtMzM0NiwxNiArMzMzNCwxMCBAQAogCWlmICgobXNzKSB8fCAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpCiAJCWNvdW50Kys7CiAJY291bnQrKzsKLSNlbHNlCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCi0JCWNvdW50Kys7Ci0jZW5kaWYKIAotI2lmZGVmIE5FVElGX0ZfVFNPCiAJLyogQ29udHJvbGxlciBFcnJhdHVtIHdvcmthcm91bmQgKi8KIAlpZiAoIXNrYi0+ZGF0YV9sZW4gJiYgdHhfcmluZy0+bGFzdF90eF90c28gJiYgIXNrYl9pc19nc28oc2tiKSkKIAkJY291bnQrKzsKLSNlbmRpZgogCiAJY291bnQgKz0gVFhEX1VTRV9DT1VOVChsZW4sIG1heF90eGRfcHdyKTsKIApAQCAtMzc2NSw4ICszNzQ3LDggQEAKICAqIEBkYXRhOiBwb2ludGVyIHRvIGEgbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQogICoqLwogCi1zdGF0aWMKLWlycXJldHVybl90IGUxMDAwX2ludHJfbXNpKGludCBpcnEsIHZvaWQgKmRhdGEpCitzdGF0aWMgaXJxcmV0dXJuX3QKK2UxMDAwX2ludHJfbXNpKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRhdGE7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwpAQCAtMzc3NCw0OSArMzc1NiwyNyBAQAogI2lmbmRlZiBDT05GSUdfRTEwMDBfTkFQSQogCWludCBpOwogI2VuZGlmCisJdWludDMyX3QgaWNyID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUik7CiAKLQkvKiB0aGlzIGNvZGUgYXZvaWRzIHRoZSByZWFkIG9mIElDUiBidXQgaGFzIHRvIGdldCAxMDAwIGludGVycnVwdHMKLQkgKiBhdCBldmVyeSBsaW5rIGNoYW5nZSBldmVudCBiZWZvcmUgaXQgd2lsbCBub3RpY2UgdGhlIGNoYW5nZSAqLwotCWlmICgrK2FkYXB0ZXItPmRldGVjdF9saW5rID49IDEwMDApIHsKLQkJdWludDMyX3QgaWNyID0gRTEwMDBfUkVBRF9SRUcoaHcsIElDUik7CiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKLQkJLyogcmVhZCBJQ1IgZGlzYWJsZXMgaW50ZXJydXB0cyB1c2luZyBJQU0sIHNvIGtlZXAgdXAgd2l0aCBvdXIKLQkJICogZW5hYmxlL2Rpc2FibGUgYWNjb3VudGluZyAqLwotCQlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKKwkvKiByZWFkIElDUiBkaXNhYmxlcyBpbnRlcnJ1cHRzIHVzaW5nIElBTSwgc28ga2VlcCB1cCB3aXRoIG91cgorCSAqIGVuYWJsZS9kaXNhYmxlIGFjY291bnRpbmcgKi8KKwlhdG9taWNfaW5jKCZhZGFwdGVyLT5pcnFfc2VtKTsKICNlbmRpZgotCQlhZGFwdGVyLT5kZXRlY3RfbGluayA9IDA7Ci0JCWlmICgoaWNyICYgKEUxMDAwX0lDUl9SWFNFUSB8IEUxMDAwX0lDUl9MU0MpKSAmJgotCQkgICAgKGljciAmIEUxMDAwX0lDUl9JTlRfQVNTRVJURUQpKSB7Ci0JCQlody0+Z2V0X2xpbmtfc3RhdHVzID0gMTsKLQkJCS8qIDgwMDAzRVMyTEFOIHdvcmthcm91bmQtLQotCQkJKiBGb3IgcGFja2V0IGJ1ZmZlciB3b3JrLWFyb3VuZCBvbiBsaW5rIGRvd24gZXZlbnQ7Ci0JCQkqIGRpc2FibGUgcmVjZWl2ZXMgaGVyZSBpbiB0aGUgSVNSIGFuZAotCQkJKiByZXNldCBhZGFwdGVyIGluIHdhdGNoZG9nCi0JCQkqLwotCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSAmJgotCQkJICAgIChhZGFwdGVyLT5ody5tYWNfdHlwZSA9PSBlMTAwMF84MDAwM2VzMmxhbikpIHsKLQkJCQkvKiBkaXNhYmxlIHJlY2VpdmVzICovCi0JCQkJdWludDMyX3QgcmN0bCA9IEUxMDAwX1JFQURfUkVHKGh3LCBSQ1RMKTsKLQkJCQlFMTAwMF9XUklURV9SRUcoaHcsIFJDVEwsIHJjdGwgJiB+RTEwMDBfUkNUTF9FTik7Ci0JCQl9Ci0JCQkvKiBndWFyZCBhZ2FpbnN0IGludGVycnVwdCB3aGVuIHdlJ3JlIGdvaW5nIGRvd24gKi8KLQkJCWlmICghdGVzdF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKQotCQkJCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsCi0JCQkJICAgICAgICAgIGppZmZpZXMgKyAxKTsKKwlpZiAoaWNyICYgKEUxMDAwX0lDUl9SWFNFUSB8IEUxMDAwX0lDUl9MU0MpKSB7CisJCWh3LT5nZXRfbGlua19zdGF0dXMgPSAxOworCQkvKiA4MDAwM0VTMkxBTiB3b3JrYXJvdW5kLS0gRm9yIHBhY2tldCBidWZmZXIgd29yay1hcm91bmQgb24KKwkJICogbGluayBkb3duIGV2ZW50OyBkaXNhYmxlIHJlY2VpdmVzIGhlcmUgaW4gdGhlIElTUiBhbmQgcmVzZXQKKwkJICogYWRhcHRlciBpbiB3YXRjaGRvZyAqLworCQlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpICYmCisJCSAgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODAwMDNlczJsYW4pKSB7CisJCQkvKiBkaXNhYmxlIHJlY2VpdmVzICovCisJCQl1aW50MzJfdCByY3RsID0gRTEwMDBfUkVBRF9SRUcoaHcsIFJDVEwpOworCQkJRTEwMDBfV1JJVEVfUkVHKGh3LCBSQ1RMLCByY3RsICYgfkUxMDAwX1JDVExfRU4pOwogCQl9Ci0JfSBlbHNlIHsKLQkJRTEwMDBfV1JJVEVfUkVHKGh3LCBJQ1IsICgweGZmZmZmZmZmICYgfihFMTAwMF9JQ1JfUlhTRVEgfAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUxMDAwX0lDUl9MU0MpKSk7Ci0JCS8qIGJ1bW1lciB3ZSBoYXZlIHRvIGZsdXNoIGhlcmUsIGJ1dCB0aGluZ3MgYnJlYWsgb3RoZXJ3aXNlIGFzCi0JCSAqIHNvbWUgZXZlbnQgYXBwZWFycyB0byBiZSBsb3N0IG9yIGRlbGF5ZWQgYW5kIHRocm91Z2hwdXQKLQkJICogZHJvcHMuICBJbiBhbG1vc3QgYWxsIHRlc3RzIHRoaXMgZmx1c2ggaXMgdW4tbmVjZXNzYXJ5ICovCi0JCUUxMDAwX1dSSVRFX0ZMVVNIKGh3KTsKLSNpZmRlZiBDT05GSUdfRTEwMDBfTkFQSQotCQkvKiBJbnRlcnJ1cHQgQXV0by1NYXNrIChJQU0pLi4udXBvbiB3cml0aW5nIElDUiwgaW50ZXJydXB0cyBhcmUKLQkJICogbWFza2VkLiAgTm8gbmVlZCBmb3IgdGhlIElNQyB3cml0ZSwgYnV0IGl0IGRvZXMgbWVhbiB3ZQotCQkgKiBzaG91bGQgYWNjb3VudCBmb3IgaXQgQVNBUC4gKi8KLQkJYXRvbWljX2luYygmYWRhcHRlci0+aXJxX3NlbSk7Ci0jZW5kaWYKKwkJLyogZ3VhcmQgYWdhaW5zdCBpbnRlcnJ1cHQgd2hlbiB3ZSdyZSBnb2luZyBkb3duICovCisJCWlmICghdGVzdF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+ZmxhZ3MpKQorCQkJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDEpOwogCX0KIAogI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCkBAIC0zODM2LDcgKzM3OTYsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IEUxMDAwX01BWF9JTlRSOyBpKyspCiAJCWlmICh1bmxpa2VseSghYWRhcHRlci0+Y2xlYW5fcngoYWRhcHRlciwgYWRhcHRlci0+cnhfcmluZykgJgotCQkgICAhZTEwMDBfY2xlYW5fdHhfaXJxKGFkYXB0ZXIsIGFkYXB0ZXItPnR4X3JpbmcpKSkKKwkJICAgZTEwMDBfY2xlYW5fdHhfaXJxKGFkYXB0ZXIsIGFkYXB0ZXItPnR4X3JpbmcpKSkKIAkJCWJyZWFrOwogCiAJaWYgKGxpa2VseShhZGFwdGVyLT5pdHJfc2V0dGluZyAmIDMpKQpAQCAtMzkzOSw3ICszODk5LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBFMTAwMF9NQVhfSU5UUjsgaSsrKQogCQlpZiAodW5saWtlbHkoIWFkYXB0ZXItPmNsZWFuX3J4KGFkYXB0ZXIsIGFkYXB0ZXItPnJ4X3JpbmcpICYKLQkJICAgIWUxMDAwX2NsZWFuX3R4X2lycShhZGFwdGVyLCBhZGFwdGVyLT50eF9yaW5nKSkpCisJCSAgIGUxMDAwX2NsZWFuX3R4X2lycShhZGFwdGVyLCBhZGFwdGVyLT50eF9yaW5nKSkpCiAJCQlicmVhazsKIAogCWlmIChsaWtlbHkoYWRhcHRlci0+aXRyX3NldHRpbmcgJiAzKSkKQEAgLTM5ODksNyArMzk0OSw3IEBACiAJcG9sbF9kZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKIAogCS8qIElmIG5vIFR4IGFuZCBub3QgZW5vdWdoIFJ4IHdvcmsgZG9uZSwgZXhpdCB0aGUgcG9sbGluZyBtb2RlICovCi0JaWYgKCghdHhfY2xlYW5lZCAmJiAod29ya19kb25lID09IDApKSB8fAorCWlmICgodHhfY2xlYW5lZCAmJiAod29ya19kb25lIDwgd29ya190b19kbykpIHx8CiAJICAgIW5ldGlmX3J1bm5pbmcocG9sbF9kZXYpKSB7CiBxdWl0X3BvbGxpbmc6CiAJCWlmIChsaWtlbHkoYWRhcHRlci0+aXRyX3NldHRpbmcgJiAzKSkKQEAgLTQwMTksNyArMzk3OSw3IEBACiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogI2VuZGlmCi0JYm9vbGVhbl90IGNsZWFuZWQgPSBGQUxTRTsKKwlib29sZWFuX3QgY2xlYW5lZCA9IFRSVUU7CiAJdW5zaWduZWQgaW50IHRvdGFsX3R4X2J5dGVzPTAsIHRvdGFsX3R4X3BhY2tldHM9MDsKIAogCWkgPSB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuOwpAQCAtNDAzNCwxMCArMzk5NCwxMyBAQAogCiAJCQlpZiAoY2xlYW5lZCkgewogCQkJCXN0cnVjdCBza19idWZmICpza2IgPSBidWZmZXJfaW5mby0+c2tiOwotCQkJCXVuc2lnbmVkIGludCBzZWdzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2VnczsKKwkJCQl1bnNpZ25lZCBpbnQgc2VncywgYnl0ZWNvdW50OworCQkJCXNlZ3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID86IDE7CisJCQkJLyogbXVsdGlwbHkgZGF0YSBjaHVua3MgYnkgc2l6ZSBvZiBoZWFkZXJzICovCisJCQkJYnl0ZWNvdW50ID0gKChzZWdzIC0gMSkgKiBza2JfaGVhZGxlbihza2IpKSArCisJCQkJICAgICAgICAgICAgc2tiLT5sZW47CiAJCQkJdG90YWxfdHhfcGFja2V0cyArPSBzZWdzOwotCQkJCXRvdGFsX3R4X3BhY2tldHMrKzsKLQkJCQl0b3RhbF90eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQl0b3RhbF90eF9ieXRlcyArPSBieXRlY291bnQ7CiAJCQl9CiAJCQllMTAwMF91bm1hcF9hbmRfZnJlZV90eF9yZXNvdXJjZShhZGFwdGVyLCBidWZmZXJfaW5mbyk7CiAJCQl0eF9kZXNjLT51cHBlci5kYXRhID0gMDsKQEAgLTQwNTAsNyArNDAxMywxMCBAQAogI2lmZGVmIENPTkZJR19FMTAwMF9OQVBJCiAjZGVmaW5lIEUxMDAwX1RYX1dFSUdIVCA2NAogCQkvKiB3ZWlnaHQgb2YgYSBzb3J0IGZvciB0eCwgdG8gYXZvaWQgZW5kbGVzcyB0cmFuc21pdCBjbGVhbnVwICovCi0JCWlmIChjb3VudCsrID09IEUxMDAwX1RYX1dFSUdIVCkgYnJlYWs7CisJCWlmIChjb3VudCsrID09IEUxMDAwX1RYX1dFSUdIVCkgeworCQkJY2xlYW5lZCA9IEZBTFNFOworCQkJYnJlYWs7CisJCX0KICNlbmRpZgogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaCBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX29zZGVwLmgKaW5kZXggMThhZmMwYy4uMTBhZjc0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfb3NkZXAuaAorKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9vc2RlcC5oCkBAIC00OCw4ICs0OCw2IEBACiAgICAgVFJVRSA9IDEKIH0gYm9vbGVhbl90OwogCi0jZGVmaW5lIE1TR09VVChTLCBBLCBCKQlwcmludGsoS0VSTl9ERUJVRyBTICJcbiIsIEEsIEIpCi0KICNpZmRlZiBEQkcKICNkZWZpbmUgREVCVUdPVVQoUykJCXByaW50ayhLRVJOX0RFQlVHIFMgIlxuIikKICNkZWZpbmUgREVCVUdPVVQxKFMsIEEuLi4pCXByaW50ayhLRVJOX0RFQlVHIFMgIlxuIiwgQSkKQEAgLTU4LDcgKzU2LDcgQEAKICNkZWZpbmUgREVCVUdPVVQxKFMsIEEuLi4pCiAjZW5kaWYKIAotI2RlZmluZSBERUJVR0ZVTkMoRikgREVCVUdPVVQoRikKKyNkZWZpbmUgREVCVUdGVU5DKEYpIERFQlVHT1VUKEYgIlxuIikKICNkZWZpbmUgREVCVUdPVVQyIERFQlVHT1VUMQogI2RlZmluZSBERUJVR09VVDMgREVCVUdPVVQyCiAjZGVmaW5lIERFQlVHT1VUNyBERUJVR09VVDMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9wYXJhbS5jCmluZGV4IGNmMmEyNzkuLmY4ODYyZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX3BhcmFtLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfcGFyYW0uYwpAQCAtNzYwLDIyICs3NjAsMTMgQEAKIAljYXNlIFNQRUVEXzEwMDA6CiAJCURQUklOVEsoUFJPQkUsIElORk8sICIxMDAwIE1icHMgU3BlZWQgc3BlY2lmaWVkIHdpdGhvdXQgIgogCQkJIkR1cGxleFxuIik7Ci0JCURQUklOVEsoUFJPQkUsIElORk8sCi0JCQkiVXNpbmcgQXV0b25lZ290aWF0aW9uIGF0IDEwMDAgTWJwcyAiCi0JCQkiRnVsbCBEdXBsZXggb25seVxuIik7Ci0JCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMTsKLQkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFXzEwMDBfRlVMTDsKLQkJYnJlYWs7CisJCWdvdG8gZnVsbF9kdXBsZXhfb25seTsKIAljYXNlIFNQRUVEXzEwMDAgKyBIQUxGX0RVUExFWDoKIAkJRFBSSU5USyhQUk9CRSwgSU5GTywKIAkJCSJIYWxmIER1cGxleCBpcyBub3Qgc3VwcG9ydGVkIGF0IDEwMDAgTWJwc1xuIik7Ci0JCURQUklOVEsoUFJPQkUsIElORk8sCi0JCQkiVXNpbmcgQXV0b25lZ290aWF0aW9uIGF0IDEwMDAgTWJwcyAiCi0JCQkiRnVsbCBEdXBsZXggb25seVxuIik7Ci0JCWFkYXB0ZXItPmh3LmF1dG9uZWcgPSBhZGFwdGVyLT5mY19hdXRvbmVnID0gMTsKLQkJYWRhcHRlci0+aHcuYXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFXzEwMDBfRlVMTDsKLQkJYnJlYWs7CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU1BFRURfMTAwMCArIEZVTExfRFVQTEVYOgorZnVsbF9kdXBsZXhfb25seToKIAkJRFBSSU5USyhQUk9CRSwgSU5GTywKIAkJICAgICAgICJVc2luZyBBdXRvbmVnb3RpYXRpb24gYXQgMTAwMCBNYnBzIEZ1bGwgRHVwbGV4IG9ubHlcbiIpOwogCQlhZGFwdGVyLT5ody5hdXRvbmVnID0gYWRhcHRlci0+ZmNfYXV0b25lZyA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYyBiL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCmluZGV4IDkzZjJiN2EyLi5hMzYzMTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYworKysgYi9kcml2ZXJzL25ldC9mb3JjZWRldGguYwpAQCAtMTExLDYgKzExMSw3IEBACiAgKgkwLjU3OiAxNCBNYXkgMjAwNjogTWFjIGFkZHJlc3Mgc2V0IGluIHByb2JlL3JlbW92ZSBhbmQgb3JkZXIgY29ycmVjdGlvbnMuCiAgKgkwLjU4OiAzMCBPY3QgMjAwNjogQWRkZWQgc3VwcG9ydCBmb3Igc2lkZWJhbmQgbWFuYWdlbWVudCB1bml0LgogICoJMC41OTogMzAgT2N0IDIwMDY6IEFkZGVkIHN1cHBvcnQgZm9yIHJlY292ZXJhYmxlIGVycm9yLgorICoJMC42MDogMjAgSmFuIDIwMDc6IENvZGUgb3B0aW1pemF0aW9ucyBmb3IgcmluZ3MsIHJ4ICYgdHggZGF0YSBwYXRocywgYW5kIHN0YXRzLgogICoKICAqIEtub3duIGJ1Z3M6CiAgKiBXZSBzdXNwZWN0IHRoYXQgb24gc29tZSBoYXJkd2FyZSBubyBUWCBkb25lIGludGVycnVwdHMgYXJlIGdlbmVyYXRlZC4KQEAgLTEyNyw3ICsxMjgsNyBAQAogI2Vsc2UKICNkZWZpbmUgRFJJVkVSTkFQSQogI2VuZGlmCi0jZGVmaW5lIEZPUkNFREVUSF9WRVJTSU9OCQkiMC41OSIKKyNkZWZpbmUgRk9SQ0VERVRIX1ZFUlNJT04JCSIwLjYwIgogI2RlZmluZSBEUlZfTkFNRQkJCSJmb3JjZWRldGgiCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTE3Myw5ICsxNzQsMTAgQEAKICNkZWZpbmUgREVWX0hBU19NU0lfWCAgICAgICAgICAgMHgwMDgwICAvKiBkZXZpY2Ugc3VwcG9ydHMgTVNJLVggKi8KICNkZWZpbmUgREVWX0hBU19QT1dFUl9DTlRSTCAgICAgMHgwMTAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgcG93ZXIgc2F2aW5ncyAqLwogI2RlZmluZSBERVZfSEFTX1BBVVNFRlJBTUVfVFggICAweDAyMDAgIC8qIGRldmljZSBzdXBwb3J0cyB0eCBwYXVzZSBmcmFtZXMgKi8KLSNkZWZpbmUgREVWX0hBU19TVEFUSVNUSUNTICAgICAgMHgwNDAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgaHcgc3RhdGlzdGljcyAqLwotI2RlZmluZSBERVZfSEFTX1RFU1RfRVhURU5ERUQgICAweDA4MDAgIC8qIGRldmljZSBzdXBwb3J0cyBleHRlbmRlZCBkaWFnbm9zdGljIHRlc3QgKi8KLSNkZWZpbmUgREVWX0hBU19NR01UX1VOSVQgICAgICAgMHgxMDAwICAvKiBkZXZpY2Ugc3VwcG9ydHMgbWFuYWdlbWVudCB1bml0ICovCisjZGVmaW5lIERFVl9IQVNfU1RBVElTVElDU19WMSAgIDB4MDQwMCAgLyogZGV2aWNlIHN1cHBvcnRzIGh3IHN0YXRpc3RpY3MgdmVyc2lvbiAxICovCisjZGVmaW5lIERFVl9IQVNfU1RBVElTVElDU19WMiAgIDB4MDgwMCAgLyogZGV2aWNlIHN1cHBvcnRzIGh3IHN0YXRpc3RpY3MgdmVyc2lvbiAyICovCisjZGVmaW5lIERFVl9IQVNfVEVTVF9FWFRFTkRFRCAgIDB4MTAwMCAgLyogZGV2aWNlIHN1cHBvcnRzIGV4dGVuZGVkIGRpYWdub3N0aWMgdGVzdCAqLworI2RlZmluZSBERVZfSEFTX01HTVRfVU5JVCAgICAgICAweDIwMDAgIC8qIGRldmljZSBzdXBwb3J0cyBtYW5hZ2VtZW50IHVuaXQgKi8KIAogZW51bSB7CiAJTnZSZWdJcnFTdGF0dXMgPSAweDAwMCwKQEAgLTIxMCw3ICsyMTIsNyBAQAogICogTlZSRUdfUE9MTF9ERUZBVUxUPTk3IHdvdWxkIHJlc3VsdCBpbiBhbiBpbnRlcnZhbCBsZW5ndGggb2YgMSBtcwogICovCiAJTnZSZWdQb2xsaW5nSW50ZXJ2YWwgPSAweDAwYywKLSNkZWZpbmUgTlZSRUdfUE9MTF9ERUZBVUxUX1RIUk9VR0hQVVQJOTcwCisjZGVmaW5lIE5WUkVHX1BPTExfREVGQVVMVF9USFJPVUdIUFVUCTk3MCAvKiBiYWNrdXAgdHggY2xlYW51cCBpZiBsb29wIG1heCByZWFjaGVkICovCiAjZGVmaW5lIE5WUkVHX1BPTExfREVGQVVMVF9DUFUJMTMKIAlOdlJlZ01TSU1hcDAgPSAweDAyMCwKIAlOdlJlZ01TSU1hcDEgPSAweDAyNCwKQEAgLTMwNCw4ICszMDYsOCBAQAogI2RlZmluZSBOVlJFR19UWFJYQ1RMX1JFU0VUCTB4MDAxMAogI2RlZmluZSBOVlJFR19UWFJYQ1RMX1JYQ0hFQ0sJMHgwNDAwCiAjZGVmaW5lIE5WUkVHX1RYUlhDVExfREVTQ18xCTAKLSNkZWZpbmUgTlZSRUdfVFhSWENUTF9ERVNDXzIJMHgwMjEwMAotI2RlZmluZSBOVlJFR19UWFJYQ1RMX0RFU0NfMwkweDAyMjAwCisjZGVmaW5lIE5WUkVHX1RYUlhDVExfREVTQ18yCTB4MDAyMTAwCisjZGVmaW5lIE5WUkVHX1RYUlhDVExfREVTQ18zCTB4YzAyMjAwCiAjZGVmaW5lIE5WUkVHX1RYUlhDVExfVkxBTlNUUklQIDB4MDAwNDAKICNkZWZpbmUgTlZSRUdfVFhSWENUTF9WTEFOSU5TCTB4MDAwODAKIAlOdlJlZ1R4UmluZ1BoeXNBZGRySGlnaCA9IDB4MTQ4LApAQCAtNDg3LDcgKzQ4OSw4IEBACiAKIC8qIE1pc2NlbGFuZW91cyBoYXJkd2FyZSByZWxhdGVkIGRlZmluZXM6ICovCiAjZGVmaW5lIE5WX1BDSV9SRUdTWl9WRVIxICAgICAgCTB4MjcwCi0jZGVmaW5lIE5WX1BDSV9SRUdTWl9WRVIyICAgICAgCTB4NjA0CisjZGVmaW5lIE5WX1BDSV9SRUdTWl9WRVIyICAgICAgCTB4MmQ0CisjZGVmaW5lIE5WX1BDSV9SRUdTWl9WRVIzICAgICAgCTB4NjA0CiAKIC8qIHZhcmlvdXMgdGltZW91dCBkZWxheXM6IGFsbCBpbiB1c2VjICovCiAjZGVmaW5lIE5WX1RYUlhfUkVTRVRfREVMQVkJNApAQCAtNTE4LDEyICs1MjEsNiBAQAogI2RlZmluZSBUWF9SSU5HX01JTgkJNjQKICNkZWZpbmUgUklOR19NQVhfREVTQ19WRVJfMQkxMDI0CiAjZGVmaW5lIFJJTkdfTUFYX0RFU0NfVkVSXzJfMwkxNjM4NAotLyoKLSAqIERpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ2V0IGFuZCBwdXQgcG9pbnRlcnMgZm9yIHRoZSB0eCByaW5nLgotICogVGhpcyBpcyB1c2VkIHRvIHRocm90dGxlIHRoZSBhbW91bnQgb2YgZGF0YSBvdXRzdGFuZGluZyBpbiB0aGUKLSAqIHR4IHJpbmcuCi0gKi8KLSNkZWZpbmUgVFhfTElNSVRfRElGRkVSRU5DRQkxCiAKIC8qIHJ4L3R4IG1hYyBhZGRyICsgdHlwZSArIHZsYW4gKyBhbGlnbiArIHNsYWNrKi8KICNkZWZpbmUgTlZfUlhfSEVBREVSUwkJKDY0KQpAQCAtNjExLDkgKzYwOCw2IEBACiAJeyAidHhfY2Fycmllcl9lcnJvcnMiIH0sCiAJeyAidHhfZXhjZXNzX2RlZmVycmFsIiB9LAogCXsgInR4X3JldHJ5X2Vycm9yIiB9LAotCXsgInR4X2RlZmVycmFsIiB9LAotCXsgInR4X3BhY2tldHMiIH0sCi0JeyAidHhfcGF1c2UiIH0sCiAJeyAicnhfZnJhbWVfZXJyb3IiIH0sCiAJeyAicnhfZXh0cmFfYnl0ZSIgfSwKIAl7ICJyeF9sYXRlX2NvbGxpc2lvbiIgfSwKQEAgLTYyNiwxMSArNjIwLDE3IEBACiAJeyAicnhfdW5pY2FzdCIgfSwKIAl7ICJyeF9tdWx0aWNhc3QiIH0sCiAJeyAicnhfYnJvYWRjYXN0IiB9LAotCXsgInJ4X2J5dGVzIiB9LAotCXsgInJ4X3BhdXNlIiB9LAotCXsgInJ4X2Ryb3BfZnJhbWUiIH0sCiAJeyAicnhfcGFja2V0cyIgfSwKLQl7ICJyeF9lcnJvcnNfdG90YWwiIH0KKwl7ICJyeF9lcnJvcnNfdG90YWwiIH0sCisJeyAidHhfZXJyb3JzX3RvdGFsIiB9LAorCisJLyogdmVyc2lvbiAyIHN0YXRzICovCisJeyAidHhfZGVmZXJyYWwiIH0sCisJeyAidHhfcGFja2V0cyIgfSwKKwl7ICJyeF9ieXRlcyIgfSwKKwl7ICJ0eF9wYXVzZSIgfSwKKwl7ICJyeF9wYXVzZSIgfSwKKwl7ICJyeF9kcm9wX2ZyYW1lIiB9CiB9OwogCiBzdHJ1Y3QgbnZfZXRodG9vbF9zdGF0cyB7CkBAIC02NDMsOSArNjQzLDYgQEAKIAl1NjQgdHhfY2Fycmllcl9lcnJvcnM7CiAJdTY0IHR4X2V4Y2Vzc19kZWZlcnJhbDsKIAl1NjQgdHhfcmV0cnlfZXJyb3I7Ci0JdTY0IHR4X2RlZmVycmFsOwotCXU2NCB0eF9wYWNrZXRzOwotCXU2NCB0eF9wYXVzZTsKIAl1NjQgcnhfZnJhbWVfZXJyb3I7CiAJdTY0IHJ4X2V4dHJhX2J5dGU7CiAJdTY0IHJ4X2xhdGVfY29sbGlzaW9uOwpAQCAtNjU4LDEzICs2NTUsMjIgQEAKIAl1NjQgcnhfdW5pY2FzdDsKIAl1NjQgcnhfbXVsdGljYXN0OwogCXU2NCByeF9icm9hZGNhc3Q7Ci0JdTY0IHJ4X2J5dGVzOwotCXU2NCByeF9wYXVzZTsKLQl1NjQgcnhfZHJvcF9mcmFtZTsKIAl1NjQgcnhfcGFja2V0czsKIAl1NjQgcnhfZXJyb3JzX3RvdGFsOworCXU2NCB0eF9lcnJvcnNfdG90YWw7CisKKwkvKiB2ZXJzaW9uIDIgc3RhdHMgKi8KKwl1NjQgdHhfZGVmZXJyYWw7CisJdTY0IHR4X3BhY2tldHM7CisJdTY0IHJ4X2J5dGVzOworCXU2NCB0eF9wYXVzZTsKKwl1NjQgcnhfcGF1c2U7CisJdTY0IHJ4X2Ryb3BfZnJhbWU7CiB9OwogCisjZGVmaW5lIE5WX0RFVl9TVEFUSVNUSUNTX1YyX0NPVU5UIChzaXplb2Yoc3RydWN0IG52X2V0aHRvb2xfc3RhdHMpL3NpemVvZih1NjQpKQorI2RlZmluZSBOVl9ERVZfU1RBVElTVElDU19WMV9DT1VOVCAoTlZfREVWX1NUQVRJU1RJQ1NfVjJfQ09VTlQgLSA2KQorCiAvKiBkaWFnbm9zdGljcyAqLwogI2RlZmluZSBOVl9URVNUX0NPVU5UX0JBU0UgMwogI2RlZmluZSBOVl9URVNUX0NPVU5UX0VYVEVOREVEIDQKQEAgLTY5MSw2ICs2OTcsMTIgQEAKIAl7IDAsMCB9CiB9OwogCitzdHJ1Y3QgbnZfc2tiX21hcCB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90IGRtYTsKKwl1bnNpZ25lZCBpbnQgZG1hX2xlbjsKK307CisKIC8qCiAgKiBTTVAgbG9ja2luZzoKICAqIEFsbCBoYXJkd2FyZSBhY2Nlc3MgdW5kZXIgZGV2LT5wcml2LT5sb2NrLCBleGNlcHQgdGhlIHBlcmZvcm1hbmNlCkBAIC03NDEsMTAgKzc1MywxMiBAQAogCS8qIHJ4IHNwZWNpZmljIGZpZWxkcy4KIAkgKiBMb2NraW5nOiBXaXRoaW4gaXJxIGhhbmRlciBvciBkaXNhYmxlX2lycStzcGluX2xvY2soJm5wLT5sb2NrKTsKIAkgKi8KKwl1bmlvbiByaW5nX3R5cGUgZ2V0X3J4LCBwdXRfcngsIGZpcnN0X3J4LCBsYXN0X3J4OworCXN0cnVjdCBudl9za2JfbWFwICpnZXRfcnhfY3R4LCAqcHV0X3J4X2N0eDsKKwlzdHJ1Y3QgbnZfc2tiX21hcCAqZmlyc3RfcnhfY3R4LCAqbGFzdF9yeF9jdHg7CisJc3RydWN0IG52X3NrYl9tYXAgKnJ4X3NrYjsKKwogCXVuaW9uIHJpbmdfdHlwZSByeF9yaW5nOwotCXVuc2lnbmVkIGludCBjdXJfcngsIHJlZmlsbF9yeDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqKnJ4X3NrYnVmZjsKLQlkbWFfYWRkcl90ICpyeF9kbWE7CiAJdW5zaWduZWQgaW50IHJ4X2J1Zl9zejsKIAl1bnNpZ25lZCBpbnQgcGt0X2xpbWl0OwogCXN0cnVjdCB0aW1lcl9saXN0IG9vbV9raWNrOwpAQCAtNzYxLDE1ICs3NzUsMTUgQEAKIAkvKgogCSAqIHR4IHNwZWNpZmljIGZpZWxkcy4KIAkgKi8KKwl1bmlvbiByaW5nX3R5cGUgZ2V0X3R4LCBwdXRfdHgsIGZpcnN0X3R4LCBsYXN0X3R4OworCXN0cnVjdCBudl9za2JfbWFwICpnZXRfdHhfY3R4LCAqcHV0X3R4X2N0eDsKKwlzdHJ1Y3QgbnZfc2tiX21hcCAqZmlyc3RfdHhfY3R4LCAqbGFzdF90eF9jdHg7CisJc3RydWN0IG52X3NrYl9tYXAgKnR4X3NrYjsKKwogCXVuaW9uIHJpbmdfdHlwZSB0eF9yaW5nOwotCXVuc2lnbmVkIGludCBuZXh0X3R4LCBuaWNfdHg7Ci0Jc3RydWN0IHNrX2J1ZmYgKip0eF9za2J1ZmY7Ci0JZG1hX2FkZHJfdCAqdHhfZG1hOwotCXVuc2lnbmVkIGludCAqdHhfZG1hX2xlbjsKIAl1MzIgdHhfZmxhZ3M7CiAJaW50IHR4X3Jpbmdfc2l6ZTsKLQlpbnQgdHhfbGltaXRfc3RhcnQ7Ci0JaW50IHR4X2xpbWl0X3N0b3A7CisJaW50IHR4X3N0b3A7CiAKIAkvKiB2bGFuIGZpZWxkcyAqLwogCXN0cnVjdCB2bGFuX2dyb3VwICp2bGFuZ3JwOwpAQCAtOTIxLDE2ICs5MzUsMTAgQEAKIAkJCXBjaV9mcmVlX2NvbnNpc3RlbnQobnAtPnBjaV9kZXYsIHNpemVvZihzdHJ1Y3QgcmluZ19kZXNjX2V4KSAqIChucC0+cnhfcmluZ19zaXplICsgbnAtPnR4X3Jpbmdfc2l6ZSksCiAJCQkJCSAgICBucC0+cnhfcmluZy5leCwgbnAtPnJpbmdfYWRkcik7CiAJfQotCWlmIChucC0+cnhfc2tidWZmKQotCQlrZnJlZShucC0+cnhfc2tidWZmKTsKLQlpZiAobnAtPnJ4X2RtYSkKLQkJa2ZyZWUobnAtPnJ4X2RtYSk7Ci0JaWYgKG5wLT50eF9za2J1ZmYpCi0JCWtmcmVlKG5wLT50eF9za2J1ZmYpOwotCWlmIChucC0+dHhfZG1hKQotCQlrZnJlZShucC0+dHhfZG1hKTsKLQlpZiAobnAtPnR4X2RtYV9sZW4pCi0JCWtmcmVlKG5wLT50eF9kbWFfbGVuKTsKKwlpZiAobnAtPnJ4X3NrYikKKwkJa2ZyZWUobnAtPnJ4X3NrYik7CisJaWYgKG5wLT50eF9za2IpCisJCWtmcmVlKG5wLT50eF9za2IpOwogfQogCiBzdGF0aWMgaW50IHVzaW5nX211bHRpX2lycXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTEyNzksNiArMTI4Nyw2MSBAQAogCXBjaV9wdXNoKGJhc2UpOwogfQogCitzdGF0aWMgdm9pZCBudl9nZXRfaHdfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisKKwlucC0+ZXN0YXRzLnR4X2J5dGVzICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4Q250KTsKKwlucC0+ZXN0YXRzLnR4X3plcm9fcmV4bXQgKz0gcmVhZGwoYmFzZSArIE52UmVnVHhaZXJvUmVYbXQpOworCW5wLT5lc3RhdHMudHhfb25lX3JleG10ICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4T25lUmVYbXQpOworCW5wLT5lc3RhdHMudHhfbWFueV9yZXhtdCArPSByZWFkbChiYXNlICsgTnZSZWdUeE1hbnlSZVhtdCk7CisJbnAtPmVzdGF0cy50eF9sYXRlX2NvbGxpc2lvbiArPSByZWFkbChiYXNlICsgTnZSZWdUeExhdGVDb2wpOworCW5wLT5lc3RhdHMudHhfZmlmb19lcnJvcnMgKz0gcmVhZGwoYmFzZSArIE52UmVnVHhVbmRlcmZsb3cpOworCW5wLT5lc3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKz0gcmVhZGwoYmFzZSArIE52UmVnVHhMb3NzQ2Fycmllcik7CisJbnAtPmVzdGF0cy50eF9leGNlc3NfZGVmZXJyYWwgKz0gcmVhZGwoYmFzZSArIE52UmVnVHhFeGNlc3NEZWYpOworCW5wLT5lc3RhdHMudHhfcmV0cnlfZXJyb3IgKz0gcmVhZGwoYmFzZSArIE52UmVnVHhSZXRyeUVycik7CisJbnAtPmVzdGF0cy5yeF9mcmFtZV9lcnJvciArPSByZWFkbChiYXNlICsgTnZSZWdSeEZyYW1lRXJyKTsKKwlucC0+ZXN0YXRzLnJ4X2V4dHJhX2J5dGUgKz0gcmVhZGwoYmFzZSArIE52UmVnUnhFeHRyYUJ5dGUpOworCW5wLT5lc3RhdHMucnhfbGF0ZV9jb2xsaXNpb24gKz0gcmVhZGwoYmFzZSArIE52UmVnUnhMYXRlQ29sKTsKKwlucC0+ZXN0YXRzLnJ4X3J1bnQgKz0gcmVhZGwoYmFzZSArIE52UmVnUnhSdW50KTsKKwlucC0+ZXN0YXRzLnJ4X2ZyYW1lX3Rvb19sb25nICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4RnJhbWVUb29Mb25nKTsKKwlucC0+ZXN0YXRzLnJ4X292ZXJfZXJyb3JzICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4T3ZlcmZsb3cpOworCW5wLT5lc3RhdHMucnhfY3JjX2Vycm9ycyArPSByZWFkbChiYXNlICsgTnZSZWdSeEZDU0Vycik7CisJbnAtPmVzdGF0cy5yeF9mcmFtZV9hbGlnbl9lcnJvciArPSByZWFkbChiYXNlICsgTnZSZWdSeEZyYW1lQWxpZ25FcnIpOworCW5wLT5lc3RhdHMucnhfbGVuZ3RoX2Vycm9yICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4TGVuRXJyKTsKKwlucC0+ZXN0YXRzLnJ4X3VuaWNhc3QgKz0gcmVhZGwoYmFzZSArIE52UmVnUnhVbmljYXN0KTsKKwlucC0+ZXN0YXRzLnJ4X211bHRpY2FzdCArPSByZWFkbChiYXNlICsgTnZSZWdSeE11bHRpY2FzdCk7CisJbnAtPmVzdGF0cy5yeF9icm9hZGNhc3QgKz0gcmVhZGwoYmFzZSArIE52UmVnUnhCcm9hZGNhc3QpOworCW5wLT5lc3RhdHMucnhfcGFja2V0cyA9CisJCW5wLT5lc3RhdHMucnhfdW5pY2FzdCArCisJCW5wLT5lc3RhdHMucnhfbXVsdGljYXN0ICsKKwkJbnAtPmVzdGF0cy5yeF9icm9hZGNhc3Q7CisJbnAtPmVzdGF0cy5yeF9lcnJvcnNfdG90YWwgPQorCQlucC0+ZXN0YXRzLnJ4X2NyY19lcnJvcnMgKworCQlucC0+ZXN0YXRzLnJ4X292ZXJfZXJyb3JzICsKKwkJbnAtPmVzdGF0cy5yeF9mcmFtZV9lcnJvciArCisJCShucC0+ZXN0YXRzLnJ4X2ZyYW1lX2FsaWduX2Vycm9yIC0gbnAtPmVzdGF0cy5yeF9leHRyYV9ieXRlKSArCisJCW5wLT5lc3RhdHMucnhfbGF0ZV9jb2xsaXNpb24gKworCQlucC0+ZXN0YXRzLnJ4X3J1bnQgKworCQlucC0+ZXN0YXRzLnJ4X2ZyYW1lX3Rvb19sb25nOworCW5wLT5lc3RhdHMudHhfZXJyb3JzX3RvdGFsID0KKwkJbnAtPmVzdGF0cy50eF9sYXRlX2NvbGxpc2lvbiArCisJCW5wLT5lc3RhdHMudHhfZmlmb19lcnJvcnMgKworCQlucC0+ZXN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzICsKKwkJbnAtPmVzdGF0cy50eF9leGNlc3NfZGVmZXJyYWwgKworCQlucC0+ZXN0YXRzLnR4X3JldHJ5X2Vycm9yOworCisJaWYgKG5wLT5kcml2ZXJfZGF0YSAmIERFVl9IQVNfU1RBVElTVElDU19WMikgeworCQlucC0+ZXN0YXRzLnR4X2RlZmVycmFsICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4RGVmKTsKKwkJbnAtPmVzdGF0cy50eF9wYWNrZXRzICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4RnJhbWUpOworCQlucC0+ZXN0YXRzLnJ4X2J5dGVzICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4Q250KTsKKwkJbnAtPmVzdGF0cy50eF9wYXVzZSArPSByZWFkbChiYXNlICsgTnZSZWdUeFBhdXNlKTsKKwkJbnAtPmVzdGF0cy5yeF9wYXVzZSArPSByZWFkbChiYXNlICsgTnZSZWdSeFBhdXNlKTsKKwkJbnAtPmVzdGF0cy5yeF9kcm9wX2ZyYW1lICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4RHJvcEZyYW1lKTsKKwl9Cit9CisKIC8qCiAgKiBudl9nZXRfc3RhdHM6IGRldi0+Z2V0X3N0YXRzIGZ1bmN0aW9uCiAgKiBHZXQgbGF0ZXN0IHN0YXRzIHZhbHVlIGZyb20gdGhlIG5pYy4KQEAgLTEyODksMTAgKzEzNTIsMTkgQEAKIHsKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JLyogSXQgc2VlbXMgdGhhdCB0aGUgbmljIGFsd2F5cyBnZW5lcmF0ZXMgaW50ZXJydXB0cyBhbmQgZG9lc24ndAotCSAqIGFjY3VtdWxhdGUgZXJyb3JzIGludGVybmFsbHkuIFRodXMgdGhlIGN1cnJlbnQgdmFsdWVzIGluIG5wLT5zdGF0cwotCSAqIGFyZSBhbHJlYWR5IHVwIHRvIGRhdGUuCi0JICovCisJLyogSWYgdGhlIG5pYyBzdXBwb3J0cyBodyBjb3VudGVycyB0aGVuIHJldHJpZXZlIGxhdGVzdCB2YWx1ZXMgKi8KKwlpZiAobnAtPmRyaXZlcl9kYXRhICYgKERFVl9IQVNfU1RBVElTVElDU19WMXxERVZfSEFTX1NUQVRJU1RJQ1NfVjIpKSB7CisJCW52X2dldF9od19zdGF0cyhkZXYpOworCisJCS8qIGNvcHkgdG8gbmV0X2RldmljZSBzdGF0cyAqLworCQlucC0+c3RhdHMudHhfYnl0ZXMgPSBucC0+ZXN0YXRzLnR4X2J5dGVzOworCQlucC0+c3RhdHMudHhfZmlmb19lcnJvcnMgPSBucC0+ZXN0YXRzLnR4X2ZpZm9fZXJyb3JzOworCQlucC0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgPSBucC0+ZXN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzOworCQlucC0+c3RhdHMucnhfY3JjX2Vycm9ycyA9IG5wLT5lc3RhdHMucnhfY3JjX2Vycm9yczsKKwkJbnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzID0gbnAtPmVzdGF0cy5yeF9vdmVyX2Vycm9yczsKKwkJbnAtPnN0YXRzLnJ4X2Vycm9ycyA9IG5wLT5lc3RhdHMucnhfZXJyb3JzX3RvdGFsOworCQlucC0+c3RhdHMudHhfZXJyb3JzID0gbnAtPmVzdGF0cy50eF9lcnJvcnNfdG90YWw7CisJfQogCXJldHVybiAmbnAtPnN0YXRzOwogfQogCkBAIC0xMzA0LDQzICsxMzc2LDYzIEBACiBzdGF0aWMgaW50IG52X2FsbG9jX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBpbnQgcmVmaWxsX3J4ID0gbnAtPnJlZmlsbF9yeDsKLQlpbnQgbnI7CisJc3RydWN0IHJpbmdfZGVzYyogbGVzc19yeDsKIAotCXdoaWxlIChucC0+Y3VyX3J4ICE9IHJlZmlsbF9yeCkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWxlc3NfcnggPSBucC0+Z2V0X3J4Lm9yaWc7CisJaWYgKGxlc3NfcngtLSA9PSBucC0+Zmlyc3Rfcngub3JpZykKKwkJbGVzc19yeCA9IG5wLT5sYXN0X3J4Lm9yaWc7CiAKLQkJbnIgPSByZWZpbGxfcnggJSBucC0+cnhfcmluZ19zaXplOwotCQlpZiAobnAtPnJ4X3NrYnVmZltucl0gPT0gTlVMTCkgewotCi0JCQlza2IgPSBkZXZfYWxsb2Nfc2tiKG5wLT5yeF9idWZfc3ogKyBOVl9SWF9BTExPQ19QQUQpOwotCQkJaWYgKCFza2IpCi0JCQkJYnJlYWs7Ci0KKwl3aGlsZSAobnAtPnB1dF9yeC5vcmlnICE9IGxlc3NfcngpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IobnAtPnJ4X2J1Zl9zeiArIE5WX1JYX0FMTE9DX1BBRCk7CisJCWlmIChza2IpIHsKIAkJCXNrYi0+ZGV2ID0gZGV2OwotCQkJbnAtPnJ4X3NrYnVmZltucl0gPSBza2I7Ci0JCX0gZWxzZSB7Ci0JCQlza2IgPSBucC0+cnhfc2tidWZmW25yXTsKLQkJfQotCQlucC0+cnhfZG1hW25yXSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsCi0JCQkJCXNrYi0+ZW5kLXNrYi0+ZGF0YSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKSB7Ci0JCQlucC0+cnhfcmluZy5vcmlnW25yXS5idWYgPSBjcHVfdG9fbGUzMihucC0+cnhfZG1hW25yXSk7CisJCQlucC0+cHV0X3J4X2N0eC0+c2tiID0gc2tiOworCQkJbnAtPnB1dF9yeF9jdHgtPmRtYSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsCisJCQkJCQkJICAgICBza2ItPmVuZC1za2ItPmRhdGEsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlucC0+cHV0X3J4X2N0eC0+ZG1hX2xlbiA9IHNrYi0+ZW5kLXNrYi0+ZGF0YTsKKwkJCW5wLT5wdXRfcngub3JpZy0+YnVmID0gY3B1X3RvX2xlMzIobnAtPnB1dF9yeF9jdHgtPmRtYSk7CiAJCQl3bWIoKTsKLQkJCW5wLT5yeF9yaW5nLm9yaWdbbnJdLmZsYWdsZW4gPSBjcHVfdG9fbGUzMihucC0+cnhfYnVmX3N6IHwgTlZfUlhfQVZBSUwpOworCQkJbnAtPnB1dF9yeC5vcmlnLT5mbGFnbGVuID0gY3B1X3RvX2xlMzIobnAtPnJ4X2J1Zl9zeiB8IE5WX1JYX0FWQUlMKTsKKwkJCWlmICh1bmxpa2VseShucC0+cHV0X3J4Lm9yaWcrKyA9PSBucC0+bGFzdF9yeC5vcmlnKSkKKwkJCQlucC0+cHV0X3J4Lm9yaWcgPSBucC0+Zmlyc3Rfcngub3JpZzsKKwkJCWlmICh1bmxpa2VseShucC0+cHV0X3J4X2N0eCsrID09IG5wLT5sYXN0X3J4X2N0eCkpCisJCQkJbnAtPnB1dF9yeF9jdHggPSBucC0+Zmlyc3RfcnhfY3R4OwogCQl9IGVsc2UgewotCQkJbnAtPnJ4X3JpbmcuZXhbbnJdLmJ1ZmhpZ2ggPSBjcHVfdG9fbGU2NChucC0+cnhfZG1hW25yXSkgPj4gMzI7Ci0JCQlucC0+cnhfcmluZy5leFtucl0uYnVmbG93ID0gY3B1X3RvX2xlNjQobnAtPnJ4X2RtYVtucl0pICYgMHgwRkZGRkZGRkY7Ci0JCQl3bWIoKTsKLQkJCW5wLT5yeF9yaW5nLmV4W25yXS5mbGFnbGVuID0gY3B1X3RvX2xlMzIobnAtPnJ4X2J1Zl9zeiB8IE5WX1JYMl9BVkFJTCk7CisJCQlyZXR1cm4gMTsKIAkJfQotCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9hbGxvY19yeDogUGFja2V0ICVkIG1hcmtlZCBhcyBBdmFpbGFibGVcbiIsCi0JCQkJCWRldi0+bmFtZSwgcmVmaWxsX3J4KTsKLQkJcmVmaWxsX3J4Kys7CiAJfQotCW5wLT5yZWZpbGxfcnggPSByZWZpbGxfcng7Ci0JaWYgKG5wLT5jdXJfcnggLSByZWZpbGxfcnggPT0gbnAtPnJ4X3Jpbmdfc2l6ZSkKLQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnZfYWxsb2Nfcnhfb3B0aW1pemVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcmluZ19kZXNjX2V4KiBsZXNzX3J4OworCisJbGVzc19yeCA9IG5wLT5nZXRfcnguZXg7CisJaWYgKGxlc3NfcngtLSA9PSBucC0+Zmlyc3RfcnguZXgpCisJCWxlc3NfcnggPSBucC0+bGFzdF9yeC5leDsKKworCXdoaWxlIChucC0+cHV0X3J4LmV4ICE9IGxlc3NfcngpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2IobnAtPnJ4X2J1Zl9zeiArIE5WX1JYX0FMTE9DX1BBRCk7CisJCWlmIChza2IpIHsKKwkJCXNrYi0+ZGV2ID0gZGV2OworCQkJbnAtPnB1dF9yeF9jdHgtPnNrYiA9IHNrYjsKKwkJCW5wLT5wdXRfcnhfY3R4LT5kbWEgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT5kYXRhLAorCQkJCQkJCSAgICAgc2tiLT5lbmQtc2tiLT5kYXRhLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJbnAtPnB1dF9yeF9jdHgtPmRtYV9sZW4gPSBza2ItPmVuZC1za2ItPmRhdGE7CisJCQlucC0+cHV0X3J4LmV4LT5idWZoaWdoID0gY3B1X3RvX2xlNjQobnAtPnB1dF9yeF9jdHgtPmRtYSkgPj4gMzI7CisJCQlucC0+cHV0X3J4LmV4LT5idWZsb3cgPSBjcHVfdG9fbGU2NChucC0+cHV0X3J4X2N0eC0+ZG1hKSAmIDB4MEZGRkZGRkZGOworCQkJd21iKCk7CisJCQlucC0+cHV0X3J4LmV4LT5mbGFnbGVuID0gY3B1X3RvX2xlMzIobnAtPnJ4X2J1Zl9zeiB8IE5WX1JYMl9BVkFJTCk7CisJCQlpZiAodW5saWtlbHkobnAtPnB1dF9yeC5leCsrID09IG5wLT5sYXN0X3J4LmV4KSkKKwkJCQlucC0+cHV0X3J4LmV4ID0gbnAtPmZpcnN0X3J4LmV4OworCQkJaWYgKHVubGlrZWx5KG5wLT5wdXRfcnhfY3R4KysgPT0gbnAtPmxhc3RfcnhfY3R4KSkKKwkJCQlucC0+cHV0X3J4X2N0eCA9IG5wLT5maXJzdF9yeF9jdHg7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM1OCw2ICsxNDUwLDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0Y29kZTsKIAogCWlmICghdXNpbmdfbXVsdGlfaXJxcyhkZXYpKSB7CiAJCWlmIChucC0+bXNpX2ZsYWdzICYgTlZfTVNJX1hfRU5BQkxFRCkKQEAgLTEzNjcsNyArMTQ2MCwxMSBAQAogCX0gZWxzZSB7CiAJCWRpc2FibGVfaXJxKG5wLT5tc2lfeF9lbnRyeVtOVl9NU0lfWF9WRUNUT1JfUlhdLnZlY3Rvcik7CiAJfQotCWlmIChudl9hbGxvY19yeChkZXYpKSB7CisJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKQorCQlyZXRjb2RlID0gbnZfYWxsb2NfcngoZGV2KTsKKwllbHNlCisJCXJldGNvZGUgPSBudl9hbGxvY19yeF9vcHRpbWl6ZWQoZGV2KTsKKwlpZiAocmV0Y29kZSkgewogCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CiAJCWlmICghbnAtPmluX3NodXRkb3duKQogCQkJbW9kX3RpbWVyKCZucC0+b29tX2tpY2ssIGppZmZpZXMgKyBPT01fUkVGSUxMKTsKQEAgLTEzODgsNTYgKzE0ODUsODEgQEAKIHsKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpOworCW5wLT5nZXRfcnggPSBucC0+cHV0X3J4ID0gbnAtPmZpcnN0X3J4ID0gbnAtPnJ4X3Jpbmc7CisJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKQorCQlucC0+bGFzdF9yeC5vcmlnID0gJm5wLT5yeF9yaW5nLm9yaWdbbnAtPnJ4X3Jpbmdfc2l6ZS0xXTsKKwllbHNlCisJCW5wLT5sYXN0X3J4LmV4ID0gJm5wLT5yeF9yaW5nLmV4W25wLT5yeF9yaW5nX3NpemUtMV07CisJbnAtPmdldF9yeF9jdHggPSBucC0+cHV0X3J4X2N0eCA9IG5wLT5maXJzdF9yeF9jdHggPSBucC0+cnhfc2tiOworCW5wLT5sYXN0X3J4X2N0eCA9ICZucC0+cnhfc2tiW25wLT5yeF9yaW5nX3NpemUtMV07CiAKLQlucC0+Y3VyX3J4ID0gbnAtPnJ4X3Jpbmdfc2l6ZTsKLQlucC0+cmVmaWxsX3J4ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbnAtPnJ4X3Jpbmdfc2l6ZTsgaSsrKQotCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpCisJZm9yIChpID0gMDsgaSA8IG5wLT5yeF9yaW5nX3NpemU7IGkrKykgeworCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpIHsKIAkJCW5wLT5yeF9yaW5nLm9yaWdbaV0uZmxhZ2xlbiA9IDA7Ci0JICAgICAgICBlbHNlCisJCQlucC0+cnhfcmluZy5vcmlnW2ldLmJ1ZiA9IDA7CisJCX0gZWxzZSB7CiAJCQlucC0+cnhfcmluZy5leFtpXS5mbGFnbGVuID0gMDsKKwkJCW5wLT5yeF9yaW5nLmV4W2ldLnR4dmxhbiA9IDA7CisJCQlucC0+cnhfcmluZy5leFtpXS5idWZoaWdoID0gMDsKKwkJCW5wLT5yeF9yaW5nLmV4W2ldLmJ1ZmxvdyA9IDA7CisJCX0KKwkJbnAtPnJ4X3NrYltpXS5za2IgPSBOVUxMOworCQlucC0+cnhfc2tiW2ldLmRtYSA9IDA7CisJfQogfQogCiBzdGF0aWMgdm9pZCBudl9pbml0X3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaTsKKwlucC0+Z2V0X3R4ID0gbnAtPnB1dF90eCA9IG5wLT5maXJzdF90eCA9IG5wLT50eF9yaW5nOworCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikKKwkJbnAtPmxhc3RfdHgub3JpZyA9ICZucC0+dHhfcmluZy5vcmlnW25wLT50eF9yaW5nX3NpemUtMV07CisJZWxzZQorCQlucC0+bGFzdF90eC5leCA9ICZucC0+dHhfcmluZy5leFtucC0+dHhfcmluZ19zaXplLTFdOworCW5wLT5nZXRfdHhfY3R4ID0gbnAtPnB1dF90eF9jdHggPSBucC0+Zmlyc3RfdHhfY3R4ID0gbnAtPnR4X3NrYjsKKwlucC0+bGFzdF90eF9jdHggPSAmbnAtPnR4X3NrYltucC0+dHhfcmluZ19zaXplLTFdOwogCi0JbnAtPm5leHRfdHggPSBucC0+bmljX3R4ID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbnAtPnR4X3Jpbmdfc2l6ZTsgaSsrKSB7Ci0JCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikKKwkJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKSB7CiAJCQlucC0+dHhfcmluZy5vcmlnW2ldLmZsYWdsZW4gPSAwOwotCSAgICAgICAgZWxzZQorCQkJbnAtPnR4X3Jpbmcub3JpZ1tpXS5idWYgPSAwOworCQl9IGVsc2UgewogCQkJbnAtPnR4X3JpbmcuZXhbaV0uZmxhZ2xlbiA9IDA7Ci0JCW5wLT50eF9za2J1ZmZbaV0gPSBOVUxMOwotCQlucC0+dHhfZG1hW2ldID0gMDsKKwkJCW5wLT50eF9yaW5nLmV4W2ldLnR4dmxhbiA9IDA7CisJCQlucC0+dHhfcmluZy5leFtpXS5idWZoaWdoID0gMDsKKwkJCW5wLT50eF9yaW5nLmV4W2ldLmJ1ZmxvdyA9IDA7CisJCX0KKwkJbnAtPnR4X3NrYltpXS5za2IgPSBOVUxMOworCQlucC0+dHhfc2tiW2ldLmRtYSA9IDA7CiAJfQogfQogCiBzdGF0aWMgaW50IG52X2luaXRfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCXN0cnVjdCBmZV9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CisKIAludl9pbml0X3R4KGRldik7CiAJbnZfaW5pdF9yeChkZXYpOwotCXJldHVybiBudl9hbGxvY19yeChkZXYpOworCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikKKwkJcmV0dXJuIG52X2FsbG9jX3J4KGRldik7CisJZWxzZQorCQlyZXR1cm4gbnZfYWxsb2Nfcnhfb3B0aW1pemVkKGRldik7CiB9CiAKLXN0YXRpYyBpbnQgbnZfcmVsZWFzZV90eHNrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc2tibnIpCitzdGF0aWMgaW50IG52X3JlbGVhc2VfdHhza2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG52X3NrYl9tYXAqIHR4X3NrYikKIHsKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JZHByaW50ayhLRVJOX0lORk8gIiVzOiBudl9yZWxlYXNlX3R4c2tiIGZvciBza2JuciAlZFxuIiwKLQkJZGV2LT5uYW1lLCBza2Jucik7Ci0KLQlpZiAobnAtPnR4X2RtYVtza2Jucl0pIHsKLQkJcGNpX3VubWFwX3BhZ2UobnAtPnBjaV9kZXYsIG5wLT50eF9kbWFbc2tibnJdLAotCQkJICAgICAgIG5wLT50eF9kbWFfbGVuW3NrYm5yXSwKKwlpZiAodHhfc2tiLT5kbWEpIHsKKwkJcGNpX3VubWFwX3BhZ2UobnAtPnBjaV9kZXYsIHR4X3NrYi0+ZG1hLAorCQkJICAgICAgIHR4X3NrYi0+ZG1hX2xlbiwKIAkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJbnAtPnR4X2RtYVtza2Jucl0gPSAwOworCQl0eF9za2ItPmRtYSA9IDA7CiAJfQotCi0JaWYgKG5wLT50eF9za2J1ZmZbc2tibnJdKSB7Ci0JCWRldl9rZnJlZV9za2JfYW55KG5wLT50eF9za2J1ZmZbc2tibnJdKTsKLQkJbnAtPnR4X3NrYnVmZltza2Jucl0gPSBOVUxMOworCWlmICh0eF9za2ItPnNrYikgeworCQlkZXZfa2ZyZWVfc2tiX2FueSh0eF9za2ItPnNrYik7CisJCXR4X3NrYi0+c2tiID0gTlVMTDsKIAkJcmV0dXJuIDE7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIDA7CkBAIC0xNDUwLDExICsxNTcyLDE2IEBACiAJdW5zaWduZWQgaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnAtPnR4X3Jpbmdfc2l6ZTsgaSsrKSB7Ci0JCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikKKwkJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKSB7CiAJCQlucC0+dHhfcmluZy5vcmlnW2ldLmZsYWdsZW4gPSAwOwotCQllbHNlCisJCQlucC0+dHhfcmluZy5vcmlnW2ldLmJ1ZiA9IDA7CisJCX0gZWxzZSB7CiAJCQlucC0+dHhfcmluZy5leFtpXS5mbGFnbGVuID0gMDsKLQkJaWYgKG52X3JlbGVhc2VfdHhza2IoZGV2LCBpKSkKKwkJCW5wLT50eF9yaW5nLmV4W2ldLnR4dmxhbiA9IDA7CisJCQlucC0+dHhfcmluZy5leFtpXS5idWZoaWdoID0gMDsKKwkJCW5wLT50eF9yaW5nLmV4W2ldLmJ1ZmxvdyA9IDA7CisJCX0KKwkJaWYgKG52X3JlbGVhc2VfdHhza2IoZGV2LCAmbnAtPnR4X3NrYltpXSkpCiAJCQlucC0+c3RhdHMudHhfZHJvcHBlZCsrOwogCX0KIH0KQEAgLTE0NjMsMTggKzE1OTAsMjQgQEAKIHsKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpOworCiAJZm9yIChpID0gMDsgaSA8IG5wLT5yeF9yaW5nX3NpemU7IGkrKykgewotCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpCisJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikgewogCQkJbnAtPnJ4X3Jpbmcub3JpZ1tpXS5mbGFnbGVuID0gMDsKLQkJZWxzZQorCQkJbnAtPnJ4X3Jpbmcub3JpZ1tpXS5idWYgPSAwOworCQl9IGVsc2UgewogCQkJbnAtPnJ4X3JpbmcuZXhbaV0uZmxhZ2xlbiA9IDA7CisJCQlucC0+cnhfcmluZy5leFtpXS50eHZsYW4gPSAwOworCQkJbnAtPnJ4X3JpbmcuZXhbaV0uYnVmaGlnaCA9IDA7CisJCQlucC0+cnhfcmluZy5leFtpXS5idWZsb3cgPSAwOworCQl9CiAJCXdtYigpOwotCQlpZiAobnAtPnJ4X3NrYnVmZltpXSkgewotCQkJcGNpX3VubWFwX3NpbmdsZShucC0+cGNpX2RldiwgbnAtPnJ4X2RtYVtpXSwKLQkJCQkJCW5wLT5yeF9za2J1ZmZbaV0tPmVuZC1ucC0+cnhfc2tidWZmW2ldLT5kYXRhLAorCQlpZiAobnAtPnJ4X3NrYltpXS5za2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT5yeF9za2JbaV0uZG1hLAorCQkJCQkJbnAtPnJ4X3NrYltpXS5za2ItPmVuZC1ucC0+cnhfc2tiW2ldLnNrYi0+ZGF0YSwKIAkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlkZXZfa2ZyZWVfc2tiKG5wLT5yeF9za2J1ZmZbaV0pOwotCQkJbnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7CisJCQlkZXZfa2ZyZWVfc2tiKG5wLT5yeF9za2JbaV0uc2tiKTsKKwkJCW5wLT5yeF9za2JbaV0uc2tiID0gTlVMTDsKIAkJfQogCX0KIH0KQEAgLTE0ODUsNiArMTYxOCwxMSBAQAogCW52X2RyYWluX3J4KGRldik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTMyIG52X2dldF9lbXB0eV90eF9zbG90cyhzdHJ1Y3QgZmVfcHJpdiAqbnApCit7CisJcmV0dXJuICh1MzIpKG5wLT50eF9yaW5nX3NpemUgLSAoKG5wLT50eF9yaW5nX3NpemUgKyAobnAtPnB1dF90eF9jdHggLSBucC0+Z2V0X3R4X2N0eCkpICUgbnAtPnR4X3Jpbmdfc2l6ZSkpOworfQorCiAvKgogICogbnZfc3RhcnRfeG1pdDogZGV2LT5oYXJkX3N0YXJ0X3htaXQgZnVuY3Rpb24KICAqIENhbGxlZCB3aXRoIG5ldGlmX3R4X2xvY2sgaGVsZC4KQEAgLTE0OTUsMTQgKzE2MzMsMTYgQEAKIAl1MzIgdHhfZmxhZ3MgPSAwOwogCXUzMiB0eF9mbGFnc19leHRyYSA9IChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSA/IE5WX1RYX0xBU1RQQUNLRVQgOiBOVl9UWDJfTEFTVFBBQ0tFVCk7CiAJdW5zaWduZWQgaW50IGZyYWdtZW50cyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7Ci0JdW5zaWduZWQgaW50IG5yID0gKG5wLT5uZXh0X3R4IC0gMSkgJSBucC0+dHhfcmluZ19zaXplOwotCXVuc2lnbmVkIGludCBzdGFydF9uciA9IG5wLT5uZXh0X3R4ICUgbnAtPnR4X3Jpbmdfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgb2Zmc2V0ID0gMDsKIAl1MzIgYmNudDsKIAl1MzIgc2l6ZSA9IHNrYi0+bGVuLXNrYi0+ZGF0YV9sZW47CiAJdTMyIGVudHJpZXMgPSAoc2l6ZSA+PiBOVl9UWDJfVFNPX01BWF9TSElGVCkgKyAoKHNpemUgJiAoTlZfVFgyX1RTT19NQVhfU0laRS0xKSkgPyAxIDogMCk7Ci0JdTMyIHR4X2ZsYWdzX3ZsYW4gPSAwOworCXUzMiBlbXB0eV9zbG90czsKKwlzdHJ1Y3QgcmluZ19kZXNjKiBwdXRfdHg7CisJc3RydWN0IHJpbmdfZGVzYyogc3RhcnRfdHg7CisJc3RydWN0IHJpbmdfZGVzYyogcHJldl90eDsKKwlzdHJ1Y3QgbnZfc2tiX21hcCogcHJldl90eF9jdHg7CiAKIAkvKiBhZGQgZnJhZ21lbnRzIHRvIGVudHJpZXMgY291bnQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZnJhZ21lbnRzOyBpKyspIHsKQEAgLTE1MTAsMzQgKzE2NTAsMzUgQEAKIAkJCSAgICgoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplICYgKE5WX1RYMl9UU09fTUFYX1NJWkUtMSkpID8gMSA6IDApOwogCX0KIAotCXNwaW5fbG9ja19pcnEoJm5wLT5sb2NrKTsKLQotCWlmICgobnAtPm5leHRfdHggLSBucC0+bmljX3R4ICsgZW50cmllcyAtIDEpID4gbnAtPnR4X2xpbWl0X3N0b3ApIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisJZW1wdHlfc2xvdHMgPSBudl9nZXRfZW1wdHlfdHhfc2xvdHMobnApOworCWlmICh1bmxpa2VseShlbXB0eV9zbG90cyA8PSBlbnRyaWVzKSkgeworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJbnAtPnR4X3N0b3AgPSAxOworCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIAorCXN0YXJ0X3R4ID0gcHV0X3R4ID0gbnAtPnB1dF90eC5vcmlnOworCiAJLyogc2V0dXAgdGhlIGhlYWRlciBidWZmZXIgKi8KIAlkbyB7CisJCXByZXZfdHggPSBwdXRfdHg7CisJCXByZXZfdHhfY3R4ID0gbnAtPnB1dF90eF9jdHg7CiAJCWJjbnQgPSAoc2l6ZSA+IE5WX1RYMl9UU09fTUFYX1NJWkUpID8gTlZfVFgyX1RTT19NQVhfU0laRSA6IHNpemU7Ci0JCW5yID0gKG5yICsgMSkgJSBucC0+dHhfcmluZ19zaXplOwotCi0JCW5wLT50eF9kbWFbbnJdID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIG9mZnNldCwgYmNudCwKKwkJbnAtPnB1dF90eF9jdHgtPmRtYSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEgKyBvZmZzZXQsIGJjbnQsCiAJCQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKLQkJbnAtPnR4X2RtYV9sZW5bbnJdID0gYmNudDsKKwkJbnAtPnB1dF90eF9jdHgtPmRtYV9sZW4gPSBiY250OworCQlwdXRfdHgtPmJ1ZiA9IGNwdV90b19sZTMyKG5wLT5wdXRfdHhfY3R4LT5kbWEpOworCQlwdXRfdHgtPmZsYWdsZW4gPSBjcHVfdG9fbGUzMigoYmNudC0xKSB8IHR4X2ZsYWdzKTsKIAotCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpIHsKLQkJCW5wLT50eF9yaW5nLm9yaWdbbnJdLmJ1ZiA9IGNwdV90b19sZTMyKG5wLT50eF9kbWFbbnJdKTsKLQkJCW5wLT50eF9yaW5nLm9yaWdbbnJdLmZsYWdsZW4gPSBjcHVfdG9fbGUzMigoYmNudC0xKSB8IHR4X2ZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCW5wLT50eF9yaW5nLmV4W25yXS5idWZoaWdoID0gY3B1X3RvX2xlNjQobnAtPnR4X2RtYVtucl0pID4+IDMyOwotCQkJbnAtPnR4X3JpbmcuZXhbbnJdLmJ1ZmxvdyA9IGNwdV90b19sZTY0KG5wLT50eF9kbWFbbnJdKSAmIDB4MEZGRkZGRkZGOwotCQkJbnAtPnR4X3JpbmcuZXhbbnJdLmZsYWdsZW4gPSBjcHVfdG9fbGUzMigoYmNudC0xKSB8IHR4X2ZsYWdzKTsKLQkJfQogCQl0eF9mbGFncyA9IG5wLT50eF9mbGFnczsKIAkJb2Zmc2V0ICs9IGJjbnQ7CiAJCXNpemUgLT0gYmNudDsKKwkJaWYgKHVubGlrZWx5KHB1dF90eCsrID09IG5wLT5sYXN0X3R4Lm9yaWcpKQorCQkJcHV0X3R4ID0gbnAtPmZpcnN0X3R4Lm9yaWc7CisJCWlmICh1bmxpa2VseShucC0+cHV0X3R4X2N0eCsrID09IG5wLT5sYXN0X3R4X2N0eCkpCisJCQlucC0+cHV0X3R4X2N0eCA9IG5wLT5maXJzdF90eF9jdHg7CiAJfSB3aGlsZSAoc2l6ZSk7CiAKIAkvKiBzZXR1cCB0aGUgZnJhZ21lbnRzICovCkBAIC0xNTQ3LDU4ICsxNjg4LDQ2IEBACiAJCW9mZnNldCA9IDA7CiAKIAkJZG8geworCQkJcHJldl90eCA9IHB1dF90eDsKKwkJCXByZXZfdHhfY3R4ID0gbnAtPnB1dF90eF9jdHg7CiAJCQliY250ID0gKHNpemUgPiBOVl9UWDJfVFNPX01BWF9TSVpFKSA/IE5WX1RYMl9UU09fTUFYX1NJWkUgOiBzaXplOwotCQkJbnIgPSAobnIgKyAxKSAlIG5wLT50eF9yaW5nX3NpemU7CisJCQlucC0+cHV0X3R4X2N0eC0+ZG1hID0gcGNpX21hcF9wYWdlKG5wLT5wY2lfZGV2LCBmcmFnLT5wYWdlLCBmcmFnLT5wYWdlX29mZnNldCtvZmZzZXQsIGJjbnQsCisJCQkJCQkJICAgUENJX0RNQV9UT0RFVklDRSk7CisJCQlucC0+cHV0X3R4X2N0eC0+ZG1hX2xlbiA9IGJjbnQ7CisJCQlwdXRfdHgtPmJ1ZiA9IGNwdV90b19sZTMyKG5wLT5wdXRfdHhfY3R4LT5kbWEpOworCQkJcHV0X3R4LT5mbGFnbGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7CiAKLQkJCW5wLT50eF9kbWFbbnJdID0gcGNpX21hcF9wYWdlKG5wLT5wY2lfZGV2LCBmcmFnLT5wYWdlLCBmcmFnLT5wYWdlX29mZnNldCtvZmZzZXQsIGJjbnQsCi0JCQkJCQkgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCW5wLT50eF9kbWFfbGVuW25yXSA9IGJjbnQ7Ci0KLQkJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikgewotCQkJCW5wLT50eF9yaW5nLm9yaWdbbnJdLmJ1ZiA9IGNwdV90b19sZTMyKG5wLT50eF9kbWFbbnJdKTsKLQkJCQlucC0+dHhfcmluZy5vcmlnW25yXS5mbGFnbGVuID0gY3B1X3RvX2xlMzIoKGJjbnQtMSkgfCB0eF9mbGFncyk7Ci0JCQl9IGVsc2UgewotCQkJCW5wLT50eF9yaW5nLmV4W25yXS5idWZoaWdoID0gY3B1X3RvX2xlNjQobnAtPnR4X2RtYVtucl0pID4+IDMyOwotCQkJCW5wLT50eF9yaW5nLmV4W25yXS5idWZsb3cgPSBjcHVfdG9fbGU2NChucC0+dHhfZG1hW25yXSkgJiAweDBGRkZGRkZGRjsKLQkJCQlucC0+dHhfcmluZy5leFtucl0uZmxhZ2xlbiA9IGNwdV90b19sZTMyKChiY250LTEpIHwgdHhfZmxhZ3MpOwotCQkJfQogCQkJb2Zmc2V0ICs9IGJjbnQ7CiAJCQlzaXplIC09IGJjbnQ7CisJCQlpZiAodW5saWtlbHkocHV0X3R4KysgPT0gbnAtPmxhc3RfdHgub3JpZykpCisJCQkJcHV0X3R4ID0gbnAtPmZpcnN0X3R4Lm9yaWc7CisJCQlpZiAodW5saWtlbHkobnAtPnB1dF90eF9jdHgrKyA9PSBucC0+bGFzdF90eF9jdHgpKQorCQkJCW5wLT5wdXRfdHhfY3R4ID0gbnAtPmZpcnN0X3R4X2N0eDsKIAkJfSB3aGlsZSAoc2l6ZSk7CiAJfQogCiAJLyogc2V0IGxhc3QgZnJhZ21lbnQgZmxhZyAgKi8KLQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpIHsKLQkJbnAtPnR4X3Jpbmcub3JpZ1tucl0uZmxhZ2xlbiB8PSBjcHVfdG9fbGUzMih0eF9mbGFnc19leHRyYSk7Ci0JfSBlbHNlIHsKLQkJbnAtPnR4X3JpbmcuZXhbbnJdLmZsYWdsZW4gfD0gY3B1X3RvX2xlMzIodHhfZmxhZ3NfZXh0cmEpOwotCX0KKwlwcmV2X3R4LT5mbGFnbGVuIHw9IGNwdV90b19sZTMyKHR4X2ZsYWdzX2V4dHJhKTsKIAotCW5wLT50eF9za2J1ZmZbbnJdID0gc2tiOworCS8qIHNhdmUgc2tiIGluIHRoaXMgc2xvdCdzIGNvbnRleHQgYXJlYSAqLworCXByZXZfdHhfY3R4LT5za2IgPSBza2I7CiAKLSNpZmRlZiBORVRJRl9GX1RTTwogCWlmIChza2JfaXNfZ3NvKHNrYikpCiAJCXR4X2ZsYWdzX2V4dHJhID0gTlZfVFgyX1RTTyB8IChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplIDw8IE5WX1RYMl9UU09fU0hJRlQpOwogCWVsc2UKLSNlbmRpZgotCXR4X2ZsYWdzX2V4dHJhID0gc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCA/CisJCXR4X2ZsYWdzX2V4dHJhID0gc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCA/CiAJCQkgTlZfVFgyX0NIRUNLU1VNX0wzIHwgTlZfVFgyX0NIRUNLU1VNX0w0IDogMDsKIAotCS8qIHZsYW4gdGFnICovCi0JaWYgKG5wLT52bGFuZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgewotCQl0eF9mbGFnc192bGFuID0gTlZfVFgzX1ZMQU5fVEFHX1BSRVNFTlQgfCB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKLQl9CisJc3Bpbl9sb2NrX2lycSgmbnAtPmxvY2spOwogCiAJLyogc2V0IHR4IGZsYWdzICovCi0JaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKSB7Ci0JCW5wLT50eF9yaW5nLm9yaWdbc3RhcnRfbnJdLmZsYWdsZW4gfD0gY3B1X3RvX2xlMzIodHhfZmxhZ3MgfCB0eF9mbGFnc19leHRyYSk7Ci0JfSBlbHNlIHsKLQkJbnAtPnR4X3JpbmcuZXhbc3RhcnRfbnJdLnR4dmxhbiA9IGNwdV90b19sZTMyKHR4X2ZsYWdzX3ZsYW4pOwotCQlucC0+dHhfcmluZy5leFtzdGFydF9ucl0uZmxhZ2xlbiB8PSBjcHVfdG9fbGUzMih0eF9mbGFncyB8IHR4X2ZsYWdzX2V4dHJhKTsKLQl9CisJc3RhcnRfdHgtPmZsYWdsZW4gfD0gY3B1X3RvX2xlMzIodHhfZmxhZ3MgfCB0eF9mbGFnc19leHRyYSk7CisJbnAtPnB1dF90eC5vcmlnID0gcHV0X3R4OwogCi0JZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfc3RhcnRfeG1pdDogcGFja2V0ICVkIChlbnRyaWVzICVkKSBxdWV1ZWQgZm9yIHRyYW5zbWlzc2lvbi4gdHhfZmxhZ3NfZXh0cmE6ICV4XG4iLAotCQlkZXYtPm5hbWUsIG5wLT5uZXh0X3R4LCBlbnRyaWVzLCB0eF9mbGFnc19leHRyYSk7CisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9zdGFydF94bWl0OiBlbnRyaWVzICVkIHF1ZXVlZCBmb3IgdHJhbnNtaXNzaW9uLiB0eF9mbGFnc19leHRyYTogJXhcbiIsCisJCWRldi0+bmFtZSwgZW50cmllcywgdHhfZmxhZ3NfZXh0cmEpOwogCXsKIAkJaW50IGo7CiAJCWZvciAoaj0wOyBqPDY0OyBqKyspIHsKQEAgLTE2MDksMTIgKzE3MzgsMTM2IEBACiAJCWRwcmludGsoIlxuIik7CiAJfQogCi0JbnAtPm5leHRfdHggKz0gZW50cmllczsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwl3cml0ZWwoTlZSRUdfVFhSWENUTF9LSUNLfG5wLT50eHJ4Y3RsX2JpdHMsIGdldF9od2Jhc2UoZGV2KSArIE52UmVnVHhSeENvbnRyb2wpOworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyBpbnQgbnZfc3RhcnRfeG1pdF9vcHRpbWl6ZWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiB0eF9mbGFncyA9IDA7CisJdTMyIHR4X2ZsYWdzX2V4dHJhOworCXVuc2lnbmVkIGludCBmcmFnbWVudHMgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCXVuc2lnbmVkIGludCBpOworCXUzMiBvZmZzZXQgPSAwOworCXUzMiBiY250OworCXUzMiBzaXplID0gc2tiLT5sZW4tc2tiLT5kYXRhX2xlbjsKKwl1MzIgZW50cmllcyA9IChzaXplID4+IE5WX1RYMl9UU09fTUFYX1NISUZUKSArICgoc2l6ZSAmIChOVl9UWDJfVFNPX01BWF9TSVpFLTEpKSA/IDEgOiAwKTsKKwl1MzIgZW1wdHlfc2xvdHM7CisJc3RydWN0IHJpbmdfZGVzY19leCogcHV0X3R4OworCXN0cnVjdCByaW5nX2Rlc2NfZXgqIHN0YXJ0X3R4OworCXN0cnVjdCByaW5nX2Rlc2NfZXgqIHByZXZfdHg7CisJc3RydWN0IG52X3NrYl9tYXAqIHByZXZfdHhfY3R4OworCisJLyogYWRkIGZyYWdtZW50cyB0byBlbnRyaWVzIGNvdW50ICovCisJZm9yIChpID0gMDsgaSA8IGZyYWdtZW50czsgaSsrKSB7CisJCWVudHJpZXMgKz0gKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSA+PiBOVl9UWDJfVFNPX01BWF9TSElGVCkgKworCQkJICAgKChza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgJiAoTlZfVFgyX1RTT19NQVhfU0laRS0xKSkgPyAxIDogMCk7CisJfQorCisJZW1wdHlfc2xvdHMgPSBudl9nZXRfZW1wdHlfdHhfc2xvdHMobnApOworCWlmICh1bmxpa2VseShlbXB0eV9zbG90cyA8PSBlbnRyaWVzKSkgeworCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJbnAtPnR4X3N0b3AgPSAxOworCQlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCXN0YXJ0X3R4ID0gcHV0X3R4ID0gbnAtPnB1dF90eC5leDsKKworCS8qIHNldHVwIHRoZSBoZWFkZXIgYnVmZmVyICovCisJZG8geworCQlwcmV2X3R4ID0gcHV0X3R4OworCQlwcmV2X3R4X2N0eCA9IG5wLT5wdXRfdHhfY3R4OworCQliY250ID0gKHNpemUgPiBOVl9UWDJfVFNPX01BWF9TSVpFKSA/IE5WX1RYMl9UU09fTUFYX1NJWkUgOiBzaXplOworCQlucC0+cHV0X3R4X2N0eC0+ZG1hID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIG9mZnNldCwgYmNudCwKKwkJCQkJCVBDSV9ETUFfVE9ERVZJQ0UpOworCQlucC0+cHV0X3R4X2N0eC0+ZG1hX2xlbiA9IGJjbnQ7CisJCXB1dF90eC0+YnVmaGlnaCA9IGNwdV90b19sZTY0KG5wLT5wdXRfdHhfY3R4LT5kbWEpID4+IDMyOworCQlwdXRfdHgtPmJ1ZmxvdyA9IGNwdV90b19sZTY0KG5wLT5wdXRfdHhfY3R4LT5kbWEpICYgMHgwRkZGRkZGRkY7CisJCXB1dF90eC0+ZmxhZ2xlbiA9IGNwdV90b19sZTMyKChiY250LTEpIHwgdHhfZmxhZ3MpOworCisJCXR4X2ZsYWdzID0gTlZfVFgyX1ZBTElEOworCQlvZmZzZXQgKz0gYmNudDsKKwkJc2l6ZSAtPSBiY250OworCQlpZiAodW5saWtlbHkocHV0X3R4KysgPT0gbnAtPmxhc3RfdHguZXgpKQorCQkJcHV0X3R4ID0gbnAtPmZpcnN0X3R4LmV4OworCQlpZiAodW5saWtlbHkobnAtPnB1dF90eF9jdHgrKyA9PSBucC0+bGFzdF90eF9jdHgpKQorCQkJbnAtPnB1dF90eF9jdHggPSBucC0+Zmlyc3RfdHhfY3R4OworCX0gd2hpbGUgKHNpemUpOworCisJLyogc2V0dXAgdGhlIGZyYWdtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBmcmFnbWVudHM7IGkrKykgeworCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCXUzMiBzaXplID0gZnJhZy0+c2l6ZTsKKwkJb2Zmc2V0ID0gMDsKKworCQlkbyB7CisJCQlwcmV2X3R4ID0gcHV0X3R4OworCQkJcHJldl90eF9jdHggPSBucC0+cHV0X3R4X2N0eDsKKwkJCWJjbnQgPSAoc2l6ZSA+IE5WX1RYMl9UU09fTUFYX1NJWkUpID8gTlZfVFgyX1RTT19NQVhfU0laRSA6IHNpemU7CisJCQlucC0+cHV0X3R4X2N0eC0+ZG1hID0gcGNpX21hcF9wYWdlKG5wLT5wY2lfZGV2LCBmcmFnLT5wYWdlLCBmcmFnLT5wYWdlX29mZnNldCtvZmZzZXQsIGJjbnQsCisJCQkJCQkJICAgUENJX0RNQV9UT0RFVklDRSk7CisJCQlucC0+cHV0X3R4X2N0eC0+ZG1hX2xlbiA9IGJjbnQ7CisJCQlwdXRfdHgtPmJ1ZmhpZ2ggPSBjcHVfdG9fbGU2NChucC0+cHV0X3R4X2N0eC0+ZG1hKSA+PiAzMjsKKwkJCXB1dF90eC0+YnVmbG93ID0gY3B1X3RvX2xlNjQobnAtPnB1dF90eF9jdHgtPmRtYSkgJiAweDBGRkZGRkZGRjsKKwkJCXB1dF90eC0+ZmxhZ2xlbiA9IGNwdV90b19sZTMyKChiY250LTEpIHwgdHhfZmxhZ3MpOworCisJCQlvZmZzZXQgKz0gYmNudDsKKwkJCXNpemUgLT0gYmNudDsKKwkJCWlmICh1bmxpa2VseShwdXRfdHgrKyA9PSBucC0+bGFzdF90eC5leCkpCisJCQkJcHV0X3R4ID0gbnAtPmZpcnN0X3R4LmV4OworCQkJaWYgKHVubGlrZWx5KG5wLT5wdXRfdHhfY3R4KysgPT0gbnAtPmxhc3RfdHhfY3R4KSkKKwkJCQlucC0+cHV0X3R4X2N0eCA9IG5wLT5maXJzdF90eF9jdHg7CisJCX0gd2hpbGUgKHNpemUpOworCX0KKworCS8qIHNldCBsYXN0IGZyYWdtZW50IGZsYWcgICovCisJcHJldl90eC0+ZmxhZ2xlbiB8PSBjcHVfdG9fbGUzMihOVl9UWDJfTEFTVFBBQ0tFVCk7CisKKwkvKiBzYXZlIHNrYiBpbiB0aGlzIHNsb3QncyBjb250ZXh0IGFyZWEgKi8KKwlwcmV2X3R4X2N0eC0+c2tiID0gc2tiOworCisJaWYgKHNrYl9pc19nc28oc2tiKSkKKwkJdHhfZmxhZ3NfZXh0cmEgPSBOVl9UWDJfVFNPIHwgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPDwgTlZfVFgyX1RTT19TSElGVCk7CisJZWxzZQorCQl0eF9mbGFnc19leHRyYSA9IHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwgPworCQkJIE5WX1RYMl9DSEVDS1NVTV9MMyB8IE5WX1RYMl9DSEVDS1NVTV9MNCA6IDA7CisKKwkvKiB2bGFuIHRhZyAqLworCWlmIChsaWtlbHkoIW5wLT52bGFuZ3JwKSkgeworCQlzdGFydF90eC0+dHh2bGFuID0gMDsKKwl9IGVsc2UgeworCQlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKQorCQkJc3RhcnRfdHgtPnR4dmxhbiA9IGNwdV90b19sZTMyKE5WX1RYM19WTEFOX1RBR19QUkVTRU5UIHwgdmxhbl90eF90YWdfZ2V0KHNrYikpOworCQllbHNlCisJCQlzdGFydF90eC0+dHh2bGFuID0gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CisKKwkvKiBzZXQgdHggZmxhZ3MgKi8KKwlzdGFydF90eC0+ZmxhZ2xlbiB8PSBjcHVfdG9fbGUzMih0eF9mbGFncyB8IHR4X2ZsYWdzX2V4dHJhKTsKKwlucC0+cHV0X3R4LmV4ID0gcHV0X3R4OworCisJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CisKKwlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBudl9zdGFydF94bWl0X29wdGltaXplZDogZW50cmllcyAlZCBxdWV1ZWQgZm9yIHRyYW5zbWlzc2lvbi4gdHhfZmxhZ3NfZXh0cmE6ICV4XG4iLAorCQlkZXYtPm5hbWUsIGVudHJpZXMsIHR4X2ZsYWdzX2V4dHJhKTsKKwl7CisJCWludCBqOworCQlmb3IgKGo9MDsgajw2NDsgaisrKSB7CisJCQlpZiAoKGolMTYpID09IDApCisJCQkJZHByaW50aygiXG4lMDN4OiIsIGopOworCQkJZHByaW50aygiICUwMngiLCAoKHVuc2lnbmVkIGNoYXIqKXNrYi0+ZGF0YSlbal0pOworCQl9CisJCWRwcmludGsoIlxuIik7CisJfQogCiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CiAJd3JpdGVsKE5WUkVHX1RYUlhDVExfS0lDS3xucC0+dHhyeGN0bF9iaXRzLCBnZXRfaHdiYXNlKGRldikgKyBOdlJlZ1R4UnhDb250cm9sKTsKLQlwY2lfcHVzaChnZXRfaHdiYXNlKGRldikpOwogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKQEAgLTE2MjcsMjYgKzE4ODAsMjIgQEAKIHsKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiBmbGFnczsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCByaW5nX2Rlc2MqIG9yaWdfZ2V0X3R4ID0gbnAtPmdldF90eC5vcmlnOwogCi0Jd2hpbGUgKG5wLT5uaWNfdHggIT0gbnAtPm5leHRfdHgpIHsKLQkJaSA9IG5wLT5uaWNfdHggJSBucC0+dHhfcmluZ19zaXplOworCXdoaWxlICgobnAtPmdldF90eC5vcmlnICE9IG5wLT5wdXRfdHgub3JpZykgJiYKKwkgICAgICAgISgoZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+Z2V0X3R4Lm9yaWctPmZsYWdsZW4pKSAmIE5WX1RYX1ZBTElEKSkgewogCi0JCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikKLQkJCWZsYWdzID0gbGUzMl90b19jcHUobnAtPnR4X3Jpbmcub3JpZ1tpXS5mbGFnbGVuKTsKLQkJZWxzZQotCQkJZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpXS5mbGFnbGVuKTsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfdHhfZG9uZTogZmxhZ3MgMHgleC5cbiIsCisJCQkJCWRldi0+bmFtZSwgZmxhZ3MpOwogCi0JCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3R4X2RvbmU6IGxvb2tpbmcgYXQgcGFja2V0ICVkLCBmbGFncyAweCV4LlxuIiwKLQkJCQkJZGV2LT5uYW1lLCBucC0+bmljX3R4LCBmbGFncyk7Ci0JCWlmIChmbGFncyAmIE5WX1RYX1ZBTElEKQotCQkJYnJlYWs7CisJCXBjaV91bm1hcF9wYWdlKG5wLT5wY2lfZGV2LCBucC0+Z2V0X3R4X2N0eC0+ZG1hLAorCQkJICAgICAgIG5wLT5nZXRfdHhfY3R4LT5kbWFfbGVuLAorCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlucC0+Z2V0X3R4X2N0eC0+ZG1hID0gMDsKKwogCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEpIHsKIAkJCWlmIChmbGFncyAmIE5WX1RYX0xBU1RQQUNLRVQpIHsKLQkJCQlza2IgPSBucC0+dHhfc2tidWZmW2ldOwotCQkJCWlmIChmbGFncyAmIChOVl9UWF9SRVRSWUVSUk9SfE5WX1RYX0NBUlJJRVJMT1NUfE5WX1RYX0xBVEVDT0xMSVNJT058Ci0JCQkJCSAgICAgTlZfVFhfVU5ERVJGTE9XfE5WX1RYX0VSUk9SKSkgeworCQkJCWlmIChmbGFncyAmIE5WX1RYX0VSUk9SKSB7CiAJCQkJCWlmIChmbGFncyAmIE5WX1RYX1VOREVSRkxPVykKIAkJCQkJCW5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCQkJCQlpZiAoZmxhZ3MgJiBOVl9UWF9DQVJSSUVSTE9TVCkKQEAgLTE2NTQsMTQgKzE5MDMsMTQgQEAKIAkJCQkJbnAtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJCX0gZWxzZSB7CiAJCQkJCW5wLT5zdGF0cy50eF9wYWNrZXRzKys7Ci0JCQkJCW5wLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQkJbnAtPnN0YXRzLnR4X2J5dGVzICs9IG5wLT5nZXRfdHhfY3R4LT5za2ItPmxlbjsKIAkJCQl9CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkobnAtPmdldF90eF9jdHgtPnNrYik7CisJCQkJbnAtPmdldF90eF9jdHgtPnNrYiA9IE5VTEw7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoZmxhZ3MgJiBOVl9UWDJfTEFTVFBBQ0tFVCkgewotCQkJCXNrYiA9IG5wLT50eF9za2J1ZmZbaV07Ci0JCQkJaWYgKGZsYWdzICYgKE5WX1RYMl9SRVRSWUVSUk9SfE5WX1RYMl9DQVJSSUVSTE9TVHxOVl9UWDJfTEFURUNPTExJU0lPTnwKLQkJCQkJICAgICBOVl9UWDJfVU5ERVJGTE9XfE5WX1RYMl9FUlJPUikpIHsKKwkJCQlpZiAoZmxhZ3MgJiBOVl9UWDJfRVJST1IpIHsKIAkJCQkJaWYgKGZsYWdzICYgTlZfVFgyX1VOREVSRkxPVykKIAkJCQkJCW5wLT5zdGF0cy50eF9maWZvX2Vycm9ycysrOwogCQkJCQlpZiAoZmxhZ3MgJiBOVl9UWDJfQ0FSUklFUkxPU1QpCkBAIC0xNjY5LDE1ICsxOTE4LDU2IEBACiAJCQkJCW5wLT5zdGF0cy50eF9lcnJvcnMrKzsKIAkJCQl9IGVsc2UgewogCQkJCQlucC0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJCQlucC0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJCW5wLT5zdGF0cy50eF9ieXRlcyArPSBucC0+Z2V0X3R4X2N0eC0+c2tiLT5sZW47CiAJCQkJfQorCQkJCWRldl9rZnJlZV9za2JfYW55KG5wLT5nZXRfdHhfY3R4LT5za2IpOworCQkJCW5wLT5nZXRfdHhfY3R4LT5za2IgPSBOVUxMOwogCQkJfQogCQl9Ci0JCW52X3JlbGVhc2VfdHhza2IoZGV2LCBpKTsKLQkJbnAtPm5pY190eCsrOworCQlpZiAodW5saWtlbHkobnAtPmdldF90eC5vcmlnKysgPT0gbnAtPmxhc3RfdHgub3JpZykpCisJCQlucC0+Z2V0X3R4Lm9yaWcgPSBucC0+Zmlyc3RfdHgub3JpZzsKKwkJaWYgKHVubGlrZWx5KG5wLT5nZXRfdHhfY3R4KysgPT0gbnAtPmxhc3RfdHhfY3R4KSkKKwkJCW5wLT5nZXRfdHhfY3R4ID0gbnAtPmZpcnN0X3R4X2N0eDsKIAl9Ci0JaWYgKG5wLT5uZXh0X3R4IC0gbnAtPm5pY190eCA8IG5wLT50eF9saW1pdF9zdGFydCkKKwlpZiAodW5saWtlbHkoKG5wLT50eF9zdG9wID09IDEpICYmIChucC0+Z2V0X3R4Lm9yaWcgIT0gb3JpZ19nZXRfdHgpKSkgeworCQlucC0+dHhfc3RvcCA9IDA7CiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG52X3R4X2RvbmVfb3B0aW1pemVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsaW1pdCkKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBmbGFnczsKKwlzdHJ1Y3QgcmluZ19kZXNjX2V4KiBvcmlnX2dldF90eCA9IG5wLT5nZXRfdHguZXg7CisKKwl3aGlsZSAoKG5wLT5nZXRfdHguZXggIT0gbnAtPnB1dF90eC5leCkgJiYKKwkgICAgICAgISgoZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+Z2V0X3R4LmV4LT5mbGFnbGVuKSkgJiBOVl9UWF9WQUxJRCkgJiYKKwkgICAgICAgKGxpbWl0LS0gPiAwKSkgeworCisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3R4X2RvbmVfb3B0aW1pemVkOiBmbGFncyAweCV4LlxuIiwKKwkJCQkJZGV2LT5uYW1lLCBmbGFncyk7CisKKwkJcGNpX3VubWFwX3BhZ2UobnAtPnBjaV9kZXYsIG5wLT5nZXRfdHhfY3R4LT5kbWEsCisJCQkgICAgICAgbnAtPmdldF90eF9jdHgtPmRtYV9sZW4sCisJCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7CisJCW5wLT5nZXRfdHhfY3R4LT5kbWEgPSAwOworCisJCWlmIChmbGFncyAmIE5WX1RYMl9MQVNUUEFDS0VUKSB7CisJCQlpZiAoIShmbGFncyAmIE5WX1RYMl9FUlJPUikpCisJCQkJbnAtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCWRldl9rZnJlZV9za2JfYW55KG5wLT5nZXRfdHhfY3R4LT5za2IpOworCQkJbnAtPmdldF90eF9jdHgtPnNrYiA9IE5VTEw7CisJCX0KKwkJaWYgKHVubGlrZWx5KG5wLT5nZXRfdHguZXgrKyA9PSBucC0+bGFzdF90eC5leCkpCisJCQlucC0+Z2V0X3R4LmV4ID0gbnAtPmZpcnN0X3R4LmV4OworCQlpZiAodW5saWtlbHkobnAtPmdldF90eF9jdHgrKyA9PSBucC0+bGFzdF90eF9jdHgpKQorCQkJbnAtPmdldF90eF9jdHggPSBucC0+Zmlyc3RfdHhfY3R4OworCX0KKwlpZiAodW5saWtlbHkoKG5wLT50eF9zdG9wID09IDEpICYmIChucC0+Z2V0X3R4LmV4ICE9IG9yaWdfZ2V0X3R4KSkpIHsKKwkJbnAtPnR4X3N0b3AgPSAwOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQogfQogCiAvKgpAQCAtMTcwMCw5ICsxOTkwLDggQEAKIAl7CiAJCWludCBpOwogCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBSaW5nIGF0ICVseDogbmV4dCAlZCBuaWMgJWRcbiIsCi0JCQkJZGV2LT5uYW1lLCAodW5zaWduZWQgbG9uZylucC0+cmluZ19hZGRyLAotCQkJCW5wLT5uZXh0X3R4LCBucC0+bmljX3R4KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJpbmcgYXQgJWx4XG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCAodW5zaWduZWQgbG9uZylucC0+cmluZ19hZGRyKTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IER1bXBpbmcgdHggcmVnaXN0ZXJzXG4iLCBkZXYtPm5hbWUpOwogCQlmb3IgKGk9MDtpPD1ucC0+cmVnaXN0ZXJfc2l6ZTtpKz0gMzIpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gIiUzeDogJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLApAQCAtMTc1MCwxMyArMjAzOSwxNiBAQAogCW52X3N0b3BfdHgoZGV2KTsKIAogCS8qIDIpIGNoZWNrIHRoYXQgdGhlIHBhY2tldHMgd2VyZSBub3Qgc2VudCBhbHJlYWR5OiAqLwotCW52X3R4X2RvbmUoZGV2KTsKKwlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpCisJCW52X3R4X2RvbmUoZGV2KTsKKwllbHNlCisJCW52X3R4X2RvbmVfb3B0aW1pemVkKGRldiwgbnAtPnR4X3Jpbmdfc2l6ZSk7CiAKIAkvKiAzKSBpZiB0aGVyZSBhcmUgZGVhZCBlbnRyaWVzOiBjbGVhciBldmVyeXRoaW5nICovCi0JaWYgKG5wLT5uZXh0X3R4ICE9IG5wLT5uaWNfdHgpIHsKKwlpZiAobnAtPmdldF90eF9jdHggIT0gbnAtPnB1dF90eF9jdHgpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eF90aW1lb3V0OiBkZWFkIGVudHJpZXMhXG4iLCBkZXYtPm5hbWUpOwogCQludl9kcmFpbl90eChkZXYpOwotCQlucC0+bmV4dF90eCA9IG5wLT5uaWNfdHggPSAwOworCQludl9pbml0X3R4KGRldik7CiAJCXNldHVwX2h3X3JpbmdzKGRldiwgTlZfU0VUVVBfVFhfUklORyk7CiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIAl9CkBAIC0xODIzLDQwICsyMTE1LDI3IEBACiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgZmxhZ3M7Ci0JdTMyIHZsYW5mbGFncyA9IDA7Ci0JaW50IGNvdW50OworCXUzMiByeF9wcm9jZXNzZWRfY250ID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBsZW47CiAKLSAJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbGltaXQ7ICsrY291bnQpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJaW50IGxlbjsKLQkJaW50IGk7Ci0JCWlmIChucC0+Y3VyX3J4IC0gbnAtPnJlZmlsbF9yeCA+PSBucC0+cnhfcmluZ19zaXplKQotCQkJYnJlYWs7CS8qIHdlIHNjYW5uZWQgdGhlIHdob2xlIHJpbmcgLSBkbyBub3QgY29udGludWUgKi8KKwl3aGlsZSgobnAtPmdldF9yeC5vcmlnICE9IG5wLT5wdXRfcngub3JpZykgJiYKKwkgICAgICAhKChmbGFncyA9IGxlMzJfdG9fY3B1KG5wLT5nZXRfcngub3JpZy0+ZmxhZ2xlbikpICYgTlZfUlhfQVZBSUwpICYmCisJCShyeF9wcm9jZXNzZWRfY250KysgPCBsaW1pdCkpIHsKIAotCQlpID0gbnAtPmN1cl9yeCAlIG5wLT5yeF9yaW5nX3NpemU7Ci0JCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMSB8fCBucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMikgewotCQkJZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+cnhfcmluZy5vcmlnW2ldLmZsYWdsZW4pOwotCQkJbGVuID0gbnZfZGVzY3JfZ2V0bGVuZ3RoKCZucC0+cnhfcmluZy5vcmlnW2ldLCBucC0+ZGVzY192ZXIpOwotCQl9IGVsc2UgewotCQkJZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+cnhfcmluZy5leFtpXS5mbGFnbGVuKTsKLQkJCWxlbiA9IG52X2Rlc2NyX2dldGxlbmd0aF9leCgmbnAtPnJ4X3JpbmcuZXhbaV0sIG5wLT5kZXNjX3Zlcik7Ci0JCQl2bGFuZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+cnhfcmluZy5leFtpXS5idWZsb3cpOwotCQl9Ci0KLQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfcnhfcHJvY2VzczogbG9va2luZyBhdCBwYWNrZXQgJWQsIGZsYWdzIDB4JXguXG4iLAotCQkJCQlkZXYtPm5hbWUsIG5wLT5jdXJfcngsIGZsYWdzKTsKLQotCQlpZiAoZmxhZ3MgJiBOVl9SWF9BVkFJTCkKLQkJCWJyZWFrOwkvKiBzdGlsbCBvd25lZCBieSBoYXJkd2FyZSwgKi8KKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfcnhfcHJvY2VzczogZmxhZ3MgMHgleC5cbiIsCisJCQkJCWRldi0+bmFtZSwgZmxhZ3MpOwogCiAJCS8qCiAJCSAqIHRoZSBwYWNrZXQgaXMgZm9yIHVzIC0gaW1tZWRpYXRlbHkgdGVhciBkb3duIHRoZSBwY2kgbWFwcGluZy4KIAkJICogVE9ETzogY2hlY2sgaWYgYSBwcmVmZXRjaCBvZiB0aGUgZmlyc3QgY2FjaGVsaW5lIGltcHJvdmVzCiAJCSAqIHRoZSBwZXJmb3JtYW5jZS4KIAkJICovCi0JCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT5yeF9kbWFbaV0sCi0JCQkJbnAtPnJ4X3NrYnVmZltpXS0+ZW5kLW5wLT5yeF9za2J1ZmZbaV0tPmRhdGEsCisJCXBjaV91bm1hcF9zaW5nbGUobnAtPnBjaV9kZXYsIG5wLT5nZXRfcnhfY3R4LT5kbWEsCisJCQkJbnAtPmdldF9yeF9jdHgtPmRtYV9sZW4sCiAJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJc2tiID0gbnAtPmdldF9yeF9jdHgtPnNrYjsKKwkJbnAtPmdldF9yeF9jdHgtPnNrYiA9IE5VTEw7CiAKIAkJewogCQkJaW50IGo7CkBAIC0xODY0LDEyMyArMjE0MywyMjggQEAKIAkJCWZvciAoaj0wOyBqPDY0OyBqKyspIHsKIAkJCQlpZiAoKGolMTYpID09IDApCiAJCQkJCWRwcmludGsoIlxuJTAzeDoiLCBqKTsKLQkJCQlkcHJpbnRrKCIgJTAyeCIsICgodW5zaWduZWQgY2hhciopbnAtPnJ4X3NrYnVmZltpXS0+ZGF0YSlbal0pOworCQkJCWRwcmludGsoIiAlMDJ4IiwgKCh1bnNpZ25lZCBjaGFyKilza2ItPmRhdGEpW2pdKTsKIAkJCX0KIAkJCWRwcmludGsoIlxuIik7CiAJCX0KIAkJLyogbG9vayBhdCB3aGF0IHdlIGFjdHVhbGx5IGdvdDogKi8KIAkJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xKSB7Ci0JCQlpZiAoIShmbGFncyAmIE5WX1JYX0RFU0NSSVBUT1JWQUxJRCkpCi0JCQkJZ290byBuZXh0X3BrdDsKLQotCQkJaWYgKGZsYWdzICYgTlZfUlhfRVJST1IpIHsKLQkJCQlpZiAoZmxhZ3MgJiBOVl9SWF9NSVNTRURGUkFNRSkgewotCQkJCQlucC0+c3RhdHMucnhfbWlzc2VkX2Vycm9ycysrOwotCQkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJCWdvdG8gbmV4dF9wa3Q7Ci0JCQkJfQotCQkJCWlmIChmbGFncyAmIChOVl9SWF9FUlJPUjF8TlZfUlhfRVJST1IyfE5WX1JYX0VSUk9SMykpIHsKLQkJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCQlnb3RvIG5leHRfcGt0OwotCQkJCX0KLQkJCQlpZiAoZmxhZ3MgJiBOVl9SWF9DUkNFUlIpIHsKLQkJCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCQlnb3RvIG5leHRfcGt0OwotCQkJCX0KLQkJCQlpZiAoZmxhZ3MgJiBOVl9SWF9PVkVSRkxPVykgewotCQkJCQlucC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKLQkJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCQlnb3RvIG5leHRfcGt0OwotCQkJCX0KLQkJCQlpZiAoZmxhZ3MgJiBOVl9SWF9FUlJPUjQpIHsKLQkJCQkJbGVuID0gbnZfZ2V0bGVuKGRldiwgbnAtPnJ4X3NrYnVmZltpXS0+ZGF0YSwgbGVuKTsKLQkJCQkJaWYgKGxlbiA8IDApIHsKKwkJCWlmIChsaWtlbHkoZmxhZ3MgJiBOVl9SWF9ERVNDUklQVE9SVkFMSUQpKSB7CisJCQkJbGVuID0gZmxhZ3MgJiBMRU5fTUFTS19WMTsKKwkJCQlpZiAodW5saWtlbHkoZmxhZ3MgJiBOVl9SWF9FUlJPUikpIHsKKwkJCQkJaWYgKGZsYWdzICYgTlZfUlhfRVJST1I0KSB7CisJCQkJCQlsZW4gPSBudl9nZXRsZW4oZGV2LCBza2ItPmRhdGEsIGxlbik7CisJCQkJCQlpZiAobGVuIDwgMCkgeworCQkJCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJCQkJZ290byBuZXh0X3BrdDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvKiBmcmFtaW5nIGVycm9ycyBhcmUgc29mdCBlcnJvcnMgKi8KKwkJCQkJZWxzZSBpZiAoZmxhZ3MgJiBOVl9SWF9GUkFNSU5HRVJSKSB7CisJCQkJCQlpZiAoZmxhZ3MgJiBOVl9SWF9TVUJTVFJBQ1QxKSB7CisJCQkJCQkJbGVuLS07CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLyogdGhlIHJlc3QgYXJlIGhhcmQgZXJyb3JzICovCisJCQkJCWVsc2UgeworCQkJCQkJaWYgKGZsYWdzICYgTlZfUlhfTUlTU0VERlJBTUUpCisJCQkJCQkJbnAtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJCQkJCWlmIChmbGFncyAmIE5WX1JYX0NSQ0VSUikKKwkJCQkJCQlucC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCQkJaWYgKGZsYWdzICYgTlZfUlhfT1ZFUkZMT1cpCisJCQkJCQkJbnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7CiAJCQkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQkJCQlnb3RvIG5leHRfcGt0OwogCQkJCQl9CiAJCQkJfQotCQkJCS8qIGZyYW1pbmcgZXJyb3JzIGFyZSBzb2Z0IGVycm9ycy4gKi8KLQkJCQlpZiAoZmxhZ3MgJiBOVl9SWF9GUkFNSU5HRVJSKSB7Ci0JCQkJCWlmIChmbGFncyAmIE5WX1JYX1NVQlNUUkFDVDEpIHsKLQkJCQkJCWxlbi0tOwotCQkJCQl9Ci0JCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJZ290byBuZXh0X3BrdDsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmICghKGZsYWdzICYgTlZfUlgyX0RFU0NSSVBUT1JWQUxJRCkpCi0JCQkJZ290byBuZXh0X3BrdDsKLQotCQkJaWYgKGZsYWdzICYgTlZfUlgyX0VSUk9SKSB7Ci0JCQkJaWYgKGZsYWdzICYgKE5WX1JYMl9FUlJPUjF8TlZfUlgyX0VSUk9SMnxOVl9SWDJfRVJST1IzKSkgewotCQkJCQlucC0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJCWdvdG8gbmV4dF9wa3Q7Ci0JCQkJfQotCQkJCWlmIChmbGFncyAmIE5WX1JYMl9DUkNFUlIpIHsKLQkJCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCQlnb3RvIG5leHRfcGt0OwotCQkJCX0KLQkJCQlpZiAoZmxhZ3MgJiBOVl9SWDJfT1ZFUkZMT1cpIHsKLQkJCQkJbnAtPnN0YXRzLnJ4X292ZXJfZXJyb3JzKys7Ci0JCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQkJZ290byBuZXh0X3BrdDsKLQkJCQl9Ci0JCQkJaWYgKGZsYWdzICYgTlZfUlgyX0VSUk9SNCkgewotCQkJCQlsZW4gPSBudl9nZXRsZW4oZGV2LCBucC0+cnhfc2tidWZmW2ldLT5kYXRhLCBsZW4pOwotCQkJCQlpZiAobGVuIDwgMCkgeworCQkJaWYgKGxpa2VseShmbGFncyAmIE5WX1JYMl9ERVNDUklQVE9SVkFMSUQpKSB7CisJCQkJbGVuID0gZmxhZ3MgJiBMRU5fTUFTS19WMjsKKwkJCQlpZiAodW5saWtlbHkoZmxhZ3MgJiBOVl9SWDJfRVJST1IpKSB7CisJCQkJCWlmIChmbGFncyAmIE5WX1JYMl9FUlJPUjQpIHsKKwkJCQkJCWxlbiA9IG52X2dldGxlbihkZXYsIHNrYi0+ZGF0YSwgbGVuKTsKKwkJCQkJCWlmIChsZW4gPCAwKSB7CisJCQkJCQkJbnAtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQkJCQlnb3RvIG5leHRfcGt0OworCQkJCQkJfQorCQkJCQl9CisJCQkJCS8qIGZyYW1pbmcgZXJyb3JzIGFyZSBzb2Z0IGVycm9ycyAqLworCQkJCQllbHNlIGlmIChmbGFncyAmIE5WX1JYMl9GUkFNSU5HRVJSKSB7CisJCQkJCQlpZiAoZmxhZ3MgJiBOVl9SWDJfU1VCU1RSQUNUMSkgeworCQkJCQkJCWxlbi0tOworCQkJCQkJfQorCQkJCQl9CisJCQkJCS8qIHRoZSByZXN0IGFyZSBoYXJkIGVycm9ycyAqLworCQkJCQllbHNlIHsKKwkJCQkJCWlmIChmbGFncyAmIE5WX1JYMl9DUkNFUlIpCisJCQkJCQkJbnAtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCQkJCWlmIChmbGFncyAmIE5WX1JYMl9PVkVSRkxPVykKKwkJCQkJCQlucC0+c3RhdHMucnhfb3Zlcl9lcnJvcnMrKzsKIAkJCQkJCW5wLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCQkJCWdvdG8gbmV4dF9wa3Q7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJLyogZnJhbWluZyBlcnJvcnMgYXJlIHNvZnQgZXJyb3JzICovCi0JCQkJaWYgKGZsYWdzICYgTlZfUlgyX0ZSQU1JTkdFUlIpIHsKLQkJCQkJaWYgKGZsYWdzICYgTlZfUlgyX1NVQlNUUkFDVDEpIHsKLQkJCQkJCWxlbi0tOworCQkJCWlmICgoZmxhZ3MgJiBOVl9SWDJfQ0hFQ0tTVU1NQVNLKSA9PSBOVl9SWDJfQ0hFQ0tTVU1PSzIpLyppcCBhbmQgdGNwICovIHsKKwkJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoKGZsYWdzICYgTlZfUlgyX0NIRUNLU1VNTUFTSykgPT0gTlZfUlgyX0NIRUNLU1VNT0sxIHx8CisJCQkJCSAgICAoZmxhZ3MgJiBOVl9SWDJfQ0hFQ0tTVU1NQVNLKSA9PSBOVl9SWDJfQ0hFQ0tTVU1PSzMpIHsKKwkJCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJCQkJCX0KIAkJCQl9Ci0JCQl9Ci0JCQlpZiAobnAtPnJ4X2NzdW0pIHsKLQkJCQlmbGFncyAmPSBOVl9SWDJfQ0hFQ0tTVU1NQVNLOwotCQkJCWlmIChmbGFncyA9PSBOVl9SWDJfQ0hFQ0tTVU1PSzEgfHwKLQkJCQkgICAgZmxhZ3MgPT0gTlZfUlgyX0NIRUNLU1VNT0syIHx8Ci0JCQkJICAgIGZsYWdzID09IE5WX1JYMl9DSEVDS1NVTU9LMykgewotCQkJCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBodyBjaGVja3N1bSBoaXQhLlxuIiwgZGV2LT5uYW1lKTsKLQkJCQkJbnAtPnJ4X3NrYnVmZltpXS0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogaHdjaGVja3N1bSBtaXNzIS5cbiIsIGRldi0+bmFtZSk7Ci0JCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJZ290byBuZXh0X3BrdDsKIAkJCX0KIAkJfQogCQkvKiBnb3QgYSB2YWxpZCBwYWNrZXQgLSBmb3J3YXJkIGl0IHRvIHRoZSBuZXR3b3JrIGNvcmUgKi8KLQkJc2tiID0gbnAtPnJ4X3NrYnVmZltpXTsKLQkJbnAtPnJ4X3NrYnVmZltpXSA9IE5VTEw7Ci0KIAkJc2tiX3B1dChza2IsIGxlbik7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0JCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X3J4X3Byb2Nlc3M6IHBhY2tldCAlZCB3aXRoICVkIGJ5dGVzLCBwcm90byAlZCBhY2NlcHRlZC5cbiIsCi0JCQkJCWRldi0+bmFtZSwgbnAtPmN1cl9yeCwgbGVuLCBza2ItPnByb3RvY29sKTsKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfcnhfcHJvY2VzczogJWQgYnl0ZXMsIHByb3RvICVkIGFjY2VwdGVkLlxuIiwKKwkJCQkJZGV2LT5uYW1lLCBsZW4sIHNrYi0+cHJvdG9jb2wpOwogI2lmZGVmIENPTkZJR19GT1JDRURFVEhfTkFQSQotCQlpZiAobnAtPnZsYW5ncnAgJiYgKHZsYW5mbGFncyAmIE5WX1JYM19WTEFOX1RBR19QUkVTRU5UKSkKLQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIG5wLT52bGFuZ3JwLAotCQkJCQkJIHZsYW5mbGFncyAmIE5WX1JYM19WTEFOX1RBR19NQVNLKTsKLQkJZWxzZQotCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKICNlbHNlCi0JCWlmIChucC0+dmxhbmdycCAmJiAodmxhbmZsYWdzICYgTlZfUlgzX1ZMQU5fVEFHX1BSRVNFTlQpKQotCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgbnAtPnZsYW5ncnAsCi0JCQkJCXZsYW5mbGFncyAmIE5WX1JYM19WTEFOX1RBR19NQVNLKTsKLQkJZWxzZQotCQkJbmV0aWZfcngoc2tiKTsKKwkJbmV0aWZfcngoc2tiKTsKICNlbmRpZgogCQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCQlucC0+c3RhdHMucnhfcGFja2V0cysrOwogCQlucC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwogbmV4dF9wa3Q6Ci0JCW5wLT5jdXJfcngrKzsKKwkJaWYgKHVubGlrZWx5KG5wLT5nZXRfcngub3JpZysrID09IG5wLT5sYXN0X3J4Lm9yaWcpKQorCQkJbnAtPmdldF9yeC5vcmlnID0gbnAtPmZpcnN0X3J4Lm9yaWc7CisJCWlmICh1bmxpa2VseShucC0+Z2V0X3J4X2N0eCsrID09IG5wLT5sYXN0X3J4X2N0eCkpCisJCQlucC0+Z2V0X3J4X2N0eCA9IG5wLT5maXJzdF9yeF9jdHg7CiAJfQogCi0JcmV0dXJuIGNvdW50OworCXJldHVybiByeF9wcm9jZXNzZWRfY250OworfQorCitzdGF0aWMgaW50IG52X3J4X3Byb2Nlc3Nfb3B0aW1pemVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsaW1pdCkKK3sKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBmbGFnczsKKwl1MzIgdmxhbmZsYWdzID0gMDsKKwl1MzIgcnhfcHJvY2Vzc2VkX2NudCA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuOworCisJd2hpbGUoKG5wLT5nZXRfcnguZXggIT0gbnAtPnB1dF9yeC5leCkgJiYKKwkgICAgICAhKChmbGFncyA9IGxlMzJfdG9fY3B1KG5wLT5nZXRfcnguZXgtPmZsYWdsZW4pKSAmIE5WX1JYMl9BVkFJTCkgJiYKKwkgICAgICAocnhfcHJvY2Vzc2VkX2NudCsrIDwgbGltaXQpKSB7CisKKwkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfcnhfcHJvY2Vzc19vcHRpbWl6ZWQ6IGZsYWdzIDB4JXguXG4iLAorCQkJCQlkZXYtPm5hbWUsIGZsYWdzKTsKKworCQkvKgorCQkgKiB0aGUgcGFja2V0IGlzIGZvciB1cyAtIGltbWVkaWF0ZWx5IHRlYXIgZG93biB0aGUgcGNpIG1hcHBpbmcuCisJCSAqIFRPRE86IGNoZWNrIGlmIGEgcHJlZmV0Y2ggb2YgdGhlIGZpcnN0IGNhY2hlbGluZSBpbXByb3ZlcworCQkgKiB0aGUgcGVyZm9ybWFuY2UuCisJCSAqLworCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBucC0+Z2V0X3J4X2N0eC0+ZG1hLAorCQkJCW5wLT5nZXRfcnhfY3R4LT5kbWFfbGVuLAorCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CisJCXNrYiA9IG5wLT5nZXRfcnhfY3R4LT5za2I7CisJCW5wLT5nZXRfcnhfY3R4LT5za2IgPSBOVUxMOworCisJCXsKKwkJCWludCBqOworCQkJZHByaW50ayhLRVJOX0RFQlVHICJEdW1waW5nIHBhY2tldCAoZmxhZ3MgMHgleCkuIixmbGFncyk7CisJCQlmb3IgKGo9MDsgajw2NDsgaisrKSB7CisJCQkJaWYgKChqJTE2KSA9PSAwKQorCQkJCQlkcHJpbnRrKCJcbiUwM3g6Iiwgaik7CisJCQkJZHByaW50aygiICUwMngiLCAoKHVuc2lnbmVkIGNoYXIqKXNrYi0+ZGF0YSlbal0pOworCQkJfQorCQkJZHByaW50aygiXG4iKTsKKwkJfQorCQkvKiBsb29rIGF0IHdoYXQgd2UgYWN0dWFsbHkgZ290OiAqLworCQlpZiAobGlrZWx5KGZsYWdzICYgTlZfUlgyX0RFU0NSSVBUT1JWQUxJRCkpIHsKKwkJCWxlbiA9IGZsYWdzICYgTEVOX01BU0tfVjI7CisJCQlpZiAodW5saWtlbHkoZmxhZ3MgJiBOVl9SWDJfRVJST1IpKSB7CisJCQkJaWYgKGZsYWdzICYgTlZfUlgyX0VSUk9SNCkgeworCQkJCQlsZW4gPSBudl9nZXRsZW4oZGV2LCBza2ItPmRhdGEsIGxlbik7CisJCQkJCWlmIChsZW4gPCAwKSB7CisJCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJCQlnb3RvIG5leHRfcGt0OworCQkJCQl9CisJCQkJfQorCQkJCS8qIGZyYW1pbmcgZXJyb3JzIGFyZSBzb2Z0IGVycm9ycyAqLworCQkJCWVsc2UgaWYgKGZsYWdzICYgTlZfUlgyX0ZSQU1JTkdFUlIpIHsKKwkJCQkJaWYgKGZsYWdzICYgTlZfUlgyX1NVQlNUUkFDVDEpIHsKKwkJCQkJCWxlbi0tOworCQkJCQl9CisJCQkJfQorCQkJCS8qIHRoZSByZXN0IGFyZSBoYXJkIGVycm9ycyAqLworCQkJCWVsc2UgeworCQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQkJCWdvdG8gbmV4dF9wa3Q7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKGZsYWdzICYgTlZfUlgyX0NIRUNLU1VNTUFTSykgPT0gTlZfUlgyX0NIRUNLU1VNT0syKS8qaXAgYW5kIHRjcCAqLyB7CisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChmbGFncyAmIE5WX1JYMl9DSEVDS1NVTU1BU0spID09IE5WX1JYMl9DSEVDS1NVTU9LMSB8fAorCQkJCSAgICAoZmxhZ3MgJiBOVl9SWDJfQ0hFQ0tTVU1NQVNLKSA9PSBOVl9SWDJfQ0hFQ0tTVU1PSzMpIHsKKwkJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIGdvdCBhIHZhbGlkIHBhY2tldCAtIGZvcndhcmQgaXQgdG8gdGhlIG5ldHdvcmsgY29yZSAqLworCQkJc2tiX3B1dChza2IsIGxlbik7CisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJcHJlZmV0Y2goc2tiLT5kYXRhKTsKKworCQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbnZfcnhfcHJvY2Vzc19vcHRpbWl6ZWQ6ICVkIGJ5dGVzLCBwcm90byAlZCBhY2NlcHRlZC5cbiIsCisJCQkJZGV2LT5uYW1lLCBsZW4sIHNrYi0+cHJvdG9jb2wpOworCisJCQlpZiAobGlrZWx5KCFucC0+dmxhbmdycCkpIHsKKyNpZmRlZiBDT05GSUdfRk9SQ0VERVRIX05BUEkKKwkJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworI2Vsc2UKKwkJCQluZXRpZl9yeChza2IpOworI2VuZGlmCisJCQl9IGVsc2UgeworCQkJCXZsYW5mbGFncyA9IGxlMzJfdG9fY3B1KG5wLT5nZXRfcnguZXgtPmJ1Zmxvdyk7CisJCQkJaWYgKHZsYW5mbGFncyAmIE5WX1JYM19WTEFOX1RBR19QUkVTRU5UKSB7CisjaWZkZWYgQ09ORklHX0ZPUkNFREVUSF9OQVBJCisJCQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIG5wLT52bGFuZ3JwLAorCQkJCQkJCQkgdmxhbmZsYWdzICYgTlZfUlgzX1ZMQU5fVEFHX01BU0spOworI2Vsc2UKKwkJCQkJdmxhbl9od2FjY2VsX3J4KHNrYiwgbnAtPnZsYW5ncnAsCisJCQkJCQkJdmxhbmZsYWdzICYgTlZfUlgzX1ZMQU5fVEFHX01BU0spOworI2VuZGlmCisJCQkJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfRk9SQ0VERVRIX05BUEkKKwkJCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKyNlbHNlCisJCQkJCW5ldGlmX3J4KHNrYik7CisjZW5kaWYKKwkJCQl9CisJCQl9CisKKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQlucC0+c3RhdHMucnhfcGFja2V0cysrOworCQkJbnAtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKwkJfSBlbHNlIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJfQorbmV4dF9wa3Q6CisJCWlmICh1bmxpa2VseShucC0+Z2V0X3J4LmV4KysgPT0gbnAtPmxhc3RfcnguZXgpKQorCQkJbnAtPmdldF9yeC5leCA9IG5wLT5maXJzdF9yeC5leDsKKwkJaWYgKHVubGlrZWx5KG5wLT5nZXRfcnhfY3R4KysgPT0gbnAtPmxhc3RfcnhfY3R4KSkKKwkJCW5wLT5nZXRfcnhfY3R4ID0gbnAtPmZpcnN0X3J4X2N0eDsKKwl9CisKKwlyZXR1cm4gcnhfcHJvY2Vzc2VkX2NudDsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2J1ZnNpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI0NTYsNyArMjg0MCw2IEBACiAJCQlldmVudHMgPSByZWFkbChiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKSAmIE5WUkVHX0lSUVNUQVRfTUFTSzsKIAkJCXdyaXRlbChOVlJFR19JUlFTVEFUX01BU0ssIGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpOwogCQl9Ci0JCXBjaV9wdXNoKGJhc2UpOwogCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpcnE6ICUwOHhcbiIsIGRldi0+bmFtZSwgZXZlbnRzKTsKIAkJaWYgKCEoZXZlbnRzICYgbnAtPmlycW1hc2spKQogCQkJYnJlYWs7CkBAIC0yNDY1LDIyICsyODQ4LDQ2IEBACiAJCW52X3R4X2RvbmUoZGV2KTsKIAkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKIAotCQlpZiAoZXZlbnRzICYgTlZSRUdfSVJRX0xJTkspIHsKKyNpZmRlZiBDT05GSUdfRk9SQ0VERVRIX05BUEkKKwkJaWYgKGV2ZW50cyAmIE5WUkVHX0lSUV9SWF9BTEwpIHsKKwkJCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7CisKKwkJCS8qIERpc2FibGUgZnVydGh1ciByZWNlaXZlIGlycSdzICovCisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCW5wLT5pcnFtYXNrICY9IH5OVlJFR19JUlFfUlhfQUxMOworCisJCQlpZiAobnAtPm1zaV9mbGFncyAmIE5WX01TSV9YX0VOQUJMRUQpCisJCQkJd3JpdGVsKE5WUkVHX0lSUV9SWF9BTEwsIGJhc2UgKyBOdlJlZ0lycU1hc2spOworCQkJZWxzZQorCQkJCXdyaXRlbChucC0+aXJxbWFzaywgYmFzZSArIE52UmVnSXJxTWFzayk7CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQl9CisjZWxzZQorCQlpZiAobnZfcnhfcHJvY2VzcyhkZXYsIGRldi0+d2VpZ2h0KSkgeworCQkJaWYgKHVubGlrZWx5KG52X2FsbG9jX3J4KGRldikpKSB7CisJCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQkJaWYgKCFucC0+aW5fc2h1dGRvd24pCisJCQkJCW1vZF90aW1lcigmbnAtPm9vbV9raWNrLCBqaWZmaWVzICsgT09NX1JFRklMTCk7CisJCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWlmICh1bmxpa2VseShldmVudHMgJiBOVlJFR19JUlFfTElOSykpIHsKIAkJCXNwaW5fbG9jaygmbnAtPmxvY2spOwogCQkJbnZfbGlua19pcnEoZGV2KTsKIAkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CiAJCX0KLQkJaWYgKG5wLT5uZWVkX2xpbmt0aW1lciAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG5wLT5saW5rX3RpbWVvdXQpKSB7CisJCWlmICh1bmxpa2VseShucC0+bmVlZF9saW5rdGltZXIgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBucC0+bGlua190aW1lb3V0KSkpIHsKIAkJCXNwaW5fbG9jaygmbnAtPmxvY2spOwogCQkJbnZfbGlua2NoYW5nZShkZXYpOwogCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKIAkJCW5wLT5saW5rX3RpbWVvdXQgPSBqaWZmaWVzICsgTElOS19USU1FT1VUOwogCQl9Ci0JCWlmIChldmVudHMgJiAoTlZSRUdfSVJRX1RYX0VSUikpIHsKKwkJaWYgKHVubGlrZWx5KGV2ZW50cyAmIChOVlJFR19JUlFfVFhfRVJSKSkpIHsKIAkJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlY2VpdmVkIGlycSB3aXRoIGV2ZW50cyAweCV4LiBQcm9iYWJseSBUWCBmYWlsLlxuIiwKIAkJCQkJCWRldi0+bmFtZSwgZXZlbnRzKTsKIAkJfQotCQlpZiAoZXZlbnRzICYgKE5WUkVHX0lSUV9VTktOT1dOKSkgeworCQlpZiAodW5saWtlbHkoZXZlbnRzICYgKE5WUkVHX0lSUV9VTktOT1dOKSkpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZWQgaXJxIHdpdGggdW5rbm93biBldmVudHMgMHgleC4gUGxlYXNlIHJlcG9ydFxuIiwKIAkJCQkJCWRldi0+bmFtZSwgZXZlbnRzKTsKIAkJfQpAQCAtMjUwMSwzMCArMjkwOCw3IEBACiAJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOwogCQkJYnJlYWs7CiAJCX0KLSNpZmRlZiBDT05GSUdfRk9SQ0VERVRIX05BUEkKLQkJaWYgKGV2ZW50cyAmIE5WUkVHX0lSUV9SWF9BTEwpIHsKLQkJCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7Ci0KLQkJCS8qIERpc2FibGUgZnVydGh1ciByZWNlaXZlIGlycSdzICovCi0JCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKLQkJCW5wLT5pcnFtYXNrICY9IH5OVlJFR19JUlFfUlhfQUxMOwotCi0JCQlpZiAobnAtPm1zaV9mbGFncyAmIE5WX01TSV9YX0VOQUJMRUQpCi0JCQkJd3JpdGVsKE5WUkVHX0lSUV9SWF9BTEwsIGJhc2UgKyBOdlJlZ0lycU1hc2spOwotCQkJZWxzZQotCQkJCXdyaXRlbChucC0+aXJxbWFzaywgYmFzZSArIE52UmVnSXJxTWFzayk7Ci0JCQlzcGluX3VubG9jaygmbnAtPmxvY2spOwotCQl9Ci0jZWxzZQotCQludl9yeF9wcm9jZXNzKGRldiwgZGV2LT53ZWlnaHQpOwotCQlpZiAobnZfYWxsb2NfcngoZGV2KSkgewotCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7Ci0JCQlpZiAoIW5wLT5pbl9zaHV0ZG93bikKLQkJCQltb2RfdGltZXIoJm5wLT5vb21fa2ljaywgamlmZmllcyArIE9PTV9SRUZJTEwpOwotCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKLQkJfQotI2VuZGlmCi0JCWlmIChpID4gbWF4X2ludGVycnVwdF93b3JrKSB7CisJCWlmICh1bmxpa2VseShpID4gbWF4X2ludGVycnVwdF93b3JrKSkgewogCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CiAJCQkvKiBkaXNhYmxlIGludGVycnVwdHMgb24gdGhlIG5pYyAqLwogCQkJaWYgKCEobnAtPm1zaV9mbGFncyAmIE5WX01TSV9YX0VOQUJMRUQpKQpAQCAtMjU0OCw2ICsyOTMyLDEyNCBAQAogCXJldHVybiBJUlFfUkVUVkFMKGkpOwogfQogCisjZGVmaW5lIFRYX1dPUktfUEVSX0xPT1AgIDY0CisjZGVmaW5lIFJYX1dPUktfUEVSX0xPT1AgIDY0CisvKioKKyAqIEFsbCBfb3B0aW1pemVkIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBoZWxwIGluY3JlYXNlIHBlcmZvcm1hbmNlCisgKiAocmVkdWNlIENQVSBhbmQgaW5jcmVhc2UgdGhyb3VnaHB1dCkuIFRoZXkgdXNlIGRlc2NyaXB0ZXIgdmVyc2lvbiAzLAorICogY29tcGlsZXIgZGlyZWN0aXZlcywgYW5kIHJlZHVjZSBtZW1vcnkgYWNjZXNzZXMuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBudl9uaWNfaXJxX29wdGltaXplZChpbnQgZm9vLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKKwlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4IF9faW9tZW0gKmJhc2UgPSBnZXRfaHdiYXNlKGRldik7CisJdTMyIGV2ZW50czsKKwlpbnQgaTsKKworCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X25pY19pcnFfb3B0aW1pemVkXG4iLCBkZXYtPm5hbWUpOworCisJZm9yIChpPTA7IDsgaSsrKSB7CisJCWlmICghKG5wLT5tc2lfZmxhZ3MgJiBOVl9NU0lfWF9FTkFCTEVEKSkgeworCQkJZXZlbnRzID0gcmVhZGwoYmFzZSArIE52UmVnSXJxU3RhdHVzKSAmIE5WUkVHX0lSUVNUQVRfTUFTSzsKKwkJCXdyaXRlbChOVlJFR19JUlFTVEFUX01BU0ssIGJhc2UgKyBOdlJlZ0lycVN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQlldmVudHMgPSByZWFkbChiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKSAmIE5WUkVHX0lSUVNUQVRfTUFTSzsKKwkJCXdyaXRlbChOVlJFR19JUlFTVEFUX01BU0ssIGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpOworCQl9CisJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlycTogJTA4eFxuIiwgZGV2LT5uYW1lLCBldmVudHMpOworCQlpZiAoIShldmVudHMgJiBucC0+aXJxbWFzaykpCisJCQlicmVhazsKKworCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJbnZfdHhfZG9uZV9vcHRpbWl6ZWQoZGV2LCBUWF9XT1JLX1BFUl9MT09QKTsKKwkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKworI2lmZGVmIENPTkZJR19GT1JDRURFVEhfTkFQSQorCQlpZiAoZXZlbnRzICYgTlZSRUdfSVJRX1JYX0FMTCkgeworCQkJbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKworCQkJLyogRGlzYWJsZSBmdXJ0aHVyIHJlY2VpdmUgaXJxJ3MgKi8KKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJbnAtPmlycW1hc2sgJj0gfk5WUkVHX0lSUV9SWF9BTEw7CisKKwkJCWlmIChucC0+bXNpX2ZsYWdzICYgTlZfTVNJX1hfRU5BQkxFRCkKKwkJCQl3cml0ZWwoTlZSRUdfSVJRX1JYX0FMTCwgYmFzZSArIE52UmVnSXJxTWFzayk7CisJCQllbHNlCisJCQkJd3JpdGVsKG5wLT5pcnFtYXNrLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCX0KKyNlbHNlCisJCWlmIChudl9yeF9wcm9jZXNzX29wdGltaXplZChkZXYsIGRldi0+d2VpZ2h0KSkgeworCQkJaWYgKHVubGlrZWx5KG52X2FsbG9jX3J4X29wdGltaXplZChkZXYpKSkgeworCQkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJCWlmICghbnAtPmluX3NodXRkb3duKQorCQkJCQltb2RfdGltZXIoJm5wLT5vb21fa2ljaywgamlmZmllcyArIE9PTV9SRUZJTEwpOworCQkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCQl9CisJCX0KKyNlbmRpZgorCQlpZiAodW5saWtlbHkoZXZlbnRzICYgTlZSRUdfSVJRX0xJTkspKSB7CisJCQlzcGluX2xvY2soJm5wLT5sb2NrKTsKKwkJCW52X2xpbmtfaXJxKGRldik7CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQl9CisJCWlmICh1bmxpa2VseShucC0+bmVlZF9saW5rdGltZXIgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBucC0+bGlua190aW1lb3V0KSkpIHsKKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJbnZfbGlua2NoYW5nZShkZXYpOworCQkJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKwkJCW5wLT5saW5rX3RpbWVvdXQgPSBqaWZmaWVzICsgTElOS19USU1FT1VUOworCQl9CisJCWlmICh1bmxpa2VseShldmVudHMgJiAoTlZSRUdfSVJRX1RYX0VSUikpKSB7CisJCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWNlaXZlZCBpcnEgd2l0aCBldmVudHMgMHgleC4gUHJvYmFibHkgVFggZmFpbC5cbiIsCisJCQkJCQlkZXYtPm5hbWUsIGV2ZW50cyk7CisJCX0KKwkJaWYgKHVubGlrZWx5KGV2ZW50cyAmIChOVlJFR19JUlFfVU5LTk9XTikpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlY2VpdmVkIGlycSB3aXRoIHVua25vd24gZXZlbnRzIDB4JXguIFBsZWFzZSByZXBvcnRcbiIsCisJCQkJCQlkZXYtPm5hbWUsIGV2ZW50cyk7CisJCX0KKwkJaWYgKHVubGlrZWx5KGV2ZW50cyAmIE5WUkVHX0lSUV9SRUNPVkVSX0VSUk9SKSkgeworCQkJc3Bpbl9sb2NrKCZucC0+bG9jayk7CisJCQkvKiBkaXNhYmxlIGludGVycnVwdHMgb24gdGhlIG5pYyAqLworCQkJaWYgKCEobnAtPm1zaV9mbGFncyAmIE5WX01TSV9YX0VOQUJMRUQpKQorCQkJCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKwkJCWVsc2UKKwkJCQl3cml0ZWwobnAtPmlycW1hc2ssIGJhc2UgKyBOdlJlZ0lycU1hc2spOworCQkJcGNpX3B1c2goYmFzZSk7CisKKwkJCWlmICghbnAtPmluX3NodXRkb3duKSB7CisJCQkJbnAtPm5pY19wb2xsX2lycSA9IG5wLT5pcnFtYXNrOworCQkJCW5wLT5yZWNvdmVyX2Vycm9yID0gMTsKKwkJCQltb2RfdGltZXIoJm5wLT5uaWNfcG9sbCwgamlmZmllcyArIFBPTExfV0FJVCk7CisJCQl9CisJCQlzcGluX3VubG9jaygmbnAtPmxvY2spOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodW5saWtlbHkoaSA+IG1heF9pbnRlcnJ1cHRfd29yaykpIHsKKwkJCXNwaW5fbG9jaygmbnAtPmxvY2spOworCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBuaWMgKi8KKwkJCWlmICghKG5wLT5tc2lfZmxhZ3MgJiBOVl9NU0lfWF9FTkFCTEVEKSkKKwkJCQl3cml0ZWwoMCwgYmFzZSArIE52UmVnSXJxTWFzayk7CisJCQllbHNlCisJCQkJd3JpdGVsKG5wLT5pcnFtYXNrLCBiYXNlICsgTnZSZWdJcnFNYXNrKTsKKwkJCXBjaV9wdXNoKGJhc2UpOworCisJCQlpZiAoIW5wLT5pbl9zaHV0ZG93bikgeworCQkJCW5wLT5uaWNfcG9sbF9pcnEgPSBucC0+aXJxbWFzazsKKwkJCQltb2RfdGltZXIoJm5wLT5uaWNfcG9sbCwgamlmZmllcyArIFBPTExfV0FJVCk7CisJCQl9CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHRvbyBtYW55IGl0ZXJhdGlvbnMgKCVkKSBpbiBudl9uaWNfaXJxLlxuIiwgZGV2LT5uYW1lLCBpKTsKKwkJCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisJCQlicmVhazsKKwkJfQorCisJfQorCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IG52X25pY19pcnFfb3B0aW1pemVkIGNvbXBsZXRlZFxuIiwgZGV2LT5uYW1lKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGkpOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgbnZfbmljX2lycV90eChpbnQgZm9vLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKQEAgLTI1NjIsMjAgKzMwNjQsMTkgQEAKIAlmb3IgKGk9MDsgOyBpKyspIHsKIAkJZXZlbnRzID0gcmVhZGwoYmFzZSArIE52UmVnTVNJWElycVN0YXR1cykgJiBOVlJFR19JUlFfVFhfQUxMOwogCQl3cml0ZWwoTlZSRUdfSVJRX1RYX0FMTCwgYmFzZSArIE52UmVnTVNJWElycVN0YXR1cyk7Ci0JCXBjaV9wdXNoKGJhc2UpOwogCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0eCBpcnE6ICUwOHhcbiIsIGRldi0+bmFtZSwgZXZlbnRzKTsKIAkJaWYgKCEoZXZlbnRzICYgbnAtPmlycW1hc2spKQogCQkJYnJlYWs7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFncyk7Ci0JCW52X3R4X2RvbmUoZGV2KTsKKwkJbnZfdHhfZG9uZV9vcHRpbWl6ZWQoZGV2LCBUWF9XT1JLX1BFUl9MT09QKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAotCQlpZiAoZXZlbnRzICYgKE5WUkVHX0lSUV9UWF9FUlIpKSB7CisJCWlmICh1bmxpa2VseShldmVudHMgJiAoTlZSRUdfSVJRX1RYX0VSUikpKSB7CiAJCQlkcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWNlaXZlZCBpcnEgd2l0aCBldmVudHMgMHgleC4gUHJvYmFibHkgVFggZmFpbC5cbiIsCiAJCQkJCQlkZXYtPm5hbWUsIGV2ZW50cyk7CiAJCX0KLQkJaWYgKGkgPiBtYXhfaW50ZXJydXB0X3dvcmspIHsKKwkJaWYgKHVubGlrZWx5KGkgPiBtYXhfaW50ZXJydXB0X3dvcmspKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAkJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgbmljICovCiAJCQl3cml0ZWwoTlZSRUdfSVJRX1RYX0FMTCwgYmFzZSArIE52UmVnSXJxTWFzayk7CkBAIC0yNjA0LDcgKzMxMDUsMTAgQEAKIAl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlwa3RzID0gbnZfcnhfcHJvY2VzcyhkZXYsIGxpbWl0KTsKKwlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpCisJCXBrdHMgPSBudl9yeF9wcm9jZXNzKGRldiwgbGltaXQpOworCWVsc2UKKwkJcGt0cyA9IG52X3J4X3Byb2Nlc3Nfb3B0aW1pemVkKGRldiwgbGltaXQpOwogCiAJaWYgKG52X2FsbG9jX3J4KGRldikpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFncyk7CkBAIC0yNjcwLDIwICszMTc0LDIwIEBACiAJZm9yIChpPTA7IDsgaSsrKSB7CiAJCWV2ZW50cyA9IHJlYWRsKGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpICYgTlZSRUdfSVJRX1JYX0FMTDsKIAkJd3JpdGVsKE5WUkVHX0lSUV9SWF9BTEwsIGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpOwotCQlwY2lfcHVzaChiYXNlKTsKIAkJZHByaW50ayhLRVJOX0RFQlVHICIlczogcnggaXJxOiAlMDh4XG4iLCBkZXYtPm5hbWUsIGV2ZW50cyk7CiAJCWlmICghKGV2ZW50cyAmIG5wLT5pcnFtYXNrKSkKIAkJCWJyZWFrOwogCi0JCW52X3J4X3Byb2Nlc3MoZGV2LCBkZXYtPndlaWdodCk7Ci0JCWlmIChudl9hbGxvY19yeChkZXYpKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKLQkJCWlmICghbnAtPmluX3NodXRkb3duKQotCQkJCW1vZF90aW1lcigmbnAtPm9vbV9raWNrLCBqaWZmaWVzICsgT09NX1JFRklMTCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCQlpZiAobnZfcnhfcHJvY2Vzc19vcHRpbWl6ZWQoZGV2LCBkZXYtPndlaWdodCkpIHsKKwkJCWlmICh1bmxpa2VseShudl9hbGxvY19yeF9vcHRpbWl6ZWQoZGV2KSkpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAoIW5wLT5pbl9zaHV0ZG93bikKKwkJCQkJbW9kX3RpbWVyKCZucC0+b29tX2tpY2ssIGppZmZpZXMgKyBPT01fUkVGSUxMKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCQkJfQogCQl9CiAKLQkJaWYgKGkgPiBtYXhfaW50ZXJydXB0X3dvcmspIHsKKwkJaWYgKHVubGlrZWx5KGkgPiBtYXhfaW50ZXJydXB0X3dvcmspKSB7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnAtPmxvY2ssIGZsYWdzKTsKIAkJCS8qIGRpc2FibGUgaW50ZXJydXB0cyBvbiB0aGUgbmljICovCiAJCQl3cml0ZWwoTlZSRUdfSVJRX1JYX0FMTCwgYmFzZSArIE52UmVnSXJxTWFzayk7CkBAIC0yNzE4LDExICszMjIyLDE1IEBACiAJZm9yIChpPTA7IDsgaSsrKSB7CiAJCWV2ZW50cyA9IHJlYWRsKGJhc2UgKyBOdlJlZ01TSVhJcnFTdGF0dXMpICYgTlZSRUdfSVJRX09USEVSOwogCQl3cml0ZWwoTlZSRUdfSVJRX09USEVSLCBiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKTsKLQkJcGNpX3B1c2goYmFzZSk7CiAJCWRwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlycTogJTA4eFxuIiwgZGV2LT5uYW1lLCBldmVudHMpOwogCQlpZiAoIShldmVudHMgJiBucC0+aXJxbWFzaykpCiAJCQlicmVhazsKIAorCQkvKiBjaGVjayB0eCBpbiBjYXNlIHdlIHJlYWNoZWQgbWF4IGxvb3AgbGltaXQgaW4gdHggaXNyICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOworCQludl90eF9kb25lX29wdGltaXplZChkZXYsIFRYX1dPUktfUEVSX0xPT1ApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCiAJCWlmIChldmVudHMgJiBOVlJFR19JUlFfTElOSykgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFncyk7CiAJCQludl9saW5rX2lycShkZXYpOwpAQCAtMjc1Miw3ICszMjYwLDcgQEAKIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVjZWl2ZWQgaXJxIHdpdGggdW5rbm93biBldmVudHMgMHgleC4gUGxlYXNlIHJlcG9ydFxuIiwKIAkJCQkJCWRldi0+bmFtZSwgZXZlbnRzKTsKIAkJfQotCQlpZiAoaSA+IG1heF9pbnRlcnJ1cHRfd29yaykgeworCQlpZiAodW5saWtlbHkoaSA+IG1heF9pbnRlcnJ1cHRfd29yaykpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOwogCQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBuaWMgKi8KIAkJCXdyaXRlbChOVlJFR19JUlFfT1RIRVIsIGJhc2UgKyBOdlJlZ0lycU1hc2spOwpAQCAtMjgzNSw2ICszMzQzLDE2IEBACiAJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKIAlpbnQgcmV0ID0gMTsKIAlpbnQgaTsKKwlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCBmb28sIHZvaWQgKmRhdGEpOworCisJaWYgKGludHJfdGVzdCkgeworCQloYW5kbGVyID0gbnZfbmljX2lycV90ZXN0OworCX0gZWxzZSB7CisJCWlmIChucC0+ZGVzY192ZXIgPT0gREVTQ19WRVJfMykKKwkJCWhhbmRsZXIgPSBudl9uaWNfaXJxX29wdGltaXplZDsKKwkJZWxzZQorCQkJaGFuZGxlciA9IG52X25pY19pcnE7CisJfQogCiAJaWYgKG5wLT5tc2lfZmxhZ3MgJiBOVl9NU0lfWF9DQVBBQkxFKSB7CiAJCWZvciAoaSA9IDA7IGkgPCAobnAtPm1zaV9mbGFncyAmIE5WX01TSV9YX1ZFQ1RPUlNfTUFTSyk7IGkrKykgewpAQCAtMjg3MiwxMCArMzM5MCw3IEBACiAJCQkJc2V0X21zaXhfdmVjdG9yX21hcChkZXYsIE5WX01TSV9YX1ZFQ1RPUl9PVEhFUiwgTlZSRUdfSVJRX09USEVSKTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogUmVxdWVzdCBpcnEgZm9yIGFsbCBpbnRlcnJ1cHRzICovCi0JCQkJaWYgKCghaW50cl90ZXN0ICYmCi0JCQkJICAgICByZXF1ZXN0X2lycShucC0+bXNpX3hfZW50cnlbTlZfTVNJX1hfVkVDVE9SX0FMTF0udmVjdG9yLCAmbnZfbmljX2lycSwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KSAhPSAwKSB8fAotCQkJCSAgICAoaW50cl90ZXN0ICYmCi0JCQkJICAgICByZXF1ZXN0X2lycShucC0+bXNpX3hfZW50cnlbTlZfTVNJX1hfVkVDVE9SX0FMTF0udmVjdG9yLCAmbnZfbmljX2lycV90ZXN0LCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpICE9IDApKSB7CisJCQkJaWYgKHJlcXVlc3RfaXJxKG5wLT5tc2lfeF9lbnRyeVtOVl9NU0lfWF9WRUNUT1JfQUxMXS52ZWN0b3IsIGhhbmRsZXIsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldikgIT0gMCkgewogCQkJCQlwcmludGsoS0VSTl9JTkZPICJmb3JjZWRldGg6IHJlcXVlc3RfaXJxIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJCQkJcGNpX2Rpc2FibGVfbXNpeChucC0+cGNpX2Rldik7CiAJCQkJCW5wLT5tc2lfZmxhZ3MgJj0gfk5WX01TSV9YX0VOQUJMRUQ7CkBAIC0yODkxLDggKzM0MDYsNyBAQAogCWlmIChyZXQgIT0gMCAmJiBucC0+bXNpX2ZsYWdzICYgTlZfTVNJX0NBUEFCTEUpIHsKIAkJaWYgKChyZXQgPSBwY2lfZW5hYmxlX21zaShucC0+cGNpX2RldikpID09IDApIHsKIAkJCW5wLT5tc2lfZmxhZ3MgfD0gTlZfTVNJX0VOQUJMRUQ7Ci0JCQlpZiAoKCFpbnRyX3Rlc3QgJiYgcmVxdWVzdF9pcnEobnAtPnBjaV9kZXYtPmlycSwgJm52X25pY19pcnEsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldikgIT0gMCkgfHwKLQkJCSAgICAoaW50cl90ZXN0ICYmIHJlcXVlc3RfaXJxKG5wLT5wY2lfZGV2LT5pcnEsICZudl9uaWNfaXJxX3Rlc3QsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldikgIT0gMCkpIHsKKwkJCWlmIChyZXF1ZXN0X2lycShucC0+cGNpX2Rldi0+aXJxLCBoYW5kbGVyLCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpICE9IDApIHsKIAkJCQlwcmludGsoS0VSTl9JTkZPICJmb3JjZWRldGg6IHJlcXVlc3RfaXJxIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJCQlwY2lfZGlzYWJsZV9tc2kobnAtPnBjaV9kZXYpOwogCQkJCW5wLT5tc2lfZmxhZ3MgJj0gfk5WX01TSV9FTkFCTEVEOwpAQCAtMjkwNyw4ICszNDIxLDcgQEAKIAkJfQogCX0KIAlpZiAocmV0ICE9IDApIHsKLQkJaWYgKCghaW50cl90ZXN0ICYmIHJlcXVlc3RfaXJxKG5wLT5wY2lfZGV2LT5pcnEsICZudl9uaWNfaXJxLCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpICE9IDApIHx8Ci0JCSAgICAoaW50cl90ZXN0ICYmIHJlcXVlc3RfaXJxKG5wLT5wY2lfZGV2LT5pcnEsICZudl9uaWNfaXJxX3Rlc3QsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldikgIT0gMCkpCisJCWlmIChyZXF1ZXN0X2lycShucC0+cGNpX2Rldi0+aXJxLCBoYW5kbGVyLCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpICE9IDApCiAJCQlnb3RvIG91dF9lcnI7CiAKIAl9CkBAIC0zMDUxLDQ3ICszNTY0LDggQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRhdGE7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOwogCi0JbnAtPmVzdGF0cy50eF9ieXRlcyArPSByZWFkbChiYXNlICsgTnZSZWdUeENudCk7Ci0JbnAtPmVzdGF0cy50eF96ZXJvX3JleG10ICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4WmVyb1JlWG10KTsKLQlucC0+ZXN0YXRzLnR4X29uZV9yZXhtdCArPSByZWFkbChiYXNlICsgTnZSZWdUeE9uZVJlWG10KTsKLQlucC0+ZXN0YXRzLnR4X21hbnlfcmV4bXQgKz0gcmVhZGwoYmFzZSArIE52UmVnVHhNYW55UmVYbXQpOwotCW5wLT5lc3RhdHMudHhfbGF0ZV9jb2xsaXNpb24gKz0gcmVhZGwoYmFzZSArIE52UmVnVHhMYXRlQ29sKTsKLQlucC0+ZXN0YXRzLnR4X2ZpZm9fZXJyb3JzICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4VW5kZXJmbG93KTsKLQlucC0+ZXN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4TG9zc0NhcnJpZXIpOwotCW5wLT5lc3RhdHMudHhfZXhjZXNzX2RlZmVycmFsICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4RXhjZXNzRGVmKTsKLQlucC0+ZXN0YXRzLnR4X3JldHJ5X2Vycm9yICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4UmV0cnlFcnIpOwotCW5wLT5lc3RhdHMudHhfZGVmZXJyYWwgKz0gcmVhZGwoYmFzZSArIE52UmVnVHhEZWYpOwotCW5wLT5lc3RhdHMudHhfcGFja2V0cyArPSByZWFkbChiYXNlICsgTnZSZWdUeEZyYW1lKTsKLQlucC0+ZXN0YXRzLnR4X3BhdXNlICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4UGF1c2UpOwotCW5wLT5lc3RhdHMucnhfZnJhbWVfZXJyb3IgKz0gcmVhZGwoYmFzZSArIE52UmVnUnhGcmFtZUVycik7Ci0JbnAtPmVzdGF0cy5yeF9leHRyYV9ieXRlICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4RXh0cmFCeXRlKTsKLQlucC0+ZXN0YXRzLnJ4X2xhdGVfY29sbGlzaW9uICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4TGF0ZUNvbCk7Ci0JbnAtPmVzdGF0cy5yeF9ydW50ICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4UnVudCk7Ci0JbnAtPmVzdGF0cy5yeF9mcmFtZV90b29fbG9uZyArPSByZWFkbChiYXNlICsgTnZSZWdSeEZyYW1lVG9vTG9uZyk7Ci0JbnAtPmVzdGF0cy5yeF9vdmVyX2Vycm9ycyArPSByZWFkbChiYXNlICsgTnZSZWdSeE92ZXJmbG93KTsKLQlucC0+ZXN0YXRzLnJ4X2NyY19lcnJvcnMgKz0gcmVhZGwoYmFzZSArIE52UmVnUnhGQ1NFcnIpOwotCW5wLT5lc3RhdHMucnhfZnJhbWVfYWxpZ25fZXJyb3IgKz0gcmVhZGwoYmFzZSArIE52UmVnUnhGcmFtZUFsaWduRXJyKTsKLQlucC0+ZXN0YXRzLnJ4X2xlbmd0aF9lcnJvciArPSByZWFkbChiYXNlICsgTnZSZWdSeExlbkVycik7Ci0JbnAtPmVzdGF0cy5yeF91bmljYXN0ICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4VW5pY2FzdCk7Ci0JbnAtPmVzdGF0cy5yeF9tdWx0aWNhc3QgKz0gcmVhZGwoYmFzZSArIE52UmVnUnhNdWx0aWNhc3QpOwotCW5wLT5lc3RhdHMucnhfYnJvYWRjYXN0ICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4QnJvYWRjYXN0KTsKLQlucC0+ZXN0YXRzLnJ4X2J5dGVzICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4Q250KTsKLQlucC0+ZXN0YXRzLnJ4X3BhdXNlICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1J4UGF1c2UpOwotCW5wLT5lc3RhdHMucnhfZHJvcF9mcmFtZSArPSByZWFkbChiYXNlICsgTnZSZWdSeERyb3BGcmFtZSk7Ci0JbnAtPmVzdGF0cy5yeF9wYWNrZXRzID0KLQkJbnAtPmVzdGF0cy5yeF91bmljYXN0ICsKLQkJbnAtPmVzdGF0cy5yeF9tdWx0aWNhc3QgKwotCQlucC0+ZXN0YXRzLnJ4X2Jyb2FkY2FzdDsKLQlucC0+ZXN0YXRzLnJ4X2Vycm9yc190b3RhbCA9Ci0JCW5wLT5lc3RhdHMucnhfY3JjX2Vycm9ycyArCi0JCW5wLT5lc3RhdHMucnhfb3Zlcl9lcnJvcnMgKwotCQlucC0+ZXN0YXRzLnJ4X2ZyYW1lX2Vycm9yICsKLQkJKG5wLT5lc3RhdHMucnhfZnJhbWVfYWxpZ25fZXJyb3IgLSBucC0+ZXN0YXRzLnJ4X2V4dHJhX2J5dGUpICsKLQkJbnAtPmVzdGF0cy5yeF9sYXRlX2NvbGxpc2lvbiArCi0JCW5wLT5lc3RhdHMucnhfcnVudCArCi0JCW5wLT5lc3RhdHMucnhfZnJhbWVfdG9vX2xvbmc7CisJbnZfZ2V0X2h3X3N0YXRzKGRldik7CiAKIAlpZiAoIW5wLT5pbl9zaHV0ZG93bikKIAkJbW9kX3RpbWVyKCZucC0+c3RhdHNfcG9sbCwgamlmZmllcyArIFNUQVRTX0lOVEVSVkFMKTsKQEAgLTM0NjUsNyArMzkzOSw3IEBACiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOwotCXU4ICpyeHR4X3JpbmcsICpyeF9za2J1ZmYsICp0eF9za2J1ZmYsICpyeF9kbWEsICp0eF9kbWEsICp0eF9kbWFfbGVuOworCXU4ICpyeHR4X3JpbmcsICpyeF9za2J1ZmYsICp0eF9za2J1ZmY7CiAJZG1hX2FkZHJfdCByaW5nX2FkZHI7CiAKIAlpZiAocmluZy0+cnhfcGVuZGluZyA8IFJYX1JJTkdfTUlOIHx8CkBAIC0zNDkxLDEyICszOTY1LDkgQEAKIAkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcmluZ19kZXNjX2V4KSAqIChyaW5nLT5yeF9wZW5kaW5nICsgcmluZy0+dHhfcGVuZGluZyksCiAJCQkJCSAgICAmcmluZ19hZGRyKTsKIAl9Ci0Jcnhfc2tidWZmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNrX2J1ZmYqKSAqIHJpbmctPnJ4X3BlbmRpbmcsIEdGUF9LRVJORUwpOwotCXJ4X2RtYSA9IGttYWxsb2Moc2l6ZW9mKGRtYV9hZGRyX3QpICogcmluZy0+cnhfcGVuZGluZywgR0ZQX0tFUk5FTCk7Ci0JdHhfc2tidWZmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNrX2J1ZmYqKSAqIHJpbmctPnR4X3BlbmRpbmcsIEdGUF9LRVJORUwpOwotCXR4X2RtYSA9IGttYWxsb2Moc2l6ZW9mKGRtYV9hZGRyX3QpICogcmluZy0+dHhfcGVuZGluZywgR0ZQX0tFUk5FTCk7Ci0JdHhfZG1hX2xlbiA9IGttYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCkgKiByaW5nLT50eF9wZW5kaW5nLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJ4dHhfcmluZyB8fCAhcnhfc2tidWZmIHx8ICFyeF9kbWEgfHwgIXR4X3NrYnVmZiB8fCAhdHhfZG1hIHx8ICF0eF9kbWFfbGVuKSB7CisJcnhfc2tidWZmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG52X3NrYl9tYXApICogcmluZy0+cnhfcGVuZGluZywgR0ZQX0tFUk5FTCk7CisJdHhfc2tidWZmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG52X3NrYl9tYXApICogcmluZy0+dHhfcGVuZGluZywgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeHR4X3JpbmcgfHwgIXJ4X3NrYnVmZiB8fCAhdHhfc2tidWZmKSB7CiAJCS8qIGZhbGwgYmFjayB0byBvbGQgcmluZ3MgKi8KIAkJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xIHx8IG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8yKSB7CiAJCQlpZiAocnh0eF9yaW5nKQpAQCAtMzUwOSwxNCArMzk4MCw4IEBACiAJCX0KIAkJaWYgKHJ4X3NrYnVmZikKIAkJCWtmcmVlKHJ4X3NrYnVmZik7Ci0JCWlmIChyeF9kbWEpCi0JCQlrZnJlZShyeF9kbWEpOwogCQlpZiAodHhfc2tidWZmKQogCQkJa2ZyZWUodHhfc2tidWZmKTsKLQkJaWYgKHR4X2RtYSkKLQkJCWtmcmVlKHR4X2RtYSk7Ci0JCWlmICh0eF9kbWFfbGVuKQotCQkJa2ZyZWUodHhfZG1hX2xlbik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTM1MzgsOCArNDAwMyw2IEBACiAJLyogc2V0IG5ldyB2YWx1ZXMgKi8KIAlucC0+cnhfcmluZ19zaXplID0gcmluZy0+cnhfcGVuZGluZzsKIAlucC0+dHhfcmluZ19zaXplID0gcmluZy0+dHhfcGVuZGluZzsKLQlucC0+dHhfbGltaXRfc3RvcCA9IHJpbmctPnR4X3BlbmRpbmcgLSBUWF9MSU1JVF9ESUZGRVJFTkNFOwotCW5wLT50eF9saW1pdF9zdGFydCA9IHJpbmctPnR4X3BlbmRpbmcgLSBUWF9MSU1JVF9ESUZGRVJFTkNFIC0gMTsKIAlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpIHsKIAkJbnAtPnJ4X3Jpbmcub3JpZyA9IChzdHJ1Y3QgcmluZ19kZXNjKilyeHR4X3Jpbmc7CiAJCW5wLT50eF9yaW5nLm9yaWcgPSAmbnAtPnJ4X3Jpbmcub3JpZ1tucC0+cnhfcmluZ19zaXplXTsKQEAgLTM1NDcsMTggKzQwMTAsMTIgQEAKIAkJbnAtPnJ4X3JpbmcuZXggPSAoc3RydWN0IHJpbmdfZGVzY19leCopcnh0eF9yaW5nOwogCQlucC0+dHhfcmluZy5leCA9ICZucC0+cnhfcmluZy5leFtucC0+cnhfcmluZ19zaXplXTsKIAl9Ci0JbnAtPnJ4X3NrYnVmZiA9IChzdHJ1Y3Qgc2tfYnVmZioqKXJ4X3NrYnVmZjsKLQlucC0+cnhfZG1hID0gKGRtYV9hZGRyX3QqKXJ4X2RtYTsKLQlucC0+dHhfc2tidWZmID0gKHN0cnVjdCBza19idWZmKiopdHhfc2tidWZmOwotCW5wLT50eF9kbWEgPSAoZG1hX2FkZHJfdCopdHhfZG1hOwotCW5wLT50eF9kbWFfbGVuID0gKHVuc2lnbmVkIGludCopdHhfZG1hX2xlbjsKKwlucC0+cnhfc2tiID0gKHN0cnVjdCBudl9za2JfbWFwKilyeF9za2J1ZmY7CisJbnAtPnR4X3NrYiA9IChzdHJ1Y3QgbnZfc2tiX21hcCopdHhfc2tidWZmOwogCW5wLT5yaW5nX2FkZHIgPSByaW5nX2FkZHI7CiAKLQltZW1zZXQobnAtPnJ4X3NrYnVmZiwgMCwgc2l6ZW9mKHN0cnVjdCBza19idWZmKikgKiBucC0+cnhfcmluZ19zaXplKTsKLQltZW1zZXQobnAtPnJ4X2RtYSwgMCwgc2l6ZW9mKGRtYV9hZGRyX3QpICogbnAtPnJ4X3Jpbmdfc2l6ZSk7Ci0JbWVtc2V0KG5wLT50eF9za2J1ZmYsIDAsIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiopICogbnAtPnR4X3Jpbmdfc2l6ZSk7Ci0JbWVtc2V0KG5wLT50eF9kbWEsIDAsIHNpemVvZihkbWFfYWRkcl90KSAqIG5wLT50eF9yaW5nX3NpemUpOwotCW1lbXNldChucC0+dHhfZG1hX2xlbiwgMCwgc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBucC0+dHhfcmluZ19zaXplKTsKKwltZW1zZXQobnAtPnJ4X3NrYiwgMCwgc2l6ZW9mKHN0cnVjdCBudl9za2JfbWFwKSAqIG5wLT5yeF9yaW5nX3NpemUpOworCW1lbXNldChucC0+dHhfc2tiLCAwLCBzaXplb2Yoc3RydWN0IG52X3NrYl9tYXApICogbnAtPnR4X3Jpbmdfc2l6ZSk7CiAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCS8qIHJlaW5pdCBkcml2ZXIgdmlldyBvZiB0aGUgcXVldWVzICovCkBAIC0zNzI3LDggKzQxODQsMTAgQEAKIHsKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaWYgKG5wLT5kcml2ZXJfZGF0YSAmIERFVl9IQVNfU1RBVElTVElDUykKLQkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbnZfZXRodG9vbF9zdGF0cykvc2l6ZW9mKHU2NCk7CisJaWYgKG5wLT5kcml2ZXJfZGF0YSAmIERFVl9IQVNfU1RBVElTVElDU19WMSkKKwkJcmV0dXJuIE5WX0RFVl9TVEFUSVNUSUNTX1YxX0NPVU5UOworCWVsc2UgaWYgKG5wLT5kcml2ZXJfZGF0YSAmIERFVl9IQVNfU1RBVElTVElDU19WMikKKwkJcmV0dXJuIE5WX0RFVl9TVEFUSVNUSUNTX1YyX0NPVU5UOwogCWVsc2UKIAkJcmV0dXJuIDA7CiB9CkBAIC0zOTU1LDcgKzQ0MTQsNyBAQAogCQkJZHByaW50ayhLRVJOX0RFQlVHICIlczogbG9vcGJhY2sgbGVuIG1pc21hdGNoICVkIHZzICVkXG4iLAogCQkJCWRldi0+bmFtZSwgbGVuLCBwa3RfbGVuKTsKIAkJfSBlbHNlIHsKLQkJCXJ4X3NrYiA9IG5wLT5yeF9za2J1ZmZbMF07CisJCQlyeF9za2IgPSBucC0+cnhfc2tiWzBdLnNrYjsKIAkJCWZvciAoaSA9IDA7IGkgPCBwa3RfbGVuOyBpKyspIHsKIAkJCQlpZiAocnhfc2tiLT5kYXRhW2ldICE9ICh1OCkoaSAmIDB4ZmYpKSB7CiAJCQkJCXJldCA9IDA7CkBAIC00MzE1LDcgKzQ3NzQsNyBAQAogCQltb2RfdGltZXIoJm5wLT5vb21fa2ljaywgamlmZmllcyArIE9PTV9SRUZJTEwpOwogCiAJLyogc3RhcnQgc3RhdGlzdGljcyB0aW1lciAqLwotCWlmIChucC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX1NUQVRJU1RJQ1MpCisJaWYgKG5wLT5kcml2ZXJfZGF0YSAmIChERVZfSEFTX1NUQVRJU1RJQ1NfVjF8REVWX0hBU19TVEFUSVNUSUNTX1YyKSkKIAkJbW9kX3RpbWVyKCZucC0+c3RhdHNfcG9sbCwgamlmZmllcyArIFNUQVRTX0lOVEVSVkFMKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOwpAQCAtNDQxMiw3ICs0ODcxLDkgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfZGlzYWJsZTsKIAotCWlmIChpZC0+ZHJpdmVyX2RhdGEgJiAoREVWX0hBU19WTEFOfERFVl9IQVNfTVNJX1h8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1NUQVRJU1RJQ1MpKQorCWlmIChpZC0+ZHJpdmVyX2RhdGEgJiAoREVWX0hBU19WTEFOfERFVl9IQVNfTVNJX1h8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1NUQVRJU1RJQ1NfVjIpKQorCQlucC0+cmVnaXN0ZXJfc2l6ZSA9IE5WX1BDSV9SRUdTWl9WRVIzOworCWVsc2UgaWYgKGlkLT5kcml2ZXJfZGF0YSAmIERFVl9IQVNfU1RBVElTVElDU19WMSkKIAkJbnAtPnJlZ2lzdGVyX3NpemUgPSBOVl9QQ0lfUkVHU1pfVkVSMjsKIAllbHNlCiAJCW5wLT5yZWdpc3Rlcl9zaXplID0gTlZfUENJX1JFR1NaX1ZFUjE7CkBAIC00NDc1LDEwICs0OTM2LDggQEAKIAkJbnAtPnJ4X2NzdW0gPSAxOwogCQlucC0+dHhyeGN0bF9iaXRzIHw9IE5WUkVHX1RYUlhDVExfUlhDSEVDSzsKIAkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX1NHOwotI2lmZGVmIE5FVElGX0ZfVFNPCiAJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087Ci0jZW5kaWYKLSAJfQorCX0KIAogCW5wLT52bGFuY3RsX2JpdHMgPSAwOwogCWlmIChpZC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX1ZMQU4pIHsKQEAgLTQ1MTIsOCArNDk3MSw2IEBACiAKIAlucC0+cnhfcmluZ19zaXplID0gUlhfUklOR19ERUZBVUxUOwogCW5wLT50eF9yaW5nX3NpemUgPSBUWF9SSU5HX0RFRkFVTFQ7Ci0JbnAtPnR4X2xpbWl0X3N0b3AgPSBucC0+dHhfcmluZ19zaXplIC0gVFhfTElNSVRfRElGRkVSRU5DRTsKLQlucC0+dHhfbGltaXRfc3RhcnQgPSBucC0+dHhfcmluZ19zaXplIC0gVFhfTElNSVRfRElGRkVSRU5DRSAtIDE7CiAKIAlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpIHsKIAkJbnAtPnJ4X3Jpbmcub3JpZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaV9kZXYsCkBAIC00NTMwLDIyICs0OTg3LDE5IEBACiAJCQlnb3RvIG91dF91bm1hcDsKIAkJbnAtPnR4X3JpbmcuZXggPSAmbnAtPnJ4X3JpbmcuZXhbbnAtPnJ4X3Jpbmdfc2l6ZV07CiAJfQotCW5wLT5yeF9za2J1ZmYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiopICogbnAtPnJ4X3Jpbmdfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JbnAtPnJ4X2RtYSA9IGttYWxsb2Moc2l6ZW9mKGRtYV9hZGRyX3QpICogbnAtPnJ4X3Jpbmdfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JbnAtPnR4X3NrYnVmZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBza19idWZmKikgKiBucC0+dHhfcmluZ19zaXplLCBHRlBfS0VSTkVMKTsKLQlucC0+dHhfZG1hID0ga21hbGxvYyhzaXplb2YoZG1hX2FkZHJfdCkgKiBucC0+dHhfcmluZ19zaXplLCBHRlBfS0VSTkVMKTsKLQlucC0+dHhfZG1hX2xlbiA9IGttYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBucC0+dHhfcmluZ19zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5wLT5yeF9za2J1ZmYgfHwgIW5wLT5yeF9kbWEgfHwgIW5wLT50eF9za2J1ZmYgfHwgIW5wLT50eF9kbWEgfHwgIW5wLT50eF9kbWFfbGVuKQorCW5wLT5yeF9za2IgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbnZfc2tiX21hcCkgKiBucC0+cnhfcmluZ19zaXplLCBHRlBfS0VSTkVMKTsKKwlucC0+dHhfc2tiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG52X3NrYl9tYXApICogbnAtPnR4X3Jpbmdfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFucC0+cnhfc2tiIHx8ICFucC0+dHhfc2tiKQogCQlnb3RvIG91dF9mcmVlcmluZzsKLQltZW1zZXQobnAtPnJ4X3NrYnVmZiwgMCwgc2l6ZW9mKHN0cnVjdCBza19idWZmKikgKiBucC0+cnhfcmluZ19zaXplKTsKLQltZW1zZXQobnAtPnJ4X2RtYSwgMCwgc2l6ZW9mKGRtYV9hZGRyX3QpICogbnAtPnJ4X3Jpbmdfc2l6ZSk7Ci0JbWVtc2V0KG5wLT50eF9za2J1ZmYsIDAsIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiopICogbnAtPnR4X3Jpbmdfc2l6ZSk7Ci0JbWVtc2V0KG5wLT50eF9kbWEsIDAsIHNpemVvZihkbWFfYWRkcl90KSAqIG5wLT50eF9yaW5nX3NpemUpOwotCW1lbXNldChucC0+dHhfZG1hX2xlbiwgMCwgc2l6ZW9mKHVuc2lnbmVkIGludCkgKiBucC0+dHhfcmluZ19zaXplKTsKKwltZW1zZXQobnAtPnJ4X3NrYiwgMCwgc2l6ZW9mKHN0cnVjdCBudl9za2JfbWFwKSAqIG5wLT5yeF9yaW5nX3NpemUpOworCW1lbXNldChucC0+dHhfc2tiLCAwLCBzaXplb2Yoc3RydWN0IG52X3NrYl9tYXApICogbnAtPnR4X3Jpbmdfc2l6ZSk7CiAKIAlkZXYtPm9wZW4gPSBudl9vcGVuOwogCWRldi0+c3RvcCA9IG52X2Nsb3NlOwotCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbnZfc3RhcnRfeG1pdDsKKwlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEgfHwgbnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzIpCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbnZfc3RhcnRfeG1pdDsKKwllbHNlCisJCWRldi0+aGFyZF9zdGFydF94bWl0ID0gbnZfc3RhcnRfeG1pdF9vcHRpbWl6ZWQ7CiAJZGV2LT5nZXRfc3RhdHMgPSBudl9nZXRfc3RhdHM7CiAJZGV2LT5jaGFuZ2VfbXR1ID0gbnZfY2hhbmdlX210dTsKIAlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IG52X3NldF9tYWNfYWRkcmVzczsKQEAgLTQ1NTMsNyArNTAwNyw3IEBACiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIAlkZXYtPnBvbGxfY29udHJvbGxlciA9IG52X3BvbGxfY29udHJvbGxlcjsKICNlbmRpZgotCWRldi0+d2VpZ2h0ID0gNjQ7CisJZGV2LT53ZWlnaHQgPSBSWF9XT1JLX1BFUl9MT09QOwogI2lmZGVmIENPTkZJR19GT1JDRURFVEhfTkFQSQogCWRldi0+cG9sbCA9IG52X25hcGlfcG9sbDsKICNlbmRpZgpAQCAtNDg2OCw4MyArNTMyMiw4MyBAQAogCX0sCiAJewkvKiBDSzgwNCBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF84KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1NUQVRJU1RJQ1NfVjEsCiAJfSwKIAl7CS8qIENLODA0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzkpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfU1RBVElTVElDU19WMSwKIAl9LAogCXsJLyogTUNQMDQgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTApLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfU1RBVElTVElDU19WMSwKIAl9LAogCXsJLyogTUNQMDQgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTEpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfU1RBVElTVElDU19WMSwKIAl9LAogCXsJLyogTUNQNTEgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTIpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfU1RBVElTVElDU19WMSwKIAl9LAogCXsJLyogTUNQNTEgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTMpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfU1RBVElTVElDU19WMSwKIAl9LAogCXsJLyogTUNQNTUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTQpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfVkxBTnxERVZfSEFTX01TSXxERVZfSEFTX01TSV9YfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19WTEFOfERFVl9IQVNfTVNJfERFVl9IQVNfTVNJX1h8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKIAl9LAogCXsJLyogTUNQNTUgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTUpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19MQVJHRURFU0N8REVWX0hBU19DSEVDS1NVTXxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfVkxBTnxERVZfSEFTX01TSXxERVZfSEFTX01TSV9YfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19WTEFOfERFVl9IQVNfTVNJfERFVl9IQVNfTVNJX1h8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKIAl9LAogCXsJLyogTUNQNjEgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTYpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1N8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAogCX0sCiAJewkvKiBNQ1A2MSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xNyksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCiAJfSwKIAl7CS8qIE1DUDYxIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE4KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKIAl9LAogCXsJLyogTUNQNjEgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTkpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1N8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAogCX0sCiAJewkvKiBNQ1A2NSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yMCksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAogCX0sCiAJewkvKiBNQ1A2NSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yMSksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAogCX0sCiAJewkvKiBNQ1A2NSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yMiksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAogCX0sCiAJewkvKiBNQ1A2NSBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yMyksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0xBUkdFREVTQ3xERVZfSEFTX0NIRUNLU1VNfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfTEFSR0VERVNDfERFVl9IQVNfQ0hFQ0tTVU18REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAogCX0sCiAJewkvKiBNQ1A2NyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yNCksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCiAJfSwKIAl7CS8qIE1DUDY3IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzI1KSwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSfERFVl9IQVNfSElHSF9ETUF8REVWX0hBU19QT1dFUl9DTlRSTHxERVZfSEFTX01TSXxERVZfSEFTX1BBVVNFRlJBTUVfVFh8REVWX0hBU19TVEFUSVNUSUNTX1YyfERFVl9IQVNfVEVTVF9FWFRFTkRFRHxERVZfSEFTX01HTVRfVU5JVCwKIAl9LAogCXsJLyogTUNQNjcgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjYpLAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1N8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVJ8REVWX0hBU19ISUdIX0RNQXxERVZfSEFTX1BPV0VSX0NOVFJMfERFVl9IQVNfTVNJfERFVl9IQVNfUEFVU0VGUkFNRV9UWHxERVZfSEFTX1NUQVRJU1RJQ1NfVjJ8REVWX0hBU19URVNUX0VYVEVOREVEfERFVl9IQVNfTUdNVF9VTklULAogCX0sCiAJewkvKiBNQ1A2NyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yNyksCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU3xERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUnxERVZfSEFTX0hJR0hfRE1BfERFVl9IQVNfUE9XRVJfQ05UUkx8REVWX0hBU19NU0l8REVWX0hBU19QQVVTRUZSQU1FX1RYfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1RFU1RfRVhURU5ERUR8REVWX0hBU19NR01UX1VOSVQsCiAJfSwKIAl7MCx9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hwMTAwLmMgYi9kcml2ZXJzL25ldC9ocDEwMC5jCmluZGV4IDg0NGMxMzYuLjdkYzUxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvaHAxMDAuYwpAQCAtMzAzNCw3ICszMDM0LDcgQEAKIAkJZ290byBvdXQyOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BDSQotCWVyciA9IHBjaV9tb2R1bGVfaW5pdCgmaHAxMDBfcGNpX2RyaXZlcik7CisJZXJyID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaHAxMDBfcGNpX2RyaXZlcik7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0RFVikKIAkJZ290byBvdXQzOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYyBiL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCmluZGV4IDIxOTRiNTYuLjBlOWJhM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2lzZXJpZXNfdmV0aC5jCkBAIC0xMTAyLDcgKzExMDIsNyBAQAogCX0KIAogCWtvYmplY3RfaW5pdCgmcG9ydC0+a29iamVjdCk7Ci0JcG9ydC0+a29iamVjdC5wYXJlbnQgPSAmZGV2LT5jbGFzc19kZXYua29iajsKKwlwb3J0LT5rb2JqZWN0LnBhcmVudCA9ICZkZXYtPmRldi5rb2JqOwogCXBvcnQtPmtvYmplY3Qua3R5cGUgID0gJnZldGhfcG9ydF9rdHlwZTsKIAlrb2JqZWN0X3NldF9uYW1lKCZwb3J0LT5rb2JqZWN0LCAidmV0aF9wb3J0Iik7CiAJaWYgKDAgIT0ga29iamVjdF9hZGQoJnBvcnQtPmtvYmplY3QpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiLmggYi9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaAppbmRleCBmNGFiYTQzLi5jZjMwYTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaAorKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2IuaApAQCAtNjEsOSArNjEsNyBAQAogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+Ci0jaWZkZWYgTkVUSUZfRl9UU08KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KLSNlbmRpZgogCiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZXRodG9vbC5jCmluZGV4IDgyYzA0NGQuLmQ2NjI4YmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ldGh0b29sLmMKQEAgLTgyLDEwICs4Miw4IEBACiAJeyJ0eF9yZXN0YXJ0X3F1ZXVlIiwgSVhHQl9TVEFUKHJlc3RhcnRfcXVldWUpIH0sCiAJeyJyeF9sb25nX2xlbmd0aF9lcnJvcnMiLCBJWEdCX1NUQVQoc3RhdHMucm9jKX0sCiAJeyJyeF9zaG9ydF9sZW5ndGhfZXJyb3JzIiwgSVhHQl9TVEFUKHN0YXRzLnJ1Yyl9LAotI2lmZGVmIE5FVElGX0ZfVFNPCiAJeyJ0eF90Y3Bfc2VnX2dvb2QiLCBJWEdCX1NUQVQoc3RhdHMudHNjdGMpfSwKIAl7InR4X3RjcF9zZWdfZmFpbGVkIiwgSVhHQl9TVEFUKHN0YXRzLnRzY3RmYyl9LAotI2VuZGlmCiAJeyJyeF9mbG93X2NvbnRyb2xfeG9uIiwgSVhHQl9TVEFUKHN0YXRzLnhvbnJ4Yyl9LAogCXsicnhfZmxvd19jb250cm9sX3hvZmYiLCBJWEdCX1NUQVQoc3RhdHMueG9mZnJ4Yyl9LAogCXsidHhfZmxvd19jb250cm9sX3hvbiIsIElYR0JfU1RBVChzdGF0cy54b250eGMpfSwKQEAgLTI0MCw3ICsyMzgsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgTkVUSUZfRl9UU08KIHN0YXRpYyBpbnQKIGl4Z2Jfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MzJfdCBkYXRhKQogewpAQCAtMjUwLDcgKzI0Nyw2IEBACiAJCW5ldGRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfVFNPOwogCXJldHVybiAwOwogfSAKLSNlbmRpZiAvKiBORVRJRl9GX1RTTyAqLwogCiBzdGF0aWMgdWludDMyX3QKIGl4Z2JfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCkBAIC03MjIsMTAgKzcxOCw4IEBACiAJLnNldF9zZwk9IGV0aHRvb2xfb3Bfc2V0X3NnLAogCS5nZXRfbXNnbGV2ZWwgPSBpeGdiX2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsID0gaXhnYl9zZXRfbXNnbGV2ZWwsCi0jaWZkZWYgTkVUSUZfRl9UU08KIAkuZ2V0X3RzbyA9IGV0aHRvb2xfb3BfZ2V0X3RzbywKIAkuc2V0X3RzbyA9IGl4Z2Jfc2V0X3RzbywKLSNlbmRpZgogCS5nZXRfc3RyaW5ncyA9IGl4Z2JfZ2V0X3N0cmluZ3MsCiAJLnBoeXNfaWQgPSBpeGdiX3BoeXNfaWQsCiAJLmdldF9zdGF0c19jb3VudCA9IGl4Z2JfZ2V0X3N0YXRzX2NvdW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKaW5kZXggYTA4M2E5MS4uNTFiZDdlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCkBAIC00NTYsOSArNDU2LDcgQEAKIAkJCSAgIE5FVElGX0ZfSFdfVkxBTl9UWCB8CiAJCQkgICBORVRJRl9GX0hXX1ZMQU5fUlggfAogCQkJICAgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUjsKLSNpZmRlZiBORVRJRl9GX1RTTwogCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087Ci0jZW5kaWYKICNpZmRlZiBORVRJRl9GX0xMVFgKIAluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKICNlbmRpZgpAQCAtMTE3Niw3ICsxMTc0LDYgQEAKIHN0YXRpYyBpbnQKIGl4Z2JfdHNvKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0jaWZkZWYgTkVUSUZfRl9UU08KIAlzdHJ1Y3QgaXhnYl9jb250ZXh0X2Rlc2MgKmNvbnRleHRfZGVzYzsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1aW50OF90IGlwY3NzLCBpcGNzbywgdHVjc3MsIHR1Y3NvLCBoZHJfbGVuOwpAQCAtMTIzMyw3ICsxMjMwLDYgQEAKIAogCQlyZXR1cm4gMTsKIAl9Ci0jZW5kaWYKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjYi5jIGIvZHJpdmVycy9uZXQvbWFjYi5jCmluZGV4IDI1YjU1OWIuLmU2NzM2MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2IuYworKysgYi9kcml2ZXJzL25ldC9tYWNiLmMKQEAgLTI3LDggKzI3LDYgQEAKIAogI2luY2x1ZGUgIm1hY2IuaCIKIAotI2RlZmluZSB0b19uZXRfZGV2KGNsYXNzKSBjb250YWluZXJfb2YoY2xhc3MsIHN0cnVjdCBuZXRfZGV2aWNlLCBjbGFzc19kZXYpCi0KICNkZWZpbmUgUlhfQlVGRkVSX1NJWkUJCTEyOAogI2RlZmluZSBSWF9SSU5HX1NJWkUJCTUxMgogI2RlZmluZSBSWF9SSU5HX0JZVEVTCQkoc2l6ZW9mKHN0cnVjdCBkbWFfZGVzYykgKiBSWF9SSU5HX1NJWkUpCkBAIC05NDUsMTAgKzk0MywxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IG1hY2JfbWlpX3Nob3coY29uc3Qgc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IG1hY2JfbWlpX3Nob3coY29uc3Qgc3RydWN0IGRldmljZSAqX2RldiwgY2hhciAqYnVmLAogCQkJdW5zaWduZWQgbG9uZyBhZGRyKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0b19uZXRfZGV2KGNkKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdG9fbmV0X2RldihfZGV2KTsKIAlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKIApAQCAtOTYyLDExICs5NjAsMTMgQEAKIH0KIAogI2RlZmluZSBNSUlfRU5UUlkobmFtZSwgYWRkcikJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBkZXZpY2UgKl9kZXYsCQkJXAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCSAgIGNoYXIgKmJ1ZikJCQkJXAogewkJCQkJCQkJXAotCXJldHVybiBtYWNiX21paV9zaG93KGNkLCBidWYsIGFkZHIpOwkJCVwKKwlyZXR1cm4gbWFjYl9taWlfc2hvdyhfZGV2LCBidWYsIGFkZHIpOwkJCVwKIH0JCQkJCQkJCVwKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93XyMjbmFtZSwgTlVMTCkKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93XyMjbmFtZSwgTlVMTCkKIAogTUlJX0VOVFJZKGJtY3IsIE1JSV9CTUNSKTsKIE1JSV9FTlRSWShibXNyLCBNSUlfQk1TUik7CkBAIC05NzcsMTMgKzk3NywxMyBAQAogTUlJX0VOVFJZKGV4cGFuc2lvbiwgTUlJX0VYUEFOU0lPTik7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYWNiX21paV9hdHRyc1tdID0gewotCSZjbGFzc19kZXZpY2VfYXR0cl9ibWNyLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2Jtc3IuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfcGh5c2lkMS5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9waHlzaWQyLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2FkdmVydGlzZS5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9scGEuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfZXhwYW5zaW9uLmF0dHIsCisJJmRldl9hdHRyX2JtY3IuYXR0ciwKKwkmZGV2X2F0dHJfYm1zci5hdHRyLAorCSZkZXZfYXR0cl9waHlzaWQxLmF0dHIsCisJJmRldl9hdHRyX3BoeXNpZDIuYXR0ciwKKwkmZGV2X2F0dHJfYWR2ZXJ0aXNlLmF0dHIsCisJJmRldl9hdHRyX2xwYS5hdHRyLAorCSZkZXZfYXR0cl9leHBhbnNpb24uYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtOTk0LDE3ICs5OTQsMTcgQEAKIAogc3RhdGljIHZvaWQgbWFjYl91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2ID0gJm5ldC0+Y2xhc3NfZGV2OworCXN0cnVjdCBkZXZpY2UgKl9kZXYgPSAmbmV0LT5kZXY7CiAKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsYXNzX2Rldi0+a29iaiwgJm1hY2JfbWlpX2dyb3VwKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJl9kZXYtPmtvYmosICZtYWNiX21paV9ncm91cCk7CiB9CiAKIHN0YXRpYyBpbnQgbWFjYl9yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewotCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiA9ICZuZXQtPmNsYXNzX2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpfZGV2ID0gJm5ldC0+ZGV2OwogCWludCByZXQ7CiAKLQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsYXNzX2Rldi0+a29iaiwgJm1hY2JfbWlpX2dyb3VwKTsKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJl9kZXYtPmtvYmosICZtYWNiX21paV9ncm91cCk7CiAJaWYgKHJldCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgIiVzOiBzeXNmcyBtaWkgYXR0cmlidXRlIHJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICVkXG4iLApAQCAtMTA0Niw2ICsxMDQ2LDE0IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmYnAtPmxvY2spOwogCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxKQorCWJwLT5wY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAibWFjYl9jbGsiKTsKKwlpZiAoSVNfRVJSKGJwLT5wY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1hY2JfY2xrXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OworCX0KKwljbGtfZW5hYmxlKGJwLT5wY2xrKTsKKyNlbHNlCiAJYnAtPnBjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7CiAJaWYgKElTX0VSUihicC0+cGNsaykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBwY2xrXG4iKTsKQEAgLTEwNTksNiArMTA2Nyw3IEBACiAKIAljbGtfZW5hYmxlKGJwLT5wY2xrKTsKIAljbGtfZW5hYmxlKGJwLT5oY2xrKTsKKyNlbmRpZgogCiAJYnAtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDEpOwogCWlmICghYnAtPnJlZ3MpIHsKQEAgLTExMTksOSArMTEyOCwxNyBAQAogCiAJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmlzX3JtaWkpCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxKQorCQltYWNiX3dyaXRlbChicCwgVVNSSU8sIChNQUNCX0JJVChSTUlJKSB8IE1BQ0JfQklUKENMS0VOKSkgKTsKKyNlbHNlCiAJCW1hY2Jfd3JpdGVsKGJwLCBVU1JJTywgMCk7CisjZW5kaWYKIAllbHNlCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxKQorCQltYWNiX3dyaXRlbChicCwgVVNSSU8sIE1BQ0JfQklUKENMS0VOKSk7CisjZWxzZQogCQltYWNiX3dyaXRlbChicCwgVVNSSU8sIE1BQ0JfQklUKE1JSSkpOworI2VuZGlmCiAKIAlicC0+dHhfcGVuZGluZyA9IERFRl9UWF9SSU5HX1BFTkRJTkc7CiAKQEAgLTExNDgsOSArMTE2NSwxMSBAQAogZXJyX291dF9pb3VubWFwOgogCWlvdW5tYXAoYnAtPnJlZ3MpOwogZXJyX291dF9kaXNhYmxlX2Nsb2NrczoKKyNpZm5kZWYgQ09ORklHX0FSQ0hfQVQ5MQogCWNsa19kaXNhYmxlKGJwLT5oY2xrKTsKLQljbGtfZGlzYWJsZShicC0+cGNsayk7CiAJY2xrX3B1dChicC0+aGNsayk7CisjZW5kaWYKKwljbGtfZGlzYWJsZShicC0+cGNsayk7CiBlcnJfb3V0X3B1dF9wY2xrOgogCWNsa19wdXQoYnAtPnBjbGspOwogZXJyX291dF9mcmVlX2RldjoKQEAgLTExNzMsOSArMTE5MiwxMSBAQAogCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAkJaW91bm1hcChicC0+cmVncyk7CisjaWZuZGVmIENPTkZJR19BUkNIX0FUOTEKIAkJY2xrX2Rpc2FibGUoYnAtPmhjbGspOwotCQljbGtfZGlzYWJsZShicC0+cGNsayk7CiAJCWNsa19wdXQoYnAtPmhjbGspOworI2VuZGlmCisJCWNsa19kaXNhYmxlKGJwLT5wY2xrKTsKIAkJY2xrX3B1dChicC0+cGNsayk7CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjYi5oIGIvZHJpdmVycy9uZXQvbWFjYi5oCmluZGV4IDI3YmYwYWUuLmIzYmIyMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2IuaAorKysgYi9kcml2ZXJzL25ldC9tYWNiLmgKQEAgLTIwMCw3ICsyMDAsNyBAQAogI2RlZmluZSBNQUNCX1NPRl9PRkZTRVQJCQkJMzAKICNkZWZpbmUgTUFDQl9TT0ZfU0laRQkJCQkyCiAKLS8qIEJpdGZpZWxkcyBpbiBVU1JJTyAqLworLyogQml0ZmllbGRzIGluIFVTUklPIChBVlIzMikgKi8KICNkZWZpbmUgTUFDQl9NSUlfT0ZGU0VUCQkJCTAKICNkZWZpbmUgTUFDQl9NSUlfU0laRQkJCQkxCiAjZGVmaW5lIE1BQ0JfRUFNX09GRlNFVAkJCQkxCkBAIC0yMTAsNiArMjEwLDEyIEBACiAjZGVmaW5lIE1BQ0JfVFhfUEFVU0VfWkVST19PRkZTRVQJCTMKICNkZWZpbmUgTUFDQl9UWF9QQVVTRV9aRVJPX1NJWkUJCQkxCiAKKy8qIEJpdGZpZWxkcyBpbiBVU1JJTyAoQVQ5MSkgKi8KKyNkZWZpbmUgTUFDQl9STUlJX09GRlNFVAkJCTAKKyNkZWZpbmUgTUFDQl9STUlJX1NJWkUJCQkJMQorI2RlZmluZSBNQUNCX0NMS0VOX09GRlNFVAkJCTEKKyNkZWZpbmUgTUFDQl9DTEtFTl9TSVpFCQkJCTEKKwogLyogQml0ZmllbGRzIGluIFdPTCAqLwogI2RlZmluZSBNQUNCX0lQX09GRlNFVAkJCQkwCiAjZGVmaW5lIE1BQ0JfSVBfU0laRQkJCQkxNgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjZS5jIGIvZHJpdmVycy9uZXQvbWFjZS5jCmluZGV4IDI5MDdjZmIuLjllYzI0ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2UuYworKysgYi9kcml2ZXJzL25ldC9tYWNlLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2RiZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC03NCw3ICs3NSw2IEBACiAjZGVmaW5lIFBSSVZfQllURVMJKHNpemVvZihzdHJ1Y3QgbWFjZV9kYXRhKSBcCiAJKyAoTl9SWF9SSU5HICsgTkNNRFNfVFggKiBOX1RYX1JJTkcgKyAzKSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSkKIAotc3RhdGljIGludCBiaXRyZXYoaW50KTsKIHN0YXRpYyBpbnQgbWFjZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBtYWNlX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBtYWNlX3htaXRfc3RhcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC05NiwxOCArOTYsNiBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgY2hhciAqZHVtbXlfYnVmOwogCi0vKiBCaXQtcmV2ZXJzZSBvbmUgYnl0ZSBvZiBhbiBldGhlcm5ldCBoYXJkd2FyZSBhZGRyZXNzLiAqLwotc3RhdGljIGlubGluZSBpbnQKLWJpdHJldihpbnQgYikKLXsKLSAgICBpbnQgZCA9IDAsIGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpLCBiID4+PSAxKQotCWQgPSAoZCA8PCAxKSB8IChiICYgMSk7Ci0gICAgcmV0dXJuIGQ7Ci19Ci0KLQogc3RhdGljIGludCBfX2RldmluaXQgbWFjZV9wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1hY2UgPSBtYWNpb19nZXRfb2Zfbm9kZShtZGV2KTsKQEAgLTE3Myw3ICsxNjEsNyBAQAogCiAJcmV2ID0gYWRkclswXSA9PSAwICYmIGFkZHJbMV0gPT0gMHhBMDsKIAlmb3IgKGogPSAwOyBqIDwgNjsgKytqKSB7Ci0JCWRldi0+ZGV2X2FkZHJbal0gPSByZXY/IGJpdHJldihhZGRyW2pdKTogYWRkcltqXTsKKwkJZGV2LT5kZXZfYWRkcltqXSA9IHJldiA/IGJpdHJldjgoYWRkcltqXSk6IGFkZHJbal07CiAJfQogCW1wLT5jaGlwaWQgPSAoaW5fOCgmbXAtPm1hY2UtPmNoaXBpZF9oaSkgPDwgOCkgfAogCQkJaW5fOCgmbXAtPm1hY2UtPmNoaXBpZF9sbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNtYWNlLmMgYi9kcml2ZXJzL25ldC9tYWNtYWNlLmMKaW5kZXggNDY0ZTRhNi4uNWQ1NDFlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjbWFjZS5jCisrKyBiL2RyaXZlcnMvbmV0L21hY21hY2UuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRyZXYuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTgxLDE5ICs4Miw2IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgbWFjZV9kbWFfaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogc3RhdGljIHZvaWQgbWFjZV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCi0vKiBCaXQtcmV2ZXJzZSBvbmUgYnl0ZSBvZiBhbiBldGhlcm5ldCBoYXJkd2FyZSBhZGRyZXNzLiAqLwotCi1zdGF0aWMgaW50IGJpdHJldihpbnQgYikKLXsKLQlpbnQgZCA9IDAsIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgKytpLCBiID4+PSAxKSB7Ci0JCWQgPSAoZCA8PCAxKSB8IChiICYgMSk7Ci0JfQotCi0JcmV0dXJuIGQ7Ci19Ci0KIC8qCiAgKiBMb2FkIGEgcmVjZWl2ZSBETUEgY2hhbm5lbCB3aXRoIGEgYmFzZSBhZGRyZXNzIGFuZCByaW5nIGxlbmd0aAogICovCkBAIC0yMTksMTIgKzIwNywxMiBAQAogCWFkZHIgPSAodm9pZCAqKU1BQ0VfUFJPTTsKIAogCWZvciAoaiA9IDA7IGogPCA2OyArK2opIHsKLQkJdTggdj1iaXRyZXYoYWRkcltqPDw0XSk7CisJCXU4IHYgPSBiaXRyZXY4KGFkZHJbajw8NF0pOwogCQljaGVja3N1bSBePSB2OwogCQlkZXYtPmRldl9hZGRyW2pdID0gdjsKIAl9CiAJZm9yICg7IGogPCA4OyArK2opIHsKLQkJY2hlY2tzdW0gXj0gYml0cmV2KGFkZHJbajw8NF0pOworCQljaGVja3N1bSBePSBiaXRyZXY4KGFkZHJbajw8NF0pOwogCX0KIAogCWlmIChjaGVja3N1bSAhPSAweEZGKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWNzb25pYy5jIGIvZHJpdmVycy9uZXQvbWFjc29uaWMuYwppbmRleCAzOTNkOTk1Li4yNGY2MDUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjc29uaWMuYworKysgYi9kcml2ZXJzL25ldC9tYWNzb25pYy5jCkBAIC0xMjEsMTYgKzEyMSwxMiBAQAogICogRm9yIHJldmVyc2luZyB0aGUgUFJPTSBhZGRyZXNzCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgbmliYmxldGFiW10gPSB7MCwgOCwgNCwgMTIsIDIsIDEwLCA2LCAxNCwKLQkJCQkgICAgMSwgOSwgNSwgMTMsIDMsIDExLCA3LCAxNX07Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBiaXRfcmV2ZXJzZV9hZGRyKHVuc2lnbmVkIGNoYXIgYWRkcls2XSkKIHsKIAlpbnQgaTsKIAogCWZvcihpID0gMDsgaSA8IDY7IGkrKykKLQkJYWRkcltpXSA9ICgobmliYmxldGFiW2FkZHJbaV0gJiAweGZdIDw8IDQpIHwKLQkJCSAgIG5pYmJsZXRhYlsoYWRkcltpXSA+PiA0KSAmMHhmXSk7CisJCWFkZHJbaV0gPSBiaXRyZXY4KGFkZHJbaV0pOwogfQogCiBpbnQgX19pbml0IG1hY3NvbmljX2luaXQoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMgYi9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCmluZGV4IDYxY2JkNGEuLjAzMDkyNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKKysrIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwpAQCAtMTQxMiwxMCArMTQxMiw4IEBACiAJLnNldF90eF9jc3VtID0gZXRodG9vbF9vcF9zZXRfdHhfaHdfY3N1bSwKIAkuZ2V0X3NnID0gZXRodG9vbF9vcF9nZXRfc2csCiAJLnNldF9zZyA9IGV0aHRvb2xfb3Bfc2V0X3NnLAotI2lmZGVmIE5FVElGX0ZfVFNPCiAJLmdldF90c28gPSBldGh0b29sX29wX2dldF90c28sCiAJLnNldF90c28gPSBldGh0b29sX29wX3NldF90c28sCi0jZW5kaWYKIAkuZ2V0X3N0cmluZ3MgPSBteXJpMTBnZV9nZXRfc3RyaW5ncywKIAkuZ2V0X3N0YXRzX2NvdW50ID0gbXlyaTEwZ2VfZ2V0X3N0YXRzX2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cyA9IG15cmkxMGdlX2dldF9ldGh0b29sX3N0YXRzLApAQCAtMTk3NSwxMyArMTk3MywxMSBAQAogCW1zcyA9IDA7CiAJbWF4X3NlZ21lbnRzID0gTVhHRUZXX01BWF9TRU5EX0RFU0M7CiAKLSNpZmRlZiBORVRJRl9GX1RTTwogCWlmIChza2ItPmxlbiA+IChkZXYtPm10dSArIEVUSF9ITEVOKSkgewogCQltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCQlpZiAobXNzICE9IDApCiAJCQltYXhfc2VnbWVudHMgPSBNWVJJMTBHRV9NQVhfU0VORF9ERVNDX1RTTzsKIAl9Ci0jZW5kaWYJCQkJLypORVRJRl9GX1RTTyAqLwogCiAJaWYgKCh1bmxpa2VseShhdmFpbCA8IG1heF9zZWdtZW50cykpKSB7CiAJCS8qIHdlIGFyZSBvdXQgb2YgdHJhbnNtaXQgcmVzb3VyY2VzICovCkBAIC0yMDEzLDcgKzIwMDksNiBAQAogCiAJY3VtX2xlbiA9IDA7CiAKLSNpZmRlZiBORVRJRl9GX1RTTwogCWlmIChtc3MpIHsJCS8qIFRTTyAqLwogCQkvKiB0aGlzIHJlbW92ZXMgYW55IENLU1VNIGZsYWcgZnJvbSBiZWZvcmUgKi8KIAkJZmxhZ3MgPSAoTVhHRUZXX0ZMQUdTX1RTT19IRFIgfCBNWEdFRldfRkxBR1NfRklSU1QpOwpAQCAtMjAyOSw3ICsyMDI0LDYgQEAKIAkJICogdGhlIGNoZWNrc3VtIGJ5IHBhcnNpbmcgdGhlIGhlYWRlci4gKi8KIAkJcHNldWRvX2hkcl9vZmZzZXQgPSBtc3M7CiAJfSBlbHNlCi0jZW5kaWYJCQkJLypORVRJRl9GX1RTTyAqLwogCQkvKiBNYXJrIHNtYWxsIHBhY2tldHMsIGFuZCBwYWQgb3V0IHRpbnkgcGFja2V0cyAqLwogCWlmIChza2ItPmxlbiA8PSBNWEdFRldfU0VORF9TTUFMTF9TSVpFKSB7CiAJCWZsYWdzIHw9IE1YR0VGV19GTEFHU19TTUFMTDsKQEAgLTIwOTcsNyArMjA5MSw2IEBACiAJCQkJc2VnbGVuID0gbGVuOwogCQkJZmxhZ3NfbmV4dCA9IGZsYWdzICYgfk1YR0VGV19GTEFHU19GSVJTVDsKIAkJCWN1bV9sZW5fbmV4dCA9IGN1bV9sZW4gKyBzZWdsZW47Ci0jaWZkZWYgTkVUSUZfRl9UU08KIAkJCWlmIChtc3MpIHsJLyogVFNPICovCiAJCQkJKHJlcSAtIHJkbWFfY291bnQpLT5yZG1hX2NvdW50ID0gcmRtYV9jb3VudCArIDE7CiAKQEAgLTIxMjQsNyArMjExNyw2IEBACiAJCQkJCSAgICAoc21hbGwgKiBNWEdFRldfRkxBR1NfU01BTEwpOwogCQkJCX0KIAkJCX0KLSNlbmRpZgkJCQkvKiBORVRJRl9GX1RTTyAqLwogCQkJcmVxLT5hZGRyX2hpZ2ggPSBoaWdoX3N3YXBwZWQ7CiAJCQlyZXEtPmFkZHJfbG93ID0gaHRvbmwobG93KTsKIAkJCXJlcS0+cHNldWRvX2hkcl9vZmZzZXQgPSBodG9ucyhwc2V1ZG9faGRyX29mZnNldCk7CkBAIC0yMTYxLDE0ICsyMTUzLDEyIEBACiAJfQogCiAJKHJlcSAtIHJkbWFfY291bnQpLT5yZG1hX2NvdW50ID0gcmRtYV9jb3VudDsKLSNpZmRlZiBORVRJRl9GX1RTTwogCWlmIChtc3MpCiAJCWRvIHsKIAkJCXJlcS0tOwogCQkJcmVxLT5mbGFncyB8PSBNWEdFRldfRkxBR1NfVFNPX0xBU1Q7CiAJCX0gd2hpbGUgKCEocmVxLT5mbGFncyAmIChNWEdFRldfRkxBR1NfVFNPX0NIT1AgfAogCQkJCQkgTVhHRUZXX0ZMQUdTX0ZJUlNUKSkpOwotI2VuZGlmCiAJaWR4ID0gKChjb3VudCAtIDEpICsgdHgtPnJlcSkgJiB0eC0+bWFzazsKIAl0eC0+aW5mb1tpZHhdLmxhc3QgPSAxOwogCWlmICh0eC0+d2NfZmlmbyA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaCBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljLmgKaW5kZXggZTg1OThiOC4uM2YzODk2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWMuaAorKysgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pYy5oCkBAIC02MywxMSArNjMsMTQgQEAKIAogI2luY2x1ZGUgIm5ldHhlbl9uaWNfaHcuaCIKIAotI2RlZmluZSBORVRYRU5fTklDX0JVSUxEX05PICAgICAiMiIKICNkZWZpbmUgX05FVFhFTl9OSUNfTElOVVhfTUFKT1IgMwogI2RlZmluZSBfTkVUWEVOX05JQ19MSU5VWF9NSU5PUiAzCiAjZGVmaW5lIF9ORVRYRU5fTklDX0xJTlVYX1NVQlZFUlNJT04gMwotI2RlZmluZSBORVRYRU5fTklDX0xJTlVYX1ZFUlNJT05JRCAgIjMuMy4zIiAiLSIgTkVUWEVOX05JQ19CVUlMRF9OTworI2RlZmluZSBORVRYRU5fTklDX0xJTlVYX1ZFUlNJT05JRCAgIjMuMy4zIgorCisjZGVmaW5lIE5VTV9GTEFTSF9TRUNUT1JTICg2NCkKKyNkZWZpbmUgRkxBU0hfU0VDVE9SX1NJWkUgKDY0ICogMTAyNCkKKyNkZWZpbmUgRkxBU0hfVE9UQUxfU0laRSAgKE5VTV9GTEFTSF9TRUNUT1JTICogRkxBU0hfU0VDVE9SX1NJWkUpCiAKICNkZWZpbmUgUkNWX0RFU0NfUklOR1NJWkUJXAogCShzaXplb2Yoc3RydWN0IHJjdl9kZXNjKSAqIGFkYXB0ZXItPm1heF9yeF9kZXNjX2NvdW50KQpAQCAtODUsNiArODgsNyBAQAogI2RlZmluZSBORVRYRU5fUkNWX1BST0RVQ0VSX09GRlNFVAkwCiAjZGVmaW5lIE5FVFhFTl9SQ1ZfUEVHX0RCX0lECQkyCiAjZGVmaW5lIE5FVFhFTl9IT1NUX0RVTU1ZX0RNQV9TSVpFIDEwMjQKKyNkZWZpbmUgRkxBU0hfU1VDQ0VTUyAwCiAKICNkZWZpbmUgQUREUl9JTl9XSU5ET1cxKG9mZikJXAogCSgob2ZmID4gTkVUWEVOX0NSQl9QQ0lYX0hPU1QyKSAmJiAob2ZmIDwgTkVUWEVOX0NSQl9NQVgpKSA/IDEgOiAwCkBAIC0xMDI4LDYgKzEwMzIsMTUgQEAKIHZvaWQgbmV0eGVuX2xvYWRfZmlybXdhcmUoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKIGludCBuZXR4ZW5fcGluaXRfZnJvbV9yb20oc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgdmVyYm9zZSk7CiBpbnQgbmV0eGVuX3JvbV9mYXN0X3JlYWQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgaW50ICp2YWxwKTsKK2ludCBuZXR4ZW5fcm9tX2Zhc3RfcmVhZF93b3JkcyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCAKKwkJCQl1OCAqYnl0ZXMsIHNpemVfdCBzaXplKTsKK2ludCBuZXR4ZW5fcm9tX2Zhc3Rfd3JpdGVfd29yZHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgCisJCQkJdTggKmJ5dGVzLCBzaXplX3Qgc2l6ZSk7CitpbnQgbmV0eGVuX2ZsYXNoX3VubG9jayhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9iYWNrdXBfY3JiaW5pdChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworaW50IG5ldHhlbl9mbGFzaF9lcmFzZV9zZWNvbmRhcnkoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKTsKK2ludCBuZXR4ZW5fZmxhc2hfZXJhc2VfcHJpbWFyeShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpOworCiBpbnQgbmV0eGVuX3JvbV9mYXN0X3dyaXRlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsIGludCBkYXRhKTsKIGludCBuZXR4ZW5fcm9tX3NlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIpOwogaW50IG5ldHhlbl9kb19yb21fc2Uoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19ldGh0b29sLmMKaW5kZXggYzM4MWQ3Ny4uY2MwZWZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2V0aHRvb2wuYwpAQCAtMzIsNiArMzIsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTk0LDE3ICs5NSw3IEBACiAKIHN0YXRpYyBpbnQgbmV0eGVuX25pY19nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXR4ZW5fcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKLQlpbnQgbjsKLQotCWlmICgobmV0eGVuX3JvbV9mYXN0X3JlYWQoYWRhcHRlciwgMCwgJm4pID09IDApCi0JICAgICYmIChuICYgTkVUWEVOX1JPTV9ST1VORFVQKSkgewotCQluICY9IH5ORVRYRU5fUk9NX1JPVU5EVVA7Ci0JCWlmIChuIDwgTkVUWEVOX01BWF9FRVBST01fTEVOKQotCQkJcmV0dXJuIG47Ci0JfQotCXJldHVybiAwOworCXJldHVybiBGTEFTSF9UT1RBTF9TSVpFOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNDQwLDE4ICs0MzEsOTIgQEAKIAlzdHJ1Y3QgbmV0eGVuX3BvcnQgKnBvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CiAJaW50IG9mZnNldDsKKwlpbnQgcmV0OwogCiAJaWYgKGVlcHJvbS0+bGVuID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZWVwcm9tLT5tYWdpYyA9IChwb3J0LT5wZGV2KS0+dmVuZG9yIHwgKChwb3J0LT5wZGV2KS0+ZGV2aWNlIDw8IDE2KTsKLQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGVlcHJvbS0+bGVuOyBvZmZzZXQrKykKLQkJaWYgKG5ldHhlbl9yb21fZmFzdF9yZWFkCi0JCSAgICAoYWRhcHRlciwgKDggKiBvZmZzZXQpICsgOCwgKGludCAqKWVlcHJvbS0+ZGF0YSkgPT0gLTEpCi0JCQlyZXR1cm4gLUVJTzsKKwlvZmZzZXQgPSBlZXByb20tPm9mZnNldDsKKworCXJldCA9IG5ldHhlbl9yb21fZmFzdF9yZWFkX3dvcmRzKGFkYXB0ZXIsIG9mZnNldCwgYnl0ZXMsIAorCQkJCQkJZWVwcm9tLT5sZW4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK25ldHhlbl9uaWNfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwKKwkJCXU4ICogYnl0ZXMpCit7CisJc3RydWN0IG5ldHhlbl9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwb3J0LT5hZGFwdGVyOworCWludCBvZmZzZXQgPSBlZXByb20tPm9mZnNldDsKKwlzdGF0aWMgaW50IGZsYXNoX3N0YXJ0OworCXN0YXRpYyBpbnQgcmVhZHlfdG9fZmxhc2g7CisJaW50IHJldDsKKworCWlmIChmbGFzaF9zdGFydCA9PSAwKSB7CisJCXJldCA9IG5ldHhlbl9mbGFzaF91bmxvY2soYWRhcHRlcik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGbGFzaCB1bmxvY2sgZmFpbGVkLlxuIiwKKwkJCQluZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZsYXNoIHVubG9ja2VkLiBcbiIsIAorCQkJbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCXJldCA9IG5ldHhlbl9mbGFzaF9lcmFzZV9zZWNvbmRhcnkoYWRhcHRlcik7CisJCWlmIChyZXQgIT0gRkxBU0hfU1VDQ0VTUykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmxhc2ggZXJhc2UgZmFpbGVkLlxuIiwgCisJCQkJbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBzZWNvbmRhcnkgZmxhc2ggZXJhc2VkIHN1Y2Nlc3NmdWxseS5cbiIsIAorCQkJbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCWZsYXNoX3N0YXJ0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9mZnNldCA9PSBCT09UTERfU1RBUlQpIHsKKwkJcmV0ID0gbmV0eGVuX2ZsYXNoX2VyYXNlX3ByaW1hcnkoYWRhcHRlcik7CisJCWlmIChyZXQgIT0gRkxBU0hfU1VDQ0VTUykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRmxhc2ggZXJhc2UgZmFpbGVkLlxuIiwgCisJCQkJbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gbmV0eGVuX3JvbV9zZShhZGFwdGVyLCBVU0VSX1NUQVJUKTsKKwkJaWYgKHJldCAhPSBGTEFTSF9TVUNDRVNTKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gbmV0eGVuX3JvbV9zZShhZGFwdGVyLCBGSVhFRF9TVEFSVCk7CisJCWlmIChyZXQgIT0gRkxBU0hfU1VDQ0VTUykKKwkJCXJldHVybiByZXQ7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHByaW1hcnkgZmxhc2ggZXJhc2VkIHN1Y2Nlc3NmdWxseVxuIiwgCisJCQluZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKKworCQlyZXQgPSBuZXR4ZW5fYmFja3VwX2NyYmluaXQoYWRhcHRlcik7CisJCWlmIChyZXQgIT0gRkxBU0hfU1VDQ0VTUykgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ1JCaW5pdCBiYWNrdXAgZmFpbGVkLlxuIiwgCisJCQkJbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDUkJpbml0IGJhY2t1cCBkb25lLlxuIiwgCisJCQluZXR4ZW5fbmljX2RyaXZlcl9uYW1lKTsKKwkJcmVhZHlfdG9fZmxhc2ggPSAxOworCX0KKworCWlmICghcmVhZHlfdG9fZmxhc2gpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCB3cml0ZSBzZXF1ZW5jZSwgcmV0dXJuaW5nLi4uXG4iLAorCQkJbmV0eGVuX25pY19kcml2ZXJfbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBuZXR4ZW5fcm9tX2Zhc3Rfd3JpdGVfd29yZHMoYWRhcHRlciwgb2Zmc2V0LCBieXRlcywgZWVwcm9tLT5sZW4pOworfQorCiBzdGF0aWMgdm9pZAogbmV0eGVuX25pY19nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKIHsKQEAgLTcyMSw2ICs3ODYsNyBAQAogCS5nZXRfbGluayA9IG5ldHhlbl9uaWNfZ2V0X2xpbmssCiAJLmdldF9lZXByb21fbGVuID0gbmV0eGVuX25pY19nZXRfZWVwcm9tX2xlbiwKIAkuZ2V0X2VlcHJvbSA9IG5ldHhlbl9uaWNfZ2V0X2VlcHJvbSwKKwkuc2V0X2VlcHJvbSA9IG5ldHhlbl9uaWNfc2V0X2VlcHJvbSwKIAkuZ2V0X3JpbmdwYXJhbSA9IG5ldHhlbl9uaWNfZ2V0X3JpbmdwYXJhbSwKIAkuZ2V0X3BhdXNlcGFyYW0gPSBuZXR4ZW5fbmljX2dldF9wYXVzZXBhcmFtLAogCS5zZXRfcGF1c2VwYXJhbSA9IG5ldHhlbl9uaWNfc2V0X3BhdXNlcGFyYW0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pbml0LmMgYi9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19pbml0LmMKaW5kZXggOTczYWY5Ni4uZjdiYjhjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX2luaXQuYwpAQCAtMTEwLDYgKzExMCw3IEBACiAJY3JiX2FkZHJfdHJhbnNmb3JtKENBTSk7CiAJY3JiX2FkZHJfdHJhbnNmb3JtKEMyQzEpOwogCWNyYl9hZGRyX3RyYW5zZm9ybShDMkMwKTsKKwljcmJfYWRkcl90cmFuc2Zvcm0oU01CKTsKIH0KIAogaW50IG5ldHhlbl9pbml0X2Zpcm13YXJlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKQEAgLTI3Niw2ICsyNzcsNyBAQAogCiBzdGF0aWMgbG9uZyByb21fbWF4X3RpbWVvdXQgPSAxMDAwMDsKIHN0YXRpYyBsb25nIHJvbV9sb2NrX3RpbWVvdXQgPSAxMDAwMDAwOworc3RhdGljIGxvbmcgcm9tX3dyaXRlX3RpbWVvdXQgPSA3MDA7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJvbV9sb2NrKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlcikKIHsKQEAgLTQwNCw3ICs0MDYsNyBAQAogewogCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FERFJFU1MsIGFkZHIpOwogCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMyk7Ci0JdWRlbGF5KDEwMCk7CQkvKiBwcmV2ZW50IGJ1cnN0aW5nIG9uIENSQiAqLworCXVkZWxheSg3MCk7CQkvKiBwcmV2ZW50IGJ1cnN0aW5nIG9uIENSQiAqLwogCW5ldHhlbl9uaWNfcmVnX3dyaXRlKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX0RVTU1ZX0JZVEVfQ05ULCAwKTsKIAluZXR4ZW5fbmljX3JlZ193cml0ZShhZGFwdGVyLCBORVRYRU5fUk9NVVNCX1JPTV9JTlNUUl9PUENPREUsIDB4Yik7CiAJaWYgKG5ldHhlbl93YWl0X3JvbV9kb25lKGFkYXB0ZXIpKSB7CkBAIC00MTMsMTMgKzQxNSw0NiBAQAogCX0KIAkvKiByZXNldCBhYnl0ZV9jbnQgYW5kIGR1bW15X2J5dGVfY250ICovCiAJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fQUJZVEVfQ05ULCAwKTsKLQl1ZGVsYXkoMTAwKTsJCS8qIHByZXZlbnQgYnVyc3Rpbmcgb24gQ1JCICovCisJdWRlbGF5KDcwKTsJCS8qIHByZXZlbnQgYnVyc3Rpbmcgb24gQ1JCICovCiAJbmV0eGVuX25pY19yZWdfd3JpdGUoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fRFVNTVlfQllURV9DTlQsIDApOwogCiAJKnZhbHAgPSBuZXR4ZW5fbmljX3JlZ19yZWFkKGFkYXB0ZXIsIE5FVFhFTl9ST01VU0JfUk9NX1JEQVRBKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgCitkb19yb21fZmFzdF9yZWFkX3dvcmRzKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsCisJCQl1OCAqYnl0ZXMsIHNpemVfdCBzaXplKQoreworCWludCBhZGRyaWR4OworCWludCByZXQgPSAwOworCisJZm9yIChhZGRyaWR4ID0gYWRkcjsgYWRkcmlkeCA8IChhZGRyICsgc2l6ZSk7IGFkZHJpZHggKz0gNCkgeworCQlyZXQgPSBkb19yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIGFkZHJpZHgsIChpbnQgKilieXRlcyk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWJyZWFrOworCQlieXRlcyArPSA0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludAorbmV0eGVuX3JvbV9mYXN0X3JlYWRfd29yZHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkciwgCisJCQkJdTggKmJ5dGVzLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcm9tX2xvY2soYWRhcHRlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkb19yb21fZmFzdF9yZWFkX3dvcmRzKGFkYXB0ZXIsIGFkZHIsIGJ5dGVzLCBzaXplKTsKKworCW5ldHhlbl9yb21fdW5sb2NrKGFkYXB0ZXIpOworCXJldHVybiByZXQ7Cit9CisKIGludCBuZXR4ZW5fcm9tX2Zhc3RfcmVhZChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCBpbnQgKnZhbHApCiB7CiAJaW50IHJldDsKQEAgLTQ0Myw2ICs0NzgsMTUyIEBACiAJbmV0eGVuX3JvbV91bmxvY2soYWRhcHRlcik7CiAJcmV0dXJuIHJldDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgZG9fcm9tX2Zhc3Rfd3JpdGVfd29yZHMoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCAKKwkJCQkJCWludCBhZGRyLCB1OCAqYnl0ZXMsIHNpemVfdCBzaXplKQoreworCWludCBhZGRyaWR4ID0gYWRkcjsKKwlpbnQgcmV0ID0gMDsKKworCXdoaWxlIChhZGRyaWR4IDwgKGFkZHIgKyBzaXplKSkgeworCQlpbnQgbGFzdF9hdHRlbXB0ID0gMDsKKwkJaW50IHRpbWVvdXQgPSAwOworCQlpbnQgZGF0YTsKKworCQlkYXRhID0gKih1MzIqKWJ5dGVzOworCisJCXJldCA9IGRvX3JvbV9mYXN0X3dyaXRlKGFkYXB0ZXIsIGFkZHJpZHgsIGRhdGEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCQkKKwkJd2hpbGUoMSkgeworCQkJaW50IGRhdGExOworCisJCQlkb19yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIGFkZHJpZHgsICZkYXRhMSk7CisJCQlpZiAoZGF0YTEgPT0gZGF0YSkKKwkJCQlicmVhazsKKworCQkJaWYgKHRpbWVvdXQrKyA+PSByb21fd3JpdGVfdGltZW91dCkgeworCQkJCWlmIChsYXN0X2F0dGVtcHQrKyA8IDQpIHsKKwkJCQkJcmV0ID0gZG9fcm9tX2Zhc3Rfd3JpdGUoYWRhcHRlciwgCisJCQkJCQkJCWFkZHJpZHgsIGRhdGEpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICJEYXRhIHdyaXRlIGRpZCBub3QgIgorCQkJCQkgICAic3VjY2VlZCBhdCBhZGRyZXNzIDB4JXhcbiIsIGFkZHJpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlieXRlcyArPSA0OworCQlhZGRyaWR4ICs9IDQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IG5ldHhlbl9yb21fZmFzdF93cml0ZV93b3JkcyhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyLCAKKwkJCQkJdTggKmJ5dGVzLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHJvbV9sb2NrKGFkYXB0ZXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZG9fcm9tX2Zhc3Rfd3JpdGVfd29yZHMoYWRhcHRlciwgYWRkciwgYnl0ZXMsIHNpemUpOworCW5ldHhlbl9yb21fdW5sb2NrKGFkYXB0ZXIpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG5ldHhlbl9yb21fd3JzcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBkYXRhKQoreworCWludCByZXQ7CisKKwlyZXQgPSBuZXR4ZW5fcm9tX3dyZW4oYWRhcHRlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwluZXR4ZW5fY3JiX3dyaXRlbGl0X2FkYXB0ZXIoYWRhcHRlciwgTkVUWEVOX1JPTVVTQl9ST01fV0RBVEEsIGRhdGEpOworCW5ldHhlbl9jcmJfd3JpdGVsaXRfYWRhcHRlcihhZGFwdGVyLCAKKwkJCQkJTkVUWEVOX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFLCAweDEpOworCisJcmV0ID0gbmV0eGVuX3dhaXRfcm9tX2RvbmUoYWRhcHRlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbmV0eGVuX3JvbV93aXBfcG9sbChhZGFwdGVyKTsKK30KKworaW50IG5ldHhlbl9yb21fcmRzcihzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJldDsKKworCXJldCA9IHJvbV9sb2NrKGFkYXB0ZXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbmV0eGVuX2RvX3JvbV9yZHNyKGFkYXB0ZXIpOworCW5ldHhlbl9yb21fdW5sb2NrKGFkYXB0ZXIpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBuZXR4ZW5fYmFja3VwX2NyYmluaXQoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWludCByZXQgPSBGTEFTSF9TVUNDRVNTOworCWludCB2YWw7CisJY2hhciAqYnVmZmVyID0ga21hbGxvYyhGTEFTSF9TRUNUT1JfU0laRSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CQorCS8qIHVubG9jayBzZWN0b3IgNjMgKi8KKwl2YWwgPSBuZXR4ZW5fcm9tX3Jkc3IoYWRhcHRlcik7CisJdmFsID0gdmFsICYgMHhlMzsKKwlyZXQgPSBuZXR4ZW5fcm9tX3dyc3IoYWRhcHRlciwgdmFsKTsKKwlpZiAocmV0ICE9IEZMQVNIX1NVQ0NFU1MpCisJCWdvdG8gb3V0X2tmcmVlOworCisJcmV0ID0gbmV0eGVuX3JvbV93aXBfcG9sbChhZGFwdGVyKTsKKwlpZiAocmV0ICE9IEZMQVNIX1NVQ0NFU1MpCisJCWdvdG8gb3V0X2tmcmVlOworCisJLyogY29weSAgc2VjdG9yIDAgdG8gc2VjdG9yIDYzICovCisJcmV0ID0gbmV0eGVuX3JvbV9mYXN0X3JlYWRfd29yZHMoYWRhcHRlciwgQ1JCSU5JVF9TVEFSVCwgCisJCQkJCQlidWZmZXIsIEZMQVNIX1NFQ1RPUl9TSVpFKTsKKwlpZiAocmV0ICE9IEZMQVNIX1NVQ0NFU1MpCisJCWdvdG8gb3V0X2tmcmVlOworCisJcmV0ID0gbmV0eGVuX3JvbV9mYXN0X3dyaXRlX3dvcmRzKGFkYXB0ZXIsIEZJWEVEX1NUQVJULCAKKwkJCQkJCWJ1ZmZlciwgRkxBU0hfU0VDVE9SX1NJWkUpOworCWlmIChyZXQgIT0gRkxBU0hfU1VDQ0VTUykKKwkJZ290byBvdXRfa2ZyZWU7CisKKwkvKiBsb2NrIHNlY3RvciA2MyAqLworCXZhbCA9IG5ldHhlbl9yb21fcmRzcihhZGFwdGVyKTsKKwlpZiAoISh2YWwgJiAweDgpKSB7CisJCXZhbCB8PSAoMHgxIDw8IDIpOworCQkvKiBsb2NrIHNlY3RvciA2MyAqLworCQlpZiAobmV0eGVuX3JvbV93cnNyKGFkYXB0ZXIsIHZhbCkgPT0gMCkgeworCQkJcmV0ID0gbmV0eGVuX3JvbV93aXBfcG9sbChhZGFwdGVyKTsKKwkJCWlmIChyZXQgIT0gRkxBU0hfU1VDQ0VTUykKKwkJCQlnb3RvIG91dF9rZnJlZTsKKworCQkJLyogbG9jayBTUiB3cml0ZXMgKi8KKwkJCXJldCA9IG5ldHhlbl9yb21fd2lwX3BvbGwoYWRhcHRlcik7CisJCQlpZiAocmV0ICE9IEZMQVNIX1NVQ0NFU1MpCisJCQkJZ290byBvdXRfa2ZyZWU7CisJCX0KKwl9CisKK291dF9rZnJlZToKKwlrZnJlZShidWZmZXIpOworCXJldHVybiByZXQ7Cit9CisKIGludCBuZXR4ZW5fZG9fcm9tX3NlKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIpCiB7CiAJbmV0eGVuX3JvbV93cmVuKGFkYXB0ZXIpOwpAQCAtNDU3LDYgKzYzOCwyNyBAQAogCXJldHVybiBuZXR4ZW5fcm9tX3dpcF9wb2xsKGFkYXB0ZXIpOwogfQogCit2b2lkIGNoZWNrX2VyYXNlZF9mbGFzaChzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyKQoreworCWludCBpOworCWludCB2YWw7CisJaW50IGNvdW50ID0gMCwgZXJhc2VkX2Vycm9ycyA9IDA7CisJaW50IHJhbmdlOworCisJcmFuZ2UgPSAoYWRkciA9PSBVU0VSX1NUQVJUKSA/IEZJWEVEX1NUQVJUIDogYWRkciArIEZMQVNIX1NFQ1RPUl9TSVpFOworCQorCWZvciAoaSA9IGFkZHI7IGkgPCByYW5nZTsgaSArPSA0KSB7CisJCW5ldHhlbl9yb21fZmFzdF9yZWFkKGFkYXB0ZXIsIGksICZ2YWwpOworCQlpZiAodmFsICE9IDB4ZmZmZmZmZmYpCisJCQllcmFzZWRfZXJyb3JzKys7CisJCWNvdW50Kys7CisJfQorCisJaWYgKGVyYXNlZF9lcnJvcnMpCisJCXByaW50ayhLRVJOX0lORk8gIjB4JXggb3V0IG9mIDB4JXggd29yZHMgZmFpbCB0byBiZSBlcmFzZWQgIgorCQkJImZvciBzZWN0b3IgYWRkcmVzczogJXhcbiIsIGVyYXNlZF9lcnJvcnMsIGNvdW50LCBhZGRyKTsKK30KKwogaW50IG5ldHhlbl9yb21fc2Uoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcikKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTQ2NSw2ICs2NjcsNjggQEAKIAl9CiAJcmV0ID0gbmV0eGVuX2RvX3JvbV9zZShhZGFwdGVyLCBhZGRyKTsKIAluZXR4ZW5fcm9tX3VubG9jayhhZGFwdGVyKTsKKwltc2xlZXAoMzApOworCWNoZWNrX2VyYXNlZF9mbGFzaChhZGFwdGVyLCBhZGRyKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAorbmV0eGVuX2ZsYXNoX2VyYXNlX3NlY3Rpb25zKHN0cnVjdCBuZXR4ZW5fYWRhcHRlciAqYWRhcHRlciwgaW50IHN0YXJ0LCBpbnQgZW5kKQoreworCWludCByZXQgPSBGTEFTSF9TVUNDRVNTOworCWludCBpOworCisJZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQlyZXQgPSBuZXR4ZW5fcm9tX3NlKGFkYXB0ZXIsIGkgKiBGTEFTSF9TRUNUT1JfU0laRSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJcmV0ID0gbmV0eGVuX3JvbV93aXBfcG9sbChhZGFwdGVyKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludAorbmV0eGVuX2ZsYXNoX2VyYXNlX3NlY29uZGFyeShzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJldCA9IEZMQVNIX1NVQ0NFU1M7CisJaW50IHN0YXJ0LCBlbmQ7CisKKwlzdGFydCA9IFNFQ09OREFSWV9TVEFSVCAvIEZMQVNIX1NFQ1RPUl9TSVpFOworCWVuZCAgID0gVVNFUl9TVEFSVCAvIEZMQVNIX1NFQ1RPUl9TSVpFOworCXJldCA9IG5ldHhlbl9mbGFzaF9lcmFzZV9zZWN0aW9ucyhhZGFwdGVyLCBzdGFydCwgZW5kKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAorbmV0eGVuX2ZsYXNoX2VyYXNlX3ByaW1hcnkoc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyKQoreworCWludCByZXQgPSBGTEFTSF9TVUNDRVNTOworCWludCBzdGFydCwgZW5kOworCisJc3RhcnQgPSBQUklNQVJZX1NUQVJUIC8gRkxBU0hfU0VDVE9SX1NJWkU7CisJZW5kICAgPSBTRUNPTkRBUllfU1RBUlQgLyBGTEFTSF9TRUNUT1JfU0laRTsKKwlyZXQgPSBuZXR4ZW5fZmxhc2hfZXJhc2Vfc2VjdGlvbnMoYWRhcHRlciwgc3RhcnQsIGVuZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbmV0eGVuX2ZsYXNoX3VubG9jayhzdHJ1Y3QgbmV0eGVuX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBuZXR4ZW5fcm9tX3dyc3IoYWRhcHRlciwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBuZXR4ZW5fcm9tX3dyZW4oYWRhcHRlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01NDMsOSArODA3LDEzIEBACiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCi0JCQlvZmYgPQotCQkJICAgIG5ldHhlbl9kZWNvZGVfY3JiX2FkZHIoKHVuc2lnbmVkIGxvbmcpYnVmW2ldLmFkZHIpICsKLQkJCSAgICBORVRYRU5fUENJX0NSQlNQQUNFOworCQkJb2ZmID0gbmV0eGVuX2RlY29kZV9jcmJfYWRkcigodW5zaWduZWQgbG9uZylidWZbaV0uYWRkcik7CisJCQlpZiAob2ZmID09IE5FVFhFTl9BRERSX0VSUk9SKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIkNSQiBpbml0IHZhbHVlIG91dCBvZiByYW5nZSAlbHhcbiIsCisJCQkJCWJ1ZltpXS5hZGRyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW9mZiArPSBORVRYRU5fUENJX0NSQlNQQUNFOwogCQkJLyogc2tpcHBpbmcgY29sZCByZWJvb3QgTUFHSUMgKi8KIAkJCWlmIChvZmYgPT0gTkVUWEVOX0NBTV9SQU0oMHgxZmMpKQogCQkJCWNvbnRpbnVlOwpAQCAtNjYyLDYgKzkzMCw3IEBACiAJaW50IGxvb3BzID0gMDsKIAogCWlmICghcGVndHVuZV92YWwpIHsKKwkJdmFsID0gcmVhZGwoTkVUWEVOX0NSQl9OT1JNQUxJWkUoYWRhcHRlciwgQ1JCX0NNRFBFR19TVEFURSkpOwogCQl3aGlsZSAodmFsICE9IFBIQU5fSU5JVElBTElaRV9DT01QTEVURSAmJiBsb29wcyA8IDIwMDAwMCkgewogCQkJdWRlbGF5KDEwMCk7CiAJCQlzY2hlZHVsZSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvb2FrbmV0LmMgYi9kcml2ZXJzL25ldC9vYWtuZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyZTNlOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9vYWtuZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDY2NiArMCwwIEBACi0vKgotICoKLSAqICAgIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIEdyYW50IEVyaWNrc29uIDxncmFudEBsY3NlLnVtbi5lZHU+Ci0gKgotICogICAgTW9kdWxlIG5hbWU6IG9ha25ldC5jCi0gKgotICogICAgRGVzY3JpcHRpb246Ci0gKiAgICAgIERyaXZlciBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgRFA4MzkwMkFWIEV0aGVybmV0IGNvbnRyb2xsZXIKLSAqICAgICAgb24tYm9hcmQgdGhlIElCTSBQb3dlclBDICJPYWsiIGV2YWx1YXRpb24gYm9hcmQuIEFkYXB0ZWQgZnJvbSB0aGUKLSAqICAgICAgdmFyaW91cyBvdGhlciA4MzkwIGRyaXZlcnMgd3JpdHRlbiBieSBEb25hbGQgQmVja2VyIGFuZCBQYXVsIEdvcnRtYWtlci4KLSAqCi0gKiAgICAgIEFkZGl0aW9uYWwgaW5zcGlyYXRpb24gZnJvbSB0aGUgInRjZDgzOTAuYyIgZHJpdmVyIGZyb20gVGlWbywgSW5jLgotICogICAgICBhbmQgImVuZXRMaWIuYyIgZnJvbSBJQk0uCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotCi0jaW5jbHVkZSA8YXNtL2JvYXJkLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlICI4MzkwLmgiCi0KLQotLyogUHJlcHJvY2Vzc29yIERlZmluZXMgKi8KLQotI2lmICFkZWZpbmVkKFRSVUUpIHx8IFRSVUUgIT0gMQotI2RlZmluZQlUUlVFCTEKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoRkFMU0UpIHx8IEZBTFNFICE9IDAKLSNkZWZpbmUJRkFMU0UJMAotI2VuZGlmCi0KLSNkZWZpbmUJT0FLTkVUX1NUQVJUX1BHCQkweDIwCS8qIEZpcnN0IHBhZ2Ugb2YgVFggYnVmZmVyICovCi0jZGVmaW5lCU9BS05FVF9TVE9QX1BHCQkweDQwCS8qIExhc3QgcGFnZ2UgKzEgb2YgUlggcmluZyAqLwotCi0jZGVmaW5lCU9BS05FVF9XQUlUCQkoMiAqIEhaIC8gMTAwKQkvKiAyMCBtcyAqLwotCi0vKiBFeHBlcmltZW50aW5nIHdpdGggc29tZSBmaXhlcyBmb3IgYSBicm9rZW4gZHJpdmVyLi4uICovCi0KLSNkZWZpbmUJT0FLTkVUX0RJU0lOVAotI2RlZmluZQlPQUtORVRfSEVBRENIRUNLCi0jZGVmaW5lCU9BS05FVF9SV0ZJWAotCi0KLS8qIEdsb2JhbCBWYXJpYWJsZXMgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKm5hbWUgPSAiTmF0aW9uYWwgRFA4MzkwMkFWIjsKLQotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpvYWtuZXRfZGV2czsKLQotCi0vKiBGdW5jdGlvbiBQcm90b3R5cGVzICovCi0KLXN0YXRpYyBpbnQJIG9ha25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludAkgb2FrbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi1zdGF0aWMgdm9pZAkgb2FrbmV0X3Jlc2V0XzgzOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZAkgb2FrbmV0X2dldF84MzkwX2hkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwgaW50IHJpbmdfcGFnZSk7Ci1zdGF0aWMgdm9pZAkgb2FrbmV0X2Jsb2NrX2lucHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHJpbmdfb2Zmc2V0KTsKLXN0YXRpYyB2b2lkCSBvYWtuZXRfYmxvY2tfb3V0cHV0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBjb3VudCwKLQkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHN0YXJ0X3BhZ2UpOwotCi1zdGF0aWMgdm9pZAkgb2FrbmV0X2RtYV9lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lKTsKLQotCi0vKgotICogaW50IG9ha25ldF9pbml0KCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFsbCB0aGUgbmVjZXNzYXJ5IHBsYXRmb3JtLXNwZWNpZmljIGluaXRpYWxpLQotICogICB6YXRpb24gYW5kIHNldC11cCBmb3IgdGhlIElCTSAiT2FrIiBldmFsdWF0aW9uIGJvYXJkJ3MgTmF0aW9uYWwKLSAqICAgU2VtaWNvbmR1Y3RvciBEUDgzOTAyQVYgIlNULU5JQyIgRXRoZXJuZXQgY29udHJvbGxlci4KLSAqCi0gKiBJbnB1dChzKToKLSAqICAgTi9BCi0gKgotICogT3V0cHV0KHMpOgotICogICBOL0EKLSAqCi0gKiBSZXR1cm5zOgotICogICAwIGlmIE9LLCBvdGhlcndpc2Ugc3lzdGVtIGVycm9yIG51bWJlciBvbiBlcnJvci4KLSAqCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IG9ha25ldF9pbml0KHZvaWQpCi17Ci0JcmVnaXN0ZXIgaW50IGk7Ci0JaW50IHJlZzAsIHJlZ2Q7Ci0JaW50IHJldCA9IC1FTk9NRU07Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLSNpZiAwCi0JdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBPQUtORVRfSU9fQkFTRTsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyBpb2FkZHIgPSBpb3JlbWFwKE9BS05FVF9JT19CQVNFLCBPQUtORVRfSU9fU0laRSk7Ci0jZW5kaWYKLQliZF90ICpiaXAgPSAoYmRfdCAqKV9fcmVzOwotCi0JaWYgKCFpb2FkZHIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGV2ID0gYWxsb2NfZWlfbmV0ZGV2KCk7Ci0JaWYgKCFkZXYpCi0JCWdvdG8gb3V0X3VubWFwOwotCi0JcmV0ID0gLUVCVVNZOwotCWlmICghcmVxdWVzdF9yZWdpb24oT0FLTkVUX0lPX0JBU0UsIE9BS05FVF9JT19TSVpFLCBuYW1lKSkKLQkJZ290byBvdXRfZGV2OwotCi0JLyogUXVpY2sgcmVnaXN0ZXIgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXZpY2UgaXMgcmVhbGx5IHRoZXJlLiAqLwotCi0JcmV0ID0gLUVOT0RFVjsKLQlpZiAoKHJlZzAgPSBlaV9pYnAoaW9hZGRyKSkgPT0gMHhGRikKLQkJZ290byBvdXRfcmVnaW9uOwotCi0JLyoKLQkgKiBUaGF0IHdvcmtlZC4gTm93IGEgbW9yZSB0aG9yb3VnaCBjaGVjaywgdXNpbmcgdGhlIG11bHRpY2FzdAotCSAqIGFkZHJlc3MgcmVnaXN0ZXJzLCB0aGF0IHRoZSBkZXZpY2UgaXMgZGVmaW5pdGVseSBvdXQgdGhlcmUKLQkgKiBhbmQgc2VtaS1mdW5jdGlvbmFsLgotCSAqLwotCi0JZWlfb2JwKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTEgKyBFODM5MF9TVE9QLCBpb2FkZHIgKyBFODM5MF9DTUQpOwotCXJlZ2QgPSBlaV9pYnAoaW9hZGRyICsgMHgwRCk7Ci0JZWlfb2JwKDB4RkYsIGlvYWRkciArIDB4MEQpOwotCWVpX29icChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwLCBpb2FkZHIgKyBFODM5MF9DTUQpOwotCWVpX2licChpb2FkZHIgKyBFTjBfQ09VTlRFUjApOwotCi0JLyogSXQncyBubyBnb29kLiBGaXggdGhpbmdzIGJhY2sgdXAgYW5kIGxlYXZlLiAqLwotCi0JcmV0ID0gLUVOT0RFVjsKLQlpZiAoZWlfaWJwKGlvYWRkciArIEVOMF9DT1VOVEVSMCkgIT0gMCkgewotCQllaV9vYnAocmVnMCwgaW9hZGRyKTsKLQkJZWlfb2JwKHJlZ2QsIGlvYWRkciArIDB4MEQpOwotCQlnb3RvIG91dF9yZWdpb247Ci0JfQotCi0JU0VUX01PRFVMRV9PV05FUihkZXYpOwotCi0JLyoKLQkgKiBUaGlzIGNvbnRyb2xsZXIgaXMgb24gYW4gZW1iZWRkZWQgYm9hcmQsIHNvIHRoZSBiYXNlIGFkZHJlc3MKLQkgKiBhbmQgaW50ZXJydXB0IGFzc2lnbm1lbnRzIGFyZSBwcmUtYXNzaWduZWQgYW5kIHVuY2hhZ2VhYmxlLgotCSAqLwotCi0JZGV2LT5iYXNlX2FkZHIgPSBpb2FkZHI7Ci0JZGV2LT5pcnEgPSBPQUtORVRfSU5UOwotCi0JLyoKLQkgKiBEaXNhYmxlIGFsbCBjaGlwIGludGVycnVwdHMgZm9yIG5vdyBhbmQgQUNLIGFsbCBwZW5kaW5nCi0JICogaW50ZXJydXB0cy4KLQkgKi8KLQotCWVpX29icCgweDAsIGlvYWRkciArIEVOMF9JTVIpOwotCWVpX29icCgweEZGLCBpb2FkZHIgKyBFTjBfSVNSKTsKLQotCS8qIEF0dGVtcHQgdG8gZ2V0IHRoZSBpbnRlcnJ1cHQgbGluZSAqLwotCi0JcmV0ID0gLUVBR0FJTjsKLQlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsIGVpX2ludGVycnVwdCwgMCwgbmFtZSwgZGV2KSkgewotCQlwcmludGsoIiVzOiB1bmFibGUgdG8gcmVxdWVzdCBpbnRlcnJ1cHQgJWQuXG4iLAotCQkgICAgICAgbmFtZSwgZGV2LT5pcnEpOwotCQlnb3RvIG91dF9yZWdpb247Ci0JfQotCi0JLyogVGVsbCB0aGUgd29ybGQgYWJvdXQgd2hhdCBhbmQgd2hlcmUgd2UndmUgZm91bmQuICovCi0KLQlwcmludGsoIiVzOiAlcyBhdCIsIGRldi0+bmFtZSwgbmFtZSk7Ci0JZm9yIChpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyArK2kpIHsKLQkJZGV2LT5kZXZfYWRkcltpXSA9IGJpcC0+YmlfZW5ldGFkZHJbaV07Ci0JCXByaW50aygiJWMlLjJ4IiwgKGkgPyAnOicgOiAnICcpLCBkZXYtPmRldl9hZGRyW2ldKTsKLQl9Ci0JcHJpbnRrKCIsIGZvdW5kIGF0ICUjbHgsIHVzaW5nIElSUSAlZC5cbiIsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7Ci0KLQkvKiBTZXQgdXAgc29tZSByZXF1aXJlZCBkcml2ZXIgZmllbGRzIGFuZCB0aGVuIHdlJ3JlIGRvbmUuICovCi0KLQllaV9zdGF0dXMubmFtZQkJPSBuYW1lOwotCWVpX3N0YXR1cy53b3JkMTYJPSBGQUxTRTsKLQllaV9zdGF0dXMudHhfc3RhcnRfcGFnZQk9IE9BS05FVF9TVEFSVF9QRzsKLQllaV9zdGF0dXMucnhfc3RhcnRfcGFnZSA9IE9BS05FVF9TVEFSVF9QRyArIFRYX1BBR0VTOwotCWVpX3N0YXR1cy5zdG9wX3BhZ2UJPSBPQUtORVRfU1RPUF9QRzsKLQotCWVpX3N0YXR1cy5yZXNldF84MzkwCT0gJm9ha25ldF9yZXNldF84MzkwOwotCWVpX3N0YXR1cy5ibG9ja19pbnB1dAk9ICZvYWtuZXRfYmxvY2tfaW5wdXQ7Ci0JZWlfc3RhdHVzLmJsb2NrX291dHB1dAk9ICZvYWtuZXRfYmxvY2tfb3V0cHV0OwotCWVpX3N0YXR1cy5nZXRfODM5MF9oZHIJPSAmb2FrbmV0X2dldF84MzkwX2hkcjsKLQotCWRldi0+b3BlbiA9IG9ha25ldF9vcGVuOwotCWRldi0+c3RvcCA9IG9ha25ldF9jbG9zZTsKLSNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotCWRldi0+cG9sbF9jb250cm9sbGVyID0gZWlfcG9sbDsKLSNlbmRpZgotCi0JTlM4MzkwX2luaXQoZGV2LCBGQUxTRSk7Ci0JcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfaXJxOwotCi0Jb2FrbmV0X2RldnMgPSBkZXY7Ci0JcmV0dXJuIDA7Ci0KLW91dF9pcnE7Ci0JZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci1vdXRfcmVnaW9uOgotCXJlbGVhc2VfcmVnaW9uKE9BS05FVF9JT19CQVNFLCBPQUtORVRfSU9fU0laRSk7Ci1vdXRfZGV2OgotCWZyZWVfbmV0ZGV2KGRldik7Ci1vdXRfdW5tYXA6Ci0JaW91bm1hcChpb2FkZHIpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBzdGF0aWMgaW50IG9ha25ldF9vcGVuKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgVGhpcyByb3V0aW5lIGlzIGEgbW9kZXN0IHdyYXBwZXIgYXJvdW5kIGVpX29wZW4sIHRoZSA4MzkwLWdlbmVyaWMsCi0gKiAgIGRyaXZlciBvcGVuIHJvdXRpbmUuIFRoaXMganVzdCBpbmNyZW1lbnRzIHRoZSBtb2R1bGUgdXNhZ2UgY291bnQKLSAqICAgYW5kIHBhc3NlcyBhbG9uZyB0aGUgc3RhdHVzIGZyb20gZWlfb3Blbi4KLSAqCi0gKiBJbnB1dChzKToKLSAqICAqZGV2IC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBkcml2ZXIuCi0gKgotICogT3V0cHV0KHMpOgotICogICpkZXYgLSBQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRyaXZlciwgcG90ZW50aWFsbHkKLSAqICAgICAgICAgbW9kaWZpZWQgYnkgZWlfb3Blbi4KLSAqCi0gKiBSZXR1cm5zOgotICogICAwIGlmIE9LLCBvdGhlcndpc2UgPCAwIG9uIGVycm9yLgotICoKLSAqLwotc3RhdGljIGludAotb2FrbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlpbnQgc3RhdHVzID0gZWlfb3BlbihkZXYpOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoKLSAqIHN0YXRpYyBpbnQgb2FrbmV0X2Nsb3NlKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgVGhpcyByb3V0aW5lIGlzIGEgbW9kZXN0IHdyYXBwZXIgYXJvdW5kIGVpX2Nsb3NlLCB0aGUgODM5MC1nZW5lcmljLAotICogICBkcml2ZXIgY2xvc2Ugcm91dGluZS4gVGhpcyBqdXN0IGRlY3JlbWVudHMgdGhlIG1vZHVsZSB1c2FnZSBjb3VudAotICogICBhbmQgcGFzc2VzIGFsb25nIHRoZSBzdGF0dXMgZnJvbSBlaV9jbG9zZS4KLSAqCi0gKiBJbnB1dChzKToKLSAqICAqZGV2IC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBkcml2ZXIuCi0gKgotICogT3V0cHV0KHMpOgotICogICpkZXYgLSBQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRyaXZlciwgcG90ZW50aWFsbHkKLSAqICAgICAgICAgbW9kaWZpZWQgYnkgZWlfY2xvc2UuCi0gKgotICogUmV0dXJuczoKLSAqICAgMCBpZiBPSywgb3RoZXJ3aXNlIDwgMCBvbiBlcnJvci4KLSAqCi0gKi8KLXN0YXRpYyBpbnQKLW9ha25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWludCBzdGF0dXMgPSBlaV9jbG9zZShkZXYpOwotCXJldHVybiAoc3RhdHVzKTsKLX0KLQotLyoKLSAqIHN0YXRpYyB2b2lkIG9ha25ldF9yZXNldF84MzkwKCkKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgVGhpcyByb3V0aW5lIHJlc2V0cyB0aGUgRFA4MzkwMiBjaGlwLgotICoKLSAqIElucHV0KHMpOgotICogICpkZXYgLSBQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRyaXZlci4KLSAqCi0gKiBPdXRwdXQocyk6Ci0gKiAgIE4vQQotICoKLSAqIFJldHVybnM6Ci0gKiAgIE4vQQotICoKLSAqLwotc3RhdGljIHZvaWQKLW9ha25ldF9yZXNldF84MzkwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JaW50IGJhc2UgPSBFODM5MF9CQVNFOwotCi0JLyoKLQkgKiBXZSBoYXZlIG5vIHByb3Zpc2lvbiBvZiByZXNldGluZyB0aGUgY29udHJvbGxlciBhcyBpcyBkb25lCi0JICogaW4gb3RoZXIgZHJpdmVycywgc3VjaCBhcyAibmUuYyIuIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcKLQkgKiBzZWVtcyB0byB3b3JrIHdlbGwgZW5vdWdoIGluIHRoZSBUaVZvIGRyaXZlci4KLQkgKi8KLQotCXByaW50aygiUmVzZXR0aW5nICVzLi4uXG4iLCBkZXYtPm5hbWUpOwotCWVpX29icChFODM5MF9TVE9QIHwgRTgzOTBfTk9ETUEgfCBFODM5MF9QQUdFMCwgYmFzZSArIEU4MzkwX0NNRCk7Ci0JZWlfc3RhdHVzLnR4aW5nID0gMDsKLQllaV9zdGF0dXMuZG1haW5nID0gMDsKLX0KLQotLyoKLSAqIHN0YXRpYyB2b2lkIG9ha25ldF9nZXRfODM5MF9oZHIoKQotICoKLSAqIERlc2NyaXB0aW9uOgotICogICBUaGlzIHJvdXRpbmUgZ3JhYnMgdGhlIDgzOTAtc3BlY2lmaWMgaGVhZGVyLiBJdCdzIHNpbWlsYXIgdG8gdGhlCi0gKiAgIGJsb2NrIGlucHV0IHJvdXRpbmUsIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbmNlcm5lZCB3aXRoIHJpbmcgd3JhcAotICogICBhcyB0aGUgaGVhZGVyIHdpbGwgYmUgYXQgdGhlIHN0YXJ0IG9mIGEgcGFnZSwgc28gd2Ugb3B0aW1pemUgYWNjb3JkaW5nbHkuCi0gKgotICogSW5wdXQocyk6Ci0gKiAgKmRldiAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGRldmljZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgZHJpdmVyLgotICogICpoZHIgICAgICAgLSBQb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSA4MzkwLXNwZWNpZmljIHBhY2tldCBoZWFkZXIuCi0gKiAgIHJpbmdfcGFnZSAtID8KLSAqCi0gKiBPdXRwdXQocyk6Ci0gKiAgKmhkciAgICAgICAtIFBvaW50ZXIgdG8gdGhlIDgzOTAtc3BlY2lmaWMgcGFja2V0IGhlYWRlciBmb3IgdGhlIGp1c3QtCi0gKiAgICAgICAgICAgICAgIHJlY2VpdmVkIGZyYW1lLgotICoKLSAqIFJldHVybnM6Ci0gKiAgIE4vQQotICoKLSAqLwotc3RhdGljIHZvaWQKLW9ha25ldF9nZXRfODM5MF9oZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGU4MzkwX3BrdF9oZHIgKmhkciwKLQkJICAgIGludCByaW5nX3BhZ2UpCi17Ci0JaW50IGJhc2UgPSBkZXYtPmJhc2VfYWRkcjsKLQotCS8qCi0JICogVGhpcyBzaG91bGQgTk9UIGhhcHBlbi4gSWYgaXQgZG9lcywgaXQgaXMgdGhlIExBU1QgdGhpbmcgeW91J2xsCi0JICogc2VlLgotCSAqLwotCi0JaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKLQkJb2FrbmV0X2RtYV9lcnJvcihkZXYsICJvYWtuZXRfZ2V0XzgzOTBfaGRyIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7Ci0Jb3V0Yl9wKEU4MzkwX05PRE1BICsgRTgzOTBfUEFHRTAgKyBFODM5MF9TVEFSVCwgYmFzZSArIE9BS05FVF9DTUQpOwotCW91dGJfcChzaXplb2Yoc3RydWN0IGU4MzkwX3BrdF9oZHIpLCBiYXNlICsgRU4wX1JDTlRMTyk7Ci0Jb3V0Yl9wKDAsIGJhc2UgKyBFTjBfUkNOVEhJKTsKLQlvdXRiX3AoMCwgYmFzZSArIEVOMF9SU0FSTE8pOwkJLyogT24gcGFnZSBib3VuZGFyeSAqLwotCW91dGJfcChyaW5nX3BhZ2UsIGJhc2UgKyBFTjBfUlNBUkhJKTsKLQlvdXRiX3AoRTgzOTBfUlJFQUQgKyBFODM5MF9TVEFSVCwgYmFzZSArIE9BS05FVF9DTUQpOwotCi0JaWYgKGVpX3N0YXR1cy53b3JkMTYpCi0JCWluc3coYmFzZSArIE9BS05FVF9EQVRBLCBoZHIsCi0JCSAgICAgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSA+PiAxKTsKLQllbHNlCi0JCWluc2IoYmFzZSArIE9BS05FVF9EQVRBLCBoZHIsCi0JCSAgICAgc2l6ZW9mKHN0cnVjdCBlODM5MF9wa3RfaGRyKSk7Ci0KLQkvKiBCeXRlLXN3YXAgdGhlIHBhY2tldCBieXRlIGNvdW50ICovCi0KLQloZHItPmNvdW50ID0gbGUxNl90b19jcHUoaGRyLT5jb3VudCk7Ci0KLQlvdXRiX3AoRU5JU1JfUkRDLCBiYXNlICsgRU4wX0lTUik7CS8qIEFDSyBSZW1vdGUgRE1BIGludGVycnVwdCAqLwotCWVpX3N0YXR1cy5kbWFpbmcgJj0gfjB4MDE7Ci19Ci0KLS8qCi0gKiBYWFggLSBEb2N1bWVudCBtZS4KLSAqLwotc3RhdGljIHZvaWQKLW9ha25ldF9ibG9ja19pbnB1dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgY291bnQsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgIGludCByaW5nX29mZnNldCkKLXsKLQlpbnQgYmFzZSA9IE9BS05FVF9CQVNFOwotCWNoYXIgKmJ1ZiA9IHNrYi0+ZGF0YTsKLQotCS8qCi0JICogVGhpcyBzaG91bGQgTk9UIGhhcHBlbi4gSWYgaXQgZG9lcywgaXQgaXMgdGhlIExBU1QgdGhpbmcgeW91J2xsCi0JICogc2VlLgotCSAqLwotCi0JaWYgKGVpX3N0YXR1cy5kbWFpbmcpIHsKLQkJb2FrbmV0X2RtYV9lcnJvcihkZXYsICJvYWtuZXRfYmxvY2tfaW5wdXQiKTsKLQkJcmV0dXJuOwotCX0KLQotI2lmZGVmIE9BS05FVF9ESVNJTlQKLQlzYXZlX2ZsYWdzKGZsYWdzKTsKLQljbGkoKTsKLSNlbmRpZgotCi0JZWlfc3RhdHVzLmRtYWluZyB8PSAweDAxOwotCWVpX29icChFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UwICsgRTgzOTBfU1RBUlQsIGJhc2UgKyBFODM5MF9DTUQpOwotCWVpX29icChjb3VudCAmIDB4ZmYsIGJhc2UgKyBFTjBfUkNOVExPKTsKLQllaV9vYnAoY291bnQgPj4gOCwgYmFzZSArIEVOMF9SQ05USEkpOwotCWVpX29icChyaW5nX29mZnNldCAmIDB4ZmYsIGJhc2UgKyBFTjBfUlNBUkxPKTsKLQllaV9vYnAocmluZ19vZmZzZXQgPj4gOCwgYmFzZSArIEVOMF9SU0FSSEkpOwotCWVpX29icChFODM5MF9SUkVBRCArIEU4MzkwX1NUQVJULCBiYXNlICsgRTgzOTBfQ01EKTsKLQlpZiAoZWlfc3RhdHVzLndvcmQxNikgewotCQllaV9pc3coYmFzZSArIEU4MzkwX0RBVEEsIGJ1ZiwgY291bnQgPj4gMSk7Ci0JCWlmIChjb3VudCAmIDB4MDEpIHsKLQkJCWJ1Zltjb3VudCAtIDFdID0gZWlfaWIoYmFzZSArIEU4MzkwX0RBVEEpOwotI2lmZGVmIE9BS05FVF9IRUFEQ0hFQ0sKLQkJCWJ5dGVzKys7Ci0jZW5kaWYKLQkJfQotCX0gZWxzZSB7Ci0JCWVpX2lzYihiYXNlICsgRTgzOTBfREFUQSwgYnVmLCBjb3VudCk7Ci0JfQotI2lmZGVmIE9BS05FVF9IRUFEQ0hFQ0sKLQkvKgotCSAqIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCi0JICogYmVlbiBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgc28gaXQgaXMgc3RpbGwgaGVyZS4gIElmIHlvdSBzZWUKLQkgKiB0aGlzIG1lc3NhZ2UgeW91IGVpdGhlciAxKSBoYXZlIGEgc2xpZ2h0bHkgaW5jb21wYXRpYmxlIGNsb25lCi0JICogb3IgMikgaGF2ZSBub2lzZS9zcGVlZCBwcm9ibGVtcyB3aXRoIHlvdXIgYnVzLgotCSAqLwotCi0JLyogRE1BIHRlcm1pbmF0aW9uIGFkZHJlc3MgY2hlY2suLi4gKi8KLQl7Ci0JCWludCBhZGRyLCB0cmllcyA9IDIwOwotCQlkbyB7Ci0JCQkvKiBET04nVCBjaGVjayBmb3IgJ2VpX2licChFTjBfSVNSKSAmIEVOSVNSX1JEQycgaGVyZQotCQkJICAgLS0gaXQncyBicm9rZW4gZm9yIFJ4IG9uIHNvbWUgY2FyZHMhICovCi0JCQlpbnQgaGlnaCA9IGVpX2licChiYXNlICsgRU4wX1JTQVJISSk7Ci0JCQlpbnQgbG93ID0gZWlfaWJwKGJhc2UgKyBFTjBfUlNBUkxPKTsKLQkJCWFkZHIgPSAoaGlnaCA8PCA4KSArIGxvdzsKLQkJCWlmICgoKHJpbmdfb2Zmc2V0ICsgYnl0ZXMpICYgMHhmZikgPT0gbG93KQotCQkJCWJyZWFrOwotCQl9IHdoaWxlICgtLXRyaWVzID4gMCk7Ci0JIAlpZiAodHJpZXMgPD0gMCkKLQkJCXByaW50aygiJXM6IFJYIHRyYW5zZmVyIGFkZHJlc3MgbWlzbWF0Y2gsIgotCQkJICAgICAgICIlIzQuNHggKGV4cGVjdGVkKSB2cy4gJSM0LjR4IChhY3R1YWwpLlxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIHJpbmdfb2Zmc2V0ICsgYnl0ZXMsIGFkZHIpOwotCX0KLSNlbmRpZgotCWVpX29icChFTklTUl9SREMsIGJhc2UgKyBFTjBfSVNSKTsJLyogQUNLIFJlbW90ZSBETUEgaW50ZXJydXB0ICovCi0JZWlfc3RhdHVzLmRtYWluZyAmPSB+MHgwMTsKLQotI2lmZGVmIE9BS05FVF9ESVNJTlQKLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKLSNlbmRpZgotfQotCi0vKgotICogc3RhdGljIHZvaWQgb2FrbmV0X2Jsb2NrX291dHB1dCgpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIFRoaXMgcm91dGluZS4uLgotICoKLSAqIElucHV0KHMpOgotICogICpkZXYgICAgICAgIC0gUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBmb3IgdGhpcyBkcml2ZXIuCi0gKiAgIGNvdW50ICAgICAgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNmZXJyZWQuCi0gKiAgKmJ1ZiAgICAgICAgLQotICogICBzdGFydF9wYWdlIC0KLSAqCi0gKiBPdXRwdXQocyk6Ci0gKiAgIE4vQQotICoKLSAqIFJldHVybnM6Ci0gKiAgIE4vQQotICoKLSAqLwotc3RhdGljIHZvaWQKLW9ha25ldF9ibG9ja19vdXRwdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNvdW50LAotCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RhcnRfcGFnZSkKLXsKLQlpbnQgYmFzZSA9IEU4MzkwX0JBU0U7Ci0jaWYgMAotCWludCBidWc7Ci0jZW5kaWYKLQl1bnNpZ25lZCBsb25nIHN0YXJ0OwotI2lmZGVmIE9BS05FVF9ESVNJTlQKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2VuZGlmCi0jaWZkZWYgT0FLTkVUX0hFQURDSEVDSwotCWludCByZXRyaWVzID0gMDsKLSNlbmRpZgotCi0JLyogUm91bmQgdGhlIGNvdW50IHVwIGZvciB3b3JkIHdyaXRlcy4gKi8KLQotCWlmIChlaV9zdGF0dXMud29yZDE2ICYmIChjb3VudCAmIDB4MSkpCi0JCWNvdW50Kys7Ci0KLQkvKgotCSAqIFRoaXMgc2hvdWxkIE5PVCBoYXBwZW4uIElmIGl0IGRvZXMsIGl0IGlzIHRoZSBMQVNUIHRoaW5nIHlvdSdsbAotCSAqIHNlZS4KLQkgKi8KLQotCWlmIChlaV9zdGF0dXMuZG1haW5nKSB7Ci0JCW9ha25ldF9kbWFfZXJyb3IoZGV2LCAib2FrbmV0X2Jsb2NrX291dHB1dCIpOwotCQlyZXR1cm47Ci0JfQotCi0jaWZkZWYgT0FLTkVUX0RJU0lOVAotCXNhdmVfZmxhZ3MoZmxhZ3MpOwotCWNsaSgpOwotI2VuZGlmCi0KLQllaV9zdGF0dXMuZG1haW5nIHw9IDB4MDE7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgYXJlIGluIHBhZ2UgMC4gKi8KLQotCWVpX29icChFODM5MF9QQUdFMCArIEU4MzkwX1NUQVJUICsgRTgzOTBfTk9ETUEsIGJhc2UgKyBFODM5MF9DTUQpOwotCi0jaWZkZWYgT0FLTkVUX0hFQURDSEVDSwotcmV0cnk6Ci0jZW5kaWYKLQotI2lmIDAKLQkvKgotCSAqIFRoZSA4MzkwMiBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IHRoZSBwcm9jZXNzb3IgbmVlZHMgdG8KLQkgKiBkbyBhICJkdW1teSByZWFkIiBiZWZvcmUgZG9pbmcgdGhlIHJlbW90ZSB3cml0ZSB0byB3b3JrCi0JICogYXJvdW5kIGEgY2hpcCBidWcgdGhleSBkb24ndCBmZWVsIGxpa2UgZml4aW5nLgotCSAqLwotCi0JYnVnID0gMDsKLQl3aGlsZSAoMSkgewotCQl1bnNpZ25lZCBpbnQgcmRoaTsKLQkJdW5zaWduZWQgaW50IHJkbG87Ci0KLQkJLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLwotCQllaV9vYnAoRU5JU1JfUkRDLCBiYXNlICsgRU4wX0lTUik7Ci0JCWVpX29icChjb3VudCAmIDB4ZmYsIGJhc2UgKyBFTjBfUkNOVExPKTsKLQkJZWlfb2JwKGNvdW50ID4+IDgsICAgYmFzZSArIEVOMF9SQ05USEkpOwotCQllaV9vYnAoMHgwMCwgYmFzZSArIEVOMF9SU0FSTE8pOwotCQllaV9vYnAoc3RhcnRfcGFnZSwgYmFzZSArIEVOMF9SU0FSSEkpOwotCi0JCWlmIChidWcrKykKLQkJCWJyZWFrOwotCi0JCS8qIFBlcmZvcm0gdGhlIGR1bW15IHJlYWQgKi8KLQkJcmRoaSA9IGVpX2licChiYXNlICsgRU4wX0NSREFISSk7Ci0JCXJkbG8gPSBlaV9pYnAoYmFzZSArIEVOMF9DUkRBTE8pOwotCQllaV9vYnAoRTgzOTBfUlJFQUQgKyBFODM5MF9TVEFSVCwgYmFzZSArIEU4MzkwX0NNRCk7Ci0KLQkJd2hpbGUgKDEpIHsKLQkJCXVuc2lnbmVkIGludCBucmRoaTsKLQkJCXVuc2lnbmVkIGludCBucmRsbzsKLQkJCW5yZGhpID0gZWlfaWJwKGJhc2UgKyBFTjBfQ1JEQUhJKTsKLQkJCW5yZGxvID0gZWlfaWJwKGJhc2UgKyBFTjBfQ1JEQUxPKTsKLQkJCWlmICgocmRoaSAhPSBucmRoaSkgfHwgKHJkbG8gIT0gbnJkbG8pKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotI2Vsc2UKLSNpZmRlZiBPQUtORVRfUldGSVgKLQkvKgotCSAqIEhhbmRsZSB0aGUgcmVhZC1iZWZvcmUtd3JpdGUgYnVnIHRoZSBzYW1lIHdheSBhcyB0aGUKLQkgKiBDcnlud3IgcGFja2V0IGRyaXZlciAtLSB0aGUgTmF0J2wgU2VtaS4gbWV0aG9kIGRvZXNuJ3Qgd29yay4KLQkgKiBBY3R1YWxseSB0aGlzIGRvZXNuJ3QgYWx3YXlzIHdvcmsgZWl0aGVyLCBidXQgaWYgeW91IGhhdmUKLQkgKiBwcm9ibGVtcyB3aXRoIHlvdXIgODM5MDIgdGhpcyBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nIQotCSAqLwotCi0JZWlfb2JwKDB4NDIsIGJhc2UgKyBFTjBfUkNOVExPKTsKLQllaV9vYnAoMHgwMCwgYmFzZSArIEVOMF9SQ05USEkpOwotCWVpX29icCgweDQyLCBiYXNlICsgRU4wX1JTQVJMTyk7Ci0JZWlfb2JwKDB4MDAsIGJhc2UgKyBFTjBfUlNBUkhJKTsKLQllaV9vYnAoRTgzOTBfUlJFQUQgKyBFODM5MF9TVEFSVCwgYmFzZSArIEU4MzkwX0NNRCk7Ci0JLyogTWFrZSBjZXJ0YWluIHRoYXQgdGhlIGR1bW15IHJlYWQgaGFzIG9jY3VycmVkLiAqLwotCXVkZWxheSg2KTsKLSNlbmRpZgotCi0JZWlfb2JwKEVOSVNSX1JEQywgYmFzZSArIEVOMF9JU1IpOwotCi0JLyogTm93IHRoZSBub3JtYWwgb3V0cHV0LiAqLwotCWVpX29icChjb3VudCAmIDB4ZmYsIGJhc2UgKyBFTjBfUkNOVExPKTsKLQllaV9vYnAoY291bnQgPj4gOCwgICBiYXNlICsgRU4wX1JDTlRISSk7Ci0JZWlfb2JwKDB4MDAsIGJhc2UgKyBFTjBfUlNBUkxPKTsKLQllaV9vYnAoc3RhcnRfcGFnZSwgYmFzZSArIEVOMF9SU0FSSEkpOwotI2VuZGlmIC8qIDAvMSAqLwotCi0JZWlfb2JwKEU4MzkwX1JXUklURSArIEU4MzkwX1NUQVJULCBiYXNlICsgRTgzOTBfQ01EKTsKLQlpZiAoZWlfc3RhdHVzLndvcmQxNikgewotCQllaV9vc3coRTgzOTBfQkFTRSArIEU4MzkwX0RBVEEsIGJ1ZiwgY291bnQgPj4gMSk7Ci0JfSBlbHNlIHsKLQkJZWlfb3NiKEU4MzkwX0JBU0UgKyBFODM5MF9EQVRBLCBidWYsIGNvdW50KTsKLQl9Ci0KLSNpZmRlZiBPQUtORVRfRElTSU5UCi0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ci0jZW5kaWYKLQotCXN0YXJ0ID0gamlmZmllczsKLQotI2lmZGVmIE9BS05FVF9IRUFEQ0hFQ0sKLQkvKgotCSAqIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCi0JICogYmVlbiBlbmNvdW50ZXJpbmcgcHJvYmxlbXMgc28gaXQgaXMgc3RpbGwgaGVyZS4KLQkgKi8KLQotCXsKLQkJLyogRE1BIHRlcm1pbmF0aW9uIGFkZHJlc3MgY2hlY2suLi4gKi8KLQkJaW50IGFkZHIsIHRyaWVzID0gMjA7Ci0JCWRvIHsKLQkJCWludCBoaWdoID0gZWlfaWJwKGJhc2UgKyBFTjBfUlNBUkhJKTsKLQkJCWludCBsb3cgPSBlaV9pYnAoYmFzZSArIEVOMF9SU0FSTE8pOwotCQkJYWRkciA9IChoaWdoIDw8IDgpICsgbG93OwotCQkJaWYgKChzdGFydF9wYWdlIDw8IDgpICsgY291bnQgPT0gYWRkcikKLQkJCQlicmVhazsKLQkJfSB3aGlsZSAoLS10cmllcyA+IDApOwotCi0JCWlmICh0cmllcyA8PSAwKSB7Ci0JCQlwcmludGsoIiVzOiBUeCBwYWNrZXQgdHJhbnNmZXIgYWRkcmVzcyBtaXNtYXRjaCwiCi0JCQkgICAgICAgIiUjNC40eCAoZXhwZWN0ZWQpIHZzLiAlIzQuNHggKGFjdHVhbCkuXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgKHN0YXJ0X3BhZ2UgPDwgOCkgKyBjb3VudCwgYWRkcik7Ci0JCQlpZiAocmV0cmllcysrID09IDApCi0JCQkJZ290byByZXRyeTsKLQkJfQotCX0KLSNlbmRpZgotCi0Jd2hpbGUgKChlaV9pYnAoYmFzZSArIEVOMF9JU1IpICYgRU5JU1JfUkRDKSA9PSAwKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgT0FLTkVUX1dBSVQpKSB7Ci0JCQlwcmludGsoIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIFR4IFJEQy5cbiIsIGRldi0+bmFtZSk7Ci0JCQlvYWtuZXRfcmVzZXRfODM5MChkZXYpOwotCQkJTlM4MzkwX2luaXQoZGV2LCBUUlVFKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JZWlfb2JwKEVOSVNSX1JEQywgYmFzZSArIEVOMF9JU1IpOwkvKiBBY2sgaW50ci4gKi8KLQllaV9zdGF0dXMuZG1haW5nICY9IH4weDAxOwotfQotCi0vKgotICogc3RhdGljIHZvaWQgb2FrbmV0X2RtYV9lcnJvcigpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIFRoaXMgcm91dGluZSBwcmludHMgb3V0IGEgbGFzdC1kaXRjaCBpbmZvcm1hdGl2ZSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlCi0gKiAgIGluZGljYXRpbmcgdGhhdCBhIERNQSBlcnJvciBvY2N1cnJlZC4gSWYgeW91IHNlZSB0aGlzLCBpdCdzIHRoZSBsYXN0Ci0gKiAgIHRoaW5nIHlvdSdsbCBzZWUuCi0gKgotICogSW5wdXQocyk6Ci0gKiAgKmRldiAgLSBQb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGZvciB0aGlzIGRyaXZlci4KLSAqICAqbmFtZSAtIEluZm9ybWF0aXZlIHRleHQgKGUuZy4gZnVuY3Rpb24gbmFtZSkgaW5kaWNhdGluZyB3aGVyZSB0aGUKLSAqICAgICAgICAgIERNQSBlcnJvciBvY2N1cnJlZC4KLSAqCi0gKiBPdXRwdXQocyk6Ci0gKiAgIE4vQQotICoKLSAqIFJldHVybnM6Ci0gKiAgIE4vQQotICoKLSAqLwotc3RhdGljIHZvaWQKLW9ha25ldF9kbWFfZXJyb3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQlwcmludGsoS0VSTl9FTUVSRyAiJXM6IERNQWluZyBjb25mbGljdCBpbiAlcy4iCi0JICAgICAgICJbRE1Bc3RhdDolZF1baXJxbG9jazolZF1baW50cjolbGRdXG4iLAotCSAgICAgICBkZXYtPm5hbWUsIG5hbWUsIGVpX3N0YXR1cy5kbWFpbmcsIGVpX3N0YXR1cy5pcnFsb2NrLAotCSAgICAgICBkZXYtPmludGVycnVwdCk7Ci19Ci0KLS8qCi0gKiBPYWsgRXRoZXJuZXQgbW9kdWxlIHVubG9hZCBpbnRlcmZhY2UuCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBvYWtuZXRfY2xlYW51cF9tb2R1bGUgKHZvaWQpCi17Ci0JLyogQ29udmVydCB0byBsb29wIG9uY2UgZHJpdmVyIHN1cHBvcnRzIG11bHRpcGxlIGRldmljZXMuICovCi0JdW5yZWdpc3Rlcl9uZXRkZXYob2FrbmV0X2Rldik7Ci0JZnJlZV9pcnEob2FrbmV0X2RldnMtPmlycSwgb2FrbmV0X2RldnMpOwotCXJlbGVhc2VfcmVnaW9uKG9ha25ldF9kZXZzLT5iYXNlX2FkZHIsIE9BS05FVF9JT19TSVpFKTsKLQlpb3VubWFwKGlvYWRkcik7Ci0JZnJlZV9uZXRkZXYob2FrbmV0X2RldnMpOwotfQotCi1tb2R1bGVfaW5pdChvYWtuZXRfaW5pdCk7Ci1tb2R1bGVfZXhpdChvYWtuZXRfY2xlYW51cF9tb2R1bGUpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGFzZW1pX21hYy5jIGIvZHJpdmVycy9uZXQvcGFzZW1pX21hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NzBhYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9wYXNlbWlfbWFjLmMKQEAgLTAsMCArMSwxMDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgUEEgU2VtaSwgSW5jCisgKgorICogRHJpdmVyIGZvciB0aGUgUEEgU2VtaSBQV1JmaWNpZW50IG9uY2hpcCAxRy8xMEcgRXRoZXJuZXQgTUFDcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorCisjaW5jbHVkZSAicGFzZW1pX21hYy5oIgorCisKKy8qIFRPRE8gbGlzdAorICoKKyAqIC0gR2V0IHJpZCBvZiBwY2lfe3JlYWQsd3JpdGV9X2NvbmZpZygpLCBtYXAgcmVnaXN0ZXJzIHdpdGggaW9yZW1hcAorICogICBmb3IgcGVyZm9ybWFuY2UKKyAqIC0gUEhZIHN1cHBvcnQKKyAqIC0gTXVsdGljYXN0IHN1cHBvcnQKKyAqIC0gTGFyZ2UgTVRVIHN1cHBvcnQKKyAqIC0gT3RoZXIgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzCisgKi8KKworCisvKiBNdXN0IGJlIGEgcG93ZXIgb2YgdHdvICovCisjZGVmaW5lIFJYX1JJTkdfU0laRSA1MTIKKyNkZWZpbmUgVFhfUklOR19TSVpFIDUxMgorCisjZGVmaW5lIFRYX0RFU0MobWFjLCBudW0pCSgobWFjKS0+dHgtPmRlc2NbKG51bSkgJiAoVFhfUklOR19TSVpFLTEpXSkKKyNkZWZpbmUgVFhfREVTQ19JTkZPKG1hYywgbnVtKQkoKG1hYyktPnR4LT5kZXNjX2luZm9bKG51bSkgJiAoVFhfUklOR19TSVpFLTEpXSkKKyNkZWZpbmUgUlhfREVTQyhtYWMsIG51bSkJKChtYWMpLT5yeC0+ZGVzY1sobnVtKSAmIChSWF9SSU5HX1NJWkUtMSldKQorI2RlZmluZSBSWF9ERVNDX0lORk8obWFjLCBudW0pCSgobWFjKS0+cngtPmRlc2NfaW5mb1sobnVtKSAmIChSWF9SSU5HX1NJWkUtMSldKQorI2RlZmluZSBSWF9CVUZGKG1hYywgbnVtKQkoKG1hYyktPnJ4LT5idWZmZXJzWyhudW0pICYgKFJYX1JJTkdfU0laRS0xKV0pCisKKyNkZWZpbmUgQlVGX1NJWkUgMTY0NiAvKiAxNTAwIE1UVSArIEVUSF9ITEVOICsgVkxBTl9ITEVOICsgMiA2NEIgY2FjaGVsaW5lcyAqLworCisvKiBYWFhPSk4gdGhlc2Ugc2hvdWxkIGNvbWUgb3V0IG9mIHRoZSBkZXZpY2UgdHJlZSBzb21lIGRheSAqLworI2RlZmluZSBQQVNfRE1BX0NBUF9CQVNFICAgMHhlMDBkMDA0MAorI2RlZmluZSBQQVNfRE1BX0NBUF9TSVpFICAgMHgxMDAKKyNkZWZpbmUgUEFTX0RNQV9DT01fQkFTRSAgIDB4ZTAwZDAxMDAKKyNkZWZpbmUgUEFTX0RNQV9DT01fU0laRSAgIDB4MTAwCisKK3N0YXRpYyBzdHJ1Y3QgcGFzZG1hX3N0YXR1cyAqZG1hX3N0YXR1czsKKworc3RhdGljIGludCBwYXNlbWlfZ2V0X21hY19hZGRyKHN0cnVjdCBwYXNlbWlfbWFjICptYWMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBtYWMtPnBkZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShwZGV2KTsKKwljb25zdCB1OCAqbWFkZHI7CisJdTggYWRkcls2XTsKKworCWlmICghZG4pIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJICAiTm8gZGV2aWNlIG5vZGUgZm9yIG1hYywgbm90IGNvbmZpZ3VyaW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJbWFkZHIgPSBnZXRfcHJvcGVydHkoZG4sICJtYWMtYWRkcmVzcyIsIE5VTEwpOworCWlmIChtYWRkciA9PSBOVUxMKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIm5vIG1hYyBhZGRyZXNzIGluIGRldmljZSB0cmVlLCBub3QgY29uZmlndXJpbmdcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAoc3NjYW5mKG1hZGRyLCAiJWhoeDolaGh4OiVoaHg6JWhoeDolaGh4OiVoaHgiLCAmYWRkclswXSwKKwkJICAgJmFkZHJbMV0sICZhZGRyWzJdLCAmYWRkclszXSwgJmFkZHJbNF0sICZhZGRyWzVdKSAhPSA2KSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgImNhbid0IHBhcnNlIG1hYyBhZGRyZXNzLCBub3QgY29uZmlndXJpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1jcHkobWFjLT5tYWNfYWRkciwgYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXNlbWlfbWFjX3NldHVwX3J4X3Jlc291cmNlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwYXNlbWlfbWFjX3J4cmluZyAqcmluZzsKKwlzdHJ1Y3QgcGFzZW1pX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgY2hhbl9pZCA9IG1hYy0+ZG1hX3J4Y2g7CisKKwlyaW5nID0ga3phbGxvYyhzaXplb2YoKnJpbmcpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcmluZykKKwkJZ290byBvdXRfcmluZzsKKworCXNwaW5fbG9ja19pbml0KCZyaW5nLT5sb2NrKTsKKworCXJpbmctPmRlc2NfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwYXNlbWlfbWFjX2J1ZmZlcikgKgorCQkJCSAgUlhfUklOR19TSVpFLCBHRlBfS0VSTkVMKTsKKworCWlmICghcmluZy0+ZGVzY19pbmZvKQorCQlnb3RvIG91dF9kZXNjX2luZm87CisKKwkvKiBBbGxvY2F0ZSBkZXNjcmlwdG9ycyAqLworCXJpbmctPmRlc2MgPSBkbWFfYWxsb2NfY29oZXJlbnQoJm1hYy0+ZG1hX3BkZXYtPmRldiwKKwkJCQkJUlhfUklOR19TSVpFICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCBwYXNfZG1hX3hjdF9kZXNjciksCisJCQkJCSZyaW5nLT5kbWEsIEdGUF9LRVJORUwpOworCisJaWYgKCFyaW5nLT5kZXNjKQorCQlnb3RvIG91dF9kZXNjOworCisJbWVtc2V0KHJpbmctPmRlc2MsIDAsIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcGFzX2RtYV94Y3RfZGVzY3IpKTsKKworCXJpbmctPmJ1ZmZlcnMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJm1hYy0+ZG1hX3BkZXYtPmRldiwKKwkJCQkJICAgUlhfUklOR19TSVpFICogc2l6ZW9mKHU2NCksCisJCQkJCSAgICZyaW5nLT5idWZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJpbmctPmJ1ZmZlcnMpCisJCWdvdG8gb3V0X2J1ZmZlcnM7CisKKwltZW1zZXQocmluZy0+YnVmZmVycywgMCwgUlhfUklOR19TSVpFICogc2l6ZW9mKHU2NCkpOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmRtYV9wZGV2LCBQQVNfRE1BX1JYQ0hBTl9CQVNFTChjaGFuX2lkKSwKKwkJCSAgICAgICBQQVNfRE1BX1JYQ0hBTl9CQVNFTF9CUkJMKHJpbmctPmRtYSkpOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmRtYV9wZGV2LCBQQVNfRE1BX1JYQ0hBTl9CQVNFVShjaGFuX2lkKSwKKwkJCSAgICAgICBQQVNfRE1BX1JYQ0hBTl9CQVNFVV9CUkJIKHJpbmctPmRtYSA+PiAzMikgfAorCQkJICAgICAgIFBBU19ETUFfUlhDSEFOX0JBU0VVX1NJWihSWF9SSU5HX1NJWkUgPj4gMikpOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmRtYV9wZGV2LCBQQVNfRE1BX1JYQ0hBTl9DRkcoY2hhbl9pZCksCisJCQkgICAgICAgUEFTX0RNQV9SWENIQU5fQ0ZHX0hCVSgxKSk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1hYy0+ZG1hX3BkZXYsIFBBU19ETUFfUlhJTlRfQkFTRUwobWFjLT5kbWFfaWYpLAorCQkJICAgICAgIFBBU19ETUFfUlhJTlRfQkFTRUxfQlJCTChfX3BhKHJpbmctPmJ1ZmZlcnMpKSk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1hYy0+ZG1hX3BkZXYsIFBBU19ETUFfUlhJTlRfQkFTRVUobWFjLT5kbWFfaWYpLAorCQkJICAgICAgIFBBU19ETUFfUlhJTlRfQkFTRVVfQlJCSChfX3BhKHJpbmctPmJ1ZmZlcnMpID4+IDMyKSB8CisJCQkgICAgICAgUEFTX0RNQV9SWElOVF9CQVNFVV9TSVooUlhfUklOR19TSVpFID4+IDMpKTsKKworCXJpbmctPm5leHRfdG9fZmlsbCA9IDA7CisJcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisKKwlzbnByaW50ZihyaW5nLT5pcnFfbmFtZSwgc2l6ZW9mKHJpbmctPmlycV9uYW1lKSwKKwkJICIlcyByeCIsIGRldi0+bmFtZSk7CisJbWFjLT5yeCA9IHJpbmc7CisKKwlyZXR1cm4gMDsKKworb3V0X2J1ZmZlcnM6CisJZG1hX2ZyZWVfY29oZXJlbnQoJm1hYy0+ZG1hX3BkZXYtPmRldiwKKwkJCSAgUlhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCBwYXNfZG1hX3hjdF9kZXNjciksCisJCQkgIG1hYy0+cngtPmRlc2MsIG1hYy0+cngtPmRtYSk7CitvdXRfZGVzYzoKKwlrZnJlZShyaW5nLT5kZXNjX2luZm8pOworb3V0X2Rlc2NfaW5mbzoKKwlrZnJlZShyaW5nKTsKK291dF9yaW5nOgorCXJldHVybiAtRU5PTUVNOworfQorCisKK3N0YXRpYyBpbnQgcGFzZW1pX21hY19zZXR1cF90eF9yZXNvdXJjZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGFzZW1pX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgdmFsOworCWludCBjaGFuX2lkID0gbWFjLT5kbWFfdHhjaDsKKwlzdHJ1Y3QgcGFzZW1pX21hY190eHJpbmcgKnJpbmc7CisKKwlyaW5nID0ga3phbGxvYyhzaXplb2YoKnJpbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJpbmcpCisJCWdvdG8gb3V0X3Jpbmc7CisKKwlzcGluX2xvY2tfaW5pdCgmcmluZy0+bG9jayk7CisKKwlyaW5nLT5kZXNjX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGFzZW1pX21hY19idWZmZXIpICoKKwkJCQkgIFRYX1JJTkdfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyaW5nLT5kZXNjX2luZm8pCisJCWdvdG8gb3V0X2Rlc2NfaW5mbzsKKworCS8qIEFsbG9jYXRlIGRlc2NyaXB0b3JzICovCisJcmluZy0+ZGVzYyA9IGRtYV9hbGxvY19jb2hlcmVudCgmbWFjLT5kbWFfcGRldi0+ZGV2LAorCQkJCQlUWF9SSU5HX1NJWkUgKgorCQkJCQlzaXplb2Yoc3RydWN0IHBhc19kbWFfeGN0X2Rlc2NyKSwKKwkJCQkJJnJpbmctPmRtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyaW5nLT5kZXNjKQorCQlnb3RvIG91dF9kZXNjOworCisJbWVtc2V0KHJpbmctPmRlc2MsIDAsIFRYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcGFzX2RtYV94Y3RfZGVzY3IpKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWFjLT5kbWFfcGRldiwgUEFTX0RNQV9UWENIQU5fQkFTRUwoY2hhbl9pZCksCisJCQkgICAgICAgUEFTX0RNQV9UWENIQU5fQkFTRUxfQlJCTChyaW5nLT5kbWEpKTsKKwl2YWwgPSBQQVNfRE1BX1RYQ0hBTl9CQVNFVV9CUkJIKHJpbmctPmRtYSA+PiAzMik7CisJdmFsIHw9IFBBU19ETUFfVFhDSEFOX0JBU0VVX1NJWihUWF9SSU5HX1NJWkUgPj4gMik7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1hYy0+ZG1hX3BkZXYsIFBBU19ETUFfVFhDSEFOX0JBU0VVKGNoYW5faWQpLCB2YWwpOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmRtYV9wZGV2LCBQQVNfRE1BX1RYQ0hBTl9DRkcoY2hhbl9pZCksCisJCQkgICAgICAgUEFTX0RNQV9UWENIQU5fQ0ZHX1RZX0lGQUNFIHwKKwkJCSAgICAgICBQQVNfRE1BX1RYQ0hBTl9DRkdfVEFUVFIobWFjLT5kbWFfaWYpIHwKKwkJCSAgICAgICBQQVNfRE1BX1RYQ0hBTl9DRkdfVVAgfAorCQkJICAgICAgIFBBU19ETUFfVFhDSEFOX0NGR19XVCgyKSk7CisKKwlyaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisJcmluZy0+bmV4dF90b19jbGVhbiA9IDA7CisKKwlzbnByaW50ZihyaW5nLT5pcnFfbmFtZSwgc2l6ZW9mKHJpbmctPmlycV9uYW1lKSwKKwkJICIlcyB0eCIsIGRldi0+bmFtZSk7CisJbWFjLT50eCA9IHJpbmc7CisKKwlyZXR1cm4gMDsKKworb3V0X2Rlc2M6CisJa2ZyZWUocmluZy0+ZGVzY19pbmZvKTsKK291dF9kZXNjX2luZm86CisJa2ZyZWUocmluZyk7CitvdXRfcmluZzoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcGFzZW1pX21hY19mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwYXNlbWlfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBwYXNlbWlfbWFjX2J1ZmZlciAqaW5mbzsKKwlzdHJ1Y3QgcGFzX2RtYV94Y3RfZGVzY3IgKmRwOworCisJZm9yIChpID0gMDsgaSA8IFRYX1JJTkdfU0laRTsgaSsrKSB7CisJCWluZm8gPSAmVFhfREVTQ19JTkZPKG1hYywgaSk7CisJCWRwID0gJlRYX0RFU0MobWFjLCBpKTsKKwkJaWYgKGluZm8tPmRtYSkgeworCQkJaWYgKGluZm8tPnNrYikgeworCQkJCXBjaV91bm1hcF9zaW5nbGUobWFjLT5kbWFfcGRldiwKKwkJCQkJCSBpbmZvLT5kbWEsCisJCQkJCQkgaW5mby0+c2tiLT5sZW4sCisJCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoaW5mby0+c2tiKTsKKwkJCX0KKwkJCWluZm8tPmRtYSA9IDA7CisJCQlpbmZvLT5za2IgPSBOVUxMOworCQkJZHAtPm1hY3R4ID0gMDsKKwkJCWRwLT5wdHIgPSAwOworCQl9CisJfQorCisJZG1hX2ZyZWVfY29oZXJlbnQoJm1hYy0+ZG1hX3BkZXYtPmRldiwKKwkJCSAgVFhfUklOR19TSVpFICogc2l6ZW9mKHN0cnVjdCBwYXNfZG1hX3hjdF9kZXNjciksCisJCQkgIG1hYy0+dHgtPmRlc2MsIG1hYy0+dHgtPmRtYSk7CisKKwlrZnJlZShtYWMtPnR4LT5kZXNjX2luZm8pOworCWtmcmVlKG1hYy0+dHgpOworCW1hYy0+dHggPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwYXNlbWlfbWFjX2ZyZWVfcnhfcmVzb3VyY2VzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBhc2VtaV9tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHBhc2VtaV9tYWNfYnVmZmVyICppbmZvOworCXN0cnVjdCBwYXNfZG1hX3hjdF9kZXNjciAqZHA7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUklOR19TSVpFOyBpKyspIHsKKwkJaW5mbyA9ICZSWF9ERVNDX0lORk8obWFjLCBpKTsKKwkJZHAgPSAmUlhfREVTQyhtYWMsIGkpOworCQlpZiAoaW5mby0+ZG1hKSB7CisJCQlpZiAoaW5mby0+c2tiKSB7CisJCQkJcGNpX3VubWFwX3NpbmdsZShtYWMtPmRtYV9wZGV2LAorCQkJCQkJIGluZm8tPmRtYSwKKwkJCQkJCSBpbmZvLT5za2ItPmxlbiwKKwkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCWRldl9rZnJlZV9za2JfYW55KGluZm8tPnNrYik7CisJCQl9CisJCQlpbmZvLT5kbWEgPSAwOworCQkJaW5mby0+c2tiID0gTlVMTDsKKwkJCWRwLT5tYWNyeCA9IDA7CisJCQlkcC0+cHRyID0gMDsKKwkJfQorCX0KKworCWRtYV9mcmVlX2NvaGVyZW50KCZtYWMtPmRtYV9wZGV2LT5kZXYsCisJCQkgIFJYX1JJTkdfU0laRSAqIHNpemVvZihzdHJ1Y3QgcGFzX2RtYV94Y3RfZGVzY3IpLAorCQkJICBtYWMtPnJ4LT5kZXNjLCBtYWMtPnJ4LT5kbWEpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoJm1hYy0+ZG1hX3BkZXYtPmRldiwgUlhfUklOR19TSVpFICogc2l6ZW9mKHU2NCksCisJCQkgIG1hYy0+cngtPmJ1ZmZlcnMsIG1hYy0+cngtPmJ1Zl9kbWEpOworCisJa2ZyZWUobWFjLT5yeC0+ZGVzY19pbmZvKTsKKwlrZnJlZShtYWMtPnJ4KTsKKwltYWMtPnJ4ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcGFzZW1pX21hY19yZXBsZW5pc2hfcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwYXNlbWlfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBpOworCWludCBzdGFydCA9IG1hYy0+cngtPm5leHRfdG9fZmlsbDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisKKwljb3VudCA9IChtYWMtPnJ4LT5uZXh0X3RvX2NsZWFuICsgUlhfUklOR19TSVpFIC0KKwkJIG1hYy0+cngtPm5leHRfdG9fZmlsbCkgJiAoUlhfUklOR19TSVpFIC0gMSk7CisKKwkvKiBDaGVjayB0byBzZWUgaWYgd2UncmUgZG9pbmcgZmlyc3QtdGltZSBzZXR1cCAqLworCWlmICh1bmxpa2VseShtYWMtPnJ4LT5uZXh0X3RvX2NsZWFuID09IDAgJiYgbWFjLT5yeC0+bmV4dF90b19maWxsID09IDApKQorCQljb3VudCA9IFJYX1JJTkdfU0laRTsKKworCWlmIChjb3VudCA8PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgcGFzZW1pX21hY19idWZmZXIgKmluZm8gPSAmUlhfREVTQ19JTkZPKG1hYywgaSk7CisJCXU2NCAqYnVmZiA9ICZSWF9CVUZGKG1hYywgaSk7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCWRtYV9hZGRyX3QgZG1hOworCisJCXNrYiA9IGRldl9hbGxvY19za2IoQlVGX1NJWkUpOworCisJCWlmICghc2tiKSB7CisJCQljb3VudCA9IGkgLSBzdGFydDsKKwkJCWJyZWFrOworCQl9CisKKwkJc2tiLT5kZXYgPSBkZXY7CisKKwkJZG1hID0gcGNpX21hcF9zaW5nbGUobWFjLT5kbWFfcGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRtYSkpIHsKKwkJCWRldl9rZnJlZV9za2JfaXJxKGluZm8tPnNrYik7CisJCQljb3VudCA9IGkgLSBzdGFydDsKKwkJCWJyZWFrOworCQl9CisKKwkJaW5mby0+c2tiID0gc2tiOworCQlpbmZvLT5kbWEgPSBkbWE7CisJCSpidWZmID0gWENUX1JYQl9MRU4oQlVGX1NJWkUpIHwgWENUX1JYQl9BRERSKGRtYSk7CisJfQorCisJd21iKCk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1hYy0+ZG1hX3BkZXYsCisJCQkgICAgICAgUEFTX0RNQV9SWENIQU5fSU5DUihtYWMtPmRtYV9yeGNoKSwKKwkJCSAgICAgICBjb3VudCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmRtYV9wZGV2LAorCQkJICAgICAgIFBBU19ETUFfUlhJTlRfSU5DUihtYWMtPmRtYV9pZiksCisJCQkgICAgICAgY291bnQpOworCisJbWFjLT5yeC0+bmV4dF90b19maWxsICs9IGNvdW50OworfQorCitzdGF0aWMgaW50IHBhc2VtaV9tYWNfY2xlYW5fcngoc3RydWN0IHBhc2VtaV9tYWMgKm1hYywgaW50IGxpbWl0KQoreworCXVuc2lnbmVkIGludCBpOworCWludCBzdGFydCwgY291bnQ7CisKKwlzcGluX2xvY2soJm1hYy0+cngtPmxvY2spOworCisJc3RhcnQgPSBtYWMtPnJ4LT5uZXh0X3RvX2NsZWFuOworCWNvdW50ID0gMDsKKworCWZvciAoaSA9IHN0YXJ0OyBpIDwgKHN0YXJ0ICsgUlhfUklOR19TSVpFKSAmJiBjb3VudCA8IGxpbWl0OyBpKyspIHsKKwkJc3RydWN0IHBhc19kbWFfeGN0X2Rlc2NyICpkcDsKKwkJc3RydWN0IHBhc2VtaV9tYWNfYnVmZmVyICppbmZvOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1bnNpZ25lZCBpbnQgaiwgbGVuOworCQlkbWFfYWRkcl90IGRtYTsKKworCQlybWIoKTsKKworCQlkcCA9ICZSWF9ERVNDKG1hYywgaSk7CisKKwkJaWYgKCEoZHAtPm1hY3J4ICYgWENUX01BQ1JYX08pKQorCQkJYnJlYWs7CisKKwkJY291bnQrKzsKKworCQlpbmZvID0gTlVMTDsKKworCQkvKiBXZSBoYXZlIHRvIHNjYW4gZm9yIG91ciBza2Igc2luY2UgdGhlcmUncyBubyB3YXkKKwkJICogdG8gYmFjay1tYXAgdGhlbSBmcm9tIHRoZSBkZXNjcmlwdG9yLCBhbmQgaWYgd2UKKwkJICogaGF2ZSBzZXZlcmFsIHJlY2VpdmUgY2hhbm5lbHMgdGhlbiB0aGV5IG1pZ2h0IG5vdAorCQkgKiBzaG93IHVwIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgd2VyZSBwdXQgb24gdGhlCisJCSAqIGludGVyZmFjZSByaW5nLgorCQkgKi8KKworCQlkbWEgPSAoZHAtPnB0ciAmIFhDVF9QVFJfQUREUl9NKTsKKwkJZm9yIChqID0gc3RhcnQ7IGogPCAoc3RhcnQgKyBSWF9SSU5HX1NJWkUpOyBqKyspIHsKKwkJCWluZm8gPSAmUlhfREVTQ19JTkZPKG1hYywgaik7CisJCQlpZiAoaW5mby0+ZG1hID09IGRtYSkKKwkJCQlicmVhazsKKwkJfQorCisJCUJVR19PTighaW5mbyk7CisJCUJVR19PTihpbmZvLT5kbWEgIT0gZG1hKTsKKworCQlwY2lfdW5tYXBfc2luZ2xlKG1hYy0+ZG1hX3BkZXYsIGluZm8tPmRtYSwgaW5mby0+c2tiLT5sZW4sCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwkJc2tiID0gaW5mby0+c2tiOworCisJCWxlbiA9IChkcC0+bWFjcnggJiBYQ1RfTUFDUlhfTExFTl9NKSA+PiBYQ1RfTUFDUlhfTExFTl9TOworCisJCXNrYl9wdXQoc2tiLCBsZW4pOworCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG1hYy0+bmV0ZGV2KTsKKworCQlpZiAoKGRwLT5tYWNyeCAmIFhDVF9NQUNSWF9IVFlfTSkgPT0gWENUX01BQ1JYX0hUWV9JUFY0X09LKSB7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOworCQkJc2tiLT5jc3VtID0gKGRwLT5tYWNyeCAmIFhDVF9NQUNSWF9DU1VNX00pID4+CisJCQkJCSAgIFhDVF9NQUNSWF9DU1VNX1M7CisJCX0gZWxzZQorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCisJCW1hYy0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQltYWMtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCisJCWluZm8tPmRtYSA9IDA7CisJCWluZm8tPnNrYiA9IE5VTEw7CisJCWRwLT5wdHIgPSAwOworCQlkcC0+bWFjcnggPSAwOworCX0KKworCW1hYy0+cngtPm5leHRfdG9fY2xlYW4gKz0gY291bnQ7CisJcGFzZW1pX21hY19yZXBsZW5pc2hfcnhfcmluZyhtYWMtPm5ldGRldik7CisKKwlzcGluX3VubG9jaygmbWFjLT5yeC0+bG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgcGFzZW1pX21hY19jbGVhbl90eChzdHJ1Y3QgcGFzZW1pX21hYyAqbWFjKQoreworCWludCBpOworCXN0cnVjdCBwYXNlbWlfbWFjX2J1ZmZlciAqaW5mbzsKKwlzdHJ1Y3QgcGFzX2RtYV94Y3RfZGVzY3IgKmRwOworCWludCBzdGFydCwgY291bnQ7CisJaW50IGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1hYy0+dHgtPmxvY2ssIGZsYWdzKTsKKworCXN0YXJ0ID0gbWFjLT50eC0+bmV4dF90b19jbGVhbjsKKwljb3VudCA9IDA7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8IG1hYy0+dHgtPm5leHRfdG9fdXNlOyBpKyspIHsKKwkJZHAgPSAmVFhfREVTQyhtYWMsIGkpOworCQlpZiAoIWRwIHx8IChkcC0+bWFjdHggJiBYQ1RfTUFDVFhfTykpCisJCQlicmVhazsKKworCQljb3VudCsrOworCisJCWluZm8gPSAmVFhfREVTQ19JTkZPKG1hYywgaSk7CisKKwkJcGNpX3VubWFwX3NpbmdsZShtYWMtPmRtYV9wZGV2LCBpbmZvLT5kbWEsCisJCQkJIGluZm8tPnNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9pcnEoaW5mby0+c2tiKTsKKworCQlpbmZvLT5za2IgPSBOVUxMOworCQlpbmZvLT5kbWEgPSAwOworCQlkcC0+bWFjdHggPSAwOworCQlkcC0+cHRyID0gMDsKKwl9CisJbWFjLT50eC0+bmV4dF90b19jbGVhbiArPSBjb3VudDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPnR4LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHBhc2VtaV9tYWNfcnhfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXN0cnVjdCBwYXNlbWlfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCByZWc7CisKKwlpZiAoISgqbWFjLT5yeF9zdGF0dXMgJiBQQVNfU1RBVFVTX0lOVCkpCisJCXJldHVybiBJUlFfTk9ORTsKKworCW5ldGlmX3J4X3NjaGVkdWxlKGRldik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmlvYl9wZGV2LCBQQVNfSU9CX0RNQV9DT01fVElNRU9VVENGRywKKwkJCSAgICAgICBQQVNfSU9CX0RNQV9DT01fVElNRU9VVENGR19UQ05UKDApKTsKKworCXJlZyA9IFBBU19JT0JfRE1BX1JYQ0hfUkVTRVRfUElOVEMgfCBQQVNfSU9CX0RNQV9SWENIX1JFU0VUX1NJTlRDIHwKKwkgICAgICBQQVNfSU9CX0RNQV9SWENIX1JFU0VUX0RJTlRDOworCWlmICgqbWFjLT5yeF9zdGF0dXMgJiBQQVNfU1RBVFVTX1RJTUVSKQorCQlyZWcgfD0gUEFTX0lPQl9ETUFfUlhDSF9SRVNFVF9USU5UQzsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWFjLT5pb2JfcGRldiwKKwkJCSAgICAgICBQQVNfSU9CX0RNQV9SWENIX1JFU0VUKG1hYy0+ZG1hX3J4Y2gpLCByZWcpOworCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwYXNlbWlfbWFjX3R4X2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcGFzZW1pX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgcmVnOworCWludCB3YXNfZnVsbDsKKworCXdhc19mdWxsID0gbWFjLT50eC0+bmV4dF90b19jbGVhbiAtIG1hYy0+dHgtPm5leHRfdG9fdXNlID09IFRYX1JJTkdfU0laRTsKKworCWlmICghKCptYWMtPnR4X3N0YXR1cyAmIFBBU19TVEFUVVNfSU5UKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJcGFzZW1pX21hY19jbGVhbl90eChtYWMpOworCisJcmVnID0gUEFTX0lPQl9ETUFfVFhDSF9SRVNFVF9QSU5UQyB8IFBBU19JT0JfRE1BX1RYQ0hfUkVTRVRfU0lOVEM7CisJaWYgKCptYWMtPnR4X3N0YXR1cyAmIFBBU19TVEFUVVNfVElNRVIpCisJCXJlZyB8PSBQQVNfSU9CX0RNQV9UWENIX1JFU0VUX1RJTlRDOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmlvYl9wZGV2LCBQQVNfSU9CX0RNQV9UWENIX1JFU0VUKG1hYy0+ZG1hX3R4Y2gpLAorCQkJICAgICAgIHJlZyk7CisKKwlpZiAod2FzX2Z1bGwpCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBwYXNlbWlfbWFjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGFzZW1pX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIGVuYWJsZSByeCBzZWN0aW9uICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmRtYV9wZGV2LCBQQVNfRE1BX0NPTV9SWENNRCwKKwkJCSAgICAgICBQQVNfRE1BX0NPTV9SWENNRF9FTik7CisKKwkvKiBlbmFibGUgdHggc2VjdGlvbiAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWFjLT5kbWFfcGRldiwgUEFTX0RNQV9DT01fVFhDTUQsCisJCQkgICAgICAgUEFTX0RNQV9DT01fVFhDTURfRU4pOworCisJZmxhZ3MgPSBQQVNfTUFDX0NGR19UWFBfRkNFIHwgUEFTX01BQ19DRkdfVFhQX0ZQQygzKSB8CisJCVBBU19NQUNfQ0ZHX1RYUF9TTCgzKSB8IFBBU19NQUNfQ0ZHX1RYUF9DT0IoMHhmKSB8CisJCVBBU19NQUNfQ0ZHX1RYUF9USUZUKDgpIHwgUEFTX01BQ19DRkdfVFhQX1RJRkcoMTIpOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPnBkZXYsIFBBU19NQUNfQ0ZHX1RYUCwgZmxhZ3MpOworCisJZmxhZ3MgPSBQQVNfTUFDX0NGR19QQ0ZHX1MxIHwgUEFTX01BQ19DRkdfUENGR19QRSB8CisJCVBBU19NQUNfQ0ZHX1BDRkdfUFIgfCBQQVNfTUFDX0NGR19QQ0ZHX0NFOworCisJZmxhZ3MgfD0gUEFTX01BQ19DRkdfUENGR19UU1JfMUcgfCBQQVNfTUFDX0NGR19QQ0ZHX1NQRF8xRzsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWFjLT5pb2JfcGRldiwgUEFTX0lPQl9ETUFfUlhDSF9DRkcobWFjLT5kbWFfcnhjaCksCisJCQkgICAgICAgUEFTX0lPQl9ETUFfUlhDSF9DRkdfQ05UVEgoMzApKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWFjLT5pb2JfcGRldiwgUEFTX0lPQl9ETUFfQ09NX1RJTUVPVVRDRkcsCisJCQkgICAgICAgUEFTX0lPQl9ETUFfQ09NX1RJTUVPVVRDRkdfVENOVCgxMDAwMDAwKSk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1hYy0+cGRldiwgUEFTX01BQ19DRkdfUENGRywgZmxhZ3MpOworCisJcmV0ID0gcGFzZW1pX21hY19zZXR1cF9yeF9yZXNvdXJjZXMoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9yeF9yZXNvdXJjZXM7CisKKwlyZXQgPSBwYXNlbWlfbWFjX3NldHVwX3R4X3Jlc291cmNlcyhkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3R4X3Jlc291cmNlczsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWFjLT5wZGV2LCBQQVNfTUFDX0lQQ19DSE5MLAorCQkJICAgICAgIFBBU19NQUNfSVBDX0NITkxfRENITk8obWFjLT5kbWFfcnhjaCkgfAorCQkJICAgICAgIFBBU19NQUNfSVBDX0NITkxfQkNIKG1hYy0+ZG1hX3J4Y2gpKTsKKworCS8qIGVuYWJsZSByeCBpZiAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWFjLT5kbWFfcGRldiwKKwkJCSAgICAgICBQQVNfRE1BX1JYSU5UX1JDTURTVEEobWFjLT5kbWFfaWYpLAorCQkJICAgICAgIFBBU19ETUFfUlhJTlRfUkNNRFNUQV9FTik7CisKKwkvKiBlbmFibGUgcnggY2hhbm5lbCAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWFjLT5kbWFfcGRldiwKKwkJCSAgICAgICBQQVNfRE1BX1JYQ0hBTl9DQ01EU1RBKG1hYy0+ZG1hX3J4Y2gpLAorCQkJICAgICAgIFBBU19ETUFfUlhDSEFOX0NDTURTVEFfRU4gfAorCQkJICAgICAgIFBBU19ETUFfUlhDSEFOX0NDTURTVEFfRFUpOworCisJLyogZW5hYmxlIHR4IGNoYW5uZWwgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1hYy0+ZG1hX3BkZXYsCisJCQkgICAgICAgUEFTX0RNQV9UWENIQU5fVENNRFNUQShtYWMtPmRtYV90eGNoKSwKKwkJCSAgICAgICBQQVNfRE1BX1RYQ0hBTl9UQ01EU1RBX0VOKTsKKworCXBhc2VtaV9tYWNfcmVwbGVuaXNoX3J4X3JpbmcoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJbmV0aWZfcG9sbF9lbmFibGUoZGV2KTsKKworCXJldCA9IHJlcXVlc3RfaXJxKG1hYy0+ZG1hX3BkZXYtPmlycSArIG1hYy0+ZG1hX3R4Y2gsCisJCQkgICZwYXNlbWlfbWFjX3R4X2ludHIsIElSUUZfRElTQUJMRUQsCisJCQkgIG1hYy0+dHgtPmlycV9uYW1lLCBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmbWFjLT5wZGV2LT5kZXYsICJyZXF1ZXN0X2lycSBvZiBpcnEgJWQgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIG1hYy0+ZG1hX3BkZXYtPmlycSArIG1hYy0+ZG1hX3R4Y2gsIHJldCk7CisJCWdvdG8gb3V0X3R4X2ludDsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShtYWMtPmRtYV9wZGV2LT5pcnEgKyAyMCArIG1hYy0+ZG1hX3J4Y2gsCisJCQkgICZwYXNlbWlfbWFjX3J4X2ludHIsIElSUUZfRElTQUJMRUQsCisJCQkgIG1hYy0+cngtPmlycV9uYW1lLCBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmbWFjLT5wZGV2LT5kZXYsICJyZXF1ZXN0X2lycSBvZiBpcnEgJWQgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIG1hYy0+ZG1hX3BkZXYtPmlycSArIDIwICsgbWFjLT5kbWFfcnhjaCwgcmV0KTsKKwkJZ290byBvdXRfcnhfaW50OworCX0KKworCXJldHVybiAwOworCitvdXRfcnhfaW50OgorCWZyZWVfaXJxKG1hYy0+ZG1hX3BkZXYtPmlycSArIG1hYy0+ZG1hX3R4Y2gsIGRldik7CitvdXRfdHhfaW50OgorCW5ldGlmX3BvbGxfZGlzYWJsZShkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlwYXNlbWlfbWFjX2ZyZWVfdHhfcmVzb3VyY2VzKGRldik7CitvdXRfdHhfcmVzb3VyY2VzOgorCXBhc2VtaV9tYWNfZnJlZV9yeF9yZXNvdXJjZXMoZGV2KTsKK291dF9yeF9yZXNvdXJjZXM6CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIE1BWF9SRVRSSUVTIDUwMDAKKworc3RhdGljIGludCBwYXNlbWlfbWFjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBhc2VtaV9tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IHN0YXQ7CisJaW50IHJldHJpZXM7CisKKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkvKiBDbGVhbiBvdXQgYW55IHBlbmRpbmcgYnVmZmVycyAqLworCXBhc2VtaV9tYWNfY2xlYW5fdHgobWFjKTsKKwlwYXNlbWlfbWFjX2NsZWFuX3J4KG1hYywgUlhfUklOR19TSVpFKTsKKworCS8qIERpc2FibGUgaW50ZXJmYWNlICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmRtYV9wZGV2LAorCQkJICAgICAgIFBBU19ETUFfVFhDSEFOX1RDTURTVEEobWFjLT5kbWFfdHhjaCksCisJCQkgICAgICAgUEFTX0RNQV9UWENIQU5fVENNRFNUQV9TVCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmRtYV9wZGV2LAorCQkgICAgICBQQVNfRE1BX1JYSU5UX1JDTURTVEEobWFjLT5kbWFfaWYpLAorCQkgICAgICBQQVNfRE1BX1JYSU5UX1JDTURTVEFfU1QpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWFjLT5kbWFfcGRldiwKKwkJICAgICAgUEFTX0RNQV9SWENIQU5fQ0NNRFNUQShtYWMtPmRtYV9yeGNoKSwKKwkJICAgICAgUEFTX0RNQV9SWENIQU5fQ0NNRFNUQV9TVCk7CisKKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgTUFYX1JFVFJJRVM7IHJldHJpZXMrKykgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQobWFjLT5kbWFfcGRldiwKKwkJCQkgICAgICBQQVNfRE1BX1RYQ0hBTl9UQ01EU1RBKG1hYy0+ZG1hX3R4Y2gpLAorCQkJCSAgICAgICZzdGF0KTsKKwkJaWYgKHN0YXQgJiBQQVNfRE1BX1RYQ0hBTl9UQ01EU1RBX0FDVCkKKwkJCWJyZWFrOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwlpZiAoIShzdGF0ICYgUEFTX0RNQV9UWENIQU5fVENNRFNUQV9BQ1QpKSB7CisJCWRldl9lcnIoJm1hYy0+ZG1hX3BkZXYtPmRldiwgIkZhaWxlZCB0byBzdG9wIHR4IGNoYW5uZWxcbiIpOworCX0KKworCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCBNQVhfUkVUUklFUzsgcmV0cmllcysrKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChtYWMtPmRtYV9wZGV2LAorCQkJCSAgICAgIFBBU19ETUFfUlhDSEFOX0NDTURTVEEobWFjLT5kbWFfcnhjaCksCisJCQkJICAgICAgJnN0YXQpOworCQlpZiAoc3RhdCAmIFBBU19ETUFfUlhDSEFOX0NDTURTVEFfQUNUKQorCQkJYnJlYWs7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCWlmICghKHN0YXQgJiBQQVNfRE1BX1JYQ0hBTl9DQ01EU1RBX0FDVCkpIHsKKwkJZGV2X2VycigmbWFjLT5kbWFfcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHN0b3AgcnggY2hhbm5lbFxuIik7CisJfQorCisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IE1BWF9SRVRSSUVTOyByZXRyaWVzKyspIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG1hYy0+ZG1hX3BkZXYsCisJCQkJICAgICAgUEFTX0RNQV9SWElOVF9SQ01EU1RBKG1hYy0+ZG1hX2lmKSwKKwkJCQkgICAgICAmc3RhdCk7CisJCWlmIChzdGF0ICYgUEFTX0RNQV9SWElOVF9SQ01EU1RBX0FDVCkKKwkJCWJyZWFrOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwlpZiAoIShzdGF0ICYgUEFTX0RNQV9SWElOVF9SQ01EU1RBX0FDVCkpIHsKKwkJZGV2X2VycigmbWFjLT5kbWFfcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHN0b3AgcnggaW50ZXJmYWNlXG4iKTsKKwl9CisKKwkvKiBUaGVuLCBkaXNhYmxlIHRoZSBjaGFubmVsLiBUaGlzIG11c3QgYmUgZG9uZSBzZXBhcmF0ZWx5IGZyb20KKwkgKiBzdG9wcGluZywgc2luY2UgeW91IGNhbid0IGRpc2FibGUgd2hlbiBhY3RpdmUuCisJICovCisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1hYy0+ZG1hX3BkZXYsCisJCQkgICAgICAgUEFTX0RNQV9UWENIQU5fVENNRFNUQShtYWMtPmRtYV90eGNoKSwgMCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPmRtYV9wZGV2LAorCQkJICAgICAgIFBBU19ETUFfUlhDSEFOX0NDTURTVEEobWFjLT5kbWFfcnhjaCksIDApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQobWFjLT5kbWFfcGRldiwKKwkJCSAgICAgICBQQVNfRE1BX1JYSU5UX1JDTURTVEEobWFjLT5kbWFfaWYpLCAwKTsKKworCWZyZWVfaXJxKG1hYy0+ZG1hX3BkZXYtPmlycSArIG1hYy0+ZG1hX3R4Y2gsIGRldik7CisJZnJlZV9pcnEobWFjLT5kbWFfcGRldi0+aXJxICsgMjAgKyBtYWMtPmRtYV9yeGNoLCBkZXYpOworCisJLyogRnJlZSByZXNvdXJjZXMgKi8KKwlwYXNlbWlfbWFjX2ZyZWVfcnhfcmVzb3VyY2VzKGRldik7CisJcGFzZW1pX21hY19mcmVlX3R4X3Jlc291cmNlcyhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFzZW1pX21hY19zdGFydF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwYXNlbWlfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwYXNlbWlfbWFjX3R4cmluZyAqdHhyaW5nOworCXN0cnVjdCBwYXNlbWlfbWFjX2J1ZmZlciAqaW5mbzsKKwlzdHJ1Y3QgcGFzX2RtYV94Y3RfZGVzY3IgKmRwOworCXU2NCBkZmxhZ3M7CisJZG1hX2FkZHJfdCBtYXA7CisJaW50IGZsYWdzOworCisJZGZsYWdzID0gWENUX01BQ1RYX08gfCBYQ1RfTUFDVFhfU1QgfCBYQ1RfTUFDVFhfU1MgfCBYQ1RfTUFDVFhfQ1JDX1BBRDsKKworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CisJCXN3aXRjaCAoc2tiLT5uaC5pcGgtPnByb3RvY29sKSB7CisJCWNhc2UgSVBQUk9UT19UQ1A6CisJCQlkZmxhZ3MgfD0gWENUX01BQ1RYX0NTVU1fVENQOworCQkJZGZsYWdzIHw9IFhDVF9NQUNUWF9JUEgoKHNrYi0+aC5yYXcgLSBza2ItPm5oLnJhdykgPj4gMik7CisJCQlkZmxhZ3MgfD0gWENUX01BQ1RYX0lQTyhza2ItPm5oLnJhdyAtIHNrYi0+ZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfQ1NVTV9VRFA7CisJCQlkZmxhZ3MgfD0gWENUX01BQ1RYX0lQSCgoc2tiLT5oLnJhdyAtIHNrYi0+bmgucmF3KSA+PiAyKTsKKwkJCWRmbGFncyB8PSBYQ1RfTUFDVFhfSVBPKHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJbWFwID0gcGNpX21hcF9zaW5nbGUobWFjLT5kbWFfcGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IobWFwKSkKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCisJdHhyaW5nID0gbWFjLT50eDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0eHJpbmctPmxvY2ssIGZsYWdzKTsKKworCWlmICh0eHJpbmctPm5leHRfdG9fY2xlYW4gLSB0eHJpbmctPm5leHRfdG9fdXNlID09IFRYX1JJTkdfU0laRSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0eHJpbmctPmxvY2ssIGZsYWdzKTsKKwkJcGFzZW1pX21hY19jbGVhbl90eChtYWMpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHhyaW5nLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHR4cmluZy0+bmV4dF90b19jbGVhbiAtIHR4cmluZy0+bmV4dF90b191c2UgPT0KKwkJICAgIFRYX1JJTkdfU0laRSkgeworCQkJLyogU3RpbGwgbm8gcm9vbSAtLSBzdG9wIHRoZSBxdWV1ZSBhbmQgd2FpdCBmb3IgdHgKKwkJCSAqIGludHIgd2hlbiB0aGVyZSdzIHJvb20uCisJCQkgKi8KKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKworCisJZHAgPSAmVFhfREVTQyhtYWMsIHR4cmluZy0+bmV4dF90b191c2UpOworCWluZm8gPSAmVFhfREVTQ19JTkZPKG1hYywgdHhyaW5nLT5uZXh0X3RvX3VzZSk7CisKKwlkcC0+bWFjdHggPSBkZmxhZ3MgfCBYQ1RfTUFDVFhfTExFTihza2ItPmxlbik7CisJZHAtPnB0ciAgID0gWENUX1BUUl9MRU4oc2tiLT5sZW4pIHwgWENUX1BUUl9BRERSKG1hcCk7CisJaW5mby0+ZG1hID0gbWFwOworCWluZm8tPnNrYiA9IHNrYjsKKworCXR4cmluZy0+bmV4dF90b191c2UrKzsKKwltYWMtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwltYWMtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHhyaW5nLT5sb2NrLCBmbGFncyk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1hYy0+ZG1hX3BkZXYsCisJCQkgICAgICAgUEFTX0RNQV9UWENIQU5fSU5DUihtYWMtPmRtYV90eGNoKSwgMSk7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCitvdXRfZXJyOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR4cmluZy0+bG9jaywgZmxhZ3MpOworCXBjaV91bm1hcF9zaW5nbGUobWFjLT5kbWFfcGRldiwgbWFwLCBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnBhc2VtaV9tYWNfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBhc2VtaV9tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gJm1hYy0+c3RhdHM7Cit9CisKK3N0YXRpYyB2b2lkIHBhc2VtaV9tYWNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGFzZW1pX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQobWFjLT5wZGV2LCBQQVNfTUFDX0NGR19QQ0ZHLCAmZmxhZ3MpOworCisJLyogU2V0IHByb21pc2N1b3VzICovCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJZmxhZ3MgfD0gUEFTX01BQ19DRkdfUENGR19QUjsKKwllbHNlCisJCWZsYWdzICY9IH5QQVNfTUFDX0NGR19QQ0ZHX1BSOworCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtYWMtPnBkZXYsIFBBU19NQUNfQ0ZHX1BDRkcsIGZsYWdzKTsKK30KKworCitzdGF0aWMgaW50IHBhc2VtaV9tYWNfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKK3sKKwlpbnQgcGt0cywgbGltaXQgPSBtaW4oKmJ1ZGdldCwgZGV2LT5xdW90YSk7CisJc3RydWN0IHBhc2VtaV9tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisKKwlwa3RzID0gcGFzZW1pX21hY19jbGVhbl9yeChtYWMsIGxpbWl0KTsKKworCWlmIChwa3RzIDwgbGltaXQpIHsKKwkJLyogYWxsIGRvbmUsIG5vIG1vcmUgcGFja2V0cyBwcmVzZW50ICovCisJCW5ldGlmX3J4X2NvbXBsZXRlKGRldik7CisKKwkJLyogcmUtZW5hYmxlIHJlY2VpdmUgaW50ZXJydXB0cyAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG1hYy0+aW9iX3BkZXYsIFBBU19JT0JfRE1BX0NPTV9USU1FT1VUQ0ZHLAorCQkJCSAgICAgICBQQVNfSU9CX0RNQV9DT01fVElNRU9VVENGR19UQ05UKDEwMDAwMDApKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogdXNlZCB1cCBvdXIgcXVhbnR1bSwgc28gcmVzY2hlZHVsZSAqLworCQlkZXYtPnF1b3RhIC09IHBrdHM7CisJCSpidWRnZXQgLT0gcGt0czsKKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorcGFzZW1pX21hY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdGF0aWMgaW50IGluZGV4ID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBwYXNlbWlfbWFjICptYWM7CisJaW50IGVycjsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHBhc2VtaV9tYWMpKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJInBhc2VtaV9tYWM6IENvdWxkIG5vdCBhbGxvY2F0ZSBldGhlcm5ldCBkZXZpY2UuXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJU0VUX01PRFVMRV9PV05FUihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwltYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCisJbWFjLT5wZGV2ID0gcGRldjsKKwltYWMtPm5ldGRldiA9IGRldjsKKwltYWMtPmRtYV9wZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9QQVNFTUksIDB4YTAwNywgTlVMTCk7CisKKwlpZiAoIW1hYy0+ZG1hX3BkZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZmluZCBETUEgQ29udHJvbGxlclxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2ZyZWVfbmV0ZGV2OworCX0KKworCW1hYy0+aW9iX3BkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1BBU0VNSSwgMHhhMDAxLCBOVUxMKTsKKworCWlmICghbWFjLT5pb2JfcGRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBmaW5kIEkvTyBCcmlkZ2VcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9wdXRfZG1hX3BkZXY7CisJfQorCisJLyogVGhlc2Ugc2hvdWxkIGNvbWUgb3V0IG9mIHRoZSBkZXZpY2UgdHJlZSBldmVudHVhbGx5ICovCisJbWFjLT5kbWFfdHhjaCA9IGluZGV4OworCW1hYy0+ZG1hX3J4Y2ggPSBpbmRleDsKKworCS8qIFdlIHByb2JlIEdNQUMgYmVmb3JlIFhBVUksIGJ1dCB0aGUgRE1BIGludGVyZmFjZXMgYXJlCisJICogaW4gWEFVSSwgR01BQyBvcmRlci4KKwkgKi8KKwlpZiAoaW5kZXggPCA0KQorCQltYWMtPmRtYV9pZiA9IGluZGV4ICsgMjsKKwllbHNlCisJCW1hYy0+ZG1hX2lmID0gaW5kZXggLSA0OworCWluZGV4Kys7CisKKwlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgMHhhMDA1OgorCQltYWMtPnR5cGUgPSBNQUNfVFlQRV9HTUFDOworCQlicmVhazsKKwljYXNlIDB4YTAwNjoKKwkJbWFjLT50eXBlID0gTUFDX1RZUEVfWEFVSTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZ2V0IG1hYyBhZGRyIGZyb20gZGV2aWNlIHRyZWUgKi8KKwlpZiAocGFzZW1pX2dldF9tYWNfYWRkcihtYWMpIHx8ICFpc192YWxpZF9ldGhlcl9hZGRyKG1hYy0+bWFjX2FkZHIpKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgbWFjLT5tYWNfYWRkciwgc2l6ZW9mKG1hYy0+bWFjX2FkZHIpKTsKKworCWRldi0+b3BlbiA9IHBhc2VtaV9tYWNfb3BlbjsKKwlkZXYtPnN0b3AgPSBwYXNlbWlfbWFjX2Nsb3NlOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gcGFzZW1pX21hY19zdGFydF90eDsKKwlkZXYtPmdldF9zdGF0cyA9IHBhc2VtaV9tYWNfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcGFzZW1pX21hY19zZXRfcnhfbW9kZTsKKwlkZXYtPndlaWdodCA9IDY0OworCWRldi0+cG9sbCA9IHBhc2VtaV9tYWNfcG9sbDsKKwlkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9IV19DU1VNOworCisJLyogVGhlIGRtYSBzdGF0dXMgc3RydWN0dXJlIGlzIGxvY2F0ZWQgaW4gdGhlIEkvTyBicmlkZ2UsIGFuZAorCSAqIGlzIGNhY2hlIGNvaGVyZW50LgorCSAqLworCWlmICghZG1hX3N0YXR1cykKKwkJLyogWFhYT0pOIFRoaXMgc2hvdWxkIGNvbWUgZnJvbSB0aGUgZGV2aWNlIHRyZWUgKi8KKwkJZG1hX3N0YXR1cyA9IF9faW9yZW1hcCgweGZkODAwMDAwLCAweDEwMDAsIDApOworCisJbWFjLT5yeF9zdGF0dXMgPSAmZG1hX3N0YXR1cy0+cnhfc3RhW21hYy0+ZG1hX3J4Y2hdOworCW1hYy0+dHhfc3RhdHVzID0gJmRtYV9zdGF0dXMtPnR4X3N0YVttYWMtPmRtYV90eGNoXTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCisJaWYgKGVycikgeworCQlkZXZfZXJyKCZtYWMtPnBkZXYtPmRldiwgInJlZ2lzdGVyX25ldGRldiBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwKKwkJCWVycik7CisJCWdvdG8gb3V0OworCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICIlczogUEEgU2VtaSAlczogaW50ZiAlZCwgdHhjaCAlZCwgcnhjaCAlZCwgIgorCQkgICAgICAgImh3IGFkZHIgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIG1hYy0+dHlwZSA9PSBNQUNfVFlQRV9HTUFDID8gIkdNQUMiIDogIlhBVUkiLAorCQkgICAgICAgbWFjLT5kbWFfaWYsIG1hYy0+ZG1hX3R4Y2gsIG1hYy0+ZG1hX3J4Y2gsCisJCSAgICAgICBkZXYtPmRldl9hZGRyWzBdLCBkZXYtPmRldl9hZGRyWzFdLCBkZXYtPmRldl9hZGRyWzJdLAorCQkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7CisKKwlyZXR1cm4gZXJyOworCitvdXQ6CisJcGNpX2Rldl9wdXQobWFjLT5pb2JfcGRldik7CitvdXRfcHV0X2RtYV9wZGV2OgorCXBjaV9kZXZfcHV0KG1hYy0+ZG1hX3BkZXYpOworb3V0X2ZyZWVfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CitvdXRfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7CisKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHBhc2VtaV9tYWNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHBhc2VtaV9tYWMgKm1hYzsKKworCWlmICghbmV0ZGV2KQorCQlyZXR1cm47CisKKwltYWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfZGV2X3B1dChtYWMtPmRtYV9wZGV2KTsKKwlwY2lfZGV2X3B1dChtYWMtPmlvYl9wZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGFzZW1pX21hY19wY2lfdGJsW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUEFTRU1JLCAweGEwMDUpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUEFTRU1JLCAweGEwMDYpIH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGFzZW1pX21hY19wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBhc2VtaV9tYWNfZHJpdmVyID0geworCS5uYW1lCQk9ICJwYXNlbWlfbWFjIiwKKwkuaWRfdGFibGUJPSBwYXNlbWlfbWFjX3BjaV90YmwsCisJLnByb2JlCQk9IHBhc2VtaV9tYWNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwYXNlbWlfbWFjX3JlbW92ZSksCit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgcGFzZW1pX21hY19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcGFzZW1pX21hY19kcml2ZXIpOworCV9faW91bm1hcChkbWFfc3RhdHVzKTsKKwlkbWFfc3RhdHVzID0gTlVMTDsKK30KKworaW50IHBhc2VtaV9tYWNfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGFzZW1pX21hY19kcml2ZXIpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SICgiT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQSBTZW1pIFBXUmZpY2llbnQgRXRoZXJuZXQgZHJpdmVyIik7CisKK21vZHVsZV9pbml0KHBhc2VtaV9tYWNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQocGFzZW1pX21hY19jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wYXNlbWlfbWFjLmggYi9kcml2ZXJzL25ldC9wYXNlbWlfbWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlMzdlNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3Bhc2VtaV9tYWMuaApAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBQQSBTZW1pLCBJbmMKKyAqCisgKiBEcml2ZXIgZm9yIHRoZSBQQTZULTE2ODJNIG9uY2hpcCAxRy8xMEcgRXRoZXJuZXQgTUFDcywgc29mdCBzdGF0ZSBhbmQKKyAqIGhhcmR3YXJlIHJlZ2lzdGVyIGxheW91dHMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBQQVNFTUlfTUFDX0gKKyNkZWZpbmUgUEFTRU1JX01BQ19ICisKKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworc3RydWN0IHBhc2VtaV9tYWNfdHhyaW5nIHsKKwlzcGlubG9ja190CSBsb2NrOworCXN0cnVjdCBwYXNfZG1hX3hjdF9kZXNjcgkqZGVzYzsKKwlkbWFfYWRkcl90CSBkbWE7CisJdW5zaWduZWQgaW50CSBzaXplOworCXVuc2lnbmVkIGludAkgbmV4dF90b191c2U7CisJdW5zaWduZWQgaW50CSBuZXh0X3RvX2NsZWFuOworCXN0cnVjdCBwYXNlbWlfbWFjX2J1ZmZlciAqZGVzY19pbmZvOworCWNoYXIJCSBpcnFfbmFtZVsxMF07ICAvKiAiZXRoJWQgdHgiICovCit9OworCitzdHJ1Y3QgcGFzZW1pX21hY19yeHJpbmcgeworCXNwaW5sb2NrX3QJIGxvY2s7CisJc3RydWN0IHBhc19kbWFfeGN0X2Rlc2NyCSpkZXNjOwkvKiBSWCBjaGFubmVsIGRlc2NyaXB0b3IgcmluZyAqLworCWRtYV9hZGRyX3QJIGRtYTsKKwl1NjQJCSpidWZmZXJzOwkvKiBSWCBpbnRlcmZhY2UgYnVmZmVyIHJpbmcgKi8KKwlkbWFfYWRkcl90CSBidWZfZG1hOworCXVuc2lnbmVkIGludAkgc2l6ZTsKKwl1bnNpZ25lZCBpbnQJIG5leHRfdG9fZmlsbDsKKwl1bnNpZ25lZCBpbnQJIG5leHRfdG9fY2xlYW47CisJc3RydWN0IHBhc2VtaV9tYWNfYnVmZmVyICpkZXNjX2luZm87CisJY2hhcgkJIGlycV9uYW1lWzEwXTsgIC8qICJldGglZCByeCIgKi8KK307CisKK3N0cnVjdCBwYXNlbWlfbWFjIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBwY2lfZGV2ICpkbWFfcGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqaW9iX3BkZXY7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKwkvKiBQb2ludGVyIHRvIHRoZSBjYWNoZWFibGUgcGVyLWNoYW5uZWwgc3RhdHVzIHJlZ2lzdGVycyAqLworCXU2NAkqcnhfc3RhdHVzOworCXU2NAkqdHhfc3RhdHVzOworCisJdTgJCXR5cGU7CisjZGVmaW5lIE1BQ19UWVBFX0dNQUMJMQorI2RlZmluZSBNQUNfVFlQRV9YQVVJCTIKKwl1MzIJZG1hX3R4Y2g7CisJdTMyCWRtYV9pZjsKKwl1MzIJZG1hX3J4Y2g7CisKKwl1OAkJbWFjX2FkZHJbNl07CisKKwlzdHJ1Y3QgdGltZXJfbGlzdAlyeHRpbWVyOworCisJc3RydWN0IHBhc2VtaV9tYWNfdHhyaW5nICp0eDsKKwlzdHJ1Y3QgcGFzZW1pX21hY19yeHJpbmcgKnJ4OworfTsKKworLyogU29mdHdhcmUgc3RhdHVzIGRlc2NyaXB0b3IgKGRlc2NfaW5mbykgKi8KK3N0cnVjdCBwYXNlbWlfbWFjX2J1ZmZlciB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlkbWFfYWRkcl90CWRtYTsKK307CisKKworLyogc3RhdHVzIHJlZ2lzdGVyIGxheW91dCBpbiBJT0IgcmVnaW9uLCBhdCAweGZiODAwMDAwICovCitzdHJ1Y3QgcGFzZG1hX3N0YXR1cyB7CisJdTY0IHJ4X3N0YVs2NF07CisJdTY0IHR4X3N0YVsyMF07Cit9OworCisvKiBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLworc3RydWN0IHBhc19kbWFfeGN0X2Rlc2NyIHsKKwl1bmlvbiB7CisJCXU2NAltYWN0eDsKKwkJdTY0CW1hY3J4OworCX07CisJdW5pb24geworCQl1NjQJcHRyOworCQl1NjQJcnhiOworCX07Cit9OworCisvKiBNQUMgQ0ZHIHJlZ2lzdGVyIG9mZnNldHMgKi8KKworZW51bSB7CisJUEFTX01BQ19DRkdfUENGRyA9IDB4ODAsCisJUEFTX01BQ19DRkdfVFhQID0gMHg5OCwKKwlQQVNfTUFDX0lQQ19DSE5MID0gMHgyMDgsCit9OworCisvKiBNQUMgQ0ZHIHJlZ2lzdGVyIGZpZWxkcyAqLworI2RlZmluZSBQQVNfTUFDX0NGR19QQ0ZHX1BFCQkweDgwMDAwMDAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfQ0UJCTB4NDAwMDAwMDAKKyNkZWZpbmUgUEFTX01BQ19DRkdfUENGR19CVQkJMHgyMDAwMDAwMAorI2RlZmluZSBQQVNfTUFDX0NGR19QQ0ZHX1RUCQkweDEwMDAwMDAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfVFNSX00JCTB4MGMwMDAwMDAKKyNkZWZpbmUgUEFTX01BQ19DRkdfUENGR19UU1JfMTBNCTB4MDAwMDAwMDAKKyNkZWZpbmUgUEFTX01BQ19DRkdfUENGR19UU1JfMTAwTQkweDA0MDAwMDAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfVFNSXzFHCQkweDA4MDAwMDAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfVFNSXzEwRwkweDBjMDAwMDAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfVDI0CQkweDAyMDAwMDAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfUFIJCTB4MDEwMDAwMDAKKyNkZWZpbmUgUEFTX01BQ19DRkdfUENGR19DUk9fTQkJMHgwMGZmMDAwMAorI2RlZmluZSBQQVNfTUFDX0NGR19QQ0ZHX0NST19TCTE2CisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfSVBPX00JCTB4MDAwMGZmMDAKKyNkZWZpbmUgUEFTX01BQ19DRkdfUENGR19JUE9fUwk4CisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfUzEJCTB4MDAwMDAwODAKKyNkZWZpbmUgUEFTX01BQ19DRkdfUENGR19JT19NCQkweDAwMDAwMDYwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfSU9fTUFDCQkweDAwMDAwMDAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfSU9fT0ZGCQkweDAwMDAwMDIwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfSU9fSU5EX0VUSAkweDAwMDAwMDQwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfSU9fSU5EX0lQCTB4MDAwMDAwNjAKKyNkZWZpbmUgUEFTX01BQ19DRkdfUENGR19MUAkJMHgwMDAwMDAxMAorI2RlZmluZSBQQVNfTUFDX0NGR19QQ0ZHX1RTCQkweDAwMDAwMDA4CisjZGVmaW5lIFBBU19NQUNfQ0ZHX1BDRkdfSEQJCTB4MDAwMDAwMDQKKyNkZWZpbmUgUEFTX01BQ19DRkdfUENGR19TUERfTQkJMHgwMDAwMDAwMworI2RlZmluZSBQQVNfTUFDX0NGR19QQ0ZHX1NQRF8xME0JMHgwMDAwMDAwMAorI2RlZmluZSBQQVNfTUFDX0NGR19QQ0ZHX1NQRF8xMDBNCTB4MDAwMDAwMDEKKyNkZWZpbmUgUEFTX01BQ19DRkdfUENGR19TUERfMUcJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUEFTX01BQ19DRkdfUENGR19TUERfMTBHCTB4MDAwMDAwMDMKKyNkZWZpbmUgUEFTX01BQ19DRkdfVFhQX0ZDRgkJMHgwMTAwMDAwMAorI2RlZmluZSBQQVNfTUFDX0NGR19UWFBfRkNFCQkweDAwODAwMDAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1RYUF9GQwkJMHgwMDQwMDAwMAorI2RlZmluZSBQQVNfTUFDX0NGR19UWFBfRlBDX00JCTB4MDAzMDAwMDAKKyNkZWZpbmUgUEFTX01BQ19DRkdfVFhQX0ZQQ19TCQkyMAorI2RlZmluZSBQQVNfTUFDX0NGR19UWFBfRlBDKHgpCQkoKCh4KSA8PCBQQVNfTUFDX0NGR19UWFBfRlBDX1MpICYgXAorCQkJCQkgUEFTX01BQ19DRkdfVFhQX0ZQQ19NKQorI2RlZmluZSBQQVNfTUFDX0NGR19UWFBfUlQJCTB4MDAwODAwMDAKKyNkZWZpbmUgUEFTX01BQ19DRkdfVFhQX0JMCQkweDAwMDQwMDAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1RYUF9TTF9NCQkweDAwMDMwMDAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1RYUF9TTF9TCQkxNgorI2RlZmluZSBQQVNfTUFDX0NGR19UWFBfU0woeCkJCSgoKHgpIDw8IFBBU19NQUNfQ0ZHX1RYUF9TTF9TKSAmIFwKKwkJCQkJIFBBU19NQUNfQ0ZHX1RYUF9TTF9NKQorI2RlZmluZSBQQVNfTUFDX0NGR19UWFBfQ09CX00JCTB4MDAwMGYwMDAKKyNkZWZpbmUgUEFTX01BQ19DRkdfVFhQX0NPQl9TCQkxMgorI2RlZmluZSBQQVNfTUFDX0NGR19UWFBfQ09CKHgpCQkoKCh4KSA8PCBQQVNfTUFDX0NGR19UWFBfQ09CX1MpICYgXAorCQkJCQkgUEFTX01BQ19DRkdfVFhQX0NPQl9NKQorI2RlZmluZSBQQVNfTUFDX0NGR19UWFBfVElGVF9NCQkweDAwMDAwZjAwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1RYUF9USUZUX1MJCTgKKyNkZWZpbmUgUEFTX01BQ19DRkdfVFhQX1RJRlQoeCkJCSgoKHgpIDw8IFBBU19NQUNfQ0ZHX1RYUF9USUZUX1MpICYgXAorCQkJCQkgUEFTX01BQ19DRkdfVFhQX1RJRlRfTSkKKyNkZWZpbmUgUEFTX01BQ19DRkdfVFhQX1RJRkdfTQkJMHgwMDAwMDBmZgorI2RlZmluZSBQQVNfTUFDX0NGR19UWFBfVElGR19TCQkwCisjZGVmaW5lIFBBU19NQUNfQ0ZHX1RYUF9USUZHKHgpCQkoKCh4KSA8PCBQQVNfTUFDX0NGR19UWFBfVElGR19TKSAmIFwKKwkJCQkJIFBBU19NQUNfQ0ZHX1RYUF9USUZHX00pCisKKyNkZWZpbmUgUEFTX01BQ19JUENfQ0hOTF9EQ0hOT19NCTB4MDAzZjAwMDAKKyNkZWZpbmUgUEFTX01BQ19JUENfQ0hOTF9EQ0hOT19TCTE2CisjZGVmaW5lIFBBU19NQUNfSVBDX0NITkxfRENITk8oeCkJKCgoeCkgPDwgUEFTX01BQ19JUENfQ0hOTF9EQ0hOT19TKSAmIFwKKwkJCQkJIFBBU19NQUNfSVBDX0NITkxfRENITk9fTSkKKyNkZWZpbmUgUEFTX01BQ19JUENfQ0hOTF9CQ0hfTQkJMHgwMDAwMDAzZgorI2RlZmluZSBQQVNfTUFDX0lQQ19DSE5MX0JDSF9TCQkwCisjZGVmaW5lIFBBU19NQUNfSVBDX0NITkxfQkNIKHgpCQkoKCh4KSA8PCBQQVNfTUFDX0lQQ19DSE5MX0JDSF9TKSAmIFwKKwkJCQkJIFBBU19NQUNfSVBDX0NITkxfQkNIX00pCisKKy8qIEFsbCB0aGVzZSByZWdpc3RlcnMgbGl2ZSBpbiB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2UgZm9yIHRoZSBETUEgUENJCisgKiBkZXZpY2UuIFVzZSB0aGUgbm9ybWFsIFBDSSBjb25maWcgYWNjZXNzIGZ1bmN0aW9ucyBmb3IgdGhlbS4KKyAqLworZW51bSB7CisJUEFTX0RNQV9DT01fVFhDTUQgPSAweDEwMCwJLyogVHJhbnNtaXQgQ29tbWFuZCBSZWdpc3RlciAgKi8KKwlQQVNfRE1BX0NPTV9UWFNUQSA9IDB4MTA0LAkvKiBUcmFuc21pdCBTdGF0dXMgUmVnaXN0ZXIgICAqLworCVBBU19ETUFfQ09NX1JYQ01EID0gMHgxMDgsCS8qIFJlY2VpdmUgQ29tbWFuZCBSZWdpc3RlciAgICovCisJUEFTX0RNQV9DT01fUlhTVEEgPSAweDEwYywJLyogUmVjZWl2ZSBTdGF0dXMgUmVnaXN0ZXIgICAgKi8KK307CisjZGVmaW5lIFBBU19ETUFfQ09NX1RYQ01EX0VOCTB4MDAwMDAwMDEgLyogZW5hYmxlICovCisjZGVmaW5lIFBBU19ETUFfQ09NX1RYU1RBX0FDVAkweDAwMDAwMDAxIC8qIGFjdGl2ZSAqLworI2RlZmluZSBQQVNfRE1BX0NPTV9SWENNRF9FTgkweDAwMDAwMDAxIC8qIGVuYWJsZSAqLworI2RlZmluZSBQQVNfRE1BX0NPTV9SWFNUQV9BQ1QJMHgwMDAwMDAwMSAvKiBhY3RpdmUgKi8KKworCisvKiBQZXItaW50ZXJmYWNlIGFuZCBwZXItY2hhbm5lbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgX1BBU19ETUFfUlhJTlRfU1RSSURFCQkweDIwCisjZGVmaW5lIFBBU19ETUFfUlhJTlRfUkNNRFNUQShpKQkoMHgyMDArKGkpKl9QQVNfRE1BX1JYSU5UX1NUUklERSkKKyNkZWZpbmUgICAgUEFTX0RNQV9SWElOVF9SQ01EU1RBX0VOCTB4MDAwMDAwMDEKKyNkZWZpbmUgICAgUEFTX0RNQV9SWElOVF9SQ01EU1RBX1NUCTB4MDAwMDAwMDIKKyNkZWZpbmUgICAgUEFTX0RNQV9SWElOVF9SQ01EU1RBX09PCTB4MDAwMDAxMDAKKyNkZWZpbmUgICAgUEFTX0RNQV9SWElOVF9SQ01EU1RBX0JQCTB4MDAwMDAyMDAKKyNkZWZpbmUgICAgUEFTX0RNQV9SWElOVF9SQ01EU1RBX0RSCTB4MDAwMDA0MDAKKyNkZWZpbmUgICAgUEFTX0RNQV9SWElOVF9SQ01EU1RBX0JUCTB4MDAwMDA4MDAKKyNkZWZpbmUgICAgUEFTX0RNQV9SWElOVF9SQ01EU1RBX1RCCTB4MDAwMDEwMDAKKyNkZWZpbmUgICAgUEFTX0RNQV9SWElOVF9SQ01EU1RBX0FDVAkweDAwMDEwMDAwCisjZGVmaW5lICAgIFBBU19ETUFfUlhJTlRfUkNNRFNUQV9EUk9QU19NCTB4ZmZmZTAwMDAKKyNkZWZpbmUgICAgUEFTX0RNQV9SWElOVF9SQ01EU1RBX0RST1BTX1MJMTcKKyNkZWZpbmUgUEFTX0RNQV9SWElOVF9JTkNSKGkpCQkoMHgyMTArKGkpKl9QQVNfRE1BX1JYSU5UX1NUUklERSkKKyNkZWZpbmUgICAgUEFTX0RNQV9SWElOVF9JTkNSX0lOQ1JfTQkweDAwMDBmZmZmCisjZGVmaW5lICAgIFBBU19ETUFfUlhJTlRfSU5DUl9JTkNSX1MJMAorI2RlZmluZSAgICBQQVNfRE1BX1JYSU5UX0lOQ1JfSU5DUih4KQkoKHgpICYgMHgwMDAwZmZmZikKKyNkZWZpbmUgUEFTX0RNQV9SWElOVF9CQVNFTChpKQkJKDB4MjE4KyhpKSpfUEFTX0RNQV9SWElOVF9TVFJJREUpCisjZGVmaW5lICAgIFBBU19ETUFfUlhJTlRfQkFTRUxfQlJCTCh4KQkoKHgpICYgfjB4M2YpCisjZGVmaW5lIFBBU19ETUFfUlhJTlRfQkFTRVUoaSkJCSgweDIxYysoaSkqX1BBU19ETUFfUlhJTlRfU1RSSURFKQorI2RlZmluZSAgICBQQVNfRE1BX1JYSU5UX0JBU0VVX0JSQkgoeCkJKCh4KSAmIDB4ZmZmKQorI2RlZmluZSAgICBQQVNfRE1BX1JYSU5UX0JBU0VVX1NJWl9NCTB4M2ZmZjAwMDAJLyogIyBvZiBjYWNoZSBsaW5lcyB3b3J0aCBvZiBidWZmZXIgcmluZyAqLworI2RlZmluZSAgICBQQVNfRE1BX1JYSU5UX0JBU0VVX1NJWl9TCTE2CQkvKiAwID0gMTZLICovCisjZGVmaW5lICAgIFBBU19ETUFfUlhJTlRfQkFTRVVfU0laKHgpCSgoKHgpIDw8IFBBU19ETUFfUlhJTlRfQkFTRVVfU0laX1MpICYgXAorCQkJCQkgUEFTX0RNQV9SWElOVF9CQVNFVV9TSVpfTSkKKworCisjZGVmaW5lIF9QQVNfRE1BX1RYQ0hBTl9TVFJJREUJMHgyMCAgICAvKiBTaXplIHBlciBjaGFubmVsCQkqLworI2RlZmluZSBfUEFTX0RNQV9UWENIQU5fVENNRFNUQQkweDMwMAkvKiBDb21tYW5kIC8gU3RhdHVzCQkqLworI2RlZmluZSBfUEFTX0RNQV9UWENIQU5fQ0ZHCTB4MzA0CS8qIENvbmZpZ3VyYXRpb24JCSovCisjZGVmaW5lIF9QQVNfRE1BX1RYQ0hBTl9EU0NSQlUJMHgzMDgJLyogRGVzY3JpcHRvciBCVSBBbGxvY2F0aW9uCSovCisjZGVmaW5lIF9QQVNfRE1BX1RYQ0hBTl9JTkNSCTB4MzEwCS8qIERlc2NyaXB0b3IgaW5jcmVtZW50CQkqLworI2RlZmluZSBfUEFTX0RNQV9UWENIQU5fQ05UCTB4MzE0CS8qIERlc2NyaXB0b3IgY291bnQvb2Zmc2V0CSovCisjZGVmaW5lIF9QQVNfRE1BX1RYQ0hBTl9CQVNFTAkweDMxOAkvKiBEZXNjcmlwdG9yIHJpbmcgYmFzZSAobG93KQkqLworI2RlZmluZSBfUEFTX0RNQV9UWENIQU5fQkFTRVUJMHgzMWMJLyoJCQkoaGlnaCkJKi8KKyNkZWZpbmUgUEFTX0RNQV9UWENIQU5fVENNRFNUQShjKSAoMHgzMDArKGMpKl9QQVNfRE1BX1RYQ0hBTl9TVFJJREUpCisjZGVmaW5lICAgIFBBU19ETUFfVFhDSEFOX1RDTURTVEFfRU4JMHgwMDAwMDAwMQkvKiBFbmFibGVkICovCisjZGVmaW5lICAgIFBBU19ETUFfVFhDSEFOX1RDTURTVEFfU1QJMHgwMDAwMDAwMgkvKiBTdG9wIGludGVyZmFjZSAqLworI2RlZmluZSAgICBQQVNfRE1BX1RYQ0hBTl9UQ01EU1RBX0FDVAkweDAwMDEwMDAwCS8qIEFjdGl2ZSAqLworI2RlZmluZSBQQVNfRE1BX1RYQ0hBTl9DRkcoYykgICAgICgweDMwNCsoYykqX1BBU19ETUFfVFhDSEFOX1NUUklERSkKKyNkZWZpbmUgICAgUEFTX0RNQV9UWENIQU5fQ0ZHX1RZX0lGQUNFCTB4MDAwMDAwMDAJLyogVHlwZSA9IGludGVyZmFjZSAqLworI2RlZmluZSAgICBQQVNfRE1BX1RYQ0hBTl9DRkdfVEFUVFJfTQkweDAwMDAwMDNjCisjZGVmaW5lICAgIFBBU19ETUFfVFhDSEFOX0NGR19UQVRUUl9TCTIKKyNkZWZpbmUgICAgUEFTX0RNQV9UWENIQU5fQ0ZHX1RBVFRSKHgpCSgoKHgpIDw8IFBBU19ETUFfVFhDSEFOX0NGR19UQVRUUl9TKSAmIFwKKwkJCQkJIFBBU19ETUFfVFhDSEFOX0NGR19UQVRUUl9NKQorI2RlZmluZSAgICBQQVNfRE1BX1RYQ0hBTl9DRkdfV1RfTQkweDAwMDAwMWMwCisjZGVmaW5lICAgIFBBU19ETUFfVFhDSEFOX0NGR19XVF9TCTYKKyNkZWZpbmUgICAgUEFTX0RNQV9UWENIQU5fQ0ZHX1dUKHgpCSgoKHgpIDw8IFBBU19ETUFfVFhDSEFOX0NGR19XVF9TKSAmIFwKKwkJCQkJIFBBU19ETUFfVFhDSEFOX0NGR19XVF9NKQorI2RlZmluZSAgICBQQVNfRE1BX1RYQ0hBTl9DRkdfQ0YJMHgwMDAwMTAwMAkvKiBDbGVhbiBmaXJzdCBsaW5lICovCisjZGVmaW5lICAgIFBBU19ETUFfVFhDSEFOX0NGR19DTAkweDAwMDAyMDAwCS8qIENsZWFuIGxhc3QgbGluZSAqLworI2RlZmluZSAgICBQQVNfRE1BX1RYQ0hBTl9DRkdfVVAJMHgwMDAwNDAwMAkvKiB1cGRhdGUgdHggZGVzY3Igd2hlbiBzZW50ICovCisjZGVmaW5lIFBBU19ETUFfVFhDSEFOX0lOQ1IoYykgICAgKDB4MzEwKyhjKSpfUEFTX0RNQV9UWENIQU5fU1RSSURFKQorI2RlZmluZSBQQVNfRE1BX1RYQ0hBTl9CQVNFTChjKSAgICgweDMxOCsoYykqX1BBU19ETUFfVFhDSEFOX1NUUklERSkKKyNkZWZpbmUgICAgUEFTX0RNQV9UWENIQU5fQkFTRUxfQlJCTF9NCTB4ZmZmZmZmYzAKKyNkZWZpbmUgICAgUEFTX0RNQV9UWENIQU5fQkFTRUxfQlJCTF9TCTAKKyNkZWZpbmUgICAgUEFTX0RNQV9UWENIQU5fQkFTRUxfQlJCTCh4KQkoKCh4KSA8PCBQQVNfRE1BX1RYQ0hBTl9CQVNFTF9CUkJMX1MpICYgXAorCQkJCQkgUEFTX0RNQV9UWENIQU5fQkFTRUxfQlJCTF9NKQorI2RlZmluZSBQQVNfRE1BX1RYQ0hBTl9CQVNFVShjKSAgICgweDMxYysoYykqX1BBU19ETUFfVFhDSEFOX1NUUklERSkKKyNkZWZpbmUgICAgUEFTX0RNQV9UWENIQU5fQkFTRVVfQlJCSF9NCTB4MDAwMDBmZmYKKyNkZWZpbmUgICAgUEFTX0RNQV9UWENIQU5fQkFTRVVfQlJCSF9TCTAKKyNkZWZpbmUgICAgUEFTX0RNQV9UWENIQU5fQkFTRVVfQlJCSCh4KQkoKCh4KSA8PCBQQVNfRE1BX1RYQ0hBTl9CQVNFVV9CUkJIX1MpICYgXAorCQkJCQkgUEFTX0RNQV9UWENIQU5fQkFTRVVfQlJCSF9NKQorLyogIyBvZiBjYWNoZSBsaW5lcyB3b3J0aCBvZiBidWZmZXIgcmluZyAqLworI2RlZmluZSAgICBQQVNfRE1BX1RYQ0hBTl9CQVNFVV9TSVpfTQkweDNmZmYwMDAwCisjZGVmaW5lICAgIFBBU19ETUFfVFhDSEFOX0JBU0VVX1NJWl9TCTE2CQkvKiAwID0gMTZLICovCisjZGVmaW5lICAgIFBBU19ETUFfVFhDSEFOX0JBU0VVX1NJWih4KQkoKCh4KSA8PCBQQVNfRE1BX1RYQ0hBTl9CQVNFVV9TSVpfUykgJiBcCisJCQkJCSBQQVNfRE1BX1RYQ0hBTl9CQVNFVV9TSVpfTSkKKworI2RlZmluZSBfUEFTX0RNQV9SWENIQU5fU1RSSURFCTB4MjAgICAgLyogU2l6ZSBwZXIgY2hhbm5lbAkJKi8KKyNkZWZpbmUgX1BBU19ETUFfUlhDSEFOX0NDTURTVEEJMHg4MDAJLyogQ29tbWFuZCAvIFN0YXR1cwkJKi8KKyNkZWZpbmUgX1BBU19ETUFfUlhDSEFOX0NGRwkweDgwNAkvKiBDb25maWd1cmF0aW9uCQkqLworI2RlZmluZSBfUEFTX0RNQV9SWENIQU5fSU5DUgkweDgxMAkvKiBEZXNjcmlwdG9yIGluY3JlbWVudAkJKi8KKyNkZWZpbmUgX1BBU19ETUFfUlhDSEFOX0NOVAkweDgxNAkvKiBEZXNjcmlwdG9yIGNvdW50L29mZnNldAkqLworI2RlZmluZSBfUEFTX0RNQV9SWENIQU5fQkFTRUwJMHg4MTgJLyogRGVzY3JpcHRvciByaW5nIGJhc2UgKGxvdykJKi8KKyNkZWZpbmUgX1BBU19ETUFfUlhDSEFOX0JBU0VVCTB4ODFjCS8qCQkJKGhpZ2gpCSovCisjZGVmaW5lIFBBU19ETUFfUlhDSEFOX0NDTURTVEEoYykgKDB4ODAwKyhjKSpfUEFTX0RNQV9SWENIQU5fU1RSSURFKQorI2RlZmluZSAgICBQQVNfRE1BX1JYQ0hBTl9DQ01EU1RBX0VOCTB4MDAwMDAwMDEJLyogRW5hYmxlZCAqLworI2RlZmluZSAgICBQQVNfRE1BX1JYQ0hBTl9DQ01EU1RBX1NUCTB4MDAwMDAwMDIJLyogU3RvcCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgICAgUEFTX0RNQV9SWENIQU5fQ0NNRFNUQV9BQ1QJMHgwMDAxMDAwMAkvKiBBY3RpdmUgKi8KKyNkZWZpbmUgICAgUEFTX0RNQV9SWENIQU5fQ0NNRFNUQV9EVQkweDAwMDIwMDAwCisjZGVmaW5lIFBBU19ETUFfUlhDSEFOX0NGRyhjKSAgICAgKDB4ODA0KyhjKSpfUEFTX0RNQV9SWENIQU5fU1RSSURFKQorI2RlZmluZSAgICBQQVNfRE1BX1JYQ0hBTl9DRkdfSEJVX00JMHgwMDAwMDM4MAorI2RlZmluZSAgICBQQVNfRE1BX1JYQ0hBTl9DRkdfSEJVX1MJNworI2RlZmluZSAgICBQQVNfRE1BX1JYQ0hBTl9DRkdfSEJVKHgpCSgoKHgpIDw8IFBBU19ETUFfUlhDSEFOX0NGR19IQlVfUykgJiBcCisJCQkJCSBQQVNfRE1BX1JYQ0hBTl9DRkdfSEJVX00pCisjZGVmaW5lIFBBU19ETUFfUlhDSEFOX0lOQ1IoYykgICAgKDB4ODEwKyhjKSpfUEFTX0RNQV9SWENIQU5fU1RSSURFKQorI2RlZmluZSBQQVNfRE1BX1JYQ0hBTl9CQVNFTChjKSAgICgweDgxOCsoYykqX1BBU19ETUFfUlhDSEFOX1NUUklERSkKKyNkZWZpbmUgICAgUEFTX0RNQV9SWENIQU5fQkFTRUxfQlJCTF9NCTB4ZmZmZmZmYzAKKyNkZWZpbmUgICAgUEFTX0RNQV9SWENIQU5fQkFTRUxfQlJCTF9TCTAKKyNkZWZpbmUgICAgUEFTX0RNQV9SWENIQU5fQkFTRUxfQlJCTCh4KQkoKCh4KSA8PCBQQVNfRE1BX1JYQ0hBTl9CQVNFTF9CUkJMX1MpICYgXAorCQkJCQkgUEFTX0RNQV9SWENIQU5fQkFTRUxfQlJCTF9NKQorI2RlZmluZSBQQVNfRE1BX1JYQ0hBTl9CQVNFVShjKSAgICgweDgxYysoYykqX1BBU19ETUFfUlhDSEFOX1NUUklERSkKKyNkZWZpbmUgICAgUEFTX0RNQV9SWENIQU5fQkFTRVVfQlJCSF9NCTB4MDAwMDBmZmYKKyNkZWZpbmUgICAgUEFTX0RNQV9SWENIQU5fQkFTRVVfQlJCSF9TCTAKKyNkZWZpbmUgICAgUEFTX0RNQV9SWENIQU5fQkFTRVVfQlJCSCh4KQkoKCh4KSA8PCBQQVNfRE1BX1JYQ0hBTl9CQVNFVV9CUkJIX1MpICYgXAorCQkJCQkgUEFTX0RNQV9SWENIQU5fQkFTRVVfQlJCSF9NKQorLyogIyBvZiBjYWNoZSBsaW5lcyB3b3J0aCBvZiBidWZmZXIgcmluZyAqLworI2RlZmluZSAgICBQQVNfRE1BX1JYQ0hBTl9CQVNFVV9TSVpfTQkweDNmZmYwMDAwCisjZGVmaW5lICAgIFBBU19ETUFfUlhDSEFOX0JBU0VVX1NJWl9TCTE2CQkvKiAwID0gMTZLICovCisjZGVmaW5lICAgIFBBU19ETUFfUlhDSEFOX0JBU0VVX1NJWih4KQkoKCh4KSA8PCBQQVNfRE1BX1JYQ0hBTl9CQVNFVV9TSVpfUykgJiBcCisJCQkJCSBQQVNfRE1BX1JYQ0hBTl9CQVNFVV9TSVpfTSkKKworI2RlZmluZSAgICBQQVNfU1RBVFVTX1BDTlRfTQkJMHgwMDAwMDAwMDAwMDBmZmZmdWxsCisjZGVmaW5lICAgIFBBU19TVEFUVVNfUENOVF9TCQkwCisjZGVmaW5lICAgIFBBU19TVEFUVVNfRENOVF9NCQkweDAwMDAwMDAwZmZmZjAwMDB1bGwKKyNkZWZpbmUgICAgUEFTX1NUQVRVU19EQ05UX1MJCTE2CisjZGVmaW5lICAgIFBBU19TVEFUVVNfQlBDTlRfTQkJMHgwMDAwZmZmZjAwMDAwMDAwdWxsCisjZGVmaW5lICAgIFBBU19TVEFUVVNfQlBDTlRfUwkJMzIKKyNkZWZpbmUgICAgUEFTX1NUQVRVU19USU1FUgkJMHgxMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lICAgIFBBU19TVEFUVVNfRVJST1IJCTB4MjAwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgICBQQVNfU1RBVFVTX1NPRlQJCTB4NDAwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSAgICBQQVNfU1RBVFVTX0lOVAkJMHg4MDAwMDAwMDAwMDAwMDAwdWxsCisKKyNkZWZpbmUgUEFTX0lPQl9ETUFfUlhDSF9DRkcoaSkJCSgweDExMDAgKyAoaSkqNCkKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfUlhDSF9DRkdfQ05UVEhfTQkJMHgwMDAwMGZmZgorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9SWENIX0NGR19DTlRUSF9TCQkwCisjZGVmaW5lICAgIFBBU19JT0JfRE1BX1JYQ0hfQ0ZHX0NOVFRIKHgpCSgoKHgpIDw8IFBBU19JT0JfRE1BX1JYQ0hfQ0ZHX0NOVFRIX1MpICYgXAorCQkJCQkJIFBBU19JT0JfRE1BX1JYQ0hfQ0ZHX0NOVFRIX00pCisjZGVmaW5lIFBBU19JT0JfRE1BX1RYQ0hfQ0ZHKGkpCQkoMHgxMjAwICsgKGkpKjQpCisjZGVmaW5lICAgIFBBU19JT0JfRE1BX1RYQ0hfQ0ZHX0NOVFRIX00JCTB4MDAwMDBmZmYKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfVFhDSF9DRkdfQ05UVEhfUwkJMAorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9UWENIX0NGR19DTlRUSCh4KQkoKCh4KSA8PCBQQVNfSU9CX0RNQV9UWENIX0NGR19DTlRUSF9TKSAmIFwKKwkJCQkJCSBQQVNfSU9CX0RNQV9UWENIX0NGR19DTlRUSF9NKQorI2RlZmluZSBQQVNfSU9CX0RNQV9SWENIX1NUQVQoaSkJKDB4MTMwMCArIChpKSo0KQorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9SWENIX1NUQVRfSU5UR0VOCTB4MDAwMDEwMDAKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfUlhDSF9TVEFUX0NOVERFTF9NCTB4MDAwMDBmZmYKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfUlhDSF9TVEFUX0NOVERFTF9TCTAKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfUlhDSF9TVEFUX0NOVERFTCh4KQkoKCh4KSA8PCBQQVNfSU9CX0RNQV9SWENIX1NUQVRfQ05UREVMX1MpICZcCisJCQkJCQkgUEFTX0lPQl9ETUFfUlhDSF9TVEFUX0NOVERFTF9NKQorI2RlZmluZSBQQVNfSU9CX0RNQV9UWENIX1NUQVQoaSkJKDB4MTQwMCArIChpKSo0KQorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9UWENIX1NUQVRfSU5UR0VOCTB4MDAwMDEwMDAKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfVFhDSF9TVEFUX0NOVERFTF9NCTB4MDAwMDBmZmYKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfVFhDSF9TVEFUX0NOVERFTF9TCTAKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfVFhDSF9TVEFUX0NOVERFTCh4KQkoKCh4KSA8PCBQQVNfSU9CX0RNQV9UWENIX1NUQVRfQ05UREVMX1MpICZcCisJCQkJCQkgUEFTX0lPQl9ETUFfVFhDSF9TVEFUX0NOVERFTF9NKQorI2RlZmluZSBQQVNfSU9CX0RNQV9SWENIX1JFU0VUKGkpCSgweDE1MDAgKyAoaSkqNCkKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfUlhDSF9SRVNFVF9QQ05UX00JMHhmZmZmMDAwMAorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9SWENIX1JFU0VUX1BDTlRfUwkwCisjZGVmaW5lICAgIFBBU19JT0JfRE1BX1JYQ0hfUkVTRVRfUENOVCh4KQkoKCh4KSA8PCBQQVNfSU9CX0RNQV9SWENIX1JFU0VUX1BDTlRfUykgJiBcCisJCQkJCQkgUEFTX0lPQl9ETUFfUlhDSF9SRVNFVF9QQ05UX00pCisjZGVmaW5lICAgIFBBU19JT0JfRE1BX1JYQ0hfUkVTRVRfUENOVFJTVAkweDAwMDAwMDIwCisjZGVmaW5lICAgIFBBU19JT0JfRE1BX1JYQ0hfUkVTRVRfRENOVFJTVAkweDAwMDAwMDEwCisjZGVmaW5lICAgIFBBU19JT0JfRE1BX1JYQ0hfUkVTRVRfVElOVEMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfUlhDSF9SRVNFVF9ESU5UQwkJMHgwMDAwMDAwNAorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9SWENIX1JFU0VUX1NJTlRDCQkweDAwMDAwMDAyCisjZGVmaW5lICAgIFBBU19JT0JfRE1BX1JYQ0hfUkVTRVRfUElOVEMJCTB4MDAwMDAwMDEKKyNkZWZpbmUgUEFTX0lPQl9ETUFfVFhDSF9SRVNFVChpKQkoMHgxNjAwICsgKGkpKjQpCisjZGVmaW5lICAgIFBBU19JT0JfRE1BX1RYQ0hfUkVTRVRfUENOVF9NCTB4ZmZmZjAwMDAKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfVFhDSF9SRVNFVF9QQ05UX1MJMAorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9UWENIX1JFU0VUX1BDTlQoeCkJKCgoeCkgPDwgUEFTX0lPQl9ETUFfVFhDSF9SRVNFVF9QQ05UX1MpICYgXAorCQkJCQkJIFBBU19JT0JfRE1BX1RYQ0hfUkVTRVRfUENOVF9NKQorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9UWENIX1JFU0VUX1BDTlRSU1QJMHgwMDAwMDAyMAorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9UWENIX1JFU0VUX0RDTlRSU1QJMHgwMDAwMDAxMAorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9UWENIX1JFU0VUX1RJTlRDCQkweDAwMDAwMDA4CisjZGVmaW5lICAgIFBBU19JT0JfRE1BX1RYQ0hfUkVTRVRfRElOVEMJCTB4MDAwMDAwMDQKKyNkZWZpbmUgICAgUEFTX0lPQl9ETUFfVFhDSF9SRVNFVF9TSU5UQwkJMHgwMDAwMDAwMgorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9UWENIX1JFU0VUX1BJTlRDCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgUEFTX0lPQl9ETUFfQ09NX1RJTUVPVVRDRkcJCTB4MTcwMAorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9DT01fVElNRU9VVENGR19UQ05UX00JMHgwMGZmZmZmZgorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9DT01fVElNRU9VVENGR19UQ05UX1MJMAorI2RlZmluZSAgICBQQVNfSU9CX0RNQV9DT01fVElNRU9VVENGR19UQ05UKHgpCSgoKHgpIDw8IFBBU19JT0JfRE1BX0NPTV9USU1FT1VUQ0ZHX1RDTlRfUykgJiBcCisJCQkJCQkgUEFTX0lPQl9ETUFfQ09NX1RJTUVPVVRDRkdfVENOVF9NKQorCisvKiBUcmFuc21pdCBkZXNjcmlwdG9yIGZpZWxkcyAqLworI2RlZmluZQlYQ1RfTUFDVFhfVAkJMHg4MDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lCVhDVF9NQUNUWF9TVAkJMHg0MDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF9OT1JFUwkJMHgwMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF84QlJFUwkJMHgxMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF8yNEJSRVMJMHgyMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF80MEJSRVMJMHgzMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF9JCQkweDA4MDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1RYX08JCTB4MDQwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDVFhfRQkJMHgwMjAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF9WTEFOX00JMHgwMTgwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF9WTEFOX05PUAkweDAwMDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1RYX1ZMQU5fUkVNT1ZFCTB4MDA4MDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDVFhfVkxBTl9JTlNFUlQgICAweDAxMDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1RYX1ZMQU5fUkVQTEFDRSAgMHgwMTgwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF9DUkNfTQkJMHgwMDYwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF9DUkNfTk9QCTB4MDAwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDVFhfQ1JDX0lOU0VSVAkweDAwMjAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1RYX0NSQ19QQUQJMHgwMDQwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF9DUkNfUkVQTEFDRQkweDAwNjAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1RYX1NTCQkweDAwMTAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1RYX0xMRU5fTQkweDAwMDA3ZmZmMDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1RYX0xMRU5fUwkzMnVsbAorI2RlZmluZSBYQ1RfTUFDVFhfTExFTih4KQkoKCgobG9uZykoeCkpIDw8IFhDVF9NQUNUWF9MTEVOX1MpICYgXAorCQkJCSBYQ1RfTUFDVFhfTExFTl9NKQorI2RlZmluZSBYQ1RfTUFDVFhfSVBIX00JCTB4MDAwMDAwMDBmODAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDVFhfSVBIX1MJCTI3dWxsCisjZGVmaW5lIFhDVF9NQUNUWF9JUEgoeCkJKCgoKGxvbmcpKHgpKSA8PCBYQ1RfTUFDVFhfSVBIX1MpICYgXAorCQkJCSBYQ1RfTUFDVFhfSVBIX00pCisjZGVmaW5lIFhDVF9NQUNUWF9JUE9fTQkJMHgwMDAwMDAwMDA3YzAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF9JUE9fUwkJMjJ1bGwKKyNkZWZpbmUgWENUX01BQ1RYX0lQTyh4KQkoKCgobG9uZykoeCkpIDw8IFhDVF9NQUNUWF9JUE9fUykgJiBcCisJCQkJIFhDVF9NQUNUWF9JUE9fTSkKKyNkZWZpbmUgWENUX01BQ1RYX0NTVU1fTQkweDAwMDAwMDAwMDAwMDAwNjB1bGwKKyNkZWZpbmUgWENUX01BQ1RYX0NTVU1fTk9QCTB4MDAwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDVFhfQ1NVTV9UQ1AJMHgwMDAwMDAwMDAwMDAwMDQwdWxsCisjZGVmaW5lIFhDVF9NQUNUWF9DU1VNX1VEUAkweDAwMDAwMDAwMDAwMDAwNjB1bGwKKyNkZWZpbmUgWENUX01BQ1RYX1Y2CQkweDAwMDAwMDAwMDAwMDAwMTB1bGwKKyNkZWZpbmUgWENUX01BQ1RYX0MJCTB4MDAwMDAwMDAwMDAwMDAwNHVsbAorI2RlZmluZSBYQ1RfTUFDVFhfQUwyCQkweDAwMDAwMDAwMDAwMDAwMDJ1bGwKKworLyogUmVjZWl2ZSBkZXNjcmlwdG9yIGZpZWxkcyAqLworI2RlZmluZQlYQ1RfTUFDUlhfVAkJMHg4MDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lCVhDVF9NQUNSWF9TVAkJMHg0MDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF9OT1JFUwkJMHgwMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF84QlJFUwkJMHgxMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF8yNEJSRVMJMHgyMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF80MEJSRVMJMHgzMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF9PCQkweDA0MDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1JYX0UJCTB4MDIwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfRkYJCTB4MDEwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfUEYJCTB4MDA4MDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfT0IJCTB4MDA0MDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfT0QJCTB4MDAyMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfRlMJCTB4MDAxMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfTkJfTQkJMHgwMDBmYzAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF9OQl9TCQk0NlVMTAorI2RlZmluZSBYQ1RfTUFDUlhfTkIoeCkJCSgoKChsb25nKSh4KSkgPDwgWENUX01BQ1JYX05CX1MpICYgXAorCQkJCSBYQ1RfTUFDUlhfTkJfTSkKKyNkZWZpbmUgWENUX01BQ1JYX0xMRU5fTQkweDAwMDAzZmZmMDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1JYX0xMRU5fUwkzMlVMTAorI2RlZmluZSBYQ1RfTUFDUlhfTExFTih4KQkoKCgobG9uZykoeCkpIDw8IFhDVF9NQUNSWF9MTEVOX1MpICYgXAorCQkJCSBYQ1RfTUFDUlhfTExFTl9NKQorI2RlZmluZSBYQ1RfTUFDUlhfQ1JDCQkweDAwMDAwMDAwODAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1JYX0xFTl9NCQkweDAwMDAwMDAwNjAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1JYX0xFTl9UT09TSE9SVAkweDAwMDAwMDAwMjAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1JYX0xFTl9CRUxPV01JTgkweDAwMDAwMDAwNDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1JYX0xFTl9UUlVOQwkweDAwMDAwMDAwNjAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1JYX0NBU1RfTQkweDAwMDAwMDAwMTgwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1JYX0NBU1RfVU5JCTB4MDAwMDAwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfQ0FTVF9NVUxUSQkweDAwMDAwMDAwMDgwMDAwMDB1bGwKKyNkZWZpbmUgWENUX01BQ1JYX0NBU1RfQlJPQUQJMHgwMDAwMDAwMDEwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF9DQVNUX1BBVVNFCTB4MDAwMDAwMDAxODAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfVkxDX00JCTB4MDAwMDAwMDAwNjAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfRk0JCTB4MDAwMDAwMDAwMTAwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfSFRZX00JCTB4MDAwMDAwMDAwMGMwMDAwMHVsbAorI2RlZmluZSBYQ1RfTUFDUlhfSFRZX0lQVjRfT0sJMHgwMDAwMDAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF9IVFlfSVBWNiAJMHgwMDAwMDAwMDAwNDAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF9IVFlfSVBWNF9CQUQJMHgwMDAwMDAwMDAwODAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF9IVFlfTk9OSVAJMHgwMDAwMDAwMDAwYzAwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF9JUFBfTQkJMHgwMDAwMDAwMDAwM2YwMDAwdWxsCisjZGVmaW5lIFhDVF9NQUNSWF9JUFBfUwkJMTYKKyNkZWZpbmUgWENUX01BQ1JYX0NTVU1fTQkweDAwMDAwMDAwMDAwMGZmZmZ1bGwKKyNkZWZpbmUgWENUX01BQ1JYX0NTVU1fUwkwCisKKyNkZWZpbmUgWENUX1BUUl9UCQkweDgwMDAwMDAwMDAwMDAwMDB1bGwKKyNkZWZpbmUgWENUX1BUUl9MRU5fTQkJMHg3ZmZmZjAwMDAwMDAwMDAwdWxsCisjZGVmaW5lIFhDVF9QVFJfTEVOX1MJCTQ0CisjZGVmaW5lIFhDVF9QVFJfTEVOKHgpCQkoKCgobG9uZykoeCkpIDw8IFhDVF9QVFJfTEVOX1MpICYgXAorCQkJCSBYQ1RfUFRSX0xFTl9NKQorI2RlZmluZSBYQ1RfUFRSX0FERFJfTQkJMHgwMDAwMGZmZmZmZmZmZmZmdWxsCisjZGVmaW5lIFhDVF9QVFJfQUREUl9TCQkwCisjZGVmaW5lIFhDVF9QVFJfQUREUih4KQkJKCgoKGxvbmcpKHgpKSA8PCBYQ1RfUFRSX0FERFJfUykgJiBcCisJCQkJIFhDVF9QVFJfQUREUl9NKQorCisvKiBSZWNlaXZlIGludGVyZmFjZSBidWZmZXIgZmllbGRzICovCisjZGVmaW5lIFhDVF9SWEJfTEVOX00JCTB4MGZmZmYwMDAwMDAwMDAwMHVsbAorI2RlZmluZSBYQ1RfUlhCX0xFTl9TCQk0NAorI2RlZmluZSBYQ1RfUlhCX0xFTih4KQkJKCgoKGxvbmcpKHgpKSA8PCBYQ1RfUFRSX0xFTl9TKSAmIFhDVF9QVFJfTEVOX00pCisjZGVmaW5lIFhDVF9SWEJfQUREUl9NCQkweDAwMDAwZmZmZmZmZmZmZmZ1bGwKKyNkZWZpbmUgWENUX1JYQl9BRERSX1MJCTAKKyNkZWZpbmUgWENUX1JYQl9BRERSKHgpCQkoKCgobG9uZykoeCkpIDw8IFhDVF9QVFJfQUREUl9TKSAmIFhDVF9QVFJfQUREUl9NKQorCisKKyNlbmRpZiAvKiBQQVNFTUlfTUFDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3FsYTN4eHguYyBiL2RyaXZlcnMvbmV0L3FsYTN4eHguYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDg4NDRjMjAuLjI0MjliMjcKLS0tIGEvZHJpdmVycy9uZXQvcWxhM3h4eC5jCisrKyBiL2RyaXZlcnMvbmV0L3FsYTN4eHguYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CkBAIC02Myw2ICs2NCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBxbDN4eHhfcGNpX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9RTE9HSUMsIFFMMzAyMl9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1FMT0dJQywgUUwzMDMyX0RFVklDRV9JRCl9LAogCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KIAl7MCx9CiB9OwpAQCAtMTQ3NSw2ICsxNDc3LDEwIEBACiAJCQkgMikgPDwgNykpCiAJCXJldHVybiAtMTsKIAorCWlmIChxZGV2LT5kZXZpY2VfaWQgPT0gUUwzMDMyX0RFVklDRV9JRCkKKwkJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsIAorCQkJJnBvcnRfcmVncy0+bWFjTUlJTWdtdENvbnRyb2xSZWcsIDB4MGYwMDAwMCk7CisKIAkvKiBEaXZpZGUgMTI1TUh6IGNsb2NrIGJ5IDI4IHRvIG1lZXQgUEhZIHRpbWluZyByZXF1aXJlbWVudHMgKi8KIAlyZWcgPSBNQUNfTUlJX0NPTlRST0xfQ0xLX1NFTF9ESVYyODsKIApAQCAtMTcwNiwxOCArMTcxMiw0MiBAQAogCQkJCSAgIHN0cnVjdCBvYl9tYWNfaW9jYl9yc3AgKm1hY19yc3ApCiB7CiAJc3RydWN0IHFsX3R4X2J1Zl9jYiAqdHhfY2I7CisJaW50IGk7CiAKIAl0eF9jYiA9ICZxZGV2LT50eF9idWZbbWFjX3JzcC0+dHJhbnNhY3Rpb25faWRdOwogCXBjaV91bm1hcF9zaW5nbGUocWRldi0+cGRldiwKLQkJCSBwY2lfdW5tYXBfYWRkcih0eF9jYiwgbWFwYWRkciksCi0JCQkgcGNpX3VubWFwX2xlbih0eF9jYiwgbWFwbGVuKSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JZGV2X2tmcmVlX3NrYl9pcnEodHhfY2ItPnNrYik7CisJCQkgcGNpX3VubWFwX2FkZHIoJnR4X2NiLT5tYXBbMF0sIG1hcGFkZHIpLAorCQkJIHBjaV91bm1hcF9sZW4oJnR4X2NiLT5tYXBbMF0sIG1hcGxlbiksCisJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJdHhfY2ItPnNlZ19jb3VudC0tOworCWlmICh0eF9jYi0+c2VnX2NvdW50KSB7CisJCWZvciAoaSA9IDE7IGkgPCB0eF9jYi0+c2VnX2NvdW50OyBpKyspIHsKKwkJCXBjaV91bm1hcF9wYWdlKHFkZXYtPnBkZXYsCisJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKCZ0eF9jYi0+bWFwW2ldLAorCQkJCQkJICAgICAgbWFwYWRkciksCisJCQkJICAgICAgIHBjaV91bm1hcF9sZW4oJnR4X2NiLT5tYXBbaV0sIG1hcGxlbiksCisJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQl9CisJfQogCXFkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAlxZGV2LT5zdGF0cy50eF9ieXRlcyArPSB0eF9jYi0+c2tiLT5sZW47CisJZGV2X2tmcmVlX3NrYl9pcnEodHhfY2ItPnNrYik7CiAJdHhfY2ItPnNrYiA9IE5VTEw7CiAJYXRvbWljX2luYygmcWRldi0+dHhfY291bnQpOwogfQogCisvKgorICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAzMDIyIGFuZCAzMDMyIGZvciBpbmJvdW5kIGNvbXBsZXRpb25zOgorICogMzAyMiB1c2VzIHR3byBidWZmZXJzIHBlciBjb21wbGV0aW9uLiAgVGhlIGZpcnN0IGJ1ZmZlciBjb250YWlucyAKKyAqIChzb21lKSBoZWFkZXIgaW5mbywgdGhlIHNlY29uZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBoZWFkZXJzIHBsdXMgCisgKiB0aGUgZGF0YS4gIEZvciB0aGlzIGNoaXAgd2UgcmVzZXJ2ZSBzb21lIHNwYWNlIGF0IHRoZSB0b3Agb2YgdGhlIAorICogcmVjZWl2ZSBidWZmZXIgc28gdGhhdCB0aGUgaGVhZGVyIGluZm8gaW4gYnVmZmVyIG9uZSBjYW4gYmUgCisgKiBwcmVwZW5kZWQgdG8gdGhlIGJ1ZmZlciB0d28uICBCdWZmZXIgdHdvIGlzIHRoZSBzZW50IHVwIHdoaWxlIAorICogYnVmZmVyIG9uZSBpcyByZXR1cm5lZCB0byB0aGUgaGFyZHdhcmUgdG8gYmUgcmV1c2VkLgorICogMzAzMiByZWNlaXZlcyBhbGwgb2YgaXQncyBkYXRhIGFuZCBoZWFkZXJzIGluIG9uZSBidWZmZXIgZm9yIGEgCisgKiBzaW1wbGVyIHByb2Nlc3MuICAzMDMyIGFsc28gc3VwcG9ydHMgY2hlY2tzdW0gdmVyaWZpY2F0aW9uIGFzCisgKiBjYW4gYmUgc2VlbiBpbiBxbF9wcm9jZXNzX21hY2lwX3J4X2ludHIoKS4KKyAqLwogc3RhdGljIHZvaWQgcWxfcHJvY2Vzc19tYWNfcnhfaW50cihzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYsCiAJCQkJICAgc3RydWN0IGliX21hY19pb2NiX3JzcCAqaWJfbWFjX3JzcF9wdHIpCiB7CkBAIC0xNzQwLDE0ICsxNzcwLDE3IEBACiAJcWRldi0+bGFzdF9yc3Bfb2Zmc2V0ID0gcWRldi0+c21hbGxfYnVmX3BoeV9hZGRyX2xvdyArIG9mZnNldDsKIAlxZGV2LT5zbWFsbF9idWZfcmVsZWFzZV9jbnQrKzsKIAotCS8qIHN0YXJ0IG9mIGZpcnN0IGJ1ZmZlciAqLwotCWxyZ19idWZfcGh5X2FkZHJfbG93ID0gbGUzMl90b19jcHUoKmN1cnJfaWFsX3B0cik7Ci0JbHJnX2J1Zl9jYjEgPSAmcWRldi0+bHJnX2J1ZltxZGV2LT5scmdfYnVmX2luZGV4XTsKLQlxZGV2LT5scmdfYnVmX3JlbGVhc2VfY250Kys7Ci0JaWYgKCsrcWRldi0+bHJnX2J1Zl9pbmRleCA9PSBOVU1fTEFSR0VfQlVGRkVSUykKLQkJcWRldi0+bHJnX2J1Zl9pbmRleCA9IDA7Ci0JY3Vycl9pYWxfcHRyKys7CQkvKiA2NC1iaXQgcG9pbnRlcnMgcmVxdWlyZSB0d28gaW5jcy4gKi8KLQljdXJyX2lhbF9wdHIrKzsKKwlpZiAocWRldi0+ZGV2aWNlX2lkID09IFFMMzAyMl9ERVZJQ0VfSUQpIHsKKwkJLyogc3RhcnQgb2YgZmlyc3QgYnVmZmVyICgzMDIyIG9ubHkpICovCisJCWxyZ19idWZfcGh5X2FkZHJfbG93ID0gbGUzMl90b19jcHUoKmN1cnJfaWFsX3B0cik7CisJCWxyZ19idWZfY2IxID0gJnFkZXYtPmxyZ19idWZbcWRldi0+bHJnX2J1Zl9pbmRleF07CisJCXFkZXYtPmxyZ19idWZfcmVsZWFzZV9jbnQrKzsKKwkJaWYgKCsrcWRldi0+bHJnX2J1Zl9pbmRleCA9PSBOVU1fTEFSR0VfQlVGRkVSUykgeworCQkJcWRldi0+bHJnX2J1Zl9pbmRleCA9IDA7CisJCX0KKwkJY3Vycl9pYWxfcHRyKys7CS8qIDY0LWJpdCBwb2ludGVycyByZXF1aXJlIHR3byBpbmNzLiAqLworCQljdXJyX2lhbF9wdHIrKzsKKwl9CiAKIAkvKiBzdGFydCBvZiBzZWNvbmQgYnVmZmVyICovCiAJbHJnX2J1Zl9waHlfYWRkcl9sb3cgPSBsZTMyX3RvX2NwdSgqY3Vycl9pYWxfcHRyKTsKQEAgLTE3NzgsNyArMTgxMSw4IEBACiAJcWRldi0+bmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJbHJnX2J1Zl9jYjItPnNrYiA9IE5VTEw7CiAKLQlxbF9yZWxlYXNlX3RvX2xyZ19idWZfZnJlZV9saXN0KHFkZXYsIGxyZ19idWZfY2IxKTsKKwlpZiAocWRldi0+ZGV2aWNlX2lkID09IFFMMzAyMl9ERVZJQ0VfSUQpCisJCXFsX3JlbGVhc2VfdG9fbHJnX2J1Zl9mcmVlX2xpc3QocWRldiwgbHJnX2J1Zl9jYjEpOwogCXFsX3JlbGVhc2VfdG9fbHJnX2J1Zl9mcmVlX2xpc3QocWRldiwgbHJnX2J1Zl9jYjIpOwogfQogCkBAIC0xNzkwLDcgKzE4MjQsNyBAQAogCXN0cnVjdCBxbF9yY3ZfYnVmX2NiICpscmdfYnVmX2NiMSA9IE5VTEw7CiAJc3RydWN0IHFsX3Jjdl9idWZfY2IgKmxyZ19idWZfY2IyID0gTlVMTDsKIAl1MzIgKmN1cnJfaWFsX3B0cjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMSwgKnNrYjI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjEgPSBOVUxMLCAqc2tiMjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHFkZXYtPm5kZXY7CiAJdTE2IGxlbmd0aCA9IGxlMTZfdG9fY3B1KGliX2lwX3JzcF9wdHItPmxlbmd0aCk7CiAJdTE2IHNpemUgPSAwOwpAQCAtMTgwNiwxNiArMTg0MCwyMCBAQAogCXFkZXYtPmxhc3RfcnNwX29mZnNldCA9IHFkZXYtPnNtYWxsX2J1Zl9waHlfYWRkcl9sb3cgKyBvZmZzZXQ7CiAJcWRldi0+c21hbGxfYnVmX3JlbGVhc2VfY250Kys7CiAKLQkvKiBzdGFydCBvZiBmaXJzdCBidWZmZXIgKi8KLQlscmdfYnVmX3BoeV9hZGRyX2xvdyA9IGxlMzJfdG9fY3B1KCpjdXJyX2lhbF9wdHIpOwotCWxyZ19idWZfY2IxID0gJnFkZXYtPmxyZ19idWZbcWRldi0+bHJnX2J1Zl9pbmRleF07Ci0KLQlxZGV2LT5scmdfYnVmX3JlbGVhc2VfY250Kys7Ci0JaWYgKCsrcWRldi0+bHJnX2J1Zl9pbmRleCA9PSBOVU1fTEFSR0VfQlVGRkVSUykKLQkJcWRldi0+bHJnX2J1Zl9pbmRleCA9IDA7Ci0Jc2tiMSA9IGxyZ19idWZfY2IxLT5za2I7Ci0JY3Vycl9pYWxfcHRyKys7CQkvKiA2NC1iaXQgcG9pbnRlcnMgcmVxdWlyZSB0d28gaW5jcy4gKi8KLQljdXJyX2lhbF9wdHIrKzsKKwlpZiAocWRldi0+ZGV2aWNlX2lkID09IFFMMzAyMl9ERVZJQ0VfSUQpIHsKKwkJLyogc3RhcnQgb2YgZmlyc3QgYnVmZmVyIG9uIDMwMjIgKi8KKwkJbHJnX2J1Zl9waHlfYWRkcl9sb3cgPSBsZTMyX3RvX2NwdSgqY3Vycl9pYWxfcHRyKTsKKwkJbHJnX2J1Zl9jYjEgPSAmcWRldi0+bHJnX2J1ZltxZGV2LT5scmdfYnVmX2luZGV4XTsKKwkJcWRldi0+bHJnX2J1Zl9yZWxlYXNlX2NudCsrOworCQlpZiAoKytxZGV2LT5scmdfYnVmX2luZGV4ID09IE5VTV9MQVJHRV9CVUZGRVJTKQorCQkJcWRldi0+bHJnX2J1Zl9pbmRleCA9IDA7CisJCXNrYjEgPSBscmdfYnVmX2NiMS0+c2tiOworCQljdXJyX2lhbF9wdHIrKzsJLyogNjQtYml0IHBvaW50ZXJzIHJlcXVpcmUgdHdvIGluY3MuICovCisJCWN1cnJfaWFsX3B0cisrOworCQlzaXplID0gRVRIX0hMRU47CisJCWlmICgqKCh1MTYgKikgc2tiMS0+ZGF0YSkgIT0gMHhGRkZGKQorCQkJc2l6ZSArPSBWTEFOX0VUSF9ITEVOIC0gRVRIX0hMRU47CisJfQogCiAJLyogc3RhcnQgb2Ygc2Vjb25kIGJ1ZmZlciAqLwogCWxyZ19idWZfcGh5X2FkZHJfbG93ID0gbGUzMl90b19jcHUoKmN1cnJfaWFsX3B0cik7CkBAIC0xODI1LDE4ICsxODYzLDYgQEAKIAlpZiAoKytxZGV2LT5scmdfYnVmX2luZGV4ID09IE5VTV9MQVJHRV9CVUZGRVJTKQogCQlxZGV2LT5scmdfYnVmX2luZGV4ID0gMDsKIAotCXFkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQlxZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7Ci0KLQkvKgotCSAqIENvcHkgdGhlIGV0aGhkciBmcm9tIGZpcnN0IGJ1ZmZlciB0byBzZWNvbmQuIFRoaXMKLQkgKiBpcyBuZWNlc3NhcnkgZm9yIElQIGNvbXBsZXRpb25zLgotCSAqLwotCWlmICgqKCh1MTYgKikgc2tiMS0+ZGF0YSkgIT0gMHhGRkZGKQotCQlzaXplID0gVkxBTl9FVEhfSExFTjsKLQllbHNlCi0JCXNpemUgPSBFVEhfSExFTjsKLQogCXNrYl9wdXQoc2tiMiwgbGVuZ3RoKTsJLyogSnVzdCB0aGUgc2Vjb25kIGJ1ZmZlciBsZW5ndGggaGVyZS4gKi8KIAlwY2lfdW5tYXBfc2luZ2xlKHFkZXYtPnBkZXYsCiAJCQkgcGNpX3VubWFwX2FkZHIobHJnX2J1Zl9jYjIsIG1hcGFkZHIpLApAQCAtMTg0NCwxNiArMTg3MCw0MCBAQAogCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJcHJlZmV0Y2goc2tiMi0+ZGF0YSk7CiAKLQltZW1jcHkoc2tiX3B1c2goc2tiMiwgc2l6ZSksIHNrYjEtPmRhdGEgKyBWTEFOX0lEX0xFTiwgc2l6ZSk7Ci0Jc2tiMi0+ZGV2ID0gcWRldi0+bmRldjsKIAlza2IyLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCWlmIChxZGV2LT5kZXZpY2VfaWQgPT0gUUwzMDIyX0RFVklDRV9JRCkgeworCQkvKgorCQkgKiBDb3B5IHRoZSBldGhoZHIgZnJvbSBmaXJzdCBidWZmZXIgdG8gc2Vjb25kLiBUaGlzCisJCSAqIGlzIG5lY2Vzc2FyeSBmb3IgMzAyMiBJUCBjb21wbGV0aW9ucy4KKwkJICovCisJCW1lbWNweShza2JfcHVzaChza2IyLCBzaXplKSwgc2tiMS0+ZGF0YSArIFZMQU5fSURfTEVOLCBzaXplKTsKKwl9IGVsc2UgeworCQl1MTYgY2hlY2tzdW0gPSBsZTE2X3RvX2NwdShpYl9pcF9yc3BfcHRyLT5jaGVja3N1bSk7CisJCWlmIChjaGVja3N1bSAmIAorCQkJKElCX0lQX0lPQ0JfUlNQXzMwMzJfSUNFIHwgCisJCQkgSUJfSVBfSU9DQl9SU1BfMzAzMl9DRSB8IAorCQkJIElCX0lQX0lPQ0JfUlNQXzMwMzJfTlVDKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIiVzOiBCYWQgY2hlY2tzdW0gZm9yIHRoaXMgJXMgcGFja2V0LCBjaGVja3N1bSA9ICV4LlxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywKKwkJCSAgICAgICAoKGNoZWNrc3VtICYgCisJCQkJSUJfSVBfSU9DQl9SU1BfMzAzMl9UQ1ApID8gIlRDUCIgOgorCQkJCSJVRFAiKSxjaGVja3N1bSk7CisJCX0gZWxzZSBpZiAoY2hlY2tzdW0gJiBJQl9JUF9JT0NCX1JTUF8zMDMyX1RDUCkgeworCQkJc2tiMi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCX0gCisJfQorCXNrYjItPmRldiA9IHFkZXYtPm5kZXY7CiAJc2tiMi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IyLCBxZGV2LT5uZGV2KTsKIAogCW5ldGlmX3JlY2VpdmVfc2tiKHNrYjIpOworCXFkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlxZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CiAJbmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CiAJbHJnX2J1Zl9jYjItPnNrYiA9IE5VTEw7CiAKLQlxbF9yZWxlYXNlX3RvX2xyZ19idWZfZnJlZV9saXN0KHFkZXYsIGxyZ19idWZfY2IxKTsKKwlpZiAocWRldi0+ZGV2aWNlX2lkID09IFFMMzAyMl9ERVZJQ0VfSUQpCisJCXFsX3JlbGVhc2VfdG9fbHJnX2J1Zl9mcmVlX2xpc3QocWRldiwgbHJnX2J1Zl9jYjEpOwogCXFsX3JlbGVhc2VfdG9fbHJnX2J1Zl9mcmVlX2xpc3QocWRldiwgbHJnX2J1Zl9jYjIpOwogfQogCkBAIC0xODgwLDEyICsxOTMwLDE0IEBACiAJCQlicmVhazsKIAogCQljYXNlIE9QQ09ERV9JQl9NQUNfSU9DQjoKKwkJY2FzZSBPUENPREVfSUJfMzAzMl9NQUNfSU9DQjoKIAkJCXFsX3Byb2Nlc3NfbWFjX3J4X2ludHIocWRldiwgKHN0cnVjdCBpYl9tYWNfaW9jYl9yc3AgKikKIAkJCQkJICAgICAgIG5ldF9yc3ApOwogCQkJKCpyeF9jbGVhbmVkKSsrOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBPUENPREVfSUJfSVBfSU9DQjoKKwkJY2FzZSBPUENPREVfSUJfMzAzMl9JUF9JT0NCOgogCQkJcWxfcHJvY2Vzc19tYWNpcF9yeF9pbnRyKHFkZXYsIChzdHJ1Y3QgaWJfaXBfaW9jYl9yc3AgKikKIAkJCQkJCSBuZXRfcnNwKTsKIAkJCSgqcnhfY2xlYW5lZCkrKzsKQEAgLTIwMzIsMTMgKzIwODQsOTYgQEAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIAorLyoKKyAqIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIHNlZ21lbnRzIG5lZWRlZCBmb3IgdGhlIAorICogZ2l2ZW4gbnVtYmVyIG9mIGZyYWdtZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKKyAqIG91dGJvdW5kIGFkZHJlc3MgbGlzdHMgKE9BTCkgd2lsbCBiZSB1c2VkIHdoZW4gbW9yZSB0aGFuCisgKiB0d28gZnJhZ3MgYXJlIGdpdmVuLiAgRWFjaCBhZGRyZXNzIGxpc3QgaGFzIDUgYWRkci9sZW4gCisgKiBwYWlycy4gIFRoZSA1dGggcGFpciBpbiBlYWNoIEFPTCBpcyB1c2VkIHRvICBwb2ludCB0bworICogdGhlIG5leHQgQU9MIGlmIG1vcmUgZnJhZ3MgYXJlIGNvbWluZy4gIAorICogVGhhdCBpcyB3aHkgdGhlIGZyYWdzOnNlZ21lbnQgY291bnQgIHJhdGlvIGlzIG5vdCBsaW5lYXIuCisgKi8KK3N0YXRpYyBpbnQgcWxfZ2V0X3NlZ19jb3VudCh1bnNpZ25lZCBzaG9ydCBmcmFncykKK3sKKwlzd2l0Y2goZnJhZ3MpIHsKKwljYXNlIDA6CXJldHVybiAxOwkvKiBqdXN0IHRoZSBza2ItPmRhdGEgc2VnICovCisJY2FzZSAxOglyZXR1cm4gMjsJLyogc2tiLT5kYXRhICsgMSBmcmFnICovCisJY2FzZSAyOglyZXR1cm4gMzsJLyogc2tiLT5kYXRhICsgMiBmcmFncyAqLworCWNhc2UgMzoJcmV0dXJuIDU7CS8qIHNrYi0+ZGF0YSArIDEgZnJhZyArIDEgQU9MIGNvbnRhaW50aW5nIDIgZnJhZ3MgKi8KKwljYXNlIDQ6CXJldHVybiA2OworCWNhc2UgNToJcmV0dXJuIDc7CisJY2FzZSA2OglyZXR1cm4gODsKKwljYXNlIDc6CXJldHVybiAxMDsKKwljYXNlIDg6CXJldHVybiAxMTsKKwljYXNlIDk6CXJldHVybiAxMjsKKwljYXNlIDEwOiByZXR1cm4gMTM7CisJY2FzZSAxMTogcmV0dXJuIDE1OworCWNhc2UgMTI6IHJldHVybiAxNjsKKwljYXNlIDEzOiByZXR1cm4gMTc7CisJY2FzZSAxNDogcmV0dXJuIDE4OworCWNhc2UgMTU6IHJldHVybiAyMDsKKwljYXNlIDE2OiByZXR1cm4gMjE7CisJY2FzZSAxNzogcmV0dXJuIDIyOworCWNhc2UgMTg6IHJldHVybiAyMzsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBxbF9od19jc3VtX3NldHVwKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHN0cnVjdCBvYl9tYWNfaW9jYl9yZXEgKm1hY19pb2NiX3B0cikKK3sKKwlzdHJ1Y3QgZXRoaGRyICpldGg7CisJc3RydWN0IGlwaGRyICppcCA9IE5VTEw7CisJdTggb2Zmc2V0ID0gRVRIX0hMRU47CisKKwlldGggPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEpOworCisJaWYgKGV0aC0+aF9wcm90byA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSkgeworCQlpcCA9IChzdHJ1Y3QgaXBoZHIgKikmc2tiLT5kYXRhW0VUSF9ITEVOXTsKKwl9IGVsc2UgaWYgKGV0aC0+aF9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxUSkgJiYKKwkJICAgKChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilza2ItPmRhdGEpLT4KKwkJICAgaF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90byA9PSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKSkgeworCQlpcCA9IChzdHJ1Y3QgaXBoZHIgKikmc2tiLT5kYXRhW1ZMQU5fRVRIX0hMRU5dOworCQlvZmZzZXQgPSBWTEFOX0VUSF9ITEVOOworCX0KKworCWlmIChpcCkgeworCQlpZiAoaXAtPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7CisJCQltYWNfaW9jYl9wdHItPmZsYWdzMSB8PSBPQl8zMDMyTUFDX0lPQ0JfUkVRX1RDOworCQkJbWFjX2lvY2JfcHRyLT5pcF9oZHJfb2ZmID0gb2Zmc2V0OworCQkJbWFjX2lvY2JfcHRyLT5pcF9oZHJfbGVuID0gaXAtPmlobDsKKwkJfSBlbHNlIGlmIChpcC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwkJCW1hY19pb2NiX3B0ci0+ZmxhZ3MxIHw9IE9CXzMwMzJNQUNfSU9DQl9SRVFfVUM7CisJCQltYWNfaW9jYl9wdHItPmlwX2hkcl9vZmYgPSBvZmZzZXQ7CisJCQltYWNfaW9jYl9wdHItPmlwX2hkcl9sZW4gPSBpcC0+aWhsOworCQl9CisJfQorfQorCisvKgorICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAzMDIyIGFuZCAzMDMyIHNlbmRzOgorICogMzAyMiBvbmx5IHN1cHBvcnRzIGEgc2ltcGxlIHNpbmdsZSBzZWdtZW50IHRyYW5zbWlzc2lvbi4KKyAqIDMwMzIgc3VwcG9ydHMgY2hlY2tzdW1taW5nIGFuZCBzY2F0dGVyL2dhdGhlciBsaXN0cyAoZnJhZ21lbnRzKS4KKyAqIFRoZSAzMDMyIHN1cHBvcnRzIHNnbGlzdHMgYnkgdXNpbmcgdGhlIDMgYWRkci9sZW4gcGFpcnMgKEFMUCkgCisgKiBpbiB0aGUgSU9DQiBwbHVzIGEgY2hhaW4gb2Ygb3V0Ym91bmQgYWRkcmVzcyBsaXN0cyAoT0FMKSB0aGF0IAorICogZWFjaCBjb250YWluIDUgQUxQcy4gIFRoZSBsYXN0IEFMUCBvZiB0aGUgSU9DQiAoM3JkKSBvciBPQUwgKDV0aCkgCisgKiB3aWxsIHVzZWQgdG8gcG9pbnQgdG8gYW4gT0FMIHdoZW4gbW9yZSBBTFAgZW50cmllcyBhcmUgcmVxdWlyZWQuICAKKyAqIFRoZSBJT0NCIGlzIGFsd2F5cyB0aGUgdG9wIG9mIHRoZSBjaGFpbiBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSAKKyAqIE9BTHMgKHdoZW4gbmVjZXNzYXJ5KS4KKyAqLwogc3RhdGljIGludCBxbDN4eHhfc2VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYgPSAoc3RydWN0IHFsM19hZGFwdGVyICopbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IHFsM3h4eF9wb3J0X3JlZ2lzdGVycyBfX2lvbWVtICpwb3J0X3JlZ3MgPSBxZGV2LT5tZW1fbWFwX3JlZ2lzdGVyczsKIAlzdHJ1Y3QgcWxfdHhfYnVmX2NiICp0eF9jYjsKKwl1MzIgdG90X2xlbiA9IHNrYi0+bGVuOworCXN0cnVjdCBvYWwgKm9hbDsKKwlzdHJ1Y3Qgb2FsX2VudHJ5ICpvYWxfZW50cnk7CisJaW50IGxlbjsKIAlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxICptYWNfaW9jYl9wdHI7CiAJdTY0IG1hcDsKKwlpbnQgc2VnX2NudCwgc2VnID0gMDsKKwlpbnQgZnJhZ19jbnQgPSAoaW50KXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CiAKIAlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJnFkZXYtPnR4X2NvdW50KSA8IDIpKSB7CiAJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChuZGV2KSkKQEAgLTIwNDYsMjEgKzIxODEsNzkgQEAKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIAl0eF9jYiA9ICZxZGV2LT50eF9idWZbcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4XSA7CisJc2VnX2NudCA9IHR4X2NiLT5zZWdfY291bnQgPSBxbF9nZXRfc2VnX2NvdW50KChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKSk7CisJaWYoc2VnX2NudCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYIiVzOiBpbnZhbGlkIHNlZ21lbnQgY291bnQhXG4iLF9fZnVuY19fKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKworCX0KIAltYWNfaW9jYl9wdHIgPSB0eF9jYi0+cXVldWVfZW50cnk7CiAJbWVtc2V0KCh2b2lkICopbWFjX2lvY2JfcHRyLCAwLCBzaXplb2Yoc3RydWN0IG9iX21hY19pb2NiX3JlcSkpOwogCW1hY19pb2NiX3B0ci0+b3Bjb2RlID0gcWRldi0+bWFjX29iX29wY29kZTsKIAltYWNfaW9jYl9wdHItPmZsYWdzIHw9IHFkZXYtPm1iX2JpdF9tYXNrOwogCW1hY19pb2NiX3B0ci0+dHJhbnNhY3Rpb25faWQgPSBxZGV2LT5yZXFfcHJvZHVjZXJfaW5kZXg7Ci0JbWFjX2lvY2JfcHRyLT5kYXRhX2xlbiA9IGNwdV90b19sZTE2KCh1MTYpIHNrYi0+bGVuKTsKKwltYWNfaW9jYl9wdHItPmRhdGFfbGVuID0gY3B1X3RvX2xlMTYoKHUxNikgdG90X2xlbik7CiAJdHhfY2ItPnNrYiA9IHNrYjsKLQltYXAgPSBwY2lfbWFwX3NpbmdsZShxZGV2LT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQltYWNfaW9jYl9wdHItPmJ1Zl9hZGRyMF9sb3cgPSBjcHVfdG9fbGUzMihMU182NEJJVFMobWFwKSk7Ci0JbWFjX2lvY2JfcHRyLT5idWZfYWRkcjBfaGlnaCA9IGNwdV90b19sZTMyKE1TXzY0QklUUyhtYXApKTsKLQltYWNfaW9jYl9wdHItPmJ1Zl8wX2xlbiA9IGNwdV90b19sZTMyKHNrYi0+bGVuIHwgT0JfTUFDX0lPQ0JfUkVRX0UpOwotCXBjaV91bm1hcF9hZGRyX3NldCh0eF9jYiwgbWFwYWRkciwgbWFwKTsKLQlwY2lfdW5tYXBfbGVuX3NldCh0eF9jYiwgbWFwbGVuLCBza2ItPmxlbik7Ci0JYXRvbWljX2RlYygmcWRldi0+dHhfY291bnQpOworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQorCQlxbF9od19jc3VtX3NldHVwKHNrYiwgbWFjX2lvY2JfcHRyKTsKKwlsZW4gPSBza2JfaGVhZGxlbihza2IpOworCW1hcCA9IHBjaV9tYXBfc2luZ2xlKHFkZXYtPnBkZXYsIHNrYi0+ZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlvYWxfZW50cnkgPSAoc3RydWN0IG9hbF9lbnRyeSAqKSZtYWNfaW9jYl9wdHItPmJ1Zl9hZGRyMF9sb3c7CisJb2FsX2VudHJ5LT5kbWFfbG8gPSBjcHVfdG9fbGUzMihMU182NEJJVFMobWFwKSk7CisJb2FsX2VudHJ5LT5kbWFfaGkgPSBjcHVfdG9fbGUzMihNU182NEJJVFMobWFwKSk7CisJb2FsX2VudHJ5LT5sZW4gPSBjcHVfdG9fbGUzMihsZW4pOworCXBjaV91bm1hcF9hZGRyX3NldCgmdHhfY2ItPm1hcFtzZWddLCBtYXBhZGRyLCBtYXApOworCXBjaV91bm1hcF9sZW5fc2V0KCZ0eF9jYi0+bWFwW3NlZ10sIG1hcGxlbiwgbGVuKTsKKwlzZWcrKzsKIAorCWlmICghc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykgeworCQkvKiBUZXJtaW5hdGUgdGhlIGxhc3Qgc2VnbWVudC4gKi8KKwkJb2FsX2VudHJ5LT5sZW4gPQorCQkgICAgY3B1X3RvX2xlMzIobGUzMl90b19jcHUob2FsX2VudHJ5LT5sZW4pIHwgT0FMX0xBU1RfRU5UUlkpOworCX0gZWxzZSB7CisJCWludCBpOworCQlvYWwgPSB0eF9jYi0+b2FsOworCQlmb3IgKGk9MDsgaTxmcmFnX2NudDsgaSsrLHNlZysrKSB7CisJCQlza2JfZnJhZ190ICpmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisJCQlvYWxfZW50cnkrKzsKKwkJCWlmICgoc2VnID09IDIgJiYgc2VnX2NudCA+IDMpIHx8CS8qIENoZWNrIGZvciBjb250aW51YXRpb24gKi8KKwkJCSAgICAoc2VnID09IDcgJiYgc2VnX2NudCA+IDgpIHx8CS8qIHJlcXVpcmVtZW50cy4gSXQncyBzdHJhbmdlICovCisJCQkgICAgKHNlZyA9PSAxMiAmJiBzZWdfY250ID4gMTMpIHx8CS8qIGJ1dCBuZWNlc3NhcnkuICovCisJCQkgICAgKHNlZyA9PSAxNyAmJiBzZWdfY250ID4gMTgpKSB7CisJCQkJLyogQ29udGludWF0aW9uIGVudHJ5IHBvaW50cyB0byBvdXRib3VuZCBhZGRyZXNzIGxpc3QuICovCisJCQkJbWFwID0gcGNpX21hcF9zaW5nbGUocWRldi0+cGRldiwgb2FsLAorCQkJCQkJICAgICBzaXplb2Yoc3RydWN0IG9hbCksCisJCQkJCQkgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCW9hbF9lbnRyeS0+ZG1hX2xvID0gY3B1X3RvX2xlMzIoTFNfNjRCSVRTKG1hcCkpOworCQkJCW9hbF9lbnRyeS0+ZG1hX2hpID0gY3B1X3RvX2xlMzIoTVNfNjRCSVRTKG1hcCkpOworCQkJCW9hbF9lbnRyeS0+bGVuID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoc2l6ZW9mKHN0cnVjdCBvYWwpIHwKKwkJCQkJCU9BTF9DT05UX0VOVFJZKTsKKwkJCQlwY2lfdW5tYXBfYWRkcl9zZXQoJnR4X2NiLT5tYXBbc2VnXSwgbWFwYWRkciwKKwkJCQkJCSAgIG1hcCk7CisJCQkJcGNpX3VubWFwX2xlbl9zZXQoJnR4X2NiLT5tYXBbc2VnXSwgbWFwbGVuLAorCQkJCQkJICBsZW4pOworCQkJCW9hbF9lbnRyeSA9IChzdHJ1Y3Qgb2FsX2VudHJ5ICopb2FsOworCQkJCW9hbCsrOworCQkJCXNlZysrOworCQkJfQorCisJCQltYXAgPQorCQkJICAgIHBjaV9tYXBfcGFnZShxZGV2LT5wZGV2LCBmcmFnLT5wYWdlLAorCQkJCQkgZnJhZy0+cGFnZV9vZmZzZXQsIGZyYWctPnNpemUsCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCW9hbF9lbnRyeS0+ZG1hX2xvID0gY3B1X3RvX2xlMzIoTFNfNjRCSVRTKG1hcCkpOworCQkJb2FsX2VudHJ5LT5kbWFfaGkgPSBjcHVfdG9fbGUzMihNU182NEJJVFMobWFwKSk7CisJCQlvYWxfZW50cnktPmxlbiA9IGNwdV90b19sZTMyKGZyYWctPnNpemUpOworCQkJcGNpX3VubWFwX2FkZHJfc2V0KCZ0eF9jYi0+bWFwW3NlZ10sIG1hcGFkZHIsIG1hcCk7CisJCQlwY2lfdW5tYXBfbGVuX3NldCgmdHhfY2ItPm1hcFtzZWddLCBtYXBsZW4sCisJCQkJCSAgZnJhZy0+c2l6ZSk7CisJCX0KKwkJLyogVGVybWluYXRlIHRoZSBsYXN0IHNlZ21lbnQuICovCisJCW9hbF9lbnRyeS0+bGVuID0KKwkJICAgIGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KG9hbF9lbnRyeS0+bGVuKSB8IE9BTF9MQVNUX0VOVFJZKTsKKwl9CisJd21iKCk7CiAJcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4Kys7CiAJaWYgKHFkZXYtPnJlcV9wcm9kdWNlcl9pbmRleCA9PSBOVU1fUkVRX1FfRU5UUklFUykKIAkJcWRldi0+cmVxX3Byb2R1Y2VyX2luZGV4ID0gMDsKQEAgLTIwNzQsOCArMjI2NywxMCBAQAogCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVzOiB0eCBxdWV1ZWQsIHNsb3QgJWQsIGxlbiAlZFxuIiwKIAkJICAgICAgIG5kZXYtPm5hbWUsIHFkZXYtPnJlcV9wcm9kdWNlcl9pbmRleCwgc2tiLT5sZW4pOwogCisJYXRvbWljX2RlYygmcWRldi0+dHhfY291bnQpOwogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CisKIHN0YXRpYyBpbnQgcWxfYWxsb2NfbmV0X3JlcV9yc3BfcXVldWVzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAlxZGV2LT5yZXFfcV9zaXplID0KQEAgLTIzNTksNyArMjU1NCwyMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBxbF9jcmVhdGVfc2VuZF9mcmVlX2xpc3Qoc3RydWN0IHFsM19hZGFwdGVyICpxZGV2KQorc3RhdGljIHZvaWQgcWxfZnJlZV9zZW5kX2ZyZWVfbGlzdChzdHJ1Y3QgcWwzX2FkYXB0ZXIgKnFkZXYpCit7CisJc3RydWN0IHFsX3R4X2J1Zl9jYiAqdHhfY2I7CisJaW50IGk7CisKKwl0eF9jYiA9ICZxZGV2LT50eF9idWZbMF07CisJZm9yIChpID0gMDsgaSA8IE5VTV9SRVFfUV9FTlRSSUVTOyBpKyspIHsKKwkJaWYgKHR4X2NiLT5vYWwpIHsKKwkJCWtmcmVlKHR4X2NiLT5vYWwpOworCQkJdHhfY2ItPm9hbCA9IE5VTEw7CisJCX0KKwkJdHhfY2IrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcWxfY3JlYXRlX3NlbmRfZnJlZV9saXN0KHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKIAlzdHJ1Y3QgcWxfdHhfYnVmX2NiICp0eF9jYjsKIAlpbnQgaTsKQEAgLTIzNjgsMTEgKzI1NzgsMTYgQEAKIAogCS8qIENyZWF0ZSBmcmVlIGxpc3Qgb2YgdHJhbnNtaXQgYnVmZmVycyAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fUkVRX1FfRU5UUklFUzsgaSsrKSB7CisKIAkJdHhfY2IgPSAmcWRldi0+dHhfYnVmW2ldOwogCQl0eF9jYi0+c2tiID0gTlVMTDsKIAkJdHhfY2ItPnF1ZXVlX2VudHJ5ID0gcmVxX3FfY3VycjsKIAkJcmVxX3FfY3VycisrOworCQl0eF9jYi0+b2FsID0ga21hbGxvYyg1MTIsIEdGUF9LRVJORUwpOworCQlpZiAodHhfY2ItPm9hbCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBxbF9hbGxvY19tZW1fcmVzb3VyY2VzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKQEAgLTI0NDcsMTIgKzI2NjIsMTQgQEAKIAogCS8qIEluaXRpYWxpemUgdGhlIGxhcmdlIGJ1ZmZlciBxdWV1ZS4gKi8KIAlxbF9pbml0X2xhcmdlX2J1ZmZlcnMocWRldik7Ci0JcWxfY3JlYXRlX3NlbmRfZnJlZV9saXN0KHFkZXYpOworCWlmIChxbF9jcmVhdGVfc2VuZF9mcmVlX2xpc3QocWRldikpCisJCWdvdG8gZXJyX2ZyZWVfbGlzdDsKIAogCXFkZXYtPnJzcF9jdXJyZW50ID0gcWRldi0+cnNwX3FfdmlydF9hZGRyOwogCiAJcmV0dXJuIDA7Ci0KK2Vycl9mcmVlX2xpc3Q6CisJcWxfZnJlZV9zZW5kX2ZyZWVfbGlzdChxZGV2KTsKIGVycl9zbWFsbF9idWZmZXJzOgogCXFsX2ZyZWVfYnVmZmVyX3F1ZXVlcyhxZGV2KTsKIGVycl9idWZmZXJfcXVldWVzOgpAQCAtMjQ2OCw2ICsyNjg1LDcgQEAKIAogc3RhdGljIHZvaWQgcWxfZnJlZV9tZW1fcmVzb3VyY2VzKHN0cnVjdCBxbDNfYWRhcHRlciAqcWRldikKIHsKKwlxbF9mcmVlX3NlbmRfZnJlZV9saXN0KHFkZXYpOwogCXFsX2ZyZWVfbGFyZ2VfYnVmZmVycyhxZGV2KTsKIAlxbF9mcmVlX3NtYWxsX2J1ZmZlcnMocWRldik7CiAJcWxfZnJlZV9idWZmZXJfcXVldWVzKHFkZXYpOwpAQCAtMjc2NiwxMSArMjk4NCwyMCBAQAogCX0KIAogCS8qIEVuYWJsZSBFdGhlcm5ldCBGdW5jdGlvbiAqLwotCXZhbHVlID0KLQkgICAgKFBPUlRfQ09OVFJPTF9FRiB8IFBPUlRfQ09OVFJPTF9FVCB8IFBPUlRfQ09OVFJPTF9FSSB8Ci0JICAgICBQT1JUX0NPTlRST0xfSEgpOwotCXFsX3dyaXRlX3BhZ2UwX3JlZyhxZGV2LCAmcG9ydF9yZWdzLT5wb3J0Q29udHJvbCwKLQkJCSAgICgodmFsdWUgPDwgMTYpIHwgdmFsdWUpKTsKKwlpZiAocWRldi0+ZGV2aWNlX2lkID09IFFMMzAzMl9ERVZJQ0VfSUQpIHsKKwkJdmFsdWUgPQorCQkgICAgKFFMMzAzMl9QT1JUX0NPTlRST0xfRUYgfCBRTDMwMzJfUE9SVF9DT05UUk9MX0tJRSB8CisJCSAgICAgUUwzMDMyX1BPUlRfQ09OVFJPTF9FSXY2IHwgUUwzMDMyX1BPUlRfQ09OVFJPTF9FSXY0KTsKKwkJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPmZ1bmN0aW9uQ29udHJvbCwKKwkJCQkgICAoKHZhbHVlIDw8IDE2KSB8IHZhbHVlKSk7CisJfSBlbHNlIHsKKwkJdmFsdWUgPQorCQkgICAgKFBPUlRfQ09OVFJPTF9FRiB8IFBPUlRfQ09OVFJPTF9FVCB8IFBPUlRfQ09OVFJPTF9FSSB8CisJCSAgICAgUE9SVF9DT05UUk9MX0hIKTsKKwkJcWxfd3JpdGVfcGFnZTBfcmVnKHFkZXYsICZwb3J0X3JlZ3MtPnBvcnRDb250cm9sLAorCQkJCSAgICgodmFsdWUgPDwgMTYpIHwgdmFsdWUpKTsKKwl9CisKIAogb3V0OgogCXJldHVybiBzdGF0dXM7CkBAIC0yOTE3LDggKzMxNDQsMTAgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHFkZXYtPnBkZXY7CiAKIAlwcmludGsoS0VSTl9JTkZPIFBGWAotCSAgICAgICAiXG4lcyBBZGFwdGVyICVkIFJldmlzaW9uSUQgJWQgZm91bmQgb24gUENJIHNsb3QgJWQuXG4iLAotCSAgICAgICBEUlZfTkFNRSwgcWRldi0+aW5kZXgsIHFkZXYtPmNoaXBfcmV2X2lkLCBxZGV2LT5wY2lfc2xvdCk7CisJICAgICAgICJcbiVzIEFkYXB0ZXIgJWQgUmV2aXNpb25JRCAlZCBmb3VuZCAlcyBvbiBQQ0kgc2xvdCAlZC5cbiIsCisJICAgICAgIERSVl9OQU1FLCBxZGV2LT5pbmRleCwgcWRldi0+Y2hpcF9yZXZfaWQsCisJICAgICAgIChxZGV2LT5kZXZpY2VfaWQgPT0gUUwzMDMyX0RFVklDRV9JRCkgPyAiUUxBMzAzMiIgOiAiUUxBMzAyMiIsCisJICAgICAgIHFkZXYtPnBjaV9zbG90KTsKIAlwcmludGsoS0VSTl9JTkZPIFBGWAogCSAgICAgICAiJXMgSW50ZXJmYWNlLlxuIiwKIAkgICAgICAgdGVzdF9iaXQoUUxfTElOS19PUFRJQ0FMLCZxZGV2LT5mbGFncykgPyAiT1BUSUNBTCIgOiAiQ09QUEVSIik7CkBAIC0zMjEyLDE1ICszNDQxLDIyIEBACiAJCSAqIExvb3AgdGhyb3VnaCB0aGUgYWN0aXZlIGxpc3QgYW5kIHJldHVybiB0aGUgc2tiLgogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IE5VTV9SRVFfUV9FTlRSSUVTOyBpKyspIHsKKwkJCWludCBqOwogCQkJdHhfY2IgPSAmcWRldi0+dHhfYnVmW2ldOwogCQkJaWYgKHR4X2NiLT5za2IpIHsKLQogCQkJCXByaW50ayhLRVJOX0RFQlVHIFBGWAogCQkJCSAgICAgICAiJXM6IEZyZWVpbmcgbG9zdCBTS0IuXG4iLAogCQkJCSAgICAgICBxZGV2LT5uZGV2LT5uYW1lKTsKIAkJCQlwY2lfdW5tYXBfc2luZ2xlKHFkZXYtPnBkZXYsCi0JCQkJCXBjaV91bm1hcF9hZGRyKHR4X2NiLCBtYXBhZGRyKSwKLQkJCQkJcGNpX3VubWFwX2xlbih0eF9jYiwgbWFwbGVuKSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJCSBwY2lfdW5tYXBfYWRkcigmdHhfY2ItPm1hcFswXSwgbWFwYWRkciksCisJCQkJCSBwY2lfdW5tYXBfbGVuKCZ0eF9jYi0+bWFwWzBdLCBtYXBsZW4pLAorCQkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisJCQkJZm9yKGo9MTtqPHR4X2NiLT5zZWdfY291bnQ7aisrKSB7CisJCQkJCXBjaV91bm1hcF9wYWdlKHFkZXYtPnBkZXYsCisJCQkJCSAgICAgICBwY2lfdW5tYXBfYWRkcigmdHhfY2ItPm1hcFtqXSxtYXBhZGRyKSwKKwkJCQkJICAgICAgIHBjaV91bm1hcF9sZW4oJnR4X2NiLT5tYXBbal0sbWFwbGVuKSwKKwkJCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQkJCX0KIAkJCQlkZXZfa2ZyZWVfc2tiKHR4X2NiLT5za2IpOwogCQkJCXR4X2NiLT5za2IgPSBOVUxMOwogCQkJfQpAQCAtMzM3OSwyMSArMzYxNSwyNCBAQAogCVNFVF9NT0RVTEVfT1dORVIobmRldik7CiAJU0VUX05FVERFVl9ERVYobmRldiwgJnBkZXYtPmRldik7CiAKLQlpZiAocGNpX3VzaW5nX2RhYykKLQkJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwotCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOwogCiAJcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXFkZXYtPmluZGV4ID0gY2FyZHNfZm91bmQ7CiAJcWRldi0+bmRldiA9IG5kZXY7CiAJcWRldi0+cGRldiA9IHBkZXY7CisJcWRldi0+ZGV2aWNlX2lkID0gcGNpX2VudHJ5LT5kZXZpY2U7CiAJcWRldi0+cG9ydF9saW5rX3N0YXRlID0gTFNfRE9XTjsKIAlpZiAobXNpKQogCQlxZGV2LT5tc2kgPSAxOwogCiAJcWRldi0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnLCBkZWZhdWx0X21zZyk7CiAKKwlpZiAocGNpX3VzaW5nX2RhYykKKwkJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCWlmIChxZGV2LT5kZXZpY2VfaWQgPT0gUUwzMDMyX0RFVklDRV9JRCkKKwkJbmRldi0+ZmVhdHVyZXMgfD0gKE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfU0cpOworCiAJcWRldi0+bWVtX21hcF9yZWdpc3RlcnMgPQogCSAgICBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpLAogCQkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocWRldi0+cGRldiwgMSkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcWxhM3h4eC5oIGIvZHJpdmVycy9uZXQvcWxhM3h4eC5oCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZWE5NGRlNy4uYjJkNzZlYQotLS0gYS9kcml2ZXJzL25ldC9xbGEzeHh4LmgKKysrIGIvZHJpdmVycy9uZXQvcWxhM3h4eC5oCkBAIC0yMSw3ICsyMSw5IEBACiAKICNkZWZpbmUgT1BDT0RFX1VQREFURV9OQ0JfSU9DQiAgICAgIDB4RjAKICNkZWZpbmUgT1BDT0RFX0lCX01BQ19JT0NCICAgICAgICAgIDB4RjkKKyNkZWZpbmUgT1BDT0RFX0lCXzMwMzJfTUFDX0lPQ0IgICAgIDB4MDkKICNkZWZpbmUgT1BDT0RFX0lCX0lQX0lPQ0IgICAgICAgICAgIDB4RkEKKyNkZWZpbmUgT1BDT0RFX0lCXzMwMzJfSVBfSU9DQiAgICAgIDB4MEEKICNkZWZpbmUgT1BDT0RFX0lCX1RDUF9JT0NCICAgICAgICAgIDB4RkIKICNkZWZpbmUgT1BDT0RFX0RVTVBfUFJPVE9fSU9DQiAgICAgIDB4RkUKICNkZWZpbmUgT1BDT0RFX0JVRkZFUl9BTEVSVF9JT0NCICAgIDB4RkIKQEAgLTM3LDE4ICszOSwyMyBAQAogc3RydWN0IG9iX21hY19pb2NiX3JlcSB7CiAJdTggb3Bjb2RlOwogCXU4IGZsYWdzOwotI2RlZmluZSBPQl9NQUNfSU9DQl9SRVFfTUEgIDB4QzAKLSNkZWZpbmUgT0JfTUFDX0lPQ0JfUkVRX0YgICAweDIwCi0jZGVmaW5lIE9CX01BQ19JT0NCX1JFUV9YICAgMHgxMAorI2RlZmluZSBPQl9NQUNfSU9DQl9SRVFfTUEgIDB4ZTAKKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUkVRX0YgICAweDEwCisjZGVmaW5lIE9CX01BQ19JT0NCX1JFUV9YICAgMHgwOAogI2RlZmluZSBPQl9NQUNfSU9DQl9SRVFfRCAgIDB4MDIKICNkZWZpbmUgT0JfTUFDX0lPQ0JfUkVRX0kgICAweDAxCi0JX19sZTE2IHJlc2VydmVkMDsKKwl1OCBmbGFnczE7CisjZGVmaW5lIE9CXzMwMzJNQUNfSU9DQl9SRVFfSUMJMHgwNAorI2RlZmluZSBPQl8zMDMyTUFDX0lPQ0JfUkVRX1RDCTB4MDIKKyNkZWZpbmUgT0JfMzAzMk1BQ19JT0NCX1JFUV9VQwkweDAxCisJdTggcmVzZXJ2ZWQwOwogCiAJX19sZTMyIHRyYW5zYWN0aW9uX2lkOwogCV9fbGUxNiBkYXRhX2xlbjsKLQlfX2xlMTYgcmVzZXJ2ZWQxOworCXU4IGlwX2hkcl9vZmY7CisJdTggaXBfaGRyX2xlbjsKKwlfX2xlMzIgcmVzZXJ2ZWQxOwogCV9fbGUzMiByZXNlcnZlZDI7Ci0JX19sZTMyIHJlc2VydmVkMzsKIAlfX2xlMzIgYnVmX2FkZHIwX2xvdzsKIAlfX2xlMzIgYnVmX2FkZHIwX2hpZ2g7CiAJX19sZTMyIGJ1Zl8wX2xlbjsKQEAgLTU4LDggKzY1LDggQEAKIAlfX2xlMzIgYnVmX2FkZHIyX2xvdzsKIAlfX2xlMzIgYnVmX2FkZHIyX2hpZ2g7CiAJX19sZTMyIGJ1Zl8yX2xlbjsKKwlfX2xlMzIgcmVzZXJ2ZWQzOwogCV9fbGUzMiByZXNlcnZlZDQ7Ci0JX19sZTMyIHJlc2VydmVkNTsKIH07CiAvKgogICogVGhlIGZvbGxvd2luZyBjb25zdGFudHMgZGVmaW5lIGNvbnRyb2wgYml0cyBmb3IgYnVmZmVyCkBAIC03NCw2ICs4MSw3IEBACiAJdTggb3Bjb2RlOwogCXU4IGZsYWdzOwogI2RlZmluZSBPQl9NQUNfSU9DQl9SU1BfUCAgIDB4MDgKKyNkZWZpbmUgT0JfTUFDX0lPQ0JfUlNQX0wgICAweDA0CiAjZGVmaW5lIE9CX01BQ19JT0NCX1JTUF9TICAgMHgwMgogI2RlZmluZSBPQl9NQUNfSU9DQl9SU1BfSSAgIDB4MDEKIApAQCAtODUsNiArOTMsNyBAQAogCiBzdHJ1Y3QgaWJfbWFjX2lvY2JfcnNwIHsKIAl1OCBvcGNvZGU7CisjZGVmaW5lIElCX01BQ19JT0NCX1JTUF9WICAgMHg4MAogCXU4IGZsYWdzOwogI2RlZmluZSBJQl9NQUNfSU9DQl9SU1BfUyAgIDB4ODAKICNkZWZpbmUgSUJfTUFDX0lPQ0JfUlNQX0gxICAweDQwCkBAIC0xMzgsNiArMTQ3LDcgQEAKIHN0cnVjdCBvYl9pcF9pb2NiX3JzcCB7CiAJdTggb3Bjb2RlOwogCXU4IGZsYWdzOworI2RlZmluZSBPQl9NQUNfSU9DQl9SU1BfSCAgICAgICAweDEwCiAjZGVmaW5lIE9CX01BQ19JT0NCX1JTUF9FICAgICAgIDB4MDgKICNkZWZpbmUgT0JfTUFDX0lPQ0JfUlNQX0wgICAgICAgMHgwNAogI2RlZmluZSBPQl9NQUNfSU9DQl9SU1BfUyAgICAgICAweDAyCkBAIC0yMjAsNiArMjMwLDEwIEBACiAKIHN0cnVjdCBpYl9pcF9pb2NiX3JzcCB7CiAJdTggb3Bjb2RlOworI2RlZmluZSBJQl9JUF9JT0NCX1JTUF8zMDMyX1YgICAweDgwCisjZGVmaW5lIElCX0lQX0lPQ0JfUlNQXzMwMzJfTyAgIDB4NDAKKyNkZWZpbmUgSUJfSVBfSU9DQl9SU1BfMzAzMl9JICAgMHgyMAorI2RlZmluZSBJQl9JUF9JT0NCX1JTUF8zMDMyX1IgICAweDEwCiAJdTggZmxhZ3M7CiAjZGVmaW5lIElCX0lQX0lPQ0JfUlNQX1MgICAgICAgIDB4ODAKICNkZWZpbmUgSUJfSVBfSU9DQl9SU1BfSDEgICAgICAgMHg0MApAQCAtMjMwLDYgKzI0NCwxMiBAQAogCiAJX19sZTE2IGxlbmd0aDsKIAlfX2xlMTYgY2hlY2tzdW07CisjZGVmaW5lIElCX0lQX0lPQ0JfUlNQXzMwMzJfSUNFCQkweDAxCisjZGVmaW5lIElCX0lQX0lPQ0JfUlNQXzMwMzJfQ0UJCTB4MDIKKyNkZWZpbmUgSUJfSVBfSU9DQl9SU1BfMzAzMl9OVUMJCTB4MDQKKyNkZWZpbmUgSUJfSVBfSU9DQl9SU1BfMzAzMl9VRFAJCTB4MDgKKyNkZWZpbmUgSUJfSVBfSU9DQl9SU1BfMzAzMl9UQ1AJCTB4MTAKKyNkZWZpbmUgSUJfSVBfSU9DQl9SU1BfMzAzMl9JUEUJCTB4MjAKIAlfX2xlMTYgcmVzZXJ2ZWQ7CiAjZGVmaW5lIElCX0lQX0lPQ0JfUlNQX1IgICAgICAgIDB4MDEKIAlfX2xlMzIgaWFsX2xvdzsKQEAgLTUyNCw2ICs1NDQsMjEgQEAKIAlJUF9BRERSX0lOREVYX1JFR19GVU5DXzJfU0VDID0gMHgwMDA1LAogCUlQX0FERFJfSU5ERVhfUkVHX0ZVTkNfM19QUkkgPSAweDAwMDYsCiAJSVBfQUREUl9JTkRFWF9SRUdfRlVOQ18zX1NFQyA9IDB4MDAwNywKKwlJUF9BRERSX0lOREVYX1JFR182ID0gMHgwMDA4LAorCUlQX0FERFJfSU5ERVhfUkVHX09GRlNFVF9NQVNLID0gMHgwMDMwLAorCUlQX0FERFJfSU5ERVhfUkVHX0UgPSAweDAwNDAsIAorfTsKK2VudW0geworCVFMMzAzMl9QT1JUX0NPTlRST0xfRFMgPSAweDAwMDEsCisJUUwzMDMyX1BPUlRfQ09OVFJPTF9ISCA9IDB4MDAwMiwKKwlRTDMwMzJfUE9SVF9DT05UUk9MX0VJdjYgPSAweDAwMDQsCisJUUwzMDMyX1BPUlRfQ09OVFJPTF9FSXY0ID0gMHgwMDA4LAorCVFMMzAzMl9QT1JUX0NPTlRST0xfRVQgPSAweDAwMTAsCisJUUwzMDMyX1BPUlRfQ09OVFJPTF9FRiA9IDB4MDAyMCwKKwlRTDMwMzJfUE9SVF9DT05UUk9MX0RSTSA9IDB4MDA0MCwKKwlRTDMwMzJfUE9SVF9DT05UUk9MX1JMQiA9IDB4MDA4MCwKKwlRTDMwMzJfUE9SVF9DT05UUk9MX1JDQiA9IDB4MDEwMCwKKwlRTDMwMzJfUE9SVF9DT05UUk9MX0tJRSA9IDB4MDIwMCwKIH07CiAKIGVudW0gewpAQCAtNjU3LDcgKzY5Miw4IEBACiAJdTMyIGludGVybmFsUmFtV0RhdGFSZWc7CiAJdTMyIHJlY2xhaW1lZEJ1ZmZlckFkZHJSZWdMb3c7CiAJdTMyIHJlY2xhaW1lZEJ1ZmZlckFkZHJSZWdIaWdoOwotCXUzMiByZXNlcnZlZFsyXTsKKwl1MzIgdGNwQ29uZmlndXJhdGlvbjsKKwl1MzIgZnVuY3Rpb25Db250cm9sOwogCXUzMiBmcGdhUmV2SUQ7CiAJdTMyIGxvY2FsUmFtQWRkcjsKIAl1MzIgbG9jYWxSYW1EYXRhQXV0b0luY3I7CkBAIC05NjMsNiArOTk5LDcgQEAKIAogI2RlZmluZSBRTDNYWFhfVkVORE9SX0lEICAgIDB4MTA3NwogI2RlZmluZSBRTDMwMjJfREVWSUNFX0lEICAgIDB4MzAyMgorI2RlZmluZSBRTDMwMzJfREVWSUNFX0lEICAgIDB4MzAzMgogCiAvKiBNVFUgJiBGcmFtZSBTaXplIHN0dWZmICovCiAjZGVmaW5lIE5PUk1BTF9NVFVfU0laRSAJCUVUSF9EQVRBX0xFTgpAQCAtMTAzOCwxMSArMTA3NSw0MSBAQAogCWludCBpbmRleDsKIH07CiAKKy8qCisgKiBPcmlnaW5hbCBJT0NCIGhhcyAzIHNnIGVudHJpZXM6CisgKiBmaXJzdCBwb2ludHMgdG8gc2tiLWRhdGEgYXJlYQorICogc2Vjb25kIHBvaW50cyB0byBmaXJzdCBmcmFnCisgKiB0aGlyZCBwb2ludHMgdG8gbmV4dCBvYWwuCisgKiBPQUwgaGFzIDUgZW50cmllczoKKyAqIDEgdGhydSA0IHBvaW50IHRvIGZyYWdzCisgKiBmaWZ0aCBwb2ludHMgdG8gbmV4dCBvYWwuCisgKi8gCisjZGVmaW5lIE1BWF9PQUxfQ05UICgoTUFYX1NLQl9GUkFHUy0xKS80ICsgMSkKKworc3RydWN0IG9hbF9lbnRyeSB7CisJdTMyIGRtYV9sbzsKKwl1MzIgZG1hX2hpOworCXUzMiBsZW47CisjZGVmaW5lIE9BTF9MQVNUX0VOVFJZICAgMHg4MDAwMDAwMAkvKiBMYXN0IHZhbGlkIGJ1ZmZlciBpbiBsaXN0LiAqLworI2RlZmluZSBPQUxfQ09OVF9FTlRSWSAgIDB4NDAwMDAwMDAJLyogcG9pbnRzIHRvIGFuIE9BTC4gKGNvbnRpbnVhdGlvbikgKi8KKwl1MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3Qgb2FsIHsKKwlzdHJ1Y3Qgb2FsX2VudHJ5IG9hbF9lbnRyeVs1XTsKK307CisKK3N0cnVjdCBtYXBfbGlzdCB7CisJIERFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwYWRkcik7CisJIERFQ0xBUkVfUENJX1VOTUFQX0xFTihtYXBsZW4pOworfTsKKwogc3RydWN0IHFsX3R4X2J1Zl9jYiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxICpxdWV1ZV9lbnRyeSA7Ci0JIERFQ0xBUkVfUENJX1VOTUFQX0FERFIobWFwYWRkcik7Ci0JIERFQ0xBUkVfUENJX1VOTUFQX0xFTihtYXBsZW4pOworCWludCBzZWdfY291bnQ7CisJc3RydWN0IG9hbCAqb2FsOworCXN0cnVjdCBtYXBfbGlzdCBtYXBbTUFYX1NLQl9GUkFHUysxXTsgCiB9OwogCiAvKiBkZWZpbml0aW9ucyBmb3IgdHlwZSBmaWVsZCAqLwpAQCAtMTE4OSw2ICsxMjU2LDcgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHJlc2V0X3dvcms7CiAJc3RydWN0IGRlbGF5ZWRfd29yayB0eF90aW1lb3V0X3dvcms7CiAJdTMyIG1heF9mcmFtZV9zaXplOworCXUzMiBkZXZpY2VfaWQ7CiB9OwogCiAjZW5kaWYJCQkJLyogX1FMQTNYWFhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8tcmVncy5oIGIvZHJpdmVycy9uZXQvczJpby1yZWdzLmgKaW5kZXggYTkxNGZlZi4uMGUzNDVjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby1yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvczJpby1yZWdzLmgKQEAgLTE1LDcgKzE1LDcgQEAKIAogI2RlZmluZSBUQkQgMAogCi10eXBlZGVmIHN0cnVjdCBfWEVOQV9kZXZfY29uZmlnIHsKK3N0cnVjdCBYRU5BX2Rldl9jb25maWcgewogLyogQ29udmVudGlvbjogbUhBTF9YWFggaXMgbWFzaywgdkhBTF9YWFggaXMgdmFsdWUgKi8KIAogLyogR2VuZXJhbCBDb250cm9sLVN0YXR1cyBSZWdpc3RlcnMgKi8KQEAgLTMwMCw2ICszMDAsNyBAQAogCXU2NCBncGlvX2NvbnRyb2w7CiAjZGVmaW5lIEdQSU9fQ1RSTF9HUElPXzAJCUJJVCg4KQogCXU2NCBtaXNjX2NvbnRyb2w7CisjZGVmaW5lIEZBVUxUX0JFSEFWSU9VUgkJCUJJVCgwKQogI2RlZmluZSBFWFRfUkVRX0VOCQkJQklUKDEpCiAjZGVmaW5lIE1JU0NfTElOS19TVEFCSUxJVFlfUFJEKHZhbCkgICB2QklUKHZhbCwyOSwzKQogCkBAIC04NTEsOSArODUyLDkgQEAKICNkZWZpbmUgU1BJX0NPTlRST0xfRE9ORQkJQklUKDYpCiAJdTY0IHNwaV9kYXRhOwogI2RlZmluZSBTUElfREFUQV9XUklURShkYXRhLGxlbikJdkJJVChkYXRhLDAsbGVuKQotfSBYRU5BX2Rldl9jb25maWdfdDsKK307CiAKLSNkZWZpbmUgWEVOQV9SRUdfU1BBQ0UJc2l6ZW9mKFhFTkFfZGV2X2NvbmZpZ190KQorI2RlZmluZSBYRU5BX1JFR19TUEFDRQlzaXplb2Yoc3RydWN0IFhFTkFfZGV2X2NvbmZpZykKICNkZWZpbmUJWEVOQV9FRVBST01fU1BBQ0UgKDB4MDEgPDwgMTEpCiAKICNlbmRpZgkJCQkvKiBfUkVHU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggMWRkNjZiOC4uNjM5ZmJjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtNzcsNyArNzcsNyBAQAogI2luY2x1ZGUgInMyaW8uaCIKICNpbmNsdWRlICJzMmlvLXJlZ3MuaCIKIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4wLjE1LjIiCisjZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMTYuMSIKIAogLyogUzJpbyBEcml2ZXIgbmFtZSAmIHZlcnNpb24uICovCiBzdGF0aWMgY2hhciBzMmlvX2RyaXZlcl9uYW1lW10gPSAiTmV0ZXJpb24iOwpAQCAtODYsNyArODYsNyBAQAogc3RhdGljIGludCByeGRfc2l6ZVs0XSA9IHszMiw0OCw0OCw2NH07CiBzdGF0aWMgaW50IHJ4ZF9jb3VudFs0XSA9IHsxMjcsODUsODUsNjN9OwogCi1zdGF0aWMgaW5saW5lIGludCBSWERfSVNfVVAyRFQoUnhEX3QgKnJ4ZHApCitzdGF0aWMgaW5saW5lIGludCBSWERfSVNfVVAyRFQoc3RydWN0IFJ4RF90ICpyeGRwKQogewogCWludCByZXQ7CiAKQEAgLTExMSw5ICsxMTEsOSBAQAogI2RlZmluZSBUQVNLTEVUX0lOX1VTRSB0ZXN0X2FuZF9zZXRfYml0KDAsICgmc3AtPnRhc2tsZXRfc3RhdHVzKSkKICNkZWZpbmUgUEFOSUMJMQogI2RlZmluZSBMT1cJMgotc3RhdGljIGlubGluZSBpbnQgcnhfYnVmZmVyX2xldmVsKG5pY190ICogc3AsIGludCByeGJfc2l6ZSwgaW50IHJpbmcpCitzdGF0aWMgaW5saW5lIGludCByeF9idWZmZXJfbGV2ZWwoc3RydWN0IHMyaW9fbmljICogc3AsIGludCByeGJfc2l6ZSwgaW50IHJpbmcpCiB7Ci0JbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKIAogCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKIAlpZiAocnhiX3NpemUgPD0gcnhkX2NvdW50W3NwLT5yeGRfbW9kZV0pCkBAIC0yODYsNyArMjg2LDcgQEAKIHN0YXRpYyB2b2lkIHMyaW9fdmxhbl9yeF9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwKQogewotCW5pY190ICpuaWMgPSBkZXYtPnByaXY7CisJc3RydWN0IHMyaW9fbmljICpuaWMgPSBkZXYtPnByaXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPnR4X2xvY2ssIGZsYWdzKTsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogLyogVW5yZWdpc3RlciB0aGUgdmxhbiAqLwogc3RhdGljIHZvaWQgczJpb192bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgdmlkKQogewotCW5pY190ICpuaWMgPSBkZXYtPnByaXY7CisJc3RydWN0IHMyaW9fbmljICpuaWMgPSBkZXYtPnByaXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPnR4X2xvY2ssIGZsYWdzKTsKQEAgLTQwMSw5ICs0MDEsMTAgQEAKICAqIGFnZ3JlZ2F0aW9uIGhhcHBlbnMgdW50aWwgd2UgaGl0IG1heCBJUCBwa3Qgc2l6ZSg2NEspCiAgKi8KIFMySU9fUEFSTV9JTlQobHJvX21heF9wa3RzLCAweEZGRkYpOwotI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCiBTMklPX1BBUk1fSU5UKGluZGljYXRlX21heF9wa3RzLCAwKTsKLSNlbmRpZgorCitTMklPX1BBUk1fSU5UKG5hcGksIDEpOworUzJJT19QQVJNX0lOVCh1Zm8sIDApOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHR4X2ZpZm9fbGVuW01BWF9UWF9GSUZPU10gPQogICAgIHtERUZBVUxUX0ZJRk9fMF9MRU4sIFsxIC4uLihNQVhfVFhfRklGT1MgLSAxKV0gPSBERUZBVUxUX0ZJRk9fMV83X0xFTn07CkBAIC00NTcsMTQgKzQ1OCwxNCBAQAogCXUzMiBzaXplOwogCXZvaWQgKnRtcF92X2FkZHIsICp0bXBfdl9hZGRyX25leHQ7CiAJZG1hX2FkZHJfdCB0bXBfcF9hZGRyLCB0bXBfcF9hZGRyX25leHQ7Ci0JUnhEX2Jsb2NrX3QgKnByZV9yeGRfYmxrID0gTlVMTDsKLQlpbnQgaSwgaiwgYmxrX2NudCwgcnhfc3osIHR4X3N6OworCXN0cnVjdCBSeERfYmxvY2sgKnByZV9yeGRfYmxrID0gTlVMTDsKKwlpbnQgaSwgaiwgYmxrX2NudDsKIAlpbnQgbHN0X3NpemUsIGxzdF9wZXJfcGFnZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CiAJdW5zaWduZWQgbG9uZyB0bXA7Ci0JYnVmZkFkZF90ICpiYTsKKwlzdHJ1Y3QgYnVmZkFkZCAqYmE7CiAKLQltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKIAogCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CkBAIC00ODIsMTMgKzQ4MywxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlsc3Rfc2l6ZSA9IChzaXplb2YoVHhEX3QpICogY29uZmlnLT5tYXhfdHhkcyk7Ci0JdHhfc3ogPSBsc3Rfc2l6ZSAqIHNpemU7CisJbHN0X3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBUeEQpICogY29uZmlnLT5tYXhfdHhkcyk7CiAJbHN0X3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gbHN0X3NpemU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CiAJCWludCBmaWZvX2xlbiA9IGNvbmZpZy0+dHhfY2ZnW2ldLmZpZm9fbGVuOwotCQlpbnQgbGlzdF9ob2xkZXJfc2l6ZSA9IGZpZm9fbGVuICogc2l6ZW9mKGxpc3RfaW5mb19ob2xkX3QpOworCQlpbnQgbGlzdF9ob2xkZXJfc2l6ZSA9IGZpZm9fbGVuICogc2l6ZW9mKHN0cnVjdCBsaXN0X2luZm9faG9sZCk7CiAJCW1hY19jb250cm9sLT5maWZvc1tpXS5saXN0X2luZm8gPSBrbWFsbG9jKGxpc3RfaG9sZGVyX3NpemUsCiAJCQkJCQkJICBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtYWNfY29udHJvbC0+Zmlmb3NbaV0ubGlzdF9pbmZvKSB7CkBAIC01NzksMTAgKzU3OSw5IEBACiAJCQltYWNfY29udHJvbC0+cmluZ3NbaV0uYmxvY2tfY291bnQ7CiAJfQogCWlmIChuaWMtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzEpCi0JCXNpemUgPSAoc2l6ZSAqIChzaXplb2YoUnhEMV90KSkpOworCQlzaXplID0gKHNpemUgKiAoc2l6ZW9mKHN0cnVjdCBSeEQxKSkpOwogCWVsc2UKLQkJc2l6ZSA9IChzaXplICogKHNpemVvZihSeEQzX3QpKSk7Ci0Jcnhfc3ogPSBzaXplOworCQlzaXplID0gKHNpemUgKiAoc2l6ZW9mKHN0cnVjdCBSeEQzKSkpOwogCiAJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgewogCQltYWNfY29udHJvbC0+cmluZ3NbaV0ucnhfY3Vycl9nZXRfaW5mby5ibG9ja19pbmRleCA9IDA7CkBAIC02MDAsNyArNTk5LDcgQEAKIAkJCQkocnhkX2NvdW50W25pYy0+cnhkX21vZGVdICsgMSk7CiAJCS8qICBBbGxvY2F0aW5nIGFsbCB0aGUgUnggYmxvY2tzICovCiAJCWZvciAoaiA9IDA7IGogPCBibGtfY250OyBqKyspIHsKLQkJCXJ4X2Jsb2NrX2luZm9fdCAqcnhfYmxvY2tzOworCQkJc3RydWN0IHJ4X2Jsb2NrX2luZm8gKnJ4X2Jsb2NrczsKIAkJCWludCBsOwogCiAJCQlyeF9ibG9ja3MgPSAmbWFjX2NvbnRyb2wtPnJpbmdzW2ldLnJ4X2Jsb2Nrc1tqXTsKQEAgLTYyMCw5ICs2MTksMTEgQEAKIAkJCW1lbXNldCh0bXBfdl9hZGRyLCAwLCBzaXplKTsKIAkJCXJ4X2Jsb2Nrcy0+YmxvY2tfdmlydF9hZGRyID0gdG1wX3ZfYWRkcjsKIAkJCXJ4X2Jsb2Nrcy0+YmxvY2tfZG1hX2FkZHIgPSB0bXBfcF9hZGRyOwotCQkJcnhfYmxvY2tzLT5yeGRzID0ga21hbGxvYyhzaXplb2YocnhkX2luZm9fdCkqCisJCQlyeF9ibG9ja3MtPnJ4ZHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnhkX2luZm8pKgogCQkJCQkJICByeGRfY291bnRbbmljLT5yeGRfbW9kZV0sCiAJCQkJCQkgIEdGUF9LRVJORUwpOworCQkJaWYgKCFyeF9ibG9ja3MtPnJ4ZHMpCisJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQlmb3IgKGw9MDsgbDxyeGRfY291bnRbbmljLT5yeGRfbW9kZV07bCsrKSB7CiAJCQkJcnhfYmxvY2tzLT5yeGRzW2xdLnZpcnRfYWRkciA9CiAJCQkJCXJ4X2Jsb2Nrcy0+YmxvY2tfdmlydF9hZGRyICsKQEAgLTY0NSw3ICs2NDYsNyBAQAogCQkJCW1hY19jb250cm9sLT5yaW5nc1tpXS5yeF9ibG9ja3NbKGogKyAxKSAlCiAJCQkJCSAgICAgIGJsa19jbnRdLmJsb2NrX2RtYV9hZGRyOwogCi0JCQlwcmVfcnhkX2JsayA9IChSeERfYmxvY2tfdCAqKSB0bXBfdl9hZGRyOworCQkJcHJlX3J4ZF9ibGsgPSAoc3RydWN0IFJ4RF9ibG9jayAqKSB0bXBfdl9hZGRyOwogCQkJcHJlX3J4ZF9ibGstPnJlc2VydmVkXzJfcE5leHRfUnhEX2Jsb2NrID0KIAkJCSAgICAodW5zaWduZWQgbG9uZykgdG1wX3ZfYWRkcl9uZXh0OwogCQkJcHJlX3J4ZF9ibGstPnBOZXh0X1J4RF9CbGtfcGh5c2ljYWwgPQpAQCAtNjYxLDE0ICs2NjIsMTQgQEAKIAkJCWJsa19jbnQgPSBjb25maWctPnJ4X2NmZ1tpXS5udW1fcnhkIC8KIAkJCSAgIChyeGRfY291bnRbbmljLT5yeGRfbW9kZV0rIDEpOwogCQkJbWFjX2NvbnRyb2wtPnJpbmdzW2ldLmJhID0KLQkJCQlrbWFsbG9jKChzaXplb2YoYnVmZkFkZF90ICopICogYmxrX2NudCksCisJCQkJa21hbGxvYygoc2l6ZW9mKHN0cnVjdCBidWZmQWRkICopICogYmxrX2NudCksCiAJCQkJICAgICBHRlBfS0VSTkVMKTsKIAkJCWlmICghbWFjX2NvbnRyb2wtPnJpbmdzW2ldLmJhKQogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJZm9yIChqID0gMDsgaiA8IGJsa19jbnQ7IGorKykgewogCQkJCWludCBrID0gMDsKIAkJCQltYWNfY29udHJvbC0+cmluZ3NbaV0uYmFbal0gPQotCQkJCQlrbWFsbG9jKChzaXplb2YoYnVmZkFkZF90KSAqCisJCQkJCWttYWxsb2MoKHNpemVvZihzdHJ1Y3QgYnVmZkFkZCkgKgogCQkJCQkJKHJ4ZF9jb3VudFtuaWMtPnJ4ZF9tb2RlXSArIDEpKSwKIAkJCQkJCUdGUF9LRVJORUwpOwogCQkJCWlmICghbWFjX2NvbnRyb2wtPnJpbmdzW2ldLmJhW2pdKQpAQCAtNzAwLDcgKzcwMSw3IEBACiAJfQogCiAJLyogQWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gb2YgU3RhdGlzdGljcyBibG9jayAqLwotCXNpemUgPSBzaXplb2YoU3RhdEluZm9fdCk7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3RhdF9ibG9jayk7CiAJbWFjX2NvbnRyb2wtPnN0YXRzX21lbSA9IHBjaV9hbGxvY19jb25zaXN0ZW50CiAJICAgIChuaWMtPnBkZXYsIHNpemUsICZtYWNfY29udHJvbC0+c3RhdHNfbWVtX3BoeSk7CiAKQEAgLTcxNSw3ICs3MTYsNyBAQAogCW1hY19jb250cm9sLT5zdGF0c19tZW1fc3ogPSBzaXplOwogCiAJdG1wX3ZfYWRkciA9IG1hY19jb250cm9sLT5zdGF0c19tZW07Ci0JbWFjX2NvbnRyb2wtPnN0YXRzX2luZm8gPSAoU3RhdEluZm9fdCAqKSB0bXBfdl9hZGRyOworCW1hY19jb250cm9sLT5zdGF0c19pbmZvID0gKHN0cnVjdCBzdGF0X2Jsb2NrICopIHRtcF92X2FkZHI7CiAJbWVtc2V0KHRtcF92X2FkZHIsIDAsIHNpemUpOwogCURCR19QUklOVChJTklUX0RCRywgIiVzOlJpbmcgTWVtIFBIWTogMHglbGx4XG4iLCBkZXYtPm5hbWUsCiAJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdG1wX3BfYWRkcik7CkBAIC03MzUsNyArNzM2LDcgQEAKIAlpbnQgaSwgaiwgYmxrX2NudCwgc2l6ZTsKIAl2b2lkICp0bXBfdl9hZGRyOwogCWRtYV9hZGRyX3QgdG1wX3BfYWRkcjsKLQltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKIAlpbnQgbHN0X3NpemUsIGxzdF9wZXJfcGFnZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CkBAIC03NDYsNyArNzQ3LDcgQEAKIAltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOwogCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKIAotCWxzdF9zaXplID0gKHNpemVvZihUeERfdCkgKiBjb25maWctPm1heF90eGRzKTsKKwlsc3Rfc2l6ZSA9IChzaXplb2Yoc3RydWN0IFR4RCkgKiBjb25maWctPm1heF90eGRzKTsKIAlsc3RfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyBsc3Rfc2l6ZTsKIAogCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKQEAgLTgwOSw3ICs4MTAsNyBAQAogCQkJCWlmICghbWFjX2NvbnRyb2wtPnJpbmdzW2ldLmJhW2pdKQogCQkJCQljb250aW51ZTsKIAkJCQl3aGlsZSAoayAhPSByeGRfY291bnRbbmljLT5yeGRfbW9kZV0pIHsKLQkJCQkJYnVmZkFkZF90ICpiYSA9CisJCQkJCXN0cnVjdCBidWZmQWRkICpiYSA9CiAJCQkJCQkmbWFjX2NvbnRyb2wtPnJpbmdzW2ldLmJhW2pdW2tdOwogCQkJCQlrZnJlZShiYS0+YmFfMF9vcmcpOwogCQkJCQlrZnJlZShiYS0+YmFfMV9vcmcpOwpAQCAtODM1LDkgKzgzNiw5IEBACiAgKiBzMmlvX3ZlcmlmeV9wY2lfbW9kZSAtCiAgKi8KIAotc3RhdGljIGludCBzMmlvX3ZlcmlmeV9wY2lfbW9kZShuaWNfdCAqbmljKQorc3RhdGljIGludCBzMmlvX3ZlcmlmeV9wY2lfbW9kZShzdHJ1Y3QgczJpb19uaWMgKm5pYykKIHsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKIAlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOwogCWludCAgICAgbW9kZTsKIApAQCAtODY4LDkgKzg2OSw5IEBACiAvKioKICAqIHMyaW9fcHJpbnRfcGNpX21vZGUgLQogICovCi1zdGF0aWMgaW50IHMyaW9fcHJpbnRfcGNpX21vZGUobmljX3QgKm5pYykKK3N0YXRpYyBpbnQgczJpb19wcmludF9wY2lfbW9kZShzdHJ1Y3QgczJpb19uaWMgKm5pYykKIHsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKIAlyZWdpc3RlciB1NjQgdmFsNjQgPSAwOwogCWludAltb2RlOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKQEAgLTkzOCwxMyArOTM5LDEzIEBACiAKIHN0YXRpYyBpbnQgaW5pdF9uaWMoc3RydWN0IHMyaW9fbmljICpuaWMpCiB7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OwogCXJlZ2lzdGVyIHU2NCB2YWw2NCA9IDA7CiAJdm9pZCBfX2lvbWVtICphZGQ7CiAJdTMyIHRpbWU7CiAJaW50IGksIGo7Ci0JbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CiAJaW50IGR0eF9jbnQgPSAwOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBtZW1fc2hhcmU7CkBAIC0xNDE0LDcgKzE0MTUsNyBAQAogCiAJdmFsNjQgPSBUVElfREFUQTJfTUVNX1RYX1VGQ19BKDB4MTApIHwKIAkgICAgVFRJX0RBVEEyX01FTV9UWF9VRkNfQigweDIwKSB8Ci0JICAgIFRUSV9EQVRBMl9NRU1fVFhfVUZDX0MoMHg3MCkgfCBUVElfREFUQTJfTUVNX1RYX1VGQ19EKDB4ODApOworCSAgICBUVElfREFUQTJfTUVNX1RYX1VGQ19DKDB4NDApIHwgVFRJX0RBVEEyX01FTV9UWF9VRkNfRCgweDgwKTsKIAl3cml0ZXEodmFsNjQsICZiYXIwLT50dGlfZGF0YTJfbWVtKTsKIAogCXZhbDY0ID0gVFRJX0NNRF9NRU1fV0UgfCBUVElfQ01EX01FTV9TVFJPQkVfTkVXX0NNRDsKQEAgLTE2MTAsNyArMTYxMSw4IEBACiAJICogdGhhdCBkb2VzIG5vdCBzdGFydCBvbiBhbiBBREIgdG8gcmVkdWNlIGRpc2Nvbm5lY3RzLgogCSAqLwogCWlmIChuaWMtPmRldmljZV90eXBlID09IFhGUkFNRV9JSV9ERVZJQ0UpIHsKLQkJdmFsNjQgPSBFWFRfUkVRX0VOIHwgTUlTQ19MSU5LX1NUQUJJTElUWV9QUkQoMyk7CisJCXZhbDY0ID0gRkFVTFRfQkVIQVZJT1VSIHwgRVhUX1JFUV9FTiB8CisJCQlNSVNDX0xJTktfU1RBQklMSVRZX1BSRCgzKTsKIAkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+bWlzY19jb250cm9sKTsKIAkJdmFsNjQgPSByZWFkcSgmYmFyMC0+cGljX2NvbnRyb2wyKTsKIAkJdmFsNjQgJj0gfihCSVQoMTMpfEJJVCgxNCl8QklUKDE1KSk7CkBAIC0xNjI2LDcgKzE2MjgsNyBAQAogI2RlZmluZSBMSU5LX1VQX0RPV05fSU5URVJSVVBUCQkxCiAjZGVmaW5lIE1BQ19STUFDX0VSUl9USU1FUgkJMgogCi1zdGF0aWMgaW50IHMyaW9fbGlua19mYXVsdF9pbmRpY2F0aW9uKG5pY190ICpuaWMpCitzdGF0aWMgaW50IHMyaW9fbGlua19mYXVsdF9pbmRpY2F0aW9uKHN0cnVjdCBzMmlvX25pYyAqbmljKQogewogCWlmIChuaWMtPmludHJfdHlwZSAhPSBJTlRBKQogCQlyZXR1cm4gTUFDX1JNQUNfRVJSX1RJTUVSOwpAQCAtMTY0OSwxNCArMTY1MSwxNCBAQAogCiBzdGF0aWMgdm9pZCBlbl9kaXNfYWJsZV9uaWNfaW50cnMoc3RydWN0IHMyaW9fbmljICpuaWMsIHUxNiBtYXNrLCBpbnQgZmxhZykKIHsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKIAlyZWdpc3RlciB1NjQgdmFsNjQgPSAwLCB0ZW1wNjQgPSAwOwogCiAJLyogIFRvcCBsZXZlbCBpbnRlcnJ1cHQgY2xhc3NpZmljYXRpb24gKi8KIAkvKiAgUElDIEludGVycnVwdHMgKi8KIAlpZiAoKG1hc2sgJiAoVFhfUElDX0lOVFIgfCBSWF9QSUNfSU5UUikpKSB7CiAJCS8qICBFbmFibGUgUElDIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayByZWdpc3RlciAqLwotCQl2YWw2NCA9IFRYUElDX0lOVF9NIHwgUElDX1JYX0lOVF9NOworCQl2YWw2NCA9IFRYUElDX0lOVF9NOwogCQlpZiAoZmxhZyA9PSBFTkFCTEVfSU5UUlMpIHsKIAkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKIAkJCXRlbXA2NCAmPSB+KCh1NjQpIHZhbDY0KTsKQEAgLTE2OTQsNzAgKzE2OTYsNiBAQAogCQl9CiAJfQogCi0JLyogIERNQSBJbnRlcnJ1cHRzICovCi0JLyogIEVuYWJsaW5nL0Rpc2FibGluZyBUeCBETUEgaW50ZXJydXB0cyAqLwotCWlmIChtYXNrICYgVFhfRE1BX0lOVFIpIHsKLQkJLyogRW5hYmxlIFR4RE1BIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayByZWdpc3RlciAqLwotCQl2YWw2NCA9IFRYRE1BX0lOVF9NOwotCQlpZiAoZmxhZyA9PSBFTkFCTEVfSU5UUlMpIHsKLQkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKLQkJCXRlbXA2NCAmPSB+KCh1NjQpIHZhbDY0KTsKLQkJCXdyaXRlcSh0ZW1wNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKLQkJCS8qCi0JCQkgKiBLZWVwIGFsbCBpbnRlcnJ1cHRzIG90aGVyIHRoYW4gUEZDIGludGVycnVwdAotCQkJICogYW5kIFBDQyBpbnRlcnJ1cHQgZGlzYWJsZWQgaW4gRE1BIGxldmVsLgotCQkJICovCi0JCQl2YWw2NCA9IERJU0FCTEVfQUxMX0lOVFJTICYgfihUWERNQV9QRkNfSU5UX00gfAotCQkJCQkJICAgICAgVFhETUFfUENDX0lOVF9NKTsKLQkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnR4ZG1hX2ludF9tYXNrKTsKLQkJCS8qCi0JCQkgKiBFbmFibGUgb25seSB0aGUgTUlTQyBlcnJvciAxIGludGVycnVwdCBpbiBQRkMgYmxvY2sKLQkJCSAqLwotCQkJdmFsNjQgPSBESVNBQkxFX0FMTF9JTlRSUyAmICh+UEZDX01JU0NfRVJSXzEpOwotCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cGZjX2Vycl9tYXNrKTsKLQkJCS8qCi0JCQkgKiBFbmFibGUgb25seSB0aGUgRkJfRUNDIGVycm9yIGludGVycnVwdCBpbiBQQ0MgYmxvY2sKLQkJCSAqLwotCQkJdmFsNjQgPSBESVNBQkxFX0FMTF9JTlRSUyAmICh+UENDX0ZCX0VDQ19FUlIpOwotCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cGNjX2Vycl9tYXNrKTsKLQkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKLQkJCS8qCi0JCQkgKiBEaXNhYmxlIFR4RE1BIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzawotCQkJICogcmVnaXN0ZXIKLQkJCSAqLwotCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLCAmYmFyMC0+dHhkbWFfaW50X21hc2spOwotCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLCAmYmFyMC0+cGZjX2Vycl9tYXNrKTsKLQkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKLQkJCXZhbDY0IHw9IHRlbXA2NDsKLQkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOwotCQl9Ci0JfQotCi0JLyogIEVuYWJsaW5nL0Rpc2FibGluZyBSeCBETUEgaW50ZXJydXB0cyAqLwotCWlmIChtYXNrICYgUlhfRE1BX0lOVFIpIHsKLQkJLyogIEVuYWJsZSBSeERNQSBJbnRycyBpbiB0aGUgZ2VuZXJhbCBpbnRyIG1hc2sgcmVnaXN0ZXIgKi8KLQkJdmFsNjQgPSBSWERNQV9JTlRfTTsKLQkJaWYgKGZsYWcgPT0gRU5BQkxFX0lOVFJTKSB7Ci0JCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7Ci0JCQl0ZW1wNjQgJj0gfigodTY0KSB2YWw2NCk7Ci0JCQl3cml0ZXEodGVtcDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7Ci0JCQkvKgotCQkJICogQWxsIFJ4RE1BIGJsb2NrIGludGVycnVwdHMgYXJlIGRpc2FibGVkIGZvciBub3cKLQkJCSAqIFRPRE8KLQkJCSAqLwotCQkJd3JpdGVxKERJU0FCTEVfQUxMX0lOVFJTLCAmYmFyMC0+cnhkbWFfaW50X21hc2spOwotCQl9IGVsc2UgaWYgKGZsYWcgPT0gRElTQUJMRV9JTlRSUykgewotCQkJLyoKLQkJCSAqIERpc2FibGUgUnhETUEgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrCi0JCQkgKiByZWdpc3RlcgotCQkJICovCi0JCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT5yeGRtYV9pbnRfbWFzayk7Ci0JCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7Ci0JCQl2YWw2NCB8PSB0ZW1wNjQ7Ci0JCQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKLQkJfQotCX0KLQogCS8qICBNQUMgSW50ZXJydXB0cyAqLwogCS8qICBFbmFibGluZy9EaXNhYmxpbmcgTUFDIGludGVycnVwdHMgKi8KIAlpZiAobWFzayAmIChUWF9NQUNfSU5UUiB8IFJYX01BQ19JTlRSKSkgewpAQCAtMTc4NCw1MyArMTcyMiw2IEBACiAJCX0KIAl9CiAKLQkvKiAgWEdYUyBJbnRlcnJ1cHRzICovCi0JaWYgKG1hc2sgJiAoVFhfWEdYU19JTlRSIHwgUlhfWEdYU19JTlRSKSkgewotCQl2YWw2NCA9IFRYWEdYU19JTlRfTSB8IFJYWEdYU19JTlRfTTsKLQkJaWYgKGZsYWcgPT0gRU5BQkxFX0lOVFJTKSB7Ci0JCQl0ZW1wNjQgPSByZWFkcSgmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7Ci0JCQl0ZW1wNjQgJj0gfigodTY0KSB2YWw2NCk7Ci0JCQl3cml0ZXEodGVtcDY0LCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7Ci0JCQkvKgotCQkJICogQWxsIFhHWFMgYmxvY2sgZXJyb3IgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgZm9yIG5vdwotCQkJICogVE9ETwotCQkJICovCi0JCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT54Z3hzX2ludF9tYXNrKTsKLQkJfSBlbHNlIGlmIChmbGFnID09IERJU0FCTEVfSU5UUlMpIHsKLQkJCS8qCi0JCQkgKiBEaXNhYmxlIE1DIEludHJzIGluIHRoZSBnZW5lcmFsIGludHIgbWFzayByZWdpc3RlcgotCQkJICovCi0JCQl3cml0ZXEoRElTQUJMRV9BTExfSU5UUlMsICZiYXIwLT54Z3hzX2ludF9tYXNrKTsKLQkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKLQkJCXZhbDY0IHw9IHRlbXA2NDsKLQkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOwotCQl9Ci0JfQotCi0JLyogIE1lbW9yeSBDb250cm9sbGVyKE1DKSBpbnRlcnJ1cHRzICovCi0JaWYgKG1hc2sgJiBNQ19JTlRSKSB7Ci0JCXZhbDY0ID0gTUNfSU5UX007Ci0JCWlmIChmbGFnID09IEVOQUJMRV9JTlRSUykgewotCQkJdGVtcDY0ID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOwotCQkJdGVtcDY0ICY9IH4oKHU2NCkgdmFsNjQpOwotCQkJd3JpdGVxKHRlbXA2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOwotCQkJLyoKLQkJCSAqIEVuYWJsZSBhbGwgTUMgSW50cnMuCi0JCQkgKi8KLQkJCXdyaXRlcSgweDAsICZiYXIwLT5tY19pbnRfbWFzayk7Ci0JCQl3cml0ZXEoMHgwLCAmYmFyMC0+bWNfZXJyX21hc2spOwotCQl9IGVsc2UgaWYgKGZsYWcgPT0gRElTQUJMRV9JTlRSUykgewotCQkJLyoKLQkJCSAqIERpc2FibGUgTUMgSW50cnMgaW4gdGhlIGdlbmVyYWwgaW50ciBtYXNrIHJlZ2lzdGVyCi0JCQkgKi8KLQkJCXdyaXRlcShESVNBQkxFX0FMTF9JTlRSUywgJmJhcjAtPm1jX2ludF9tYXNrKTsKLQkJCXRlbXA2NCA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKLQkJCXZhbDY0IHw9IHRlbXA2NDsKLQkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdlbmVyYWxfaW50X21hc2spOwotCQl9Ci0JfQotCi0KIAkvKiAgVHggdHJhZmZpYyBpbnRlcnJ1cHRzICovCiAJaWYgKG1hc2sgJiBUWF9UUkFGRklDX0lOVFIpIHsKIAkJdmFsNjQgPSBUWFRSQUZGSUNfSU5UX007CkBAIC0xODc3LDQxICsxNzY4LDM2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGNoZWNrX3ByY19wY2Nfc3RhdGUodTY0IHZhbDY0LCBpbnQgZmxhZywgaW50IHJldl9pZCwgaW50IGhlcmMpCisvKioKKyAqICB2ZXJpZnlfcGNjX3F1aWVzY2VudC0gQ2hlY2tzIGZvciBQQ0MgcXVpZXNjZW50IHN0YXRlCisgKiAgUmV0dXJuOiAxIElmIFBDQyBpcyBxdWllc2NlbmNlCisgKiAgICAgICAgICAwIElmIFBDQyBpcyBub3QgcXVpZXNjZW5jZQorICovCitzdGF0aWMgaW50IHZlcmlmeV9wY2NfcXVpZXNjZW50KHN0cnVjdCBzMmlvX25pYyAqc3AsIGludCBmbGFnKQogewotCWludCByZXQgPSAwOworCWludCByZXQgPSAwLCBoZXJjOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXU2NCB2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX3N0YXR1cyk7CisJCisJaGVyYyA9IChzcC0+ZGV2aWNlX3R5cGUgPT0gWEZSQU1FX0lJX0RFVklDRSk7CiAKIAlpZiAoZmxhZyA9PSBGQUxTRSkgewotCQlpZiAoKCFoZXJjICYmIChyZXZfaWQgPj0gNCkpIHx8IGhlcmMpIHsKLQkJCWlmICghKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUk1BQ19QQ0NfSURMRSkgJiYKLQkJCSAgICAoKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUkNfUFJDX1FVSUVTQ0VOVCkgPT0KLQkJCSAgICAgQURBUFRFUl9TVEFUVVNfUkNfUFJDX1FVSUVTQ0VOVCkpIHsKKwkJaWYgKCghaGVyYyAmJiAoZ2V0X3hlbmFfcmV2X2lkKHNwLT5wZGV2KSA+PSA0KSkgfHwgaGVyYykgeworCQkJaWYgKCEodmFsNjQgJiBBREFQVEVSX1NUQVRVU19STUFDX1BDQ19JRExFKSkKIAkJCQlyZXQgPSAxOwotCQkJfQotCQl9ZWxzZSB7Ci0JCQlpZiAoISh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JNQUNfUENDX0ZPVVJfSURMRSkgJiYKLQkJCSAgICAoKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUkNfUFJDX1FVSUVTQ0VOVCkgPT0KLQkJCSAgICAgQURBUFRFUl9TVEFUVVNfUkNfUFJDX1FVSUVTQ0VOVCkpIHsKKwkJfSBlbHNlIHsKKwkJCWlmICghKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUk1BQ19QQ0NfRk9VUl9JRExFKSkKIAkJCQlyZXQgPSAxOwotCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKCghaGVyYyAmJiAocmV2X2lkID49IDQpKSB8fCBoZXJjKSB7CisJCWlmICgoIWhlcmMgJiYgKGdldF94ZW5hX3Jldl9pZChzcC0+cGRldikgPj0gNCkpIHx8IGhlcmMpIHsKIAkJCWlmICgoKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUk1BQ19QQ0NfSURMRSkgPT0KLQkJCSAgICAgQURBUFRFUl9TVEFUVVNfUk1BQ19QQ0NfSURMRSkgJiYKLQkJCSAgICAoISh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQpIHx8Ci0JCQkgICAgICgodmFsNjQgJiBBREFQVEVSX1NUQVRVU19SQ19QUkNfUVVJRVNDRU5UKSA9PQotCQkJICAgICAgQURBUFRFUl9TVEFUVVNfUkNfUFJDX1FVSUVTQ0VOVCkpKSB7CisJCQkgICAgIEFEQVBURVJfU1RBVFVTX1JNQUNfUENDX0lETEUpKQogCQkJCXJldCA9IDE7Ci0JCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoKCh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JNQUNfUENDX0ZPVVJfSURMRSkgPT0KLQkJCSAgICAgQURBUFRFUl9TVEFUVVNfUk1BQ19QQ0NfRk9VUl9JRExFKSAmJgotCQkJICAgICghKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUkNfUFJDX1FVSUVTQ0VOVCkgfHwKLQkJCSAgICAgKCh2YWw2NCAmIEFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQpID09Ci0JCQkgICAgICBBREFQVEVSX1NUQVRVU19SQ19QUkNfUVVJRVNDRU5UKSkpIHsKKwkJCSAgICAgQURBUFRFUl9TVEFUVVNfUk1BQ19QQ0NfRk9VUl9JRExFKSkKIAkJCQlyZXQgPSAxOwotCQkJfQogCQl9CiAJfQogCkBAIC0xOTE5LDkgKzE4MDUsNiBAQAogfQogLyoqCiAgKiAgdmVyaWZ5X3hlbmFfcXVpZXNjZW5jZSAtIENoZWNrcyB3aGV0aGVyIHRoZSBIL1cgaXMgcmVhZHkKLSAqICBAdmFsNjQgOiAgVmFsdWUgcmVhZCBmcm9tIGFkYXB0ZXIgc3RhdHVzIHJlZ2lzdGVyLgotICogIEBmbGFnIDogaW5kaWNhdGVzIGlmIHRoZSBhZGFwdGVyIGVuYWJsZSBiaXQgd2FzIGV2ZXIgd3JpdHRlbiBvbmNlCi0gKiAgYmVmb3JlLgogICogIERlc2NyaXB0aW9uOiBSZXR1cm5zIHdoZXRoZXIgdGhlIEgvVyBpcyByZWFkeSB0byBnbyBvciBub3QuIERlcGVuZGluZwogICogIG9uIHdoZXRoZXIgYWRhcHRlciBlbmFibGUgYml0IHdhcyB3cml0dGVuIG9yIG5vdCB0aGUgY29tcGFyaXNvbgogICogIGRpZmZlcnMgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHBhc3NlcyB0aGUgaW5wdXQgYXJndW1lbnQgZmxhZyB0bwpAQCAtMTkzMCwyNCArMTgxMyw2MyBAQAogICogICAgICAgICAgMCBJZiBYZW5hIGlzIG5vdCBxdWllc2NlbmNlCiAgKi8KIAotc3RhdGljIGludCB2ZXJpZnlfeGVuYV9xdWllc2NlbmNlKG5pY190ICpzcCwgdTY0IHZhbDY0LCBpbnQgZmxhZykKK3N0YXRpYyBpbnQgdmVyaWZ5X3hlbmFfcXVpZXNjZW5jZShzdHJ1Y3QgczJpb19uaWMgKnNwKQogewotCWludCByZXQgPSAwLCBoZXJjOwotCXU2NCB0bXA2NCA9IH4oKHU2NCkgdmFsNjQpOwotCWludCByZXZfaWQgPSBnZXRfeGVuYV9yZXZfaWQoc3AtPnBkZXYpOworCWludCAgbW9kZTsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwl1NjQgdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9zdGF0dXMpOworCW1vZGUgPSBzMmlvX3ZlcmlmeV9wY2lfbW9kZShzcCk7CiAKLQloZXJjID0gKHNwLT5kZXZpY2VfdHlwZSA9PSBYRlJBTUVfSUlfREVWSUNFKTsKLQlpZiAoIQotCSAgICAodG1wNjQgJgotCSAgICAgKEFEQVBURVJfU1RBVFVTX1RETUFfUkVBRFkgfCBBREFQVEVSX1NUQVRVU19SRE1BX1JFQURZIHwKLQkgICAgICBBREFQVEVSX1NUQVRVU19QRkNfUkVBRFkgfCBBREFQVEVSX1NUQVRVU19UTUFDX0JVRl9FTVBUWSB8Ci0JICAgICAgQURBUFRFUl9TVEFUVVNfUElDX1FVSUVTQ0VOVCB8IEFEQVBURVJfU1RBVFVTX01DX0RSQU1fUkVBRFkgfAotCSAgICAgIEFEQVBURVJfU1RBVFVTX01DX1FVRVVFU19SRUFEWSB8IEFEQVBURVJfU1RBVFVTX01fUExMX0xPQ0sgfAotCSAgICAgIEFEQVBURVJfU1RBVFVTX1BfUExMX0xPQ0spKSkgewotCQlyZXQgPSBjaGVja19wcmNfcGNjX3N0YXRlKHZhbDY0LCBmbGFnLCByZXZfaWQsIGhlcmMpOworCWlmICghKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfVERNQV9SRUFEWSkpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlcyIsICJURE1BIGlzIG5vdCByZWFkeSEiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUkRNQV9SRUFEWSkpIHsKKwlEQkdfUFJJTlQoRVJSX0RCRywgIiVzIiwgIlJETUEgaXMgbm90IHJlYWR5ISIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCEodmFsNjQgJiBBREFQVEVSX1NUQVRVU19QRkNfUkVBRFkpKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXMiLCAiUEZDIGlzIG5vdCByZWFkeSEiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfVE1BQ19CVUZfRU1QVFkpKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXMiLCAiVE1BQyBCVUYgaXMgbm90IGVtcHR5ISIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCEodmFsNjQgJiBBREFQVEVSX1NUQVRVU19QSUNfUVVJRVNDRU5UKSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzIiwgIlBJQyBpcyBub3QgUVVJRVNDRU5UISIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCEodmFsNjQgJiBBREFQVEVSX1NUQVRVU19NQ19EUkFNX1JFQURZKSkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzIiwgIk1DX0RSQU0gaXMgbm90IHJlYWR5ISIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCEodmFsNjQgJiBBREFQVEVSX1NUQVRVU19NQ19RVUVVRVNfUkVBRFkpKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXMiLCAiTUNfUVVFVUVTIGlzIG5vdCByZWFkeSEiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfTV9QTExfTE9DSykpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlcyIsICJNX1BMTCBpcyBub3QgbG9ja2VkISIpOworCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gcmV0OworCS8qCisJICogSW4gUENJIDMzIG1vZGUsIHRoZSBQX1BMTCBpcyBub3QgdXNlZCwgYW5kIHRoZXJlZm9yZSwKKwkgKiB0aGUgdGhlIFBfUExMX0xPQ0sgYml0IGluIHRoZSBhZGFwdGVyX3N0YXR1cyByZWdpc3RlciB3aWxsCisJICogbm90IGJlIGFzc2VydGVkLgorCSAqLworCWlmICghKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUF9QTExfTE9DSykgJiYKKwkJc3AtPmRldmljZV90eXBlID09IFhGUkFNRV9JSV9ERVZJQ0UgJiYgbW9kZSAhPQorCQlQQ0lfTU9ERV9QQ0lfMzMpIHsKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlcyIsICJQX1BMTCBpcyBub3QgbG9ja2VkISIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCEoKHZhbDY0ICYgQURBUFRFUl9TVEFUVVNfUkNfUFJDX1FVSUVTQ0VOVCkgPT0KKwkJCUFEQVBURVJfU1RBVFVTX1JDX1BSQ19RVUlFU0NFTlQpKSB7CisJCURCR19QUklOVChFUlJfREJHLCAiJXMiLCAiUkNfUFJDIGlzIG5vdCBRVUlFU0NFTlQhIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKIH0KIAogLyoqCkBAIC0xOTU4LDkgKzE4ODAsOSBAQAogICoKICAqLwogCi1zdGF0aWMgdm9pZCBmaXhfbWFjX2FkZHJlc3MobmljX3QgKiBzcCkKK3N0YXRpYyB2b2lkIGZpeF9tYWNfYWRkcmVzcyhzdHJ1Y3QgczJpb19uaWMgKiBzcCkKIHsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CiAJdTY0IHZhbDY0OwogCWludCBpID0gMDsKIApAQCAtMTk4NiwxMSArMTkwOCwxMSBAQAogCiBzdGF0aWMgaW50IHN0YXJ0X25pYyhzdHJ1Y3QgczJpb19uaWMgKm5pYykKIHsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CiAJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMDsKIAl1MTYgc3ViaWQsIGk7Ci0JbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CiAKIAltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOwpAQCAtMjA1Miw3ICsxOTc0LDcgQEAKIAkgKiBpdC4KIAkgKi8KIAl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX3N0YXR1cyk7Ci0JaWYgKCF2ZXJpZnlfeGVuYV9xdWllc2NlbmNlKG5pYywgdmFsNjQsIG5pYy0+ZGV2aWNlX2VuYWJsZWRfb25jZSkpIHsKKwlpZiAoIXZlcmlmeV94ZW5hX3F1aWVzY2VuY2UobmljKSkgewogCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBkZXZpY2UgaXMgbm90IHJlYWR5LCAiLCBkZXYtPm5hbWUpOwogCQlEQkdfUFJJTlQoRVJSX0RCRywgIkFkYXB0ZXIgc3RhdHVzIHJlYWRzOiAweCVsbHhcbiIsCiAJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpIHZhbDY0KTsKQEAgLTIwOTUsMTEgKzIwMTcsMTIgQEAKIC8qKgogICogczJpb190eGRsX2dldHNrYiAtIEdldCB0aGUgc2tiIGZyb20gdHhkbCwgdW5tYXAgYW5kIHJldHVybiBza2IKICAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICpzMmlvX3R4ZGxfZ2V0c2tiKGZpZm9faW5mb190ICpmaWZvX2RhdGEsIFR4RF90ICp0eGRscCwgaW50IGdldF9vZmYpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnMyaW9fdHhkbF9nZXRza2Ioc3RydWN0IGZpZm9faW5mbyAqZmlmb19kYXRhLCBzdHJ1Y3QgXAorCQkJCQlUeEQgKnR4ZGxwLCBpbnQgZ2V0X29mZikKIHsKLQluaWNfdCAqbmljID0gZmlmb19kYXRhLT5uaWM7CisJc3RydWN0IHMyaW9fbmljICpuaWMgPSBmaWZvX2RhdGEtPm5pYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCVR4RF90ICp0eGRzOworCXN0cnVjdCBUeEQgKnR4ZHM7CiAJdTE2IGosIGZyZ19jbnQ7CiAKIAl0eGRzID0gdHhkbHA7CkBAIC0yMTEzLDcgKzIwMzYsNyBAQAogCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKHVuc2lnbmVkIGxvbmcpCiAJCQl0eGRzLT5Ib3N0X0NvbnRyb2wpOwogCWlmICghc2tiKSB7Ci0JCW1lbXNldCh0eGRscCwgMCwgKHNpemVvZihUeERfdCkgKiBmaWZvX2RhdGEtPm1heF90eGRzKSk7CisJCW1lbXNldCh0eGRscCwgMCwgKHNpemVvZihzdHJ1Y3QgVHhEKSAqIGZpZm9fZGF0YS0+bWF4X3R4ZHMpKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKQEAgLTIxMzIsNyArMjA1NSw3IEBACiAJCQkJICAgICAgIGZyYWctPnNpemUsIFBDSV9ETUFfVE9ERVZJQ0UpOwogCQl9CiAJfQotCW1lbXNldCh0eGRscCwwLCAoc2l6ZW9mKFR4RF90KSAqIGZpZm9fZGF0YS0+bWF4X3R4ZHMpKTsKKwltZW1zZXQodHhkbHAsMCwgKHNpemVvZihzdHJ1Y3QgVHhEKSAqIGZpZm9fZGF0YS0+bWF4X3R4ZHMpKTsKIAlyZXR1cm4oc2tiKTsKIH0KIApAQCAtMjE0OCw5ICsyMDcxLDkgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlUeERfdCAqdHhkcDsKKwlzdHJ1Y3QgVHhEICp0eGRwOwogCWludCBpLCBqOwotCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBtYWNfaW5mbyAqbWFjX2NvbnRyb2w7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOwogCWludCBjbnQgPSAwOwogCkBAIC0yMTU5LDcgKzIwODIsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgewogCQlmb3IgKGogPSAwOyBqIDwgY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4gLSAxOyBqKyspIHsKLQkJCXR4ZHAgPSAoVHhEX3QgKikgbWFjX2NvbnRyb2wtPmZpZm9zW2ldLmxpc3RfaW5mb1tqXS4KKwkJCXR4ZHAgPSAoc3RydWN0IFR4RCAqKSBtYWNfY29udHJvbC0+Zmlmb3NbaV0ubGlzdF9pbmZvW2pdLgogCQkJICAgIGxpc3RfdmlydF9hZGRyOwogCQkJc2tiID0gczJpb190eGRsX2dldHNrYigmbWFjX2NvbnRyb2wtPmZpZm9zW2ldLCB0eGRwLCBqKTsKIAkJCWlmIChza2IpIHsKQEAgLTIxODcsMTAgKzIxMTAsMTAgQEAKIAogc3RhdGljIHZvaWQgc3RvcF9uaWMoc3RydWN0IHMyaW9fbmljICpuaWMpCiB7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CiAJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMDsKIAl1MTYgaW50ZXJydXB0aWJsZTsKLQltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKIAogCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CkBAIC0yMjA4LDE0ICsyMTMxLDE1IEBACiAJd3JpdGVxKHZhbDY0LCAmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKIH0KIAotc3RhdGljIGludCBmaWxsX3J4ZF8zYnVmKG5pY190ICpuaWMsIFJ4RF90ICpyeGRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBmaWxsX3J4ZF8zYnVmKHN0cnVjdCBzMmlvX25pYyAqbmljLCBzdHJ1Y3QgUnhEX3QgKnJ4ZHAsIHN0cnVjdCBcCisJCQkJc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ19saXN0OwogCXZvaWQgKnRtcDsKIAogCS8qIEJ1ZmZlci0xIHJlY2VpdmVzIEwzL0w0IGhlYWRlcnMgKi8KLQkoKFJ4RDNfdCopcnhkcCktPkJ1ZmZlcjFfcHRyID0gcGNpX21hcF9zaW5nbGUKKwkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIgPSBwY2lfbWFwX3NpbmdsZQogCQkJKG5pYy0+cGRldiwgc2tiLT5kYXRhLCBsM2w0aGRyX3NpemUgKyA0LAogCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKIApAQCAtMjIyNiwxMyArMjE1MCwxNCBAQAogCQlyZXR1cm4gLUVOT01FTSA7CiAJfQogCWZyYWdfbGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCXNrYi0+dHJ1ZXNpemUgKz0gZnJhZ19saXN0LT50cnVlc2l6ZTsKIAlmcmFnX2xpc3QtPm5leHQgPSBOVUxMOwogCXRtcCA9ICh2b2lkICopQUxJR04oKGxvbmcpZnJhZ19saXN0LT5kYXRhLCBBTElHTl9TSVpFICsgMSk7CiAJZnJhZ19saXN0LT5kYXRhID0gdG1wOwogCWZyYWdfbGlzdC0+dGFpbCA9IHRtcDsKIAogCS8qIEJ1ZmZlci0yIHJlY2VpdmVzIEw0IGRhdGEgcGF5bG9hZCAqLwotCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMl9wdHIgPSBwY2lfbWFwX3NpbmdsZShuaWMtPnBkZXYsCisJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjJfcHRyID0gcGNpX21hcF9zaW5nbGUobmljLT5wZGV2LAogCQkJCWZyYWdfbGlzdC0+ZGF0YSwgZGV2LT5tdHUsCiAJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKIAlyeGRwLT5Db250cm9sXzIgfD0gU0VUX0JVRkZFUjFfU0laRV8zKGwzbDRoZHJfc2l6ZSArIDQpOwpAQCAtMjI2NiwxOCArMjE5MSwxNiBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCVJ4RF90ICpyeGRwOworCXN0cnVjdCBSeERfdCAqcnhkcDsKIAlpbnQgb2ZmLCBvZmYxLCBzaXplLCBibG9ja19ubywgYmxvY2tfbm8xOwogCXUzMiBhbGxvY190YWIgPSAwOwogCXUzMiBhbGxvY19jbnQ7Ci0JbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CiAJdTY0IHRtcDsKLQlidWZmQWRkX3QgKmJhOwotI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCisJc3RydWN0IGJ1ZmZBZGQgKmJhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jZW5kaWYKLQlSeERfdCAqZmlyc3RfcnhkcCA9IE5VTEw7CisJc3RydWN0IFJ4RF90ICpmaXJzdF9yeGRwID0gTlVMTDsKIAogCW1hY19jb250cm9sID0gJm5pYy0+bWFjX2NvbnRyb2w7CiAJY29uZmlnID0gJm5pYy0+Y29uZmlnOwpAQCAtMjMyMCwxMiArMjI0MywxNSBAQAogCQkJREJHX1BSSU5UKElOVFJfREJHLCAiJXM6IE5leHQgYmxvY2sgYXQ6ICVwXG4iLAogCQkJCSAgZGV2LT5uYW1lLCByeGRwKTsKIAkJfQotI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7Ci0JCW1hY19jb250cm9sLT5yaW5nc1tyaW5nX25vXS5wdXRfcG9zID0KLQkJICAgIChibG9ja19ubyAqIChyeGRfY291bnRbbmljLT5yeGRfbW9kZV0gKyAxKSkgKyBvZmY7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5pYy0+cHV0X2xvY2ssIGZsYWdzKTsKLSNlbmRpZgorCQlpZighbmFwaSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm5pYy0+cHV0X2xvY2ssIGZsYWdzKTsKKwkJCW1hY19jb250cm9sLT5yaW5nc1tyaW5nX25vXS5wdXRfcG9zID0KKwkJCShibG9ja19ubyAqIChyeGRfY291bnRbbmljLT5yeGRfbW9kZV0gKyAxKSkgKyBvZmY7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuaWMtPnB1dF9sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQltYWNfY29udHJvbC0+cmluZ3NbcmluZ19ub10ucHV0X3BvcyA9CisJCQkoYmxvY2tfbm8gKiAocnhkX2NvdW50W25pYy0+cnhkX21vZGVdICsgMSkpICsgb2ZmOworCQl9CiAJCWlmICgocnhkcC0+Q29udHJvbF8xICYgUlhEX09XTl9YRU5BKSAmJgogCQkJKChuaWMtPnJ4ZF9tb2RlID49IFJYRF9NT0RFXzNBKSAmJgogCQkJCShyeGRwLT5Db250cm9sXzIgJiBCSVQoMCkpKSkgewpAQCAtMjM1Niw5ICsyMjgyLDkgQEAKIAkJfQogCQlpZiAobmljLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8xKSB7CiAJCQkvKiAxIGJ1ZmZlciBtb2RlIC0gbm9ybWFsIG9wZXJhdGlvbiBtb2RlICovCi0JCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKFJ4RDFfdCkpOworCQkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihzdHJ1Y3QgUnhEMSkpOwogCQkJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOwotCQkJKChSeEQxX3QqKXJ4ZHApLT5CdWZmZXIwX3B0ciA9IHBjaV9tYXBfc2luZ2xlCisJCQkoKHN0cnVjdCBSeEQxKilyeGRwKS0+QnVmZmVyMF9wdHIgPSBwY2lfbWFwX3NpbmdsZQogCQkJICAgIChuaWMtPnBkZXYsIHNrYi0+ZGF0YSwgc2l6ZSAtIE5FVF9JUF9BTElHTiwKIAkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJcnhkcC0+Q29udHJvbF8yID0gU0VUX0JVRkZFUjBfU0laRV8xKHNpemUgLSBORVRfSVBfQUxJR04pOwpAQCAtMjM3NSw3ICsyMzAxLDcgQEAKIAkJCSAqIHBheWxvYWQKIAkJCSAqLwogCi0JCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKFJ4RDNfdCkpOworCQkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihzdHJ1Y3QgUnhEMykpOwogCQkJYmEgPSAmbWFjX2NvbnRyb2wtPnJpbmdzW3Jpbmdfbm9dLmJhW2Jsb2NrX25vXVtvZmZdOwogCQkJc2tiX3Jlc2VydmUoc2tiLCBCVUYwX0xFTik7CiAJCQl0bXAgPSAodTY0KSh1bnNpZ25lZCBsb25nKSBza2ItPmRhdGE7CkBAIC0yMzg0LDEzICsyMzEwLDEzIEBACiAJCQlza2ItPmRhdGEgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZyl0bXA7CiAJCQlza2ItPnRhaWwgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZyl0bXA7CiAKLQkJCWlmICghKCgoUnhEM190KilyeGRwKS0+QnVmZmVyMF9wdHIpKQotCQkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMF9wdHIgPQorCQkJaWYgKCEoKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyKSkKKwkJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHIgPQogCQkJCSAgIHBjaV9tYXBfc2luZ2xlKG5pYy0+cGRldiwgYmEtPmJhXzAsIEJVRjBfTEVOLAogCQkJCQkgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJZWxzZQogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShuaWMtPnBkZXYsCi0JCQkJICAgIChkbWFfYWRkcl90KSAoKFJ4RDNfdCopcnhkcCktPkJ1ZmZlcjBfcHRyLAorCQkJCSAgICAoZG1hX2FkZHJfdCkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyLAogCQkJCSAgICBCVUYwX0xFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXJ4ZHAtPkNvbnRyb2xfMiA9IFNFVF9CVUZGRVIwX1NJWkVfMyhCVUYwX0xFTik7CiAJCQlpZiAobmljLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8zQikgewpAQCAtMjQwMCwxMyArMjMyNiwxMyBAQAogCQkJCSAqIEJ1ZmZlcjIgd2lsbCBoYXZlIEwzL0w0IGhlYWRlciBwbHVzCiAJCQkJICogTDQgcGF5bG9hZAogCQkJCSAqLwotCQkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMl9wdHIgPSBwY2lfbWFwX3NpbmdsZQorCQkJCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIyX3B0ciA9IHBjaV9tYXBfc2luZ2xlCiAJCQkJKG5pYy0+cGRldiwgc2tiLT5kYXRhLCBkZXYtPm10dSArIDQsCiAJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJCQkJLyogQnVmZmVyLTEgd2lsbCBiZSBkdW1teSBidWZmZXIuIE5vdCB1c2VkICovCi0JCQkJaWYgKCEoKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIxX3B0cikpIHsKLQkJCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIxX3B0ciA9CisJCQkJaWYgKCEoKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjFfcHRyKSkgeworCQkJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIgPQogCQkJCQkJcGNpX21hcF9zaW5nbGUobmljLT5wZGV2LAogCQkJCQkJYmEtPmJhXzEsIEJVRjFfTEVOLAogCQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKQEAgLTI0NjYsOSArMjM5Miw5IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5kZXY7CiAJaW50IGo7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlSeERfdCAqcnhkcDsKLQltYWNfaW5mb190ICptYWNfY29udHJvbDsKLQlidWZmQWRkX3QgKmJhOworCXN0cnVjdCBSeERfdCAqcnhkcDsKKwlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOworCXN0cnVjdCBidWZmQWRkICpiYTsKIAogCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKIAlmb3IgKGogPSAwIDsgaiA8IHJ4ZF9jb3VudFtzcC0+cnhkX21vZGVdOyBqKyspIHsKQEAgLTI0ODEsNDEgKzI0MDcsNDEgQEAKIAkJfQogCQlpZiAoc3AtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzEpIHsKIAkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsIChkbWFfYWRkcl90KQotCQkJCSAoKFJ4RDFfdCopcnhkcCktPkJ1ZmZlcjBfcHRyLAorCQkJCSAoKHN0cnVjdCBSeEQxKilyeGRwKS0+QnVmZmVyMF9wdHIsCiAJCQkJIGRldi0+bXR1ICsKIAkJCQkgSEVBREVSX0VUSEVSTkVUX0lJXzgwMl8zX1NJWkUKIAkJCQkgKyBIRUFERVJfODAyXzJfU0laRSArCiAJCQkJIEhFQURFUl9TTkFQX1NJWkUsCiAJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKFJ4RDFfdCkpOworCQkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihzdHJ1Y3QgUnhEMSkpOwogCQl9IGVsc2UgaWYoc3AtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzNCKSB7CiAJCQliYSA9ICZtYWNfY29udHJvbC0+cmluZ3NbcmluZ19ub10uCiAJCQkJYmFbYmxrXVtqXTsKIAkJCXBjaV91bm1hcF9zaW5nbGUoc3AtPnBkZXYsIChkbWFfYWRkcl90KQotCQkJCSAoKFJ4RDNfdCopcnhkcCktPkJ1ZmZlcjBfcHRyLAorCQkJCSAoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHIsCiAJCQkJIEJVRjBfTEVOLAogCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJICgoUnhEM190KilyeGRwKS0+QnVmZmVyMV9wdHIsCisJCQkJICgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIxX3B0ciwKIAkJCQkgQlVGMV9MRU4sCiAJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKHNwLT5wZGV2LCAoZG1hX2FkZHJfdCkKLQkJCQkgKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIyX3B0ciwKKwkJCQkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjJfcHRyLAogCQkJCSBkZXYtPm10dSArIDQsCiAJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKFJ4RDNfdCkpOworCQkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihzdHJ1Y3QgUnhEMykpOwogCQl9IGVsc2UgewogCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIwX3B0ciwgQlVGMF9MRU4sCisJCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyLCBCVUYwX0xFTiwKIAkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIxX3B0ciwKKwkJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIsCiAJCQkJbDNsNGhkcl9zaXplICsgNCwKIAkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJcGNpX3VubWFwX3NpbmdsZShzcC0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIyX3B0ciwgZGV2LT5tdHUsCisJCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjJfcHRyLCBkZXYtPm10dSwKIAkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJbWVtc2V0KHJ4ZHAsIDAsIHNpemVvZihSeEQzX3QpKTsKKwkJCW1lbXNldChyeGRwLCAwLCBzaXplb2Yoc3RydWN0IFJ4RDMpKTsKIAkJfQogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCWF0b21pY19kZWMoJnNwLT5yeF9idWZzX2xlZnRbcmluZ19ub10pOwpAQCAtMjUzNSw3ICsyNDYxLDcgQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPmRldjsKIAlpbnQgaSwgYmxrID0gMCwgYnVmX2NudCA9IDA7Ci0JbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CiAKIAltYWNfY29udHJvbCA9ICZzcC0+bWFjX2NvbnRyb2w7CkBAIC0yNTY4LDE1ICsyNDk0LDEzIEBACiAgKiAwIG9uIHN1Y2Nlc3MgYW5kIDEgaWYgdGhlcmUgYXJlIE5vIFJ4IHBhY2tldHMgdG8gYmUgcHJvY2Vzc2VkLgogICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TMklPX05BUEkpCiBzdGF0aWMgaW50IHMyaW9fcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCkKIHsKLQluaWNfdCAqbmljID0gZGV2LT5wcml2OworCXN0cnVjdCBzMmlvX25pYyAqbmljID0gZGV2LT5wcml2OwogCWludCBwa3RfY250ID0gMCwgb3JnX3BrdHNfdG9fcHJvY2VzczsKLQltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOwotCXU2NCB2YWw2NCA9IDB4RkZGRkZGRkZGRkZGRkZGRlVMTDsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CiAJaW50IGk7CiAKIAlhdG9taWNfaW5jKCZuaWMtPmlzcl9jbnQpOwpAQCAtMjU4OCw4ICsyNTEyLDggQEAKIAkJbmljLT5wa3RzX3RvX3Byb2Nlc3MgPSBkZXYtPnF1b3RhOwogCW9yZ19wa3RzX3RvX3Byb2Nlc3MgPSBuaWMtPnBrdHNfdG9fcHJvY2VzczsKIAotCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnJ4X3RyYWZmaWNfaW50KTsKLQl2YWw2NCA9IHJlYWRsKCZiYXIwLT5yeF90cmFmZmljX2ludCk7CisJd3JpdGVxKFMySU9fTUlOVVNfT05FLCAmYmFyMC0+cnhfdHJhZmZpY19pbnQpOworCXJlYWRsKCZiYXIwLT5yeF90cmFmZmljX2ludCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5yeF9yaW5nX251bTsgaSsrKSB7CiAJCXJ4X2ludHJfaGFuZGxlcigmbWFjX2NvbnRyb2wtPnJpbmdzW2ldKTsKQEAgLTI2MTUsNyArMjUzOSw3IEBACiAJfQogCS8qIFJlIGVuYWJsZSB0aGUgUnggaW50ZXJydXB0cy4gKi8KIAl3cml0ZXEoMHgwLCAmYmFyMC0+cnhfdHJhZmZpY19tYXNrKTsKLQl2YWw2NCA9IHJlYWRsKCZiYXIwLT5yeF90cmFmZmljX21hc2spOworCXJlYWRsKCZiYXIwLT5yeF90cmFmZmljX21hc2spOwogCWF0b21pY19kZWMoJm5pYy0+aXNyX2NudCk7CiAJcmV0dXJuIDA7CiAKQEAgLTI2MzMsNyArMjU1Nyw2IEBACiAJYXRvbWljX2RlYygmbmljLT5pc3JfY250KTsKIAlyZXR1cm4gMTsKIH0KLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKIC8qKgpAQCAtMjY0NywxMCArMjU3MCwxMCBAQAogICovCiBzdGF0aWMgdm9pZCBzMmlvX25ldHBvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQluaWNfdCAqbmljID0gZGV2LT5wcml2OwotCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBzMmlvX25pYyAqbmljID0gZGV2LT5wcml2OworCXN0cnVjdCBtYWNfaW5mbyAqbWFjX2NvbnRyb2w7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOwotCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOwogCXU2NCB2YWw2NCA9IDB4RkZGRkZGRkZGRkZGRkZGRlVMTDsKIAlpbnQgaTsKIApAQCAtMjY5OSwxNyArMjYyMiwxNSBAQAogICogIFJldHVybiBWYWx1ZToKICAqICBOT05FLgogICovCi1zdGF0aWMgdm9pZCByeF9pbnRyX2hhbmRsZXIocmluZ19pbmZvX3QgKnJpbmdfZGF0YSkKK3N0YXRpYyB2b2lkIHJ4X2ludHJfaGFuZGxlcihzdHJ1Y3QgcmluZ19pbmZvICpyaW5nX2RhdGEpCiB7Ci0JbmljX3QgKm5pYyA9IHJpbmdfZGF0YS0+bmljOworCXN0cnVjdCBzMmlvX25pYyAqbmljID0gcmluZ19kYXRhLT5uaWM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBuaWMtPmRldjsKIAlpbnQgZ2V0X2Jsb2NrLCBwdXRfYmxvY2ssIHB1dF9vZmZzZXQ7Ci0JcnhfY3Vycl9nZXRfaW5mb190IGdldF9pbmZvLCBwdXRfaW5mbzsKLQlSeERfdCAqcnhkcDsKKwlzdHJ1Y3QgcnhfY3Vycl9nZXRfaW5mbyBnZXRfaW5mbywgcHV0X2luZm87CisJc3RydWN0IFJ4RF90ICpyeGRwOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0jaWZuZGVmIENPTkZJR19TMklPX05BUEkKIAlpbnQgcGt0X2NudCA9IDA7Ci0jZW5kaWYKIAlpbnQgaTsKIAogCXNwaW5fbG9jaygmbmljLT5yeF9sb2NrKTsKQEAgLTI3MjIsMTkgKzI2NDMsMjEgQEAKIAogCWdldF9pbmZvID0gcmluZ19kYXRhLT5yeF9jdXJyX2dldF9pbmZvOwogCWdldF9ibG9jayA9IGdldF9pbmZvLmJsb2NrX2luZGV4OwotCXB1dF9pbmZvID0gcmluZ19kYXRhLT5yeF9jdXJyX3B1dF9pbmZvOworCW1lbWNweSgmcHV0X2luZm8sICZyaW5nX2RhdGEtPnJ4X2N1cnJfcHV0X2luZm8sIHNpemVvZihwdXRfaW5mbykpOwogCXB1dF9ibG9jayA9IHB1dF9pbmZvLmJsb2NrX2luZGV4OwogCXJ4ZHAgPSByaW5nX2RhdGEtPnJ4X2Jsb2Nrc1tnZXRfYmxvY2tdLnJ4ZHNbZ2V0X2luZm8ub2Zmc2V0XS52aXJ0X2FkZHI7Ci0jaWZuZGVmIENPTkZJR19TMklPX05BUEkKLQlzcGluX2xvY2soJm5pYy0+cHV0X2xvY2spOwotCXB1dF9vZmZzZXQgPSByaW5nX2RhdGEtPnB1dF9wb3M7Ci0Jc3Bpbl91bmxvY2soJm5pYy0+cHV0X2xvY2spOwotI2Vsc2UKLQlwdXRfb2Zmc2V0ID0gKHB1dF9ibG9jayAqIChyeGRfY291bnRbbmljLT5yeGRfbW9kZV0gKyAxKSkgKwotCQlwdXRfaW5mby5vZmZzZXQ7Ci0jZW5kaWYKKwlpZiAoIW5hcGkpIHsKKwkJc3Bpbl9sb2NrKCZuaWMtPnB1dF9sb2NrKTsKKwkJcHV0X29mZnNldCA9IHJpbmdfZGF0YS0+cHV0X3BvczsKKwkJc3Bpbl91bmxvY2soJm5pYy0+cHV0X2xvY2spOworCX0gZWxzZQorCQlwdXRfb2Zmc2V0ID0gcmluZ19kYXRhLT5wdXRfcG9zOworCiAJd2hpbGUgKFJYRF9JU19VUDJEVChyeGRwKSkgewotCQkvKiBJZiB5b3VyIGFyZSBuZXh0IHRvIHB1dCBpbmRleCB0aGVuIGl0J3MgRklGTyBmdWxsIGNvbmRpdGlvbiAqLworCQkvKgorCQkgKiBJZiB5b3VyIGFyZSBuZXh0IHRvIHB1dCBpbmRleCB0aGVuIGl0J3MKKwkJICogRklGTyBmdWxsIGNvbmRpdGlvbgorCQkgKi8KIAkJaWYgKChnZXRfYmxvY2sgPT0gcHV0X2Jsb2NrKSAmJgogCQkgICAgKGdldF9pbmZvLm9mZnNldCArIDEpID09IHB1dF9pbmZvLm9mZnNldCkgewogCQkJREJHX1BSSU5UKElOVFJfREJHLCAiJXM6IFJpbmcgRnVsbFxuIixkZXYtPm5hbWUpOwpAQCAtMjc1MCw3ICsyNjczLDcgQEAKIAkJfQogCQlpZiAobmljLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8xKSB7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJICgoUnhEMV90KilyeGRwKS0+QnVmZmVyMF9wdHIsCisJCQkJICgoc3RydWN0IFJ4RDEqKXJ4ZHApLT5CdWZmZXIwX3B0ciwKIAkJCQkgZGV2LT5tdHUgKwogCQkJCSBIRUFERVJfRVRIRVJORVRfSUlfODAyXzNfU0laRSArCiAJCQkJIEhFQURFUl84MDJfMl9TSVpFICsKQEAgLTI3NTgsMjIgKzI2ODEsMjIgQEAKIAkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJfSBlbHNlIGlmIChuaWMtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzNCKSB7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKLQkJCQkgKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIwX3B0ciwKKwkJCQkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyLAogCQkJCSBCVUYwX0xFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXBjaV91bm1hcF9zaW5nbGUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKLQkJCQkgKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIyX3B0ciwKKwkJCQkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjJfcHRyLAogCQkJCSBkZXYtPm10dSArIDQsCiAJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCX0gZWxzZSB7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobmljLT5wZGV2LCAoZG1hX2FkZHJfdCkKLQkJCQkJICgoUnhEM190KilyeGRwKS0+QnVmZmVyMF9wdHIsIEJVRjBfTEVOLAorCQkJCQkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyLCBCVUYwX0xFTiwKIAkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJCSAoKFJ4RDNfdCopcnhkcCktPkJ1ZmZlcjFfcHRyLAorCQkJCQkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjFfcHRyLAogCQkJCQkgbDNsNGhkcl9zaXplICsgNCwKIAkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKG5pYy0+cGRldiwgKGRtYV9hZGRyX3QpCi0JCQkJCSAoKFJ4RDNfdCopcnhkcCktPkJ1ZmZlcjJfcHRyLAorCQkJCQkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjJfcHRyLAogCQkJCQkgZGV2LT5tdHUsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCX0KIAkJcHJlZmV0Y2goc2tiLT5kYXRhKTsKQEAgLTI3OTIsMjAgKzI3MTUsMTcgQEAKIAkJCXJ4ZHAgPSByaW5nX2RhdGEtPnJ4X2Jsb2Nrc1tnZXRfYmxvY2tdLmJsb2NrX3ZpcnRfYWRkcjsKIAkJfQogCi0jaWZkZWYgQ09ORklHX1MySU9fTkFQSQogCQluaWMtPnBrdHNfdG9fcHJvY2VzcyAtPSAxOwotCQlpZiAoIW5pYy0+cGt0c190b19wcm9jZXNzKQorCQlpZiAoKG5hcGkpICYmICghbmljLT5wa3RzX3RvX3Byb2Nlc3MpKQogCQkJYnJlYWs7Ci0jZWxzZQogCQlwa3RfY250Kys7CiAJCWlmICgoaW5kaWNhdGVfbWF4X3BrdHMpICYmIChwa3RfY250ID4gaW5kaWNhdGVfbWF4X3BrdHMpKQogCQkJYnJlYWs7Ci0jZW5kaWYKIAl9CiAJaWYgKG5pYy0+bHJvKSB7CiAJCS8qIENsZWFyIGFsbCBMUk8gc2Vzc2lvbnMgYmVmb3JlIGV4aXRpbmcgKi8KIAkJZm9yIChpPTA7IGk8TUFYX0xST19TRVNTSU9OUzsgaSsrKSB7Ci0JCQlscm9fdCAqbHJvID0gJm5pYy0+bHJvMF9uW2ldOworCQkJc3RydWN0IGxybyAqbHJvID0gJm5pYy0+bHJvMF9uW2ldOwogCQkJaWYgKGxyby0+aW5fdXNlKSB7CiAJCQkJdXBkYXRlX0wzTDRfaGVhZGVyKG5pYywgbHJvKTsKIAkJCQlxdWV1ZV9yeF9mcmFtZShscm8tPnBhcmVudCk7CkBAIC0yODI5LDE3ICsyNzQ5LDE3IEBACiAgKiAgTk9ORQogICovCiAKLXN0YXRpYyB2b2lkIHR4X2ludHJfaGFuZGxlcihmaWZvX2luZm9fdCAqZmlmb19kYXRhKQorc3RhdGljIHZvaWQgdHhfaW50cl9oYW5kbGVyKHN0cnVjdCBmaWZvX2luZm8gKmZpZm9fZGF0YSkKIHsKLQluaWNfdCAqbmljID0gZmlmb19kYXRhLT5uaWM7CisJc3RydWN0IHMyaW9fbmljICpuaWMgPSBmaWZvX2RhdGEtPm5pYzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIG5pYy0+ZGV2OwotCXR4X2N1cnJfZ2V0X2luZm9fdCBnZXRfaW5mbywgcHV0X2luZm87CisJc3RydWN0IHR4X2N1cnJfZ2V0X2luZm8gZ2V0X2luZm8sIHB1dF9pbmZvOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JVHhEX3QgKnR4ZGxwOworCXN0cnVjdCBUeEQgKnR4ZGxwOwogCiAJZ2V0X2luZm8gPSBmaWZvX2RhdGEtPnR4X2N1cnJfZ2V0X2luZm87Ci0JcHV0X2luZm8gPSBmaWZvX2RhdGEtPnR4X2N1cnJfcHV0X2luZm87Ci0JdHhkbHAgPSAoVHhEX3QgKikgZmlmb19kYXRhLT5saXN0X2luZm9bZ2V0X2luZm8ub2Zmc2V0XS4KKwltZW1jcHkoJnB1dF9pbmZvLCAmZmlmb19kYXRhLT50eF9jdXJyX3B1dF9pbmZvLCBzaXplb2YocHV0X2luZm8pKTsKKwl0eGRscCA9IChzdHJ1Y3QgVHhEICopIGZpZm9fZGF0YS0+bGlzdF9pbmZvW2dldF9pbmZvLm9mZnNldF0uCiAJICAgIGxpc3RfdmlydF9hZGRyOwogCXdoaWxlICgoISh0eGRscC0+Q29udHJvbF8xICYgVFhEX0xJU1RfT1dOX1hFTkEpKSAmJgogCSAgICAgICAoZ2V0X2luZm8ub2Zmc2V0ICE9IHB1dF9pbmZvLm9mZnNldCkgJiYKQEAgLTI4NTQsMTEgKzI3NzQsMTAgQEAKIAkJCX0KIAkJCWlmICgoZXJyID4+IDQ4KSA9PSAweEEpIHsKIAkJCQlEQkdfUFJJTlQoVFhfREJHLCAiVHhEIHJldHVybmVkIGR1ZSBcCi10byBsb3NzIG9mIGxpbmtcbiIpOworCQkJCQkJdG8gbG9zcyBvZiBsaW5rXG4iKTsKIAkJCX0KIAkJCWVsc2UgewotCQkJCURCR19QUklOVChFUlJfREJHLCAiKioqVHhEIGVycm9yIFwKLSVsbHhcbiIsIGVycik7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIqKipUeEQgZXJyb3IgJWxseFxuIiwgZXJyKTsKIAkJCX0KIAkJfQogCkBAIC0yODc3LDcgKzI3OTYsNyBAQAogCQlnZXRfaW5mby5vZmZzZXQrKzsKIAkJaWYgKGdldF9pbmZvLm9mZnNldCA9PSBnZXRfaW5mby5maWZvX2xlbiArIDEpCiAJCQlnZXRfaW5mby5vZmZzZXQgPSAwOwotCQl0eGRscCA9IChUeERfdCAqKSBmaWZvX2RhdGEtPmxpc3RfaW5mbworCQl0eGRscCA9IChzdHJ1Y3QgVHhEICopIGZpZm9fZGF0YS0+bGlzdF9pbmZvCiAJCSAgICBbZ2V0X2luZm8ub2Zmc2V0XS5saXN0X3ZpcnRfYWRkcjsKIAkJZmlmb19kYXRhLT50eF9jdXJyX2dldF9pbmZvLm9mZnNldCA9CiAJCSAgICBnZXRfaW5mby5vZmZzZXQ7CkBAIC0yOTAyLDggKzI4MjEsOCBAQAogc3RhdGljIHZvaWQgczJpb19tZGlvX3dyaXRlKHUzMiBtbWRfdHlwZSwgdTY0IGFkZHIsIHUxNiB2YWx1ZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1NjQgdmFsNjQgPSAweDA7Ci0JbmljX3QgKnNwID0gZGV2LT5wcml2OwotCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOwogCiAJLy9hZGRyZXNzIHRyYW5zYWN0aW9uCiAJdmFsNjQgPSB2YWw2NCB8IE1ESU9fTU1EX0lORFhfQUREUihhZGRyKQpAQCAtMjk1MSw4ICsyODcwLDggQEAKIHsKIAl1NjQgdmFsNjQgPSAweDA7CiAJdTY0IHJ2YWw2NCA9IDB4MDsKLQluaWNfdCAqc3AgPSBkZXYtPnByaXY7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CiAKIAkvKiBhZGRyZXNzIHRyYW5zYWN0aW9uICovCiAJdmFsNjQgPSB2YWw2NCB8IE1ESU9fTU1EX0lORFhfQUREUihhZGRyKQpAQCAtMzA1NSw4ICsyOTc0LDggQEAKIAl1NjQgdmFsNjQgPSAweDA7CiAJdTY0IGFkZHIgID0gMHgwOwogCi0JbmljX3QgKnNwID0gZGV2LT5wcml2OwotCVN0YXRJbmZvX3QgKnN0YXRfaW5mbyA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvOworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IHN0YXRfYmxvY2sgKnN0YXRfaW5mbyA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvOwogCiAJLyogQ2hlY2sgdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUgTURJTyBzbGF2ZSAqLwogCWFkZHIgPSAweDAwMDA7CkBAIC0zMTU0LDEwICszMDczLDEyIEBACiBzdGF0aWMgdm9pZCBhbGFybV9pbnRyX2hhbmRsZXIoc3RydWN0IHMyaW9fbmljICpuaWMpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBuaWMtPmRldjsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKIAlyZWdpc3RlciB1NjQgdmFsNjQgPSAwLCBlcnJfcmVnID0gMDsKIAl1NjQgY250OwogCWludCBpOworCWlmIChhdG9taWNfcmVhZCgmbmljLT5jYXJkX3N0YXRlKSA9PSBDQVJEX0RPV04pCisJCXJldHVybjsKIAluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQucmluZ19mdWxsX2NudCA9IDA7CiAJLyogSGFuZGxpbmcgdGhlIFhQQUsgY291bnRlcnMgdXBkYXRlICovCiAJaWYobmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT54cGFrX3N0YXQueHBha190aW1lcl9jb3VudCA8IDcyMDAwKSB7CkBAIC0zMjk3LDYgKzMyMTgsMjUgQEAKIAl9CiAJcmV0dXJuIHJldDsKIH0KKy8qCisgKiBjaGVja19wY2lfZGV2aWNlX2lkIC0gQ2hlY2tzIGlmIHRoZSBkZXZpY2UgaWQgaXMgc3VwcG9ydGVkCisgKiBAaWQgOiBkZXZpY2UgaWQKKyAqIERlc2NyaXB0aW9uOiBGdW5jdGlvbiB0byBjaGVjayBpZiB0aGUgcGNpIGRldmljZSBpZCBpcyBzdXBwb3J0ZWQgYnkgZHJpdmVyLgorICogUmV0dXJuIHZhbHVlOiBBY3R1YWwgZGV2aWNlIGlkIGlmIHN1cHBvcnRlZCBlbHNlIFBDSV9BTllfSUQKKyAqLworc3RhdGljIHUxNiBjaGVja19wY2lfZGV2aWNlX2lkKHUxNiBpZCkKK3sKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0hFUkNfV0lOOgorCWNhc2UgUENJX0RFVklDRV9JRF9IRVJDX1VOSToKKwkJcmV0dXJuIFhGUkFNRV9JSV9ERVZJQ0U7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1MySU9fVU5JOgorCWNhc2UgUENJX0RFVklDRV9JRF9TMklPX1dJTjoKKwkJcmV0dXJuIFhGUkFNRV9JX0RFVklDRTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gUENJX0FOWV9JRDsKKwl9Cit9CiAKIC8qKgogICogIHMyaW9fcmVzZXQgLSBSZXNldHMgdGhlIGNhcmQuCkBAIC0zMzA4LDQyICszMjQ4LDU3IEBACiAgKiAgdm9pZC4KICAqLwogCi1zdGF0aWMgdm9pZCBzMmlvX3Jlc2V0KG5pY190ICogc3ApCitzdGF0aWMgdm9pZCBzMmlvX3Jlc2V0KHN0cnVjdCBzMmlvX25pYyAqIHNwKQogewotCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKIAl1NjQgdmFsNjQ7CiAJdTE2IHN1YmlkLCBwY2lfY21kOworCWludCBpOworCXUxNiB2YWwxNjsKKwlEQkdfUFJJTlQoSU5JVF9EQkcsIiVzIC0gUmVzZXR0aW5nIFhGcmFtZSBjYXJkICVzXG4iLAorCQkJX19GVU5DVElPTl9fLCBzcC0+ZGV2LT5uYW1lKTsKIAogCS8qIEJhY2sgdXAgIHRoZSBQQ0ktWCBDTUQgcmVnLCBkb250IHdhbnQgdG8gbG9zZSBNTVJCQywgT1NUIHNldHRpbmdzICovCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwgJihwY2lfY21kKSk7CiAKKwlpZiAoc3AtPmRldmljZV90eXBlID09IFhGUkFNRV9JSV9ERVZJQ0UpIHsKKwkJaW50IHJldDsKKwkJcmV0ID0gcGNpX3NldF9wb3dlcl9zdGF0ZShzcC0+cGRldiwgMyk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gcGNpX3NldF9wb3dlcl9zdGF0ZShzcC0+cGRldiwgMCk7CisJCWVsc2UgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsIiVzIFBNRSBiYXNlZCBTV19SZXNldCBmYWlsZWQhXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJZ290byBvbGRfd2F5OworCQl9CisJCW1zbGVlcCgyMCk7CisJCWdvdG8gbmV3X3dheTsKKwl9CitvbGRfd2F5OgogCXZhbDY0ID0gU1dfUkVTRVRfQUxMOwogCXdyaXRlcSh2YWw2NCwgJmJhcjAtPnN3X3Jlc2V0KTsKLQotCS8qCi0JICogQXQgdGhpcyBzdGFnZSwgaWYgdGhlIFBDSSB3cml0ZSBpcyBpbmRlZWQgY29tcGxldGVkLCB0aGUKLQkgKiBjYXJkIGlzIHJlc2V0IGFuZCBzbyBpcyB0aGUgUENJIENvbmZpZyBzcGFjZSBvZiB0aGUgZGV2aWNlLgotCSAqIFNvIGEgcmVhZCBjYW5ub3QgYmUgaXNzdWVkIGF0IHRoaXMgc3RhZ2Ugb24gYW55IG9mIHRoZQotCSAqIHJlZ2lzdGVycyB0byBlbnN1cmUgdGhlIHdyaXRlIGludG8gInN3X3Jlc2V0IiByZWdpc3RlcgotCSAqIGhhcyBnb25lIHRocm91Z2guCi0JICogUXVlc3Rpb246IElzIHRoZXJlIGFueSBzeXN0ZW0gY2FsbCB0aGF0IHdpbGwgZXhwbGljaXRseSBmb3JjZQotCSAqIGFsbCB0aGUgd3JpdGUgY29tbWFuZHMgc3RpbGwgcGVuZGluZyBvbiB0aGUgYnVzIHRvIGJlIHB1c2hlZAotCSAqIHRocm91Z2g/Ci0JICogQXMgb2Ygbm93IEknYW0ganVzdCBnaXZpbmcgYSAyNTBtcyBkZWxheSBhbmQgaG9waW5nIHRoYXQgdGhlCi0JICogUENJIHdyaXRlIHRvIHN3X3Jlc2V0IHJlZ2lzdGVyIGlzIGRvbmUgYnkgdGhpcyB0aW1lLgotCSAqLwotCW1zbGVlcCgyNTApOworbmV3X3dheToKIAlpZiAoc3Ryc3RyKHNwLT5wcm9kdWN0X25hbWUsICJDWDQiKSkgewogCQltc2xlZXAoNzUwKTsKIAl9Ci0KLQkvKiBSZXN0b3JlIHRoZSBQQ0kgc3RhdGUgc2F2ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAqLwotCXBjaV9yZXN0b3JlX3N0YXRlKHNwLT5wZGV2KTsKLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwKLQkJCQkgICAgIHBjaV9jbWQpOwotCXMyaW9faW5pdF9wY2koc3ApOwotCiAJbXNsZWVwKDI1MCk7CisJZm9yIChpID0gMDsgaSA8IFMySU9fTUFYX1BDSV9DT05GSUdfU1BBQ0VfUkVJTklUOyBpKyspIHsKKworCQkvKiBSZXN0b3JlIHRoZSBQQ0kgc3RhdGUgc2F2ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAqLworCQlwY2lfcmVzdG9yZV9zdGF0ZShzcC0+cGRldik7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHNwLT5wZGV2LCAweDIsICZ2YWwxNik7CisJCWlmIChjaGVja19wY2lfZGV2aWNlX2lkKHZhbDE2KSAhPSAodTE2KVBDSV9BTllfSUQpCisJCQlicmVhazsKKwkJbXNsZWVwKDIwMCk7CisJfQorCisJaWYgKGNoZWNrX3BjaV9kZXZpY2VfaWQodmFsMTYpID09ICh1MTYpUENJX0FOWV9JRCkgeworCQlEQkdfUFJJTlQoRVJSX0RCRywiJXMgU1dfUmVzZXQgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoc3AtPnBkZXYsIFBDSVhfQ09NTUFORF9SRUdJU1RFUiwgcGNpX2NtZCk7CisKKwlzMmlvX2luaXRfcGNpKHNwKTsKIAogCS8qIFNldCBzd2FwcGVyIHRvIGVuYWJsZSBJL08gcmVnaXN0ZXIgYWNjZXNzICovCiAJczJpb19zZXRfc3dhcHBlcihzcCk7CkBAIC0zMzk5LDEwICszMzU0LDEwIEBACiAgKiAgU1VDQ0VTUyBvbiBzdWNjZXNzIGFuZCBGQUlMVVJFIG9uIGZhaWx1cmUuCiAgKi8KIAotc3RhdGljIGludCBzMmlvX3NldF9zd2FwcGVyKG5pY190ICogc3ApCitzdGF0aWMgaW50IHMyaW9fc2V0X3N3YXBwZXIoc3RydWN0IHMyaW9fbmljICogc3ApCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5kZXY7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOwogCXU2NCB2YWw2NCwgdmFsdCwgdmFscjsKIAogCS8qCkBAIC0zNTI3LDkgKzM0ODIsOSBAQAogCXJldHVybiBTVUNDRVNTOwogfQogCi1zdGF0aWMgaW50IHdhaXRfZm9yX21zaXhfdHJhbnMobmljX3QgKm5pYywgaW50IGkpCitzdGF0aWMgaW50IHdhaXRfZm9yX21zaXhfdHJhbnMoc3RydWN0IHMyaW9fbmljICpuaWMsIGludCBpKQogewotCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOwogCXU2NCB2YWw2NDsKIAlpbnQgcmV0ID0gMCwgY250ID0gMDsKIApAQCAtMzU0OCw5ICszNTAzLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCByZXN0b3JlX3htc2lfZGF0YShuaWNfdCAqbmljKQorc3RhdGljIHZvaWQgcmVzdG9yZV94bXNpX2RhdGEoc3RydWN0IHMyaW9fbmljICpuaWMpCiB7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CiAJdTY0IHZhbDY0OwogCWludCBpOwogCkBAIC0zNTY2LDkgKzM1MjEsOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc3RvcmVfeG1zaV9kYXRhKG5pY190ICpuaWMpCitzdGF0aWMgdm9pZCBzdG9yZV94bXNpX2RhdGEoc3RydWN0IHMyaW9fbmljICpuaWMpCiB7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CiAJdTY0IHZhbDY0LCBhZGRyLCBkYXRhOwogCWludCBpOwogCkBAIC0zNTg5LDkgKzM1NDQsOSBAQAogCX0KIH0KIAotaW50IHMyaW9fZW5hYmxlX21zaShuaWNfdCAqbmljKQoraW50IHMyaW9fZW5hYmxlX21zaShzdHJ1Y3QgczJpb19uaWMgKm5pYykKIHsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKIAl1MTYgbXNpX2N0cmwsIG1zZ192YWw7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnID0gJm5pYy0+Y29uZmlnOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuaWMtPmRldjsKQEAgLTM2MzksOSArMzU5NCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgczJpb19lbmFibGVfbXNpX3gobmljX3QgKm5pYykKK3N0YXRpYyBpbnQgczJpb19lbmFibGVfbXNpX3goc3RydWN0IHMyaW9fbmljICpuaWMpCiB7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IG5pYy0+YmFyMDsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CiAJdTY0IHR4X21hdCwgcnhfbWF0OwogCXUxNiBtc2lfY29udHJvbDsgLyogVGVtcCB2YXJpYWJsZSAqLwogCWludCByZXQsIGksIGosIG1zaXhfaW5keCA9IDE7CkBAIC0zNzQ5LDcgKzM3MDQsNyBAQAogCiBzdGF0aWMgaW50IHMyaW9fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OwogCWludCBlcnIgPSAwOwogCiAJLyoKQEAgLTM4MDIsNyArMzc1Nyw3IEBACiAKIHN0YXRpYyBpbnQgczJpb19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OwogCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CkBAIC0zODI4LDE1ICszNzgzLDE1IEBACiAKIHN0YXRpYyBpbnQgczJpb194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JbmljX3QgKnNwID0gZGV2LT5wcml2OworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CiAJdTE2IGZyZ19jbnQsIGZyZ19sZW4sIGksIHF1ZXVlLCBxdWV1ZV9sZW4sIHB1dF9vZmYsIGdldF9vZmY7CiAJcmVnaXN0ZXIgdTY0IHZhbDY0OwotCVR4RF90ICp0eGRwOwotCVR4RklGT19lbGVtZW50X3QgX19pb21lbSAqdHhfZmlmbzsKKwlzdHJ1Y3QgVHhEICp0eGRwOworCXN0cnVjdCBUeEZJRk9fZWxlbWVudCBfX2lvbWVtICp0eF9maWZvOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTE2IHZsYW5fdGFnID0gMDsKIAlpbnQgdmxhbl9wcmlvcml0eSA9IDA7Ci0JbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CiAJaW50IG9mZmxvYWRfdHlwZTsKIApAQCAtMzg2NCw3ICszODE5LDcgQEAKIAogCXB1dF9vZmYgPSAodTE2KSBtYWNfY29udHJvbC0+Zmlmb3NbcXVldWVdLnR4X2N1cnJfcHV0X2luZm8ub2Zmc2V0OwogCWdldF9vZmYgPSAodTE2KSBtYWNfY29udHJvbC0+Zmlmb3NbcXVldWVdLnR4X2N1cnJfZ2V0X2luZm8ub2Zmc2V0OwotCXR4ZHAgPSAoVHhEX3QgKikgbWFjX2NvbnRyb2wtPmZpZm9zW3F1ZXVlXS5saXN0X2luZm9bcHV0X29mZl0uCisJdHhkcCA9IChzdHJ1Y3QgVHhEICopIG1hY19jb250cm9sLT5maWZvc1txdWV1ZV0ubGlzdF9pbmZvW3B1dF9vZmZdLgogCQlsaXN0X3ZpcnRfYWRkcjsKIAogCXF1ZXVlX2xlbiA9IG1hY19jb250cm9sLT5maWZvc1txdWV1ZV0udHhfY3Vycl9wdXRfaW5mby5maWZvX2xlbiArIDE7CkBAIC0zODg3LDEyICszODQyLDEwIEBACiAJfQogCiAJb2ZmbG9hZF90eXBlID0gczJpb19vZmZsb2FkX3R5cGUoc2tiKTsKLSNpZmRlZiBORVRJRl9GX1RTTwogCWlmIChvZmZsb2FkX3R5cGUgJiAoU0tCX0dTT19UQ1BWNCB8IFNLQl9HU09fVENQVjYpKSB7CiAJCXR4ZHAtPkNvbnRyb2xfMSB8PSBUWERfVENQX0xTT19FTjsKIAkJdHhkcC0+Q29udHJvbF8xIHw9IFRYRF9UQ1BfTFNPX01TUyhzMmlvX3RjcF9tc3Moc2tiKSk7CiAJfQotI2VuZGlmCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJdHhkcC0+Q29udHJvbF8yIHw9CiAJCSAgICAoVFhEX1RYX0NLT19JUFY0X0VOIHwgVFhEX1RYX0NLT19UQ1BfRU4gfApAQCAtMzk5MywxMyArMzk0NiwxMyBAQAogc3RhdGljIHZvaWQKIHMyaW9fYWxhcm1faGFuZGxlKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQluaWNfdCAqc3AgPSAobmljX3QgKilkYXRhOworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSAoc3RydWN0IHMyaW9fbmljICopZGF0YTsKIAogCWFsYXJtX2ludHJfaGFuZGxlcihzcCk7CiAJbW9kX3RpbWVyKCZzcC0+YWxhcm1fdGltZXIsIGppZmZpZXMgKyBIWiAvIDIpOwogfQogCi1zdGF0aWMgaW50IHMyaW9fY2hrX3J4X2J1ZmZlcnMobmljX3QgKnNwLCBpbnQgcm5nX24pCitzdGF0aWMgaW50IHMyaW9fY2hrX3J4X2J1ZmZlcnMoc3RydWN0IHMyaW9fbmljICpzcCwgaW50IHJuZ19uKQogewogCWludCByeGJfc2l6ZSwgbGV2ZWw7CiAKQEAgLTQwMzEsOSArMzk4NCw5IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgczJpb19tc2lfaGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9pZDsKLQluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IHMyaW9fbmljICpzcCA9IGRldi0+cHJpdjsKIAlpbnQgaTsKLQltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKIAogCWF0b21pY19pbmMoJnNwLT5pc3JfY250KTsKQEAgLTQwNjMsOCArNDAxNiw4IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzMmlvX21zaXhfcmluZ19oYW5kbGUoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXJpbmdfaW5mb190ICpyaW5nID0gKHJpbmdfaW5mb190ICopZGV2X2lkOwotCW5pY190ICpzcCA9IHJpbmctPm5pYzsKKwlzdHJ1Y3QgcmluZ19pbmZvICpyaW5nID0gKHN0cnVjdCByaW5nX2luZm8gKilkZXZfaWQ7CisJc3RydWN0IHMyaW9fbmljICpzcCA9IHJpbmctPm5pYzsKIAogCWF0b21pY19pbmMoJnNwLT5pc3JfY250KTsKIApAQCAtNDA3NywxNyArNDAzMCwxNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgczJpb19tc2l4X2ZpZm9faGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlmaWZvX2luZm9fdCAqZmlmbyA9IChmaWZvX2luZm9fdCAqKWRldl9pZDsKLQluaWNfdCAqc3AgPSBmaWZvLT5uaWM7CisJc3RydWN0IGZpZm9faW5mbyAqZmlmbyA9IChzdHJ1Y3QgZmlmb19pbmZvICopZGV2X2lkOworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBmaWZvLT5uaWM7CiAKIAlhdG9taWNfaW5jKCZzcC0+aXNyX2NudCk7CiAJdHhfaW50cl9oYW5kbGVyKGZpZm8pOwogCWF0b21pY19kZWMoJnNwLT5pc3JfY250KTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9Ci1zdGF0aWMgdm9pZCBzMmlvX3R4cGljX2ludHJfaGFuZGxlKG5pY190ICpzcCkKK3N0YXRpYyB2b2lkIHMyaW9fdHhwaWNfaW50cl9oYW5kbGUoc3RydWN0IHMyaW9fbmljICpzcCkKIHsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CiAJdTY0IHZhbDY0OwogCiAJdmFsNjQgPSByZWFkcSgmYmFyMC0+cGljX2ludF9zdGF0dXMpOwpAQCAtNDEwOSwzOSArNDA2MiwzMyBAQAogCQl9CiAJCWVsc2UgaWYgKHZhbDY0ICYgR1BJT19JTlRfUkVHX0xJTktfVVApIHsKIAkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKLQkJCWlmICh2ZXJpZnlfeGVuYV9xdWllc2NlbmNlKHNwLCB2YWw2NCwKLQkJCQkJCSAgIHNwLT5kZXZpY2VfZW5hYmxlZF9vbmNlKSkgewogCQkJCS8qIEVuYWJsZSBBZGFwdGVyICovCi0JCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKLQkJCQl2YWw2NCB8PSBBREFQVEVSX0NOVExfRU47Ci0JCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKLQkJCQl2YWw2NCB8PSBBREFQVEVSX0xFRF9PTjsKLQkJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOwotCQkJCWlmICghc3AtPmRldmljZV9lbmFibGVkX29uY2UpCi0JCQkJCXNwLT5kZXZpY2VfZW5hYmxlZF9vbmNlID0gMTsKKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJCQl2YWw2NCB8PSBBREFQVEVSX0NOVExfRU47CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQkJdmFsNjQgfD0gQURBUFRFUl9MRURfT047CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOworCQkJaWYgKCFzcC0+ZGV2aWNlX2VuYWJsZWRfb25jZSkKKwkJCQlzcC0+ZGV2aWNlX2VuYWJsZWRfb25jZSA9IDE7CiAKLQkJCQlzMmlvX2xpbmsoc3AsIExJTktfVVApOwotCQkJCS8qCi0JCQkJICogdW5tYXNrIGxpbmsgZG93biBpbnRlcnJ1cHQgYW5kIG1hc2sgbGluay11cAotCQkJCSAqIGludHIKLQkJCQkgKi8KLQkJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2ludF9tYXNrKTsKLQkJCQl2YWw2NCAmPSB+R1BJT19JTlRfTUFTS19MSU5LX0RPV047Ci0JCQkJdmFsNjQgfD0gR1BJT19JTlRfTUFTS19MSU5LX1VQOwotCQkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9faW50X21hc2spOworCQkJczJpb19saW5rKHNwLCBMSU5LX1VQKTsKKwkJCS8qCisJCQkgKiB1bm1hc2sgbGluayBkb3duIGludGVycnVwdCBhbmQgbWFzayBsaW5rLXVwCisJCQkgKiBpbnRyCisJCQkgKi8KKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdwaW9faW50X21hc2spOworCQkJdmFsNjQgJj0gfkdQSU9fSU5UX01BU0tfTElOS19ET1dOOworCQkJdmFsNjQgfD0gR1BJT19JTlRfTUFTS19MSU5LX1VQOworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z3Bpb19pbnRfbWFzayk7CiAKLQkJCX0KIAkJfWVsc2UgaWYgKHZhbDY0ICYgR1BJT19JTlRfUkVHX0xJTktfRE9XTikgewogCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9zdGF0dXMpOwotCQkJaWYgKHZlcmlmeV94ZW5hX3F1aWVzY2VuY2Uoc3AsIHZhbDY0LAotCQkJCQkJICAgc3AtPmRldmljZV9lbmFibGVkX29uY2UpKSB7Ci0JCQkJczJpb19saW5rKHNwLCBMSU5LX0RPV04pOwotCQkJCS8qIExpbmsgaXMgZG93biBzbyB1bm1ha3MgbGluayB1cCBpbnRlcnJ1cHQgKi8KLQkJCQl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2ludF9tYXNrKTsKLQkJCQl2YWw2NCAmPSB+R1BJT19JTlRfTUFTS19MSU5LX1VQOwotCQkJCXZhbDY0IHw9IEdQSU9fSU5UX01BU0tfTElOS19ET1dOOwotCQkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9faW50X21hc2spOwotCQkJfQorCQkJczJpb19saW5rKHNwLCBMSU5LX0RPV04pOworCQkJLyogTGluayBpcyBkb3duIHNvIHVubWFrcyBsaW5rIHVwIGludGVycnVwdCAqLworCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19pbnRfbWFzayk7CisJCQl2YWw2NCAmPSB+R1BJT19JTlRfTUFTS19MSU5LX1VQOworCQkJdmFsNjQgfD0gR1BJT19JTlRfTUFTS19MSU5LX0RPV047CisJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ncGlvX2ludF9tYXNrKTsKIAkJfQogCX0KIAl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ncGlvX2ludF9tYXNrKTsKQEAgLTQxNjMsMTEgKzQxMTAsMTEgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzMmlvX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkZXZfaWQ7Ci0JbmljX3QgKnNwID0gZGV2LT5wcml2OwotCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOwogCWludCBpOwotCXU2NCByZWFzb24gPSAwLCB2YWw2NCwgb3JnX21hc2s7Ci0JbWFjX2luZm9fdCAqbWFjX2NvbnRyb2w7CisJdTY0IHJlYXNvbiA9IDA7CisJc3RydWN0IG1hY19pbmZvICptYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWc7CiAKIAlhdG9taWNfaW5jKCZzcC0+aXNyX2NudCk7CkBAIC00MTg1LDQzICs0MTMyLDQ4IEBACiAJcmVhc29uID0gcmVhZHEoJmJhcjAtPmdlbmVyYWxfaW50X3N0YXR1cyk7CiAKIAlpZiAoIXJlYXNvbikgewotCQkvKiBUaGUgaW50ZXJydXB0IHdhcyBub3QgcmFpc2VkIGJ5IFhlbmEuICovCisJCS8qIFRoZSBpbnRlcnJ1cHQgd2FzIG5vdCByYWlzZWQgYnkgdXMuICovCisJCWF0b21pY19kZWMoJnNwLT5pc3JfY250KTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwllbHNlIGlmICh1bmxpa2VseShyZWFzb24gPT0gUzJJT19NSU5VU19PTkUpICkgeworCQkvKiBEaXNhYmxlIGRldmljZSBhbmQgZ2V0IG91dCAqLwogCQlhdG9taWNfZGVjKCZzcC0+aXNyX2NudCk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKLQl2YWw2NCA9IDB4RkZGRkZGRkZGRkZGRkZGRlVMTDsKLQkvKiBTdG9yZSBjdXJyZW50IG1hc2sgYmVmb3JlIG1hc2tpbmcgYWxsIGludGVycnVwdHMgKi8KLQlvcmdfbWFzayA9IHJlYWRxKCZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKLQl3cml0ZXEodmFsNjQsICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwlpZiAobmFwaSkgeworCQlpZiAocmVhc29uICYgR0VOX0lOVFJfUlhUUkFGRklDKSB7CisJCQlpZiAoIGxpa2VseSAoIG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgKSB7CisJCQkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOworCQkJCXdyaXRlcShTMklPX01JTlVTX09ORSwgJmJhcjAtPnJ4X3RyYWZmaWNfbWFzayk7CisJCQl9CisJCQllbHNlCisJCQkJd3JpdGVxKFMySU9fTUlOVVNfT05FLCAmYmFyMC0+cnhfdHJhZmZpY19pbnQpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUnggaGFuZGxlciBpcyBjYWxsZWQgYnkgZGVmYXVsdCwgd2l0aG91dCBjaGVja2luZyBmb3IgdGhlCisJCSAqIGNhdXNlIG9mIGludGVycnVwdC4KKwkJICogcnhfdHJhZmZpY19pbnQgcmVnIGlzIGFuIFIxIHJlZ2lzdGVyLCB3cml0aW5nIGFsbCAxJ3MKKwkJICogd2lsbCBlbnN1cmUgdGhhdCB0aGUgYWN0dWFsIGludGVycnVwdCBjYXVzaW5nIGJpdCBnZXQncworCQkgKiBjbGVhcmVkIGFuZCBoZW5jZSBhIHJlYWQgY2FuIGJlIGF2b2lkZWQuCisJCSAqLworCQlpZiAocmVhc29uICYgR0VOX0lOVFJfUlhUUkFGRklDKQorCQkJd3JpdGVxKFMySU9fTUlOVVNfT05FLCAmYmFyMC0+cnhfdHJhZmZpY19pbnQpOwogCi0jaWZkZWYgQ09ORklHX1MySU9fTkFQSQotCWlmIChyZWFzb24gJiBHRU5fSU5UUl9SWFRSQUZGSUMpIHsKLQkJaWYgKG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoZGV2KSkgewotCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfdHJhZmZpY19tYXNrKTsKLQkJCV9fbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsKKwkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQkJcnhfaW50cl9oYW5kbGVyKCZtYWNfY29udHJvbC0+cmluZ3NbaV0pOwogCQl9CiAJfQotI2Vsc2UKLQkvKgotCSAqIFJ4IGhhbmRsZXIgaXMgY2FsbGVkIGJ5IGRlZmF1bHQsIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHRoZQotCSAqIGNhdXNlIG9mIGludGVycnVwdC4KLQkgKiByeF90cmFmZmljX2ludCByZWcgaXMgYW4gUjEgcmVnaXN0ZXIsIHdyaXRpbmcgYWxsIDEncwotCSAqIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGFjdHVhbCBpbnRlcnJ1cHQgY2F1c2luZyBiaXQgZ2V0J3MKLQkgKiBjbGVhcmVkIGFuZCBoZW5jZSBhIHJlYWQgY2FuIGJlIGF2b2lkZWQuCi0JICovCi0Jd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfdHJhZmZpY19pbnQpOwotCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnJ4X3JpbmdfbnVtOyBpKyspIHsKLQkJcnhfaW50cl9oYW5kbGVyKCZtYWNfY29udHJvbC0+cmluZ3NbaV0pOwotCX0KLSNlbmRpZgogCiAJLyoKIAkgKiB0eF90cmFmZmljX2ludCByZWcgaXMgYW4gUjEgcmVnaXN0ZXIsIHdyaXRpbmcgYWxsIDEncwogCSAqIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGFjdHVhbCBpbnRlcnJ1cHQgY2F1c2luZyBiaXQgZ2V0J3MKIAkgKiBjbGVhcmVkIGFuZCBoZW5jZSBhIHJlYWQgY2FuIGJlIGF2b2lkZWQuCiAJICovCi0Jd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHhfdHJhZmZpY19pbnQpOworCWlmIChyZWFzb24gJiBHRU5fSU5UUl9UWFRSQUZGSUMpCisJCXdyaXRlcShTMklPX01JTlVTX09ORSwgJmJhcjAtPnR4X3RyYWZmaWNfaW50KTsKIAogCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspCiAJCXR4X2ludHJfaGFuZGxlcigmbWFjX2NvbnRyb2wtPmZpZm9zW2ldKTsKQEAgLTQyMzMsMTEgKzQxODUsMTQgQEAKIAkgKiByZWFsbG9jYXRlIHRoZSBidWZmZXJzIGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyIGl0c2VsZiwKIAkgKiBlbHNlIHNjaGVkdWxlIGEgdGFza2xldCB0byByZWFsbG9jYXRlIHRoZSBidWZmZXJzLgogCSAqLwotI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCi0JZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykKLQkJczJpb19jaGtfcnhfYnVmZmVycyhzcCwgaSk7Ci0jZW5kaWYKLQl3cml0ZXEob3JnX21hc2ssICZiYXIwLT5nZW5lcmFsX2ludF9tYXNrKTsKKwlpZiAoIW5hcGkpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykKKwkJCXMyaW9fY2hrX3J4X2J1ZmZlcnMoc3AsIGkpOworCX0KKworCXdyaXRlcSgwLCAmYmFyMC0+Z2VuZXJhbF9pbnRfbWFzayk7CisJcmVhZGwoJmJhcjAtPmdlbmVyYWxfaW50X3N0YXR1cyk7CisKIAlhdG9taWNfZGVjKCZzcC0+aXNyX2NudCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtNDI0NSw5ICs0MjAwLDkgQEAKIC8qKgogICogczJpb191cGR0X3N0YXRzIC0KICAqLwotc3RhdGljIHZvaWQgczJpb191cGR0X3N0YXRzKG5pY190ICpzcCkKK3N0YXRpYyB2b2lkIHMyaW9fdXBkdF9zdGF0cyhzdHJ1Y3QgczJpb19uaWMgKnNwKQogewotCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKIAl1NjQgdmFsNjQ7CiAJaW50IGNudCA9IDA7CiAKQEAgLTQyNjYsNyArNDIyMSw3IEBACiAJCQkJYnJlYWs7IC8qIFVwZHQgZmFpbGVkICovCiAJCX0gd2hpbGUoMSk7CiAJfSBlbHNlIHsKLQkJbWVtc2V0KHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLCAwLCBzaXplb2YoU3RhdEluZm9fdCkpOworCQltZW1zZXQoc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8sIDAsIHNpemVvZihzdHJ1Y3Qgc3RhdF9ibG9jaykpOwogCX0KIH0KIApAQCAtNDI4Miw4ICs0MjM3LDggQEAKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzMmlvX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCW5pY190ICpzcCA9IGRldi0+cHJpdjsKLQltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OworCXN0cnVjdCBtYWNfaW5mbyAqbWFjX2NvbnRyb2w7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOwogCiAKQEAgLTQzMjQsOCArNDI3OSw4IEBACiB7CiAJaW50IGksIGosIHByZXZfY250OwogCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNsaXN0OwotCW5pY190ICpzcCA9IGRldi0+cHJpdjsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJc3RydWN0IHMyaW9fbmljICpzcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKIAl1NjQgdmFsNjQgPSAwLCBtdWx0aV9tYWMgPSAweDAxMDIwMzA0MDUwNlVMTCwgbWFzayA9CiAJICAgIDB4ZmVmZmZmZmZmZmZmVUxMOwogCXU2NCBkaXNfYWRkciA9IDB4ZmZmZmZmZmZmZmZmVUxMLCBtYWNfYWRkciA9IDA7CkBAIC00NDc4LDggKzQ0MzMsOCBAQAogCiBzdGF0aWMgaW50IHMyaW9fc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICogYWRkcikKIHsKLQluaWNfdCAqc3AgPSBkZXYtPnByaXY7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CiAJcmVnaXN0ZXIgdTY0IHZhbDY0LCBtYWNfYWRkciA9IDA7CiAJaW50IGk7CiAKQEAgLTQ1MjUsNyArNDQ4MCw3IEBACiBzdGF0aWMgaW50IHMyaW9fZXRodG9vbF9zc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqaW5mbykKIHsKLQluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IHMyaW9fbmljICpzcCA9IGRldi0+cHJpdjsKIAlpZiAoKGluZm8tPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHx8CiAJICAgIChpbmZvLT5zcGVlZCAhPSBTUEVFRF8xMDAwMCkgfHwgKGluZm8tPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDU1MSw3ICs0NTA2LDcgQEAKIAogc3RhdGljIGludCBzMmlvX2V0aHRvb2xfZ3NldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmluZm8pCiB7Ci0JbmljX3QgKnNwID0gZGV2LT5wcml2OworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CiAJaW5mby0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUpOwogCWluZm8tPmFkdmVydGlzaW5nID0gKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkUpOwogCWluZm8tPnBvcnQgPSBQT1JUX0ZJQlJFOwpAQCAtNDU4NCw3ICs0NTM5LDcgQEAKIHN0YXRpYyB2b2lkIHMyaW9fZXRodG9vbF9nZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKLQluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IHMyaW9fbmljICpzcCA9IGRldi0+cHJpdjsKIAogCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCBzMmlvX2RyaXZlcl9uYW1lLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiAJc3RybmNweShpbmZvLT52ZXJzaW9uLCBzMmlvX2RyaXZlcl92ZXJzaW9uLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwpAQCAtNDYxNiw3ICs0NTcxLDcgQEAKIAlpbnQgaTsKIAl1NjQgcmVnOwogCXU4ICpyZWdfc3BhY2UgPSAodTggKikgc3BhY2U7Ci0JbmljX3QgKnNwID0gZGV2LT5wcml2OworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CiAKIAlyZWdzLT5sZW4gPSBYRU5BX1JFR19TUEFDRTsKIAlyZWdzLT52ZXJzaW9uID0gc3AtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CkBAIC00NjM4LDggKzQ1OTMsOCBAQAogKi8KIHN0YXRpYyB2b2lkIHMyaW9fcGh5X2lkKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQluaWNfdCAqc3AgPSAobmljX3QgKikgZGF0YTsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJc3RydWN0IHMyaW9fbmljICpzcCA9IChzdHJ1Y3QgczJpb19uaWMgKikgZGF0YTsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKIAl1NjQgdmFsNjQgPSAwOwogCXUxNiBzdWJpZDsKIApAQCAtNDY3Niw4ICs0NjMxLDggQEAKIHN0YXRpYyBpbnQgczJpb19ldGh0b29sX2lkbmljKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQogewogCXU2NCB2YWw2NCA9IDAsIGxhc3RfZ3Bpb19jdHJsX3ZhbDsKLQluaWNfdCAqc3AgPSBkZXYtPnByaXY7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CiAJdTE2IHN1YmlkOwogCiAJc3ViaWQgPSBzcC0+cGRldi0+c3Vic3lzdGVtX2RldmljZTsKQEAgLTQ3MjUsOCArNDY4MCw4IEBACiAJCQkJICAgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwKQogewogCXU2NCB2YWw2NDsKLQluaWNfdCAqc3AgPSBkZXYtPnByaXY7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CiAKIAl2YWw2NCA9IHJlYWRxKCZiYXIwLT5ybWFjX3BhdXNlX2NmZyk7CiAJaWYgKHZhbDY0ICYgUk1BQ19QQVVTRV9HRU5fRU5BQkxFKQpAQCAtNDc1Miw4ICs0NzA3LDggQEAKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplcCkKIHsKIAl1NjQgdmFsNjQ7Ci0JbmljX3QgKnNwID0gZGV2LT5wcml2OwotCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOwogCiAJdmFsNjQgPSByZWFkcSgmYmFyMC0+cm1hY19wYXVzZV9jZmcpOwogCWlmIChlcC0+dHhfcGF1c2UpCkBAIC00Nzg1LDEyICs0NzQwLDEyIEBACiAgKi8KIAogI2RlZmluZSBTMklPX0RFVl9JRAkJNQotc3RhdGljIGludCByZWFkX2VlcHJvbShuaWNfdCAqIHNwLCBpbnQgb2ZmLCB1NjQgKiBkYXRhKQorc3RhdGljIGludCByZWFkX2VlcHJvbShzdHJ1Y3QgczJpb19uaWMgKiBzcCwgaW50IG9mZiwgdTY0ICogZGF0YSkKIHsKIAlpbnQgcmV0ID0gLTE7CiAJdTMyIGV4aXRfY250ID0gMDsKIAl1NjQgdmFsNjQ7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOwogCiAJaWYgKHNwLT5kZXZpY2VfdHlwZSA9PSBYRlJBTUVfSV9ERVZJQ0UpIHsKIAkJdmFsNjQgPSBJMkNfQ09OVFJPTF9ERVZfSUQoUzJJT19ERVZfSUQpIHwgSTJDX0NPTlRST0xfQUREUihvZmYpIHwKQEAgLTQ4NTAsMTEgKzQ4MDUsMTEgQEAKICAqICAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCiAgKi8KIAotc3RhdGljIGludCB3cml0ZV9lZXByb20obmljX3QgKiBzcCwgaW50IG9mZiwgdTY0IGRhdGEsIGludCBjbnQpCitzdGF0aWMgaW50IHdyaXRlX2VlcHJvbShzdHJ1Y3QgczJpb19uaWMgKiBzcCwgaW50IG9mZiwgdTY0IGRhdGEsIGludCBjbnQpCiB7CiAJaW50IGV4aXRfY250ID0gMCwgcmV0ID0gLTE7CiAJdTY0IHZhbDY0OwotCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKKwlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKIAogCWlmIChzcC0+ZGV2aWNlX3R5cGUgPT0gWEZSQU1FX0lfREVWSUNFKSB7CiAJCXZhbDY0ID0gSTJDX0NPTlRST0xfREVWX0lEKFMySU9fREVWX0lEKSB8IEkyQ19DT05UUk9MX0FERFIob2ZmKSB8CkBAIC00ODk5LDcgKzQ4NTQsNyBAQAogCX0KIAlyZXR1cm4gcmV0OwogfQotc3RhdGljIHZvaWQgczJpb192cGRfcmVhZChuaWNfdCAqbmljKQorc3RhdGljIHZvaWQgczJpb192cGRfcmVhZChzdHJ1Y3QgczJpb19uaWMgKm5pYykKIHsKIAl1OCAqdnBkX2RhdGE7CiAJdTggZGF0YTsKQEAgLTQ5MTQsNiArNDg2OSw3IEBACiAJCXN0cmNweShuaWMtPnByb2R1Y3RfbmFtZSwgIlhmcmFtZSBJIDEwR2JFIG5ldHdvcmsgYWRhcHRlciIpOwogCQl2cGRfYWRkciA9IDB4NTA7CiAJfQorCXN0cmNweShuaWMtPnNlcmlhbF9udW0sICJOT1QgQVZBSUxBQkxFIik7CiAKIAl2cGRfZGF0YSA9IGttYWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZwZF9kYXRhKQpAQCAtNDkzNyw3ICs0ODkzLDIyIEBACiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChuaWMtPnBkZXYsICAodnBkX2FkZHIgKyA0KSwKIAkJCQkgICAgICAodTMyICopJnZwZF9kYXRhW2ldKTsKIAl9Ci0JaWYgKCghZmFpbCkgJiYgKHZwZF9kYXRhWzFdIDwgVlBEX1BST0RVQ1RfTkFNRV9MRU4pKSB7CisKKwlpZighZmFpbCkgeworCQkvKiByZWFkIHNlcmlhbCBudW1iZXIgb2YgYWRhcHRlciAqLworCQlmb3IgKGNudCA9IDA7IGNudCA8IDI1NjsgY250KyspIHsKKwkJaWYgKCh2cGRfZGF0YVtjbnRdID09ICdTJykgJiYKKwkJCSh2cGRfZGF0YVtjbnQrMV0gPT0gJ04nKSAmJgorCQkJKHZwZF9kYXRhW2NudCsyXSA8IFZQRF9TVFJJTkdfTEVOKSkgeworCQkJCW1lbXNldChuaWMtPnNlcmlhbF9udW0sIDAsIFZQRF9TVFJJTkdfTEVOKTsKKwkJCQltZW1jcHkobmljLT5zZXJpYWxfbnVtLCAmdnBkX2RhdGFbY250ICsgM10sCisJCQkJCXZwZF9kYXRhW2NudCsyXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKCFmYWlsKSAmJiAodnBkX2RhdGFbMV0gPCBWUERfU1RSSU5HX0xFTikpIHsKIAkJbWVtc2V0KG5pYy0+cHJvZHVjdF9uYW1lLCAwLCB2cGRfZGF0YVsxXSk7CiAJCW1lbWNweShuaWMtPnByb2R1Y3RfbmFtZSwgJnZwZF9kYXRhWzNdLCB2cGRfZGF0YVsxXSk7CiAJfQpAQCAtNDk2Miw3ICs0OTMzLDcgQEAKIHsKIAl1MzIgaSwgdmFsaWQ7CiAJdTY0IGRhdGE7Ci0JbmljX3QgKnNwID0gZGV2LT5wcml2OworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CiAKIAllZXByb20tPm1hZ2ljID0gc3AtPnBkZXYtPnZlbmRvciB8IChzcC0+cGRldi0+ZGV2aWNlIDw8IDE2KTsKIApAQCAtNTAwMCw3ICs0OTcxLDcgQEAKIHsKIAlpbnQgbGVuID0gZWVwcm9tLT5sZW4sIGNudCA9IDA7CiAJdTY0IHZhbGlkID0gMCwgZGF0YTsKLQluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IHMyaW9fbmljICpzcCA9IGRldi0+cHJpdjsKIAogCWlmIChlZXByb20tPm1hZ2ljICE9IChzcC0+cGRldi0+dmVuZG9yIHwgKHNwLT5wZGV2LT5kZXZpY2UgPDwgMTYpKSkgewogCQlEQkdfUFJJTlQoRVJSX0RCRywKQEAgLTUwNDQsOSArNTAxNSw5IEBACiAgKiAwIG9uIHN1Y2Nlc3MuCiAgKi8KIAotc3RhdGljIGludCBzMmlvX3JlZ2lzdGVyX3Rlc3QobmljX3QgKiBzcCwgdWludDY0X3QgKiBkYXRhKQorc3RhdGljIGludCBzMmlvX3JlZ2lzdGVyX3Rlc3Qoc3RydWN0IHMyaW9fbmljICogc3AsIHVpbnQ2NF90ICogZGF0YSkKIHsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CiAJdTY0IHZhbDY0ID0gMCwgZXhwX3ZhbDsKIAlpbnQgZmFpbCA9IDA7CiAKQEAgLTUxMTEsNyArNTA4Miw3IEBACiAgKiAwIG9uIHN1Y2Nlc3MuCiAgKi8KIAotc3RhdGljIGludCBzMmlvX2VlcHJvbV90ZXN0KG5pY190ICogc3AsIHVpbnQ2NF90ICogZGF0YSkKK3N0YXRpYyBpbnQgczJpb19lZXByb21fdGVzdChzdHJ1Y3QgczJpb19uaWMgKiBzcCwgdWludDY0X3QgKiBkYXRhKQogewogCWludCBmYWlsID0gMDsKIAl1NjQgcmV0X2RhdGEsIG9yZ180RjAsIG9yZ183RjA7CkBAIC01MjEzLDcgKzUxODQsNyBAQAogICogMCBvbiBzdWNjZXNzIGFuZCAtMSBvbiBmYWlsdXJlLgogICovCiAKLXN0YXRpYyBpbnQgczJpb19iaXN0X3Rlc3QobmljX3QgKiBzcCwgdWludDY0X3QgKiBkYXRhKQorc3RhdGljIGludCBzMmlvX2Jpc3RfdGVzdChzdHJ1Y3QgczJpb19uaWMgKiBzcCwgdWludDY0X3QgKiBkYXRhKQogewogCXU4IGJpc3QgPSAwOwogCWludCBjbnQgPSAwLCByZXQgPSAtMTsKQEAgLTUyNDksOSArNTIyMCw5IEBACiAgKiAwIG9uIHN1Y2Nlc3MuCiAgKi8KIAotc3RhdGljIGludCBzMmlvX2xpbmtfdGVzdChuaWNfdCAqIHNwLCB1aW50NjRfdCAqIGRhdGEpCitzdGF0aWMgaW50IHMyaW9fbGlua190ZXN0KHN0cnVjdCBzMmlvX25pYyAqIHNwLCB1aW50NjRfdCAqIGRhdGEpCiB7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOwogCXU2NCB2YWw2NDsKIAogCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfc3RhdHVzKTsKQEAgLTUyNzYsOSArNTI0Nyw5IEBACiAgKiAgMCBvbiBzdWNjZXNzLgogICovCiAKLXN0YXRpYyBpbnQgczJpb19ybGRyYW1fdGVzdChuaWNfdCAqIHNwLCB1aW50NjRfdCAqIGRhdGEpCitzdGF0aWMgaW50IHMyaW9fcmxkcmFtX3Rlc3Qoc3RydWN0IHMyaW9fbmljICogc3AsIHVpbnQ2NF90ICogZGF0YSkKIHsKLQlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gc3AtPmJhcjA7CiAJdTY0IHZhbDY0OwogCWludCBjbnQsIGl0ZXJhdGlvbiA9IDAsIHRlc3RfZmFpbCA9IDA7CiAKQEAgLTUzODAsNyArNTM1MSw3IEBACiAJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF90ZXN0ICpldGh0ZXN0LAogCQkJICAgICAgdWludDY0X3QgKiBkYXRhKQogewotCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OwogCWludCBvcmlnX3N0YXRlID0gbmV0aWZfcnVubmluZyhzcC0+ZGV2KTsKIAogCWlmIChldGh0ZXN0LT5mbGFncyA9PSBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7CkBAIC01NDM2LDggKzU0MDcsOCBAQAogCQkJCSAgIHU2NCAqIHRtcF9zdGF0cykKIHsKIAlpbnQgaSA9IDA7Ci0JbmljX3QgKnNwID0gZGV2LT5wcml2OwotCVN0YXRJbmZvX3QgKnN0YXRfaW5mbyA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvOworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IHN0YXRfYmxvY2sgKnN0YXRfaW5mbyA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvOwogCiAJczJpb191cGR0X3N0YXRzKHNwKTsKIAl0bXBfc3RhdHNbaSsrXSA9CkBAIC01NjY0LDE0ICs1NjM1LDE0IEBACiAKIHN0YXRpYyB1MzIgczJpb19ldGh0b29sX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2KQogewotCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OwogCiAJcmV0dXJuIChzcC0+cnhfY3N1bSk7CiB9CiAKIHN0YXRpYyBpbnQgczJpb19ldGh0b29sX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQogewotCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OwogCiAJaWYgKGRhdGEpCiAJCXNwLT5yeF9jc3VtID0gMTsKQEAgLTU3NTAsMTAgKzU3MjEsOCBAQAogCS5zZXRfdHhfY3N1bSA9IHMyaW9fZXRodG9vbF9vcF9zZXRfdHhfY3N1bSwKIAkuZ2V0X3NnID0gZXRodG9vbF9vcF9nZXRfc2csCiAJLnNldF9zZyA9IGV0aHRvb2xfb3Bfc2V0X3NnLAotI2lmZGVmIE5FVElGX0ZfVFNPCiAJLmdldF90c28gPSBzMmlvX2V0aHRvb2xfb3BfZ2V0X3RzbywKIAkuc2V0X3RzbyA9IHMyaW9fZXRodG9vbF9vcF9zZXRfdHNvLAotI2VuZGlmCiAJLmdldF91Zm8gPSBldGh0b29sX29wX2dldF91Zm8sCiAJLnNldF91Zm8gPSBldGh0b29sX29wX3NldF91Zm8sCiAJLnNlbGZfdGVzdF9jb3VudCA9IHMyaW9fZXRodG9vbF9zZWxmX3Rlc3RfY291bnQsCkBAIC01Nzk0LDcgKzU3NjMsNyBAQAogCiBzdGF0aWMgaW50IHMyaW9fY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKIHsKLQluaWNfdCAqc3AgPSBkZXYtPnByaXY7CisJc3RydWN0IHMyaW9fbmljICpzcCA9IGRldi0+cHJpdjsKIAogCWlmICgobmV3X210dSA8IE1JTl9NVFUpIHx8IChuZXdfbXR1ID4gUzJJT19KVU1CT19TSVpFKSkgewogCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBNVFUgc2l6ZSBpcyBpbnZhbGlkLlxuIiwKQEAgLTU4MTMsNyArNTc4Miw3IEBACiAJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCiAJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAJfSBlbHNlIHsgLyogRGV2aWNlIGlzIGRvd24gKi8KLQkJWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCQlzdHJ1Y3QgWEVOQV9kZXZfY29uZmlnIF9faW9tZW0gKmJhcjAgPSBzcC0+YmFyMDsKIAkJdTY0IHZhbDY0ID0gbmV3X210dTsKIAogCQl3cml0ZXEodkJJVCh2YWw2NCwgMiwgMTQpLCAmYmFyMC0+cm1hY19tYXhfcHlsZF9sZW4pOwpAQCAtNTgzOCw5ICs1ODA3LDkgQEAKIHN0YXRpYyB2b2lkIHMyaW9fdGFza2xldCh1bnNpZ25lZCBsb25nIGRldl9hZGRyKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2FkZHI7Ci0JbmljX3QgKnNwID0gZGV2LT5wcml2OworCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CiAJaW50IGksIHJldDsKLQltYWNfaW5mb190ICptYWNfY29udHJvbDsKKwlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKIAogCW1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKQEAgLTU4NzMsOSArNTg0Miw5IEBACiAKIHN0YXRpYyB2b2lkIHMyaW9fc2V0X2xpbmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCW5pY190ICpuaWMgPSBjb250YWluZXJfb2Yod29yaywgbmljX3QsIHNldF9saW5rX3Rhc2spOworCXN0cnVjdCBzMmlvX25pYyAqbmljID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzMmlvX25pYywgc2V0X2xpbmtfdGFzayk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5pYy0+ZGV2OwotCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBuaWMtPmJhcjA7CisJc3RydWN0IFhFTkFfZGV2X2NvbmZpZyBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOwogCXJlZ2lzdGVyIHU2NCB2YWw2NDsKIAl1MTYgc3ViaWQ7CiAKQEAgLTU4OTQsNTcgKzU4NjMsNTMgQEAKIAl9CiAKIAl2YWw2NCA9IHJlYWRxKCZiYXIwLT5hZGFwdGVyX3N0YXR1cyk7Ci0JaWYgKHZlcmlmeV94ZW5hX3F1aWVzY2VuY2UobmljLCB2YWw2NCwgbmljLT5kZXZpY2VfZW5hYmxlZF9vbmNlKSkgewotCQlpZiAoTElOS19JU19VUCh2YWw2NCkpIHsKLQkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7Ci0JCQl2YWw2NCB8PSBBREFQVEVSX0NOVExfRU47Ci0JCQl3cml0ZXEodmFsNjQsICZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpOwotCQkJaWYgKENBUkRTX1dJVEhfRkFVTFRZX0xJTktfSU5ESUNBVE9SUyhuaWMtPmRldmljZV90eXBlLAotCQkJCQkJCSAgICAgc3ViaWQpKSB7Ci0JCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKLQkJCQl2YWw2NCB8PSBHUElPX0NUUkxfR1BJT18wOwotCQkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmdwaW9fY29udHJvbCk7Ci0JCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsNjQgfD0gQURBUFRFUl9MRURfT047CisJaWYgKExJTktfSVNfVVAodmFsNjQpKSB7CisJCWlmICghKHJlYWRxKCZiYXIwLT5hZGFwdGVyX2NvbnRyb2wpICYgQURBUFRFUl9DTlRMX0VOKSkgeworCQkJaWYgKHZlcmlmeV94ZW5hX3F1aWVzY2VuY2UobmljKSkgeworCQkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7CisJCQkJdmFsNjQgfD0gQURBUFRFUl9DTlRMX0VOOwogCQkJCXdyaXRlcSh2YWw2NCwgJmJhcjAtPmFkYXB0ZXJfY29udHJvbCk7Ci0JCQl9Ci0JCQlpZiAoczJpb19saW5rX2ZhdWx0X2luZGljYXRpb24obmljKSA9PQotCQkJCQkJTUFDX1JNQUNfRVJSX1RJTUVSKSB7Ci0JCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9zdGF0dXMpOwotCQkJCWlmICghTElOS19JU19VUCh2YWw2NCkpIHsKLQkJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczoiLCBkZXYtPm5hbWUpOwotCQkJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiBMaW5rIGRvd24iKTsKLQkJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJhZnRlciAiKTsKLQkJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJlbmFibGluZyAiKTsKLQkJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJkZXZpY2UgXG4iKTsKKwkJCQlpZiAoQ0FSRFNfV0lUSF9GQVVMVFlfTElOS19JTkRJQ0FUT1JTKAorCQkJCQluaWMtPmRldmljZV90eXBlLCBzdWJpZCkpIHsKKwkJCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCQkJdmFsNjQgfD0gR1BJT19DVFJMX0dQSU9fMDsKKwkJCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCQl9IGVsc2UgeworCQkJCQl2YWw2NCB8PSBBREFQVEVSX0xFRF9PTjsKKwkJCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+YWRhcHRlcl9jb250cm9sKTsKIAkJCQl9Ci0JCQl9Ci0JCQlpZiAobmljLT5kZXZpY2VfZW5hYmxlZF9vbmNlID09IEZBTFNFKSB7CiAJCQkJbmljLT5kZXZpY2VfZW5hYmxlZF9vbmNlID0gVFJVRTsKKwkJCX0gZWxzZSB7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRXJyb3I6ICIsIGRldi0+bmFtZSk7CisJCQkJREJHX1BSSU5UKEVSUl9EQkcsICJkZXZpY2UgaXMgbm90IFF1aWVzY2VudFxuIik7CisJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCQkJfQotCQkJczJpb19saW5rKG5pYywgTElOS19VUCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoQ0FSRFNfV0lUSF9GQVVMVFlfTElOS19JTkRJQ0FUT1JTKG5pYy0+ZGV2aWNlX3R5cGUsCi0JCQkJCQkJICAgICAgc3ViaWQpKSB7Ci0JCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKLQkJCQl2YWw2NCAmPSB+R1BJT19DVFJMX0dQSU9fMDsKLQkJCQl3cml0ZXEodmFsNjQsICZiYXIwLT5ncGlvX2NvbnRyb2wpOwotCQkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdwaW9fY29udHJvbCk7Ci0JCQl9Ci0JCQlzMmlvX2xpbmsobmljLCBMSU5LX0RPV04pOwogCQl9Ci0JfSBlbHNlIHsJCS8qIE5JQyBpcyBub3QgUXVpZXNjZW50LiAqLwotCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBFcnJvcjogIiwgZGV2LT5uYW1lKTsKLQkJREJHX1BSSU5UKEVSUl9EQkcsICJkZXZpY2UgaXMgbm90IFF1aWVzY2VudFxuIik7Ci0JCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9zdGF0dXMpOworCQlpZiAoIUxJTktfSVNfVVAodmFsNjQpKSB7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiIsIGRldi0+bmFtZSk7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiBMaW5rIGRvd24gYWZ0ZXIgZW5hYmxpbmcgIik7CisJCQlEQkdfUFJJTlQoRVJSX0RCRywgImRldmljZSBcbiIpOworCQl9IGVsc2UKKwkJCXMyaW9fbGluayhuaWMsIExJTktfVVApOworCX0gZWxzZSB7CisJCWlmIChDQVJEU19XSVRIX0ZBVUxUWV9MSU5LX0lORElDQVRPUlMobmljLT5kZXZpY2VfdHlwZSwKKwkJCQkJCSAgICAgIHN1YmlkKSkgeworCQkJdmFsNjQgPSByZWFkcSgmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCXZhbDY0ICY9IH5HUElPX0NUUkxfR1BJT18wOworCQkJd3JpdGVxKHZhbDY0LCAmYmFyMC0+Z3Bpb19jb250cm9sKTsKKwkJCXZhbDY0ID0gcmVhZHEoJmJhcjAtPmdwaW9fY29udHJvbCk7CisJCX0KKwkJczJpb19saW5rKG5pYywgTElOS19ET1dOKTsKIAl9CiAJY2xlYXJfYml0KDAsICYobmljLT5saW5rX3N0YXRlKSk7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3J4ZF9idWZmZXJfcG9pbnRlcihuaWNfdCAqc3AsIFJ4RF90ICpyeGRwLCBidWZmQWRkX3QgKmJhLAotCQkJICAgc3RydWN0IHNrX2J1ZmYgKipza2IsIHU2NCAqdGVtcDAsIHU2NCAqdGVtcDEsCi0JCQkgICB1NjQgKnRlbXAyLCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgc2V0X3J4ZF9idWZmZXJfcG9pbnRlcihzdHJ1Y3QgczJpb19uaWMgKnNwLCBzdHJ1Y3QgUnhEX3QgKnJ4ZHAsCisJCQkJc3RydWN0IGJ1ZmZBZGQgKmJhLAorCQkJCXN0cnVjdCBza19idWZmICoqc2tiLCB1NjQgKnRlbXAwLCB1NjQgKnRlbXAxLAorCQkJCXU2NCAqdGVtcDIsIGludCBzaXplKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcC0+ZGV2OwogCXN0cnVjdCBza19idWZmICpmcmFnX2xpc3Q7CkBAIC01OTU4LDcgKzU5MjMsNyBAQAogCQkJICogdXNpbmcgc2FtZSBtYXBwZWQgYWRkcmVzcyBmb3IgdGhlIFJ4ZAogCQkJICogYnVmZmVyIHBvaW50ZXIKIAkJCSAqLwotCQkJKChSeEQxX3QqKXJ4ZHApLT5CdWZmZXIwX3B0ciA9ICp0ZW1wMDsKKwkJCSgoc3RydWN0IFJ4RDEqKXJ4ZHApLT5CdWZmZXIwX3B0ciA9ICp0ZW1wMDsKIAkJfSBlbHNlIHsKIAkJCSpza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOwogCQkJaWYgKCEoKnNrYikpIHsKQEAgLTU5NzAsNyArNTkzNSw3IEBACiAJCQkgKiBzdWNoIGl0IHdpbGwgYmUgdXNlZCBmb3IgbmV4dCByeGQgd2hvc2UKIAkJCSAqIEhvc3QgQ29udHJvbCBpcyBOVUxMCiAJCQkgKi8KLQkJCSgoUnhEMV90KilyeGRwKS0+QnVmZmVyMF9wdHIgPSAqdGVtcDAgPQorCQkJKChzdHJ1Y3QgUnhEMSopcnhkcCktPkJ1ZmZlcjBfcHRyID0gKnRlbXAwID0KIAkJCQlwY2lfbWFwX3NpbmdsZSggc3AtPnBkZXYsICgqc2tiKS0+ZGF0YSwKIAkJCQkJc2l6ZSAtIE5FVF9JUF9BTElHTiwKIAkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKQEAgLTU5NzksMzYgKzU5NDQsMzYgQEAKIAl9IGVsc2UgaWYgKChzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpICYmIChyeGRwLT5Ib3N0X0NvbnRyb2wgPT0gMCkpIHsKIAkJLyogVHdvIGJ1ZmZlciBNb2RlICovCiAJCWlmICgqc2tiKSB7Ci0JCQkoKFJ4RDNfdCopcnhkcCktPkJ1ZmZlcjJfcHRyID0gKnRlbXAyOwotCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIwX3B0ciA9ICp0ZW1wMDsKLQkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMV9wdHIgPSAqdGVtcDE7CisJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMl9wdHIgPSAqdGVtcDI7CisJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHIgPSAqdGVtcDA7CisJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIgPSAqdGVtcDE7CiAJCX0gZWxzZSB7CiAJCQkqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKTsKIAkJCWlmICghKCpza2IpKSB7CiAJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogZGV2X2FsbG9jX3NrYiBmYWlsZWRcbiIsCi0JCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQkJZGV2LT5uYW1lKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KLQkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMl9wdHIgPSAqdGVtcDIgPQorCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjJfcHRyID0gKnRlbXAyID0KIAkJCQlwY2lfbWFwX3NpbmdsZShzcC0+cGRldiwgKCpza2IpLT5kYXRhLAogCQkJCQkgICAgICAgZGV2LT5tdHUgKyA0LAogCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMF9wdHIgPSAqdGVtcDAgPQorCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyID0gKnRlbXAwID0KIAkJCQlwY2lfbWFwX3NpbmdsZSggc3AtPnBkZXYsIGJhLT5iYV8wLCBCVUYwX0xFTiwKIAkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlyeGRwLT5Ib3N0X0NvbnRyb2wgPSAodW5zaWduZWQgbG9uZykgKCpza2IpOwogCiAJCQkvKiBCdWZmZXItMSB3aWxsIGJlIGR1bW15IGJ1ZmZlciBub3QgdXNlZCAqLwotCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIxX3B0ciA9ICp0ZW1wMSA9CisJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIgPSAqdGVtcDEgPQogCQkJCXBjaV9tYXBfc2luZ2xlKHNwLT5wZGV2LCBiYS0+YmFfMSwgQlVGMV9MRU4sCiAJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQl9CiAJfSBlbHNlIGlmICgocnhkcC0+SG9zdF9Db250cm9sID09IDApKSB7CiAJCS8qIFRocmVlIGJ1ZmZlciBtb2RlICovCiAJCWlmICgqc2tiKSB7Ci0JCQkoKFJ4RDNfdCopcnhkcCktPkJ1ZmZlcjBfcHRyID0gKnRlbXAwOwotCQkJKChSeEQzX3QqKXJ4ZHApLT5CdWZmZXIxX3B0ciA9ICp0ZW1wMTsKLQkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMl9wdHIgPSAqdGVtcDI7CisJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHIgPSAqdGVtcDA7CisJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMV9wdHIgPSAqdGVtcDE7CisJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMl9wdHIgPSAqdGVtcDI7CiAJCX0gZWxzZSB7CiAJCQkqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKTsKIAkJCWlmICghKCpza2IpKSB7CkBAIC02MDE2LDExICs1OTgxLDExIEBACiAJCQkJCSAgZGV2LT5uYW1lKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KLQkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMF9wdHIgPSAqdGVtcDAgPQorCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyID0gKnRlbXAwID0KIAkJCQlwY2lfbWFwX3NpbmdsZShzcC0+cGRldiwgYmEtPmJhXzAsIEJVRjBfTEVOLAogCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCS8qIEJ1ZmZlci0xIHJlY2VpdmVzIEwzL0w0IGhlYWRlcnMgKi8KLQkJCSgoUnhEM190KilyeGRwKS0+QnVmZmVyMV9wdHIgPSAqdGVtcDEgPQorCQkJKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjFfcHRyID0gKnRlbXAxID0KIAkJCQlwY2lfbWFwX3NpbmdsZSggc3AtPnBkZXYsICgqc2tiKS0+ZGF0YSwKIAkJCQkJCWwzbDRoZHJfc2l6ZSArIDQsCiAJCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtNjA0MCwxNCArNjAwNSwxNSBAQAogCQkJLyoKIAkJCSAqIEJ1ZmZlci0yIHJlY2VpdmVzIEw0IGRhdGEgcGF5bG9hZAogCQkJICovCi0JCQkoKFJ4RDNfdCopcnhkcCktPkJ1ZmZlcjJfcHRyID0gKnRlbXAyID0KKwkJCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIyX3B0ciA9ICp0ZW1wMiA9CiAJCQkJcGNpX21hcF9zaW5nbGUoIHNwLT5wZGV2LCBmcmFnX2xpc3QtPmRhdGEsCiAJCQkJCQlkZXYtPm10dSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyB2b2lkIHNldF9yeGRfYnVmZmVyX3NpemUobmljX3QgKnNwLCBSeERfdCAqcnhkcCwgaW50IHNpemUpCitzdGF0aWMgdm9pZCBzZXRfcnhkX2J1ZmZlcl9zaXplKHN0cnVjdCBzMmlvX25pYyAqc3AsIHN0cnVjdCBSeERfdCAqcnhkcCwKKwkJCQlpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPmRldjsKIAlpZiAoc3AtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzEpIHsKQEAgLTYwNjMsMTUgKzYwMjksMTUgQEAKIAl9CiB9CiAKLXN0YXRpYyAgaW50IHJ4ZF9vd25lcl9iaXRfcmVzZXQobmljX3QgKnNwKQorc3RhdGljICBpbnQgcnhkX293bmVyX2JpdF9yZXNldChzdHJ1Y3QgczJpb19uaWMgKnNwKQogewogCWludCBpLCBqLCBrLCBibGtfY250ID0gMCwgc2l6ZTsKLQltYWNfaW5mb190ICogbWFjX2NvbnRyb2wgPSAmc3AtPm1hY19jb250cm9sOworCXN0cnVjdCBtYWNfaW5mbyAqIG1hY19jb250cm9sID0gJnNwLT5tYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtICpjb25maWcgPSAmc3AtPmNvbmZpZzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPmRldjsKLQlSeERfdCAqcnhkcCA9IE5VTEw7CisJc3RydWN0IFJ4RF90ICpyeGRwID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKLQlidWZmQWRkX3QgKmJhID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZkFkZCAqYmEgPSBOVUxMOwogCXU2NCB0ZW1wMF82NCA9IDAsIHRlbXAxXzY0ID0gMCwgdGVtcDJfNjQgPSAwOwogCiAJLyogQ2FsY3VsYXRlIHRoZSBzaXplIGJhc2VkIG9uIHJpbmcgbW9kZSAqLwpAQCAtNjExMCw3ICs2MDc2LDcgQEAKIAogfQogCi1zdGF0aWMgaW50IHMyaW9fYWRkX2lzcihuaWNfdCAqIHNwKQorc3RhdGljIGludCBzMmlvX2FkZF9pc3Ioc3RydWN0IHMyaW9fbmljICogc3ApCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNwLT5kZXY7CkBAIC02MTI1LDcgKzYwOTEsNyBAQAogCQlzcC0+aW50cl90eXBlID0gSU5UQTsKIAl9CiAKLQkvKiBTdG9yZSB0aGUgdmFsdWVzIG9mIHRoZSBNU0lYIHRhYmxlIGluIHRoZSBuaWNfdCBzdHJ1Y3R1cmUgKi8KKwkvKiBTdG9yZSB0aGUgdmFsdWVzIG9mIHRoZSBNU0lYIHRhYmxlIGluIHRoZSBzdHJ1Y3QgczJpb19uaWMgc3RydWN0dXJlICovCiAJc3RvcmVfeG1zaV9kYXRhKHNwKTsKIAogCS8qIEFmdGVyIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiBIL1csIHJlZ2lzdGVyIElTUiAqLwpAQCAtNjE4MCw3ICs2MTQ2LDcgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgdm9pZCBzMmlvX3JlbV9pc3IobmljX3QgKiBzcCkKK3N0YXRpYyB2b2lkIHMyaW9fcmVtX2lzcihzdHJ1Y3QgczJpb19uaWMgKiBzcCkKIHsKIAlpbnQgY250ID0gMDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3AtPmRldjsKQEAgLTYyMjIsMTAgKzYxODgsMTAgQEAKIAl9IHdoaWxlKGNudCA8IDUpOwogfQogCi1zdGF0aWMgdm9pZCBzMmlvX2NhcmRfZG93bihuaWNfdCAqIHNwKQorc3RhdGljIHZvaWQgczJpb19jYXJkX2Rvd24oc3RydWN0IHMyaW9fbmljICogc3ApCiB7CiAJaW50IGNudCA9IDA7Ci0JWEVOQV9kZXZfY29uZmlnX3QgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IHNwLT5iYXIwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJcmVnaXN0ZXIgdTY0IHZhbDY0ID0gMDsKIApAQCAtNjI1Niw3ICs2MjIyLDggQEAKIAkJcnhkX293bmVyX2JpdF9yZXNldChzcCk7CiAKIAkJdmFsNjQgPSByZWFkcSgmYmFyMC0+YWRhcHRlcl9zdGF0dXMpOwotCQlpZiAodmVyaWZ5X3hlbmFfcXVpZXNjZW5jZShzcCwgdmFsNjQsIHNwLT5kZXZpY2VfZW5hYmxlZF9vbmNlKSkgeworCQlpZiAodmVyaWZ5X3hlbmFfcXVpZXNjZW5jZShzcCkpIHsKKwkJCWlmKHZlcmlmeV9wY2NfcXVpZXNjZW50KHNwLCBzcC0+ZGV2aWNlX2VuYWJsZWRfb25jZSkpCiAJCQlicmVhazsKIAkJfQogCkBAIC02Mjg1LDEwICs2MjUyLDEwIEBACiAJY2xlYXJfYml0KDAsICYoc3AtPmxpbmtfc3RhdGUpKTsKIH0KIAotc3RhdGljIGludCBzMmlvX2NhcmRfdXAobmljX3QgKiBzcCkKK3N0YXRpYyBpbnQgczJpb19jYXJkX3VwKHN0cnVjdCBzMmlvX25pYyAqIHNwKQogewogCWludCBpLCByZXQgPSAwOwotCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBtYWNfaW5mbyAqbWFjX2NvbnRyb2w7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgc3AtPmRldjsKIAl1MTYgaW50ZXJydXB0aWJsZTsKQEAgLTYzMTksNiArNjI4NiwxMyBAQAogCQlEQkdfUFJJTlQoSU5GT19EQkcsICJCdWYgaW4gcmluZzolZCBpcyAlZDpcbiIsIGksCiAJCQkgIGF0b21pY19yZWFkKCZzcC0+cnhfYnVmc19sZWZ0W2ldKSk7CiAJfQorCS8qIE1haW50YWluIHRoZSBzdGF0ZSBwcmlvciB0byB0aGUgb3BlbiAqLworCWlmIChzcC0+cHJvbWlzY19mbGcpCisJCXNwLT5wcm9taXNjX2ZsZyA9IDA7CisJaWYgKHNwLT5tX2Nhc3RfZmxnKSB7CisJCXNwLT5tX2Nhc3RfZmxnID0gMDsKKwkJc3AtPmFsbF9tdWx0aV9wb3M9IDA7CisJfQogCiAJLyogU2V0dGluZyBpdHMgcmVjZWl2ZSBtb2RlICovCiAJczJpb19zZXRfbXVsdGljYXN0KGRldik7CkBAIC02MzgwLDcgKzYzNTQsNyBAQAogCiBzdGF0aWMgdm9pZCBzMmlvX3Jlc3RhcnRfbmljKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQluaWNfdCAqc3AgPSBjb250YWluZXJfb2Yod29yaywgbmljX3QsIHJzdF90aW1lcl90YXNrKTsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzMmlvX25pYywgcnN0X3RpbWVyX3Rhc2spOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcC0+ZGV2OwogCiAJczJpb19jYXJkX2Rvd24oc3ApOwpAQCAtNjQwOSw3ICs2MzgzLDcgQEAKIAogc3RhdGljIHZvaWQgczJpb190eF93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCW5pY190ICpzcCA9IGRldi0+cHJpdjsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gZGV2LT5wcml2OwogCiAJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgewogCQlzY2hlZHVsZV93b3JrKCZzcC0+cnN0X3RpbWVyX3Rhc2spOwpAQCAtNjQzNCwxNiArNjQwOCwxNiBAQAogICogICBSZXR1cm4gdmFsdWU6CiAgKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGludCByeF9vc21faGFuZGxlcihyaW5nX2luZm9fdCAqcmluZ19kYXRhLCBSeERfdCAqIHJ4ZHApCitzdGF0aWMgaW50IHJ4X29zbV9oYW5kbGVyKHN0cnVjdCByaW5nX2luZm8gKnJpbmdfZGF0YSwgc3RydWN0IFJ4RF90ICogcnhkcCkKIHsKLQluaWNfdCAqc3AgPSByaW5nX2RhdGEtPm5pYzsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwID0gcmluZ19kYXRhLT5uaWM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBzcC0+ZGV2OwogCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikKIAkJKCh1bnNpZ25lZCBsb25nKSByeGRwLT5Ib3N0X0NvbnRyb2wpOwogCWludCByaW5nX25vID0gcmluZ19kYXRhLT5yaW5nX25vOwogCXUxNiBsM19jc3VtLCBsNF9jc3VtOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBlcnIgPSByeGRwLT5Db250cm9sXzEgJiBSWERfVF9DT0RFOwotCWxyb190ICpscm87CisJc3RydWN0IGxybyAqbHJvOwogCiAJc2tiLT5kZXYgPSBkZXY7CiAKQEAgLTY0ODgsNyArNjQ2Miw3IEBACiAJCWludCBidWYyX2xlbiA9IFJYRF9HRVRfQlVGRkVSMl9TSVpFXzMocnhkcC0+Q29udHJvbF8yKTsKIAkJdW5zaWduZWQgY2hhciAqYnVmZiA9IHNrYl9wdXNoKHNrYiwgYnVmMF9sZW4pOwogCi0JCWJ1ZmZBZGRfdCAqYmEgPSAmcmluZ19kYXRhLT5iYVtnZXRfYmxvY2tdW2dldF9vZmZdOworCQlzdHJ1Y3QgYnVmZkFkZCAqYmEgPSAmcmluZ19kYXRhLT5iYVtnZXRfYmxvY2tdW2dldF9vZmZdOwogCQlzcC0+c3RhdHMucnhfYnl0ZXMgKz0gYnVmMF9sZW4gKyBidWYyX2xlbjsKIAkJbWVtY3B5KGJ1ZmYsIGJhLT5iYV8wLCBidWYwX2xlbik7CiAKQEAgLTY0OTgsNyArNjQ3Miw2IEBACiAJCQlza2JfcHV0KHNrYiwgYnVmMV9sZW4pOwogCQkJc2tiLT5sZW4gKz0gYnVmMl9sZW47CiAJCQlza2ItPmRhdGFfbGVuICs9IGJ1ZjJfbGVuOwotCQkJc2tiLT50cnVlc2l6ZSArPSBidWYyX2xlbjsKIAkJCXNrYl9wdXQoc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QsIGJ1ZjJfbGVuKTsKIAkJCXNwLT5zdGF0cy5yeF9ieXRlcyArPSBidWYxX2xlbjsKIApAQCAtNjU4MiwyMyArNjU1NSwyMCBAQAogCiAJaWYgKCFzcC0+bHJvKSB7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0jaWZkZWYgQ09ORklHX1MySU9fTkFQSQogCQlpZiAoc3AtPnZsZ3JwICYmIFJYRF9HRVRfVkxBTl9UQUcocnhkcC0+Q29udHJvbF8yKSkgewogCQkJLyogUXVldWVpbmcgdGhlIHZsYW4gZnJhbWUgdG8gdGhlIHVwcGVyIGxheWVyICovCi0JCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBzcC0+dmxncnAsCi0JCQkJUlhEX0dFVF9WTEFOX1RBRyhyeGRwLT5Db250cm9sXzIpKTsKKwkJCWlmIChuYXBpKQorCQkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIHNwLT52bGdycCwKKwkJCQkJUlhEX0dFVF9WTEFOX1RBRyhyeGRwLT5Db250cm9sXzIpKTsKKwkJCWVsc2UKKwkJCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBzcC0+dmxncnAsCisJCQkJCVJYRF9HRVRfVkxBTl9UQUcocnhkcC0+Q29udHJvbF8yKSk7CiAJCX0gZWxzZSB7Ci0JCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQkJaWYgKG5hcGkpCisJCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJCWVsc2UKKwkJCQluZXRpZl9yeChza2IpOwogCQl9Ci0jZWxzZQotCQlpZiAoc3AtPnZsZ3JwICYmIFJYRF9HRVRfVkxBTl9UQUcocnhkcC0+Q29udHJvbF8yKSkgewotCQkJLyogUXVldWVpbmcgdGhlIHZsYW4gZnJhbWUgdG8gdGhlIHVwcGVyIGxheWVyICovCi0JCQl2bGFuX2h3YWNjZWxfcngoc2tiLCBzcC0+dmxncnAsCi0JCQkJUlhEX0dFVF9WTEFOX1RBRyhyeGRwLT5Db250cm9sXzIpKTsKLQkJfSBlbHNlIHsKLQkJCW5ldGlmX3J4KHNrYik7Ci0JCX0KLSNlbmRpZgogCX0gZWxzZSB7CiBzZW5kX3VwOgogCQlxdWV1ZV9yeF9mcmFtZShza2IpOwpAQCAtNjYyMiw3ICs2NTkyLDcgQEAKICAqICB2b2lkLgogICovCiAKLXN0YXRpYyB2b2lkIHMyaW9fbGluayhuaWNfdCAqIHNwLCBpbnQgbGluaykKK3N0YXRpYyB2b2lkIHMyaW9fbGluayhzdHJ1Y3QgczJpb19uaWMgKiBzcCwgaW50IGxpbmspCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBzcC0+ZGV2OwogCkBAIC02NjY2LDcgKzY2MzYsNyBAQAogICogIHZvaWQKICAqLwogCi1zdGF0aWMgdm9pZCBzMmlvX2luaXRfcGNpKG5pY190ICogc3ApCitzdGF0aWMgdm9pZCBzMmlvX2luaXRfcGNpKHN0cnVjdCBzMmlvX25pYyAqIHNwKQogewogCXUxNiBwY2lfY21kID0gMCwgcGNpeF9jbWQgPSAwOwogCkBAIC02Njk5LDEzICs2NjY5LDkgQEAKIAkJREJHX1BSSU5UKEVSUl9EQkcsICJzMmlvOiBEZWZhdWx0IHRvIDggUnggcmluZ3NcbiIpOwogCQlyeF9yaW5nX251bSA9IDg7CiAJfQotI2lmZGVmIENPTkZJR19TMklPX05BUEkKLQlpZiAoKmRldl9pbnRyX3R5cGUgIT0gSU5UQSkgewotCQlEQkdfUFJJTlQoRVJSX0RCRywgInMyaW86IE5BUEkgY2Fubm90IGJlIGVuYWJsZWQgd2hlbiAiCi0JCQkgICJNU0kvTVNJLVggaXMgZW5hYmxlZC4gRGVmYXVsdGluZyB0byBJTlRBXG4iKTsKLQkJKmRldl9pbnRyX3R5cGUgPSBJTlRBOwotCX0KLSNlbmRpZgorCWlmICgqZGV2X2ludHJfdHlwZSAhPSBJTlRBKQorCQluYXBpID0gMDsKKwogI2lmbmRlZiBDT05GSUdfUENJX01TSQogCWlmICgqZGV2X2ludHJfdHlwZSAhPSBJTlRBKSB7CiAJCURCR19QUklOVChFUlJfREJHLCAiczJpbzogVGhpcyBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCIKQEAgLTY3MjYsNiArNjY5Miw4IEBACiAJCQkJCSJEZWZhdWx0aW5nIHRvIElOVEFcbiIpOwogCQkqZGV2X2ludHJfdHlwZSA9IElOVEE7CiAJfQorCWlmICggKHJ4X3JpbmdfbnVtID4gMSkgJiYgKCpkZXZfaW50cl90eXBlICE9IElOVEEpICkKKwkJbmFwaSA9IDA7CiAJaWYgKHJ4X3JpbmdfbW9kZSA+IDMpIHsKIAkJREJHX1BSSU5UKEVSUl9EQkcsICJzMmlvOiBSZXF1ZXN0ZWQgcmluZyBtb2RlIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlEQkdfUFJJTlQoRVJSX0RCRywgInMyaW86IERlZmF1bHRpbmcgdG8gMy1idWZmZXIgbW9kZVxuIik7CkBAIC02NzUxLDE1ICs2NzE5LDE1IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdAogczJpb19pbml0X25pYyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnByZSkKIHsKLQluaWNfdCAqc3A7CisJc3RydWN0IHMyaW9fbmljICpzcDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWludCBpLCBqLCByZXQ7CiAJaW50IGRtYV9mbGFnID0gRkFMU0U7CiAJdTMyIG1hY191cCwgbWFjX2Rvd247CiAJdTY0IHZhbDY0ID0gMCwgdG1wNjQgPSAwOwotCVhFTkFfZGV2X2NvbmZpZ190IF9faW9tZW0gKmJhcjAgPSBOVUxMOworCXN0cnVjdCBYRU5BX2Rldl9jb25maWcgX19pb21lbSAqYmFyMCA9IE5VTEw7CiAJdTE2IHN1YmlkOwotCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBtYWNfaW5mbyAqbWFjX2NvbnRyb2w7CiAJc3RydWN0IGNvbmZpZ19wYXJhbSAqY29uZmlnOwogCWludCBtb2RlOwogCXU4IGRldl9pbnRyX3R5cGUgPSBpbnRyX3R5cGU7CkBAIC02ODE0LDcgKzY3ODIsNyBAQAogCQl9CiAJfQogCi0JZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKG5pY190KSk7CisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzMmlvX25pYykpOwogCWlmIChkZXYgPT0gTlVMTCkgewogCQlEQkdfUFJJTlQoRVJSX0RCRywgIkRldmljZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKQEAgLTY4MjksNyArNjc5Nyw3IEBACiAKIAkvKiAgUHJpdmF0ZSBtZW1iZXIgdmFyaWFibGUgaW5pdGlhbGl6ZWQgdG8gczJpbyBOSUMgc3RydWN0dXJlICovCiAJc3AgPSBkZXYtPnByaXY7Ci0JbWVtc2V0KHNwLCAwLCBzaXplb2YobmljX3QpKTsKKwltZW1zZXQoc3AsIDAsIHNpemVvZihzdHJ1Y3QgczJpb19uaWMpKTsKIAlzcC0+ZGV2ID0gZGV2OwogCXNwLT5wZGV2ID0gcGRldjsKIAlzcC0+aGlnaF9kbWFfZmxhZyA9IGRtYV9mbGFnOwpAQCAtNjkyNSw3ICs2ODkzLDcgQEAKIAlzcC0+YmFyMCA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAogCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7CiAJaWYgKCFzcC0+YmFyMCkgewotCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBTMklPOiBjYW5ub3QgcmVtYXAgaW8gbWVtMVxuIiwKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTmV0ZXJpb246IGNhbm5vdCByZW1hcCBpbyBtZW0xXG4iLAogCQkJICBkZXYtPm5hbWUpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGJhcjBfcmVtYXBfZmFpbGVkOwpAQCAtNjkzNCw3ICs2OTAyLDcgQEAKIAlzcC0+YmFyMSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLAogCQkJCSAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSk7CiAJaWYgKCFzcC0+YmFyMSkgewotCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBTMklPOiBjYW5ub3QgcmVtYXAgaW8gbWVtMlxuIiwKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTmV0ZXJpb246IGNhbm5vdCByZW1hcCBpbyBtZW0yXG4iLAogCQkJICBkZXYtPm5hbWUpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGJhcjFfcmVtYXBfZmFpbGVkOwpAQCAtNjk0NSw3ICs2OTEzLDcgQEAKIAogCS8qIEluaXRpYWxpemluZyB0aGUgQkFSMSBhZGRyZXNzIGFzIHRoZSBzdGFydCBvZiB0aGUgRklGTyBwb2ludGVyLiAqLwogCWZvciAoaiA9IDA7IGogPCBNQVhfVFhfRklGT1M7IGorKykgewotCQltYWNfY29udHJvbC0+dHhfRklGT19zdGFydFtqXSA9IChUeEZJRk9fZWxlbWVudF90IF9faW9tZW0gKikKKwkJbWFjX2NvbnRyb2wtPnR4X0ZJRk9fc3RhcnRbal0gPSAoc3RydWN0IFR4RklGT19lbGVtZW50IF9faW9tZW0gKikKIAkJICAgIChzcC0+YmFyMSArIChqICogMHgwMDAyMDAwMCkpOwogCX0KIApAQCAtNjk2NiwxMCArNjkzNCw4IEBACiAJICogd2lsbCB1c2UgZXRoX21hY19hZGRyKCkgZm9yICBkZXYtPnNldF9tYWNfYWRkcmVzcwogCSAqIG1hYyBhZGRyZXNzIHdpbGwgYmUgc2V0IGV2ZXJ5IHRpbWUgZGV2LT5vcGVuKCkgaXMgY2FsbGVkCiAJICovCi0jaWYgZGVmaW5lZChDT05GSUdfUzJJT19OQVBJKQogCWRldi0+cG9sbCA9IHMyaW9fcG9sbDsKIAlkZXYtPndlaWdodCA9IDMyOwotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCWRldi0+cG9sbF9jb250cm9sbGVyID0gczJpb19uZXRwb2xsOwpAQCAtNjk3OCwxMyArNjk0NCw5IEBACiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNOwogCWlmIChzcC0+aGlnaF9kbWFfZmxhZyA9PSBUUlVFKQogCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKLSNpZmRlZiBORVRJRl9GX1RTTwogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087Ci0jZW5kaWYKLSNpZmRlZiBORVRJRl9GX1RTTzYKIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfVFNPNjsKLSNlbmRpZgotCWlmIChzcC0+ZGV2aWNlX3R5cGUgJiBYRlJBTUVfSUlfREVWSUNFKSB7CisJaWYgKChzcC0+ZGV2aWNlX3R5cGUgJiBYRlJBTUVfSUlfREVWSUNFKSAmJiAodWZvKSkgIHsKIAkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1VGTzsKIAkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX0NTVU07CiAJfQpAQCAtNzA2NSw5ICs3MDI3LDkgQEAKIAogCS8qIEluaXRpYWxpemUgc3BpbmxvY2tzICovCiAJc3Bpbl9sb2NrX2luaXQoJnNwLT50eF9sb2NrKTsKLSNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQotCXNwaW5fbG9ja19pbml0KCZzcC0+cHV0X2xvY2spOwotI2VuZGlmCisKKwlpZiAoIW5hcGkpCisJCXNwaW5fbG9ja19pbml0KCZzcC0+cHV0X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZzcC0+cnhfbG9jayk7CiAKIAkvKgpAQCAtNzA5OCwxMyArNzA2MCwxNCBAQAogCURCR19QUklOVChFUlJfREJHLCAiJXM6IERyaXZlciB2ZXJzaW9uICVzXG4iLCBkZXYtPm5hbWUsCiAJCSAgczJpb19kcml2ZXJfdmVyc2lvbik7CiAJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTUFDIEFERFI6ICIKLQkJCSAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLCBkZXYtPm5hbWUsCisJCQkgICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsIGRldi0+bmFtZSwKIAkJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclswXSwKIAkJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclsxXSwKIAkJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclsyXSwKIAkJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkclszXSwKIAkJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkcls0XSwKIAkJCSAgc3AtPmRlZl9tYWNfYWRkclswXS5tYWNfYWRkcls1XSk7CisJREJHX1BSSU5UKEVSUl9EQkcsICJTRVJJQUwgTlVNQkVSOiAlc1xuIiwgc3AtPnNlcmlhbF9udW0pOwogCWlmIChzcC0+ZGV2aWNlX3R5cGUgJiBYRlJBTUVfSUlfREVWSUNFKSB7CiAJCW1vZGUgPSBzMmlvX3ByaW50X3BjaV9tb2RlKHNwKTsKIAkJaWYgKG1vZGUgPCAwKSB7CkBAIC03MTI4LDkgKzcwOTEsOSBAQAogCQkJCQkJZGV2LT5uYW1lKTsKIAkJICAgIGJyZWFrOwogCX0KLSNpZmRlZiBDT05GSUdfUzJJT19OQVBJCi0JREJHX1BSSU5UKEVSUl9EQkcsICIlczogTkFQSSBlbmFibGVkXG4iLCBkZXYtPm5hbWUpOwotI2VuZGlmCisKKwlpZiAobmFwaSkKKwkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogTkFQSSBlbmFibGVkXG4iLCBkZXYtPm5hbWUpOwogCXN3aXRjaChzcC0+aW50cl90eXBlKSB7CiAJCWNhc2UgSU5UQToKIAkJICAgIERCR19QUklOVChFUlJfREJHLCAiJXM6IEludGVycnVwdCB0eXBlIElOVEFcbiIsIGRldi0+bmFtZSk7CkBAIC03MTQ1LDcgKzcxMDgsOSBAQAogCWlmIChzcC0+bHJvKQogCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBMYXJnZSByZWNlaXZlIG9mZmxvYWQgZW5hYmxlZFxuIiwKIAkJCSAgZGV2LT5uYW1lKTsKLQorCWlmICh1Zm8pCisJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFVEUCBGcmFnbWVudGF0aW9uIE9mZmxvYWQoVUZPKSIKKwkJCQkJIiBlbmFibGVkXG4iLCBkZXYtPm5hbWUpOwogCS8qIEluaXRpYWxpemUgZGV2aWNlIG5hbWUgKi8KIAlzcHJpbnRmKHNwLT5uYW1lLCAiJXMgTmV0ZXJpb24gJXMiLCBkZXYtPm5hbWUsIHNwLT5wcm9kdWN0X25hbWUpOwogCkBAIC03MjAyLDcgKzcxNjcsNyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPQogCSAgICAoc3RydWN0IG5ldF9kZXZpY2UgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCW5pY190ICpzcDsKKwlzdHJ1Y3QgczJpb19uaWMgKnNwOwogCiAJaWYgKGRldiA9PSBOVUxMKSB7CiAJCURCR19QUklOVChFUlJfREJHLCAiRHJpdmVyIERhdGEgaXMgTlVMTCEhXG4iKTsKQEAgLTcyMTUsNyArNzE4MCw2IEBACiAJZnJlZV9zaGFyZWRfbWVtKHNwKTsKIAlpb3VubWFwKHNwLT5iYXIwKTsKIAlpb3VubWFwKHNwLT5iYXIxKTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHNwLT5pbnRyX3R5cGUgIT0gTVNJX1gpCiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiAJZWxzZSB7CkBAIC03MjI2LDYgKzcxOTAsNyBAQAogCX0KIAlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiB9CiAKIC8qKgpAQCAtNzI0NCw3ICs3MjA5LDcgQEAKICAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjbGVhbnVwIHJvdXRpbmUgZm9yIHRoZSBkcml2ZXIuIEl0IHVucmVnaXN0ICogZXJzIHRoZSBkcml2ZXIuCiAgKi8KIAotc3RhdGljIHZvaWQgczJpb19jbG9zZXIodm9pZCkKK3N0YXRpYyBfX2V4aXQgdm9pZCBzMmlvX2Nsb3Nlcih2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmczJpb19kcml2ZXIpOwogCURCR19QUklOVChJTklUX0RCRywgImNsZWFudXAgZG9uZVxuIik7CkBAIC03MjU0LDcgKzcyMTksNyBAQAogbW9kdWxlX2V4aXQoczJpb19jbG9zZXIpOwogCiBzdGF0aWMgaW50IGNoZWNrX0wyX2xyb19jYXBhYmxlKHU4ICpidWZmZXIsIHN0cnVjdCBpcGhkciAqKmlwLAotCQlzdHJ1Y3QgdGNwaGRyICoqdGNwLCBSeERfdCAqcnhkcCkKKwkJc3RydWN0IHRjcGhkciAqKnRjcCwgc3RydWN0IFJ4RF90ICpyeGRwKQogewogCWludCBpcF9vZmY7CiAJdTggbDJfdHlwZSA9ICh1OCkoKHJ4ZHAtPkNvbnRyb2xfMSA+PiAzNykgJiAweDcpLCBpcF9sZW47CkBAIC03Mjg4LDcgKzcyNTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX2Zvcl9zb2NrZXRfbWF0Y2gobHJvX3QgKmxybywgc3RydWN0IGlwaGRyICppcCwKK3N0YXRpYyBpbnQgY2hlY2tfZm9yX3NvY2tldF9tYXRjaChzdHJ1Y3QgbHJvICpscm8sIHN0cnVjdCBpcGhkciAqaXAsCiAJCQkJICBzdHJ1Y3QgdGNwaGRyICp0Y3ApCiB7CiAJREJHX1BSSU5UKElORk9fREJHLCIlczogQmVlbiBoZXJlLi4uXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNzMwMyw3ICs3MjY4LDcgQEAKIAlyZXR1cm4obnRvaHMoaXAtPnRvdF9sZW4pIC0gKGlwLT5paGwgPDwgMikgLSAodGNwLT5kb2ZmIDw8IDIpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdGlhdGVfbmV3X3Nlc3Npb24obHJvX3QgKmxybywgdTggKmwyaCwKK3N0YXRpYyB2b2lkIGluaXRpYXRlX25ld19zZXNzaW9uKHN0cnVjdCBscm8gKmxybywgdTggKmwyaCwKIAkJICAgICBzdHJ1Y3QgaXBoZHIgKmlwLCBzdHJ1Y3QgdGNwaGRyICp0Y3AsIHUzMiB0Y3BfcHlsZF9sZW4pCiB7CiAJREJHX1BSSU5UKElORk9fREJHLCIlczogQmVlbiBoZXJlLi4uXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNzMyOSwxMiArNzI5NCwxMiBAQAogCWxyby0+aW5fdXNlID0gMTsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlX0wzTDRfaGVhZGVyKG5pY190ICpzcCwgbHJvX3QgKmxybykKK3N0YXRpYyB2b2lkIHVwZGF0ZV9MM0w0X2hlYWRlcihzdHJ1Y3QgczJpb19uaWMgKnNwLCBzdHJ1Y3QgbHJvICpscm8pCiB7CiAJc3RydWN0IGlwaGRyICppcCA9IGxyby0+aXBoOwogCXN0cnVjdCB0Y3BoZHIgKnRjcCA9IGxyby0+dGNwaDsKIAl1MTYgbmNoazsKLQlTdGF0SW5mb190ICpzdGF0aW5mbyA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvOworCXN0cnVjdCBzdGF0X2Jsb2NrICpzdGF0aW5mbyA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvOwogCURCR19QUklOVChJTkZPX0RCRywiJXM6IEJlZW4gaGVyZS4uLlxuIiwgX19GVU5DVElPTl9fKTsKIAogCS8qIFVwZGF0ZSBMMyBoZWFkZXIgKi8KQEAgLTczNjAsNyArNzMyNSw3IEBACiAJc3RhdGluZm8tPnN3X3N0YXQubnVtX2FnZ3JlZ2F0aW9ucysrOwogfQogCi1zdGF0aWMgdm9pZCBhZ2dyZWdhdGVfbmV3X3J4KGxyb190ICpscm8sIHN0cnVjdCBpcGhkciAqaXAsCitzdGF0aWMgdm9pZCBhZ2dyZWdhdGVfbmV3X3J4KHN0cnVjdCBscm8gKmxybywgc3RydWN0IGlwaGRyICppcCwKIAkJc3RydWN0IHRjcGhkciAqdGNwLCB1MzIgbDRfcHlsZCkKIHsKIAlEQkdfUFJJTlQoSU5GT19EQkcsIiVzOiBCZWVuIGhlcmUuLi5cbiIsIF9fRlVOQ1RJT05fXyk7CkBAIC03MzgyLDcgKzczNDcsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCB2ZXJpZnlfbDNfbDRfbHJvX2NhcGFibGUobHJvX3QgKmxfbHJvLCBzdHJ1Y3QgaXBoZHIgKmlwLAorc3RhdGljIGludCB2ZXJpZnlfbDNfbDRfbHJvX2NhcGFibGUoc3RydWN0IGxybyAqbF9scm8sIHN0cnVjdCBpcGhkciAqaXAsCiAJCQkJICAgIHN0cnVjdCB0Y3BoZHIgKnRjcCwgdTMyIHRjcF9weWxkX2xlbikKIHsKIAl1OCAqcHRyOwpAQCAtNzQ0MCw4ICs3NDA1LDggQEAKIH0KIAogc3RhdGljIGludAotczJpb19jbHViX3RjcF9zZXNzaW9uKHU4ICpidWZmZXIsIHU4ICoqdGNwLCB1MzIgKnRjcF9sZW4sIGxyb190ICoqbHJvLAotCQkgICAgICBSeERfdCAqcnhkcCwgbmljX3QgKnNwKQorczJpb19jbHViX3RjcF9zZXNzaW9uKHU4ICpidWZmZXIsIHU4ICoqdGNwLCB1MzIgKnRjcF9sZW4sIHN0cnVjdCBscm8gKipscm8sCisJCSAgICAgIHN0cnVjdCBSeERfdCAqcnhkcCwgc3RydWN0IHMyaW9fbmljICpzcCkKIHsKIAlzdHJ1Y3QgaXBoZHIgKmlwOwogCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CkBAIC03NDU4LDcgKzc0MjMsNyBAQAogCXRjcGggPSAoc3RydWN0IHRjcGhkciAqKSp0Y3A7CiAJKnRjcF9sZW4gPSBnZXRfbDRfcHlsZF9sZW5ndGgoaXAsIHRjcGgpOwogCWZvciAoaT0wOyBpPE1BWF9MUk9fU0VTU0lPTlM7IGkrKykgewotCQlscm9fdCAqbF9scm8gPSAmc3AtPmxybzBfbltpXTsKKwkJc3RydWN0IGxybyAqbF9scm8gPSAmc3AtPmxybzBfbltpXTsKIAkJaWYgKGxfbHJvLT5pbl91c2UpIHsKIAkJCWlmIChjaGVja19mb3Jfc29ja2V0X21hdGNoKGxfbHJvLCBpcCwgdGNwaCkpCiAJCQkJY29udGludWU7CkBAIC03NDk2LDcgKzc0NjEsNyBAQAogCQl9CiAKIAkJZm9yIChpPTA7IGk8TUFYX0xST19TRVNTSU9OUzsgaSsrKSB7Ci0JCQlscm9fdCAqbF9scm8gPSAmc3AtPmxybzBfbltpXTsKKwkJCXN0cnVjdCBscm8gKmxfbHJvID0gJnNwLT5scm8wX25baV07CiAJCQlpZiAoIShsX2xyby0+aW5fdXNlKSkgewogCQkJCSpscm8gPSBsX2xybzsKIAkJCQlyZXQgPSAzOyAvKiBCZWdpbiBhbmV3ICovCkBAIC03NTM1LDkgKzc1MDAsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFyX2xyb19zZXNzaW9uKGxyb190ICpscm8pCitzdGF0aWMgdm9pZCBjbGVhcl9scm9fc2Vzc2lvbihzdHJ1Y3QgbHJvICpscm8pCiB7Ci0Jc3RhdGljIHUxNiBscm9fc3RydWN0X3NpemUgPSBzaXplb2YobHJvX3QpOworCXN0YXRpYyB1MTYgbHJvX3N0cnVjdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBscm8pOwogCiAJbWVtc2V0KGxybywgMCwgbHJvX3N0cnVjdF9zaXplKTsKIH0KQEAgLTc1NDcsMTQgKzc1MTIsMTQgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CiAKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwotI2lmZGVmIENPTkZJR19TMklPX05BUEkKLQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwotI2Vsc2UKLQluZXRpZl9yeChza2IpOwotI2VuZGlmCisJaWYgKG5hcGkpCisJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJZWxzZQorCQluZXRpZl9yeChza2IpOwogfQogCi1zdGF0aWMgdm9pZCBscm9fYXBwZW5kX3BrdChuaWNfdCAqc3AsIGxyb190ICpscm8sIHN0cnVjdCBza19idWZmICpza2IsCitzdGF0aWMgdm9pZCBscm9fYXBwZW5kX3BrdChzdHJ1Y3QgczJpb19uaWMgKnNwLCBzdHJ1Y3QgbHJvICpscm8sCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgdTMyIHRjcF9sZW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKmZpcnN0ID0gbHJvLT5wYXJlbnQ7CkBAIC03NTY2LDYgKzc1MzEsNyBAQAogCQlscm8tPmxhc3RfZnJhZy0+bmV4dCA9IHNrYjsKIAllbHNlCiAJCXNrYl9zaGluZm8oZmlyc3QpLT5mcmFnX2xpc3QgPSBza2I7CisJZmlyc3QtPnRydWVzaXplICs9IHNrYi0+dHJ1ZXNpemU7CiAJbHJvLT5sYXN0X2ZyYWcgPSBza2I7CiAJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuY2x1YmJlZF9mcm1zX2NudCsrOwogCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uaCBiL2RyaXZlcnMvbmV0L3MyaW8uaAppbmRleCAzYjBiYWZkLi5hNWUxYTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmgKKysrIGIvZHJpdmVycy9uZXQvczJpby5oCkBAIC0zMCw2ICszMCw4IEBACiAjdW5kZWYgU1VDQ0VTUwogI2RlZmluZSBTVUNDRVNTIDAKICNkZWZpbmUgRkFJTFVSRSAtMQorI2RlZmluZSBTMklPX01JTlVTX09ORSAweEZGRkZGRkZGRkZGRkZGRkZVTEwKKyNkZWZpbmUgUzJJT19NQVhfUENJX0NPTkZJR19TUEFDRV9SRUlOSVQgMTAwCiAKICNkZWZpbmUgQ0hFQ0tCSVQodmFsdWUsIG5iaXQpICh2YWx1ZSAmICgxIDw8IG5iaXQpKQogCkBAIC0zNyw3ICszOSw3IEBACiAjZGVmaW5lIE1BWF9GTElDS0VSX1RJTUUJNjAwMDAgLyogNjAgU2VjcyAqLwogCiAvKiBNYXhpbXVtIG91dHN0YW5kaW5nIHNwbGl0cyB0byBiZSBjb25maWd1cmVkIGludG8geGVuYS4gKi8KLXR5cGVkZWYgZW51bSB4ZW5hX21heF9vdXRzdGFuZGluZ19zcGxpdHMgeworZW51bSB7CiAJWEVOQV9PTkVfU1BMSVRfVFJBTlNBQ1RJT04gPSAwLAogCVhFTkFfVFdPX1NQTElUX1RSQU5TQUNUSU9OID0gMSwKIAlYRU5BX1RIUkVFX1NQTElUX1RSQU5TQUNUSU9OID0gMiwKQEAgLTQ2LDcgKzQ4LDcgQEAKIAlYRU5BX1RXRUxWRV9TUExJVF9UUkFOU0FDVElPTiA9IDUsCiAJWEVOQV9TSVhURUVOX1NQTElUX1RSQU5TQUNUSU9OID0gNiwKIAlYRU5BX1RISVJUWVRXT19TUExJVF9UUkFOU0FDVElPTiA9IDcKLX0geGVuYV9tYXhfb3V0c3RhbmRpbmdfc3BsaXRzOworfTsKICNkZWZpbmUgWEVOQV9NQVhfT1VUU1RBTkRJTkdfU1BMSVRTKG4pIChuIDw8IDQpCiAKIC8qICBPUyBjb25jZXJuZWQgdmFyaWFibGVzIGFuZCBjb25zdGFudHMgKi8KQEAgLTc3LDcgKzc5LDcgQEAKICNkZWZpbmUgUzJJT19KVU1CT19TSVpFIDk2MDAKIAogLyogRHJpdmVyIHN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBkcml2ZXIgKi8KLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCBzd1N0YXQgewogCXVuc2lnbmVkIGxvbmcgbG9uZyBzaW5nbGVfZWNjX2VycnM7CiAJdW5zaWduZWQgbG9uZyBsb25nIGRvdWJsZV9lY2NfZXJyczsKIAl1bnNpZ25lZCBsb25nIGxvbmcgcGFyaXR5X2Vycl9jbnQ7CkBAIC05MiwxMCArOTQsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGxvbmcgZmx1c2hfbWF4X3BrdHM7CiAJdW5zaWduZWQgbG9uZyBsb25nIHN1bV9hdmdfcGt0c19hZ2dyZWdhdGVkOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBudW1fYWdncmVnYXRpb25zOwotfSBzd1N0YXRfdDsKK307CiAKIC8qIFhwYWsgcmVsZWF0ZWQgYWxhcm0gYW5kIHdhcm5pbmdzICovCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgeHBha1N0YXQgewogCXU2NCBhbGFybV90cmFuc2NlaXZlcl90ZW1wX2hpZ2g7CiAJdTY0IGFsYXJtX3RyYW5zY2VpdmVyX3RlbXBfbG93OwogCXU2NCBhbGFybV9sYXNlcl9iaWFzX2N1cnJlbnRfaGlnaDsKQEAgLTExMCwxMSArMTEyLDExIEBACiAJdTY0IHdhcm5fbGFzZXJfb3V0cHV0X3Bvd2VyX2xvdzsKIAl1NjQgeHBha19yZWdzX3N0YXQ7CiAJdTMyIHhwYWtfdGltZXJfY291bnQ7Ci19IHhwYWtTdGF0X3Q7Cit9OwogCiAKIC8qIFRoZSBzdGF0aXN0aWNzIGJsb2NrIG9mIFhlbmEgKi8KLXR5cGVkZWYgc3RydWN0IHN0YXRfYmxvY2sgeworc3RydWN0IHN0YXRfYmxvY2sgewogLyogVHggTUFDIHN0YXRpc3RpY3MgY291bnRlcnMuICovCiAJX19sZTMyIHRtYWNfZGF0YV9vY3RldHM7CiAJX19sZTMyIHRtYWNfZnJtczsKQEAgLTI5MCw5ICsyOTIsOSBAQAogCV9fbGUzMiByZXNlcnZlZF8xNDsKIAlfX2xlMzIgbGlua19mYXVsdF9jbnQ7CiAJdTggIGJ1ZmZlclsyMF07Ci0Jc3dTdGF0X3Qgc3dfc3RhdDsKLQl4cGFrU3RhdF90IHhwYWtfc3RhdDsKLX0gU3RhdEluZm9fdDsKKwlzdHJ1Y3Qgc3dTdGF0IHN3X3N0YXQ7CisJc3RydWN0IHhwYWtTdGF0IHhwYWtfc3RhdDsKK307CiAKIC8qCiAgKiBTdHJ1Y3R1cmVzIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgaW5pdCB0aW1lIGNvbmZpZ3VyYXRpb24KQEAgLTMxNSw3ICszMTcsNyBAQAogfTsKIAogLyogTWFpbnRhaW5zIFBlciBGSUZPIHJlbGF0ZWQgaW5mb3JtYXRpb24uICovCi10eXBlZGVmIHN0cnVjdCB0eF9maWZvX2NvbmZpZyB7CitzdHJ1Y3QgdHhfZmlmb19jb25maWcgewogI2RlZmluZQlNQVhfQVZBSUxBQkxFX1RYRFMJODE5MgogCXUzMiBmaWZvX2xlbjsJCS8qIHNwZWNpZmllcyBsZW4gb2YgRklGTyB1cHRvIDgxOTIsIGllIG5vIG9mIFR4RExzICovCiAvKiBQcmlvcml0eSBkZWZpbml0aW9uICovCkBAIC0zMzIsMTEgKzMzNCwxMSBAQAogCXU4IGZfbm9fc25vb3A7CiAjZGVmaW5lIE5PX1NOT09QX1RYRCAgICAgICAgICAgICAgICAweDAxCiAjZGVmaW5lIE5PX1NOT09QX1RYRF9CVUZGRVIgICAgICAgICAgMHgwMgotfSB0eF9maWZvX2NvbmZpZ190OworfTsKIAogCiAvKiBNYWludGFpbnMgcGVyIFJpbmcgcmVsYXRlZCBpbmZvcm1hdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgcnhfcmluZ19jb25maWcgeworc3RydWN0IHJ4X3JpbmdfY29uZmlnIHsKIAl1MzIgbnVtX3J4ZDsJCS8qTm8gb2YgUnhEcyBwZXIgUnggUmluZyAqLwogI2RlZmluZSBSWF9SSU5HX1BSSV8wICAgICAgICAgICAgICAgMAkvKiBoaWdoZXN0ICovCiAjZGVmaW5lIFJYX1JJTkdfUFJJXzEgICAgICAgICAgICAgICAxCkBAIC0zNTcsNyArMzU5LDcgQEAKIAl1OCBmX25vX3Nub29wOwogI2RlZmluZSBOT19TTk9PUF9SWEQgICAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBOT19TTk9PUF9SWERfQlVGRkVSICAgICAgICAgMHgwMgotfSByeF9yaW5nX2NvbmZpZ190OworfTsKIAogLyogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgY29udGFpbnMgdmFsdWVzIG9mIHRoZSB0dW5hYmxlIHBhcmFtZXRlcnMKICAqIG9mIHRoZSBIL1cKQEAgLTM2Nyw3ICszNjksNyBAQAogCXUzMiB0eF9maWZvX251bTsJLypOdW1iZXIgb2YgVHggRklGT3MgKi8KIAogCXU4IGZpZm9fbWFwcGluZ1tNQVhfVFhfRklGT1NdOwotCXR4X2ZpZm9fY29uZmlnX3QgdHhfY2ZnW01BWF9UWF9GSUZPU107CS8qUGVyLVR4IEZJRk8gY29uZmlnICovCisJc3RydWN0IHR4X2ZpZm9fY29uZmlnIHR4X2NmZ1tNQVhfVFhfRklGT1NdOwkvKlBlci1UeCBGSUZPIGNvbmZpZyAqLwogCXUzMiBtYXhfdHhkczsJCS8qTWF4IG5vLiBvZiBUeCBidWZmZXIgZGVzY3JpcHRvciBwZXIgVHhETCAqLwogCXU2NCB0eF9pbnRyX3R5cGU7CiAJLyogU3BlY2lmaWVzIGlmIFR4IEludHIgaXMgVVRJTFogb3IgUEVSX0xJU1QgdHlwZS4gKi8KQEAgLTM3Niw3ICszNzgsNyBAQAogCXUzMiByeF9yaW5nX251bTsJLypOdW1iZXIgb2YgcmVjZWl2ZSByaW5ncyAqLwogI2RlZmluZSBNQVhfUlhfQkxPQ0tTX1BFUl9SSU5HICAxNTAKIAotCXJ4X3JpbmdfY29uZmlnX3QgcnhfY2ZnW01BWF9SWF9SSU5HU107CS8qUGVyLVJ4IFJpbmcgY29uZmlnICovCisJc3RydWN0IHJ4X3JpbmdfY29uZmlnIHJ4X2NmZ1tNQVhfUlhfUklOR1NdOwkvKlBlci1SeCBSaW5nIGNvbmZpZyAqLwogCXU4IGJpbW9kYWw7CQkvKkZsYWcgZm9yIHNldHRpbmcgYmltb2RhbCBpbnRlcnJ1cHRzKi8KIAogI2RlZmluZSBIRUFERVJfRVRIRVJORVRfSUlfODAyXzNfU0laRSAxNApAQCAtMzk1LDE0ICszOTcsMTQgQEAKIH07CiAKIC8qIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgTUFDIEFkZHJzICovCi10eXBlZGVmIHN0cnVjdCBtYWNfYWRkciB7CitzdHJ1Y3QgbWFjX2FkZHIgewogCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKLX0gbWFjYWRkcl90OworfTsKIAogLyogU3RydWN0dXJlIHRoYXQgcmVwcmVzZW50IGV2ZXJ5IEZJRk8gZWxlbWVudCBpbiB0aGUgQkFSMQogICogQWRkcmVzcyBsb2NhdGlvbi4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgX1R4RklGT19lbGVtZW50IHsKK3N0cnVjdCBUeEZJRk9fZWxlbWVudCB7CiAJdTY0IFR4RExfUG9pbnRlcjsKIAogCXU2NCBMaXN0X0NvbnRyb2w7CkBAIC00MTMsMTAgKzQxNSwxMCBAQAogI2RlZmluZSBUWF9GSUZPX1NQRUNJQUxfRlVOQyAgICAgICAgICAgQklUKDIzKQogI2RlZmluZSBUWF9GSUZPX0RTX05PX1NOT09QICAgICAgICAgICAgQklUKDMxKQogI2RlZmluZSBUWF9GSUZPX0JVRkZfTk9fU05PT1AgICAgICAgICAgQklUKDMwKQotfSBUeEZJRk9fZWxlbWVudF90OworfTsKIAogLyogVHggZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IF9UeEQgeworc3RydWN0IFR4RCB7CiAJdTY0IENvbnRyb2xfMTsKIC8qIGJpdCBtYXNrICovCiAjZGVmaW5lIFRYRF9MSVNUX09XTl9YRU5BICAgICAgIEJJVCg3KQpAQCAtNDQ3LDE2ICs0NDksMTYgQEAKIAogCXU2NCBCdWZmZXJfUG9pbnRlcjsKIAl1NjQgSG9zdF9Db250cm9sOwkvKiByZXNlcnZlZCBmb3IgaG9zdCAqLwotfSBUeERfdDsKK307CiAKIC8qIFN0cnVjdHVyZSB0byBob2xkIHRoZSBwaHkgYW5kIHZpcnQgYWRkciBvZiBldmVyeSBUeERMLiAqLwotdHlwZWRlZiBzdHJ1Y3QgbGlzdF9pbmZvX2hvbGQgeworc3RydWN0IGxpc3RfaW5mb19ob2xkIHsKIAlkbWFfYWRkcl90IGxpc3RfcGh5X2FkZHI7CiAJdm9pZCAqbGlzdF92aXJ0X2FkZHI7Ci19IGxpc3RfaW5mb19ob2xkX3Q7Cit9OwogCiAvKiBSeCBkZXNjcmlwdG9yIHN0cnVjdHVyZSBmb3IgMSBidWZmZXIgbW9kZSAqLwotdHlwZWRlZiBzdHJ1Y3QgX1J4RF90IHsKK3N0cnVjdCBSeERfdCB7CiAJdTY0IEhvc3RfQ29udHJvbDsJLyogcmVzZXJ2ZWQgZm9yIGhvc3QgKi8KIAl1NjQgQ29udHJvbF8xOwogI2RlZmluZSBSWERfT1dOX1hFTkEgICAgICAgICAgICBCSVQoNykKQEAgLTQ4MSwyMSArNDgzLDIxIEBACiAjZGVmaW5lIFNFVF9OVU1fVEFHKHZhbCkgICAgICAgdkJJVCh2YWwsMTYsMzIpCiAKIAotfSBSeERfdDsKK307CiAvKiBSeCBkZXNjcmlwdG9yIHN0cnVjdHVyZSBmb3IgMSBidWZmZXIgbW9kZSAqLwotdHlwZWRlZiBzdHJ1Y3QgX1J4RDFfdCB7Ci0Jc3RydWN0IF9SeERfdCBoOworc3RydWN0IFJ4RDEgeworCXN0cnVjdCBSeERfdCBoOwogCiAjZGVmaW5lIE1BU0tfQlVGRkVSMF9TSVpFXzEgICAgICAgdkJJVCgweDNGRkYsMiwxNCkKICNkZWZpbmUgU0VUX0JVRkZFUjBfU0laRV8xKHZhbCkgICB2QklUKHZhbCwyLDE0KQogI2RlZmluZSBSWERfR0VUX0JVRkZFUjBfU0laRV8xKF9Db250cm9sXzIpIFwKIAkodTE2KSgoX0NvbnRyb2xfMiAmIE1BU0tfQlVGRkVSMF9TSVpFXzEpID4+IDQ4KQogCXU2NCBCdWZmZXIwX3B0cjsKLX0gUnhEMV90OworfTsKIC8qIFJ4IGRlc2NyaXB0b3Igc3RydWN0dXJlIGZvciAzIG9yIDIgYnVmZmVyIG1vZGUgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgX1J4RDNfdCB7Ci0Jc3RydWN0IF9SeERfdCBoOworc3RydWN0IFJ4RDMgeworCXN0cnVjdCBSeERfdCBoOwogCiAjZGVmaW5lIE1BU0tfQlVGRkVSMF9TSVpFXzMgICAgICAgdkJJVCgweEZGLDIsMTQpCiAjZGVmaW5lIE1BU0tfQlVGRkVSMV9TSVpFXzMgICAgICAgdkJJVCgweEZGRkYsMTYsMTYpCkBAIC01MTUsMTUgKzUxNywxNSBAQAogCXU2NCBCdWZmZXIwX3B0cjsKIAl1NjQgQnVmZmVyMV9wdHI7CiAJdTY0IEJ1ZmZlcjJfcHRyOwotfSBSeEQzX3Q7Cit9OwogCiAKIC8qIFN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgdGhlIFJ4IGRlc2NyaXB0b3IgYmxvY2sgd2hpY2ggY29udGFpbnMKICAqIDEyOCBSeCBkZXNjcmlwdG9ycy4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgX1J4RF9ibG9jayB7CitzdHJ1Y3QgUnhEX2Jsb2NrIHsKICNkZWZpbmUgTUFYX1JYRFNfUEVSX0JMT0NLXzEgICAgICAgICAgICAxMjcKLQlSeEQxX3QgcnhkW01BWF9SWERTX1BFUl9CTE9DS18xXTsKKwlzdHJ1Y3QgUnhEMSByeGRbTUFYX1JYRFNfUEVSX0JMT0NLXzFdOwogCiAJdTY0IHJlc2VydmVkXzA7CiAjZGVmaW5lIEVORF9PRl9CTE9DSyAgICAweEZFRkZGRkZGRkZGRkZGRkZVTEwKQEAgLTUzMywyMiArNTM1LDIyIEBACiAJdTY0IHBOZXh0X1J4RF9CbGtfcGh5c2ljYWw7CS8qIEJ1ZmYwX3B0ci5JbiBhIDMyIGJpdCBhcmNoCiAJCQkJCSAqIHRoZSB1cHBlciAzMiBiaXRzIHNob3VsZAogCQkJCQkgKiBiZSAwICovCi19IFJ4RF9ibG9ja190OworfTsKIAogI2RlZmluZSBTSVpFX09GX0JMT0NLCTQwOTYKIAotI2RlZmluZSBSWERfTU9ERV8xCTAKLSNkZWZpbmUgUlhEX01PREVfM0EJMQotI2RlZmluZSBSWERfTU9ERV8zQgkyCisjZGVmaW5lIFJYRF9NT0RFXzEJMCAvKiBPbmUgQnVmZmVyIG1vZGUgKi8KKyNkZWZpbmUgUlhEX01PREVfM0EJMSAvKiBUaHJlZSBCdWZmZXIgbW9kZSAqLworI2RlZmluZSBSWERfTU9ERV8zQgkyIC8qIFR3byBCdWZmZXIgbW9kZSAqLwogCiAvKiBTdHJ1Y3R1cmUgdG8gaG9sZCB2aXJ0dWFsIGFkZHJlc3NlcyBvZiBCdWYwIGFuZCBCdWYxIGluCiAgKiAyYnVmIG1vZGUuICovCi10eXBlZGVmIHN0cnVjdCBidWZBZGQgeworc3RydWN0IGJ1ZmZBZGQgewogCXZvaWQgKmJhXzBfb3JnOwogCXZvaWQgKmJhXzFfb3JnOwogCXZvaWQgKmJhXzA7CiAJdm9pZCAqYmFfMTsKLX0gYnVmZkFkZF90OworfTsKIAogLyogU3RydWN0dXJlIHdoaWNoIHN0b3JlcyBhbGwgdGhlIE1BQyBjb250cm9sIHBhcmFtZXRlcnMgKi8KIApAQCAtNTU2LDQzICs1NTgsNDYgQEAKICAqIGZyb20gd2hpY2ggdGhlIFJ4IEludGVycnVwdCBwcm9jZXNzb3IgY2FuIHN0YXJ0IHBpY2tpbmcKICAqIHVwIHRoZSBSeERzIGZvciBwcm9jZXNzaW5nLgogICovCi10eXBlZGVmIHN0cnVjdCBfcnhfY3Vycl9nZXRfaW5mb190IHsKK3N0cnVjdCByeF9jdXJyX2dldF9pbmZvIHsKIAl1MzIgYmxvY2tfaW5kZXg7CiAJdTMyIG9mZnNldDsKIAl1MzIgcmluZ19sZW47Ci19IHJ4X2N1cnJfZ2V0X2luZm9fdDsKK307CiAKLXR5cGVkZWYgcnhfY3Vycl9nZXRfaW5mb190IHJ4X2N1cnJfcHV0X2luZm9fdDsKK3N0cnVjdCByeF9jdXJyX3B1dF9pbmZvIHsKKwl1MzIgYmxvY2tfaW5kZXg7CisJdTMyIG9mZnNldDsKKwl1MzIgcmluZ19sZW47Cit9OwogCiAvKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgdGhlIG9mZnNldCBvZiB0aGUgVHhEbCBpbiB0aGUgRklGTwogICogZnJvbSB3aGljaCB0aGUgVHggSW50ZXJydXB0IHByb2Nlc3NvciBjYW4gc3RhcnQgcGlja2luZwogICogdXAgdGhlIFR4RExzIGZvciBzZW5kIGNvbXBsZXRlIGludGVycnVwdCBwcm9jZXNzaW5nLgogICovCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgdHhfY3Vycl9nZXRfaW5mbyB7CiAJdTMyIG9mZnNldDsKIAl1MzIgZmlmb19sZW47Ci19IHR4X2N1cnJfZ2V0X2luZm9fdDsKK307CiAKLXR5cGVkZWYgdHhfY3Vycl9nZXRfaW5mb190IHR4X2N1cnJfcHV0X2luZm9fdDsKK3N0cnVjdCB0eF9jdXJyX3B1dF9pbmZvIHsKKwl1MzIgb2Zmc2V0OworCXUzMiBmaWZvX2xlbjsKK307CiAKLQotdHlwZWRlZiBzdHJ1Y3QgcnhkX2luZm8geworc3RydWN0IHJ4ZF9pbmZvIHsKIAl2b2lkICp2aXJ0X2FkZHI7CiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKLX1yeGRfaW5mb190OworfTsKIAogLyogU3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIFBoeSBhbmQgdmlydCBhZGRyZXNzZXMgb2YgdGhlIEJsb2NrcyAqLwotdHlwZWRlZiBzdHJ1Y3QgcnhfYmxvY2tfaW5mbyB7CitzdHJ1Y3QgcnhfYmxvY2tfaW5mbyB7CiAJdm9pZCAqYmxvY2tfdmlydF9hZGRyOwogCWRtYV9hZGRyX3QgYmxvY2tfZG1hX2FkZHI7Ci0JcnhkX2luZm9fdCAqcnhkczsKLX0gcnhfYmxvY2tfaW5mb190OwotCi0vKiBwcmUgZGVjbGFyYXRpb24gb2YgdGhlIG5pYyBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHMyaW9fbmljIG5pY190OworCXN0cnVjdCByeGRfaW5mbyAqcnhkczsKK307CiAKIC8qIFJpbmcgc3BlY2lmaWMgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCByaW5nX2luZm8geworc3RydWN0IHJpbmdfaW5mbyB7CiAJLyogVGhlIHJpbmcgbnVtYmVyICovCiAJaW50IHJpbmdfbm87CiAKQEAgLTYwMCw3ICs2MDUsNyBAQAogCSAqICBQbGFjZSBob2xkZXJzIGZvciB0aGUgdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzIG9mCiAJICogIGFsbCB0aGUgUnggQmxvY2tzCiAJICovCi0JcnhfYmxvY2tfaW5mb190IHJ4X2Jsb2Nrc1tNQVhfUlhfQkxPQ0tTX1BFUl9SSU5HXTsKKwlzdHJ1Y3QgcnhfYmxvY2tfaW5mbyByeF9ibG9ja3NbTUFYX1JYX0JMT0NLU19QRVJfUklOR107CiAJaW50IGJsb2NrX2NvdW50OwogCWludCBwa3RfY250OwogCkBAIC02MDgsMjYgKzYxMywyNCBAQAogCSAqIFB1dCBwb2ludGVyIGluZm8gd2hpY2ggaW5kaWN0ZXMgd2hpY2ggUnhEIGhhcyB0byBiZSByZXBsZW5pc2hlZAogCSAqIHdpdGggYSBuZXcgYnVmZmVyLgogCSAqLwotCXJ4X2N1cnJfcHV0X2luZm9fdCByeF9jdXJyX3B1dF9pbmZvOworCXN0cnVjdCByeF9jdXJyX3B1dF9pbmZvIHJ4X2N1cnJfcHV0X2luZm87CiAKIAkvKgogCSAqIEdldCBwb2ludGVyIGluZm8gd2hpY2ggaW5kaWN0ZXMgd2hpY2ggaXMgdGhlIGxhc3QgUnhEIHRoYXQgd2FzCiAJICogcHJvY2Vzc2VkIGJ5IHRoZSBkcml2ZXIuCiAJICovCi0JcnhfY3Vycl9nZXRfaW5mb190IHJ4X2N1cnJfZ2V0X2luZm87CisJc3RydWN0IHJ4X2N1cnJfZ2V0X2luZm8gcnhfY3Vycl9nZXRfaW5mbzsKIAotI2lmbmRlZiBDT05GSUdfUzJJT19OQVBJCiAJLyogSW5kZXggdG8gdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBwdXQgcG9pbnRlciBvZiBSeCByaW5nICovCiAJaW50IHB1dF9wb3M7Ci0jZW5kaWYKIAogCS8qIEJ1ZmZlciBBZGRyZXNzIHN0b3JlLiAqLwotCWJ1ZmZBZGRfdCAqKmJhOwotCW5pY190ICpuaWM7Ci19IHJpbmdfaW5mb190OworCXN0cnVjdCBidWZmQWRkICoqYmE7CisJc3RydWN0IHMyaW9fbmljICpuaWM7Cit9OwogCiAvKiBGaWZvIHNwZWNpZmljIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgZmlmb19pbmZvIHsKK3N0cnVjdCBmaWZvX2luZm8gewogCS8qIEZJRk8gbnVtYmVyICovCiAJaW50IGZpZm9fbm87CiAKQEAgLTYzNSw0MCArNjM4LDQwIEBACiAJaW50IG1heF90eGRzOwogCiAJLyogUGxhY2UgaG9sZGVyIG9mIGFsbCB0aGUgVFggTGlzdCdzIFBoeSBhbmQgVmlydCBhZGRyZXNzZXMuICovCi0JbGlzdF9pbmZvX2hvbGRfdCAqbGlzdF9pbmZvOworCXN0cnVjdCBsaXN0X2luZm9faG9sZCAqbGlzdF9pbmZvOwogCiAJLyoKIAkgKiBDdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHR4IEZJRk8gd2hlcmUgZHJpdmVyIHdvdWxkIHdyaXRlCiAJICogbmV3IFR4IGZyYW1lCiAJICovCi0JdHhfY3Vycl9wdXRfaW5mb190IHR4X2N1cnJfcHV0X2luZm87CisJc3RydWN0IHR4X2N1cnJfcHV0X2luZm8gdHhfY3Vycl9wdXRfaW5mbzsKIAogCS8qCiAJICogQ3VycmVudCBvZmZzZXQgd2l0aGluIHR4IEZJRk8gZnJvbSB3aGVyZSB0aGUgZHJpdmVyIHdvdWxkIHN0YXJ0IGZyZWVpbmcKIAkgKiB0aGUgYnVmZmVycwogCSAqLwotCXR4X2N1cnJfZ2V0X2luZm9fdCB0eF9jdXJyX2dldF9pbmZvOworCXN0cnVjdCB0eF9jdXJyX2dldF9pbmZvIHR4X2N1cnJfZ2V0X2luZm87CiAKLQluaWNfdCAqbmljOwotfWZpZm9faW5mb190OworCXN0cnVjdCBzMmlvX25pYyAqbmljOworfTsKIAogLyogSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgVHggYW5kIFJ4IEZJRk9zIGFuZCBSaW5ncyBvZiBYZW5hCiAgKiBpcyBtYWludGFpbmVkIGluIHRoaXMgc3RydWN0dXJlLgogICovCi10eXBlZGVmIHN0cnVjdCBtYWNfaW5mbyB7CitzdHJ1Y3QgbWFjX2luZm8gewogLyogdHggc2lkZSBzdHVmZiAqLwogCS8qIGxvZ2ljYWwgcG9pbnRlciBvZiBzdGFydCBvZiBlYWNoIFR4IEZJRk8gKi8KLQlUeEZJRk9fZWxlbWVudF90IF9faW9tZW0gKnR4X0ZJRk9fc3RhcnRbTUFYX1RYX0ZJRk9TXTsKKwlzdHJ1Y3QgVHhGSUZPX2VsZW1lbnQgX19pb21lbSAqdHhfRklGT19zdGFydFtNQVhfVFhfRklGT1NdOwogCiAJLyogRmlmbyBzcGVjaWZpYyBzdHJ1Y3R1cmUgKi8KLQlmaWZvX2luZm9fdCBmaWZvc1tNQVhfVFhfRklGT1NdOworCXN0cnVjdCBmaWZvX2luZm8gZmlmb3NbTUFYX1RYX0ZJRk9TXTsKIAogCS8qIFNhdmUgdmlydHVhbCBhZGRyZXNzIG9mIFR4RCBwYWdlIHdpdGggemVybyBETUEgYWRkcihpZiBhbnkpICovCiAJdm9pZCAqemVyb2RtYV92aXJ0X2FkZHI7CiAKIC8qIHJ4IHNpZGUgc3R1ZmYgKi8KIAkvKiBSaW5nIHNwZWNpZmljIHN0cnVjdHVyZSAqLwotCXJpbmdfaW5mb190IHJpbmdzW01BWF9SWF9SSU5HU107CisJc3RydWN0IHJpbmdfaW5mbyByaW5nc1tNQVhfUlhfUklOR1NdOwogCiAJdTE2IHJtYWNfcGF1c2VfdGltZTsKIAl1MTYgbWNfcGF1c2VfdGhyZXNob2xkX3EwcTM7CkBAIC02NzcsMTQgKzY4MCwxNCBAQAogCXZvaWQgKnN0YXRzX21lbTsJLyogb3JpZ25hbCBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW0gKi8KIAlkbWFfYWRkcl90IHN0YXRzX21lbV9waHk7CS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHN0YXQgYmxvY2sgKi8KIAl1MzIgc3RhdHNfbWVtX3N6OwotCVN0YXRJbmZvX3QgKnN0YXRzX2luZm87CS8qIExvZ2ljYWwgYWRkcmVzcyBvZiB0aGUgc3RhdCBibG9jayAqLwotfSBtYWNfaW5mb190OworCXN0cnVjdCBzdGF0X2Jsb2NrICpzdGF0c19pbmZvOwkvKiBMb2dpY2FsIGFkZHJlc3Mgb2YgdGhlIHN0YXQgYmxvY2sgKi8KK307CiAKIC8qIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHVzZXIgZGVmaW5lZCBNQUMgYWRkcmVzc2VzICovCi10eXBlZGVmIHN0cnVjdCB7CitzdHJ1Y3QgdXNyX2FkZHIgewogCWNoYXIgYWRkcltFVEhfQUxFTl07CiAJaW50IHVzYWdlX2NudDsKLX0gdXNyX2FkZHJfdDsKK307CiAKIC8qIERlZmF1bHQgVHVuYWJsZSBwYXJhbWV0ZXJzIG9mIHRoZSBOSUMuICovCiAjZGVmaW5lIERFRkFVTFRfRklGT18wX0xFTiA0MDk2CkBAIC03MTcsNyArNzIwLDcgQEAKIH07CiAKIC8qIERhdGEgc3RydWN0dXJlIHRvIHJlcHJlc2VudCBhIExSTyBzZXNzaW9uICovCi10eXBlZGVmIHN0cnVjdCBscm8geworc3RydWN0IGxybyB7CiAJc3RydWN0IHNrX2J1ZmYJKnBhcmVudDsKIAlzdHJ1Y3Qgc2tfYnVmZiAgKmxhc3RfZnJhZzsKIAl1OAkJKmwyaDsKQEAgLTczMywyMCArNzM2LDE4IEBACiAJdTMyCQljdXJfdHN2YWw7CiAJdTMyCQljdXJfdHNlY3I7CiAJdTgJCXNhd190czsKLX1scm9fdDsKK307CiAKIC8qIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgb25lIGluc3RhbmNlIG9mIHRoZSBOSUMgKi8KIHN0cnVjdCBzMmlvX25pYyB7CiAJaW50IHJ4ZF9tb2RlOwotI2lmZGVmIENPTkZJR19TMklPX05BUEkKIAkvKgogCSAqIENvdW50IG9mIHBhY2tldHMgdG8gYmUgcHJvY2Vzc2VkIGluIGEgZ2l2ZW4gaXRlcmF0aW9uLCBpdCB3aWxsIGJlIGluZGljYXRlZAogCSAqIGJ5IHRoZSBxdW90YSBmaWVsZCBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSB3aGVuIE5BUEkgaXMgZW5hYmxlZC4KIAkgKi8KIAlpbnQgcGt0c190b19wcm9jZXNzOwotI2VuZGlmCiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQltYWNfaW5mb190IG1hY19jb250cm9sOworCXN0cnVjdCBtYWNfaW5mbyBtYWNfY29udHJvbDsKIAlzdHJ1Y3QgY29uZmlnX3BhcmFtIGNvbmZpZzsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAl2b2lkIF9faW9tZW0gKmJhcjA7CkBAIC03NTQsOCArNzU1LDggQEAKICNkZWZpbmUgTUFYX01BQ19TVVBQT1JURUQgICAxNgogI2RlZmluZSBNQVhfU1VQUE9SVEVEX01VTFRJQ0FTVFMgTUFYX01BQ19TVVBQT1JURUQKIAotCW1hY2FkZHJfdCBkZWZfbWFjX2FkZHJbTUFYX01BQ19TVVBQT1JURURdOwotCW1hY2FkZHJfdCBwcmVfbWFjX2FkZHJbTUFYX01BQ19TVVBQT1JURURdOworCXN0cnVjdCBtYWNfYWRkciBkZWZfbWFjX2FkZHJbTUFYX01BQ19TVVBQT1JURURdOworCXN0cnVjdCBtYWNfYWRkciBwcmVfbWFjX2FkZHJbTUFYX01BQ19TVVBQT1JURURdOwogCiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CiAJaW50IGhpZ2hfZG1hX2ZsYWc7CkBAIC03NzUsOSArNzc2LDcgQEAKIAlhdG9taWNfdCByeF9idWZzX2xlZnRbTUFYX1JYX1JJTkdTXTsKIAogCXNwaW5sb2NrX3QgdHhfbG9jazsKLSNpZm5kZWYgQ09ORklHX1MySU9fTkFQSQogCXNwaW5sb2NrX3QgcHV0X2xvY2s7Ci0jZW5kaWYKIAogI2RlZmluZSBQUk9NSVNDICAgICAxCiAjZGVmaW5lIEFMTF9NVUxUSSAgIDIKQEAgLTc4NSw3ICs3ODQsNyBAQAogI2RlZmluZSBNQVhfQUREUlNfU1VQUE9SVEVEIDY0CiAJdTE2IHVzcl9hZGRyX2NvdW50OwogCXUxNiBtY19hZGRyX2NvdW50OwotCXVzcl9hZGRyX3QgdXNyX2FkZHJzW01BWF9BRERSU19TVVBQT1JURURdOworCXN0cnVjdCB1c3JfYWRkciB1c3JfYWRkcnNbTUFYX0FERFJTX1NVUFBPUlRFRF07CiAKIAl1MTYgbV9jYXN0X2ZsZzsKIAl1MTYgYWxsX211bHRpX3BvczsKQEAgLTg0MSw3ICs4NDAsNyBAQAogCXU4IGRldmljZV90eXBlOwogCiAjZGVmaW5lIE1BWF9MUk9fU0VTU0lPTlMJMzIKLQlscm9fdCBscm8wX25bTUFYX0xST19TRVNTSU9OU107CisJc3RydWN0IGxybyBscm8wX25bTUFYX0xST19TRVNTSU9OU107CiAJdW5zaWduZWQgbG9uZwljbHViYmVkX2ZybXNfY250OwogCXVuc2lnbmVkIGxvbmcJc2VuZGluZ19ib3RoOwogCXU4CQlscm87CkBAIC04NTUsOCArODU0LDkgQEAKIAlzcGlubG9ja190CXJ4X2xvY2s7CiAJYXRvbWljX3QJaXNyX2NudDsKIAl1NjQgKnVmb19pbl9iYW5kX3Y7Ci0jZGVmaW5lIFZQRF9QUk9EVUNUX05BTUVfTEVOIDUwCi0JdTggIHByb2R1Y3RfbmFtZVtWUERfUFJPRFVDVF9OQU1FX0xFTl07CisjZGVmaW5lIFZQRF9TVFJJTkdfTEVOIDgwCisJdTggIHByb2R1Y3RfbmFtZVtWUERfU1RSSU5HX0xFTl07CisJdTggIHNlcmlhbF9udW1bVlBEX1NUUklOR19MRU5dOwogfTsKIAogI2RlZmluZSBSRVNFVF9FUlJPUiAxOwpAQCAtOTc1LDQzICs5NzUsNTAgQEAKIHN0YXRpYyBpbnQgaW5pdF9zaGFyZWRfbWVtKHN0cnVjdCBzMmlvX25pYyAqc3ApOwogc3RhdGljIHZvaWQgZnJlZV9zaGFyZWRfbWVtKHN0cnVjdCBzMmlvX25pYyAqc3ApOwogc3RhdGljIGludCBpbml0X25pYyhzdHJ1Y3QgczJpb19uaWMgKm5pYyk7Ci1zdGF0aWMgdm9pZCByeF9pbnRyX2hhbmRsZXIocmluZ19pbmZvX3QgKnJpbmdfZGF0YSk7Ci1zdGF0aWMgdm9pZCB0eF9pbnRyX2hhbmRsZXIoZmlmb19pbmZvX3QgKmZpZm9fZGF0YSk7CitzdGF0aWMgdm9pZCByeF9pbnRyX2hhbmRsZXIoc3RydWN0IHJpbmdfaW5mbyAqcmluZ19kYXRhKTsKK3N0YXRpYyB2b2lkIHR4X2ludHJfaGFuZGxlcihzdHJ1Y3QgZmlmb19pbmZvICpmaWZvX2RhdGEpOwogc3RhdGljIHZvaWQgYWxhcm1faW50cl9oYW5kbGVyKHN0cnVjdCBzMmlvX25pYyAqc3ApOwogCiBzdGF0aWMgaW50IHMyaW9fc3RhcnRlcih2b2lkKTsKK3N0YXRpYyB2b2lkIHMyaW9fY2xvc2VyKHZvaWQpOwogc3RhdGljIHZvaWQgczJpb190eF93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHMyaW9fdGFza2xldCh1bnNpZ25lZCBsb25nIGRldl9hZGRyKTsKIHN0YXRpYyB2b2lkIHMyaW9fc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgcnhfb3NtX2hhbmRsZXIocmluZ19pbmZvX3QgKnJpbmdfZGF0YSwgUnhEX3QgKiByeGRwKTsKLXN0YXRpYyB2b2lkIHMyaW9fbGluayhuaWNfdCAqIHNwLCBpbnQgbGluayk7Ci0jaWYgZGVmaW5lZChDT05GSUdfUzJJT19OQVBJKQorc3RhdGljIGludCByeF9vc21faGFuZGxlcihzdHJ1Y3QgcmluZ19pbmZvICpyaW5nX2RhdGEsIHN0cnVjdCBSeERfdCAqIHJ4ZHApOworc3RhdGljIHZvaWQgczJpb19saW5rKHN0cnVjdCBzMmlvX25pYyAqIHNwLCBpbnQgbGluayk7CitzdGF0aWMgdm9pZCBzMmlvX3Jlc2V0KHN0cnVjdCBzMmlvX25pYyAqIHNwKTsKIHN0YXRpYyBpbnQgczJpb19wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KTsKLSNlbmRpZgotc3RhdGljIHZvaWQgczJpb19pbml0X3BjaShuaWNfdCAqIHNwKTsKK3N0YXRpYyB2b2lkIHMyaW9faW5pdF9wY2koc3RydWN0IHMyaW9fbmljICogc3ApOwogc3RhdGljIGludCBzMmlvX3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqIGFkZHIpOwogc3RhdGljIHZvaWQgczJpb19hbGFybV9oYW5kbGUodW5zaWduZWQgbG9uZyBkYXRhKTsKLXN0YXRpYyBpbnQgczJpb19lbmFibGVfbXNpKG5pY190ICpuaWMpOworc3RhdGljIGludCBzMmlvX2VuYWJsZV9tc2koc3RydWN0IHMyaW9fbmljICpuaWMpOwogc3RhdGljIGlycXJldHVybl90IHMyaW9fbXNpX2hhbmRsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogc3RhdGljIGlycXJldHVybl90CiBzMmlvX21zaXhfcmluZ19oYW5kbGUoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIHN0YXRpYyBpcnFyZXR1cm5fdAogczJpb19tc2l4X2ZpZm9faGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgczJpb19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLXN0YXRpYyBpbnQgdmVyaWZ5X3hlbmFfcXVpZXNjZW5jZShuaWNfdCAqc3AsIHU2NCB2YWw2NCwgaW50IGZsYWcpOworc3RhdGljIGludCB2ZXJpZnlfeGVuYV9xdWllc2NlbmNlKHN0cnVjdCBzMmlvX25pYyAqc3ApOwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHM7CiBzdGF0aWMgdm9pZCBzMmlvX3NldF9saW5rKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1zdGF0aWMgaW50IHMyaW9fc2V0X3N3YXBwZXIobmljX3QgKiBzcCk7Ci1zdGF0aWMgdm9pZCBzMmlvX2NhcmRfZG93bihuaWNfdCAqbmljKTsKLXN0YXRpYyBpbnQgczJpb19jYXJkX3VwKG5pY190ICpuaWMpOworc3RhdGljIGludCBzMmlvX3NldF9zd2FwcGVyKHN0cnVjdCBzMmlvX25pYyAqIHNwKTsKK3N0YXRpYyB2b2lkIHMyaW9fY2FyZF9kb3duKHN0cnVjdCBzMmlvX25pYyAqbmljKTsKK3N0YXRpYyBpbnQgczJpb19jYXJkX3VwKHN0cnVjdCBzMmlvX25pYyAqbmljKTsKIHN0YXRpYyBpbnQgZ2V0X3hlbmFfcmV2X2lkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLXN0YXRpYyB2b2lkIHJlc3RvcmVfeG1zaV9kYXRhKG5pY190ICpuaWMpOworc3RhdGljIGludCB3YWl0X2Zvcl9jbWRfY29tcGxldGUodm9pZCAqYWRkciwgdTY0IGJ1c3lfYml0KTsKK3N0YXRpYyBpbnQgczJpb19hZGRfaXNyKHN0cnVjdCBzMmlvX25pYyAqIHNwKTsKK3N0YXRpYyB2b2lkIHMyaW9fcmVtX2lzcihzdHJ1Y3QgczJpb19uaWMgKiBzcCk7CiAKLXN0YXRpYyBpbnQgczJpb19jbHViX3RjcF9zZXNzaW9uKHU4ICpidWZmZXIsIHU4ICoqdGNwLCB1MzIgKnRjcF9sZW4sIGxyb190ICoqbHJvLCBSeERfdCAqcnhkcCwgbmljX3QgKnNwKTsKLXN0YXRpYyB2b2lkIGNsZWFyX2xyb19zZXNzaW9uKGxyb190ICpscm8pOworc3RhdGljIHZvaWQgcmVzdG9yZV94bXNpX2RhdGEoc3RydWN0IHMyaW9fbmljICpuaWMpOworCitzdGF0aWMgaW50CitzMmlvX2NsdWJfdGNwX3Nlc3Npb24odTggKmJ1ZmZlciwgdTggKip0Y3AsIHUzMiAqdGNwX2xlbiwgc3RydWN0IGxybyAqKmxybywKKwkJICAgICAgc3RydWN0IFJ4RF90ICpyeGRwLCBzdHJ1Y3QgczJpb19uaWMgKnNwKTsKK3N0YXRpYyB2b2lkIGNsZWFyX2xyb19zZXNzaW9uKHN0cnVjdCBscm8gKmxybyk7CiBzdGF0aWMgdm9pZCBxdWV1ZV9yeF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV9MM0w0X2hlYWRlcihuaWNfdCAqc3AsIGxyb190ICpscm8pOwotc3RhdGljIHZvaWQgbHJvX2FwcGVuZF9wa3QobmljX3QgKnNwLCBscm9fdCAqbHJvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgdGNwX2xlbik7CitzdGF0aWMgdm9pZCB1cGRhdGVfTDNMNF9oZWFkZXIoc3RydWN0IHMyaW9fbmljICpzcCwgc3RydWN0IGxybyAqbHJvKTsKK3N0YXRpYyB2b2lkIGxyb19hcHBlbmRfcGt0KHN0cnVjdCBzMmlvX25pYyAqc3AsIHN0cnVjdCBscm8gKmxybywKKwkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiB0Y3BfbGVuKTsKIAogI2RlZmluZSBzMmlvX3RjcF9tc3Moc2tiKSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplCiAjZGVmaW5lIHMyaW9fdWRwX21zcyhza2IpIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NjOTIwMzEuYyBiL2RyaXZlcnMvbmV0L3NjOTIwMzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjgwMGZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvc2M5MjAzMS5jCkBAIC0wLDAgKzEsMTYyMCBAQAorLyogIFNpbGFuIFNDOTIwMzEgUENJIEZhc3QgRXRoZXJuZXQgQWRhcHRlciBkcml2ZXIKKyAqCisgKiAgQmFzZWQgb24gdmVuZG9yIGRyaXZlcnM6CisgKiAgU2lsYW4gRmFzdCBFdGhlcm5ldCBOZXRjYXJkIERyaXZlcjoKKyAqICAgIE1PRFVMRV9BVVRIT1IgKCJnYW95b25naG9uZyIpOworICogICAgTU9EVUxFX0RFU0NSSVBUSU9OICgiU0lMQU4gRmFzdCBFdGhlcm5ldCBkcml2ZXIiKTsKKyAqICAgIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyAqICA4MTM5RCBGYXN0IEV0aGVybmV0IGRyaXZlcjoKKyAqICAgIChDKSAyMDAyIGJ5IGdhb3lvbmdob25nCisgKiAgICBNT0RVTEVfQVVUSE9SICgiZ2FveW9uZ2hvbmciKTsKKyAqICAgIE1PRFVMRV9ERVNDUklQVElPTiAoIlJzbHRlayA4MTM5RCBQQ0kgRmFzdCBFdGhlcm5ldCBBZGFwdGVyIGRyaXZlciIpOworICogICAgTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworICogIEJvdGggYXJlIGFsbW9zdCBpZGVudGljYWwgYW5kIHNlZW0gdG8gYmUgYmFzZWQgb24gcGNpLXNrZWxldG9uLmMKKyAqCisgKiAgUmV3cml0dGVuIGZvciAyLjYgYnkgQ2VzYXIgRWR1YXJkbyBCYXJyb3MKKyAqLworCisvKiBOb3RlIGFib3V0IHNldF9tYWNfYWRkcmVzczogSSBkb24ndCBrbm93IGhvdyB0byBjaGFuZ2UgdGhlIGhhcmR3YXJlCisgKiBtYXRjaGluZywgc28geW91IG5lZWQgdG8gZW5hYmxlIElGRl9QUk9NSVNDIHdoZW4gdXNpbmcgaXQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU0lMQU4JCTB4MTkwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NJTEFOX1NDOTIwMzEJMHgyMDMxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lMQU5fODEzOUQJMHg4MTM5CisKKyNkZWZpbmUgU0M5MjAzMV9OQU1FICJzYzkyMDMxIgorI2RlZmluZSBTQzkyMDMxX0RFU0NSSVBUSU9OICJTaWxhbiBTQzkyMDMxIFBDSSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIgZHJpdmVyIgorI2RlZmluZSBTQzkyMDMxX1ZFUlNJT04gIjIuMGMiCisKKy8qIEJBUiAwIGlzIE1NSU8sIEJBUiAxIGlzIFBJTyAqLworI2lmbmRlZiBTQzkyMDMxX1VTRV9CQVIKKyNkZWZpbmUgU0M5MjAzMV9VU0VfQkFSIDAKKyNlbmRpZgorCisvKiBNYXhpbXVtIG51bWJlciBvZiBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIGZpbHRlciAodnMuIFJ4LWFsbC1tdWx0aWNhc3QpLiAqLworc3RhdGljIGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gNjQ7Cittb2R1bGVfcGFyYW0obXVsdGljYXN0X2ZpbHRlcl9saW1pdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXVsdGljYXN0X2ZpbHRlcl9saW1pdCwKKwkiTWF4aW11bSBudW1iZXIgb2YgZmlsdGVyZWQgbXVsdGljYXN0IGFkZHJlc3NlcyIpOworCitzdGF0aWMgaW50IG1lZGlhOworbW9kdWxlX3BhcmFtKG1lZGlhLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtZWRpYSwgIk1lZGlhIHR5cGUgKDB4MDAgPSBhdXRvZGV0ZWN0LCIKKwkiIDB4MDEgPSAxME0gaGFsZiwgMHgwMiA9IDEwTSBmdWxsLCIKKwkiIDB4MDQgPSAxMDBNIGhhbGYsIDB4MDggPSAxMDBNIGZ1bGwpIik7CisKKy8qIFNpemUgb2YgdGhlIGluLW1lbW9yeSByZWNlaXZlIHJpbmcuICovCisjZGVmaW5lICBSWF9CVUZfTEVOX0lEWCAgMyAvKiAwPT04SywgMT09MTZLLCAyPT0zMkssIDM9PTY0SyAsND09MTI4SyovCisjZGVmaW5lICBSWF9CVUZfTEVOCSg4MTkyIDw8IFJYX0JVRl9MRU5fSURYKQorCisvKiBOdW1iZXIgb2YgVHggZGVzY3JpcHRvciByZWdpc3RlcnMuICovCisjZGVmaW5lICBOVU1fVFhfREVTQwkgICA0CisKKy8qIG1heCBzdXBwb3J0ZWQgZXRoZXJuZXQgZnJhbWUgc2l6ZSAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4qLworI2RlZmluZSAgTUFYX0VUSF9GUkFNRV9TSVpFCSAgMTUzNgorCisvKiBTaXplIG9mIHRoZSBUeCBib3VuY2UgYnVmZmVycyAtLSBtdXN0IGJlIGF0IGxlYXN0IChkZXYtPm10dSsxNCs0KS4gKi8KKyNkZWZpbmUgIFRYX0JVRl9TSVpFICAgICAgIE1BWF9FVEhfRlJBTUVfU0laRQorI2RlZmluZSAgVFhfQlVGX1RPVF9MRU4gICAgKFRYX0JVRl9TSVpFICogTlVNX1RYX0RFU0MpCisKKy8qIFRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgYXJlIGxvZ18yKGJ5dGVzKS00OiAgMCA9PSAxNiBieXRlcyAuLiA2PT0xMDI0LCA3PT1lbmQgb2YgcGFja2V0LiAqLworI2RlZmluZSAgUlhfRklGT19USFJFU0ggICAgNyAgICAgLyogUnggYnVmZmVyIGxldmVsIGJlZm9yZSBmaXJzdCBQQ0kgeGZlci4gICovCisKKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgIFRYX1RJTUVPVVQgICAgICg0KkhaKQorCisjZGVmaW5lICBTSUxBTl9TVEFUU19OVU0gICAgMiAgICAvKiBudW1iZXIgb2YgRVRIVE9PTF9HU1RBVFMgKi8KKworLyogbWVkaWEgb3B0aW9ucyAqLworI2RlZmluZSAgQVVUT1NFTEVDVCAgICAweDAwCisjZGVmaW5lICBNMTBfSEFMRiAgICAgIDB4MDEKKyNkZWZpbmUgIE0xMF9GVUxMICAgICAgMHgwMgorI2RlZmluZSAgTTEwMF9IQUxGICAgICAweDA0CisjZGVmaW5lICBNMTAwX0ZVTEwgICAgIDB4MDgKKworIC8qIFN5bWJvbGljIG9mZnNldHMgdG8gcmVnaXN0ZXJzLiAqLworZW51bSAgc2lsYW5fcmVnaXN0ZXJzIHsKKyAgIENvbmZpZzAgICAgPSAweDAwLCAgICAgICAgIC8vIENvbmZpZzAKKyAgIENvbmZpZzEgICAgPSAweDA0LCAgICAgICAgIC8vIENvbmZpZzEKKyAgIFJ4QnVmV1B0ciAgPSAweDA4LCAgICAgICAgIC8vIFJ4IGJ1ZmZlciB3cml0ZXIgcG9pdGVyCisgICBJbnRyU3RhdHVzID0gMHgwQywgICAgICAgICAvLyBJbnRlcnJ1cHQgc3RhdHVzCisgICBJbnRyTWFzayAgID0gMHgxMCwgICAgICAgICAvLyBJbnRlcnJ1cHQgbWFzaworICAgUnhidWZBZGRyICA9IDB4MTQsICAgICAgICAgLy8gUnggYnVmZmVyIHN0YXJ0IGFkZHJlc3MKKyAgIFJ4QnVmUlB0ciAgPSAweDE4LCAgICAgICAgIC8vIFJ4IGJ1ZmZlciByZWFkIHBvaW50ZXIKKyAgIFR4c3RhdHVzYWxsID0gMHgxQywgICAgICAgIC8vIFRyYW5zbWl0IHN0YXR1cyBvZiBhbGwgZGVzY3JpcHRvcnMKKyAgIFR4U3RhdHVzMCAgPSAweDIwLAkgICAgICAvLyBUcmFuc21pdCBzdGF0dXMgKEZvdXIgMzJiaXQgcmVnaXN0ZXJzKS4KKyAgIFR4QWRkcjAgICAgPSAweDMwLCAgICAgICAgIC8vIFR4IGRlc2NyaXB0b3JzIChhbHNvIGZvdXIgMzJiaXQpLgorICAgUnhDb25maWcgICA9IDB4NDAsICAgICAgICAgLy8gUnggY29uZmlndXJhdGlvbgorICAgTUFDMAkgICAgICA9IDB4NDQsCSAgICAgIC8vIEV0aGVybmV0IGhhcmR3YXJlIGFkZHJlc3MuCisgICBNQVIwCSAgICAgID0gMHg0QywJICAgICAgLy8gTXVsdGljYXN0IGZpbHRlci4KKyAgIFJ4U3RhdHVzMCAgPSAweDU0LCAgICAgICAgIC8vIFJ4IHN0YXR1cworICAgVHhDb25maWcgICA9IDB4NUMsICAgICAgICAgLy8gVHggY29uZmlndXJhdGlvbgorICAgUGh5Q3RybCAgICA9IDB4NjAsICAgICAgICAgLy8gcGh5c2ljYWwgY29udHJvbAorICAgRmxvd0N0cmxDb25maWcgPSAweDY0LCAgICAgLy8gZmxvdyBjb250cm9sCisgICBNaWljbWQwICAgID0gMHg2OCwgICAgICAgICAvLyBNaWkgY29tbWFuZDAgcmVnaXN0ZXIKKyAgIE1paWNtZDEgICAgPSAweDZDLCAgICAgICAgIC8vIE1paSBjb21tYW5kMSByZWdpc3RlcgorICAgTWlpc3RhdHVzICA9IDB4NzAsICAgICAgICAgLy8gTWlpIHN0YXR1cyByZWdpc3RlcgorICAgVGltZXJjbnQgICA9IDB4NzQsICAgICAgICAgLy8gVGltZXIgY291bnRlciByZWdpc3RlcgorICAgVGltZXJJbnRyICA9IDB4NzgsICAgICAgICAgLy8gVGltZXIgaW50ZXJydXB0IHJlZ2lzdGVyCisgICBQTUNvbmZpZyAgID0gMHg3QywgICAgICAgICAvLyBQb3dlciBNYW5hZ2VyIGNvbmZpZ3VyYXRpb24KKyAgIENSQzAgICAgICAgPSAweDgwLCAgICAgICAgIC8vIFBvd2VyIE1hbmFnZXIgQ1JDICggVHdvIDMyYml0IHJlZ2lzZXJzKQorICAgV2FrZXVwMCAgICA9IDB4ODgsICAgICAgICAgLy8gcG93ZXIgTWFuYWdlciB3YWtldXAoIEVpZ2h0IDY0Yml0IHJlZ2lzZXIpCisgICBMU0JDUkMwICAgID0gMHhDOCwgICAgICAgICAvLyBwb3dlciBNYW5hZ2VyIExTQkNSQyhUd28gMzJiaXQgcmVnaXNlcikKKyAgIFRlc3REMCAgICAgPSAweEQwLAorICAgVGVzdEQ0ICAgICA9IDB4RDQsCisgICBUZXN0RDggICAgID0gMHhEOCwKK307CisKKyNkZWZpbmUgTUlJX0JNQ1IgICAgICAgICAgICAwICAgICAgICAvLyBCYXNpYyBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIKKyNkZWZpbmUgTUlJX0JNU1IgICAgICAgICAgICAxICAgICAgICAvLyBCYXNpYyBtb2RlIHN0YXR1cyByZWdpc3RlcgorI2RlZmluZSBNSUlfSkFCICAgICAgICAgICAgIDE2CisjZGVmaW5lIE1JSV9PdXRwdXRTdGF0dXMgICAgMjQKKworI2RlZmluZSBCTUNSX0ZVTExEUExYICAgICAgIDB4MDEwMCAgICAvLyBGdWxsIGR1cGxleAorI2RlZmluZSBCTUNSX0FOUkVTVEFSVCAgICAgIDB4MDIwMCAgICAvLyBBdXRvIG5lZ290aWF0aW9uIHJlc3RhcnQKKyNkZWZpbmUgQk1DUl9BTkVOQUJMRSAgICAgICAweDEwMDAgICAgLy8gRW5hYmxlIGF1dG8gbmVnb3RpYXRpb24KKyNkZWZpbmUgQk1DUl9TUEVFRDEwMCAgICAgICAweDIwMDAgICAgLy8gU2VsZWN0IDEwME1icHMKKyNkZWZpbmUgQk1TUl9MU1RBVFVTICAgICAgICAweDAwMDQgICAgLy8gTGluayBzdGF0dXMKKyNkZWZpbmUgUEhZXzE2X0pBQl9FTkIgICAgICAweDEwMDAKKyNkZWZpbmUgUEhZXzE2X1BPUlRfRU5CICAgICAweDEKKworZW51bSBJbnRyU3RhdHVzQml0cyB7CisgICBMaW5rRmFpbCAgICAgICA9IDB4ODAwMDAwMDAsCisgICBMaW5rT0sgICAgICAgICA9IDB4NDAwMDAwMDAsCisgICBUaW1lT3V0ICAgICAgICA9IDB4MjAwMDAwMDAsCisgICBSeE92ZXJmbG93ICAgICA9IDB4MDA0MCwKKyAgIFJ4T0sgICAgICAgICAgID0gMHgwMDIwLAorICAgVHhPSyAgICAgICAgICAgPSAweDAwMDEsCisgICBJbnRyQml0cyA9IExpbmtGYWlsfExpbmtPS3xUaW1lT3V0fFJ4T3ZlcmZsb3d8UnhPS3xUeE9LLAorfTsKKworZW51bSBUeFN0YXR1c0JpdHMgeworICAgVHhDYXJyaWVyTG9zdCA9IDB4MjAwMDAwMDAsCisgICBUeEFib3J0ZWQgICAgID0gMHgxMDAwMDAwMCwKKyAgIFR4T3V0T2ZXaW5kb3cgPSAweDA4MDAwMDAwLAorICAgVHhOY2NTaGlmdCAgICA9IDIyLAorICAgRWFybHlUeFRocmVzU2hpZnQgPSAxNiwKKyAgIFR4U3RhdE9LICAgICAgPSAweDgwMDAsCisgICBUeFVuZGVycnVuICAgID0gMHg0MDAwLAorICAgVHhPd24gICAgICAgICA9IDB4MjAwMCwKK307CisKK2VudW0gUnhTdGF0dXNCaXRzIHsKKyAgIFJ4U3RhdGVzT0sgICA9IDB4ODAwMDAsCisgICBSeEJhZEFsaWduICAgPSAweDQwMDAwLAorICAgUnhIdWdlRnJhbWUgID0gMHgyMDAwMCwKKyAgIFJ4U21hbGxGcmFtZSA9IDB4MTAwMDAsCisgICBSeENSQ09LICAgICAgPSAweDgwMDAsCisgICBSeENybEZyYW1lICAgPSAweDQwMDAsCisgICBSeF9Ccm9hZGNhc3QgPSAweDIwMDAsCisgICBSeF9NdWx0aWNhc3QgPSAweDEwMDAsCisgICBSeEFkZHJNYXRjaCAgPSAweDA4MDAsCisgICBNaWlFcnIgICAgICAgPSAweDA0MDAsCit9OworCitlbnVtIFJ4Q29uZmlnQml0cyB7CisgICBSeEZ1bGxEeCAgICA9IDB4ODAwMDAwMDAsCisgICBSeEVuYiAgICAgICA9IDB4NDAwMDAwMDAsCisgICBSeFNtYWxsICAgICA9IDB4MjAwMDAwMDAsCisgICBSeEh1Z2UgICAgICA9IDB4MTAwMDAwMDAsCisgICBSeEVyciAgICAgICA9IDB4MDgwMDAwMDAsCisgICBSeEFsbHBoeXMgICA9IDB4MDQwMDAwMDAsCisgICBSeE11bHRpY2FzdCA9IDB4MDIwMDAwMDAsCisgICBSeEJyb2FkY2FzdCA9IDB4MDEwMDAwMDAsCisgICBSeExvb3BCYWNrICA9ICgxIDw8IDIzKSB8ICgxIDw8IDIyKSwKKyAgIExvd1RocmVzaG9sZFNoaWZ0ICA9IDEyLAorICAgSGlnaFRocmVzaG9sZFNoaWZ0ID0gMiwKK307CisKK2VudW0gVHhDb25maWdCaXRzIHsKKyAgIFR4RnVsbER4ICAgICAgID0gMHg4MDAwMDAwMCwKKyAgIFR4RW5iICAgICAgICAgID0gMHg0MDAwMDAwMCwKKyAgIFR4RW5iUGFkICAgICAgID0gMHgyMDAwMDAwMCwKKyAgIFR4RW5iSHVnZSAgICAgID0gMHgxMDAwMDAwMCwKKyAgIFR4RW5iRkNTICAgICAgID0gMHgwODAwMDAwMCwKKyAgIFR4Tm9CYWNrT2ZmICAgID0gMHgwNDAwMDAwMCwKKyAgIFR4RW5iUHJlbSAgICAgID0gMHgwMjAwMDAwMCwKKyAgIFR4Q2FyZUxvc3RDcnMgID0gMHgxMDAwMDAwLAorICAgVHhFeGRDb2xsTnVtICAgPSAweGYwMDAwMCwKKyAgIFR4RGF0YVJhdGUgICAgID0gMHg4MDAwMCwKK307CisKK2VudW0gUGh5Q3RybGNvbmZpZ2JpdHMgeworICAgUGh5Q3RybEFuZSAgICAgICAgID0gMHg4MDAwMDAwMCwKKyAgIFBoeUN0cmxTcGQxMDAgICAgICA9IDB4NDAwMDAwMDAsCisgICBQaHlDdHJsU3BkMTAgICAgICAgPSAweDIwMDAwMDAwLAorICAgUGh5Q3RybFBoeUJhc2VBZGRyID0gMHgxZjAwMDAwMCwKKyAgIFBoeUN0cmxEdXggICAgICAgICA9IDB4ODAwMDAwLAorICAgUGh5Q3RybFJlc2V0ICAgICAgID0gMHg0MDAwMDAsCit9OworCitlbnVtIEZsb3dDdHJsQ29uZmlnQml0cyB7CisgICBGbG93Q3RybEZ1bGxEWCA9IDB4ODAwMDAwMDAsCisgICBGbG93Q3RybEVuYiAgICA9IDB4NDAwMDAwMDAsCit9OworCitlbnVtIENvbmZpZzBCaXRzIHsKKyAgIENmZzBfUmVzZXQgID0gMHg4MDAwMDAwMCwKKyAgIENmZzBfQW5hb2ZmID0gMHg0MDAwMDAwMCwKKyAgIENmZzBfTERQUyAgID0gMHgyMDAwMDAwMCwKK307CisKK2VudW0gQ29uZmlnMUJpdHMgeworICAgQ2ZnMV9FYXJseVJ4ID0gMSA8PCAzMSwKKyAgIENmZzFfRWFybHlUeCA9IDEgPDwgMzAsCisKKyAgIC8vcnggYnVmZmVyIHNpemUKKyAgIENmZzFfUmN2OEsgICA9IDB4MCwKKyAgIENmZzFfUmN2MTZLICA9IDB4MSwKKyAgIENmZzFfUmN2MzJLICA9IDB4MywKKyAgIENmZzFfUmN2NjRLICA9IDB4NywKKyAgIENmZzFfUmN2MTI4SyA9IDB4ZiwKK307CisKK2VudW0gTWlpQ21kMEJpdHMgeworICAgTWlpX0RpdmlkZXIgPSAweDIwMDAwMDAwLAorICAgTWlpX1dSSVRFICAgPSAweDQwMDAwMCwKKyAgIE1paV9SRUFEICAgID0gMHgyMDAwMDAsCisgICBNaWlfU0NBTiAgICA9IDB4MTAwMDAwLAorICAgTWlpX1RhbW9kICAgPSAweDgwMDAwLAorICAgTWlpX0Rydm1vZCAgPSAweDQwMDAwLAorICAgTWlpX21kYyAgICAgPSAweDIwMDAwLAorICAgTWlpX21kb2VuICAgPSAweDEwMDAwLAorICAgTWlpX21kbyAgICAgPSAweDgwMDAsCisgICBNaWlfbWRpICAgICA9IDB4NDAwMCwKK307CisKK2VudW0gTWlpU3RhdHVzQml0cyB7CisgICAgTWlpX1N0YXR1c0J1c3kgPSAweDgwMDAwMDAwLAorfTsKKworZW51bSBQTUNvbmZpZ0JpdHMgeworICAgUE1fRW5hYmxlICA9IDEgPDwgMzEsCisgICBQTV9Mb25nV0YgID0gMSA8PCAzMCwKKyAgIFBNX01hZ2ljICAgPSAxIDw8IDI5LAorICAgUE1fTEFOV2FrZSA9IDEgPDwgMjgsCisgICBQTV9MV1BUTiAgID0gKDEgPDwgMjcgfCAxPDwgMjYpLAorICAgUE1fTGlua1VwICA9IDEgPDwgMjUsCisgICBQTV9XYWtlVXAgID0gMSA8PCAyNCwKK307CisKKy8qIExvY2tpbmcgcnVsZXM6CisgKiBwcml2LT5sb2NrIHByb3RlY3RzIG1vc3Qgb2YgdGhlIGZpZWxkcyBvZiBwcml2IGFuZCBtb3N0IG9mIHRoZQorICogaGFyZHdhcmUgcmVnaXN0ZXJzLiBJdCBkb2VzIG5vdCBoYXZlIHRvIHByb3RlY3QgYWdhaW5zdCBzb2Z0aXJxcworICogYmV0d2VlbiBzYzkyMDMxX2Rpc2FibGVfaW50ZXJydXB0cyBhbmQgc2M5MjAzMV9lbmFibGVfaW50ZXJydXB0czsKKyAqIGl0IGFsc28gZG9lcyBub3QgbmVlZCB0byBiZSB1c2VkIGluIC0+b3BlbiBhbmQgLT5zdG9wIHdoaWxlIHRoZQorICogZGV2aWNlIGludGVycnVwdHMgYXJlIG9mZi4KKyAqIE5vdCBoYXZpbmcgdG8gcHJvdGVjdCBhZ2FpbnN0IHNvZnRpcnFzIGlzIHZlcnkgdXNlZnVsIGR1ZSB0byBoZWF2eQorICogdXNlIG9mIG1kZWxheSgpIGF0IF9zYzkyMDMxX3Jlc2V0LgorICogRnVuY3Rpb25zIHByZWZpeGVkIHdpdGggX3NjOTIwMzFfIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZDsKKyAqIGZ1bmN0aW9ucyBwcmVmaXhlZCB3aXRoIHNjOTIwMzFfIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgdGhlIGxvY2sgaGVsZC4KKyAqIFVzZSBtbWlvd2IoKSBiZWZvcmUgdW5sb2NraW5nIGlmIHRoZSBoYXJkd2FyZSB3YXMgd3JpdHRlbiB0by4KKyAqLworCisvKiBMb2NraW5nIHJ1bGVzIGZvciB0aGUgaW50ZXJydXB0OgorICogLSB0aGUgaW50ZXJydXB0IGFuZCB0aGUgdGFza2xldCBuZXZlciBydW4gYXQgdGhlIHNhbWUgdGltZQorICogLSBuZWl0aGVyIHJ1biBiZXR3ZWVuIHNjOTIwMzFfZGlzYWJsZV9pbnRlcnJ1cHRzIGFuZAorICogICBzYzkyMDMxX2VuYWJsZV9pbnRlcnJ1cHQKKyAqLworCitzdHJ1Y3Qgc2M5MjAzMV9wcml2IHsKKwlzcGlubG9ja190CQlsb2NrOworCS8qIGlvbWFwLmggY29va2llICovCisJdm9pZCBfX2lvbWVtCQkqcG9ydF9iYXNlOworCS8qIHBjaSBkZXZpY2Ugc3RydWN0dXJlICovCisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCS8qIHRhc2tsZXQgKi8KKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGFza2xldDsKKworCS8qIENQVSBhZGRyZXNzIG9mIHJ4IHJpbmcgKi8KKwl2b2lkCQkJKnJ4X3Jpbmc7CisJLyogUENJIGFkZHJlc3Mgb2YgcnggcmluZyAqLworCWRtYV9hZGRyX3QJCXJ4X3JpbmdfZG1hX2FkZHI7CisJLyogUENJIGFkZHJlc3Mgb2YgcnggcmluZyByZWFkIHBvaW50ZXIgKi8KKwlkbWFfYWRkcl90CQlyeF9yaW5nX3RhaWw7CisKKwkvKiB0eCByaW5nIHdyaXRlIGluZGV4ICovCisJdW5zaWduZWQJCXR4X2hlYWQ7CisJLyogdHggcmluZyByZWFkIGluZGV4ICovCisJdW5zaWduZWQJCXR4X3RhaWw7CisJLyogQ1BVIGFkZHJlc3Mgb2YgdHggYm91bmNlIGJ1ZmZlciAqLworCXZvaWQJCQkqdHhfYnVmczsKKwkvKiBQQ0kgYWRkcmVzcyBvZiB0eCBib3VuY2UgYnVmZmVyICovCisJZG1hX2FkZHJfdAkJdHhfYnVmc19kbWFfYWRkcjsKKworCS8qIGNvcGllcyBvZiBzb21lIGhhcmR3YXJlIHJlZ2lzdGVycyAqLworCXUzMgkJCWludHJfc3RhdHVzOworCWF0b21pY190CQlpbnRyX21hc2s7CisJdTMyCQkJcnhfY29uZmlnOworCXUzMgkJCXR4X2NvbmZpZzsKKwl1MzIJCQlwbV9jb25maWc7CisKKwkvKiBjb3B5IG9mIHNvbWUgZmxhZ3MgZnJvbSBkZXYtPmZsYWdzICovCisJdW5zaWduZWQgaW50CQltY19mbGFnczsKKworCS8qIGZvciBFVEhUT09MX0dTVEFUUyAqLworCXU2NAkJCXR4X3RpbWVvdXRzOworCXU2NAkJCXJ4X2xvc3M7CisKKwkvKiBmb3IgZGV2LT5nZXRfc3RhdHMgKi8KKwlsb25nCQkJcnhfdmFsdWU7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMJc3RhdHM7Cit9OworCisvKiBJIGRvbid0IGtub3cgd2hpY2ggcmVnaXN0ZXJzIGNhbiBiZSBzYWZlbHkgcmVhZDsgaG93ZXZlciwgSSBjYW4gZ3Vlc3MKKyAqIE1BQzAgaXMgb25lIG9mIHRoZW0uICovCitzdGF0aWMgaW5saW5lIHZvaWQgX3NjOTIwMzFfZHVtbXlfcmVhZCh2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSkKK3sKKwlpb3JlYWQzMihwb3J0X2Jhc2UgKyBNQUMwKTsKK30KKworc3RhdGljIHUzMiBfc2M5MjAzMV9taWlfd2FpdCh2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSkKK3sKKwl1MzIgbWlpX3N0YXR1czsKKworCWRvIHsKKwkJdWRlbGF5KDEwKTsKKwkJbWlpX3N0YXR1cyA9IGlvcmVhZDMyKHBvcnRfYmFzZSArIE1paXN0YXR1cyk7CisJfSB3aGlsZSAobWlpX3N0YXR1cyAmIE1paV9TdGF0dXNCdXN5KTsKKworCXJldHVybiBtaWlfc3RhdHVzOworfQorCitzdGF0aWMgdTMyIF9zYzkyMDMxX21paV9jbWQodm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UsIHUzMiBjbWQwLCB1MzIgY21kMSkKK3sKKwlpb3dyaXRlMzIoTWlpX0RpdmlkZXIsIHBvcnRfYmFzZSArIE1paWNtZDApOworCisJX3NjOTIwMzFfbWlpX3dhaXQocG9ydF9iYXNlKTsKKworCWlvd3JpdGUzMihjbWQxLCBwb3J0X2Jhc2UgKyBNaWljbWQxKTsKKwlpb3dyaXRlMzIoTWlpX0RpdmlkZXIgfCBjbWQwLCBwb3J0X2Jhc2UgKyBNaWljbWQwKTsKKworCXJldHVybiBfc2M5MjAzMV9taWlfd2FpdChwb3J0X2Jhc2UpOworfQorCitzdGF0aWMgdm9pZCBfc2M5MjAzMV9taWlfc2Nhbih2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSkKK3sKKwlfc2M5MjAzMV9taWlfY21kKHBvcnRfYmFzZSwgTWlpX1NDQU4sIDB4MSA8PCA2KTsKK30KKworc3RhdGljIHUxNiBfc2M5MjAzMV9taWlfcmVhZCh2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSwgdW5zaWduZWQgcmVnKQoreworCXJldHVybiBfc2M5MjAzMV9taWlfY21kKHBvcnRfYmFzZSwgTWlpX1JFQUQsIHJlZyA8PCA2KSA+PiAxMzsKK30KKworc3RhdGljIHZvaWQgX3NjOTIwMzFfbWlpX3dyaXRlKHZvaWQgX19pb21lbSAqcG9ydF9iYXNlLCB1bnNpZ25lZCByZWcsIHUxNiB2YWwpCit7CisJX3NjOTIwMzFfbWlpX2NtZChwb3J0X2Jhc2UsIE1paV9XUklURSwgKHJlZyA8PCA2KSB8ICgodTMyKXZhbCA8PCAxMSkpOworfQorCitzdGF0aWMgdm9pZCBzYzkyMDMxX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqcG9ydF9iYXNlID0gcHJpdi0+cG9ydF9iYXNlOworCisJLyogdGVsbCB0aGUgdGFza2xldC9pbnRlcnJ1cHQgbm90IHRvIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJYXRvbWljX3NldCgmcHJpdi0+aW50cl9tYXNrLCAwKTsKKwl3bWIoKTsKKworCS8qIHN0b3AgaW50ZXJydXB0cyAqLworCWlvd3JpdGUzMigwLCBwb3J0X2Jhc2UgKyBJbnRyTWFzayk7CisJX3NjOTIwMzFfZHVtbXlfcmVhZChwb3J0X2Jhc2UpOworCW1taW93YigpOworCisJLyogd2FpdCBmb3IgYW55IGNvbmN1cnJlbnQgaW50ZXJydXB0L3Rhc2tsZXQgdG8gZmluaXNoICovCisJc3luY2hyb25pemVfaXJxKGRldi0+aXJxKTsKKwl0YXNrbGV0X2Rpc2FibGUoJnByaXYtPnRhc2tsZXQpOworfQorCitzdGF0aWMgdm9pZCBzYzkyMDMxX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBwcml2LT5wb3J0X2Jhc2U7CisKKwl0YXNrbGV0X2VuYWJsZSgmcHJpdi0+dGFza2xldCk7CisKKwlhdG9taWNfc2V0KCZwcml2LT5pbnRyX21hc2ssIEludHJCaXRzKTsKKwl3bWIoKTsKKworCWlvd3JpdGUzMihJbnRyQml0cywgcG9ydF9iYXNlICsgSW50ck1hc2spOworCW1taW93YigpOworfQorCitzdGF0aWMgdm9pZCBfc2M5MjAzMV9kaXNhYmxlX3R4X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBwcml2LT5wb3J0X2Jhc2U7CisKKwlwcml2LT5yeF9jb25maWcgJj0gflJ4RW5iOworCXByaXYtPnR4X2NvbmZpZyAmPSB+VHhFbmI7CisJaW93cml0ZTMyKHByaXYtPnJ4X2NvbmZpZywgcG9ydF9iYXNlICsgUnhDb25maWcpOworCWlvd3JpdGUzMihwcml2LT50eF9jb25maWcsIHBvcnRfYmFzZSArIFR4Q29uZmlnKTsKK30KKworc3RhdGljIHZvaWQgX3NjOTIwMzFfZW5hYmxlX3R4X3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBwcml2LT5wb3J0X2Jhc2U7CisKKwlwcml2LT5yeF9jb25maWcgfD0gUnhFbmI7CisJcHJpdi0+dHhfY29uZmlnIHw9IFR4RW5iOworCWlvd3JpdGUzMihwcml2LT5yeF9jb25maWcsIHBvcnRfYmFzZSArIFJ4Q29uZmlnKTsKKwlpb3dyaXRlMzIocHJpdi0+dHhfY29uZmlnLCBwb3J0X2Jhc2UgKyBUeENvbmZpZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9zYzkyMDMxX3R4X2NsZWFyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwl3aGlsZSAocHJpdi0+dHhfaGVhZCAtIHByaXYtPnR4X3RhaWwgPiAwKSB7CisJCXByaXYtPnR4X3RhaWwrKzsKKwkJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworCX0KKwlwcml2LT50eF9oZWFkID0gcHJpdi0+dHhfdGFpbCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9zYzkyMDMxX3NldF9tYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2M5MjAzMV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSA9IHByaXYtPnBvcnRfYmFzZTsKKwl1MzIgbWFyMCA9IDAsIG1hcjEgPSAwOworCisJaWYgKChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCQl8fCBkZXYtPm1jX2NvdW50ID4gbXVsdGljYXN0X2ZpbHRlcl9saW1pdAorCQkJfHwgKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpKQorCQltYXIwID0gbWFyMSA9IDB4ZmZmZmZmZmY7CisJZWxzZSBpZiAoZGV2LT5mbGFncyAmIElGRl9NVUxUSUNBU1QpIHsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY19saXN0OworCisJCWZvciAobWNfbGlzdCA9IGRldi0+bWNfbGlzdDsgbWNfbGlzdDsgbWNfbGlzdCA9IG1jX2xpc3QtPm5leHQpIHsKKwkJCXUzMiBjcmM7CisJCQl1bnNpZ25lZCBiaXQgPSAwOworCisJCQljcmMgPSB+ZXRoZXJfY3JjKEVUSF9BTEVOLCBtY19saXN0LT5kbWlfYWRkcik7CisJCQljcmMgPj49IDI0OworCisJCQlpZiAoY3JjICYgMHgwMSkJYml0IHw9IDB4MDI7CisJCQlpZiAoY3JjICYgMHgwMikJYml0IHw9IDB4MDE7CisJCQlpZiAoY3JjICYgMHgxMCkJYml0IHw9IDB4MjA7CisJCQlpZiAoY3JjICYgMHgyMCkJYml0IHw9IDB4MTA7CisJCQlpZiAoY3JjICYgMHg0MCkJYml0IHw9IDB4MDg7CisJCQlpZiAoY3JjICYgMHg4MCkJYml0IHw9IDB4MDQ7CisKKwkJCWlmIChiaXQgPiAzMSkKKwkJCQltYXIwIHw9IDB4MSA8PCAoYml0IC0gMzIpOworCQkJZWxzZQorCQkJCW1hcjEgfD0gMHgxIDw8IGJpdDsKKwkJfQorCX0KKworCWlvd3JpdGUzMihtYXIwLCBwb3J0X2Jhc2UgKyBNQVIwKTsKKwlpb3dyaXRlMzIobWFyMSwgcG9ydF9iYXNlICsgTUFSMCArIDQpOworfQorCitzdGF0aWMgdm9pZCBfc2M5MjAzMV9zZXRfcnhfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBwcml2LT5wb3J0X2Jhc2U7CisJdW5zaWduZWQgaW50IG9sZF9tY19mbGFnczsKKwl1MzIgcnhfY29uZmlnX2JpdHMgPSAwOworCisJb2xkX21jX2ZsYWdzID0gcHJpdi0+bWNfZmxhZ3M7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlyeF9jb25maWdfYml0cyB8PSBSeFNtYWxsIHwgUnhIdWdlIHwgUnhFcnIgfCBSeEJyb2FkY2FzdAorCQkJCXwgUnhNdWx0aWNhc3QgfCBSeEFsbHBoeXM7CisKKwlpZiAoZGV2LT5mbGFncyAmIChJRkZfQUxMTVVMVEkgfCBJRkZfTVVMVElDQVNUKSkKKwkJcnhfY29uZmlnX2JpdHMgfD0gUnhNdWx0aWNhc3Q7CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9CUk9BRENBU1QpCisJCXJ4X2NvbmZpZ19iaXRzIHw9IFJ4QnJvYWRjYXN0OworCisJcHJpdi0+cnhfY29uZmlnICY9IH4oUnhTbWFsbCB8IFJ4SHVnZSB8IFJ4RXJyIHwgUnhCcm9hZGNhc3QKKwkJCXwgUnhNdWx0aWNhc3QgfCBSeEFsbHBoeXMpOworCXByaXYtPnJ4X2NvbmZpZyB8PSByeF9jb25maWdfYml0czsKKworCXByaXYtPm1jX2ZsYWdzID0gZGV2LT5mbGFncyAmIChJRkZfUFJPTUlTQyB8IElGRl9BTExNVUxUSQorCQkJfCBJRkZfTVVMVElDQVNUIHwgSUZGX0JST0FEQ0FTVCk7CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpICYmIHByaXYtPm1jX2ZsYWdzICE9IG9sZF9tY19mbGFncykKKwkJaW93cml0ZTMyKHByaXYtPnJ4X2NvbmZpZywgcG9ydF9iYXNlICsgUnhDb25maWcpOworfQorCitzdGF0aWMgYm9vbCBfc2M5MjAzMV9jaGVja19tZWRpYShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqcG9ydF9iYXNlID0gcHJpdi0+cG9ydF9iYXNlOworCXUxNiBibXNyOworCisJYm1zciA9IF9zYzkyMDMxX21paV9yZWFkKHBvcnRfYmFzZSwgTUlJX0JNU1IpOworCXJtYigpOworCWlmIChibXNyICYgQk1TUl9MU1RBVFVTKSB7CisJCWJvb2wgc3BlZWRfMTAwLCBkdXBsZXhfZnVsbDsKKwkJdTMyIGZsb3dfY3RybF9jb25maWcgPSAwOworCQl1MTYgb3V0cHV0X3N0YXR1cyA9IF9zYzkyMDMxX21paV9yZWFkKHBvcnRfYmFzZSwKKwkJCQlNSUlfT3V0cHV0U3RhdHVzKTsKKwkJX3NjOTIwMzFfbWlpX3NjYW4ocG9ydF9iYXNlKTsKKworCQlzcGVlZF8xMDAgPSBvdXRwdXRfc3RhdHVzICYgMHgyOworCQlkdXBsZXhfZnVsbCA9IG91dHB1dF9zdGF0dXMgJiAweDQ7CisKKwkJLyogSW5pdGlhbCBUeC9SeCBjb25maWd1cmF0aW9uICovCisJCXByaXYtPnJ4X2NvbmZpZyA9ICgweDQwIDw8IExvd1RocmVzaG9sZFNoaWZ0KSB8ICgweDFjMCA8PCBIaWdoVGhyZXNob2xkU2hpZnQpOworCQlwcml2LT50eF9jb25maWcgPSAweDQ4ODAwMDAwOworCisJCS8qIE5PVEU6IHZlbmRvciBkcml2ZXIgaGFkIGRlYWQgY29kZSBoZXJlIHRvIGVuYWJsZSB0eCBwYWRkaW5nICovCisKKwkJaWYgKCFzcGVlZF8xMDApCisJCQlwcml2LT50eF9jb25maWcgfD0gMHg4MDAwMDsKKworCQkvLyBjb25maWd1cmUgcnggbW9kZQorCQlfc2M5MjAzMV9zZXRfcnhfY29uZmlnKGRldik7CisKKwkJaWYgKGR1cGxleF9mdWxsKSB7CisJCQlwcml2LT5yeF9jb25maWcgfD0gUnhGdWxsRHg7CisJCQlwcml2LT50eF9jb25maWcgfD0gVHhGdWxsRHg7CisJCQlmbG93X2N0cmxfY29uZmlnID0gRmxvd0N0cmxGdWxsRFggfCBGbG93Q3RybEVuYjsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnJ4X2NvbmZpZyAmPSB+UnhGdWxsRHg7CisJCQlwcml2LT50eF9jb25maWcgJj0gflR4RnVsbER4OworCQl9CisKKwkJX3NjOTIwMzFfc2V0X21hcihkZXYpOworCQlfc2M5MjAzMV9zZXRfcnhfY29uZmlnKGRldik7CisJCV9zYzkyMDMxX2VuYWJsZV90eF9yeChkZXYpOworCQlpb3dyaXRlMzIoZmxvd19jdHJsX2NvbmZpZywgcG9ydF9iYXNlICsgRmxvd0N0cmxDb25maWcpOworCisJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGxpbmsgdXAsICVzTWJwcywgJXMtZHVwbGV4XG4iLAorCQkJCWRldi0+bmFtZSwKKwkJCQlzcGVlZF8xMDAgPyAiMTAwIiA6ICIxMCIsCisJCQkJZHVwbGV4X2Z1bGwgPyAiZnVsbCIgOiAiaGFsZiIpOworCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgeworCQlfc2M5MjAzMV9taWlfc2Nhbihwb3J0X2Jhc2UpOworCisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwkJX3NjOTIwMzFfZGlzYWJsZV90eF9yeChkZXYpOworCisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogbGluayBkb3duXG4iLCBkZXYtPm5hbWUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgdm9pZCBfc2M5MjAzMV9waHlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2M5MjAzMV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSA9IHByaXYtPnBvcnRfYmFzZTsKKwl1MzIgcGh5X2N0cmw7CisKKwlwaHlfY3RybCA9IGlvcmVhZDMyKHBvcnRfYmFzZSArIFBoeUN0cmwpOworCXBoeV9jdHJsICY9IH4oUGh5Q3RybER1eCB8IFBoeUN0cmxTcGQxMDAgfCBQaHlDdHJsU3BkMTApOworCXBoeV9jdHJsIHw9IFBoeUN0cmxBbmUgfCBQaHlDdHJsUmVzZXQ7CisKKwlzd2l0Y2ggKG1lZGlhKSB7CisJZGVmYXVsdDoKKwljYXNlIEFVVE9TRUxFQ1Q6CisJCXBoeV9jdHJsIHw9IFBoeUN0cmxEdXggfCBQaHlDdHJsU3BkMTAwIHwgUGh5Q3RybFNwZDEwOworCQlicmVhazsKKwljYXNlIE0xMF9IQUxGOgorCQlwaHlfY3RybCB8PSBQaHlDdHJsU3BkMTA7CisJCWJyZWFrOworCWNhc2UgTTEwX0ZVTEw6CisJCXBoeV9jdHJsIHw9IFBoeUN0cmxEdXggfCBQaHlDdHJsU3BkMTA7CisJCWJyZWFrOworCWNhc2UgTTEwMF9IQUxGOgorCQlwaHlfY3RybCB8PSBQaHlDdHJsU3BkMTAwOworCQlicmVhazsKKwljYXNlIE0xMDBfRlVMTDoKKwkJcGh5X2N0cmwgfD0gUGh5Q3RybER1eCB8IFBoeUN0cmxTcGQxMDA7CisJCWJyZWFrOworCX0KKworCWlvd3JpdGUzMihwaHlfY3RybCwgcG9ydF9iYXNlICsgUGh5Q3RybCk7CisJbWRlbGF5KDEwKTsKKworCXBoeV9jdHJsICY9IH5QaHlDdHJsUmVzZXQ7CisJaW93cml0ZTMyKHBoeV9jdHJsLCBwb3J0X2Jhc2UgKyBQaHlDdHJsKTsKKwltZGVsYXkoMSk7CisKKwlfc2M5MjAzMV9taWlfd3JpdGUocG9ydF9iYXNlLCBNSUlfSkFCLAorCQkJUEhZXzE2X0pBQl9FTkIgfCBQSFlfMTZfUE9SVF9FTkIpOworCV9zYzkyMDMxX21paV9zY2FuKHBvcnRfYmFzZSk7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKK30KKworc3RhdGljIHZvaWQgX3NjOTIwMzFfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2M5MjAzMV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSA9IHByaXYtPnBvcnRfYmFzZTsKKworCS8qIGRpc2FibGUgUE0gKi8KKwlpb3dyaXRlMzIoMCwgcG9ydF9iYXNlICsgUE1Db25maWcpOworCisJLyogc29mdCByZXNldCB0aGUgY2hpcCAqLworCWlvd3JpdGUzMihDZmcwX1Jlc2V0LCBwb3J0X2Jhc2UgKyBDb25maWcwKTsKKwltZGVsYXkoMjAwKTsKKworCWlvd3JpdGUzMigwLCBwb3J0X2Jhc2UgKyBDb25maWcwKTsKKwltZGVsYXkoMTApOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJaW93cml0ZTMyKDAsIHBvcnRfYmFzZSArIEludHJNYXNrKTsKKworCS8qIGNsZWFyIG11bHRpY2FzdCBhZGRyZXNzICovCisJaW93cml0ZTMyKDAsIHBvcnRfYmFzZSArIE1BUjApOworCWlvd3JpdGUzMigwLCBwb3J0X2Jhc2UgKyBNQVIwICsgNCk7CisKKwkvKiBpbml0IHJ4IHJpbmcgKi8KKwlpb3dyaXRlMzIocHJpdi0+cnhfcmluZ19kbWFfYWRkciwgcG9ydF9iYXNlICsgUnhidWZBZGRyKTsKKwlwcml2LT5yeF9yaW5nX3RhaWwgPSBwcml2LT5yeF9yaW5nX2RtYV9hZGRyOworCisJLyogaW5pdCB0eCByaW5nICovCisJX3NjOTIwMzFfdHhfY2xlYXIoZGV2KTsKKworCS8qIGNsZWFyIG9sZCByZWdpc3RlciB2YWx1ZXMgKi8KKwlwcml2LT5pbnRyX3N0YXR1cyA9IDA7CisJYXRvbWljX3NldCgmcHJpdi0+aW50cl9tYXNrLCAwKTsKKwlwcml2LT5yeF9jb25maWcgPSAwOworCXByaXYtPnR4X2NvbmZpZyA9IDA7CisJcHJpdi0+bWNfZmxhZ3MgPSAwOworCisJLyogY29uZmlndXJlIHJ4IGJ1ZmZlciBzaXplICovCisJLyogTk9URTogdmVuZG9yIGRyaXZlciBoYWQgZGVhZCBjb2RlIGhlcmUgdG8gZW5hYmxlIGVhcmx5IHR4L3J4ICovCisJaW93cml0ZTMyKENmZzFfUmN2NjRLLCBwb3J0X2Jhc2UgKyBDb25maWcxKTsKKworCV9zYzkyMDMxX3BoeV9yZXNldChkZXYpOworCV9zYzkyMDMxX2NoZWNrX21lZGlhKGRldik7CisKKwkvKiBjYWxjdWxhdGUgcnggZmlmbyBvdmVyZmxvdyAqLworCXByaXYtPnJ4X3ZhbHVlID0gMDsKKworCS8qIGVuYWJsZSBQTSAqLworCWlvd3JpdGUzMihwcml2LT5wbV9jb25maWcsIHBvcnRfYmFzZSArIFBNQ29uZmlnKTsKKworCS8qIGNsZWFyIGludHIgcmVnaXN0ZXIgKi8KKwlpb3JlYWQzMihwb3J0X2Jhc2UgKyBJbnRyU3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgX3NjOTIwMzFfdHhfdGFza2xldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqcG9ydF9iYXNlID0gcHJpdi0+cG9ydF9iYXNlOworCisJdW5zaWduZWQgb2xkX3R4X3RhaWw7CisJdW5zaWduZWQgZW50cnk7CisJdTMyIHR4X3N0YXR1czsKKworCW9sZF90eF90YWlsID0gcHJpdi0+dHhfdGFpbDsKKwl3aGlsZSAocHJpdi0+dHhfaGVhZCAtIHByaXYtPnR4X3RhaWwgPiAwKSB7CisJCWVudHJ5ID0gcHJpdi0+dHhfdGFpbCAlIE5VTV9UWF9ERVNDOworCQl0eF9zdGF0dXMgPSBpb3JlYWQzMihwb3J0X2Jhc2UgKyBUeFN0YXR1czAgKyBlbnRyeSAqIDQpOworCisJCWlmICghKHR4X3N0YXR1cyAmIChUeFN0YXRPSyB8IFR4VW5kZXJydW4gfCBUeEFib3J0ZWQpKSkKKwkJCWJyZWFrOworCisJCXByaXYtPnR4X3RhaWwrKzsKKworCQlpZiAodHhfc3RhdHVzICYgVHhTdGF0T0spIHsKKwkJCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHR4X3N0YXR1cyAmIDB4MWZmZjsKKwkJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCS8qIE5vdGU6IFR4Q2Fycmllckxvc3QgaXMgYWx3YXlzIGFzc2VydGVkIGF0IDEwMG1icHMuICovCisJCQlwcml2LT5zdGF0cy5jb2xsaXNpb25zICs9ICh0eF9zdGF0dXMgPj4gMjIpICYgMHhmOworCQl9CisKKwkJaWYgKHR4X3N0YXR1cyAmIChUeE91dE9mV2luZG93IHwgVHhBYm9ydGVkKSkgeworCQkJcHJpdi0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkJCWlmICh0eF9zdGF0dXMgJiBUeEFib3J0ZWQpCisJCQkJcHJpdi0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKworCQkJaWYgKHR4X3N0YXR1cyAmIFR4Q2Fycmllckxvc3QpCisJCQkJcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKworCQkJaWYgKHR4X3N0YXR1cyAmIFR4T3V0T2ZXaW5kb3cpCisJCQkJcHJpdi0+c3RhdHMudHhfd2luZG93X2Vycm9ycysrOworCQl9CisKKwkJaWYgKHR4X3N0YXR1cyAmIFR4VW5kZXJydW4pCisJCQlwcml2LT5zdGF0cy50eF9maWZvX2Vycm9ycysrOworCX0KKworCWlmIChwcml2LT50eF90YWlsICE9IG9sZF90eF90YWlsKQorCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBfc2M5MjAzMV9yeF90YXNrbGV0X2Vycm9yKHUzMiByeF9zdGF0dXMsCisJCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYsIHVuc2lnbmVkIHJ4X3NpemUpCit7CisJaWYocnhfc2l6ZSA+IChNQVhfRVRIX0ZSQU1FX1NJWkUgKyA0KSB8fCByeF9zaXplIDwgMTYpIHsKKwkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCXByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwl9CisKKwlpZiAoIShyeF9zdGF0dXMgJiBSeFN0YXRlc09LKSkgeworCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCQlpZiAocnhfc3RhdHVzICYgKFJ4SHVnZUZyYW1lIHwgUnhTbWFsbEZyYW1lKSkKKwkJCXByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKworCQlpZiAocnhfc3RhdHVzICYgUnhCYWRBbGlnbikKKwkJCXByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCisJCWlmICghKHJ4X3N0YXR1cyAmIFJ4Q1JDT0spKQorCQkJcHJpdi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCX0gZWxzZQorCQlwcml2LT5yeF9sb3NzKys7Cit9CisKK3N0YXRpYyB2b2lkIF9zYzkyMDMxX3J4X3Rhc2tsZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2M5MjAzMV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSA9IHByaXYtPnBvcnRfYmFzZTsKKworCWRtYV9hZGRyX3QgcnhfcmluZ19oZWFkOworCXVuc2lnbmVkIHJ4X2xlbjsKKwl1bnNpZ25lZCByeF9yaW5nX29mZnNldDsKKwl2b2lkICpyeF9yaW5nID0gcHJpdi0+cnhfcmluZzsKKworCXJ4X3JpbmdfaGVhZCA9IGlvcmVhZDMyKHBvcnRfYmFzZSArIFJ4QnVmV1B0cik7CisJcm1iKCk7CisKKwkvKiByeF9yaW5nX2hlYWQgaXMgb25seSAxNyBiaXRzIGluIHRoZSBSeEJ1ZldQdHIgcmVnaXN0ZXIuCisJICogd2UgbmVlZCB0byBjaGFuZ2UgaXQgdG8gMzIgYml0cyBwaHlzaWNhbCBhZGRyZXNzCisJICovCisJcnhfcmluZ19oZWFkICY9IChkbWFfYWRkcl90KShSWF9CVUZfTEVOIC0gMSk7CisJcnhfcmluZ19oZWFkIHw9IHByaXYtPnJ4X3JpbmdfZG1hX2FkZHIgJiB+KGRtYV9hZGRyX3QpKFJYX0JVRl9MRU4gLSAxKTsKKwlpZiAocnhfcmluZ19oZWFkIDwgcHJpdi0+cnhfcmluZ19kbWFfYWRkcikKKwkJcnhfcmluZ19oZWFkICs9IFJYX0JVRl9MRU47CisKKwlpZiAocnhfcmluZ19oZWFkID49IHByaXYtPnJ4X3JpbmdfdGFpbCkKKwkJcnhfbGVuID0gcnhfcmluZ19oZWFkIC0gcHJpdi0+cnhfcmluZ190YWlsOworCWVsc2UKKwkJcnhfbGVuID0gUlhfQlVGX0xFTiAtIChwcml2LT5yeF9yaW5nX3RhaWwgLSByeF9yaW5nX2hlYWQpOworCisJaWYgKCFyeF9sZW4pCisJCXJldHVybjsKKworCWlmICh1bmxpa2VseShyeF9sZW4gPiBSWF9CVUZfTEVOKSkgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogcnggcGFja2V0cyBsZW5ndGggPiByeCBidWZmZXJcbiIsCisJCQkJCWRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwlyeF9yaW5nX29mZnNldCA9IChwcml2LT5yeF9yaW5nX3RhaWwgLSBwcml2LT5yeF9yaW5nX2RtYV9hZGRyKSAlIFJYX0JVRl9MRU47CisKKwl3aGlsZSAocnhfbGVuKSB7CisJCXUzMiByeF9zdGF0dXM7CisJCXVuc2lnbmVkIHJ4X3NpemUsIHJ4X3NpemVfYWxpZ24sIHBrdF9zaXplOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXJ4X3N0YXR1cyA9IGxlMzJfdG9fY3B1cCgoX19sZTMyICopKHJ4X3JpbmcgKyByeF9yaW5nX29mZnNldCkpOworCQlybWIoKTsKKworCQlyeF9zaXplID0gcnhfc3RhdHVzID4+IDIwOworCQlyeF9zaXplX2FsaWduID0gKHJ4X3NpemUgKyAzKSAmIH4zOwkvLyBmb3IgNCBieXRlcyBhbGlnbmVkCisJCXBrdF9zaXplID0gcnhfc2l6ZSAtIDQ7CS8vIE9taXQgdGhlIGZvdXIgb2N0ZXQgQ1JDIGZyb20gdGhlIGxlbmd0aC4KKworCQlyeF9yaW5nX29mZnNldCA9IChyeF9yaW5nX29mZnNldCArIDQpICUgUlhfQlVGX0xFTjsKKworCQlpZiAodW5saWtlbHkocnhfc3RhdHVzID09IDAKKwkJCQl8fCByeF9zaXplID4gKE1BWF9FVEhfRlJBTUVfU0laRSArIDQpCisJCQkJfHwgcnhfc2l6ZSA8IDE2CisJCQkJfHwgIShyeF9zdGF0dXMgJiBSeFN0YXRlc09LKSkpIHsKKwkJCV9zYzkyMDMxX3J4X3Rhc2tsZXRfZXJyb3Iocnhfc3RhdHVzLCBwcml2LCByeF9zaXplKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHVubGlrZWx5KHJ4X3NpemVfYWxpZ24gKyA0ID4gcnhfbGVuKSkgeworCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiByeF9sZW4gaXMgdG9vIHNtYWxsXG4iLCBkZXYtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCQlyeF9sZW4gLT0gcnhfc2l6ZV9hbGlnbiArIDQ7CisKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihwa3Rfc2l6ZSArIE5FVF9JUF9BTElHTik7CisJCWlmICh1bmxpa2VseSghc2tiKSkgeworCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZG4ndCBhbGxvY2F0ZSBhIHNrYl9idWZmIGZvciBhIHBhY2tldCBvZiBzaXplICV1XG4iLAorCQkJCQkJZGV2LT5uYW1lLCBwa3Rfc2l6ZSk7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisKKwkJaWYgKChyeF9yaW5nX29mZnNldCArIHBrdF9zaXplKSA+IFJYX0JVRl9MRU4pIHsKKwkJCW1lbWNweShza2JfcHV0KHNrYiwgUlhfQlVGX0xFTiAtIHJ4X3Jpbmdfb2Zmc2V0KSwKKwkJCQlyeF9yaW5nICsgcnhfcmluZ19vZmZzZXQsIFJYX0JVRl9MRU4gLSByeF9yaW5nX29mZnNldCk7CisJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9zaXplIC0gKFJYX0JVRl9MRU4gLSByeF9yaW5nX29mZnNldCkpLAorCQkJCXJ4X3JpbmcsIHBrdF9zaXplIC0gKFJYX0JVRl9MRU4gLSByeF9yaW5nX29mZnNldCkpOworCQl9IGVsc2UgeworCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3Rfc2l6ZSksIHJ4X3JpbmcgKyByeF9yaW5nX29mZnNldCwgcGt0X3NpemUpOworCQl9CisKKwkJc2tiLT5kZXYgPSBkZXY7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCW5ldGlmX3J4KHNrYik7CisKKwkJcHJpdi0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0X3NpemU7CisJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKworCQlpZiAocnhfc3RhdHVzICYgUnhfTXVsdGljYXN0KQorCQkJcHJpdi0+c3RhdHMubXVsdGljYXN0Kys7CisKKwluZXh0OgorCQlyeF9yaW5nX29mZnNldCA9IChyeF9yaW5nX29mZnNldCArIHJ4X3NpemVfYWxpZ24pICUgUlhfQlVGX0xFTjsKKwl9CisJbWIoKTsKKworCXByaXYtPnJ4X3JpbmdfdGFpbCA9IHJ4X3JpbmdfaGVhZDsKKwlpb3dyaXRlMzIocHJpdi0+cnhfcmluZ190YWlsLCBwb3J0X2Jhc2UgKyBSeEJ1ZlJQdHIpOworfQorCitzdGF0aWMgdm9pZCBfc2M5MjAzMV9saW5rX3Rhc2tsZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2M5MjAzMV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmIChfc2M5MjAzMV9jaGVja19tZWRpYShkZXYpKQorCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJZWxzZSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcHJpdi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjOTIwMzFfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBwcml2LT5wb3J0X2Jhc2U7CisJdTMyIGludHJfc3RhdHVzLCBpbnRyX21hc2s7CisKKwlpbnRyX3N0YXR1cyA9IHByaXYtPmludHJfc3RhdHVzOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCWlmICh1bmxpa2VseSghbmV0aWZfcnVubmluZyhkZXYpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoaW50cl9zdGF0dXMgJiBUeE9LKQorCQlfc2M5MjAzMV90eF90YXNrbGV0KGRldik7CisKKwlpZiAoaW50cl9zdGF0dXMgJiBSeE9LKQorCQlfc2M5MjAzMV9yeF90YXNrbGV0KGRldik7CisKKwlpZiAoaW50cl9zdGF0dXMgJiBSeE92ZXJmbG93KQorCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKworCWlmIChpbnRyX3N0YXR1cyAmIFRpbWVPdXQpIHsKKwkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCXByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwl9CisKKwlpZiAoaW50cl9zdGF0dXMgJiAoTGlua0ZhaWwgfCBMaW5rT0spKQorCQlfc2M5MjAzMV9saW5rX3Rhc2tsZXQoZGV2KTsKKworb3V0OgorCWludHJfbWFzayA9IGF0b21pY19yZWFkKCZwcml2LT5pbnRyX21hc2spOworCXJtYigpOworCisJaW93cml0ZTMyKGludHJfbWFzaywgcG9ydF9iYXNlICsgSW50ck1hc2spOworCW1taW93YigpOworCisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2M5MjAzMV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBwcml2LT5wb3J0X2Jhc2U7CisJdTMyIGludHJfc3RhdHVzLCBpbnRyX21hc2s7CisKKwkvKiBtYXNrIGludGVycnVwdHMgYmVmb3JlIGNsZWFyaW5nIEludHJTdGF0dXMgKi8KKwlpb3dyaXRlMzIoMCwgcG9ydF9iYXNlICsgSW50ck1hc2spOworCV9zYzkyMDMxX2R1bW15X3JlYWQocG9ydF9iYXNlKTsKKworCWludHJfc3RhdHVzID0gaW9yZWFkMzIocG9ydF9iYXNlICsgSW50clN0YXR1cyk7CisJaWYgKHVubGlrZWx5KGludHJfc3RhdHVzID09IDB4ZmZmZmZmZmYpKQorCQlyZXR1cm4gSVJRX05PTkU7CS8vIGhhcmR3YXJlIGhhcyBnb25lIG1pc3NpbmcKKworCWludHJfc3RhdHVzICY9IEludHJCaXRzOworCWlmICghaW50cl9zdGF0dXMpCisJCWdvdG8gb3V0X25vbmU7CisKKwlwcml2LT5pbnRyX3N0YXR1cyA9IGludHJfc3RhdHVzOworCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPnRhc2tsZXQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworCitvdXRfbm9uZToKKwlpbnRyX21hc2sgPSBhdG9taWNfcmVhZCgmcHJpdi0+aW50cl9tYXNrKTsKKwlybWIoKTsKKworCWlvd3JpdGUzMihpbnRyX21hc2ssIHBvcnRfYmFzZSArIEludHJNYXNrKTsKKwltbWlvd2IoKTsKKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzYzkyMDMxX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqcG9ydF9iYXNlID0gcHJpdi0+cG9ydF9iYXNlOworCisJLy8gRklYTUUgSSBkbyBub3QgdW5kZXJzdGFuZCB3aGF0IGlzIHRoaXMgdHJ5aW5nIHRvIGRvLgorCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJaW50IHRlbXA7CisKKwkJc3Bpbl9sb2NrX2JoKCZwcml2LT5sb2NrKTsKKworCQkvKiBVcGRhdGUgdGhlIGVycm9yIGNvdW50LiAqLworCQl0ZW1wID0gKGlvcmVhZDMyKHBvcnRfYmFzZSArIFJ4U3RhdHVzMCkgPj4gMTYpICYgMHhmZmZmOworCisJCWlmICh0ZW1wID09IDB4ZmZmZikgeworCQkJcHJpdi0+cnhfdmFsdWUgKz0gdGVtcDsKKwkJCXByaXYtPnN0YXRzLnJ4X2ZpZm9fZXJyb3JzID0gcHJpdi0+cnhfdmFsdWU7CisJCX0gZWxzZSB7CisJCQlwcml2LT5zdGF0cy5yeF9maWZvX2Vycm9ycyA9IHRlbXAgKyBwcml2LT5yeF92YWx1ZTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gJnByaXYtPnN0YXRzOworfQorCitzdGF0aWMgaW50IHNjOTIwMzFfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqcG9ydF9iYXNlID0gcHJpdi0+cG9ydF9iYXNlOworCisJdW5zaWduZWQgbGVuOworCXVuc2lnbmVkIGVudHJ5OworCXUzMiB0eF9zdGF0dXM7CisKKwlpZiAodW5saWtlbHkoc2tiLT5sZW4gPiBUWF9CVUZfU0laRSkpIHsKKwkJZXJyID0gLUVNU0dTSVpFOworCQlwcml2LT5zdGF0cy50eF9kcm9wcGVkKys7CisJCWdvdG8gb3V0OworCX0KKworCXNwaW5fbG9ja19iaCgmcHJpdi0+bG9jayk7CisKKwlpZiAodW5saWtlbHkoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkpIHsKKwkJZXJyID0gLUVOT0xJTks7CisJCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCUJVR19PTihwcml2LT50eF9oZWFkIC0gcHJpdi0+dHhfdGFpbCA+PSBOVU1fVFhfREVTQyk7CisKKwllbnRyeSA9IHByaXYtPnR4X2hlYWQrKyAlIE5VTV9UWF9ERVNDOworCisJc2tiX2NvcHlfYW5kX2NzdW1fZGV2KHNrYiwgcHJpdi0+dHhfYnVmcyArIGVudHJ5ICogVFhfQlVGX1NJWkUpOworCisJbGVuID0gc2tiLT5sZW47CisJaWYgKHVubGlrZWx5KGxlbiA8IEVUSF9aTEVOKSkgeworCQltZW1zZXQocHJpdi0+dHhfYnVmcyArIGVudHJ5ICogVFhfQlVGX1NJWkUgKyBsZW4sCisJCQkJMCwgRVRIX1pMRU4gLSBsZW4pOworCQlsZW4gPSBFVEhfWkxFTjsKKwl9CisKKwl3bWIoKTsKKworCWlmIChsZW4gPCAxMDApCisJCXR4X3N0YXR1cyA9IGxlbjsKKwllbHNlIGlmIChsZW4gPCAzMDApCisJCXR4X3N0YXR1cyA9IDB4MzAwMDAgfCBsZW47CisJZWxzZQorCQl0eF9zdGF0dXMgPSAweDUwMDAwIHwgbGVuOworCisJaW93cml0ZTMyKHByaXYtPnR4X2J1ZnNfZG1hX2FkZHIgKyBlbnRyeSAqIFRYX0JVRl9TSVpFLAorCQkJcG9ydF9iYXNlICsgVHhBZGRyMCArIGVudHJ5ICogNCk7CisJaW93cml0ZTMyKHR4X3N0YXR1cywgcG9ydF9iYXNlICsgVHhTdGF0dXMwICsgZW50cnkgKiA0KTsKKwltbWlvd2IoKTsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKHByaXYtPnR4X2hlYWQgLSBwcml2LT50eF90YWlsID49IE5VTV9UWF9ERVNDKQorCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmxvY2spOworCitvdXQ6CisJZGV2X2tmcmVlX3NrYihza2IpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzYzkyMDMxX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcHJpdi0+cGRldjsKKworCXByaXYtPnJ4X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBSWF9CVUZfTEVOLAorCQkJJnByaXYtPnJ4X3JpbmdfZG1hX2FkZHIpOworCWlmICh1bmxpa2VseSghcHJpdi0+cnhfcmluZykpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfYWxsb2NfcnhfcmluZzsKKwl9CisKKwlwcml2LT50eF9idWZzID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgVFhfQlVGX1RPVF9MRU4sCisJCQkmcHJpdi0+dHhfYnVmc19kbWFfYWRkcik7CisJaWYgKHVubGlrZWx5KCFwcml2LT50eF9idWZzKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9hbGxvY190eF9idWZzOworCX0KKwlwcml2LT50eF9oZWFkID0gcHJpdi0+dHhfdGFpbCA9IDA7CisKKwllcnIgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHNjOTIwMzFfaW50ZXJydXB0LAorCQkJU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCWdvdG8gb3V0X3JlcXVlc3RfaXJxOworCisJcHJpdi0+cG1fY29uZmlnID0gMDsKKworCS8qIEludGVycnVwdHMgYWxyZWFkeSBkaXNhYmxlZCBieSBzYzkyMDMxX3N0b3Agb3Igc2M5MjAzMV9wcm9iZSAqLworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisKKwlfc2M5MjAzMV9yZXNldChkZXYpOworCW1taW93YigpOworCisJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXNjOTIwMzFfZW5hYmxlX2ludGVycnVwdHMoZGV2KTsKKworCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJZWxzZQorCQluZXRpZl90eF9kaXNhYmxlKGRldik7CisKKwlyZXR1cm4gMDsKKworb3V0X3JlcXVlc3RfaXJxOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgVFhfQlVGX1RPVF9MRU4sIHByaXYtPnR4X2J1ZnMsCisJCQlwcml2LT50eF9idWZzX2RtYV9hZGRyKTsKK291dF9hbGxvY190eF9idWZzOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfQlVGX0xFTiwgcHJpdi0+cnhfcmluZywKKwkJCXByaXYtPnJ4X3JpbmdfZG1hX2FkZHIpOworb3V0X2FsbG9jX3J4X3Jpbmc6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzYzkyMDMxX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2M5MjAzMV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHByaXYtPnBkZXY7CisKKwluZXRpZl90eF9kaXNhYmxlKGRldik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMsIHN0b3AgVHggYW5kIFJ4LiAqLworCXNjOTIwMzFfZGlzYWJsZV9pbnRlcnJ1cHRzKGRldik7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisJX3NjOTIwMzFfZGlzYWJsZV90eF9yeChkZXYpOworCV9zYzkyMDMxX3R4X2NsZWFyKGRldik7CisJbW1pb3diKCk7CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlmcmVlX2lycShwZGV2LT5pcnEsIGRldik7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBUWF9CVUZfVE9UX0xFTiwgcHJpdi0+dHhfYnVmcywKKwkJCXByaXYtPnR4X2J1ZnNfZG1hX2FkZHIpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgUlhfQlVGX0xFTiwgcHJpdi0+cnhfcmluZywKKwkJCXByaXYtPnJ4X3JpbmdfZG1hX2FkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjOTIwMzFfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlzcGluX2xvY2tfYmgoJnByaXYtPmxvY2spOworCisJX3NjOTIwMzFfc2V0X21hcihkZXYpOworCV9zYzkyMDMxX3NldF9yeF9jb25maWcoZGV2KTsKKwltbWlvd2IoKTsKKworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgc2M5MjAzMV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgYnkgY2xlYXJpbmcgdGhlIGludGVycnVwdCBtYXNrLiovCisJc2M5MjAzMV9kaXNhYmxlX2ludGVycnVwdHMoZGV2KTsKKworCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7CisKKwlwcml2LT50eF90aW1lb3V0cysrOworCisJX3NjOTIwMzFfcmVzZXQoZGV2KTsKKwltbWlvd2IoKTsKKworCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJc2M5MjAzMV9lbmFibGVfaW50ZXJydXB0cyhkZXYpOworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIHNjOTIwMzFfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCWlmIChzYzkyMDMxX2ludGVycnVwdChkZXYtPmlycSwgZGV2KSAhPSBJUlFfTk9ORSkKKwkJc2M5MjAzMV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKWRldik7CisJZW5hYmxlX2lycShkZXYtPmlycSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzYzkyMDMxX2V0aHRvb2xfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqcG9ydF9iYXNlID0gcHJpdi0+cG9ydF9iYXNlOworCXU4IHBoeV9hZGRyZXNzOworCXUzMiBwaHlfY3RybDsKKwl1MTYgb3V0cHV0X3N0YXR1czsKKworCXNwaW5fbG9ja19iaCgmcHJpdi0+bG9jayk7CisKKwlwaHlfYWRkcmVzcyA9IGlvcmVhZDMyKHBvcnRfYmFzZSArIE1paWNtZDEpID4+IDI3OworCXBoeV9jdHJsID0gaW9yZWFkMzIocG9ydF9iYXNlICsgUGh5Q3RybCk7CisKKwlvdXRwdXRfc3RhdHVzID0gX3NjOTIwMzFfbWlpX3JlYWQocG9ydF9iYXNlLCBNSUlfT3V0cHV0U3RhdHVzKTsKKwlfc2M5MjAzMV9taWlfc2Nhbihwb3J0X2Jhc2UpOworCW1taW93YigpOworCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmxvY2spOworCisJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmIHwgU1VQUE9SVEVEXzEwYmFzZVRfRnVsbAorCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsCisJCQl8IFNVUFBPUlRFRF9BdXRvbmVnIHwgU1VQUE9SVEVEX1RQIHwgU1VQUE9SVEVEX01JSTsKKworCWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX1RQIHwgQURWRVJUSVNFRF9NSUk7CisKKwlpZiAoKHBoeV9jdHJsICYgKFBoeUN0cmxEdXggfCBQaHlDdHJsU3BkMTAwIHwgUGh5Q3RybFNwZDEwKSkKKwkJCT09IChQaHlDdHJsRHV4IHwgUGh5Q3RybFNwZDEwMCB8IFBoeUN0cmxTcGQxMCkpCisJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9BdXRvbmVnOworCisJaWYgKChwaHlfY3RybCAmIFBoeUN0cmxTcGQxMCkgPT0gUGh5Q3RybFNwZDEwKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCisJaWYgKChwaHlfY3RybCAmIChQaHlDdHJsU3BkMTAgfCBQaHlDdHJsRHV4KSkKKwkJCT09IChQaHlDdHJsU3BkMTAgfCBQaHlDdHJsRHV4KSkKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKKworCWlmICgocGh5X2N0cmwgJiBQaHlDdHJsU3BkMTAwKSA9PSBQaHlDdHJsU3BkMTAwKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKKworCWlmICgocGh5X2N0cmwgJiAoUGh5Q3RybFNwZDEwMCB8IFBoeUN0cmxEdXgpKQorCQkJPT0gKFBoeUN0cmxTcGQxMDAgfCBQaHlDdHJsRHV4KSkKKwkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisKKwlpZiAocGh5X2N0cmwgJiBQaHlDdHJsQW5lKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKworCWNtZC0+c3BlZWQgPSAob3V0cHV0X3N0YXR1cyAmIDB4MikgPyBTUEVFRF8xMDAgOiBTUEVFRF8xMDsKKwljbWQtPmR1cGxleCA9IChvdXRwdXRfc3RhdHVzICYgMHg0KSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CisJY21kLT5wb3J0ID0gUE9SVF9NSUk7CisJY21kLT5waHlfYWRkcmVzcyA9IHBoeV9hZGRyZXNzOworCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWNtZC0+YXV0b25lZyA9IChwaHlfY3RybCAmIFBoeUN0cmxBbmUpID8gQVVUT05FR19FTkFCTEUgOiBBVVRPTkVHX0RJU0FCTEU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYzkyMDMxX2V0aHRvb2xfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqcG9ydF9iYXNlID0gcHJpdi0+cG9ydF9iYXNlOworCXUzMiBwaHlfY3RybDsKKwl1MzIgb2xkX3BoeV9jdHJsOworCisJaWYgKCEoY21kLT5zcGVlZCA9PSBTUEVFRF8xMCB8fCBjbWQtPnNwZWVkID09IFNQRUVEXzEwMCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghKGNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGIHx8IGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCEoY21kLT5wb3J0ID09IFBPUlRfTUlJKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCEoY21kLT5waHlfYWRkcmVzcyA9PSAweDFmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCEoY21kLT50cmFuc2NlaXZlciA9PSBYQ1ZSX0lOVEVSTkFMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCEoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSB8fCBjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJaWYgKCEoY21kLT5hZHZlcnRpc2luZyAmIChBRFZFUlRJU0VEX0F1dG9uZWcKKwkJCQl8IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbAorCQkJCXwgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmCisJCQkJfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbAorCQkJCXwgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXBoeV9jdHJsID0gUGh5Q3RybEFuZTsKKworCQkvLyBGSVhNRTogSSdtIG5vdCBzdXJlIHdoYXQgdGhlIG9yaWdpbmFsIGNvZGUgd2FzIHRyeWluZyB0byBkbworCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfQXV0b25lZykKKwkJCXBoeV9jdHJsIHw9IFBoeUN0cmxEdXggfCBQaHlDdHJsU3BkMTAwIHwgUGh5Q3RybFNwZDEwOworCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJCXBoeV9jdHJsIHw9IFBoeUN0cmxEdXggfCBQaHlDdHJsU3BkMTAwOworCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJCXBoeV9jdHJsIHw9IFBoeUN0cmxTcGQxMDA7CisJCWlmIChjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCQlwaHlfY3RybCB8PSBQaHlDdHJsU3BkMTAgfCBQaHlDdHJsRHV4OworCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQkJcGh5X2N0cmwgfD0gUGh5Q3RybFNwZDEwOworCX0gZWxzZSB7CisJCS8vIEZJWE1FOiBXaG9sZSBicmFuY2ggZ3Vlc3NlZAorCQlwaHlfY3RybCA9IDA7CisKKwkJaWYgKGNtZC0+c3BlZWQgPT0gU1BFRURfMTApCisJCQlwaHlfY3RybCB8PSBQaHlDdHJsU3BkMTA7CisJCWVsc2UgLyogY21kLT5zcGVlZCA9PSBTUEVFRF8xMDAgKi8KKwkJCXBoeV9jdHJsIHw9IFBoeUN0cmxTcGQxMDA7CisKKwkJaWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJcGh5X2N0cmwgfD0gUGh5Q3RybER1eDsKKwl9CisKKwlzcGluX2xvY2tfYmgoJnByaXYtPmxvY2spOworCisJb2xkX3BoeV9jdHJsID0gaW9yZWFkMzIocG9ydF9iYXNlICsgUGh5Q3RybCk7CisJcGh5X2N0cmwgfD0gb2xkX3BoeV9jdHJsICYgfihQaHlDdHJsQW5lIHwgUGh5Q3RybER1eAorCQkJfCBQaHlDdHJsU3BkMTAwIHwgUGh5Q3RybFNwZDEwKTsKKwlpZiAocGh5X2N0cmwgIT0gb2xkX3BoeV9jdHJsKQorCQlpb3dyaXRlMzIocGh5X2N0cmwsIHBvcnRfYmFzZSArIFBoeUN0cmwpOworCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjOTIwMzFfZXRodG9vbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQoreworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcHJpdi0+cGRldjsKKworCXN0cmNweShkcnZpbmZvLT5kcml2ZXIsIFNDOTIwMzFfTkFNRSk7CisJc3RyY3B5KGRydmluZm8tPnZlcnNpb24sIFNDOTIwMzFfVkVSU0lPTik7CisJc3RyY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwZGV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjOTIwMzFfZXRodG9vbF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCit7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBwcml2LT5wb3J0X2Jhc2U7CisJdTMyIHBtX2NvbmZpZzsKKworCXNwaW5fbG9ja19iaCgmcHJpdi0+bG9jayk7CisJcG1fY29uZmlnID0gaW9yZWFkMzIocG9ydF9iYXNlICsgUE1Db25maWcpOworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5sb2NrKTsKKworCS8vIEZJWE1FOiBHdWVzc2VkCisJd29saW5mby0+c3VwcG9ydGVkID0gV0FLRV9QSFkgfCBXQUtFX01BR0lDCisJCQl8IFdBS0VfVUNBU1QgfCBXQUtFX01DQVNUIHwgV0FLRV9CQ0FTVDsKKwl3b2xpbmZvLT53b2xvcHRzID0gMDsKKworCWlmIChwbV9jb25maWcgJiBQTV9MaW5rVXApCisJCXdvbGluZm8tPndvbG9wdHMgfD0gV0FLRV9QSFk7CisKKwlpZiAocG1fY29uZmlnICYgUE1fTWFnaWMpCisJCXdvbGluZm8tPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKKworCWlmIChwbV9jb25maWcgJiBQTV9XYWtlVXApCisJCS8vIEZJWE1FOiBHdWVzc2VkCisJCXdvbGluZm8tPndvbG9wdHMgfD0gV0FLRV9VQ0FTVCB8IFdBS0VfTUNBU1QgfCBXQUtFX0JDQVNUOworfQorCitzdGF0aWMgaW50IHNjOTIwMzFfZXRodG9vbF9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pCit7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBwcml2LT5wb3J0X2Jhc2U7CisJdTMyIHBtX2NvbmZpZzsKKworCXNwaW5fbG9ja19iaCgmcHJpdi0+bG9jayk7CisKKwlwbV9jb25maWcgPSBpb3JlYWQzMihwb3J0X2Jhc2UgKyBQTUNvbmZpZykKKwkJCSYgfihQTV9MaW5rVXAgfCBQTV9NYWdpYyB8IFBNX1dha2VVcCk7CisKKwlpZiAod29saW5mby0+d29sb3B0cyAmIFdBS0VfUEhZKQorCQlwbV9jb25maWcgfD0gUE1fTGlua1VwOworCisJaWYgKHdvbGluZm8tPndvbG9wdHMgJiBXQUtFX01BR0lDKQorCQlwbV9jb25maWcgfD0gUE1fTWFnaWM7CisKKwkvLyBGSVhNRTogR3Vlc3NlZAorCWlmICh3b2xpbmZvLT53b2xvcHRzICYgKFdBS0VfVUNBU1QgfCBXQUtFX01DQVNUIHwgV0FLRV9CQ0FTVCkpCisJCXBtX2NvbmZpZyB8PSBQTV9XYWtlVXA7CisKKwlwcml2LT5wbV9jb25maWcgPSBwbV9jb25maWc7CisJaW93cml0ZTMyKHBtX2NvbmZpZywgcG9ydF9iYXNlICsgUE1Db25maWcpOworCW1taW93YigpOworCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2M5MjAzMV9ldGh0b29sX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3Qgc2M5MjAzMV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfYmFzZSA9IHByaXYtPnBvcnRfYmFzZTsKKwl1MTYgYm1jcjsKKworCXNwaW5fbG9ja19iaCgmcHJpdi0+bG9jayk7CisKKwlibWNyID0gX3NjOTIwMzFfbWlpX3JlYWQocG9ydF9iYXNlLCBNSUlfQk1DUik7CisJaWYgKCEoYm1jciAmIEJNQ1JfQU5FTkFCTEUpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCV9zYzkyMDMxX21paV93cml0ZShwb3J0X2Jhc2UsIE1JSV9CTUNSLCBibWNyIHwgQk1DUl9BTlJFU1RBUlQpOworCitvdXQ6CisJX3NjOTIwMzFfbWlpX3NjYW4ocG9ydF9iYXNlKTsKKwltbWlvd2IoKTsKKworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHNjOTIwMzFfZXRodG9vbF9zdGF0c19zdHJpbmdzW1NJTEFOX1NUQVRTX05VTV1bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkidHhfdGltZW91dCIsCisJInJ4X2xvc3MiLAorfTsKKworc3RhdGljIHZvaWQgc2M5MjAzMV9ldGh0b29sX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworCWlmIChzdHJpbmdzZXQgPT0gRVRIX1NTX1NUQVRTKQorCQltZW1jcHkoZGF0YSwgc2M5MjAzMV9ldGh0b29sX3N0YXRzX3N0cmluZ3MsCisJCQkJU0lMQU5fU1RBVFNfTlVNICogRVRIX0dTVFJJTkdfTEVOKTsKK30KKworc3RhdGljIGludCBzYzkyMDMxX2V0aHRvb2xfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIFNJTEFOX1NUQVRTX05VTTsKK30KKworc3RhdGljIHZvaWQgc2M5MjAzMV9ldGh0b29sX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKQoreworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5sb2NrKTsKKwlkYXRhWzBdID0gcHJpdi0+dHhfdGltZW91dHM7CisJZGF0YVsxXSA9IHByaXYtPnJ4X2xvc3M7CisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHNjOTIwMzFfZXRodG9vbF9vcHMgPSB7CisJLmdldF9zZXR0aW5ncwkJPSBzYzkyMDMxX2V0aHRvb2xfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gc2M5MjAzMV9ldGh0b29sX3NldF9zZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JCT0gc2M5MjAzMV9ldGh0b29sX2dldF9kcnZpbmZvLAorCS5nZXRfd29sCQk9IHNjOTIwMzFfZXRodG9vbF9nZXRfd29sLAorCS5zZXRfd29sCQk9IHNjOTIwMzFfZXRodG9vbF9zZXRfd29sLAorCS5ud2F5X3Jlc2V0CQk9IHNjOTIwMzFfZXRodG9vbF9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfdHhfY3N1bQkJPSBldGh0b29sX29wX2dldF90eF9jc3VtLAorCS5nZXRfc2cJCQk9IGV0aHRvb2xfb3BfZ2V0X3NnLAorCS5nZXRfdHNvCQk9IGV0aHRvb2xfb3BfZ2V0X3RzbywKKwkuZ2V0X3N0cmluZ3MJCT0gc2M5MjAzMV9ldGh0b29sX2dldF9zdHJpbmdzLAorCS5nZXRfc3RhdHNfY291bnQJPSBzYzkyMDMxX2V0aHRvb2xfZ2V0X3N0YXRzX2NvdW50LAorCS5nZXRfZXRodG9vbF9zdGF0cwk9IHNjOTIwMzFfZXRodG9vbF9nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3Blcm1fYWRkcgkJPSBldGh0b29sX29wX2dldF9wZXJtX2FkZHIsCisJLmdldF91Zm8JCT0gZXRodG9vbF9vcF9nZXRfdWZvLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgc2M5MjAzMV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCBlcnI7CisJdm9pZCBfX2lvbWVtKiBwb3J0X2Jhc2U7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc2M5MjAzMV9wcml2ICpwcml2OworCXUzMiBtYWMwLCBtYWMxOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHVubGlrZWx5KGVyciA8IDApKQorCQlnb3RvIG91dF9lbmFibGVfZGV2aWNlOworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwlpZiAodW5saWtlbHkoZXJyIDwgMCkpCisJCWdvdG8gb3V0X3NldF9kbWFfbWFzazsKKworCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJaWYgKHVubGlrZWx5KGVyciA8IDApKQorCQlnb3RvIG91dF9zZXRfZG1hX21hc2s7CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIFNDOTIwMzFfTkFNRSk7CisJaWYgKHVubGlrZWx5KGVyciA8IDApKQorCQlnb3RvIG91dF9yZXF1ZXN0X3JlZ2lvbnM7CisKKwlwb3J0X2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgU0M5MjAzMV9VU0VfQkFSLCAwKTsKKwlpZiAodW5saWtlbHkoIXBvcnRfYmFzZSkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXRfaW9tYXA7CisJfQorCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzYzkyMDMxX3ByaXYpKTsKKwlpZiAodW5saWtlbHkoIWRldikpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfYWxsb2NfZXRoZXJkZXY7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKyNpZiBTQzkyMDMxX1VTRV9CQVIgPT0gMAorCWRldi0+bWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFNDOTIwMzFfVVNFX0JBUik7CisJZGV2LT5tZW1fZW5kID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCBTQzkyMDMxX1VTRV9CQVIpOworI2VsaWYgU0M5MjAzMV9VU0VfQkFSID09IDEKKwlkZXYtPmJhc2VfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBTQzkyMDMxX1VTRV9CQVIpOworI2VuZGlmCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisKKwkvKiBmYWtlZCB3aXRoIHNrYl9jb3B5X2FuZF9jc3VtX2RldiAqLworCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9ISUdIRE1BOworCisJZGV2LT5nZXRfc3RhdHMJCT0gc2M5MjAzMV9nZXRfc3RhdHM7CisJZGV2LT5ldGh0b29sX29wcwk9ICZzYzkyMDMxX2V0aHRvb2xfb3BzOworCWRldi0+aGFyZF9zdGFydF94bWl0CT0gc2M5MjAzMV9zdGFydF94bWl0OworCWRldi0+d2F0Y2hkb2dfdGltZW8JPSBUWF9USU1FT1VUOworCWRldi0+b3BlbgkJPSBzYzkyMDMxX29wZW47CisJZGV2LT5zdG9wCQk9IHNjOTIwMzFfc3RvcDsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdAk9IHNjOTIwMzFfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+dHhfdGltZW91dAkJPSBzYzkyMDMxX3R4X3RpbWVvdXQ7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwlkZXYtPnBvbGxfY29udHJvbGxlcgk9IHNjOTIwMzFfcG9sbF9jb250cm9sbGVyOworI2VuZGlmCisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJcHJpdi0+cG9ydF9iYXNlID0gcG9ydF9iYXNlOworCXByaXYtPnBkZXYgPSBwZGV2OworCXRhc2tsZXRfaW5pdCgmcHJpdi0+dGFza2xldCwgc2M5MjAzMV90YXNrbGV0LCAodW5zaWduZWQgbG9uZylkZXYpOworCS8qIEZ1ZGdlIHRhc2tsZXQgY291bnQgc28gdGhlIGNhbGwgdG8gc2M5MjAzMV9lbmFibGVfaW50ZXJydXB0cyBhdAorCSAqIHNjOTIwMzFfb3BlbiB3aWxsIHdvcmsgY29ycmVjdGx5ICovCisJdGFza2xldF9kaXNhYmxlX25vc3luYygmcHJpdi0+dGFza2xldCk7CisKKwkvKiBQQ0kgUE0gV2FrZXVwICovCisJaW93cml0ZTMyKCh+UE1fTG9uZ1dGICYgflBNX0xXUFROKSB8IFBNX0VuYWJsZSwgcG9ydF9iYXNlICsgUE1Db25maWcpOworCisJbWFjMCA9IGlvcmVhZDMyKHBvcnRfYmFzZSArIE1BQzApOworCW1hYzEgPSBpb3JlYWQzMihwb3J0X2Jhc2UgKyBNQUMwICsgNCk7CisJZGV2LT5kZXZfYWRkclswXSA9IGRldi0+cGVybV9hZGRyWzBdID0gbWFjMCA+PiAyNDsKKwlkZXYtPmRldl9hZGRyWzFdID0gZGV2LT5wZXJtX2FkZHJbMV0gPSBtYWMwID4+IDE2OworCWRldi0+ZGV2X2FkZHJbMl0gPSBkZXYtPnBlcm1fYWRkclsyXSA9IG1hYzAgPj4gODsKKwlkZXYtPmRldl9hZGRyWzNdID0gZGV2LT5wZXJtX2FkZHJbM10gPSBtYWMwOworCWRldi0+ZGV2X2FkZHJbNF0gPSBkZXYtPnBlcm1fYWRkcls0XSA9IG1hYzEgPj4gODsKKwlkZXYtPmRldl9hZGRyWzVdID0gZGV2LT5wZXJtX2FkZHJbNV0gPSBtYWMxOworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X3JlZ2lzdGVyX25ldGRldjsKKworCXJldHVybiAwOworCitvdXRfcmVnaXN0ZXJfbmV0ZGV2OgorCWZyZWVfbmV0ZGV2KGRldik7CitvdXRfYWxsb2NfZXRoZXJkZXY6CisJcGNpX2lvdW5tYXAocGRldiwgcG9ydF9iYXNlKTsKK291dF9pb21hcDoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworb3V0X3JlcXVlc3RfcmVnaW9uczoKK291dF9zZXRfZG1hX21hc2s6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0X2VuYWJsZV9kZXZpY2U6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNjOTIwMzFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtKiBwb3J0X2Jhc2UgPSBwcml2LT5wb3J0X2Jhc2U7CisKKwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCWZyZWVfbmV0ZGV2KGRldik7CisJcGNpX2lvdW5tYXAocGRldiwgcG9ydF9iYXNlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworc3RhdGljIGludCBzYzkyMDMxX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzYzkyMDMxX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJZ290byBvdXQ7CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMsIHN0b3AgVHggYW5kIFJ4LiAqLworCXNjOTIwMzFfZGlzYWJsZV9pbnRlcnJ1cHRzKGRldik7CisKKwlzcGluX2xvY2soJnByaXYtPmxvY2spOworCisJX3NjOTIwMzFfZGlzYWJsZV90eF9yeChkZXYpOworCV9zYzkyMDMxX3R4X2NsZWFyKGRldik7CisJbW1pb3diKCk7CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKK291dDoKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjOTIwMzFfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNjOTIwMzFfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJZ290byBvdXQ7CisKKwkvKiBJbnRlcnJ1cHRzIGFscmVhZHkgZGlzYWJsZWQgYnkgc2M5MjAzMV9zdXNwZW5kICovCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCV9zYzkyMDMxX3Jlc2V0KGRldik7CisJbW1pb3diKCk7CisKKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisJc2M5MjAzMV9lbmFibGVfaW50ZXJydXB0cyhkZXYpOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCWVsc2UKKwkJbmV0aWZfdHhfZGlzYWJsZShkZXYpOworCitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzYzkyMDMxX3BjaV9kZXZpY2VfaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NJTEFOLCBQQ0lfREVWSUNFX0lEX1NJTEFOX1NDOTIwMzEpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0lMQU4sIFBDSV9ERVZJQ0VfSURfU0lMQU5fODEzOUQpIH0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNjOTIwMzFfcGNpX2RldmljZV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzYzkyMDMxX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gU0M5MjAzMV9OQU1FLAorCS5pZF90YWJsZQk9IHNjOTIwMzFfcGNpX2RldmljZV9pZF90YWJsZSwKKwkucHJvYmUJCT0gc2M5MjAzMV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNjOTIwMzFfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IHNjOTIwMzFfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNjOTIwMzFfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2M5MjAzMV9pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBTQzkyMDMxX0RFU0NSSVBUSU9OICIgIiBTQzkyMDMxX1ZFUlNJT04gIlxuIik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNjOTIwMzFfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzYzkyMDMxX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNjOTIwMzFfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNjOTIwMzFfaW5pdCk7Cittb2R1bGVfZXhpdChzYzkyMDMxX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDZXNhciBFZHVhcmRvIEJhcnJvcyA8Y2VzYXJiQGNlc2FyYi5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oU0M5MjAzMV9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihTQzkyMDMxX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tfbWNhLmMgYi9kcml2ZXJzL25ldC9za19tY2EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlMDZjNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9za19tY2EuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMTYgKzAsMCBAQAotLyoKLW5ldC0zLWRyaXZlciBmb3IgdGhlIFNLTkVUIE1DQS1iYXNlZCBjYXJkcwotCi1UaGlzIGlzIGFuIGV4dGVuc2lvbiB0byB0aGUgTGludXggb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGlzIGNvdmVyZWQgYnkgdGhlCi1zYW1lIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoYXQgY292ZXJzIHRoYXQgd29yay4KLQotQ29weXJpZ2h0IDE5OTkgYnkgQWxmcmVkIEFybm9sZCAoYWxmcmVkQGNjYWMucnd0aC1hYWNoZW4uZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGZyZWQuYXJub2xkQGxhbmNvbS5kZSkKLQotVGhpcyBkcml2ZXIgaXMgYmFzZWQgYm90aCBvbiB0aGUgM0M1MjMgZHJpdmVyIGFuZCB0aGUgU0tfRzE2IGRyaXZlci4KLQotcGFwZXIgc291cmNlczoKLSAgJ1BDIEhhcmR3YXJlOiBBdWZiYXUsIEZ1bmt0aW9uc3dlaXNlLCBQcm9ncmFtbWllcnVuZycgYnkKLSAgSGFucy1QZXRlciBNZXNzbWVyIGZvciB0aGUgYmFzaWMgTWljcm9jaGFubmVsIHN0dWZmCi0KLSAgJ0xpbnV4IEdlcmFldGV0cmVpYmVyJyBieSBBbGxlc2FuZHJvIFJ1YmluaSwgS2FsbGUgRGFsaGVpbWVyCi0gIGZvciBoZWxwIG9uIEV0aGVybmV0IGRyaXZlciBwcm9ncmFtbWluZwotCi0gICdFdGhlcm5ldC9JRUVFIDgwMi4zIEZhbWlseSAxOTkyIFdvcmxkIE5ldHdvcmsgRGF0YSBCb29rL0hhbmRib29rJyBieSBBTUQKLSAgZm9yIGRvY3VtZW50YXRpb24gb24gdGhlIEFNNzk5MCBMQU5DRQotCi0gICdTS05FVCBQZXJzb25hbCBUZWNobmlzY2hlcyBNYW51YWwnLCBWZXJzaW9uIDEuMiBieSBTY2huZWlkZXImS29jaAotICBmb3IgZG9jdW1lbnRhdGlvbiBvbiB0aGUgSnVuaW9yIGJvYXJkCi0KLSAgJ1NLLU5FVCBNQzIrIFRlY2huaWNhbCBNYW51YWwiLCBWZXJzaW9uIDEuMSBieSBTY2huZWlkZXImS29jaCBmb3IKLSAgZG9jdW1lbnRhdGlvbiBvbiB0aGUgTUMyIGJvcmQKLQotICBBIGJpZyB0aGFuayB5b3UgdG8gdGhlIFMmSyBzdXBwb3J0IGZvciBwcm92aWRpbmcgbWUgc28gcXVpY2tseSB3aXRoCi0gIGRvY3VtZW50YXRpb24hCi0KLSAgQWxzbyBzZWUgaHR0cDovL3d3dy5zeXNrb25uZWN0LmNvbS8KLQotICBNaXNzaW5nIHRoaW5nczoKLQotICAtPiBzZXQgZGVidWcgbGV2ZWwgdmlhIGlvY3RsIGluc3RlYWQgb2YgY29tcGlsZS10aW1lIHN3aXRjaGVzCi0gIC0+IEkgZGlkbid0IGZvbGxvdyB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIDIuMS54IGtlcm5lbHMsIHNvIG15Ci0gICAgIGFzc3VtcHRpb25zIGFib3V0IHdoaWNoIHRoaW5ncyBjaGFuZ2VkIHdpdGggd2hpY2gga2VybmVsIHZlcnNpb24KLSAgICAgYXJlIHByb2JhYmx5IG5vbnNlbnNlCi0KLUhpc3Rvcnk6Ci0gIE1heSAxNnRoLCAxOTk5Ci0gIAlzdGFydHVwCi0gIE1heSAyMnN0LCAxOTk5Ci0JYWRkZWQgcHJpdmF0ZSBzdHJ1Y3R1cmUsIG1ldGhvZHMKLSAgICAgICAgYmVndW4gYnVpbGRpbmcgZGF0YSBzdHJ1Y3R1cmVzIGluIFJBTQotICBNYXkgMjNuZCwgMTk5OQotCWNhbiByZWNlaXZlIGZyYW1lcywgc2VuZCBmcmFtZXMKLSAgTWF5IDI0dGgsIDE5OTkKLSAgICAgICAgbW9kdWxhcml6ZWQgaW5pdGlhbGl6YXRpb24gb2YgTEFOQ0UKLSAgICAgICAgbG9hZGFibGUgYXMgbW9kdWxlCi0Jc3RpbGwgVHggcHJvYmxlbSA6LSgKLSAgTWF5IDI2dGgsIDE5OTkKLSAgCU1DMiB3b3JrcwotICAJc3VwcG9ydCBmb3IgbXVsdGlwbGUgZGV2aWNlcwotICAJZGlzcGxheSBtZWRpYSB0eXBlIGZvciBNQzIrCi0gIE1heSAyOHRoLCAxOTk5Ci0JZml4ZWQgcHJvYmxlbSBpbiBHZXRMQU5DRSBsZWF2aW5nIGludGVycnVwdHMgdHVybmVkIG9mZgotICAgICAgICBpbmNyZWFzZSBUWCBxdWV1ZSB0byA0IHBhY2tldHMgdG8gaW1wcm92ZSBzZW5kIHBlcmZvcm1hbmNlCi0gIE1heSAyOXRoLCAxOTk5Ci0JYSBmZXcgY29ycmVjdGlvbnMgaW4gc3RhdGlzdGljcywgY2F1Z2h0IHJjdnIgb3ZlcnJ1bnMKLSAgICAgICAgcmVpbml0aWFsaXphdGlvbiBvZiBMQU5DRS9ib2FyZCBpbiBjcml0aWNhbCBzaXR1YXRpb25zCi0gICAgICAgIE1DQSBpbmZvIGltcGxlbWVudGVkCi0JaW1wbGVtZW50ZWQgTEFOQ0UgbXVsdGljYXN0IGZpbHRlcgotICBKdW4gNnRoLCAxOTk5Ci0JYWRkaXRpb25zIGZvciBMaW51eCAyLjIKLSAgRGVjIDI1dGgsIDE5OTkKLSAgCXVuZm9ydHVuYXRlbHkgdGhlcmUgc2VlbSB0byBiZSBuZXdlciBNQzIrIGJvYXJkcyB0aGF0IHJlYWN0Ci0gIAlvbiBJUlEgMy81LzkvMTAgaW5zdGVhZCBvZiAzLzUvMTAvMTEsIHNvIHdlIGhhdmUgdG8gYXV0b3Byb2JlCi0gIAlpbiBxdWVzdGlvbmFibGUgY2FzZXMuLi4KLSAgRGVjIDI4dGgsIDE5OTkKLQlpbnRlZ3JhdGVkIHBhdGNoZXMgZnJvbSBEYXZpZCBXZWluZWhhbGwgJiBCaWxsIFdlbmRsaW5nIGZvciAyLjMKLQlrZXJuZWxzIChpc2FfLi4uZnVuY3Rpb25zKS4gIFRoaW5ncyBhcmUgZGVmaW5lZCBpbiBhIHdheSB0aGF0Ci0gICAgICAgIGl0IHN0aWxsIHdvcmtzIHdpdGggMi4wLnggOC0pCi0gIERlYyAzMHRoLCAxOTk5Ci0JYWRkZWQgaGFuZGxpbmcgb2YgdGhlIHJlbWFpbmluZyBpbnRlcnJ1cHQgY29uZGl0aW9ucy4gIFRoYXQKLSAgICAgICAgc2hvdWxkIGN1cmUgdGhlIHNwdXJpb3VzIGhhbmdzLgotICBKYW4gMzB0aCwgMjAwMAotCW5ld2VyIGtlcm5lbHMgYXV0b21hdGljYWxseSBwcm9iZSBtb3JlIHRoYW4gb25lIGJvYXJkLCBzbyB0aGUKLQknc3RhcnRzbG90JyBhcyBhIHZhcmlhYmxlIGlzIGFsc28gbmVlZGVkIGhlcmUKLSAgSnVuZSAxc3QsIDIwMDAKLQlhZGRlZCBjaGFuZ2VzIGZvciByZWNlbnQgMi4zIGtlcm5lbHMKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9tY2EtbGVnYWN5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNkZWZpbmUgX1NLX01DQV9EUklWRVJfCi0jaW5jbHVkZSAic2tfbWNhLmgiCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogZ2xvYmFsIHN0YXRpYyBkYXRhIC0gbm90IG1vcmUgc2luY2Ugd2UgY2FuIGhhbmRsZSBtdWx0aXBsZSBib2FyZHMgYW5kCi0gKiBoYXZlIHRvIHBhY2sgYWxsIHN0YXRlIGluZm8gaW50byB0aGUgZGV2aWNlIHN0cnVjdCEKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgY2hhciAqTWVkaWFOYW1lc1tNZWRpYV9Db3VudF0gPQotICAgIHsgIjEwQmFzZTIiLCAiMTBCYXNlVCIsICIxMEJhc2U1IiwgIlVua25vd24iIH07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBvbHlbXSA9Ci0gICAgeyAxLCAxLCAxLCAwLCAxLCAxLCAwLCAxLCAxLCAwLCAxLCAxLCAxLCAwLCAwLCAwLAotCTEsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAKLX07Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogcHJpdmF0ZSBzdWJmdW5jdGlvbnMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBkdW1wIHBhcnRzIG9mIHNoYXJlZCBtZW1vcnkgLSBvbmx5IG5lZWRlZCBkdXJpbmcgZGVidWdnaW5nICovCi0KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgZHVtcG1lbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RhcnQsIHUzMiBsZW4pCi17Ci0Jc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHo7Ci0KLQlmb3IgKHogPSAwOyB6IDwgbGVuOyB6KyspIHsKLQkJaWYgKCh6ICYgMTUpID09IDApCi0JCQlwcmludGsoIiUwNHg6Iiwgeik7Ci0JCXByaW50aygiICUwMngiLCByZWFkYihwcml2LT5iYXNlICsgc3RhcnQgKyB6KSk7Ci0JCWlmICgoeiAmIDE1KSA9PSAxNSkKLQkJCXByaW50aygiXG4iKTsKLQl9Ci19Ci0KLS8qIHByaW50IGV4YWN0IHRpbWUgLSBkaXR0byAqLwotCi1zdGF0aWMgdm9pZCBQclRpbWUodm9pZCkKLXsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKLQotCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCXByaW50aygiJTlkOiUwNmQ6ICIsIHR2LnR2X3NlYywgdHYudHZfdXNlYyk7Ci19Ci0jZW5kaWYKLQotLyogZGVkdWNlIHJlc291cmNlcyBvdXQgb2YgUE9TIHJlZ2lzdGVycyAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2V0YWRkcnMoaW50IHNsb3QsIGludCBqdW5pb3IsIGludCAqYmFzZSwgaW50ICppcnEsCi0JCSAgICAgc2ttY2FfbWVkaXVtICogbWVkaXVtKQotewotCXVfY2hhciBwb3MwLCBwb3MxLCBwb3MyOwotCi0JaWYgKGp1bmlvcikgewotCQlwb3MwID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAyKTsKLQkJKmJhc2UgPSAoKHBvczAgJiAweDBlKSA8PCAxMykgKyAweGMwMDAwOwotCQkqaXJxID0gKChwb3MwICYgMHgxMCkgPj4gNCkgKyAxMDsKLQkJKm1lZGl1bSA9IE1lZGlhX1Vua25vd247Ci0JfSBlbHNlIHsKLQkJLyogcmVzZXQgUE9TIDEwNCBCaXRzIDArMSBzbyB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24gZ29lcyB0byB0aGUKLQkJICAgY29uZmlndXJlZCBhcmVhIGJldHdlZW4gNjQwSyBhbmQgMU0uICBBZnRlcndhcmRzLCBlbmFibGUgdGhlIE1DMi4KLQkJICAgSSByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHJvZGUgU0sgdG8gZG8gdGhpcy4uLiAqLwotCi0JCW1jYV93cml0ZV9wb3Moc2xvdCwgNCwKLQkJCSAgICAgIG1jYV9yZWFkX3N0b3JlZF9wb3Moc2xvdCwgNCkgJiAweGZjKTsKLQkJbWNhX3dyaXRlX3BvcyhzbG90LCAyLAotCQkJICAgICAgbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAyKSB8IDB4MDEpOwotCi0JCXBvczEgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDMpOwotCQlwb3MyID0gbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCA0KTsKLQkJKmJhc2UgPSAoKHBvczEgJiAweDA3KSA8PCAxNCkgKyAweGMwMDAwOwotCQlzd2l0Y2ggKHBvczIgJiAweDBjKSB7Ci0JCWNhc2UgMDoKLQkJCSppcnEgPSAzOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCSppcnEgPSA1OwotCQkJYnJlYWs7Ci0JCWNhc2UgODoKLQkJCSppcnEgPSAtMTA7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJCSppcnEgPSAtMTE7Ci0JCQlicmVhazsKLQkJfQotCQkqbWVkaXVtID0gKHBvczIgPj4gNikgJiAzOwotCX0KLX0KLQotLyogY2hlY2sgZm9yIGJvdGggY2FyZHM6Ci0gICBXaGVuIHRoZSBNQzIgaXMgdHVybmVkIG9mZiwgaXQgd2FzIGNvbmZpZ3VyZWQgZm9yIG1vcmUgdGhhbiAxNU1CIFJBTSwKLSAgIGlzIGRpc2FibGVkIGFuZCB3b24ndCBnZXQgZGV0ZWN0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIHByb2JlLiAgV2UKLSAgIHRoZXJlZm9yZSBoYXZlIHRvIHNjYW4gdGhlIHNsb3RzIG1hbnVhbGx5IDotKCAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBkb2ZpbmQoaW50ICpqdW5pb3IsIGludCBmaXJzdHNsb3QpCi17Ci0JaW50IHNsb3Q7Ci0JdW5zaWduZWQgaW50IGlkOwotCi0JZm9yIChzbG90ID0gZmlyc3RzbG90OyBzbG90IDwgTUNBX01BWF9TTE9UX05SOyBzbG90KyspIHsKLQkJaWQgPSBtY2FfcmVhZF9zdG9yZWRfcG9zKHNsb3QsIDApCi0JCSAgICArICgoKHVuc2lnbmVkIGludCkgbWNhX3JlYWRfc3RvcmVkX3BvcyhzbG90LCAxKSkgPDwgOCk7Ci0KLQkJKmp1bmlvciA9IDA7Ci0JCWlmIChpZCA9PSBTS05FVF9NQ0FfSUQpCi0JCQlyZXR1cm4gc2xvdDsKLQkJKmp1bmlvciA9IDE7Ci0JCWlmIChpZCA9PSBTS05FVF9KVU5JT1JfTUNBX0lEKQotCQkJcmV0dXJuIHNsb3Q7Ci0JfQotCXJldHVybiBNQ0FfTk9URk9VTkQ7Ci19Ci0KLS8qIHJlc2V0IHRoZSB3aG9sZSBib2FyZCAqLwotCi1zdGF0aWMgdm9pZCBSZXNldEJvYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQl3cml0ZWIoQ1RSTF9SRVNFVF9PTiwgcHJpdi0+Y3RybGFkZHIpOwotCXVkZWxheSgxMCk7Ci0Jd3JpdGViKENUUkxfUkVTRVRfT0ZGLCBwcml2LT5jdHJsYWRkcik7Ci19Ci0KLS8qIHdhaXQgZm9yIExBTkNFIGludGVyZmFjZSB0byBiZWNvbWUgbm90IGJ1c3kgKi8KLQotc3RhdGljIGludCBXYWl0TEFOQ0Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgdCA9IDA7Ci0KLQl3aGlsZSAoKHJlYWRiKHByaXYtPmN0cmxhZGRyKSAmIFNUQVRfSU9fQlVTWSkgPT0KLQkgICAgICAgU1RBVF9JT19CVVNZKSB7Ci0JCXVkZWxheSgxKTsKLQkJaWYgKCsrdCA+IDEwMDApIHsKLQkJCXByaW50aygiJXM6IExBTkNFIGFjY2VzcyB0aW1lb3V0IiwgZGV2LT5uYW1lKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIHNldCBMQU5DRSByZWdpc3RlciAtIG11c3QgYmUgYXRvbWljICovCi0KLXN0YXRpYyB2b2lkIFNldExBTkNFKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBhZGRyLCB1MTYgdmFsdWUpCi17Ci0Jc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIHdhaXQgdW50aWwgbm8gdHJhbnNmZXIgaXMgcGVuZGluZyAqLwotCi0JV2FpdExBTkNFKGRldik7Ci0KLQkvKiB0cmFuc2ZlciByZWdpc3RlciBhZGRyZXNzIHRvIFJBUCAqLwotCi0Jd3JpdGViKENUUkxfUkVTRVRfT0ZGIHwgQ1RSTF9SV19XUklURSB8IENUUkxfQURSX1JBUCwgcHJpdi0+Y3RybGFkZHIpOwotCXdyaXRldyhhZGRyLCBwcml2LT5pb3JlZ2FkZHIpOwotCXdyaXRlYihJT0NNRF9HTywgcHJpdi0+Y21kYWRkcik7Ci0JdWRlbGF5KDEpOwotCVdhaXRMQU5DRShkZXYpOwotCi0JLyogdHJhbnNmZXIgZGF0YSB0byByZWdpc3RlciAqLwotCi0Jd3JpdGViKENUUkxfUkVTRVRfT0ZGIHwgQ1RSTF9SV19XUklURSB8IENUUkxfQURSX0RBVEEsIHByaXYtPmN0cmxhZGRyKTsKLQl3cml0ZXcodmFsdWUsIHByaXYtPmlvcmVnYWRkcik7Ci0Jd3JpdGViKElPQ01EX0dPLCBwcml2LT5jbWRhZGRyKTsKLQl1ZGVsYXkoMSk7Ci0JV2FpdExBTkNFKGRldik7Ci0KLQkvKiByZWVuYWJsZSBpbnRlcnJ1cHRzICovCi0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIGdldCBMQU5DRSByZWdpc3RlciAqLwotCi1zdGF0aWMgdTE2IEdldExBTkNFKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBhZGRyKQotewotCXNrbWNhX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IHJlczsKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIHdhaXQgdW50aWwgbm8gdHJhbnNmZXIgaXMgcGVuZGluZyAqLwotCi0JV2FpdExBTkNFKGRldik7Ci0KLQkvKiB0cmFuc2ZlciByZWdpc3RlciBhZGRyZXNzIHRvIFJBUCAqLwotCi0Jd3JpdGViKENUUkxfUkVTRVRfT0ZGIHwgQ1RSTF9SV19XUklURSB8IENUUkxfQURSX1JBUCwgcHJpdi0+Y3RybGFkZHIpOwotCXdyaXRldyhhZGRyLCBwcml2LT5pb3JlZ2FkZHIpOwotCXdyaXRlYihJT0NNRF9HTywgcHJpdi0+Y21kYWRkcik7Ci0JdWRlbGF5KDEpOwotCVdhaXRMQU5DRShkZXYpOwotCi0JLyogdHJhbnNmZXIgZGF0YSBmcm9tIHJlZ2lzdGVyICovCi0KLQl3cml0ZWIoQ1RSTF9SRVNFVF9PRkYgfCBDVFJMX1JXX1JFQUQgfCBDVFJMX0FEUl9EQVRBLCBwcml2LT5jdHJsYWRkcik7Ci0Jd3JpdGViKElPQ01EX0dPLCBwcml2LT5jbWRhZGRyKTsKLQl1ZGVsYXkoMSk7Ci0JV2FpdExBTkNFKGRldik7Ci0JcmVzID0gcmVhZHcocHJpdi0+aW9yZWdhZGRyKTsKLQotCS8qIHJlZW5hYmxlIGludGVycnVwdHMgKi8KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLS8qIGJ1aWxkIHVwIGRlc2NyaXB0b3JzIGluIHNoYXJlZCBSQU0gKi8KLQotc3RhdGljIHZvaWQgSW5pdERzY3JzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JdTMyIGJ1ZmFkZHI7Ci0KLQkvKiBTZXQgdXAgVHggZGVzY3JpcHRvcnMuIFRoZSBib2FyZCBoYXMgb25seSAxNksgUkFNIHNvIGJpdHMgMTYuLjIzCi0JICAgYXJlIGFsd2F5cyAwLiAqLwotCi0JYnVmYWRkciA9IFJBTV9EQVRBQkFTRTsKLQl7Ci0JCUxBTkNFX1R4RGVzY3IgZGVzY3I7Ci0JCWludCB6OwotCi0JCWZvciAoeiA9IDA7IHogPCBUWENPVU5UOyB6KyspIHsKLQkJCWRlc2NyLkxvd0FkZHIgPSBidWZhZGRyOwotCQkJZGVzY3IuRmxhZ3MgPSAwOwotCQkJZGVzY3IuTGVuID0gMHhmMDAwOwotCQkJZGVzY3IuU3RhdHVzID0gMDsKLQkJCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBSQU1fVFhCQVNFICsKLQkJCQkgICAoeiAqIHNpemVvZihMQU5DRV9UeERlc2NyKSksICZkZXNjciwKLQkJCQkgICBzaXplb2YoTEFOQ0VfVHhEZXNjcikpOwotCQkJbWVtc2V0X2lvKHByaXYtPmJhc2UgKyBidWZhZGRyLCAwLCBSQU1fQlVGU0laRSk7Ci0JCQlidWZhZGRyICs9IFJBTV9CVUZTSVpFOwotCQl9Ci0JfQotCi0JLyogZG8gdGhlIHNhbWUgZm9yIHRoZSBSeCBkZXNjcmlwdG9ycyAqLwotCi0JewotCQlMQU5DRV9SeERlc2NyIGRlc2NyOwotCQlpbnQgejsKLQotCQlmb3IgKHogPSAwOyB6IDwgUlhDT1VOVDsgeisrKSB7Ci0JCQlkZXNjci5Mb3dBZGRyID0gYnVmYWRkcjsKLQkJCWRlc2NyLkZsYWdzID0gUlhEU0NSX0ZMQUdTX09XTjsKLQkJCWRlc2NyLk1heExlbiA9IC1SQU1fQlVGU0laRTsKLQkJCWRlc2NyLkxlbiA9IDA7Ci0JCQltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgUkFNX1JYQkFTRSArCi0JCQkJICAgKHogKiBzaXplb2YoTEFOQ0VfUnhEZXNjcikpLCAmZGVzY3IsCi0JCQkJICAgc2l6ZW9mKExBTkNFX1J4RGVzY3IpKTsKLQkJCW1lbXNldF9pbyhwcml2LT5iYXNlICsgYnVmYWRkciwgMCwgUkFNX0JVRlNJWkUpOwotCQkJYnVmYWRkciArPSBSQU1fQlVGU0laRTsKLQkJfQotCX0KLX0KLQotLyogY2FsY3VsYXRlIHRoZSBoYXNoIGJpdCBwb3NpdGlvbiBmb3IgYSBnaXZlbiBtdWx0aWNhc3QgYWRkcmVzcwotICAgdGFrZW4gbW9yZSBvciBsZXNzIGRpcmVjdGx5IGZyb20gdGhlIEFNRCBkYXRhc2hlZXQuLi4gKi8KLQotc3RhdGljIHZvaWQgVXBkYXRlQ1JDKHVuc2lnbmVkIGNoYXIgKkNSQywgaW50IGJpdCkKLXsKLQlpbnQgajsKLQotCS8qIHNoaWZ0IENSQyBvbmUgYml0ICovCi0KLQltZW1tb3ZlKENSQyArIDEsIENSQywgMzIgKiBzaXplb2YodW5zaWduZWQgY2hhcikpOwotCUNSQ1swXSA9IDA7Ci0KLQkvKiBpZiBiaXQgWE9SIGNvbnRyb2xiaXQgPSAxLCBzZXQgQ1JDID0gQ1JDIFhPUiBwb2x5bm9taWFsICovCi0KLQlpZiAoYml0IF4gQ1JDWzMyXSkKLQkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspCi0JCQlDUkNbal0gXj0gcG9seVtqXTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBHZXRIYXNoKGNoYXIgKmFkZHJlc3MpCi17Ci0JdW5zaWduZWQgY2hhciBDUkNbMzNdOwotCWludCBpLCBieXRlLCBoYXNoY29kZTsKLQotCS8qIGEgbXVsdGljYXN0IGFkZHJlc3MgaGFzIGJpdCAwIGluIHRoZSBmaXJzdCBieXRlIHNldCAqLwotCi0JaWYgKChhZGRyZXNzWzBdICYgMSkgPT0gMCkKLQkJcmV0dXJuIC0xOwotCi0JLyogaW5pdGlhbGl6ZSBDUkMgKi8KLQotCW1lbXNldChDUkMsIDEsIHNpemVvZihDUkMpKTsKLQotCS8qIGxvb3AgdGhyb3VnaCBhZGRyZXNzIGJpdHMgKi8KLQotCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCA2OyBieXRlKyspCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQlVcGRhdGVDUkMoQ1JDLCAoYWRkcmVzc1tieXRlXSA+PiBpKSAmIDEpOwotCi0JLyogaGFzaGNvZGUgaXMgdGhlIDYgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgQ1JDICovCi0KLQloYXNoY29kZSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJaGFzaGNvZGUgPSAoaGFzaGNvZGUgPDwgMSkgKyBDUkNbaV07Ci0JcmV0dXJuIGhhc2hjb2RlOwotfQotCi0vKiBmZWVkIHJlYWR5LWJ1aWx0IGluaXRpYWxpemF0aW9uIGJsb2NrIGludG8gTEFOQ0UgKi8KLQotc3RhdGljIHZvaWQgSW5pdExBTkNFKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQkvKiBidWlsZCB1cCBkZXNjcmlwdG9ycy4gKi8KLQotCUluaXREc2NycyhkZXYpOwotCi0JLyogbmV4dCBSWCBkZXNjcmlwdG9yIHRvIGJlIHJlYWQgaXMgdGhlIGZpcnN0IG9uZS4gIFNpbmNlIHRoZSBMQU5DRQotCSAgIHdpbGwgc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIGFmdGVyIGluaXRpYWxpemF0aW9uLCB3ZSBoYXZlIHRvCi0JICAgcmVzZXQgb3V0IHBvaW50ZXJzIHRvby4gKi8KLQotCXByaXYtPm5leHRyeCA9IDA7Ci0KLQkvKiBubyBUWCBkZXNjcmlwdG9ycyBhY3RpdmUgKi8KLQotCXByaXYtPm5leHR0eHB1dCA9IHByaXYtPm5leHR0eGRvbmUgPSBwcml2LT50eGJ1c3kgPSAwOwotCi0JLyogc2V0IHVwIHRoZSBMQU5DRSBidXMgY29udHJvbCByZWdpc3RlciAtIGNvbnN0YW50IGZvciBTS25ldCBib2FyZHMgKi8KLQotCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMywKLQkJIENTUjNfQlNXQVBfT0ZGIHwgQ1NSM19BTEVfTE9XIHwgQ1NSM19CQ09OX0hPTEQpOwotCi0JLyogd3JpdGUgYWRkcmVzcyBvZiBpbml0aWFsaXphdGlvbiBibG9jayBpbnRvIExBTkNFICovCi0KLQlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjEsIFJBTV9JTklUQkFTRSAmIDB4ZmZmZik7Ci0JU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IyLCAoUkFNX0lOSVRCQVNFID4+IDE2KSAmIDB4ZmYpOwotCi0JLyogd2UgZG9uJ3QgZ2V0IHJlYWR5IHVudGlsIHRoZSBMQU5DRSBoYXMgcmVhZCB0aGUgaW5pdCBibG9jayAqLwotCi0JbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCi0JLyogbGV0IExBTkNFIHJlYWQgdGhlIGluaXRpYWxpemF0aW9uIGJsb2NrLiAgTEFOQ0UgaXMgcmVhZHkKLQkgICB3aGVuIHdlIHJlY2VpdmUgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0LiAqLwotCi0JU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwLCBDU1IwX0lORUEgfCBDU1IwX0lOSVQpOwotfQotCi0vKiBzdG9wIHRoZSBMQU5DRSBzbyB3ZSBjYW4gcmVpbml0aWFsaXplIGl0ICovCi0KLXN0YXRpYyB2b2lkIFN0b3BMQU5DRShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCS8qIGNhbid0IHRha2UgZnJhbWVzIGFueSBtb3JlICovCi0KLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0KLQkvKiBkaXNhYmxlIGludGVycnVwdHMsIHN0b3AgaXQgKi8KLQotCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgQ1NSMF9TVE9QKTsKLX0KLQotLyogaW5pdGlhbGl6ZSBjYXJkIGFuZCBMQU5DRSBmb3IgcHJvcGVyIG9wZXJhdGlvbiAqLwotCi1zdGF0aWMgdm9pZCBJbml0Qm9hcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlMQU5DRV9Jbml0QmxvY2sgYmxvY2s7Ci0KLQkvKiBMYXkgb3V0IHRoZSBzaGFyZWQgUkFNIC0gZmlyc3Qgd2UgY3JlYXRlIHRoZSBpbml0IGJsb2NrIGZvciB0aGUgTEFOQ0UuCi0JICAgV2UgZG8gbm90IG92ZXJ3cml0ZSBpdCBsYXRlciBiZWNhdXNlIHdlIG5lZWQgaXQgYWdhaW4gd2hlbiB3ZSBzd2l0Y2gKLQkgICBwcm9taXNjb3VzIG1vZGUgb24vb2ZmLiAqLwotCi0JYmxvY2suTW9kZSA9IDA7Ci0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKLQkJYmxvY2suTW9kZSB8PSBMQU5DRV9JTklUX1BST007Ci0JbWVtY3B5KGJsb2NrLlBBZHIsIGRldi0+ZGV2X2FkZHIsIDYpOwotCW1lbXNldChibG9jay5MQWRyRiwgMCwgc2l6ZW9mKGJsb2NrLkxBZHJGKSk7Ci0JYmxvY2suUmRyUCA9IChSQU1fUlhCQVNFICYgMHhmZmZmZmYpIHwgKExSWENPVU5UIDw8IDI5KTsKLQlibG9jay5UZHJQID0gKFJBTV9UWEJBU0UgJiAweGZmZmZmZikgfCAoTFRYQ09VTlQgPDwgMjkpOwotCi0JbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIFJBTV9JTklUQkFTRSwgJmJsb2NrLCBzaXplb2YoYmxvY2spKTsKLQotCS8qIGluaXRpYWxpemUgTEFOQ0UuIEltcGxpY2l0bHkgc2V0cyB1cCBvdGhlciBzdHJ1Y3R1cmVzIGluIFJBTS4gKi8KLQotCUluaXRMQU5DRShkZXYpOwotfQotCi0vKiBkZWluaXRpYWxpemUgY2FyZCBhbmQgTEFOQ0UgKi8KLQotc3RhdGljIHZvaWQgRGVpbml0Qm9hcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQkvKiBzdG9wIExBTkNFICovCi0KLQlTdG9wTEFOQ0UoZGV2KTsKLQotCS8qIHJlc2V0IGJvYXJkICovCi0KLQlSZXNldEJvYXJkKGRldik7Ci19Ci0KLS8qIHByb2JlIGZvciBkZXZpY2UncyBpcnEgKi8KLQotc3RhdGljIGludCBfX2luaXQgUHJvYmVJUlEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQl1bnNpZ25lZCBsb25nIGltYXNrdmFsLCBuamlmZmllcywgaXJxOwotCXUxNiBjc3IwdmFsOwotCi0JLyogZW5hYmxlIGFsbCBpbnRlcnJ1cHRzICovCi0KLQlpbWFza3ZhbCA9IHByb2JlX2lycV9vbigpOwotCi0JLyogaW5pdGlhbGl6ZSB0aGUgYm9hcmQuIFdhaXQgZm9yIGludGVycnVwdCAnSW5pdGlhbGl6YXRpb24gZG9uZScuICovCi0KLQlSZXNldEJvYXJkKGRldik7Ci0JSW5pdEJvYXJkKGRldik7Ci0KLQluamlmZmllcyA9IGppZmZpZXMgKyBIWjsKLQlkbyB7Ci0JCWNzcjB2YWwgPSBHZXRMQU5DRShkZXYsIExBTkNFX0NTUjApOwotCX0KLQl3aGlsZSAoKChjc3IwdmFsICYgQ1NSMF9JRE9OKSA9PSAwKSAmJiAoamlmZmllcyAhPSBuamlmZmllcykpOwotCi0JLyogdHVybiBvZiBpbnRlcnJ1cHRzIGFnYWluICovCi0KLQlpcnEgPSBwcm9iZV9pcnFfb2ZmKGltYXNrdmFsKTsKLQotCS8qIGlmIHdlIGZvdW5kIHNvbWV0aGluZywgYWNrIHRoZSBpbnRlcnJ1cHQgKi8KLQotCWlmIChpcnEpCi0JCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgY3NyMHZhbCB8IENTUjBfSURPTik7Ci0KLQkvKiBiYWNrIHRvIGlkbGUgc3RhdGUgKi8KLQotCURlaW5pdEJvYXJkKGRldik7Ci0KLQlyZXR1cm4gaXJxOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIGludGVycnVwdCBoYW5kbGVyKHMpCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogTEFOQ0UgaGFzIHJlYWQgaW5pdGlhbGl6YXRpb24gYmxvY2sgLT4gc3RhcnQgaXQgKi8KLQotc3RhdGljIHUxNiBpcnFzdGFydF9oYW5kbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBvbGRjc3IwKQotewotCS8qIG5vdyB3ZSdyZSByZWFkeSB0byB0cmFuc21pdCAqLwotCi0JbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwotCi0JLyogcmVzZXQgSURPTiBiaXQsIHN0YXJ0IExBTkNFICovCi0KLQlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjAsIG9sZGNzcjAgfCBDU1IwX0lET04gfCBDU1IwX1NUUlQpOwotCXJldHVybiBHZXRMQU5DRShkZXYsIExBTkNFX0NTUjApOwotfQotCi0vKiBkaWQgd2UgbG9zZSBibG9ja3MgZHVlIHRvIGEgRklGTyBvdmVycnVuID8gKi8KLQotc3RhdGljIHUxNiBpcnFtaXNzX2hhbmRsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IG9sZGNzcjApCi17Ci0Jc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQkvKiB1cGRhdGUgc3RhdGlzdGljcyAqLwotCi0JcHJpdi0+c3RhdC5yeF9maWZvX2Vycm9ycysrOwotCi0JLyogcmVzZXQgTUlTUyBiaXQgKi8KLQotCVNldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCwgb2xkY3NyMCB8IENTUjBfTUlTUyk7Ci0JcmV0dXJuIEdldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCk7Ci19Ci0KLS8qIHJlY2VpdmUgaW50ZXJydXB0ICovCi0KLXN0YXRpYyB1MTYgaXJxcnhfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2xkY3NyMCkKLXsKLQlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlMQU5DRV9SeERlc2NyIGRlc2NyOwotCXVuc2lnbmVkIGludCBkZXNjcmFkZHI7Ci0KLQkvKiBydW4gdGhyb3VnaCBxdWV1ZSB1bnRpbCB3ZSByZWFjaCBhIGRlc2NyaXB0b3Igd2UgZG8gbm90IG93biAqLwotCi0JZGVzY3JhZGRyID0gUkFNX1JYQkFTRSArIChwcml2LT5uZXh0cnggKiBzaXplb2YoTEFOQ0VfUnhEZXNjcikpOwotCXdoaWxlICgxKSB7Ci0JCS8qIHJlYWQgZGVzY3JpcHRvciAqLwotCQltZW1jcHlfZnJvbWlvKCZkZXNjciwgcHJpdi0+YmFzZSArIGRlc2NyYWRkciwKLQkJCSAgICAgc2l6ZW9mKExBTkNFX1J4RGVzY3IpKTsKLQotCQkvKiBpZiB3ZSByZWFjaCBhIGRlc2NyaXB0b3Igd2UgZG8gbm90IG93biwgd2UncmUgZG9uZSAqLwotCQlpZiAoKGRlc2NyLkZsYWdzICYgUlhEU0NSX0ZMQUdTX09XTikgIT0gMCkKLQkJCWJyZWFrOwotCi0jaWZkZWYgREVCVUcKLQkJUHJUaW1lKCk7Ci0JCXByaW50aygiUmVjZWl2ZSBwYWNrZXQgb24gZGVzY3IgJWQgbGVuICVkXG4iLCBwcml2LT5uZXh0cngsCi0JCSAgICAgICBkZXNjci5MZW4pOwotI2VuZGlmCi0KLQkJLyogZXJyb25lb3VzIHBhY2tldCA/ICovCi0JCWlmICgoZGVzY3IuRmxhZ3MgJiBSWERTQ1JfRkxBR1NfRVJSKSAhPSAwKSB7Ci0JCQlwcml2LT5zdGF0LnJ4X2Vycm9ycysrOwotCQkJaWYgKChkZXNjci5GbGFncyAmIFJYRFNDUl9GTEFHU19DUkMpICE9IDApCi0JCQkJcHJpdi0+c3RhdC5yeF9jcmNfZXJyb3JzKys7Ci0JCQllbHNlIGlmICgoZGVzY3IuRmxhZ3MgJiBSWERTQ1JfRkxBR1NfQ1JDKSAhPSAwKQotCQkJCXByaXYtPnN0YXQucnhfZnJhbWVfZXJyb3JzKys7Ci0JCQllbHNlIGlmICgoZGVzY3IuRmxhZ3MgJiBSWERTQ1JfRkxBR1NfT0ZMTykgIT0gMCkKLQkJCQlwcml2LT5zdGF0LnJ4X2ZpZm9fZXJyb3JzKys7Ci0JCX0KLQotCQkvKiBnb29kIHBhY2tldCA/ICovCi0JCWVsc2UgewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCQkJc2tiID0gZGV2X2FsbG9jX3NrYihkZXNjci5MZW4gKyAyKTsKLQkJCWlmIChza2IgPT0gTlVMTCkKLQkJCQlwcml2LT5zdGF0LnJ4X2Ryb3BwZWQrKzsKLQkJCWVsc2UgewotCQkJCW1lbWNweV9mcm9taW8oc2tiX3B1dChza2IsIGRlc2NyLkxlbiksCi0JCQkJCSAgICAgcHJpdi0+YmFzZSArCi0JCQkJCSAgICAgZGVzY3IuTG93QWRkciwgZGVzY3IuTGVuKTsKLQkJCQlza2ItPmRldiA9IGRldjsKLQkJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwotCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQkJCQlwcml2LT5zdGF0LnJ4X3BhY2tldHMrKzsKLQkJCQlwcml2LT5zdGF0LnJ4X2J5dGVzICs9IGRlc2NyLkxlbjsKLQkJCQluZXRpZl9yeChza2IpOwotCQkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JCQl9Ci0JCX0KLQotCQkvKiBnaXZlIGRlc2NyaXB0b3IgYmFjayB0byBMQU5DRSAqLwotCQlkZXNjci5MZW4gPSAwOwotCQlkZXNjci5GbGFncyB8PSBSWERTQ1JfRkxBR1NfT1dOOwotCi0JCS8qIHVwZGF0ZSBkZXNjcmlwdG9yIGluIHNoYXJlZCBSQU0gKi8KLQkJbWVtY3B5X3RvaW8ocHJpdi0+YmFzZSArIGRlc2NyYWRkciwgJmRlc2NyLAotCQkJICAgc2l6ZW9mKExBTkNFX1J4RGVzY3IpKTsKLQotCQkvKiBnbyB0byBuZXh0IGRlc2NyaXB0b3IgKi8KLQkJcHJpdi0+bmV4dHJ4Kys7Ci0JCWRlc2NyYWRkciArPSBzaXplb2YoTEFOQ0VfUnhEZXNjcik7Ci0JCWlmIChwcml2LT5uZXh0cnggPj0gUlhDT1VOVCkgewotCQkJcHJpdi0+bmV4dHJ4ID0gMDsKLQkJCWRlc2NyYWRkciA9IFJBTV9SWEJBU0U7Ci0JCX0KLQl9Ci0KLQkvKiByZXNldCBSSU5UIGJpdCAqLwotCi0JU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwLCBvbGRjc3IwIHwgQ1NSMF9SSU5UKTsKLQlyZXR1cm4gR2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwKTsKLX0KLQotLyogdHJhbnNtaXQgaW50ZXJydXB0ICovCi0KLXN0YXRpYyB1MTYgaXJxdHhfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgb2xkY3NyMCkKLXsKLQlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlMQU5DRV9UeERlc2NyIGRlc2NyOwotCXVuc2lnbmVkIGludCBkZXNjcmFkZHI7Ci0KLQkvKiBjaGVjayBkZXNjcmlwdG9ycyBhdCBtb3N0IHVudGlsIG5vIGJ1c3kgb25lIGlzIGxlZnQgKi8KLQotCWRlc2NyYWRkciA9Ci0JICAgIFJBTV9UWEJBU0UgKyAocHJpdi0+bmV4dHR4ZG9uZSAqIHNpemVvZihMQU5DRV9UeERlc2NyKSk7Ci0Jd2hpbGUgKHByaXYtPnR4YnVzeSA+IDApIHsKLQkJLyogcmVhZCBkZXNjcmlwdG9yICovCi0JCW1lbWNweV9mcm9taW8oJmRlc2NyLCBwcml2LT5iYXNlICsgZGVzY3JhZGRyLAotCQkJICAgICBzaXplb2YoTEFOQ0VfVHhEZXNjcikpOwotCi0JCS8qIGlmIHRoZSBMQU5DRSBzdGlsbCBvd25zIHRoaXMgb25lLCB3ZSd2ZSB3b3JrZWQgb3V0IGFsbCBzZW50IHBhY2tldHMgKi8KLQkJaWYgKChkZXNjci5GbGFncyAmIFRYRFNDUl9GTEFHU19PV04pICE9IDApCi0JCQlicmVhazsKLQotI2lmZGVmIERFQlVHCi0JCVByVGltZSgpOwotCQlwcmludGsoIlNlbmQgcGFja2V0IGRvbmUgb24gZGVzY3IgJWRcbiIsIHByaXYtPm5leHR0eGRvbmUpOwotI2VuZGlmCi0KLQkJLyogdXBkYXRlIHN0YXRpc3RpY3MgKi8KLQkJaWYgKChkZXNjci5GbGFncyAmIFRYRFNDUl9GTEFHU19FUlIpID09IDApIHsKLQkJCXByaXYtPnN0YXQudHhfcGFja2V0cysrOwotCQkJcHJpdi0+c3RhdC50eF9ieXRlcysrOwotCQl9IGVsc2UgewotCQkJcHJpdi0+c3RhdC50eF9lcnJvcnMrKzsKLQkJCWlmICgoZGVzY3IuU3RhdHVzICYgVFhEU0NSX1NUQVRVU19VRkxPKSAhPSAwKSB7Ci0JCQkJcHJpdi0+c3RhdC50eF9maWZvX2Vycm9ycysrOwotCQkJCUluaXRMQU5DRShkZXYpOwotCQkJfQotCQkJCWVsc2UKLQkJCSAgICBpZiAoKGRlc2NyLlN0YXR1cyAmIFRYRFNDUl9TVEFUVVNfTENPTCkgIT0KLQkJCQkwKSBwcml2LT5zdGF0LnR4X3dpbmRvd19lcnJvcnMrKzsKLQkJCWVsc2UgaWYgKChkZXNjci5TdGF0dXMgJiBUWERTQ1JfU1RBVFVTX0xDQVIpICE9IDApCi0JCQkJcHJpdi0+c3RhdC50eF9jYXJyaWVyX2Vycm9ycysrOwotCQkJZWxzZSBpZiAoKGRlc2NyLlN0YXR1cyAmIFRYRFNDUl9TVEFUVVNfUlRSWSkgIT0gMCkKLQkJCQlwcml2LT5zdGF0LnR4X2Fib3J0ZWRfZXJyb3JzKys7Ci0JCX0KLQotCQkvKiBnbyB0byBuZXh0IGRlc2NyaXB0b3IgKi8KLQkJcHJpdi0+bmV4dHR4ZG9uZSsrOwotCQlkZXNjcmFkZHIgKz0gc2l6ZW9mKExBTkNFX1R4RGVzY3IpOwotCQlpZiAocHJpdi0+bmV4dHR4ZG9uZSA+PSBUWENPVU5UKSB7Ci0JCQlwcml2LT5uZXh0dHhkb25lID0gMDsKLQkJCWRlc2NyYWRkciA9IFJBTV9UWEJBU0U7Ci0JCX0KLQkJcHJpdi0+dHhidXN5LS07Ci0JfQotCi0JLyogcmVzZXQgVFggaW50ZXJydXB0IGJpdCAqLwotCi0JU2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwLCBvbGRjc3IwIHwgQ1NSMF9USU5UKTsKLQlvbGRjc3IwID0gR2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwKTsKLQotCS8qIGF0IGxlYXN0IG9uZSBkZXNjcmlwdG9yIGlzIGZyZWVkLiAgVGhlcmVmb3JlIHdlIGNhbiBhY2NlcHQKLQkgICBhIG5ldyBvbmUgKi8KLQkvKiBpbmZvcm0gdXBwZXIgbGF5ZXJzIHdlJ3JlIGluIGJ1c2luZXNzIGFnYWluICovCi0KLQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci0KLQlyZXR1cm4gb2xkY3NyMDsKLX0KLQotLyogZ2VuZXJhbCBpbnRlcnJ1cHQgZW50cnkgKi8KLQotc3RhdGljIGlycXJldHVybl90IGlycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldmljZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldmljZTsKLQl1MTYgY3NyMHZhbDsKLQotCS8qIHJlYWQgQ1NSMCB0byBnZXQgaW50ZXJydXB0IGNhdXNlICovCi0KLQljc3IwdmFsID0gR2V0TEFOQ0UoZGV2LCBMQU5DRV9DU1IwKTsKLQotCS8qIGluIGNhc2Ugd2UncmUgbm90IG1lYW50Li4uICovCi0KLQlpZiAoKGNzcjB2YWwgJiBDU1IwX0lOVFIpID09IDApCi0JCXJldHVybiBJUlFfTk9ORTsKLQotI2lmIDAKLQlzZXRfYml0KExJTktfU1RBVEVfUlhTRU0sICZkZXYtPnN0YXRlKTsKLSNlbmRpZgotCi0JLyogbG9vcCB0aHJvdWdoIHRoZSBpbnRlcnJ1cHQgYml0cyB1bnRpbCBldmVyeXRoaW5nIGlzIGNsZWFyICovCi0KLQlkbyB7Ci0JCWlmICgoY3NyMHZhbCAmIENTUjBfSURPTikgIT0gMCkKLQkJCWNzcjB2YWwgPSBpcnFzdGFydF9oYW5kbGVyKGRldiwgY3NyMHZhbCk7Ci0JCWlmICgoY3NyMHZhbCAmIENTUjBfUklOVCkgIT0gMCkKLQkJCWNzcjB2YWwgPSBpcnFyeF9oYW5kbGVyKGRldiwgY3NyMHZhbCk7Ci0JCWlmICgoY3NyMHZhbCAmIENTUjBfTUlTUykgIT0gMCkKLQkJCWNzcjB2YWwgPSBpcnFtaXNzX2hhbmRsZXIoZGV2LCBjc3IwdmFsKTsKLQkJaWYgKChjc3IwdmFsICYgQ1NSMF9USU5UKSAhPSAwKQotCQkJY3NyMHZhbCA9IGlycXR4X2hhbmRsZXIoZGV2LCBjc3IwdmFsKTsKLQkJaWYgKChjc3IwdmFsICYgQ1NSMF9NRVJSKSAhPSAwKSB7Ci0JCQlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjAsIGNzcjB2YWwgfCBDU1IwX01FUlIpOwotCQkJY3NyMHZhbCA9IEdldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCk7Ci0JCX0KLQkJaWYgKChjc3IwdmFsICYgQ1NSMF9CQUJMKSAhPSAwKSB7Ci0JCQlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjAsIGNzcjB2YWwgfCBDU1IwX0JBQkwpOwotCQkJY3NyMHZhbCA9IEdldExBTkNFKGRldiwgTEFOQ0VfQ1NSMCk7Ci0JCX0KLQl9Ci0Jd2hpbGUgKChjc3IwdmFsICYgQ1NSMF9JTlRSKSAhPSAwKTsKLQotI2lmIDAKLQljbGVhcl9iaXQoTElOS19TVEFURV9SWFNFTSwgJmRldi0+c3RhdGUpOwotI2VuZGlmCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIGRyaXZlciBtZXRob2RzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogTUNBIGluZm8gKi8KLQotc3RhdGljIGludCBza21jYV9nZXRpbmZvKGNoYXIgKmJ1ZiwgaW50IHNsb3QsIHZvaWQgKmQpCi17Ci0JaW50IGxlbiA9IDAsIGk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkOwotCXNrbWNhX3ByaXYgKnByaXY7Ci0KLQkvKiBjYW4ndCBzYXkgYW55dGhpbmcgYWJvdXQgYW4gdW5pbml0aWFsaXplZCBkZXZpY2UuLi4gKi8KLQotCWlmIChkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIGxlbjsKLQlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCS8qIHByaW50IGluZm8gKi8KLQotCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIklSUTogJWRcbiIsIHByaXYtPnJlYWxpcnEpOwotCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIk1lbW9yeTogJSNseC0lI2x4XG4iLCBkZXYtPm1lbV9zdGFydCwKLQkJICAgICAgIGRldi0+bWVtX2VuZCAtIDEpOwotCWxlbiArPQotCSAgICBzcHJpbnRmKGJ1ZiArIGxlbiwgIlRyYW5zY2VpdmVyOiAlc1xuIiwKLQkJICAgIE1lZGlhTmFtZXNbcHJpdi0+bWVkaXVtXSk7Ci0JbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiRGV2aWNlOiAlc1xuIiwgZGV2LT5uYW1lKTsKLQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJNQUMgYWRkcmVzczoiKTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIgJTAyeCIsIGRldi0+ZGV2X2FkZHJbaV0pOwotCWJ1ZltsZW4rK10gPSAnXG4nOwotCWJ1ZltsZW5dID0gMDsKLQotCXJldHVybiBsZW47Ci19Ci0KLS8qIG9wZW4gZHJpdmVyLiAgTWVhbnMgYWxzbyBpbml0aWFsaXphdGlvbiBhbmQgc3RhcnQgb2YgTEFOQ0UgKi8KLQotc3RhdGljIGludCBza21jYV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JaW50IHJlc3VsdDsKLQlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCS8qIHJlZ2lzdGVyIHJlc291cmNlcyAtIG9ubHkgbmVjZXNzYXJ5IGZvciBJUlEgKi8KLQlyZXN1bHQgPQotCSAgICByZXF1ZXN0X2lycShwcml2LT5yZWFsaXJxLCBpcnFfaGFuZGxlciwKLQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9TQU1QTEVfUkFORE9NLCAic2tfbWNhIiwgZGV2KTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJcHJpbnRrKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGlycSAlZFxuIiwgZGV2LT5uYW1lLAotCQkgICAgICAgZGV2LT5pcnEpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlkZXYtPmlycSA9IHByaXYtPnJlYWxpcnE7Ci0KLQkvKiBzZXQgdXAgdGhlIGNhcmQgYW5kIExBTkNFICovCi0KLQlJbml0Qm9hcmQoZGV2KTsKLQotCS8qIHNldCB1cCBmbGFncyAqLwotCi0JbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKLQotCXJldHVybiAwOwotfQotCi0vKiBjbG9zZSBkcml2ZXIuICBTaHV0IGRvd24gYm9hcmQgYW5kIGZyZWUgYWxsb2NhdGVkIHJlc291cmNlcyAqLwotCi1zdGF0aWMgaW50IHNrbWNhX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JLyogdHVybiBvZmYgYm9hcmQgKi8KLQlEZWluaXRCb2FyZChkZXYpOwotCi0JLyogcmVsZWFzZSByZXNvdXJjZXMgKi8KLQlpZiAoZGV2LT5pcnEgIT0gMCkKLQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7Ci0JZGV2LT5pcnEgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHRyYW5zbWl0IGEgYmxvY2suICovCi0KLXN0YXRpYyBpbnQgc2ttY2FfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlMQU5DRV9UeERlc2NyIGRlc2NyOwotCXVuc2lnbmVkIGludCBhZGRyZXNzOwotCWludCB0bXBsZW4sIHJldHZhbCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIGlmIHdlIGdldCBjYWxsZWQgd2l0aCBhIE5VTEwgZGVzY3JpcHRvciwgdGhlIEV0aGVybmV0IGxheWVyIHRoaW5rcwotCSAgIG91ciBjYXJkIGlzIHN0dWNrIGFuIHdlIHNob3VsZCByZXNldCBpdC4gIFdlJ2xsIGRvIHRoaXMgY29tcGxldGVseTogKi8KLQotCWlmIChza2IgPT0gTlVMTCkgewotCQlEZWluaXRCb2FyZChkZXYpOwotCQlJbml0Qm9hcmQoZGV2KTsKLQkJcmV0dXJuIDA7CS8qIGRvbid0IHRyeSB0byBmcmVlIHRoZSBibG9jayBoZXJlIDstKSAqLwotCX0KLQotCS8qIGlzIHRoZXJlIHNwYWNlIGluIHRoZSBUeCBxdWV1ZSA/IElmIG5vLCB0aGUgdXBwZXIgbGF5ZXIgZ2F2ZSB1cyBhCi0JICAgcGFja2V0IGluIHNwaXRlIG9mIHVzIG5vdCBiZWluZyByZWFkeSBhbmQgaXMgcmVhbGx5IGluIHRyb3VibGUuCi0JICAgV2UnbGwgZG8gdGhlIGRyb3BwaW5nIGZvciBoaW06ICovCi0JaWYgKHByaXYtPnR4YnVzeSA+PSBUWENPVU5UKSB7Ci0JCXByaXYtPnN0YXQudHhfZHJvcHBlZCsrOwotCQlyZXR2YWwgPSAtRUlPOwotCQlnb3RvIHR4X2RvbmU7Ci0JfQotCi0JLyogZ2V0IFRYIGRlc2NyaXB0b3IgKi8KLQlhZGRyZXNzID0gUkFNX1RYQkFTRSArIChwcml2LT5uZXh0dHhwdXQgKiBzaXplb2YoTEFOQ0VfVHhEZXNjcikpOwotCW1lbWNweV9mcm9taW8oJmRlc2NyLCBwcml2LT5iYXNlICsgYWRkcmVzcywgc2l6ZW9mKExBTkNFX1R4RGVzY3IpKTsKLQotCS8qIGVudGVyIHBhY2tldCBsZW5ndGggYXMgMnMgY29tcGxlbWVudCAtIGFzc3VyZSBtaW5pbXVtIGxlbmd0aCAqLwotCXRtcGxlbiA9IHNrYi0+bGVuOwotCWlmICh0bXBsZW4gPCA2MCkKLQkJdG1wbGVuID0gNjA7Ci0JZGVzY3IuTGVuID0gNjU1MzYgLSB0bXBsZW47Ci0KLQkvKiBjb3B5IGZpbGxlciBpbnRvIFJBTSAtIGluIGNhc2Ugd2UncmUgZmlsbGluZyB1cC4uLgotCSAgIHdlJ3JlIGZpbGxpbmcgYSBiaXQgbW9yZSB0aGFuIG5lY2Vzc2FyeSwgYnV0IHRoYXQgZG9lc24ndCBoYXJtCi0JICAgc2luY2UgdGhlIGJ1ZmZlciBpcyBmYXIgbGFyZ2VyLi4uICovCi0JaWYgKHRtcGxlbiA+IHNrYi0+bGVuKSB7Ci0JCWNoYXIgKmZpbGwgPSAiTmV0QlNEIGlzIGEgbmljZSBPUyB0b28hICI7Ci0JCXVuc2lnbmVkIGludCBkZXN0b2ZmcyA9IDAsIGwgPSBzdHJsZW4oZmlsbCk7Ci0KLQkJd2hpbGUgKGRlc3RvZmZzIDwgdG1wbGVuKSB7Ci0JCQltZW1jcHlfdG9pbyhwcml2LT5iYXNlICsgZGVzY3IuTG93QWRkciArCi0JCQkJICAgZGVzdG9mZnMsIGZpbGwsIGwpOwotCQkJZGVzdG9mZnMgKz0gbDsKLQkJfQotCX0KLQotCS8qIGRvIHRoZSByZWFsIGRhdGEgY29weWluZyAqLwotCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBkZXNjci5Mb3dBZGRyLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQotCS8qIGhhbmQgZGVzY3JpcHRvciBvdmVyIHRvIExBTkNFIC0gdGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2h1bmsgKi8KLQlkZXNjci5GbGFncyA9Ci0JICAgIFRYRFNDUl9GTEFHU19PV04gfCBUWERTQ1JfRkxBR1NfU1RQIHwgVFhEU0NSX0ZMQUdTX0VOUDsKLQotI2lmZGVmIERFQlVHCi0JUHJUaW1lKCk7Ci0JcHJpbnRrKCJTZW5kIHBhY2tldCBvbiBkZXNjciAlZCBsZW4gJWRcbiIsIHByaXYtPm5leHR0eHB1dCwKLQkgICAgICAgc2tiLT5sZW4pOwotI2VuZGlmCi0KLQkvKiBvbmUgbW9yZSBkZXNjcmlwdG9yIGJ1c3kgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlwcml2LT5uZXh0dHhwdXQrKzsKLQlpZiAocHJpdi0+bmV4dHR4cHV0ID49IFRYQ09VTlQpCi0JCXByaXYtPm5leHR0eHB1dCA9IDA7Ci0JcHJpdi0+dHhidXN5Kys7Ci0KLQkvKiBhcmUgd2Ugc2F0dXJhdGVkID8gKi8KLQotCWlmIChwcml2LT50eGJ1c3kgPj0gVFhDT1VOVCkKLQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCi0JLyogd3JpdGUgZGVzY3JpcHRvciBiYWNrIHRvIFJBTSAqLwotCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBhZGRyZXNzLCAmZGVzY3IsIHNpemVvZihMQU5DRV9UeERlc2NyKSk7Ci0KLQkvKiBpZiBubyBkZXNjcmlwdG9ycyB3ZXJlIGFjdGl2ZSwgZ2l2ZSB0aGUgTEFOQ0UgYSBoaW50IHRvIHJlYWQgaXQKLQkgICBpbW1lZGlhdGVseSAqLwotCi0JaWYgKHByaXYtPnR4YnVzeSA9PSAwKQotCQlTZXRMQU5DRShkZXYsIExBTkNFX0NTUjAsIENTUjBfSU5FQSB8IENTUjBfVERNRCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLSAgICAgIHR4X2RvbmU6Ci0KLQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKiByZXR1cm4gcG9pbnRlciB0byBFdGhlcm5ldCBzdGF0aXN0aWNzICovCi0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2ttY2Ffc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlza21jYV9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXJldHVybiAmKHByaXYtPnN0YXQpOwotfQotCi0vKiBzd2l0Y2ggcmVjZWl2ZXIgbW9kZS4gIFdlIHVzZSB0aGUgTEFOQ0UncyBtdWx0aWNhc3QgZmlsdGVyIHRvIHByZWZpbHRlcgotICAgbXVsdGljYXN0IGFkZHJlc3Nlcy4gKi8KLQotc3RhdGljIHZvaWQgc2ttY2Ffc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc2ttY2FfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JTEFOQ0VfSW5pdEJsb2NrIGJsb2NrOwotCi0JLyogZmlyc3Qgc3RvcCB0aGUgTEFOQ0UuLi4gKi8KLQlTdG9wTEFOQ0UoZGV2KTsKLQotCS8qIC4uLnRoZW4gbW9kaWZ5IHRoZSBpbml0aWFsaXphdGlvbiBibG9jay4uLiAqLwotCW1lbWNweV9mcm9taW8oJmJsb2NrLCBwcml2LT5iYXNlICsgUkFNX0lOSVRCQVNFLCBzaXplb2YoYmxvY2spKTsKLQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQotCQlibG9jay5Nb2RlIHw9IExBTkNFX0lOSVRfUFJPTTsKLQllbHNlCi0JCWJsb2NrLk1vZGUgJj0gfkxBTkNFX0lOSVRfUFJPTTsKLQotCWlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSB7CS8qIGdldCBhbGwgbXVsdGljYXN0cyAqLwotCQltZW1zZXQoYmxvY2suTEFkckYsIDB4ZmYsIHNpemVvZihibG9jay5MQWRyRikpOwotCX0gZWxzZSB7CQkvKiBnZXQgc2VsZWN0ZWQvbm8gbXVsdGljYXN0cyAqLwotCi0JCXN0cnVjdCBkZXZfbWNfbGlzdCAqbXB0cjsKLQkJaW50IGNvZGU7Ci0KLQkJbWVtc2V0KGJsb2NrLkxBZHJGLCAwLCBzaXplb2YoYmxvY2suTEFkckYpKTsKLQkJZm9yIChtcHRyID0gZGV2LT5tY19saXN0OyBtcHRyICE9IE5VTEw7IG1wdHIgPSBtcHRyLT5uZXh0KSB7Ci0JCQljb2RlID0gR2V0SGFzaChtcHRyLT5kbWlfYWRkcik7Ci0JCQlibG9jay5MQWRyRlsoY29kZSA+PiAzKSAmIDddIHw9IDEgPDwgKGNvZGUgJiA3KTsKLQkJfQotCX0KLQotCW1lbWNweV90b2lvKHByaXYtPmJhc2UgKyBSQU1fSU5JVEJBU0UsICZibG9jaywgc2l6ZW9mKGJsb2NrKSk7Ci0KLQkvKiAuLi50aGVuIHJlaW5pdCBMQU5DRSB3aXRoIHRoZSBjb3JyZWN0IGZsYWdzICovCi0JSW5pdExBTkNFKGRldik7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogaGFyZHdhcmUgY2hlY2sKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW50IHN0YXJ0c2xvdDsJCS8qIGNvdW50cyB0aHJvdWdoIHNsb3RzIHdoZW4gcHJvYmluZyBtdWx0aXBsZSBkZXZpY2VzICovCi0KLXN0YXRpYyB2b2lkIGNsZWFudXBfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXNrbWNhX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCURlaW5pdEJvYXJkKGRldik7Ci0JaWYgKGRldi0+aXJxICE9IDApCi0JCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwotCWlvdW5tYXAocHJpdi0+YmFzZSk7Ci0JbWNhX21hcmtfYXNfdW51c2VkKHByaXYtPnNsb3QpOwotCW1jYV9zZXRfYWRhcHRlcl9wcm9jZm4ocHJpdi0+c2xvdCwgTlVMTCwgTlVMTCk7Ci19Ci0KLXN0cnVjdCBuZXRfZGV2aWNlICogX19pbml0IHNrbWNhX3Byb2JlKGludCB1bml0KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IGZvcmNlX2RldGVjdCA9IDA7Ci0JaW50IGp1bmlvciwgc2xvdCwgaTsKLQlpbnQgYmFzZSA9IDAsIGlycSA9IDA7Ci0Jc2ttY2FfcHJpdiAqcHJpdjsKLQlza21jYV9tZWRpdW0gbWVkaXVtOwotCWludCBlcnI7Ci0KLQkvKiBjYW4ndCB3b3JrIHdpdGhvdXQgYW4gTUNBIGJ1cyA7LSkgKi8KLQotCWlmIChNQ0FfYnVzID09IDApCi0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotCi0JZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHNrbWNhX3ByaXYpKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlpZiAodW5pdCA+PSAwKSB7Ci0JCXNwcmludGYoZGV2LT5uYW1lLCAiZXRoJWQiLCB1bml0KTsKLQkJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKLQl9Ci0KLQlTRVRfTU9EVUxFX09XTkVSKGRldik7Ci0KLQkvKiBzdGFydCBhZGRyZXNzIG9mIDEgLS0+IGZvcmNlZCBkZXRlY3Rpb24gKi8KLQotCWlmIChkZXYtPm1lbV9zdGFydCA9PSAxKQotCQlmb3JjZV9kZXRlY3QgPSAxOwotCi0JLyogc2VhcmNoIHRocm91Z2ggc2xvdHMgKi8KLQotCWJhc2UgPSBkZXYtPm1lbV9zdGFydDsKLQlpcnEgPSBkZXYtPmJhc2VfYWRkcjsKLQlmb3IgKHNsb3QgPSBzdGFydHNsb3Q7IChzbG90ID0gZG9maW5kKCZqdW5pb3IsIHNsb3QpKSAhPSAtMTsgc2xvdCsrKSB7Ci0JCS8qIGRlZHVjZSBjYXJkIGFkZHJlc3NlcyAqLwotCi0JCWdldGFkZHJzKHNsb3QsIGp1bmlvciwgJmJhc2UsICZpcnEsICZtZWRpdW0pOwotCi0JCS8qIHNsb3QgYWxyZWFkeSBpbiB1c2UgPyAqLwotCi0JCWlmIChtY2FfaXNfYWRhcHRlcl91c2VkKHNsb3QpKQotCQkJY29udGludWU7Ci0KLQkJLyogd2VyZSB3ZSBsb29raW5nIGZvciBzb21ldGhpbmcgZGlmZmVyZW50ID8gKi8KLQotCQlpZiAoZGV2LT5pcnEgJiYgZGV2LT5pcnEgIT0gaXJxKQotCQkJY29udGludWU7Ci0JCWlmIChkZXYtPm1lbV9zdGFydCAmJiBkZXYtPm1lbV9zdGFydCAhPSBiYXNlKQotCQkJY29udGludWU7Ci0KLQkJLyogZm91bmQgc29tZXRoaW5nIHRoYXQgbWF0Y2hlcyAqLwotCi0JCWJyZWFrOwotCX0KLQotCS8qIG5vdGhpbmcgZm91bmQgPyAqLwotCi0JaWYgKHNsb3QgPT0gLTEpIHsKLQkJZnJlZV9uZXRkZXYoZGV2KTsKLQkJcmV0dXJuIChiYXNlIHx8IGlycSkgPyBFUlJfUFRSKC1FTlhJTykgOiBFUlJfUFRSKC1FTk9ERVYpOwotCX0KLQotCS8qIG1ha2UgcHJvY2ZzIGVudHJpZXMgKi8KLQotCWlmIChqdW5pb3IpCi0JCW1jYV9zZXRfYWRhcHRlcl9uYW1lKHNsb3QsCi0JCQkJICAgICAiU0tORVQganVuaW9yIE1DMiBFdGhlcm5ldCBBZGFwdGVyIik7Ci0JZWxzZQotCQltY2Ffc2V0X2FkYXB0ZXJfbmFtZShzbG90LCAiU0tORVQgTUMyKyBFdGhlcm5ldCBBZGFwdGVyIik7Ci0JbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCAoTUNBX1Byb2NGbikgc2ttY2FfZ2V0aW5mbywgZGV2KTsKLQotCW1jYV9tYXJrX2FzX3VzZWQoc2xvdCk7Ci0KLQkvKiBhbm5vdW5jZSBzdWNjZXNzICovCi0JcHJpbnRrKCIlczogU0tOZXQgJXMgYWRhcHRlciBmb3VuZCBpbiBzbG90ICVkXG4iLCBkZXYtPm5hbWUsCi0JICAgICAgIGp1bmlvciA/ICJKdW5pb3IgTUMyIiA6ICJNQzIrIiwgc2xvdCArIDEpOwotCi0JcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JcHJpdi0+YmFzZSA9IGlvcmVtYXAoYmFzZSwgMHg0MDAwKTsKLQlpZiAoIXByaXYtPmJhc2UpIHsKLQkJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCBOVUxMLCBOVUxMKTsKLQkJbWNhX21hcmtfYXNfdW51c2VkKHNsb3QpOwotCQlmcmVlX25ldGRldihkZXYpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0KLQlwcml2LT5zbG90ID0gc2xvdDsKLQlwcml2LT5tYWNiYXNlID0gcHJpdi0+YmFzZSArIDB4M2ZjMDsKLQlwcml2LT5pb3JlZ2FkZHIgPSBwcml2LT5iYXNlICsgMHgzZmYwOwotCXByaXYtPmN0cmxhZGRyID0gcHJpdi0+YmFzZSArIDB4M2ZmMjsKLQlwcml2LT5jbWRhZGRyID0gcHJpdi0+YmFzZSArIDB4M2ZmMzsKLQlwcml2LT5tZWRpdW0gPSBtZWRpdW07Ci0JbWVtc2V0KCZwcml2LT5zdGF0LCAwLCBzaXplb2Yoc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMpKTsKLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7Ci0KLQkvKiBzZXQgYmFzZSArIGlycSBmb3IgdGhpcyBkZXZpY2UgKGlycSBub3QgYWxsb2NhdGVkIHNvIGZhcikgKi8KLQlkZXYtPmlycSA9IDA7Ci0JZGV2LT5tZW1fc3RhcnQgPSBiYXNlOwotCWRldi0+bWVtX2VuZCA9IGJhc2UgKyAweDQwMDA7Ci0KLQkvKiBhdXRvcHJvYmUgPyAqLwotCWlmIChpcnEgPCAwKSB7Ci0JCWludCBuaXJxOwotCi0JCXByaW50awotCQkgICAgKCIlczogYW1iaWdvdXMgUE9TIGJpdCBjb21iaW5hdGlvbiwgbXVzdCBwcm9iZSBmb3IgSVJRLi4uXG4iLAotCQkgICAgIGRldi0+bmFtZSk7Ci0JCW5pcnEgPSBQcm9iZUlSUShkZXYpOwotCQlpZiAobmlycSA8PSAwKQotCQkJcHJpbnRrKCIlczogSVJRIHByb2JlIGZhaWxlZCwgYXNzdW1pbmcgSVJRICVkIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPnJlYWxpcnEgPSAtaXJxKTsKLQkJZWxzZQotCQkJcHJpdi0+cmVhbGlycSA9IG5pcnE7Ci0JfSBlbHNlCi0JCXByaXYtPnJlYWxpcnEgPSBpcnE7Ci0KLQkvKiBzZXQgbWV0aG9kcyAqLwotCWRldi0+b3BlbiA9IHNrbWNhX29wZW47Ci0JZGV2LT5zdG9wID0gc2ttY2FfY2xvc2U7Ci0JZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBza21jYV90eDsKLQlkZXYtPmRvX2lvY3RsID0gTlVMTDsKLQlkZXYtPmdldF9zdGF0cyA9IHNrbWNhX3N0YXRzOwotCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gc2ttY2Ffc2V0X211bHRpY2FzdF9saXN0OwotCWRldi0+ZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKLQotCS8qIGNvcHkgb3V0IE1BQyBhZGRyZXNzICovCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJZGV2LT5kZXZfYWRkcltpXSA9IHJlYWRiKHByaXYtPm1hY2Jhc2UgKyAoaSA8PCAxKSk7Ci0KLQkvKiBwcmludCBjb25maWcgKi8KLQlwcmludGsoIiVzOiBJUlEgJWQsIG1lbW9yeSAlI2x4LSUjbHgsICIKLQkgICAgICAgIk1BQyBhZGRyZXNzICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LlxuIiwKLQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5yZWFsaXJxLCBkZXYtPm1lbV9zdGFydCwgZGV2LT5tZW1fZW5kIC0gMSwKLQkgICAgICAgZGV2LT5kZXZfYWRkclswXSwgZGV2LT5kZXZfYWRkclsxXSwgZGV2LT5kZXZfYWRkclsyXSwKLQkgICAgICAgZGV2LT5kZXZfYWRkclszXSwgZGV2LT5kZXZfYWRkcls0XSwgZGV2LT5kZXZfYWRkcls1XSk7Ci0JcHJpbnRrKCIlczogJXMgbWVkaXVtXG4iLCBkZXYtPm5hbWUsIE1lZGlhTmFtZXNbcHJpdi0+bWVkaXVtXSk7Ci0KLQkvKiByZXNldCBib2FyZCAqLwotCi0JUmVzZXRCb2FyZChkZXYpOwotCi0Jc3RhcnRzbG90ID0gc2xvdCArIDE7Ci0KLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWNsZWFudXBfY2FyZChkZXYpOwotCQlmcmVlX25ldGRldihkZXYpOwotCQlkZXYgPSBFUlJfUFRSKGVycik7Ci0JfQotCXJldHVybiBkZXY7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogbW9kdWxhcml6YXRpb24gc3VwcG9ydAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpZmRlZiBNT0RVTEUKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotI2RlZmluZSBERVZNQVggNQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm1vZGRldnNbREVWTUFYXTsKLQotaW50IGluaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50IHo7Ci0KLQlzdGFydHNsb3QgPSAwOwotCWZvciAoeiA9IDA7IHogPCBERVZNQVg7IHorKykgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2ttY2FfcHJvYmUoLTEpOwotCQlpZiAoSVNfRVJSKGRldikpCi0JCQlicmVhazsKLQkJbW9kZGV2c1t6XSA9IGRldjsKLQl9Ci0JaWYgKCF6KQotCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQotewotCWludCB6OwotCi0JZm9yICh6ID0gMDsgeiA8IERFVk1BWDsgeisrKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBtb2RkZXZzW3pdOwotCQlpZiAoZGV2KSB7Ci0JCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCQkJY2xlYW51cF9jYXJkKGRldik7Ci0JCQlmcmVlX25ldGRldihkZXYpOwotCQl9Ci0JfQotfQotI2VuZGlmCQkJCS8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tfbWNhLmggYi9kcml2ZXJzL25ldC9za19tY2EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhZTA1Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9za19tY2EuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0jaWZuZGVmIF9TS19NQ0FfSU5DTFVERV8KLSNkZWZpbmUgX1NLX01DQV9JTkNMVURFXwotCi0jaWZkZWYgX1NLX01DQV9EUklWRVJfCi0KLS8qIEFkYXB0ZXIgSUQncyAqLwotI2RlZmluZSBTS05FVF9NQ0FfSUQgMHg2YWZkCi0jZGVmaW5lIFNLTkVUX0pVTklPUl9NQ0FfSUQgMHg2YmU5Ci0KLS8qIG1lZGlhIGVudW1lcmF0aW9uIC0gZGVmaW5lZCBpbiBhIHdheSB0aGF0IGl0IGZpdHMgb250byB0aGUgTUMyKydzCi0gICBQT1MgcmVnaXN0ZXJzLi4uICovCi0KLXR5cGVkZWYgZW51bSB7IE1lZGlhXzEwQmFzZTIsIE1lZGlhXzEwQmFzZVQsCi0JTWVkaWFfMTBCYXNlNSwgTWVkaWFfVW5rbm93biwgTWVkaWFfQ291bnQKLX0gc2ttY2FfbWVkaXVtOwotCi0vKiBwcml2YXRlIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludCBzbG90OwkvKiBNQ0EtU2xvdC0jICAgICAgICAgICAgICAgICAgICAgICAqLwotCXZvaWQgX19pb21lbSAqYmFzZTsKLQl2b2lkIF9faW9tZW0gKm1hY2Jhc2U7CS8qIGJhc2UgYWRkcmVzcyBvZiBNQUMgYWRkcmVzcyBQUk9NICovCi0Jdm9pZCBfX2lvbWVtICppb3JlZ2FkZHI7LyogYWRkcmVzcyBvZiBJL08tcmVnaXN0ZXIgKExvKSAgICAgKi8KLQl2b2lkIF9faW9tZW0gKmN0cmxhZGRyOwkvKiBhZGRyZXNzIG9mIGNvbnRyb2wvc3RhdCByZWdpc3RlciAqLwotCXZvaWQgX19pb21lbSAqY21kYWRkcjsJLyogYWRkcmVzcyBvZiBJL08tY29tbWFuZCByZWdpc3RlciAgKi8KLQlpbnQgbmV4dHJ4OwkJLyogaW5kZXggb2YgbmV4dCBSWCBkZXNjcmlwdG9yIHRvCi0JCQkJICAgYmUgcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlpbnQgbmV4dHR4cHV0OwkJLyogaW5kZXggb2YgbmV4dCBmcmVlIFRYIGRlc2NyaXB0b3IgKi8KLQlpbnQgbmV4dHR4ZG9uZTsJCS8qIGluZGV4IG9mIG5leHQgVFggZGVzY3JpcHRvciB0bwotCQkJCSAgIGJlIGZpbmlzaGVkICAgICAgICAgICAgICAgICAgICAgICovCi0JaW50IHR4YnVzeTsJCS8qICMgb2YgYnVzeSBUWCBkZXNjcmlwdG9ycyAgICAgICAgICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdDsJLyogcGFja2V0IHN0YXRpc3RpY3MgICAgICAgICAgICAqLwotCWludCByZWFsaXJxOwkJLyogbWVtb3JpemVzIGFjdHVhbCBJUlEsIGV2ZW4gd2hlbgotCQkJCSAgIGN1cnJlbnRseSBub3QgYWxsb2NhdGVkICAgICAgICAgICovCi0Jc2ttY2FfbWVkaXVtIG1lZGl1bTsJLyogcGh5c2ljYWwgY2FubmVjdG9yICAgICAgICAgICAgICAgKi8KLQlzcGlubG9ja190IGxvY2s7Ci19IHNrbWNhX3ByaXY7Ci0KLS8qIGNhcmQgcmVnaXN0ZXJzOiBjb250cm9sL3N0YXR1cyByZWdpc3RlciBiaXRzICovCi0KLSNkZWZpbmUgQ1RSTF9BRFJfREFUQSAgICAgIDAJLyogQml0IDAgPSAwIC0+YWNjZXNzIGRhdGEgcmVnaXN0ZXIgICovCi0jZGVmaW5lIENUUkxfQURSX1JBUCAgICAgICAxCS8qIEJpdCAwID0gMSAtPmFjY2VzcyBSQVAgcmVnaXN0ZXIgICAqLwotI2RlZmluZSBDVFJMX1JXX1dSSVRFICAgICAgMAkvKiBCaXQgMSA9IDAgLT53cml0ZSByZWdpc3RlciAgICAgICAgKi8KLSNkZWZpbmUgQ1RSTF9SV19SRUFEICAgICAgIDIJLyogQml0IDEgPSAxIC0+cmVhZCByZWdpc3RlciAgICAgICAgICovCi0jZGVmaW5lIENUUkxfUkVTRVRfT04gICAgICAwCS8qIEJpdCAzID0gMCAtPnJlc2V0IGJvYXJkICAgICAgICAgICAqLwotI2RlZmluZSBDVFJMX1JFU0VUX09GRiAgICAgOAkvKiBCaXQgMyA9IDEgLT5ubyByZXNldCBvZiBib2FyZCAgICAgKi8KLQotI2RlZmluZSBTVEFUX0FEUl9EQVRBICAgICAgMAkvKiBCaXQgMCBvZiBjdHJsIHJlZ2lzdGVyIHJlYWQgYmFjayAgKi8KLSNkZWZpbmUgU1RBVF9BRFJfUkFQICAgICAgIDEKLSNkZWZpbmUgU1RBVF9SV19XUklURSAgICAgIDAJLyogQml0IDEgb2YgY3RybCByZWdpc3RlciByZWFkIGJhY2sgICovCi0jZGVmaW5lIFNUQVRfUldfUkVBRCAgICAgICAyCi0jZGVmaW5lIFNUQVRfUkVTRVRfT04gICAgICAwCS8qIEJpdCAzIG9mIGN0cmwgcmVnaXN0ZXIgcmVhZCBiYWNrICAqLwotI2RlZmluZSBTVEFUX1JFU0VUX09GRiAgICAgOAotI2RlZmluZSBTVEFUX0lSUV9BQ1QgICAgICAgMAkvKiBpbnRlcnJ1cHQgcGVuZGluZyAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU1RBVF9JUlFfTk9BQ1QgICAgIDE2CS8qIG5vIGludGVycnVwdCBwZW5kaW5nICAgICAgICAgICAgICAqLwotI2RlZmluZSBTVEFUX0lPX05PQlVTWSAgICAgMAkvKiBubyB0cmFuc2ZlciBidXN5ICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU1RBVF9JT19CVVNZICAgICAgIDMyCS8qIHRyYW5zZmVyIGJ1c3kgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKiBJL08gY29tbWFuZCByZWdpc3RlciBiaXRzICovCi0KLSNkZWZpbmUgSU9DTURfR08gICAgICAgICAgIDEyOAkvKiBCaXQgNyA9IDEgLT4gc3RhcnQgcmVnaXN0ZXIgeGZlciAgKi8KLQotLyogTEFOQ0UgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgTEFOQ0VfQ1NSMCAgICAgICAgIDAJLyogU3RhdHVzL0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgQ1NSMF9FUlIgICAgICAgICAgIDB4ODAwMAkvKiBnZW5lcmFsIGVycm9yIGZsYWcgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9CQUJMICAgICAgICAgIDB4NDAwMAkvKiB0cmFuc21pdHRlciB0aW1lb3V0ICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9DRVJSICAgICAgICAgIDB4MjAwMAkvKiBjb2xsaXNpb24gZXJyb3IgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9NSVNTICAgICAgICAgIDB4MTAwMAkvKiBsb3N0IFJ4IGJsb2NrICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9NRVJSICAgICAgICAgIDB4MDgwMAkvKiBtZW1vcnkgYWNjZXNzIGVycm9yICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9SSU5UICAgICAgICAgIDB4MDQwMAkvKiByZWNlaXZlciBpbnRlcnJ1cHQgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9USU5UICAgICAgICAgIDB4MDIwMAkvKiB0cmFuc21pdHRlciBpbnRlcnJ1cHQgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9JRE9OICAgICAgICAgIDB4MDEwMAkvKiBpbml0aWFsaXphdGlvbiBkb25lICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9JTlRSICAgICAgICAgIDB4MDA4MAkvKiBnZW5lcmFsIGludGVycnVwdCBmbGFnICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9JTkVBICAgICAgICAgIDB4MDA0MAkvKiBpbnRlcnJ1cHQgZW5hYmxlICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9SWE9OICAgICAgICAgIDB4MDAyMAkvKiByZWNlaXZlciBlbmFibGVkICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9UWE9OICAgICAgICAgIDB4MDAxMAkvKiB0cmFuc21pdHRlciBlbmFibGVkICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9URE1EICAgICAgICAgIDB4MDAwOAkvKiBmb3JjZSB0cmFuc21pc3Npb24gbm93ICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9TVE9QICAgICAgICAgIDB4MDAwNAkvKiBzdG9wIExBTkNFICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9TVFJUICAgICAgICAgIDB4MDAwMgkvKiBzdGFydCBMQU5DRSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSMF9JTklUICAgICAgICAgIDB4MDAwMQkvKiByZWFkIGluaXRpYWxpemF0aW9uIGJsb2NrICAgICAgICAgKi8KLQotI2RlZmluZSBMQU5DRV9DU1IxICAgICAgICAgMQkvKiBhZGRyIGJpdCAwLi4xNSBvZiBpbml0aWFsaXphdGlvbiAgKi8KLSNkZWZpbmUgTEFOQ0VfQ1NSMiAgICAgICAgIDIJLyogICAgICAgICAgMTYuLjIzIGJsb2NrICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgTEFOQ0VfQ1NSMyAgICAgICAgIDMJLyogQnVzIGNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENTUjNfQkNPTl9IT0xEICAgICAwCS8qIEJpdCAwID0gMCAtPiBCTTEsQk0wLEhPTEQgICAgICAgICAqLwotI2RlZmluZSBDU1IzX0JDT05fQlVTUlEgICAgMQkvKiBCaXQgMCA9IDEgLT4gQlVTQUswLEJZVEUsQlVTUlEgICAgKi8KLSNkZWZpbmUgQ1NSM19BTEVfSElHSCAgICAgIDAJLyogQml0IDEgPSAwIC0+IEFMRSBhc3NlcnRlZCBoaWdoICAgICovCi0jZGVmaW5lIENTUjNfQUxFX0xPVyAgICAgICAyCS8qIEJpdCAxID0gMSAtPiBBTEUgYXNzZXJ0ZWQgbG93ICAgICAqLwotI2RlZmluZSBDU1IzX0JTV0FQX09GRiAgICAgMAkvKiBCaXQgMiA9IDAgLT4gbm8gYnl0ZSBzd2FwICAgICAgICAgKi8KLSNkZWZpbmUgQ1NSM19CU1dBUF9PTiAgICAgIDQJLyogQml0IDIgPSAxIC0+IGJ5dGUgc3dhcCAgICAgICAgICAgICovCi0KLS8qIExBTkNFIHN0cnVjdHVyZXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewkJLyogTEFOQ0UgaW5pdGlhbGl6YXRpb24gYmxvY2sgICAgICAgICovCi0JdTE2IE1vZGU7CQkvKiBtb2RlIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1OCBQQWRyWzZdOwkJLyogTUFDIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICovCi0JdTggTEFkckZbOF07CQkvKiBNdWx0aWNhc3QgZmlsdGVyICAgICAgICAgICAgICAgICAgKi8KLQl1MzIgUmRyUDsJCS8qIFJlY2VpdmUgZGVzY3JpcHRvciAgICAgICAgICAgICAgICAqLwotCXUzMiBUZHJQOwkJLyogVHJhbnNtaXQgZGVzY3JpcHRvciAgICAgICAgICAgICAgICovCi19IExBTkNFX0luaXRCbG9jazsKLQotLyogTW9kZSBmbGFncyBpbml0IGJsb2NrICovCi0KLSNkZWZpbmUgTEFOQ0VfSU5JVF9QUk9NICAgIDB4ODAwMAkvKiBlbmFibGUgcHJvbWlzY291cyBtb2RlICAgICAgICAgICAgKi8KLSNkZWZpbmUgTEFOQ0VfSU5JVF9JTlRMICAgIDB4MDA0MAkvKiBpbnRlcm5hbCBsb29wYmFjayAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTEFOQ0VfSU5JVF9EUlRZICAgIDB4MDAyMAkvKiBkaXNhYmxlIHJldHJ5ICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTEFOQ0VfSU5JVF9DT0xMICAgIDB4MDAxMAkvKiBmb3JjZSBjb2xsaXNpb24gICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTEFOQ0VfSU5JVF9EVENSICAgIDB4MDAwOAkvKiBkaXNhYmxlIHRyYW5zbWl0IENSQyAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTEFOQ0VfSU5JVF9MT09QICAgIDB4MDAwNAkvKiBsb29wYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTEFOQ0VfSU5JVF9EVFggICAgIDB4MDAwMgkvKiBkaXNhYmxlIHRyYW5zbWl0dGVyICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTEFOQ0VfSU5JVF9EUlggICAgIDB4MDAwMQkvKiBkaXNhYmxlIHJlY2VpdmVyICAgICAgICAgICAgICAgICAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewkJLyogTEFOQ0UgVHggZGVzY3JpcHRvciAgICAgICAgICAgICAgICovCi0JdTE2IExvd0FkZHI7CQkvKiBiaXQgMC4uMTUgb2YgYWRkcmVzcyAgICAgICAgICAgICAgKi8KLQl1MTYgRmxhZ3M7CQkvKiBiaXQgMTYuLjIzIG9mIGFkZHJlc3MgKyBGbGFncyAgICAgKi8KLQl1MTYgTGVuOwkJLyogMnMgY29tcGxlbWVudCBvZiBwYWNrZXQgbGVuZ3RoICAgICovCi0JdTE2IFN0YXR1czsJCS8qIFJlc3VsdCBvZiB0cmFuc21pc3Npb24gICAgICAgICAgICAqLwotfSBMQU5DRV9UeERlc2NyOwotCi0jZGVmaW5lIFRYRFNDUl9GTEFHU19PV04gICAweDgwMDAJLyogTEFOQ0Ugb3ducyBkZXNjcmlwdG9yICAgICAgICAgICAgICovCi0jZGVmaW5lIFRYRFNDUl9GTEFHU19FUlIgICAweDQwMDAJLyogc3VtbWFyeSBlcnJvciBmbGFnICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRYRFNDUl9GTEFHU19NT1JFICAweDEwMDAJLyogbW9yZSB0aGFuIG9uZSByZXRyeSBuZWVkZWQ/ICAgICAgICovCi0jZGVmaW5lIFRYRFNDUl9GTEFHU19PTkUgICAweDA4MDAJLyogb25lIHJldHJ5PyAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRYRFNDUl9GTEFHU19ERUYgICAweDA0MDAJLyogdHJhbnNtaXNzaW9uIGRlZmVycmVkPyAgICAgICAgICAgICovCi0jZGVmaW5lIFRYRFNDUl9GTEFHU19TVFAgICAweDAyMDAJLyogZmlyc3QgcGFja2V0IGluIGNoYWluPyAgICAgICAgICAgICovCi0jZGVmaW5lIFRYRFNDUl9GTEFHU19FTlAgICAweDAxMDAJLyogbGFzdCBwYWNrZXQgaW4gY2hhaW4/ICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgVFhEU0NSX1NUQVRVU19CVUZGIDB4ODAwMAkvKiBidWZmZXIgZXJyb3I/ICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFhEU0NSX1NUQVRVU19VRkxPIDB4NDAwMAkvKiBzaWxvIHVuZGVyZmxvdyBkdXJpbmcgdHJhbnNtaXQ/ICAgKi8KLSNkZWZpbmUgVFhEU0NSX1NUQVRVU19MQ09MIDB4MTAwMAkvKiBsYXRlIGNvbGxpc2lvbj8gICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFhEU0NSX1NUQVRVU19MQ0FSIDB4MDgwMAkvKiBsb3NzIG9mIGNhcnJpZXI/ICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFhEU0NSX1NUQVRVU19SVFJZIDB4MDQwMAkvKiByZXRyeSBlcnJvcj8gICAgICAgICAgICAgICAgICAgICAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewkJLyogTEFOQ0UgUnggZGVzY3JpcHRvciAgICAgICAgICAgICAgICovCi0JdTE2IExvd0FkZHI7CQkvKiBiaXQgMC4uMTUgb2YgYWRkcmVzcyAgICAgICAgICAgICAgKi8KLQl1MTYgRmxhZ3M7CQkvKiBiaXQgMTYuLjIzIG9mIGFkZHJlc3MgKyBGbGFncyAgICAgKi8KLQl1MTYgTWF4TGVuOwkJLyogMnMgY29tcGxlbWVudCBvZiBidWZmZXIgbGVuZ3RoICAgICovCi0JdTE2IExlbjsJCS8qIHBhY2tldCBsZW5ndGggICAgICAgICAgICAgICAgICAgICAqLwotfSBMQU5DRV9SeERlc2NyOwotCi0jZGVmaW5lIFJYRFNDUl9GTEFHU19PV04gICAweDgwMDAJLyogTEFOQ0Ugb3ducyBkZXNjcmlwdG9yICAgICAgICAgICAgICovCi0jZGVmaW5lIFJYRFNDUl9GTEFHU19FUlIgICAweDQwMDAJLyogc3VtbWFyeSBlcnJvciBmbGFnICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFJYRFNDUl9GTEFHU19GUkFNICAweDIwMDAJLyogZnJhbWluZyBlcnJvciBmbGFnICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFJYRFNDUl9GTEFHU19PRkxPICAweDEwMDAJLyogRklGTyBvdmVyZmxvdz8gICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFJYRFNDUl9GTEFHU19DUkMgICAweDA4MDAJLyogQ1JDIGVycm9yPyAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFJYRFNDUl9GTEFHU19CVUZGICAweDA0MDAJLyogYnVmZmVyIGVycm9yPyAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFJYRFNDUl9GTEFHU19TVFAgICAweDAyMDAJLyogZmlyc3QgcGFja2V0IGluIGNoYWluPyAgICAgICAgICAgICovCi0jZGVmaW5lIFJYRENTUl9GTEFHU19FTlAgICAweDAxMDAJLyogbGFzdCBwYWNrZXQgaW4gY2hhaW4/ICAgICAgICAgICAgICovCi0KLS8qIFJBTSBsYXlvdXQgKi8KLQotI2RlZmluZSBUWENPVU5UICAgICAgICAgICAgNAkvKiBsZW5ndGggb2YgVFggZGVzY3JpcHRvciBxdWV1ZSAgICAgKi8KLSNkZWZpbmUgTFRYQ09VTlQgICAgICAgICAgIDIJLyogbG9nMiBvZiBpdCAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFJYQ09VTlQgICAgICAgICAgICA0CS8qIGxlbmd0aCBvZiBSWCBkZXNjcmlwdG9yIHF1ZXVlICAgICAqLwotI2RlZmluZSBMUlhDT1VOVCAgICAgICAgICAgMgkvKiBsb2cyIG9mIGl0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBSQU1fSU5JVEJBU0UgICAgICAgMAkvKiBMQU5DRSBpbml0IGJsb2NrICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUkFNX1RYQkFTRSAgICAgICAgIDI0CS8qIFN0YXJ0IG9mIFRYIGRlc2NyaXB0b3IgcXVldWUgICAgICAqLwotI2RlZmluZSBSQU1fUlhCQVNFICAgICAgICAgXAotKFJBTV9UWEJBU0UgKyAoVFhDT1VOVCAqIDgpKQkvKiBTdGFydCBvZiBSWCBkZXNjcmlwdG9yIHF1ZXVlICAgICAgKi8KLSNkZWZpbmUgUkFNX0RBVEFCQVNFICAgICAgIFwKLShSQU1fUlhCQVNFICsgKFJYQ09VTlQgKiA4KSkJLyogU3RhcnQgb2YgZGF0YSBhcmVhIGZvciBmcmFtZXMgICAgICovCi0jZGVmaW5lIFJBTV9CVUZTSVpFICAgICAgICAxNTgwCS8qIG1heC4gZnJhbWUgc2l6ZSAtIHNob3VsZCBuZXZlciBiZQotCQkJCSAgIHJlYWNoZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZW5kaWYJCQkJLyogX1NLX01DQV9EUklWRVJfICovCi0KLSNlbmRpZgkvKiBfU0tfTUNBX0lOQ0xVREVfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2Nhbi5jIGIvZHJpdmVycy9uZXQvc2tmcC9jYW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0OWFiYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL2Nhbi5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCShDKUNvcHlyaWdodCAxOTk4LDE5OTkgU3lzS29ubmVjdCwKLSAqCWEgYnVzaW5lc3MgdW5pdCBvZiBTY2huZWlkZXIgJiBLb2NoICYgQ28uIERhdGVuc3lzdGVtZSBHbWJILgotICoKLSAqCVNlZSB0aGUgZmlsZSAic2tmZGRpLmMiIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgotICoKLSAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICoJVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgZmlsZSBpcyBwcm92aWRlZCAiQVMgSVMiIHdpdGhvdXQgd2FycmFudHkuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZglsaW50Ci1zdGF0aWMgY29uc3QgY2hhciB4SURfc2Njc1tdID0gIkAoIyljYW4uYwkxLjUgOTcvMDQvMDcgKEMpIFNLICIgOwotI2VuZGlmCi0KLS8qCi0gKiBjYW5vbmljYWwgYml0IG9yZGVyCi0gKi8KLWNvbnN0IHVfY2hhciBjYW5vbmljYWxbMjU2XSA9IHsKLQkweDAwLDB4ODAsMHg0MCwweGMwLDB4MjAsMHhhMCwweDYwLDB4ZTAsCi0JMHgxMCwweDkwLDB4NTAsMHhkMCwweDMwLDB4YjAsMHg3MCwweGYwLAotCTB4MDgsMHg4OCwweDQ4LDB4YzgsMHgyOCwweGE4LDB4NjgsMHhlOCwKLQkweDE4LDB4OTgsMHg1OCwweGQ4LDB4MzgsMHhiOCwweDc4LDB4ZjgsCi0JMHgwNCwweDg0LDB4NDQsMHhjNCwweDI0LDB4YTQsMHg2NCwweGU0LAotCTB4MTQsMHg5NCwweDU0LDB4ZDQsMHgzNCwweGI0LDB4NzQsMHhmNCwKLQkweDBjLDB4OGMsMHg0YywweGNjLDB4MmMsMHhhYywweDZjLDB4ZWMsCi0JMHgxYywweDljLDB4NWMsMHhkYywweDNjLDB4YmMsMHg3YywweGZjLAotCTB4MDIsMHg4MiwweDQyLDB4YzIsMHgyMiwweGEyLDB4NjIsMHhlMiwKLQkweDEyLDB4OTIsMHg1MiwweGQyLDB4MzIsMHhiMiwweDcyLDB4ZjIsCi0JMHgwYSwweDhhLDB4NGEsMHhjYSwweDJhLDB4YWEsMHg2YSwweGVhLAotCTB4MWEsMHg5YSwweDVhLDB4ZGEsMHgzYSwweGJhLDB4N2EsMHhmYSwKLQkweDA2LDB4ODYsMHg0NiwweGM2LDB4MjYsMHhhNiwweDY2LDB4ZTYsCi0JMHgxNiwweDk2LDB4NTYsMHhkNiwweDM2LDB4YjYsMHg3NiwweGY2LAotCTB4MGUsMHg4ZSwweDRlLDB4Y2UsMHgyZSwweGFlLDB4NmUsMHhlZSwKLQkweDFlLDB4OWUsMHg1ZSwweGRlLDB4M2UsMHhiZSwweDdlLDB4ZmUsCi0JMHgwMSwweDgxLDB4NDEsMHhjMSwweDIxLDB4YTEsMHg2MSwweGUxLAotCTB4MTEsMHg5MSwweDUxLDB4ZDEsMHgzMSwweGIxLDB4NzEsMHhmMSwKLQkweDA5LDB4ODksMHg0OSwweGM5LDB4MjksMHhhOSwweDY5LDB4ZTksCi0JMHgxOSwweDk5LDB4NTksMHhkOSwweDM5LDB4YjksMHg3OSwweGY5LAotCTB4MDUsMHg4NSwweDQ1LDB4YzUsMHgyNSwweGE1LDB4NjUsMHhlNSwKLQkweDE1LDB4OTUsMHg1NSwweGQ1LDB4MzUsMHhiNSwweDc1LDB4ZjUsCi0JMHgwZCwweDhkLDB4NGQsMHhjZCwweDJkLDB4YWQsMHg2ZCwweGVkLAotCTB4MWQsMHg5ZCwweDVkLDB4ZGQsMHgzZCwweGJkLDB4N2QsMHhmZCwKLQkweDAzLDB4ODMsMHg0MywweGMzLDB4MjMsMHhhMywweDYzLDB4ZTMsCi0JMHgxMywweDkzLDB4NTMsMHhkMywweDMzLDB4YjMsMHg3MywweGYzLAotCTB4MGIsMHg4YiwweDRiLDB4Y2IsMHgyYiwweGFiLDB4NmIsMHhlYiwKLQkweDFiLDB4OWIsMHg1YiwweGRiLDB4M2IsMHhiYiwweDdiLDB4ZmIsCi0JMHgwNywweDg3LDB4NDcsMHhjNywweDI3LDB4YTcsMHg2NywweGU3LAotCTB4MTcsMHg5NywweDU3LDB4ZDcsMHgzNywweGI3LDB4NzcsMHhmNywKLQkweDBmLDB4OGYsMHg0ZiwweGNmLDB4MmYsMHhhZiwweDZmLDB4ZWYsCi0JMHgxZiwweDlmLDB4NWYsMHhkZiwweDNmLDB4YmYsMHg3ZiwweGZmCi19IDsKLQotI2lmZGVmCU1BS0VfVEFCTEUKLWludCBieXRlX3JldmVyc2UoeCkKLWludCB4IDsKLXsKLQlpbnQgICAgIHkgPSAwIDsKLQotCWlmICh4ICYgMHgwMSkKLQkJeSB8PSAweDgwIDsKLQlpZiAoeCAmIDB4MDIpCi0JCXkgfD0gMHg0MCA7Ci0JaWYgKHggJiAweDA0KQotCQl5IHw9IDB4MjAgOwotCWlmICh4ICYgMHgwOCkKLQkJeSB8PSAweDEwIDsKLQlpZiAoeCAmIDB4MTApCi0JCXkgfD0gMHgwOCA7Ci0JaWYgKHggJiAweDIwKQotCQl5IHw9IDB4MDQgOwotCWlmICh4ICYgMHg0MCkKLQkJeSB8PSAweDAyIDsKLQlpZiAoeCAmIDB4ODApCi0JCXkgfD0gMHgwMSA7Ci0JcmV0dXJuKHkpIDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9kcnZmYmkuYyBiL2RyaXZlcnMvbmV0L3NrZnAvZHJ2ZmJpLmMKaW5kZXggNWI0NzU4My4uNGZlNjI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9kcnZmYmkuYworKysgYi9kcml2ZXJzL25ldC9za2ZwL2RydmZiaS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAiaC9zbWMuaCIKICNpbmNsdWRlICJoL3N1cGVybl8yLmgiCiAjaW5jbHVkZSAiaC9za2ZiaWluYy5oIgorI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgogCiAjaWZuZGVmCWxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIElEX3NjY3NbXSA9ICJAKCMpZHJ2ZmJpLmMJMS42MyA5OS8wMi8xMSAoQykgU0sgIiA7CkBAIC00NDUsMTYgKzQ0NiwxNCBAQAogCWNoYXIgUG1kVHlwZSA7CiAJaW50CWkgOwogCi0JZXh0ZXJuIGNvbnN0IHVfY2hhciBjYW5vbmljYWxbMjU2XSA7Ci0KICNpZgkoZGVmaW5lZChJU0EpIHx8IGRlZmluZWQoTUNBKSkKIAlmb3IgKGkgPSAwOyBpIDwgNCA7aSsrKSB7CS8qIHJlYWQgbWFjIGFkZHJlc3MgZnJvbSBib2FyZCAqLwogCQlzbWMtPmh3LmZkZGlfcGh5c19hZGRyLmFbaV0gPQotCQkJY2Fub25pY2FsWyhpbnB3KFBSX0EoaStTQV9NQUMpKSYweGZmKV0gOworCQkJYml0cmV2OChpbnB3KFBSX0EoaStTQV9NQUMpKSk7CiAJfQogCWZvciAoaSA9IDQ7IGkgPCA2OyBpKyspIHsKIAkJc21jLT5ody5mZGRpX3BoeXNfYWRkci5hW2ldID0KLQkJCWNhbm9uaWNhbFsoaW5wdyhQUl9BKGkrU0FfTUFDK1BSQV9PRkYpKSYweGZmKV0gOworCQkJYml0cmV2OChpbnB3KFBSX0EoaStTQV9NQUMrUFJBX09GRikpKTsKIAl9CiAjZW5kaWYKICNpZmRlZglFSVNBCkBAIC00NjQsMTcgKzQ2MywxNyBAQAogCSAqLwogCWZvciAoaSA9IDA7IGkgPCA0IDtpKyspIHsJLyogcmVhZCBtYWMgYWRkcmVzcyBmcm9tIGJvYXJkICovCiAJCXNtYy0+aHcuZmRkaV9waHlzX2FkZHIuYVtpXSA9Ci0JCQljYW5vbmljYWxbaW5wKFBSX0EoaStTQV9NQUMpKV0gOworCQkJYml0cmV2OChpbnAoUFJfQShpK1NBX01BQykpKTsKIAl9CiAJZm9yIChpID0gNDsgaSA8IDY7IGkrKykgewogCQlzbWMtPmh3LmZkZGlfcGh5c19hZGRyLmFbaV0gPQotCQkJY2Fub25pY2FsW2lucChQUl9BKGkrU0FfTUFDK1BSQV9PRkYpKV0gOworCQkJYml0cmV2OChpbnAoUFJfQShpK1NBX01BQytQUkFfT0ZGKSkpOwogCX0KICNlbmRpZgogI2lmZGVmCVBDSQogCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsJLyogcmVhZCBtYWMgYWRkcmVzcyBmcm9tIGJvYXJkICovCiAJCXNtYy0+aHcuZmRkaV9waHlzX2FkZHIuYVtpXSA9Ci0JCQljYW5vbmljYWxbaW5wKEFERFIoQjJfTUFDXzAraSkpXSA7CisJCQliaXRyZXY4KGlucChBRERSKEIyX01BQ18wK2kpKSk7CiAJfQogI2VuZGlmCiAjaWZuZGVmCVBDSQpAQCAtNDkzLDcgKzQ5Miw3IEBACiAJaWYgKG1hY19hZGRyKSB7CiAJCWZvciAoaSA9IDA7IGkgPCA2IDtpKyspIHsKIAkJCXNtYy0+aHcuZmRkaV9jYW5vbl9hZGRyLmFbaV0gPSBtYWNfYWRkcltpXSA7Ci0JCQlzbWMtPmh3LmZkZGlfaG9tZV9hZGRyLmFbaV0gPSBjYW5vbmljYWxbbWFjX2FkZHJbaV1dIDsKKwkJCXNtYy0+aHcuZmRkaV9ob21lX2FkZHIuYVtpXSA9IGJpdHJldjgobWFjX2FkZHJbaV0pOwogCQl9CiAJCXJldHVybiA7CiAJfQpAQCAtNTAxLDcgKzUwMCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgNiA7aSsrKSB7CiAJCXNtYy0+aHcuZmRkaV9jYW5vbl9hZGRyLmFbaV0gPQotCQkJY2Fub25pY2FsW3NtYy0+aHcuZmRkaV9waHlzX2FkZHIuYVtpXV0gOworCQkJYml0cmV2OChzbWMtPmh3LmZkZGlfcGh5c19hZGRyLmFbaV0pOwogCX0KIH0KIApAQCAtMTI2OSwxMSArMTI2OCw4IEBACiB7CiAJaW50IGkgOwogCi0JZXh0ZXJuIGNvbnN0IHVfY2hhciBjYW5vbmljYWxbMjU2XSA7Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IDYgOyBpKyspIHsKLQkJYmlhX2FkZHItPmFbaV0gPSBjYW5vbmljYWxbc21jLT5ody5mZGRpX3BoeXNfYWRkci5hW2ldXSA7Ci0JfQorCWZvciAoaSA9IDAgOyBpIDwgNiA7IGkrKykKKwkJYmlhX2FkZHItPmFbaV0gPSBiaXRyZXY4KHNtYy0+aHcuZmRkaV9waHlzX2FkZHIuYVtpXSk7CiB9CiAKIHZvaWQgc210X3N0YXJ0X3dhdGNoZG9nKHN0cnVjdCBzX3NtYyAqc21jKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9mcGx1c3RtLmMgYi9kcml2ZXJzL25ldC9za2ZwL2ZwbHVzdG0uYwppbmRleCAwNzg0ZjU1Li5hNDUyMDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL2ZwbHVzdG0uYworKysgYi9kcml2ZXJzL25ldC9za2ZwL2ZwbHVzdG0uYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgImgvZmRkaS5oIgogI2luY2x1ZGUgImgvc21jLmgiCiAjaW5jbHVkZSAiaC9zdXBlcm5fMi5oIgotI2luY2x1ZGUgImNhbi5jIgorI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgogCiAjaWZuZGVmCWxpbnQKIHN0YXRpYyBjb25zdCBjaGFyIElEX3NjY3NbXSA9ICJAKCMpZnBsdXN0bS5jCTEuMzIgOTkvMDIvMjMgKEMpIFNLICIgOwpAQCAtMTA3Myw3ICsxMDczLDcgQEAKIAlpZiAoY2FuKSB7CiAJCXAgPSBvd24tPmEgOwogCQlmb3IgKGkgPSAwIDsgaSA8IDYgOyBpKyssIHArKykKLQkJCSpwID0gY2Fub25pY2FsWypwXSA7CisJCQkqcCA9IGJpdHJldjgoKnApOwogCX0KIAlzbG90ID0gTlVMTDsKIAlmb3IgKGkgPSAwLCB0YiA9IHNtYy0+aHcuZnAubWMudGFibGUgOyBpIDwgRlBNQVhfTVVMVElDQVNUIDsgaSsrLCB0YisrKXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc210LmMgYi9kcml2ZXJzL25ldC9za2ZwL3NtdC5jCmluZGV4IDk5YTc3NmEuLmZlODQ3ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvc210LmMKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9zbXQuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgImgvZmRkaS5oIgogI2luY2x1ZGUgImgvc21jLmgiCiAjaW5jbHVkZSAiaC9zbXRfcC5oIgorI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgogCiAjZGVmaW5lIEtFUk5FTAogI2luY2x1ZGUgImgvc210c3RhdGUuaCIKQEAgLTI2LDggKzI3LDYgQEAKIHN0YXRpYyBjb25zdCBjaGFyIElEX3NjY3NbXSA9ICJAKCMpc210LmMJMi40MyA5OC8xMS8yMyAoQykgU0sgIiA7CiAjZW5kaWYKIAotZXh0ZXJuIGNvbnN0IHVfY2hhciBjYW5vbmljYWxbMjU2XSA7Ci0KIC8qCiAgKiBGQyBpbiBTTWJ1ZgogICovCkBAIC0xODAsNyArMTc5LDcgQEAKIAlkcml2ZXJfZ2V0X2JpYShzbWMsJnNtYy0+bWliLmZkZGlTTVRTdGF0aW9uSWQuc2lkX25vZGUpIDsKIAlmb3IgKGkgPSAwIDsgaSA8IDYgOyBpICsrKSB7CiAJCXNtYy0+bWliLmZkZGlTTVRTdGF0aW9uSWQuc2lkX25vZGUuYVtpXSA9Ci0JCQljYW5vbmljYWxbc21jLT5taWIuZmRkaVNNVFN0YXRpb25JZC5zaWRfbm9kZS5hW2ldXSA7CisJCQliaXRyZXY4KHNtYy0+bWliLmZkZGlTTVRTdGF0aW9uSWQuc2lkX25vZGUuYVtpXSk7CiAJfQogCXNtYy0+bWliLmZkZGlTTVRNYW51ZmFjdHVyZXJEYXRhWzBdID0KIAkJc21jLT5taWIuZmRkaVNNVFN0YXRpb25JZC5zaWRfbm9kZS5hWzBdIDsKQEAgLTIwNDksOSArMjA0OCw4IEBACiAKIAlTS19VTlVTRUQoc21jKSA7CiAKLQlmb3IgKGkgPSBsZW47IGkgOyBpLS0sIGRhdGErKykgewotCQkqZGF0YSA9IGNhbm9uaWNhbFsqKHVfY2hhciAqKWRhdGFdIDsKLQl9CisJZm9yIChpID0gbGVuOyBpIDsgaS0tLCBkYXRhKyspCisJCSpkYXRhID0gYml0cmV2OCgqZGF0YSk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tnZS5jIGIvZHJpdmVycy9uZXQvc2tnZS5jCmluZGV4IDQ1MjgzZjMuLmU0ODJlN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZ2UuYworKysgYi9kcml2ZXJzL25ldC9za2dlLmMKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlICJza2dlLmgiCiAKICNkZWZpbmUgRFJWX05BTUUJCSJza2dlIgotI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuOSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIxLjEwIgogI2RlZmluZSBQRlgJCQlEUlZfTkFNRSAiICIKIAogI2RlZmluZSBERUZBVUxUX1RYX1JJTkdfU0laRQkxMjgKQEAgLTEzMiwxOCArMTMyLDkzIEBACiB9CiAKIC8qIFdha2Ugb24gTGFuIG9ubHkgc3VwcG9ydGVkIG9uIFl1a29uIGNoaXBzIHdpdGggcmV2IDEgb3IgYWJvdmUgKi8KLXN0YXRpYyBpbnQgd29sX3N1cHBvcnRlZChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcpCitzdGF0aWMgdTMyIHdvbF9zdXBwb3J0ZWQoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3KQogewotCXJldHVybiAhKChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMgfHwKLQkJICAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTiAmJiBody0+Y2hpcF9yZXYgPT0gMCkpKTsKKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTiAmJiBody0+Y2hpcF9yZXYgIT0gMCkKKwkJcmV0dXJuIFdBS0VfTUFHSUMgfCBXQUtFX1BIWTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIHBjaV93YWtlX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgcG0gPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9QTSk7CisJdTE2IHZhbHVlOworCisJLyogSWYgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBQTSBDYXBhYmlsaXRpZXMsIGJ1dCByZXF1ZXN0IGlzIHRvIGRpc2FibGUKKwkgKiB3YWtlIGV2ZW50cywgaXQncyBhIG5vcDsgb3RoZXJ3aXNlIGZhaWwgKi8KKwlpZiAoIXBtKQorCQlyZXR1cm4gMDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG0gKyBQQ0lfUE1fUE1DLCAmdmFsdWUpOworCisJdmFsdWUgJj0gUENJX1BNX0NBUF9QTUVfTUFTSzsKKwl2YWx1ZSA+Pj0gZmZzKFBDSV9QTV9DQVBfUE1FX01BU0spIC0gMTsgICAvKiBGaXJzdCBiaXQgb2YgbWFzayAqLworCisJcmV0dXJuIHZhbHVlICE9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNrZ2Vfd29sX2luaXQoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKK3sKKwlzdHJ1Y3Qgc2tnZV9odyAqaHcgPSBza2dlLT5odzsKKwlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CisJZW51bSBwYXVzZV9jb250cm9sIHNhdmVfbW9kZTsKKwl1MzIgY3RybDsKKworCS8qIEJyaW5nIGhhcmR3YXJlIG91dCBvZiByZXNldCAqLworCXNrZ2Vfd3JpdGUxNihodywgQjBfQ1RTVCwgQ1NfUlNUX0NMUik7CisJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgR01BQ19MSU5LX0NUUkwpLCBHTUxDX1JTVF9DTFIpOworCisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHUEhZX0NUUkwpLCBHUENfUlNUX0NMUik7CisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUlNUX0NMUik7CisKKwkvKiBGb3JjZSB0byAxMC8xMDAgc2tnZV9yZXNldCB3aWxsIHJlLWVuYWJsZSBvbiByZXN1bWUJICovCisJc2F2ZV9tb2RlID0gc2tnZS0+Zmxvd19jb250cm9sOworCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9TWU1NRVRSSUM7CisKKwljdHJsID0gc2tnZS0+YWR2ZXJ0aXNpbmc7CisJc2tnZS0+YWR2ZXJ0aXNpbmcgJj0gfihBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmfEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOworCisJc2tnZV9waHlfcmVzZXQoc2tnZSk7CisKKwlza2dlLT5mbG93X2NvbnRyb2wgPSBzYXZlX21vZGU7CisJc2tnZS0+YWR2ZXJ0aXNpbmcgPSBjdHJsOworCisJLyogU2V0IEdNQUMgdG8gbm8gZmxvdyBjb250cm9sIGFuZCBhdXRvIHVwZGF0ZSBmb3Igc3BlZWQvZHVwbGV4ICovCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsCisJCSAgICBHTV9HUENSX0ZDX1RYX0RJU3xHTV9HUENSX1RYX0VOQXxHTV9HUENSX1JYX0VOQXwKKwkJICAgIEdNX0dQQ1JfRFVQX0ZVTEx8R01fR1BDUl9GQ19SWF9ESVN8R01fR1BDUl9BVV9GQ1RfRElTKTsKKworCS8qIFNldCBXT0wgYWRkcmVzcyAqLworCW1lbWNweV90b2lvKGh3LT5yZWdzICsgV09MX1JFR1MocG9ydCwgV09MX01BQ19BRERSKSwKKwkJICAgIHNrZ2UtPm5ldGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKworCS8qIFR1cm4gb24gYXBwcm9wcmlhdGUgV09MIGNvbnRyb2wgYml0cyAqLworCXNrZ2Vfd3JpdGUxNihodywgV09MX1JFR1MocG9ydCwgV09MX0NUUkxfU1RBVCksIFdPTF9DVExfQ0xFQVJfUkVTVUxUKTsKKwljdHJsID0gMDsKKwlpZiAoc2tnZS0+d29sICYgV0FLRV9QSFkpCisJCWN0cmwgfD0gV09MX0NUTF9FTkFfUE1FX09OX0xJTktfQ0hHfFdPTF9DVExfRU5BX0xJTktfQ0hHX1VOSVQ7CisJZWxzZQorCQljdHJsIHw9IFdPTF9DVExfRElTX1BNRV9PTl9MSU5LX0NIR3xXT0xfQ1RMX0RJU19MSU5LX0NIR19VTklUOworCisJaWYgKHNrZ2UtPndvbCAmIFdBS0VfTUFHSUMpCisJCWN0cmwgfD0gV09MX0NUTF9FTkFfUE1FX09OX01BR0lDX1BLVHxXT0xfQ1RMX0VOQV9NQUdJQ19QS1RfVU5JVDsKKwllbHNlCisJCWN0cmwgfD0gV09MX0NUTF9ESVNfUE1FX09OX01BR0lDX1BLVHxXT0xfQ1RMX0RJU19NQUdJQ19QS1RfVU5JVDs7CisKKwljdHJsIHw9IFdPTF9DVExfRElTX1BNRV9PTl9QQVRURVJOfFdPTF9DVExfRElTX1BBVFRFUk5fVU5JVDsKKwlza2dlX3dyaXRlMTYoaHcsIFdPTF9SRUdTKHBvcnQsIFdPTF9DVFJMX1NUQVQpLCBjdHJsKTsKKworCS8qIGJsb2NrIHJlY2VpdmVyICovCisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9TRVQpOwogfQogCiBzdGF0aWMgdm9pZCBza2dlX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQogewogCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jd29sLT5zdXBwb3J0ZWQgPSB3b2xfc3VwcG9ydGVkKHNrZ2UtPmh3KSA/IFdBS0VfTUFHSUMgOiAwOwotCXdvbC0+d29sb3B0cyA9IHNrZ2UtPndvbCA/IFdBS0VfTUFHSUMgOiAwOworCXdvbC0+c3VwcG9ydGVkID0gd29sX3N1cHBvcnRlZChza2dlLT5odyk7CisJd29sLT53b2xvcHRzID0gc2tnZS0+d29sOwogfQogCiBzdGF0aWMgaW50IHNrZ2Vfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCkBAIC0xNTEsMjMgKzIyNiwxMiBAQAogCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OwogCi0JaWYgKHdvbC0+d29sb3B0cyAhPSBXQUtFX01BR0lDICYmIHdvbC0+d29sb3B0cyAhPSAwKQorCWlmICh3b2wtPndvbG9wdHMgJiB3b2xfc3VwcG9ydGVkKGh3KSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JaWYgKHdvbC0+d29sb3B0cyA9PSBXQUtFX01BR0lDICYmICF3b2xfc3VwcG9ydGVkKGh3KSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0Jc2tnZS0+d29sID0gd29sLT53b2xvcHRzID09IFdBS0VfTUFHSUM7Ci0KLQlpZiAoc2tnZS0+d29sKSB7Ci0JCW1lbWNweV90b2lvKGh3LT5yZWdzICsgV09MX01BQ19BRERSLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0KLQkJc2tnZV93cml0ZTE2KGh3LCBXT0xfQ1RSTF9TVEFULAotCQkJICAgICBXT0xfQ1RMX0VOQV9QTUVfT05fTUFHSUNfUEtUIHwKLQkJCSAgICAgV09MX0NUTF9FTkFfTUFHSUNfUEtUX1VOSVQpOwotCX0gZWxzZQotCQlza2dlX3dyaXRlMTYoaHcsIFdPTF9DVFJMX1NUQVQsIFdPTF9DVExfREVGQVVMVCk7Ci0KKwlza2dlLT53b2wgPSB3b2wtPndvbG9wdHM7CisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXNrZ2Vfd29sX2luaXQoc2tnZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzNzMsNiArMjQzNyw5IEBACiAJc2l6ZV90IHJ4X3NpemUsIHR4X3NpemU7CiAJaW50IGVycjsKIAorCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAobmV0aWZfbXNnX2lmdXAoc2tnZSkpCiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogZW5hYmxpbmcgaW50ZXJmYWNlXG4iLCBkZXYtPm5hbWUpOwogCkBAIC0yMzkyLDcgKzI0NTksNyBAQAogCUJVR19PTihza2dlLT5kbWEgJiA3KTsKIAogCWlmICgodTY0KXNrZ2UtPmRtYSA+PiAzMiAhPSAoKHU2NCkgc2tnZS0+ZG1hICsgc2tnZS0+bWVtX3NpemUpID4+IDMyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggInBjaV9hbGxvY19jb25zaXN0ZW50IHJlZ2lvbiBjcm9zc2VzIDRHIGJvdW5kYXJ5XG4iKTsKKwkJZGV2X2VycigmaHctPnBkZXYtPmRldiwgInBjaV9hbGxvY19jb25zaXN0ZW50IHJlZ2lvbiBjcm9zc2VzIDRHIGJvdW5kYXJ5XG4iKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBmcmVlX3BjaV9tZW07CiAJfQpAQCAtMzAwMSw2ICszMDY4LDcgQEAKIC8qIEhhbmRsZSBkZXZpY2Ugc3BlY2lmaWMgZnJhbWluZyBhbmQgdGltZW91dCBpbnRlcnJ1cHRzICovCiBzdGF0aWMgdm9pZCBza2dlX2Vycm9yX2lycShzdHJ1Y3Qgc2tnZV9odyAqaHcpCiB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBody0+cGRldjsKIAl1MzIgaHdzdGF0dXMgPSBza2dlX3JlYWQzMihodywgQjBfSFdFX0lTUkMpOwogCiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykgewpAQCAtMzAxNiwxMiArMzA4NCwxMiBAQAogCX0KIAogCWlmIChod3N0YXR1cyAmIElTX1JBTV9SRF9QQVIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUmFtIHJlYWQgZGF0YSBwYXJpdHkgZXJyb3JcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJSYW0gcmVhZCBkYXRhIHBhcml0eSBlcnJvclxuIik7CiAJCXNrZ2Vfd3JpdGUxNihodywgQjNfUklfQ1RSTCwgUklfQ0xSX1JEX1BFUlIpOwogCX0KIAogCWlmIChod3N0YXR1cyAmIElTX1JBTV9XUl9QQVIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiUmFtIHdyaXRlIGRhdGEgcGFyaXR5IGVycm9yXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUmFtIHdyaXRlIGRhdGEgcGFyaXR5IGVycm9yXG4iKTsKIAkJc2tnZV93cml0ZTE2KGh3LCBCM19SSV9DVFJMLCBSSV9DTFJfV1JfUEVSUik7CiAJfQogCkBAIC0zMDMyLDM4ICszMTAwLDM4IEBACiAJCXNrZ2VfbWFjX3Bhcml0eShodywgMSk7CiAKIAlpZiAoaHdzdGF0dXMgJiBJU19SMV9QQVJfRVJSKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiByZWNlaXZlIHF1ZXVlIHBhcml0eSBlcnJvclxuIiwKLQkJICAgICAgIGh3LT5kZXZbMF0tPm5hbWUpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlczogcmVjZWl2ZSBxdWV1ZSBwYXJpdHkgZXJyb3JcbiIsCisJCQlody0+ZGV2WzBdLT5uYW1lKTsKIAkJc2tnZV93cml0ZTMyKGh3LCBCMF9SMV9DU1IsIENTUl9JUlFfQ0xfUCk7CiAJfQogCiAJaWYgKGh3c3RhdHVzICYgSVNfUjJfUEFSX0VSUikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogcmVjZWl2ZSBxdWV1ZSBwYXJpdHkgZXJyb3JcbiIsCi0JCSAgICAgICBody0+ZGV2WzFdLT5uYW1lKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXM6IHJlY2VpdmUgcXVldWUgcGFyaXR5IGVycm9yXG4iLAorCQkJaHctPmRldlsxXS0+bmFtZSk7CiAJCXNrZ2Vfd3JpdGUzMihodywgQjBfUjJfQ1NSLCBDU1JfSVJRX0NMX1ApOwogCX0KIAogCWlmIChod3N0YXR1cyAmIChJU19JUlFfTVNUX0VSUnxJU19JUlFfU1RBVCkpIHsKIAkJdTE2IHBjaV9zdGF0dXMsIHBjaV9jbWQ7CiAKLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaHctPnBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGh3LT5wZGV2LCBQQ0lfU1RBVFVTLCAmcGNpX3N0YXR1cyk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVEFUVVMsICZwY2lfc3RhdHVzKTsKIAotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogUENJIGVycm9yIGNtZD0lI3ggc3RhdHVzPSUjeFxuIiwKLQkJCSAgICAgICBwY2lfbmFtZShody0+cGRldiksIHBjaV9jbWQsIHBjaV9zdGF0dXMpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJQQ0kgZXJyb3IgY21kPSUjeCBzdGF0dXM9JSN4XG4iLAorCQkJcGNpX2NtZCwgcGNpX3N0YXR1cyk7CiAKIAkJLyogV3JpdGUgdGhlIGVycm9yIGJpdHMgYmFjayB0byBjbGVhciB0aGVtLiAqLwogCQlwY2lfc3RhdHVzICY9IFBDSV9TVEFUVVNfRVJST1JfQklUUzsKIAkJc2tnZV93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChody0+cGRldiwgUENJX0NPTU1BTkQsCisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwKIAkJCQkgICAgICBwY2lfY21kIHwgUENJX0NPTU1BTkRfU0VSUiB8IFBDSV9DT01NQU5EX1BBUklUWSk7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChody0+cGRldiwgUENJX1NUQVRVUywgcGNpX3N0YXR1cyk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfU1RBVFVTLCBwY2lfc3RhdHVzKTsKIAkJc2tnZV93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOwogCiAJCS8qIGlmIGVycm9yIHN0aWxsIHNldCB0aGVuIGp1c3QgaWdub3JlIGl0ICovCiAJCWh3c3RhdHVzID0gc2tnZV9yZWFkMzIoaHcsIEIwX0hXRV9JU1JDKTsKIAkJaWYgKGh3c3RhdHVzICYgSVNfSVJRX1NUQVQpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gUEZYICJ1bmFibGUgdG8gY2xlYXIgZXJyb3IgKHNvIGlnbm9yaW5nIHRoZW0pXG4iKTsKKwkJCWRldl93YXJuKCZody0+cGRldi0+ZGV2LCAidW5hYmxlIHRvIGNsZWFyIGVycm9yIChzbyBpZ25vcmluZyB0aGVtKVxuIik7CiAJCQlody0+aW50cl9tYXNrICY9IH5JU19IV19FUlI7CiAJCX0KIAl9CkBAIC0zMjc3LDggKzMzNDUsOCBAQAogCQkJaHctPnBoeV9hZGRyID0gUEhZX0FERFJfQkNPTTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHVuc3VwcG9ydGVkIHBoeSB0eXBlIDB4JXhcbiIsCi0JCQkgICAgICAgcGNpX25hbWUoaHctPnBkZXYpLCBody0+cGh5X3R5cGUpOworCQkJZGV2X2VycigmaHctPnBkZXYtPmRldiwgInVuc3VwcG9ydGVkIHBoeSB0eXBlIDB4JXhcbiIsCisJCQkgICAgICAgaHctPnBoeV90eXBlKTsKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAkJfQogCQlicmVhazsKQEAgLTMyOTMsOCArMzM2MSw4IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHVuc3VwcG9ydGVkIGNoaXAgdHlwZSAweCV4XG4iLAotCQkgICAgICAgcGNpX25hbWUoaHctPnBkZXYpLCBody0+Y2hpcF9pZCk7CisJCWRldl9lcnIoJmh3LT5wZGV2LT5kZXYsICJ1bnN1cHBvcnRlZCBjaGlwIHR5cGUgMHgleFxuIiwKKwkJICAgICAgIGh3LT5jaGlwX2lkKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIApAQCAtMzMzNCw3ICszNDAyLDcgQEAKIAkJLyogYXZvaWQgYm9hcmRzIHdpdGggc3R1Y2sgSGFyZHdhcmUgZXJyb3IgYml0cyAqLwogCQlpZiAoKHNrZ2VfcmVhZDMyKGh3LCBCMF9JU1JDKSAmIElTX0hXX0VSUikgJiYKIAkJICAgIChza2dlX3JlYWQzMihodywgQjBfSFdFX0lTUkMpICYgSVNfSVJRX1NFTlNPUikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJzdHVjayBoYXJkd2FyZSBzZW5zb3IgYml0XG4iKTsKKwkJCWRldl93YXJuKCZody0+cGRldi0+ZGV2LCAic3R1Y2sgaGFyZHdhcmUgc2Vuc29yIGJpdFxuIik7CiAJCQlody0+aW50cl9tYXNrICY9IH5JU19IV19FUlI7CiAJCX0KIApAQCAtMzQwOCw3ICszNDc2LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKCpza2dlKSk7CiAKIAlpZiAoIWRldikgewotCQlwcmludGsoS0VSTl9FUlIgInNrZ2UgZXRoZXJkZXYgYWxsb2MgZmFpbGVkIik7CisJCWRldl9lcnIoJmh3LT5wZGV2LT5kZXYsICJldGhlcmRldiBhbGxvYyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTM0NTIsNiArMzUyMCw3IEBACiAJc2tnZS0+ZHVwbGV4ID0gLTE7CiAJc2tnZS0+c3BlZWQgPSAtMTsKIAlza2dlLT5hZHZlcnRpc2luZyA9IHNrZ2Vfc3VwcG9ydGVkX21vZGVzKGh3KTsKKwlza2dlLT53b2wgPSBwY2lfd2FrZV9lbmFibGVkKGh3LT5wZGV2KSA/IHdvbF9zdXBwb3J0ZWQoaHcpIDogMDsKIAogCWh3LT5kZXZbcG9ydF0gPSBkZXY7CiAKQEAgLTM0OTYsMTUgKzM1NjUsMTMgQEAKIAogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXMgY2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCiAJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlcyBjYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXNcbiIsCi0JCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIik7CiAJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CiAJfQogCkBAIC0zNTE5LDggKzM1ODYsNyBAQAogCX0KIAogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXMgbm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb25cbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb25zOwogCX0KIApAQCAtMzUzOCw4ICszNjA0LDcgQEAKIAllcnIgPSAtRU5PTUVNOwogCWh3ID0ga3phbGxvYyhzaXplb2YoKmh3KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFodykgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0cnVjdFxuIiwKLQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0cnVjdFxuIik7CiAJCWdvdG8gZXJyX291dF9mcmVlX3JlZ2lvbnM7CiAJfQogCkBAIC0zNTUwLDggKzM2MTUsNyBAQAogCiAJaHctPnJlZ3MgPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCAweDQwMDApOwogCWlmICghaHctPnJlZ3MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IGNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVyc1xuIiwKLQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzXG4iKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfaHc7CiAJfQogCkBAIC0zNTY3LDIzICszNjMxLDE5IEBACiAJaWYgKCFkZXYpCiAJCWdvdG8gZXJyX291dF9sZWRfb2ZmOwogCi0JaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBiYWQgKHplcm8/KSBldGhlcm5ldCBhZGRyZXNzIGluIHJvbVxuIiwKLQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKLQkJZXJyID0gLUVJTzsKLQkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwotCX0KKwkvKiBTb21lIG1vdGhlcmJvYXJkcyBhcmUgYnJva2VuIGFuZCBoYXMgemVybyBpbiBST00uICovCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiYmFkICh6ZXJvPykgZXRoZXJuZXQgYWRkcmVzcyBpbiByb21cbiIpOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2VcbiIsCi0JCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlXG4iKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OwogCX0KIAogCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgc2tnZV9pbnRyLCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBodyk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBjYW5ub3QgYXNzaWduIGlycSAlZFxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgcGRldi0+aXJxKTsKIAkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXI7CiAJfQpAQCAtMzU5NCw3ICszNjU0LDcgQEAKIAkJCXNrZ2Vfc2hvd19hZGRyKGRldjEpOwogCQllbHNlIHsKIAkJCS8qIEZhaWx1cmUgdG8gcmVnaXN0ZXIgc2Vjb25kIHBvcnQgbmVlZCBub3QgYmUgZmF0YWwgKi8KLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJyZWdpc3RlciBvZiBzZWNvbmQgcG9ydCBmYWlsZWRcbiIpOworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInJlZ2lzdGVyIG9mIHNlY29uZCBwb3J0IGZhaWxlZFxuIik7CiAJCQlody0+ZGV2WzFdID0gTlVMTDsKIAkJCWZyZWVfbmV0ZGV2KGRldjEpOwogCQl9CkBAIC0zNjU5LDI4ICszNzE5LDQ2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgdmF1eF9hdmFpbChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlpbnQgcG1fY2FwOworCisJcG1fY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKKwlpZiAocG1fY2FwKSB7CisJCXUxNiBjdGw7CisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBtX2NhcCArIFBDSV9QTV9QTUMsICZjdGwpOworCQlpZiAoY3RsICYgUENJX1BNX0NBUF9BVVhfUE9XRVIpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIGludCBza2dlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3Qgc2tnZV9odyAqaHcgID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBpLCB3b2wgPSAwOworCWludCBpLCBlcnIsIHdvbCA9IDA7CiAKLQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwllcnIgPSBwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJZm9yIChpID0gMDsgaSA8IGh3LT5wb3J0czsgaSsrKSB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBody0+ZGV2W2ldOworCQlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCQlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCXNrZ2VfZG93bihkZXYpOworCQlpZiAoc2tnZS0+d29sKQorCQkJc2tnZV93b2xfaW5pdChza2dlKTsKIAotCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKLQkJCWlmIChza2dlLT53b2wpCi0JCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQkJZWxzZQotCQkJCXNrZ2VfZG93bihkZXYpOwotCQkJd29sIHw9IHNrZ2UtPndvbDsKLQkJfQotCQluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CisJCXdvbCB8PSBza2dlLT53b2w7CiAJfQogCisJaWYgKHdvbCAmJiB2YXV4X2F2YWlsKHBkZXYpKQorCQlza2dlX3dyaXRlOChodywgQjBfUE9XRVJfQ1RSTCwKKwkJCSAgICBQQ19WQVVYX0VOQSB8IFBDX1ZDQ19FTkEgfCBQQ19WQVVYX09OIHwgUENfVkNDX09GRik7CisKIAlza2dlX3dyaXRlMzIoaHcsIEIwX0lNU0ssIDApOwogCXBjaV9lbmFibGVfd2FrZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSwgd29sKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKQEAgLTM2OTMsOCArMzc3MSwxNCBAQAogCXN0cnVjdCBza2dlX2h3ICpodyAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJaW50IGksIGVycjsKIAotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKLQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwllcnIgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwogCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDAsIDApOwogCiAJZXJyID0gc2tnZV9yZXNldChodyk7CkBAIC0zNzA0LDcgKzM3ODgsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBody0+cG9ydHM7IGkrKykgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltpXTsKIAotCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJCWVyciA9IHNrZ2VfdXAoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tnZS5oIGIvZHJpdmVycy9uZXQvc2tnZS5oCmluZGV4IGY2MjIzYzUuLjE3YjFiNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZ2UuaAorKysgYi9kcml2ZXJzL25ldC9za2dlLmgKQEAgLTg3NiwxMSArODc2LDEzIEBACiAJV09MX1BBVFRfQ05UXzAJPSAweDBmMzgsLyogMzIgYml0CVdPTCBQYXR0ZXJuIENvdW50ZXIgMy4uMCAqLwogCVdPTF9QQVRUX0NOVF80CT0gMHgwZjNjLC8qIDI0IGJpdAlXT0wgUGF0dGVybiBDb3VudGVyIDYuLjQgKi8KIH07CisjZGVmaW5lIFdPTF9SRUdTKHBvcnQsIHgpCSh4ICsgKHBvcnQpKjB4ODApCiAKIGVudW0gewogCVdPTF9QQVRUX1JBTV8xCT0gMHgxMDAwLC8qICBXT0wgUGF0dGVybiBSQU0gTGluayAxICovCiAJV09MX1BBVFRfUkFNXzIJPSAweDE0MDAsLyogIFdPTCBQYXR0ZXJuIFJBTSBMaW5rIDIgKi8KIH07CisjZGVmaW5lIFdPTF9QQVRUX1JBTV9CQVNFKHBvcnQpCShXT0xfUEFUVF9SQU1fMSArIChwb3J0KSoweDQwMCkKIAogZW51bSB7CiAJQkFTRV9YTUFDXzEJPSAweDIwMDAsLyogWE1BQyAxIHJlZ2lzdGVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2t5Mi5jIGIvZHJpdmVycy9uZXQvc2t5Mi5jCmluZGV4IDgyMmRkMGIuLmYyYWIzZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NreTIuYworKysgYi9kcml2ZXJzL25ldC9za3kyLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlICJza3kyLmgiCiAKICNkZWZpbmUgRFJWX05BTUUJCSJza3kyIgotI2RlZmluZSBEUlZfVkVSU0lPTgkJIjEuMTAiCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiMS4xMiIKICNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIiAiCiAKIC8qCkBAIC0xMDUsNiArMTA1LDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywgMHg0YjAwKSB9LAkvKiBER0UtNTYwVCAqLwogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0RMSU5LLCAweDQwMDEpIH0sIAkvKiBER0UtNTUwU1ggKi8KIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywgMHg0QjAyKSB9LAkvKiBER0UtNTYwU1ggKi8KKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywgMHg0QjAzKSB9LAkvKiBER0UtNTUwVCAqLwogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM0MCkgfSwgLyogODhFODAyMSAqLwogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM0MSkgfSwgLyogODhFODAyMiAqLwogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM0MikgfSwgLyogODhFODA2MSAqLwpAQCAtMTI2LDYgKzEyNyw5IEBACiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY2KSB9LCAvKiA4OEVDMDM2ICovCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY3KSB9LCAvKiA4OEVDMDMyICovCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY4KSB9LCAvKiA4OEVDMDM0ICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzY5KSB9LCAvKiA4OEVDMDQyICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzZBKSB9LCAvKiA4OEU4MDU4ICovCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzZCKSB9LCAvKiA4OEU4MDcxICovCiAJeyAwIH0KIH07CiAKQEAgLTE0MCw3ICsxNDQsNyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKnl1a29uMl9uYW1lW10gPSB7CiAJIlhMIiwJCS8qIDB4YjMgKi8KIAkiRUMgVWx0cmEiLCAJLyogMHhiNCAqLwotCSJVTktOT1dOIiwJLyogMHhiNSAqLworCSJFeHRyZW1lIiwJLyogMHhiNSAqLwogCSJFQyIsCQkvKiAweGI2ICovCiAJIkZFIiwJCS8qIDB4YjcgKi8KIH07CkBAIC0xOTIsNzYgKzE5Niw1MiBAQAogCXJldHVybiB2OwogfQogCi1zdGF0aWMgdm9pZCBza3kyX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHBjaV9wb3dlcl90IHN0YXRlKQorCitzdGF0aWMgdm9pZCBza3kyX3Bvd2VyX29uKHN0cnVjdCBza3kyX2h3ICpodykKIHsKLQl1MTYgcG93ZXJfY29udHJvbDsKLQlpbnQgdmF1eDsKKwkvKiBzd2l0Y2ggcG93ZXIgdG8gVkNDIChXQSBmb3IgVkFVWCBwcm9ibGVtKSAqLworCXNreTJfd3JpdGU4KGh3LCBCMF9QT1dFUl9DVFJMLAorCQkgICAgUENfVkFVWF9FTkEgfCBQQ19WQ0NfRU5BIHwgUENfVkFVWF9PRkYgfCBQQ19WQ0NfT04pOwogCi0JcHJfZGVidWcoInNreTJfc2V0X3Bvd2VyX3N0YXRlICVkXG4iLCBzdGF0ZSk7Ci0Jc2t5Ml93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CisJLyogZGlzYWJsZSBDb3JlIENsb2NrIERpdmlzaW9uLCAqLworCXNreTJfd3JpdGUzMihodywgQjJfWTJfQ0xLX0NUUkwsIFkyX0NMS19ESVZfRElTKTsKIAotCXBvd2VyX2NvbnRyb2wgPSBza3kyX3BjaV9yZWFkMTYoaHcsIGh3LT5wbV9jYXAgKyBQQ0lfUE1fUE1DKTsKLQl2YXV4ID0gKHNreTJfcmVhZDE2KGh3LCBCMF9DVFNUKSAmIFkyX1ZBVVhfQVZBSUwpICYmCi0JCShwb3dlcl9jb250cm9sICYgUENJX1BNX0NBUF9QTUVfRDNjb2xkKTsKKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTCAmJiBody0+Y2hpcF9yZXYgPiAxKQorCQkvKiBlbmFibGUgYml0cyBhcmUgaW52ZXJ0ZWQgKi8KKwkJc2t5Ml93cml0ZTgoaHcsIEIyX1kyX0NMS19HQVRFLAorCQkJICAgIFkyX1BDSV9DTEtfTE5LMV9ESVMgfCBZMl9DT1JfQ0xLX0xOSzFfRElTIHwKKwkJCSAgICBZMl9DTEtfR0FUX0xOSzFfRElTIHwgWTJfUENJX0NMS19MTksyX0RJUyB8CisJCQkgICAgWTJfQ09SX0NMS19MTksyX0RJUyB8IFkyX0NMS19HQVRfTE5LMl9ESVMpOworCWVsc2UKKwkJc2t5Ml93cml0ZTgoaHcsIEIyX1kyX0NMS19HQVRFLCAwKTsKIAotCXBvd2VyX2NvbnRyb2wgPSBza3kyX3BjaV9yZWFkMTYoaHcsIGh3LT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCk7CisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUNfVSB8fCBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VYKSB7CisJCXUzMiByZWcxOwogCi0JcG93ZXJfY29udHJvbCB8PSBQQ0lfUE1fQ1RSTF9QTUVfU1RBVFVTOwotCXBvd2VyX2NvbnRyb2wgJj0gfihQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLKTsKLQotCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIFBDSV9EMDoKLQkJLyogc3dpdGNoIHBvd2VyIHRvIFZDQyAoV0EgZm9yIFZBVVggcHJvYmxlbSkgKi8KLQkJc2t5Ml93cml0ZTgoaHcsIEIwX1BPV0VSX0NUUkwsCi0JCQkgICAgUENfVkFVWF9FTkEgfCBQQ19WQ0NfRU5BIHwgUENfVkFVWF9PRkYgfCBQQ19WQ0NfT04pOwotCi0JCS8qIGRpc2FibGUgQ29yZSBDbG9jayBEaXZpc2lvbiwgKi8KLQkJc2t5Ml93cml0ZTMyKGh3LCBCMl9ZMl9DTEtfQ1RSTCwgWTJfQ0xLX0RJVl9ESVMpOwotCi0JCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX1hMICYmIGh3LT5jaGlwX3JldiA+IDEpCi0JCQkvKiBlbmFibGUgYml0cyBhcmUgaW52ZXJ0ZWQgKi8KLQkJCXNreTJfd3JpdGU4KGh3LCBCMl9ZMl9DTEtfR0FURSwKLQkJCQkgICAgWTJfUENJX0NMS19MTksxX0RJUyB8IFkyX0NPUl9DTEtfTE5LMV9ESVMgfAotCQkJCSAgICBZMl9DTEtfR0FUX0xOSzFfRElTIHwgWTJfUENJX0NMS19MTksyX0RJUyB8Ci0JCQkJICAgIFkyX0NPUl9DTEtfTE5LMl9ESVMgfCBZMl9DTEtfR0FUX0xOSzJfRElTKTsKLQkJZWxzZQotCQkJc2t5Ml93cml0ZTgoaHcsIEIyX1kyX0NMS19HQVRFLCAwKTsKLQotCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKSB7Ci0JCQl1MzIgcmVnMTsKLQotCQkJc2t5Ml9wY2lfd3JpdGUzMihodywgUENJX0RFVl9SRUczLCAwKTsKLQkJCXJlZzEgPSBza3kyX3BjaV9yZWFkMzIoaHcsIFBDSV9ERVZfUkVHNCk7Ci0JCQlyZWcxICY9IFBfQVNQTV9DT05UUk9MX01TSzsKLQkJCXNreTJfcGNpX3dyaXRlMzIoaHcsIFBDSV9ERVZfUkVHNCwgcmVnMSk7Ci0JCQlza3kyX3BjaV93cml0ZTMyKGh3LCBQQ0lfREVWX1JFRzUsIDApOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFBDSV9EM2hvdDoKLQljYXNlIFBDSV9EM2NvbGQ6Ci0JCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX1hMICYmIGh3LT5jaGlwX3JldiA+IDEpCi0JCQlza3kyX3dyaXRlOChodywgQjJfWTJfQ0xLX0dBVEUsIDApOwotCQllbHNlCi0JCQkvKiBlbmFibGUgYml0cyBhcmUgaW52ZXJ0ZWQgKi8KLQkJCXNreTJfd3JpdGU4KGh3LCBCMl9ZMl9DTEtfR0FURSwKLQkJCQkgICAgWTJfUENJX0NMS19MTksxX0RJUyB8IFkyX0NPUl9DTEtfTE5LMV9ESVMgfAotCQkJCSAgICBZMl9DTEtfR0FUX0xOSzFfRElTIHwgWTJfUENJX0NMS19MTksyX0RJUyB8Ci0JCQkJICAgIFkyX0NPUl9DTEtfTE5LMl9ESVMgfCBZMl9DTEtfR0FUX0xOSzJfRElTKTsKLQotCQkvKiBzd2l0Y2ggcG93ZXIgdG8gVkFVWCAqLwotCQlpZiAodmF1eCAmJiBzdGF0ZSAhPSBQQ0lfRDNjb2xkKQotCQkJc2t5Ml93cml0ZTgoaHcsIEIwX1BPV0VSX0NUUkwsCi0JCQkJICAgIChQQ19WQVVYX0VOQSB8IFBDX1ZDQ19FTkEgfAotCQkJCSAgICAgUENfVkFVWF9PTiB8IFBDX1ZDQ19PRkYpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5rbm93biBwb3dlciBzdGF0ZSAlZFxuIiwgc3RhdGUpOworCQlza3kyX3BjaV93cml0ZTMyKGh3LCBQQ0lfREVWX1JFRzMsIDApOworCQlyZWcxID0gc2t5Ml9wY2lfcmVhZDMyKGh3LCBQQ0lfREVWX1JFRzQpOworCQlyZWcxICY9IFBfQVNQTV9DT05UUk9MX01TSzsKKwkJc2t5Ml9wY2lfd3JpdGUzMihodywgUENJX0RFVl9SRUc0LCByZWcxKTsKKwkJc2t5Ml9wY2lfd3JpdGUzMihodywgUENJX0RFVl9SRUc1LCAwKTsKIAl9Cit9CiAKLQlza3kyX3BjaV93cml0ZTE2KGh3LCBody0+cG1fY2FwICsgUENJX1BNX0NUUkwsIHBvd2VyX2NvbnRyb2wpOwotCXNreTJfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT0ZGKTsKK3N0YXRpYyB2b2lkIHNreTJfcG93ZXJfYXV4KHN0cnVjdCBza3kyX2h3ICpodykKK3sKKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTCAmJiBody0+Y2hpcF9yZXYgPiAxKQorCQlza3kyX3dyaXRlOChodywgQjJfWTJfQ0xLX0dBVEUsIDApOworCWVsc2UKKwkJLyogZW5hYmxlIGJpdHMgYXJlIGludmVydGVkICovCisJCXNreTJfd3JpdGU4KGh3LCBCMl9ZMl9DTEtfR0FURSwKKwkJCSAgICBZMl9QQ0lfQ0xLX0xOSzFfRElTIHwgWTJfQ09SX0NMS19MTksxX0RJUyB8CisJCQkgICAgWTJfQ0xLX0dBVF9MTksxX0RJUyB8IFkyX1BDSV9DTEtfTE5LMl9ESVMgfAorCQkJICAgIFkyX0NPUl9DTEtfTE5LMl9ESVMgfCBZMl9DTEtfR0FUX0xOSzJfRElTKTsKKworCS8qIHN3aXRjaCBwb3dlciB0byBWQVVYICovCisJaWYgKHNreTJfcmVhZDE2KGh3LCBCMF9DVFNUKSAmIFkyX1ZBVVhfQVZBSUwpCisJCXNreTJfd3JpdGU4KGh3LCBCMF9QT1dFUl9DVFJMLAorCQkJICAgIChQQ19WQVVYX0VOQSB8IFBDX1ZDQ19FTkEgfAorCQkJICAgICBQQ19WQVVYX09OIHwgUENfVkNDX09GRikpOwogfQogCiBzdGF0aWMgdm9pZCBza3kyX2dtYWNfcmVzZXQoc3RydWN0IHNreTJfaHcgKmh3LCB1bnNpZ25lZCBwb3J0KQpAQCAtMzEzLDggKzI5MywxMCBAQAogCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihody0+ZGV2W3BvcnRdKTsKIAl1MTYgY3RybCwgY3QxMDAwLCBhZHYsIHBnLCBsZWRjdHJsLCBsZWRvdmVyLCByZWc7CiAKLQlpZiAoc2t5Mi0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSAmJgotCSAgICAhKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fWEwgfHwgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKSkgeworCWlmIChza3kyLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFCisJICAgICYmICEoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTAorCQkgfHwgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VCisJCSB8fCBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VYKSkgewogCQl1MTYgZWN0cmwgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfRVhUX0NUUkwpOwogCiAJCWVjdHJsICY9IH4oUEhZX01fRUNfTV9EU0NfTVNLIHwgUEhZX01fRUNfU19EU0NfTVNLIHwKQEAgLTM0MSw4ICszMjMsMTAgQEAKIAkJCS8qIGVuYWJsZSBhdXRvbWF0aWMgY3Jvc3NvdmVyICovCiAJCQljdHJsIHw9IFBIWV9NX1BDX01ESV9YTU9ERShQSFlfTV9QQ19FTkFfQVVUTyk7CiAKLQkJCWlmIChza3kyLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFICYmCi0JCQkgICAgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fWEwgfHwgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKSkgeworCQkJaWYgKHNreTItPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUKKwkJCSAgICAmJiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTAorCQkJCXx8IGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUNfVQorCQkJCXx8IGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRVgpKSB7CiAJCQkJY3RybCAmPSB+UEhZX01fUENfRFNDX01TSzsKIAkJCQljdHJsIHw9IFBIWV9NX1BDX0RTQygyKSB8IFBIWV9NX1BDX0RPV05fU19FTkE7CiAJCQl9CkBAIC00OTcsNyArNDgxLDkgQEAKIAkJLyogcmVzdG9yZSBwYWdlIHJlZ2lzdGVyICovCiAJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRVhUX0FEUiwgcGcpOwogCQlicmVhazsKKwogCWNhc2UgQ0hJUF9JRF9ZVUtPTl9FQ19VOgorCWNhc2UgQ0hJUF9JRF9ZVUtPTl9FWDoKIAkJcGcgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfRVhUX0FEUik7CiAKIAkJLyogc2VsZWN0IHBhZ2UgMyB0byBhY2Nlc3MgTEVEIGNvbnRyb2wgcmVnaXN0ZXIgKi8KQEAgLTUzOSw3ICs1MjUsNyBAQAogCiAJCS8qIHNldCBwYWdlIHJlZ2lzdGVyIHRvIDAgKi8KIAkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQURSLCBwZyk7Ci0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKGh3LT5jaGlwX2lkICE9IENISVBfSURfWVVLT05fRVgpIHsKIAkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfQ1RSTCwgbGVkY3RybCk7CiAKIAkJaWYgKHNreTItPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFIHx8IHNreTItPnNwZWVkID09IFNQRUVEXzEwMCkgewpAQCAtNTkxLDYgKzU3Nyw3MyBAQAogCXNwaW5fdW5sb2NrX2JoKCZza3kyLT5waHlfbG9jayk7CiB9CiAKKy8qIFB1dCBkZXZpY2UgaW4gc3RhdGUgdG8gbGlzdGVuIGZvciBXYWtlIE9uIExhbiAqLworc3RhdGljIHZvaWQgc2t5Ml93b2xfaW5pdChzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyKQoreworCXN0cnVjdCBza3kyX2h3ICpodyA9IHNreTItPmh3OworCXVuc2lnbmVkIHBvcnQgPSBza3kyLT5wb3J0OworCWVudW0gZmxvd19jb250cm9sIHNhdmVfbW9kZTsKKwl1MTYgY3RybDsKKwl1MzIgcmVnMTsKKworCS8qIEJyaW5nIGhhcmR3YXJlIG91dCBvZiByZXNldCAqLworCXNreTJfd3JpdGUxNihodywgQjBfQ1RTVCwgQ1NfUlNUX0NMUik7CisJc2t5Ml93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgR01BQ19MSU5LX0NUUkwpLCBHTUxDX1JTVF9DTFIpOworCisJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHUEhZX0NUUkwpLCBHUENfUlNUX0NMUik7CisJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUlNUX0NMUik7CisKKwkvKiBGb3JjZSB0byAxMC8xMDAKKwkgKiBza3kyX3Jlc2V0IHdpbGwgcmUtZW5hYmxlIG9uIHJlc3VtZQorCSAqLworCXNhdmVfbW9kZSA9IHNreTItPmZsb3dfbW9kZTsKKwljdHJsID0gc2t5Mi0+YWR2ZXJ0aXNpbmc7CisKKwlza3kyLT5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGZ8QURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCk7CisJc2t5Mi0+Zmxvd19tb2RlID0gRkNfTk9ORTsKKwlza3kyX3BoeV9wb3dlcihodywgcG9ydCwgMSk7CisJc2t5Ml9waHlfcmVpbml0KHNreTIpOworCisJc2t5Mi0+Zmxvd19tb2RlID0gc2F2ZV9tb2RlOworCXNreTItPmFkdmVydGlzaW5nID0gY3RybDsKKworCS8qIFNldCBHTUFDIHRvIG5vIGZsb3cgY29udHJvbCBhbmQgYXV0byB1cGRhdGUgZm9yIHNwZWVkL2R1cGxleCAqLworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMLAorCQkgICAgR01fR1BDUl9GQ19UWF9ESVN8R01fR1BDUl9UWF9FTkF8R01fR1BDUl9SWF9FTkF8CisJCSAgICBHTV9HUENSX0RVUF9GVUxMfEdNX0dQQ1JfRkNfUlhfRElTfEdNX0dQQ1JfQVVfRkNUX0RJUyk7CisKKwkvKiBTZXQgV09MIGFkZHJlc3MgKi8KKwltZW1jcHlfdG9pbyhody0+cmVncyArIFdPTF9SRUdTKHBvcnQsIFdPTF9NQUNfQUREUiksCisJCSAgICBza3kyLT5uZXRkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwkvKiBUdXJuIG9uIGFwcHJvcHJpYXRlIFdPTCBjb250cm9sIGJpdHMgKi8KKwlza3kyX3dyaXRlMTYoaHcsIFdPTF9SRUdTKHBvcnQsIFdPTF9DVFJMX1NUQVQpLCBXT0xfQ1RMX0NMRUFSX1JFU1VMVCk7CisJY3RybCA9IDA7CisJaWYgKHNreTItPndvbCAmIFdBS0VfUEhZKQorCQljdHJsIHw9IFdPTF9DVExfRU5BX1BNRV9PTl9MSU5LX0NIR3xXT0xfQ1RMX0VOQV9MSU5LX0NIR19VTklUOworCWVsc2UKKwkJY3RybCB8PSBXT0xfQ1RMX0RJU19QTUVfT05fTElOS19DSEd8V09MX0NUTF9ESVNfTElOS19DSEdfVU5JVDsKKworCWlmIChza3kyLT53b2wgJiBXQUtFX01BR0lDKQorCQljdHJsIHw9IFdPTF9DVExfRU5BX1BNRV9PTl9NQUdJQ19QS1R8V09MX0NUTF9FTkFfTUFHSUNfUEtUX1VOSVQ7CisJZWxzZQorCQljdHJsIHw9IFdPTF9DVExfRElTX1BNRV9PTl9NQUdJQ19QS1R8V09MX0NUTF9ESVNfTUFHSUNfUEtUX1VOSVQ7OworCisJY3RybCB8PSBXT0xfQ1RMX0RJU19QTUVfT05fUEFUVEVSTnxXT0xfQ1RMX0RJU19QQVRURVJOX1VOSVQ7CisJc2t5Ml93cml0ZTE2KGh3LCBXT0xfUkVHUyhwb3J0LCBXT0xfQ1RSTF9TVEFUKSwgY3RybCk7CisKKwkvKiBUdXJuIG9uIGxlZ2FjeSBQQ0ktRXhwcmVzcyBQTUUgbW9kZSAqLworCXNreTJfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT04pOworCXJlZzEgPSBza3kyX3BjaV9yZWFkMzIoaHcsIFBDSV9ERVZfUkVHMSk7CisJcmVnMSB8PSBQQ0lfWTJfUE1FX0xFR0FDWTsKKwlza3kyX3BjaV93cml0ZTMyKGh3LCBQQ0lfREVWX1JFRzEsIHJlZzEpOworCXNreTJfd3JpdGU4KGh3LCBCMl9UU1RfQ1RSTDEsIFRTVF9DRkdfV1JJVEVfT0ZGKTsKKworCS8qIGJsb2NrIHJlY2VpdmVyICovCisJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9TRVQpOworCit9CisKIHN0YXRpYyB2b2lkIHNreTJfbWFjX2luaXQoc3RydWN0IHNreTJfaHcgKmh3LCB1bnNpZ25lZCBwb3J0KQogewogCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihody0+ZGV2W3BvcnRdKTsKQEAgLTY4NCw3ICs3MzcsNyBAQAogCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksIEdNRl9SU1RfQ0xSKTsKIAlza3kyX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX09QRVJfT04pOwogCi0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUNfVSkgeworCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDX1UgfHwgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FWCkgewogCQlza3kyX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9MUF9USFIpLCA3NjgvOCk7CiAJCXNreTJfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX1VQX1RIUiksIDEwMjQvOCk7CiAJCWlmIChody0+ZGV2W3BvcnRdLT5tdHUgPiBFVEhfREFUQV9MRU4pIHsKQEAgLTE0NjcsNiArMTUyMCw5IEBACiAJCQlpZiAodW5saWtlbHkobmV0aWZfbXNnX3R4X2RvbmUoc2t5MikpKQogCQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdHggZG9uZSAldVxuIiwKIAkJCQkgICAgICAgZGV2LT5uYW1lLCBpZHgpOworCQkJc2t5Mi0+bmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXNreTItPm5ldF9zdGF0cy50eF9ieXRlcyArPSByZS0+c2tiLT5sZW47CisKIAkJCWRldl9rZnJlZV9za2JfYW55KHJlLT5za2IpOwogCQl9CiAKQEAgLTE2NDEsNyArMTY5Nyw5IEBACiAJc2t5Ml93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBMTktfTEVEX1JFRyksCiAJCSAgICBMSU5LTEVEX09OIHwgTElOS0xFRF9CTElOS19PRkYgfCBMSU5LTEVEX0xJTktTWU5DX09GRik7CiAKLQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTCB8fCBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDX1UpIHsKKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTAorCSAgICB8fCBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDX1UKKwkgICAgfHwgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FWCkgewogCQl1MTYgcGcgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfRVhUX0FEUik7CiAJCXUxNiBsZWQgPSBQSFlfTV9MRURDX0xPU19DVFJMKDEpOwkvKiBsaW5rIGFjdGl2ZSAqLwogCkBAIC0xNzM0LDE0ICsxNzkyLDE2IEBACiAJc2t5Mi0+ZHVwbGV4ID0gKGF1eCAmIFBIWV9NX1BTX0ZVTExfRFVQKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7CiAKIAkvKiBQYXVzZSBiaXRzIGFyZSBvZmZzZXQgKDkuLjgpICovCi0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fWEwgfHwgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKQorCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX1hMCisJICAgIHx8IGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUNfVQorCSAgICB8fCBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VYKQogCQlhdXggPj49IDY7CiAKIAlza3kyLT5mbG93X3N0YXR1cyA9IHNreTJfZmxvdyhhdXggJiBQSFlfTV9QU19SWF9QX0VOLAogCQkJCSAgICAgIGF1eCAmIFBIWV9NX1BTX1RYX1BfRU4pOwogCiAJaWYgKHNreTItPmR1cGxleCA9PSBEVVBMRVhfSEFMRiAmJiBza3kyLT5zcGVlZCA8IFNQRUVEXzEwMDAKLQkgICAgJiYgaHctPmNoaXBfaWQgIT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKQorCSAgICAmJiAhKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUNfVSB8fCBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VYKSkKIAkJc2t5Mi0+Zmxvd19zdGF0dXMgPSBGQ19OT05FOwogCiAJaWYgKGF1eCAmIFBIWV9NX1BTX1JYX1BfRU4pCkBAIC0xNzk0LDQ4ICsxODU0LDM3IEBACiB9CiAKIAotLyogVHJhbnNtaXQgdGltZW91dCBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgcnVubmluZywgY2FycmllcyBpcyB1cAorLyogVHJhbnNtaXQgdGltZW91dCBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgcnVubmluZywgY2FycmllciBpcyB1cAogICogYW5kIHR4IHF1ZXVlIGlzIGZ1bGwgKHN0b3BwZWQpLgorICogQ2FsbGVkIHdpdGggbmV0aWZfdHhfbG9jayBoZWxkLgogICovCiBzdGF0aWMgdm9pZCBza3kyX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc2t5Ml9odyAqaHcgPSBza3kyLT5odzsKLQl1bnNpZ25lZCB0eHEgPSB0eHFhZGRyW3NreTItPnBvcnRdOwotCXUxNiByZXBvcnQsIGRvbmU7CisJdTMyIGltYXNrOwogCiAJaWYgKG5ldGlmX21zZ190aW1lcihza3kyKSkKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHR4IHRpbWVvdXRcbiIsIGRldi0+bmFtZSk7CiAKLQlyZXBvcnQgPSBza3kyX3JlYWQxNihodywgc2t5Mi0+cG9ydCA9PSAwID8gU1RBVF9UWEExX1JJRFggOiBTVEFUX1RYQTJfUklEWCk7Ci0JZG9uZSA9IHNreTJfcmVhZDE2KGh3LCBRX0FERFIodHhxLCBRX0RPTkUpKTsKLQogCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiJXM6IHRyYW5zbWl0IHJpbmcgJXUgLi4gJXUgcmVwb3J0PSV1IGRvbmU9JXVcbiIsCi0JICAgICAgIGRldi0+bmFtZSwKLQkgICAgICAgc2t5Mi0+dHhfY29ucywgc2t5Mi0+dHhfcHJvZCwgcmVwb3J0LCBkb25lKTsKKwkgICAgICAgZGV2LT5uYW1lLCBza3kyLT50eF9jb25zLCBza3kyLT50eF9wcm9kLAorCSAgICAgICBza3kyX3JlYWQxNihodywgc2t5Mi0+cG9ydCA9PSAwID8gU1RBVF9UWEExX1JJRFggOiBTVEFUX1RYQTJfUklEWCksCisJICAgICAgIHNreTJfcmVhZDE2KGh3LCBRX0FERFIodHhxYWRkcltza3kyLT5wb3J0XSwgUV9ET05FKSkpOwogCi0JaWYgKHJlcG9ydCAhPSBkb25lKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gUEZYICJzdGF0dXMgYnVyc3QgcGVuZGluZyAoaXJxIG1vZGVyYXRpb24/KVxuIik7CisJaW1hc2sgPSBza3kyX3JlYWQzMihodywgQjBfSU1TSyk7CS8qIGJsb2NrIElSUSBpbiBodyAqLworCXNreTJfd3JpdGUzMihodywgQjBfSU1TSywgMCk7CisJc2t5Ml9yZWFkMzIoaHcsIEIwX0lNU0spOwogCi0JCXNreTJfd3JpdGU4KGh3LCBTVEFUX1RYX1RJTUVSX0NUUkwsIFRJTV9TVE9QKTsKLQkJc2t5Ml93cml0ZTgoaHcsIFNUQVRfVFhfVElNRVJfQ1RSTCwgVElNX1NUQVJUKTsKLQl9IGVsc2UgaWYgKHJlcG9ydCAhPSBza3kyLT50eF9jb25zKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gUEZYICJzdGF0dXMgcmVwb3J0IGxvc3Q/XG4iKTsKKwluZXRpZl9wb2xsX2Rpc2FibGUoaHctPmRldlswXSk7CQkvKiBzdG9wIE5BUEkgcG9sbCAqLworCXN5bmNocm9uaXplX2lycShody0+cGRldi0+aXJxKTsKIAotCQluZXRpZl90eF9sb2NrX2JoKGRldik7Ci0JCXNreTJfdHhfY29tcGxldGUoc2t5MiwgcmVwb3J0KTsKLQkJbmV0aWZfdHhfdW5sb2NrX2JoKGRldik7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggImhhcmR3YXJlIGh1bmc/IGZsdXNoaW5nXG4iKTsKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwkJCS8qIGRvbid0IHdha2V1cCBkdXJpbmcgZmx1c2ggKi8KKwlza3kyX3R4X2NvbXBsZXRlKHNreTIsIHNreTItPnR4X3Byb2QpOwkvKiBGbHVzaCB0cmFuc21pdCBxdWV1ZSAqLwogCi0JCXNreTJfd3JpdGUzMihodywgUV9BRERSKHR4cSwgUV9DU1IpLCBCTVVfU1RPUCk7Ci0JCXNreTJfd3JpdGUzMihodywgWTJfUUFERFIodHhxLCBQUkVGX1VOSVRfQ1RSTCksIFBSRUZfVU5JVF9SU1RfU0VUKTsKKwlza3kyX3dyaXRlMzIoaHcsIEIwX0lNU0ssIGltYXNrKTsKIAotCQlza3kyX3R4X2NsZWFuKGRldik7Ci0KLQkJc2t5Ml9xc2V0KGh3LCB0eHEpOwotCQlza3kyX3ByZWZldGNoX2luaXQoaHcsIHR4cSwgc2t5Mi0+dHhfbGVfbWFwLCBUWF9SSU5HX1NJWkUgLSAxKTsKLQl9CisJc2t5Ml9waHlfcmVpbml0KHNreTIpOwkJCS8qIHRoaXMgY2xlYXJzIGZsb3cgY29udHJvbCBldGMgKi8KIH0KIAogc3RhdGljIGludCBza3kyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCkBAIC0xODQ5LDggKzE4OTgsOSBAQAogCWlmIChuZXdfbXR1IDwgRVRIX1pMRU4gfHwgbmV3X210dSA+IEVUSF9KVU1CT19NVFUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogVFNPIG9uIFl1a29uIFVsdHJhIGFuZCBNVFUgPiAxNTAwIG5vdCBzdXBwb3J0ZWQgKi8KIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VICYmIG5ld19tdHUgPiBFVEhfREFUQV9MRU4pCi0JCXJldHVybiAtRUlOVkFMOworCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzsKIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCWRldi0+bXR1ID0gbmV3X210dTsKQEAgLTIwODksNiArMjEzOSw4IEBACiAJCQkJZ290byBmb3JjZV91cGRhdGU7CiAKIAkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CisJCQlza3kyLT5uZXRfc3RhdHMucnhfcGFja2V0cysrOworCQkJc2t5Mi0+bmV0X3N0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCQkJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKIAogI2lmZGVmIFNLWTJfVkxBTl9UQUdfVVNFRApAQCAtMjIxOCw4ICsyMjcwLDggQEAKIAogCQlwY2lfZXJyID0gc2t5Ml9wY2lfcmVhZDE2KGh3LCBQQ0lfU1RBVFVTKTsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBwY2kgaHcgZXJyb3IgKDB4JXgpXG4iLAotCQkJICAgICAgIHBjaV9uYW1lKGh3LT5wZGV2KSwgcGNpX2Vycik7CisJCQlkZXZfZXJyKCZody0+cGRldi0+ZGV2LCAiUENJIGhhcmR3YXJlIGVycm9yICgweCV4KVxuIiwKKwkJCSAgICAgICAgcGNpX2Vycik7CiAKIAkJc2t5Ml93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7CiAJCXNreTJfcGNpX3dyaXRlMTYoaHcsIFBDSV9TVEFUVVMsCkBAIC0yMjM0LDggKzIyODYsOCBAQAogCQlwZXhfZXJyID0gc2t5Ml9wY2lfcmVhZDMyKGh3LCBQRVhfVU5DX0VSUl9TVEFUKTsKIAogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHBjaSBleHByZXNzIGVycm9yICgweCV4KVxuIiwKLQkJCSAgICAgICBwY2lfbmFtZShody0+cGRldiksIHBleF9lcnIpOworCQkJZGV2X2VycigmaHctPnBkZXYtPmRldiwgIlBDSSBFeHByZXNzIGVycm9yICgweCV4KVxuIiwKKwkJCQlwZXhfZXJyKTsKIAogCQkvKiBjbGVhciB0aGUgaW50ZXJydXB0ICovCiAJCXNreTJfd3JpdGUzMihodywgQjJfVFNUX0NUUkwxLCBUU1RfQ0ZHX1dSSVRFX09OKTsKQEAgLTI0MDQsNiArMjQ1Niw3IEBACiAJc3dpdGNoIChody0+Y2hpcF9pZCkgewogCWNhc2UgQ0hJUF9JRF9ZVUtPTl9FQzoKIAljYXNlIENISVBfSURfWVVLT05fRUNfVToKKwljYXNlIENISVBfSURfWVVLT05fRVg6CiAJCXJldHVybiAxMjU7CS8qIDEyNSBNaHogKi8KIAljYXNlIENISVBfSURfWVVLT05fRkU6CiAJCXJldHVybiAxMDA7CS8qIDEwMCBNaHogKi8KQEAgLTI0MjMsMzQgKzI0NzYsNjIgQEAKIH0KIAogCi1zdGF0aWMgaW50IHNreTJfcmVzZXQoc3RydWN0IHNreTJfaHcgKmh3KQorc3RhdGljIGludCBfX2RldmluaXQgc2t5Ml9pbml0KHN0cnVjdCBza3kyX2h3ICpodykKIHsKLQl1MTYgc3RhdHVzOwogCXU4IHQ4OwotCWludCBpOwogCiAJc2t5Ml93cml0ZTgoaHcsIEIwX0NUU1QsIENTX1JTVF9DTFIpOwogCiAJaHctPmNoaXBfaWQgPSBza3kyX3JlYWQ4KGh3LCBCMl9DSElQX0lEKTsKIAlpZiAoaHctPmNoaXBfaWQgPCBDSElQX0lEX1lVS09OX1hMIHx8IGh3LT5jaGlwX2lkID4gQ0hJUF9JRF9ZVUtPTl9GRSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogdW5zdXBwb3J0ZWQgY2hpcCB0eXBlIDB4JXhcbiIsCi0JCSAgICAgICBwY2lfbmFtZShody0+cGRldiksIGh3LT5jaGlwX2lkKTsKKwkJZGV2X2VycigmaHctPnBkZXYtPmRldiwgInVuc3VwcG9ydGVkIGNoaXAgdHlwZSAweCV4XG4iLAorCQkJaHctPmNoaXBfaWQpOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRVgpCisJCWRldl93YXJuKCZody0+cGRldi0+ZGV2LCAidGhpcyBkcml2ZXIgbm90IHlldCB0ZXN0ZWQgb24gdGhpcyBjaGlwIHR5cGVcbiIKKwkJCSAiUGxlYXNlIHJlcG9ydCBzdWNjZXNzIG9yIGZhaWx1cmUgdG8gPG5ldGRldkB2Z2VyLmtlcm5lbC5vcmc+XG4iKTsKKworCS8qIE1ha2Ugc3VyZSBhbmQgZW5hYmxlIGFsbCBjbG9ja3MgKi8KKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FWCB8fCBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDX1UpCisJCXNreTJfcGNpX3dyaXRlMzIoaHcsIFBDSV9ERVZfUkVHMywgMCk7CisKIAlody0+Y2hpcF9yZXYgPSAoc2t5Ml9yZWFkOChodywgQjJfTUFDX0NGRykgJiBDRkdfQ0hJUF9SX01TSykgPj4gNDsKIAogCS8qIFRoaXMgcmV2IGlzIHJlYWxseSBvbGQsIGFuZCByZXF1aXJlcyB1bnRlc3RlZCB3b3JrYXJvdW5kcyAqLwogCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDICYmIGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9FQ19BMSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogdW5zdXBwb3J0ZWQgcmV2aXNpb24gWXVrb24tJXMgKDB4JXgpIHJldiAlZFxuIiwKLQkJICAgICAgIHBjaV9uYW1lKGh3LT5wZGV2KSwgeXVrb24yX25hbWVbaHctPmNoaXBfaWQgLSBDSElQX0lEX1lVS09OX1hMXSwKLQkJICAgICAgIGh3LT5jaGlwX2lkLCBody0+Y2hpcF9yZXYpOworCQlkZXZfZXJyKCZody0+cGRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgcmV2aXNpb24gWXVrb24tJXMgKDB4JXgpIHJldiAlZFxuIiwKKwkJCXl1a29uMl9uYW1lW2h3LT5jaGlwX2lkIC0gQ0hJUF9JRF9ZVUtPTl9YTF0sCisJCQlody0+Y2hpcF9pZCwgaHctPmNoaXBfcmV2KTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAorCWh3LT5wbWRfdHlwZSA9IHNreTJfcmVhZDgoaHcsIEIyX1BNRF9UWVApOworCWh3LT5wb3J0cyA9IDE7CisJdDggPSBza3kyX3JlYWQ4KGh3LCBCMl9ZMl9IV19SRVMpOworCWlmICgodDggJiBDRkdfRFVBTF9NQUNfTVNLKSA9PSBDRkdfRFVBTF9NQUNfTVNLKSB7CisJCWlmICghKHNreTJfcmVhZDgoaHcsIEIyX1kyX0NMS19HQVRFKSAmIFkyX1NUQVRVU19MTksyX0lOQUMpKQorCQkJKytody0+cG9ydHM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNreTJfcmVzZXQoc3RydWN0IHNreTJfaHcgKmh3KQoreworCXUxNiBzdGF0dXM7CisJaW50IGk7CisKIAkvKiBkaXNhYmxlIEFTRiAqLwogCWlmIChody0+Y2hpcF9pZCA8PSBDSElQX0lEX1lVS09OX0VDKSB7Ci0JCXNreTJfd3JpdGU4KGh3LCBCMjhfWTJfQVNGX1NUQVRfQ01ELCBZMl9BU0ZfUkVTRVQpOworCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FWCkgeworCQkJc3RhdHVzID0gc2t5Ml9yZWFkMTYoaHcsIEhDVV9DQ1NSKTsKKwkJCXN0YXR1cyAmPSB+KEhDVV9DQ1NSX0FIQl9SU1QgfCBIQ1VfQ0NTUl9DUFVfUlNUX01PREUgfAorCQkJCSAgICBIQ1VfQ0NTUl9VQ19TVEFURV9NU0spOworCQkJc2t5Ml93cml0ZTE2KGh3LCBIQ1VfQ0NTUiwgc3RhdHVzKTsKKwkJfSBlbHNlCisJCQlza3kyX3dyaXRlOChodywgQjI4X1kyX0FTRl9TVEFUX0NNRCwgWTJfQVNGX1JFU0VUKTsKIAkJc2t5Ml93cml0ZTE2KGh3LCBCMF9DVFNULCBZMl9BU0ZfRElTQUJMRSk7CiAJfQogCkBAIC0yNDcyLDE1ICsyNTUzLDcgQEAKIAkJc2t5Ml9wY2lfd3JpdGUzMihodywgUEVYX1VOQ19FUlJfU1RBVCwgMHhmZmZmZmZmZlVMKTsKIAogCi0JaHctPnBtZF90eXBlID0gc2t5Ml9yZWFkOChodywgQjJfUE1EX1RZUCk7Ci0JaHctPnBvcnRzID0gMTsKLQl0OCA9IHNreTJfcmVhZDgoaHcsIEIyX1kyX0hXX1JFUyk7Ci0JaWYgKCh0OCAmIENGR19EVUFMX01BQ19NU0spID09IENGR19EVUFMX01BQ19NU0spIHsKLQkJaWYgKCEoc2t5Ml9yZWFkOChodywgQjJfWTJfQ0xLX0dBVEUpICYgWTJfU1RBVFVTX0xOSzJfSU5BQykpCi0JCQkrK2h3LT5wb3J0czsKLQl9Ci0KLQlza3kyX3NldF9wb3dlcl9zdGF0ZShodywgUENJX0QwKTsKKwlza3kyX3Bvd2VyX29uKGh3KTsKIAogCWZvciAoaSA9IDA7IGkgPCBody0+cG9ydHM7IGkrKykgewogCQlza3kyX3dyaXRlOChodywgU0tfUkVHKGksIEdNQUNfTElOS19DVFJMKSwgR01MQ19SU1RfU0VUKTsKQEAgLTI1NjMsNyArMjYzNiwzNyBAQAogCXNreTJfd3JpdGU4KGh3LCBTVEFUX1RYX1RJTUVSX0NUUkwsIFRJTV9TVEFSVCk7CiAJc2t5Ml93cml0ZTgoaHcsIFNUQVRfTEVWX1RJTUVSX0NUUkwsIFRJTV9TVEFSVCk7CiAJc2t5Ml93cml0ZTgoaHcsIFNUQVRfSVNSX1RJTUVSX0NUUkwsIFRJTV9TVEFSVCk7Cit9CiAKK3N0YXRpYyBpbmxpbmUgdTggc2t5Ml93b2xfc3VwcG9ydGVkKGNvbnN0IHN0cnVjdCBza3kyX2h3ICpodykKK3sKKwlyZXR1cm4gc2t5Ml9pc19jb3BwZXIoaHcpID8gKFdBS0VfUEhZIHwgV0FLRV9NQUdJQykgOiAwOworfQorCitzdGF0aWMgdm9pZCBza3kyX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCWNvbnN0IHN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJd29sLT5zdXBwb3J0ZWQgPSBza3kyX3dvbF9zdXBwb3J0ZWQoc2t5Mi0+aHcpOworCXdvbC0+d29sb3B0cyA9IHNreTItPndvbDsKK30KKworc3RhdGljIGludCBza3kyX3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCBza3kyX3BvcnQgKnNreTIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBza3kyX2h3ICpodyA9IHNreTItPmh3OworCisJaWYgKHdvbC0+d29sb3B0cyAmIH5za3kyX3dvbF9zdXBwb3J0ZWQoc2t5Mi0+aHcpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlza3kyLT53b2wgPSB3b2wtPndvbG9wdHM7CisKKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VKQorCQlza3kyX3dyaXRlMzIoaHcsIEIwX0NUU1QsIHNreTItPndvbAorCQkJICAgICA/IFkyX0hXX1dPTF9PTiA6IFkyX0hXX1dPTF9PRkYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXNreTJfd29sX2luaXQoc2t5Mik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI4MTQsMjUgKzI5MTcsOSBAQAogCX0KIH0KIAotLyogVXNlIGhhcmR3YXJlIE1JQiB2YXJpYWJsZXMgZm9yIGNyaXRpY2FsIHBhdGggc3RhdGlzdGljcyBhbmQKLSAqIHRyYW5zbWl0IGZlZWRiYWNrIG5vdCByZXBvcnRlZCBhdCBpbnRlcnJ1cHQuCi0gKiBPdGhlciBlcnJvcnMgYXJlIGFjY291bnRlZCBmb3IgaW4gaW50ZXJydXB0IGhhbmRsZXIuCi0gKi8KIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2t5Ml9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1NjQgZGF0YVsxM107Ci0KLQlza3kyX3BoeV9zdGF0cyhza3kyLCBkYXRhLCBBUlJBWV9TSVpFKGRhdGEpKTsKLQotCXNreTItPm5ldF9zdGF0cy50eF9ieXRlcyA9IGRhdGFbMF07Ci0Jc2t5Mi0+bmV0X3N0YXRzLnJ4X2J5dGVzID0gZGF0YVsxXTsKLQlza3kyLT5uZXRfc3RhdHMudHhfcGFja2V0cyA9IGRhdGFbMl0gKyBkYXRhWzRdICsgZGF0YVs2XTsKLQlza3kyLT5uZXRfc3RhdHMucnhfcGFja2V0cyA9IGRhdGFbM10gKyBkYXRhWzVdICsgZGF0YVs3XTsKLQlza3kyLT5uZXRfc3RhdHMubXVsdGljYXN0ID0gZGF0YVszXSArIGRhdGFbNV07Ci0Jc2t5Mi0+bmV0X3N0YXRzLmNvbGxpc2lvbnMgPSBkYXRhWzEwXTsKLQlza3kyLT5uZXRfc3RhdHMudHhfYWJvcnRlZF9lcnJvcnMgPSBkYXRhWzEyXTsKLQogCXJldHVybiAmc2t5Mi0+bmV0X3N0YXRzOwogfQogCkBAIC0zMTkxLDcgKzMyNzgsOSBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBza3kyX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgPSBza3kyX2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzID0gc2t5Ml9zZXRfc2V0dGluZ3MsCi0JLmdldF9kcnZpbmZvID0gc2t5Ml9nZXRfZHJ2aW5mbywKKwkuZ2V0X2RydmluZm8gID0gc2t5Ml9nZXRfZHJ2aW5mbywKKwkuZ2V0X3dvbCAgICAgID0gc2t5Ml9nZXRfd29sLAorCS5zZXRfd29sICAgICAgPSBza3kyX3NldF93b2wsCiAJLmdldF9tc2dsZXZlbCA9IHNreTJfZ2V0X21zZ2xldmVsLAogCS5zZXRfbXNnbGV2ZWwgPSBza3kyX3NldF9tc2dsZXZlbCwKIAkubndheV9yZXNldCAgID0gc2t5Ml9ud2F5X3Jlc2V0LApAQCAtMzIyMSwxMyArMzMxMCwxNCBAQAogCiAvKiBJbml0aWFsaXplIG5ldHdvcmsgZGV2aWNlICovCiBzdGF0aWMgX19kZXZpbml0IHN0cnVjdCBuZXRfZGV2aWNlICpza3kyX2luaXRfbmV0ZGV2KHN0cnVjdCBza3kyX2h3ICpodywKLQkJCQkJCSAgICAgdW5zaWduZWQgcG9ydCwgaW50IGhpZ2htZW0pCisJCQkJCQkgICAgIHVuc2lnbmVkIHBvcnQsCisJCQkJCQkgICAgIGludCBoaWdobWVtLCBpbnQgd29sKQogewogCXN0cnVjdCBza3kyX3BvcnQgKnNreTI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqc2t5MikpOwogCiAJaWYgKCFkZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJza3kyIGV0aGVyZGV2IGFsbG9jIGZhaWxlZCIpOworCQlkZXZfZXJyKCZody0+cGRldi0+ZGV2LCAiZXRoZXJkZXYgYWxsb2MgZmFpbGVkIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMzI2OSw2ICszMzU5LDcgQEAKIAlza3kyLT5zcGVlZCA9IC0xOwogCXNreTItPmFkdmVydGlzaW5nID0gc2t5Ml9zdXBwb3J0ZWRfbW9kZXMoaHcpOwogCXNreTItPnJ4X2NzdW0gPSAxOworCXNreTItPndvbCA9IHdvbDsKIAogCXNwaW5fbG9ja19pbml0KCZza3kyLT5waHlfbG9jayk7CiAJc2t5Mi0+dHhfcGVuZGluZyA9IFRYX0RFRl9QRU5ESU5HOwpAQCAtMzI3OCwxMSArMzM2OSw5IEBACiAKIAlza3kyLT5wb3J0ID0gcG9ydDsKIAotCWlmIChody0+Y2hpcF9pZCAhPSBDSElQX0lEX1lVS09OX0VDX1UpCi0JCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087CisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTyB8IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0c7CiAJaWYgKGhpZ2htZW0pCiAJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwotCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9TRzsKIAogI2lmZGVmIFNLWTJfVkxBTl9UQUdfVVNFRAogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOwpAQCAtMzM0Myw4ICszNDMyLDcgQEAKIAogCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgc2t5Ml90ZXN0X2ludHIsIDAsIERSVl9OQU1FLCBodyk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsCi0JCSAgICAgICBwY2lfbmFtZShwZGV2KSwgcGRldi0+aXJxKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGFzc2lnbiBpcnEgJWRcbiIsIHBkZXYtPmlycSk7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC0zMzU1LDkgKzM0NDMsOCBAQAogCiAJaWYgKCFody0+bXNpKSB7CiAJCS8qIE1TSSB0ZXN0IGZhaWxlZCwgZ28gYmFjayB0byBJTlR4IG1vZGUgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzOiBObyBpbnRlcnJ1cHQgZ2VuZXJhdGVkIHVzaW5nIE1TSSwgIgotCQkgICAgICAgInN3aXRjaGluZyB0byBJTlR4IG1vZGUuXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiTm8gaW50ZXJydXB0IGdlbmVyYXRlZCB1c2luZyBNU0ksICIKKwkJCSAic3dpdGNoaW5nIHRvIElOVHggbW9kZS5cbiIpOwogCiAJCWVyciA9IC1FT1BOT1RTVVBQOwogCQlza3kyX3dyaXRlOChodywgQjBfQ1RTVCwgQ1NfQ0xfU1dfSVJRKTsKQEAgLTMzNzEsNjIgKzM0NTgsNjIgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY2lfd2FrZV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHBtICA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX1BNKTsKKwl1MTYgdmFsdWU7CisKKwlpZiAoIXBtKQorCQlyZXR1cm4gMDsKKwlpZiAocGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwbSArIFBDSV9QTV9DVFJMLCAmdmFsdWUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gdmFsdWUgJiBQQ0lfUE1fQ1RSTF9QTUVfRU5BQkxFOworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBza3kyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgKmRldjEgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHNreTJfaHcgKmh3OwotCWludCBlcnIsIHBtX2NhcCwgdXNpbmdfZGFjID0gMDsKKwlpbnQgZXJyLCB1c2luZ19kYWMgPSAwLCB3b2xfZGVmYXVsdDsKIAogCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXMgY2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iLAotCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCiAJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlcyBjYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXNcbiIsCi0JCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlc1xuIik7CiAJCWdvdG8gZXJyX291dDsKIAl9CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAotCS8qIEZpbmQgcG93ZXItbWFuYWdlbWVudCBjYXBhYmlsaXR5LiAqLwotCXBtX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7Ci0JaWYgKHBtX2NhcCA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIFBvd2VyTWFuYWdlbWVudCBjYXBhYmlsaXR5LCAiCi0JCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKLQkJZXJyID0gLUVJTzsKLQkJZ290byBlcnJfb3V0X2ZyZWVfcmVnaW9uczsKLQl9Ci0KIAlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikgJiYKIAkgICAgIShlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkpIHsKIAkJdXNpbmdfZGFjID0gMTsKIAkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzIHVuYWJsZSB0byBvYnRhaW4gNjQgYml0IERNQSAiCi0JCQkgICAgICAgImZvciBjb25zaXN0ZW50IGFsbG9jYXRpb25zXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gb2J0YWluIDY0IGJpdCBETUEgIgorCQkJCSJmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CiAJCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb25zOwogCQl9Ci0KIAl9IGVsc2UgewogCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAkJaWYgKGVycikgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXMgbm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uXG4iLAotCQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvblxuIik7CiAJCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb25zOwogCQl9CiAJfQogCisJd29sX2RlZmF1bHQgPSBwY2lfd2FrZV9lbmFibGVkKHBkZXYpID8gV0FLRV9NQUdJQyA6IDA7CisKIAllcnIgPSAtRU5PTUVNOwogCWh3ID0ga3phbGxvYyhzaXplb2YoKmh3KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFodykgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogY2Fubm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0cnVjdFxuIiwKLQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIGhhcmR3YXJlIHN0cnVjdFxuIik7CiAJCWdvdG8gZXJyX291dF9mcmVlX3JlZ2lvbnM7CiAJfQogCkBAIC0zNDM0LDExICszNTIxLDkgQEAKIAogCWh3LT5yZWdzID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgMHg0MDAwKTsKIAlpZiAoIWh3LT5yZWdzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBjYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnNcbiIsCi0JCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVyc1xuIik7CiAJCWdvdG8gZXJyX291dF9mcmVlX2h3OwogCX0KLQlody0+cG1fY2FwID0gcG1fY2FwOwogCiAjaWZkZWYgX19CSUdfRU5ESUFOCiAJLyogVGhlIHNrOThsaW4gdmVuZG9yIGRyaXZlciB1c2VzIGhhcmR3YXJlIGJ5dGUgc3dhcHBpbmcgYnV0CkBAIC0zNDU4LDE4ICszNTQzLDIyIEBACiAJaWYgKCFody0+c3RfbGUpCiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCi0JZXJyID0gc2t5Ml9yZXNldChodyk7CisJZXJyID0gc2t5Ml9pbml0KGh3KTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKIAotCXByaW50ayhLRVJOX0lORk8gUEZYICJ2JXMgYWRkciAweCVsbHggaXJxICVkIFl1a29uLSVzICgweCV4KSByZXYgJWRcbiIsCisJZGV2X2luZm8oJnBkZXYtPmRldiwgInYlcyBhZGRyIDB4JWxseCBpcnEgJWQgWXVrb24tJXMgKDB4JXgpIHJldiAlZFxuIiwKIAkgICAgICAgRFJWX1ZFUlNJT04sICh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLAogCSAgICAgICBwZGV2LT5pcnEsIHl1a29uMl9uYW1lW2h3LT5jaGlwX2lkIC0gQ0hJUF9JRF9ZVUtPTl9YTF0sCiAJICAgICAgIGh3LT5jaGlwX2lkLCBody0+Y2hpcF9yZXYpOwogCi0JZGV2ID0gc2t5Ml9pbml0X25ldGRldihodywgMCwgdXNpbmdfZGFjKTsKLQlpZiAoIWRldikKKwlza3kyX3Jlc2V0KGh3KTsKKworCWRldiA9IHNreTJfaW5pdF9uZXRkZXYoaHcsIDAsIHVzaW5nX2RhYywgd29sX2RlZmF1bHQpOworCWlmICghZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dF9mcmVlX3BjaTsKKwl9CiAKIAlpZiAoIWRpc2FibGVfbXNpICYmIHBjaV9lbmFibGVfbXNpKHBkZXYpID09IDApIHsKIAkJZXJyID0gc2t5Ml90ZXN0X21zaShodyk7CkBAIC0zNDgxLDMyICszNTcwLDMzIEBACiAKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBjYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZVxuIiwKLQkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2VcbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CiAJfQogCiAJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCAgc2t5Ml9pbnRyLCBody0+bXNpID8gMCA6IElSUUZfU0hBUkVELAogCQkJICBkZXYtPm5hbWUsIGh3KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBjYW5ub3QgYXNzaWduIGlycSAlZFxuIiwKLQkJICAgICAgIHBjaV9uYW1lKHBkZXYpLCBwZGV2LT5pcnEpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgYXNzaWduIGlycSAlZFxuIiwgcGRldi0+aXJxKTsKIAkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXI7CiAJfQogCXNreTJfd3JpdGUzMihodywgQjBfSU1TSywgWTJfSVNfQkFTRSk7CiAKIAlza3kyX3Nob3dfYWRkcihkZXYpOwogCi0JaWYgKGh3LT5wb3J0cyA+IDEgJiYgKGRldjEgPSBza3kyX2luaXRfbmV0ZGV2KGh3LCAxLCB1c2luZ19kYWMpKSkgewotCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldjEpID09IDApCi0JCQlza3kyX3Nob3dfYWRkcihkZXYxKTsKLQkJZWxzZSB7Ci0JCQkvKiBGYWlsdXJlIHRvIHJlZ2lzdGVyIHNlY29uZCBwb3J0IG5lZWQgbm90IGJlIGZhdGFsICovCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWAotCQkJICAgICAgICJyZWdpc3RlciBvZiBzZWNvbmQgcG9ydCBmYWlsZWRcbiIpOworCWlmIChody0+cG9ydHMgPiAxKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYxOworCisJCWRldjEgPSBza3kyX2luaXRfbmV0ZGV2KGh3LCAxLCB1c2luZ19kYWMsIHdvbF9kZWZhdWx0KTsKKwkJaWYgKCFkZXYxKQorCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImFsbG9jYXRpb24gZm9yIHNlY29uZCBkZXZpY2UgZmFpbGVkXG4iKTsKKwkJZWxzZSBpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYxKSkpIHsKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJyZWdpc3RlciBvZiBzZWNvbmQgcG9ydCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJCWh3LT5kZXZbMV0gPSBOVUxMOwogCQkJZnJlZV9uZXRkZXYoZGV2MSk7Ci0JCX0KKwkJfSBlbHNlCisJCQlza3kyX3Nob3dfYWRkcihkZXYxKTsKIAl9CiAKIAlzZXR1cF90aW1lcigmaHctPmlkbGVfdGltZXIsIHNreTJfaWRsZSwgKHVuc2lnbmVkIGxvbmcpIGh3KTsKQEAgLTM1NTUsNyArMzY0NSw4IEBACiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldjEpOwogCXVucmVnaXN0ZXJfbmV0ZGV2KGRldjApOwogCi0Jc2t5Ml9zZXRfcG93ZXJfc3RhdGUoaHcsIFBDSV9EM2hvdCk7CisJc2t5Ml9wb3dlcl9hdXgoaHcpOworCiAJc2t5Ml93cml0ZTE2KGh3LCBCMF9ZMkxFRCwgTEVEX1NUQVRfT0ZGKTsKIAlza3kyX3dyaXRlOChodywgQjBfQ1RTVCwgQ1NfUlNUX1NFVCk7CiAJc2t5Ml9yZWFkOChodywgQjBfQ1RTVCk7CkBAIC0zNTgwLDI3ICszNjcxLDMxIEBACiBzdGF0aWMgaW50IHNreTJfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBza3kyX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgaTsKLQlwY2lfcG93ZXJfdCBwc3RhdGUgPSBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKTsKLQotCWlmICghKHBzdGF0ZSA9PSBQQ0lfRDNob3QgfHwgcHN0YXRlID09IFBDSV9EM2NvbGQpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpbnQgaSwgd29sID0gMDsKIAogCWRlbF90aW1lcl9zeW5jKCZody0+aWRsZV90aW1lcik7CiAJbmV0aWZfcG9sbF9kaXNhYmxlKGh3LT5kZXZbMF0pOwogCiAJZm9yIChpID0gMDsgaSA8IGh3LT5wb3J0czsgaSsrKSB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBody0+ZGV2W2ldOworCQlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCiAJCQlza3kyX2Rvd24oZGV2KTsKLQkJCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKLQkJfQorCisJCWlmIChza3kyLT53b2wpCisJCQlza3kyX3dvbF9pbml0KHNreTIpOworCisJCXdvbCB8PSBza3kyLT53b2w7CiAJfQogCiAJc2t5Ml93cml0ZTMyKGh3LCBCMF9JTVNLLCAwKTsKKwlza3kyX3Bvd2VyX2F1eChodyk7CisKIAlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKLQlza3kyX3NldF9wb3dlcl9zdGF0ZShodywgcHN0YXRlKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIHdvbCk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzYwOSwyMSArMzcwNCwyMiBAQAogCXN0cnVjdCBza3kyX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQgaSwgZXJyOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7Ci0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EMCwgMCk7Ci0Jc2t5Ml9zZXRfcG93ZXJfc3RhdGUoaHcsIFBDSV9EMCk7Ci0KLQllcnIgPSBza3kyX3Jlc2V0KGh3KTsKKwllcnIgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKKwllcnIgPSBwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDAsIDApOworCXNreTJfcmVzZXQoaHcpOworCiAJc2t5Ml93cml0ZTMyKGh3LCBCMF9JTVNLLCBZMl9JU19CQVNFKTsKIAogCWZvciAoaSA9IDA7IGkgPCBody0+cG9ydHM7IGkrKykgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltpXTsKIAkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewotCQkJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwotCiAJCQllcnIgPSBza3kyX3VwKGRldik7CiAJCQlpZiAoZXJyKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IGNvdWxkIG5vdCB1cDogJWRcbiIsCkBAIC0zNjM2LDExICszNzMyLDQzIEBACiAKIAluZXRpZl9wb2xsX2VuYWJsZShody0+ZGV2WzBdKTsKIAlza3kyX2lkbGVfc3RhcnQoaHcpOworCXJldHVybiAwOwogb3V0OgorCWRldl9lcnIoJnBkZXYtPmRldiwgInJlc3VtZSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcmV0dXJuIGVycjsKIH0KICNlbmRpZgogCitzdGF0aWMgdm9pZCBza3kyX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBza3kyX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaSwgd29sID0gMDsKKworCWRlbF90aW1lcl9zeW5jKCZody0+aWRsZV90aW1lcik7CisJbmV0aWZfcG9sbF9kaXNhYmxlKGh3LT5kZXZbMF0pOworCisJZm9yIChpID0gMDsgaSA8IGh3LT5wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBody0+ZGV2W2ldOworCQlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQlpZiAoc2t5Mi0+d29sKSB7CisJCQl3b2wgPSAxOworCQkJc2t5Ml93b2xfaW5pdChza3kyKTsKKwkJfQorCX0KKworCWlmICh3b2wpCisJCXNreTJfcG93ZXJfYXV4KGh3KTsKKworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIHdvbCk7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EM2NvbGQsIHdvbCk7CisKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOworCit9CisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBza3kyX2RyaXZlciA9IHsKIAkubmFtZSA9IERSVl9OQU1FLAogCS5pZF90YWJsZSA9IHNreTJfaWRfdGFibGUsCkBAIC0zNjUwLDYgKzM3NzgsNyBAQAogCS5zdXNwZW5kID0gc2t5Ml9zdXNwZW5kLAogCS5yZXN1bWUgPSBza3kyX3Jlc3VtZSwKICNlbmRpZgorCS5zaHV0ZG93biA9IHNreTJfc2h1dGRvd24sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBza3kyX2luaXRfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za3kyLmggYi9kcml2ZXJzL25ldC9za3kyLmgKaW5kZXggNmVkMWQ0N2QuLjNiMDE4OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NreTIuaAorKysgYi9kcml2ZXJzL25ldC9za3kyLmgKQEAgLTMyLDYgKzMyLDcgQEAKIAlQQ0lfWTJfUEhZMV9DT01BID0gMTw8MjgsIC8qIFNldCBQSFkgMSB0byBDb21hIE1vZGUgKFlVS09OLTIpICovCiAJUENJX1kyX1BIWTJfUE9XRCA9IDE8PDI3LCAvKiBTZXQgUEhZIDIgdG8gUG93ZXIgRG93biAoWVVLT04tMikgKi8KIAlQQ0lfWTJfUEhZMV9QT1dEID0gMTw8MjYsIC8qIFNldCBQSFkgMSB0byBQb3dlciBEb3duIChZVUtPTi0yKSAqLworCVBDSV9ZMl9QTUVfTEVHQUNZPSAxPDwxNSwgLyogUENJIEV4cHJlc3MgbGVnYWN5IHBvd2VyIG1hbmFnZW1lbnQgbW9kZSAqLwogfTsKIAogZW51bSBwY2lfZGV2X3JlZ18yIHsKQEAgLTM3MCwxMiArMzcxLDkgQEAKIAogLyoJQjJfQ0hJUF9JRAkJIDggYml0IAlDaGlwIElkZW50aWZpY2F0aW9uIE51bWJlciAqLwogZW51bSB7Ci0JQ0hJUF9JRF9HRU5FU0lTCSAgID0gMHgwYSwgLyogQ2hpcCBJRCBmb3IgR0VORVNJUyAqLwotCUNISVBfSURfWVVLT04JICAgPSAweGIwLCAvKiBDaGlwIElEIGZvciBZVUtPTiAqLwotCUNISVBfSURfWVVLT05fTElURSA9IDB4YjEsIC8qIENoaXAgSUQgZm9yIFlVS09OLUxpdGUgKFJldi4gQTEtQTMpICovCi0JQ0hJUF9JRF9ZVUtPTl9MUCAgID0gMHhiMiwgLyogQ2hpcCBJRCBmb3IgWVVLT04tTFAgKi8KIAlDSElQX0lEX1lVS09OX1hMICAgPSAweGIzLCAvKiBDaGlwIElEIGZvciBZVUtPTi0yIFhMICovCiAJQ0hJUF9JRF9ZVUtPTl9FQ19VID0gMHhiNCwgLyogQ2hpcCBJRCBmb3IgWVVLT04tMiBFQyBVbHRyYSAqLworCUNISVBfSURfWVVLT05fRVggICA9IDB4YjUsIC8qIENoaXAgSUQgZm9yIFlVS09OLTIgRXh0cmVtZSAqLwogCUNISVBfSURfWVVLT05fRUMgICA9IDB4YjYsIC8qIENoaXAgSUQgZm9yIFlVS09OLTIgRUMgKi8KICAJQ0hJUF9JRF9ZVUtPTl9GRSAgID0gMHhiNywgLyogQ2hpcCBJRCBmb3IgWVVLT04tMiBGRSAqLwogCkBAIC03NjcsNiArNzY1LDI0IEBACiAJUE9MTF9MSVNUX0FERFJfSEk9IDB4MGUyYywvKiAzMiBiaXQJUG9sbC4gTGlzdCBTdGFydCBBZGRyIChoaWdoKSAqLwogfTsKIAorZW51bSB7CisJU01CX0NGRwkJID0gMHgwZTQwLCAvKiAzMiBiaXQJU01CdXMgQ29uZmlnIFJlZ2lzdGVyICovCisJU01CX0NTUgkJID0gMHgwZTQ0LCAvKiAzMiBiaXQJU01CdXMgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgKi8KK307CisKK2VudW0geworCUNQVV9XRE9HCSA9IDB4MGU0OCwgLyogMzIgYml0CVdhdGNoZG9nIFJlZ2lzdGVyICAqLworCUNQVV9DTlRSCSA9IDB4MGU0QywgLyogMzIgYml0CUNvdW50ZXIgUmVnaXN0ZXIgICovCisJQ1BVX1RJTQkJID0gMHgwZTUwLC8qIDMyIGJpdAlUaW1lciBDb21wYXJlIFJlZ2lzdGVyICAqLworCUNQVV9BSEJfQUREUgkgPSAweDBlNTQsIC8qIDMyIGJpdAlDUFUgQUhCIERlYnVnICBSZWdpc3RlciAgKi8KKwlDUFVfQUhCX1dEQVRBCSA9IDB4MGU1OCwgLyogMzIgYml0CUNQVSBBSEIgRGVidWcgIFJlZ2lzdGVyICAqLworCUNQVV9BSEJfUkRBVEEJID0gMHgwZTVDLCAvKiAzMiBiaXQJQ1BVIEFIQiBEZWJ1ZyAgUmVnaXN0ZXIgICovCisJSENVX01BUF9CQVNFCSA9IDB4MGU2MCwgLyogMzIgYml0CVJlc2V0IE1hcHBpbmcgQmFzZSAqLworCUNQVV9BSEJfQ1RSTAkgPSAweDBlNjQsIC8qIDMyIGJpdAlDUFUgQUhCIERlYnVnICBSZWdpc3RlciAgKi8KKwlIQ1VfQ0NTUgkgPSAweDBlNjgsIC8qIDMyIGJpdAlDUFUgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCisJSENVX0hDU1IJID0gMHgwZTZDLCAvKiAzMiBiaXQJSG9zdCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KK307CisKIC8qIEFTRiBTdWJzeXN0ZW0gUmVnaXN0ZXJzIChZdWtvbi0yIG9ubHkpICovCiBlbnVtIHsKIAlCMjhfWTJfU01CX0NPTkZJRyAgPSAweDBlNDAsLyogMzIgYml0CUFTRiBTTUJ1cyBDb25maWcgUmVnaXN0ZXIgKi8KQEAgLTgzNywzMyArODUzLDI3IEBACiAJR01BQ19MSU5LX0NUUkwJPSAweDBmMTAsLyogMTYgYml0CUxpbmsgQ29udHJvbCBSZWcgKi8KIAogLyogV2FrZS11cCBGcmFtZSBQYXR0ZXJuIE1hdGNoIENvbnRyb2wgUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLwotCi0JV09MX1JFR19PRkZTCT0gMHgyMCwvKiBIVy1CdWc6IEFkZHJlc3MgaXMgKyAweDIwIGFnYWluc3Qgc3BlYy4gKi8KLQogCVdPTF9DVFJMX1NUQVQJPSAweDBmMjAsLyogMTYgYml0CVdPTCBDb250cm9sL1N0YXR1cyBSZWcgKi8KIAlXT0xfTUFUQ0hfQ1RMCT0gMHgwZjIyLC8qICA4IGJpdAlXT0wgTWF0Y2ggQ29udHJvbCBSZWcgKi8KIAlXT0xfTUFUQ0hfUkVTCT0gMHgwZjIzLC8qICA4IGJpdAlXT0wgTWF0Y2ggUmVzdWx0IFJlZyAqLwogCVdPTF9NQUNfQUREUgk9IDB4MGYyNCwvKiAzMiBiaXQJV09MIE1BQyBBZGRyZXNzICovCi0JV09MX1BBVFRfUE1FCT0gMHgwZjJhLC8qICA4IGJpdAlXT0wgUE1FIE1hdGNoIEVuYWJsZSAoWXVrb24tMikgKi8KLQlXT0xfUEFUVF9BU0ZNCT0gMHgwZjJiLC8qICA4IGJpdAlXT0wgQVNGIE1hdGNoIEVuYWJsZSAoWXVrb24tMikgKi8KIAlXT0xfUEFUVF9SUFRSCT0gMHgwZjJjLC8qICA4IGJpdAlXT0wgUGF0dGVybiBSZWFkIFBvaW50ZXIgKi8KIAogLyogV09MIFBhdHRlcm4gTGVuZ3RoIFJlZ2lzdGVycyAoWVVLT04gb25seSkgKi8KLQogCVdPTF9QQVRUX0xFTl9MTwk9IDB4MGYzMCwvKiAzMiBiaXQJV09MIFBhdHRlcm4gTGVuZ3RoIDMuLjAgKi8KIAlXT0xfUEFUVF9MRU5fSEkJPSAweDBmMzQsLyogMjQgYml0CVdPTCBQYXR0ZXJuIExlbmd0aCA2Li40ICovCiAKIC8qIFdPTCBQYXR0ZXJuIENvdW50ZXIgUmVnaXN0ZXJzIChZVUtPTiBvbmx5KSAqLwotCi0KIAlXT0xfUEFUVF9DTlRfMAk9IDB4MGYzOCwvKiAzMiBiaXQJV09MIFBhdHRlcm4gQ291bnRlciAzLi4wICovCiAJV09MX1BBVFRfQ05UXzQJPSAweDBmM2MsLyogMjQgYml0CVdPTCBQYXR0ZXJuIENvdW50ZXIgNi4uNCAqLwogfTsKKyNkZWZpbmUgV09MX1JFR1MocG9ydCwgeCkJKHggKyAocG9ydCkqMHg4MCkKIAogZW51bSB7CiAJV09MX1BBVFRfUkFNXzEJPSAweDEwMDAsLyogIFdPTCBQYXR0ZXJuIFJBTSBMaW5rIDEgKi8KIAlXT0xfUEFUVF9SQU1fMgk9IDB4MTQwMCwvKiAgV09MIFBhdHRlcm4gUkFNIExpbmsgMiAqLwogfTsKKyNkZWZpbmUgV09MX1BBVFRfUkFNX0JBU0UocG9ydCkJKFdPTF9QQVRUX1JBTV8xICsgKHBvcnQpKjB4NDAwKQogCiBlbnVtIHsKIAlCQVNFX0dNQUNfMQk9IDB4MjgwMCwvKiBHTUFDIDEgcmVnaXN0ZXJzICovCkBAIC0xNjU0LDYgKzE2NjQsMzkgQEAKIAlZMl9BU0ZfQ0xSX0FTRkkgPSAxPDwxLAkvKiBDbGVhciBob3N0IElSUSAqLwogCVkyX0FTRl9IT1NUX0lSUSA9IDE8PDAsCS8qIElzc3VlIGFuIElSUSB0byBIT1NUIHN5c3RlbSAqLwogfTsKKy8qCUhDVV9DQ1NSCUNQVSBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KK2VudW0geworCUhDVV9DQ1NSX1NNQkFMRVJUX01PTklUT1I9IDE8PDI3LCAvKiBTTUJBTEVSVCBwaW4gbW9uaXRvciAqLworCUhDVV9DQ1NSX0NQVV9TTEVFUAk9IDE8PDI2LCAvKiBDUFUgc2xlZXAgc3RhdHVzICovCisJLyogQ2xvY2sgU3RyZXRjaGluZyBUaW1lb3V0ICovCisJSENVX0NDU1JfQ1NfVE8JCT0gMTw8MjUsCisJSENVX0NDU1JfV0RPRwkJPSAxPDwyNCwgLyogV2F0Y2hkb2cgUmVzZXQgKi8KKworCUhDVV9DQ1NSX0NMUl9JUlFfSE9TVAk9IDE8PDE3LCAvKiBDbGVhciBJUlFfSE9TVCAqLworCUhDVV9DQ1NSX1NFVF9JUlFfSENVCT0gMTw8MTYsIC8qIFNldCBJUlFfSENVICovCisKKwlIQ1VfQ0NTUl9BSEJfUlNUCT0gMTw8OSwgLyogUmVzZXQgQUhCIGJyaWRnZSAqLworCUhDVV9DQ1NSX0NQVV9SU1RfTU9ERQk9IDE8PDgsIC8qIENQVSBSZXNldCBNb2RlICovCisKKwlIQ1VfQ0NTUl9TRVRfU1lOQ19DUFUJPSAxPDw1LAorCUhDVV9DQ1NSX0NQVV9DTEtfRElWSURFX01TSyA9IDM8PDMsLyogQ1BVIENsb2NrIERpdmlkZSAqLworCUhDVV9DQ1NSX0NQVV9DTEtfRElWSURFX0JBU0U9IDE8PDMsCisJSENVX0NDU1JfT1NfUFJTTlQJPSAxPDwyLCAvKiBBU0YgT1MgUHJlc2VudCAqLworLyogTWljcm9jb250cm9sbGVyIFN0YXRlICovCisJSENVX0NDU1JfVUNfU1RBVEVfTVNLCT0gMywKKwlIQ1VfQ0NTUl9VQ19TVEFURV9CQVNFCT0gMTw8MCwKKwlIQ1VfQ0NTUl9BU0ZfUkVTRVQJPSAwLAorCUhDVV9DQ1NSX0FTRl9IQUxURUQJPSAxPDwxLAorCUhDVV9DQ1NSX0FTRl9SVU5OSU5HCT0gMTw8MCwKK307CisKKy8qCUhDVV9IQ1NSCUhvc3QgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICovCitlbnVtIHsKKwlIQ1VfSENTUl9TRVRfSVJRX0NQVQk9IDE8PDE2LCAvKiBTZXQgSVJRX0NQVSAqLworCisJSENVX0hDU1JfQ0xSX0lSUV9IQ1UJPSAxPDwxLCAvKiBDbGVhciBJUlFfSENVICovCisJSENVX0hDU1JfU0VUX0lSUV9IT1NUCT0gMTw8MCwJLyogU2V0IElSUV9IT1NUICovCit9OwogCiAvKglTVEFUX0NUUkwJCTMyIGJpdAlTdGF0dXMgQk1VIGNvbnRyb2wgcmVnaXN0ZXIgKFl1a29uLTIgb25seSkgKi8KIGVudW0gewpAQCAtMTcxNSwxNCArMTc1OCwxNyBAQAogCUdNX0lTX1JYX0NPTVBMCT0gMTw8MCwJLyogRnJhbWUgUmVjZXB0aW9uIENvbXBsZXRlICovCiAKICNkZWZpbmUgR01BQ19ERUZfTVNLICAgICBHTV9JU19UWF9GRl9VUgorfTsKIAogLyoJR01BQ19MSU5LX0NUUkwJMTYgYml0CUdNQUMgTGluayBDb250cm9sIFJlZyAoWVVLT04gb25seSkgKi8KLQkJCQkJCS8qIEJpdHMgMTUuLiAyOglyZXNlcnZlZCAqLworZW51bSB7CQkJCQkJLyogQml0cyAxNS4uIDI6CXJlc2VydmVkICovCiAJR01MQ19SU1RfQ0xSCT0gMTw8MSwJLyogQ2xlYXIgR01BQyBMaW5rIFJlc2V0ICovCiAJR01MQ19SU1RfU0VUCT0gMTw8MCwJLyogU2V0ICAgR01BQyBMaW5rIFJlc2V0ICovCit9OwogCiAKIC8qCVdPTF9DVFJMX1NUQVQJMTYgYml0CVdPTCBDb250cm9sL1N0YXR1cyBSZWcgKi8KK2VudW0gewogCVdPTF9DVExfTElOS19DSEdfT0NDCQk9IDE8PDE1LAogCVdPTF9DVExfTUFHSUNfUEtUX09DQwkJPSAxPDwxNCwKIAlXT0xfQ1RMX1BBVFRFUk5fT0NDCQk9IDE8PDEzLApAQCAtMTc0MSwxNyArMTc4Nyw2IEBACiAJV09MX0NUTF9ESVNfUEFUVEVSTl9VTklUCT0gMTw8MCwKIH07CiAKLSNkZWZpbmUgV09MX0NUTF9ERUZBVUxUCQkJCVwKLQkoV09MX0NUTF9ESVNfUE1FX09OX0xJTktfQ0hHIHwJXAotCVdPTF9DVExfRElTX1BNRV9PTl9QQVRURVJOIHwJXAotCVdPTF9DVExfRElTX1BNRV9PTl9NQUdJQ19QS1QgfAlcCi0JV09MX0NUTF9ESVNfTElOS19DSEdfVU5JVCB8CQlcCi0JV09MX0NUTF9ESVNfUEFUVEVSTl9VTklUIHwJCVwKLQlXT0xfQ1RMX0RJU19NQUdJQ19QS1RfVU5JVCkKLQotLyoJV09MX01BVENIX0NUTAkgOCBiaXQJV09MIE1hdGNoIENvbnRyb2wgUmVnICovCi0jZGVmaW5lIFdPTF9DVExfUEFUVF9FTkEoeCkJKDEgPDwgKHgpKQotCiAKIC8qIENvbnRyb2wgZmxhZ3MgKi8KIGVudW0gewpAQCAtMTg3NSw2ICsxOTEwLDcgQEAKIAl1OAkJICAgICBhdXRvbmVnOwkvKiBBVVRPTkVHX0VOQUJMRSwgQVVUT05FR19ESVNBQkxFICovCiAJdTgJCSAgICAgZHVwbGV4OwkvKiBEVVBMRVhfSEFMRiwgRFVQTEVYX0ZVTEwgKi8KIAl1OAkJICAgICByeF9jc3VtOworCXU4CQkgICAgIHdvbDsKICAJZW51bSBmbG93X2NvbnRyb2wgICAgZmxvd19tb2RlOwogIAllbnVtIGZsb3dfY29udHJvbCAgICBmbG93X3N0YXR1czsKIApAQCAtMTg4Nyw3ICsxOTIzLDYgQEAKIAlzdHJ1Y3QgcGNpX2RldgkgICAgICpwZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICAgICpkZXZbMl07CiAKLQlpbnQJCSAgICAgcG1fY2FwOwogCXU4CSAgICAgCSAgICAgY2hpcF9pZDsKIAl1OAkJICAgICBjaGlwX3JldjsKIAl1OAkJICAgICBwbWRfdHlwZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxMXguYyBiL2RyaXZlcnMvbmV0L3NtYzkxMXguYwppbmRleCA0M2FmNjE0Li5jOTU2MTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MTF4LmMKKysrIGIvZHJpdmVycy9uZXQvc21jOTExeC5jCkBAIC0xNjU5LDcgKzE2NTksNyBAQAogewogCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCBDQVJETkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOwogCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgdmVyc2lvbiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKLQlzdHJuY3B5KGluZm8tPmJ1c19pbmZvLCBkZXYtPmNsYXNzX2Rldi5kZXYtPmJ1c19pZCwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CisJc3RybmNweShpbmZvLT5idXNfaW5mbywgZGV2LT5kZXYucGFyZW50LT5idXNfaWQsIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiBzdGF0aWMgaW50IHNtYzkxMXhfZXRodG9vbF9ud2F5cmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKaW5kZXggZTYyYTk1OC4uNDlmNGI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTF4LmMKKysrIGIvZHJpdmVycy9uZXQvc21jOTF4LmMKQEAgLTE3MTIsNyArMTcxMiw3IEBACiB7CiAJc3RybmNweShpbmZvLT5kcml2ZXIsIENBUkROQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiAJc3RybmNweShpbmZvLT52ZXJzaW9uLCB2ZXJzaW9uLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwotCXN0cm5jcHkoaW5mby0+YnVzX2luZm8sIGRldi0+Y2xhc3NfZGV2LmRldi0+YnVzX2lkLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKKwlzdHJuY3B5KGluZm8tPmJ1c19pbmZvLCBkZXYtPmRldi5wYXJlbnQtPmJ1c19pZCwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyBpbnQgc21jX2V0aHRvb2xfbndheXJlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKaW5kZXggOGVhMmZjMS4uYmY2ZmYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYwpAQCAtMjgwLDcyICsyODAsNjcgQEAKIHsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqZGVzY3I7CiAKLQlmb3IgKGRlc2NyID0gY2hhaW4tPnRhaWw7ICFkZXNjci0+YnVzX2FkZHI7IGRlc2NyID0gZGVzY3ItPm5leHQpIHsKLQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVzX2FkZHIsCi0JCQkJIFNQSURFUl9ORVRfREVTQ1JfU0laRSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlkZXNjciA9IGNoYWluLT5yaW5nOworCWRvIHsKIAkJZGVzY3ItPmJ1c19hZGRyID0gMDsKLQl9CisJCWRlc2NyLT5uZXh0X2Rlc2NyX2FkZHIgPSAwOworCQlkZXNjciA9IGRlc2NyLT5uZXh0OworCX0gd2hpbGUgKGRlc2NyICE9IGNoYWluLT5yaW5nKTsKKworCWRtYV9mcmVlX2NvaGVyZW50KCZjYXJkLT5wZGV2LT5kZXYsIGNoYWluLT5udW1fZGVzYywKKwkgICAgY2hhaW4tPnJpbmcsIGNoYWluLT5kbWFfYWRkcik7CiB9CiAKIC8qKgotICogc3BpZGVyX25ldF9pbml0X2NoYWluIC0gbGlua3MgZGVzY3JpcHRvciBjaGFpbgorICogc3BpZGVyX25ldF9pbml0X2NoYWluIC0gYWxsb2MgYW5kIGxpbmsgZGVzY3JpcHRvciBjaGFpbgogICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCiAgKiBAY2hhaW46IGFkZHJlc3Mgb2YgY2hhaW4KLSAqIEBzdGFydF9kZXNjcjogYWRkcmVzcyBvZiBkZXNjcmlwdG9yIGFycmF5Ci0gKiBAbm86IG51bWJlciBvZiBkZXNjcmlwdG9ycwogICoKLSAqIHdlIG1hbmFnZSBhIGNpcmN1bGFyIGxpc3QgdGhhdCBtaXJyb3JzIHRoZSBoYXJkd2FyZSBzdHJ1Y3R1cmUsCisgKiBXZSBtYW5hZ2UgYSBjaXJjdWxhciBsaXN0IHRoYXQgbWlycm9ycyB0aGUgaGFyZHdhcmUgc3RydWN0dXJlLAogICogZXhjZXB0IHRoYXQgdGhlIGhhcmR3YXJlIHVzZXMgYnVzIGFkZHJlc3Nlcy4KICAqCi0gKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZQorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUKICAqLwogc3RhdGljIGludAogc3BpZGVyX25ldF9pbml0X2NoYWluKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsCi0JCSAgICAgICBzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiAqY2hhaW4sCi0JCSAgICAgICBzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqc3RhcnRfZGVzY3IsCi0JCSAgICAgICBpbnQgbm8pCisJCSAgICAgICBzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcl9jaGFpbiAqY2hhaW4pCiB7CiAJaW50IGk7CiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyOwogCWRtYV9hZGRyX3QgYnVmOworCXNpemVfdCBhbGxvY19zaXplOwogCi0JZGVzY3IgPSBzdGFydF9kZXNjcjsKLQltZW1zZXQoZGVzY3IsIDAsIHNpemVvZigqZGVzY3IpICogbm8pOworCWFsbG9jX3NpemUgPSBjaGFpbi0+bnVtX2Rlc2MgKiBzaXplb2YgKHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyKTsKIAotCS8qIHNldCB1cCB0aGUgaGFyZHdhcmUgcG9pbnRlcnMgaW4gZWFjaCBkZXNjcmlwdG9yICovCi0JZm9yIChpPTA7IGk8bm87IGkrKywgZGVzY3IrKykgeworCWNoYWluLT5yaW5nID0gZG1hX2FsbG9jX2NvaGVyZW50KCZjYXJkLT5wZGV2LT5kZXYsIGFsbG9jX3NpemUsCisJCSZjaGFpbi0+ZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCisJaWYgKCFjaGFpbi0+cmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXNjciA9IGNoYWluLT5yaW5nOworCW1lbXNldChkZXNjciwgMCwgYWxsb2Nfc2l6ZSk7CisKKwkvKiBTZXQgdXAgdGhlIGhhcmR3YXJlIHBvaW50ZXJzIGluIGVhY2ggZGVzY3JpcHRvciAqLworCWJ1ZiA9IGNoYWluLT5kbWFfYWRkcjsKKwlmb3IgKGk9MDsgaSA8IGNoYWluLT5udW1fZGVzYzsgaSsrLCBkZXNjcisrKSB7CiAJCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPSBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0U7CiAKLQkJYnVmID0gcGNpX21hcF9zaW5nbGUoY2FyZC0+cGRldiwgZGVzY3IsCi0JCQkJICAgICBTUElERVJfTkVUX0RFU0NSX1NJWkUsCi0JCQkJICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoYnVmKSkKLQkJCWdvdG8gaW9tbXVfZXJyb3I7Ci0KIAkJZGVzY3ItPmJ1c19hZGRyID0gYnVmOworCQlkZXNjci0+bmV4dF9kZXNjcl9hZGRyID0gMDsKIAkJZGVzY3ItPm5leHQgPSBkZXNjciArIDE7CiAJCWRlc2NyLT5wcmV2ID0gZGVzY3IgLSAxOwogCisJCWJ1ZiArPSBzaXplb2Yoc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IpOwogCX0KIAkvKiBkbyBhY3R1YWwgY2lyY3VsYXIgbGlzdCAqLwotCShkZXNjci0xKS0+bmV4dCA9IHN0YXJ0X2Rlc2NyOwotCXN0YXJ0X2Rlc2NyLT5wcmV2ID0gZGVzY3ItMTsKKwkoZGVzY3ItMSktPm5leHQgPSBjaGFpbi0+cmluZzsKKwljaGFpbi0+cmluZy0+cHJldiA9IGRlc2NyLTE7CiAKIAlzcGluX2xvY2tfaW5pdCgmY2hhaW4tPmxvY2spOwotCWNoYWluLT5oZWFkID0gc3RhcnRfZGVzY3I7Ci0JY2hhaW4tPnRhaWwgPSBzdGFydF9kZXNjcjsKLQorCWNoYWluLT5oZWFkID0gY2hhaW4tPnJpbmc7CisJY2hhaW4tPnRhaWwgPSBjaGFpbi0+cmluZzsKIAlyZXR1cm4gMDsKLQotaW9tbXVfZXJyb3I6Ci0JZGVzY3IgPSBzdGFydF9kZXNjcjsKLQlmb3IgKGk9MDsgaSA8IG5vOyBpKyssIGRlc2NyKyspCi0JCWlmIChkZXNjci0+YnVzX2FkZHIpCi0JCQlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2NyLT5idXNfYWRkciwKLQkJCQkJIFNQSURFUl9ORVRfREVTQ1JfU0laRSwKLQkJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0JcmV0dXJuIC1FTk9NRU07CiB9CiAKIC8qKgpAQCAtMzcyLDIxICszNjcsMjAgQEAKIH0KIAogLyoqCi0gKiBzcGlkZXJfbmV0X3ByZXBhcmVfcnhfZGVzY3IgLSByZWluaXRpYWxpemVzIGEgcnggZGVzY3JpcHRvcgorICogc3BpZGVyX25ldF9wcmVwYXJlX3J4X2Rlc2NyIC0gUmVpbml0aWFsaXplIFJYIGRlc2NyaXB0b3IKICAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQogICogQGRlc2NyOiBkZXNjcmlwdG9yIHRvIHJlLWluaXQKICAqCi0gKiByZXR1cm4gMCBvbiBzdWNjZXMsIDwwIG9uIGZhaWx1cmUKKyAqIFJldHVybiAwIG9uIHN1Y2NlcywgPDAgb24gZmFpbHVyZS4KICAqCi0gKiBhbGxvY2F0ZXMgYSBuZXcgcnggc2tiLCBpb21tdS1tYXBzIGl0IGFuZCBhdHRhY2hlcyBpdCB0byB0aGUgZGVzY3JpcHRvci4KLSAqIEFjdGl2YXRlIHRoZSBkZXNjcmlwdG9yIHN0YXRlLXdpc2UKKyAqIEFsbG9jYXRlcyBhIG5ldyByeCBza2IsIGlvbW11LW1hcHMgaXQgYW5kIGF0dGFjaGVzIGl0IHRvIHRoZQorICogZGVzY3JpcHRvci4gTWFyayB0aGUgZGVzY3JpcHRvciBhcyBhY3RpdmF0ZWQsIHJlYWR5LXRvLXVzZS4KICAqLwogc3RhdGljIGludAogc3BpZGVyX25ldF9wcmVwYXJlX3J4X2Rlc2NyKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsCiAJCQkgICAgc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmRlc2NyKQogewogCWRtYV9hZGRyX3QgYnVmOwotCWludCBlcnJvciA9IDA7CiAJaW50IG9mZnNldDsKIAlpbnQgYnVmc2l6ZTsKIApAQCAtNDE0LDcgKzQwOCw3IEBACiAJCShTUElERVJfTkVUX1JYQlVGX0FMSUdOIC0gMSk7CiAJaWYgKG9mZnNldCkKIAkJc2tiX3Jlc2VydmUoZGVzY3ItPnNrYiwgU1BJREVSX05FVF9SWEJVRl9BTElHTiAtIG9mZnNldCk7Ci0JLyogaW8tbW11LW1hcCB0aGUgc2tiICovCisJLyogaW9tbXUtbWFwIHRoZSBza2IgKi8KIAlidWYgPSBwY2lfbWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+c2tiLT5kYXRhLAogCQkJU1BJREVSX05FVF9NQVhfRlJBTUUsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJZGVzY3ItPmJ1Zl9hZGRyID0gYnVmOwpAQCAtNDI1LDExICs0MTksMTYgQEAKIAkJY2FyZC0+c3BpZGVyX3N0YXRzLnJ4X2lvbW11X21hcF9lcnJvcisrOwogCQlkZXNjci0+ZG1hY19jbWRfc3RhdHVzID0gU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFOwogCX0gZWxzZSB7CisJCWRlc2NyLT5uZXh0X2Rlc2NyX2FkZHIgPSAwOworCQl3bWIoKTsKIAkJZGVzY3ItPmRtYWNfY21kX3N0YXR1cyA9IFNQSURFUl9ORVRfREVTQ1JfQ0FSRE9XTkVEIHwKIAkJCQkJIFNQSURFUl9ORVRfRE1BQ19OT0lOVFJfQ09NUExFVEU7CisKKwkJd21iKCk7CisJCWRlc2NyLT5wcmV2LT5uZXh0X2Rlc2NyX2FkZHIgPSBkZXNjci0+YnVzX2FkZHI7CiAJfQogCi0JcmV0dXJuIGVycm9yOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTQ5MywxMCArNDkyLDEwIEBACiB9CiAKIC8qKgotICogc3BpZGVyX25ldF9hbGxvY19yeF9za2JzIC0gYWxsb2NhdGVzIHJ4IHNrYnMgaW4gcnggZGVzY3JpcHRvciBjaGFpbnMKKyAqIHNwaWRlcl9uZXRfYWxsb2Nfcnhfc2ticyAtIEFsbG9jYXRlcyByeCBza2JzIGluIHJ4IGRlc2NyaXB0b3IgY2hhaW5zCiAgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKICAqCi0gKiByZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZQorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQKIHNwaWRlcl9uZXRfYWxsb2Nfcnhfc2ticyhzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQpAQCAtNTA3LDE2ICs1MDYsMTYgQEAKIAlyZXN1bHQgPSAtRU5PTUVNOwogCiAJY2hhaW4gPSAmY2FyZC0+cnhfY2hhaW47Ci0JLyogcHV0IGF0IGxlYXN0IG9uZSBidWZmZXIgaW50byB0aGUgY2hhaW4uIGlmIHRoaXMgZmFpbHMsCi0JICogd2UndmUgZ290IGEgcHJvYmxlbS4gaWYgbm90LCBzcGlkZXJfbmV0X3JlZmlsbF9yeF9jaGFpbgotCSAqIHdpbGwgZG8gdGhlIHJlc3QgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uICovCisJLyogUHV0IGF0IGxlYXN0IG9uZSBidWZmZXIgaW50byB0aGUgY2hhaW4uIGlmIHRoaXMgZmFpbHMsCisJICogd2UndmUgZ290IGEgcHJvYmxlbS4gSWYgbm90LCBzcGlkZXJfbmV0X3JlZmlsbF9yeF9jaGFpbgorCSAqIHdpbGwgZG8gdGhlIHJlc3QgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLiAqLwogCWlmIChzcGlkZXJfbmV0X3ByZXBhcmVfcnhfZGVzY3IoY2FyZCwgY2hhaW4tPmhlYWQpKQogCQlnb3RvIGVycm9yOwogCWVsc2UKIAkJY2hhaW4tPmhlYWQgPSBjaGFpbi0+aGVhZC0+bmV4dDsKIAotCS8qIHRoaXMgd2lsbCBhbGxvY2F0ZSB0aGUgcmVzdCBvZiB0aGUgcnggYnVmZmVyczsgaWYgbm90LCBpdCdzCi0JICogYnVzaW5lc3MgYXMgdXN1YWwgbGF0ZXIgb24gKi8KKwkvKiBUaGlzIHdpbGwgYWxsb2NhdGUgdGhlIHJlc3Qgb2YgdGhlIHJ4IGJ1ZmZlcnM7CisJICogaWYgbm90LCBpdCdzIGJ1c2luZXNzIGFzIHVzdWFsIGxhdGVyIG9uLiAqLwogCXNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKGNhcmQpOwogCXNwaWRlcl9uZXRfZW5hYmxlX3J4ZG1hYyhjYXJkKTsKIAlyZXR1cm4gMDsKQEAgLTcwNyw3ICs3MDYsNyBAQAogCX0KIAogCS8qIElmIFRYIHF1ZXVlIGlzIHNob3J0LCBkb24ndCBldmVuIGJvdGhlciB3aXRoIGludGVycnVwdHMgKi8KLQlpZiAoY250IDwgY2FyZC0+bnVtX3R4X2Rlc2MvNCkKKwlpZiAoY250IDwgY2FyZC0+dHhfY2hhaW4ubnVtX2Rlc2MvNCkKIAkJcmV0dXJuIGNudDsKIAogCS8qIFNldCBsb3ctd2F0ZXJtYXJrIDMvNHRoJ3Mgb2YgdGhlIHdheSBpbnRvIHRoZSBxdWV1ZS4gKi8KQEAgLTkxNSwxNiArOTE0LDEzIEBACiAgKiBzcGlkZXJfbmV0X3Bhc3Nfc2tiX3VwIC0gdGFrZXMgYW4gc2tiIGZyb20gYSBkZXNjcmlwdG9yIGFuZCBwYXNzZXMgaXQgb24KICAqIEBkZXNjcjogZGVzY3JpcHRvciB0byBwcm9jZXNzCiAgKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKLSAqIEBuYXBpOiB3aGV0aGVyIGNhbGxlciBpcyBpbiBOQVBJIGNvbnRleHQKICAqCi0gKiByZXR1cm5zIDEgb24gc3VjY2VzcywgMCBpZiBubyBwYWNrZXQgd2FzIHBhc3NlZCB0byB0aGUgc3RhY2sKLSAqCi0gKiBpb21tdS11bm1hcHMgdGhlIHNrYiwgZmlsbHMgb3V0IHNrYiBzdHJ1Y3R1cmUgYW5kIHBhc3NlcyB0aGUgZGF0YSB0byB0aGUKLSAqIHN0YWNrLiBUaGUgZGVzY3JpcHRvciBzdGF0ZSBpcyBub3QgY2hhbmdlZC4KKyAqIEZpbGxzIG91dCBza2Igc3RydWN0dXJlIGFuZCBwYXNzZXMgdGhlIGRhdGEgdG8gdGhlIHN0YWNrLgorICogVGhlIGRlc2NyaXB0b3Igc3RhdGUgaXMgbm90IGNoYW5nZWQuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyB2b2lkCiBzcGlkZXJfbmV0X3Bhc3Nfc2tiX3VwKHN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjciwKLQkJICAgICAgIHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsIGludCBuYXBpKQorCQkgICAgICAgc3RydWN0IHNwaWRlcl9uZXRfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CkBAIC05MzIsMjMgKzkyOCw4IEBACiAKIAlkYXRhX3N0YXR1cyA9IGRlc2NyLT5kYXRhX3N0YXR1czsKIAlkYXRhX2Vycm9yID0gZGVzY3ItPmRhdGFfZXJyb3I7Ci0KIAluZXRkZXYgPSBjYXJkLT5uZXRkZXY7CiAKLQkvKiB1bm1hcCBkZXNjcmlwdG9yICovCi0JcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVmX2FkZHIsIFNQSURFUl9ORVRfTUFYX0ZSQU1FLAotCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQotCS8qIHRoZSBjYXNlcyB3ZSdsbCB0aHJvdyBhd2F5IHRoZSBwYWNrZXQgaW1tZWRpYXRlbHkgKi8KLQlpZiAoZGF0YV9lcnJvciAmIFNQSURFUl9ORVRfREVTVFJPWV9SWF9GTEFHUykgewotCQlpZiAobmV0aWZfbXNnX3J4X2VycihjYXJkKSkKLQkJCXByX2VycigiZXJyb3IgaW4gcmVjZWl2ZWQgZGVzY3JpcHRvciBmb3VuZCwgIgotCQkJICAgICAgICJkYXRhX3N0YXR1cz14JTA4eCwgZGF0YV9lcnJvcj14JTA4eFxuIiwKLQkJCSAgICAgICBkYXRhX3N0YXR1cywgZGF0YV9lcnJvcik7Ci0JCWNhcmQtPnNwaWRlcl9zdGF0cy5yeF9kZXNjX2Vycm9yKys7Ci0JCXJldHVybiAwOwotCX0KLQogCXNrYiA9IGRlc2NyLT5za2I7CiAJc2tiLT5kZXYgPSBuZXRkZXY7CiAJc2tiX3B1dChza2IsIGRlc2NyLT52YWxpZF9zaXplKTsKQEAgLTk3Nyw1NyArOTU4LDcyIEBACiAJfQogCiAJLyogcGFzcyBza2IgdXAgdG8gc3RhY2sgKi8KLQlpZiAobmFwaSkKLQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLQllbHNlCi0JCW5ldGlmX3J4X25pKHNrYik7CisJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIAogCS8qIHVwZGF0ZSBuZXRkZXZpY2Ugc3RhdGlzdGljcyAqLwogCWNhcmQtPm5ldGRldl9zdGF0cy5yeF9wYWNrZXRzKys7CiAJY2FyZC0+bmV0ZGV2X3N0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwotCi0JcmV0dXJuIDE7CiB9CiAKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgc2hvd19yeF9jaGFpbihzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyX2NoYWluICpjaGFpbiA9ICZjYXJkLT5yeF9jaGFpbjsKKwlzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjciAqc3RhcnQ9IGNoYWluLT50YWlsOworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjcj0gc3RhcnQ7CisJaW50IHN0YXR1czsKKworCWludCBjbnQgPSAwOworCWludCBjc3RhdCA9IHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhkZXNjcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiUlggY2hhaW4gdGFpbCBhdCBkZXNjcj0lbGRcbiIsCisJICAgICAoc3RhcnQgLSBjYXJkLT5kZXNjcikgLSBjYXJkLT50eF9jaGFpbi5udW1fZGVzYyk7CisJc3RhdHVzID0gY3N0YXQ7CisJZG8KKwl7CisJCXN0YXR1cyA9IHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhkZXNjcik7CisJCWlmIChjc3RhdCAhPSBzdGF0dXMpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkhhdmUgJWQgZGVzY3JzIHdpdGggc3RhdD14JTA4eFxuIiwgY250LCBjc3RhdCk7CisJCQljc3RhdCA9IHN0YXR1czsKKwkJCWNudCA9IDA7CisJCX0KKwkJY250ICsrOworCQlkZXNjciA9IGRlc2NyLT5uZXh0OworCX0gd2hpbGUgKGRlc2NyICE9IHN0YXJ0KTsKKwlwcmludGsoS0VSTl9JTkZPICJMYXN0ICVkIGRlc2NycyB3aXRoIHN0YXQ9eCUwOHhcbiIsIGNudCwgY3N0YXQpOworfQorI2VuZGlmCisKIC8qKgogICogc3BpZGVyX25ldF9kZWNvZGVfb25lX2Rlc2NyIC0gcHJvY2Vzc2VzIGFuIHJ4IGRlc2NyaXB0b3IKICAqIEBjYXJkOiBjYXJkIHN0cnVjdHVyZQotICogQG5hcGk6IHdoZXRoZXIgY2FsbGVyIGlzIGluIE5BUEkgY29udGV4dAogICoKLSAqIHJldHVybnMgMSBpZiBhIHBhY2tldCBoYXMgYmVlbiBzZW50IHRvIHRoZSBzdGFjaywgb3RoZXJ3aXNlIDAKKyAqIFJldHVybnMgMSBpZiBhIHBhY2tldCBoYXMgYmVlbiBzZW50IHRvIHRoZSBzdGFjaywgb3RoZXJ3aXNlIDAKICAqCi0gKiBwcm9jZXNzZXMgYW4gcnggZGVzY3JpcHRvciBieSBpb21tdS11bm1hcHBpbmcgdGhlIGRhdGEgYnVmZmVyIGFuZCBwYXNzaW5nCisgKiBQcm9jZXNzZXMgYW4gcnggZGVzY3JpcHRvciBieSBpb21tdS11bm1hcHBpbmcgdGhlIGRhdGEgYnVmZmVyIGFuZCBwYXNzaW5nCiAgKiB0aGUgcGFja2V0IHVwIHRvIHRoZSBzdGFjay4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gc29mdGlycQogICogY29udGV4dCwgZS5nLiBlaXRoZXIgYm90dG9tIGhhbGYgZnJvbSBpbnRlcnJ1cHQgb3IgTkFQSSBwb2xsaW5nIGNvbnRleHQKICAqLwogc3RhdGljIGludAotc3BpZGVyX25ldF9kZWNvZGVfb25lX2Rlc2NyKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQsIGludCBuYXBpKQorc3BpZGVyX25ldF9kZWNvZGVfb25lX2Rlc2NyKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQpCiB7CiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3JfY2hhaW4gKmNoYWluID0gJmNhcmQtPnJ4X2NoYWluOwogCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjciA9IGNoYWluLT50YWlsOwogCWludCBzdGF0dXM7Ci0JaW50IHJlc3VsdDsKIAogCXN0YXR1cyA9IHNwaWRlcl9uZXRfZ2V0X2Rlc2NyX3N0YXR1cyhkZXNjcik7CiAKLQlpZiAoc3RhdHVzID09IFNQSURFUl9ORVRfREVTQ1JfQ0FSRE9XTkVEKSB7Ci0JCS8qIG5vdGhpbmcgaW4gdGhlIGRlc2NyaXB0b3IgeWV0ICovCi0JCXJlc3VsdD0wOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoc3RhdHVzID09IFNQSURFUl9ORVRfREVTQ1JfTk9UX0lOX1VTRSkgewotCQkvKiBub3QgaW5pdGlhbGl6ZWQgeWV0LCB0aGUgcmluZyBtdXN0IGJlIGVtcHR5ICovCi0JCXNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKGNhcmQpOwotCQlzcGlkZXJfbmV0X2VuYWJsZV9yeGRtYWMoY2FyZCk7Ci0JCXJlc3VsdD0wOwotCQlnb3RvIG91dDsKLQl9CisJLyogTm90aGluZyBpbiB0aGUgZGVzY3JpcHRvciwgb3IgcmluZyBtdXN0IGJlIGVtcHR5ICovCisJaWYgKChzdGF0dXMgPT0gU1BJREVSX05FVF9ERVNDUl9DQVJET1dORUQpIHx8CisJICAgIChzdGF0dXMgPT0gU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFKSkKKwkJcmV0dXJuIDA7CiAKIAkvKiBkZXNjcmlwdG9yIGRlZmluaXRpdmVseSB1c2VkIC0tIG1vdmUgb24gdGFpbCAqLwogCWNoYWluLT50YWlsID0gZGVzY3ItPm5leHQ7CiAKLQlyZXN1bHQgPSAwOworCS8qIHVubWFwIGRlc2NyaXB0b3IgKi8KKwlwY2lfdW5tYXBfc2luZ2xlKGNhcmQtPnBkZXYsIGRlc2NyLT5idWZfYWRkciwKKwkJCVNQSURFUl9ORVRfTUFYX0ZSQU1FLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCiAJaWYgKCAoc3RhdHVzID09IFNQSURFUl9ORVRfREVTQ1JfUkVTUE9OU0VfRVJST1IpIHx8CiAJICAgICAoc3RhdHVzID09IFNQSURFUl9ORVRfREVTQ1JfUFJPVEVDVElPTl9FUlJPUikgfHwKIAkgICAgIChzdGF0dXMgPT0gU1BJREVSX05FVF9ERVNDUl9GT1JDRV9FTkQpICkgewpAQCAtMTAzNSwzMSArMTAzMSw1NSBAQAogCQkJcHJfZXJyKCIlczogZHJvcHBpbmcgUlggZGVzY3JpcHRvciB3aXRoIHN0YXRlICVkXG4iLAogCQkJICAgICAgIGNhcmQtPm5ldGRldi0+bmFtZSwgc3RhdHVzKTsKIAkJY2FyZC0+bmV0ZGV2X3N0YXRzLnJ4X2Ryb3BwZWQrKzsKLQkJcGNpX3VubWFwX3NpbmdsZShjYXJkLT5wZGV2LCBkZXNjci0+YnVmX2FkZHIsCi0JCQkJU1BJREVSX05FVF9NQVhfRlJBTUUsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCWRldl9rZnJlZV9za2JfaXJxKGRlc2NyLT5za2IpOwotCQlnb3RvIHJlZmlsbDsKKwkJZ290byBiYWRfZGVzYzsKIAl9CiAKIAlpZiAoIChzdGF0dXMgIT0gU1BJREVSX05FVF9ERVNDUl9DT01QTEVURSkgJiYKIAkgICAgIChzdGF0dXMgIT0gU1BJREVSX05FVF9ERVNDUl9GUkFNRV9FTkQpICkgewotCQlpZiAobmV0aWZfbXNnX3J4X2VycihjYXJkKSkgewotCQkJcHJfZXJyKCIlczogUlggZGVzY3JpcHRvciB3aXRoIHN0YXRlICVkXG4iLAorCQlpZiAobmV0aWZfbXNnX3J4X2VycihjYXJkKSkKKwkJCXByX2VycigiJXM6IFJYIGRlc2NyaXB0b3Igd2l0aCB1bmtvd24gc3RhdGUgJWRcbiIsCiAJCQkgICAgICAgY2FyZC0+bmV0ZGV2LT5uYW1lLCBzdGF0dXMpOwotCQkJY2FyZC0+c3BpZGVyX3N0YXRzLnJ4X2Rlc2NfdW5rX3N0YXRlKys7Ci0JCX0KLQkJZ290byByZWZpbGw7CisJCWNhcmQtPnNwaWRlcl9zdGF0cy5yeF9kZXNjX3Vua19zdGF0ZSsrOworCQlnb3RvIGJhZF9kZXNjOwogCX0KIAotCS8qIG9rLCB3ZSd2ZSBnb3QgYSBwYWNrZXQgaW4gZGVzY3IgKi8KLQlyZXN1bHQgPSBzcGlkZXJfbmV0X3Bhc3Nfc2tiX3VwKGRlc2NyLCBjYXJkLCBuYXBpKTsKLXJlZmlsbDoKKwkvKiBUaGUgY2FzZXMgd2UnbGwgdGhyb3cgYXdheSB0aGUgcGFja2V0IGltbWVkaWF0ZWx5ICovCisJaWYgKGRlc2NyLT5kYXRhX2Vycm9yICYgU1BJREVSX05FVF9ERVNUUk9ZX1JYX0ZMQUdTKSB7CisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKGNhcmQpKQorCQkJcHJfZXJyKCIlczogZXJyb3IgaW4gcmVjZWl2ZWQgZGVzY3JpcHRvciBmb3VuZCwgIgorCQkJICAgICAgICJkYXRhX3N0YXR1cz14JTA4eCwgZGF0YV9lcnJvcj14JTA4eFxuIiwKKwkJCSAgICAgICBjYXJkLT5uZXRkZXYtPm5hbWUsCisJCQkgICAgICAgZGVzY3ItPmRhdGFfc3RhdHVzLCBkZXNjci0+ZGF0YV9lcnJvcik7CisJCWdvdG8gYmFkX2Rlc2M7CisJfQorCisJaWYgKGRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgJiAweGZlZmUpIHsKKwkJcHJfZXJyKCIlczogYmFkIHN0YXR1cywgY21kX3N0YXR1cz14JTA4eFxuIiwKKwkJCSAgICAgICBjYXJkLT5uZXRkZXYtPm5hbWUsCisJCQkgICAgICAgZGVzY3ItPmRtYWNfY21kX3N0YXR1cyk7CisJCXByX2VycigiYnVmX2FkZHI9eCUwOHhcbiIsIGRlc2NyLT5idWZfYWRkcik7CisJCXByX2VycigiYnVmX3NpemU9eCUwOHhcbiIsIGRlc2NyLT5idWZfc2l6ZSk7CisJCXByX2VycigibmV4dF9kZXNjcl9hZGRyPXglMDh4XG4iLCBkZXNjci0+bmV4dF9kZXNjcl9hZGRyKTsKKwkJcHJfZXJyKCJyZXN1bHRfc2l6ZT14JTA4eFxuIiwgZGVzY3ItPnJlc3VsdF9zaXplKTsKKwkJcHJfZXJyKCJ2YWxpZF9zaXplPXglMDh4XG4iLCBkZXNjci0+dmFsaWRfc2l6ZSk7CisJCXByX2VycigiZGF0YV9zdGF0dXM9eCUwOHhcbiIsIGRlc2NyLT5kYXRhX3N0YXR1cyk7CisJCXByX2VycigiZGF0YV9lcnJvcj14JTA4eFxuIiwgZGVzY3ItPmRhdGFfZXJyb3IpOworCQlwcl9lcnIoImJ1c19hZGRyPXglMDh4XG4iLCBkZXNjci0+YnVzX2FkZHIpOworCQlwcl9lcnIoIndoaWNoPSVsZFxuIiwgZGVzY3IgLSBjYXJkLT5yeF9jaGFpbi5yaW5nKTsKKworCQljYXJkLT5zcGlkZXJfc3RhdHMucnhfZGVzY19lcnJvcisrOworCQlnb3RvIGJhZF9kZXNjOworCX0KKworCS8qIE9rLCB3ZSd2ZSBnb3QgYSBwYWNrZXQgaW4gZGVzY3IgKi8KKwlzcGlkZXJfbmV0X3Bhc3Nfc2tiX3VwKGRlc2NyLCBjYXJkKTsKIAlkZXNjci0+ZG1hY19jbWRfc3RhdHVzID0gU1BJREVSX05FVF9ERVNDUl9OT1RfSU5fVVNFOwotCS8qIGNoYW5nZSB0aGUgZGVzY3JpcHRvciBzdGF0ZTogKi8KLQlpZiAoIW5hcGkpCi0JCXNwaWRlcl9uZXRfcmVmaWxsX3J4X2NoYWluKGNhcmQpOwotb3V0OgotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDE7CisKK2JhZF9kZXNjOgorCWRldl9rZnJlZV9za2JfaXJxKGRlc2NyLT5za2IpOworCWRlc2NyLT5kbWFjX2NtZF9zdGF0dXMgPSBTUElERVJfTkVUX0RFU0NSX05PVF9JTl9VU0U7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTA4NSw3ICsxMTA1LDcgQEAKIAlwYWNrZXRzX3RvX2RvID0gbWluKCpidWRnZXQsIG5ldGRldi0+cXVvdGEpOwogCiAJd2hpbGUgKHBhY2tldHNfdG9fZG8pIHsKLQkJaWYgKHNwaWRlcl9uZXRfZGVjb2RlX29uZV9kZXNjcihjYXJkLCAxKSkgeworCQlpZiAoc3BpZGVyX25ldF9kZWNvZGVfb25lX2Rlc2NyKGNhcmQpKSB7CiAJCQlwYWNrZXRzX2RvbmUrKzsKIAkJCXBhY2tldHNfdG9fZG8tLTsKIAkJfSBlbHNlIHsKQEAgLTEwOTgsNiArMTExOCw3IEBACiAJbmV0ZGV2LT5xdW90YSAtPSBwYWNrZXRzX2RvbmU7CiAJKmJ1ZGdldCAtPSBwYWNrZXRzX2RvbmU7CiAJc3BpZGVyX25ldF9yZWZpbGxfcnhfY2hhaW4oY2FyZCk7CisJc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjKGNhcmQpOwogCiAJLyogaWYgYWxsIHBhY2tldHMgYXJlIGluIHRoZSBzdGFjaywgZW5hYmxlIGludGVycnVwdHMgYW5kIHJldHVybiAwICovCiAJLyogaWYgbm90LCByZXR1cm4gMSAqLwpAQCAtMTIyNywyNCArMTI0OCw2IEBACiB9CiAKIC8qKgotICogc3BpZGVyX25ldF9oYW5kbGVfcnhyYW1fZnVsbCAtIGNsZWFucyB1cCBSWCByaW5nIHVwb24gUlggUkFNIGZ1bGwgaW50ZXJydXB0Ci0gKiBAY2FyZDogY2FyZCBzdHJ1Y3R1cmUKLSAqCi0gKiBzcGlkZXJfbmV0X2hhbmRsZV9yeHJhbV9mdWxsIGVtcHRpZXMgdGhlIFJYIHJpbmcgc28gdGhhdCBzcGlkZXIgY2FuIHB1dAotICogbW9yZSBwYWNrZXRzIGluIGl0IGFuZCBlbXB0eSBpdHMgUlggUkFNLiBUaGlzIGlzIGNhbGxlZCBpbiBib3R0b20gaGFsZgotICogY29udGV4dAotICovCi1zdGF0aWMgdm9pZAotc3BpZGVyX25ldF9oYW5kbGVfcnhyYW1fZnVsbChzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkKQotewotCXdoaWxlIChzcGlkZXJfbmV0X2RlY29kZV9vbmVfZGVzY3IoY2FyZCwgMCkpCi0JCTsKLQlzcGlkZXJfbmV0X2VuYWJsZV9yeGNodGFpbHMoY2FyZCk7Ci0Jc3BpZGVyX25ldF9lbmFibGVfcnhkbWFjKGNhcmQpOwotCW5ldGlmX3J4X3NjaGVkdWxlKGNhcmQtPm5ldGRldik7Ci19Ci0KLS8qKgogICogc3BpZGVyX25ldF9oYW5kbGVfZXJyb3JfaXJxIC0gaGFuZGxlcyBlcnJvcnMgcmFpc2VkIGJ5IGFuIGludGVycnVwdAogICogQGNhcmQ6IGNhcmQgc3RydWN0dXJlCiAgKiBAc3RhdHVzX3JlZzogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAwIChHSElJTlQwU1RTKQpAQCAtMTM2NiwxMCArMTM2OSwxMCBAQAogCWNhc2UgU1BJREVSX05FVF9HUkZBRkxMSU5UOiAvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgU1BJREVSX05FVF9HUk1GTExJTlQ6CiAJCWlmIChuZXRpZl9tc2dfaW50cihjYXJkKSAmJiBuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcl9kZWJ1ZygiU3BpZGVyIFJYIFJBTSBmdWxsLCBpbmNvbWluZyBwYWNrZXRzICIKKwkJCXByX2VycigiU3BpZGVyIFJYIFJBTSBmdWxsLCBpbmNvbWluZyBwYWNrZXRzICIKIAkJCSAgICAgICAibWlnaHQgYmUgZGlzY2FyZGVkIVxuIik7CiAJCXNwaWRlcl9uZXRfcnhfaXJxX29mZihjYXJkKTsKLQkJdGFza2xldF9zY2hlZHVsZSgmY2FyZC0+cnhyYW1fZnVsbF90bCk7CisJCW5ldGlmX3J4X3NjaGVkdWxlKGNhcmQtPm5ldGRldik7CiAJCXNob3dfZXJyb3IgPSAwOwogCQlicmVhazsKIApAQCAtMTM4NCw3ICsxMzg3LDcgQEAKIAljYXNlIFNQSURFUl9ORVRfR0RDRENFSU5UOiAvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgU1BJREVSX05FVF9HREJEQ0VJTlQ6IC8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBTUElERVJfTkVUX0dEQURDRUlOVDoKLQkJaWYgKG5ldGlmX21zZ19pbnRyKGNhcmQpKQorCQlpZiAobmV0aWZfbXNnX2ludHIoY2FyZCkgJiYgbmV0X3JhdGVsaW1pdCgpKQogCQkJcHJfZXJyKCJnb3QgZGVzY3JpcHRvciBjaGFpbiBlbmQgaW50ZXJydXB0LCAiCiAJCQkgICAgICAgInJlc3RhcnRpbmcgRE1BQyAlYy5cbiIsCiAJCQkgICAgICAgJ0QnLShpLVNQSURFUl9ORVRfR0RERENFSU5UKS8zKTsKQEAgLTE0NTUsNyArMTQ1OCw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAoKHNob3dfZXJyb3IpICYmIChuZXRpZl9tc2dfaW50cihjYXJkKSkpCisJaWYgKChzaG93X2Vycm9yKSAmJiAobmV0aWZfbXNnX2ludHIoY2FyZCkpICYmIG5ldF9yYXRlbGltaXQoKSkKIAkJcHJfZXJyKCJHb3QgZXJyb3IgaW50ZXJydXB0IG9uICVzLCBHSElJTlQwU1RTID0gMHglMDh4LCAiCiAJCSAgICAgICAiR0hJSU5UMVNUUyA9IDB4JTA4eCwgR0hJSU5UMlNUUyA9IDB4JTA4eFxuIiwKIAkJICAgICAgIGNhcmQtPm5ldGRldi0+bmFtZSwKQEAgLTE2NTEsMjcgKzE2NTQsMTggQEAKIHNwaWRlcl9uZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpkZXNjcjsKLQlpbnQgaSwgcmVzdWx0OworCWludCByZXN1bHQ7CiAKLQlyZXN1bHQgPSAtRU5PTUVNOwotCWlmIChzcGlkZXJfbmV0X2luaXRfY2hhaW4oY2FyZCwgJmNhcmQtPnR4X2NoYWluLCBjYXJkLT5kZXNjciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPm51bV90eF9kZXNjKSkKKwlyZXN1bHQgPSBzcGlkZXJfbmV0X2luaXRfY2hhaW4oY2FyZCwgJmNhcmQtPnR4X2NoYWluKTsKKwlpZiAocmVzdWx0KQogCQlnb3RvIGFsbG9jX3R4X2ZhaWxlZDsKLQogCWNhcmQtPmxvd193YXRlcm1hcmsgPSBOVUxMOwogCi0JLyogcnhfY2hhaW4gaXMgYWZ0ZXIgdHhfY2hhaW4sIHNvIG9mZnNldCBpcyBkZXNjciArIHR4X2NvdW50ICovCi0JaWYgKHNwaWRlcl9uZXRfaW5pdF9jaGFpbihjYXJkLCAmY2FyZC0+cnhfY2hhaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5kZXNjciArIGNhcmQtPm51bV90eF9kZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bnVtX3J4X2Rlc2MpKQorCXJlc3VsdCA9IHNwaWRlcl9uZXRfaW5pdF9jaGFpbihjYXJkLCAmY2FyZC0+cnhfY2hhaW4pOworCWlmIChyZXN1bHQpCiAJCWdvdG8gYWxsb2NfcnhfZmFpbGVkOwogCi0JZGVzY3IgPSBjYXJkLT5yeF9jaGFpbi5oZWFkOwotCWZvciAoaT0wOyBpIDwgY2FyZC0+bnVtX3J4X2Rlc2M7IGkrKywgZGVzY3IrKykKLQkJZGVzY3ItPm5leHRfZGVzY3JfYWRkciA9IGRlc2NyLT5uZXh0LT5idXNfYWRkcjsKLQotCS8qIGFsbG9jYXRlIHJ4IHNrYnMgKi8KKwkvKiBBbGxvY2F0ZSByeCBza2JzICovCiAJaWYgKHNwaWRlcl9uZXRfYWxsb2Nfcnhfc2ticyhjYXJkKSkKIAkJZ290byBhbGxvY19za2JzX2ZhaWxlZDsKIApAQCAtMTkwMiw3ICsxODk2LDYgQEAKIHsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCXRhc2tsZXRfa2lsbCgmY2FyZC0+cnhyYW1fZnVsbF90bCk7CiAJbmV0aWZfcG9sbF9kaXNhYmxlKG5ldGRldik7CiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CkBAIC0xOTI0LDYgKzE5MTcsNyBAQAogCiAJLyogcmVsZWFzZSBjaGFpbnMgKi8KIAlzcGlkZXJfbmV0X3JlbGVhc2VfdHhfY2hhaW4oY2FyZCwgMSk7CisJc3BpZGVyX25ldF9mcmVlX3J4X2NoYWluX2NvbnRlbnRzKGNhcmQpOwogCiAJc3BpZGVyX25ldF9mcmVlX3J4X2NoYWluX2NvbnRlbnRzKGNhcmQpOwogCkBAIC0yMDQ2LDkgKzIwNDAsNiBAQAogCiAJcGNpX3NldF9kcnZkYXRhKGNhcmQtPnBkZXYsIG5ldGRldik7CiAKLQljYXJkLT5yeHJhbV9mdWxsX3RsLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2FyZDsKLQljYXJkLT5yeHJhbV9mdWxsX3RsLmZ1bmMgPQotCQkodm9pZCAoKikodW5zaWduZWQgbG9uZykpIHNwaWRlcl9uZXRfaGFuZGxlX3J4cmFtX2Z1bGw7CiAJaW5pdF90aW1lcigmY2FyZC0+dHhfdGltZXIpOwogCWNhcmQtPnR4X3RpbWVyLmZ1bmN0aW9uID0KIAkJKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKSBzcGlkZXJfbmV0X2NsZWFudXBfdHhfcmluZzsKQEAgLTIwNTcsOCArMjA0OCw4IEBACiAKIAljYXJkLT5vcHRpb25zLnJ4X2NzdW0gPSBTUElERVJfTkVUX1JYX0NTVU1fREVGQVVMVDsKIAotCWNhcmQtPm51bV90eF9kZXNjID0gdHhfZGVzY3JpcHRvcnM7Ci0JY2FyZC0+bnVtX3J4X2Rlc2MgPSByeF9kZXNjcmlwdG9yczsKKwljYXJkLT50eF9jaGFpbi5udW1fZGVzYyA9IHR4X2Rlc2NyaXB0b3JzOworCWNhcmQtPnJ4X2NoYWluLm51bV9kZXNjID0gcnhfZGVzY3JpcHRvcnM7CiAKIAlzcGlkZXJfbmV0X3NldHVwX25ldGRldl9vcHMobmV0ZGV2KTsKIApAQCAtMjEwNywxMiArMjA5OCw4IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3Qgc3BpZGVyX25ldF9jYXJkICpjYXJkOwotCXNpemVfdCBhbGxvY19zaXplOwogCi0JYWxsb2Nfc2l6ZSA9IHNpemVvZiAoKmNhcmQpICsKLQkJc2l6ZW9mIChzdHJ1Y3Qgc3BpZGVyX25ldF9kZXNjcikgKiByeF9kZXNjcmlwdG9ycyArCi0JCXNpemVvZiAoc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IpICogdHhfZGVzY3JpcHRvcnM7Ci0JbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoYWxsb2Nfc2l6ZSk7CisJbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzcGlkZXJfbmV0X2NhcmQpKTsKIAlpZiAoIW5ldGRldikKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaCBiL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuaAppbmRleCAzZTE5NmRmLi4yZmVjNWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5oCkBAIC0yNCw3ICsyNCw3IEBACiAjaWZuZGVmIF9TUElERVJfTkVUX0gKICNkZWZpbmUgX1NQSURFUl9ORVRfSAogCi0jZGVmaW5lIFZFUlNJT04gIjEuNiBBIgorI2RlZmluZSBWRVJTSU9OICIxLjYgQiIKIAogI2luY2x1ZGUgInN1bmdlbV9waHkuaCIKIApAQCAtMzc4LDYgKzM3OCw5IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpoZWFkOwogCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICp0YWlsOworCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyICpyaW5nOworCWludCBudW1fZGVzYzsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOwogfTsKIAogLyogZGVzY3JpcHRvciBkYXRhX3N0YXR1cyBiaXRzICovCkBAIC0zOTcsOCArNDAwLDYgQEAKICAqIDcwMWI4MDAwIHdvdWxkIGJlIGNvcnJlY3QsIGJ1dCBldmVyeSBwYWNrZXRzIGdldHMgdGhhdCBmbGFnICovCiAjZGVmaW5lIFNQSURFUl9ORVRfREVTVFJPWV9SWF9GTEFHUwkweDcwMGI4MDAwCiAKLSNkZWZpbmUgU1BJREVSX05FVF9ERVNDUl9TSVpFCQkzMgotCiAvKiB0aGlzIHdpbGwgYmUgYmlnZ2VyIHNvbWUgdGltZSAqLwogc3RydWN0IHNwaWRlcl9uZXRfb3B0aW9ucyB7CiAJaW50IHJ4X2NzdW07IC8qIGZvciByeDogaWYgMCBpcF9zdW1tZWQ9Tk9ORSwKQEAgLTQ0MSwyNSArNDQyLDE2IEBACiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3JfY2hhaW4gcnhfY2hhaW47CiAJc3RydWN0IHNwaWRlcl9uZXRfZGVzY3IgKmxvd193YXRlcm1hcms7CiAKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBuZXRkZXZfc3RhdHM7Ci0KLQlzdHJ1Y3Qgc3BpZGVyX25ldF9vcHRpb25zIG9wdGlvbnM7Ci0KLQlzcGlubG9ja190IGludG1hc2tfbG9jazsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnhyYW1fZnVsbF90bDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0eF90aW1lcjsKLQogCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF90aW1lb3V0X3Rhc2s7CiAJYXRvbWljX3QgdHhfdGltZW91dF90YXNrX2NvdW50ZXI7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CiAKIAkvKiBmb3IgZXRodG9vbCAqLwogCWludCBtc2dfZW5hYmxlOwotCWludCBudW1fcnhfZGVzYzsKLQlpbnQgbnVtX3R4X2Rlc2M7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0ZGV2X3N0YXRzOwogCXN0cnVjdCBzcGlkZXJfbmV0X2V4dHJhX3N0YXRzIHNwaWRlcl9zdGF0czsKLQotCXN0cnVjdCBzcGlkZXJfbmV0X2Rlc2NyIGRlc2NyWzBdOworCXN0cnVjdCBzcGlkZXJfbmV0X29wdGlvbnMgb3B0aW9uczsKIH07CiAKICNkZWZpbmUgcHJfZXJyKGZtdCxhcmcuLi4pIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXRfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldF9ldGh0b29sLmMKaW5kZXggOTFiOTk1MS4uNmJjZjAzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldF9ldGh0b29sLmMKQEAgLTE1OCw5ICsxNTgsOSBAQAogCXN0cnVjdCBzcGlkZXJfbmV0X2NhcmQgKmNhcmQgPSBuZXRkZXYtPnByaXY7CiAKIAllcmluZy0+dHhfbWF4X3BlbmRpbmcgPSBTUElERVJfTkVUX1RYX0RFU0NSSVBUT1JTX01BWDsKLQllcmluZy0+dHhfcGVuZGluZyA9IGNhcmQtPm51bV90eF9kZXNjOworCWVyaW5nLT50eF9wZW5kaW5nID0gY2FyZC0+dHhfY2hhaW4ubnVtX2Rlc2M7CiAJZXJpbmctPnJ4X21heF9wZW5kaW5nID0gU1BJREVSX05FVF9SWF9ERVNDUklQVE9SU19NQVg7Ci0JZXJpbmctPnJ4X3BlbmRpbmcgPSBjYXJkLT5udW1fcnhfZGVzYzsKKwllcmluZy0+cnhfcGVuZGluZyA9IGNhcmQtPnJ4X2NoYWluLm51bV9kZXNjOwogfQogCiBzdGF0aWMgaW50IHNwaWRlcl9uZXRfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZzMuYyBiL2RyaXZlcnMvbmV0L3RnMy5jCmluZGV4IGY0YmY2MmMuLjEzNWMwOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RnMy5jCisrKyBiL2RyaXZlcnMvbmV0L3RnMy5jCkBAIC01OCwxMSArNTgsNyBAQAogI2RlZmluZSBURzNfVkxBTl9UQUdfVVNFRCAwCiAjZW5kaWYKIAotI2lmZGVmIE5FVElGX0ZfVFNPCiAjZGVmaW5lIFRHM19UU09fU1VQUE9SVAkxCi0jZWxzZQotI2RlZmluZSBURzNfVFNPX1NVUFBPUlQJMAotI2VuZGlmCiAKICNpbmNsdWRlICJ0ZzMuaCIKIApAQCAtMzg3Myw3ICszODY5LDYgQEAKIAogCWVudHJ5ID0gdHAtPnR4X3Byb2Q7CiAJYmFzZV9mbGFncyA9IDA7Ci0jaWYgVEczX1RTT19TVVBQT1JUICE9IDAKIAltc3MgPSAwOwogCWlmIChza2ItPmxlbiA+ICh0cC0+ZGV2LT5tdHUgKyBFVEhfSExFTikgJiYKIAkgICAgKG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpICE9IDApIHsKQEAgLTM5MDYsMTEgKzM5MDEsNiBAQAogCX0KIAllbHNlIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQogCQliYXNlX2ZsYWdzIHw9IFRYRF9GTEFHX1RDUFVEUF9DU1VNOwotI2Vsc2UKLQltc3MgPSAwOwotCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQotCQliYXNlX2ZsYWdzIHw9IFRYRF9GTEFHX1RDUFVEUF9DU1VNOwotI2VuZGlmCiAjaWYgVEczX1ZMQU5fVEFHX1VTRUQKIAlpZiAodHAtPnZsZ3JwICE9IE5VTEwgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKQogCQliYXNlX2ZsYWdzIHw9IChUWERfRkxBR19WTEFOIHwKQEAgLTM5NzAsNyArMzk2MCw2IEBACiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIAotI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCiBzdGF0aWMgaW50IHRnM19zdGFydF94bWl0X2RtYV9idWcoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CiAKIC8qIFVzZSBHU08gdG8gd29ya2Fyb3VuZCBhIHJhcmUgVFNPIGJ1ZyB0aGF0IG1heSBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUKQEAgLTQwMDIsNyArMzk5MSw2IEBACiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQotI2VuZGlmCiAKIC8qIGhhcmRfc3RhcnRfeG1pdCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgdGhlIDRHIGJ1ZyBhbmQvb3IgNDAtYml0IGJ1ZyBhbmQKICAqIHN1cHBvcnQgVEczX0ZMRzJfSFdfVFNPXzEgb3IgZmlybXdhcmUgVFNPIG9ubHkuCkBAIC00MDM2LDcgKzQwMjQsNiBAQAogCWJhc2VfZmxhZ3MgPSAwOwogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQogCQliYXNlX2ZsYWdzIHw9IFRYRF9GTEFHX1RDUFVEUF9DU1VNOwotI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCiAJbXNzID0gMDsKIAlpZiAoc2tiLT5sZW4gPiAodHAtPmRldi0+bXR1ICsgRVRIX0hMRU4pICYmCiAJICAgIChtc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSAhPSAwKSB7CkBAIC00MDkxLDkgKzQwNzgsNiBAQAogCQkJfQogCQl9CiAJfQotI2Vsc2UKLQltc3MgPSAwOwotI2VuZGlmCiAjaWYgVEczX1ZMQU5fVEFHX1VTRUQKIAlpZiAodHAtPnZsZ3JwICE9IE5VTEwgJiYgdmxhbl90eF90YWdfcHJlc2VudChza2IpKQogCQliYXNlX2ZsYWdzIHw9IChUWERfRkxBR19WTEFOIHwKQEAgLTUzMjksNyArNTMxMyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAogCiAjZGVmaW5lIFRHM19UU09fRldfUkVMRUFTRV9NQUpPUgkweDEKICNkZWZpbmUgVEczX1RTT19GV19SRUxBU0VfTUlOT1IJCTB4NgpAQCAtNTkwNiw3ICs1ODg5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmIC8qIFRHM19UU09fU1VQUE9SVCAhPSAwICovCiAKIC8qIHRwLT5sb2NrIGlzIGhlbGQuICovCiBzdGF0aWMgdm9pZCBfX3RnM19zZXRfbWFjX2FkZHIoc3RydWN0IHRnMyAqdHApCkBAIC02MTIwLDcgKzYxMDIsNiBAQAogCQl0dzMyKEJVRk1HUl9ETUFfREVTQ19QT09MX0FERFIsIE5JQ19TUkFNX0RNQV9ERVNDX1BPT0xfQkFTRSk7CiAJCXR3MzIoQlVGTUdSX0RNQV9ERVNDX1BPT0xfU0laRSwgTklDX1NSQU1fRE1BX0RFU0NfUE9PTF9TSVpFKTsKIAl9Ci0jaWYgVEczX1RTT19TVVBQT1JUICE9IDAKIAllbHNlIGlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSB7CiAJCWludCBmd19sZW47CiAKQEAgLTYxMzUsNyArNjExNiw2IEBACiAJCXR3MzIoQlVGTUdSX01CX1BPT0xfU0laRSwKIAkJICAgICBOSUNfU1JBTV9NQlVGX1BPT0xfU0laRTU3MDUgLSBmd19sZW4gLSAweGEwMCk7CiAJfQotI2VuZGlmCiAKIAlpZiAodHAtPmRldi0+bXR1IDw9IEVUSF9EQVRBX0xFTikgewogCQl0dzMyKEJVRk1HUl9NQl9SRE1BX0xPV19XQVRFUiwKQEAgLTYzMzcsMTAgKzYzMTcsOCBAQAogCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BDSV9FWFBSRVNTKQogCQlyZG1hY19tb2RlIHw9IFJETUFDX01PREVfRklGT19MT05HX0JVUlNUOwogCi0jaWYgVEczX1RTT19TVVBQT1JUICE9IDAKIAlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9IV19UU08pCiAJCXJkbWFjX21vZGUgfD0gKDEgPDwgMjcpOwotI2VuZGlmCiAKIAkvKiBSZWNlaXZlL3NlbmQgc3RhdGlzdGljcy4gKi8KIAlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzUwX1BMVVMpIHsKQEAgLTY1MTEsMTAgKzY0ODksOCBAQAogCXR3MzIoUkNWQkRJX01PREUsIFJDVkJESV9NT0RFX0VOQUJMRSB8IFJDVkJESV9NT0RFX1JDQl9BVFROX0VOQUIpOwogCXR3MzIoUkNWREJESV9NT0RFLCBSQ1ZEQkRJX01PREVfRU5BQkxFIHwgUkNWREJESV9NT0RFX0lOVl9SSU5HX1NaKTsKIAl0dzMyKFNORERBVEFJX01PREUsIFNORERBVEFJX01PREVfRU5BQkxFKTsKLSNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAogCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX0hXX1RTTykKIAkJdHczMihTTkREQVRBSV9NT0RFLCBTTkREQVRBSV9NT0RFX0VOQUJMRSB8IDB4OCk7Ci0jZW5kaWYKIAl0dzMyKFNOREJESV9NT0RFLCBTTkRCRElfTU9ERV9FTkFCTEUgfCBTTkRCRElfTU9ERV9BVFROX0VOQUJMRSk7CiAJdHczMihTTkRCRFNfTU9ERSwgU05EQkRTX01PREVfRU5BQkxFIHwgU05EQkRTX01PREVfQVRUTl9FTkFCTEUpOwogCkBAIC02NTI0LDEzICs2NTAwLDExIEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAotI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCiAJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfVFNPX0NBUEFCTEUpIHsKIAkJZXJyID0gdGczX2xvYWRfdHNvX2Zpcm13YXJlKHRwKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfQotI2VuZGlmCiAKIAl0cC0+dHhfbW9kZSA9IFRYX01PREVfRU5BQkxFOwogCXR3MzJfZihNQUNfVFhfTU9ERSwgdHAtPnR4X21vZGUpOwpAQCAtODA2Miw3ICs4MDM2LDYgQEAKIAl0cC0+bXNnX2VuYWJsZSA9IHZhbHVlOwogfQogCi0jaWYgVEczX1RTT19TVVBQT1JUICE9IDAKIHN0YXRpYyBpbnQgdGczX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTgwODEsNyArODA1NCw2IEBACiAJfQogCXJldHVybiBldGh0b29sX29wX3NldF90c28oZGV2LCB2YWx1ZSk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGludCB0ZzNfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtOTIxMiwxMCArOTE4NCw4IEBACiAJLnNldF90eF9jc3VtCQk9IHRnM19zZXRfdHhfY3N1bSwKIAkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dldF9zZywKIAkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKLSNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAogCS5nZXRfdHNvCQk9IGV0aHRvb2xfb3BfZ2V0X3RzbywKIAkuc2V0X3RzbwkJPSB0ZzNfc2V0X3RzbywKLSNlbmRpZgogCS5zZWxmX3Rlc3RfY291bnQJPSB0ZzNfZ2V0X3Rlc3RfY291bnQsCiAJLnNlbGZfdGVzdAkJPSB0ZzNfc2VsZl90ZXN0LAogCS5nZXRfc3RyaW5ncwkJPSB0ZzNfZ2V0X3N0cmluZ3MsCkBAIC0xMTg1Niw3ICsxMTgyNiw2IEBACiAKIAl0ZzNfaW5pdF9idWZtZ3JfY29uZmlnKHRwKTsKIAotI2lmIFRHM19UU09fU1VQUE9SVCAhPSAwCiAJaWYgKHRwLT50ZzNfZmxhZ3MyICYgVEczX0ZMRzJfSFdfVFNPKSB7CiAJCXRwLT50ZzNfZmxhZ3MyIHw9IFRHM19GTEcyX1RTT19DQVBBQkxFOwogCX0KQEAgLTExODgxLDcgKzExODUwLDYgQEAKIAkJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OwogCX0KIAotI2VuZGlmCiAKIAlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDVfQTEgJiYKIAkgICAgISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1RTT19DQVBBQkxFKSAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdWNjX2dldGguYyBiL2RyaXZlcnMvbmV0L3VjY19nZXRoLmMKaW5kZXggN2U0YjIzYy4uYWJiODYxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdWNjX2dldGguYworKysgYi9kcml2ZXJzL25ldC91Y2NfZ2V0aC5jCkBAIC0yODY1LDggKzI4NjUsOCBAQAogCQkJaWYgKFVDQ19HRVRIX1RYX0JEX1JJTkdfQUxJR05NRU5UID4gNCkKIAkJCQlhbGlnbiA9IFVDQ19HRVRIX1RYX0JEX1JJTkdfQUxJR05NRU5UOwogCQkJdWdldGgtPnR4X2JkX3Jpbmdfb2Zmc2V0W2pdID0KLQkJCQkodTMyKSAoa21hbGxvYygodTMyKSAobGVuZ3RoICsgYWxpZ24pLAotCQkJCUdGUF9LRVJORUwpKTsKKwkJCQlrbWFsbG9jKCh1MzIpIChsZW5ndGggKyBhbGlnbiksIEdGUF9LRVJORUwpOworCiAJCQlpZiAodWdldGgtPnR4X2JkX3Jpbmdfb2Zmc2V0W2pdICE9IDApCiAJCQkJdWdldGgtPnBfdHhfYmRfcmluZ1tqXSA9CiAJCQkJCSh2b2lkKikoKHVnZXRoLT50eF9iZF9yaW5nX29mZnNldFtqXSArCkBAIC0yOTAxLDcgKzI5MDEsNyBAQAogCQkJaWYgKFVDQ19HRVRIX1JYX0JEX1JJTkdfQUxJR05NRU5UID4gNCkKIAkJCQlhbGlnbiA9IFVDQ19HRVRIX1JYX0JEX1JJTkdfQUxJR05NRU5UOwogCQkJdWdldGgtPnJ4X2JkX3Jpbmdfb2Zmc2V0W2pdID0KLQkJCSAgICAodTMyKSAoa21hbGxvYygodTMyKSAobGVuZ3RoICsgYWxpZ24pLCBHRlBfS0VSTkVMKSk7CisJCQkJa21hbGxvYygodTMyKSAobGVuZ3RoICsgYWxpZ24pLCBHRlBfS0VSTkVMKTsKIAkJCWlmICh1Z2V0aC0+cnhfYmRfcmluZ19vZmZzZXRbal0gIT0gMCkKIAkJCQl1Z2V0aC0+cF9yeF9iZF9yaW5nW2pdID0KIAkJCQkJKHZvaWQqKSgodWdldGgtPnJ4X2JkX3Jpbmdfb2Zmc2V0W2pdICsKQEAgLTI5MjcsMTAgKzI5MjcsOSBAQAogCS8qIEluaXQgVHggYmRzICovCiAJZm9yIChqID0gMDsgaiA8IHVnX2luZm8tPm51bVF1ZXVlc1R4OyBqKyspIHsKIAkJLyogU2V0dXAgdGhlIHNrYnVmZiByaW5ncyAqLwotCQl1Z2V0aC0+dHhfc2tidWZmW2pdID0KLQkJICAgIChzdHJ1Y3Qgc2tfYnVmZiAqKilrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSAqCi0JCQkJCSAgICAgICB1Z2V0aC0+dWdfaW5mby0+YmRSaW5nTGVuVHhbal0sCi0JCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJdWdldGgtPnR4X3NrYnVmZltqXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBza19idWZmICopICoKKwkJCQkJICAgICAgdWdldGgtPnVnX2luZm8tPmJkUmluZ0xlblR4W2pdLAorCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKIAogCQlpZiAodWdldGgtPnR4X3NrYnVmZltqXSA9PSBOVUxMKSB7CiAJCQl1Z2V0aF9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgdHhfc2tidWZmIiwKQEAgLTI5NTksMTAgKzI5NTgsOSBAQAogCS8qIEluaXQgUnggYmRzICovCiAJZm9yIChqID0gMDsgaiA8IHVnX2luZm8tPm51bVF1ZXVlc1J4OyBqKyspIHsKIAkJLyogU2V0dXAgdGhlIHNrYnVmZiByaW5ncyAqLwotCQl1Z2V0aC0+cnhfc2tidWZmW2pdID0KLQkJICAgIChzdHJ1Y3Qgc2tfYnVmZiAqKilrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSAqCi0JCQkJCSAgICAgICB1Z2V0aC0+dWdfaW5mby0+YmRSaW5nTGVuUnhbal0sCi0JCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJdWdldGgtPnJ4X3NrYnVmZltqXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBza19idWZmICopICoKKwkJCQkJICAgICAgdWdldGgtPnVnX2luZm8tPmJkUmluZ0xlblJ4W2pdLAorCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKIAogCQlpZiAodWdldGgtPnJ4X3NrYnVmZltqXSA9PSBOVUxMKSB7CiAJCQl1Z2V0aF9lcnIoIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcnhfc2tidWZmIiwKQEAgLTM0NTMsOCArMzQ1MSw3IEBACiAJICogYWxsb2NhdGVkIHJlc291cmNlcyBjYW4gYmUgcmVsZWFzZWQgd2hlbiB0aGUgY2hhbm5lbCBpcyBmcmVlZC4KIAkgKi8KIAlpZiAoISh1Z2V0aC0+cF9pbml0X2VuZXRfcGFyYW1fc2hhZG93ID0KLQkgICAgIChzdHJ1Y3QgdWNjX2dldGhfaW5pdF9wcmFtICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1Y2NfZ2V0aF9pbml0X3ByYW0pLAotCQkJCQkgICAgICBHRlBfS0VSTkVMKSkpIHsKKwkgICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWNjX2dldGhfaW5pdF9wcmFtKSwgR0ZQX0tFUk5FTCkpKSB7CiAJCXVnZXRoX2VycgogCQkgICAgKCIlczogQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIgogCQkJIiBwX1VjY0luaXRFbmV0UGFyYW1TaGFkb3dzLiIsIF9fRlVOQ1RJT05fXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCmluZGV4IDIxZjc2ZjUuLjYxNzA4Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCkBAIC0yMzUsNiArMjM1LDE5IEBACiBjb21tZW50ICJSZWZlciB0byB0aGUgZmlsZSBSRUFETUUubWxwcHAsIHByb3ZpZGVkIGJ5IFBDMzAwIHBhY2thZ2UuIgogCWRlcGVuZHMgb24gV0FOICYmIEhETEMgJiYgUEMzMDAgJiYgKFBQUD1uIHx8ICFQUFBfTVVMVElMSU5LIHx8IFBQUF9TWU5DX1RUWT1uIHx8ICFIRExDX1BQUCkKIAorY29uZmlnIFBDMzAwVE9PCisJdHJpc3RhdGUgIkN5Y2xhZGVzIFBDMzAwIFJTVi9YMjEgYWx0ZXJuYXRpdmUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEhETEMgJiYgUENJCisJaGVscAorCSAgQWx0ZXJuYXRpdmUgZHJpdmVyIGZvciBQQzMwMCBSU1YvWDIxIFBDSSBjYXJkcyBtYWRlIGJ5CisJICBDeWNsYWRlcywgSW5jLiBJZiB5b3UgaGF2ZSBzdWNoIGEgY2FyZCwgc2F5IFkgaGVyZSBhbmQgc2VlCisJICA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9uZXQvaGRsYy8+LgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHBjMzAwdG9vLgorCisJICBJZiB1bnN1cmUsIHNheSBOIGhlcmUuCisKIGNvbmZpZyBOMgogCXRyaXN0YXRlICJTREwgUklTQ29tL04yIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBIRExDICYmIElTQQpAQCAtMzQ0LDE3ICszNTcsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZGxjaS4KIAotY29uZmlnIERMQ0lfQ09VTlQKLQlpbnQgIk1heCBvcGVuIERMQ0kiCi0JZGVwZW5kcyBvbiBETENJCi0JZGVmYXVsdCAiMjQiCi0JaGVscAotCSAgTWF4aW1hbCBudW1iZXIgb2YgbG9naWNhbCBwb2ludC10by1wb2ludCBmcmFtZSByZWxheSBjb25uZWN0aW9ucwotCSAgKHRoZSBpZGVudGlmaWVycyBvZiB3aGljaCBhcmUgY2FsbGVkIERDTElzKSB0aGF0IHRoZSBkcml2ZXIgY2FuCi0JICBoYW5kbGUuCi0KLQkgIFRoZSBkZWZhdWx0IGlzIHByb2JhYmx5IGZpbmUuCi0KIGNvbmZpZyBETENJX01BWAogCWludCAiTWF4IERMQ0kgcGVyIGRldmljZSIKIAlkZXBlbmRzIG9uIERMQ0kKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dhbi9NYWtlZmlsZQppbmRleCA4M2VjMmM4Li5kNjFmZWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2FuL01ha2VmaWxlCkBAIC00MSw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfQzEwMSkJCSs9IGMxMDEubwogb2JqLSQoQ09ORklHX1dBTlhMKQkJKz0gd2FueGwubwogb2JqLSQoQ09ORklHX1BDSTIwMFNZTikJCSs9IHBjaTIwMHN5bi5vCitvYmotJChDT05GSUdfUEMzMDBUT08pCQkrPSBwYzMwMHRvby5vCiAKIGNsZWFuLWZpbGVzIDo9IHdhbnhsZncuaW5jCiAkKG9iaikvd2FueGwubzoJJChvYmopL3dhbnhsZncuaW5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vaGRsYy5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGMuYwppbmRleCBkYjM1NGUwLi45MDQwZDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGRsYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9oZGxjLmMKQEAgLTIyMiw3ICsyMjIsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi12b2lkIGhkbGNfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGhkbGNfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CiAKQEAgLTMyNSw3ICszMjUsNiBAQAogRVhQT1JUX1NZTUJPTChoZGxjX29wZW4pOwogRVhQT1JUX1NZTUJPTChoZGxjX2Nsb3NlKTsKIEVYUE9SVF9TWU1CT0woaGRsY19pb2N0bCk7Ci1FWFBPUlRfU1lNQk9MKGhkbGNfc2V0dXApOwogRVhQT1JUX1NZTUJPTChhbGxvY19oZGxjZGV2KTsKIEVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9oZGxjX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2hkbGNfcHJvdG9jb2wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjMzAwdG9vLmMgYi9kcml2ZXJzL25ldC93YW4vcGMzMDB0b28uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWIyZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2FuL3BjMzAwdG9vLmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiBDeWNsYWRlcyBQQzMwMCBzeW5jaHJvbm91cyBzZXJpYWwgY2FyZCBkcml2ZXIgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcgS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIEZvciBpbmZvcm1hdGlvbiBzZWUgPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvbmV0L2hkbGMvPi4KKyAqCisgKiBTb3VyY2VzIG9mIGluZm9ybWF0aW9uOgorICogICAgSGl0YWNoaSBIRDY0NTcyIFNDQS1JSSBVc2VyJ3MgTWFudWFsCisgKiAgICBDeWNsYWRlcyBQQzMwMCBMaW51eCBkcml2ZXIKKyAqCisgKiBUaGlzIGRyaXZlciBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBQQzMwMC9SU1YgKFYuMjQvVi4zNSkgYW5kCisgKiBQQzMwMC9YMjEgY2FyZHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGRsYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJoZDY0NTcyLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uID0gIkN5Y2xhZGVzIFBDMzAwIGRyaXZlciB2ZXJzaW9uOiAxLjE3IjsKK3N0YXRpYyBjb25zdCBjaGFyKiBkZXZuYW1lID0gIlBDMzAwIjsKKworI3VuZGVmIERFQlVHX1BLVAorI2RlZmluZSBERUJVR19SSU5HUworCisjZGVmaW5lIFBDMzAwX1BMWF9TSVpFCQkweDgwICAgIC8qIFBMWCBjb250cm9sIHdpbmRvdyBzaXplICgxMjggQikgKi8KKyNkZWZpbmUgUEMzMDBfU0NBX1NJWkUJCTB4NDAwICAgLyogU0NBIHdpbmRvdyBzaXplICgxIEtCKSAqLworI2RlZmluZSBBTExfUEFHRVNfQUxXQVlTX01BUFBFRAorI2RlZmluZSBORUVEX0RFVEVDVF9SQU0KKyNkZWZpbmUgTkVFRF9TQ0FfTVNDSV9JTlRSCisjZGVmaW5lIE1BWF9UWF9CVUZGRVJTCQkxMAorCitzdGF0aWMgaW50IHBjaV9jbG9ja19mcmVxID0gMzMwMDAwMDA7CitzdGF0aWMgaW50IHVzZV9jcnlzdGFsX2Nsb2NrID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgQ0xPQ0tfQkFTRTsKKworLyogTWFza3MgdG8gYWNjZXNzIHRoZSBpbml0X2N0cmwgUExYIHJlZ2lzdGVyICovCisjZGVmaW5lIFBDMzAwX0NMS1NFTF9NQVNLCSAoMHgwMDAwMDAwNFVMKQorI2RlZmluZSBQQzMwMF9DSE1FRElBX01BU0socG9ydCkgKDB4MDAwMDAwMjBVTCA8PCAoKHBvcnQpICogMykpCisjZGVmaW5lIFBDMzAwX0NUWVBFX01BU0sJICgweDAwMDAwODAwVUwpCisKKworZW51bSB7IFBDMzAwX1JTViA9IDEsIFBDMzAwX1gyMSwgUEMzMDBfVEUgfTsgLyogY2FyZCB0eXBlcyAqLworCisvKgorICogICAgICBQTFggUENJOTA1MC0xIGxvY2FsIGNvbmZpZ3VyYXRpb24gYW5kIHNoYXJlZCBydW50aW1lIHJlZ2lzdGVycy4KKyAqICAgICAgVGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIDkwNTAgcmVnaXN0ZXJzIChtZW1vcnkgbWFwcGVkKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBsb2NfYWRkcl9yYW5nZVs0XTsJLyogMDAtMENoIDogTG9jYWwgQWRkcmVzcyBSYW5nZXMgKi8KKwl1MzIgbG9jX3JvbV9yYW5nZTsJLyogMTBoIDogTG9jYWwgUk9NIFJhbmdlICovCisJdTMyIGxvY19hZGRyX2Jhc2VbNF07CS8qIDE0LTIwaCA6IExvY2FsIEFkZHJlc3MgQmFzZSBBZGRycyAqLworCXUzMiBsb2Nfcm9tX2Jhc2U7CS8qIDI0aCA6IExvY2FsIFJPTSBCYXNlICovCisJdTMyIGxvY19idXNfZGVzY3JbNF07CS8qIDI4LTM0aCA6IExvY2FsIEJ1cyBEZXNjcmlwdG9ycyAqLworCXUzMiByb21fYnVzX2Rlc2NyOwkvKiAzOGggOiBST00gQnVzIERlc2NyaXB0b3IgKi8KKwl1MzIgY3NfYmFzZVs0XTsJCS8qIDNDLTQ4aCA6IENoaXAgU2VsZWN0IEJhc2UgQWRkcnMgKi8KKwl1MzIgaW50cl9jdHJsX3N0YXQ7CS8qIDRDaCA6IEludGVycnVwdCBDb250cm9sL1N0YXR1cyAqLworCXUzMiBpbml0X2N0cmw7CQkvKiA1MGggOiBFRVBST00gY3RybCwgSW5pdCBDdHJsLCBldGMgKi8KK31wbHg5MDUwOworCisKKwordHlwZWRlZiBzdHJ1Y3QgcG9ydF9zIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBjYXJkX3MgKmNhcmQ7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBUWCBsb2NrICovCisJc3luY19zZXJpYWxfc2V0dGluZ3Mgc2V0dGluZ3M7CisJaW50IHJ4cGFydDsJCS8qIHBhcnRpYWwgZnJhbWUgcmVjZWl2ZWQsIG5leHQgZnJhbWUgaW52YWxpZCovCisJdW5zaWduZWQgc2hvcnQgZW5jb2Rpbmc7CisJdW5zaWduZWQgc2hvcnQgcGFyaXR5OworCXVuc2lnbmVkIGludCBpZmFjZTsKKwl1MTYgcnhpbjsJCS8qIHJ4IHJpbmcgYnVmZmVyICdpbicgcG9pbnRlciAqLworCXUxNiB0eGluOwkJLyogdHggcmluZyBidWZmZXIgJ2luJyBhbmQgJ2xhc3QnIHBvaW50ZXJzICovCisJdTE2IHR4bGFzdDsKKwl1OCByeHMsIHR4cywgdG1jOwkvKiBTQ0EgcmVnaXN0ZXJzICovCisJdTggcGh5X25vZGU7CQkvKiBwaHlzaWNhbCBwb3J0ICMgLSAwIG9yIDEgKi8KK31wb3J0X3Q7CisKKworCit0eXBlZGVmIHN0cnVjdCBjYXJkX3MgeworCWludCB0eXBlOwkJLyogUlNWLCBYMjEsIGV0Yy4gKi8KKwlpbnQgbl9wb3J0czsJCS8qIDEgb3IgMiBwb3J0cyAqLworCXU4KiBfX2lvbWVtIHJhbWJhc2U7CS8qIGJ1ZmZlciBtZW1vcnkgYmFzZSAodmlydHVhbCkgKi8KKwl1OCogX19pb21lbSBzY2FiYXNlOwkvKiBTQ0EgbWVtb3J5IGJhc2UgKHZpcnR1YWwpICovCisJcGx4OTA1MCBfX2lvbWVtICpwbHhiYXNlOyAvKiBQTFggcmVnaXN0ZXJzIG1lbW9yeSBiYXNlICh2aXJ0dWFsKSAqLworCXUzMiBpbml0X2N0cmxfdmFsdWU7CS8qIFNhdmVkIHZhbHVlIC0gOTA1MCBidWcgd29ya2Fyb3VuZCAqLworCXUxNiByeF9yaW5nX2J1ZmZlcnM7CS8qIG51bWJlciBvZiBidWZmZXJzIGluIGEgcmluZyAqLworCXUxNiB0eF9yaW5nX2J1ZmZlcnM7CisJdTE2IGJ1ZmZfb2Zmc2V0OwkvKiBvZmZzZXQgb2YgZmlyc3QgYnVmZmVyIG9mIGZpcnN0IGNoYW5uZWwgKi8KKwl1OCBpcnE7CQkJLyogaW50ZXJydXB0IHJlcXVlc3QgbGV2ZWwgKi8KKworCXBvcnRfdCBwb3J0c1syXTsKK31jYXJkX3Q7CisKKworI2RlZmluZSBzY2FfaW4ocmVnLCBjYXJkKQkgICAgIHJlYWRiKGNhcmQtPnNjYWJhc2UgKyAocmVnKSkKKyNkZWZpbmUgc2NhX291dCh2YWx1ZSwgcmVnLCBjYXJkKSAgICB3cml0ZWIodmFsdWUsIGNhcmQtPnNjYWJhc2UgKyAocmVnKSkKKyNkZWZpbmUgc2NhX2ludyhyZWcsIGNhcmQpCSAgICAgcmVhZHcoY2FyZC0+c2NhYmFzZSArIChyZWcpKQorI2RlZmluZSBzY2Ffb3V0dyh2YWx1ZSwgcmVnLCBjYXJkKSAgIHdyaXRldyh2YWx1ZSwgY2FyZC0+c2NhYmFzZSArIChyZWcpKQorI2RlZmluZSBzY2FfaW5sKHJlZywgY2FyZCkJICAgICByZWFkbChjYXJkLT5zY2FiYXNlICsgKHJlZykpCisjZGVmaW5lIHNjYV9vdXRsKHZhbHVlLCByZWcsIGNhcmQpICAgd3JpdGVsKHZhbHVlLCBjYXJkLT5zY2FiYXNlICsgKHJlZykpCisKKyNkZWZpbmUgcG9ydF90b19jYXJkKHBvcnQpCSAgICAgKHBvcnQtPmNhcmQpCisjZGVmaW5lIGxvZ19ub2RlKHBvcnQpCQkgICAgIChwb3J0LT5waHlfbm9kZSkKKyNkZWZpbmUgcGh5X25vZGUocG9ydCkJCSAgICAgKHBvcnQtPnBoeV9ub2RlKQorI2RlZmluZSB3aW5iYXNlKGNhcmQpCQkgICAgIChjYXJkLT5yYW1iYXNlKQorI2RlZmluZSBnZXRfcG9ydChjYXJkLCBwb3J0KQkgICAgICgocG9ydCkgPCAoY2FyZCktPm5fcG9ydHMgPyBcCisJCQkJCSAoJihjYXJkKS0+cG9ydHNbcG9ydF0pIDogKE5VTEwpKQorCisjaW5jbHVkZSAiaGQ2NDU3eC5jIgorCisKK3N0YXRpYyB2b2lkIHBjMzAwX3NldF9pZmFjZShwb3J0X3QgKnBvcnQpCit7CisJY2FyZF90ICpjYXJkID0gcG9ydC0+Y2FyZDsKKwl1MzIqIGluaXRfY3RybCA9ICZjYXJkLT5wbHhiYXNlLT5pbml0X2N0cmw7CisJdTE2IG1zY2kgPSBnZXRfbXNjaShwb3J0KTsKKwl1OCByeHMgPSBwb3J0LT5yeHMgJiBDTEtfQlJHX01BU0s7CisJdTggdHhzID0gcG9ydC0+dHhzICYgQ0xLX0JSR19NQVNLOworCisJc2NhX291dChFWFNfVEVTMSwgKHBoeV9ub2RlKHBvcnQpID8gTVNDSTFfT0ZGU0VUIDogTVNDSTBfT0ZGU0VUKSArIEVYUywKKwkJcG9ydF90b19jYXJkKHBvcnQpKTsKKwlzd2l0Y2gocG9ydC0+c2V0dGluZ3MuY2xvY2tfdHlwZSkgeworCWNhc2UgQ0xPQ0tfSU5UOgorCQlyeHMgfD0gQ0xLX0JSRzsgLyogQlJHIG91dHB1dCAqLworCQl0eHMgfD0gQ0xLX1BJTl9PVVQgfCBDTEtfVFhfUlhDTEs7IC8qIFJYIGNsb2NrICovCisJCWJyZWFrOworCisJY2FzZSBDTE9DS19UWElOVDoKKwkJcnhzIHw9IENMS19MSU5FOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19QSU5fT1VUIHwgQ0xLX0JSRzsgLyogQlJHIG91dHB1dCAqLworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfVFhGUk9NUlg6CisJCXJ4cyB8PSBDTEtfTElORTsgLyogUlhDIGlucHV0ICovCisJCXR4cyB8PSBDTEtfUElOX09VVCB8IENMS19UWF9SWENMSzsgLyogUlggY2xvY2sgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgkJLyogRVhUZXJuYWwgY2xvY2sgKi8KKwkJcnhzIHw9IENMS19MSU5FOyAvKiBSWEMgaW5wdXQgKi8KKwkJdHhzIHw9IENMS19QSU5fT1VUIHwgQ0xLX0xJTkU7IC8qIFRYQyBpbnB1dCAqLworCQlicmVhazsKKwl9CisKKwlwb3J0LT5yeHMgPSByeHM7CisJcG9ydC0+dHhzID0gdHhzOworCXNjYV9vdXQocnhzLCBtc2NpICsgUlhTLCBjYXJkKTsKKwlzY2Ffb3V0KHR4cywgbXNjaSArIFRYUywgY2FyZCk7CisJc2NhX3NldF9wb3J0KHBvcnQpOworCisJaWYgKHBvcnQtPmNhcmQtPnR5cGUgPT0gUEMzMDBfUlNWKSB7CisJCWlmIChwb3J0LT5pZmFjZSA9PSBJRl9JRkFDRV9WMzUpCisJCQl3cml0ZWwoY2FyZC0+aW5pdF9jdHJsX3ZhbHVlIHwKKwkJCSAgICAgICBQQzMwMF9DSE1FRElBX01BU0socG9ydC0+cGh5X25vZGUpLCBpbml0X2N0cmwpOworCQllbHNlCisJCQl3cml0ZWwoY2FyZC0+aW5pdF9jdHJsX3ZhbHVlICYKKwkJCSAgICAgICB+UEMzMDBfQ0hNRURJQV9NQVNLKHBvcnQtPnBoeV9ub2RlKSwgaW5pdF9jdHJsKTsKKwl9Cit9CisKKworCitzdGF0aWMgaW50IHBjMzAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisJaW50IHJlc3VsdCA9IGhkbGNfb3BlbihkZXYpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlzY2Ffb3BlbihkZXYpOworCXBjMzAwX3NldF9pZmFjZShwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgcGMzMDBfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzY2FfY2xvc2UoZGV2KTsKKwloZGxjX2Nsb3NlKGRldik7CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHBjMzAwX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKHN5bmNfc2VyaWFsX3NldHRpbmdzKTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBuZXdfbGluZTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBfX3VzZXIgKmxpbmUgPSBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jOworCWludCBuZXdfdHlwZTsKKwlwb3J0X3QgKnBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCisjaWZkZWYgREVCVUdfUklOR1MKKwlpZiAoY21kID09IFNJT0NERVZQUklWQVRFKSB7CisJCXNjYV9kdW1wX3JpbmdzKGRldik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWlmIChjbWQgIT0gU0lPQ1dBTkRFVikKKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisKKwlpZiAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9PSBJRl9HRVRfSUZBQ0UpIHsKKwkJaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9IHBvcnQtPmlmYWNlOworCQlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemUpIHsKKwkJCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplOyAvKiBkYXRhIHNpemUgd2FudGVkICovCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihsaW5lLCAmcG9ydC0+c2V0dGluZ3MsIHNpemUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJfQorCisJaWYgKHBvcnQtPmNhcmQtPnR5cGUgPT0gUEMzMDBfWDIxICYmCisJICAgIChpZnItPmlmcl9zZXR0aW5ncy50eXBlID09IElGX0lGQUNFX1NZTkNfU0VSSUFMIHx8CisJICAgICBpZnItPmlmcl9zZXR0aW5ncy50eXBlID09IElGX0lGQUNFX1gyMSkpCisJCW5ld190eXBlID0gSUZfSUZBQ0VfWDIxOworCisJZWxzZSBpZiAocG9ydC0+Y2FyZC0+dHlwZSA9PSBQQzMwMF9SU1YgJiYKKwkJIChpZnItPmlmcl9zZXR0aW5ncy50eXBlID09IElGX0lGQUNFX1NZTkNfU0VSSUFMIHx8CisJCSAgaWZyLT5pZnJfc2V0dGluZ3MudHlwZSA9PSBJRl9JRkFDRV9WMzUpKQorCQluZXdfdHlwZSA9IElGX0lGQUNFX1YzNTsKKworCWVsc2UgaWYgKHBvcnQtPmNhcmQtPnR5cGUgPT0gUEMzMDBfUlNWICYmCisJCSBpZnItPmlmcl9zZXR0aW5ncy50eXBlID09IElGX0lGQUNFX1YyNCkKKwkJbmV3X3R5cGUgPSBJRl9JRkFDRV9WMjQ7CisKKwllbHNlCisJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfbGluZSwgbGluZSwgc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfRVhUICYmCisJICAgIG5ld19saW5lLmNsb2NrX3R5cGUgIT0gQ0xPQ0tfVFhGUk9NUlggJiYKKwkgICAgbmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19JTlQgJiYKKwkgICAgbmV3X2xpbmUuY2xvY2tfdHlwZSAhPSBDTE9DS19UWElOVCkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIE5vIHN1Y2ggY2xvY2sgc2V0dGluZyAqLworCisJaWYgKG5ld19saW5lLmxvb3BiYWNrICE9IDAgJiYgbmV3X2xpbmUubG9vcGJhY2sgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoJnBvcnQtPnNldHRpbmdzLCAmbmV3X2xpbmUsIHNpemUpOyAvKiBVcGRhdGUgc2V0dGluZ3MgKi8KKwlwb3J0LT5pZmFjZSA9IG5ld190eXBlOworCXBjMzAwX3NldF9pZmFjZShwb3J0KTsKKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyB2b2lkIHBjMzAwX3BjaV9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBpOworCWNhcmRfdCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWlmIChjYXJkLT5wb3J0c1tpXS5jYXJkKSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYoJmNhcmQtPnBvcnRzW2ldKTsKKwkJCXVucmVnaXN0ZXJfaGRsY19kZXZpY2UoZGV2KTsKKwkJfQorCisJaWYgKGNhcmQtPmlycSkKKwkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKworCWlmIChjYXJkLT5yYW1iYXNlKQorCQlpb3VubWFwKGNhcmQtPnJhbWJhc2UpOworCWlmIChjYXJkLT5zY2FiYXNlKQorCQlpb3VubWFwKGNhcmQtPnNjYWJhc2UpOworCWlmIChjYXJkLT5wbHhiYXNlKQorCQlpb3VubWFwKGNhcmQtPnBseGJhc2UpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWlmIChjYXJkLT5wb3J0c1swXS5kZXYpCisJCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzWzBdLmRldik7CisJaWYgKGNhcmQtPnBvcnRzWzFdLmRldikKKwkJZnJlZV9uZXRkZXYoY2FyZC0+cG9ydHNbMV0uZGV2KTsKKwlrZnJlZShjYXJkKTsKK30KKworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjMzAwX3BjaV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwljYXJkX3QgKmNhcmQ7CisJdTggcmV2X2lkOworCXUzMiBfX2lvbWVtICpwOworCWludCBpOworCXUzMiByYW1zaXplOworCXUzMiByYW1waHlzOwkJLyogYnVmZmVyIG1lbW9yeSBiYXNlICovCisJdTMyIHNjYXBoeXM7CQkvKiBTQ0EgbWVtb3J5IGJhc2UgKi8KKwl1MzIgcGx4cGh5czsJCS8qIFBMWCByZWdpc3RlcnMgbWVtb3J5IGJhc2UgKi8KKworI2lmbmRlZiBNT0RVTEUKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKwlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQorCQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisjZW5kaWYKKworCWkgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoaSkKKwkJcmV0dXJuIGk7CisKKwlpID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiUEMzMDAiKTsKKwlpZiAoaSkgeworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXJldHVybiBpOworCX0KKworCWNhcmQgPSBrbWFsbG9jKHNpemVvZihjYXJkX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FyZCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAicGMzMDA6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisJbWVtc2V0KGNhcmQsIDAsIHNpemVvZihjYXJkX3QpKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisKKwlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUEMzMDBfVEVfMSB8fAorCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9QQzMwMF9URV8yKQorCQljYXJkLT50eXBlID0gUEMzMDBfVEU7IC8qIG5vdCBmdWxseSBzdXBwb3J0ZWQgKi8KKwllbHNlIGlmIChjYXJkLT5pbml0X2N0cmxfdmFsdWUgJiBQQzMwMF9DVFlQRV9NQVNLKQorCQljYXJkLT50eXBlID0gUEMzMDBfWDIxOworCWVsc2UKKwkJY2FyZC0+dHlwZSA9IFBDMzAwX1JTVjsKKworCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9QQzMwMF9SWF8xIHx8CisJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1BDMzAwX1RFXzEpCisJCWNhcmQtPm5fcG9ydHMgPSAxOworCWVsc2UKKwkJY2FyZC0+bl9wb3J0cyA9IDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bl9wb3J0czsgaSsrKQorCQlpZiAoIShjYXJkLT5wb3J0c1tpXS5kZXYgPSBhbGxvY19oZGxjZGV2KCZjYXJkLT5wb3J0c1tpXSkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInBjMzAwOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJCXBjMzAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldl9pZCk7CisJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgIT0gUEMzMDBfUExYX1NJWkUgfHwKKwkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSAhPSBQQzMwMF9TQ0FfU0laRSB8fAorCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpIDwgMTYzODQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwYzMwMDogaW52YWxpZCBjYXJkIEVFUFJPTSBwYXJhbWV0ZXJzXG4iKTsKKwkJcGMzMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXBseHBoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwwKSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJY2FyZC0+cGx4YmFzZSA9IGlvcmVtYXAocGx4cGh5cywgUEMzMDBfUExYX1NJWkUpOworCisJc2NhcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LDIpICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwljYXJkLT5zY2FiYXNlID0gaW9yZW1hcChzY2FwaHlzLCBQQzMwMF9TQ0FfU0laRSk7CisKKwlyYW1waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsMykgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCWNhcmQtPnJhbWJhc2UgPSBpb3JlbWFwKHJhbXBoeXMsIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwzKSk7CisKKwlpZiAoY2FyZC0+cGx4YmFzZSA9PSBOVUxMIHx8CisJICAgIGNhcmQtPnNjYWJhc2UgPT0gTlVMTCB8fAorCSAgICBjYXJkLT5yYW1iYXNlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwYzMwMDogaW9yZW1hcCgpIGZhaWxlZFxuIik7CisJCXBjMzAwX3BjaV9yZW1vdmVfb25lKHBkZXYpOworCX0KKworCS8qIFBMWCBQQ0kgOTA1MCB3b3JrYXJvdW5kIGZvciBsb2NhbCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHJlYWQgYnVnICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzAsIHNjYXBoeXMpOworCWNhcmQtPmluaXRfY3RybF92YWx1ZSA9IHJlYWRsKCYoKHBseDkwNTAqKWNhcmQtPnNjYWJhc2UpLT5pbml0X2N0cmwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgUENJX0JBU0VfQUREUkVTU18wLCBwbHhwaHlzKTsKKworCS8qIFJlc2V0IFBMWCAqLworCXAgPSAmY2FyZC0+cGx4YmFzZS0+aW5pdF9jdHJsOworCXdyaXRlbChjYXJkLT5pbml0X2N0cmxfdmFsdWUgfCAweDQwMDAwMDAwLCBwKTsKKwlyZWFkbChwKTsJCS8qIEZsdXNoIHRoZSB3cml0ZSAtIGRvIG5vdCB1c2Ugc2NhX2ZsdXNoICovCisJdWRlbGF5KDEpOworCisJd3JpdGVsKGNhcmQtPmluaXRfY3RybF92YWx1ZSwgcCk7CisJcmVhZGwocCk7CQkvKiBGbHVzaCB0aGUgd3JpdGUgLSBkbyBub3QgdXNlIHNjYV9mbHVzaCAqLworCXVkZWxheSgxKTsKKworCS8qIFJlbG9hZCBDb25maWcuIFJlZ2lzdGVycyBmcm9tIEVFUFJPTSAqLworCXdyaXRlbChjYXJkLT5pbml0X2N0cmxfdmFsdWUgfCAweDIwMDAwMDAwLCBwKTsKKwlyZWFkbChwKTsJCS8qIEZsdXNoIHRoZSB3cml0ZSAtIGRvIG5vdCB1c2Ugc2NhX2ZsdXNoICovCisJdWRlbGF5KDEpOworCisJd3JpdGVsKGNhcmQtPmluaXRfY3RybF92YWx1ZSwgcCk7CisJcmVhZGwocCk7CQkvKiBGbHVzaCB0aGUgd3JpdGUgLSBkbyBub3QgdXNlIHNjYV9mbHVzaCAqLworCXVkZWxheSgxKTsKKworCXJhbXNpemUgPSBzY2FfZGV0ZWN0X3JhbShjYXJkLCBjYXJkLT5yYW1iYXNlLAorCQkJCSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDMpKTsKKworCWlmICh1c2VfY3J5c3RhbF9jbG9jaykKKwkJY2FyZC0+aW5pdF9jdHJsX3ZhbHVlICY9IH5QQzMwMF9DTEtTRUxfTUFTSzsKKwllbHNlCisJCWNhcmQtPmluaXRfY3RybF92YWx1ZSB8PSBQQzMwMF9DTEtTRUxfTUFTSzsKKworCXdyaXRlbChjYXJkLT5pbml0X2N0cmxfdmFsdWUsICZjYXJkLT5wbHhiYXNlLT5pbml0X2N0cmwpOworCS8qIG51bWJlciBvZiBUWCArIFJYIGJ1ZmZlcnMgZm9yIG9uZSBwb3J0ICovCisJaSA9IHJhbXNpemUgLyAoY2FyZC0+bl9wb3J0cyAqIChzaXplb2YocGt0X2Rlc2MpICsgSERMQ19NQVhfTVJVKSk7CisJY2FyZC0+dHhfcmluZ19idWZmZXJzID0gbWluKGkgLyAyLCBNQVhfVFhfQlVGRkVSUyk7CisJY2FyZC0+cnhfcmluZ19idWZmZXJzID0gaSAtIGNhcmQtPnR4X3JpbmdfYnVmZmVyczsKKworCWNhcmQtPmJ1ZmZfb2Zmc2V0ID0gY2FyZC0+bl9wb3J0cyAqIHNpemVvZihwa3RfZGVzYykgKgorCQkoY2FyZC0+dHhfcmluZ19idWZmZXJzICsgY2FyZC0+cnhfcmluZ19idWZmZXJzKTsKKworCXByaW50ayhLRVJOX0lORk8gInBjMzAwOiBQQzMwMC8lcywgJXUgS0IgUkFNIGF0IDB4JXgsIElSUSV1LCAiCisJICAgICAgICJ1c2luZyAldSBUWCArICV1IFJYIHBhY2tldHMgcmluZ3NcbiIsCisJICAgICAgIGNhcmQtPnR5cGUgPT0gUEMzMDBfWDIxID8gIlgyMSIgOgorCSAgICAgICBjYXJkLT50eXBlID09IFBDMzAwX1RFID8gIlRFIiA6ICJSU1YiLAorCSAgICAgICByYW1zaXplIC8gMTAyNCwgcmFtcGh5cywgcGRldi0+aXJxLAorCSAgICAgICBjYXJkLT50eF9yaW5nX2J1ZmZlcnMsIGNhcmQtPnJ4X3JpbmdfYnVmZmVycyk7CisKKwlpZiAoY2FyZC0+dHhfcmluZ19idWZmZXJzIDwgMSkgeworCQlwcmludGsoS0VSTl9FUlIgInBjMzAwOiBSQU0gdGVzdCBmYWlsZWRcbiIpOworCQlwYzMwMF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogRW5hYmxlIGludGVycnVwdHMgb24gdGhlIFBDSSBicmlkZ2UsIExJTlRpMSBhY3RpdmUgbG93ICovCisJd3JpdGV3KDB4MDA0MSwgJmNhcmQtPnBseGJhc2UtPmludHJfY3RybF9zdGF0KTsKKworCS8qIEFsbG9jYXRlIElSUSAqLworCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIHNjYV9pbnRyLCBJUlFGX1NIQVJFRCwgZGV2bmFtZSwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGMzMDA6IGNvdWxkIG5vdCBhbGxvY2F0ZSBJUlElZC5cbiIsCisJCSAgICAgICBwZGV2LT5pcnEpOworCQlwYzMwMF9wY2lfcmVtb3ZlX29uZShwZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2FyZC0+aXJxID0gcGRldi0+aXJxOworCisJc2NhX2luaXQoY2FyZCwgMCk7CisKKwkvLyBDT1RFIG5vdCBzZXQgLSBhbGxvd3MgYmV0dGVyIFRYIERNQSBzZXR0aW5ncworCS8vIHNjYV9vdXQoc2NhX2luKFBDUiwgY2FyZCkgfCBQQ1JfQ09URSwgUENSLCBjYXJkKTsKKworCXNjYV9vdXQoMHgxMCwgQlRDUiwgY2FyZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bl9wb3J0czsgaSsrKSB7CisJCXBvcnRfdCAqcG9ydCA9ICZjYXJkLT5wb3J0c1tpXTsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCQloZGxjX2RldmljZSAqaGRsYyA9IGRldl90b19oZGxjKGRldik7CisJCXBvcnQtPnBoeV9ub2RlID0gaTsKKworCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CisJCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwkJZGV2LT5pcnEgPSBjYXJkLT5pcnE7CisJCWRldi0+bWVtX3N0YXJ0ID0gcmFtcGh5czsKKwkJZGV2LT5tZW1fZW5kID0gcmFtcGh5cyArIHJhbXNpemUgLSAxOworCQlkZXYtPnR4X3F1ZXVlX2xlbiA9IDUwOworCQlkZXYtPmRvX2lvY3RsID0gcGMzMDBfaW9jdGw7CisJCWRldi0+b3BlbiA9IHBjMzAwX29wZW47CisJCWRldi0+c3RvcCA9IHBjMzAwX2Nsb3NlOworCQloZGxjLT5hdHRhY2ggPSBzY2FfYXR0YWNoOworCQloZGxjLT54bWl0ID0gc2NhX3htaXQ7CisJCXBvcnQtPnNldHRpbmdzLmNsb2NrX3R5cGUgPSBDTE9DS19FWFQ7CisJCXBvcnQtPmNhcmQgPSBjYXJkOworCQlpZiAoY2FyZC0+dHlwZSA9PSBQQzMwMF9YMjEpCisJCQlwb3J0LT5pZmFjZSA9IElGX0lGQUNFX1gyMTsKKwkJZWxzZQorCQkJcG9ydC0+aWZhY2UgPSBJRl9JRkFDRV9WMzU7CisKKwkJaWYgKHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicGMzMDA6IHVuYWJsZSB0byByZWdpc3RlciBoZGxjICIKKwkJCSAgICAgICAiZGV2aWNlXG4iKTsKKwkJCXBvcnQtPmNhcmQgPSBOVUxMOworCQkJcGMzMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCX0KKwkJc2NhX2luaXRfc3luY19wb3J0KHBvcnQpOwkvKiBTZXQgdXAgU0NBIG1lbW9yeSAqLworCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQQzMwMCBub2RlICVkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBwb3J0LT5waHlfbm9kZSk7CisJfQorCXJldHVybiAwOworfQorCisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjMzAwX3BjaV90YmxbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZFTkRPUl9JRF9DWUNMQURFUywgUENJX0RFVklDRV9JRF9QQzMwMF9SWF8xLCBQQ0lfQU5ZX0lELAorCSAgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DWUNMQURFUywgUENJX0RFVklDRV9JRF9QQzMwMF9SWF8yLCBQQ0lfQU5ZX0lELAorCSAgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DWUNMQURFUywgUENJX0RFVklDRV9JRF9QQzMwMF9URV8xLCBQQ0lfQU5ZX0lELAorCSAgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DWUNMQURFUywgUENJX0RFVklDRV9JRF9QQzMwMF9URV8yLCBQQ0lfQU5ZX0lELAorCSAgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAorCXsgMCwgfQorfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGMzMDBfcGNpX2RyaXZlciA9IHsKKwluYW1lOiAgICAgICAgICAgIlBDMzAwIiwKKwlpZF90YWJsZTogICAgICAgcGMzMDBfcGNpX3RibCwKKwlwcm9iZTogICAgICAgICAgcGMzMDBfcGNpX2luaXRfb25lLAorCXJlbW92ZTogICAgICAgICBwYzMwMF9wY2lfcmVtb3ZlX29uZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgcGMzMDBfaW5pdF9tb2R1bGUodm9pZCkKK3sKKyNpZmRlZiBNT0RVTEUKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CisjZW5kaWYKKwlpZiAocGNpX2Nsb2NrX2ZyZXEgPCAxMDAwMDAwIHx8IHBjaV9jbG9ja19mcmVxID4gODAwMDAwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwYzMwMDogSW52YWxpZCBQQ0kgY2xvY2sgZnJlcXVlbmN5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh1c2VfY3J5c3RhbF9jbG9jayAhPSAwICYmIHVzZV9jcnlzdGFsX2Nsb2NrICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJwYzMwMDogSW52YWxpZCAndXNlX2NyeXN0YWxfY2xvY2snIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJQ0xPQ0tfQkFTRSA9IHVzZV9jcnlzdGFsX2Nsb2NrID8gMjQ1NzYwMDAgOiBwY2lfY2xvY2tfZnJlcTsKKworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnBjMzAwX3BjaV9kcml2ZXIpOworfQorCisKKworc3RhdGljIHZvaWQgX19leGl0IHBjMzAwX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwYzMwMF9wY2lfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiS3J6eXN6dG9mIEhhbGFzYSA8a2hjQHBtLndhdy5wbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3ljbGFkZXMgUEMzMDAgc2VyaWFsIHBvcnQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGMzMDBfcGNpX3RibCk7Cittb2R1bGVfcGFyYW0ocGNpX2Nsb2NrX2ZyZXEsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBjaV9jbG9ja19mcmVxLCAiU3lzdGVtIFBDSSBjbG9jayBmcmVxdWVuY3kgaW4gSHoiKTsKK21vZHVsZV9wYXJhbSh1c2VfY3J5c3RhbF9jbG9jaywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX2NyeXN0YWxfY2xvY2ssCisJCSAiVXNlIDI0LjU3NiBNSHogY2xvY2sgaW5zdGVhZCBvZiBQQ0kgY2xvY2siKTsKK21vZHVsZV9pbml0KHBjMzAwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHBjMzAwX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYyBiL2RyaXZlcnMvbmV0L3dhbi96ODUyMzAuYwppbmRleCA1OWRkZDIxLi44ZGJjZjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vejg1MjMwLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3o4NTIzMC5jCkBAIC0zMzEsOCArMzMxLDcgQEAKIHN0YXRpYyB2b2lkIHo4NTMwX3J4KHN0cnVjdCB6ODUzMF9jaGFubmVsICpjKQogewogCXU4IGNoLHN0YXQ7Ci0Jc3Bpbl9sb2NrKGMtPmxvY2spOwotIAorCiAJd2hpbGUoMSkKIAl7CiAJCS8qIEZJRk8gZW1wdHkgPyAqLwpAQCAtMzkwLDcgKzM4OSw2IEBACiAJICovCiAJd3JpdGVfenNjdHJsKGMsIEVSUl9SRVMpOwogCXdyaXRlX3pzY3RybChjLCBSRVNfSF9JVVMpOwotCXNwaW5fdW5sb2NrKGMtPmxvY2spOwogfQogCiAKQEAgLTQwNiw3ICs0MDQsNiBAQAogIAogc3RhdGljIHZvaWQgejg1MzBfdHgoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmMpCiB7Ci0Jc3Bpbl9sb2NrKGMtPmxvY2spOwogCXdoaWxlKGMtPnR4Y291bnQpIHsKIAkJLyogRklGTyBmdWxsID8gKi8KIAkJaWYoIShyZWFkX3pzcmVnKGMsIFIwKSY0KSkKQEAgLTQzNCw3ICs0MzEsNiBAQAogCiAJejg1MzBfdHhfZG9uZShjKTsJIAogCXdyaXRlX3pzY3RybChjLCBSRVNfSF9JVVMpOwotCXNwaW5fdW5sb2NrKGMtPmxvY2spOwogfQogCiAvKioKQEAgLTQ1Miw3ICs0NDgsNiBAQAogewogCXU4IHN0YXR1cywgYWx0ZXJlZDsKIAotCXNwaW5fbG9jayhjaGFuLT5sb2NrKTsKIAlzdGF0dXM9cmVhZF96c3JlZyhjaGFuLCBSMCk7CiAJYWx0ZXJlZD1jaGFuLT5zdGF0dXNec3RhdHVzOwogCQpAQCAtNDg3LDcgKzQ4Miw2IEBACiAJfQkKIAl3cml0ZV96c2N0cmwoY2hhbiwgUkVTX0VYVF9JTlQpOwogCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfSF9JVVMpOwotCXNwaW5fdW5sb2NrKGNoYW4tPmxvY2spOwogfQogCiBzdHJ1Y3Qgejg1MzBfaXJxaGFuZGxlciB6ODUzMF9zeW5jPQpAQCAtNTExLDcgKzUwNSw2IEBACiAgCiBzdGF0aWMgdm9pZCB6ODUzMF9kbWFfcngoc3RydWN0IHo4NTMwX2NoYW5uZWwgKmNoYW4pCiB7Ci0Jc3Bpbl9sb2NrKGNoYW4tPmxvY2spOwogCWlmKGNoYW4tPnJ4ZG1hX29uKQogCXsKIAkJLyogU3BlY2lhbCBjb25kaXRpb24gY2hlY2sgb25seSAqLwpAQCAtNTM0LDcgKzUyNyw2IEBACiAJCS8qIERNQSBpcyBvZmYgcmlnaHQgbm93LCBkcmFpbiB0aGUgc2xvdyB3YXkgKi8KIAkJejg1MzBfcngoY2hhbik7CiAJfQkKLQlzcGluX3VubG9jayhjaGFuLT5sb2NrKTsKIH0KIAogLyoqCkBAIC01NDcsNyArNTM5LDYgQEAKICAKIHN0YXRpYyB2b2lkIHo4NTMwX2RtYV90eChzdHJ1Y3Qgejg1MzBfY2hhbm5lbCAqY2hhbikKIHsKLQlzcGluX2xvY2soY2hhbi0+bG9jayk7CiAJaWYoIWNoYW4tPmRtYV90eCkKIAl7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkhleSB3aG8gdHVybmVkIHRoZSBETUEgb2ZmP1xuIik7CkBAIC01NTcsNyArNTQ4LDYgQEAKIAkvKiBUaGlzIHNob3VsZG50IG9jY3VyIGluIERNQSBtb2RlICovCiAJcHJpbnRrKEtFUk5fRVJSICJETUEgdHggLSBib2d1cyBldmVudCFcbiIpOwogCXo4NTMwX3R4KGNoYW4pOwotCXNwaW5fdW5sb2NrKGNoYW4tPmxvY2spOwogfQogCiAvKioKQEAgLTU5Niw3ICs1ODYsNiBAQAogCQl9CiAJfQogCi0Jc3Bpbl9sb2NrKGNoYW4tPmxvY2spOwogCWlmKGFsdGVyZWQmY2hhbi0+ZGNkY2hlY2spCiAJewogCQlpZihzdGF0dXMmY2hhbi0+ZGNkY2hlY2spCkBAIC02MTgsNyArNjA3LDYgQEAKIAogCXdyaXRlX3pzY3RybChjaGFuLCBSRVNfRVhUX0lOVCk7CiAJd3JpdGVfenNjdHJsKGNoYW4sIFJFU19IX0lVUyk7Ci0Jc3Bpbl91bmxvY2soY2hhbi0+bG9jayk7CiB9CiAKIHN0cnVjdCB6ODUzMF9pcnFoYW5kbGVyIHo4NTMwX2RtYV9zeW5jPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaAppbmRleCA4Mjg2Njc4Li4zYTA2NGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHguaApAQCAtMzUyLDYgKzM1MiwxMCBAQAogI2RlZmluZSBCQ000M3h4X1VDT0RFRkxBR19VTktQQUNUUkwJMHgwMDQwCiAjZGVmaW5lIEJDTTQzeHhfVUNPREVGTEFHX0pBUEFOCQkweDAwODAKIAorLyogSGFyZHdhcmUgUmFkaW8gRW5hYmxlIG1hc2tzICovCisjZGVmaW5lIEJDTTQzeHhfTU1JT19SQURJT19IV0VOQUJMRURfSElfTUFTSyAoMSA8PCAxNikKKyNkZWZpbmUgQkNNNDN4eF9NTUlPX1JBRElPX0hXRU5BQkxFRF9MT19NQVNLICgxIDw8IDQpCisKIC8qIEdlbmVyaWMtSW50ZXJydXB0IHJlYXNvbnMuICovCiAjZGVmaW5lIEJDTTQzeHhfSVJRX1JFQURZCQkoMSA8PCAwKQogI2RlZmluZSBCQ000M3h4X0lSUV9CRUFDT04JCSgxIDw8IDEpCkBAIC03NTgsNyArNzYyLDggQEAKIAkgICAgYmFkX2ZyYW1lc19wcmVlbXB0OjEsCS8qIFVzZSAiQmFkIEZyYW1lcyBQcmVlbXB0aW9uIiAoZGVmYXVsdCBvZmYpICovCiAJICAgIHJlZzEyNF9zZXRfMHg0OjEsCQkvKiBTb21lIHZhcmlhYmxlIHRvIGtlZXAgdHJhY2sgb2YgSVJRIHN0dWZmLiAqLwogCSAgICBzaG9ydF9wcmVhbWJsZToxLAkJLyogVFJVRSwgaWYgc2hvcnQgcHJlYW1ibGUgaXMgZW5hYmxlZC4gKi8KLQkgICAgZmlybXdhcmVfbm9yZWxlYXNlOjE7CS8qIERvIG5vdCByZWxlYXNlIHRoZSBmaXJtd2FyZS4gVXNlZCBvbiBzdXNwZW5kLiAqLworCSAgICBmaXJtd2FyZV9ub3JlbGVhc2U6MSwJLyogRG8gbm90IHJlbGVhc2UgdGhlIGZpcm13YXJlLiBVc2VkIG9uIHN1c3BlbmQuICovCisJICAgIHJhZGlvX2h3X2VuYWJsZToxOwkJLyogVFJVRSBpZiByYWRpbyBpcyBoYXJkd2FyZSBlbmFibGVkICovCiAKIAlzdHJ1Y3QgYmNtNDN4eF9zdGF0cyBzdGF0czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2xlZHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9sZWRzLmMKaW5kZXggN2QzODNhMi4uOGYxOThiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2xlZHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbGVkcy5jCkBAIC0yNiw2ICsyNiw3IEBACiAqLwogCiAjaW5jbHVkZSAiYmNtNDN4eF9sZWRzLmgiCisjaW5jbHVkZSAiYmNtNDN4eF9yYWRpby5oIgogI2luY2x1ZGUgImJjbTQzeHguaCIKIAogI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KQEAgLTEwOCw2ICsxMDksNyBAQAogCXN3aXRjaCAobGVkX2luZGV4KSB7CiAJY2FzZSAwOgogCQlsZWQtPmJlaGF2aW91ciA9IEJDTTQzeHhfTEVEX0FDVElWSVRZOworCQlsZWQtPmFjdGl2ZWxvdyA9IDE7CiAJCWlmIChiY20tPmJvYXJkX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTVBBUSkKIAkJCWxlZC0+YmVoYXZpb3VyID0gQkNNNDN4eF9MRURfUkFESU9fQUxMOwogCQlicmVhazsKQEAgLTE5OSwyMCArMjAxLDIxIEBACiAJCQl0dXJuX29uID0gYWN0aXZpdHk7CiAJCQlicmVhazsKIAkJY2FzZSBCQ000M3h4X0xFRF9SQURJT19BTEw6Ci0JCQl0dXJuX29uID0gcmFkaW8tPmVuYWJsZWQ7CisJCQl0dXJuX29uID0gcmFkaW8tPmVuYWJsZWQgJiYgYmNtNDN4eF9pc19od19yYWRpb19lbmFibGVkKGJjbSk7CiAJCQlicmVhazsKIAkJY2FzZSBCQ000M3h4X0xFRF9SQURJT19BOgogCQljYXNlIEJDTTQzeHhfTEVEX0JDTTQzMDNfMjoKLQkJCXR1cm5fb24gPSAocmFkaW8tPmVuYWJsZWQgJiYgcGh5LT50eXBlID09IEJDTTQzeHhfUEhZVFlQRV9BKTsKKwkJCXR1cm5fb24gPSAocmFkaW8tPmVuYWJsZWQgJiYgYmNtNDN4eF9pc19od19yYWRpb19lbmFibGVkKGJjbSkgJiYKKwkJCQkgICBwaHktPnR5cGUgPT0gQkNNNDN4eF9QSFlUWVBFX0EpOwogCQkJYnJlYWs7CiAJCWNhc2UgQkNNNDN4eF9MRURfUkFESU9fQjoKIAkJY2FzZSBCQ000M3h4X0xFRF9CQ000MzAzXzE6Ci0JCQl0dXJuX29uID0gKHJhZGlvLT5lbmFibGVkICYmCisJCQl0dXJuX29uID0gKHJhZGlvLT5lbmFibGVkICYmIGJjbTQzeHhfaXNfaHdfcmFkaW9fZW5hYmxlZChiY20pICYmCiAJCQkJICAgKHBoeS0+dHlwZSA9PSBCQ000M3h4X1BIWVRZUEVfQiB8fAogCQkJCSAgICBwaHktPnR5cGUgPT0gQkNNNDN4eF9QSFlUWVBFX0cpKTsKIAkJCWJyZWFrOwogCQljYXNlIEJDTTQzeHhfTEVEX01PREVfQkc6Ci0JCQlpZiAocGh5LT50eXBlID09IEJDTTQzeHhfUEhZVFlQRV9HICYmCisJCQlpZiAocGh5LT50eXBlID09IEJDTTQzeHhfUEhZVFlQRV9HICYmIGJjbTQzeHhfaXNfaHdfcmFkaW9fZW5hYmxlZChiY20pICYmCiAJCQkgICAgMS8qRklYTUU6IHVzaW5nIEcgcmF0ZXMuKi8pCiAJCQkJdHVybl9vbiA9IDE7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jCmluZGV4IDkxYjc1MmUuLjIzYWFmMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X21haW4uYwpAQCAtMjQ0MSw2ICsyNDQxLDkgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9ncGlvX2NsZWFudXA7CiAJYmNtNDN4eF9yYWRpb190dXJuX29uKGJjbSk7CisJYmNtLT5yYWRpb19od19lbmFibGUgPSBiY200M3h4X2lzX2h3X3JhZGlvX2VuYWJsZWQoYmNtKTsKKwlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIlJhZGlvICVzIGJ5IGhhcmR3YXJlXG4iLAorCQkoYmNtLT5yYWRpb19od19lbmFibGUgPT0gMCkgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKIAogCWJjbTQzeHhfd3JpdGUxNihiY20sIDB4MDNFNiwgMHgwMDAwKTsKIAllcnIgPSBiY200M3h4X3BoeV9pbml0KGJjbSk7CkBAIC0zMTc1LDkgKzMxNzgsMjQgQEAKIAogc3RhdGljIHZvaWQgYmNtNDN4eF9wZXJpb2RpY19ldmVyeTE1c2VjKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKIHsKKwliY200M3h4X3BoeV94bWl0cG93ZXIoYmNtKTsgLy9GSVhNRTogdW5sZXNzIHNjYW5uaW5nPworCS8vVE9ETyBmb3IgQVBIWSAodGVtcGVyYXR1cmU/KQorfQorCitzdGF0aWMgdm9pZCBiY200M3h4X3BlcmlvZGljX2V2ZXJ5MXNlYyhzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCit7CiAJc3RydWN0IGJjbTQzeHhfcGh5aW5mbyAqcGh5ID0gYmNtNDN4eF9jdXJyZW50X3BoeShiY20pOwogCXN0cnVjdCBiY200M3h4X3JhZGlvaW5mbyAqcmFkaW8gPSBiY200M3h4X2N1cnJlbnRfcmFkaW8oYmNtKTsKKwlpbnQgcmFkaW9faHdfZW5hYmxlOwogCisJLyogY2hlY2sgaWYgcmFkaW8gaGFyZHdhcmUgZW5hYmxlZCBzdGF0dXMgY2hhbmdlZCAqLworCXJhZGlvX2h3X2VuYWJsZSA9IGJjbTQzeHhfaXNfaHdfcmFkaW9fZW5hYmxlZChiY20pOworCWlmICh1bmxpa2VseShiY20tPnJhZGlvX2h3X2VuYWJsZSAhPSByYWRpb19od19lbmFibGUpKSB7CisJCWJjbS0+cmFkaW9faHdfZW5hYmxlID0gcmFkaW9faHdfZW5hYmxlOworCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggIlJhZGlvIGhhcmR3YXJlIHN0YXR1cyBjaGFuZ2VkIHRvICVzXG4iLAorCQkgICAgICAgKHJhZGlvX2h3X2VuYWJsZSA9PSAwKSA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOworCQliY200M3h4X2xlZHNfdXBkYXRlKGJjbSwgMCk7CisJfQogCWlmIChwaHktPnR5cGUgPT0gQkNNNDN4eF9QSFlUWVBFX0cpIHsKIAkJLy9UT0RPOiB1cGRhdGVfYWNpX21vdmluZ19hdmVyYWdlCiAJCWlmIChyYWRpby0+YWNpX2VuYWJsZSAmJiByYWRpby0+YWNpX3dsYW5fYXV0b21hdGljKSB7CkBAIC0zMjAxLDIxICszMjE5LDIxIEBACiAJCQkvL1RPRE86IGltcGxlbWVudCByZXYxIHdvcmthcm91bmQKIAkJfQogCX0KLQliY200M3h4X3BoeV94bWl0cG93ZXIoYmNtKTsgLy9GSVhNRTogdW5sZXNzIHNjYW5uaW5nPwotCS8vVE9ETyBmb3IgQVBIWSAodGVtcGVyYXR1cmU/KQogfQogCiBzdGF0aWMgdm9pZCBkb19wZXJpb2RpY193b3JrKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKIHsKLQlpZiAoYmNtLT5wZXJpb2RpY19zdGF0ZSAlIDggPT0gMCkKKwlpZiAoYmNtLT5wZXJpb2RpY19zdGF0ZSAlIDEyMCA9PSAwKQogCQliY200M3h4X3BlcmlvZGljX2V2ZXJ5MTIwc2VjKGJjbSk7Ci0JaWYgKGJjbS0+cGVyaW9kaWNfc3RhdGUgJSA0ID09IDApCisJaWYgKGJjbS0+cGVyaW9kaWNfc3RhdGUgJSA2MCA9PSAwKQogCQliY200M3h4X3BlcmlvZGljX2V2ZXJ5NjBzZWMoYmNtKTsKLQlpZiAoYmNtLT5wZXJpb2RpY19zdGF0ZSAlIDIgPT0gMCkKKwlpZiAoYmNtLT5wZXJpb2RpY19zdGF0ZSAlIDMwID09IDApCiAJCWJjbTQzeHhfcGVyaW9kaWNfZXZlcnkzMHNlYyhiY20pOwotCWJjbTQzeHhfcGVyaW9kaWNfZXZlcnkxNXNlYyhiY20pOworCWlmIChiY20tPnBlcmlvZGljX3N0YXRlICUgMTUgPT0gMCkKKwkJYmNtNDN4eF9wZXJpb2RpY19ldmVyeTE1c2VjKGJjbSk7CisJYmNtNDN4eF9wZXJpb2RpY19ldmVyeTFzZWMoYmNtKTsKIAotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYmNtLT5wZXJpb2RpY193b3JrLCBIWiAqIDE1KTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJjbS0+cGVyaW9kaWNfd29yaywgSFopOwogfQogCiBzdGF0aWMgdm9pZCBiY200M3h4X3BlcmlvZGljX3dvcmtfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0zMjI4LDcgKzMyNDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgb3JpZ190cmFuc19zdGFydCA9IDA7CiAKIAltdXRleF9sb2NrKCZiY20tPm11dGV4KTsKLQlpZiAodW5saWtlbHkoYmNtLT5wZXJpb2RpY19zdGF0ZSAlIDQgPT0gMCkpIHsKKwlpZiAodW5saWtlbHkoYmNtLT5wZXJpb2RpY19zdGF0ZSAlIDYwID09IDApKSB7CiAJCS8qIFBlcmlvZGljIHdvcmsgd2lsbCB0YWtlIGEgbG9uZyB0aW1lLCBzbyB3ZSB3YW50IGl0IHRvCiAJCSAqIGJlIHByZWVtdGlibGUuCiAJCSAqLwpAQCAtMzI2MCw3ICszMjc4LDcgQEAKIAogCWRvX3BlcmlvZGljX3dvcmsoYmNtKTsKIAotCWlmICh1bmxpa2VseShiY20tPnBlcmlvZGljX3N0YXRlICUgNCA9PSAwKSkgeworCWlmICh1bmxpa2VseShiY20tPnBlcmlvZGljX3N0YXRlICUgNjAgPT0gMCkpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmJjbS0+aXJxX2xvY2ssIGZsYWdzKTsKIAkJdGFza2xldF9lbmFibGUoJmJjbS0+aXNyX3Rhc2tsZXQpOwogCQliY200M3h4X2ludGVycnVwdF9lbmFibGUoYmNtLCBzYXZlZGlycXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3JhZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcmFkaW8uYwppbmRleCBiYjljNDg0Li5hZjE5YTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcmFkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcmFkaW8uYwpAQCAtMTk4MSw2ICsxOTgxLDcgQEAKIAl9CiAJcmFkaW8tPmVuYWJsZWQgPSAxOwogCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiUmFkaW8gdHVybmVkIG9uXG4iKTsKKwliY200M3h4X2xlZHNfdXBkYXRlKGJjbSwgMCk7CiB9CiAJCiB2b2lkIGJjbTQzeHhfcmFkaW9fdHVybl9vZmYoc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtKQpAQCAtMjAwMSw2ICsyMDAyLDcgQEAKIAkJYmNtNDN4eF9waHlfd3JpdGUoYmNtLCAweDAwMTUsIDB4QUEwMCk7CiAJcmFkaW8tPmVuYWJsZWQgPSAwOwogCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiUmFkaW8gdHVybmVkIG9mZlxuIik7CisJYmNtNDN4eF9sZWRzX3VwZGF0ZShiY20sIDApOwogfQogCiB2b2lkIGJjbTQzeHhfcmFkaW9fY2xlYXJfdHNzaShzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcmFkaW8uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9yYWRpby5oCmluZGV4IDllZDE4MDMuLjc3YTk4YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9yYWRpby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9yYWRpby5oCkBAIC02NSw2ICs2NSwyMiBAQAogdm9pZCBiY200M3h4X3JhZGlvX3R1cm5fb24oc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtKTsKIHZvaWQgYmNtNDN4eF9yYWRpb190dXJuX29mZihzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pOwogCitzdGF0aWMgaW5saW5lCitpbnQgYmNtNDN4eF9pc19od19yYWRpb19lbmFibGVkKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKK3sKKwkvKiBmdW5jdGlvbiB0byByZXR1cm4gc3RhdGUgb2YgaGFyZHdhcmUgZW5hYmxlIG9mIHJhZGlvCisJICogcmV0dXJucyAwIGlmIHJhZGlvIGRpc2FibGVkLCAxIGlmIHJhZGlvIGVuYWJsZWQKKwkgKi8KKwlpZiAoYmNtLT5jdXJyZW50X2NvcmUtPnJldiA+PSAzKQorCQlyZXR1cm4gKChiY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfTU1JT19SQURJT19IV0VOQUJMRURfSEkpCisJCQkJCSYgQkNNNDN4eF9NTUlPX1JBRElPX0hXRU5BQkxFRF9ISV9NQVNLKQorCQkJCQk9PSAwKSA/IDEgOiAwOworCWVsc2UKKwkJcmV0dXJuICgoYmNtNDN4eF9yZWFkMTYoYmNtLCBCQ000M3h4X01NSU9fUkFESU9fSFdFTkFCTEVEX0xPKQorCQkJCQkmIEJDTTQzeHhfTU1JT19SQURJT19IV0VOQUJMRURfTE9fTUFTSykKKwkJCQkJPT0gMCkgPyAwIDogMTsKK30KKwogaW50IGJjbTQzeHhfcmFkaW9fc2VsZWN0Y2hhbm5lbChzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20sIHU4IGNoYW5uZWwsCiAJCQkJaW50IHN5bnRoZXRpY19wdV93b3JrYXJvdW5kKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX21haW4uYwppbmRleCAwNGMxOWNlLi45MDc3ZTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX21haW4uYwpAQCAtODQsNyArODQsNyBAQAogCWlmIChzdHJjaHIoZGV2LT5uYW1lLCAnJScpKQogCQlyZXQgPSBkZXZfYWxsb2NfbmFtZShkZXYsIGRldi0+bmFtZSk7CiAKLQlTRVRfTkVUREVWX0RFVihkZXYsIG1kZXYtPmNsYXNzX2Rldi5kZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgbWRldi0+ZGV2LnBhcmVudCk7CiAJaWYgKHJldCA+PSAwKQogCQlyZXQgPSByZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCmluZGV4IDIyY2IzZmIuLmM4NzhhMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKQEAgLTkxNjYsNyArOTE2Niw3IEBACiB7CiAJc3RydWN0IGlwd19wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKHdycXUtPnJ0cy5kaXNhYmxlZCkKKwlpZiAod3JxdS0+cnRzLmRpc2FibGVkIHx8ICF3cnF1LT5ydHMuZml4ZWQpCiAJCXByaXYtPnJ0c190aHJlc2hvbGQgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CiAJZWxzZSB7CiAJCWlmICh3cnF1LT5ydHMudmFsdWUgPCBNSU5fUlRTX1RIUkVTSE9MRCB8fApAQCAtOTI1NSw3ICs5MjU1LDcgQEAKIHsKIAlzdHJ1Y3QgaXB3X3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpZiAod3JxdS0+ZnJhZy5kaXNhYmxlZCkKKwlpZiAod3JxdS0+ZnJhZy5kaXNhYmxlZCB8fCAhd3JxdS0+ZnJhZy5maXhlZCkKIAkJcHJpdi0+aWVlZS0+ZnRzID0gREVGQVVMVF9GVFM7CiAJZWxzZSB7CiAJCWlmICh3cnF1LT5mcmFnLnZhbHVlIDwgTUlOX0ZSQUdfVEhSRVNIT0xEIHx8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmMKaW5kZXggOTM2Yzg4OC4uNGU3ZjZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYwpAQCAtMjA1OSw3ICsyMDU5LDcgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBjb21wX2lkIG5pY19pZCwgc3RhX2lkOwogCXVuc2lnbmVkIGludCBmaXJtdmVyOwotCWNoYXIgdG1wW1NZTUJPTF9NQVhfVkVSX0xFTisxXTsKKwljaGFyIHRtcFtTWU1CT0xfTUFYX1ZFUl9MRU4rMV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyKSkpOwogCiAJLyogR2V0IHRoZSBoYXJkd2FyZSB2ZXJzaW9uICovCiAJZXJyID0gSEVSTUVTX1JFQURfUkVDT1JEKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9OSUNJRCwgJm5pY19pZCk7CkBAIC00MjkzLDggKzQyOTMsOCBAQAogCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCBEUklWRVJfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikgLSAxKTsKIAlzdHJuY3B5KGluZm8tPnZlcnNpb24sIERSSVZFUl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikgLSAxKTsKIAlzdHJuY3B5KGluZm8tPmZ3X3ZlcnNpb24sIHByaXYtPmZ3X25hbWUsIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSAtIDEpOwotCWlmIChkZXYtPmNsYXNzX2Rldi5kZXYpCi0JCXN0cm5jcHkoaW5mby0+YnVzX2luZm8sIGRldi0+Y2xhc3NfZGV2LmRldi0+YnVzX2lkLAorCWlmIChkZXYtPmRldi5wYXJlbnQpCisJCXN0cm5jcHkoaW5mby0+YnVzX2luZm8sIGRldi0+ZGV2LnBhcmVudC0+YnVzX2lkLAogCQkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSAtIDEpOwogCWVsc2UKIAkJc25wcmludGYoaW5mby0+YnVzX2luZm8sIHNpemVvZihpbmZvLT5idXNfaW5mbykgLSAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCmluZGV4IGQwOGFlOGQuLmQxZTUwMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKQEAgLTMzMiw3ICszMzIsNyBAQAogCiAJLyogRmluYWxseSwgcmVwb3J0IHdoYXQgd2UndmUgZG9uZSAqLwogCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBEUklWRVJfTkFNRSAiIGF0ICVzLCBpcnEgJWQsIGlvICIKLQkgICAgICAgIjB4JTA0eC0weCUwNHhcbiIsIGRldi0+bmFtZSwgZGV2LT5jbGFzc19kZXYuZGV2LT5idXNfaWQsCisJICAgICAgICIweCUwNHgtMHglMDR4XG4iLCBkZXYtPm5hbWUsIGRldi0+ZGV2LnBhcmVudC0+YnVzX2lkLAogCSAgICAgICBsaW5rLT5pcnEuQXNzaWduZWRJUlEsIGxpbmstPmlvLkJhc2VQb3J0MSwKIAkgICAgICAgbGluay0+aW8uQmFzZVBvcnQxICsgbGluay0+aW8uTnVtUG9ydHMxIC0gMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKaW5kZXggZjA1N2ZkOS4uYTAzN2IxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC03ODcsNiArNzg4LDE3IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIHZvaWQgaXNscGNpX2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgaXNscGNpX2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyA9IGlzbHBjaV9ldGh0b29sX2dldF9kcnZpbmZvLAorfTsKKwogc3RydWN0IG5ldF9kZXZpY2UgKgogaXNscGNpX3NldHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewpAQCAtODEzLDYgKzgyNSw3IEBACiAJbmRldi0+ZG9faW9jdGwgPSAmcHJpc201NF9pb2N0bDsKIAluZGV2LT53aXJlbGVzc19oYW5kbGVycyA9CiAJICAgIChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikgJnByaXNtNTRfaGFuZGxlcl9kZWY7CisJbmRldi0+ZXRodG9vbF9vcHMgPSAmaXNscGNpX2V0aHRvb2xfb3BzOwogCiAJbmRldi0+aGFyZF9zdGFydF94bWl0ID0gJmlzbHBjaV9ldGhfdHJhbnNtaXQ7CiAJLyogbmRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmlzbHBjaV9zZXRfbXVsdGljYXN0X2xpc3Q7ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCmluZGV4IGE5YWExNjYuLjczNjY2NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCkBAIC0yMTEsNCArMjExLDggQEAKIAogaW50IGlzbHBjaV9mcmVlX21lbW9yeShpc2xwY2lfcHJpdmF0ZSAqKTsKIHN0cnVjdCBuZXRfZGV2aWNlICppc2xwY2lfc2V0dXAoc3RydWN0IHBjaV9kZXYgKik7CisKKyNkZWZpbmUgRFJWX05BTUUJInByaXNtNTQiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjIiCisKICNlbmRpZgkJCQkvKiBfSVNMUENJX0RFVl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMKaW5kZXggNTgyNTdiNC4uM2RjYjEzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYwpAQCAtMjgsOSArMjgsNiBAQAogI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIJCS8qIGZvciBwY19kZWJ1ZyAqLwogI2luY2x1ZGUgImlzbF9vaWQuaCIKIAotI2RlZmluZSBEUlZfTkFNRQkicHJpc201NCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMiIKLQogTU9EVUxFX0FVVEhPUigiW0ludGVyc2lsXSBSLkJhc3RpbmdzIGFuZCBXLlRlcm1vcnNodWl6ZW4sIFRoZSBwcmlzbTU0Lm9yZyBEZXZlbG9wbWVudCBUZWFtIDxwcmlzbTU0LWRldmVsQHByaXNtNTQub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJUaGUgUHJpc201NCA4MDIuMTEgV2lyZWxlc3MgTEFOIGFkYXB0ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3NwZWN0cnVtX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9zcGVjdHJ1bV9jcy5jCmluZGV4IGNmMmQxNDguLmFmNzA0NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3NwZWN0cnVtX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvc3BlY3RydW1fY3MuYwpAQCAtODA2LDcgKzgwNiw3IEBACiAKIAkvKiBGaW5hbGx5LCByZXBvcnQgd2hhdCB3ZSd2ZSBkb25lICovCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIERSSVZFUl9OQU1FICIgYXQgJXMsIGlycSAlZCwgaW8gIgotCSAgICAgICAiMHglMDR4LTB4JTA0eFxuIiwgZGV2LT5uYW1lLCBkZXYtPmNsYXNzX2Rldi5kZXYtPmJ1c19pZCwKKwkgICAgICAgIjB4JTA0eC0weCUwNHhcbiIsIGRldi0+bmFtZSwgZGV2LT5kZXYucGFyZW50LT5idXNfaWQsCiAJICAgICAgIGxpbmstPmlycS5Bc3NpZ25lZElSUSwgbGluay0+aW8uQmFzZVBvcnQxLAogCSAgICAgICBsaW5rLT5pby5CYXNlUG9ydDEgKyBsaW5rLT5pby5OdW1Qb3J0czEgLSAxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5jCmluZGV4IDc4ZWE3MmYuLjEyZGZjMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmMKQEAgLTg0LDYgKzg0LDE4IEBACiAJZGV2X2luZm8oemRfY2hpcF9kZXYoY2hpcCksICIlc1xuIiwgYnVmZmVyKTsKIH0KIAorc3RhdGljIHpkX2FkZHJfdCBpbmNfYWRkcih6ZF9hZGRyX3QgYWRkcikKK3sKKwl1MTYgYSA9ICh1MTYpYWRkcjsKKwkvKiBDb250cm9sIHJlZ2lzdGVycyB1c2UgYnl0ZSBhZGRyZXNzaW5nLCBidXQgZXZlcnl0aGluZyBlbHNlIHVzZXMgd29yZAorCSAqIGFkZHJlc3NpbmcuICovCisJaWYgKChhICYgMHhmMDAwKSA9PSBDUl9TVEFSVCkKKwkJYSArPSAyOworCWVsc2UKKwkJYSArPSAxOworCXJldHVybiAoemRfYWRkcl90KWE7Cit9CisKIC8qIFJlYWQgYSB2YXJpYWJsZSBudW1iZXIgb2YgMzItYml0IHZhbHVlcy4gUGFyYW1ldGVyIGNvdW50IGlzIG5vdCBhbGxvd2VkIHRvCiAgKiBleGNlZWQgVVNCX01BWF9JT1JFQUQzMl9DT1VOVC4KICAqLwpAQCAtMTE0LDcgKzEyNiw3IEBACiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJaW50IGogPSAyKmk7CiAJCS8qIFdlIHJlYWQgdGhlIGhpZ2ggd29yZCBhbHdheXMgZmlyc3QuICovCi0JCWExNltqXSA9IHpkX2luY193b3JkKGFkZHJbaV0pOworCQlhMTZbal0gPSBpbmNfYWRkcihhZGRyW2ldKTsKIAkJYTE2W2orMV0gPSBhZGRyW2ldOwogCX0KIApAQCAtMTYzLDcgKzE3NSw3IEBACiAJCWogPSAyKmk7CiAJCS8qIFdlIHdyaXRlIHRoZSBoaWdoIHdvcmQgYWx3YXlzIGZpcnN0LiAqLwogCQlpb3JlcXMxNltqXS52YWx1ZSAgID0gaW9yZXFzW2ldLnZhbHVlID4+IDE2OwotCQlpb3JlcXMxNltqXS5hZGRyICAgID0gemRfaW5jX3dvcmQoaW9yZXFzW2ldLmFkZHIpOworCQlpb3JlcXMxNltqXS5hZGRyICAgID0gaW5jX2FkZHIoaW9yZXFzW2ldLmFkZHIpOwogCQlpb3JlcXMxNltqKzFdLnZhbHVlID0gaW9yZXFzW2ldLnZhbHVlOwogCQlpb3JlcXMxNltqKzFdLmFkZHIgID0gaW9yZXFzW2ldLmFkZHI7CiAJfQpAQCAtNDY2LDcgKzQ3OCw4IEBACiAKIAlaRF9BU1NFUlQobXV0ZXhfaXNfbG9ja2VkKCZjaGlwLT5tdXRleCkpOwogCWZvciAoaSA9IDA7OykgewotCQlyID0gemRfaW9yZWFkMzJfbG9ja2VkKGNoaXAsICZ2LCBlMnBfYWRkcitpLzIpOworCQlyID0gemRfaW9yZWFkMzJfbG9ja2VkKGNoaXAsICZ2LAorCQkJICAgICAgICAgICAgICAgKHpkX2FkZHJfdCkoKHUxNillMnBfYWRkcitpLzIpKTsKIAkJaWYgKHIpCiAJCQlyZXR1cm4gcjsKIAkJdiAtPSBndWFyZDsKQEAgLTc5OCw0NyArODExLDE4IEBACiBzdGF0aWMgaW50IHpkMTIxMV9od19pbml0X2htYWMoc3RydWN0IHpkX2NoaXAgKmNoaXApCiB7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTMyIGlvcmVxc1tdID0gewotCQl7IENSX0FDS19USU1FT1VUX0VYVCwJCTB4MjAgfSwKLQkJeyBDUl9BRERBX01CSUFTX1dBUk1USU1FLAkweDMwMDAwODA4IH0sCiAJCXsgQ1JfWkQxMjExX1JFVFJZX01BWCwJCTB4MiB9LAotCQl7IENSX1NOSUZGRVJfT04sCQkwIH0sCi0JCXsgQ1JfUlhfRklMVEVSLAkJCVNUQV9SWF9GSUxURVIgfSwKLQkJeyBDUl9HUk9VUF9IQVNIX1AxLAkJMHgwMCB9LAotCQl7IENSX0dST1VQX0hBU0hfUDIsCQkweDgwMDAwMDAwIH0sCi0JCXsgQ1JfUkVHMSwJCQkweGE0IH0sCi0JCXsgQ1JfQUREQV9QV1JfRFdOLAkJMHg3ZiB9LAotCQl7IENSX0JDTl9QTENQX0NGRywJCTB4MDBmMDA0MDEgfSwKLQkJeyBDUl9QSFlfREVMQVksCQkJMHgwMCB9LAotCQl7IENSX0FDS19USU1FT1VUX0VYVCwJCTB4ODAgfSwKLQkJeyBDUl9BRERBX1BXUl9EV04sCQkweDAwIH0sCi0JCXsgQ1JfQUNLX1RJTUVfODAyMTEsCQkweDEwMCB9LAotCQl7IENSX1JYX1BFX0RFTEFZLAkJMHg3MCB9LAotCQl7IENSX1BTX0NUUkwsCQkJMHgxMDAwMDAwMCB9LAotCQl7IENSX1JUU19DVFNfUkFURSwJCTB4MDIwMzAyMDMgfSwKIAkJeyBDUl9SWF9USFJFU0hPTEQsCQkweDAwMGMwNjQwIH0sCi0JCXsgQ1JfQUZURVJfUE5QLAkJCTB4MSB9LAotCQl7IENSX1dFUF9QUk9URUNULAkJMHgxMTQgfSwKIAl9OwogCi0JaW50IHI7Ci0KIAlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksICJcbiIpOwogCVpEX0FTU0VSVChtdXRleF9pc19sb2NrZWQoJmNoaXAtPm11dGV4KSk7Ci0JciA9IHpkX2lvd3JpdGUzMmFfbG9ja2VkKGNoaXAsIGlvcmVxcywgQVJSQVlfU0laRShpb3JlcXMpKTsKLSNpZmRlZiBERUJVRwotCWlmIChyKSB7Ci0JCWRldl9lcnIoemRfY2hpcF9kZXYoY2hpcCksCi0JCQkiZXJyb3IgaW4gemRfaW93cml0ZTMyYV9sb2NrZWQuIEVycm9yIG51bWJlciAlZFxuIiwgcik7Ci0JfQotI2VuZGlmIC8qIERFQlVHICovCi0JcmV0dXJuIHI7CisJcmV0dXJuIHpkX2lvd3JpdGUzMmFfbG9ja2VkKGNoaXAsIGlvcmVxcywgQVJSQVlfU0laRShpb3JlcXMpKTsKIH0KIAogc3RhdGljIGludCB6ZDEyMTFiX2h3X2luaXRfaG1hYyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCkKIHsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHpkX2lvcmVxMzIgaW9yZXFzW10gPSB7Ci0JCXsgQ1JfQUNLX1RJTUVPVVRfRVhULAkJMHgyMCB9LAotCQl7IENSX0FEREFfTUJJQVNfV0FSTVRJTUUsCTB4MzAwMDA4MDggfSwKIAkJeyBDUl9aRDEyMTFCX1JFVFJZX01BWCwJCTB4MDIwMjAyMDIgfSwKIAkJeyBDUl9aRDEyMTFCX1RYX1BXUl9DVEw0LAkweDAwN2YwMDNmIH0sCiAJCXsgQ1JfWkQxMjExQl9UWF9QV1JfQ1RMMywJMHgwMDdmMDAzZiB9LApAQCAtODQ3LDYgKzgzMSwyMCBAQAogCQl7IENSX1pEMTIxMUJfQUlGU19DVEwxLAkJMHgwMDI4MDAyOCB9LAogCQl7IENSX1pEMTIxMUJfQUlGU19DVEwyLAkJMHgwMDhDMDAzQyB9LAogCQl7IENSX1pEMTIxMUJfVFhPUCwJCTB4MDE4MDA4MjQgfSwKKwkJeyBDUl9SWF9USFJFU0hPTEQsCQkweDAwMGMwZWZmLCB9LAorCX07CisKKwlkZXZfZGJnX2YoemRfY2hpcF9kZXYoY2hpcCksICJcbiIpOworCVpEX0FTU0VSVChtdXRleF9pc19sb2NrZWQoJmNoaXAtPm11dGV4KSk7CisJcmV0dXJuIHpkX2lvd3JpdGUzMmFfbG9ja2VkKGNoaXAsIGlvcmVxcywgQVJSQVlfU0laRShpb3JlcXMpKTsKK30KKworc3RhdGljIGludCBod19pbml0X2htYWMoc3RydWN0IHpkX2NoaXAgKmNoaXApCit7CisJaW50IHI7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB6ZF9pb3JlcTMyIGlvcmVxc1tdID0geworCQl7IENSX0FDS19USU1FT1VUX0VYVCwJCTB4MjAgfSwKKwkJeyBDUl9BRERBX01CSUFTX1dBUk1USU1FLAkweDMwMDAwODA4IH0sCiAJCXsgQ1JfU05JRkZFUl9PTiwJCTAgfSwKIAkJeyBDUl9SWF9GSUxURVIsCQkJU1RBX1JYX0ZJTFRFUiB9LAogCQl7IENSX0dST1VQX0hBU0hfUDEsCQkweDAwIH0sCkBAIC04NjEsMjUgKzg1OSwxNiBAQAogCQl7IENSX1JYX1BFX0RFTEFZLAkJMHg3MCB9LAogCQl7IENSX1BTX0NUUkwsCQkJMHgxMDAwMDAwMCB9LAogCQl7IENSX1JUU19DVFNfUkFURSwJCTB4MDIwMzAyMDMgfSwKLQkJeyBDUl9SWF9USFJFU0hPTEQsCQkweDAwMGMwZWZmLCB9LAogCQl7IENSX0FGVEVSX1BOUCwJCQkweDEgfSwKIAkJeyBDUl9XRVBfUFJPVEVDVCwJCTB4MTE0IH0sCisJCXsgQ1JfSUZTX1ZBTFVFLAkJCUlGU19WQUxVRV9ERUZBVUxUIH0sCiAJfTsKIAotCWludCByOwotCi0JZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAiXG4iKTsKIAlaRF9BU1NFUlQobXV0ZXhfaXNfbG9ja2VkKCZjaGlwLT5tdXRleCkpOwogCXIgPSB6ZF9pb3dyaXRlMzJhX2xvY2tlZChjaGlwLCBpb3JlcXMsIEFSUkFZX1NJWkUoaW9yZXFzKSk7Ci0JaWYgKHIpIHsKLQkJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLAotCQkJImVycm9yIGluIHpkX2lvd3JpdGUzMmFfbG9ja2VkLiBFcnJvciBudW1iZXIgJWRcbiIsIHIpOwotCX0KLQlyZXR1cm4gcjsKLX0KKwlpZiAocikKKwkJcmV0dXJuIHI7CiAKLXN0YXRpYyBpbnQgaHdfaW5pdF9obWFjKHN0cnVjdCB6ZF9jaGlwICpjaGlwKQotewogCXJldHVybiBjaGlwLT5pc196ZDEyMTFiID8KIAkJemQxMjExYl9od19pbml0X2htYWMoY2hpcCkgOiB6ZDEyMTFfaHdfaW5pdF9obWFjKGNoaXApOwogfQpAQCAtOTc0LDE2ICs5NjMsMTQgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQkvKiBBbHRob3VnaCB0aGUgdmVuZG9yIGRyaXZlciBkZWZhdWx0cyB0byBhIGRpZmZlcmVudCB2YWx1ZSBkdXJpbmcKLQkgKiBpbml0LCBpdCBvdmVyd3JpdGVzIHRoZSBJRlMgdmFsdWUgd2l0aCB0aGUgZm9sbG93aW5nIGV2ZXJ5IHRpbWUKLQkgKiB0aGUgY2hhbm5lbCBjaGFuZ2VzLiBXZSBzaG91bGQgYWltIHRvIGJlIG1vcmUgaW50ZWxsaWdlbnQuLi4gKi8KLQlyID0gemRfaW93cml0ZTMyX2xvY2tlZChjaGlwLCBJRlNfVkFMVUVfREVGQVVMVCwgQ1JfSUZTX1ZBTFVFKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KIAlyZXR1cm4gc2V0X2JlYWNvbl9pbnRlcnZhbChjaGlwLCAxMDApOwogfQogCitzdGF0aWMgemRfYWRkcl90IGZ3X3JlZ19hZGRyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCB1MTYgb2Zmc2V0KQoreworCXJldHVybiAoemRfYWRkcl90KSgodTE2KWNoaXAtPmZ3X3JlZ3NfYmFzZSArIG9mZnNldCk7Cit9CisKICNpZmRlZiBERUJVRwogc3RhdGljIGludCBkdW1wX2NyKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCBjb25zdCB6ZF9hZGRyX3QgYWRkciwKIAkgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJfc3RyaW5nKQpAQCAtMTAxOCw5ICsxMDA1LDExIEBACiAKIHN0YXRpYyB2b2lkIGR1bXBfZndfcmVnaXN0ZXJzKHN0cnVjdCB6ZF9jaGlwICpjaGlwKQogewotCXN0YXRpYyBjb25zdCB6ZF9hZGRyX3QgYWRkcls0XSA9IHsKLQkJRldfRklSTVdBUkVfVkVSLCBGV19VU0JfU1BFRUQsIEZXX0ZJWF9UWF9SQVRFLAotCQlGV19MSU5LX1NUQVRVUworCWNvbnN0IHpkX2FkZHJfdCBhZGRyWzRdID0geworCQlmd19yZWdfYWRkcihjaGlwLCBGV19SRUdfRklSTVdBUkVfVkVSKSwKKwkJZndfcmVnX2FkZHIoY2hpcCwgRldfUkVHX1VTQl9TUEVFRCksCisJCWZ3X3JlZ19hZGRyKGNoaXAsIEZXX1JFR19GSVhfVFhfUkFURSksCisJCWZ3X3JlZ19hZGRyKGNoaXAsIEZXX1JFR19MRURfTElOS19TVEFUVVMpLAogCX07CiAKIAlpbnQgcjsKQEAgLTEwNDYsNyArMTAzNSw4IEBACiAJaW50IHI7CiAJdTE2IHZlcnNpb247CiAKLQlyID0gemRfaW9yZWFkMTZfbG9ja2VkKGNoaXAsICZ2ZXJzaW9uLCBGV19GSVJNV0FSRV9WRVIpOworCXIgPSB6ZF9pb3JlYWQxNl9sb2NrZWQoY2hpcCwgJnZlcnNpb24sCisJCWZ3X3JlZ19hZGRyKGNoaXAsIEZXX1JFR19GSVJNV0FSRV9WRVIpKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTExMjYsNiArMTExNiwyMiBAQAogCXJldHVybiByOwogfQogCitzdGF0aWMgaW50IHJlYWRfZndfcmVnc19vZmZzZXQoc3RydWN0IHpkX2NoaXAgKmNoaXApCit7CisJaW50IHI7CisKKwlaRF9BU1NFUlQobXV0ZXhfaXNfbG9ja2VkKCZjaGlwLT5tdXRleCkpOworCXIgPSB6ZF9pb3JlYWQxNl9sb2NrZWQoY2hpcCwgKHUxNiopJmNoaXAtPmZ3X3JlZ3NfYmFzZSwKKwkJICAgICAgICAgICAgICAgRldSQVdfUkVHU19BRERSKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJZGV2X2RiZ19mKHpkX2NoaXBfZGV2KGNoaXApLCAiZndfcmVnc19iYXNlOiAlIzA2aHhcbiIsCisJCSAgKHUxNiljaGlwLT5md19yZWdzX2Jhc2UpOworCisJcmV0dXJuIDA7Cit9CisKKwogaW50IHpkX2NoaXBfaW5pdF9odyhzdHJ1Y3QgemRfY2hpcCAqY2hpcCwgdTggZGV2aWNlX3R5cGUpCiB7CiAJaW50IHI7CkBAIC0xMTQ1LDcgKzExNTEsNyBAQAogCWlmIChyKQogCQlnb3RvIG91dDsKIAotCXIgPSB6ZF91c2JfaW5pdF9odygmY2hpcC0+dXNiKTsKKwlyID0gcmVhZF9md19yZWdzX29mZnNldChjaGlwKTsKIAlpZiAocikKIAkJZ290byBvdXQ7CiAKQEAgLTEzMjUsMTUgKzEzMzEsMTUgQEAKIAogaW50IHpkX2NoaXBfY29udHJvbF9sZWRzKHN0cnVjdCB6ZF9jaGlwICpjaGlwLCBlbnVtIGxlZF9zdGF0dXMgc3RhdHVzKQogewotCXN0YXRpYyBjb25zdCB6ZF9hZGRyX3QgYVtdID0gewotCQlGV19MSU5LX1NUQVRVUywKKwljb25zdCB6ZF9hZGRyX3QgYVtdID0geworCQlmd19yZWdfYWRkcihjaGlwLCBGV19SRUdfTEVEX0xJTktfU1RBVFVTKSwKIAkJQ1JfTEVELAogCX07CiAKIAlpbnQgcjsKIAl1MTYgdltBUlJBWV9TSVpFKGEpXTsKIAlzdHJ1Y3QgemRfaW9yZXExNiBpb3JlcXNbQVJSQVlfU0laRShhKV0gPSB7Ci0JCVswXSA9IHsgRldfTElOS19TVEFUVVMgfSwKKwkJWzBdID0geyBmd19yZWdfYWRkcihjaGlwLCBGV19SRUdfTEVEX0xJTktfU1RBVFVTKSB9LAogCQlbMV0gPSB7IENSX0xFRCB9LAogCX07CiAJdTE2IG90aGVyX2xlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2NoaXAuaAppbmRleCBhNGUzY2VlLi5iMDc1NjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9jaGlwLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfY2hpcC5oCkBAIC0xOCw3ICsxOCw2IEBACiAjaWZuZGVmIF9aRF9DSElQX0gKICNkZWZpbmUgX1pEX0NISVBfSAogCi0jaW5jbHVkZSAiemRfdHlwZXMuaCIKICNpbmNsdWRlICJ6ZF9yZi5oIgogI2luY2x1ZGUgInpkX3VzYi5oIgogCkBAIC0yNyw2ICsyNiwzNyBAQAogICogYWRkcyBhIHByb2Nlc3NvciBmb3IgaGFuZGxpbmcgdGhlIFVTQiBwcm90b2NvbC4KICAqLwogCisvKiBBZGRyZXNzIHNwYWNlICovCitlbnVtIHsKKwkvKiBDT05UUk9MIFJFR0lTVEVSUyAqLworCUNSX1NUQVJUCQkJPSAweDkwMDAsCisKKworCS8qIEZJUk1XQVJFICovCisJRldfU1RBUlQJCQk9IDB4ZWUwMCwKKworCisJLyogRUVQUk9NICovCisJRTJQX1NUQVJUCQkJPSAweGY4MDAsCisJRTJQX0xFTgkJCQk9IDB4ODAwLAorCisJLyogRUVQUk9NIGxheW91dCAqLworCUUyUF9MT0FEX0NPREVfTEVOCQk9IDB4ZSwJCS8qIGJhc2UgMHhmODAwICovCisJRTJQX0xPQURfVkVDVF9MRU4JCT0gMHg5LAkJLyogYmFzZSAweGY4MGUgKi8KKwkvKiBFMlBfREFUQSBpbmRleGVzIGludG8gdGhpcyAqLworCUUyUF9EQVRBX0xFTgkJCT0gMHg3ZSwJCS8qIGJhc2UgMHhmODE3ICovCisJRTJQX0JPT1RfQ09ERV9MRU4JCT0gMHg3NjAsCS8qIGJhc2UgMHhmODk1ICovCisJRTJQX0lOVFJfVkVDVF9MRU4JCT0gMHhiLAkJLyogYmFzZSAweGZmZjUgKi8KKworCS8qIFNvbWUgcHJlY29tcHV0ZWQgb2Zmc2V0cyBpbnRvIHRoZSBFRVBST00gKi8KKwlFMlBfREFUQV9PRkZTRVQJCQk9IEUyUF9MT0FEX0NPREVfTEVOICsgRTJQX0xPQURfVkVDVF9MRU4sCisJRTJQX0JPT1RfQ09ERV9PRkZTRVQJCT0gRTJQX0RBVEFfT0ZGU0VUICsgRTJQX0RBVEFfTEVOLAorfTsKKworI2RlZmluZSBDVExfUkVHKG9mZnNldCkgKCh6ZF9hZGRyX3QpKENSX1NUQVJUICsgKG9mZnNldCkpKQorI2RlZmluZSBFMlBfREFUQShvZmZzZXQpICgoemRfYWRkcl90KShFMlBfU1RBUlQgKyBFMlBfREFUQV9PRkZTRVQgKyAob2Zmc2V0KSkpCisjZGVmaW5lIEZXUkFXX0RBVEEob2Zmc2V0KSAoKHpkX2FkZHJfdCkoRldfU1RBUlQgKyAob2Zmc2V0KSkpCisKIC8qIDgtYml0IGhhcmR3YXJlIHJlZ2lzdGVycyAqLwogI2RlZmluZSBDUjAgICBDVExfUkVHKDB4MDAwMCkKICNkZWZpbmUgQ1IxICAgQ1RMX1JFRygweDAwMDQpCkBAIC0zMDIsNyArMzMyLDcgQEAKIAogI2RlZmluZSBDUl9NQVhfUEhZX1JFRyAyNTUKIAotLyogVGFrZW4gZnJvbSB0aGUgWllEQVMgZHJpdmVyLCBub3QgYWxsIG9mIHRoZW0gYXJlIHJlbGV2YW50IGZvciB0aGUgWlNEMTIxMQorLyogVGFrZW4gZnJvbSB0aGUgWllEQVMgZHJpdmVyLCBub3QgYWxsIG9mIHRoZW0gYXJlIHJlbGV2YW50IGZvciB0aGUgWkQxMjExCiAgKiBkcml2ZXIuCiAgKi8KIApAQCAtNTk0LDgxICs2MjQsNzEgQEAKIC8qCiAgKiBVcHBlciAxNiBiaXQgY29udGFpbnMgdGhlIHJlZ3VsYXRvcnkgZG9tYWluLgogICovCi0jZGVmaW5lIEUyUF9TVUJJRAkJRTJQX1JFRygweDAwKQotI2RlZmluZSBFMlBfUE9ECQkJRTJQX1JFRygweDAyKQotI2RlZmluZSBFMlBfTUFDX0FERFJfUDEJCUUyUF9SRUcoMHgwNCkKLSNkZWZpbmUgRTJQX01BQ19BRERSX1AyCQlFMlBfUkVHKDB4MDYpCi0jZGVmaW5lIEUyUF9QV1JfQ0FMX1ZBTFVFMQlFMlBfUkVHKDB4MDgpCi0jZGVmaW5lIEUyUF9QV1JfQ0FMX1ZBTFVFMglFMlBfUkVHKDB4MGEpCi0jZGVmaW5lIEUyUF9QV1JfQ0FMX1ZBTFVFMwlFMlBfUkVHKDB4MGMpCi0jZGVmaW5lIEUyUF9QV1JfQ0FMX1ZBTFVFNCAgICAgIEUyUF9SRUcoMHgwZSkKLSNkZWZpbmUgRTJQX1BXUl9JTlRfVkFMVUUxCUUyUF9SRUcoMHgxMCkKLSNkZWZpbmUgRTJQX1BXUl9JTlRfVkFMVUUyCUUyUF9SRUcoMHgxMikKLSNkZWZpbmUgRTJQX1BXUl9JTlRfVkFMVUUzCUUyUF9SRUcoMHgxNCkKLSNkZWZpbmUgRTJQX1BXUl9JTlRfVkFMVUU0CUUyUF9SRUcoMHgxNikKKyNkZWZpbmUgRTJQX1NVQklECQlFMlBfREFUQSgweDAwKQorI2RlZmluZSBFMlBfUE9ECQkJRTJQX0RBVEEoMHgwMikKKyNkZWZpbmUgRTJQX01BQ19BRERSX1AxCQlFMlBfREFUQSgweDA0KQorI2RlZmluZSBFMlBfTUFDX0FERFJfUDIJCUUyUF9EQVRBKDB4MDYpCisjZGVmaW5lIEUyUF9QV1JfQ0FMX1ZBTFVFMQlFMlBfREFUQSgweDA4KQorI2RlZmluZSBFMlBfUFdSX0NBTF9WQUxVRTIJRTJQX0RBVEEoMHgwYSkKKyNkZWZpbmUgRTJQX1BXUl9DQUxfVkFMVUUzCUUyUF9EQVRBKDB4MGMpCisjZGVmaW5lIEUyUF9QV1JfQ0FMX1ZBTFVFNCAgICAgIEUyUF9EQVRBKDB4MGUpCisjZGVmaW5lIEUyUF9QV1JfSU5UX1ZBTFVFMQlFMlBfREFUQSgweDEwKQorI2RlZmluZSBFMlBfUFdSX0lOVF9WQUxVRTIJRTJQX0RBVEEoMHgxMikKKyNkZWZpbmUgRTJQX1BXUl9JTlRfVkFMVUUzCUUyUF9EQVRBKDB4MTQpCisjZGVmaW5lIEUyUF9QV1JfSU5UX1ZBTFVFNAlFMlBfREFUQSgweDE2KQogCiAvKiBDb250YWlucyBhIGJpdCBmb3IgZWFjaCBhbGxvd2VkIGNoYW5uZWwuIEl0IGdpdmVzIGZvciBFdXJvcGUgKEVUU0kgMHgzMCkKICAqIGFsc28gb25seSAxMSBjaGFubmVscy4gKi8KLSNkZWZpbmUgRTJQX0FMTE9XRURfQ0hBTk5FTAlFMlBfUkVHKDB4MTgpCisjZGVmaW5lIEUyUF9BTExPV0VEX0NIQU5ORUwJRTJQX0RBVEEoMHgxOCkKIAotI2RlZmluZSBFMlBfUEhZX1JFRwkJRTJQX1JFRygweDFhKQotI2RlZmluZSBFMlBfREVWSUNFX1ZFUgkJRTJQX1JFRygweDIwKQotI2RlZmluZSBFMlBfMzZNX0NBTF9WQUxVRTEJRTJQX1JFRygweDI4KQotI2RlZmluZSBFMlBfMzZNX0NBTF9WQUxVRTIgICAgICBFMlBfUkVHKDB4MmEpCi0jZGVmaW5lIEUyUF8zNk1fQ0FMX1ZBTFVFMyAgICAgIEUyUF9SRUcoMHgyYykKLSNkZWZpbmUgRTJQXzM2TV9DQUxfVkFMVUU0CUUyUF9SRUcoMHgyZSkKLSNkZWZpbmUgRTJQXzExQV9JTlRfVkFMVUUxCUUyUF9SRUcoMHgzMCkKLSNkZWZpbmUgRTJQXzExQV9JTlRfVkFMVUUyCUUyUF9SRUcoMHgzMikKLSNkZWZpbmUgRTJQXzExQV9JTlRfVkFMVUUzCUUyUF9SRUcoMHgzNCkKLSNkZWZpbmUgRTJQXzExQV9JTlRfVkFMVUU0CUUyUF9SRUcoMHgzNikKLSNkZWZpbmUgRTJQXzQ4TV9DQUxfVkFMVUUxCUUyUF9SRUcoMHgzOCkKLSNkZWZpbmUgRTJQXzQ4TV9DQUxfVkFMVUUyCUUyUF9SRUcoMHgzYSkKLSNkZWZpbmUgRTJQXzQ4TV9DQUxfVkFMVUUzCUUyUF9SRUcoMHgzYykKLSNkZWZpbmUgRTJQXzQ4TV9DQUxfVkFMVUU0CUUyUF9SRUcoMHgzZSkKLSNkZWZpbmUgRTJQXzQ4TV9JTlRfVkFMVUUxCUUyUF9SRUcoMHg0MCkKLSNkZWZpbmUgRTJQXzQ4TV9JTlRfVkFMVUUyCUUyUF9SRUcoMHg0MikKLSNkZWZpbmUgRTJQXzQ4TV9JTlRfVkFMVUUzCUUyUF9SRUcoMHg0NCkKLSNkZWZpbmUgRTJQXzQ4TV9JTlRfVkFMVUU0CUUyUF9SRUcoMHg0NikKLSNkZWZpbmUgRTJQXzU0TV9DQUxfVkFMVUUxCUUyUF9SRUcoMHg0OCkJLyogPz8/ICovCi0jZGVmaW5lIEUyUF81NE1fQ0FMX1ZBTFVFMglFMlBfUkVHKDB4NGEpCi0jZGVmaW5lIEUyUF81NE1fQ0FMX1ZBTFVFMwlFMlBfUkVHKDB4NGMpCi0jZGVmaW5lIEUyUF81NE1fQ0FMX1ZBTFVFNAlFMlBfUkVHKDB4NGUpCi0jZGVmaW5lIEUyUF81NE1fSU5UX1ZBTFVFMQlFMlBfUkVHKDB4NTApCi0jZGVmaW5lIEUyUF81NE1fSU5UX1ZBTFVFMglFMlBfUkVHKDB4NTIpCi0jZGVmaW5lIEUyUF81NE1fSU5UX1ZBTFVFMwlFMlBfUkVHKDB4NTQpCi0jZGVmaW5lIEUyUF81NE1fSU5UX1ZBTFVFNAlFMlBfUkVHKDB4NTYpCisjZGVmaW5lIEUyUF9QSFlfUkVHCQlFMlBfREFUQSgweDFhKQorI2RlZmluZSBFMlBfREVWSUNFX1ZFUgkJRTJQX0RBVEEoMHgyMCkKKyNkZWZpbmUgRTJQXzM2TV9DQUxfVkFMVUUxCUUyUF9EQVRBKDB4MjgpCisjZGVmaW5lIEUyUF8zNk1fQ0FMX1ZBTFVFMiAgICAgIEUyUF9EQVRBKDB4MmEpCisjZGVmaW5lIEUyUF8zNk1fQ0FMX1ZBTFVFMyAgICAgIEUyUF9EQVRBKDB4MmMpCisjZGVmaW5lIEUyUF8zNk1fQ0FMX1ZBTFVFNAlFMlBfREFUQSgweDJlKQorI2RlZmluZSBFMlBfMTFBX0lOVF9WQUxVRTEJRTJQX0RBVEEoMHgzMCkKKyNkZWZpbmUgRTJQXzExQV9JTlRfVkFMVUUyCUUyUF9EQVRBKDB4MzIpCisjZGVmaW5lIEUyUF8xMUFfSU5UX1ZBTFVFMwlFMlBfREFUQSgweDM0KQorI2RlZmluZSBFMlBfMTFBX0lOVF9WQUxVRTQJRTJQX0RBVEEoMHgzNikKKyNkZWZpbmUgRTJQXzQ4TV9DQUxfVkFMVUUxCUUyUF9EQVRBKDB4MzgpCisjZGVmaW5lIEUyUF80OE1fQ0FMX1ZBTFVFMglFMlBfREFUQSgweDNhKQorI2RlZmluZSBFMlBfNDhNX0NBTF9WQUxVRTMJRTJQX0RBVEEoMHgzYykKKyNkZWZpbmUgRTJQXzQ4TV9DQUxfVkFMVUU0CUUyUF9EQVRBKDB4M2UpCisjZGVmaW5lIEUyUF80OE1fSU5UX1ZBTFVFMQlFMlBfREFUQSgweDQwKQorI2RlZmluZSBFMlBfNDhNX0lOVF9WQUxVRTIJRTJQX0RBVEEoMHg0MikKKyNkZWZpbmUgRTJQXzQ4TV9JTlRfVkFMVUUzCUUyUF9EQVRBKDB4NDQpCisjZGVmaW5lIEUyUF80OE1fSU5UX1ZBTFVFNAlFMlBfREFUQSgweDQ2KQorI2RlZmluZSBFMlBfNTRNX0NBTF9WQUxVRTEJRTJQX0RBVEEoMHg0OCkJLyogPz8/ICovCisjZGVmaW5lIEUyUF81NE1fQ0FMX1ZBTFVFMglFMlBfREFUQSgweDRhKQorI2RlZmluZSBFMlBfNTRNX0NBTF9WQUxVRTMJRTJQX0RBVEEoMHg0YykKKyNkZWZpbmUgRTJQXzU0TV9DQUxfVkFMVUU0CUUyUF9EQVRBKDB4NGUpCisjZGVmaW5lIEUyUF81NE1fSU5UX1ZBTFVFMQlFMlBfREFUQSgweDUwKQorI2RlZmluZSBFMlBfNTRNX0lOVF9WQUxVRTIJRTJQX0RBVEEoMHg1MikKKyNkZWZpbmUgRTJQXzU0TV9JTlRfVkFMVUUzCUUyUF9EQVRBKDB4NTQpCisjZGVmaW5lIEUyUF81NE1fSU5UX1ZBTFVFNAlFMlBfREFUQSgweDU2KQogCi0vKiBBbGwgMTYgYml0IHZhbHVlcyAqLwotI2RlZmluZSBGV19GSVJNV0FSRV9WRVIgICAgICAgICBGV19SRUcoMCkKLS8qIG5vbi16ZXJvIGlmIFVTQiBoaWdoIHNwZWVkIGNvbm5lY3Rpb24gKi8KLSNkZWZpbmUgRldfVVNCX1NQRUVEICAgICAgICAgICAgRldfUkVHKDEpCi0jZGVmaW5lIEZXX0ZJWF9UWF9SQVRFICAgICAgICAgIEZXX1JFRygyKQotLyogU2VlbXMgdG8gYmUgYWJsZSB0byBjb250cm9sIExFRHMgb3ZlciB0aGUgZmlybXdhcmUgKi8KLSNkZWZpbmUgRldfTElOS19TVEFUVVMgICAgICAgICAgRldfUkVHKDMpCi0jZGVmaW5lIEZXX1NPRlRfUkVTRVQgICAgICAgICAgIEZXX1JFRyg0KQotI2RlZmluZSBGV19GTEFTSF9DSEsgICAgICAgICAgICBGV19SRUcoNSkKKy8qIFRoaXMgd29yZCBjb250YWlucyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBGV19SRUdfIHJlZ2lzdGVycyBiZWxvdyAqLworI2RlZmluZSBGV1JBV19SRUdTX0FERFIJCUZXUkFXX0RBVEEoMHgxZCkKIAorLyogQWxsIDE2IGJpdCB2YWx1ZXMsIG9mZnNldCBmcm9tIHRoZSBhZGRyZXNzIGluIEZXUkFXX1JFR1NfQUREUiAqLworZW51bSB7CisJRldfUkVHX0ZJUk1XQVJFX1ZFUgk9IDAsCisJLyogbm9uLXplcm8gaWYgVVNCIGhpZ2ggc3BlZWQgY29ubmVjdGlvbiAqLworCUZXX1JFR19VU0JfU1BFRUQJPSAxLAorCUZXX1JFR19GSVhfVFhfUkFURQk9IDIsCisJLyogU2VlbXMgdG8gYmUgYWJsZSB0byBjb250cm9sIExFRHMgb3ZlciB0aGUgZmlybXdhcmUgKi8KKwlGV19SRUdfTEVEX0xJTktfU1RBVFVTCT0gMywKKwlGV19SRUdfU09GVF9SRVNFVAk9IDQsCisJRldfUkVHX0ZMQVNIX0NISwk9IDUsCit9OworCisvKiBWYWx1ZXMgZm9yIEZXX0xJTktfU1RBVFVTICovCiAjZGVmaW5lIEZXX0xJTktfT0ZGCQkweDAKICNkZWZpbmUgRldfTElOS19UWAkJMHgxCiAvKiAweDIgLSBsaW5rIGxlZCBvbj8gKi8KIAogZW51bSB7Ci0JQ1JfQkFTRV9PRkZTRVQJCQk9IDB4OTAwMCwKLQlGV19TVEFSVF9PRkZTRVQJCQk9IDB4ZWUwMCwKLQlGV19CQVNFX0FERFJfT0ZGU0VUCQk9IEZXX1NUQVJUX09GRlNFVCArIDB4MWQsCi0JRUVQUk9NX1NUQVJUX09GRlNFVAkJPSAweGY4MDAsCi0JRUVQUk9NX1NJWkUJCQk9IDB4ODAwLCAvKiB3b3JkcyAqLwotCUxPQURfQ09ERV9TSVpFCQkJPSAweGUsIC8qIHdvcmRzICovCi0JTE9BRF9WRUNUX1NJWkUJCQk9IDB4MTAwMDAgLSAweGZmZjcsIC8qIHdvcmRzICovCi0JRUVQUk9NX1JFR1NfT0ZGU0VUCQk9IExPQURfQ09ERV9TSVpFICsgTE9BRF9WRUNUX1NJWkUsCi0JRUVQUk9NX1JFR1NfU0laRQkJPSAweDdlLCAvKiB3b3JkcyAqLwotCUUyUF9CQVNFX09GRlNFVAkJCT0gRUVQUk9NX1NUQVJUX09GRlNFVCArCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgRUVQUk9NX1JFR1NfT0ZGU0VULAotfTsKLQotI2RlZmluZSBGV19SRUdfVEFCTEVfQUREUglVU0JfQUREUihGV19TVEFSVF9PRkZTRVQgKyAweDFkKQotCi1lbnVtIHsKIAkvKiBpbmRpY2VzIGZvciBvZmRtX2NhbF92YWx1ZXMgKi8KIAlPRkRNXzM2TV9JTkRFWCA9IDAsCiAJT0ZETV80OE1fSU5ERVggPSAxLApAQCAtNjc5LDYgKzY5OSw4IEBACiAJc3RydWN0IHpkX3VzYiB1c2I7CiAJc3RydWN0IHpkX3JmIHJmOwogCXN0cnVjdCBtdXRleCBtdXRleDsKKwkvKiBCYXNlIGFkZHJlc3Mgb2YgRldfUkVHXyByZWdpc3RlcnMgKi8KKwl6ZF9hZGRyX3QgZndfcmVnc19iYXNlOwogCXU4IGUycF9tYWNbRVRIX0FMRU5dOwogCS8qIEVlcFNldFBvaW50IGluIHRoZSB2ZW5kb3IgZHJpdmVyICovCiAJdTggcHdyX2NhbF92YWx1ZXNbRTJQX0NIQU5ORUxfQ09VTlRdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfZGVmLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9kZWYuaAppbmRleCBmYjIyZjYyLi5kZWI5OWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9kZWYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9kZWYuaApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogCit0eXBlZGVmIHUxNiBfX25vY2FzdCB6ZF9hZGRyX3Q7CisKICNkZWZpbmUgZGV2X3ByaW50a19mKGxldmVsLCBkZXYsIGZtdCwgYXJncy4uLikgXAogCWRldl9wcmludGsobGV2ZWwsIGRldiwgIiVzKCkgIiBmbXQsIF9fZnVuY19fLCAjI2FyZ3MpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX2llZWU4MDIxMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfaWVlZTgwMjExLmgKaW5kZXggMjZiODI5OC4uYzRmMzZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfaWVlZTgwMjExLmgKQEAgLTIsNyArMiw2IEBACiAjZGVmaW5lIF9aRF9JRUVFODAyMTFfSAogCiAjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgInpkX3R5cGVzLmgiCiAKIC8qIEFkZGl0aW9uYWwgZGVmaW5pdGlvbnMgZnJvbSB0aGUgc3RhbmRhcmRzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfcmYuaAppbmRleCA2NzZiMzczLi5hNTc3MzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF9yZi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3JmLmgKQEAgLTE4LDggKzE4LDYgQEAKICNpZm5kZWYgX1pEX1JGX0gKICNkZWZpbmUgX1pEX1JGX0gKIAotI2luY2x1ZGUgInpkX3R5cGVzLmgiCi0KICNkZWZpbmUgVVcyNDUxX1JGCQkJMHgyCiAjZGVmaW5lIFVDSElQX1JGCQkJMHgzCiAjZGVmaW5lIEFMMjIzMF9SRgkJCTB4NApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdHlwZXMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTVhMTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIHpkX3R5cGVzLmgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLSNpZm5kZWYgX1pEX1RZUEVTX0gKLSNkZWZpbmUgX1pEX1RZUEVTX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLS8qIFdlIGhhdmUgdGhyZWUgcmVnaXN0ZXIgc3BhY2VzIG1hcHBlZCBpbnRvIHRoZSBvdmVyYWxsIFVTQiBhZGRyZXNzIHNwYWNlIG9mCi0gKiA2NEsgd29yZHMgKDE2LWJpdCB2YWx1ZXMpLiBUaGVyZSBpcyB0aGUgY29udHJvbCByZWdpc3RlciBzcGFjZSBvZgotICogZG91YmxlLXdvcmQgcmVnaXN0ZXJzLCB0aGUgZWVwcm9tIHJlZ2lzdGVyIHNwYWNlIGFuZCB0aGUgZmlybXdhcmUgcmVnaXN0ZXIKLSAqIHNwYWNlLiBUaGUgY29udHJvbCByZWdpc3RlciBzcGFjZSBpcyBieXRlIG1hcHBlZCwgdGhlIG90aGVycyBhcmUgd29yZAotICogbWFwcGVkLgotICoKLSAqIEZvciB0aGF0IHJlYXNvbiwgd2UgYXJlIHVzaW5nIGJ5dGUgb2Zmc2V0cyBmb3IgY29udHJvbCByZWdpc3RlcnMgYW5kIHdvcmQKLSAqIG9mZnNldHMgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KLSAqLwotCi10eXBlZGVmIHUzMiBfX25vY2FzdCB6ZF9hZGRyX3Q7Ci0KLWVudW0gewotCUFERFJfQkFTRV9NQVNLCQk9IDB4ZmYwMDAwMDAsCi0JQUREUl9PRkZTRVRfTUFTSwk9IDB4MDAwMGZmZmYsCi0JQUREUl9aRVJPX01BU0sJCT0gMHgwMGZmMDAwMCwKLQlOVUxMX0JBU0UJCT0gMHgwMDAwMDAwMCwKLQlVU0JfQkFTRQkJPSAweDAxMDAwMDAwLAotCUNSX0JBU0UJCQk9IDB4MDIwMDAwMDAsCi0JQ1JfTUFYX09GRlNFVAkJPSAweDBiMzAsCi0JRTJQX0JBU0UJCT0gMHgwMzAwMDAwMCwKLQlFMlBfTUFYX09GRlNFVAkJPSAweDAwN2UsCi0JRldfQkFTRQkJCT0gMHgwNDAwMDAwMCwKLQlGV19NQVhfT0ZGU0VUCQk9IDB4MDAwNSwKLX07Ci0KLSNkZWZpbmUgWkRfQUREUl9CQVNFKGFkZHIpICgodTMyKShhZGRyKSAmIEFERFJfQkFTRV9NQVNLKQotI2RlZmluZSBaRF9PRkZTRVQoYWRkcikgKCh1MzIpKGFkZHIpICYgQUREUl9PRkZTRVRfTUFTSykKLQotI2RlZmluZSBaRF9BRERSKGJhc2UsIG9mZnNldCkgXAotCSgoemRfYWRkcl90KSgoKGJhc2UpICYgQUREUl9CQVNFX01BU0spIHwgKChvZmZzZXQpICYgQUREUl9PRkZTRVRfTUFTSykpKQotCi0jZGVmaW5lIFpEX05VTExfQUREUiAgICAoKHpkX2FkZHJfdCkwKQotI2RlZmluZSBVU0JfUkVHKG9mZnNldCkgIFpEX0FERFIoVVNCX0JBU0UsIG9mZnNldCkJLyogd29yZCBhZGRyZXNzaW5nICovCi0jZGVmaW5lIENUTF9SRUcob2Zmc2V0KSAgWkRfQUREUihDUl9CQVNFLCBvZmZzZXQpCS8qIGJ5dGUgYWRkcmVzc2luZyAqLwotI2RlZmluZSBFMlBfUkVHKG9mZnNldCkgIFpEX0FERFIoRTJQX0JBU0UsIG9mZnNldCkJLyogd29yZCBhZGRyZXNzaW5nICovCi0jZGVmaW5lIEZXX1JFRyhvZmZzZXQpICAgWkRfQUREUihGV19CQVNFLCBvZmZzZXQpCS8qIHdvcmQgYWRkcmVzc2luZyAqLwotCi1zdGF0aWMgaW5saW5lIHpkX2FkZHJfdCB6ZF9pbmNfd29yZCh6ZF9hZGRyX3QgYWRkcikKLXsKLQl1MzIgYmFzZSA9IFpEX0FERFJfQkFTRShhZGRyKTsKLQl1MzIgb2Zmc2V0ID0gWkRfT0ZGU0VUKGFkZHIpOwotCi0Jb2Zmc2V0ICs9IGJhc2UgPT0gQ1JfQkFTRSA/IDIgOiAxOwotCi0JcmV0dXJuIGJhc2UgfCBvZmZzZXQ7Ci19Ci0KLSNlbmRpZiAvKiBfWkRfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvemRfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwppbmRleCA2MDVlOTZlLi43NWVmNTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuYwpAQCAtNTgsNiArNTgsMTAgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNzliLCAweDAwNjIpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAogCXsgVVNCX0RFVklDRSgweDE1ODIsIDB4NjAwMyksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCiAJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHg3MDVjKSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwODNhLCAweDQ1MDUpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAorCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MTIzNiksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9aRDEyMTFCIH0sCisJeyBVU0JfREVWSUNFKDB4MTNiMSwgMHgwMDI0KSwgLmRyaXZlcl9pbmZvID0gREVWSUNFX1pEMTIxMUIgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTg2LCAweDM0MGYpLCAuZHJpdmVyX2luZm8gPSBERVZJQ0VfWkQxMjExQiB9LAogCS8qICJEcml2ZXJsZXNzIiBkZXZpY2VzIHRoYXQgbmVlZCBlamVjdGluZyAqLwogCXsgVVNCX0RFVklDRSgweDBhY2UsIDB4MjAxMSksIC5kcml2ZXJfaW5mbyA9IERFVklDRV9JTlNUQUxMRVIgfSwKIAl7fQpAQCAtNzMsOTYgKzc3LDYgQEAKICNkZWZpbmUgRldfWkQxMjExX1BSRUZJWAkiemQxMjExL3pkMTIxMV8iCiAjZGVmaW5lIEZXX1pEMTIxMUJfUFJFRklYCSJ6ZDEyMTEvemQxMjExYl8iCiAKLS8qIHJlZ2lzdGVyIGFkZHJlc3MgaGFuZGxpbmcgKi8KLQotI2lmZGVmIERFQlVHCi1zdGF0aWMgaW50IGNoZWNrX2FkZHIoc3RydWN0IHpkX3VzYiAqdXNiLCB6ZF9hZGRyX3QgYWRkcikKLXsKLQl1MzIgYmFzZSA9IFpEX0FERFJfQkFTRShhZGRyKTsKLQl1MzIgb2Zmc2V0ID0gWkRfT0ZGU0VUKGFkZHIpOwotCi0JaWYgKCh1MzIpYWRkciAmIEFERFJfWkVST19NQVNLKQotCQlnb3RvIGludmFsaWRfYWRkcmVzczsKLQlzd2l0Y2ggKGJhc2UpIHsKLQljYXNlIFVTQl9CQVNFOgotCQlicmVhazsKLQljYXNlIENSX0JBU0U6Ci0JCWlmIChvZmZzZXQgPiBDUl9NQVhfT0ZGU0VUKSB7Ci0JCQlkZXZfZGJnKHpkX3VzYl9kZXYodXNiKSwKLQkJCQkiQ1Igb2Zmc2V0ICUjMDEweCBsYXJnZXIgdGhhbiIKLQkJCQkiIENSX01BWF9PRkZTRVQgJSMxMHhcbiIsCi0JCQkJb2Zmc2V0LCBDUl9NQVhfT0ZGU0VUKTsKLQkJCWdvdG8gaW52YWxpZF9hZGRyZXNzOwotCQl9Ci0JCWlmIChvZmZzZXQgJiAxKSB7Ci0JCQlkZXZfZGJnKHpkX3VzYl9kZXYodXNiKSwKLQkJCQkiQ1Igb2Zmc2V0ICUjMDEweCBpcyBub3QgYSBtdWx0aXBsZSBvZiAyXG4iLAotCQkJCW9mZnNldCk7Ci0JCQlnb3RvIGludmFsaWRfYWRkcmVzczsKLQkJfQotCQlicmVhazsKLQljYXNlIEUyUF9CQVNFOgotCQlpZiAob2Zmc2V0ID4gRTJQX01BWF9PRkZTRVQpIHsKLQkJCWRldl9kYmcoemRfdXNiX2Rldih1c2IpLAotCQkJCSJFMlAgb2Zmc2V0ICUjMDEweCBsYXJnZXIgdGhhbiIKLQkJCQkiIEUyUF9NQVhfT0ZGU0VUICUjMDEweFxuIiwKLQkJCQlvZmZzZXQsIEUyUF9NQVhfT0ZGU0VUKTsKLQkJCWdvdG8gaW52YWxpZF9hZGRyZXNzOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgRldfQkFTRToKLQkJaWYgKCF1c2ItPmZ3X2Jhc2Vfb2Zmc2V0KSB7Ci0JCQlkZXZfZGJnKHpkX3VzYl9kZXYodXNiKSwKLQkJCSAgICAgICAiRVJST1I6IGZ3IGJhc2Ugb2Zmc2V0IGhhcyBub3QgYmVlbiBzZXRcbiIpOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQkJaWYgKG9mZnNldCA+IEZXX01BWF9PRkZTRVQpIHsKLQkJCWRldl9kYmcoemRfdXNiX2Rldih1c2IpLAotCQkJCSJGVyBvZmZzZXQgJSMxMHggaXMgbGFyZ2VyIHRoYW4iCi0JCQkJIiBGV19NQVhfT0ZGU0VUICUjMDEweFxuIiwKLQkJCQlvZmZzZXQsIEZXX01BWF9PRkZTRVQpOwotCQkJZ290byBpbnZhbGlkX2FkZHJlc3M7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2RiZyh6ZF91c2JfZGV2KHVzYiksCi0JCQkiYWRkcmVzcyBoYXMgdW5zdXBwb3J0ZWQgYmFzZSAlIzAxMHhcbiIsIGFkZHIpOwotCQlnb3RvIGludmFsaWRfYWRkcmVzczsKLQl9Ci0KLQlyZXR1cm4gMDsKLWludmFsaWRfYWRkcmVzczoKLQlkZXZfZGJnKHpkX3VzYl9kZXYodXNiKSwKLQkJIkVSUk9SOiBpbnZhbGlkIGFkZHJlc3M6ICUjMDEweFxuIiwgYWRkcik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotc3RhdGljIHUxNiB1c2JfYWRkcihzdHJ1Y3QgemRfdXNiICp1c2IsIHpkX2FkZHJfdCBhZGRyKQotewotCXUzMiBiYXNlOwotCXUxNiBvZmZzZXQ7Ci0KLQliYXNlID0gWkRfQUREUl9CQVNFKGFkZHIpOwotCW9mZnNldCA9IFpEX09GRlNFVChhZGRyKTsKLQotCVpEX0FTU0VSVChjaGVja19hZGRyKHVzYiwgYWRkcikgPT0gMCk7Ci0KLQlzd2l0Y2ggKGJhc2UpIHsKLQljYXNlIENSX0JBU0U6Ci0JCW9mZnNldCArPSBDUl9CQVNFX09GRlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSBFMlBfQkFTRToKLQkJb2Zmc2V0ICs9IEUyUF9CQVNFX09GRlNFVDsKLQkJYnJlYWs7Ci0JY2FzZSBGV19CQVNFOgotCQlvZmZzZXQgKz0gdXNiLT5md19iYXNlX29mZnNldDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIG9mZnNldDsKLX0KLQogLyogVVNCIGRldmljZSBpbml0aWFsaXphdGlvbiAqLwogCiBzdGF0aWMgaW50IHJlcXVlc3RfZndfZmlsZSgKQEAgLTI5NSwxNCArMjA5LDEzIEBACiAJaWYgKHIpCiAJCWdvdG8gZXJyb3I7CiAKLQlyID0gdXBsb2FkX2NvZGUodWRldiwgdXJfZnctPmRhdGEsIHVyX2Z3LT5zaXplLCBGV19TVEFSVF9PRkZTRVQsCi0JCVJFQk9PVCk7CisJciA9IHVwbG9hZF9jb2RlKHVkZXYsIHVyX2Z3LT5kYXRhLCB1cl9mdy0+c2l6ZSwgRldfU1RBUlQsIFJFQk9PVCk7CiAJaWYgKHIpCiAJCWdvdG8gZXJyb3I7CiAKLQlvZmZzZXQgPSAoKEVFUFJPTV9SRUdTX09GRlNFVCArIEVFUFJPTV9SRUdTX1NJWkUpICogc2l6ZW9mKHUxNikpOworCW9mZnNldCA9IChFMlBfQk9PVF9DT0RFX09GRlNFVCAqIHNpemVvZih1MTYpKTsKIAlyID0gdXBsb2FkX2NvZGUodWRldiwgdWJfZnctPmRhdGEgKyBvZmZzZXQsIHViX2Z3LT5zaXplIC0gb2Zmc2V0LAotCQlFMlBfQkFTRV9PRkZTRVQgKyBFRVBST01fUkVHU19TSVpFLCBSRUJPT1QpOworCQlFMlBfU1RBUlQgKyBFMlBfQk9PVF9DT0RFX09GRlNFVCwgUkVCT09UKTsKIAogCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSB2ZW5kb3IgZHJpdmVyIGRvd25sb2FkcyB0aGUgd2hvbGUgZmlybXdhcmUKIAkgKiBpbWFnZSwgaGFja3MgYXJvdW5kIHdpdGggdmVyc2lvbiBJRHMsIGFuZCB1cGxvYWRzIGl0IGFnYWluLApAQCAtMzMxLDcgKzI0NCw3IEBACiAJaWYgKHIpCiAJCWdvdG8gZXJyb3I7CiAKLQlmd19iY2REZXZpY2UgPSBnZXRfd29yZCh1Yl9mdy0+ZGF0YSwgRUVQUk9NX1JFR1NfT0ZGU0VUKTsKKwlmd19iY2REZXZpY2UgPSBnZXRfd29yZCh1Yl9mdy0+ZGF0YSwgRTJQX0RBVEFfT0ZGU0VUKTsKIAogCWlmIChmd19iY2REZXZpY2UgIT0gYmNkRGV2aWNlKSB7CiAJCWRldl9pbmZvKCZ1ZGV2LT5kZXYsCkBAIC0zNTcsOCArMjcwLDcgQEAKIAlpZiAocikKIAkJZ290byBlcnJvcjsKIAotCXIgPSB1cGxvYWRfY29kZSh1ZGV2LCB1cGhfZnctPmRhdGEsIHVwaF9mdy0+c2l6ZSwgRldfU1RBUlRfT0ZGU0VULAotCQkgICAgICAgIFJFQk9PVCk7CisJciA9IHVwbG9hZF9jb2RlKHVkZXYsIHVwaF9mdy0+ZGF0YSwgdXBoX2Z3LT5zaXplLCBGV19TVEFSVCwgUkVCT09UKTsKIAlpZiAocikgewogCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsCiAJCQkiQ291bGQgbm90IHVwbG9hZCBmaXJtd2FyZSBjb2RlIHVwaC4gRXJyb3IgbnVtYmVyICVkXG4iLApAQCAtODU4LDcgKzc3MCw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmludHItPmxvY2spOwogCWludHItPmludGVydmFsID0gaW50X3VyYl9pbnRlcnZhbCh6ZF91c2JfdG9fdXNiZGV2KHVzYikpOwogCWluaXRfY29tcGxldGlvbigmaW50ci0+cmVhZF9yZWdzLmNvbXBsZXRpb24pOwotCWludHItPnJlYWRfcmVncy5jcl9pbnRfYWRkciA9IGNwdV90b19sZTE2KHVzYl9hZGRyKHVzYiwgQ1JfSU5URVJSVVBUKSk7CisJaW50ci0+cmVhZF9yZWdzLmNyX2ludF9hZGRyID0gY3B1X3RvX2xlMTYoKHUxNilDUl9JTlRFUlJVUFQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF91c2Jfcngoc3RydWN0IHpkX3VzYiAqdXNiKQpAQCAtODkwLDIyICs4MDIsNiBAQAogCWluaXRfdXNiX3J4KHVzYik7CiB9CiAKLWludCB6ZF91c2JfaW5pdF9odyhzdHJ1Y3QgemRfdXNiICp1c2IpCi17Ci0JaW50IHI7Ci0Jc3RydWN0IHpkX2NoaXAgKmNoaXAgPSB6ZF91c2JfdG9fY2hpcCh1c2IpOwotCi0JWkRfQVNTRVJUKG11dGV4X2lzX2xvY2tlZCgmY2hpcC0+bXV0ZXgpKTsKLQlyID0gemRfaW9yZWFkMTZfbG9ja2VkKGNoaXAsICZ1c2ItPmZ3X2Jhc2Vfb2Zmc2V0LAotCQkgICAgICAgIFVTQl9SRUcoKHUxNilGV19CQVNFX0FERFJfT0ZGU0VUKSk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCWRldl9kYmdfZih6ZF91c2JfZGV2KHVzYiksICJmd19iYXNlX29mZnNldDogJSMwNmh4XG4iLAotCQkgdXNiLT5md19iYXNlX29mZnNldCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogdm9pZCB6ZF91c2JfY2xlYXIoc3RydWN0IHpkX3VzYiAqdXNiKQogewogCXVzYl9zZXRfaW50ZmRhdGEodXNiLT5pbnRmLCBOVUxMKTsKQEAgLTEyNTMsNyArMTE0OSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCXJlcS0+aWQgPSBjcHVfdG9fbGUxNihVU0JfUkVRX1JFQURfUkVHUyk7CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCXJlcS0+YWRkcltpXSA9IGNwdV90b19sZTE2KHVzYl9hZGRyKHVzYiwgYWRkcmVzc2VzW2ldKSk7CisJCXJlcS0+YWRkcltpXSA9IGNwdV90b19sZTE2KCh1MTYpYWRkcmVzc2VzW2ldKTsKIAogCXVkZXYgPSB6ZF91c2JfdG9fdXNiZGV2KHVzYik7CiAJcHJlcGFyZV9yZWFkX3JlZ3NfaW50KHVzYik7CkBAIC0xMzE4LDcgKzEyMTQsNyBAQAogCXJlcS0+aWQgPSBjcHVfdG9fbGUxNihVU0JfUkVRX1dSSVRFX1JFR1MpOwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCXN0cnVjdCByZWdfZGF0YSAqcncgID0gJnJlcS0+cmVnX3dyaXRlc1tpXTsKLQkJcnctPmFkZHIgPSBjcHVfdG9fbGUxNih1c2JfYWRkcih1c2IsIGlvcmVxc1tpXS5hZGRyKSk7CisJCXJ3LT5hZGRyID0gY3B1X3RvX2xlMTYoKHUxNilpb3JlcXNbaV0uYWRkcik7CiAJCXJ3LT52YWx1ZSA9IGNwdV90b19sZTE2KGlvcmVxc1tpXS52YWx1ZSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy96ZDEyMTFydy96ZF91c2IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oCmluZGV4IDMxN2QzN2MuLjUwNmVhNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIxMXJ3L3pkX3VzYi5oCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAKICNpbmNsdWRlICJ6ZF9kZWYuaCIKLSNpbmNsdWRlICJ6ZF90eXBlcy5oIgogCiBlbnVtIGRldmljZXR5cGUgewogCURFVklDRV9aRDEyMTEgID0gMCwKQEAgLTE4MSwxNSArMTgwLDE0IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIAotLyogQ29udGFpbnMgdGhlIHVzYiBwYXJ0cy4gVGhlIHN0cnVjdHVyZSBkb2Vzbid0IHJlcXVpcmUgYSBsb2NrLCBiZWNhdXNlIGludGYKLSAqIGFuZCBmd19iYXNlX29mZnNldCwgd2lsbCBub3QgYmUgY2hhbmdlZCBhZnRlciBpbml0aWFsaXphdGlvbi4KKy8qIENvbnRhaW5zIHRoZSB1c2IgcGFydHMuIFRoZSBzdHJ1Y3R1cmUgZG9lc24ndCByZXF1aXJlIGEgbG9jayBiZWNhdXNlIGludGYKKyAqIHdpbGwgbm90IGJlIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCiAgKi8KIHN0cnVjdCB6ZF91c2IgewogCXN0cnVjdCB6ZF91c2JfaW50ZXJydXB0IGludHI7CiAJc3RydWN0IHpkX3VzYl9yeCByeDsKIAlzdHJ1Y3QgemRfdXNiX3R4IHR4OwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwotCXUxNiBmd19iYXNlX29mZnNldDsKIH07CiAKICNkZWZpbmUgemRfdXNiX2Rldih1c2IpICgmdXNiLT5pbnRmLT5kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwppbmRleCBiZDFmYWViLi5mY2E5NzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKQEAgLTc3MywxMyArNzczLDEzIEBACiAJCWdvdG8gb3V0OwogCiAJdGFibGUgPSBvYmotPmJ1ZmZlci5wb2ludGVyOwotCXN3aXRjaCAoKChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqKXRhYmxlKS0+dHlwZSkgewotCWNhc2UgQUNQSV9NQURUX0lPU0FQSUM6Ci0JCSpnc2lfYmFzZSA9ICgoc3RydWN0IGFjcGlfdGFibGVfaW9zYXBpYyAqKXRhYmxlKS0+Z2xvYmFsX2lycV9iYXNlOworCXN3aXRjaCAoKChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKil0YWJsZSktPnR5cGUpIHsKKwljYXNlIEFDUElfTUFEVF9UWVBFX0lPX1NBUElDOgorCQkqZ3NpX2Jhc2UgPSAoKHN0cnVjdCBhY3BpX21hZHRfaW9fc2FwaWMgKil0YWJsZSktPmdsb2JhbF9pcnFfYmFzZTsKIAkJcmVzdWx0ID0gMDsKIAkJYnJlYWs7Ci0JY2FzZSBBQ1BJX01BRFRfSU9BUElDOgotCQkqZ3NpX2Jhc2UgPSAoKHN0cnVjdCBhY3BpX3RhYmxlX2lvYXBpYyAqKXRhYmxlKS0+Z2xvYmFsX2lycV9iYXNlOworCWNhc2UgQUNQSV9NQURUX1RZUEVfSU9fQVBJQzoKKwkJKmdzaV9iYXNlID0gKChzdHJ1Y3QgYWNwaV9tYWR0X2lvX2FwaWMgKil0YWJsZSktPmdsb2JhbF9pcnFfYmFzZTsKIAkJcmVzdWx0ID0gMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYwppbmRleCA1ZDE4OGM1Li43OGNmMDcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NnaV9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8YXNtL3NuL3NuX2ZlYXR1cmVfc2V0cy5oPgogI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KICNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL3NuL2FjcGkuaD4KIAogI2luY2x1ZGUgIi4uL3BjaS5oIgogCkBAIC0zNSwxNCArMzcsMTcgQEAKIE1PRFVMRV9BVVRIT1IoIlNHSSAocHJhcml0QHNnaS5jb20sIGRpY2tpZUBzZ2kuY29tLCBoYWJlY2tAc2dpLmNvbSkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU0dJIEFsdGl4IEhvdCBQbHVnIFBDSSBDb250cm9sbGVyIERyaXZlciIpOwogCi0jZGVmaW5lIFBDSUlPX0FTSUNfVFlQRV9USU9DQQkJNAorCisvKiBTQUwgY2FsbCBlcnJvciBjb2Rlcy4gS2VlcCBpbiBzeW5jIHdpdGggcHJvbSBoZWFkZXIgaW8vaW5jbHVkZS9wY2lici5oICovCiAjZGVmaW5lIFBDSV9TTE9UX0FMUkVBRFlfVVAJCTIJLyogc2xvdCBhbHJlYWR5IHVwICovCiAjZGVmaW5lIFBDSV9TTE9UX0FMUkVBRFlfRE9XTgkJMwkvKiBzbG90IGFscmVhZHkgZG93biAqLwogI2RlZmluZSBQQ0lfTDFfRVJSCQkJNwkvKiBMMSBjb25zb2xlIGNvbW1hbmQgZXJyb3IgKi8KICNkZWZpbmUgUENJX0VNUFRZXzMzTUhaCQkJMTUJLyogZW1wdHkgMzMgTUh6IGJ1cyAqLworCisKKyNkZWZpbmUgUENJSU9fQVNJQ19UWVBFX1RJT0NBCQk0CiAjZGVmaW5lIFBDSV9MMV9RU0laRQkJCTEyOAkvKiBvdXIgTDEgbWVzc2FnZSBidWZmZXIgc2l6ZSAqLwogI2RlZmluZSBTTl9NQVhfSFBfU0xPVFMJCQkzMgkvKiBtYXggaG90cGx1ZyBzbG90cyAqLwotI2RlZmluZSBTR0lfSE9UUExVR19QUk9NX1JFVgkJMHgwNDMwCS8qIE1pbi4gcmVxdWlyZWQgUFJPTSB2ZXJzaW9uICovCiAjZGVmaW5lIFNOX1NMT1RfTkFNRV9TSVpFCQkzMwkvKiBzaXplIG9mIG5hbWUgc3RyaW5nICovCiAKIC8qIGludGVybmFsIGxpc3QgaGVhZCAqLwpAQCAtMjI3LDcgKzIzMiw3IEBACiB9CiAKIHN0YXRpYyBpbnQgc25fc2xvdF9lbmFibGUoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCwKLQkJCSAgaW50IGRldmljZV9udW0pCisJCQkgIGludCBkZXZpY2VfbnVtLCBjaGFyICoqc3NkdCkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CiAJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKQEAgLTI0MCw3ICsyNDUsOCBAQAogCSAqIFBvd2VyLW9uIGFuZCBpbml0aWFsaXplIHRoZSBzbG90IGluIHRoZSBTTgogCSAqIFBDSSBpbmZyYXN0cnVjdHVyZS4KIAkgKi8KLQlyYyA9IHNhbF9wY2licl9zbG90X2VuYWJsZShwY2lidXNfaW5mbywgZGV2aWNlX251bSwgJnJlc3ApOworCXJjID0gc2FsX3BjaWJyX3Nsb3RfZW5hYmxlKHBjaWJ1c19pbmZvLCBkZXZpY2VfbnVtLCAmcmVzcCwgc3NkdCk7CisKIAogCWlmIChyYyA9PSBQQ0lfU0xPVF9BTFJFQURZX1VQKSB7CiAJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwgImlzIGFscmVhZHkgYWN0aXZlXG4iKTsKQEAgLTMzNSw2ICszNDEsNyBAQAogCWludCBmdW5jLCBudW1fZnVuY3M7CiAJaW50IG5ld19wcGIgPSAwOwogCWludCByYzsKKwljaGFyICpzc2R0ID0gTlVMTDsKIAl2b2lkIHBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqKTsKIAogCS8qIFNlcmlhbGl6ZSB0aGUgTGludXggUENJIGluZnJhc3RydWN0dXJlICovCkBAIC0zNDIsMTQgKzM0OSwyOSBAQAogCiAJLyoKIAkgKiBQb3dlci1vbiBhbmQgaW5pdGlhbGl6ZSB0aGUgc2xvdCBpbiB0aGUgU04KLQkgKiBQQ0kgaW5mcmFzdHJ1Y3R1cmUuCisJICogUENJIGluZnJhc3RydWN0dXJlLiBBbHNvLCByZXRyaWV2ZSB0aGUgQUNQSSBTU0RUCisJICogdGFibGUgZm9yIHRoZSBzbG90IChpZiBBQ1BJIGNhcGFibGUgUFJPTSkuCiAJICovCi0JcmMgPSBzbl9zbG90X2VuYWJsZShic3NfaG90cGx1Z19zbG90LCBzbG90LT5kZXZpY2VfbnVtKTsKKwlyYyA9IHNuX3Nsb3RfZW5hYmxlKGJzc19ob3RwbHVnX3Nsb3QsIHNsb3QtPmRldmljZV9udW0sICZzc2R0KTsKIAlpZiAocmMpIHsKIAkJbXV0ZXhfdW5sb2NrKCZzbl9ob3RwbHVnX211dGV4KTsKIAkJcmV0dXJuIHJjOwogCX0KIAorCWlmIChzc2R0KQorCQlzc2R0ID0gX192YShzc2R0KTsKKwkvKiBBZGQgdGhlIG5ldyBTU0RUIGZvciB0aGUgc2xvdCB0byB0aGUgQUNQSSBuYW1lc3BhY2UgKi8KKwlpZiAoU05fQUNQSV9CQVNFX1NVUFBPUlQoKSAmJiBzc2R0KSB7CisJCWFjcGlfc3RhdHVzIHJldDsKKworCQlyZXQgPSBhY3BpX2xvYWRfdGFibGUoKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKXNzZHQpOworCQlpZiAoQUNQSV9GQUlMVVJFKHJldCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFjcGlfbG9hZF90YWJsZSBmYWlsZWQgKDB4JXgpXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJCS8qIHRyeSB0byBjb250aW51ZSBvbiAqLworCQl9CisJfQorCiAJbnVtX2Z1bmNzID0gcGNpX3NjYW5fc2xvdChzbG90LT5wY2lfYnVzLAogCQkJCSAgUENJX0RFVkZOKHNsb3QtPmRldmljZV9udW0gKyAxLCAwKSk7CiAJaWYgKCFudW1fZnVuY3MpIHsKQEAgLTM3NCw3ICszOTYsMTAgQEAKIAkJCSAqIHBkaV9ob3N0X3BjaWRldl9pbmZvKS4KIAkJCSAqLwogCQkJcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKGRldik7Ci0JCQlzbl9wY2lfZml4dXBfc2xvdChkZXYpOworCQkJaWYgKFNOX0FDUElfQkFTRV9TVVBQT1JUKCkpCisJCQkJc25fYWNwaV9zbG90X2ZpeHVwKGRldik7CisJCQllbHNlCisJCQkJc25faW9fc2xvdF9maXh1cChkZXYpOwogCQkJaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgewogCQkJCXVuc2lnbmVkIGNoYXIgc2VjX2J1czsKIAkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9TRUNPTkRBUllfQlVTLApAQCAtMzg4LDYgKzQxMyw2MyBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBBZGQgdGhlIHNsb3QncyBkZXZpY2VzIHRvIHRoZSBBQ1BJIGluZnJhc3RydWN0dXJlICovCisJaWYgKFNOX0FDUElfQkFTRV9TVVBQT1JUKCkgJiYgc3NkdCkgeworCQl1bnNpZ25lZCBsb25nIGFkcjsKKwkJc3RydWN0IGFjcGlfZGV2aWNlICpwZGV2aWNlOworCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKKwkJYWNwaV9oYW5kbGUgcGhhbmRsZTsKKwkJYWNwaV9oYW5kbGUgY2hhbmRsZSA9IE5VTEw7CisJCWFjcGlfaGFuZGxlIHJldGhhbmRsZTsKKwkJYWNwaV9zdGF0dXMgcmV0OworCisJCXBoYW5kbGUgPSBQQ0lfQ09OVFJPTExFUihzbG90LT5wY2lfYnVzKS0+YWNwaV9oYW5kbGU7CisKKwkJaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UocGhhbmRsZSwgJnBkZXZpY2UpKSB7CisJCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCQkJIm5vIHBhcmVudCBkZXZpY2UsIGFzc3VtaW5nIE5VTExcbiIpOworCQkJcGRldmljZSA9IE5VTEw7CisJCX0KKworCQkvKgorCQkgKiBXYWxrIHRoZSByb290YnVzIG5vZGUncyBpbW1lZGlhdGUgY2hpbGRyZW4gbG9va2luZyBmb3IKKwkJICogdGhlIHNsb3QncyBkZXZpY2Ugbm9kZShzKS4gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbgorCQkgKiBvbmUgZm9yIG11bHRpZnVuY3Rpb24gZGV2aWNlcy4KKwkJICovCisJCWZvciAoOzspIHsKKwkJCXJldGhhbmRsZSA9IE5VTEw7CisJCQlyZXQgPSBhY3BpX2dldF9uZXh0X29iamVjdChBQ1BJX1RZUEVfREVWSUNFLAorCQkJCQkJICAgcGhhbmRsZSwgY2hhbmRsZSwKKwkJCQkJCSAgICZyZXRoYW5kbGUpOworCisJCQlpZiAocmV0ID09IEFFX05PVF9GT1VORCB8fCByZXRoYW5kbGUgPT0gTlVMTCkKKwkJCQlicmVhazsKKworCQkJY2hhbmRsZSA9IHJldGhhbmRsZTsKKworCQkJcmV0ID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGNoYW5kbGUsIE1FVEhPRF9OQU1FX19BRFIsCisJCQkJCQkgICAgTlVMTCwgJmFkcik7CisKKwkJCWlmIChBQ1BJX1NVQ0NFU1MocmV0KSAmJgorCQkJICAgIChhZHI+PjE2KSA9PSAoc2xvdC0+ZGV2aWNlX251bSArIDEpKSB7CisKKwkJCQlyZXQgPSBhY3BpX2J1c19hZGQoJmRldmljZSwgcGRldmljZSwgY2hhbmRsZSwKKwkJCQkJCSAgIEFDUElfQlVTX1RZUEVfREVWSUNFKTsKKwkJCQlpZiAoQUNQSV9GQUlMVVJFKHJldCkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYWNwaV9idXNfYWRkICIKKwkJCQkJICAgICAgICJmYWlsZWQgKDB4JXgpIGZvciBzbG90ICVkICIKKwkJCQkJICAgICAgICJmdW5jICVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJCSAgICAgICByZXQsIChpbnQpKGFkcj4+MTYpLAorCQkJCQkgICAgICAgKGludCkoYWRyJjB4ZmZmZikpOworCQkJCQkvKiB0cnkgdG8gY29udGludWUgb24gKi8KKwkJCQl9IGVsc2UgeworCQkJCQlhY3BpX2J1c19zdGFydChkZXZpY2UpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwogCS8qIENhbGwgdGhlIGRyaXZlciBmb3IgdGhlIG5ldyBkZXZpY2UgKi8KIAlwY2lfYnVzX2FkZF9kZXZpY2VzKHNsb3QtPnBjaV9idXMpOwogCS8qIENhbGwgdGhlIGRyaXZlcnMgZm9yIHRoZSBuZXcgZGV2aWNlcyBzdWJvcmRpbmF0ZSB0byBQUEIgKi8KQEAgLTQxMiw2ICs0OTQsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJaW50IGZ1bmM7CiAJaW50IHJjOworCWFjcGlfb3duZXJfaWQgc3NkdF9pZCA9IDA7CiAKIAkvKiBBY3F1aXJlIHVwZGF0ZSBhY2Nlc3MgdG8gdGhlIGJ1cyAqLwogCW11dGV4X2xvY2soJnNuX2hvdHBsdWdfbXV0ZXgpOwpAQCAtNDIyLDYgKzUwNSw1MiBAQAogCWlmIChyYykKIAkJZ290byBsZWF2aW5nOwogCisJLyogZnJlZSB0aGUgQUNQSSByZXNvdXJjZXMgZm9yIHRoZSBzbG90ICovCisJaWYgKFNOX0FDUElfQkFTRV9TVVBQT1JUKCkgJiYKKyAgICAgICAgICAgIFBDSV9DT05UUk9MTEVSKHNsb3QtPnBjaV9idXMpLT5hY3BpX2hhbmRsZSkgeworCQl1bnNpZ25lZCBsb25nIGFkcjsKKwkJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CisJCWFjcGlfaGFuZGxlIHBoYW5kbGU7CisJCWFjcGlfaGFuZGxlIGNoYW5kbGUgPSBOVUxMOworCQlhY3BpX2hhbmRsZSByZXRoYW5kbGU7CisJCWFjcGlfc3RhdHVzIHJldDsKKworCQkvKiBHZXQgdGhlIHJvb3RidXMgbm9kZSBwb2ludGVyICovCisJCXBoYW5kbGUgPSBQQ0lfQ09OVFJPTExFUihzbG90LT5wY2lfYnVzKS0+YWNwaV9oYW5kbGU7CisKKwkJLyoKKwkJICogV2FsayB0aGUgcm9vdGJ1cyBub2RlJ3MgaW1tZWRpYXRlIGNoaWxkcmVuIGxvb2tpbmcgZm9yCisJCSAqIHRoZSBzbG90J3MgZGV2aWNlIG5vZGUocykuIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4KKwkJICogb25lIGZvciBtdWx0aWZ1bmN0aW9uIGRldmljZXMuCisJCSAqLworCQlmb3IgKDs7KSB7CisJCQlyZXRoYW5kbGUgPSBOVUxMOworCQkJcmV0ID0gYWNwaV9nZXRfbmV4dF9vYmplY3QoQUNQSV9UWVBFX0RFVklDRSwKKwkJCQkJCSAgIHBoYW5kbGUsIGNoYW5kbGUsCisJCQkJCQkgICAmcmV0aGFuZGxlKTsKKworCQkJaWYgKHJldCA9PSBBRV9OT1RfRk9VTkQgfHwgcmV0aGFuZGxlID09IE5VTEwpCisJCQkJYnJlYWs7CisKKwkJCWNoYW5kbGUgPSByZXRoYW5kbGU7CisKKwkJCXJldCA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihjaGFuZGxlLAorCQkJCQkJICAgIE1FVEhPRF9OQU1FX19BRFIsCisJCQkJCQkgICAgTlVMTCwgJmFkcik7CisJCQlpZiAoQUNQSV9TVUNDRVNTKHJldCkgJiYKKwkJCSAgICAoYWRyPj4xNikgPT0gKHNsb3QtPmRldmljZV9udW0gKyAxKSkgeworCQkJCS8qIHJldGFpbiB0aGUgb3duZXIgaWQgKi8KKwkJCQlhY3BpX2dldF9pZChjaGFuZGxlLCAmc3NkdF9pZCk7CisKKwkJCQlyZXQgPSBhY3BpX2J1c19nZXRfZGV2aWNlKGNoYW5kbGUsCisJCQkJCQkJICAmZGV2aWNlKTsKKwkJCQlpZiAoQUNQSV9TVUNDRVNTKHJldCkpCisJCQkJCWFjcGlfYnVzX3RyaW0oZGV2aWNlLCAxKTsKKwkJCX0KKwkJfQorCisJfQorCiAJLyogRnJlZSB0aGUgU04gcmVzb3VyY2VzIGFzc2lnbmVkIHRvIHRoZSBMaW51eCBkZXZpY2UuKi8KIAlmb3IgKGZ1bmMgPSAwOyBmdW5jIDwgODsgIGZ1bmMrKykgewogCQlkZXYgPSBwY2lfZ2V0X3Nsb3Qoc2xvdC0+cGNpX2J1cywKQEAgLTQzNCw2ICs1NjMsMTggQEAKIAkJfQogCX0KIAorCS8qIFJlbW92ZSB0aGUgU1NEVCBmb3IgdGhlIHNsb3QgZnJvbSB0aGUgQUNQSSBuYW1lc3BhY2UgKi8KKwlpZiAoU05fQUNQSV9CQVNFX1NVUFBPUlQoKSAmJiBzc2R0X2lkKSB7CisJCWFjcGlfc3RhdHVzIHJldDsKKwkJcmV0ID0gYWNwaV91bmxvYWRfdGFibGVfaWQoc3NkdF9pZCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUocmV0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYWNwaV91bmxvYWRfdGFibGVfaWQgIgorCQkJICAgICAgICJmYWlsZWQgKDB4JXgpIGZvciBpZCAlZFxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIHJldCwgc3NkdF9pZCk7CisJCQkvKiB0cnkgdG8gY29udGludWUgb24gKi8KKwkJfQorCX0KKwogCS8qIGZyZWUgdGhlIGNvbGxlY3RlZCBzeXNkYXRhIHBvaW50ZXJzICovCiAJc25fYnVzX2ZyZWVfc3lzZGF0YSgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggOTJkNWU4ZC4uMzU4NzY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtNDIyLDcgKzQyMiw4IEBACiAgKiBJZiBubyBlcnJvciBvY2N1cnJlZCwgdGhlIGRyaXZlciByZW1haW5zIHJlZ2lzdGVyZWQgZXZlbiBpZiAKICAqIG5vIGRldmljZSB3YXMgY2xhaW1lZCBkdXJpbmcgcmVnaXN0cmF0aW9uLgogICovCi1pbnQgX19wY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoraW50IF9fcGNpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCSAgY29uc3QgY2hhciAqbW9kX25hbWUpCiB7CiAJaW50IGVycm9yOwogCkBAIC00MzAsNiArNDMxLDcgQEAKIAlkcnYtPmRyaXZlci5uYW1lID0gZHJ2LT5uYW1lOwogCWRydi0+ZHJpdmVyLmJ1cyA9ICZwY2lfYnVzX3R5cGU7CiAJZHJ2LT5kcml2ZXIub3duZXIgPSBvd25lcjsKKwlkcnYtPmRyaXZlci5tb2RfbmFtZSA9IG1vZF9uYW1lOwogCWRydi0+ZHJpdmVyLmtvYmoua3R5cGUgPSAmcGNpX2RyaXZlcl9rb2JqX3R5cGU7CiAKIAlpZiAocGNpX211bHRpdGhyZWFkX3Byb2JlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY3MuYyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKaW5kZXggNjA2YTQ2Ny4uYWMwMDQyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvY3MuYworKysgYi9kcml2ZXJzL3BjbWNpYS9jcy5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAogCWRvd25fcmVhZCgmcGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNvY2tldCwgJnBjbWNpYV9zb2NrZXRfbGlzdCwgc29ja2V0X2xpc3QpIHsKLQkJaWYgKHNvY2tldC0+ZGV2LmRldiAhPSBkZXYpCisJCWlmIChzb2NrZXQtPmRldi5wYXJlbnQgIT0gZGV2KQogCQkJY29udGludWU7CiAJCW11dGV4X2xvY2soJnNvY2tldC0+c2t0X211dGV4KTsKIAkJc29ja2V0X3N1c3BlbmQoc29ja2V0KTsKQEAgLTEyOCw3ICsxMjgsNyBAQAogCiAJZG93bl9yZWFkKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc29ja2V0LCAmcGNtY2lhX3NvY2tldF9saXN0LCBzb2NrZXRfbGlzdCkgewotCQlpZiAoc29ja2V0LT5kZXYuZGV2ICE9IGRldikKKwkJaWYgKHNvY2tldC0+ZGV2LnBhcmVudCAhPSBkZXYpCiAJCQljb250aW51ZTsKIAkJbXV0ZXhfbG9jaygmc29ja2V0LT5za3RfbXV0ZXgpOwogCQlzb2NrZXRfcmVzdW1lKHNvY2tldCk7CkBAIC0xNDMsMTIgKzE0MywxMiBAQAogCiBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqIHBjbWNpYV9nZXRfc29ja2V0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7Ci0Jc3RydWN0IGNsYXNzX2RldmljZSAqY2xfZGV2ID0gY2xhc3NfZGV2aWNlX2dldCgmc2t0LT5kZXYpOwotCWlmICghY2xfZGV2KQorCXN0cnVjdCBkZXZpY2UgKmRldiA9IGdldF9kZXZpY2UoJnNrdC0+ZGV2KTsKKwlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7Ci0Jc2t0ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xfZGV2KTsKKwlza3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpZiAoIXRyeV9tb2R1bGVfZ2V0KHNrdC0+b3duZXIpKSB7Ci0JCWNsYXNzX2RldmljZV9wdXQoJnNrdC0+ZGV2KTsKKwkJcHV0X2RldmljZSgmc2t0LT5kZXYpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJcmV0dXJuIChza3QpOwpAQCAtMTU5LDE0ICsxNTksMTQgQEAKIHZvaWQgcGNtY2lhX3B1dF9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKIHsKIAltb2R1bGVfcHV0KHNrdC0+b3duZXIpOwotCWNsYXNzX2RldmljZV9wdXQoJnNrdC0+ZGV2KTsKKwlwdXRfZGV2aWNlKCZza3QtPmRldik7CiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9wdXRfc29ja2V0KTsKIAogCi1zdGF0aWMgdm9pZCBwY21jaWFfcmVsZWFzZV9zb2NrZXQoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQorc3RhdGljIHZvaWQgcGNtY2lhX3JlbGVhc2Vfc29ja2V0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29ja2V0ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29ja2V0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAljb21wbGV0ZSgmc29ja2V0LT5zb2NrZXRfcmVsZWFzZWQpOwogfQpAQCAtMTgxLDcgKzE4MSw3IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJaW50IHJldDsKIAotCWlmICghc29ja2V0IHx8ICFzb2NrZXQtPm9wcyB8fCAhc29ja2V0LT5kZXYuZGV2IHx8ICFzb2NrZXQtPnJlc291cmNlX29wcykKKwlpZiAoIXNvY2tldCB8fCAhc29ja2V0LT5vcHMgfHwgIXNvY2tldC0+ZGV2LnBhcmVudCB8fCAhc29ja2V0LT5yZXNvdXJjZV9vcHMpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJY3NfZGJnKHNvY2tldCwgMCwgInBjbWNpYV9yZWdpc3Rlcl9zb2NrZXQoMHglcClcbiIsIHNvY2tldC0+b3BzKTsKQEAgLTIyNiw5ICsyMjYsOSBAQAogI2VuZGlmCiAKIAkvKiBzZXQgcHJvcGVyIHZhbHVlcyBpbiBzb2NrZXQtPmRldiAqLwotCXNvY2tldC0+ZGV2LmNsYXNzX2RhdGEgPSBzb2NrZXQ7CisJZGV2X3NldF9kcnZkYXRhKCZzb2NrZXQtPmRldiwgc29ja2V0KTsKIAlzb2NrZXQtPmRldi5jbGFzcyA9ICZwY21jaWFfc29ja2V0X2NsYXNzOwotCXNucHJpbnRmKHNvY2tldC0+ZGV2LmNsYXNzX2lkLCBCVVNfSURfU0laRSwgInBjbWNpYV9zb2NrZXQldSIsIHNvY2tldC0+c29jayk7CisJc25wcmludGYoc29ja2V0LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgInBjbWNpYV9zb2NrZXQldSIsIHNvY2tldC0+c29jayk7CiAKIAkvKiBiYXNlIGFkZHJlc3MgPSAwLCBtYXAgPSAwICovCiAJc29ja2V0LT5jaXNfbWVtLmZsYWdzID0gMDsKQEAgLTY0MCw3ICs2NDAsNyBAQAogCXNrdC0+b3BzLT5zZXRfc29ja2V0KHNrdCwgJnNrdC0+c29ja2V0KTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggdGhlIGRldmljZSBjb3JlICovCi0JcmV0ID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZza3QtPmRldik7CisJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZza3QtPmRldik7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ01DSUE6IHVuYWJsZSB0byByZWdpc3RlciBzb2NrZXQgMHglcFxuIiwKIAkJCXNrdCk7CkBAIC02ODksNyArNjg5LDcgQEAKIAlyZW1vdmVfd2FpdF9xdWV1ZSgmc2t0LT50aHJlYWRfd2FpdCwgJndhaXQpOwogCiAJLyogcmVtb3ZlIGZyb20gdGhlIGRldmljZSBjb3JlICovCi0JY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnNrdC0+ZGV2KTsKKwlkZXZpY2VfdW5yZWdpc3Rlcigmc2t0LT5kZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05MDQsNyArOTA0LDcgQEAKIEVYUE9SVF9TWU1CT0wocGNtY2lhX2luc2VydF9jYXJkKTsKIAogCi1zdGF0aWMgaW50IHBjbWNpYV9zb2NrZXRfdWV2ZW50KHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqKmVudnAsCitzdGF0aWMgaW50IHBjbWNpYV9zb2NrZXRfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsCiAJCQkgICAgICAgIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCwgZGV2KTsKQEAgLTkzMCw4ICs5MzAsOCBAQAogCiBzdHJ1Y3QgY2xhc3MgcGNtY2lhX3NvY2tldF9jbGFzcyA9IHsKIAkubmFtZSA9ICJwY21jaWFfc29ja2V0IiwKLQkudWV2ZW50ID0gcGNtY2lhX3NvY2tldF91ZXZlbnQsCi0JLnJlbGVhc2UgPSBwY21jaWFfcmVsZWFzZV9zb2NrZXQsCisJLmRldl91ZXZlbnQgPSBwY21jaWFfc29ja2V0X3VldmVudCwKKwkuZGV2X3JlbGVhc2UgPSBwY21jaWFfcmVsZWFzZV9zb2NrZXQsCiAJLmNsYXNzX3JlbGVhc2UgPSBwY21jaWFfcmVsZWFzZV9zb2NrZXRfY2xhc3MsCiB9OwogRVhQT1JUX1NZTUJPTChwY21jaWFfc29ja2V0X2NsYXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmggYi9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCmluZGV4IGY1NzNlYTAuLjlmYTIwN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaApAQCAtMTQyLDcgKzE0Miw3IEBACiAKIGludCBwY2NhcmRfcmVnaXN0ZXJfcGNtY2lhKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrICpjKTsKIAotI2RlZmluZSBjc19zb2NrZXRfbmFtZShza3QpCSgoc2t0KS0+ZGV2LmNsYXNzX2lkKQorI2RlZmluZSBjc19zb2NrZXRfbmFtZShza3QpCSgoc2t0KS0+ZGV2LmJ1c19pZCkKIAogI2lmZGVmIERFQlVHCiBleHRlcm4gaW50IGNzX2RlYnVnX2xldmVsKGludCk7CkBAIC0xNTgsNiArMTU4LDYgQEAKICNlbmRpZgogCiAjZGVmaW5lIGNzX2Vycihza3QsIGZtdCwgYXJnLi4uKSBcCi0JcHJpbnRrKEtFUk5fRVJSICJjczogJXM6ICIgZm10LCAoc2t0KS0+ZGV2LmNsYXNzX2lkICwgIyMgYXJnKQorCXByaW50ayhLRVJOX0VSUiAiY3M6ICVzOiAiIGZtdCwgKHNrdCktPmRldi5idXNfaWQgLCAjIyBhcmcpCiAKICNlbmRpZiAvKiBfTElOVVhfQ1NfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvZHMuYyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKaW5kZXggNzM1NWViNC4uMThlMTExZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvZHMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCkBAIC01NzIsNyArNTcyLDcgQEAKIAlwX2Rldi0+ZnVuYyAgID0gZnVuY3Rpb247CiAKIAlwX2Rldi0+ZGV2LmJ1cyA9ICZwY21jaWFfYnVzX3R5cGU7Ci0JcF9kZXYtPmRldi5wYXJlbnQgPSBzLT5kZXYuZGV2OworCXBfZGV2LT5kZXYucGFyZW50ID0gcy0+ZGV2LnBhcmVudDsKIAlwX2Rldi0+ZGV2LnJlbGVhc2UgPSBwY21jaWFfcmVsZWFzZV9kZXY7CiAJYnVzX2lkX2xlbiA9IHNwcmludGYgKHBfZGV2LT5kZXYuYnVzX2lkLCAiJWQuJWQiLCBwX2Rldi0+c29ja2V0LT5zb2NrLCBwX2Rldi0+ZGV2aWNlX25vKTsKIApAQCAtMTMyOCwxMCArMTMyOCwxMCBAQAogCS5yZXN1bWUgPSBwY21jaWFfYnVzX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHBjbWNpYV9idXNfYWRkX3NvY2tldChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwY21jaWFfYnVzX2FkZF9zb2NrZXQoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgICBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbGFzc19pbnRmKQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrZXQgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrZXQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgcmV0OwogCiAJc29ja2V0ID0gcGNtY2lhX2dldF9zb2NrZXQoc29ja2V0KTsKQEAgLTEzNjQsMTAgKzEzNjQsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGNtY2lhX2J1c19yZW1vdmVfc29ja2V0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwKK3N0YXRpYyB2b2lkIHBjbWNpYV9idXNfcmVtb3ZlX3NvY2tldChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbGFzc19pbnRmKQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrZXQgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzb2NrZXQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCWlmICghc29ja2V0KQogCQlyZXR1cm47CkBAIC0xMzg5LDggKzEzODksOCBAQAogLyogdGhlIHBjbWNpYV9idXNfaW50ZXJmYWNlIGlzIHVzZWQgdG8gaGFuZGxlIHBjbWNpYSBzb2NrZXQgZGV2aWNlcyAqLwogc3RhdGljIHN0cnVjdCBjbGFzc19pbnRlcmZhY2UgcGNtY2lhX2J1c19pbnRlcmZhY2UgPSB7CiAJLmNsYXNzID0gJnBjbWNpYV9zb2NrZXRfY2xhc3MsCi0JLmFkZCA9ICZwY21jaWFfYnVzX2FkZF9zb2NrZXQsCi0JLnJlbW92ZSA9ICZwY21jaWFfYnVzX3JlbW92ZV9zb2NrZXQsCisJLmFkZF9kZXYgPSAmcGNtY2lhX2J1c19hZGRfc29ja2V0LAorCS5yZW1vdmVfZGV2ID0gJnBjbWNpYV9idXNfcmVtb3ZlX3NvY2tldCwKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvaTgyMDkyLmMgYi9kcml2ZXJzL3BjbWNpYS9pODIwOTIuYwppbmRleCBjMmVhMDdhLi5kZjIxZTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9pODIwOTIuYworKysgYi9kcml2ZXJzL3BjbWNpYS9pODIwOTIuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJcGNpX3NldF9kcnZkYXRhKGRldiwgJnNvY2tldHNbaV0uc29ja2V0KTsKIAogCWZvciAoaSA9IDA7IGk8c29ja2V0X2NvdW50OyBpKyspIHsKLQkJc29ja2V0c1tpXS5zb2NrZXQuZGV2LmRldiA9ICZkZXYtPmRldjsKKwkJc29ja2V0c1tpXS5zb2NrZXQuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAkJc29ja2V0c1tpXS5zb2NrZXQub3BzID0gJmk4MjA5MmFhX29wZXJhdGlvbnM7CiAJCXNvY2tldHNbaV0uc29ja2V0LnJlc291cmNlX29wcyA9ICZwY2NhcmRfbm9uc3RhdGljX29wczsKIAkJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX3NvY2tldCgmc29ja2V0c1tpXS5zb2NrZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvaTgyMzY1LmMgYi9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYwppbmRleCBlYTc0Zjk4Li43MmZmMmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYworKysgYi9kcml2ZXJzL3BjbWNpYS9pODIzNjUuYwpAQCAtMTI5OCw3ICsxMjk4LDcgQEAKICAgICAKICAgICAvKiByZWdpc3RlciBzb2NrZXRzIHdpdGggdGhlIHBjbWNpYSBjb3JlICovCiAgICAgZm9yIChpID0gMDsgaSA8IHNvY2tldHM7IGkrKykgewotCSAgICBzb2NrZXRbaV0uc29ja2V0LmRldi5kZXYgPSAmaTgyMzY1X2RldmljZS0+ZGV2OworCSAgICBzb2NrZXRbaV0uc29ja2V0LmRldi5wYXJlbnQgPSAmaTgyMzY1X2RldmljZS0+ZGV2OwogCSAgICBzb2NrZXRbaV0uc29ja2V0Lm9wcyA9ICZwY2ljX29wZXJhdGlvbnM7CiAJICAgIHNvY2tldFtpXS5zb2NrZXQucmVzb3VyY2Vfb3BzID0gJnBjY2FyZF9ub25zdGF0aWNfb3BzOwogCSAgICBzb2NrZXRbaV0uc29ja2V0Lm93bmVyID0gVEhJU19NT0RVTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9wY21jaWFfaW9jdGwuYyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCmluZGV4IDMyNzM3MmIuLjg4NDk0MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCkBAIC01OSw3ICs1OSw2IEBACiAKICNpZmRlZiBERUJVRwogZXh0ZXJuIGludCBkc19wY19kZWJ1ZzsKLSNkZWZpbmUgY3Nfc29ja2V0X25hbWUoc2t0KSAgICAoKHNrdCktPmRldi5jbGFzc19pZCkKIAogI2RlZmluZSBkc19kYmcobHZsLCBmbXQsIGFyZy4uLikgZG8gewkJXAogCWlmIChkc19wY19kZWJ1ZyA+PSBsdmwpCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9yZXNvdXJjZS5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKaW5kZXggYjkyMDFjMi4uMGNlMzlkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKQEAgLTQ4LDcgKzQ4LDYgQEAKIAogI2lmZGVmIERFQlVHCiBleHRlcm4gaW50IGRzX3BjX2RlYnVnOwotI2RlZmluZSBjc19zb2NrZXRfbmFtZShza3QpICAgICgoc2t0KS0+ZGV2LmNsYXNzX2lkKQogCiAjZGVmaW5lIGRzX2RiZyhza3QsIGx2bCwgZm10LCBhcmcuLi4pIGRvIHsJCQlcCiAJaWYgKGRzX3BjX2RlYnVnID49IGx2bCkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BkNjcyOS5jIGIvZHJpdmVycy9wY21jaWEvcGQ2NzI5LmMKaW5kZXggMzYwYzI0OC4uZGQwZGRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcGQ2NzI5LmMKKysrIGIvZHJpdmVycy9wY21jaWEvcGQ2NzI5LmMKQEAgLTY4Miw3ICs2ODIsNyBAQAogCiAJCXNvY2tldFtpXS5zb2NrZXQub3BzID0gJnBkNjcyOV9vcGVyYXRpb25zOwogCQlzb2NrZXRbaV0uc29ja2V0LnJlc291cmNlX29wcyA9ICZwY2NhcmRfbm9uc3RhdGljX29wczsKLQkJc29ja2V0W2ldLnNvY2tldC5kZXYuZGV2ID0gJmRldi0+ZGV2OworCQlzb2NrZXRbaV0uc29ja2V0LmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CiAJCXNvY2tldFtpXS5zb2NrZXQuZHJpdmVyX2RhdGEgPSAmc29ja2V0W2ldOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYyBiL2RyaXZlcnMvcGNtY2lhL3JzcmNfbm9uc3RhdGljLmMKaW5kZXggYzMxNzZiMS4uYmZjYWFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX25vbnN0YXRpYy5jCkBAIC02MTYsNyArNjE2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKm5vbnN0YXRpY19maW5kX2lvX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIGludCBudW0sCiAJCSAgIHVuc2lnbmVkIGxvbmcgYWxpZ24sIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQogewotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gbWFrZV9yZXNvdXJjZSgwLCBudW0sIElPUkVTT1VSQ0VfSU8sIHMtPmRldi5jbGFzc19pZCk7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBtYWtlX3Jlc291cmNlKDAsIG51bSwgSU9SRVNPVVJDRV9JTywgcy0+ZGV2LmJ1c19pZCk7CiAJc3RydWN0IHNvY2tldF9kYXRhICpzX2RhdGEgPSBzLT5yZXNvdXJjZV9kYXRhOwogCXN0cnVjdCBwY21jaWFfYWxpZ25fZGF0YSBkYXRhOwogCXVuc2lnbmVkIGxvbmcgbWluID0gYmFzZTsKQEAgLTY1MCw3ICs2NTAsNyBAQAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqIG5vbnN0YXRpY19maW5kX21lbV9yZWdpb24odV9sb25nIGJhc2UsIHVfbG9uZyBudW0sCiAJCXVfbG9uZyBhbGlnbiwgaW50IGxvdywgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCiB7Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBtYWtlX3Jlc291cmNlKDAsIG51bSwgSU9SRVNPVVJDRV9NRU0sIHMtPmRldi5jbGFzc19pZCk7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBtYWtlX3Jlc291cmNlKDAsIG51bSwgSU9SRVNPVVJDRV9NRU0sIHMtPmRldi5idXNfaWQpOwogCXN0cnVjdCBzb2NrZXRfZGF0YSAqc19kYXRhID0gcy0+cmVzb3VyY2VfZGF0YTsKIAlzdHJ1Y3QgcGNtY2lhX2FsaWduX2RhdGEgZGF0YTsKIAl1bnNpZ25lZCBsb25nIG1pbiwgbWF4OwpAQCAtODk3LDkgKzg5NywxMCBAQAogCiAvKiBzeXNmcyBpbnRlcmZhY2UgdG8gdGhlIHJlc291cmNlIGRhdGFiYXNlICovCiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfaW9fZGIoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2lvX2RiKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc29ja2V0X2RhdGEgKmRhdGE7CiAJc3RydWN0IHJlc291cmNlX21hcCAqcDsKIAlzc2l6ZV90IHJldCA9IDA7CkBAIC05MjAsOSArOTIxLDExIEBACiAJcmV0dXJuIChyZXQpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9pb19kYihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfaW9fZGIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIGVuZF9hZGRyOwogCXVuc2lnbmVkIGludCBhZGQgPSBBRERfTUFOQUdFRF9SRVNPVVJDRTsKIAlzc2l6ZV90IHJldCA9IDA7CkBAIC05NDcsMTEgKzk1MCwxMiBAQAogCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9yZXNvdXJjZXNfaW8sIDA2MDAsIHNob3dfaW9fZGIsIHN0b3JlX2lvX2RiKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhdmFpbGFibGVfcmVzb3VyY2VzX2lvLCAwNjAwLCBzaG93X2lvX2RiLCBzdG9yZV9pb19kYik7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfbWVtX2RiKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19tZW1fZGIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc29ja2V0X2RhdGEgKmRhdGE7CiAJc3RydWN0IHJlc291cmNlX21hcCAqcDsKIAlzc2l6ZV90IHJldCA9IDA7CkBAIC05NzIsOSArOTc2LDExIEBACiAJcmV0dXJuIChyZXQpOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9tZW1fZGIoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX21lbV9kYihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBlbmRfYWRkcjsKIAl1bnNpZ25lZCBpbnQgYWRkID0gQUREX01BTkFHRURfUkVTT1VSQ0U7CiAJc3NpemVfdCByZXQgPSAwOwpAQCAtOTk5LDI1ICsxMDA1LDI1IEBACiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYXZhaWxhYmxlX3Jlc291cmNlc19tZW0sIDA2MDAsIHNob3dfbWVtX2RiLCBzdG9yZV9tZW1fZGIpOworc3RhdGljIERFVklDRV9BVFRSKGF2YWlsYWJsZV9yZXNvdXJjZXNfbWVtLCAwNjAwLCBzaG93X21lbV9kYiwgc3RvcmVfbWVtX2RiKTsKIAotc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpwY2NhcmRfcnNyY19hdHRyaWJ1dGVzW10gPSB7Ci0JJmNsYXNzX2RldmljZV9hdHRyX2F2YWlsYWJsZV9yZXNvdXJjZXNfaW8sCi0JJmNsYXNzX2RldmljZV9hdHRyX2F2YWlsYWJsZV9yZXNvdXJjZXNfbWVtLAorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpwY2NhcmRfcnNyY19hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2F2YWlsYWJsZV9yZXNvdXJjZXNfaW8sCisJJmRldl9hdHRyX2F2YWlsYWJsZV9yZXNvdXJjZXNfbWVtLAogCU5VTEwsCiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwY2NhcmRfc3lzZnNfYWRkX3JzcmMoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LAorc3RhdGljIGludCBfX2RldmluaXQgcGNjYXJkX3N5c2ZzX2FkZF9yc3JjKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICAgc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xhc3NfaW50ZikKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7Ci0Jc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKiphdHRyOworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiphdHRyOwogCWludCByZXQgPSAwOwogCWlmIChzLT5yZXNvdXJjZV9vcHMgIT0gJnBjY2FyZF9ub25zdGF0aWNfb3BzKQogCQlyZXR1cm4gMDsKIAogCWZvciAoYXR0ciA9IHBjY2FyZF9yc3JjX2F0dHJpYnV0ZXM7ICphdHRyOyBhdHRyKyspIHsKLQkJcmV0ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNsYXNzX2RldiwgKmF0dHIpOworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAqYXR0cik7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKIAl9CkBAIC0xMDI1LDIzICsxMDMxLDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZleGl0IHBjY2FyZF9zeXNmc19yZW1vdmVfcnNyYyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcGNjYXJkX3N5c2ZzX3JlbW92ZV9yc3JjKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICAgICAgIHN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKmNsYXNzX2ludGYpCiB7Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOwotCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICoqYXR0cjsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICoqYXR0cjsKIAogCWlmIChzLT5yZXNvdXJjZV9vcHMgIT0gJnBjY2FyZF9ub25zdGF0aWNfb3BzKQogCQlyZXR1cm47CiAKIAlmb3IgKGF0dHIgPSBwY2NhcmRfcnNyY19hdHRyaWJ1dGVzOyAqYXR0cjsgYXR0cisrKQotCQljbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoY2xhc3NfZGV2LCAqYXR0cik7CisJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICphdHRyKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGFzc19pbnRlcmZhY2UgcGNjYXJkX3JzcmNfaW50ZXJmYWNlID0gewogCS5jbGFzcyA9ICZwY21jaWFfc29ja2V0X2NsYXNzLAotCS5hZGQgPSAmcGNjYXJkX3N5c2ZzX2FkZF9yc3JjLAotCS5yZW1vdmUgPSBfX2RldmV4aXRfcCgmcGNjYXJkX3N5c2ZzX3JlbW92ZV9yc3JjKSwKKwkuYWRkX2RldiA9ICZwY2NhcmRfc3lzZnNfYWRkX3JzcmMsCisJLnJlbW92ZV9kZXYgPSBfX2RldmV4aXRfcCgmcGNjYXJkX3N5c2ZzX3JlbW92ZV9yc3JjKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG5vbnN0YXRpY19zeXNmc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMgYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKaW5kZXggZTQzMzcwNC4uZDJhM2JlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYwpAQCAtNDc4LDEwICs0NzgsMTAgQEAKICAqCiAgKiBSZXR1cm5zOiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWRkZWQgdG8gdGhlIGJ1ZmZlcgogICovCi1zdGF0aWMgc3NpemVfdCBzaG93X3N0YXR1cyhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQogewogCXN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0ID0KLQkJY29udGFpbmVyX29mKGNsYXNzX2Rldiwgc3RydWN0IHNvY19wY21jaWFfc29ja2V0LCBzb2NrZXQuZGV2KTsKKwkJY29udGFpbmVyX29mKGRldiwgc3RydWN0IHNvY19wY21jaWFfc29ja2V0LCBzb2NrZXQuZGV2KTsKIAljaGFyICpwID0gYnVmOwogCiAJcCs9c3ByaW50ZihwLCAic2xvdCAgICAgOiAlZFxuIiwgc2t0LT5ucik7CkBAIC03NDcsNyArNzQ3LDcgQEAKIAogCQlhZGRfdGltZXIoJnNrdC0+cG9sbF90aW1lcik7CiAKLQkJY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZza3QtPnNvY2tldC5kZXYsICZjbGFzc19kZXZpY2VfYXR0cl9zdGF0dXMpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNrdC0+c29ja2V0LmRldiwgJmRldmljZV9hdHRyX3N0YXR1cyk7CiAJfQogCiAJZGV2X3NldF9kcnZkYXRhKGRldiwgc2luZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMgYi9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYwppbmRleCBiMDA1NjAyLi5lYTU3NjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zb2NrZXRfc3lzZnMuYwpAQCAtNDAsNyArNDAsOCBAQAogCiAjZGVmaW5lIHRvX3NvY2tldChfZGV2KSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IHBjbWNpYV9zb2NrZXQsIGRldikKIAotc3RhdGljIHNzaXplX3QgcGNjYXJkX3Nob3dfdHlwZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBjY2FyZF9zaG93X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSB0b19zb2NrZXQoZGV2KTsKIApAQCAtNTAsOSArNTEsMTAgQEAKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiMzItYml0XG4iKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIxNi1iaXRcbiIpOwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNhcmRfdHlwZSwgMDQ0NCwgcGNjYXJkX3Nob3dfdHlwZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2FyZF90eXBlLCAwNDQ0LCBwY2NhcmRfc2hvd190eXBlLCBOVUxMKTsKIAotc3RhdGljIHNzaXplX3QgcGNjYXJkX3Nob3dfdm9sdGFnZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBjY2FyZF9zaG93X3ZvbHRhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSB0b19zb2NrZXQoZGV2KTsKIApAQCAtNjMsMjggKzY1LDMxIEBACiAJCQkgICAgICAgcy0+c29ja2V0LlZjYyAlIDEwKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICJYLlhWXG4iKTsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihjYXJkX3ZvbHRhZ2UsIDA0NDQsIHBjY2FyZF9zaG93X3ZvbHRhZ2UsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGNhcmRfdm9sdGFnZSwgMDQ0NCwgcGNjYXJkX3Nob3dfdm9sdGFnZSwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHBjY2FyZF9zaG93X3ZwcChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBjY2FyZF9zaG93X3ZwcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHRvX3NvY2tldChkZXYpOwogCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lZFZcbiIsIHMtPnNvY2tldC5WcHAgLyAxMCwgcy0+c29ja2V0LlZwcCAlIDEwKTsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihjYXJkX3ZwcCwgMDQ0NCwgcGNjYXJkX3Nob3dfdnBwLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjYXJkX3ZwcCwgMDQ0NCwgcGNjYXJkX3Nob3dfdnBwLCBOVUxMKTsKIAotc3RhdGljIHNzaXplX3QgcGNjYXJkX3Nob3dfdmNjKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcGNjYXJkX3Nob3dfdmNjKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gdG9fc29ja2V0KGRldik7CiAJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCiAJCXJldHVybiAtRU5PREVWOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiVkVlxuIiwgcy0+c29ja2V0LlZjYyAvIDEwLCBzLT5zb2NrZXQuVmNjICUgMTApOwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNhcmRfdmNjLCAwNDQ0LCBwY2NhcmRfc2hvd192Y2MsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGNhcmRfdmNjLCAwNDQ0LCBwY2NhcmRfc2hvd192Y2MsIE5VTEwpOwogCiAKLXN0YXRpYyBzc2l6ZV90IHBjY2FyZF9zdG9yZV9pbnNlcnQoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzc2l6ZV90IHBjY2FyZF9zdG9yZV9pbnNlcnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzc2l6ZV90IHJldDsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHRvX3NvY2tldChkZXYpOwpAQCAtOTYsMTYgKzEwMSwyMCBAQAogCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNhcmRfaW5zZXJ0LCAwMjAwLCBOVUxMLCBwY2NhcmRfc3RvcmVfaW5zZXJ0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjYXJkX2luc2VydCwgMDIwMCwgTlVMTCwgcGNjYXJkX3N0b3JlX2luc2VydCk7CiAKIAotc3RhdGljIHNzaXplX3QgcGNjYXJkX3Nob3dfY2FyZF9wbV9zdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHBjY2FyZF9zaG93X2NhcmRfcG1fc3RhdGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSB0b19zb2NrZXQoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgcy0+c3RhdGUgJiBTT0NLRVRfU1VTUEVORCA/ICJvZmYiIDogIm9uIik7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBjY2FyZF9zdG9yZV9jYXJkX3BtX3N0YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgc3NpemVfdCBwY2NhcmRfc3RvcmVfY2FyZF9wbV9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3NpemVfdCByZXQgPSAtRUlOVkFMOwogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gdG9fc29ja2V0KGRldik7CkBAIC0xMjAsOSArMTI5LDExIEBACiAKIAlyZXR1cm4gcmV0ID8gLUVOT0RFViA6IGNvdW50OwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNhcmRfcG1fc3RhdGUsIDA2NDQsIHBjY2FyZF9zaG93X2NhcmRfcG1fc3RhdGUsIHBjY2FyZF9zdG9yZV9jYXJkX3BtX3N0YXRlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjYXJkX3BtX3N0YXRlLCAwNjQ0LCBwY2NhcmRfc2hvd19jYXJkX3BtX3N0YXRlLCBwY2NhcmRfc3RvcmVfY2FyZF9wbV9zdGF0ZSk7CiAKLXN0YXRpYyBzc2l6ZV90IHBjY2FyZF9zdG9yZV9lamVjdChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcGNjYXJkX3N0b3JlX2VqZWN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3NpemVfdCByZXQ7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSB0b19zb2NrZXQoZGV2KTsKQEAgLTEzNCwxNiArMTQ1LDIwIEBACiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoY2FyZF9lamVjdCwgMDIwMCwgTlVMTCwgcGNjYXJkX3N0b3JlX2VqZWN0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihjYXJkX2VqZWN0LCAwMjAwLCBOVUxMLCBwY2NhcmRfc3RvcmVfZWplY3QpOwogCiAKLXN0YXRpYyBzc2l6ZV90IHBjY2FyZF9zaG93X2lycV9tYXNrKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcGNjYXJkX3Nob3dfaXJxX21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gdG9fc29ja2V0KGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDR4XG4iLCBzLT5pcnFfbWFzayk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBjY2FyZF9zdG9yZV9pcnFfbWFzayhzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcGNjYXJkX3N0b3JlX2lycV9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3NpemVfdCByZXQ7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSB0b19zb2NrZXQoZGV2KTsKQEAgLTE2MSwxNiArMTc2LDE5IEBACiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoY2FyZF9pcnFfbWFzaywgMDYwMCwgcGNjYXJkX3Nob3dfaXJxX21hc2ssIHBjY2FyZF9zdG9yZV9pcnFfbWFzayk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2FyZF9pcnFfbWFzaywgMDYwMCwgcGNjYXJkX3Nob3dfaXJxX21hc2ssIHBjY2FyZF9zdG9yZV9pcnFfbWFzayk7CiAKIAotc3RhdGljIHNzaXplX3QgcGNjYXJkX3Nob3dfcmVzb3VyY2Uoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBwY2NhcmRfc2hvd19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSB0b19zb2NrZXQoZGV2KTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgcy0+cmVzb3VyY2Vfc2V0dXBfZG9uZSA/ICJ5ZXMiIDogIm5vIik7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHBjY2FyZF9zdG9yZV9yZXNvdXJjZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgcGNjYXJkX3N0b3JlX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHRvX3NvY2tldChkZXYpOwpAQCAtMTk2LDcgKzIxNCw3IEBACiAKIAlyZXR1cm4gY291bnQ7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYXZhaWxhYmxlX3Jlc291cmNlc19zZXR1cF9kb25lLCAwNjAwLCBwY2NhcmRfc2hvd19yZXNvdXJjZSwgcGNjYXJkX3N0b3JlX3Jlc291cmNlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhdmFpbGFibGVfcmVzb3VyY2VzX3NldHVwX2RvbmUsIDA2MDAsIHBjY2FyZF9zaG93X3Jlc291cmNlLCBwY2NhcmRfc3RvcmVfcmVzb3VyY2UpOwogCiAKIHN0YXRpYyBzc2l6ZV90IHBjY2FyZF9leHRyYWN0X2NpcyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCkBAIC0yNzksNyArMjk3LDcgQEAKIAkJaWYgKG9mZiArIGNvdW50ID4gc2l6ZSkKIAkJCWNvdW50ID0gc2l6ZSAtIG9mZjsKIAotCQlzID0gdG9fc29ja2V0KGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgY2xhc3NfZGV2aWNlLCBrb2JqKSk7CisJCXMgPSB0b19zb2NrZXQoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKIAogCQlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKIAkJCXJldHVybiAtRU5PREVWOwpAQCAtMjk2LDcgKzMxNCw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IHBjY2FyZF9zdG9yZV9jaXMoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gdG9fc29ja2V0KGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgY2xhc3NfZGV2aWNlLCBrb2JqKSk7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSB0b19zb2NrZXQoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKIAljaXNkdW1wX3QgKmNpczsKIAlpbnQgZXJyb3I7CiAKQEAgLTMzNSwxNiArMzUzLDE2IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICpwY2NhcmRfc29ja2V0X2F0dHJpYnV0ZXNbXSA9IHsKLQkmY2xhc3NfZGV2aWNlX2F0dHJfY2FyZF90eXBlLAotCSZjbGFzc19kZXZpY2VfYXR0cl9jYXJkX3ZvbHRhZ2UsCi0JJmNsYXNzX2RldmljZV9hdHRyX2NhcmRfdnBwLAotCSZjbGFzc19kZXZpY2VfYXR0cl9jYXJkX3ZjYywKLQkmY2xhc3NfZGV2aWNlX2F0dHJfY2FyZF9pbnNlcnQsCi0JJmNsYXNzX2RldmljZV9hdHRyX2NhcmRfcG1fc3RhdGUsCi0JJmNsYXNzX2RldmljZV9hdHRyX2NhcmRfZWplY3QsCi0JJmNsYXNzX2RldmljZV9hdHRyX2NhcmRfaXJxX21hc2ssCi0JJmNsYXNzX2RldmljZV9hdHRyX2F2YWlsYWJsZV9yZXNvdXJjZXNfc2V0dXBfZG9uZSwKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqcGNjYXJkX3NvY2tldF9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX2NhcmRfdHlwZSwKKwkmZGV2X2F0dHJfY2FyZF92b2x0YWdlLAorCSZkZXZfYXR0cl9jYXJkX3ZwcCwKKwkmZGV2X2F0dHJfY2FyZF92Y2MsCisJJmRldl9hdHRyX2NhcmRfaW5zZXJ0LAorCSZkZXZfYXR0cl9jYXJkX3BtX3N0YXRlLAorCSZkZXZfYXR0cl9jYXJkX2VqZWN0LAorCSZkZXZfYXR0cl9jYXJkX2lycV9tYXNrLAorCSZkZXZfYXR0cl9hdmFpbGFibGVfcmVzb3VyY2VzX3NldHVwX2RvbmUsCiAJTlVMTCwKIH07CiAKQEAgLTM1NSwzNSArMzczLDM1IEBACiAJLndyaXRlID0gcGNjYXJkX3N0b3JlX2NpcywKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHBjY2FyZF9zeXNmc19hZGRfc29ja2V0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBjY2FyZF9zeXNmc19hZGRfc29ja2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJICAgICBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbGFzc19pbnRmKQogewotCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICoqYXR0cjsKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqKmF0dHI7CiAJaW50IHJldCA9IDA7CiAKIAlmb3IgKGF0dHIgPSBwY2NhcmRfc29ja2V0X2F0dHJpYnV0ZXM7ICphdHRyOyBhdHRyKyspIHsKLQkJcmV0ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNsYXNzX2RldiwgKmF0dHIpOworCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAqYXR0cik7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKIAl9CiAJaWYgKCFyZXQpCi0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmY2xhc3NfZGV2LT5rb2JqLCAmcGNjYXJkX2Npc19hdHRyKTsKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXYtPmtvYmosICZwY2NhcmRfY2lzX2F0dHIpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19kZXZleGl0IHBjY2FyZF9zeXNmc19yZW1vdmVfc29ja2V0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwY2NhcmRfc3lzZnNfcmVtb3ZlX3NvY2tldChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCQkgc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xhc3NfaW50ZikKIHsKLQlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqKmF0dHI7CisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiphdHRyOwogCi0Jc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZjbGFzc19kZXYtPmtvYmosICZwY2NhcmRfY2lzX2F0dHIpOworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmZGV2LT5rb2JqLCAmcGNjYXJkX2Npc19hdHRyKTsKIAlmb3IgKGF0dHIgPSBwY2NhcmRfc29ja2V0X2F0dHJpYnV0ZXM7ICphdHRyOyBhdHRyKyspCi0JCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShjbGFzc19kZXYsICphdHRyKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgKmF0dHIpOwogfQogCiBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlIHBjY2FyZF9zeXNmc19pbnRlcmZhY2UgPSB7CiAJLmNsYXNzID0gJnBjbWNpYV9zb2NrZXRfY2xhc3MsCi0JLmFkZCA9ICZwY2NhcmRfc3lzZnNfYWRkX3NvY2tldCwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoJnBjY2FyZF9zeXNmc19yZW1vdmVfc29ja2V0KSwKKwkuYWRkX2RldiA9ICZwY2NhcmRfc3lzZnNfYWRkX3NvY2tldCwKKwkucmVtb3ZlX2RldiA9IF9fZGV2ZXhpdF9wKCZwY2NhcmRfc3lzZnNfcmVtb3ZlX3NvY2tldCksCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvdGNpYy5jIGIvZHJpdmVycy9wY21jaWEvdGNpYy5jCmluZGV4IDJkMmY0MTUuLmMxNThjZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3RjaWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS90Y2ljLmMKQEAgLTUxMiw3ICs1MTIsNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBzb2NrZXRzOyBpKyspIHsKIAkgICAgc29ja2V0X3RhYmxlW2ldLnNvY2tldC5vcHMgPSAmdGNpY19vcGVyYXRpb25zOwogCSAgICBzb2NrZXRfdGFibGVbaV0uc29ja2V0LnJlc291cmNlX29wcyA9ICZwY2NhcmRfbm9uc3RhdGljX29wczsKLQkgICAgc29ja2V0X3RhYmxlW2ldLnNvY2tldC5kZXYuZGV2ID0gJnRjaWNfZGV2aWNlLmRldjsKKwkgICAgc29ja2V0X3RhYmxlW2ldLnNvY2tldC5kZXYucGFyZW50ID0gJnRjaWNfZGV2aWNlLmRldjsKIAkgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX3NvY2tldCgmc29ja2V0X3RhYmxlW2ldLnNvY2tldCk7CiAJICAgIGlmIChyZXQgJiYgaSkKIAkJICAgIHBjbWNpYV91bnJlZ2lzdGVyX3NvY2tldCgmc29ja2V0X3RhYmxlWzBdLnNvY2tldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS95ZW50YV9zb2NrZXQuYyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCmluZGV4IGRhNDcxYmQuLmE2MWQ3NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jCkBAIC0xMTA0LDcgKzExMDQsNyBAQAogCS8qIHByZXBhcmUgcGNtY2lhX3NvY2tldCAqLwogCXNvY2tldC0+c29ja2V0Lm9wcyA9ICZ5ZW50YV9zb2NrZXRfb3BlcmF0aW9uczsKIAlzb2NrZXQtPnNvY2tldC5yZXNvdXJjZV9vcHMgPSAmcGNjYXJkX25vbnN0YXRpY19vcHM7Ci0Jc29ja2V0LT5zb2NrZXQuZGV2LmRldiA9ICZkZXYtPmRldjsKKwlzb2NrZXQtPnNvY2tldC5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwogCXNvY2tldC0+c29ja2V0LmRyaXZlcl9kYXRhID0gc29ja2V0OwogCXNvY2tldC0+c29ja2V0Lm93bmVyID0gVEhJU19NT0RVTEU7CiAJc29ja2V0LT5zb2NrZXQuZmVhdHVyZXMgPSBTU19DQVBfUEFHRV9SRUdTIHwgU1NfQ0FQX1BDQ0FSRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvS2NvbmZpZyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvS2NvbmZpZwppbmRleCBiMTg1NDE3MWIuLmFkMjdlNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGFjcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3BucC9wbnBhY3BpL0tjb25maWcKQEAgLTIsOCArMiw4IEBACiAjIFBsdWcgYW5kIFBsYXkgQUNQSSBjb25maWd1cmF0aW9uCiAjCiBjb25maWcgUE5QQUNQSQotCWJvb2wgIlBsdWcgYW5kIFBsYXkgQUNQSSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUE5QICYmIEFDUEkgJiYgRVhQRVJJTUVOVEFMCisJYm9vbCAiUGx1ZyBhbmQgUGxheSBBQ1BJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQTlAgJiYgQUNQSQogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIExpbnV4IHVzZXMgdGhlIFBOUEFDUEkgdG8gYXV0b2RldGVjdCBidWlsdC1pbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvc3lzdGVtLmMgYi9kcml2ZXJzL3BucC9zeXN0ZW0uYwppbmRleCBkNDIwMTVjLi4yMDY1ZTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9zeXN0ZW0uYworKysgYi9kcml2ZXJzL3BucC9zeXN0ZW0uYwpAQCAtMyw3ICszLDggQEAKICAqCiAgKiBTb21lIGNvZGUgaXMgYmFzZWQgb24gcG5wYmlvc19jb3JlLmMKICAqIENvcHlyaWdodCAyMDAyIEFkYW0gQmVsYXkgPGFtYngxQG5lby5yci5jb20+Ci0gKgorICogKGMpIENvcHlyaWdodCAyMDA3IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKglCam9ybiBIZWxnYWFzIDxiam9ybi5oZWxnYWFzQGhwLmNvbT4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CkBAIC0yMSwxOCArMjIsMjEgQEAKIAl7CSIiLAkJCTAJfQogfTsKIAotc3RhdGljIHZvaWQgcmVzZXJ2ZV9pb3BvcnRfcmFuZ2UoY2hhciAqcG5waWQsIGludCBzdGFydCwgaW50IGVuZCkKK3N0YXRpYyB2b2lkIHJlc2VydmVfcmFuZ2UoY2hhciAqcG5waWQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IHBvcnQpCiB7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJY2hhciAqcmVnaW9uaWQ7CiAKIAlyZWdpb25pZCA9IGttYWxsb2MoMTYsIEdGUF9LRVJORUwpOwotCWlmICggcmVnaW9uaWQgPT0gTlVMTCApCisJaWYgKHJlZ2lvbmlkID09IE5VTEwpCiAJCXJldHVybjsKIAlzbnByaW50ZihyZWdpb25pZCwgMTYsICJwbnAgJXMiLCBwbnBpZCk7Ci0JcmVzID0gcmVxdWVzdF9yZWdpb24oc3RhcnQsZW5kLXN0YXJ0KzEscmVnaW9uaWQpOwotCWlmICggcmVzID09IE5VTEwgKQotCQlrZnJlZSggcmVnaW9uaWQgKTsKKwlpZiAocG9ydCkKKwkJcmVzID0gcmVxdWVzdF9yZWdpb24oc3RhcnQsZW5kLXN0YXJ0KzEscmVnaW9uaWQpOworCWVsc2UKKwkJcmVzID0gcmVxdWVzdF9tZW1fcmVnaW9uKHN0YXJ0LGVuZC1zdGFydCsxLHJlZ2lvbmlkKTsKKwlpZiAocmVzID09IE5VTEwpCisJCWtmcmVlKHJlZ2lvbmlkKTsKIAllbHNlCiAJCXJlcy0+ZmxhZ3MgJj0gfklPUkVTT1VSQ0VfQlVTWTsKIAkvKgpAQCAtNDEsMjYgKzQ1LDIwIEBACiAJICogaGF2ZSBkb3VibGUgcmVzZXJ2YXRpb25zLgogCSAqLwogCXByaW50ayhLRVJOX0lORk8KLQkJInBucDogJXM6IGlvcG9ydCByYW5nZSAweCV4LTB4JXggJXMgcmVzZXJ2ZWRcbiIsCi0JCXBucGlkLCBzdGFydCwgZW5kLAotCQlOVUxMICE9IHJlcyA/ICJoYXMgYmVlbiIgOiAiY291bGQgbm90IGJlIgotCSk7Ci0KLQlyZXR1cm47CisJCSJwbnA6ICVzOiAlcyByYW5nZSAweCV4LTB4JXggJXMgcmVzZXJ2ZWRcbiIsCisJCXBucGlkLCBwb3J0ID8gImlvcG9ydCIgOiAiaW9tZW0iLCBzdGFydCwgZW5kLAorCQlOVUxMICE9IHJlcyA/ICJoYXMgYmVlbiIgOiAiY291bGQgbm90IGJlIik7CiB9CiAKLXN0YXRpYyB2b2lkIHJlc2VydmVfcmVzb3VyY2VzX29mX2Rldiggc3RydWN0IHBucF9kZXYgKmRldiApCitzdGF0aWMgdm9pZCByZXNlcnZlX3Jlc291cmNlc19vZl9kZXYoc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlpbnQgaTsKIAotCWZvciAoaT0wO2k8UE5QX01BWF9QT1JUO2krKykgeworCWZvciAoaSA9IDA7IGkgPCBQTlBfTUFYX1BPUlQ7IGkrKykgewogCQlpZiAoIXBucF9wb3J0X3ZhbGlkKGRldiwgaSkpCi0JCQkvKiBlbmQgb2YgcmVzb3VyY2VzICovCiAJCQljb250aW51ZTsKIAkJaWYgKHBucF9wb3J0X3N0YXJ0KGRldiwgaSkgPT0gMCkKLQkJCS8qIGRpc2FibGVkICovCi0JCQkvKiBEbyBub3RoaW5nICovCi0JCQljb250aW51ZTsKKwkJCWNvbnRpbnVlOwkvKiBkaXNhYmxlZCAqLwogCQlpZiAocG5wX3BvcnRfc3RhcnQoZGV2LCBpKSA8IDB4MTAwKQogCQkJLyoKIAkJCSAqIEJlbG93IDB4MTAwIGlzIG9ubHkgc3RhbmRhcmQgUEMgaGFyZHdhcmUKQEAgLTcyLDE0ICs3MCwxOCBAQAogCQkJICovCiAJCQljb250aW51ZTsKIAkJaWYgKHBucF9wb3J0X2VuZChkZXYsIGkpIDwgcG5wX3BvcnRfc3RhcnQoZGV2LCBpKSkKLQkJCS8qIGludmFsaWQgZW5kcG9pbnQgKi8KLQkJCS8qIERvIG5vdGhpbmcgKi8KKwkJCWNvbnRpbnVlOwkvKiBpbnZhbGlkICovCisKKwkJcmVzZXJ2ZV9yYW5nZShkZXYtPmRldi5idXNfaWQsIHBucF9wb3J0X3N0YXJ0KGRldiwgaSksCisJCQlwbnBfcG9ydF9lbmQoZGV2LCBpKSwgMSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFBOUF9NQVhfTUVNOyBpKyspIHsKKwkJaWYgKCFwbnBfbWVtX3ZhbGlkKGRldiwgaSkpCiAJCQljb250aW51ZTsKLQkJcmVzZXJ2ZV9pb3BvcnRfcmFuZ2UoCi0JCQlkZXYtPmRldi5idXNfaWQsCi0JCQlwbnBfcG9ydF9zdGFydChkZXYsIGkpLAotCQkJcG5wX3BvcnRfZW5kKGRldiwgaSkKLQkJKTsKKworCQlyZXNlcnZlX3JhbmdlKGRldi0+ZGV2LmJ1c19pZCwgcG5wX21lbV9zdGFydChkZXYsIGkpLAorCQkJcG5wX21lbV9lbmQoZGV2LCBpKSwgMCk7CiAJfQogCiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jIGIvZHJpdmVycy9zcGkvcHhhMnh4X3NwaS5jCmluZGV4IDhiNDFmOWMuLmRjY2RjNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3B4YTJ4eF9zcGkuYworKysgYi9kcml2ZXJzL3NwaS9weGEyeHhfc3BpLmMKQEAgLTEyMzQsNyArMTIzNCw3IEBACiAKIAlJTklUX1dPUksoJmRydl9kYXRhLT5wdW1wX21lc3NhZ2VzLCBwdW1wX21lc3NhZ2VzKTsKIAlkcnZfZGF0YS0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCi0JCQkJCWRydl9kYXRhLT5tYXN0ZXItPmNkZXYuZGV2LT5idXNfaWQpOworCQkJCQlkcnZfZGF0YS0+bWFzdGVyLT5kZXYucGFyZW50LT5idXNfaWQpOwogCWlmIChkcnZfZGF0YS0+d29ya3F1ZXVlID09IE5VTEwpCiAJCXJldHVybiAtRUJVU1k7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggNjMwNzQyOC4uMzVkOGMwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogc3BpX25ld19kZXZpY2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9ib2FyZF9pbmZvICpjaGlwKQogewogCXN0cnVjdCBzcGlfZGV2aWNlCSpwcm94eTsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gbWFzdGVyLT5jZGV2LmRldjsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gJm1hc3Rlci0+ZGV2OwogCWludAkJCXN0YXR1czsKIAogCS8qIE5PVEU6ICBjYWxsZXIgZGlkIGFueSBjaGlwLT5idXNfbnVtIGNoZWNrcyBuZWNlc3NhcnkgKi8KQEAgLTIxNSw3ICsyMTUsNyBAQAogCXByb3h5LT5tb2RhbGlhcyA9IGNoaXAtPm1vZGFsaWFzOwogCiAJc25wcmludGYocHJveHktPmRldi5idXNfaWQsIHNpemVvZiBwcm94eS0+ZGV2LmJ1c19pZCwKLQkJCSIlcy4ldSIsIG1hc3Rlci0+Y2Rldi5jbGFzc19pZCwKKwkJCSIlcy4ldSIsIG1hc3Rlci0+ZGV2LmJ1c19pZCwKIAkJCWNoaXAtPmNoaXBfc2VsZWN0KTsKIAlwcm94eS0+ZGV2LnBhcmVudCA9IGRldjsKIAlwcm94eS0+ZGV2LmJ1cyA9ICZzcGlfYnVzX3R5cGU7CkBAIC0yOTAsNyArMjkwLDcgQEAKIHNjYW5fYm9hcmRpbmZvKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCiB7CiAJc3RydWN0IGJvYXJkaW5mbwkqYmk7Ci0Jc3RydWN0IGRldmljZQkJKmRldiA9IG1hc3Rlci0+Y2Rldi5kZXY7CisJc3RydWN0IGRldmljZQkJKmRldiA9IG1hc3Rlci0+ZGV2LnBhcmVudDsKIAogCWRvd24oJmJvYXJkX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYmksICZib2FyZF9saXN0LCBsaXN0KSB7CkBAIC0zMTksMTggKzMxOSwxOCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgdm9pZCBzcGlfbWFzdGVyX3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2RldikKK3N0YXRpYyB2b2lkIHNwaV9tYXN0ZXJfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKIAotCW1hc3RlciA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3Qgc3BpX21hc3RlciwgY2Rldik7CisJbWFzdGVyID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHNwaV9tYXN0ZXIsIGRldik7CiAJa2ZyZWUobWFzdGVyKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGFzcyBzcGlfbWFzdGVyX2NsYXNzID0gewogCS5uYW1lCQk9ICJzcGlfbWFzdGVyIiwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLnJlbGVhc2UJPSBzcGlfbWFzdGVyX3JlbGVhc2UsCisJLmRldl9yZWxlYXNlCT0gc3BpX21hc3Rlcl9yZWxlYXNlLAogfTsKIAogCkBAIC0zNjQsOSArMzY0LDkgQEAKIAlpZiAoIW1hc3RlcikKIAkJcmV0dXJuIE5VTEw7CiAKLQljbGFzc19kZXZpY2VfaW5pdGlhbGl6ZSgmbWFzdGVyLT5jZGV2KTsKLQltYXN0ZXItPmNkZXYuY2xhc3MgPSAmc3BpX21hc3Rlcl9jbGFzczsKLQltYXN0ZXItPmNkZXYuZGV2ID0gZ2V0X2RldmljZShkZXYpOworCWRldmljZV9pbml0aWFsaXplKCZtYXN0ZXItPmRldik7CisJbWFzdGVyLT5kZXYuY2xhc3MgPSAmc3BpX21hc3Rlcl9jbGFzczsKKwltYXN0ZXItPmRldi5wYXJlbnQgPSBnZXRfZGV2aWNlKGRldik7CiAJc3BpX21hc3Rlcl9zZXRfZGV2ZGF0YShtYXN0ZXIsICZtYXN0ZXJbMV0pOwogCiAJcmV0dXJuIG1hc3RlcjsKQEAgLTM5Niw3ICszOTYsNyBAQAogc3BpX3JlZ2lzdGVyX21hc3RlcihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQogewogCXN0YXRpYyBhdG9taWNfdAkJZHluX2J1c19pZCA9IEFUT01JQ19JTklUKCgxPDwxNikgLSAxKTsKLQlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gbWFzdGVyLT5jZGV2LmRldjsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gbWFzdGVyLT5kZXYucGFyZW50OwogCWludAkJCXN0YXR1cyA9IC1FTk9ERVY7CiAJaW50CQkJZHluYW1pYyA9IDA7CiAKQEAgLTQxMiwxMiArNDEyLDEyIEBACiAJLyogcmVnaXN0ZXIgdGhlIGRldmljZSwgdGhlbiB1c2Vyc3BhY2Ugd2lsbCBzZWUgaXQuCiAJICogcmVnaXN0cmF0aW9uIGZhaWxzIGlmIHRoZSBidXMgSUQgaXMgaW4gdXNlLgogCSAqLwotCXNucHJpbnRmKG1hc3Rlci0+Y2Rldi5jbGFzc19pZCwgc2l6ZW9mIG1hc3Rlci0+Y2Rldi5jbGFzc19pZCwKKwlzbnByaW50ZihtYXN0ZXItPmRldi5idXNfaWQsIHNpemVvZiBtYXN0ZXItPmRldi5idXNfaWQsCiAJCSJzcGkldSIsIG1hc3Rlci0+YnVzX251bSk7Ci0Jc3RhdHVzID0gY2xhc3NfZGV2aWNlX2FkZCgmbWFzdGVyLT5jZGV2KTsKKwlzdGF0dXMgPSBkZXZpY2VfYWRkKCZtYXN0ZXItPmRldik7CiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8gZG9uZTsKLQlkZXZfZGJnKGRldiwgInJlZ2lzdGVyZWQgbWFzdGVyICVzJXNcbiIsIG1hc3Rlci0+Y2Rldi5jbGFzc19pZCwKKwlkZXZfZGJnKGRldiwgInJlZ2lzdGVyZWQgbWFzdGVyICVzJXNcbiIsIG1hc3Rlci0+ZGV2LmJ1c19pZCwKIAkJCWR5bmFtaWMgPyAiIChkeW5hbWljKSIgOiAiIik7CiAKIAkvKiBwb3B1bGF0ZSBjaGlsZHJlbiBmcm9tIGFueSBzcGkgZGV2aWNlIHRhYmxlcyAqLwpAQCAtNDQ5LDggKzQ0OSw4IEBACiB7CiAJaW50IGR1bW15OwogCi0JZHVtbXkgPSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQobWFzdGVyLT5jZGV2LmRldiwgTlVMTCwgX191bnJlZ2lzdGVyKTsKLQljbGFzc19kZXZpY2VfdW5yZWdpc3RlcigmbWFzdGVyLT5jZGV2KTsKKwlkdW1teSA9IGRldmljZV9mb3JfZWFjaF9jaGlsZCgmbWFzdGVyLT5kZXYsIE5VTEwsIF9fdW5yZWdpc3Rlcik7CisJZGV2aWNlX3VucmVnaXN0ZXIoJm1hc3Rlci0+ZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwaV91bnJlZ2lzdGVyX21hc3Rlcik7CiAKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCiAJZG93bigmc3BpX21hc3Rlcl9jbGFzcy5zZW0pOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2RldiwgJnNwaV9tYXN0ZXJfY2xhc3MuY2hpbGRyZW4sIG5vZGUpIHsKLQkJbSA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3Qgc3BpX21hc3RlciwgY2Rldik7CisJCW0gPSBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IHNwaV9tYXN0ZXIsIGRldi5rb2JqKTsKIAkJaWYgKG0tPmJ1c19udW0gPT0gYnVzX251bSkgewogCQkJbWFzdGVyID0gc3BpX21hc3Rlcl9nZXQobSk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMgYi9kcml2ZXJzL3NwaS9zcGlfYml0YmFuZy5jCmluZGV4IDU3Mjg5YjYuLjQ2MzhlNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaV9iaXRiYW5nLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2JpdGJhbmcuYwpAQCAtNDc5LDcgKzQ3OSw3IEBACiAJLyogdGhpcyB0YXNrIGlzIHRoZSBvbmx5IHRoaW5nIHRvIHRvdWNoIHRoZSBTUEkgYml0cyAqLwogCWJpdGJhbmctPmJ1c3kgPSAwOwogCWJpdGJhbmctPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKAotCQkJYml0YmFuZy0+bWFzdGVyLT5jZGV2LmRldi0+YnVzX2lkKTsKKwkJCWJpdGJhbmctPm1hc3Rlci0+ZGV2LnBhcmVudC0+YnVzX2lkKTsKIAlpZiAoYml0YmFuZy0+d29ya3F1ZXVlID09IE5VTEwpIHsKIAkJc3RhdHVzID0gLUVCVVNZOwogCQlnb3RvIGVycjE7CkBAIC01MTMsMTQgKzUxMywxNCBAQAogCXdoaWxlICghbGlzdF9lbXB0eSgmYml0YmFuZy0+cXVldWUpICYmIGxpbWl0LS0pIHsKIAkJc3Bpbl91bmxvY2tfaXJxKCZiaXRiYW5nLT5sb2NrKTsKIAotCQlkZXZfZGJnKGJpdGJhbmctPm1hc3Rlci0+Y2Rldi5kZXYsICJ3YWl0IGZvciBxdWV1ZVxuIik7CisJCWRldl9kYmcoJmJpdGJhbmctPm1hc3Rlci0+ZGV2LCAid2FpdCBmb3IgcXVldWVcbiIpOwogCQltc2xlZXAoMTApOwogCiAJCXNwaW5fbG9ja19pcnEoJmJpdGJhbmctPmxvY2spOwogCX0KIAlzcGluX3VubG9ja19pcnEoJmJpdGJhbmctPmxvY2spOwogCWlmICghbGlzdF9lbXB0eSgmYml0YmFuZy0+cXVldWUpKSB7Ci0JCWRldl9lcnIoYml0YmFuZy0+bWFzdGVyLT5jZGV2LmRldiwgInF1ZXVlIGRpZG4ndCBlbXB0eVxuIik7CisJCWRldl9lcnIoJmJpdGJhbmctPm1hc3Rlci0+ZGV2LCAicXVldWUgZGlkbid0IGVtcHR5XG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYyBiL2RyaXZlcnMvc3BpL3NwaV9idXR0ZXJmbHkuYwppbmRleCAzMTI5ODdhLi4zMWI3OTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGlfYnV0dGVyZmx5LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpX2J1dHRlcmZseS5jCkBAIC0yNDYsNyArMjQ2LDcgQEAKIAkgKiBhbmQgbm8gd2F5IHRvIGJlIHNlbGVjdGl2ZSBhYm91dCB3aGF0IGl0IGJpbmRzIHRvLgogCSAqLwogCi0JLyogRklYTUUgd2hlcmUgc2hvdWxkIG1hc3Rlci0+Y2Rldi5kZXYgY29tZSBmcm9tPworCS8qIEZJWE1FIHdoZXJlIHNob3VsZCBtYXN0ZXItPmRldi5wYXJlbnQgY29tZSBmcm9tPwogCSAqIGUuZy4gL3N5cy9idXMvcG5wMC8wMDowYiwgc29tZSBQQ0kgdGhpbmcsIGV0YwogCSAqIHNldHRpbmcgdXAgYSBwbGF0Zm9ybSBkZXZpY2UgbGlrZSB0aGlzIGlzIGFuIHVnbHkga2x1Z2UuLi4KIAkgKi8KQEAgLTM4Niw3ICszODYsNyBAQAogCWJ1dHRlcmZseSA9IE5VTEw7CiAKIAkvKiBzdG9wKCkgdW5yZWdpc3RlcnMgY2hpbGQgZGV2aWNlcyB0b28gKi8KLQlwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKHBwLT5iaXRiYW5nLm1hc3Rlci0+Y2Rldi5kZXYpOworCXBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UocHAtPmJpdGJhbmcubWFzdGVyLT5kZXYucGFyZW50KTsKIAlzdGF0dXMgPSBzcGlfYml0YmFuZ19zdG9wKCZwcC0+Yml0YmFuZyk7CiAKIAkvKiB0dXJuIG9mZiBWQ0MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCmluZGV4IDBjMGMwM2EuLjYwMGQxYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwpAQCAtNzUzLDcgKzc1Myw4IEBACiAgKiB1c2JfcmVnaXN0ZXJfZGV2KCkgdG8gZW5hYmxlIHRoYXQgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZnVuY3Rpb24gbm8gbG9uZ2VyCiAgKiB0YWtlcyBjYXJlIG9mIHRoYXQuCiAgKi8KLWludCB1c2JfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZHJpdmVyICpuZXdfZHJpdmVyLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK2ludCB1c2JfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZHJpdmVyICpuZXdfZHJpdmVyLCBzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCWNvbnN0IGNoYXIgKm1vZF9uYW1lKQogewogCWludCByZXR2YWwgPSAwOwogCkBAIC03NjYsNiArNzY3LDcgQEAKIAluZXdfZHJpdmVyLT5kcnZ3cmFwLmRyaXZlci5wcm9iZSA9IHVzYl9wcm9iZV9pbnRlcmZhY2U7CiAJbmV3X2RyaXZlci0+ZHJ2d3JhcC5kcml2ZXIucmVtb3ZlID0gdXNiX3VuYmluZF9pbnRlcmZhY2U7CiAJbmV3X2RyaXZlci0+ZHJ2d3JhcC5kcml2ZXIub3duZXIgPSBvd25lcjsKKwluZXdfZHJpdmVyLT5kcnZ3cmFwLmRyaXZlci5tb2RfbmFtZSA9IG1vZF9uYW1lOwogCXNwaW5fbG9ja19pbml0KCZuZXdfZHJpdmVyLT5keW5pZHMubG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJm5ld19kcml2ZXItPmR5bmlkcy5saXN0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWxnZmYuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1sZ2ZmLmMKaW5kZXggZTQ3NDY2Mi4uNGY0ZmMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWxnZmYuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtbGdmZi5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CiAjaW5jbHVkZSAidXNiaGlkLmgiCiAKLXN0cnVjdCBkZXZpY2VfdHlwZSB7CitzdHJ1Y3QgZGV2X3R5cGUgewogCXUxNiBpZFZlbmRvcjsKIAl1MTYgaWRQcm9kdWN0OwogCWNvbnN0IHNpZ25lZCBzaG9ydCAqZmY7CkBAIC00OCw3ICs0OCw3IEBACiAJLTEKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgZGV2aWNlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfdHlwZSBkZXZpY2VzW10gPSB7CiAJeyAweDA0NmQsIDB4YzIxMSwgZmZfcnVtYmxlIH0sCiAJeyAweDA0NmQsIDB4YzIxOSwgZmZfcnVtYmxlIH0sCiAJeyAweDA0NmQsIDB4YzI4MywgZmZfam95c3RpY2sgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9hc2l4LmMgYi9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jCmluZGV4IDg5NjQ0OWYuLjQyMDZkZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9hc2l4LmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2FzaXguYwpAQCAtMTQ0OSw2ICsxNDQ5LDEwIEBACiAJLy8gTGlua3N5cyBVU0IxMDAwCiAJVVNCX0RFVklDRSAoMHgxNzM3LCAweDAwMzkpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3OF9pbmZvLAorfSwgeworCS8vIElPLURBVEEgRVRHLVVTMgorCVVTQl9ERVZJQ0UgKDB4MDRiYiwgMHgwOTMwKSwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmF4ODgxNzhfaW5mbywKIH0sCiAJeyB9LAkJLy8gRU5ECiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuaCBiL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmgKaW5kZXggOThmNjg5OC4uYzc0Njc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuaAorKysgYi9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5oCkBAIC0yMTQsOSArMjE0LDkgQEAKIAkJREVGQVVMVF9HUElPX1JFU0VUICkKIFBFR0FTVVNfREVWKCAiQmlsbGlvbnRvbiBVU0JFLTEwMCIsIFZFTkRPUl9CSUxMSU9OVE9OLCAweDg1MTEsCiAJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQotUEVHQVNVU19ERVYoICJDb3JlZ2EgRkV0ZXIgVVNCLVRYIiwgVkVORE9SX0NPUkVHQSwgMHgwMDA0LAorUEVHQVNVU19ERVYoICJDb3JlZ2EgRkV0aGVyIFVTQi1UWCIsIFZFTkRPUl9DT1JFR0EsIDB4MDAwNCwKIAkJREVGQVVMVF9HUElPX1JFU0VUICkKLVBFR0FTVVNfREVWKCAiQ29yZWdhIEZFdGVyIFVTQi1UWFMiLCBWRU5ET1JfQ09SRUdBLCAweDAwMGQsCitQRUdBU1VTX0RFViggIkNvcmVnYSBGRXRoZXIgVVNCLVRYUyIsIFZFTkRPUl9DT1JFR0EsIDB4MDAwZCwKIAkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSApCiBQRUdBU1VTX0RFViggIkQtTGluayBEU0ItNjUwVFgiLCBWRU5ET1JfRExJTkssIDB4NDAwMSwKIAkJREVGQVVMVF9HUElPX1JFU0VUICkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb3V0cHV0LmMgYi9kcml2ZXJzL3ZpZGVvL291dHB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzNmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL291dHB1dC5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogIG91dHB1dC5jIC0gRGlzcGxheSBPdXRwdXQgU3dpdGNoIGRyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgTHVtaW5nIFl1IDxsdW1pbmcueXVAaW50ZWwuY29tPgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9fb3V0cHV0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKworCitNT0RVTEVfREVTQ1JJUFRJT04oIkRpc3BsYXkgT3V0cHV0IFN3aXRjaGVyIExvd2xldmVsIENvbnRyb2wgQWJzdHJhY3Rpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkx1bWluZyBZdSA8bHVtaW5nLnl1QGludGVsLmNvbT4iKTsKKworc3RhdGljIHNzaXplX3QgdmlkZW9fb3V0cHV0X3Nob3dfc3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LGNoYXIgKmJ1ZikKK3sKKwlzc2l6ZV90IHJldF9zaXplID0gMDsKKwlzdHJ1Y3Qgb3V0cHV0X2RldmljZSAqb2QgPSB0b19vdXRwdXRfZGV2aWNlKGRldik7CisJaWYgKG9kLT5wcm9wcykKKwkJcmV0X3NpemUgPSBzcHJpbnRmKGJ1ZiwiJS44eFxuIixvZC0+cHJvcHMtPmdldF9zdGF0dXMob2QpKTsKKwlyZXR1cm4gcmV0X3NpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZpZGVvX291dHB1dF9zdG9yZV9zdGF0ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsCisJY29uc3QgY2hhciAqYnVmLHNpemVfdCBjb3VudCkKK3sKKwljaGFyICplbmRwOworCXN0cnVjdCBvdXRwdXRfZGV2aWNlICpvZCA9IHRvX291dHB1dF9kZXZpY2UoZGV2KTsKKwlpbnQgcmVxdWVzdF9zdGF0ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwmZW5kcCwwKTsKKwlzaXplX3Qgc2l6ZSA9IGVuZHAgLSBidWY7CisKKwlpZiAoKmVuZHAgJiYgaXNzcGFjZSgqZW5kcCkpCisJCXNpemUrKzsKKwlpZiAoc2l6ZSAhPSBjb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob2QtPnByb3BzKSB7CisJCW9kLT5yZXF1ZXN0X3N0YXRlID0gcmVxdWVzdF9zdGF0ZTsKKwkJb2QtPnByb3BzLT5zZXRfc3RhdGUob2QpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHZpZGVvX291dHB1dF9jbGFzc19yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb3V0cHV0X2RldmljZSAqb2QgPSB0b19vdXRwdXRfZGV2aWNlKGRldik7CisJa2ZyZWUob2QpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgdmlkZW9fb3V0cHV0X2F0dHJpYnV0ZXNbXSA9IHsKKwlfX0FUVFIoc3RhdGUsIDA2NDQsIHZpZGVvX291dHB1dF9zaG93X3N0YXRlLCB2aWRlb19vdXRwdXRfc3RvcmVfc3RhdGUpLAorCV9fQVRUUl9OVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGFzcyB2aWRlb19vdXRwdXRfY2xhc3MgPSB7CisJLm5hbWUgPSAidmlkZW9fb3V0cHV0IiwKKwkucmVsZWFzZSA9IHZpZGVvX291dHB1dF9jbGFzc19yZWxlYXNlLAorCS5jbGFzc19kZXZfYXR0cnMgPSB2aWRlb19vdXRwdXRfYXR0cmlidXRlcywKK307CisKK3N0cnVjdCBvdXRwdXRfZGV2aWNlICp2aWRlb19vdXRwdXRfcmVnaXN0ZXIoY29uc3QgY2hhciAqbmFtZSwKKwlzdHJ1Y3QgZGV2aWNlICpkZXYsCisJdm9pZCAqZGV2ZGF0YSwKKwlzdHJ1Y3Qgb3V0cHV0X3Byb3BlcnRpZXMgKm9wKQoreworCXN0cnVjdCBvdXRwdXRfZGV2aWNlICpuZXdfZGV2OworCWludCByZXRfY29kZSA9IDA7CisKKwluZXdfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG91dHB1dF9kZXZpY2UpLEdGUF9LRVJORUwpOworCWlmICghbmV3X2RldikgeworCQlyZXRfY29kZSA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKwluZXdfZGV2LT5wcm9wcyA9IG9wOworCW5ld19kZXYtPmNsYXNzX2Rldi5jbGFzcyA9ICZ2aWRlb19vdXRwdXRfY2xhc3M7CisJbmV3X2Rldi0+Y2xhc3NfZGV2LmRldiA9IGRldjsKKwlzdHJsY3B5KG5ld19kZXYtPmNsYXNzX2Rldi5jbGFzc19pZCxuYW1lLEtPQkpfTkFNRV9MRU4pOworCWNsYXNzX3NldF9kZXZkYXRhKCZuZXdfZGV2LT5jbGFzc19kZXYsZGV2ZGF0YSk7CisJcmV0X2NvZGUgPSBjbGFzc19kZXZpY2VfcmVnaXN0ZXIoJm5ld19kZXYtPmNsYXNzX2Rldik7CisJaWYgKHJldF9jb2RlKSB7CisJCWtmcmVlKG5ld19kZXYpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisJcmV0dXJuIG5ld19kZXY7CisKK2Vycm9yX3JldHVybjoKKwlyZXR1cm4gRVJSX1BUUihyZXRfY29kZSk7Cit9CitFWFBPUlRfU1lNQk9MKHZpZGVvX291dHB1dF9yZWdpc3Rlcik7CisKK3ZvaWQgdmlkZW9fb3V0cHV0X3VucmVnaXN0ZXIoc3RydWN0IG91dHB1dF9kZXZpY2UgKmRldikKK3sKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPmNsYXNzX2Rldik7Cit9CitFWFBPUlRfU1lNQk9MKHZpZGVvX291dHB1dF91bnJlZ2lzdGVyKTsKKworc3RhdGljIHZvaWQgX19leGl0IHZpZGVvX291dHB1dF9jbGFzc19leGl0KHZvaWQpCit7CisJY2xhc3NfdW5yZWdpc3RlcigmdmlkZW9fb3V0cHV0X2NsYXNzKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdmlkZW9fb3V0cHV0X2NsYXNzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gY2xhc3NfcmVnaXN0ZXIoJnZpZGVvX291dHB1dF9jbGFzcyk7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKHZpZGVvX291dHB1dF9jbGFzc19pbml0KTsKK21vZHVsZV9leGl0KHZpZGVvX291dHB1dF9jbGFzc19leGl0KTsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2Jpbi5jIGIvZnMvc3lzZnMvYmluLmMKaW5kZXggZThmNTQwZC4uZDNiOWY1ZiAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvYmluLmMKKysrIGIvZnMvc3lzZnMvYmluLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAogI2luY2x1ZGUgInN5c2ZzLmgiCiAKQEAgLTE0Niw3ICsxNDcsNyBAQAogIEVycm9yOgogCW1vZHVsZV9wdXQoYXR0ci0+YXR0ci5vd25lcik7CiAgRG9uZToKLQlpZiAoZXJyb3IgJiYga29iaikKKwlpZiAoZXJyb3IpCiAJCWtvYmplY3RfcHV0KGtvYmopOwogCXJldHVybiBlcnJvcjsKIH0KQEAgLTE1Nyw4ICsxNTgsNyBAQAogCXN0cnVjdCBiaW5fYXR0cmlidXRlICogYXR0ciA9IHRvX2Jpbl9hdHRyKGZpbGUtPmZfcGF0aC5kZW50cnkpOwogCXU4ICogYnVmZmVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCi0JaWYgKGtvYmopIAotCQlrb2JqZWN0X3B1dChrb2JqKTsKKwlrb2JqZWN0X3B1dChrb2JqKTsKIAltb2R1bGVfcHV0KGF0dHItPmF0dHIub3duZXIpOwogCWtmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9kaXIuYyBiL2ZzL3N5c2ZzL2Rpci5jCmluZGV4IDUxMWVkZWYuLjlkY2RmNTUgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2Rpci5jCisrKyBiL2ZzL3N5c2ZzL2Rpci5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlICJzeXNmcy5oIgogCiBERUNMQVJFX1JXU0VNKHN5c2ZzX3JlbmFtZV9zZW0pOwpAQCAtMzIsOCArMzMsNyBAQAogLyoKICAqIEFsbG9jYXRlcyBhIG5ldyBzeXNmc19kaXJlbnQgYW5kIGxpbmtzIGl0IHRvIHRoZSBwYXJlbnQgc3lzZnNfZGlyZW50CiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc3lzZnNfbmV3X2RpcmVudChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogcGFyZW50X3NkLAotCQkJCQkJdm9pZCAqIGVsZW1lbnQpCitzdGF0aWMgc3RydWN0IHN5c2ZzX2RpcmVudCAqIF9fc3lzZnNfbmV3X2RpcmVudCh2b2lkICogZWxlbWVudCkKIHsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2Q7CiAKQEAgLTQ1LDEyICs0NSwyOCBAQAogCWF0b21pY19zZXQoJnNkLT5zX2NvdW50LCAxKTsKIAlhdG9taWNfc2V0KCZzZC0+c19ldmVudCwgMSk7CiAJSU5JVF9MSVNUX0hFQUQoJnNkLT5zX2NoaWxkcmVuKTsKLQlsaXN0X2FkZCgmc2QtPnNfc2libGluZywgJnBhcmVudF9zZC0+c19jaGlsZHJlbik7CisJSU5JVF9MSVNUX0hFQUQoJnNkLT5zX3NpYmxpbmcpOwogCXNkLT5zX2VsZW1lbnQgPSBlbGVtZW50OwogCiAJcmV0dXJuIHNkOwogfQogCitzdGF0aWMgdm9pZCBfX3N5c2ZzX2xpc3RfZGlyZW50KHN0cnVjdCBzeXNmc19kaXJlbnQgKnBhcmVudF9zZCwKKwkJCSAgICAgIHN0cnVjdCBzeXNmc19kaXJlbnQgKnNkKQoreworCWlmIChzZCkKKwkJbGlzdF9hZGQoJnNkLT5zX3NpYmxpbmcsICZwYXJlbnRfc2QtPnNfY2hpbGRyZW4pOworfQorCitzdGF0aWMgc3RydWN0IHN5c2ZzX2RpcmVudCAqIHN5c2ZzX25ld19kaXJlbnQoc3RydWN0IHN5c2ZzX2RpcmVudCAqcGFyZW50X3NkLAorCQkJCQkJdm9pZCAqIGVsZW1lbnQpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqc2Q7CisJc2QgPSBfX3N5c2ZzX25ld19kaXJlbnQoZWxlbWVudCk7CisJX19zeXNmc19saXN0X2RpcmVudChwYXJlbnRfc2QsIHNkKTsKKwlyZXR1cm4gc2Q7Cit9CisKIC8qCiAgKgogICogUmV0dXJuIC1FRVhJU1QgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHN5c2ZzIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lIGZvcgpAQCAtNzcsMTQgKzkzLDE0IEBACiB9CiAKIAotaW50IHN5c2ZzX21ha2VfZGlyZW50KHN0cnVjdCBzeXNmc19kaXJlbnQgKiBwYXJlbnRfc2QsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksCi0JCQl2b2lkICogZWxlbWVudCwgdW1vZGVfdCBtb2RlLCBpbnQgdHlwZSkKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICoKK19fc3lzZnNfbWFrZV9kaXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB2b2lkICplbGVtZW50LCBtb2RlX3QgbW9kZSwgaW50IHR5cGUpCiB7CiAJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkOwogCi0Jc2QgPSBzeXNmc19uZXdfZGlyZW50KHBhcmVudF9zZCwgZWxlbWVudCk7CisJc2QgPSBfX3N5c2ZzX25ld19kaXJlbnQoZWxlbWVudCk7CiAJaWYgKCFzZCkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OwogCiAJc2QtPnNfbW9kZSA9IG1vZGU7CiAJc2QtPnNfdHlwZSA9IHR5cGU7CkBAIC05NCw3ICsxMTAsMTkgQEAKIAkJZGVudHJ5LT5kX29wID0gJnN5c2ZzX2RlbnRyeV9vcHM7CiAJfQogCi0JcmV0dXJuIDA7CitvdXQ6CisJcmV0dXJuIHNkOworfQorCitpbnQgc3lzZnNfbWFrZV9kaXJlbnQoc3RydWN0IHN5c2ZzX2RpcmVudCAqIHBhcmVudF9zZCwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwKKwkJCXZvaWQgKiBlbGVtZW50LCB1bW9kZV90IG1vZGUsIGludCB0eXBlKQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkOworCisJc2QgPSBfX3N5c2ZzX21ha2VfZGlyZW50KGRlbnRyeSwgZWxlbWVudCwgbW9kZSwgdHlwZSk7CisJX19zeXNmc19saXN0X2RpcmVudChwYXJlbnRfc2QsIHNkKTsKKworCXJldHVybiBzZCA/IDAgOiAtRU5PTUVNOwogfQogCiBzdGF0aWMgaW50IGluaXRfZGlyKHN0cnVjdCBpbm9kZSAqIGlub2RlKQpAQCAtMTY1LDExICsxOTMsMTEgQEAKIAogLyoqCiAgKglzeXNmc19jcmVhdGVfZGlyIC0gY3JlYXRlIGEgZGlyZWN0b3J5IGZvciBhbiBvYmplY3QuCi0gKglAcGFyZW50OglwYXJlbnQgcGFyZW50IG9iamVjdC4KICAqCUBrb2JqOgkJb2JqZWN0IHdlJ3JlIGNyZWF0aW5nIGRpcmVjdG9yeSBmb3IuIAorICoJQHNoYWRvd19wYXJlbnQ6CXBhcmVudCBwYXJlbnQgb2JqZWN0LgogICovCiAKLWludCBzeXNmc19jcmVhdGVfZGlyKHN0cnVjdCBrb2JqZWN0ICoga29iaikKK2ludCBzeXNmc19jcmVhdGVfZGlyKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGRlbnRyeSAqc2hhZG93X3BhcmVudCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gTlVMTDsKIAlzdHJ1Y3QgZGVudHJ5ICogcGFyZW50OwpAQCAtMTc3LDcgKzIwNSw5IEBACiAKIAlCVUdfT04oIWtvYmopOwogCi0JaWYgKGtvYmotPnBhcmVudCkKKwlpZiAoc2hhZG93X3BhcmVudCkKKwkJcGFyZW50ID0gc2hhZG93X3BhcmVudDsKKwllbHNlIGlmIChrb2JqLT5wYXJlbnQpCiAJCXBhcmVudCA9IGtvYmotPnBhcmVudC0+ZGVudHJ5OwogCWVsc2UgaWYgKHN5c2ZzX21vdW50ICYmIHN5c2ZzX21vdW50LT5tbnRfc2IpCiAJCXBhcmVudCA9IHN5c2ZzX21vdW50LT5tbnRfc2ItPnNfcm9vdDsKQEAgLTI5OCwyMSArMzI4LDEyIEBACiB9CiAKIAotLyoqCi0gKglzeXNmc19yZW1vdmVfZGlyIC0gcmVtb3ZlIGFuIG9iamVjdCdzIGRpcmVjdG9yeS4KLSAqCUBrb2JqOglvYmplY3QuIAotICoKLSAqCVRoZSBvbmx5IHRoaW5nIHNwZWNpYWwgYWJvdXQgdGhpcyBpcyB0aGF0IHdlIHJlbW92ZSBhbnkgZmlsZXMgaW4gCi0gKgl0aGUgZGlyZWN0b3J5IGJlZm9yZSB3ZSByZW1vdmUgdGhlIGRpcmVjdG9yeSwgYW5kIHdlJ3ZlIGlubGluZWQKLSAqCXdoYXQgdXNlZCB0byBiZSBzeXNmc19ybWRpcigpIGJlbG93LCBpbnN0ZWFkIG9mIGNhbGxpbmcgc2VwYXJhdGVseS4KLSAqLwotCi12b2lkIHN5c2ZzX3JlbW92ZV9kaXIoc3RydWN0IGtvYmplY3QgKiBrb2JqKQorc3RhdGljIHZvaWQgX19zeXNmc19yZW1vdmVfZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZGdldChrb2JqLT5kZW50cnkpOwogCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBwYXJlbnRfc2Q7CiAJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkLCAqIHRtcDsKIAorCWRnZXQoZGVudHJ5KTsKIAlpZiAoIWRlbnRyeSkKIAkJcmV0dXJuOwogCkBAIC0zMzMsMzIgKzM1NCw2MCBAQAogCSAqIERyb3AgcmVmZXJlbmNlIGZyb20gZGdldCgpIG9uIGVudHJhbmNlLgogCSAqLwogCWRwdXQoZGVudHJ5KTsKK30KKworLyoqCisgKglzeXNmc19yZW1vdmVfZGlyIC0gcmVtb3ZlIGFuIG9iamVjdCdzIGRpcmVjdG9yeS4KKyAqCUBrb2JqOglvYmplY3QuCisgKgorICoJVGhlIG9ubHkgdGhpbmcgc3BlY2lhbCBhYm91dCB0aGlzIGlzIHRoYXQgd2UgcmVtb3ZlIGFueSBmaWxlcyBpbgorICoJdGhlIGRpcmVjdG9yeSBiZWZvcmUgd2UgcmVtb3ZlIHRoZSBkaXJlY3RvcnksIGFuZCB3ZSd2ZSBpbmxpbmVkCisgKgl3aGF0IHVzZWQgdG8gYmUgc3lzZnNfcm1kaXIoKSBiZWxvdywgaW5zdGVhZCBvZiBjYWxsaW5nIHNlcGFyYXRlbHkuCisgKi8KKwordm9pZCBzeXNmc19yZW1vdmVfZGlyKHN0cnVjdCBrb2JqZWN0ICoga29iaikKK3sKKwlfX3N5c2ZzX3JlbW92ZV9kaXIoa29iai0+ZGVudHJ5KTsKIAlrb2JqLT5kZW50cnkgPSBOVUxMOwogfQogCi1pbnQgc3lzZnNfcmVuYW1lX2RpcihzdHJ1Y3Qga29iamVjdCAqIGtvYmosIGNvbnN0IGNoYXIgKm5ld19uYW1lKQoraW50IHN5c2ZzX3JlbmFtZV9kaXIoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfcGFyZW50LAorCQkgICAgIGNvbnN0IGNoYXIgKm5ld19uYW1lKQogewogCWludCBlcnJvciA9IDA7Ci0Jc3RydWN0IGRlbnRyeSAqIG5ld19kZW50cnksICogcGFyZW50OworCXN0cnVjdCBkZW50cnkgKiBuZXdfZGVudHJ5OwogCi0JaWYgKCFzdHJjbXAoa29iamVjdF9uYW1lKGtvYmopLCBuZXdfbmFtZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFrb2JqLT5wYXJlbnQpCi0JCXJldHVybiAtRUlOVkFMOworCWlmICghbmV3X3BhcmVudCkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlkb3duX3dyaXRlKCZzeXNmc19yZW5hbWVfc2VtKTsKLQlwYXJlbnQgPSBrb2JqLT5wYXJlbnQtPmRlbnRyeTsKKwltdXRleF9sb2NrKCZuZXdfcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKIAotCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7Ci0KLQluZXdfZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmV3X25hbWUsIHBhcmVudCwgc3RybGVuKG5ld19uYW1lKSk7CisJbmV3X2RlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5ld19uYW1lLCBuZXdfcGFyZW50LCBzdHJsZW4obmV3X25hbWUpKTsKIAlpZiAoIUlTX0VSUihuZXdfZGVudHJ5KSkgewotICAJCWlmICghbmV3X2RlbnRyeS0+ZF9pbm9kZSkgeworCQkvKiBCeSBhbGxvd2luZyB0d28gZGlmZmVyZW50IGRpcmVjdG9yaWVzIHdpdGggdGhlCisJCSAqIHNhbWUgZF9wYXJlbnQgd2UgYWxsb3cgdGhpcyByb3V0aW5lIHRvIG1vdmUKKwkJICogYmV0d2VlbiBkaWZmZXJlbnQgc2hhZG93cyBvZiB0aGUgc2FtZSBkaXJlY3RvcnkKKwkJICovCisJCWlmIChrb2JqLT5kZW50cnktPmRfcGFyZW50LT5kX2lub2RlICE9IG5ld19wYXJlbnQtPmRfaW5vZGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWxzZSBpZiAobmV3X2RlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUgIT0gbmV3X3BhcmVudC0+ZF9pbm9kZSkKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJZWxzZSBpZiAobmV3X2RlbnRyeSA9PSBrb2JqLT5kZW50cnkpCisJCQllcnJvciA9IC1FSU5WQUw7CisJCWVsc2UgaWYgKCFuZXdfZGVudHJ5LT5kX2lub2RlKSB7CiAJCQllcnJvciA9IGtvYmplY3Rfc2V0X25hbWUoa29iaiwgIiVzIiwgbmV3X25hbWUpOwogCQkJaWYgKCFlcnJvcikgeworCQkJCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkLCAqcGFyZW50X3NkOworCiAJCQkJZF9hZGQobmV3X2RlbnRyeSwgTlVMTCk7CiAJCQkJZF9tb3ZlKGtvYmotPmRlbnRyeSwgbmV3X2RlbnRyeSk7CisKKwkJCQlzZCA9IGtvYmotPmRlbnRyeS0+ZF9mc2RhdGE7CisJCQkJcGFyZW50X3NkID0gbmV3X3BhcmVudC0+ZF9mc2RhdGE7CisKKwkJCQlsaXN0X2RlbF9pbml0KCZzZC0+c19zaWJsaW5nKTsKKwkJCQlsaXN0X2FkZCgmc2QtPnNfc2libGluZywgJnBhcmVudF9zZC0+c19jaGlsZHJlbik7CiAJCQl9CiAJCQllbHNlCiAJCQkJZF9kcm9wKG5ld19kZW50cnkpOwpAQCAtMzY2LDcgKzQxNSw3IEBACiAJCQllcnJvciA9IC1FRVhJU1Q7CiAJCWRwdXQobmV3X2RlbnRyeSk7CiAJfQotCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKKwltdXRleF91bmxvY2soJm5ld19wYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOwogCXVwX3dyaXRlKCZzeXNmc19yZW5hbWVfc2VtKTsKIAogCXJldHVybiBlcnJvcjsKQEAgLTM3OCwxMiArNDI3LDEwIEBACiAJc3RydWN0IHN5c2ZzX2RpcmVudCAqbmV3X3BhcmVudF9zZCwgKnNkOwogCWludCBlcnJvcjsKIAotCWlmICghbmV3X3BhcmVudCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlvbGRfcGFyZW50X2RlbnRyeSA9IGtvYmotPnBhcmVudCA/CiAJCWtvYmotPnBhcmVudC0+ZGVudHJ5IDogc3lzZnNfbW91bnQtPm1udF9zYi0+c19yb290OwotCW5ld19wYXJlbnRfZGVudHJ5ID0gbmV3X3BhcmVudC0+ZGVudHJ5OworCW5ld19wYXJlbnRfZGVudHJ5ID0gbmV3X3BhcmVudCA/CisJCW5ld19wYXJlbnQtPmRlbnRyeSA6IHN5c2ZzX21vdW50LT5tbnRfc2ItPnNfcm9vdDsKIAogYWdhaW46CiAJbXV0ZXhfbG9jaygmb2xkX3BhcmVudF9kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwpAQCAtNTQ3LDYgKzU5NCw5NSBAQAogCXJldHVybiBvZmZzZXQ7CiB9CiAKKworLyoqCisgKglzeXNmc19tYWtlX3NoYWRvd2VkX2RpciAtIFNldHVwIHNvIGEgZGlyZWN0b3J5IGNhbiBiZSBzaGFkb3dlZAorICoJQGtvYmo6CW9iamVjdCB3ZSdyZSBjcmVhdGluZyBzaGFkb3cgb2YuCisgKi8KKworaW50IHN5c2ZzX21ha2Vfc2hhZG93ZWRfZGlyKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCXZvaWQgKiAoKmZvbGxvd19saW5rKShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKikpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyAqaV9vcDsKKworCWlub2RlID0ga29iai0+ZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZS0+aV9vcCAhPSAmc3lzZnNfZGlyX2lub2RlX29wZXJhdGlvbnMpCisJCXJldHVybiAtRUlOVkFMOworCisJaV9vcCA9IGttYWxsb2Moc2l6ZW9mKCppX29wKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpX29wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShpX29wLCAmc3lzZnNfZGlyX2lub2RlX29wZXJhdGlvbnMsIHNpemVvZigqaV9vcCkpOworCWlfb3AtPmZvbGxvd19saW5rID0gZm9sbG93X2xpbms7CisKKwkvKiBMb2NraW5nIG9mIGlub2RlLT5pX29wPworCSAqIFNpbmNlIHNldHRpbmcgaV9vcCBpcyBhIHNpbmdsZSB3b3JkIHdyaXRlIGFuZCB0aGV5CisJICogYXJlIGF0b21pYyB3ZSBzaG91bGQgYmUgb2sgaGVyZS4KKwkgKi8KKwlpbm9kZS0+aV9vcCA9IGlfb3A7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJc3lzZnNfY3JlYXRlX3NoYWRvd19kaXIgLSBjcmVhdGUgYSBzaGFkb3cgZGlyZWN0b3J5IGZvciBhbiBvYmplY3QuCisgKglAa29iajoJb2JqZWN0IHdlJ3JlIGNyZWF0aW5nIGRpcmVjdG9yeSBmb3IuCisgKgorICoJc3lzZnNfbWFrZV9zaGFkb3dlZF9kaXIgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBjYWxsZWQgb24gdGhpcworICoJZGlyZWN0b3J5LgorICovCisKK3N0cnVjdCBkZW50cnkgKnN5c2ZzX2NyZWF0ZV9zaGFkb3dfZGlyKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkOworCXN0cnVjdCBkZW50cnkgKnBhcmVudCwgKmRpciwgKnNoYWRvdzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJZGlyID0ga29iai0+ZGVudHJ5OworCWlub2RlID0gZGlyLT5kX2lub2RlOworCXBhcmVudCA9IGRpci0+ZF9wYXJlbnQ7CisJc2hhZG93ID0gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoIXN5c2ZzX2lzX3NoYWRvd2VkX2lub2RlKGlub2RlKSkKKwkJZ290byBvdXQ7CisKKwlzaGFkb3cgPSBkX2FsbG9jKHBhcmVudCwgJmRpci0+ZF9uYW1lKTsKKwlpZiAoIXNoYWRvdykKKwkJZ290byBub21lbTsKKworCXNkID0gX19zeXNmc19tYWtlX2RpcmVudChzaGFkb3csIGtvYmosIGlub2RlLT5pX21vZGUsIFNZU0ZTX0RJUik7CisJaWYgKCFzZCkKKwkJZ290byBub21lbTsKKworCWRfaW5zdGFudGlhdGUoc2hhZG93LCBpZ3JhYihpbm9kZSkpOworCWluY19ubGluayhpbm9kZSk7CisJaW5jX25saW5rKHBhcmVudC0+ZF9pbm9kZSk7CisJc2hhZG93LT5kX29wID0gJnN5c2ZzX2RlbnRyeV9vcHM7CisKKwlkZ2V0KHNoYWRvdyk7CQkvKiBFeHRyYSBjb3VudCAtIHBpbiB0aGUgZGVudHJ5IGluIGNvcmUgKi8KKworb3V0OgorCXJldHVybiBzaGFkb3c7Citub21lbToKKwlkcHV0KHNoYWRvdyk7CisJc2hhZG93ID0gRVJSX1BUUigtRU5PTUVNKTsKKwlnb3RvIG91dDsKK30KKworLyoqCisgKglzeXNmc19yZW1vdmVfc2hhZG93X2RpciAtIHJlbW92ZSBhbiBvYmplY3QncyBkaXJlY3RvcnkuCisgKglAc2hhZG93OiBkZW50cnkgb2Ygc2hhZG93IGRpcmVjdG9yeQorICoKKyAqCVRoZSBvbmx5IHRoaW5nIHNwZWNpYWwgYWJvdXQgdGhpcyBpcyB0aGF0IHdlIHJlbW92ZSBhbnkgZmlsZXMgaW4KKyAqCXRoZSBkaXJlY3RvcnkgYmVmb3JlIHdlIHJlbW92ZSB0aGUgZGlyZWN0b3J5LCBhbmQgd2UndmUgaW5saW5lZAorICoJd2hhdCB1c2VkIHRvIGJlIHN5c2ZzX3JtZGlyKCkgYmVsb3csIGluc3RlYWQgb2YgY2FsbGluZyBzZXBhcmF0ZWx5LgorICovCisKK3ZvaWQgc3lzZnNfcmVtb3ZlX3NoYWRvd19kaXIoc3RydWN0IGRlbnRyeSAqc2hhZG93KQoreworCV9fc3lzZnNfcmVtb3ZlX2RpcihzaGFkb3cpOworfQorCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c2ZzX2Rpcl9vcGVyYXRpb25zID0gewogCS5vcGVuCQk9IHN5c2ZzX2Rpcl9vcGVuLAogCS5yZWxlYXNlCT0gc3lzZnNfZGlyX2Nsb3NlLApkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZmlsZS5jIGIvZnMvc3lzZnMvZmlsZS5jCmluZGV4IDljZmU1M2UuLmMwZTExNzYgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2ZpbGUuYworKysgYi9mcy9zeXNmcy9maWxlLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIApAQCAtNTAsMTcgKzUxLDI5IEBACiAJLnN0b3JlCT0gc3Vic3lzX2F0dHJfc3RvcmUsCiB9OwogCisvKioKKyAqCWFkZF90b19jb2xsZWN0aW9uIC0gYWRkIGJ1ZmZlciB0byBhIGNvbGxlY3Rpb24KKyAqCUBidWZmZXI6CWJ1ZmZlciB0byBiZSBhZGRlZAorICoJQG5vZGUJCWlub2RlIG9mIHNldCB0byBhZGQgdG8KKyAqLwogCi1zdHJ1Y3Qgc3lzZnNfYnVmZmVyIHsKLQlzaXplX3QJCQljb3VudDsKLQlsb2ZmX3QJCQlwb3M7Ci0JY2hhcgkJCSogcGFnZTsKLQlzdHJ1Y3Qgc3lzZnNfb3BzCSogb3BzOwotCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwotCWludAkJCW5lZWRzX3JlYWRfZmlsbDsKLQlpbnQJCQlldmVudDsKLX07CitzdGF0aWMgaW5saW5lIHZvaWQKK2FkZF90b19jb2xsZWN0aW9uKHN0cnVjdCBzeXNmc19idWZmZXIgKmJ1ZmZlciwgc3RydWN0IGlub2RlICpub2RlKQoreworCXN0cnVjdCBzeXNmc19idWZmZXJfY29sbGVjdGlvbiAqc2V0ID0gbm9kZS0+aV9wcml2YXRlOwogCisJbXV0ZXhfbG9jaygmbm9kZS0+aV9tdXRleCk7CisJbGlzdF9hZGQoJmJ1ZmZlci0+YXNzb2NpYXRlcywgJnNldC0+YXNzb2NpYXRlcyk7CisJbXV0ZXhfdW5sb2NrKCZub2RlLT5pX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdmVfZnJvbV9jb2xsZWN0aW9uKHN0cnVjdCBzeXNmc19idWZmZXIgKmJ1ZmZlciwgc3RydWN0IGlub2RlICpub2RlKQoreworCW11dGV4X2xvY2soJm5vZGUtPmlfbXV0ZXgpOworCWxpc3RfZGVsKCZidWZmZXItPmFzc29jaWF0ZXMpOworCW11dGV4X3VubG9jaygmbm9kZS0+aV9tdXRleCk7Cit9CiAKIC8qKgogICoJZmlsbF9yZWFkX2J1ZmZlciAtIGFsbG9jYXRlIGFuZCBmaWxsIGJ1ZmZlciBmcm9tIG9iamVjdC4KQEAgLTcwLDcgKzgzLDggQEAKICAqCUFsbG9jYXRlIEBidWZmZXItPnBhZ2UsIGlmIGl0IGhhc24ndCBiZWVuIGFscmVhZHksIHRoZW4gY2FsbCB0aGUKICAqCWtvYmplY3QncyBzaG93KCkgbWV0aG9kIHRvIGZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoaXMgYXR0cmlidXRlJ3MgCiAgKglkYXRhLiAKLSAqCVRoaXMgaXMgY2FsbGVkIG9ubHkgb25jZSwgb24gdGhlIGZpbGUncyBmaXJzdCByZWFkLiAKKyAqCVRoaXMgaXMgY2FsbGVkIG9ubHkgb25jZSwgb24gdGhlIGZpbGUncyBmaXJzdCByZWFkIHVubGVzcyBhbiBlcnJvcgorICoJaXMgcmV0dXJuZWQuCiAgKi8KIHN0YXRpYyBpbnQgZmlsbF9yZWFkX2J1ZmZlcihzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyKQogewpAQCAtODgsMTIgKzEwMiwxMyBAQAogCiAJYnVmZmVyLT5ldmVudCA9IGF0b21pY19yZWFkKCZzZC0+c19ldmVudCk7CiAJY291bnQgPSBvcHMtPnNob3coa29iaixhdHRyLGJ1ZmZlci0+cGFnZSk7Ci0JYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAwOwogCUJVR19PTihjb3VudCA+IChzc2l6ZV90KVBBR0VfU0laRSk7Ci0JaWYgKGNvdW50ID49IDApCisJaWYgKGNvdW50ID49IDApIHsKKwkJYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAwOwogCQlidWZmZXItPmNvdW50ID0gY291bnQ7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCXJldCA9IGNvdW50OworCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTMsNiArMTY4LDEwIEBACiAJc3NpemVfdCByZXR2YWwgPSAwOwogCiAJZG93bigmYnVmZmVyLT5zZW0pOworCWlmIChidWZmZXItPm9ycGhhbmVkKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KIAlpZiAoYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwpIHsKIAkJaWYgKChyZXR2YWwgPSBmaWxsX3JlYWRfYnVmZmVyKGZpbGUtPmZfcGF0aC5kZW50cnksYnVmZmVyKSkpCiAJCQlnb3RvIG91dDsKQEAgLTE2NSw3ICsxODQsNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLQogLyoqCiAgKglmaWxsX3dyaXRlX2J1ZmZlciAtIGNvcHkgYnVmZmVyIGZyb20gdXNlcnNwYWNlLgogICoJQGJ1ZmZlcjoJZGF0YSBidWZmZXIgZm9yIGZpbGUuCkBAIC0yNDMsMTkgKzI2MSwyNSBAQAogCXNzaXplX3QgbGVuOwogCiAJZG93bigmYnVmZmVyLT5zZW0pOworCWlmIChidWZmZXItPm9ycGhhbmVkKSB7CisJCWxlbiA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KIAlsZW4gPSBmaWxsX3dyaXRlX2J1ZmZlcihidWZmZXIsIGJ1ZiwgY291bnQpOwogCWlmIChsZW4gPiAwKQogCQlsZW4gPSBmbHVzaF93cml0ZV9idWZmZXIoZmlsZS0+Zl9wYXRoLmRlbnRyeSwgYnVmZmVyLCBsZW4pOwogCWlmIChsZW4gPiAwKQogCQkqcHBvcyArPSBsZW47CitvdXQ6CiAJdXAoJmJ1ZmZlci0+c2VtKTsKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX3Blcm0oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3N0YXRpYyBpbnQgc3lzZnNfb3Blbl9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gc3lzZnNfZ2V0X2tvYmplY3QoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9wYXJlbnQpOwogCXN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyID0gdG9fYXR0cihmaWxlLT5mX3BhdGguZGVudHJ5KTsKKwlzdHJ1Y3Qgc3lzZnNfYnVmZmVyX2NvbGxlY3Rpb24gKnNldDsKIAlzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyOwogCXN0cnVjdCBzeXNmc19vcHMgKiBvcHMgPSBOVUxMOwogCWludCBlcnJvciA9IDA7CkBAIC0yODUsNiArMzA5LDE4IEBACiAJaWYgKCFvcHMpCiAJCWdvdG8gRWFjY2VzczsKIAorCS8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgY29sbGVjdGlvbiB0byBhZGQgb3VyIGJ1ZmZlcnMgdG8gKi8KKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJaWYgKCEoc2V0ID0gaW5vZGUtPmlfcHJpdmF0ZSkpIHsKKwkJaWYgKCEoc2V0ID0gaW5vZGUtPmlfcHJpdmF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXNmc19idWZmZXJfY29sbGVjdGlvbiksIEdGUF9LRVJORUwpKSkgeworCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJZ290byBEb25lOworCQl9IGVsc2UgeworCQkJSU5JVF9MSVNUX0hFQUQoJnNldC0+YXNzb2NpYXRlcyk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisKIAkvKiBGaWxlIG5lZWRzIHdyaXRlIHN1cHBvcnQuCiAJICogVGhlIGlub2RlJ3MgcGVybXMgbXVzdCBzYXkgaXQncyBvaywgCiAJICogYW5kIHdlIG11c3QgaGF2ZSBhIHN0b3JlIG1ldGhvZC4KQEAgLTMxMCw5ICszNDYsMTEgQEAKIAkgKi8KIAlidWZmZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3lzZnNfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1ZmZlcikgeworCQlJTklUX0xJU1RfSEVBRCgmYnVmZmVyLT5hc3NvY2lhdGVzKTsKIAkJaW5pdF9NVVRFWCgmYnVmZmVyLT5zZW0pOwogCQlidWZmZXItPm5lZWRzX3JlYWRfZmlsbCA9IDE7CiAJCWJ1ZmZlci0+b3BzID0gb3BzOworCQlhZGRfdG9fY29sbGVjdGlvbihidWZmZXIsIGlub2RlKTsKIAkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnVmZmVyOwogCX0gZWxzZQogCQllcnJvciA9IC1FTk9NRU07CkBAIC0zMjUsMTYgKzM2MywxMSBAQAogCWVycm9yID0gLUVBQ0NFUzsKIAltb2R1bGVfcHV0KGF0dHItPm93bmVyKTsKICBEb25lOgotCWlmIChlcnJvciAmJiBrb2JqKQorCWlmIChlcnJvcikKIAkJa29iamVjdF9wdXQoa29iaik7CiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IHN5c2ZzX29wZW5fZmlsZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQotewotCXJldHVybiBjaGVja19wZXJtKGlub2RlLGZpbHApOwotfQotCiBzdGF0aWMgaW50IHN5c2ZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKIHsKIAlzdHJ1Y3Qga29iamVjdCAqIGtvYmogPSB0b19rb2JqKGZpbHAtPmZfcGF0aC5kZW50cnktPmRfcGFyZW50KTsKQEAgLTM0Miw4ICszNzUsOSBAQAogCXN0cnVjdCBtb2R1bGUgKiBvd25lciA9IGF0dHItPm93bmVyOwogCXN0cnVjdCBzeXNmc19idWZmZXIgKiBidWZmZXIgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKLQlpZiAoa29iaikgCi0JCWtvYmplY3RfcHV0KGtvYmopOworCWlmIChidWZmZXIpCisJCXJlbW92ZV9mcm9tX2NvbGxlY3Rpb24oYnVmZmVyLCBpbm9kZSk7CisJa29iamVjdF9wdXQoa29iaik7CiAJLyogQWZ0ZXIgdGhpcyBwb2ludCwgYXR0ciBzaG91bGQgbm90IGJlIGFjY2Vzc2VkLiAqLwogCW1vZHVsZV9wdXQob3duZXIpOwogCkBAIC01NDgsNyArNTgyLDcgQEAKIAogdm9pZCBzeXNmc19yZW1vdmVfZmlsZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyKQogewotCXN5c2ZzX2hhc2hfYW5kX3JlbW92ZShrb2JqLT5kZW50cnksYXR0ci0+bmFtZSk7CisJc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKGtvYmotPmRlbnRyeSwgYXR0ci0+bmFtZSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZ3JvdXAuYyBiL2ZzL3N5c2ZzL2dyb3VwLmMKaW5kZXggMTIyMTQ1Yi4uYjIwOTUxYyAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvZ3JvdXAuYworKysgYi9mcy9zeXNmcy9ncm91cC5jCkBAIC0xMyw2ICsxMyw4IEBACiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlICJzeXNmcy5oIgogCiAKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2lub2RlLmMgYi9mcy9zeXNmcy9pbm9kZS5jCmluZGV4IGU3OWUzOGQuLjU0MmQyYmMgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL2lub2RlLmMKKysrIGIvZnMvc3lzZnMvaW5vZGUuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgInN5c2ZzLmgiCiAKIGV4dGVybiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzeXNmc19zYjsKQEAgLTMyLDYgKzMzLDE2IEBACiAJLnNldGF0dHIJPSBzeXNmc19zZXRhdHRyLAogfTsKIAordm9pZCBzeXNmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwkvKiBGcmVlIHRoZSBzaGFkb3dlZCBkaXJlY3RvcnkgaW5vZGUgb3BlcmF0aW9ucyAqLworCWlmIChzeXNmc19pc19zaGFkb3dlZF9pbm9kZShpbm9kZSkpIHsKKwkJa2ZyZWUoaW5vZGUtPmlfb3ApOworCQlpbm9kZS0+aV9vcCA9IE5VTEw7CisJfQorCXJldHVybiBnZW5lcmljX2RlbGV0ZV9pbm9kZShpbm9kZSk7Cit9CisKIGludCBzeXNmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBpYXR0ciAqIGlhdHRyKQogewogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOwpAQCAtMjA5LDYgKzIyMCwyMiBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgb3JwaGFuX2FsbF9idWZmZXJzKHN0cnVjdCBpbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3Qgc3lzZnNfYnVmZmVyX2NvbGxlY3Rpb24gKnNldCA9IG5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3Qgc3lzZnNfYnVmZmVyICpidWY7CisKKwltdXRleF9sb2NrX25lc3RlZCgmbm9kZS0+aV9tdXRleCwgSV9NVVRFWF9DSElMRCk7CisJaWYgKG5vZGUtPmlfcHJpdmF0ZSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ1ZiwgJnNldC0+YXNzb2NpYXRlcywgYXNzb2NpYXRlcykgeworCQkJZG93bigmYnVmLT5zZW0pOworCQkJYnVmLT5vcnBoYW5lZCA9IDE7CisJCQl1cCgmYnVmLT5zZW0pOworCQl9CisJfQorCW11dGV4X3VubG9jaygmbm9kZS0+aV9tdXRleCk7Cit9CisKIAogLyoKICAqIFVuaGFzaGVzIHRoZSBkZW50cnkgY29ycmVzcG9uZGluZyB0byBnaXZlbiBzeXNmc19kaXJlbnQKQEAgLTIxNywxNiArMjQ0LDIzIEBACiB2b2lkIHN5c2ZzX2Ryb3BfZGVudHJ5KHN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCwgc3RydWN0IGRlbnRyeSAqIHBhcmVudCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gc2QtPnNfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKIAlpZiAoZGVudHJ5KSB7CiAJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOwogCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAkJaWYgKCEoZF91bmhhc2hlZChkZW50cnkpICYmIGRlbnRyeS0+ZF9pbm9kZSkpIHsKKwkJCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJCV9faWdldChpbm9kZSk7CisJCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCQlkZ2V0X2xvY2tlZChkZW50cnkpOwogCQkJX19kX2Ryb3AoZGVudHJ5KTsKIAkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOwogCQkJc2ltcGxlX3VubGluayhwYXJlbnQtPmRfaW5vZGUsIGRlbnRyeSk7CisJCQlvcnBoYW5fYWxsX2J1ZmZlcnMoaW5vZGUpOworCQkJaXB1dChpbm9kZSk7CiAJCX0gZWxzZSB7CiAJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOwogCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKQEAgLTI0OCw3ICsyODIsNyBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAogCXBhcmVudF9zZCA9IGRpci0+ZF9mc2RhdGE7Ci0JbXV0ZXhfbG9jaygmZGlyLT5kX2lub2RlLT5pX211dGV4KTsKKwltdXRleF9sb2NrX25lc3RlZCgmZGlyLT5kX2lub2RlLT5pX211dGV4LCBJX01VVEVYX1BBUkVOVCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzZCwgJnBhcmVudF9zZC0+c19jaGlsZHJlbiwgc19zaWJsaW5nKSB7CiAJCWlmICghc2QtPnNfZWxlbWVudCkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvbW91bnQuYyBiL2ZzL3N5c2ZzL21vdW50LmMKaW5kZXggZTUwM2Y4NS4uZjZhODdhOCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvbW91bnQuYworKysgYi9mcy9zeXNmcy9tb3VudC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNpbmNsdWRlICJzeXNmcy5oIgogCkBAIC0xOCw5ICsxOSwxMiBAQAogc3RydWN0IHN1cGVyX2Jsb2NrICogc3lzZnNfc2IgPSBOVUxMOwogc3RydWN0IGttZW1fY2FjaGUgKnN5c2ZzX2Rpcl9jYWNoZXA7CiAKK3N0YXRpYyB2b2lkIHN5c2ZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc3lzZnNfb3BzID0gewogCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKLQkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorCS5kcm9wX2lub2RlCT0gc3lzZnNfZGVsZXRlX2lub2RlLAorCS5jbGVhcl9pbm9kZQk9IHN5c2ZzX2NsZWFyX2lub2RlLAogfTsKIAogc3RhdGljIHN0cnVjdCBzeXNmc19kaXJlbnQgc3lzZnNfcm9vdCA9IHsKQEAgLTMxLDYgKzM1LDExIEBACiAJLnNfaWF0dHIJPSBOVUxMLAogfTsKIAorc3RhdGljIHZvaWQgc3lzZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrZnJlZShpbm9kZS0+aV9wcml2YXRlKTsKK30KKwogc3RhdGljIGludCBzeXNmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL3N5bWxpbmsuYyBiL2ZzL3N5c2ZzL3N5bWxpbmsuYwppbmRleCBmNTBlM2NjLi40ODY5ZjYxIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9zeW1saW5rLmMKKysrIGIvZnMvc3lzZnMvc3ltbGluay5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KIAogI2luY2x1ZGUgInN5c2ZzLmgiCiAKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL3N5c2ZzLmggYi9mcy9zeXNmcy9zeXNmcy5oCmluZGV4IGJkN2NlYzIuLmZlMWNiZmQgMTAwNjQ0Ci0tLSBhL2ZzL3N5c2ZzL3N5c2ZzLmgKKysrIGIvZnMvc3lzZnMvc3lzZnMuaApAQCAtMiw2ICsyLDcgQEAKIGV4dGVybiBzdHJ1Y3QgdmZzbW91bnQgKiBzeXNmc19tb3VudDsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqc3lzZnNfZGlyX2NhY2hlcDsKIAorZXh0ZXJuIHZvaWQgc3lzZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogZXh0ZXJuIHN0cnVjdCBpbm9kZSAqIHN5c2ZzX25ld19pbm9kZShtb2RlX3QgbW9kZSwgc3RydWN0IHN5c2ZzX2RpcmVudCAqKTsKIGV4dGVybiBpbnQgc3lzZnNfY3JlYXRlKHN0cnVjdCBkZW50cnkgKiwgaW50IG1vZGUsIGludCAoKmluaXQpKHN0cnVjdCBpbm9kZSAqKSk7CiAKQEAgLTMzLDYgKzM0LDIyIEBACiAJc3RydWN0IGtvYmplY3QgKiB0YXJnZXRfa29iajsKIH07CiAKK3N0cnVjdCBzeXNmc19idWZmZXIgeworCXN0cnVjdCBsaXN0X2hlYWQJCWFzc29jaWF0ZXM7CisJc2l6ZV90CQkJCWNvdW50OworCWxvZmZfdAkJCQlwb3M7CisJY2hhcgkJCQkqIHBhZ2U7CisJc3RydWN0IHN5c2ZzX29wcwkJKiBvcHM7CisJc3RydWN0IHNlbWFwaG9yZQkJc2VtOworCWludAkJCQlvcnBoYW5lZDsKKwlpbnQJCQkJbmVlZHNfcmVhZF9maWxsOworCWludAkJCQlldmVudDsKK307CisKK3N0cnVjdCBzeXNmc19idWZmZXJfY29sbGVjdGlvbiB7CisJc3RydWN0IGxpc3RfaGVhZAlhc3NvY2lhdGVzOworfTsKKwogc3RhdGljIGlubGluZSBzdHJ1Y3Qga29iamVjdCAqIHRvX2tvYmooc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKIHsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QgPSBkZW50cnktPmRfZnNkYXRhOwpAQCAtOTYsMyArMTEzLDcgQEAKIAkJcmVsZWFzZV9zeXNmc19kaXJlbnQoc2QpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBzeXNmc19pc19zaGFkb3dlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIGlub2RlLT5pX29wLT5mb2xsb3dfbGluazsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKaW5kZXggZWJjMWY2OS4uNDIyZjI5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC02Myw3ICs2Myw3IEBACiAKIC8qIEN1cnJlbnQgQUNQSUNBIHN1YnN5c3RlbSB2ZXJzaW9uIGluIFlZWVlNTUREIGZvcm1hdCAqLwogCi0jZGVmaW5lIEFDUElfQ0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgyMDA2MDcwNworI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAwNzAxMjYKIAogLyoKICAqIE9TIG5hbWUsIHVzZWQgZm9yIHRoZSBfT1Mgb2JqZWN0LiAgVGhlIF9PUyBvYmplY3QgaXMgZXNzZW50aWFsbHkgb2Jzb2xldGUsCkBAIC0xMTUsNiArMTE1LDEwIEBACiAKICNkZWZpbmUgQUNQSV9OVU1fT1dORVJJRF9NQVNLUyAgICAgICAgICA4CiAKKy8qIFNpemUgb2YgdGhlIHJvb3QgdGFibGUgYXJyYXkgaXMgaW5jcmVhc2VkIGJ5IHRoaXMgaW5jcmVtZW50ICovCisKKyNkZWZpbmUgQUNQSV9ST09UX1RBQkxFX1NJWkVfSU5DUkVNRU5UICA0CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBBQ1BJIFNwZWNpZmljYXRpb24gY29uc3RhbnRzIChEbyBub3QgY2hhbmdlIHVubGVzcyB0aGUgc3BlY2lmaWNhdGlvbiBjaGFuZ2VzKQpAQCAtMTUyLDYgKzE1NiwxMSBAQAogI2RlZmluZSBBQ1BJX1BBVEhfU0VHTUVOVF9MRU5HVEggICAgICAgIDUJLyogNCBjaGFycyBmb3IgbmFtZSArIDEgY2hhciBmb3Igc2VwYXJhdG9yICovCiAjZGVmaW5lIEFDUElfUEFUSF9TRVBBUkFUT1IgICAgICAgICAgICAgJy4nCiAKKy8qIFNpemVzIGZvciBBQ1BJIHRhYmxlIGhlYWRlcnMgKi8KKworI2RlZmluZSBBQ1BJX09FTV9JRF9TSVpFICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQUNQSV9PRU1fVEFCTEVfSURfU0laRSAgICAgICAgICA4CisKIC8qIENvbnN0YW50cyB1c2VkIGluIHNlYXJjaGluZyBmb3IgdGhlIFJTRFAgaW4gbG93IG1lbW9yeSAqLwogCiAjZGVmaW5lIEFDUElfRUJEQV9QVFJfTE9DQVRJT04gICAgICAgICAgMHgwMDAwMDQwRQkvKiBQaHlzaWNhbCBBZGRyZXNzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNkZWJ1Zy5oIGIvaW5jbHVkZS9hY3BpL2FjZGVidWcuaAppbmRleCBkODE2NzA5Li5kNjI2YmIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkZWJ1Zy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xNTksNiArMTU5LDEwIEBACiBhY3BpX2RiX2NyZWF0ZV9leGVjdXRpb25fdGhyZWFkcyhjaGFyICpudW1fdGhyZWFkc19hcmcsCiAJCQkJIGNoYXIgKm51bV9sb29wc19hcmcsIGNoYXIgKm1ldGhvZF9uYW1lX2FyZyk7CiAKKyNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwordTMyIGFjcGlfZGJfZ2V0X2NhY2hlX2luZm8oc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKmNhY2hlKTsKKyNlbmRpZgorCiAvKgogICogZGJmaWxlaW8gLSBEZWJ1Z2dlciBmaWxlIEkvTyBjb21tYW5kcwogICovCkBAIC0yMTQsNCArMjE4LDYgQEAKIAogc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFjcGlfZGJfbG9jYWxfbnNfbG9va3VwKGNoYXIgKm5hbWUpOwogCit2b2lkIGFjcGlfZGJfdWludDMyX3RvX2hleF9zdHJpbmcodTMyIHZhbHVlLCBjaGFyICpidWZmZXIpOworCiAjZW5kaWYJCQkJLyogX19BQ0RFQlVHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZGlzYXNtLmggYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAppbmRleCA5YTdkNjkyLi4zODlkNzcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaAorKysgYi9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTk3LDkgKzk3LDExIEBACiAjZGVmaW5lIEFDUElfRE1UX0NIS1NVTSAgICAgICAgICAgICAgICAgMjAKICNkZWZpbmUgQUNQSV9ETVRfU1BBQ0VJRCAgICAgICAgICAgICAgICAyMQogI2RlZmluZSBBQ1BJX0RNVF9HQVMgICAgICAgICAgICAgICAgICAgIDIyCi0jZGVmaW5lIEFDUElfRE1UX01BRFQgICAgICAgICAgICAgICAgICAgMjMKLSNkZWZpbmUgQUNQSV9ETVRfU1JBVCAgICAgICAgICAgICAgICAgICAyNAotI2RlZmluZSBBQ1BJX0RNVF9FWElUICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIEFDUElfRE1UX0RNQVIgICAgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgQUNQSV9ETVRfTUFEVCAgICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBBQ1BJX0RNVF9TUkFUICAgICAgICAgICAgICAgICAgIDI1CisjZGVmaW5lIEFDUElfRE1UX0VYSVQgICAgICAgICAgICAgICAgICAgMjYKKyNkZWZpbmUgQUNQSV9ETVRfU0lHICAgICAgICAgICAgICAgICAgICAyNwogCiB0eXBlZGVmCiB2b2lkICgqQUNQSV9UQUJMRV9IQU5ETEVSKSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICogdGFibGUpOwpAQCAtMTA4LDYgKzExMCw3IEBACiAJY2hhciAqc2lnbmF0dXJlOwogCXN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyAqdGFibGVfaW5mbzsKIAlBQ1BJX1RBQkxFX0hBTkRMRVIgdGFibGVfaGFuZGxlcjsKKwljaGFyICpuYW1lOwogfTsKIAogc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvIHsKQEAgLTEzOSw3ICsxNDIsOSBAQAogCiBleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19hc2YwW107CiBleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19hc2YxW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19hc2YxYVtdOwogZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmMltdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmMmFbXTsKIGV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2FzZjNbXTsKIGV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2FzZjRbXTsKIGV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2FzZl9oZHJbXTsKQEAgLTE0Nyw2ICsxNTIsMTEgQEAKIGV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2NwZXBbXTsKIGV4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2NwZXAwW107CiBleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19kYmdwW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19kbWFyW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19kbWFyX2hkcltdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fZG1hcl9zY29wZVtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fZG1hcjBbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2RtYXIxW107CiBleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19lY2R0W107CiBleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19mYWNzW107CiBleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19mYWR0MVtdOwpAQCAtMjAxLDYgKzIxMSw4IEBACiAKIHZvaWQgYWNwaV9kbV9kdW1wX2NwZXAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSk7CiAKK3ZvaWQgYWNwaV9kbV9kdW1wX2RtYXIoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSk7CisKIHZvaWQgYWNwaV9kbV9kdW1wX2ZhZHQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSk7CiAKIHZvaWQgYWNwaV9kbV9kdW1wX3NyYXQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSk7CkBAIC0zMTQsNyArMzI2LDcgQEAKIAkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAogCQkJICB1OCAqIGJ5dGVfZGF0YSwgdTMyIGJ5dGVfY291bnQpOwogCi11OCBhY3BpX2RtX2lzX3Jlc291cmNlX3RlbXBsYXRlKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CithY3BpX3N0YXR1cyBhY3BpX2RtX2lzX3Jlc291cmNlX3RlbXBsYXRlKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CiAKIHZvaWQgYWNwaV9kbV9pbmRlbnQodTMyIGxldmVsKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZGlzcGF0LmggYi9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaAppbmRleCBhMjJmZTljLi5jYjhkMjg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTIxMCw3ICsyMTAsNyBAQAogICogZHNpbml0CiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRpYWxpemVfb2JqZWN0cyhzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjLAorYWNwaV9kc19pbml0aWFsaXplX29iamVjdHMoYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleCwKIAkJCSAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpzdGFydF9ub2RlKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2V2ZW50cy5oIGIvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmgKaW5kZXggMjM0MTQyODIuLmQyM2NkZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2V2ZW50cy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2V2ZW50cy5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaCBiL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmgKaW5kZXggNzk3Y2ExZS4uYjczZjE4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNleGNlcC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMTc4LDggKzE3OCwxMCBAQAogI2RlZmluZSBBRV9DVFJMX0JSRUFLICAgICAgICAgICAgICAgICAgIChhY3BpX3N0YXR1cykgKDB4MDAwOSB8IEFFX0NPREVfQ09OVFJPTCkKICNkZWZpbmUgQUVfQ1RSTF9DT05USU5VRSAgICAgICAgICAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMEEgfCBBRV9DT0RFX0NPTlRST0wpCiAjZGVmaW5lIEFFX0NUUkxfU0tJUCAgICAgICAgICAgICAgICAgICAgKGFjcGlfc3RhdHVzKSAoMHgwMDBCIHwgQUVfQ09ERV9DT05UUk9MKQorI2RlZmluZSBBRV9DVFJMX1BBUlNFX0NPTlRJTlVFICAgICAgICAgIChhY3BpX3N0YXR1cykgKDB4MDAwQyB8IEFFX0NPREVfQ09OVFJPTCkKKyNkZWZpbmUgQUVfQ1RSTF9QQVJTRV9QRU5ESU5HICAgICAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMEQgfCBBRV9DT0RFX0NPTlRST0wpCiAKLSNkZWZpbmUgQUVfQ09ERV9DVFJMX01BWCAgICAgICAgICAgICAgICAweDAwMEIKKyNkZWZpbmUgQUVfQ09ERV9DVFJMX01BWCAgICAgICAgICAgICAgICAweDAwMEQKIAogI2lmZGVmIERFRklORV9BQ1BJX0dMT0JBTFMKIApAQCAtMjkxLDcgKzI5Myw5IEBACiAJIkFFX0NUUkxfVFJBTlNGRVIiLAogCSJBRV9DVFJMX0JSRUFLIiwKIAkiQUVfQ1RSTF9DT05USU5VRSIsCi0JIkFFX0NUUkxfU0tJUCIKKwkiQUVfQ1RSTF9TS0lQIiwKKwkiQUVfQ1RSTF9QQVJTRV9DT05USU5VRSIsCisJIkFFX0NUUkxfUEFSU0VfUEVORElORyIKIH07CiAKICNlbmRpZgkJCQkvKiBBQ1BJIEdMT0JBTFMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2dsb2JhbC5oIGIvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmgKaW5kZXggMDY5NzJlNi4uMjRjM2YwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC01OCwzNyArNTgsNiBAQAogI2RlZmluZSBBQ1BJX0lOSVRfR0xPQkFMKGEsYikgYQogI2VuZGlmCiAKLS8qCi0gKiBLZWVwIGxvY2FsIGNvcGllcyBvZiB0aGVzZSBGQURULWJhc2VkIHJlZ2lzdGVycy4gIE5PVEU6IFRoZXNlIGdsb2JhbHMKLSAqIGFyZSBmaXJzdCBpbiB0aGlzIGZpbGUgZm9yIGFsaWdubWVudCByZWFzb25zIG9uIDY0LWJpdCBzeXN0ZW1zLgotICovCi1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgYWNwaV9nYmxfeHBtMWFfZW5hYmxlOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGFjcGlfZ2JsX3hwbTFiX2VuYWJsZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRGVidWcgc3VwcG9ydAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBSdW50aW1lIGNvbmZpZ3VyYXRpb24gb2YgZGVidWcgcHJpbnQgbGV2ZWxzICovCi0KLWV4dGVybiB1MzIgYWNwaV9kYmdfbGV2ZWw7Ci1leHRlcm4gdTMyIGFjcGlfZGJnX2xheWVyOwotCi0vKiBQcm9jZWR1cmUgbmVzdGluZyBsZXZlbCBmb3IgZGVidWcgb3V0cHV0ICovCi0KLWV4dGVybiB1MzIgYWNwaV9nYmxfbmVzdGluZ19sZXZlbDsKLQotLyogU3VwcG9ydCBmb3IgZHluYW1pYyBjb250cm9sIG1ldGhvZCB0cmFjaW5nIG1lY2hhbmlzbSAqLwotCi1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfb3JpZ2luYWxfZGJnX2xldmVsOwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX29yaWdpbmFsX2RiZ19sYXllcjsKLUFDUElfRVhURVJOIGFjcGlfbmFtZSBhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZTsKLUFDUElfRVhURVJOIHUzMiBhY3BpX2dibF90cmFjZV9kYmdfbGV2ZWw7Ci1BQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfdHJhY2VfZGJnX2xheWVyOwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3RyYWNlX2ZsYWdzOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBSdW50aW1lIGNvbmZpZ3VyYXRpb24gKHN0YXRpYyBkZWZhdWx0cyB0aGF0IGNhbiBiZSBvdmVycmlkZW4gYXQgcnVudGltZSkKQEAgLTEzNSw1MiArMTA0LDYyIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqIERlYnVnIHN1cHBvcnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUnVudGltZSBjb25maWd1cmF0aW9uIG9mIGRlYnVnIHByaW50IGxldmVscyAqLworCitleHRlcm4gdTMyIGFjcGlfZGJnX2xldmVsOworZXh0ZXJuIHUzMiBhY3BpX2RiZ19sYXllcjsKKworLyogUHJvY2VkdXJlIG5lc3RpbmcgbGV2ZWwgZm9yIGRlYnVnIG91dHB1dCAqLworCitleHRlcm4gdTMyIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWw7CisKKy8qIEV2ZW50IGNvdW50ZXJzICovCisKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dwZV9jb3VudDsKKworLyogU3VwcG9ydCBmb3IgZHluYW1pYyBjb250cm9sIG1ldGhvZCB0cmFjaW5nIG1lY2hhbmlzbSAqLworCitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfb3JpZ2luYWxfZGJnX2xldmVsOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX29yaWdpbmFsX2RiZ19sYXllcjsKK0FDUElfRVhURVJOIGFjcGlfbmFtZSBhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZTsKK0FDUElfRVhURVJOIHUzMiBhY3BpX2dibF90cmFjZV9kYmdfbGV2ZWw7CitBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfdHJhY2VfZGJnX2xheWVyOworQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3RyYWNlX2ZsYWdzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCiAgKiBBQ1BJIFRhYmxlIGdsb2JhbHMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIFRhYmxlIHBvaW50ZXJzLgotICogQWx0aG91Z2ggdGhlc2UgcG9pbnRlcnMgYXJlIHNvbWV3aGF0IHJlZHVuZGFudCB3aXRoIHRoZSBnbG9iYWwgYWNwaV90YWJsZSwKLSAqIHRoZXkgYXJlIGNvbnZlbmllbnQgYmVjYXVzZSB0aGV5IGFyZSB0eXBlZCBwb2ludGVycy4KKyAqIGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdCBpcyB0aGUgbWFzdGVyIGxpc3Qgb2YgQUNQSSB0YWJsZXMgZm91bmQgaW4gdGhlCisgKiBSU0RUL1hTRFQuCiAgKgotICogVGhlc2UgdGFibGVzIGFyZSBzaW5nbGUtdGFibGUgb25seTsgbWVhbmluZyB0aGF0IHRoZXJlIGNhbiBiZSBhdCBtb3N0IG9uZQotICogb2YgZWFjaCBpbiB0aGUgc3lzdGVtLiAgRWFjaCBnbG9iYWwgcG9pbnRzIHRvIHRoZSBhY3R1YWwgdGFibGUuCisgKiBhY3BpX2dibF9GQURUIGlzIGEgbG9jYWwgY29weSBvZiB0aGUgRkFEVCwgY29udmVydGVkIHRvIGEgY29tbW9uIGZvcm1hdC4KICAqLwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3RhYmxlX2ZsYWdzOwotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQ7Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yICphY3BpX2dibF9SU0RQOwotQUNQSV9FWFRFUk4gc3RydWN0IHhzZHRfZGVzY3JpcHRvciAqYWNwaV9nYmxfWFNEVDsKLUFDUElfRVhURVJOIHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgKmFjcGlfZ2JsX0ZBRFQ7Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmFjcGlfZ2JsX0RTRFQ7Ci1BQ1BJX0VYVEVSTiBzdHJ1Y3QgZmFjc19kZXNjcmlwdG9yICphY3BpX2dibF9GQUNTOwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfY29tbW9uX2ZhY3MgYWNwaV9nYmxfY29tbW9uX2ZBQ1M7Ci0vKgotICogU2luY2UgdGhlcmUgbWF5IGJlIG11bHRpcGxlIFNTRFRzIGFuZCBQU0RUcywgYSBzaW5nbGUgcG9pbnRlciBpcyBub3QKLSAqIHN1ZmZpY2llbnQ7IFRoZXJlZm9yZSwgdGhlcmUgaXNuJ3Qgb25lIQotICovCitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9pbnRlcm5hbF9yc2R0IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdDsKK0FDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQgYWNwaV9nYmxfRkFEVDsKK2V4dGVybiBhY3BpX25hdGl2ZV91aW50IGFjcGlfZ2JsX3Blcm1hbmVudF9tbWFwOwogCi0vKiBUaGUgcm9vdCB0YWJsZSBjYW4gYmUgZWl0aGVyIGFuIFJTRFQgb3IgYW4gWFNEVCAqLworLyogVGhlc2UgYWRkcmVzc2VzIGFyZSBjYWxjdWxhdGVkIGZyb20gRkFEVCBhZGRyZXNzIHZhbHVlcyAqLwogCi1BQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9yb290X3RhYmxlX3R5cGU7Ci0jZGVmaW5lICAgICBBQ1BJX1RBQkxFX1RZUEVfUlNEVCAgICAgICAgJ1InCi0jZGVmaW5lICAgICBBQ1BJX1RBQkxFX1RZUEVfWFNEVCAgICAgICAgJ1gnCitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgYWNwaV9nYmxfeHBtMWFfZW5hYmxlOworQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGFjcGlfZ2JsX3hwbTFiX2VuYWJsZTsKIAogLyoKLSAqIEhhbmRsZSBib3RoIEFDUEkgMS4wIGFuZCBBQ1BJIDIuMCBJbnRlZ2VyIHdpZHRoczoKLSAqIElmIHdlIGFyZSBleGVjdXRpbmcgYSBtZXRob2QgdGhhdCBleGlzdHMgaW4gYSAzMi1iaXQgQUNQSSB0YWJsZSwKLSAqIHVzZSBvbmx5IHRoZSBsb3dlciAzMiBiaXRzIG9mIHRoZSAoaW50ZXJuYWwpIDY0LWJpdCBJbnRlZ2VyLgorICogSGFuZGxlIGJvdGggQUNQSSAxLjAgYW5kIEFDUEkgMi4wIEludGVnZXIgd2lkdGhzLiBUaGUgaW50ZWdlciB3aWR0aCBpcworICogZGV0ZXJtaW5lZCBieSB0aGUgcmV2aXNpb24gb2YgdGhlIERTRFQ6IElmIHRoZSBEU0RUIHJldmlzaW9uIGlzIGxlc3MgdGhhbgorICogMiwgdXNlIG9ubHkgdGhlIGxvd2VyIDMyIGJpdHMgb2YgdGhlIGludGVybmFsIDY0LWJpdCBJbnRlZ2VyLgogICovCiBBQ1BJX0VYVEVSTiB1OCBhY3BpX2dibF9pbnRlZ2VyX2JpdF93aWR0aDsKIEFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aDsKIEFDUElfRVhURVJOIHU4IGFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoOwogCi0vKgotICogQUNQSSBUYWJsZSBpbmZvIGFycmF5cwotICovCi1leHRlcm4gc3RydWN0IGFjcGlfdGFibGVfbGlzdCBhY3BpX2dibF90YWJsZV9saXN0c1tBQ1BJX1RBQkxFX0lEX01BWCArIDFdOwotZXh0ZXJuIHN0cnVjdCBhY3BpX3RhYmxlX3N1cHBvcnQgYWNwaV9nYmxfdGFibGVfZGF0YVtBQ1BJX1RBQkxFX0lEX01BWCArIDFdOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBNdXR1YWwgZXhsdXNpb24gd2l0aGluIEFDUElDQSBzdWJzeXN0ZW0KQEAgLTE4OCw3ICsxNjcsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBQcmVkZWZpbmVkIG11dGV4IG9iamVjdHMuICBUaGlzIGFycmF5IGNvbnRhaW5zIHRoZQorICogUHJlZGVmaW5lZCBtdXRleCBvYmplY3RzLiBUaGlzIGFycmF5IGNvbnRhaW5zIHRoZQogICogYWN0dWFsIE9TIG11dGV4IGhhbmRsZXMsIGluZGV4ZWQgYnkgdGhlIGxvY2FsIEFDUElfTVVURVhfSEFORExFcy4KICAqIChUaGUgdGFibGUgbWFwcyBsb2NhbCBoYW5kbGVzIHRvIHRoZSByZWFsIE9TIGhhbmRsZXMpCiAgKi8KQEAgLTE5Nyw2ICsxNzYsNyBAQAogLyoKICAqIEdsb2JhbCBsb2NrIHNlbWFwaG9yZSB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhY3R1YWwgSFcgZ2xvYmFsIGxvY2sKICAqLworQUNQSV9FWFRFUk4gYWNwaV9tdXRleCBhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleDsKIEFDUElfRVhURVJOIGFjcGlfc2VtYXBob3JlIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZTsKIAogLyoKQEAgLTIyMCw2ICsyMDAsNyBAQAogCiBBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqYWNwaV9nYmxfZ2xvYmFsX2xpc3Q7CiBBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAqYWNwaV9nYmxfbnNfbm9kZV9saXN0OworQUNQSV9FWFRFUk4gdTggYWNwaV9nYmxfZGlzcGxheV9maW5hbF9tZW1fc3RhdHM7CiAjZW5kaWYKIAogLyogT2JqZWN0IGNhY2hlcyAqLwpAQCAtMjQwLDcgKzIyMSw2IEBACiAKIC8qIE1pc2MgKi8KIAotQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudDsKIEFDUElfRVhURVJOIHUzMiBhY3BpX2dibF9vcmlnaW5hbF9tb2RlOwogQUNQSV9FWFRFUk4gdTMyIGFjcGlfZ2JsX3JzZHBfb3JpZ2luYWxfbG9jYXRpb247CiBBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfbnNfbG9va3VwX2NvdW50OwpAQCAtMjYwLDEyICsyNDAsMTkgQEAKIAogZXh0ZXJuIHU4IGFjcGlfZ2JsX3NodXRkb3duOwogZXh0ZXJuIHUzMiBhY3BpX2dibF9zdGFydHVwX2ZsYWdzOwotZXh0ZXJuIGNvbnN0IHU4IGFjcGlfZ2JsX2RlY29kZV90bzhiaXRbOF07CiBleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfc2xlZXBfc3RhdGVfbmFtZXNbQUNQSV9TX1NUQVRFX0NPVU5UXTsKIGV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9oaWdoZXN0X2RzdGF0ZV9uYW1lc1s0XTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyBhY3BpX2dibF9hbWxfb3BfaW5mb1tBTUxfTlVNX09QQ09ERVNdOwogZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3JlZ2lvbl90eXBlc1tBQ1BJX05VTV9QUkVERUZJTkVEX1JFR0lPTlNdOwogCisvKiBFeGNlcHRpb24gY29kZXMgKi8KKworZXh0ZXJuIGNoYXIgY29uc3QgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19lbnZbXTsKK2V4dGVybiBjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfcGdtW107CitleHRlcm4gY2hhciBjb25zdCAqYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3RibFtdOworZXh0ZXJuIGNoYXIgY29uc3QgKmFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19hbWxbXTsKK2V4dGVybiBjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfY3RybFtdOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBOYW1lc3BhY2UgZ2xvYmFscwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaCBiL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmgKaW5kZXggMjliNjBhOC4uOWRmMjc1Y2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTYxLDggKzYxLDYgQEAKIC8qCiAgKiBod2FjcGkgLSBoaWdoIGxldmVsIGZ1bmN0aW9ucwogICovCi1hY3BpX3N0YXR1cyBhY3BpX2h3X2luaXRpYWxpemUodm9pZCk7Ci0KIGFjcGlfc3RhdHVzIGFjcGlfaHdfc2V0X21vZGUodTMyIG1vZGUpOwogCiB1MzIgYWNwaV9od19nZXRfbW9kZSh2b2lkKTsKQEAgLTg0LDcgKzgyLDcgQEAKIGFjcGlfc3RhdHVzCiBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSh1MzIgd2lkdGgsIHUzMiB2YWx1ZSwgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpyZWcpOwogCi1hY3BpX3N0YXR1cyBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzKHUzMiBmbGFncyk7CithY3BpX3N0YXR1cyBhY3BpX2h3X2NsZWFyX2FjcGlfc3RhdHVzKHZvaWQpOwogCiAvKgogICogaHdncGUgLSBHUEUgc3VwcG9ydApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmggYi9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaAppbmRleCA5MTU4NmQwLi5jZTdjOWQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTI3NywxMiArMjc3LDYgQEAKIAogYWNwaV9zdGF0dXMgYWNwaV9leF9zeXN0ZW1fZG9fc3RhbGwodTMyIHRpbWUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zeXN0ZW1fYWNxdWlyZV9tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0aW1lLAotCQkJICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYyk7Ci0KLWFjcGlfc3RhdHVzIGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwotCiBhY3BpX3N0YXR1cyBhY3BpX2V4X3N5c3RlbV9zaWduYWxfZXZlbnQodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCiBhY3BpX3N0YXR1cwpAQCAtNDUxLDEwICs0NDUsMTQgQEAKIC8qCiAgKiBleHV0aWxzIC0gaW50ZXJwcmV0ZXIvc2Nhbm5lciB1dGlsaXRpZXMKICAqLwotYWNwaV9zdGF0dXMgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcih2b2lkKTsKK3ZvaWQgYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcih2b2lkKTsKIAogdm9pZCBhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIodm9pZCk7CiAKK3ZvaWQgYWNwaV9leF9yZWFjcXVpcmVfaW50ZXJwcmV0ZXIodm9pZCk7CisKK3ZvaWQgYWNwaV9leF9yZWxpbnF1aXNoX2ludGVycHJldGVyKHZvaWQpOworCiB2b2lkIGFjcGlfZXhfdHJ1bmNhdGVfZm9yMzJiaXRfdGFibGUodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCiB1OCBhY3BpX2V4X2FjcXVpcmVfZ2xvYmFsX2xvY2sodTMyIHJ1bGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaCBiL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmgKaW5kZXggMDYzYzRiNS4uNmY4M2RkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNsb2NhbC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtODAsOCArODAsOCBAQAogICogdGFibGUgYmVsb3cgYWxzbyEKICAqLwogI2RlZmluZSBBQ1BJX01UWF9JTlRFUlBSRVRFUiAgICAgICAgICAgIDAJLyogQU1MIEludGVycHJldGVyLCBtYWluIGxvY2sgKi8KLSNkZWZpbmUgQUNQSV9NVFhfVEFCTEVTICAgICAgICAgICAgICAgICAxCS8qIERhdGEgZm9yIEFDUEkgdGFibGVzICovCi0jZGVmaW5lIEFDUElfTVRYX05BTUVTUEFDRSAgICAgICAgICAgICAgMgkvKiBBQ1BJIE5hbWVzcGFjZSAqLworI2RlZmluZSBBQ1BJX01UWF9OQU1FU1BBQ0UgICAgICAgICAgICAgIDEJLyogQUNQSSBOYW1lc3BhY2UgKi8KKyNkZWZpbmUgQUNQSV9NVFhfVEFCTEVTICAgICAgICAgICAgICAgICAyCS8qIERhdGEgZm9yIEFDUEkgdGFibGVzICovCiAjZGVmaW5lIEFDUElfTVRYX0VWRU5UUyAgICAgICAgICAgICAgICAgMwkvKiBEYXRhIGZvciBBQ1BJIGV2ZW50cyAqLwogI2RlZmluZSBBQ1BJX01UWF9DQUNIRVMgICAgICAgICAgICAgICAgIDQJLyogSW50ZXJuYWwgY2FjaGVzLCBnZW5lcmFsIHB1cnBvc2VzICovCiAjZGVmaW5lIEFDUElfTVRYX01FTU9SWSAgICAgICAgICAgICAgICAgNQkvKiBEZWJ1ZyBtZW1vcnkgdHJhY2tpbmcgbGlzdHMgKi8KQEAgLTE2Miw3ICsxNjIsNyBAQAogdHlwZWRlZiBlbnVtIHsKIAlBQ1BJX0lNT0RFX0xPQURfUEFTUzEgPSAweDAxLAogCUFDUElfSU1PREVfTE9BRF9QQVNTMiA9IDB4MDIsCi0JQUNQSV9JTU9ERV9FWEVDVVRFID0gMHgwRQorCUFDUElfSU1PREVfRVhFQ1VURSA9IDB4MDMKIH0gYWNwaV9pbnRlcnByZXRlcl9tb2RlOwogCiB1bmlvbiBhY3BpX25hbWVfdW5pb24gewpAQCAtMjA0LDcgKzIwNCw3IEBACiAvKiBOYW1lc3BhY2UgTm9kZSBmbGFncyAqLwogCiAjZGVmaW5lIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QgICAgICAgICAgMHgwMQkvKiBFbmQtb2YtbGlzdCwgUGVlciBmaWVsZCBwb2ludHMgdG8gcGFyZW50ICovCi0jZGVmaW5lIEFOT0JKX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgMHgwMgkvKiBBdmFpbGFibGUgZm9yIGZ1dHVyZSB1c2UgKi8KKyNkZWZpbmUgQU5PQkpfVEVNUE9SQVJZICAgICAgICAgICAgICAgICAweDAyCS8qIE5vZGUgaXMgY3JlYXRlIGJ5IGEgbWV0aG9kIGFuZCBpcyB0ZW1wb3JhcnkgKi8KICNkZWZpbmUgQU5PQkpfTUVUSE9EX0FSRyAgICAgICAgICAgICAgICAweDA0CS8qIE5vZGUgaXMgYSBtZXRob2QgYXJndW1lbnQgKi8KICNkZWZpbmUgQU5PQkpfTUVUSE9EX0xPQ0FMICAgICAgICAgICAgICAweDA4CS8qIE5vZGUgaXMgYSBtZXRob2QgbG9jYWwgKi8KICNkZWZpbmUgQU5PQkpfU1VCVFJFRV9IQVNfSU5JICAgICAgICAgICAweDEwCS8qIFVzZWQgdG8gb3B0aW1pemUgZGV2aWNlIGluaXRpYWxpemF0aW9uICovCkBAIC0yMTksMjUgKzIxOSw0MiBAQAogICogQUNQSSBUYWJsZSBEZXNjcmlwdG9yLiAgT25lIHBlciBBQ1BJIHRhYmxlCiAgKi8KIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgewotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnByZXY7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqbmV4dDsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICppbnN0YWxsZWRfZGVzYzsKKwlhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzczsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnBvaW50ZXI7Ci0JdTggKmFtbF9zdGFydDsKLQl1NjQgcGh5c2ljYWxfYWRkcmVzczsKLQlhY3BpX3NpemUgbGVuZ3RoOwotCXUzMiBhbWxfbGVuZ3RoOworCXUzMiBsZW5ndGg7CQkvKiBMZW5ndGggZml4ZWQgYXQgMzIgYml0cyAqLworCXVuaW9uIGFjcGlfbmFtZV91bmlvbiBzaWduYXR1cmU7CiAJYWNwaV9vd25lcl9pZCBvd25lcl9pZDsKLQl1OCB0eXBlOwotCXU4IGFsbG9jYXRpb247Ci0JdTggbG9hZGVkX2ludG9fbmFtZXNwYWNlOworCXU4IGZsYWdzOwogfTsKIAotc3RydWN0IGFjcGlfdGFibGVfbGlzdCB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqbmV4dDsKKy8qIEZsYWdzIGZvciBhYm92ZSAqLworCisjZGVmaW5lIEFDUElfVEFCTEVfT1JJR0lOX1VOS05PV04gICAgICAgKDApCisjZGVmaW5lIEFDUElfVEFCTEVfT1JJR0lOX01BUFBFRCAgICAgICAgKDEpCisjZGVmaW5lIEFDUElfVEFCTEVfT1JJR0lOX0FMTE9DQVRFRCAgICAgKDIpCisjZGVmaW5lIEFDUElfVEFCTEVfT1JJR0lOX01BU0sgICAgICAgICAgKDMpCisjZGVmaW5lIEFDUElfVEFCTEVfSVNfTE9BREVEICAgICAgICAgICAgKDQpCisKKy8qIE9uZSBpbnRlcm5hbCBSU0RUIGZvciB0YWJsZSBtYW5hZ2VtZW50ICovCisKK3N0cnVjdCBhY3BpX2ludGVybmFsX3JzZHQgeworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlczsKIAl1MzIgY291bnQ7CisJdTMyIHNpemU7CisJdTggZmxhZ3M7CiB9OwogCisvKiBGbGFncyBmb3IgYWJvdmUgKi8KKworI2RlZmluZSBBQ1BJX1JPT1RfT1JJR0lOX1VOS05PV04gICAgICAgICgwKQkvKiB+T1JJR0lOX0FMTE9DQVRFRCAqLworI2RlZmluZSBBQ1BJX1JPT1RfT1JJR0lOX0FMTE9DQVRFRCAgICAgICgxKQorI2RlZmluZSBBQ1BJX1JPT1RfQUxMT1dfUkVTSVpFICAgICAgICAgICgyKQorCisvKiBQcmVkZWZpbmVkIChmaXhlZCkgdGFibGUgaW5kZXhlcyAqLworCisjZGVmaW5lIEFDUElfVEFCTEVfSU5ERVhfRFNEVCAgICAgICAgICAgKDApCisjZGVmaW5lIEFDUElfVEFCTEVfSU5ERVhfRkFDUyAgICAgICAgICAgKDEpCisKIHN0cnVjdCBhY3BpX2ZpbmRfY29udGV4dCB7CiAJY2hhciAqc2VhcmNoX2ZvcjsKIAlhY3BpX2hhbmRsZSAqbGlzdDsKQEAgLTM1MCw3ICszNjcsNyBAQAogCXVuaW9uIGFjcGlfZ3BlX2Rpc3BhdGNoX2luZm8gZGlzcGF0Y2g7CS8qIEVpdGhlciBNZXRob2Qgb3IgSGFuZGxlciAqLwogCXN0cnVjdCBhY3BpX2dwZV9yZWdpc3Rlcl9pbmZvICpyZWdpc3Rlcl9pbmZvOwkvKiBCYWNrcG9pbnRlciB0byByZWdpc3RlciBpbmZvICovCiAJdTggZmxhZ3M7CQkvKiBNaXNjIGluZm8gYWJvdXQgdGhpcyBHUEUgKi8KLQl1OCByZWdpc3Rlcl9iaXQ7CS8qIFRoaXMgR1BFIGJpdCB3aXRoaW4gdGhlIHJlZ2lzdGVyICovCisJdTggZ3BlX251bWJlcjsJCS8qIFRoaXMgR1BFICovCiB9OwogCiAvKiBJbmZvcm1hdGlvbiBhYm91dCBhIEdQRSByZWdpc3RlciBwYWlyLCBvbmUgcGVyIGVhY2ggc3RhdHVzL2VuYWJsZSBwYWlyIGluIGFuIGFycmF5ICovCkBAIC04NTUsMTIgKzg3MiwzMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0cnVjdCBhY3BpX2RiX21ldGhvZF9pbmZvIHsKLQlhY3BpX2hhbmRsZSB0aHJlYWRfZ2F0ZTsKKwlhY3BpX2hhbmRsZSBtYWluX3RocmVhZF9nYXRlOworCWFjcGlfaGFuZGxlIHRocmVhZF9jb21wbGV0ZV9nYXRlOworCXUzMiAqdGhyZWFkczsKKwl1MzIgbnVtX3RocmVhZHM7CisJdTMyIG51bV9jcmVhdGVkOworCXUzMiBudW1fY29tcGxldGVkOworCiAJY2hhciAqbmFtZTsKLQljaGFyICoqYXJnczsKIAl1MzIgZmxhZ3M7CiAJdTMyIG51bV9sb29wczsKIAljaGFyIHBhdGhuYW1lWzEyOF07CisJY2hhciAqKmFyZ3M7CisKKwkvKgorCSAqIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gbWV0aG9kIGZvciB0aGUgY29tbWFuZAorCSAqIFRocmVhZHMgLQorCSAqICAgdGhlIE51bWJlciBvZiB0aHJlYWRzLCBJRCBvZiBjdXJyZW50IHRocmVhZCBhbmQKKwkgKiAgIEluZGV4IG9mIGN1cnJlbnQgdGhyZWFkIGluc2lkZSBhbGwgdGhlbSBjcmVhdGVkLgorCSAqLworCWNoYXIgaW5pdF9hcmdzOworCWNoYXIgKmFyZ3VtZW50c1s0XTsKKwljaGFyIG51bV90aHJlYWRzX3N0clsxMV07CisJY2hhciBpZF9vZl90aHJlYWRfc3RyWzExXTsKKwljaGFyIGluZGV4X29mX3RocmVhZF9zdHJbMTFdOwogfTsKIAogc3RydWN0IGFjcGlfaW50ZWdyaXR5X2luZm8gewpAQCAtOTE5LDYgKzk1NCw4IEBACiAKIAl1MzIgdG90YWxfYWxsb2NhdGVkOwogCXUzMiB0b3RhbF9mcmVlZDsKKwl1MzIgbWF4X29jY3VwaWVkOworCXUzMiB0b3RhbF9zaXplOwogCXUzMiBjdXJyZW50X3RvdGFsX3NpemU7CiAJdTMyIHJlcXVlc3RzOwogCXUzMiBoaXRzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmggYi9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaAppbmRleCAxOTJmYTA5Li44OTQ4YTY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTU1LDI1ICs1NSwxMiBAQAogI2RlZmluZSBBQ1BJX1NFVF9CSVQodGFyZ2V0LGJpdCkgICAgICAgICgodGFyZ2V0KSB8PSAoYml0KSkKICNkZWZpbmUgQUNQSV9DTEVBUl9CSVQodGFyZ2V0LGJpdCkgICAgICAoKHRhcmdldCkgJj0gfihiaXQpKQogI2RlZmluZSBBQ1BJX01JTihhLGIpICAgICAgICAgICAgICAgICAgICgoKGEpPChiKSk/KGEpOihiKSkKKyNkZWZpbmUgQUNQSV9NQVgoYSxiKSAgICAgICAgICAgICAgICAgICAoKChhKT4oYikpPyhhKTooYikpCiAKIC8qIFNpemUgY2FsY3VsYXRpb24gKi8KIAogI2RlZmluZSBBQ1BJX0FSUkFZX0xFTkdUSCh4KSAgICAgICAgICAgIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKIAotI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSAxNgotCi0vKgotICogRm9yIDE2LWJpdCBhZGRyZXNzZXMsIHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIHVwcGVyIDMyIGJpdHMKLSAqIChvdXQgb2YgNjQpIGFyZSB6ZXJvLgotICovCi0jZGVmaW5lIEFDUElfTE9EV09SRChsKSAgICAgICAgICAgICAgICAgKCh1MzIpKGwpKQotI2RlZmluZSBBQ1BJX0hJRFdPUkQobCkgICAgICAgICAgICAgICAgICgodTMyKSgwKSkKLQotI2RlZmluZSBBQ1BJX0dFVF9BRERSRVNTKGEpICAgICAgICAgICAgICgoYSkubG8pCi0jZGVmaW5lIEFDUElfU1RPUkVfQUREUkVTUyhhLGIpICAgICAgICAgeyhhKS5oaT0wOyhhKS5sbz0odTMyKShiKTt9Ci0jZGVmaW5lIEFDUElfVkFMSURfQUREUkVTUyhhKSAgICAgICAgICAgKChhKS5oaSB8IChhKS5sbykKLQotI2Vsc2UKICNpZmRlZiBBQ1BJX05PX0lOVEVHRVI2NF9TVVBQT1JUCiAvKgogICogYWNwaV9pbnRlZ2VyIGlzIDMyLWJpdHMsIG5vIDY0LWJpdCBzdXBwb3J0IG9uIHRoaXMgcGxhdGZvcm0KQEAgLTgxLDEwICs2OCw2IEBACiAjZGVmaW5lIEFDUElfTE9EV09SRChsKSAgICAgICAgICAgICAgICAgKCh1MzIpKGwpKQogI2RlZmluZSBBQ1BJX0hJRFdPUkQobCkgICAgICAgICAgICAgICAgICgodTMyKSgwKSkKIAotI2RlZmluZSBBQ1BJX0dFVF9BRERSRVNTKGEpICAgICAgICAgICAgIChhKQotI2RlZmluZSBBQ1BJX1NUT1JFX0FERFJFU1MoYSxiKSAgICAgICAgICgoYSk9KGIpKQotI2RlZmluZSBBQ1BJX1ZBTElEX0FERFJFU1MoYSkgICAgICAgICAgIChhKQotCiAjZWxzZQogCiAvKgpAQCAtOTIsMTEgKzc1LDYgQEAKICAqLwogI2RlZmluZSBBQ1BJX0xPRFdPUkQobCkgICAgICAgICAgICAgICAgICgodTMyKSh1NjQpKGwpKQogI2RlZmluZSBBQ1BJX0hJRFdPUkQobCkgICAgICAgICAgICAgICAgICgodTMyKSgoKCooc3RydWN0IHVpbnQ2NF9zdHJ1Y3QgKikodm9pZCAqKSgmbCkpKS5oaSkpCi0KLSNkZWZpbmUgQUNQSV9HRVRfQUREUkVTUyhhKSAgICAgICAgICAgICAoYSkKLSNkZWZpbmUgQUNQSV9TVE9SRV9BRERSRVNTKGEsYikgICAgICAgICAoKGEpPShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpKGIpKQotI2RlZmluZSBBQ1BJX1ZBTElEX0FERFJFU1MoYSkgICAgICAgICAgIChhKQotI2VuZGlmCiAjZW5kaWYKIAogLyoKQEAgLTEzNCwxNSArMTEyLDggQEAKICNkZWZpbmUgQUNQSV9UT19QT0lOVEVSKGkpICAgICAgICAgICAgICBBQ1BJX0FERF9QVFIgKHZvaWQsKHZvaWQgKikgTlVMTCwoYWNwaV9uYXRpdmVfdWludCkgaSkKICNkZWZpbmUgQUNQSV9UT19JTlRFR0VSKHApICAgICAgICAgICAgICBBQ1BJX1BUUl9ESUZGIChwLCh2b2lkICopIE5VTEwpCiAjZGVmaW5lIEFDUElfT0ZGU0VUKGQsZikgICAgICAgICAgICAgICAgKGFjcGlfc2l6ZSkgQUNQSV9QVFJfRElGRiAoJigoKGQgKikwKS0+ZiksKHZvaWQgKikgTlVMTCkKLQotI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSAxNgotI2RlZmluZSBBQ1BJX1NUT1JFX1BPSU5URVIoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCi0jZGVmaW5lIEFDUElfUEhZU0FERFJfVE9fUFRSKGkpICAgICAgICAgKHZvaWQgKikoaSkKLSNkZWZpbmUgQUNQSV9QVFJfVE9fUEhZU0FERFIoaSkgICAgICAgICAodTMyKSBBQ1BJX0NBU1RfUFRSICh1OCwoaSkpCi0jZWxzZQogI2RlZmluZSBBQ1BJX1BIWVNBRERSX1RPX1BUUihpKSAgICAgICAgIEFDUElfVE9fUE9JTlRFUihpKQogI2RlZmluZSBBQ1BJX1BUUl9UT19QSFlTQUREUihpKSAgICAgICAgIEFDUElfVE9fSU5URUdFUihpKQotI2VuZGlmCiAKICNpZm5kZWYgQUNQSV9NSVNBTElHTk1FTlRfTk9UX1NVUFBPUlRFRAogI2RlZmluZSBBQ1BJX0NPTVBBUkVfTkFNRShhLGIpICAgICAgICAgICgqQUNQSV9DQVNUX1BUUiAodTMyLChhKSkgPT0gKkFDUElfQ0FTVF9QVFIgKHUzMiwoYikpKQpAQCAtMjIzLDI4ICsxOTQsNiBAQAogCiAvKiBUaGUgaGFyZHdhcmUgc3VwcG9ydHMgdW5hbGlnbmVkIHRyYW5zZmVycywganVzdCBkbyB0aGUgbGl0dGxlLWVuZGlhbiBtb3ZlICovCiAKLSNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gMTYKLQotLyogTm8gNjQtYml0IGludGVnZXJzICovCi0vKiAxNi1iaXQgc291cmNlLCAxNi8zMi82NCBkZXN0aW5hdGlvbiAqLwotCi0jZGVmaW5lIEFDUElfTU9WRV8xNl9UT18xNihkLHMpICAgICAgICAgKih1MTYgKikodm9pZCAqKShkKSA9ICoodTE2ICopKHZvaWQgKikocykKLSNkZWZpbmUgQUNQSV9NT1ZFXzE2X1RPXzMyKGQscykgICAgICAgICAqKHUzMiAqKSh2b2lkICopKGQpID0gKih1MTYgKikodm9pZCAqKShzKQotI2RlZmluZSBBQ1BJX01PVkVfMTZfVE9fNjQoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18zMihkLHMpCi0KLS8qIDMyLWJpdCBzb3VyY2UsIDE2LzMyLzY0IGRlc3RpbmF0aW9uICovCi0KLSNkZWZpbmUgQUNQSV9NT1ZFXzMyX1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLwotI2RlZmluZSBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKSAgICAgICAgICoodTMyICopKHZvaWQgKikoZCkgPSAqKHUzMiAqKSh2b2lkICopKHMpCi0jZGVmaW5lIEFDUElfTU9WRV8zMl9UT182NChkLHMpICAgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykKLQotLyogNjQtYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KLQotI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMTYoZCxzKSAgICAgICAgIEFDUElfTU9WRV8xNl9UT18xNihkLHMpCS8qIFRydW5jYXRlIHRvIDE2ICovCi0jZGVmaW5lIEFDUElfTU9WRV82NF9UT18zMihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykJLyogVHJ1bmNhdGUgdG8gMzIgKi8KLSNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzY0KGQscykgICAgICAgICBBQ1BJX01PVkVfMzJfVE9fMzIoZCxzKQotCi0jZWxzZQogLyogMTYtYml0IHNvdXJjZSwgMTYvMzIvNjQgZGVzdGluYXRpb24gKi8KIAogI2RlZmluZSBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKSAgICAgICAgICoodTE2ICopKHZvaWQgKikoZCkgPSAqKHUxNiAqKSh2b2lkICopKHMpCkBAIC0yNjIsNyArMjExLDYgQEAKICNkZWZpbmUgQUNQSV9NT1ZFXzY0X1RPXzE2KGQscykgICAgICAgICBBQ1BJX01PVkVfMTZfVE9fMTYoZCxzKQkvKiBUcnVuY2F0ZSB0byAxNiAqLwogI2RlZmluZSBBQ1BJX01PVkVfNjRfVE9fMzIoZCxzKSAgICAgICAgIEFDUElfTU9WRV8zMl9UT18zMihkLHMpCS8qIFRydW5jYXRlIHRvIDMyICovCiAjZGVmaW5lIEFDUElfTU9WRV82NF9UT182NChkLHMpICAgICAgICAgKih1NjQgKikodm9pZCAqKShkKSA9ICoodTY0ICopKHZvaWQgKikocykKLSNlbmRpZgogCiAjZWxzZQogLyoKQEAgLTMwNywxMCArMjU1LDcgQEAKIAogLyogTWFjcm9zIGJhc2VkIG9uIG1hY2hpbmUgaW50ZWdlciB3aWR0aCAqLwogCi0jaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDE2Ci0jZGVmaW5lIEFDUElfTU9WRV9TSVpFX1RPXzE2KGQscykgICAgICAgQUNQSV9NT1ZFXzE2X1RPXzE2KGQscykKLQotI2VsaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDMyCisjaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDMyCiAjZGVmaW5lIEFDUElfTU9WRV9TSVpFX1RPXzE2KGQscykgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzE2KGQscykKIAogI2VsaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDY0CkBAIC02OTUsMTYgKzY0MCw2IEBACiAjZGVmaW5lIEFDUElfREVCVUdHRVJfRVhFQyhhKQogI2VuZGlmCiAKLS8qCi0gKiBGb3IgMTYtYml0IGNvZGUsIHdlIHdhbnQgdG8gc2hyaW5rIHNvbWUgdGhpbmdzIGV2ZW4gdGhvdWdoCi0gKiB3ZSBhcmUgdXNpbmcgQUNQSV9ERUJVR19PVVRQVVQgdG8gZ2V0IHRoZSBkZWJ1ZyBvdXRwdXQKLSAqLwotI2lmIEFDUElfTUFDSElORV9XSURUSCA9PSAxNgotI3VuZGVmIEFDUElfREVCVUdfT05MWV9NRU1CRVJTCi0jdW5kZWYgX1ZFUkJPU0VfU1RSVUNUVVJFUwotI2RlZmluZSBBQ1BJX0RFQlVHX09OTFlfTUVNQkVSUyhhKQotI2VuZGlmCi0KICNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAogLyoKICAqIDEpIFNldCBuYW1lIHRvIGJsYW5rcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbmFtZXMuaCBiL2luY2x1ZGUvYWNwaS9hY25hbWVzLmgKaW5kZXggYjY3ZGEzNi4uMzRiZmFlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjbmFtZXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNuYW1lcy5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmggYi9pbmNsdWRlL2FjcGkvYWNuYW1lc3AuaAppbmRleCA4M2I1MmY5Li41MzViN2UxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNuYW1lc3AuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNuYW1lc3AuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTY1LDkgKzY1LDEzIEBACiAjZGVmaW5lIEFDUElfTlNfRVJST1JfSUZfRk9VTkQgICAgICAweDA4CiAjZGVmaW5lIEFDUElfTlNfUFJFRklYX0lTX1NDT1BFICAgICAweDEwCiAjZGVmaW5lIEFDUElfTlNfRVhURVJOQUwgICAgICAgICAgICAweDIwCisjZGVmaW5lIEFDUElfTlNfVEVNUE9SQVJZICAgICAgICAgICAweDQwCiAKLSNkZWZpbmUgQUNQSV9OU19XQUxLX1VOTE9DSyAgICAgICAgIFRSVUUKLSNkZWZpbmUgQUNQSV9OU19XQUxLX05PX1VOTE9DSyAgICAgIEZBTFNFCisvKiBGbGFncyBmb3IgYWNwaV9uc193YWxrX25hbWVzcGFjZSAqLworCisjZGVmaW5lIEFDUElfTlNfV0FMS19OT19VTkxPQ0sgICAgICAwCisjZGVmaW5lIEFDUElfTlNfV0FMS19VTkxPQ0sgICAgICAgICAweDAxCisjZGVmaW5lIEFDUElfTlNfV0FMS19URU1QX05PREVTICAgICAweDAyCiAKIC8qCiAgKiBuc2luaXQgLSBOYW1lc3BhY2UgaW5pdGlhbGl6YXRpb24KQEAgLTgyLDcgKzg2LDcgQEAKIGFjcGlfc3RhdHVzIGFjcGlfbnNfbG9hZF9uYW1lc3BhY2Uodm9pZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYywKK2FjcGlfbnNfbG9hZF90YWJsZShhY3BpX25hdGl2ZV91aW50IHRhYmxlX2luZGV4LAogCQkgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CiAKIC8qCkBAIC05Miw3ICs5Niw3IEBACiBhY3BpX25zX3dhbGtfbmFtZXNwYWNlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKIAkJICAgICAgIGFjcGlfaGFuZGxlIHN0YXJ0X29iamVjdCwKIAkJICAgICAgIHUzMiBtYXhfZGVwdGgsCi0JCSAgICAgICB1OCB1bmxvY2tfYmVmb3JlX2NhbGxiYWNrLAorCQkgICAgICAgdTMyIGZsYWdzLAogCQkgICAgICAgYWNwaV93YWxrX2NhbGxiYWNrIHVzZXJfZnVuY3Rpb24sCiAJCSAgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKIApAQCAtMTA2LDExICsxMTAsMTIgQEAKICAqIG5zcGFyc2UgLSB0YWJsZSBwYXJzaW5nCiAgKi8KIGFjcGlfc3RhdHVzCi1hY3BpX25zX3BhcnNlX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MsCi0JCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc2NvcGUpOworYWNwaV9uc19wYXJzZV90YWJsZShhY3BpX25hdGl2ZV91aW50IHRhYmxlX2luZGV4LAorCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnN0YXJ0X25vZGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UodTggcGFzc19udW1iZXIsIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MpOworYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UoYWNwaV9uYXRpdmVfdWludCBwYXNzX251bWJlciwKKwkJCSAgIGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgpOwogCiAvKgogICogbnNhY2Nlc3MgLSBUb3AtbGV2ZWwgbmFtZXNwYWNlIGFjY2VzcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmggYi9pbmNsdWRlL2FjcGkvYWNvYmplY3QuaAppbmRleCA4ZmRlZTMxLi4wNGU5NzM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNvYmplY3QuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNvYmplY3QuaApAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTUyLDcgKzUyLDE1IEBACiAgKiB0byB0aGUgaW50ZXJwcmV0ZXIsIGFuZCB0byBrZWVwIHRyYWNrIG9mIHRoZSB2YXJpb3VzIGhhbmRsZXJzIHN1Y2ggYXMKICAqIGFkZHJlc3Mgc3BhY2UgaGFuZGxlcnMgYW5kIG5vdGlmeSBoYW5kbGVycy4gVGhlIG9iamVjdCBpcyBhIGNvbnN0YW50CiAgKiBzaXplIGluIG9yZGVyIHRvIGFsbG93IGl0IHRvIGJlIGNhY2hlZCBhbmQgcmV1c2VkLgorICoKKyAqIE5vdGU6IFRoZSBvYmplY3QgaXMgb3B0aW1pemVkIHRvIGJlIGFsaWduZWQgYW5kIHdpbGwgbm90IHdvcmsgaWYgaXQgaXMKKyAqIGJ5dGUtcGFja2VkLgogICovCisjaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDY0CisjcHJhZ21hIHBhY2soOCkKKyNlbHNlCisjcHJhZ21hIHBhY2soNCkKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEwMSw3ICsxMDksOCBAQAogQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUn07CiAKIHN0cnVjdCBhY3BpX29iamVjdF9pbnRlZ2VyIHsKLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIGFjcGlfaW50ZWdlciB2YWx1ZTsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IGZpbGxbM107CS8qIFByZXZlbnQgd2FybmluZyBvbiBzb21lIGNvbXBpbGVycyAqLworCWFjcGlfaW50ZWdlciB2YWx1ZTsKIH07CiAKIC8qCkBAIC0yMDMsNyArMjEyLDkgQEAKIH07CiAKIHN0cnVjdCBhY3BpX29iamVjdF9wcm9jZXNzb3IgewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgdTggcHJvY19pZDsKKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSCisJICAgIC8qIFRoZSBuZXh0IHR3byBmaWVsZHMgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIDMtYnl0ZSBzcGFjZSBiZWZvcmUgTk9USUZZX0lORk8gKi8KKwl1OCBwcm9jX2lkOwogCXU4IGxlbmd0aDsKIAkgQUNQSV9DT01NT05fTk9USUZZX0lORk8gYWNwaV9pb19hZGRyZXNzIGFkZHJlc3M7CiB9OwpAQCAtNDA2LDQgKzQxNyw2IEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3Qgb3A7CiB9OwogCisjcHJhZ21hIHBhY2soKQorCiAjZW5kaWYJCQkJLyogX0FDT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oIGIvaW5jbHVkZS9hY3BpL2Fjb3Bjb2RlLmgKaW5kZXggNzY1OWE0Ni4uZTZmNzZhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2Fjb3Bjb2RlLmgKKysrIGIvaW5jbHVkZS9hY3BpL2Fjb3Bjb2RlLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yNTcsNyArMjU3LDcgQEAKICNkZWZpbmUgQVJHSV9MTEVTU0VRVUFMX09QICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCiAjZGVmaW5lIEFSR0lfTE5PVF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQogI2RlZmluZSBBUkdJX0xOT1RFUVVBTF9PUCAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9MT0FEX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX1JFR0lPTl9PUl9GSUVMRCxBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9MT0FEX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX1JFR0lPTl9PUl9CVUZGRVIsQVJHSV9UQVJHRVRSRUYpCiAjZGVmaW5lIEFSR0lfTE9BRF9UQUJMRV9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUNiAoQVJHSV9TVFJJTkcsICAgICBBUkdJX1NUUklORywgICAgICAgIEFSR0lfU1RSSU5HLCAgICAgICBBUkdJX1NUUklORywgICAgQVJHSV9TVFJJTkcsIEFSR0lfQU5ZVFlQRSkKICNkZWZpbmUgQVJHSV9MT0NBTDAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQogI2RlZmluZSBBUkdJX0xPQ0FMMSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaCBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCmluZGV4IDhkNTAzOWQuLjc4MTIyNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmggYi9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaAppbmRleCA5ZDQ5ZDNjLi44NWMzNThlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpLmggYi9pbmNsdWRlL2FjcGkvYWNwaS5oCmluZGV4IGI5YTM5ZDEuLjJlNWYwMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGkuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKaW5kZXggZmRkMTA5NS4uMGQ5Zjk4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKQEAgLTU5LDcgKzU5LDYgQEAKIAogI2RlZmluZSBBQ1BJX0JVU19GSUxFX1JPT1QJImFjcGkiCiBleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX3Jvb3RfZGlyOwotZXh0ZXJuIHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgYWNwaV9mYWR0OwogCiBlbnVtIGFjcGlfYnVzX3JlbW92YWxfdHlwZSB7CiAJQUNQSV9CVVNfUkVNT1ZBTF9OT1JNQUwgPSAwLApAQCAtOTIsMTMgKzkxLDEyIEBACiB0eXBlZGVmIGludCAoKmFjcGlfb3BfbG9jaykgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgaW50IHR5cGUpOwogdHlwZWRlZiBpbnQgKCphY3BpX29wX3N0YXJ0KSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlKTsKIHR5cGVkZWYgaW50ICgqYWNwaV9vcF9zdG9wKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlLCBpbnQgdHlwZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3Bfc3VzcGVuZCkgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgaW50IHN0YXRlKTsKLXR5cGVkZWYgaW50ICgqYWNwaV9vcF9yZXN1bWUpIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsIGludCBzdGF0ZSk7Cit0eXBlZGVmIGludCAoKmFjcGlfb3Bfc3VzcGVuZCkgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3R5cGVkZWYgaW50ICgqYWNwaV9vcF9yZXN1bWUpIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UpOwogdHlwZWRlZiBpbnQgKCphY3BpX29wX3NjYW4pIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UpOwogdHlwZWRlZiBpbnQgKCphY3BpX29wX2JpbmQpIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UpOwogdHlwZWRlZiBpbnQgKCphY3BpX29wX3VuYmluZCkgKHN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZSk7Ci10eXBlZGVmIGludCAoKmFjcGlfb3BfbWF0Y2gpIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXZpY2UsCi0JCQkgICAgICBzdHJ1Y3QgYWNwaV9kcml2ZXIgKiBkcml2ZXIpOwordHlwZWRlZiBpbnQgKCphY3BpX29wX3NodXRkb3duKSAoc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlKTsKIAogc3RydWN0IGFjcGlfYnVzX29wcyB7CiAJdTMyIGFjcGlfb3BfYWRkOjE7CkBAIC0xMTEsNyArMTA5LDcgQEAKIAl1MzIgYWNwaV9vcF9zY2FuOjE7CiAJdTMyIGFjcGlfb3BfYmluZDoxOwogCXUzMiBhY3BpX29wX3VuYmluZDoxOwotCXUzMiBhY3BpX29wX21hdGNoOjE7CisJdTMyIGFjcGlfb3Bfc2h1dGRvd246MTsKIAl1MzIgcmVzZXJ2ZWQ6MjE7CiB9OwogCkBAIC0xMjYsMTYgKzEyNCwxNiBAQAogCWFjcGlfb3Bfc2NhbiBzY2FuOwogCWFjcGlfb3BfYmluZCBiaW5kOwogCWFjcGlfb3BfdW5iaW5kIHVuYmluZDsKLQlhY3BpX29wX21hdGNoIG1hdGNoOworCWFjcGlfb3Bfc2h1dGRvd24gc2h1dGRvd247CiB9OwogCiBzdHJ1Y3QgYWNwaV9kcml2ZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAljaGFyIG5hbWVbODBdOwogCWNoYXIgY2xhc3NbODBdOwotCWF0b21pY190IHJlZmVyZW5jZXM7CiAJY2hhciAqaWRzOwkJLyogU3VwcG9ydGVkIEhhcmR3YXJlIElEcyAqLwogCXN0cnVjdCBhY3BpX2RldmljZV9vcHMgb3BzOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRydjsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIH07CiAKIC8qCkBAIC0xODUsNyArMTgzLDcgQEAKIAogdHlwZWRlZiBjaGFyIGFjcGlfYnVzX2lkWzVdOwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIGFjcGlfYnVzX2FkZHJlc3M7Ci10eXBlZGVmIGNoYXIgYWNwaV9oYXJkd2FyZV9pZFs5XTsKK3R5cGVkZWYgY2hhciBhY3BpX2hhcmR3YXJlX2lkWzE1XTsKIHR5cGVkZWYgY2hhciBhY3BpX3VuaXF1ZV9pZFs5XTsKIHR5cGVkZWYgY2hhciBhY3BpX2RldmljZV9uYW1lWzQwXTsKIHR5cGVkZWYgY2hhciBhY3BpX2RldmljZV9jbGFzc1syMF07CkBAIC0yOTYsMTEgKzI5NCwxNCBAQAogCXN0cnVjdCBhY3BpX2RldmljZV9vcHMgb3BzOwogCXN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyOwogCXZvaWQgKmRyaXZlcl9kYXRhOwotCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiAJc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IGFjcGlfYnVzX29wcyBidXNfb3BzOwkvKiB3b3JrYXJvdW5kIGZvciBkaWZmZXJlbnQgY29kZSBwYXRoIGZvciBob3RwbHVnICovCisJZW51bSBhY3BpX2J1c19yZW1vdmFsX3R5cGUgcmVtb3ZhbF90eXBlOyAvKiBpbmRpY2F0ZSBmb3IgZGlmZmVyZW50IHJlbW92YWwgdHlwZSAqLwogfTsKIAogI2RlZmluZSBhY3BpX2RyaXZlcl9kYXRhKGQpCSgoZCktPmRyaXZlcl9kYXRhKQorI2RlZmluZSB0b19hY3BpX2RldmljZShkKQljb250YWluZXJfb2YoZCwgc3RydWN0IGFjcGlfZGV2aWNlLCBkZXYpCisjZGVmaW5lIHRvX2FjcGlfZHJpdmVyKGQpCWNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgYWNwaV9kcml2ZXIsIGRydikKIAogLyoKICAqIEV2ZW50cwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCmluZGV4IDZhNWJkY2UuLjRkYzhhNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKQEAgLTM2LDEzICszNiwxNCBAQAogCiAvKiBfSElEIGRlZmluaXRpb25zICovCiAKLSNkZWZpbmUgQUNQSV9QT1dFUl9ISUQJCQkiQUNQSV9QV1IiCi0jZGVmaW5lIEFDUElfUFJPQ0VTU09SX0hJRAkJIkFDUElfQ1BVIgotI2RlZmluZSBBQ1BJX1NZU1RFTV9ISUQJCQkiQUNQSV9TWVMiCi0jZGVmaW5lIEFDUElfVEhFUk1BTF9ISUQJCSJBQ1BJX1RITSIKLSNkZWZpbmUgQUNQSV9CVVRUT05fSElEX1BPV0VSRgkJIkFDUElfRlBCIgotI2RlZmluZSBBQ1BJX0JVVFRPTl9ISURfU0xFRVBGCQkiQUNQSV9GU0IiCi0KKyNkZWZpbmUgQUNQSV9QT1dFUl9ISUQJCQkicG93ZXJfcmVzb3VyY2UiCisjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0hJRAkJIkFDUEkwMDA3IgorI2RlZmluZSBBQ1BJX1NZU1RFTV9ISUQJCQkiYWNwaV9zeXN0ZW0iCisjZGVmaW5lIEFDUElfVEhFUk1BTF9ISUQJCSJ0aGVybWFsIgorI2RlZmluZSBBQ1BJX0JVVFRPTl9ISURfUE9XRVJGCQkiYnV0dG9uX3Bvd2VyIgorI2RlZmluZSBBQ1BJX0JVVFRPTl9ISURfU0xFRVBGCQkiYnV0dG9uX3NsZWVwIgorI2RlZmluZSBBQ1BJX1ZJREVPX0hJRAkJCSJ2aWRlbyIKKyNkZWZpbmUgQUNQSV9CQVlfSElECQkJImJheSIKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0kKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCmluZGV4IDBjZDYzYmMuLjc4MTM5NGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCkBAIC04LDcgKzgsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtODUsNyArODUsNyBAQAogLyoKICAqIEFDUEkgVGFibGUgaW50ZXJmYWNlcwogICovCi1hY3BpX3N0YXR1cyBhY3BpX29zX2dldF9yb290X3BvaW50ZXIodTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzKTsKK2FjcGlfcGh5c2ljYWxfYWRkcmVzcyBhY3BpX29zX2dldF9yb290X3BvaW50ZXIodm9pZCk7CiAKIGFjcGlfc3RhdHVzCiBhY3BpX29zX3ByZWRlZmluZWRfb3ZlcnJpZGUoY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyAqaW5pdF92YWwsCkBAIC0xNDMsOSArMTQzLDcgQEAKICAqLwogdm9pZCAqYWNwaV9vc19hbGxvY2F0ZShhY3BpX3NpemUgc2l6ZSk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX21hcF9tZW1vcnkoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHBoeXNpY2FsX2FkZHJlc3MsCi0JCSAgIGFjcGlfc2l6ZSBzaXplLCB2b2lkIF9faW9tZW0gKiogbG9naWNhbF9hZGRyZXNzKTsKK3ZvaWQgX19pb21lbSAqYWNwaV9vc19tYXBfbWVtb3J5KGFjcGlfcGh5c2ljYWxfYWRkcmVzcyB3aGVyZSwgYWNwaV9uYXRpdmVfdWludCBsZW5ndGgpOwogCiB2b2lkIGFjcGlfb3NfdW5tYXBfbWVtb3J5KHZvaWQgX19pb21lbSAqIGxvZ2ljYWxfYWRkcmVzcywgYWNwaV9zaXplIHNpemUpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmggYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKaW5kZXggODE0NTg3Ni4uZTA4ZjdkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaApAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTUxLDYgKzUxLDEwIEBACiAvKgogICogR2xvYmFsIGludGVyZmFjZXMKICAqLworYWNwaV9zdGF0dXMKK2FjcGlfaW5pdGlhbGl6ZV90YWJsZXMoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqaW5pdGlhbF9zdG9yYWdlLAorCQkgICAgICAgdTMyIGluaXRpYWxfdGFibGVfY291bnQsIHU4IGFsbG93X3Jlc2l6ZSk7CisKIGFjcGlfc3RhdHVzIGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0odm9pZCk7CiAKIGFjcGlfc3RhdHVzIGFjcGlfZW5hYmxlX3N1YnN5c3RlbSh1MzIgZmxhZ3MpOwpAQCAtOTIsMzAgKzk2LDI4IEBACiAvKgogICogQUNQSSB0YWJsZSBtYW5pcHVsYXRpb24gaW50ZXJmYWNlcwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9maW5kX3Jvb3RfcG9pbnRlcih1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX3BvaW50ZXIgKnJzZHBfYWRkcmVzcyk7CithY3BpX3N0YXR1cyBhY3BpX3JlYWxsb2NhdGVfcm9vdF90YWJsZSh2b2lkKTsKKworYWNwaV9zdGF0dXMgYWNwaV9maW5kX3Jvb3RfcG9pbnRlcihhY3BpX25hdGl2ZV91aW50ICogcnNkcF9hZGRyZXNzKTsKIAogYWNwaV9zdGF0dXMgYWNwaV9sb2FkX3RhYmxlcyh2b2lkKTsKIAogYWNwaV9zdGF0dXMgYWNwaV9sb2FkX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfcHRyKTsKIAotYWNwaV9zdGF0dXMgYWNwaV91bmxvYWRfdGFibGVfaWQoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsIGFjcGlfb3duZXJfaWQgaWQpOwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfc3RhdHVzIGFjcGlfdW5sb2FkX3RhYmxlKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlKTsKLWFjcGlfc3RhdHVzCi1hY3BpX2dldF90YWJsZV9oZWFkZXIoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsCi0JCSAgICAgIHUzMiBpbnN0YW5jZSwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpvdXRfdGFibGVfaGVhZGVyKTsKLSNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCithY3BpX3N0YXR1cyBhY3BpX3VubG9hZF90YWJsZV9pZChhY3BpX293bmVyX2lkIGlkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZ2V0X3RhYmxlKGFjcGlfdGFibGVfdHlwZSB0YWJsZV90eXBlLAotCSAgICAgICB1MzIgaW5zdGFuY2UsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CithY3BpX2dldF90YWJsZV9oZWFkZXIoYWNwaV9zdHJpbmcgc2lnbmF0dXJlLAorCQkgICAgICBhY3BpX25hdGl2ZV91aW50IGluc3RhbmNlLAorCQkgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKm91dF90YWJsZV9oZWFkZXIpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9nZXRfZmlybXdhcmVfdGFibGUoYWNwaV9zdHJpbmcgc2lnbmF0dXJlLAotCQkJdTMyIGluc3RhbmNlLAotCQkJdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKip0YWJsZV9wb2ludGVyKTsKK2FjcGlfZ2V0X3RhYmxlKGFjcGlfc3RyaW5nIHNpZ25hdHVyZSwKKwkgICAgICAgYWNwaV9uYXRpdmVfdWludCBpbnN0YW5jZSwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqb3V0X3RhYmxlKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfZ2V0X3RhYmxlX2J5X2luZGV4KGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgsCisJCQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKipvdXRfdGFibGUpOwogCiAvKgogICogTmFtZXNwYWNlIGFuZCBuYW1lIGludGVyZmFjZXMKQEAgLTMxMCw5ICszMTIsOSBAQAogLyoKICAqIEhhcmR3YXJlIChBQ1BJIGRldmljZSkgaW50ZXJmYWNlcwogICovCi1hY3BpX3N0YXR1cyBhY3BpX2dldF9yZWdpc3Rlcih1MzIgcmVnaXN0ZXJfaWQsIHUzMiAqIHJldHVybl92YWx1ZSwgdTMyIGZsYWdzKTsKK2FjcGlfc3RhdHVzIGFjcGlfZ2V0X3JlZ2lzdGVyKHUzMiByZWdpc3Rlcl9pZCwgdTMyICogcmV0dXJuX3ZhbHVlKTsKIAotYWNwaV9zdGF0dXMgYWNwaV9zZXRfcmVnaXN0ZXIodTMyIHJlZ2lzdGVyX2lkLCB1MzIgdmFsdWUsIHUzMiBmbGFncyk7CithY3BpX3N0YXR1cyBhY3BpX3NldF9yZWdpc3Rlcih1MzIgcmVnaXN0ZXJfaWQsIHUzMiB2YWx1ZSk7CiAKIGFjcGlfc3RhdHVzCiBhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzaWNhbF9hZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Jlc3JjLmggYi9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oCmluZGV4IDgwYTNiMzMuLjk0ODZhYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Jlc3JjLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaApAQCAtNSw3ICs1LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3N0cnVjdC5oIGIvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKaW5kZXggNWU4MDk1Zi4uYWViNDQ5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xMzksNyArMTM5LDggQEAKIAl1MTYgYnVmZmVyX2luaXQ7CiAJdTE2IHBhY2thZ2VfaW5pdDsKIAl1MTYgb2JqZWN0X2NvdW50OwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CisJYWNwaV9vd25lcl9pZCBvd25lcl9pZDsKKwlhY3BpX25hdGl2ZV91aW50IHRhYmxlX2luZGV4OwogfTsKIAogc3RydWN0IGFjcGlfZ2V0X2RldmljZXNfaW5mbyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0YWJsZXMuaCBiL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oCmluZGV4IDRkYmFmMDIuLjJiOWY0NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDQsMTA1ICs0NCw3NSBAQAogI2lmbmRlZiBfX0FDVEFCTEVTX0hfXwogI2RlZmluZSBfX0FDVEFCTEVTX0hfXwogCi0vKiBVc2VkIGluIGFjcGlfdGJfbWFwX2FjcGlfdGFibGUgZm9yIHNpemUgcGFyYW1ldGVyIGlmIHRhYmxlIGhlYWRlciBpcyB0byBiZSB1c2VkICovCi0KLSNkZWZpbmUgU0laRV9JTl9IRUFERVIgICAgICAgICAgMAorYWNwaV9zdGF0dXMgYWNwaV9hbGxvY2F0ZV9yb290X3RhYmxlKHUzMiBpbml0aWFsX3RhYmxlX2NvdW50KTsKIAogLyoKLSAqIHRiY29udnJ0IC0gVGFibGUgY29udmVyc2lvbiByb3V0aW5lcworICogdGJmYWR0IC0gRkFEVCBwYXJzZS9jb252ZXJ0L3ZhbGlkYXRlCiAgKi8KLWFjcGlfc3RhdHVzIGFjcGlfdGJfY29udmVydF90b194c2R0KHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pOwordm9pZCBhY3BpX3RiX3BhcnNlX2ZhZHQoYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleCwgdTggZmxhZ3MpOwogCi1hY3BpX3N0YXR1cyBhY3BpX3RiX2NvbnZlcnRfdGFibGVfZmFkdCh2b2lkKTsKLQotYWNwaV9zdGF0dXMgYWNwaV90Yl9idWlsZF9jb21tb25fZmFjcyhzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKTsKLQotdTMyCi1hY3BpX3RiX2dldF90YWJsZV9jb3VudChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yICpSU0RQLAotCQkJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpSU0RUKTsKK3ZvaWQgYWNwaV90Yl9jcmVhdGVfbG9jYWxfZmFkdChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlLCB1MzIgbGVuZ3RoKTsKIAogLyoKLSAqIHRiZ2V0IC0gVGFibGUgImdldCIgcm91dGluZXMKLSAqLwotYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3RhYmxlKHN0cnVjdCBhY3BpX3BvaW50ZXIgKmFkZHJlc3MsCi0JCSAgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9oZWFkZXIoc3RydWN0IGFjcGlfcG9pbnRlciAqYWRkcmVzcywKLQkJCSBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnJldHVybl9oZWFkZXIpOwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfdGFibGVfYm9keShzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzLAotCQkgICAgICAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIsCi0JCSAgICAgICBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdGJfZ2V0X3RhYmxlX3B0cihhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSwKLQkJICAgICAgdTMyIGluc3RhbmNlLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKip0YWJsZV9wdHJfbG9jKTsKLQotYWNwaV9zdGF0dXMgYWNwaV90Yl92ZXJpZnlfcnNkcChzdHJ1Y3QgYWNwaV9wb2ludGVyICphZGRyZXNzKTsKLQotdm9pZCBhY3BpX3RiX2dldF9yc2R0X2FkZHJlc3Moc3RydWN0IGFjcGlfcG9pbnRlciAqb3V0X2FkZHJlc3MpOwotCi1hY3BpX3N0YXR1cyBhY3BpX3RiX3ZhbGlkYXRlX3JzZHQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9wdHIpOwotCi0vKgotICogdGJnZXRhbGwgLSBnZXQgbXVsdGlwbGUgcmVxdWlyZWQgdGFibGVzCi0gKi8KLWFjcGlfc3RhdHVzIGFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyh2b2lkKTsKLQotLyoKLSAqIHRiaW5zdGFsbCAtIFRhYmxlIGluc3RhbGxhdGlvbgotICovCi1hY3BpX3N0YXR1cyBhY3BpX3RiX2luc3RhbGxfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfaW5mbyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX3JlY29nbml6ZV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9pbmZvLCB1OCBzZWFyY2hfdHlwZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2luaXRfdGFibGVfZGVzY3JpcHRvcihhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSwKLQkJCSAgICAgIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pOwotCi0vKgotICogdGJyZW1vdmUgLSBUYWJsZSByZW1vdmFsIGFuZCBkZWxldGlvbgotICovCi12b2lkIGFjcGlfdGJfZGVsZXRlX2FsbF90YWJsZXModm9pZCk7Ci0KLXZvaWQgYWNwaV90Yl9kZWxldGVfdGFibGVzX2J5X3R5cGUoYWNwaV90YWJsZV90eXBlIHR5cGUpOwotCi12b2lkIGFjcGlfdGJfZGVsZXRlX3NpbmdsZV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKTsKLQotc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqYWNwaV90Yl91bmluc3RhbGxfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYwotCQkJCQkJKnRhYmxlX2Rlc2MpOwotCi0vKgotICogdGJ4ZnJvb3QgLSBSU0RQLCBSU0RUIHV0aWxpdGllcworICogdGJmaW5kIC0gZmluZCBBQ1BJIHRhYmxlCiAgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2ZpbmRfdGFibGUoY2hhciAqc2lnbmF0dXJlLAogCQkgICBjaGFyICpvZW1faWQsCi0JCSAgIGNoYXIgKm9lbV90YWJsZV9pZCwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqdGFibGVfcHRyKTsKLQotYWNwaV9zdGF0dXMgYWNwaV90Yl9nZXRfdGFibGVfcnNkdCh2b2lkKTsKLQotYWNwaV9zdGF0dXMgYWNwaV90Yl92YWxpZGF0ZV9yc2RwKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgKnJzZHApOworCQkgICBjaGFyICpvZW1fdGFibGVfaWQsIGFjcGlfbmF0aXZlX3VpbnQgKiB0YWJsZV9pbmRleCk7CiAKIC8qCi0gKiB0YnV0aWxzIC0gY29tbW9uIHRhYmxlIHV0aWxpdGllcworICogdGJpbnN0YWwgLSBUYWJsZSByZW1vdmFsIGFuZCBkZWxldGlvbgogICovCi1hY3BpX3N0YXR1cyBhY3BpX3RiX2lzX3RhYmxlX2luc3RhbGxlZChzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICpuZXdfdGFibGVfZGVzYyk7CithY3BpX3N0YXR1cyBhY3BpX3RiX3Jlc2l6ZV9yb290X3RhYmxlX2xpc3Qodm9pZCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfdGJfdmVyaWZ5X3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2MpOwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl92ZXJpZnlfdGFibGVfY2hlY2tzdW0oc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXIpOwotCi11OCBhY3BpX3RiX3N1bV90YWJsZSh2b2lkICpidWZmZXIsIHUzMiBsZW5ndGgpOwotCi11OCBhY3BpX3RiX2dlbmVyYXRlX2NoZWNrc3VtKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOwotCi12b2lkIGFjcGlfdGJfc2V0X2NoZWNrc3VtKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOworYWNwaV90Yl9hZGRfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYywKKwkJICBhY3BpX25hdGl2ZV91aW50ICogdGFibGVfaW5kZXgpOwogCiBhY3BpX3N0YXR1cwotYWNwaV90Yl92YWxpZGF0ZV90YWJsZV9oZWFkZXIoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXIpOworYWNwaV90Yl9zdG9yZV90YWJsZShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJICAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUsCisJCSAgICB1MzIgbGVuZ3RoLCB1OCBmbGFncywgYWNwaV9uYXRpdmVfdWludCAqIHRhYmxlX2luZGV4KTsKKwordm9pZCBhY3BpX3RiX2RlbGV0ZV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjKTsKKwordm9pZCBhY3BpX3RiX3Rlcm1pbmF0ZSh2b2lkKTsKKwordm9pZCBhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIoYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfdGJfYWxsb2NhdGVfb3duZXJfaWQoYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleCk7CisKK2FjcGlfc3RhdHVzIGFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZChhY3BpX25hdGl2ZV91aW50IHRhYmxlX2luZGV4KTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdGJfZ2V0X293bmVyX2lkKGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgsIGFjcGlfb3duZXJfaWQgKiBvd25lcl9pZCk7CisKK3U4IGFjcGlfdGJfaXNfdGFibGVfbG9hZGVkKGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgpOworCit2b2lkIGFjcGlfdGJfc2V0X3RhYmxlX2xvYWRlZF9mbGFnKGFjcGlfbmF0aXZlX3VpbnQgdGFibGVfaW5kZXgsIHU4IGlzX2xvYWRlZCk7CisKKy8qCisgKiB0YnV0aWxzIC0gdGFibGUgbWFuYWdlciB1dGlsaXRpZXMKKyAqLwordTggYWNwaV90Yl90YWJsZXNfbG9hZGVkKHZvaWQpOworCit2b2lkCithY3BpX3RiX3ByaW50X3RhYmxlX2hlYWRlcihhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJCSAgIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyKTsKKwordTggYWNwaV90Yl9jaGVja3N1bSh1OCAqIGJ1ZmZlciwgYWNwaV9uYXRpdmVfdWludCBsZW5ndGgpOworCithY3BpX3N0YXR1cworYWNwaV90Yl92ZXJpZnlfY2hlY2tzdW0oc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSwgdTMyIGxlbmd0aCk7CisKK3ZvaWQKK2FjcGlfdGJfaW5zdGFsbF90YWJsZShhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKKwkJICAgICAgdTggZmxhZ3MsIGNoYXIgKnNpZ25hdHVyZSwgYWNwaV9uYXRpdmVfdWludCB0YWJsZV9pbmRleCk7CisKK2FjcGlfc3RhdHVzCithY3BpX3RiX3BhcnNlX3Jvb3RfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIHJzZHBfYWRkcmVzcywgdTggZmxhZ3MpOwogCiAjZW5kaWYJCQkJLyogX19BQ1RBQkxFU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibC5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsLmgKaW5kZXggYjEyNWNlZS4uMDk0NjllNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGJsLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00OCwxNSArNDgsMTUgQEAKICAqIFZhbHVlcyBmb3IgZGVzY3JpcHRpb24gdGFibGUgaGVhZGVyIHNpZ25hdHVyZXMuIFVzZWZ1bCBiZWNhdXNlIHRoZXkgbWFrZQogICogaXQgbW9yZSBkaWZmaWN1bHQgdG8gaW5hZHZlcnRlbnRseSB0eXBlIGluIHRoZSB3cm9uZyBzaWduYXR1cmUuCiAgKi8KLSNkZWZpbmUgRFNEVF9TSUcgICAgICAgICAgICAgICAgIkRTRFQiCS8qIERpZmZlcmVudGlhdGVkIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBGQURUX1NJRyAgICAgICAgICAgICAgICAiRkFDUCIJLyogRml4ZWQgQUNQSSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBGQUNTX1NJRyAgICAgICAgICAgICAgICAiRkFDUyIJLyogRmlybXdhcmUgQUNQSSBDb250cm9sIFN0cnVjdHVyZSAqLwotI2RlZmluZSBQU0RUX1NJRyAgICAgICAgICAgICAgICAiUFNEVCIJLyogUGVyc2lzdGVudCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KLSNkZWZpbmUgUlNEUF9TSUcgICAgICAgICAgICAgICAgIlJTRCBQVFIgIgkvKiBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBQb2ludGVyICovCi0jZGVmaW5lIFJTRFRfU0lHICAgICAgICAgICAgICAgICJSU0RUIgkvKiBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBYU0RUX1NJRyAgICAgICAgICAgICAgICAiWFNEVCIJLyogRXh0ZW5kZWQgIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBTU0RUX1NJRyAgICAgICAgICAgICAgICAiU1NEVCIJLyogU2Vjb25kYXJ5IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBSU0RQX05BTUUgICAgICAgICAgICAgICAiUlNEUCIKKyNkZWZpbmUgQUNQSV9TSUdfRFNEVCAgICAgICAgICAgIkRTRFQiCS8qIERpZmZlcmVudGlhdGVkIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBBQ1BJX1NJR19GQURUICAgICAgICAgICAiRkFDUCIJLyogRml4ZWQgQUNQSSBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBBQ1BJX1NJR19GQUNTICAgICAgICAgICAiRkFDUyIJLyogRmlybXdhcmUgQUNQSSBDb250cm9sIFN0cnVjdHVyZSAqLworI2RlZmluZSBBQ1BJX1NJR19QU0RUICAgICAgICAgICAiUFNEVCIJLyogUGVyc2lzdGVudCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KKyNkZWZpbmUgQUNQSV9TSUdfUlNEUCAgICAgICAgICAgIlJTRCBQVFIgIgkvKiBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBQb2ludGVyICovCisjZGVmaW5lIEFDUElfU0lHX1JTRFQgICAgICAgICAgICJSU0RUIgkvKiBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBBQ1BJX1NJR19YU0RUICAgICAgICAgICAiWFNEVCIJLyogRXh0ZW5kZWQgIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBBQ1BJX1NJR19TU0RUICAgICAgICAgICAiU1NEVCIJLyogU2Vjb25kYXJ5IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBBQ1BJX1JTRFBfTkFNRSAgICAgICAgICAiUlNEUCIJLyogU2hvcnQgbmFtZSBmb3IgUlNEUCwgbm90IHNpZ25hdHVyZSAqLwogCiAvKgogICogQWxsIHRhYmxlcyBhbmQgc3RydWN0dXJlcyBtdXN0IGJlIGJ5dGUtcGFja2VkIHRvIG1hdGNoIHRoZSBBQ1BJCkBAIC04MywyNyArODMsMjkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEFDUElfVEFCTEVfSEVBREVSX0RFRiBcCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVbNF07ICAgICAgICAgICAvKiBBU0NJSSB0YWJsZSBzaWduYXR1cmUgKi9cCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7ICAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgdGFibGUgaW4gYnl0ZXMsIGluY2x1ZGluZyB0aGlzIGhlYWRlciAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uOyAgICAgICAgICAgICAgIC8qIEFDUEkgU3BlY2lmaWNhdGlvbiBtaW5vciB2ZXJzaW9uICMgKi9cCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bTsgICAgICAgICAgICAgICAvKiBUbyBtYWtlIHN1bSBvZiBlbnRpcmUgdGFibGUgPT0gMCAqL1wKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9lbV9pZFs2XTsgICAgICAgICAgICAgIC8qIEFTQ0lJIE9FTSBpZGVudGlmaWNhdGlvbiAqL1wKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9lbV90YWJsZV9pZFs4XTsgICAgICAgIC8qIEFTQ0lJIE9FTSB0YWJsZSBpZGVudGlmaWNhdGlvbiAqL1wKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9lbV9yZXZpc2lvbjsgICAgICAgICAgIC8qIE9FTSByZXZpc2lvbiBudW1iZXIgKi9cCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2xfY29tcGlsZXJfaWRbNF07ICAgICAvKiBBU0NJSSBBU0wgY29tcGlsZXIgdmVuZG9yIElEICovXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNsX2NvbXBpbGVyX3JldmlzaW9uOwkvKiBBU0wgY29tcGlsZXIgdmVyc2lvbiAqLwotCiBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgewotQUNQSV9UQUJMRV9IRUFERVJfREVGfTsKKwljaGFyIHNpZ25hdHVyZVtBQ1BJX05BTUVfU0laRV07CS8qIEFTQ0lJIHRhYmxlIHNpZ25hdHVyZSAqLworCXUzMiBsZW5ndGg7CQkvKiBMZW5ndGggb2YgdGFibGUgaW4gYnl0ZXMsIGluY2x1ZGluZyB0aGlzIGhlYWRlciAqLworCXU4IHJldmlzaW9uOwkJLyogQUNQSSBTcGVjaWZpY2F0aW9uIG1pbm9yIHZlcnNpb24gIyAqLworCXU4IGNoZWNrc3VtOwkJLyogVG8gbWFrZSBzdW0gb2YgZW50aXJlIHRhYmxlID09IDAgKi8KKwljaGFyIG9lbV9pZFtBQ1BJX09FTV9JRF9TSVpFXTsJLyogQVNDSUkgT0VNIGlkZW50aWZpY2F0aW9uICovCisJY2hhciBvZW1fdGFibGVfaWRbQUNQSV9PRU1fVEFCTEVfSURfU0laRV07CS8qIEFTQ0lJIE9FTSB0YWJsZSBpZGVudGlmaWNhdGlvbiAqLworCXUzMiBvZW1fcmV2aXNpb247CS8qIE9FTSByZXZpc2lvbiBudW1iZXIgKi8KKwljaGFyIGFzbF9jb21waWxlcl9pZFtBQ1BJX05BTUVfU0laRV07CS8qIEFTQ0lJIEFTTCBjb21waWxlciB2ZW5kb3IgSUQgKi8KKwl1MzIgYXNsX2NvbXBpbGVyX3JldmlzaW9uOwkvKiBBU0wgY29tcGlsZXIgdmVyc2lvbiAqLworfTsKIAogLyoKICAqIEdBUyAtIEdlbmVyaWMgQWRkcmVzcyBTdHJ1Y3R1cmUgKEFDUEkgMi4wKykKKyAqCisgKiBOb3RlOiBTaW5jZSB0aGlzIHN0cnVjdHVyZSBpcyB1c2VkIGluIHRoZSBBQ1BJIHRhYmxlcywgaXQgaXMgYnl0ZSBhbGlnbmVkLgorICogSWYgbWlzYWxpZ25tZW50IGlzIG5vdCBzdXBwb3J0ZWQsIGFjY2VzcyB0byB0aGUgQWRkcmVzcyBmaWVsZCBtdXN0IGJlCisgKiBwZXJmb3JtZWQgd2l0aCBjYXJlLgogICovCiBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgewotCXU4IGFkZHJlc3Nfc3BhY2VfaWQ7CS8qIEFkZHJlc3Mgc3BhY2Ugd2hlcmUgc3RydWN0IG9yIHJlZ2lzdGVyIGV4aXN0cyAqLwotCXU4IHJlZ2lzdGVyX2JpdF93aWR0aDsJLyogU2l6ZSBpbiBiaXRzIG9mIGdpdmVuIHJlZ2lzdGVyICovCi0JdTggcmVnaXN0ZXJfYml0X29mZnNldDsJLyogQml0IG9mZnNldCB3aXRoaW4gdGhlIHJlZ2lzdGVyICovCisJdTggc3BhY2VfaWQ7CQkvKiBBZGRyZXNzIHNwYWNlIHdoZXJlIHN0cnVjdCBvciByZWdpc3RlciBleGlzdHMgKi8KKwl1OCBiaXRfd2lkdGg7CQkvKiBTaXplIGluIGJpdHMgb2YgZ2l2ZW4gcmVnaXN0ZXIgKi8KKwl1OCBiaXRfb2Zmc2V0OwkJLyogQml0IG9mZnNldCB3aXRoaW4gdGhlIHJlZ2lzdGVyICovCiAJdTggYWNjZXNzX3dpZHRoOwkvKiBNaW5pbXVtIEFjY2VzcyBzaXplIChBQ1BJIDMuMCkgKi8KIAl1NjQgYWRkcmVzczsJCS8qIDY0LWJpdCBhZGRyZXNzIG9mIHN0cnVjdCBvciByZWdpc3RlciAqLwogfTsKQEAgLTExNCwxMCArMTE2LDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IHJzZHBfZGVzY3JpcHRvciB7CitzdHJ1Y3QgYWNwaV90YWJsZV9yc2RwIHsKIAljaGFyIHNpZ25hdHVyZVs4XTsJLyogQUNQSSBzaWduYXR1cmUsIGNvbnRhaW5zICJSU0QgUFRSICIgKi8KIAl1OCBjaGVja3N1bTsJCS8qIEFDUEkgMS4wIGNoZWNrc3VtICovCi0JY2hhciBvZW1faWRbNl07CQkvKiBPRU0gaWRlbnRpZmljYXRpb24gKi8KKwljaGFyIG9lbV9pZFtBQ1BJX09FTV9JRF9TSVpFXTsJLyogT0VNIGlkZW50aWZpY2F0aW9uICovCiAJdTggcmV2aXNpb247CQkvKiBNdXN0IGJlICgwKSBmb3IgQUNQSSAxLjAgb3IgKDIpIGZvciBBQ1BJIDIuMCsgKi8KIAl1MzIgcnNkdF9waHlzaWNhbF9hZGRyZXNzOwkvKiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgUlNEVCAqLwogCXUzMiBsZW5ndGg7CQkvKiBUYWJsZSBsZW5ndGggaW4gYnl0ZXMsIGluY2x1ZGluZyBoZWFkZXIgKEFDUEkgMi4wKykgKi8KQEAgLTEzNCwxMiArMTM2LDE0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IHJzZHRfZGVzY3JpcHRvciB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGIHUzMiB0YWJsZV9vZmZzZXRfZW50cnlbMV07CS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIEFDUEkgdGFibGVzICovCitzdHJ1Y3QgYWNwaV90YWJsZV9yc2R0IHsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiBDb21tb24gQUNQSSB0YWJsZSBoZWFkZXIgKi8KKwl1MzIgdGFibGVfb2Zmc2V0X2VudHJ5WzFdOwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBBQ1BJIHRhYmxlcyAqLwogfTsKIAotc3RydWN0IHhzZHRfZGVzY3JpcHRvciB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGIHU2NCB0YWJsZV9vZmZzZXRfZW50cnlbMV07CS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIEFDUEkgdGFibGVzICovCitzdHJ1Y3QgYWNwaV90YWJsZV94c2R0IHsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiBDb21tb24gQUNQSSB0YWJsZSBoZWFkZXIgKi8KKwl1NjQgdGFibGVfb2Zmc2V0X2VudHJ5WzFdOwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBBQ1BJIHRhYmxlcyAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE0OCwzNiArMTUyLDI3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGZhY3NfZGVzY3JpcHRvciB7CitzdHJ1Y3QgYWNwaV90YWJsZV9mYWNzIHsKIAljaGFyIHNpZ25hdHVyZVs0XTsJLyogQVNDSUkgdGFibGUgc2lnbmF0dXJlICovCiAJdTMyIGxlbmd0aDsJCS8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUsIGluIGJ5dGVzICovCiAJdTMyIGhhcmR3YXJlX3NpZ25hdHVyZTsJLyogSGFyZHdhcmUgY29uZmlndXJhdGlvbiBzaWduYXR1cmUgKi8KIAl1MzIgZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsJLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEZpcm13YXJlIFdha2luZyBWZWN0b3IgKi8KIAl1MzIgZ2xvYmFsX2xvY2s7CS8qIEdsb2JhbCBMb2NrIGZvciBzaGFyZWQgaGFyZHdhcmUgcmVzb3VyY2VzICovCi0KLQkvKiBGbGFncyAoMzIgYml0cykgKi8KLQotCXU4IFM0Ymlvc19mOjE7CQkvKiAwMDogICAgUzRCSU9TIHN1cHBvcnQgaXMgcHJlc2VudCAqLwotCSB1ODo3OwkJCS8qIDAxLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0JdTggcmVzZXJ2ZWQxWzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCisJdTMyIGZsYWdzOwogCXU2NCB4ZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsJLyogNjQtYml0IHZlcnNpb24gb2YgdGhlIEZpcm13YXJlIFdha2luZyBWZWN0b3IgKEFDUEkgMi4wKykgKi8KIAl1OCB2ZXJzaW9uOwkJLyogVmVyc2lvbiBvZiB0aGlzIHRhYmxlIChBQ1BJIDIuMCspICovCiAJdTggcmVzZXJ2ZWRbMzFdOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiB9OwogCisvKiBGbGFnIG1hY3JvcyAqLworCisjZGVmaW5lIEFDUElfRkFDU19TNF9CSU9TX1BSRVNFTlQgKDEpCS8qIDAwOiBTNEJJT1Mgc3VwcG9ydCBpcyBwcmVzZW50ICovCisKKy8qIEdsb2JhbCBsb2NrIGZsYWdzICovCisKICNkZWZpbmUgQUNQSV9HTE9DS19QRU5ESU5HICAgICAgMHgwMQkvKiAwMDogUGVuZGluZyBnbG9iYWwgbG9jayBvd25lcnNoaXAgKi8KICNkZWZpbmUgQUNQSV9HTE9DS19PV05FRCAgICAgICAgMHgwMgkvKiAwMTogR2xvYmFsIGxvY2sgaXMgb3duZWQgKi8KIAotLyoKLSAqIENvbW1vbiBGQUNTIC0gVGhpcyBpcyBhIHZlcnNpb24taW5kZXBlbmRlbnQgRkFDUyBzdHJ1Y3R1cmUgdXNlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkKLSAqLwotc3RydWN0IGFjcGlfY29tbW9uX2ZhY3MgewotCXUzMiAqZ2xvYmFsX2xvY2s7Ci0JdTY0ICpmaXJtd2FyZV93YWtpbmdfdmVjdG9yOwotCXU4IHZlY3Rvcl93aWR0aDsKLX07Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRkFEVCAtIEZpeGVkIEFDUEkgRGVzY3JpcHRpb24gVGFibGUgKFNpZ25hdHVyZSAiRkFDUCIpCkBAIC0xODYsMTIxICsxODEsOTggQEAKIAogLyogRmllbGRzIGNvbW1vbiB0byBhbGwgdmVyc2lvbnMgb2YgdGhlIEZBRFQgKi8KIAotI2RlZmluZSBBQ1BJX0ZBRFRfQ09NTU9OIFwKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfZmlybXdhcmVfY3RybDsgICAvKiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovIFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX2RzZHQ7ICAgICAgICAgICAgLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRFNEVCAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDE7ICAgICAgICAgIC8qIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgaXNuJ3QgdXNlZCBpbiBBQ1BJIDIuMCovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcl9QTV9wcm9maWxlOyAgLyogQ29udmV5cyBwcmVmZXJyZWQgcG93ZXIgbWFuYWdlbWVudCBwcm9maWxlIHRvIE9TUE0uICovIFwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaV9pbnQ7ICAgICAgICAgICAgLyogU3lzdGVtIHZlY3RvciBvZiBTQ0kgaW50ZXJydXB0ICovIFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtaV9jbWQ7ICAgICAgICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFNNSSBjb21tYW5kIHBvcnQgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9lbmFibGU7ICAgICAgICAvKiBWYWx1ZSB0byB3cml0ZSB0byBzbWlfY21kIHRvIGVuYWJsZSBBQ1BJICovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZGlzYWJsZTsgICAgICAgLyogVmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBkaXNhYmxlIEFDUEkgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUzRiaW9zX3JlcTsgICAgICAgICAvKiBWYWx1ZSB0byB3cml0ZSB0byBTTUkgQ01EIHRvIGVudGVyIFM0QklPUyBzdGF0ZSAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3RhdGVfY250OyAgICAgICAgIC8qIFByb2Nlc3NvciBwZXJmb3JtYW5jZSBzdGF0ZSBjb250cm9sKi8gXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfcG0xYV9ldnRfYmxrOyAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIEV2ZW50IFJlZyBCbGsgKi8gXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfcG0xYl9ldnRfYmxrOyAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIEV2ZW50IFJlZyBCbGsgKi8gXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfcG0xYV9jbnRfYmxrOyAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIENvbnRyb2wgUmVnIEJsayAqLyBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9wbTFiX2NudF9ibGs7ICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgQ29udHJvbCBSZWcgQmxrICovIFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX3BtMl9jbnRfYmxrOyAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayAqLyBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9wbV90bXJfYmxrOyAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrICovIFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX2dwZTBfYmxrOyAgICAgICAgLyogUG9ydCBhZGRyIG9mIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDAgUmVnIEJsayAqLyBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9ncGUxX2JsazsgICAgICAgIC8qIFBvcnQgYWRkciBvZiBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAxIFJlZyBCbGsgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0xX2V2dF9sZW47ICAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTFfeF9ldnRfYmxrICovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMV9jbnRfbGVuOyAgICAgICAgLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0xX3hfY250X2JsayAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTJfY250X2xlbjsgICAgICAgIC8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMl9jbnRfYmxrICovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtX3RtX2xlbjsgICAgICAgICAgLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG1fdG1fYmxrICovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZTBfYmxrX2xlbjsgICAgICAgLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMF9ibGsgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlMV9ibGtfbGVuOyAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUxX2JsayAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGUxX2Jhc2U7ICAgICAgICAgIC8qIE9mZnNldCBpbiBncGUgbW9kZWwgd2hlcmUgZ3BlMSBldmVudHMgc3RhcnQgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0X2NudDsgICAgICAgICAgICAvKiBTdXBwb3J0IGZvciB0aGUgX0NTVCBvYmplY3QgYW5kIEMgU3RhdGVzIGNoYW5nZSBub3RpZmljYXRpb24uKi8gXAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx2bDJfbGF0OyAgICAgICAgICAvKiBXb3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMiBzdGF0ZSAqLyBcCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHZsM19sYXQ7ICAgICAgICAgIC8qIFdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMzIHN0YXRlICovIFwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoX3NpemU7ICAgICAgICAgLyogUHJvY2Vzc29yJ3MgbWVtb3J5IGNhY2hlIGxpbmUgd2lkdGgsIGluIGJ5dGVzICovIFwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoX3N0cmlkZTsgICAgICAgLyogTnVtYmVyIG9mIGZsdXNoIHN0cmlkZXMgdGhhdCBuZWVkIHRvIGJlIHJlYWQgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHV0eV9vZmZzZXQ7ICAgICAgICAvKiBQcm9jZXNzb3IncyBkdXR5IGN5Y2xlIGluZGV4IGluIHByb2Nlc3NvcidzIFBfQ05UIHJlZyovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1dHlfd2lkdGg7ICAgICAgICAgLyogUHJvY2Vzc29yJ3MgZHV0eSBjeWNsZSB2YWx1ZSBiaXQgd2lkdGggaW4gUF9DTlQgcmVnaXN0ZXIuKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5X2Fscm07ICAgICAgICAgICAvKiBJbmRleCB0byBkYXktb2YtbW9udGggYWxhcm0gaW4gUlRDIENNT1MgUkFNICovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbl9hbHJtOyAgICAgICAgICAgLyogSW5kZXggdG8gbW9udGgtb2YteWVhciBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudHVyeTsgICAgICAgICAgICAvKiBJbmRleCB0byBjZW50dXJ5IGluIFJUQyBDTU9TIFJBTSAqLyBcCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYXBjX2Jvb3RfYXJjaDsgICAgIC8qIElBLVBDIEJvb3QgQXJjaGl0ZWN0dXJlIEZsYWdzLiBTZWUgVGFibGUgNS0xMCBmb3IgZGVzY3JpcHRpb24qLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7ICAgICAgICAgIC8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KLQotLyoKLSAqIEFDUEkgMi4wKyBGQURUCi0gKi8KLXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgewotCUFDUElfRkFEVF9DT01NT04KLQkgICAgLyogRmxhZ3MgKDMyIGJpdHMpICovCi0JdTggd2JfaW52ZDoxOwkJLyogMDA6ICAgIFRoZSB3YmludmQgaW5zdHJ1Y3Rpb24gd29ya3MgcHJvcGVybHkgKi8KLQl1OCB3Yl9pbnZkX2ZsdXNoOjE7CS8qIDAxOiAgICBUaGUgd2JpbnZkIGZsdXNoZXMgYnV0IGRvZXMgbm90IGludmFsaWRhdGUgKi8KLQl1OCBwcm9jX2MxOjE7CQkvKiAwMjogICAgQWxsIHByb2Nlc3NvcnMgc3VwcG9ydCBDMSBzdGF0ZSAqLwotCXU4IHBsdmwyX3VwOjE7CQkvKiAwMzogICAgQzIgc3RhdGUgd29ya3Mgb24gTVAgc3lzdGVtICovCi0JdTggcHdyX2J1dHRvbjoxOwkvKiAwNDogICAgUG93ZXIgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUgKi8KLQl1OCBzbGVlcF9idXR0b246MTsJLyogMDU6ICAgIFNsZWVwIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlLCBvciBub3QgcHJlc2VudCAqLwotCXU4IGZpeGVkX3JUQzoxOwkJLyogMDY6ICAgIFJUQyB3YWtldXAgc3RhdCBub3QgaW4gZml4ZWQgcmVnaXN0ZXIgc3BhY2UgKi8KLQl1OCBydGNzNDoxOwkJLyogMDc6ICAgIFJUQyB3YWtldXAgc3RhdCBub3QgcG9zc2libGUgZnJvbSBTNCAqLwotCXU4IHRtcl92YWxfZXh0OjE7CS8qIDA4OiAgICB0bXJfdmFsIGlzIDMyIGJpdHMgMD0yNC1iaXRzICovCi0JdTggZG9ja19jYXA6MTsJCS8qIDA5OiAgICBEb2NraW5nIHN1cHBvcnRlZCAqLwotCXU4IHJlc2V0X3JlZ19zdXA6MTsJLyogMTA6ICAgIFN5c3RlbSByZXNldCB2aWEgdGhlIEZBRFQgUkVTRVRfUkVHIHN1cHBvcnRlZCAqLwotCXU4IHNlYWxlZF9jYXNlOjE7CS8qIDExOiAgICBObyBpbnRlcm5hbCBleHBhbnNpb24gY2FwYWJpbGl0aWVzIGFuZCBjYXNlIGlzIHNlYWxlZCAqLwotCXU4IGhlYWRsZXNzOjE7CQkvKiAxMjogICAgTm8gbG9jYWwgdmlkZW8gY2FwYWJpbGl0aWVzIG9yIGxvY2FsIGlucHV0IGRldmljZXMgKi8KLQl1OCBjcHVfc3dfc2xlZXA6MTsJLyogMTM6ICAgIE11c3QgZXhlY3V0ZSBuYXRpdmUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgd3JpdGluZyBTTFBfVFlQeCByZWdpc3RlciAqLwotCi0JdTggcGNpX2V4cF93YWs6MTsJLyogMTQ6ICAgIFN5c3RlbSBzdXBwb3J0cyBQQ0lFWFBfV0FLRSAoU1RTL0VOKSBiaXRzIChBQ1BJIDMuMCkgKi8KLQl1OCB1c2VfcGxhdGZvcm1fY2xvY2s6MTsJLyogMTU6ICAgIE9TUE0gc2hvdWxkIHVzZSBwbGF0Zm9ybS1wcm92aWRlZCB0aW1lciAoQUNQSSAzLjApICovCi0JdTggUzRydGNfc3RzX3ZhbGlkOjE7CS8qIDE2OiAgICBDb250ZW50cyBvZiBSVENfU1RTIHZhbGlkIGFmdGVyIFM0IHdha2UgKEFDUEkgMy4wKSAqLwotCXU4IHJlbW90ZV9wb3dlcl9vbl9jYXBhYmxlOjE7CS8qIDE3OiAgICBTeXN0ZW0gaXMgY29tcGF0aWJsZSB3aXRoIHJlbW90ZSBwb3dlciBvbiAoQUNQSSAzLjApICovCi0JdTggZm9yY2VfYXBpY19jbHVzdGVyX21vZGVsOjE7CS8qIDE4OiAgICBBbGwgbG9jYWwgQVBJQ3MgbXVzdCB1c2UgY2x1c3RlciBtb2RlbCAoQUNQSSAzLjApICovCi0JdTggZm9yY2VfYXBpY19waHlzaWNhbF9kZXN0aW5hdGlvbl9tb2RlOjE7CS8qIDE5OiAgIEFsbCBsb2NhbCB4X2FQSUNzIG11c3QgdXNlIHBoeXNpY2FsIGRlc3QgbW9kZSAoQUNQSSAzLjApICovCi0JIHU4OjQ7CQkJLyogMjAtMjM6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KLQl1OCByZXNlcnZlZDM7CQkvKiAyNC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHJlc2V0X3JlZ2lzdGVyOwkvKiBSZXNldCByZWdpc3RlciBhZGRyZXNzIGluIEdBUyBmb3JtYXQgKi8KK3N0cnVjdCBhY3BpX3RhYmxlX2ZhZHQgeworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIENvbW1vbiBBQ1BJIHRhYmxlIGhlYWRlciAqLworCXUzMiBmYWNzOwkJLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLworCXUzMiBkc2R0OwkJLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRFNEVCAqLworCXU4IG1vZGVsOwkJLyogU3lzdGVtIEludGVycnVwdCBNb2RlbCAoQUNQSSAxLjApIC0gbm90IHVzZWQgaW4gQUNQSSAyLjArICovCisJdTggcHJlZmVycmVkX3Byb2ZpbGU7CS8qIENvbnZleXMgcHJlZmVycmVkIHBvd2VyIG1hbmFnZW1lbnQgcHJvZmlsZSB0byBPU1BNLiAqLworCXUxNiBzY2lfaW50ZXJydXB0OwkvKiBTeXN0ZW0gdmVjdG9yIG9mIFNDSSBpbnRlcnJ1cHQgKi8KKwl1MzIgc21pX2NvbW1hbmQ7CS8qIDMyLWJpdCBQb3J0IGFkZHJlc3Mgb2YgU01JIGNvbW1hbmQgcG9ydCAqLworCXU4IGFjcGlfZW5hYmxlOwkJLyogVmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBlbmFibGUgQUNQSSAqLworCXU4IGFjcGlfZGlzYWJsZTsJLyogVmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBkaXNhYmxlIEFDUEkgKi8KKwl1OCBTNGJpb3NfcmVxdWVzdDsJLyogVmFsdWUgdG8gd3JpdGUgdG8gU01JIENNRCB0byBlbnRlciBTNEJJT1Mgc3RhdGUgKi8KKwl1OCBwc3RhdGVfY29udHJvbDsJLyogUHJvY2Vzc29yIHBlcmZvcm1hbmNlIHN0YXRlIGNvbnRyb2wgKi8KKwl1MzIgcG0xYV9ldmVudF9ibG9jazsJLyogMzItYml0IFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgRXZlbnQgUmVnIEJsayAqLworCXUzMiBwbTFiX2V2ZW50X2Jsb2NrOwkvKiAzMi1iaXQgUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBFdmVudCBSZWcgQmxrICovCisJdTMyIHBtMWFfY29udHJvbF9ibG9jazsJLyogMzItYml0IFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrICovCisJdTMyIHBtMWJfY29udHJvbF9ibG9jazsJLyogMzItYml0IFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgQ29udHJvbCBSZWcgQmxrICovCisJdTMyIHBtMl9jb250cm9sX2Jsb2NrOwkvKiAzMi1iaXQgUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayAqLworCXUzMiBwbV90aW1lcl9ibG9jazsJLyogMzItYml0IFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrICovCisJdTMyIGdwZTBfYmxvY2s7CQkvKiAzMi1iaXQgUG9ydCBhZGRyZXNzIG9mIEdlbmVyYWwgUHVycG9zZSBFdmVudCAwIFJlZyBCbGsgKi8KKwl1MzIgZ3BlMV9ibG9jazsJCS8qIDMyLWJpdCBQb3J0IGFkZHJlc3Mgb2YgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDEgUmVnIEJsayAqLworCXU4IHBtMV9ldmVudF9sZW5ndGg7CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMXhfZXZlbnRfYmxvY2sgKi8KKwl1OCBwbTFfY29udHJvbF9sZW5ndGg7CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMXhfY29udHJvbF9ibG9jayAqLworCXU4IHBtMl9jb250cm9sX2xlbmd0aDsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0yX2NvbnRyb2xfYmxvY2sgKi8KKwl1OCBwbV90aW1lcl9sZW5ndGg7CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtX3RpbWVyX2Jsb2NrICovCisJdTggZ3BlMF9ibG9ja19sZW5ndGg7CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTBfYmxvY2sgKi8KKwl1OCBncGUxX2Jsb2NrX2xlbmd0aDsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMV9ibG9jayAqLworCXU4IGdwZTFfYmFzZTsJCS8qIE9mZnNldCBpbiBHUEUgbnVtYmVyIHNwYWNlIHdoZXJlIEdQRTEgZXZlbnRzIHN0YXJ0ICovCisJdTggY3N0X2NvbnRyb2w7CQkvKiBTdXBwb3J0IGZvciB0aGUgX0NTVCBvYmplY3QgYW5kIEMgU3RhdGVzIGNoYW5nZSBub3RpZmljYXRpb24gKi8KKwl1MTYgQzJsYXRlbmN5OwkJLyogV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzIgc3RhdGUgKi8KKwl1MTYgQzNsYXRlbmN5OwkJLyogV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzMgc3RhdGUgKi8KKwl1MTYgZmx1c2hfc2l6ZTsJCS8qIFByb2Nlc3NvcidzIG1lbW9yeSBjYWNoZSBsaW5lIHdpZHRoLCBpbiBieXRlcyAqLworCXUxNiBmbHVzaF9zdHJpZGU7CS8qIE51bWJlciBvZiBmbHVzaCBzdHJpZGVzIHRoYXQgbmVlZCB0byBiZSByZWFkICovCisJdTggZHV0eV9vZmZzZXQ7CQkvKiBQcm9jZXNzb3IgZHV0eSBjeWNsZSBpbmRleCBpbiBwcm9jZXNzb3IncyBQX0NOVCByZWcgKi8KKwl1OCBkdXR5X3dpZHRoOwkJLyogUHJvY2Vzc29yIGR1dHkgY3ljbGUgdmFsdWUgYml0IHdpZHRoIGluIFBfQ05UIHJlZ2lzdGVyLiAqLworCXU4IGRheV9hbGFybTsJCS8qIEluZGV4IHRvIGRheS1vZi1tb250aCBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KKwl1OCBtb250aF9hbGFybTsJCS8qIEluZGV4IHRvIG1vbnRoLW9mLXllYXIgYWxhcm0gaW4gUlRDIENNT1MgUkFNICovCisJdTggY2VudHVyeTsJCS8qIEluZGV4IHRvIGNlbnR1cnkgaW4gUlRDIENNT1MgUkFNICovCisJdTE2IGJvb3RfZmxhZ3M7CQkvKiBJQS1QQyBCb290IEFyY2hpdGVjdHVyZSBGbGFncy4gU2VlIFRhYmxlIDUtMTAgZm9yIGRlc2NyaXB0aW9uICovCisJdTggcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTMyIGZsYWdzOwkJLyogTWlzY2VsbGFuZW91cyBmbGFnIGJpdHMgKHNlZSBiZWxvdyBmb3IgaW5kaXZpZHVhbCBmbGFncykgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgcmVzZXRfcmVnaXN0ZXI7CS8qIDY0LWJpdCBhZGRyZXNzIG9mIHRoZSBSZXNldCByZWdpc3RlciAqLwogCXU4IHJlc2V0X3ZhbHVlOwkJLyogVmFsdWUgdG8gd3JpdGUgdG8gdGhlIHJlc2V0X3JlZ2lzdGVyIHBvcnQgdG8gcmVzZXQgdGhlIHN5c3RlbSAqLwotCXU4IHJlc2VydmVkNFszXTsJLyogVGhlc2UgdGhyZWUgYnl0ZXMgbXVzdCBiZSB6ZXJvICovCi0JdTY0IHhmaXJtd2FyZV9jdHJsOwkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovCisJdTggcmVzZXJ2ZWQ0WzNdOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTY0IFhmYWNzOwkJLyogNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLwogCXU2NCBYZHNkdDsJCS8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWFfZXZ0X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIGFjcGlfZXZlbnQgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2V2dF9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCAxYiBhY3BpX2V2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYV9jbnRfYmxrOwkvKiBFeHRlbmRlZCBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWJfY250X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTJfY250X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtX3Rtcl9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4Z3BlMF9ibGs7CS8qIEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDAgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhncGUxX2JsazsJLyogRXh0ZW5kZWQgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMSBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWFfZXZlbnRfYmxvY2s7CS8qIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMWEgRXZlbnQgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2V2ZW50X2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDFiIEV2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYV9jb250cm9sX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2NvbnRyb2xfYmxvY2s7CS8qIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMWIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMl9jb250cm9sX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtX3RpbWVyX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IFRpbWVyIEN0cmwgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhncGUwX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDAgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhncGUxX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDEgUmVnIEJsayBhZGRyZXNzICovCiB9OwogCisvKiBGQURUIGZsYWdzICovCisKKyNkZWZpbmUgQUNQSV9GQURUX1dCSU5WRCAgICAgICAgICAgICgxKQkvKiAwMDogVGhlIHdiaW52ZCBpbnN0cnVjdGlvbiB3b3JrcyBwcm9wZXJseSAqLworI2RlZmluZSBBQ1BJX0ZBRFRfV0JJTlZEX0ZMVVNIICAgICAgKDE8PDEpCS8qIDAxOiBUaGUgd2JpbnZkIGZsdXNoZXMgYnV0IGRvZXMgbm90IGludmFsaWRhdGUgKi8KKyNkZWZpbmUgQUNQSV9GQURUX0MxX1NVUFBPUlRFRCAgICAgICgxPDwyKQkvKiAwMjogQWxsIHByb2Nlc3NvcnMgc3VwcG9ydCBDMSBzdGF0ZSAqLworI2RlZmluZSBBQ1BJX0ZBRFRfQzJfTVBfU1VQUE9SVEVEICAgKDE8PDMpCS8qIDAzOiBDMiBzdGF0ZSB3b3JrcyBvbiBNUCBzeXN0ZW0gKi8KKyNkZWZpbmUgQUNQSV9GQURUX1BPV0VSX0JVVFRPTiAgICAgICgxPDw0KQkvKiAwNDogUG93ZXIgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUgKi8KKyNkZWZpbmUgQUNQSV9GQURUX1NMRUVQX0JVVFRPTiAgICAgICgxPDw1KQkvKiAwNTogU2xlZXAgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUsIG9yICBub3QgcHJlc2VudCAqLworI2RlZmluZSBBQ1BJX0ZBRFRfRklYRURfUlRDICAgICAgICAgKDE8PDYpCS8qIDA2OiBSVEMgd2FrZXVwIHN0YXQgbm90IGluIGZpeGVkIHJlZ2lzdGVyIHNwYWNlICovCisjZGVmaW5lIEFDUElfRkFEVF9TNF9SVENfV0FLRSAgICAgICAoMTw8NykJLyogMDc6IFJUQyB3YWtldXAgc3RhdCBub3QgcG9zc2libGUgZnJvbSBTNCAqLworI2RlZmluZSBBQ1BJX0ZBRFRfMzJCSVRfVElNRVIgICAgICAgKDE8PDgpCS8qIDA4OiB0bXJfdmFsIGlzIDMyIGJpdHMgMD0yNC1iaXRzICovCisjZGVmaW5lIEFDUElfRkFEVF9ET0NLSU5HX1NVUFBPUlRFRCAoMTw8OSkJLyogMDk6IERvY2tpbmcgc3VwcG9ydGVkICovCisjZGVmaW5lIEFDUElfRkFEVF9SRVNFVF9SRUdJU1RFUiAgICAoMTw8MTApCS8qIDEwOiBTeXN0ZW0gcmVzZXQgdmlhIHRoZSBGQURUIFJFU0VUX1JFRyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQUNQSV9GQURUX1NFQUxFRF9DQVNFICAgICAgICgxPDwxMSkJLyogMTE6IE5vIGludGVybmFsIGV4cGFuc2lvbiBjYXBhYmlsaXRpZXMgYW5kIGNhc2UgaXMgc2VhbGVkICovCisjZGVmaW5lIEFDUElfRkFEVF9IRUFETEVTUyAgICAgICAgICAoMTw8MTIpCS8qIDEyOiBObyBsb2NhbCB2aWRlbyBjYXBhYmlsaXRpZXMgb3IgbG9jYWwgaW5wdXQgZGV2aWNlcyAqLworI2RlZmluZSBBQ1BJX0ZBRFRfU0xFRVBfVFlQRSAgICAgICAgKDE8PDEzKQkvKiAxMzogTXVzdCBleGVjdXRlIG5hdGl2ZSBpbnN0cnVjdGlvbiBhZnRlciB3cml0aW5nICBTTFBfVFlQeCByZWdpc3RlciAqLworI2RlZmluZSBBQ1BJX0ZBRFRfUENJX0VYUFJFU1NfV0FLRSAgKDE8PDE0KQkvKiAxNDogU3lzdGVtIHN1cHBvcnRzIFBDSUVYUF9XQUtFIChTVFMvRU4pIGJpdHMgKEFDUEkgMy4wKSAqLworI2RlZmluZSBBQ1BJX0ZBRFRfUExBVEZPUk1fQ0xPQ0sgICAgKDE8PDE1KQkvKiAxNTogT1NQTSBzaG91bGQgdXNlIHBsYXRmb3JtLXByb3ZpZGVkIHRpbWVyIChBQ1BJIDMuMCkgKi8KKyNkZWZpbmUgQUNQSV9GQURUX1M0X1JUQ19WQUxJRCAgICAgICgxPDwxNikJLyogMTY6IENvbnRlbnRzIG9mIFJUQ19TVFMgdmFsaWQgYWZ0ZXIgUzQgd2FrZSAoQUNQSSAzLjApICovCisjZGVmaW5lIEFDUElfRkFEVF9SRU1PVEVfUE9XRVJfT04gICAoMTw8MTcpCS8qIDE3OiBTeXN0ZW0gaXMgY29tcGF0aWJsZSB3aXRoIHJlbW90ZSBwb3dlciBvbiAoQUNQSSAzLjApICovCisjZGVmaW5lIEFDUElfRkFEVF9BUElDX0NMVVNURVIgICAgICAoMTw8MTgpCS8qIDE4OiBBbGwgbG9jYWwgQVBJQ3MgbXVzdCB1c2UgY2x1c3RlciBtb2RlbCAoQUNQSSAzLjApICovCisjZGVmaW5lIEFDUElfRkFEVF9BUElDX1BIWVNJQ0FMICAgICAoMTw8MTkpCS8qIDE5OiBBbGwgbG9jYWwgeF9hUElDcyBtdXN0IHVzZSBwaHlzaWNhbCBkZXN0IG1vZGUgKEFDUEkgMy4wKSAqLworCiAvKgotICogIkRvd24tcmV2dmVkIiBBQ1BJIDIuMCBGQURUIGRlc2NyaXB0b3IKLSAqIERlZmluZWQgaGVyZSB0byBhbGxvdyBjb21waWxlciB0byBnZW5lcmF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3QKKyAqIEZBRFQgUHJlZmVyZWQgUG93ZXIgTWFuYWdlbWVudCBQcm9maWxlcwogICovCi1zdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjJfbWludXMgewotCUFDUElfRkFEVF9DT01NT04gdTMyIGZsYWdzOwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyByZXNldF9yZWdpc3RlcjsJLyogUmVzZXQgcmVnaXN0ZXIgYWRkcmVzcyBpbiBHQVMgZm9ybWF0ICovCi0JdTggcmVzZXRfdmFsdWU7CQkvKiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgcmVzZXRfcmVnaXN0ZXIgcG9ydCB0byByZXNldCB0aGUgc3lzdGVtLiAqLwotCXU4IHJlc2VydmVkN1szXTsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworZW51bSBhY3BpX3ByZWZlcmVkX3BtX3Byb2ZpbGVzIHsKKwlQTV9VTlNQRUNJRklFRCA9IDAsCisJUE1fREVTS1RPUCA9IDEsCisJUE1fTU9CSUxFID0gMiwKKwlQTV9XT1JLU1RBVElPTiA9IDMsCisJUE1fRU5URVJQUklTRV9TRVJWRVIgPSA0LAorCVBNX1NPSE9fU0VSVkVSID0gNSwKKwlQTV9BUFBMSUFOQ0VfUEMgPSA2CiB9OwogCi0vKgotICogQUNQSSAxLjAgRkFEVAotICogRGVmaW5lZCBoZXJlIHRvIGFsbG93IGNvbXBpbGVyIHRvIGdlbmVyYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cnVjdAotICovCi1zdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEgewotCUFDUElfRkFEVF9DT01NT04gdTMyIGZsYWdzOwotfTsKLQotLyogRkFEVDogUHJlZmVyZWQgUG93ZXIgTWFuYWdlbWVudCBQcm9maWxlcyAqLwotCi0jZGVmaW5lIFBNX1VOU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQTV9ERVNLVE9QICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUE1fTU9CSUxFICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFBNX1dPUktTVEFUSU9OICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBQTV9FTlRFUlBSSVNFX1NFUlZFUiAgICAgICAgICAgIDQKLSNkZWZpbmUgUE1fU09IT19TRVJWRVIgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFBNX0FQUExJQU5DRV9QQyAgICAgICAgICAgICAgICAgNgotCi0vKiBGQURUOiBCb290IEFyY2ggRmxhZ3MgKi8KKy8qIEZBRFQgQm9vdCBBcmNoIEZsYWdzICovCiAKICNkZWZpbmUgQkFGX0xFR0FDWV9ERVZJQ0VTICAgICAgICAgICAgICAweDAwMDEKICNkZWZpbmUgQkFGXzgwNDJfS0VZQk9BUkRfQ09OVFJPTExFUiAgICAweDAwMDIKQEAgLTMxMiw1OSArMjg0LDEyIEBACiAKICNwcmFnbWEgcGFjaygpCiAKLS8qCi0gKiBUaGlzIG1hY3JvIGlzIHRlbXBvcmFyeSB1bnRpbCB0aGUgdGFibGUgYml0ZmllbGQgZmxhZyBkZWZpbml0aW9ucwotICogYXJlIHJlbW92ZWQgYW5kIHJlcGxhY2VkIGJ5IGEgRmxhZ3MgZmllbGQuCi0gKi8KLSNkZWZpbmUgQUNQSV9GTEFHX09GRlNFVChkLGYsbykgICAgICAgICAodTgpIChBQ1BJX09GRlNFVCAoZCxmKSArIFwKLQkJCSAgc2l6ZW9mKCgoZCAqKTApLT5mKSArIG8pCisjZGVmaW5lIEFDUElfRkFEVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGFjcGlfdGFibGVfZmFkdCwgZikKKwogLyoKICAqIEdldCB0aGUgcmVtYWluaW5nIEFDUEkgdGFibGVzCiAgKi8KLSNpbmNsdWRlICJhY3RibDEuaCIKIAotLyoKLSAqIEFDUEkgVGFibGUgaW5mb3JtYXRpb24uICBXZSBzYXZlIHRoZSB0YWJsZSBhZGRyZXNzLCBsZW5ndGgsCi0gKiBhbmQgdHlwZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiAobWFwcGVkIG9yIGFsbG9jYXRlZCkgZm9yIGVhY2gKLSAqIHRhYmxlIGZvciAxKSB3aGVuIHdlIGV4aXQsIGFuZCAyKSBpZiBhIG5ldyB0YWJsZSBpcyBpbnN0YWxsZWQKLSAqLwotI2RlZmluZSBBQ1BJX01FTV9OT1RfQUxMT0NBVEVEICAwCi0jZGVmaW5lIEFDUElfTUVNX0FMTE9DQVRFRCAgICAgIDEKLSNkZWZpbmUgQUNQSV9NRU1fTUFQUEVEICAgICAgICAgMgotCi0vKiBEZWZpbml0aW9ucyBmb3IgdGhlIEZsYWdzIGJpdGZpZWxkIG1lbWJlciBvZiBzdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0ICovCi0KLSNkZWZpbmUgQUNQSV9UQUJMRV9TSU5HTEUgICAgICAgMHgwMAotI2RlZmluZSBBQ1BJX1RBQkxFX01VTFRJUExFICAgICAweDAxCi0jZGVmaW5lIEFDUElfVEFCTEVfRVhFQ1VUQUJMRSAgIDB4MDIKLQotI2RlZmluZSBBQ1BJX1RBQkxFX1JPT1QgICAgICAgICAweDAwCi0jZGVmaW5lIEFDUElfVEFCTEVfUFJJTUFSWSAgICAgIDB4MTAKLSNkZWZpbmUgQUNQSV9UQUJMRV9TRUNPTkRBUlkgICAgMHgyMAotI2RlZmluZSBBQ1BJX1RBQkxFX0FMTCAgICAgICAgICAweDMwCi0jZGVmaW5lIEFDUElfVEFCTEVfVFlQRV9NQVNLICAgIDB4MzAKLQotLyogRGF0YSBhYm91dCBlYWNoIGtub3duIHRhYmxlIHR5cGUgKi8KLQotc3RydWN0IGFjcGlfdGFibGVfc3VwcG9ydCB7Ci0JY2hhciAqbmFtZTsKLQljaGFyICpzaWduYXR1cmU7Ci0Jdm9pZCAqKmdsb2JhbF9wdHI7Ci0JdTggc2lnX2xlbmd0aDsKLQl1OCBmbGFnczsKLX07Ci0KLWV4dGVybiB1OCBhY3BpX2ZhZHRfaXNfdjE7CS8qIGlzIHNldCB0byAxIGlmIEZBRFQgaXMgcmV2aXNpb24gMSwKLQkJCQkgKiBuZWVkZWQgZm9yIGNlcnRhaW4gd29ya2Fyb3VuZHMgKi8KLS8qIE1hY3JvcyB1c2VkIHRvIGdlbmVyYXRlIG9mZnNldHMgdG8gc3BlY2lmaWMgdGFibGUgZmllbGRzICovCi0KLSNkZWZpbmUgQUNQSV9GQUNTX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgZmFjc19kZXNjcmlwdG9yLGYpCi0jZGVmaW5lIEFDUElfRkFEVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGZhZHRfZGVzY3JpcHRvciwgZikKLSNkZWZpbmUgQUNQSV9HQVNfT0ZGU0VUKGYpICAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MsZikKLSNkZWZpbmUgQUNQSV9IRFJfT0ZGU0VUKGYpICAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsZikKLSNkZWZpbmUgQUNQSV9SU0RQX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yLGYpCi0KLSNkZWZpbmUgQUNQSV9GQURUX0ZMQUdfT0ZGU0VUKGYsbykgICAgICBBQ1BJX0ZMQUdfT0ZGU0VUIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yLGYsbykKLSNkZWZpbmUgQUNQSV9GQUNTX0ZMQUdfT0ZGU0VUKGYsbykgICAgICBBQ1BJX0ZMQUdfT0ZGU0VUIChzdHJ1Y3QgZmFjc19kZXNjcmlwdG9yLGYsbykKKyNpbmNsdWRlIDxhY3BpL2FjdGJsMS5oPgogCiAjZW5kaWYJCQkJLyogX19BQ1RCTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibDEuaCBiL2luY2x1ZGUvYWNwaS9hY3RibDEuaAppbmRleCA3NDVhNjQ0Li40ZTVkM2NhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwxLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsMS5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNjEsNiArNjEsNyBAQAogI2RlZmluZSBBQ1BJX1NJR19CT09UICAgICAgICAgICAiQk9PVCIJLyogU2ltcGxlIEJvb3QgRmxhZyBUYWJsZSAqLwogI2RlZmluZSBBQ1BJX1NJR19DUEVQICAgICAgICAgICAiQ1BFUCIJLyogQ29ycmVjdGVkIFBsYXRmb3JtIEVycm9yIFBvbGxpbmcgdGFibGUgKi8KICNkZWZpbmUgQUNQSV9TSUdfREJHUCAgICAgICAgICAgIkRCR1AiCS8qIERlYnVnIFBvcnQgdGFibGUgKi8KKyNkZWZpbmUgQUNQSV9TSUdfRE1BUiAgICAgICAgICAgIkRNQVIiCS8qIERNQSBSZW1hcHBpbmcgdGFibGUgKi8KICNkZWZpbmUgQUNQSV9TSUdfRUNEVCAgICAgICAgICAgIkVDRFQiCS8qIEVtYmVkZGVkIENvbnRyb2xsZXIgQm9vdCBSZXNvdXJjZXMgVGFibGUgKi8KICNkZWZpbmUgQUNQSV9TSUdfSFBFVCAgICAgICAgICAgIkhQRVQiCS8qIEhpZ2ggUHJlY2lzaW9uIEV2ZW50IFRpbWVyIHRhYmxlICovCiAjZGVmaW5lIEFDUElfU0lHX01BRFQgICAgICAgICAgICJBUElDIgkvKiBNdWx0aXBsZSBBUElDIERlc2NyaXB0aW9uIFRhYmxlICovCkBAIC03MywxMiArNzQsNiBAQAogI2RlZmluZSBBQ1BJX1NJR19UQ1BBICAgICAgICAgICAiVENQQSIJLyogVHJ1c3RlZCBDb21wdXRpbmcgUGxhdGZvcm0gQWxsaWFuY2UgdGFibGUgKi8KICNkZWZpbmUgQUNQSV9TSUdfV0RSVCAgICAgICAgICAgIldEUlQiCS8qIFdhdGNoZG9nIFJlc291cmNlIFRhYmxlICovCiAKLS8qIExlZ2FjeSBuYW1lcyAqLwotCi0jZGVmaW5lIEFQSUNfU0lHICAgICAgICAgICAgICAgICJBUElDIgkvKiBNdWx0aXBsZSBBUElDIERlc2NyaXB0aW9uIFRhYmxlICovCi0jZGVmaW5lIEJPT1RfU0lHICAgICAgICAgICAgICAgICJCT09UIgkvKiBTaW1wbGUgQm9vdCBGbGFnIFRhYmxlICovCi0jZGVmaW5lIFNCU1RfU0lHICAgICAgICAgICAgICAgICJTQlNUIgkvKiBTbWFydCBCYXR0ZXJ5IFNwZWNpZmljYXRpb24gVGFibGUgKi8KLQogLyoKICAqIEFsbCB0YWJsZXMgbXVzdCBiZSBieXRlLXBhY2tlZCB0byBtYXRjaCB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLCBzaW5jZQogICogdGhlIHRhYmxlcyBhcmUgcHJvdmlkZWQgYnkgdGhlIHN5c3RlbSBCSU9TLgpAQCAtOTEsMzEgKzg2LDQzIEBACiAgKiBwb3J0YWJsZSwgc28gZG8gbm90IHVzZSBhbnkgb3RoZXIgYml0ZmllbGQgdHlwZXMuCiAgKi8KIAorLyogQ29tbW9uIFN1Yi10YWJsZSBoZWFkZXIgKHVzZWQgaW4gTUFEVCwgU1JBVCwgZXRjLikgKi8KKworc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyIHsKKwl1OCB0eXBlOworCXU4IGxlbmd0aDsKK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogQVNGIC0gQWxlcnQgU3RhbmRhcmQgRm9ybWF0IHRhYmxlIChTaWduYXR1cmUgIkFTRiEiKQogICoKKyAqIENvbmZvcm1zIHRvIHRoZSBBbGVydCBTdGFuZGFyZCBGb3JtYXQgU3BlY2lmaWNhdGlvbiBWMi4wLCAyMyBBcHJpbCAyMDAzCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IGFjcGlfdGFibGVfYXNmIHsKLUFDUElfVEFCTEVfSEVBREVSX0RFRn07CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsJLyogQ29tbW9uIEFDUEkgdGFibGUgaGVhZGVyICovCit9OwogCi0jZGVmaW5lIEFDUElfQVNGX0hFQURFUl9ERUYgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7IFwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKKy8qIEFTRiBzdWJ0YWJsZSBoZWFkZXIgKi8KIAogc3RydWN0IGFjcGlfYXNmX2hlYWRlciB7Ci1BQ1BJX0FTRl9IRUFERVJfREVGfTsKKwl1OCB0eXBlOworCXU4IHJlc2VydmVkOworCXUxNiBsZW5ndGg7Cit9OwogCi0vKiBWYWx1ZXMgZm9yIFR5cGUgZmllbGQgKi8KKy8qIFZhbHVlcyBmb3IgVHlwZSBmaWVsZCBhYm92ZSAqLwogCi0jZGVmaW5lIEFTRl9JTkZPICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQVNGX0FMRVJUICAgICAgICAgICAgICAgMQotI2RlZmluZSBBU0ZfQ09OVFJPTCAgICAgICAgICAgICAyCi0jZGVmaW5lIEFTRl9CT09UICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQVNGX0FERFJFU1MgICAgICAgICAgICAgNAotI2RlZmluZSBBU0ZfUkVTRVJWRUQgICAgICAgICAgICA1CitlbnVtIGFjcGlfYXNmX3R5cGUgeworCUFDUElfQVNGX1RZUEVfSU5GTyA9IDAsCisJQUNQSV9BU0ZfVFlQRV9BTEVSVCA9IDEsCisJQUNQSV9BU0ZfVFlQRV9DT05UUk9MID0gMiwKKwlBQ1BJX0FTRl9UWVBFX0JPT1QgPSAzLAorCUFDUElfQVNGX1RZUEVfQUREUkVTUyA9IDQsCisJQUNQSV9BU0ZfVFlQRV9SRVNFUlZFRCA9IDUKK307CiAKIC8qCiAgKiBBU0Ygc3VidGFibGVzCkBAIC0xMjQsNyArMTMxLDggQEAKIC8qIDA6IEFTRiBJbmZvcm1hdGlvbiAqLwogCiBzdHJ1Y3QgYWNwaV9hc2ZfaW5mbyB7Ci0JQUNQSV9BU0ZfSEVBREVSX0RFRiB1OCBtaW5fcmVzZXRfdmFsdWU7CisJc3RydWN0IGFjcGlfYXNmX2hlYWRlciBoZWFkZXI7CisJdTggbWluX3Jlc2V0X3ZhbHVlOwogCXU4IG1pbl9wb2xsX2ludGVydmFsOwogCXUxNiBzeXN0ZW1faWQ7CiAJdTMyIG1mZ19pZDsKQEAgLTEzNSwyNiArMTQzLDQ5IEBACiAvKiAxOiBBU0YgQWxlcnRzICovCiAKIHN0cnVjdCBhY3BpX2FzZl9hbGVydCB7Ci0JQUNQSV9BU0ZfSEVBREVSX0RFRiB1OCBhc3NlcnRfbWFzazsKKwlzdHJ1Y3QgYWNwaV9hc2ZfaGVhZGVyIGhlYWRlcjsKKwl1OCBhc3NlcnRfbWFzazsKIAl1OCBkZWFzc2VydF9tYXNrOwogCXU4IGFsZXJ0czsKIAl1OCBkYXRhX2xlbmd0aDsKLQl1OCBhcnJheVsxXTsKK307CisKK3N0cnVjdCBhY3BpX2FzZl9hbGVydF9kYXRhIHsKKwl1OCBhZGRyZXNzOworCXU4IGNvbW1hbmQ7CisJdTggbWFzazsKKwl1OCB2YWx1ZTsKKwl1OCBzZW5zb3JfdHlwZTsKKwl1OCB0eXBlOworCXU4IG9mZnNldDsKKwl1OCBzb3VyY2VfdHlwZTsKKwl1OCBzZXZlcml0eTsKKwl1OCBzZW5zb3JfbnVtYmVyOworCXU4IGVudGl0eTsKKwl1OCBpbnN0YW5jZTsKIH07CiAKIC8qIDI6IEFTRiBSZW1vdGUgQ29udHJvbCAqLwogCiBzdHJ1Y3QgYWNwaV9hc2ZfcmVtb3RlIHsKLQlBQ1BJX0FTRl9IRUFERVJfREVGIHU4IGNvbnRyb2xzOworCXN0cnVjdCBhY3BpX2FzZl9oZWFkZXIgaGVhZGVyOworCXU4IGNvbnRyb2xzOwogCXU4IGRhdGFfbGVuZ3RoOwogCXUxNiByZXNlcnZlZDI7Ci0JdTggYXJyYXlbMV07Cit9OworCitzdHJ1Y3QgYWNwaV9hc2ZfY29udHJvbF9kYXRhIHsKKwl1OCBmdW5jdGlvbjsKKwl1OCBhZGRyZXNzOworCXU4IGNvbW1hbmQ7CisJdTggdmFsdWU7CiB9OwogCiAvKiAzOiBBU0YgUk1DUCBCb290IE9wdGlvbnMgKi8KIAogc3RydWN0IGFjcGlfYXNmX3JtY3AgewotCUFDUElfQVNGX0hFQURFUl9ERUYgdTggY2FwYWJpbGl0aWVzWzddOworCXN0cnVjdCBhY3BpX2FzZl9oZWFkZXIgaGVhZGVyOworCXU4IGNhcGFiaWxpdGllc1s3XTsKIAl1OCBjb21wbGV0aW9uX2NvZGU7CiAJdTMyIGVudGVycHJpc2VfaWQ7CiAJdTggY29tbWFuZDsKQEAgLTE2Niw5ICsxOTcsOSBAQAogLyogNDogQVNGIEFkZHJlc3MgKi8KIAogc3RydWN0IGFjcGlfYXNmX2FkZHJlc3MgewotCUFDUElfQVNGX0hFQURFUl9ERUYgdTggZXByb21fYWRkcmVzczsKKwlzdHJ1Y3QgYWNwaV9hc2ZfaGVhZGVyIGhlYWRlcjsKKwl1OCBlcHJvbV9hZGRyZXNzOwogCXU4IGRldmljZXM7Ci0JdTggc21idXNfYWRkcmVzc2VzWzFdOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE3OCw3ICsyMDksOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IGFjcGlfdGFibGVfYm9vdCB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGIHU4IGNtb3NfaW5kZXg7CS8qIEluZGV4IGluIENNT1MgUkFNIGZvciB0aGUgYm9vdCByZWdpc3RlciAqLworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIENvbW1vbiBBQ1BJIHRhYmxlIGhlYWRlciAqLworCXU4IGNtb3NfaW5kZXg7CQkvKiBJbmRleCBpbiBDTU9TIFJBTSBmb3IgdGhlIGJvb3QgcmVnaXN0ZXIgKi8KIAl1OCByZXNlcnZlZFszXTsKIH07CiAKQEAgLTE4OSw3ICsyMjEsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IGFjcGlfdGFibGVfY3BlcCB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGIHU2NCByZXNlcnZlZDsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiBDb21tb24gQUNQSSB0YWJsZSBoZWFkZXIgKi8KKwl1NjQgcmVzZXJ2ZWQ7CiB9OwogCiAvKiBTdWJ0YWJsZSAqLwpAQCAtMTk3LDkgKzIzMCw5IEBACiBzdHJ1Y3QgYWNwaV9jcGVwX3BvbGxpbmcgewogCXU4IHR5cGU7CiAJdTggbGVuZ3RoOwotCXU4IHByb2Nlc3Nvcl9pZDsJLyogUHJvY2Vzc29yIElEICovCi0JdTggcHJvY2Vzc29yX2VpZDsJLyogUHJvY2Vzc29yIEVJRCAqLwotCXUzMiBwb2xsaW5nX2ludGVydmFsOwkvKiBQb2xsaW5nIGludGVydmFsIChtc2VjKSAqLworCXU4IGlkOwkJCS8qIFByb2Nlc3NvciBJRCAqLworCXU4IGVpZDsJCQkvKiBQcm9jZXNzb3IgRUlEICovCisJdTMyIGludGVydmFsOwkJLyogUG9sbGluZyBpbnRlcnZhbCAobXNlYykgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMDksMjMgKzI0Miw5NyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IGFjcGlfdGFibGVfZGJncCB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGIHU4IGludGVyZmFjZV90eXBlOwkvKiAwPWZ1bGwgMTY1NTAsIDE9c3Vic2V0IG9mIDE2NTUwICovCisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsJLyogQ29tbW9uIEFDUEkgdGFibGUgaGVhZGVyICovCisJdTggdHlwZTsJCS8qIDA9ZnVsbCAxNjU1MCwgMT1zdWJzZXQgb2YgMTY1NTAgKi8KIAl1OCByZXNlcnZlZFszXTsKIAlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZGVidWdfcG9ydDsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogRE1BUiAtIERNQSBSZW1hcHBpbmcgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV90YWJsZV9kbWFyIHsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiBDb21tb24gQUNQSSB0YWJsZSBoZWFkZXIgKi8KKwl1OCB3aWR0aDsJCS8qIEhvc3QgQWRkcmVzcyBXaWR0aCAqLworCXU4IHJlc2VydmVkWzExXTsKK307CisKKy8qIERNQVIgc3VidGFibGUgaGVhZGVyICovCisKK3N0cnVjdCBhY3BpX2RtYXJfaGVhZGVyIHsKKwl1MTYgdHlwZTsKKwl1MTYgbGVuZ3RoOworCXU4IGZsYWdzOworCXU4IHJlc2VydmVkWzNdOworfTsKKworLyogVmFsdWVzIGZvciBzdWJ0YWJsZSB0eXBlIGluIHN0cnVjdCBhY3BpX2RtYXJfaGVhZGVyICovCisKK2VudW0gYWNwaV9kbWFyX3R5cGUgeworCUFDUElfRE1BUl9UWVBFX0hBUkRXQVJFX1VOSVQgPSAwLAorCUFDUElfRE1BUl9UWVBFX1JFU0VSVkVEX01FTU9SWSA9IDEsCisJQUNQSV9ETUFSX1RZUEVfUkVTRVJWRUQgPSAyCS8qIDIgYW5kIGdyZWF0ZXIgYXJlIHJlc2VydmVkICovCit9OworCitzdHJ1Y3QgYWNwaV9kbWFyX2RldmljZV9zY29wZSB7CisJdTggZW50cnlfdHlwZTsKKwl1OCBsZW5ndGg7CisJdTggc2VnbWVudDsKKwl1OCBidXM7Cit9OworCisvKiBWYWx1ZXMgZm9yIGVudHJ5X3R5cGUgaW4gc3RydWN0IGFjcGlfZG1hcl9kZXZpY2Vfc2NvcGUgKi8KKworZW51bSBhY3BpX2RtYXJfc2NvcGVfdHlwZSB7CisJQUNQSV9ETUFSX1NDT1BFX1RZUEVfTk9UX1VTRUQgPSAwLAorCUFDUElfRE1BUl9TQ09QRV9UWVBFX0VORFBPSU5UID0gMSwKKwlBQ1BJX0RNQVJfU0NPUEVfVFlQRV9CUklER0UgPSAyLAorCUFDUElfRE1BUl9TQ09QRV9UWVBFX1JFU0VSVkVEID0gMwkvKiAzIGFuZCBncmVhdGVyIGFyZSByZXNlcnZlZCAqLworfTsKKworLyoKKyAqIERNQVIgU3ViLXRhYmxlcywgY29ycmVzcG9uZCB0byBUeXBlIGluIHN0cnVjdCBhY3BpX2RtYXJfaGVhZGVyCisgKi8KKworLyogMDogSGFyZHdhcmUgVW5pdCBEZWZpbml0aW9uICovCisKK3N0cnVjdCBhY3BpX2RtYXJfaGFyZHdhcmVfdW5pdCB7CisJc3RydWN0IGFjcGlfZG1hcl9oZWFkZXIgaGVhZGVyOworCXU2NCBhZGRyZXNzOwkJLyogUmVnaXN0ZXIgQmFzZSBBZGRyZXNzICovCit9OworCisvKiBGbGFncyAqLworCisjZGVmaW5lIEFDUElfRE1BUl9JTkNMVURFX0FMTCAgICAgICAoMSkKKworLyogMTogUmVzZXJ2ZWQgTWVtb3J5IERlZmluaW5pdGlvbiAqLworCitzdHJ1Y3QgYWNwaV9kbWFyX3Jlc2VydmVkX21lbW9yeSB7CisJc3RydWN0IGFjcGlfZG1hcl9oZWFkZXIgaGVhZGVyOworCXU2NCBhZGRyZXNzOwkJLyogNF9rIGFsaWduZWQgYmFzZSBhZGRyZXNzICovCisJdTY0IGVuZF9hZGRyZXNzOwkvKiA0X2sgYWxpZ25lZCBsaW1pdCBhZGRyZXNzICovCit9OworCisvKiBGbGFncyAqLworCisjZGVmaW5lIEFDUElfRE1BUl9BTExPV19BTEwgICAgICAgICAoMSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCiAgKiBFQ0RUIC0gRW1iZWRkZWQgQ29udHJvbGxlciBCb290IFJlc291cmNlcyBUYWJsZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBlY19ib290X3Jlc291cmNlcyB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGIHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBlY19jb250cm9sOwkvKiBBZGRyZXNzIG9mIEVDIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGVjX2RhdGE7CS8qIEFkZHJlc3Mgb2YgRUMgZGF0YSByZWdpc3RlciAqLworc3RydWN0IGFjcGlfdGFibGVfZWNkdCB7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsJLyogQ29tbW9uIEFDUEkgdGFibGUgaGVhZGVyICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGNvbnRyb2w7CS8qIEFkZHJlc3Mgb2YgRUMgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZGF0YTsJLyogQWRkcmVzcyBvZiBFQyBkYXRhIHJlZ2lzdGVyICovCiAJdTMyIHVpZDsJCS8qIFVuaXF1ZSBJRCAtIG11c3QgYmUgc2FtZSBhcyB0aGUgRUMgX1VJRCBtZXRob2QgKi8KLQl1OCBncGVfYml0OwkJLyogVGhlIEdQRSBmb3IgdGhlIEVDICovCi0JdTggZWNfaWRbMV07CQkvKiBGdWxsIG5hbWVwYXRoIG9mIHRoZSBFQyBpbiB0aGUgQUNQSSBuYW1lc3BhY2UgKi8KKwl1OCBncGU7CQkJLyogVGhlIEdQRSBmb3IgdGhlIEVDICovCisJdTggaWRbMV07CQkvKiBGdWxsIG5hbWVwYXRoIG9mIHRoZSBFQyBpbiB0aGUgQUNQSSBuYW1lc3BhY2UgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMzQsMjIgKzM0MSwyMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX2hwZXRfdGFibGUgewotCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1MzIgaGFyZHdhcmVfaWQ7CS8qIEhhcmR3YXJlIElEIG9mIGV2ZW50IHRpbWVyIGJsb2NrICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGJhc2VfYWRkcmVzczsJLyogQWRkcmVzcyBvZiBldmVudCB0aW1lciBibG9jayAqLwotCXU4IGhwZXRfbnVtYmVyOwkJLyogSFBFVCBzZXF1ZW5jZSBudW1iZXIgKi8KLQl1MTYgY2xvY2tfdGljazsJCS8qIE1haW4gY291bnRlciBtaW4gdGljaywgcGVyaW9kaWMgbW9kZSAqLwotCXU4IGF0dHJpYnV0ZXM7CitzdHJ1Y3QgYWNwaV90YWJsZV9ocGV0IHsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiBDb21tb24gQUNQSSB0YWJsZSBoZWFkZXIgKi8KKwl1MzIgaWQ7CQkJLyogSGFyZHdhcmUgSUQgb2YgZXZlbnQgdGltZXIgYmxvY2sgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgYWRkcmVzczsJLyogQWRkcmVzcyBvZiBldmVudCB0aW1lciBibG9jayAqLworCXU4IHNlcXVlbmNlOwkJLyogSFBFVCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1MTYgbWluaW11bV90aWNrOwkvKiBNYWluIGNvdW50ZXIgbWluIHRpY2ssIHBlcmlvZGljIG1vZGUgKi8KKwl1OCBmbGFnczsKIH07CiAKLSNpZiAwCQkJCS8qIEhQRVQgZmxhZ3MgdG8gYmUgY29udmVydGVkIHRvIG1hY3JvcyAqLwotc3RydWN0IHsJCQkvKiBGbGFncyAoOCBiaXRzKSAqLwotCXU4IHBhZ2VfcHJvdGVjdDoxOwkvKiAwMDogICAgTm8gcGFnZSBwcm90ZWN0aW9uICovCi0JdTggcGFnZV9wcm90ZWN0NDoxOwkvKiAwMTogICAgNF9rQiBwYWdlIHByb3RlY3RlZCAqLwotCXU4IHBhZ2VfcHJvdGVjdDY0OjE7CS8qIDAyOiAgICA2NF9rQiBwYWdlIHByb3RlY3RlZCAqLwotCSB1ODo1OwkJCS8qIDAzLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi19IGZsYWdzOwotI2VuZGlmCisvKiEgRmxhZ3MgKi8KKworI2RlZmluZSBBQ1BJX0hQRVRfUEFHRV9QUk9URUNUICAgICAgKDEpCS8qIDAwOiBObyBwYWdlIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgQUNQSV9IUEVUX1BBR0VfUFJPVEVDVF80ICAgICgxPDwxKQkvKiAwMTogNEtCIHBhZ2UgcHJvdGVjdGVkICovCisjZGVmaW5lIEFDUElfSFBFVF9QQUdFX1BST1RFQ1RfNjQgICAoMTw8MikJLyogMDI6IDY0S0IgcGFnZSBwcm90ZWN0ZWQgKi8KKworLyohIFtFbmRdIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICEqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI1NywxNDggKzM2NCwxNTkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgbXVsdGlwbGVfYXBpY190YWJsZSB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGIHUzMiBsb2NhbF9hcGljX2FkZHJlc3M7CS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgbG9jYWwgQVBJQyAqLwotCi0JLyogRmxhZ3MgKDMyIGJpdHMpICovCi0KLQl1OCBQQ0FUY29tcGF0OjE7CS8qIDAwOiAgICBTeXN0ZW0gYWxzbyBoYXMgZHVhbCA4MjU5cyAqLwotCSB1ODo3OwkJCS8qIDAxLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0JdTggcmVzZXJ2ZWQxWzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworc3RydWN0IGFjcGlfdGFibGVfbWFkdCB7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsJLyogQ29tbW9uIEFDUEkgdGFibGUgaGVhZGVyICovCisJdTMyIGFkZHJlc3M7CQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIGxvY2FsIEFQSUMgKi8KKwl1MzIgZmxhZ3M7CiB9OwogCi0vKiBWYWx1ZXMgZm9yIE1BRFQgUENBVENvbXBhdCAqLworLyogRmxhZ3MgKi8KIAotI2RlZmluZSBEVUFMX1BJQyAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIE1VTFRJUExFX0FQSUMgICAgICAgICAgIDEKKyNkZWZpbmUgQUNQSV9NQURUX1BDQVRfQ09NUEFUICAgICAgICgxKQkvKiAwMDogICAgU3lzdGVtIGFsc28gaGFzIGR1YWwgODI1OXMgKi8KIAotLyogQ29tbW9uIE1BRFQgU3ViLXRhYmxlIGhlYWRlciAqLworLyogVmFsdWVzIGZvciBQQ0FUQ29tcGF0IGZsYWcgKi8KIAotI2RlZmluZSBBUElDX0hFQURFUl9ERUYgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworI2RlZmluZSBBQ1BJX01BRFRfRFVBTF9QSUMgICAgICAgICAgMAorI2RlZmluZSBBQ1BJX01BRFRfTVVMVElQTEVfQVBJQyAgICAgMQogCi1zdHJ1Y3QgYXBpY19oZWFkZXIgewotQVBJQ19IRUFERVJfREVGfTsKKy8qIFZhbHVlcyBmb3Igc3VidGFibGUgdHlwZSBpbiBzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKi8KIAotLyogVmFsdWVzIGZvciBUeXBlIGluIHN0cnVjdCBhcGljX2hlYWRlciAqLwotCi0jZGVmaW5lIEFQSUNfUFJPQ0VTU09SICAgICAgICAgIDAKLSNkZWZpbmUgQVBJQ19JTyAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUElDX1hSVVBUX09WRVJSSURFICAgICAyCi0jZGVmaW5lIEFQSUNfTk1JICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQVBJQ19MT0NBTF9OTUkgICAgICAgICAgNAotI2RlZmluZSBBUElDX0FERFJFU1NfT1ZFUlJJREUgICA1Ci0jZGVmaW5lIEFQSUNfSU9fU0FQSUMgICAgICAgICAgIDYKLSNkZWZpbmUgQVBJQ19MT0NBTF9TQVBJQyAgICAgICAgNwotI2RlZmluZSBBUElDX1hSVVBUX1NPVVJDRSAgICAgICA4Ci0jZGVmaW5lIEFQSUNfUkVTRVJWRUQgICAgICAgICAgIDkJLyogOSBhbmQgZ3JlYXRlciBhcmUgcmVzZXJ2ZWQgKi8KLQotLyogRmxhZyBkZWZpbml0aW9ucyBmb3IgTUFEVCBzdWItdGFibGVzICovCi0KLSNkZWZpbmUgQUNQSV9NQURUX0lGTEFHUyAvKiBJTlRJIGZsYWdzICgxNiBiaXRzKSAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xhcml0eSAgICAgICAgOiAyOyAgICAvKiAwMC0wMTogUG9sYXJpdHkgb2YgQVBJQyBJL08gaW5wdXQgc2lnbmFscyAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJfbW9kZSAgICA6IDI7ICAgIC8qIDAyLTAzOiBUcmlnZ2VyIG1vZGUgb2YgQVBJQyBpbnB1dCBzaWduYWxzICovXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNDsgICAgLyogMDQtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi9cCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDE7CS8qIDA4LTE1OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0KLSNkZWZpbmUgQUNQSV9NQURUX0xGTEFHUyAvKiBMb2NhbCBTYXBpYyBmbGFncyAoMzIgYml0cykgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yX2VuYWJsZWQ6IDE7ICAgLyogMDA6ICAgIFByb2Nlc3NvciBpcyB1c2FibGUgaWYgc2V0ICovXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNzsgICAgLyogMDEtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi9cCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDJbM107CS8qIDA4LTMxOiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0KLS8qIFZhbHVlcyBmb3IgTVBTIElOVEkgZmxhZ3MgKi8KLQotI2RlZmluZSBQT0xBUklUWV9DT05GT1JNUyAgICAgICAwCi0jZGVmaW5lIFBPTEFSSVRZX0FDVElWRV9ISUdIICAgIDEKLSNkZWZpbmUgUE9MQVJJVFlfUkVTRVJWRUQgICAgICAgMgotI2RlZmluZSBQT0xBUklUWV9BQ1RJVkVfTE9XICAgICAzCi0KLSNkZWZpbmUgVFJJR0dFUl9DT05GT1JNUyAgICAgICAgMAotI2RlZmluZSBUUklHR0VSX0VER0UgICAgICAgICAgICAxCi0jZGVmaW5lIFRSSUdHRVJfUkVTRVJWRUQgICAgICAgIDIKLSNkZWZpbmUgVFJJR0dFUl9MRVZFTCAgICAgICAgICAgMworZW51bSBhY3BpX21hZHRfdHlwZSB7CisJQUNQSV9NQURUX1RZUEVfTE9DQUxfQVBJQyA9IDAsCisJQUNQSV9NQURUX1RZUEVfSU9fQVBJQyA9IDEsCisJQUNQSV9NQURUX1RZUEVfSU5URVJSVVBUX09WRVJSSURFID0gMiwKKwlBQ1BJX01BRFRfVFlQRV9OTUlfU09VUkNFID0gMywKKwlBQ1BJX01BRFRfVFlQRV9MT0NBTF9BUElDX05NSSA9IDQsCisJQUNQSV9NQURUX1RZUEVfTE9DQUxfQVBJQ19PVkVSUklERSA9IDUsCisJQUNQSV9NQURUX1RZUEVfSU9fU0FQSUMgPSA2LAorCUFDUElfTUFEVF9UWVBFX0xPQ0FMX1NBUElDID0gNywKKwlBQ1BJX01BRFRfVFlQRV9JTlRFUlJVUFRfU09VUkNFID0gOCwKKwlBQ1BJX01BRFRfVFlQRV9SRVNFUlZFRCA9IDkJLyogOSBhbmQgZ3JlYXRlciBhcmUgcmVzZXJ2ZWQgKi8KK307CiAKIC8qCi0gKiBNQURUIFN1Yi10YWJsZXMsIGNvcnJlc3BvbmQgdG8gVHlwZSBpbiBzdHJ1Y3QgYXBpY19oZWFkZXIKKyAqIE1BRFQgU3ViLXRhYmxlcywgY29ycmVzcG9uZCB0byBUeXBlIGluIHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlcgogICovCiAKLS8qIDA6IHByb2Nlc3NvciBBUElDICovCisvKiAwOiBQcm9jZXNzb3IgTG9jYWwgQVBJQyAqLwogCi1zdHJ1Y3QgbWFkdF9wcm9jZXNzb3JfYXBpYyB7Ci0JQVBJQ19IRUFERVJfREVGIHU4IHByb2Nlc3Nvcl9pZDsJLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KLQl1OCBsb2NhbF9hcGljX2lkOwkvKiBQcm9jZXNzb3IncyBsb2NhbCBBUElDIGlkICovCi0gQUNQSV9NQURUX0xGTEFHU307CitzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWMgeworCXN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciBoZWFkZXI7CisJdTggcHJvY2Vzc29yX2lkOwkvKiBBQ1BJIHByb2Nlc3NvciBpZCAqLworCXU4IGlkOwkJCS8qIFByb2Nlc3NvcidzIGxvY2FsIEFQSUMgaWQgKi8KKwl1MzIgbGFwaWNfZmxhZ3M7Cit9OwogCiAvKiAxOiBJTyBBUElDICovCiAKLXN0cnVjdCBtYWR0X2lvX2FwaWMgewotCUFQSUNfSEVBREVSX0RFRiB1OCBpb19hcGljX2lkOwkvKiBJL08gQVBJQyBJRCAqLworc3RydWN0IGFjcGlfbWFkdF9pb19hcGljIHsKKwlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgaGVhZGVyOworCXU4IGlkOwkJCS8qIEkvTyBBUElDIElEICovCiAJdTggcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwogCXUzMiBhZGRyZXNzOwkJLyogQVBJQyBwaHlzaWNhbCBhZGRyZXNzICovCi0JdTMyIGludGVycnVwdDsJCS8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0IHdoZXJlIElOVEkgbGluZXMgc3RhcnQgKi8KKwl1MzIgZ2xvYmFsX2lycV9iYXNlOwkvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCB3aGVyZSBJTlRJIGxpbmVzIHN0YXJ0ICovCiB9OwogCiAvKiAyOiBJbnRlcnJ1cHQgT3ZlcnJpZGUgKi8KIAotc3RydWN0IG1hZHRfaW50ZXJydXB0X292ZXJyaWRlIHsKLQlBUElDX0hFQURFUl9ERUYgdTggYnVzOwkvKiAwIC0gSVNBICovCi0JdTggc291cmNlOwkJLyogSW50ZXJydXB0IHNvdXJjZSAoSVJRKSAqLwotCXUzMiBpbnRlcnJ1cHQ7CQkvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCAqLwotIEFDUElfTUFEVF9JRkxBR1N9Oworc3RydWN0IGFjcGlfbWFkdF9pbnRlcnJ1cHRfb3ZlcnJpZGUgeworCXN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciBoZWFkZXI7CisJdTggYnVzOwkJCS8qIDAgLSBJU0EgKi8KKwl1OCBzb3VyY2VfaXJxOwkJLyogSW50ZXJydXB0IHNvdXJjZSAoSVJRKSAqLworCXUzMiBnbG9iYWxfaXJxOwkJLyogR2xvYmFsIHN5c3RlbSBpbnRlcnJ1cHQgKi8KKwl1MTYgaW50aV9mbGFnczsKK307CiAKLS8qIDM6IE5NSSBTb3VyY2VzICovCisvKiAzOiBOTUkgU291cmNlICovCiAKLXN0cnVjdCBtYWR0X25taV9zb3VyY2UgewotCUFQSUNfSEVBREVSX0RFRiBBQ1BJX01BRFRfSUZMQUdTIHUzMiBpbnRlcnJ1cHQ7CS8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0ICovCitzdHJ1Y3QgYWNwaV9tYWR0X25taV9zb3VyY2UgeworCXN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciBoZWFkZXI7CisJdTE2IGludGlfZmxhZ3M7CisJdTMyIGdsb2JhbF9pcnE7CQkvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCAqLwogfTsKIAogLyogNDogTG9jYWwgQVBJQyBOTUkgKi8KIAotc3RydWN0IG1hZHRfbG9jYWxfYXBpY19ubWkgewotCUFQSUNfSEVBREVSX0RFRiB1OCBwcm9jZXNzb3JfaWQ7CS8qIEFDUEkgcHJvY2Vzc29yIGlkICovCi0JQUNQSV9NQURUX0lGTEFHUyB1OCBsaW50OwkvKiBMSU5UbiB0byB3aGljaCBOTUkgaXMgY29ubmVjdGVkICovCitzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWNfbm1pIHsKKwlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgaGVhZGVyOworCXU4IHByb2Nlc3Nvcl9pZDsJLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KKwl1MTYgaW50aV9mbGFnczsKKwl1OCBsaW50OwkJLyogTElOVG4gdG8gd2hpY2ggTk1JIGlzIGNvbm5lY3RlZCAqLwogfTsKIAogLyogNTogQWRkcmVzcyBPdmVycmlkZSAqLwogCi1zdHJ1Y3QgbWFkdF9hZGRyZXNzX292ZXJyaWRlIHsKLQlBUElDX0hFQURFUl9ERUYgdTE2IHJlc2VydmVkOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCitzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX2FwaWNfb3ZlcnJpZGUgeworCXN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciBoZWFkZXI7CisJdTE2IHJlc2VydmVkOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogCXU2NCBhZGRyZXNzOwkJLyogQVBJQyBwaHlzaWNhbCBhZGRyZXNzICovCiB9OwogCiAvKiA2OiBJL08gU2FwaWMgKi8KIAotc3RydWN0IG1hZHRfaW9fc2FwaWMgewotCUFQSUNfSEVBREVSX0RFRiB1OCBpb19zYXBpY19pZDsJLyogSS9PIFNBUElDIElEICovCitzdHJ1Y3QgYWNwaV9tYWR0X2lvX3NhcGljIHsKKwlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgaGVhZGVyOworCXU4IGlkOwkJCS8qIEkvTyBTQVBJQyBJRCAqLwogCXU4IHJlc2VydmVkOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCXUzMiBpbnRlcnJ1cHRfYmFzZTsJLyogR2xvY2FsIGludGVycnVwdCBmb3IgU0FQSUMgc3RhcnQgKi8KKwl1MzIgZ2xvYmFsX2lycV9iYXNlOwkvKiBHbG9iYWwgaW50ZXJydXB0IGZvciBTQVBJQyBzdGFydCAqLwogCXU2NCBhZGRyZXNzOwkJLyogU0FQSUMgcGh5c2ljYWwgYWRkcmVzcyAqLwogfTsKIAogLyogNzogTG9jYWwgU2FwaWMgKi8KIAotc3RydWN0IG1hZHRfbG9jYWxfc2FwaWMgewotCUFQSUNfSEVBREVSX0RFRiB1OCBwcm9jZXNzb3JfaWQ7CS8qIEFDUEkgcHJvY2Vzc29yIGlkICovCi0JdTggbG9jYWxfc2FwaWNfaWQ7CS8qIFNBUElDIElEICovCi0JdTggbG9jYWxfc2FwaWNfZWlkOwkvKiBTQVBJQyBFSUQgKi8KK3N0cnVjdCBhY3BpX21hZHRfbG9jYWxfc2FwaWMgeworCXN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciBoZWFkZXI7CisJdTggcHJvY2Vzc29yX2lkOwkvKiBBQ1BJIHByb2Nlc3NvciBpZCAqLworCXU4IGlkOwkJCS8qIFNBUElDIElEICovCisJdTggZWlkOwkJCS8qIFNBUElDIEVJRCAqLwogCXU4IHJlc2VydmVkWzNdOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCSBBQ1BJX01BRFRfTEZMQUdTIHUzMiBwcm9jZXNzb3JfdUlEOwkvKiBOdW1lcmljIFVJRCAtIEFDUEkgMy4wICovCi0JY2hhciBwcm9jZXNzb3JfdUlEc3RyaW5nWzFdOwkvKiBTdHJpbmcgVUlEICAtIEFDUEkgMy4wICovCisJdTMyIGxhcGljX2ZsYWdzOworCXUzMiB1aWQ7CQkvKiBOdW1lcmljIFVJRCAtIEFDUEkgMy4wICovCisJY2hhciB1aWRfc3RyaW5nWzFdOwkvKiBTdHJpbmcgVUlEICAtIEFDUEkgMy4wICovCiB9OwogCiAvKiA4OiBQbGF0Zm9ybSBJbnRlcnJ1cHQgU291cmNlICovCiAKLXN0cnVjdCBtYWR0X2ludGVycnVwdF9zb3VyY2UgewotCUFQSUNfSEVBREVSX0RFRiBBQ1BJX01BRFRfSUZMQUdTIHU4IGludGVycnVwdF90eXBlOwkvKiAxPVBNSSwgMj1JTklULCAzPWNvcnJlY3RlZCAqLwotCXU4IHByb2Nlc3Nvcl9pZDsJLyogUHJvY2Vzc29yIElEICovCi0JdTggcHJvY2Vzc29yX2VpZDsJLyogUHJvY2Vzc29yIEVJRCAqLworc3RydWN0IGFjcGlfbWFkdF9pbnRlcnJ1cHRfc291cmNlIHsKKwlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgaGVhZGVyOworCXUxNiBpbnRpX2ZsYWdzOworCXU4IHR5cGU7CQkvKiAxPVBNSSwgMj1JTklULCAzPWNvcnJlY3RlZCAqLworCXU4IGlkOwkJCS8qIFByb2Nlc3NvciBJRCAqLworCXU4IGVpZDsJCQkvKiBQcm9jZXNzb3IgRUlEICovCiAJdTggaW9fc2FwaWNfdmVjdG9yOwkvKiBWZWN0b3IgdmFsdWUgZm9yIFBNSSBpbnRlcnJ1cHRzICovCi0JdTMyIGludGVycnVwdDsJCS8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0ICovCisJdTMyIGdsb2JhbF9pcnE7CQkvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCAqLwogCXUzMiBmbGFnczsJCS8qIEludGVycnVwdCBTb3VyY2UgRmxhZ3MgKi8KIH07CiAKLSNpZmRlZiBEVVBMSUNBVEVfREVGSU5JVElPTl9XSVRIX0xJTlVYX0FDUElfSAorLyogRmxhZ3MgZmllbGQgYWJvdmUgKi8KKworI2RlZmluZSBBQ1BJX01BRFRfQ1BFSV9PVkVSUklERSAgICAgKDEpCisKKy8qCisgKiBDb21tb24gZmxhZ3MgZmllbGRzIGZvciBNQURUIHN1YnRhYmxlcworICovCisKKy8qIE1BRFQgTG9jYWwgQVBJQyBmbGFncyAobGFwaWNfZmxhZ3MpICovCisKKyNkZWZpbmUgQUNQSV9NQURUX0VOQUJMRUQgICAgICAgICAgICgxKQkvKiAwMDogUHJvY2Vzc29yIGlzIHVzYWJsZSBpZiBzZXQgKi8KKworLyogTUFEVCBNUFMgSU5USSBmbGFncyAoaW50aV9mbGFncykgKi8KKworI2RlZmluZSBBQ1BJX01BRFRfUE9MQVJJVFlfTUFTSyAgICAgKDMpCS8qIDAwLTAxOiBQb2xhcml0eSBvZiBBUElDIEkvTyBpbnB1dCBzaWduYWxzICovCisjZGVmaW5lIEFDUElfTUFEVF9UUklHR0VSX01BU0sgICAgICAoMzw8MikJLyogMDItMDM6IFRyaWdnZXIgbW9kZSBvZiBBUElDIGlucHV0IHNpZ25hbHMgKi8KKworLyogVmFsdWVzIGZvciBNUFMgSU5USSBmbGFncyAqLworCisjZGVmaW5lIEFDUElfTUFEVF9QT0xBUklUWV9DT05GT1JNUyAgICAgICAwCisjZGVmaW5lIEFDUElfTUFEVF9QT0xBUklUWV9BQ1RJVkVfSElHSCAgICAxCisjZGVmaW5lIEFDUElfTUFEVF9QT0xBUklUWV9SRVNFUlZFRCAgICAgICAyCisjZGVmaW5lIEFDUElfTUFEVF9QT0xBUklUWV9BQ1RJVkVfTE9XICAgICAzCisKKyNkZWZpbmUgQUNQSV9NQURUX1RSSUdHRVJfQ09ORk9STVMgICAgICAgICgwKQorI2RlZmluZSBBQ1BJX01BRFRfVFJJR0dFUl9FREdFICAgICAgICAgICAgKDE8PDIpCisjZGVmaW5lIEFDUElfTUFEVF9UUklHR0VSX1JFU0VSVkVEICAgICAgICAoMjw8MikKKyNkZWZpbmUgQUNQSV9NQURUX1RSSUdHRVJfTEVWRUwgICAgICAgICAgICgzPDwyKQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIE1DRkcgLSBQQ0kgTWVtb3J5IE1hcHBlZCBDb25maWd1cmF0aW9uIHRhYmxlIGFuZCBzdWItdGFibGUKQEAgLTQwNiwxNyArNTI0LDE5IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnIHsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTggcmVzZXJ2ZWRbOF07CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsJLyogQ29tbW9uIEFDUEkgdGFibGUgaGVhZGVyICovCisJdTggcmVzZXJ2ZWRbOF07CiB9OwogCisvKiBTdWJ0YWJsZSAqLworCiBzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24gewotCXU2NCBiYXNlX2FkZHJlc3M7CS8qIEJhc2UgYWRkcmVzcywgcHJvY2Vzc29yLXJlbGF0aXZlICovCisJdTY0IGFkZHJlc3M7CQkvKiBCYXNlIGFkZHJlc3MsIHByb2Nlc3Nvci1yZWxhdGl2ZSAqLwogCXUxNiBwY2lfc2VnbWVudDsJLyogUENJIHNlZ21lbnQgZ3JvdXAgbnVtYmVyICovCiAJdTggc3RhcnRfYnVzX251bWJlcjsJLyogU3RhcnRpbmcgUENJIEJ1cyBudW1iZXIgKi8KIAl1OCBlbmRfYnVzX251bWJlcjsJLyogRmluYWwgUENJIEJ1cyBudW1iZXIgKi8KIAl1MzIgcmVzZXJ2ZWQ7CiB9OwotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDI0LDggKzU0NCw5IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IHNtYXJ0X2JhdHRlcnlfdGFibGUgewotCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1MzIgd2FybmluZ19sZXZlbDsKK3N0cnVjdCBhY3BpX3RhYmxlX3Nic3QgeworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIENvbW1vbiBBQ1BJIHRhYmxlIGhlYWRlciAqLworCXUzMiB3YXJuaW5nX2xldmVsOwogCXUzMiBsb3dfbGV2ZWw7CiAJdTMyIGNyaXRpY2FsX2xldmVsOwogfTsKQEAgLTQzNiw5ICs1NTcsMTAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3Qgc3lzdGVtX2xvY2FsaXR5X2luZm8gewotCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1NjQgbG9jYWxpdHlfY291bnQ7Ci0JdTggZW50cnlbMV1bMV07CitzdHJ1Y3QgYWNwaV90YWJsZV9zbGl0IHsKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiBDb21tb24gQUNQSSB0YWJsZSBoZWFkZXIgKi8KKwl1NjQgbG9jYWxpdHlfY291bnQ7CisJdTggZW50cnlbMV07CQkvKiBSZWFsIHNpemUgPSBsb2NhbGl0aWVzXjIgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NDgsNyArNTcwLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0cnVjdCBhY3BpX3RhYmxlX3NwY3IgewotCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1OCBpbnRlcmZhY2VfdHlwZTsJLyogMD1mdWxsIDE2NTUwLCAxPXN1YnNldCBvZiAxNjU1MCAqLworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIENvbW1vbiBBQ1BJIHRhYmxlIGhlYWRlciAqLworCXU4IGludGVyZmFjZV90eXBlOwkvKiAwPWZ1bGwgMTY1NTAsIDE9c3Vic2V0IG9mIDE2NTUwICovCiAJdTggcmVzZXJ2ZWRbM107CiAJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHNlcmlhbF9wb3J0OwogCXU4IGludGVycnVwdF90eXBlOwpAQCAtNDU5LDcgKzU4Miw3IEBACiAJdTggc3RvcF9iaXRzOwogCXU4IGZsb3dfY29udHJvbDsKIAl1OCB0ZXJtaW5hbF90eXBlOwotCXU4IHJlc2VydmVkMjsKKwl1OCByZXNlcnZlZDE7CiAJdTE2IHBjaV9kZXZpY2VfaWQ7CiAJdTE2IHBjaV92ZW5kb3JfaWQ7CiAJdTggcGNpX2J1czsKQEAgLTQ2Nyw3ICs1OTAsNyBAQAogCXU4IHBjaV9mdW5jdGlvbjsKIAl1MzIgcGNpX2ZsYWdzOwogCXU4IHBjaV9zZWdtZW50OwotCXUzMiByZXNlcnZlZDM7CisJdTMyIHJlc2VydmVkMjsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NzcsMTIgKzYwMCwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IGFjcGlfdGFibGVfc3BtaSB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGIHU4IHJlc2VydmVkOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIENvbW1vbiBBQ1BJIHRhYmxlIGhlYWRlciAqLworCXU4IHJlc2VydmVkOwogCXU4IGludGVyZmFjZV90eXBlOwogCXUxNiBzcGVjX3JldmlzaW9uOwkvKiBWZXJzaW9uIG9mIElQTUkgKi8KIAl1OCBpbnRlcnJ1cHRfdHlwZTsKIAl1OCBncGVfbnVtYmVyOwkJLyogR1BFIGFzc2lnbmVkICovCi0JdTggcmVzZXJ2ZWQyOworCXU4IHJlc2VydmVkMTsKIAl1OCBwY2lfZGV2aWNlX2ZsYWc7CiAJdTMyIGludGVycnVwdDsKIAlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgaXBtaV9yZWdpc3RlcjsKQEAgLTQ5OCw1OCArNjIyLDUzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IHN5c3RlbV9yZXNvdXJjZV9hZmZpbml0eSB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGIHUzMiByZXNlcnZlZDE7CS8qIE11c3QgYmUgdmFsdWUgJzEnICovCi0JdTY0IHJlc2VydmVkMjsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KK3N0cnVjdCBhY3BpX3RhYmxlX3NyYXQgeworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIENvbW1vbiBBQ1BJIHRhYmxlIGhlYWRlciAqLworCXUzMiB0YWJsZV9yZXZpc2lvbjsJLyogTXVzdCBiZSB2YWx1ZSAnMScgKi8KKwl1NjQgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiB9OwogCi0vKiBTUkFUIGNvbW1vbiBzdWItdGFibGUgaGVhZGVyICovCisvKiBWYWx1ZXMgZm9yIHN1YnRhYmxlIHR5cGUgaW4gc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICovCiAKLSNkZWZpbmUgU1JBVF9TVUJUQUJMRV9IRUFERVIgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCi0vKiBWYWx1ZXMgZm9yIFR5cGUgYWJvdmUgKi8KLQotI2RlZmluZSBTUkFUX0NQVV9BRkZJTklUWSAgICAgICAwCi0jZGVmaW5lIFNSQVRfTUVNT1JZX0FGRklOSVRZICAgIDEKLSNkZWZpbmUgU1JBVF9SRVNFUlZFRCAgICAgICAgICAgMgorZW51bSBhY3BpX3NyYXRfdHlwZSB7CisJQUNQSV9TUkFUX1RZUEVfQ1BVX0FGRklOSVRZID0gMCwKKwlBQ1BJX1NSQVRfVFlQRV9NRU1PUllfQUZGSU5JVFkgPSAxLAorCUFDUElfU1JBVF9UWVBFX1JFU0VSVkVEID0gMgorfTsKIAogLyogU1JBVCBzdWItdGFibGVzICovCiAKLXN0cnVjdCBzdGF0aWNfcmVzb3VyY2VfYWxsb2MgewotCVNSQVRfU1VCVEFCTEVfSEVBREVSIHU4IHByb3hpbWl0eV9kb21haW5fbG87CitzdHJ1Y3QgYWNwaV9zcmF0X2NwdV9hZmZpbml0eSB7CisJc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyIGhlYWRlcjsKKwl1OCBwcm94aW1pdHlfZG9tYWluX2xvOwogCXU4IGFwaWNfaWQ7Ci0KLQkvKiBGbGFncyAoMzIgYml0cykgKi8KLQotCXU4IGVuYWJsZWQ6MTsJCS8qIDAwOiAgICBVc2UgYWZmaW5pdHkgc3RydWN0dXJlICovCi0JIHU4Ojc7CQkJLyogMDEtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KLQl1OCByZXNlcnZlZDNbM107CS8qIDA4LTMxOiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0KKwl1MzIgZmxhZ3M7CiAJdTggbG9jYWxfc2FwaWNfZWlkOwogCXU4IHByb3hpbWl0eV9kb21haW5faGlbM107Ci0JdTMyIHJlc2VydmVkNDsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1MzIgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiB9OwogCi1zdHJ1Y3QgbWVtb3J5X2FmZmluaXR5IHsKLQlTUkFUX1NVQlRBQkxFX0hFQURFUiB1MzIgcHJveGltaXR5X2RvbWFpbjsKLQl1MTYgcmVzZXJ2ZWQzOworLyogRmxhZ3MgKi8KKworI2RlZmluZSBBQ1BJX1NSQVRfQ1BVX0VOQUJMRUQgICAgICAgKDEpCS8qIDAwOiBVc2UgYWZmaW5pdHkgc3RydWN0dXJlICovCisKK3N0cnVjdCBhY3BpX3NyYXRfbWVtX2FmZmluaXR5IHsKKwlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgaGVhZGVyOworCXUzMiBwcm94aW1pdHlfZG9tYWluOworCXUxNiByZXNlcnZlZDsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KIAl1NjQgYmFzZV9hZGRyZXNzOwotCXU2NCBhZGRyZXNzX2xlbmd0aDsKLQl1MzIgcmVzZXJ2ZWQ0OwotCi0JLyogRmxhZ3MgKDMyIGJpdHMpICovCi0KLQl1OCBlbmFibGVkOjE7CQkvKiAwMDogICAgVXNlIGFmZmluaXR5IHN0cnVjdHVyZSAqLwotCXU4IGhvdF9wbHVnZ2FibGU6MTsJLyogMDE6ICAgIE1lbW9yeSByZWdpb24gaXMgaG90IHBsdWdnYWJsZSAqLwotCXU4IG5vbl92b2xhdGlsZToxOwkvKiAwMjogICAgTWVtb3J5IGlzIG5vbi12b2xhdGlsZSAqLwotCSB1ODo1OwkJCS8qIDAzLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0JdTggcmVzZXJ2ZWQ1WzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCi0JdTY0IHJlc2VydmVkNjsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1NjQgbGVuZ3RoOworCXUzMiBtZW1vcnlfdHlwZTsJLyogU2VlIGFjcGlfYWRkcmVzc19yYW5nZV9pZCAqLworCXUzMiBmbGFnczsKKwl1NjQgcmVzZXJ2ZWQxOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogfTsKIAorLyogRmxhZ3MgKi8KKworI2RlZmluZSBBQ1BJX1NSQVRfTUVNX0VOQUJMRUQgICAgICAgKDEpCS8qIDAwOiBVc2UgYWZmaW5pdHkgc3RydWN0dXJlICovCisjZGVmaW5lIEFDUElfU1JBVF9NRU1fSE9UX1BMVUdHQUJMRSAoMTw8MSkJLyogMDE6IE1lbW9yeSByZWdpb24gaXMgaG90IHBsdWdnYWJsZSAqLworI2RlZmluZSBBQ1BJX1NSQVRfTUVNX05PTl9WT0xBVElMRSAgKDE8PDIpCS8qIDAyOiBNZW1vcnkgcmVnaW9uIGlzIG5vbi12b2xhdGlsZSAqLworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFRDUEEgLSBUcnVzdGVkIENvbXB1dGluZyBQbGF0Zm9ybSBBbGxpYW5jZSB0YWJsZQpAQCAtNTU3LDcgKzY3Niw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdHJ1Y3QgYWNwaV90YWJsZV90Y3BhIHsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTE2IHJlc2VydmVkOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIENvbW1vbiBBQ1BJIHRhYmxlIGhlYWRlciAqLworCXUxNiByZXNlcnZlZDsKIAl1MzIgbWF4X2xvZ19sZW5ndGg7CS8qIE1heGltdW0gbGVuZ3RoIGZvciB0aGUgZXZlbnQgbG9nIGFyZWEgKi8KIAl1NjQgbG9nX2FkZHJlc3M7CS8qIEFkZHJlc3Mgb2YgdGhlIGV2ZW50IGxvZyBhcmVhICovCiB9OwpAQCAtNTY5LDcgKzY4OSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdHJ1Y3QgYWNwaV90YWJsZV93ZHJ0IHsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTMyIGhlYWRlcl9sZW5ndGg7CS8qIFdhdGNoZG9nIEhlYWRlciBMZW5ndGggKi8KKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiBDb21tb24gQUNQSSB0YWJsZSBoZWFkZXIgKi8KKwl1MzIgaGVhZGVyX2xlbmd0aDsJLyogV2F0Y2hkb2cgSGVhZGVyIExlbmd0aCAqLwogCXU4IHBjaV9zZWdtZW50OwkJLyogUENJIFNlZ21lbnQgbnVtYmVyICovCiAJdTggcGNpX2J1czsJCS8qIFBDSSBCdXMgbnVtYmVyICovCiAJdTggcGNpX2RldmljZTsJCS8qIFBDSSBEZXZpY2UgbnVtYmVyICovCkBAIC01ODIsNTggKzcwMyw5IEBACiAJdTMyIGVudHJpZXM7CQkvKiBOdW1iZXIgb2Ygd2F0Y2hkb2cgZW50cmllcyB0aGF0IGZvbGxvdyAqLwogfTsKIAotI2lmIDAJCQkJLyogRmxhZ3MsIHdpbGwgYmUgY29udmVydGVkIHRvIG1hY3JvcyAqLwotdTggZW5hYmxlZDoxOwkJCS8qIDAwOiAgICBUaW1lciBlbmFibGVkICovCi11ODo2OwkJCQkvKiAwMS0wNjogUmVzZXJ2ZWQgKi8KLXU4IHNsZWVwX3N0b3A6MTsJCS8qIDA3OiAgICBUaW1lciBzdG9wcGVkIGluIHNsZWVwIHN0YXRlICovCi0jZW5kaWYKKy8qIEZsYWdzICovCiAKLS8qIE1hY3JvcyB1c2VkIHRvIGdlbmVyYXRlIG9mZnNldHMgdG8gc3BlY2lmaWMgdGFibGUgZmllbGRzICovCi0KLSNkZWZpbmUgQUNQSV9BU0YwX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9hc2ZfaW5mbyxmKQotI2RlZmluZSBBQ1BJX0FTRjFfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX2FzZl9hbGVydCxmKQotI2RlZmluZSBBQ1BJX0FTRjJfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX2FzZl9yZW1vdGUsZikKLSNkZWZpbmUgQUNQSV9BU0YzX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9hc2Zfcm1jcCxmKQotI2RlZmluZSBBQ1BJX0FTRjRfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX2FzZl9hZGRyZXNzLGYpCi0jZGVmaW5lIEFDUElfQk9PVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGFjcGlfdGFibGVfYm9vdCxmKQotI2RlZmluZSBBQ1BJX0NQRVBfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX3RhYmxlX2NwZXAsZikKLSNkZWZpbmUgQUNQSV9DUEVQMF9PRkZTRVQoZikgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9jcGVwX3BvbGxpbmcsZikKLSNkZWZpbmUgQUNQSV9EQkdQX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV90YWJsZV9kYmdwLGYpCi0jZGVmaW5lIEFDUElfRUNEVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGVjX2Jvb3RfcmVzb3VyY2VzLGYpCi0jZGVmaW5lIEFDUElfSFBFVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGhwZXRfdGFibGUsZikKLSNkZWZpbmUgQUNQSV9NQURUX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgbXVsdGlwbGVfYXBpY190YWJsZSxmKQotI2RlZmluZSBBQ1BJX01BRFQwX09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBtYWR0X3Byb2Nlc3Nvcl9hcGljLGYpCi0jZGVmaW5lIEFDUElfTUFEVDFfT0ZGU0VUKGYpICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IG1hZHRfaW9fYXBpYyxmKQotI2RlZmluZSBBQ1BJX01BRFQyX09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBtYWR0X2ludGVycnVwdF9vdmVycmlkZSxmKQotI2RlZmluZSBBQ1BJX01BRFQzX09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBtYWR0X25taV9zb3VyY2UsZikKLSNkZWZpbmUgQUNQSV9NQURUNF9PRkZTRVQoZikgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgbWFkdF9sb2NhbF9hcGljX25taSxmKQotI2RlZmluZSBBQ1BJX01BRFQ1X09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBtYWR0X2FkZHJlc3Nfb3ZlcnJpZGUsZikKLSNkZWZpbmUgQUNQSV9NQURUNl9PRkZTRVQoZikgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgbWFkdF9pb19zYXBpYyxmKQotI2RlZmluZSBBQ1BJX01BRFQ3X09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBtYWR0X2xvY2FsX3NhcGljLGYpCi0jZGVmaW5lIEFDUElfTUFEVDhfT0ZGU0VUKGYpICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IG1hZHRfaW50ZXJydXB0X3NvdXJjZSxmKQotI2RlZmluZSBBQ1BJX01BRFRIX09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhcGljX2hlYWRlcixmKQotI2RlZmluZSBBQ1BJX01DRkdfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX3RhYmxlX21jZmcsZikKLSNkZWZpbmUgQUNQSV9NQ0ZHMF9PRkZTRVQoZikgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24sZikKLSNkZWZpbmUgQUNQSV9TQlNUX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3Qgc21hcnRfYmF0dGVyeV90YWJsZSxmKQotI2RlZmluZSBBQ1BJX1NMSVRfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBzeXN0ZW1fbG9jYWxpdHlfaW5mbyxmKQotI2RlZmluZSBBQ1BJX1NQQ1JfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX3RhYmxlX3NwY3IsZikKLSNkZWZpbmUgQUNQSV9TUE1JX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV90YWJsZV9zcG1pLGYpCi0jZGVmaW5lIEFDUElfU1JBVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IHN5c3RlbV9yZXNvdXJjZV9hZmZpbml0eSxmKQotI2RlZmluZSBBQ1BJX1NSQVQwX09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBzdGF0aWNfcmVzb3VyY2VfYWxsb2MsZikKLSNkZWZpbmUgQUNQSV9TUkFUMV9PRkZTRVQoZikgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgbWVtb3J5X2FmZmluaXR5LGYpCi0jZGVmaW5lIEFDUElfVENQQV9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGFjcGlfdGFibGVfdGNwYSxmKQotI2RlZmluZSBBQ1BJX1dEUlRfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX3RhYmxlX3dkcnQsZikKLQotI2RlZmluZSBBQ1BJX0hQRVRfRkxBR19PRkZTRVQoZixvKSAgICAgIEFDUElfRkxBR19PRkZTRVQgKHN0cnVjdCBocGV0X3RhYmxlLGYsbykKLSNkZWZpbmUgQUNQSV9TUkFUMF9GTEFHX09GRlNFVChmLG8pICAgICBBQ1BJX0ZMQUdfT0ZGU0VUIChzdHJ1Y3Qgc3RhdGljX3Jlc291cmNlX2FsbG9jLGYsbykKLSNkZWZpbmUgQUNQSV9TUkFUMV9GTEFHX09GRlNFVChmLG8pICAgICBBQ1BJX0ZMQUdfT0ZGU0VUIChzdHJ1Y3QgbWVtb3J5X2FmZmluaXR5LGYsbykKLSNkZWZpbmUgQUNQSV9NQURUX0ZMQUdfT0ZGU0VUKGYsbykgICAgICBBQ1BJX0ZMQUdfT0ZGU0VUIChzdHJ1Y3QgbXVsdGlwbGVfYXBpY190YWJsZSxmLG8pCi0jZGVmaW5lIEFDUElfTUFEVDBfRkxBR19PRkZTRVQoZixvKSAgICAgQUNQSV9GTEFHX09GRlNFVCAoc3RydWN0IG1hZHRfcHJvY2Vzc29yX2FwaWMsZixvKQotI2RlZmluZSBBQ1BJX01BRFQyX0ZMQUdfT0ZGU0VUKGYsbykgICAgIEFDUElfRkxBR19PRkZTRVQgKHN0cnVjdCBtYWR0X2ludGVycnVwdF9vdmVycmlkZSxmLG8pCi0jZGVmaW5lIEFDUElfTUFEVDNfRkxBR19PRkZTRVQoZixvKSAgICAgQUNQSV9GTEFHX09GRlNFVCAoc3RydWN0IG1hZHRfbm1pX3NvdXJjZSxmLG8pCi0jZGVmaW5lIEFDUElfTUFEVDRfRkxBR19PRkZTRVQoZixvKSAgICAgQUNQSV9GTEFHX09GRlNFVCAoc3RydWN0IG1hZHRfbG9jYWxfYXBpY19ubWksZixvKQotI2RlZmluZSBBQ1BJX01BRFQ3X0ZMQUdfT0ZGU0VUKGYsbykgICAgIEFDUElfRkxBR19PRkZTRVQgKHN0cnVjdCBtYWR0X2xvY2FsX3NhcGljLGYsbykKLSNkZWZpbmUgQUNQSV9NQURUOF9GTEFHX09GRlNFVChmLG8pICAgICBBQ1BJX0ZMQUdfT0ZGU0VUIChzdHJ1Y3QgbWFkdF9pbnRlcnJ1cHRfc291cmNlLGYsbykKKyNkZWZpbmUgQUNQSV9XRFJUX1RJTUVSX0VOQUJMRUQgICAgICgxKQkvKiAwMDogVGltZXIgZW5hYmxlZCAqLwogCiAvKiBSZXNldCB0byBkZWZhdWx0IHBhY2tpbmcgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsMi5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2VmZTZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBOYW1lOiBhY3RibDIuaCAtIEFDUEkgU3BlY2lmaWNhdGlvbiBSZXZpc2lvbiAyLjAgVGFibGVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaWZuZGVmIF9fQUNUQkwyX0hfXwotI2RlZmluZSBfX0FDVEJMMl9IX18KLQotLyogQ29kZSBtb3ZlZCB0byBib3RoIGFjdGJsLmggYW5kIGFjdGJsMS5oICovCi0KLSNlbmRpZgkJCQkvKiBfX0FDVEJMMl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibDcxLmggYi9pbmNsdWRlL2FjcGkvYWN0Ymw3MS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGFjMDViLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibDcxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE5hbWU6IGFjdGJsNzEuaCAtIElBLTY0IEV4dGVuc2lvbnMgdG8gdGhlIEFDUEkgU3BlYyBSZXYuIDAuNzEKLSAqICAgICAgICAgICAgICAgICAgIFRoaXMgZmlsZSBpbmNsdWRlcyB0YWJsZXMgc3BlY2lmaWMgdG8gdGhpcwotICogICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiByZXZpc2lvbi4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwMywgUi4gQnlyb24gTW9vcmUKLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaWZuZGVmIF9fQUNUQkw3MV9IX18KLSNkZWZpbmUgX19BQ1RCTDcxX0hfXwotCi0vKiAwLjcxIEZBRFQgYWRkcmVzc19zcGFjZSBkYXRhIGl0ZW0gYml0bWFza3MgZGVmaW5lcyAqLwotLyogSWYgdGhlIGFzc29jaWF0ZWQgYml0IGlzIHplcm8gdGhlbiBpdCBpcyBpbiBtZW1vcnkgc3BhY2UgZWxzZSBpbiBpbyBzcGFjZSAqLwotCi0jZGVmaW5lIFNNSV9DTURfQUREUkVTU19TUEFDRSAgICAgICAweDAxCi0jZGVmaW5lIFBNMV9CTEtfQUREUkVTU19TUEFDRSAgICAgICAweDAyCi0jZGVmaW5lIFBNMl9DTlRfQkxLX0FERFJFU1NfU1BBQ0UgICAweDA0Ci0jZGVmaW5lIFBNX1RNUl9CTEtfQUREUkVTU19TUEFDRSAgICAweDA4Ci0jZGVmaW5lIEdQRTBfQkxLX0FERFJFU1NfU1BBQ0UgICAgICAweDEwCi0jZGVmaW5lIEdQRTFfQkxLX0FERFJFU1NfU1BBQ0UgICAgICAweDIwCi0KLS8qIE9ubHkgZm9yIGNsYXJpdHkgaW4gZGVjbGFyYXRpb25zICovCi0KLXR5cGVkZWYgdTY0IElPX0FERFJFU1M7Ci0KLSNwcmFnbWEgcGFjaygxKQotc3RydWN0IHsJCQkvKiBSb290IFN5c3RlbSBEZXNjcmlwdG9yIFBvaW50ZXIgKi8KLQlOQVRJVkVfQ0hBUiBzaWduYXR1cmVbOF07CS8qIGNvbnRhaW5zICJSU0QgUFRSICIgKi8KLQl1OCBjaGVja3N1bTsJCS8qIHRvIG1ha2Ugc3VtIG9mIHN0cnVjdCA9PSAwICovCi0JTkFUSVZFX0NIQVIgb2VtX2lkWzZdOwkvKiBPRU0gaWRlbnRpZmljYXRpb24gKi8KLQl1OCByZXNlcnZlZDsJCS8qIE11c3QgYmUgMCBmb3IgMS4wLCAyIGZvciAyLjAgKi8KLQl1NjQgcnNkdF9waHlzaWNhbF9hZGRyZXNzOwkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBSU0RUICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBJQTY0IEV4dGVuc2lvbnMgdG8gQUNQSSBTcGVjIFJldiAwLjcxICovCi0vKiBmb3IgdGhlIFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIFRhYmxlIGhlYWRlciAqLwotCXUzMiByZXNlcnZlZF9wYWQ7CS8qIElBNjQgYWxpZ25tZW50LCBtdXN0IGJlIDAgKi8KLQl1NjQgdGFibGVfb2Zmc2V0X2VudHJ5WzFdOwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBvdGhlciAqLwotCS8qIHRhYmxlcycgaGVhZGVycyAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBJQTY0IEV4dGVuc2lvbnMgdG8gQUNQSSBTcGVjIFJldiAwLjcxICAgKi8KLS8qIGZvciB0aGUgRmlybXdhcmUgQUNQSSBDb250cm9sIFN0cnVjdHVyZSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgewotCU5BVElWRV9DSEFSIHNpZ25hdHVyZVs0XTsJLyogc2lnbmF0dXJlICJGQUNTIiAqLwotCXUzMiBsZW5ndGg7CQkvKiBsZW5ndGggb2Ygc3RydWN0dXJlLCBpbiBieXRlcyAqLwotCXUzMiBoYXJkd2FyZV9zaWduYXR1cmU7CS8qIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gc2lnbmF0dXJlICovCi0JdTMyIHJlc2VydmVkNDsJCS8qIG11c3QgYmUgMCAqLwotCXU2NCBmaXJtd2FyZV93YWtpbmdfdmVjdG9yOwkvKiBBQ1BJIE9TIHdha2luZyB2ZWN0b3IgKi8KLQl1NjQgZ2xvYmFsX2xvY2s7CS8qIEdsb2JhbCBMb2NrICovCi0JdTMyIFM0Ymlvc19mOjE7CQkvKiBJbmRpY2F0ZXMgaWYgUzRCSU9TIHN1cHBvcnQgaXMgcHJlc2VudCAqLwotCXUzMiByZXNlcnZlZDE6MzE7CS8qIG11c3QgYmUgMCAqLwotCXU4IHJlc2VydmVkM1syOF07CS8qIHJlc2VydmVkIC0gbXVzdCBiZSB6ZXJvICovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogSUE2NCBFeHRlbnNpb25zIHRvIEFDUEkgU3BlYyBSZXYgMC43MSAgKi8KLS8qIGZvciB0aGUgRml4ZWQgQUNQSSBEZXNjcmlwdGlvbiBUYWJsZSAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwkvKiB0YWJsZSBoZWFkZXIgKi8KLQl1MzIgcmVzZXJ2ZWRfcGFkOwkvKiBJQTY0IGFsaWdubWVudCwgbXVzdCBiZSAwICovCi0JdTY0IGZpcm13YXJlX2N0cmw7CS8qIDY0LWJpdCBQaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8KLQl1NjQgZHNkdDsJCS8qIDY0LWJpdCBQaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KLQl1OCBtb2RlbDsJCS8qIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgKi8KLQl1OCBhZGRyZXNzX3NwYWNlOwkvKiBBZGRyZXNzIFNwYWNlIEJpdG1hc2sgKi8KLQl1MTYgc2NpX2ludDsJCS8qIFN5c3RlbSB2ZWN0b3Igb2YgU0NJIGludGVycnVwdCAqLwotCXU4IGFjcGlfZW5hYmxlOwkJLyogdmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBlbmFibGUgQUNQSSAqLwotCXU4IGFjcGlfZGlzYWJsZTsJLyogdmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBkaXNhYmxlIEFDUEkgKi8KLQl1OCBTNGJpb3NfcmVxOwkJLyogVmFsdWUgdG8gd3JpdGUgdG8gU01JIENNRCB0byBlbnRlciBTNEJJT1Mgc3RhdGUgKi8KLQl1OCByZXNlcnZlZDI7CQkvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotCXU2NCBzbWlfY21kOwkJLyogUG9ydCBhZGRyZXNzIG9mIFNNSSBjb21tYW5kIHBvcnQgKi8KLQl1NjQgcG0xYV9ldnRfYmxrOwkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIGFjcGlfZXZlbnQgUmVnIEJsayAqLwotCXU2NCBwbTFiX2V2dF9ibGs7CS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgYWNwaV9ldmVudCBSZWcgQmxrICovCi0JdTY0IHBtMWFfY250X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBDb250cm9sIFJlZyBCbGsgKi8KLQl1NjQgcG0xYl9jbnRfYmxrOwkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayAqLwotCXU2NCBwbTJfY250X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayAqLwotCXU2NCBwbV90bXJfYmxrOwkJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgKi8KLQl1NjQgZ3BlMF9ibGs7CQkvKiBQb3J0IGFkZHIgb2YgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMCBSZWcgQmxrICovCi0JdTY0IGdwZTFfYmxrOwkJLyogUG9ydCBhZGRyIG9mIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDEgUmVnIEJsayAqLwotCXU4IHBtMV9ldnRfbGVuOwkJLyogQnl0ZSBsZW5ndGggb2YgcG9ydHMgYXQgcG0xX3hfZXZ0X2JsayAqLwotCXU4IHBtMV9jbnRfbGVuOwkJLyogQnl0ZSBsZW5ndGggb2YgcG9ydHMgYXQgcG0xX3hfY250X2JsayAqLwotCXU4IHBtMl9jbnRfbGVuOwkJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0yX2NudF9ibGsgKi8KLQl1OCBwbV90bV9sZW47CQkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbV90bV9ibGsgKi8KLQl1OCBncGUwX2Jsa19sZW47CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTBfYmxrICovCi0JdTggZ3BlMV9ibGtfbGVuOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUxX2JsayAqLwotCXU4IGdwZTFfYmFzZTsJCS8qIG9mZnNldCBpbiBncGUgbW9kZWwgd2hlcmUgZ3BlMSBldmVudHMgc3RhcnQgKi8KLQl1OCByZXNlcnZlZDM7CQkvKiByZXNlcnZlZCAqLwotCXUxNiBwbHZsMl9sYXQ7CQkvKiB3b3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMiBzdGF0ZSAqLwotCXUxNiBwbHZsM19sYXQ7CQkvKiB3b3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMyBzdGF0ZSAqLwotCXU4IGRheV9hbHJtOwkJLyogaW5kZXggdG8gZGF5LW9mLW1vbnRoIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLwotCXU4IG1vbl9hbHJtOwkJLyogaW5kZXggdG8gbW9udGgtb2YteWVhciBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KLQl1OCBjZW50dXJ5OwkJLyogaW5kZXggdG8gY2VudHVyeSBpbiBSVEMgQ01PUyBSQU0gKi8KLQl1OCByZXNlcnZlZDQ7CQkvKiByZXNlcnZlZCAqLwotCXUzMiBmbHVzaF9jYXNoOjE7CS8qIFBBTF9GTFVTSF9DQUNIRSBpcyBjb3JyZWN0bHkgc3VwcG9ydGVkICovCi0JdTMyIHJlc2VydmVkNToxOwkvKiByZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotCXUzMiBwcm9jX2MxOjE7CQkvKiBhbGwgcHJvY2Vzc29ycyBzdXBwb3J0IEMxIHN0YXRlICovCi0JdTMyIHBsdmwyX3VwOjE7CQkvKiBDMiBzdGF0ZSB3b3JrcyBvbiBNUCBzeXN0ZW0gKi8KLQl1MzIgcHdyX2J1dHRvbjoxOwkvKiBQb3dlciBidXR0b24gaXMgaGFuZGxlZCBhcyBhIGdlbmVyaWMgZmVhdHVyZSAqLwotCXUzMiBzbGVlcF9idXR0b246MTsJLyogU2xlZXAgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUsIG9yIG5vdCBwcmVzZW50ICovCi0JdTMyIGZpeGVkX3JUQzoxOwkvKiBSVEMgd2FrZXVwIHN0YXQgbm90IGluIGZpeGVkIHJlZ2lzdGVyIHNwYWNlICovCi0JdTMyIHJ0Y3M0OjE7CQkvKiBSVEMgd2FrZXVwIHN0YXQgbm90IHBvc3NpYmxlIGZyb20gUzQgKi8KLQl1MzIgdG1yX3ZhbF9leHQ6MTsJLyogdG1yX3ZhbCBpcyAzMiBiaXRzICovCi0JdTMyIGRvY2tfY2FwOjE7CQkvKiBTdXBwb3J0cyBEb2NraW5nICovCi0JdTMyIHJlc2VydmVkNjoyMjsJLyogcmVzZXJ2ZWQgLSBtdXN0IGJlIHplcm8gKi8KLX07Ci0KLSNwcmFnbWEgcGFjaygpCi0KLSNlbmRpZgkJCQkvKiBfX0FDVEJMNzFfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAppbmRleCA2NGI2MDNjZi4uNzJhNmUyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtNDgsNyArNDgsOCBAQAogCiAvKgogICogQUNQSV9NQUNISU5FX1dJRFRIIG11c3QgYmUgc3BlY2lmaWVkIGluIGFuIE9TLSBvciBjb21waWxlci1kZXBlbmRlbnQgaGVhZGVyCi0gKiBhbmQgbXVzdCBiZSBlaXRoZXIgMTYsIDMyLCBvciA2NAorICogYW5kIG11c3QgYmUgZWl0aGVyIDMyIG9yIDY0LiAxNi1iaXQgQUNQSUNBIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQsIGFzIG9mCisgKiAxMi8yMDA2LgogICovCiAjaWZuZGVmIEFDUElfTUFDSElORV9XSURUSAogI2Vycm9yIEFDUElfTUFDSElORV9XSURUSCBub3QgZGVmaW5lZApAQCAtMTQ5LDcgKzE1MCw2IEBACiB0eXBlZGVmIHU2NCBhY3BpX25hdGl2ZV91aW50OwogdHlwZWRlZiBzNjQgYWNwaV9uYXRpdmVfaW50OwogCi10eXBlZGVmIHU2NCBhY3BpX3RhYmxlX3B0cjsKIHR5cGVkZWYgdTY0IGFjcGlfaW9fYWRkcmVzczsKIHR5cGVkZWYgdTY0IGFjcGlfcGh5c2ljYWxfYWRkcmVzczsKIApAQCAtMTg5LDQ4ICsxODksMTUgQEAKIHR5cGVkZWYgdTMyIGFjcGlfbmF0aXZlX3VpbnQ7CiB0eXBlZGVmIHMzMiBhY3BpX25hdGl2ZV9pbnQ7CiAKLXR5cGVkZWYgdTY0IGFjcGlfdGFibGVfcHRyOwogdHlwZWRlZiB1MzIgYWNwaV9pb19hZGRyZXNzOwotdHlwZWRlZiB1NjQgYWNwaV9waHlzaWNhbF9hZGRyZXNzOwordHlwZWRlZiB1MzIgYWNwaV9waHlzaWNhbF9hZGRyZXNzOwogCiAjZGVmaW5lIEFDUElfTUFYX1BUUiAgICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMzJfTUFYCiAjZGVmaW5lIEFDUElfU0laRV9NQVggICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMzJfTUFYCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVHlwZXMgc3BlY2lmaWMgdG8gMTYtYml0IHRhcmdldHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZWxpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gMTYKLQotLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKGtlZXAgdGhlIHR5cGVkZWZzIGFzLWlzKSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVUlOVDMyOwotdHlwZWRlZiBzaG9ydCBJTlQxNjsKLXR5cGVkZWYgbG9uZyBJTlQzMjsKLQotLyohIFtFbmRdIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICEqLwotCi10eXBlZGVmIHUxNiBhY3BpX25hdGl2ZV91aW50OwotdHlwZWRlZiBzMTYgYWNwaV9uYXRpdmVfaW50OwotCi10eXBlZGVmIHUzMiBhY3BpX3RhYmxlX3B0cjsKLXR5cGVkZWYgdTMyIGFjcGlfaW9fYWRkcmVzczsKLXR5cGVkZWYgY2hhciAqYWNwaV9waHlzaWNhbF9hZGRyZXNzOwotCi0jZGVmaW5lIEFDUElfTUFYX1BUUiAgICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMTZfTUFYCi0jZGVmaW5lIEFDUElfU0laRV9NQVggICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMTZfTUFYCi0KLSNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERQkvKiBObyA2NC1iaXQgaW50ZWdlcnMsIG9rIHRvIHVzZSBuYXRpdmUgZGl2aWRlICovCi0KLS8qIDY0LWJpdCBpbnRlZ2VycyBjYW5ub3QgYmUgc3VwcG9ydGVkICovCi0KLSNkZWZpbmUgQUNQSV9OT19JTlRFR0VSNjRfU1VQUE9SVAotCiAjZWxzZQogCi0vKiBBQ1BJX01BQ0hJTkVfV0lEVEggbXVzdCBiZSBlaXRoZXIgNjQsIDMyLCBvciAxNiAqLworLyogQUNQSV9NQUNISU5FX1dJRFRIIG11c3QgYmUgZWl0aGVyIDY0IG9yIDMyICovCiAKICNlcnJvciB1bmtub3duIEFDUElfTUFDSElORV9XSURUSAogI2VuZGlmCkBAIC0zMTEsMzYgKzI3OCw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFBvaW50ZXIgb3ZlcmxheXMgdG8gYXZvaWQgbG90cyBvZiB0eXBlY2FzdGluZyBmb3IKLSAqIGNvZGUgdGhhdCBhY2NlcHRzIGJvdGggcGh5c2ljYWwgYW5kIGxvZ2ljYWwgcG9pbnRlcnMuCi0gKi8KLXVuaW9uIGFjcGlfcG9pbnRlcnMgewotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzaWNhbDsKLQl2b2lkICpsb2dpY2FsOwotCWFjcGlfdGFibGVfcHRyIHZhbHVlOwotfTsKLQotc3RydWN0IGFjcGlfcG9pbnRlciB7Ci0JdTMyIHBvaW50ZXJfdHlwZTsKLQl1bmlvbiBhY3BpX3BvaW50ZXJzIHBvaW50ZXI7Ci19OwotCi0vKiBwb2ludGVyX3R5cGVzIGZvciBhYm92ZSAqLwotCi0jZGVmaW5lIEFDUElfUEhZU0lDQUxfUE9JTlRFUiAgICAgICAgICAgMHgwMQotI2RlZmluZSBBQ1BJX0xPR0lDQUxfUE9JTlRFUiAgICAgICAgICAgIDB4MDIKLQotLyogUHJvY2Vzc29yIG1vZGUgKi8KLQotI2RlZmluZSBBQ1BJX1BIWVNJQ0FMX0FERFJFU1NJTkcgICAgICAgIDB4MDQKLSNkZWZpbmUgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcgICAgICAgICAweDA4Ci0jZGVmaW5lIEFDUElfTUVNT1JZX01PREUgICAgICAgICAgICAgICAgMHgwQwotCi0jZGVmaW5lIEFDUElfUEhZU01PREVfUEhZU1BUUiAgICAgICAgICAgQUNQSV9QSFlTSUNBTF9BRERSRVNTSU5HIHwgQUNQSV9QSFlTSUNBTF9QT0lOVEVSCi0jZGVmaW5lIEFDUElfTE9HTU9ERV9QSFlTUFRSICAgICAgICAgICAgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcgIHwgQUNQSV9QSFlTSUNBTF9QT0lOVEVSCi0jZGVmaW5lIEFDUElfTE9HTU9ERV9MT0dQVFIgICAgICAgICAgICAgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcgIHwgQUNQSV9MT0dJQ0FMX1BPSU5URVIKLQogLyogTG9naWNhbCBkZWZpbmVzIGFuZCBOVUxMICovCiAKICNpZmRlZiBGQUxTRQpAQCAtNDQyLDcgKzM3OSw4IEBACiAvKgogICogSW5pdGlhbGl6YXRpb24gc3RhdGUKICAqLwotI2RlZmluZSBBQ1BJX0lOSVRJQUxJWkVEX09LICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQUNQSV9TVUJTWVNURU1fSU5JVElBTElaRSAgICAgICAweDAxCisjZGVmaW5lIEFDUElfSU5JVElBTElaRURfT0sgICAgICAgICAgICAgMHgwMgogCiAvKgogICogUG93ZXIgc3RhdGUgdmFsdWVzCkBAIC00OTEsMjEgKzQyOSw2IEBACiAjZGVmaW5lIEFDUElfTk9USUZZX1BPV0VSX0ZBVUxUICAgICAgICAgKHU4KSA3CiAKIC8qCi0gKiAgVGFibGUgdHlwZXMuICBUaGVzZSB2YWx1ZXMgYXJlIHBhc3NlZCB0byB0aGUgdGFibGUgcmVsYXRlZCBBUElzCi0gKi8KLXR5cGVkZWYgdTMyIGFjcGlfdGFibGVfdHlwZTsKLQotI2RlZmluZSBBQ1BJX1RBQkxFX0lEX1JTRFAgICAgICAgICAgICAgIChhY3BpX3RhYmxlX3R5cGUpIDAKLSNkZWZpbmUgQUNQSV9UQUJMRV9JRF9EU0RUICAgICAgICAgICAgICAoYWNwaV90YWJsZV90eXBlKSAxCi0jZGVmaW5lIEFDUElfVEFCTEVfSURfRkFEVCAgICAgICAgICAgICAgKGFjcGlfdGFibGVfdHlwZSkgMgotI2RlZmluZSBBQ1BJX1RBQkxFX0lEX0ZBQ1MgICAgICAgICAgICAgIChhY3BpX3RhYmxlX3R5cGUpIDMKLSNkZWZpbmUgQUNQSV9UQUJMRV9JRF9QU0RUICAgICAgICAgICAgICAoYWNwaV90YWJsZV90eXBlKSA0Ci0jZGVmaW5lIEFDUElfVEFCTEVfSURfU1NEVCAgICAgICAgICAgICAgKGFjcGlfdGFibGVfdHlwZSkgNQotI2RlZmluZSBBQ1BJX1RBQkxFX0lEX1hTRFQgICAgICAgICAgICAgIChhY3BpX3RhYmxlX3R5cGUpIDYKLSNkZWZpbmUgQUNQSV9UQUJMRV9JRF9NQVggICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEFDUElfTlVNX1RBQkxFX1RZUEVTICAgICAgICAgICAgKEFDUElfVEFCTEVfSURfTUFYKzEpCi0KLS8qCiAgKiBUeXBlcyBhc3NvY2lhdGVkIHdpdGggQUNQSSBuYW1lcyBhbmQgb2JqZWN0cy4gIFRoZSBmaXJzdCBncm91cCBvZgogICogdmFsdWVzICh1cCB0byBBQ1BJX1RZUEVfRVhURVJOQUxfTUFYKSBjb3JyZXNwb25kIHRvIHRoZSBkZWZpbml0aW9uCiAgKiBvZiB0aGUgQUNQSSBvYmplY3RfdHlwZSgpIG9wZXJhdG9yIChTZWUgdGhlIEFDUEkgU3BlYykuIFRoZXJlZm9yZSwKQEAgLTYzNyw3ICs1NjAsNyBAQAogICogIHwgfCB8ICArLS0tIFR5cGUgb2YgZGlzcGF0Y2ggLS0gdG8gbWV0aG9kLCBoYW5kbGVyLCBvciBub25lCiAgKiAgfCB8ICstLS0gRW5hYmxlZCBmb3IgcnVudGltZT8KICAqICB8ICstLS0gRW5hYmxlZCBmb3Igd2FrZT8KLSAqICArLS0tIFN5c3RlbSBzdGF0ZSB3aGVuIEdQRSBvY3VycmVkIChydW5uaW5nL3dha2luZykKKyAqICArLS0tIFVudXNlZAogICovCiAjZGVmaW5lIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSyAgICAgICAgKHU4KSAweDAxCiAjZGVmaW5lIEFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCAgICAgICAgKHU4KSAweDAxCkBAIC02NjMsMTAgKzU4Niw2IEBACiAKICNkZWZpbmUgQUNQSV9HUEVfRU5BQkxFX01BU0sgICAgICAgICAgICAodTgpIDB4NjAJLyogQm90aCBydW4vd2FrZSAqLwogCi0jZGVmaW5lIEFDUElfR1BFX1NZU1RFTV9NQVNLICAgICAgICAgICAgKHU4KSAweDgwCi0jZGVmaW5lIEFDUElfR1BFX1NZU1RFTV9SVU5OSU5HICAgICAgICAgKHU4KSAweDgwCi0jZGVmaW5lIEFDUElfR1BFX1NZU1RFTV9XQUtJTkcgICAgICAgICAgKHU4KSAweDAwCi0KIC8qCiAgKiBGbGFncyBmb3IgR1BFIGFuZCBMb2NrIGludGVyZmFjZXMKICAqLwpAQCAtODE2LDEzICs3MzUsNiBAQAogI2RlZmluZSBBQ1BJX1NZU19NT0RFU19NQVNLICAgICAgICAgICAgIDB4MDAwMwogCiAvKgotICogQUNQSSBUYWJsZSBJbmZvLiAgT25lIHBlciBBQ1BJIHRhYmxlIF90eXBlXwotICovCi1zdHJ1Y3QgYWNwaV90YWJsZV9pbmZvIHsKLQl1MzIgY291bnQ7Ci19OwotCi0vKgogICogU3lzdGVtIGluZm8gcmV0dXJuZWQgYnkgYWNwaV9nZXRfc3lzdGVtX2luZm8oKQogICovCiBzdHJ1Y3QgYWNwaV9zeXN0ZW1faW5mbyB7CkBAIC04MzMsOCArNzQ1LDYgQEAKIAl1MzIgcmVzZXJ2ZWQyOwogCXUzMiBkZWJ1Z19sZXZlbDsKIAl1MzIgZGVidWdfbGF5ZXI7Ci0JdTMyIG51bV90YWJsZV90eXBlczsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9pbmZvIHRhYmxlX2luZm9bQUNQSV9UQUJMRV9JRF9NQVggKyAxXTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oIGIvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaAppbmRleCBiYTAzOWVhLi44ODNmZmU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0xNDEsOCArMTQxLDYgQEAKIAogdm9pZCBhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93bih2b2lkKTsKIAotYWNwaV9zdGF0dXMgYWNwaV91dF92YWxpZGF0ZV9mYWR0KHZvaWQpOwotCiAvKgogICogdXRjbGliIC0gTG9jYWwgaW1wbGVtZW50YXRpb25zIG9mIEMgbGlicmFyeSBmdW5jdGlvbnMKICAqLwpAQCAtNDUzLDYgKzQ1MSw4IEBACiAvKgogICogdXRtaXNjCiAgKi8KK2NvbnN0IGNoYXIgKmFjcGlfdXRfdmFsaWRhdGVfZXhjZXB0aW9uKGFjcGlfc3RhdHVzIHN0YXR1cyk7CisKIHU4IGFjcGlfdXRfaXNfYW1sX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOwogCiBhY3BpX3N0YXR1cyBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkKGFjcGlfb3duZXJfaWQgKiBvd25lcl9pZCk7CkBAIC00NzAsNyArNDcwLDcgQEAKIAogdTggYWNwaV91dF92YWxpZF9hY3BpX25hbWUodTMyIG5hbWUpOwogCi1hY3BpX25hbWUgYWNwaV91dF9yZXBhaXJfbmFtZShhY3BpX25hbWUgbmFtZSk7CithY3BpX25hbWUgYWNwaV91dF9yZXBhaXJfbmFtZShjaGFyICpuYW1lKTsKIAogdTggYWNwaV91dF92YWxpZF9hY3BpX2NoYXIoY2hhciBjaGFyYWN0ZXIsIGFjcGlfbmF0aXZlX3VpbnQgcG9zaXRpb24pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYW1sY29kZS5oIGIvaW5jbHVkZS9hY3BpL2FtbGNvZGUuaAppbmRleCBjZjE4NDI2Li5kYTUzYTRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYW1sY29kZS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hbWxjb2RlLmgKQEAgLTcsNyArNyw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yNzMsNyArMjczLDcgQEAKICNkZWZpbmUgQVJHSV9EQVRBT0JKRUNUICAgICAgICAgICAgIDB4MTIJLyogQnVmZmVyLCBTdHJpbmcsIHBhY2thZ2Ugb3IgcmVmZXJlbmNlIHRvIGEgTm9kZSAtIFVzZWQgb25seSBieSBzaXplX29mIG9wZXJhdG9yICovCiAjZGVmaW5lIEFSR0lfQ09NUExFWE9CSiAgICAgICAgICAgICAweDEzCS8qIEJ1ZmZlciwgU3RyaW5nLCBvciBwYWNrYWdlIChVc2VkIGJ5IElOREVYIG9wIG9ubHkpICovCiAjZGVmaW5lIEFSR0lfUkVGX09SX1NUUklORyAgICAgICAgICAweDE0CS8qIFJlZmVyZW5jZSBvciBTdHJpbmcgKFVzZWQgYnkgREVSRUZPRiBvcCBvbmx5KSAqLwotI2RlZmluZSBBUkdJX1JFR0lPTl9PUl9GSUVMRCAgICAgICAgMHgxNQkvKiBVc2VkIGJ5IExPQUQgb3Agb25seSAqLworI2RlZmluZSBBUkdJX1JFR0lPTl9PUl9CVUZGRVIgICAgICAgMHgxNQkvKiBVc2VkIGJ5IExPQUQgb3Agb25seSAqLwogI2RlZmluZSBBUkdJX0RBVEFSRUZPQkogICAgICAgICAgICAgMHgxNgogCiAvKiBOb3RlOiB0eXBlcyBhYm92ZSBjYW4gZXhwYW5kIHRvIDB4MUYgbWF4aW11bSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FtbHJlc3JjLmggYi9pbmNsdWRlL2FjcGkvYW1scmVzcmMuaAppbmRleCBiZTAzODE4Li5mN2Q1NDEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYW1scmVzcmMuaAorKysgYi9pbmNsdWRlL2FjcGkvYW1scmVzcmMuaApAQCAtNiw3ICs2LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDYsIFIuIEJ5cm9uIE1vb3JlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3LCBSLiBCeXJvbiBNb29yZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKaW5kZXggNDUzYTQ2OS4uZGFiMmVjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKQEAgLTUsNyArNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA2LCBSLiBCeXJvbiBNb29yZQorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNywgUi4gQnlyb24gTW9vcmUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2MuaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oCmluZGV4IGRhODA5MzMuLjNiYjUwNDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKaW5kZXggN2YxZTkyOS4uNWY1MzJkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCkBAIC01LDcgKzUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNiwgUi4gQnlyb24gTW9vcmUKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcsIFIuIEJ5cm9uIE1vb3JlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAppbmRleCA3Y2ZhZDkzLi41ZTY1N2ViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaApAQCAtMzksNyArMzksNyBAQAogICogQ2FsbGluZyBjb252ZW50aW9uczoKICAqCiAgKiBBQ1BJX1NZU1RFTV9YRkFDRSAgICAgICAgLSBJbnRlcmZhY2VzIHRvIGhvc3QgT1MgKGhhbmRsZXJzLCB0aHJlYWRzKQotICogQUNQSV9FWFRFUk5BTF9YRkFDRSAgICAgIC0gRXh0ZXJuYWwgQUNQSSBpbnRlcmZhY2VzIAorICogQUNQSV9FWFRFUk5BTF9YRkFDRSAgICAgIC0gRXh0ZXJuYWwgQUNQSSBpbnRlcmZhY2VzCiAgKiBBQ1BJX0lOVEVSTkFMX1hGQUNFICAgICAgLSBJbnRlcm5hbCBBQ1BJIGludGVyZmFjZXMKICAqIEFDUElfSU5URVJOQUxfVkFSX1hGQUNFICAtIEludGVybmFsIHZhcmlhYmxlLXBhcmFtZXRlciBsaXN0IGludGVyZmFjZXMKICAqLwpAQCAtNTksMTEgKzU5LDExIEBACiBpbnQgX19hY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sodW5zaWduZWQgaW50ICpsb2NrKTsKIGludCBfX2FjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayh1bnNpZ25lZCBpbnQgKmxvY2spOwogCi0jZGVmaW5lIEFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhHTHB0ciwgQWNxKSBcCi0JKChBY3EpID0gX19hY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soKHVuc2lnbmVkIGludCAqKSBHTHB0cikpCisjZGVmaW5lIEFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhmYWNzLCBBY3EpIFwKKwkoKEFjcSkgPSBfX2FjcGlfYWNxdWlyZV9nbG9iYWxfbG9jaygmZmFjcy0+Z2xvYmFsX2xvY2spKQogCi0jZGVmaW5lIEFDUElfUkVMRUFTRV9HTE9CQUxfTE9DSyhHTHB0ciwgQWNxKSBcCi0JKChBY3EpID0gX19hY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soKHVuc2lnbmVkIGludCAqKSBHTHB0cikpCisjZGVmaW5lIEFDUElfUkVMRUFTRV9HTE9CQUxfTE9DSyhmYWNzLCBBY3EpIFwKKwkoKEFjcSkgPSBfX2FjcGlfcmVsZWFzZV9nbG9iYWxfbG9jaygmZmFjcy0+Z2xvYmFsX2xvY2spKQogCiAvKgogICogTWF0aCBoZWxwZXIgYXNtIG1hY3JvcwpAQCAtODcsNyArODcsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX2FjcGlfcGNpKHZvaWQpIHsgfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfQUNQSSAKKyNpZmRlZiBDT05GSUdfQUNQSQogZXh0ZXJuIGludCBhY3BpX2xhcGljOwogZXh0ZXJuIGludCBhY3BpX2lvYXBpYzsKIGV4dGVybiBpbnQgYWNwaV9ub2lycTsKQEAgLTk1LDkgKzk1LDkgQEAKIGV4dGVybiBpbnQgYWNwaV9kaXNhYmxlZDsKIGV4dGVybiBpbnQgYWNwaV9odDsKIGV4dGVybiBpbnQgYWNwaV9wY2lfZGlzYWJsZWQ7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9hY3BpKHZvaWQpIAoteyAKLQlhY3BpX2Rpc2FibGVkID0gMTsgCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9hY3BpKHZvaWQpCit7CisJYWNwaV9kaXNhYmxlZCA9IDE7CiAJYWNwaV9odCA9IDA7CiAJYWNwaV9wY2lfZGlzYWJsZWQgPSAxOwogCWFjcGlfbm9pcnEgPSAxOwpAQCAtMTE0LDkgKzExNCw5IEBACiAjZW5kaWYKIAogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfbm9pcnFfc2V0KHZvaWQpIHsgYWNwaV9ub2lycSA9IDE7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2Rpc2FibGVfcGNpKHZvaWQpIAorc3RhdGljIGlubGluZSB2b2lkIGFjcGlfZGlzYWJsZV9wY2kodm9pZCkKIHsKLQlhY3BpX3BjaV9kaXNhYmxlZCA9IDE7IAorCWFjcGlfcGNpX2Rpc2FibGVkID0gMTsKIAlhY3BpX25vaXJxX3NldCgpOwogfQogZXh0ZXJuIGludCBhY3BpX2lycV9iYWxhbmNlX3NldChjaGFyICpzdHIpOwpAQCAtMTQ0LDggKzE0NCw2IEBACiAKICNlbmRpZiAvKkNPTkZJR19BQ1BJX1NMRUVQKi8KIAotZXh0ZXJuIHU4IHg4Nl9hY3BpaWRfdG9fYXBpY2lkW107Ci0KICNkZWZpbmUgQVJDSF9IQVNfUE9XRVJfSU5JVAkxCiAKICNlbmRpZiAvKl9fS0VSTkVMX18qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWVzNzAwMC9tYWNoX21wcGFyc2UuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1lczcwMDAvbWFjaF9tcHBhcnNlLmgKaW5kZXggOTlmNjZiZS4uMjQ5OTBlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWVzNzAwMC9tYWNoX21wcGFyc2UuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZXM3MDAwL21hY2hfbXBwYXJzZS5oCkBAIC0zLDEzICszLDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtcGNfb2VtX2J1c19pbmZvKHN0cnVjdCBtcGNfY29uZmlnX2J1cyAqbSwgY2hhciAqbmFtZSwgCitzdGF0aWMgaW5saW5lIHZvaWQgbXBjX29lbV9idXNfaW5mbyhzdHJ1Y3QgbXBjX2NvbmZpZ19idXMgKm0sIGNoYXIgKm5hbWUsCiAJCQkJc3RydWN0IG1wY19jb25maWdfdHJhbnNsYXRpb24gKnRyYW5zbGF0aW9uKQogewogCURwcmludGsoIkJ1cyAjJWQgaXMgJXNcbiIsIG0tPm1wY19idXNpZCwgbmFtZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtcGNfb2VtX3BjaV9idXMoc3RydWN0IG1wY19jb25maWdfYnVzICptLCAKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGNfb2VtX3BjaV9idXMoc3RydWN0IG1wY19jb25maWdfYnVzICptLAogCQkJCXN0cnVjdCBtcGNfY29uZmlnX3RyYW5zbGF0aW9uICp0cmFuc2xhdGlvbikKIHsKIH0KQEAgLTIyLDcgKzIyLDcgQEAKIAkJY2hhciAqcHJvZHVjdGlkKQogewogCWlmIChtcGMtPm1wY19vZW1wdHIpIHsKLQkJc3RydWN0IG1wX2NvbmZpZ19vZW10YWJsZSAqb2VtX3RhYmxlID0gCisJCXN0cnVjdCBtcF9jb25maWdfb2VtdGFibGUgKm9lbV90YWJsZSA9CiAJCQkoc3RydWN0IG1wX2NvbmZpZ19vZW10YWJsZSAqKW1wYy0+bXBjX29lbXB0cjsKIAkJaWYgKCFzdHJuY21wKG9lbSwgIlVOSVNZUyIsIDYpKQogCQkJcmV0dXJuIHBhcnNlX3VuaXN5c19vZW0oKGNoYXIgKilvZW1fdGFibGUpOwpAQCAtMzEsMTIgKzMxLDEzIEBACiB9CiAKICNpZmRlZiBDT05GSUdfQUNQSQorCiBzdGF0aWMgaW5saW5lIGludCBlczcwMDBfY2hlY2tfZHNkdCh2b2lkKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKLQlpZighYWNwaV9nZXRfdGFibGVfaGVhZGVyX2Vhcmx5KEFDUElfRFNEVCwgJmhlYWRlcikpCi0JCWFjcGlfdGFibGVfcHJpbnQoaGVhZGVyLCAwKTsKLQlpZiAoIXN0cm5jbXAoaGVhZGVyLT5vZW1faWQsICJVTklTWVMiLCA2KSkKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOworCW1lbWNweSgmaGVhZGVyLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJYWNwaV9nZXRfdGFibGVfaGVhZGVyKEFDUElfU0lHX0RTRFQsIDAsICZoZWFkZXIpOworCWlmICghc3RybmNtcChoZWFkZXIub2VtX2lkLCAiVU5JU1lTIiwgNikpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpAQCAtNDQsNyArNDUsNyBAQAogLyogSG9vayBmcm9tIGdlbmVyaWMgQUNQSSB0YWJsZXMuYyAqLwogc3RhdGljIGlubGluZSBpbnQgYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIG9lbV9hZGRyOyAKKwl1bnNpZ25lZCBsb25nIG9lbV9hZGRyOwogCWlmICghZmluZF91bmlzeXNfYWNwaV9vZW1fdGFibGUoJm9lbV9hZGRyKSkgewogCQlpZiAoZXM3MDAwX2NoZWNrX2RzZHQoKSkKIAkJCXJldHVybiBwYXJzZV91bmlzeXNfb2VtKChjaGFyICopb2VtX2FkZHIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9hY3BpLmggYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaAppbmRleCAwOWE1ZGQwLi41ZDAzNzkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaApAQCAtODIsMTEgKzgyLDExIEBACiAJcmV0dXJuIG9sZCAmIDB4MTsKIH0KIAotI2RlZmluZSBBQ1BJX0FDUVVJUkVfR0xPQkFMX0xPQ0soR0xwdHIsIEFjcSkJCQkJXAotCSgoQWNxKSA9IGlhNjRfYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKCh1bnNpZ25lZCBpbnQgKikgR0xwdHIpKQorI2RlZmluZSBBQ1BJX0FDUVVJUkVfR0xPQkFMX0xPQ0soZmFjcywgQWNxKQkJCQlcCisJKChBY3EpID0gaWE2NF9hY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soJmZhY3MtPmdsb2JhbF9sb2NrKSkKIAotI2RlZmluZSBBQ1BJX1JFTEVBU0VfR0xPQkFMX0xPQ0soR0xwdHIsIEFjcSkJCQkJXAotCSgoQWNxKSA9IGlhNjRfYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKCh1bnNpZ25lZCBpbnQgKikgR0xwdHIpKQorI2RlZmluZSBBQ1BJX1JFTEVBU0VfR0xPQkFMX0xPQ0soZmFjcywgQWNxKQkJCQlcCisJKChBY3EpID0gaWE2NF9hY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soJmZhY3MtPmdsb2JhbF9sb2NrKSkKIAogI2RlZmluZSBhY3BpX2Rpc2FibGVkIDAJLyogQUNQSSBhbHdheXMgZW5hYmxlZCBvbiBJQTY0ICovCiAjZGVmaW5lIGFjcGlfbm9pcnEgMAkvKiBBQ1BJIGFsd2F5cyBlbmFibGVkIG9uIElBNjQgKi8KQEAgLTExOSw4ICsxMTksNiBAQAogZXh0ZXJuIGludCBfX2luaXRkYXRhIG5pZF90b19weG1fbWFwW01BWF9OVU1OT0RFU107CiAjZW5kaWYKIAotZXh0ZXJuIHUxNiBpYTY0X2FjcGlpZF90b19zYXBpY2lkW107Ci0KIC8qCiAgKiBSZWZlciBJbnRlbCBBQ1BJIF9QREMgc3VwcG9ydCBkb2N1bWVudCBmb3IgYml0IGRlZmluaXRpb25zCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vYWNwaS5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9hY3BpLmgKaW5kZXggMjg1MGE3ZS4uOWNlMjgwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9hY3BpLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9hY3BpLmgKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgImFjcGkvYWNnbG9iYWwuaCIKIAotI2RlZmluZSBTTl9BQ1BJX0JBU0VfU1VQUE9SVCgpICAgKGFjcGlfZ2JsX0RTRFQtPm9lbV9yZXZpc2lvbiA+PSAweDIwMTAxKQorZXh0ZXJuIGludCBzbl9hY3BpX3JldjsKKyNkZWZpbmUgU05fQUNQSV9CQVNFX1NVUFBPUlQoKSAgIChzbl9hY3BpX3JldiA+PSAweDIwMTAxKQogCiAjZW5kaWYgLyogX0FTTV9JQTY0X1NOX0FDUElfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9wY2licl9wcm92aWRlci5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9wY2licl9wcm92aWRlci5oCmluZGV4IGRhM2VhZGUuLjE3Y2I2Y2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnJfcHJvdmlkZXIuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJyX3Byb3ZpZGVyLmgKQEAgLTE0Miw3ICsxNDIsNyBAQAogZXh0ZXJuIHZvaWQgCQlwY2licl9hdGVfZnJlZShzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50KTsKIGV4dGVybiB2b2lkIAkJYXRlX3dyaXRlKHN0cnVjdCBwY2lidXNfaW5mbyAqLCBpbnQsIGludCwgdTY0KTsKIGV4dGVybiBpbnQgc2FsX3BjaWJyX3Nsb3RfZW5hYmxlKHN0cnVjdCBwY2lidXNfaW5mbyAqc29mdCwgaW50IGRldmljZSwKLQkJCQkgdm9pZCAqcmVzcCk7CisJCQkJIHZvaWQgKnJlc3AsIGNoYXIgKipzc2R0KTsKIGV4dGVybiBpbnQgc2FsX3BjaWJyX3Nsb3RfZGlzYWJsZShzdHJ1Y3QgcGNpYnVzX2luZm8gKnNvZnQsIGludCBkZXZpY2UsCiAJCQkJICBpbnQgYWN0aW9uLCB2b2lkICpyZXNwKTsKIGV4dGVybiB1MTYgc25faW9ib2FyZF90b19wY2lfYnVzKHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpZGV2LmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWRldi5oCmluZGV4IDlmZTg5YTkuLjFjMjM4MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpZGV2LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lkZXYuaApAQCAtNzAsMTAgKzcwLDE2IEBACiAJCQkgc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbyk7CiBleHRlcm4gdm9pZCBzbl9pcnFfdW5maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7CiBleHRlcm4gc3RydWN0IHBjaWRldl9pbmZvICogc25fcGNpZGV2X2luZm9fZ2V0KHN0cnVjdCBwY2lfZGV2ICopOworZXh0ZXJuIHZvaWQgc25fYnVzX2ZpeHVwKHN0cnVjdCBwY2lfYnVzICopOworZXh0ZXJuIHZvaWQgc25fYWNwaV9idXNfZml4dXAoc3RydWN0IHBjaV9idXMgKik7CitleHRlcm4gdm9pZCBzbl9jb21tb25fYnVzX2ZpeHVwKHN0cnVjdCBwY2lfYnVzICosIHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKTsKIGV4dGVybiB2b2lkIHNuX2J1c19zdG9yZV9zeXNkYXRhKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgc25fYnVzX2ZyZWVfc3lzZGF0YSh2b2lkKTsKIGV4dGVybiB2b2lkIHNuX2dlbmVyYXRlX3BhdGgoc3RydWN0IHBjaV9idXMgKnBjaV9idXMsIGNoYXIgKmFkZHJlc3MpOwotZXh0ZXJuIHZvaWQgc25fcGNpX2ZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBzbl9pb19zbG90X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICopOworZXh0ZXJuIHZvaWQgc25fYWNwaV9zbG90X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICopOworZXh0ZXJuIHZvaWQgc25fcGNpX2ZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaWRldl9pbmZvICosCisJCQkgICAgICBzdHJ1Y3Qgc25faXJxX2luZm8gKik7CiBleHRlcm4gdm9pZCBzbl9wY2lfdW5maXh1cF9zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogZXh0ZXJuIHZvaWQgc25faXJxX2xoX2luaXQodm9pZCk7CiAjZW5kaWYJCQkJLyogX0FTTV9JQTY0X1NOX1BDSV9QQ0lERVZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKaW5kZXggNmI2ZmM2Zi4uYTI5ZjA1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCkBAIC0zNyw3ICszNyw3IEBACiAgKiBDYWxsaW5nIGNvbnZlbnRpb25zOgogICoKICAqIEFDUElfU1lTVEVNX1hGQUNFICAgICAgICAtIEludGVyZmFjZXMgdG8gaG9zdCBPUyAoaGFuZGxlcnMsIHRocmVhZHMpCi0gKiBBQ1BJX0VYVEVSTkFMX1hGQUNFICAgICAgLSBFeHRlcm5hbCBBQ1BJIGludGVyZmFjZXMgCisgKiBBQ1BJX0VYVEVSTkFMX1hGQUNFICAgICAgLSBFeHRlcm5hbCBBQ1BJIGludGVyZmFjZXMKICAqIEFDUElfSU5URVJOQUxfWEZBQ0UgICAgICAtIEludGVybmFsIEFDUEkgaW50ZXJmYWNlcwogICogQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UgIC0gSW50ZXJuYWwgdmFyaWFibGUtcGFyYW1ldGVyIGxpc3QgaW50ZXJmYWNlcwogICovCkBAIC01NywxMSArNTcsMTEgQEAKIGludCBfX2FjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayh1bnNpZ25lZCBpbnQgKmxvY2spOwogaW50IF9fYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKHVuc2lnbmVkIGludCAqbG9jayk7CiAKLSNkZWZpbmUgQUNQSV9BQ1FVSVJFX0dMT0JBTF9MT0NLKEdMcHRyLCBBY3EpIFwKLQkoKEFjcSkgPSBfX2FjcGlfYWNxdWlyZV9nbG9iYWxfbG9jaygodW5zaWduZWQgaW50ICopIEdMcHRyKSkKKyNkZWZpbmUgQUNQSV9BQ1FVSVJFX0dMT0JBTF9MT0NLKGZhY3MsIEFjcSkgXAorCSgoQWNxKSA9IF9fYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKCZmYWNzLT5nbG9iYWxfbG9jaykpCiAKLSNkZWZpbmUgQUNQSV9SRUxFQVNFX0dMT0JBTF9MT0NLKEdMcHRyLCBBY3EpIFwKLQkoKEFjcSkgPSBfX2FjcGlfcmVsZWFzZV9nbG9iYWxfbG9jaygodW5zaWduZWQgaW50ICopIEdMcHRyKSkKKyNkZWZpbmUgQUNQSV9SRUxFQVNFX0dMT0JBTF9MT0NLKGZhY3MsIEFjcSkgXAorCSgoQWNxKSA9IF9fYWNwaV9yZWxlYXNlX2dsb2JhbF9sb2NrKCZmYWNzLT5nbG9iYWxfbG9jaykpCiAKIC8qCiAgKiBNYXRoIGhlbHBlciBhc20gbWFjcm9zCkBAIC04NywxMCArODcsMTAgQEAKIGV4dGVybiBpbnQgYWNwaV9kaXNhYmxlZDsKIGV4dGVybiBpbnQgYWNwaV9wY2lfZGlzYWJsZWQ7CiBleHRlcm4gaW50IGFjcGlfaHQ7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9hY3BpKHZvaWQpIAoteyAKLQlhY3BpX2Rpc2FibGVkID0gMTsgCi0JYWNwaV9odCA9IDA7IAorc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfYWNwaSh2b2lkKQoreworCWFjcGlfZGlzYWJsZWQgPSAxOworCWFjcGlfaHQgPSAwOwogCWFjcGlfcGNpX2Rpc2FibGVkID0gMTsKIAlhY3BpX25vaXJxID0gMTsKIH0KQEAgLTEwMCw5ICsxMDAsOSBAQAogCiBleHRlcm4gaW50IGFjcGlfZ3NpX3RvX2lycSh1MzIgZ3NpLCB1bnNpZ25lZCBpbnQgKmlycSk7CiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9ub2lycV9zZXQodm9pZCkgeyBhY3BpX25vaXJxID0gMTsgfQotc3RhdGljIGlubGluZSB2b2lkIGFjcGlfZGlzYWJsZV9wY2kodm9pZCkgCitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9kaXNhYmxlX3BjaSh2b2lkKQogewotCWFjcGlfcGNpX2Rpc2FibGVkID0gMTsgCisJYWNwaV9wY2lfZGlzYWJsZWQgPSAxOwogCWFjcGlfbm9pcnFfc2V0KCk7CiB9CiBleHRlcm4gaW50IGFjcGlfaXJxX2JhbGFuY2Vfc2V0KGNoYXIgKnN0cik7CkBAIC0xMzYsOCArMTM2LDYgQEAKIGV4dGVybiBpbnQgYWNwaV9kaXNhYmxlZDsKIGV4dGVybiBpbnQgYWNwaV9wY2lfZGlzYWJsZWQ7CiAKLWV4dGVybiB1OCB4ODZfYWNwaWlkX3RvX2FwaWNpZFtdOwotCiAjZGVmaW5lIEFSQ0hfSEFTX1BPV0VSX0lOSVQgMQogCiBleHRlcm4gaW50IGFjcGlfc2tpcF90aW1lcl9vdmVycmlkZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaS5oIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKaW5kZXggOTFmMWYyMy4uODE1ZjFmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKQEAgLTUzLDE2NiArNTMsNiBAQAogCiBleHRlcm4gZW51bSBhY3BpX2lycV9tb2RlbF9pZAlhY3BpX2lycV9tb2RlbDsKIAotCi0vKiBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBQb2ludGVyIChSU0RQKSAqLwotCi1zdHJ1Y3QgYWNwaV90YWJsZV9yc2RwIHsKLQljaGFyCQkJc2lnbmF0dXJlWzhdOwotCXU4CQkJY2hlY2tzdW07Ci0JY2hhcgkJCW9lbV9pZFs2XTsKLQl1OAkJCXJldmlzaW9uOwotCXUzMgkJCXJzZHRfYWRkcmVzczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYWNwaTIwX3RhYmxlX3JzZHAgewotCWNoYXIJCQlzaWduYXR1cmVbOF07Ci0JdTgJCQljaGVja3N1bTsKLQljaGFyCQkJb2VtX2lkWzZdOwotCXU4CQkJcmV2aXNpb247Ci0JdTMyCQkJcnNkdF9hZGRyZXNzOwotCXUzMgkJCWxlbmd0aDsKLQl1NjQJCQl4c2R0X2FkZHJlc3M7Ci0JdTgJCQlleHRfY2hlY2tzdW07Ci0JdTgJCQlyZXNlcnZlZFszXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTgJCQl0eXBlOwotCXU4CQkJbGVuZ3RoOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYWNwaV90YWJsZV9lbnRyeV9oZWFkZXI7Ci0KLS8qIFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlIChSU0RUKSAqLwotCi1zdHJ1Y3QgYWNwaV90YWJsZV9yc2R0IHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwotCXUzMgkJCWVudHJ5WzhdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIEV4dGVuZGVkIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAoWFNEVCkgKi8KLQotc3RydWN0IGFjcGlfdGFibGVfeHNkdCB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsKLQl1NjQJCQllbnRyeVsxXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBGaXhlZCBBQ1BJIERlc2NyaXB0aW9uIFRhYmxlIChGQURUKSAqLwotCi1zdHJ1Y3QgYWNwaV90YWJsZV9mYWR0IHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwotCXUzMiBmYWNzX2FkZHI7Ci0JdTMyIGRzZHRfYWRkcjsKLQkvKiAuLi4gKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBNdWx0aXBsZSBBUElDIERlc2NyaXB0aW9uIFRhYmxlIChNQURUKSAqLwotCi1zdHJ1Y3QgYWNwaV90YWJsZV9tYWR0IHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwotCXUzMgkJCWxhcGljX2FkZHJlc3M7Ci0Jc3RydWN0IHsKLQkJdTMyCQkJcGNhdF9jb21wYXQ6MTsKLQkJdTMyCQkJcmVzZXJ2ZWQ6MzE7Ci0JfQkJCWZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLWVudW0gYWNwaV9tYWR0X2VudHJ5X2lkIHsKLQlBQ1BJX01BRFRfTEFQSUMgPSAwLAotCUFDUElfTUFEVF9JT0FQSUMsCi0JQUNQSV9NQURUX0lOVF9TUkNfT1ZSLAotCUFDUElfTUFEVF9OTUlfU1JDLAotCUFDUElfTUFEVF9MQVBJQ19OTUksCi0JQUNQSV9NQURUX0xBUElDX0FERFJfT1ZSLAotCUFDUElfTUFEVF9JT1NBUElDLAotCUFDUElfTUFEVF9MU0FQSUMsCi0JQUNQSV9NQURUX1BMQVRfSU5UX1NSQywKLQlBQ1BJX01BRFRfRU5UUllfQ09VTlQKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1MTYJCQlwb2xhcml0eToyOwotCXUxNgkJCXRyaWdnZXI6MjsKLQl1MTYJCQlyZXNlcnZlZDoxMjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFjcGlfaW50ZXJydXB0X2ZsYWdzOwotCi1zdHJ1Y3QgYWNwaV90YWJsZV9sYXBpYyB7Ci0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIJaGVhZGVyOwotCXU4CQkJYWNwaV9pZDsKLQl1OAkJCWlkOwotCXN0cnVjdCB7Ci0JCXUzMgkJCWVuYWJsZWQ6MTsKLQkJdTMyCQkJcmVzZXJ2ZWQ6MzE7Ci0JfQkJCWZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBhY3BpX3RhYmxlX2lvYXBpYyB7Ci0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIJaGVhZGVyOwotCXU4CQkJaWQ7Ci0JdTgJCQlyZXNlcnZlZDsKLQl1MzIJCQlhZGRyZXNzOwotCXUzMgkJCWdsb2JhbF9pcnFfYmFzZTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYWNwaV90YWJsZV9pbnRfc3JjX292ciB7Ci0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIJaGVhZGVyOwotCXU4CQkJYnVzOwotCXU4CQkJYnVzX2lycTsKLQl1MzIJCQlnbG9iYWxfaXJxOwotCWFjcGlfaW50ZXJydXB0X2ZsYWdzCWZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBhY3BpX3RhYmxlX25taV9zcmMgewotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyCWhlYWRlcjsKLQlhY3BpX2ludGVycnVwdF9mbGFncwlmbGFnczsKLQl1MzIJCQlnbG9iYWxfaXJxOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljX25taSB7Ci0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIJaGVhZGVyOwotCXU4CQkJYWNwaV9pZDsKLQlhY3BpX2ludGVycnVwdF9mbGFncwlmbGFnczsKLQl1OAkJCWxpbnQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGFjcGlfdGFibGVfbGFwaWNfYWRkcl9vdnIgewotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyCWhlYWRlcjsKLQl1OAkJCXJlc2VydmVkWzJdOwotCXU2NAkJCWFkZHJlc3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGFjcGlfdGFibGVfaW9zYXBpYyB7Ci0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIJaGVhZGVyOwotCXU4CQkJaWQ7Ci0JdTgJCQlyZXNlcnZlZDsKLQl1MzIJCQlnbG9iYWxfaXJxX2Jhc2U7Ci0JdTY0CQkJYWRkcmVzczsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgYWNwaV90YWJsZV9sc2FwaWMgewotCWFjcGlfdGFibGVfZW50cnlfaGVhZGVyCWhlYWRlcjsKLQl1OAkJCWFjcGlfaWQ7Ci0JdTgJCQlpZDsKLQl1OAkJCWVpZDsKLQl1OAkJCXJlc2VydmVkWzNdOwotCXN0cnVjdCB7Ci0JCXUzMgkJCWVuYWJsZWQ6MTsKLQkJdTMyCQkJcmVzZXJ2ZWQ6MzE7Ci0JfQkJCWZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBhY3BpX3RhYmxlX3BsYXRfaW50X3NyYyB7Ci0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIJaGVhZGVyOwotCWFjcGlfaW50ZXJydXB0X2ZsYWdzCWZsYWdzOwotCXU4CQkJdHlwZTsJLyogU2VlIGFjcGlfaW50ZXJydXB0X3R5cGUgKi8KLQl1OAkJCWlkOwotCXU4CQkJZWlkOwotCXU4CQkJaW9zYXBpY192ZWN0b3I7Ci0JdTMyCQkJZ2xvYmFsX2lycTsKLQlzdHJ1Y3QgewotCQl1MzIJCQljcGVpX292ZXJyaWRlX2ZsYWc6MTsKLQkJdTMyCQkJcmVzZXJ2ZWQ6MzE7Ci0JfQkJCXBsaW50X2ZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KIGVudW0gYWNwaV9pbnRlcnJ1cHRfaWQgewogCUFDUElfSU5URVJSVVBUX1BNSQk9IDEsCiAJQUNQSV9JTlRFUlJVUFRfSU5JVCwKQEAgLTIyMiw4OSArNjIsNiBAQAogCiAjZGVmaW5lCUFDUElfU1BBQ0VfTUVNCQkwCiAKLXN0cnVjdCBhY3BpX2dlbl9yZWdhZGRyIHsKLQl1OCAgc3BhY2VfaWQ7Ci0JdTggIGJpdF93aWR0aDsKLQl1OCAgYml0X29mZnNldDsKLQl1OCAgcmVzdjsKLQl1MzIgYWRkcmw7Ci0JdTMyIGFkZHJoOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBhY3BpX3RhYmxlX2hwZXQgewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7Ci0JdTMyIGlkOwotCXN0cnVjdCBhY3BpX2dlbl9yZWdhZGRyIGFkZHI7Ci0JdTggbnVtYmVyOwotCXUxNiBtaW5fdGljazsKLQl1OCBwYWdlX3Byb3RlY3Q7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyoKLSAqIFNpbXBsZSBCb290IEZsYWdzCi0gKiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2hkYy9od2Rldi9yZXNvdXJjZXMvc3BlY3Mvc2ltcF9iaW9zLm1zcHgKLSAqLwotc3RydWN0IGFjcGlfdGFibGVfc2JmCi17Ci0JdTggc2JmX3NpZ25hdHVyZVs0XTsKLQl1MzIgc2JmX2xlbjsKLQl1OCBzYmZfcmV2aXNpb247Ci0JdTggc2JmX2NzdW07Ci0JdTggc2JmX29lbWlkWzZdOwotCXU4IHNiZl9vZW10YWJsZVs4XTsKLQl1OCBzYmZfcmV2ZGF0YVs0XTsKLQl1OCBzYmZfY3JlYXRvcls0XTsKLQl1OCBzYmZfY3JlYXJldls0XTsKLQl1OCBzYmZfY21vczsKLQl1OCBzYmZfc3BhcmVbM107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyoKLSAqIFN5c3RlbSBSZXNvdXJjZSBBZmZpbml0eSBUYWJsZSAoU1JBVCkKLSAqIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL2h3ZGV2L3BsYXRmb3JtL3Byb2MvU1JBVC5tc3B4Ci0gKi8KLQotc3RydWN0IGFjcGlfdGFibGVfc3JhdCB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsKLQl1MzIJCQl0YWJsZV9yZXZpc2lvbjsKLQl1NjQJCQlyZXNlcnZlZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1lbnVtIGFjcGlfc3JhdF9lbnRyeV9pZCB7Ci0JQUNQSV9TUkFUX1BST0NFU1NPUl9BRkZJTklUWSA9IDAsCi0JQUNQSV9TUkFUX01FTU9SWV9BRkZJTklUWSwKLQlBQ1BJX1NSQVRfRU5UUllfQ09VTlQKLX07Ci0KLXN0cnVjdCBhY3BpX3RhYmxlX3Byb2Nlc3Nvcl9hZmZpbml0eSB7Ci0JYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIJaGVhZGVyOwotCXU4CQkJcHJveGltaXR5X2RvbWFpbjsKLQl1OAkJCWFwaWNfaWQ7Ci0Jc3RydWN0IHsKLQkJdTMyCQkJZW5hYmxlZDoxOwotCQl1MzIJCQlyZXNlcnZlZDozMTsKLQl9CQkJZmxhZ3M7Ci0JdTgJCQlsc2FwaWNfZWlkOwotCXU4CQkJcmVzZXJ2ZWRbN107Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5IHsKLQlhY3BpX3RhYmxlX2VudHJ5X2hlYWRlcgloZWFkZXI7Ci0JdTgJCQlwcm94aW1pdHlfZG9tYWluOwotCXU4CQkJcmVzZXJ2ZWQxWzVdOwotCXUzMgkJCWJhc2VfYWRkcl9sbzsKLQl1MzIJCQliYXNlX2FkZHJfaGk7Ci0JdTMyCQkJbGVuZ3RoX2xvOwotCXUzMgkJCWxlbmd0aF9oaTsKLQl1MzIJCQltZW1vcnlfdHlwZTsJLyogU2VlIGFjcGlfYWRkcmVzc19yYW5nZV9pZCAqLwotCXN0cnVjdCB7Ci0JCXUzMgkJCWVuYWJsZWQ6MTsKLQkJdTMyCQkJaG90X3BsdWdnYWJsZToxOwotCQl1MzIJCQlyZXNlcnZlZDozMDsKLQl9CQkJZmxhZ3M7Ci0JdTY0CQkJcmVzZXJ2ZWQyOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KIGVudW0gYWNwaV9hZGRyZXNzX3JhbmdlX2lkIHsKIAlBQ1BJX0FERFJFU1NfUkFOR0VfTUVNT1JZID0gMSwKIAlBQ1BJX0FERFJFU1NfUkFOR0VfUkVTRVJWRUQgPSAyLApAQCAtMzEzLDg0ICs3MCwxMiBAQAogCUFDUElfQUREUkVTU19SQU5HRV9DT1VOVAogfTsKIAotLyoKLSAqIFN5c3RlbSBMb2NhbGl0eSBJbmZvcm1hdGlvbiBUYWJsZSAoU0xJVCkKLSAqICAgc2VlIGh0dHA6Ly9kZXZyZXNvdXJjZS5ocC5jb20vZGV2cmVzb3VyY2UvZG9jcy90ZWNocGFwZXJzL2lhNjQvc2xpdC5wZGYKLSAqLwotCi1zdHJ1Y3QgYWNwaV90YWJsZV9zbGl0IHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwotCXU2NAkJCWxvY2FsaXRpZXM7Ci0JdTgJCQllbnRyeVsxXTsJLyogcmVhbCBzaXplID0gbG9jYWxpdGllc14yICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogU21hcnQgQmF0dGVyeSBEZXNjcmlwdGlvbiBUYWJsZSAoU0JTVCkgKi8KLQotc3RydWN0IGFjcGlfdGFibGVfc2JzdCB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsKLQl1MzIJCQl3YXJuaW5nOwkvKiBXYXJuIHVzZXIgKi8KLQl1MzIJCQlsb3c7CQkvKiBDcml0aWNhbCBzbGVlcCAqLwotCXUzMgkJCWNyaXRpY2FsOwkvKiBDcml0aWNhbCBzaHV0ZG93biAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIEVtYmVkZGVkIENvbnRyb2xsZXIgQm9vdCBSZXNvdXJjZXMgVGFibGUgKEVDRFQpICovCi0KLXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAJaGVhZGVyOwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcwllY19jb250cm9sOwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcwllY19kYXRhOwotCXUzMgkJCQl1aWQ7Ci0JdTgJCQkJZ3BlX2JpdDsKLQljaGFyCQkJCWVjX2lkWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIFBDSSBNTUNPTkZJRyAqLwotCi0vKiBEZWZpbmVkIGluIFBDSSBGaXJtd2FyZSBTcGVjaWZpY2F0aW9uIDMuMCAqLwotc3RydWN0IGFjcGlfdGFibGVfbWNmZ19jb25maWcgewotCXUzMgkJCQliYXNlX2FkZHJlc3M7Ci0JdTMyCQkJCWJhc2VfcmVzZXJ2ZWQ7Ci0JdTE2CQkJCXBjaV9zZWdtZW50X2dyb3VwX251bWJlcjsKLQl1OAkJCQlzdGFydF9idXNfbnVtYmVyOwotCXU4CQkJCWVuZF9idXNfbnVtYmVyOwotCXU4CQkJCXJlc2VydmVkWzRdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci1zdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIJaGVhZGVyOwotCXU4CQkJCXJlc2VydmVkWzhdOwotCXN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnCWNvbmZpZ1swXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBUYWJsZSBIYW5kbGVycyAqLwogCi1lbnVtIGFjcGlfdGFibGVfaWQgewotCUFDUElfVEFCTEVfVU5LTk9XTiA9IDAsCi0JQUNQSV9BUElDLAotCUFDUElfQk9PVCwKLQlBQ1BJX0RCR1AsCi0JQUNQSV9EU0RULAotCUFDUElfRUNEVCwKLQlBQ1BJX0VURFQsCi0JQUNQSV9GQURULAotCUFDUElfRkFDUywKLQlBQ1BJX09FTVgsCi0JQUNQSV9QU0RULAotCUFDUElfU0JTVCwKLQlBQ1BJX1NMSVQsCi0JQUNQSV9TUENSLAotCUFDUElfU1JBVCwKLQlBQ1BJX1NTRFQsCi0JQUNQSV9TUE1JLAotCUFDUElfSFBFVCwKLQlBQ1BJX01DRkcsCi0JQUNQSV9UQUJMRV9DT1VOVAotfTsKK3R5cGVkZWYgaW50ICgqYWNwaV90YWJsZV9oYW5kbGVyKSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSk7CiAKLXR5cGVkZWYgaW50ICgqYWNwaV90YWJsZV9oYW5kbGVyKSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci0KLWV4dGVybiBhY3BpX3RhYmxlX2hhbmRsZXIgYWNwaV90YWJsZV9vcHNbQUNQSV9UQUJMRV9DT1VOVF07Ci0KLXR5cGVkZWYgaW50ICgqYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIpIChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCk7Cit0eXBlZGVmIGludCAoKmFjcGlfbWFkdF9lbnRyeV9oYW5kbGVyKSAoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKTsKIAogY2hhciAqIF9fYWNwaV9tYXBfdGFibGUgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogdW5zaWduZWQgbG9uZyBhY3BpX2ZpbmRfcnNkcCAodm9pZCk7CkBAIC0zOTksMTQgKzg0LDEyIEBACiBpbnQgYWNwaV9udW1hX2luaXQgKHZvaWQpOwogCiBpbnQgYWNwaV90YWJsZV9pbml0ICh2b2lkKTsKLWludCBhY3BpX3RhYmxlX3BhcnNlIChlbnVtIGFjcGlfdGFibGVfaWQgaWQsIGFjcGlfdGFibGVfaGFuZGxlciBoYW5kbGVyKTsKLWludCBhY3BpX2dldF90YWJsZV9oZWFkZXJfZWFybHkgKGVudW0gYWNwaV90YWJsZV9pZCBpZCwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqaGVhZGVyKTsKLWludCBhY3BpX3RhYmxlX3BhcnNlX21hZHQgKGVudW0gYWNwaV9tYWR0X2VudHJ5X2lkIGlkLCBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpOwotaW50IGFjcGlfdGFibGVfcGFyc2Vfc3JhdCAoZW51bSBhY3BpX3NyYXRfZW50cnlfaWQgaWQsIGFjcGlfbWFkdF9lbnRyeV9oYW5kbGVyIGhhbmRsZXIsIHVuc2lnbmVkIGludCBtYXhfZW50cmllcyk7Ci1pbnQgYWNwaV9wYXJzZV9tY2ZnICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKTsKLXZvaWQgYWNwaV90YWJsZV9wcmludCAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKTsKLXZvaWQgYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5IChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqbWFkdCk7Ci12b2lkIGFjcGlfdGFibGVfcHJpbnRfc3JhdF9lbnRyeSAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKnNyYXQpOworaW50IGFjcGlfdGFibGVfcGFyc2UgKGNoYXIgKmlkLCBhY3BpX3RhYmxlX2hhbmRsZXIgaGFuZGxlcik7CitpbnQgYWNwaV90YWJsZV9wYXJzZV9tYWR0IChlbnVtIGFjcGlfbWFkdF90eXBlIGlkLCBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpOworaW50IGFjcGlfdGFibGVfcGFyc2Vfc3JhdCAoZW51bSBhY3BpX3NyYXRfdHlwZSBpZCwgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKTsKK2ludCBhY3BpX3BhcnNlX21jZmcgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyKTsKK3ZvaWQgYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5IChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKm1hZHQpOwordm9pZCBhY3BpX3RhYmxlX3ByaW50X3NyYXRfZW50cnkgKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqc3JhdCk7CiAKIC8qIHRoZSBmb2xsb3dpbmcgZm91ciBmdW5jdGlvbnMgYXJlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgKi8KICNpZmRlZiBDT05GSUdfSEFWRV9BUkNIX1BBUlNFX1NSQVQKQEAgLTQxNyw4ICsxMDAsOCBAQAogI2RlZmluZSBhY3BpX251bWFfYXJjaF9maXh1cCgpIGRvIHt9IHdoaWxlICgwKQogI2Vsc2UKIHZvaWQgYWNwaV9udW1hX3NsaXRfaW5pdCAoc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqc2xpdCk7Ci12b2lkIGFjcGlfbnVtYV9wcm9jZXNzb3JfYWZmaW5pdHlfaW5pdCAoc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICpwYSk7Ci12b2lkIGFjcGlfbnVtYV9tZW1vcnlfYWZmaW5pdHlfaW5pdCAoc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICptYSk7Cit2b2lkIGFjcGlfbnVtYV9wcm9jZXNzb3JfYWZmaW5pdHlfaW5pdCAoc3RydWN0IGFjcGlfc3JhdF9jcHVfYWZmaW5pdHkgKnBhKTsKK3ZvaWQgYWNwaV9udW1hX21lbW9yeV9hZmZpbml0eV9pbml0IChzdHJ1Y3QgYWNwaV9zcmF0X21lbV9hZmZpbml0eSAqbWEpOwogdm9pZCBhY3BpX251bWFfYXJjaF9maXh1cCh2b2lkKTsKICNlbmRpZgogCkBAIC00MzMsNyArMTE2LDcgQEAKIAogZXh0ZXJuIGludCBhY3BpX21wX2NvbmZpZzsKIAotZXh0ZXJuIHN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnICpwY2lfbW1jZmdfY29uZmlnOworZXh0ZXJuIHN0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiAqcGNpX21tY2ZnX2NvbmZpZzsKIGV4dGVybiBpbnQgcGNpX21tY2ZnX2NvbmZpZ19udW07CiAKIGV4dGVybiBpbnQgc2JmX3BvcnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaAppbmRleCBmNDQyNDdmLi41Y2ExY2RiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKQEAgLTEyNiw2ICsxMjYsNyBAQAogCXN0cnVjdCBrbGlzdF9ub2RlCWtub2RlX2J1czsKIAogCXN0cnVjdCBtb2R1bGUJCSogb3duZXI7CisJY29uc3QgY2hhciAJCSogbW9kX25hbWU7CS8qIHVzZWQgZm9yIGJ1aWx0LWluIG1vZHVsZXMgKi8KIAogCWludAkoKnByb2JlKQkoc3RydWN0IGRldmljZSAqIGRldik7CiAJaW50CSgqcmVtb3ZlKQkoc3RydWN0IGRldmljZSAqIGRldik7CkBAIC0zMjcsNiArMzI4LDEzIEBACiAJCQkJCV9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsNSw2KSkpOwogZXh0ZXJuIHZvaWQgY2xhc3NfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGNsYXNzICpjbHMsIGRldl90IGRldnQpOwogCitzdHJ1Y3QgZGV2aWNlX3R5cGUgeworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyczsKKwlpbnQgKCp1ZXZlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwkJICAgICAgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpOworCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworfTsKKwogLyogaW50ZXJmYWNlIGZvciBleHBvcnRpbmcgZGV2aWNlIGF0dHJpYnV0ZXMgKi8KIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHsKIAlzdHJ1Y3QgYXR0cmlidXRlCWF0dHI7CkBAIC0zNTUsNiArMzYzLDcgQEAKIAogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiAJY2hhcglidXNfaWRbQlVTX0lEX1NJWkVdOwkvKiBwb3NpdGlvbiBvbiBwYXJlbnQgYnVzICovCisJc3RydWN0IGRldmljZV90eXBlCSp0eXBlOwogCXVuc2lnbmVkCQlpc19yZWdpc3RlcmVkOjE7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgdWV2ZW50X2F0dHI7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldnRfYXR0cjsKQEAgLTM5MCw5ICszOTksMTAgQEAKIAogCS8qIGNsYXNzX2RldmljZSBtaWdyYXRpb24gcGF0aCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQlzdHJ1Y3QgY2xhc3MJCSpjbGFzczsJCS8qIG9wdGlvbmFsKi8KKwlzdHJ1Y3QgY2xhc3MJCSpjbGFzczsKIAlkZXZfdAkJCWRldnQ7CQkvKiBkZXZfdCwgY3JlYXRlcyB0aGUgc3lzZnMgImRldiIgKi8KIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCSoqZ3JvdXBzOwkvKiBvcHRpb25hbCBncm91cHMgKi8KKwlpbnQJCQl1ZXZlbnRfc3VwcHJlc3M7CiAKIAl2b2lkCSgqcmVsZWFzZSkoc3RydWN0IGRldmljZSAqIGRldik7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZGUuaCBiL2luY2x1ZGUvbGludXgvaWRlLmgKaW5kZXggZTI2YTAzOS4uODI3Njg4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkZS5oCkBAIC0xMTkyLDggKzExOTIsOCBAQAogZXh0ZXJuIGludCBpZGVwcm9iZV9pbml0KHZvaWQpOwogCiBleHRlcm4gdm9pZCBpZGVfc2Nhbl9wY2lidXMoaW50IHNjYW5fZGlyZWN0aW9uKSBfX2luaXQ7Ci1leHRlcm4gaW50IF9faWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBjaV9kcml2ZXIgKmRyaXZlciwgc3RydWN0IG1vZHVsZSAqb3duZXIpOwotI2RlZmluZSBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcihkKSBfX2lkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKGQsIFRISVNfTU9EVUxFKQorZXh0ZXJuIGludCBfX2lkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwY2lfZHJpdmVyICpkcml2ZXIsIHN0cnVjdCBtb2R1bGUgKm93bmVyLCBjb25zdCBjaGFyICptb2RfbmFtZSk7CisjZGVmaW5lIGlkZV9wY2lfcmVnaXN0ZXJfZHJpdmVyKGQpIF9faWRlX3BjaV9yZWdpc3Rlcl9kcml2ZXIoZCwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKQogdm9pZCBpZGVfcGNpX3NldHVwX3BvcnRzKHN0cnVjdCBwY2lfZGV2ICosIHN0cnVjdCBpZGVfcGNpX2RldmljZV9zICosIGludCwgYXRhX2luZGV4X3QgKik7CiBleHRlcm4gdm9pZCBpZGVfc2V0dXBfcGNpX25vaXNlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgaWRlX3BjaV9kZXZpY2VfcyAqZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva29iamVjdC5oIGIvaW5jbHVkZS9saW51eC9rb2JqZWN0LmgKaW5kZXggNzY1MzhmYy4uYjg1MGUwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rb2JqZWN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9rb2JqZWN0LmgKQEAgLTc0LDkgKzc0LDEzIEBACiBleHRlcm4gdm9pZCBrb2JqZWN0X2NsZWFudXAoc3RydWN0IGtvYmplY3QgKik7CiAKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGtvYmplY3RfYWRkKHN0cnVjdCBrb2JqZWN0ICopOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sga29iamVjdF9zaGFkb3dfYWRkKHN0cnVjdCBrb2JqZWN0ICosIHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gdm9pZCBrb2JqZWN0X2RlbChzdHJ1Y3Qga29iamVjdCAqKTsKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sga29iamVjdF9yZW5hbWUoc3RydWN0IGtvYmplY3QgKiwgY29uc3QgY2hhciAqbmV3X25hbWUpOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sga29iamVjdF9zaGFkb3dfcmVuYW1lKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkJc3RydWN0IGRlbnRyeSAqbmV3X3BhcmVudCwKKwkJCQkJCWNvbnN0IGNoYXIgKm5ld19uYW1lKTsKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIGtvYmplY3RfbW92ZShzdHJ1Y3Qga29iamVjdCAqLCBzdHJ1Y3Qga29iamVjdCAqKTsKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sga29iamVjdF9yZWdpc3RlcihzdHJ1Y3Qga29iamVjdCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kdWxlLmggYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCmluZGV4IDEwZjc3MWEuLjQxOWQzZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaApAQCAtNTgsNiArNTgsNyBAQAogewogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiAJc3RydWN0IG1vZHVsZSAqbW9kOworCXN0cnVjdCBrb2JqZWN0ICpkcml2ZXJzX2RpcjsKIH07CiAKIC8qIFRoZXNlIGFyZSBlaXRoZXIgbW9kdWxlIGxvY2FsLCBvciB0aGUga2VybmVsJ3MgZHVtbXkgb25lcy4gKi8KQEAgLTI2Myw3ICsyNjQsNyBAQAogCXN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICptb2RpbmZvX2F0dHJzOwogCWNvbnN0IGNoYXIgKnZlcnNpb247CiAJY29uc3QgY2hhciAqc3JjdmVyc2lvbjsKLQlzdHJ1Y3Qga29iamVjdCAqZHJpdmVyc19kaXI7CisJc3RydWN0IGtvYmplY3QgKmhvbGRlcnNfZGlyOwogCiAJLyogRXhwb3J0ZWQgc3ltYm9scyAqLwogCWNvbnN0IHN0cnVjdCBrZXJuZWxfc3ltYm9sICpzeW1zOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggZmVhMGQ5ZC4uMmUzN2Y1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC01MjksMTAgKzUyOSwxMSBAQAogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQJKmJyX3BvcnQ7CiAKIAkvKiBjbGFzcy9uZXQvbmFtZSBlbnRyeSAqLwotCXN0cnVjdCBjbGFzc19kZXZpY2UJY2xhc3NfZGV2OworCXN0cnVjdCBkZXZpY2UJCWRldjsKIAkvKiBzcGFjZSBmb3Igb3B0aW9uYWwgc3RhdGlzdGljcyBhbmQgd2lyZWxlc3Mgc3lzZnMgZ3JvdXBzICovCiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAgKnN5c2ZzX2dyb3Vwc1szXTsKIH07CisjZGVmaW5lIHRvX25ldF9kZXYoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBuZXRfZGV2aWNlLCBkZXYpCiAKICNkZWZpbmUJTkVUREVWX0FMSUdOCQkzMgogI2RlZmluZQlORVRERVZfQUxJR05fQ09OU1QJKE5FVERFVl9BTElHTiAtIDEpCkBAIC01NDgsNyArNTQ5LDcgQEAKIC8qIFNldCB0aGUgc3lzZnMgcGh5c2ljYWwgZGV2aWNlIHJlZmVyZW5jZSBmb3IgdGhlIG5ldHdvcmsgbG9naWNhbCBkZXZpY2UKICAqIGlmIHNldCBwcmlvciB0byByZWdpc3RyYXRpb24gd2lsbCBjYXVzZSBhIHN5bWxpbmsgZHVyaW5nIGluaXRpYWxpemF0aW9uLgogICovCi0jZGVmaW5lIFNFVF9ORVRERVZfREVWKG5ldCwgcGRldikJKChuZXQpLT5jbGFzc19kZXYuZGV2ID0gKHBkZXYpKQorI2RlZmluZSBTRVRfTkVUREVWX0RFVihuZXQsIHBkZXYpCSgobmV0KS0+ZGV2LnBhcmVudCA9IChwZGV2KSkKIAogc3RydWN0IHBhY2tldF90eXBlIHsKIAlfX2JlMTYJCQl0eXBlOwkvKiBUaGlzIGlzIHJlYWxseSBodG9ucyhldGhlcl90eXBlKS4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IGYzYzYxN2UuLmNiODk5ZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtNTczLDEwICs1NzMsMTEgQEAKIHZvaWQgcGNpX2VuYWJsZV9icmlkZ2VzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKiBQcm9wZXIgcHJvYmluZyBzdXBwb3J0aW5nIGhvdC1wbHVnZ2FibGUgZGV2aWNlcyAqLwotaW50IF9fbXVzdF9jaGVjayBfX3BjaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBjaV9kcml2ZXIgKiwgc3RydWN0IG1vZHVsZSAqKTsKK2ludCBfX211c3RfY2hlY2sgX19wY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwY2lfZHJpdmVyICosIHN0cnVjdCBtb2R1bGUgKiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbW9kX25hbWUpOwogc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIHBjaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBjaV9kcml2ZXIgKmRyaXZlcikKIHsKLQlyZXR1cm4gX19wY2lfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlciwgVEhJU19NT0RVTEUpOworCXJldHVybiBfX3BjaV9yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyLCBUSElTX01PRFVMRSwgS0JVSUxEX01PRE5BTUUpOwogfQogCiB2b2lkIHBjaV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcGNpX2RyaXZlciAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggY2NkNzA2Zi4uNWI0ZjFlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTIwNzAsNiArMjA3MCw4IEBACiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfVERJICAgICAgICAgICAgICAgMHgxOTJFCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVERJX0VIQ0kgICAgICAgICAgMHgwMTAxCiAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9QQVNFTUkJCTB4MTk1OQorCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfSk1JQ1JPTgkJMHgxOTdCCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzNjAJMHgyMzYwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUIzNjEJMHgyMzYxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlvLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKaW5kZXggMGY0NzhhOC4uYWMyYzcwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpby5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaW8uaApAQCAtODYsNiArODYsMTEgQEAKIHZvaWQgc2VyaW9fdW5yZWdpc3Rlcl9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pOwogdm9pZCBzZXJpb191bnJlZ2lzdGVyX2NoaWxkX3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbyk7CiAKK2ludCBfX3NlcmlvX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgc2VyaW9fZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyLCBjb25zdCBjaGFyICptb2RfbmFtZSk7CitzdGF0aWMgaW5saW5lIGludCBzZXJpb19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQoreworCXJldHVybiBfX3NlcmlvX3JlZ2lzdGVyX2RyaXZlcihkcnYsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSk7Cit9CiBpbnQgc2VyaW9fcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydik7CiB2b2lkIHNlcmlvX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKaW5kZXggMTc2ZjZlMy4uOGMyZWRkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKQEAgLTE3MCw3ICsxNzAsNyBAQAogICogbWVzc2FnZSdzIGNvbXBsZXRpb24gZnVuY3Rpb24gd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29tcGxldGVzLgogICovCiBzdHJ1Y3Qgc3BpX21hc3RlciB7Ci0Jc3RydWN0IGNsYXNzX2RldmljZQljZGV2OworCXN0cnVjdCBkZXZpY2UJCWRldjsKIAogCS8qIG90aGVyIHRoYW4gbmVnYXRpdmUgKD09IGFzc2lnbiBvbmUgZHluYW1pY2FsbHkpLCBidXNfbnVtIGlzIGZ1bGx5CiAJICogYm9hcmQtc3BlY2lmaWMuICB1c3VhbGx5IHRoYXQgc2ltcGxpZmllcyB0byBiZWluZyBTT0Mtc3BlY2lmaWMuCkBAIC0yMTYsMTcgKzIxNiwxNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgKnNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKIHsKLQlyZXR1cm4gY2xhc3NfZ2V0X2RldmRhdGEoJm1hc3Rlci0+Y2Rldik7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSgmbWFzdGVyLT5kZXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3BpX21hc3Rlcl9zZXRfZGV2ZGF0YShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCB2b2lkICpkYXRhKQogewotCWNsYXNzX3NldF9kZXZkYXRhKCZtYXN0ZXItPmNkZXYsIGRhdGEpOworCWRldl9zZXRfZHJ2ZGF0YSgmbWFzdGVyLT5kZXYsIGRhdGEpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzcGlfbWFzdGVyICpzcGlfbWFzdGVyX2dldChzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQogewotCWlmICghbWFzdGVyIHx8ICFjbGFzc19kZXZpY2VfZ2V0KCZtYXN0ZXItPmNkZXYpKQorCWlmICghbWFzdGVyIHx8ICFnZXRfZGV2aWNlKCZtYXN0ZXItPmRldikpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBtYXN0ZXI7CiB9CkBAIC0yMzQsNyArMjM0LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzcGlfbWFzdGVyX3B1dChzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQogewogCWlmIChtYXN0ZXIpCi0JCWNsYXNzX2RldmljZV9wdXQoJm1hc3Rlci0+Y2Rldik7CisJCXB1dF9kZXZpY2UoJm1hc3Rlci0+ZGV2KTsKIH0KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKaW5kZXggMjEyOWQxYi4uMTkyZGUzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzZnMuaApAQCAtMTEsMTAgKzExLDEyIEBACiAjZGVmaW5lIF9TWVNGU19IXwogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiBzdHJ1Y3Qga29iamVjdDsKIHN0cnVjdCBtb2R1bGU7CitzdHJ1Y3QgbmFtZWlkYXRhOwogCiBzdHJ1Y3QgYXR0cmlidXRlIHsKIAljb25zdCBjaGFyCQkqIG5hbWU7CkBAIC04OCwxMyArOTAsMTMgQEAKICNpZmRlZiBDT05GSUdfU1lTRlMKIAogZXh0ZXJuIGludCBfX211c3RfY2hlY2sKLXN5c2ZzX2NyZWF0ZV9kaXIoc3RydWN0IGtvYmplY3QgKik7CitzeXNmc19jcmVhdGVfZGlyKHN0cnVjdCBrb2JqZWN0ICosIHN0cnVjdCBkZW50cnkgKik7CiAKIGV4dGVybiB2b2lkCiBzeXNmc19yZW1vdmVfZGlyKHN0cnVjdCBrb2JqZWN0ICopOwogCiBleHRlcm4gaW50IF9fbXVzdF9jaGVjawotc3lzZnNfcmVuYW1lX2RpcihzdHJ1Y3Qga29iamVjdCAqLCBjb25zdCBjaGFyICpuZXdfbmFtZSk7CitzeXNmc19yZW5hbWVfZGlyKHN0cnVjdCBrb2JqZWN0ICosIHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqbmV3X25hbWUpOwogCiBleHRlcm4gaW50IF9fbXVzdF9jaGVjawogc3lzZnNfbW92ZV9kaXIoc3RydWN0IGtvYmplY3QgKiwgc3RydWN0IGtvYmplY3QgKik7CkBAIC0xMjYsMTEgKzEyOCwxNyBAQAogdm9pZCBzeXNmc19yZW1vdmVfZ3JvdXAoc3RydWN0IGtvYmplY3QgKiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKTsKIHZvaWQgc3lzZnNfbm90aWZ5KHN0cnVjdCBrb2JqZWN0ICogaywgY2hhciAqZGlyLCBjaGFyICphdHRyKTsKIAorCitleHRlcm4gaW50IHN5c2ZzX21ha2Vfc2hhZG93ZWRfZGlyKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCXZvaWQgKiAoKmZvbGxvd19saW5rKShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKikpOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKnN5c2ZzX2NyZWF0ZV9zaGFkb3dfZGlyKHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKK2V4dGVybiB2b2lkIHN5c2ZzX3JlbW92ZV9zaGFkb3dfZGlyKHN0cnVjdCBkZW50cnkgKmRpcik7CisKIGV4dGVybiBpbnQgX19tdXN0X2NoZWNrIHN5c2ZzX2luaXQodm9pZCk7CiAKICNlbHNlIC8qIENPTkZJR19TWVNGUyAqLwogCi1zdGF0aWMgaW5saW5lIGludCBzeXNmc19jcmVhdGVfZGlyKHN0cnVjdCBrb2JqZWN0ICogaykKK3N0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX2NyZWF0ZV9kaXIoc3RydWN0IGtvYmplY3QgKiBrLCBzdHJ1Y3QgZGVudHJ5ICpzaGFkb3cpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDAsNyArMTQ4LDkgQEAKIAk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX3JlbmFtZV9kaXIoc3RydWN0IGtvYmplY3QgKiBrLCBjb25zdCBjaGFyICpuZXdfbmFtZSkKK3N0YXRpYyBpbmxpbmUgaW50IHN5c2ZzX3JlbmFtZV9kaXIoc3RydWN0IGtvYmplY3QgKiBrLAorCQkJCQlzdHJ1Y3QgZGVudHJ5ICpuZXdfcGFyZW50LAorCQkJCQljb25zdCBjaGFyICpuZXdfbmFtZSkKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTIwNCw2ICsyMTQsMTIgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgc3lzZnNfbWFrZV9zaGFkb3dlZF9kaXIoc3RydWN0IGtvYmplY3QgKmtvYmosCisJdm9pZCAqICgqZm9sbG93X2xpbmspKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKSkKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIHN5c2ZzX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiLmggYi9pbmNsdWRlL2xpbnV4L3VzYi5oCmluZGV4IDNiMDhhYjMuLmI1YzIyNmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IuaApAQCAtODkzLDEwICs4OTMsMTEgQEAKICAqIHVzZSB0aGVzZSBpbiBtb2R1bGVfaW5pdCgpL21vZHVsZV9leGl0KCkKICAqIGFuZCBkb24ndCBmb3JnZXQgTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIC4uLikKICAqLwotZXh0ZXJuIGludCB1c2JfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZHJpdmVyICosIHN0cnVjdCBtb2R1bGUgKik7CitleHRlcm4gaW50IHVzYl9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9kcml2ZXIgKiwgc3RydWN0IG1vZHVsZSAqLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgaW5saW5lIGludCB1c2JfcmVnaXN0ZXIoc3RydWN0IHVzYl9kcml2ZXIgKmRyaXZlcikKIHsKLQlyZXR1cm4gdXNiX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFLCBLQlVJTERfTU9ETkFNRSk7CiB9CiBleHRlcm4gdm9pZCB1c2JfZGVyZWdpc3RlcihzdHJ1Y3QgdXNiX2RyaXZlciAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aWRlb19vdXRwdXQuaCBiL2luY2x1ZGUvbGludXgvdmlkZW9fb3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzZTBjMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdmlkZW9fb3V0cHV0LmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IEx1bWluZyBZdSA8bHVtaW5nLnl1QGludGVsLmNvbT4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqLworI2lmbmRlZiBfTElOVVhfVklERU9fT1VUUFVUX0gKKyNkZWZpbmUgX0xJTlVYX1ZJREVPX09VVFBVVF9ICisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CitzdHJ1Y3Qgb3V0cHV0X2RldmljZTsKK3N0cnVjdCBvdXRwdXRfcHJvcGVydGllcyB7CisJaW50ICgqc2V0X3N0YXRlKShzdHJ1Y3Qgb3V0cHV0X2RldmljZSAqKTsKKwlpbnQgKCpnZXRfc3RhdHVzKShzdHJ1Y3Qgb3V0cHV0X2RldmljZSAqKTsKK307CitzdHJ1Y3Qgb3V0cHV0X2RldmljZSB7CisJaW50IHJlcXVlc3Rfc3RhdGU7CisJc3RydWN0IG91dHB1dF9wcm9wZXJ0aWVzICpwcm9wczsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlIGNsYXNzX2RldjsKK307CisjZGVmaW5lIHRvX291dHB1dF9kZXZpY2Uob2JqKSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3Qgb3V0cHV0X2RldmljZSwgY2xhc3NfZGV2KQorc3RydWN0IG91dHB1dF9kZXZpY2UgKnZpZGVvX291dHB1dF9yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lLAorCXN0cnVjdCBkZXZpY2UgKmRldiwKKwl2b2lkICpkZXZkYXRhLAorCXN0cnVjdCBvdXRwdXRfcHJvcGVydGllcyAqb3ApOwordm9pZCB2aWRlb19vdXRwdXRfdW5yZWdpc3RlcihzdHJ1Y3Qgb3V0cHV0X2RldmljZSAqZGV2KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvc3MuaCBiL2luY2x1ZGUvcGNtY2lhL3NzLmgKaW5kZXggNjIzYTBmYy4uNmU4NDI1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvc3MuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9zcy5oCkBAIC0yODQsNyArMjg0LDcgQEAKICNlbmRpZgogCiAJLyogc29ja2V0IGRldmljZSAqLwotCXN0cnVjdCBjbGFzc19kZXZpY2UJCWRldjsKKwlzdHJ1Y3QgZGV2aWNlCQkJZGV2OwogCXZvaWQJCQkJKmRyaXZlcl9kYXRhOwkvKiBkYXRhIGludGVybmFsIHRvIHRoZSBzb2NrZXQgZHJpdmVyICovCiAKIH07CmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlLmMgYi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZDBmMjI2MC4uOGE5NGUwNSAxMDA2NDQKLS0tIGEva2VybmVsL21vZHVsZS5jCisrKyBiL2tlcm5lbC9tb2R1bGUuYwpAQCAtNTM3LDYgKzUzNyw4IEBACiBzdGF0aWMgaW50IHVzZV9tb2R1bGUoc3RydWN0IG1vZHVsZSAqYSwgc3RydWN0IG1vZHVsZSAqYikKIHsKIAlzdHJ1Y3QgbW9kdWxlX3VzZSAqdXNlOworCWludCBub193YXJuOworCiAJaWYgKGIgPT0gTlVMTCB8fCBhbHJlYWR5X3VzZXMoYSwgYikpIHJldHVybiAxOwogCiAJaWYgKCFzdHJvbmdfdHJ5X21vZHVsZV9nZXQoYikpCkBAIC01NTIsNiArNTU0LDcgQEAKIAogCXVzZS0+bW9kdWxlX3doaWNoX3VzZXMgPSBhOwogCWxpc3RfYWRkKCZ1c2UtPmxpc3QsICZiLT5tb2R1bGVzX3doaWNoX3VzZV9tZSk7CisJbm9fd2FybiA9IHN5c2ZzX2NyZWF0ZV9saW5rKGItPmhvbGRlcnNfZGlyLCAmYS0+bWtvYmoua29iaiwgYS0+bmFtZSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTU2OSw2ICs1NzIsNyBAQAogCQkJCW1vZHVsZV9wdXQoaSk7CiAJCQkJbGlzdF9kZWwoJnVzZS0+bGlzdCk7CiAJCQkJa2ZyZWUodXNlKTsKKwkJCQlzeXNmc19yZW1vdmVfbGluayhpLT5ob2xkZXJzX2RpciwgbW9kLT5uYW1lKTsKIAkJCQkvKiBUaGVyZSBjYW4gYmUgYXQgbW9zdCBvbmUgbWF0Y2guICovCiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xMTA2LDkgKzExMTAsNyBAQAogCWtmcmVlKG1vZC0+bW9kaW5mb19hdHRycyk7CiB9CiAKLXN0YXRpYyBpbnQgbW9kX3N5c2ZzX3NldHVwKHN0cnVjdCBtb2R1bGUgKm1vZCwKLQkJCSAgIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwYXJhbSwKLQkJCSAgIHVuc2lnbmVkIGludCBudW1fcGFyYW1zKQorc3RhdGljIGludCBtb2Rfc3lzZnNfaW5pdChzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CiAJaW50IGVycjsKIApAQCAtMTEyNSwyMSArMTEyNywzMCBAQAogCWtvYmpfc2V0X2tzZXRfcygmbW9kLT5ta29iaiwgbW9kdWxlX3N1YnN5cyk7CiAJbW9kLT5ta29iai5tb2QgPSBtb2Q7CiAKLQkvKiBkZWxheSB1ZXZlbnQgdW50aWwgZnVsbCBzeXNmcyBwb3B1bGF0aW9uICovCiAJa29iamVjdF9pbml0KCZtb2QtPm1rb2JqLmtvYmopOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtb2Rfc3lzZnNfc2V0dXAoc3RydWN0IG1vZHVsZSAqbW9kLAorCQkJICAgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3BhcmFtLAorCQkJICAgdW5zaWduZWQgaW50IG51bV9wYXJhbXMpCit7CisJaW50IGVycjsKKworCS8qIGRlbGF5IHVldmVudCB1bnRpbCBmdWxsIHN5c2ZzIHBvcHVsYXRpb24gKi8KIAllcnIgPSBrb2JqZWN0X2FkZCgmbW9kLT5ta29iai5rb2JqKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCW1vZC0+ZHJpdmVyc19kaXIgPSBrb2JqZWN0X2FkZF9kaXIoJm1vZC0+bWtvYmoua29iaiwgImRyaXZlcnMiKTsKLQlpZiAoIW1vZC0+ZHJpdmVyc19kaXIpIHsKLQkJZXJyID0gLUVOT01FTTsKKwltb2QtPmhvbGRlcnNfZGlyID0ga29iamVjdF9hZGRfZGlyKCZtb2QtPm1rb2JqLmtvYmosICJob2xkZXJzIik7CisJaWYgKCFtb2QtPmhvbGRlcnNfZGlyKQogCQlnb3RvIG91dF91bnJlZzsKLQl9CiAKIAllcnIgPSBtb2R1bGVfcGFyYW1fc3lzZnNfc2V0dXAobW9kLCBrcGFyYW0sIG51bV9wYXJhbXMpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X3VucmVnX2RyaXZlcnM7CisJCWdvdG8gb3V0X3VucmVnX2hvbGRlcnM7CiAKIAllcnIgPSBtb2R1bGVfYWRkX21vZGluZm9fYXR0cnMobW9kKTsKIAlpZiAoZXJyKQpAQCAtMTE1MCw4ICsxMTYxLDggQEAKIAogb3V0X3VucmVnX3BhcmFtOgogCW1vZHVsZV9wYXJhbV9zeXNmc19yZW1vdmUobW9kKTsKLW91dF91bnJlZ19kcml2ZXJzOgotCWtvYmplY3RfdW5yZWdpc3Rlcihtb2QtPmRyaXZlcnNfZGlyKTsKK291dF91bnJlZ19ob2xkZXJzOgorCWtvYmplY3RfdW5yZWdpc3Rlcihtb2QtPmhvbGRlcnNfZGlyKTsKIG91dF91bnJlZzoKIAlrb2JqZWN0X2RlbCgmbW9kLT5ta29iai5rb2JqKTsKIAlrb2JqZWN0X3B1dCgmbW9kLT5ta29iai5rb2JqKTsKQEAgLTExNjMsNyArMTE3NCwxMCBAQAogewogCW1vZHVsZV9yZW1vdmVfbW9kaW5mb19hdHRycyhtb2QpOwogCW1vZHVsZV9wYXJhbV9zeXNmc19yZW1vdmUobW9kKTsKLQlrb2JqZWN0X3VucmVnaXN0ZXIobW9kLT5kcml2ZXJzX2Rpcik7CisJaWYgKG1vZC0+bWtvYmouZHJpdmVyc19kaXIpCisJCWtvYmplY3RfdW5yZWdpc3Rlcihtb2QtPm1rb2JqLmRyaXZlcnNfZGlyKTsKKwlpZiAobW9kLT5ob2xkZXJzX2RpcikKKwkJa29iamVjdF91bnJlZ2lzdGVyKG1vZC0+aG9sZGVyc19kaXIpOwogCiAJa29iamVjdF91bnJlZ2lzdGVyKCZtb2QtPm1rb2JqLmtvYmopOwogfQpAQCAtMTc2OCw2ICsxNzgyLDEwIEBACiAJLyogTm93IHdlJ3ZlIG1vdmVkIG1vZHVsZSwgaW5pdGlhbGl6ZSBsaW5rZWQgbGlzdHMsIGV0Yy4gKi8KIAltb2R1bGVfdW5sb2FkX2luaXQobW9kKTsKIAorCS8qIEluaXRpYWxpemUga29iamVjdCwgc28gd2UgY2FuIHJlZmVyZW5jZSBpdC4gKi8KKwlpZiAobW9kX3N5c2ZzX2luaXQobW9kKSAhPSAwKQorCQlnb3RvIGNsZWFudXA7CisKIAkvKiBTZXQgdXAgbGljZW5zZSBpbmZvIGJhc2VkIG9uIHRoZSBpbmZvIHNlY3Rpb24gKi8KIAlzZXRfbGljZW5zZShtb2QsIGdldF9tb2RpbmZvKHNlY2hkcnMsIGluZm9pbmRleCwgImxpY2Vuc2UiKSk7CiAKQEAgLTIzNDAsMTkgKzIzNTgsNDMgQEAKIAlyZXR1cm4gZHJpdmVyX25hbWU7CiB9CiAKK3N0YXRpYyB2b2lkIG1vZHVsZV9jcmVhdGVfZHJpdmVyc19kaXIoc3RydWN0IG1vZHVsZV9rb2JqZWN0ICptaykKK3sKKwlpZiAoIW1rIHx8IG1rLT5kcml2ZXJzX2RpcikKKwkJcmV0dXJuOworCisJbWstPmRyaXZlcnNfZGlyID0ga29iamVjdF9hZGRfZGlyKCZtay0+a29iaiwgImRyaXZlcnMiKTsKK30KKwogdm9pZCBtb2R1bGVfYWRkX2RyaXZlcihzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCiB7CiAJY2hhciAqZHJpdmVyX25hbWU7CiAJaW50IG5vX3dhcm47CisJc3RydWN0IG1vZHVsZV9rb2JqZWN0ICptayA9IE5VTEw7CiAKLQlpZiAoIW1vZCB8fCAhZHJ2KQorCWlmICghZHJ2KQorCQlyZXR1cm47CisKKwlpZiAobW9kKQorCQltayA9ICZtb2QtPm1rb2JqOworCWVsc2UgaWYgKGRydi0+bW9kX25hbWUpIHsKKwkJc3RydWN0IGtvYmplY3QgKm1rb2JqOworCisJCS8qIExvb2t1cCBidWlsdC1pbiBtb2R1bGUgZW50cnkgaW4gL3N5cy9tb2R1bGVzICovCisJCW1rb2JqID0ga3NldF9maW5kX29iaigmbW9kdWxlX3N1YnN5cy5rc2V0LCBkcnYtPm1vZF9uYW1lKTsKKwkJaWYgKG1rb2JqKQorCQkJbWsgPSBjb250YWluZXJfb2YobWtvYmosIHN0cnVjdCBtb2R1bGVfa29iamVjdCwga29iaik7CisJfQorCisJaWYgKCFtaykKIAkJcmV0dXJuOwogCiAJLyogRG9uJ3QgY2hlY2sgcmV0dXJuIGNvZGVzOyB0aGVzZSBjYWxscyBhcmUgaWRlbXBvdGVudCAqLwotCW5vX3dhcm4gPSBzeXNmc19jcmVhdGVfbGluaygmZHJ2LT5rb2JqLCAmbW9kLT5ta29iai5rb2JqLCAibW9kdWxlIik7CisJbm9fd2FybiA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZkcnYtPmtvYmosICZtay0+a29iaiwgIm1vZHVsZSIpOwogCWRyaXZlcl9uYW1lID0gbWFrZV9kcml2ZXJfbmFtZShkcnYpOwogCWlmIChkcml2ZXJfbmFtZSkgewotCQlub193YXJuID0gc3lzZnNfY3JlYXRlX2xpbmsobW9kLT5kcml2ZXJzX2RpciwgJmRydi0+a29iaiwKKwkJbW9kdWxlX2NyZWF0ZV9kcml2ZXJzX2Rpcihtayk7CisJCW5vX3dhcm4gPSBzeXNmc19jcmVhdGVfbGluayhtay0+ZHJpdmVyc19kaXIsICZkcnYtPmtvYmosCiAJCQkJCSAgICBkcml2ZXJfbmFtZSk7CiAJCWtmcmVlKGRyaXZlcl9uYW1lKTsKIAl9CkBAIC0yMzY3LDEwICsyNDA5LDEwIEBACiAJCXJldHVybjsKIAogCXN5c2ZzX3JlbW92ZV9saW5rKCZkcnYtPmtvYmosICJtb2R1bGUiKTsKLQlpZiAoZHJ2LT5vd25lciAmJiBkcnYtPm93bmVyLT5kcml2ZXJzX2RpcikgeworCWlmIChkcnYtPm93bmVyICYmIGRydi0+b3duZXItPm1rb2JqLmRyaXZlcnNfZGlyKSB7CiAJCWRyaXZlcl9uYW1lID0gbWFrZV9kcml2ZXJfbmFtZShkcnYpOwogCQlpZiAoZHJpdmVyX25hbWUpIHsKLQkJCXN5c2ZzX3JlbW92ZV9saW5rKGRydi0+b3duZXItPmRyaXZlcnNfZGlyLAorCQkJc3lzZnNfcmVtb3ZlX2xpbmsoZHJ2LT5vd25lci0+bWtvYmouZHJpdmVyc19kaXIsCiAJCQkJCSAgZHJpdmVyX25hbWUpOwogCQkJa2ZyZWUoZHJpdmVyX25hbWUpOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvcGFyYW1zLmMgYi9rZXJuZWwvcGFyYW1zLmMKaW5kZXggNzE4OTQ1ZC4uNTUzY2Y3ZCAxMDA2NDQKLS0tIGEva2VybmVsL3BhcmFtcy5jCisrKyBiL2tlcm5lbC9wYXJhbXMuYwpAQCAtMzAsNiArMzAsOCBAQAogI2RlZmluZSBERUJVR1AoZm10LCBhLi4uKQogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIG1vZHVsZV9rdHlwZTsKKwogc3RhdGljIGlubGluZSBjaGFyIGRhc2gydW5kZXJzY29yZShjaGFyIGMpCiB7CiAJaWYgKGMgPT0gJy0nKQpAQCAtNTYxLDE0ICs1NjMsMTEgQEAKIAltay0+bW9kID0gVEhJU19NT0RVTEU7CiAJa29ial9zZXRfa3NldF9zKG1rLCBtb2R1bGVfc3Vic3lzKTsKIAlrb2JqZWN0X3NldF9uYW1lKCZtay0+a29iaiwgbmFtZSk7Ci0JcmV0ID0ga29iamVjdF9yZWdpc3RlcigmbWstPmtvYmopOworCWtvYmplY3RfaW5pdCgmbWstPmtvYmopOworCXJldCA9IGtvYmplY3RfYWRkKCZtay0+a29iaik7CiAJQlVHX09OKHJldCA8IDApOwotCi0JLyogbm8gbmVlZCB0byBrZWVwIHRoZSBrb2JqZWN0IGlmIG5vIHBhcmFtZXRlciBpcyBleHBvcnRlZCAqLwotCWlmICghcGFyYW1fc3lzZnNfc2V0dXAobWssIGtwYXJhbSwgbnVtX3BhcmFtcywgbmFtZV9za2lwKSkgewotCQlrb2JqZWN0X3VucmVnaXN0ZXIoJm1rLT5rb2JqKTsKLQkJa2ZyZWUobWspOwotCX0KKwlwYXJhbV9zeXNmc19zZXR1cChtaywga3BhcmFtLCBudW1fcGFyYW1zLCBuYW1lX3NraXApOworCWtvYmplY3RfdWV2ZW50KCZtay0+a29iaiwgS09CSl9BREQpOwogfQogCiAvKgpAQCAtNjc0LDYgKzY3MywxOSBAQAogCS5zdG9yZSA9IG1vZHVsZV9hdHRyX3N0b3JlLAogfTsKIAorc3RhdGljIGludCB1ZXZlbnRfZmlsdGVyKHN0cnVjdCBrc2V0ICprc2V0LCBzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3Qga29ial90eXBlICprdHlwZSA9IGdldF9rdHlwZShrb2JqKTsKKworCWlmIChrdHlwZSA9PSAmbW9kdWxlX2t0eXBlKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBrc2V0X3VldmVudF9vcHMgbW9kdWxlX3VldmVudF9vcHMgPSB7CisJLmZpbHRlciA9IHVldmVudF9maWx0ZXIsCit9OworCiAjZWxzZQogc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgbW9kdWxlX3N5c2ZzX29wcyA9IHsKIAkuc2hvdyA9IE5VTEwsCkBAIC02ODUsNyArNjk3LDcgQEAKIAkuc3lzZnNfb3BzID0JJm1vZHVsZV9zeXNmc19vcHMsCiB9OwogCi1kZWNsX3N1YnN5cyhtb2R1bGUsICZtb2R1bGVfa3R5cGUsIE5VTEwpOworZGVjbF9zdWJzeXMobW9kdWxlLCAmbW9kdWxlX2t0eXBlLCAmbW9kdWxlX3VldmVudF9vcHMpOwogCiAvKgogICogcGFyYW1fc3lzZnNfaW5pdCAtIHdyYXBwZXIgZm9yIGJ1aWx0LWluIHBhcmFtcyBzdXBwb3J0CmRpZmYgLS1naXQgYS9saWIva29iamVjdC5jIGIvbGliL2tvYmplY3QuYwppbmRleCA3Y2U2ZGMxLi5jMjkxN2ZmZSAxMDA2NDQKLS0tIGEvbGliL2tvYmplY3QuYworKysgYi9saWIva29iamVjdC5jCkBAIC00NCwxMSArNDQsMTEgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgY3JlYXRlX2RpcihzdHJ1Y3Qga29iamVjdCAqIGtvYmopCitzdGF0aWMgaW50IGNyZWF0ZV9kaXIoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgZGVudHJ5ICpzaGFkb3dfcGFyZW50KQogewogCWludCBlcnJvciA9IDA7CiAJaWYgKGtvYmplY3RfbmFtZShrb2JqKSkgewotCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9kaXIoa29iaik7CisJCWVycm9yID0gc3lzZnNfY3JlYXRlX2Rpcihrb2JqLCBzaGFkb3dfcGFyZW50KTsKIAkJaWYgKCFlcnJvcikgewogCQkJaWYgKChlcnJvciA9IHBvcHVsYXRlX2Rpcihrb2JqKSkpCiAJCQkJc3lzZnNfcmVtb3ZlX2Rpcihrb2JqKTsKQEAgLTEyNiw2ICsxMjYsOCBAQAogICovCiB2b2lkIGtvYmplY3RfaW5pdChzdHJ1Y3Qga29iamVjdCAqIGtvYmopCiB7CisJaWYgKCFrb2JqKQorCQlyZXR1cm47CiAJa3JlZl9pbml0KCZrb2JqLT5rcmVmKTsKIAlJTklUX0xJU1RfSEVBRCgma29iai0+ZW50cnkpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmtvYmotPnBvbGwpOwpAQCAtMTU2LDkgKzE1OCwxMCBAQAogLyoqCiAgKglrb2JqZWN0X2FkZCAtIGFkZCBhbiBvYmplY3QgdG8gdGhlIGhpZXJhcmNoeS4KICAqCUBrb2JqOglvYmplY3QuCisgKglAc2hhZG93X3BhcmVudDogc3lzZnMgZGlyZWN0b3J5IHRvIGFkZCB0by4KICAqLwogCi1pbnQga29iamVjdF9hZGQoc3RydWN0IGtvYmplY3QgKiBrb2JqKQoraW50IGtvYmplY3Rfc2hhZG93X2FkZChzdHJ1Y3Qga29iamVjdCAqIGtvYmosIHN0cnVjdCBkZW50cnkgKnNoYWRvd19wYXJlbnQpCiB7CiAJaW50IGVycm9yID0gMDsKIAlzdHJ1Y3Qga29iamVjdCAqIHBhcmVudDsKQEAgLTE4OSwxMiArMTkyLDExIEBACiAJfQogCWtvYmotPnBhcmVudCA9IHBhcmVudDsKIAotCWVycm9yID0gY3JlYXRlX2Rpcihrb2JqKTsKKwllcnJvciA9IGNyZWF0ZV9kaXIoa29iaiwgc2hhZG93X3BhcmVudCk7CiAJaWYgKGVycm9yKSB7CiAJCS8qIHVubGluayBkb2VzIHRoZSBrb2JqZWN0X3B1dCgpIGZvciB1cyAqLwogCQl1bmxpbmsoa29iaik7Ci0JCWlmIChwYXJlbnQpCi0JCQlrb2JqZWN0X3B1dChwYXJlbnQpOworCQlrb2JqZWN0X3B1dChwYXJlbnQpOwogCiAJCS8qIGJlIG5vaXN5IG9uIGVycm9yIGlzc3VlcyAqLwogCQlpZiAoZXJyb3IgPT0gLUVFWElTVCkKQEAgLTIxMSw2ICsyMTMsMTUgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKy8qKgorICoJa29iamVjdF9hZGQgLSBhZGQgYW4gb2JqZWN0IHRvIHRoZSBoaWVyYXJjaHkuCisgKglAa29iajoJb2JqZWN0LgorICovCitpbnQga29iamVjdF9hZGQoc3RydWN0IGtvYmplY3QgKiBrb2JqKQoreworCXJldHVybiBrb2JqZWN0X3NoYWRvd19hZGQoa29iaiwgTlVMTCk7Cit9CisKIAogLyoqCiAgKglrb2JqZWN0X3JlZ2lzdGVyIC0gaW5pdGlhbGl6ZSBhbmQgYWRkIGFuIG9iamVjdC4KQEAgLTMwMyw3ICszMTQsMjkgQEAKIAlrb2JqID0ga29iamVjdF9nZXQoa29iaik7CiAJaWYgKCFrb2JqKQogCQlyZXR1cm4gLUVJTlZBTDsKLQllcnJvciA9IHN5c2ZzX3JlbmFtZV9kaXIoa29iaiwgbmV3X25hbWUpOworCWlmICgha29iai0+cGFyZW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKwllcnJvciA9IHN5c2ZzX3JlbmFtZV9kaXIoa29iaiwga29iai0+cGFyZW50LT5kZW50cnksIG5ld19uYW1lKTsKKwlrb2JqZWN0X3B1dChrb2JqKTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglrb2JqZWN0X3JlbmFtZSAtIGNoYW5nZSB0aGUgbmFtZSBvZiBhbiBvYmplY3QKKyAqCUBrb2JqOglvYmplY3QgaW4gcXVlc3Rpb24uCisgKglAbmV3X25hbWU6IG9iamVjdCdzIG5ldyBuYW1lCisgKi8KKworaW50IGtvYmplY3Rfc2hhZG93X3JlbmFtZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIHN0cnVjdCBkZW50cnkgKm5ld19wYXJlbnQsCisJCQkgIGNvbnN0IGNoYXIgKm5ld19uYW1lKQoreworCWludCBlcnJvciA9IDA7CisKKwlrb2JqID0ga29iamVjdF9nZXQoa29iaik7CisJaWYgKCFrb2JqKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllcnJvciA9IHN5c2ZzX3JlbmFtZV9kaXIoa29iaiwgbmV3X3BhcmVudCwgbmV3X25hbWUpOwogCWtvYmplY3RfcHV0KGtvYmopOwogCiAJcmV0dXJuIGVycm9yOwpAQCAtMzEyLDcgKzM0NSw3IEBACiAvKioKICAqCWtvYmplY3RfbW92ZSAtIG1vdmUgb2JqZWN0IHRvIGFub3RoZXIgcGFyZW50CiAgKglAa29iajoJb2JqZWN0IGluIHF1ZXN0aW9uLgotICoJQG5ld19wYXJlbnQ6IG9iamVjdCdzIG5ldyBwYXJlbnQKKyAqCUBuZXdfcGFyZW50OiBvYmplY3QncyBuZXcgcGFyZW50IChjYW4gYmUgTlVMTCkKICAqLwogCiBpbnQga29iamVjdF9tb3ZlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29iamVjdCAqbmV3X3BhcmVudCkKQEAgLTMyOCw4ICszNjEsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAluZXdfcGFyZW50ID0ga29iamVjdF9nZXQobmV3X3BhcmVudCk7CiAJaWYgKCFuZXdfcGFyZW50KSB7Ci0JCWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7CisJCWlmIChrb2JqLT5rc2V0KQorCQkJbmV3X3BhcmVudCA9IGtvYmplY3RfZ2V0KCZrb2JqLT5rc2V0LT5rb2JqKTsKIAl9CiAJLyogb2xkIG9iamVjdCBwYXRoICovCiAJZGV2cGF0aCA9IGtvYmplY3RfZ2V0X3BhdGgoa29iaiwgR0ZQX0tFUk5FTCk7CkBAIC0zNjYsNiArMzk5LDggQEAKIAogdm9pZCBrb2JqZWN0X2RlbChzdHJ1Y3Qga29iamVjdCAqIGtvYmopCiB7CisJaWYgKCFrb2JqKQorCQlyZXR1cm47CiAJc3lzZnNfcmVtb3ZlX2Rpcihrb2JqKTsKIAl1bmxpbmsoa29iaik7CiB9CkBAIC0zNzcsNiArNDEyLDggQEAKIAogdm9pZCBrb2JqZWN0X3VucmVnaXN0ZXIoc3RydWN0IGtvYmplY3QgKiBrb2JqKQogeworCWlmICgha29iaikKKwkJcmV0dXJuOwogCXByX2RlYnVnKCJrb2JqZWN0ICVzOiB1bnJlZ2lzdGVyaW5nXG4iLGtvYmplY3RfbmFtZShrb2JqKSk7CiAJa29iamVjdF91ZXZlbnQoa29iaiwgS09CSl9SRU1PVkUpOwogCWtvYmplY3RfZGVsKGtvYmopOwpAQCAtNDE0LDggKzQ1MSw3IEBACiAJCXQtPnJlbGVhc2Uoa29iaik7CiAJaWYgKHMpCiAJCWtzZXRfcHV0KHMpOwotCWlmIChwYXJlbnQpIAotCQlrb2JqZWN0X3B1dChwYXJlbnQpOworCWtvYmplY3RfcHV0KHBhcmVudCk7CiB9CiAKIHN0YXRpYyB2b2lkIGtvYmplY3RfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKQEAgLTUyMyw2ICs1NTksOCBAQAogCiBpbnQga3NldF9yZWdpc3RlcihzdHJ1Y3Qga3NldCAqIGspCiB7CisJaWYgKCFrKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlrc2V0X2luaXQoayk7CiAJcmV0dXJuIGtzZXRfYWRkKGspOwogfQpAQCAtNTM1LDYgKzU3Myw4IEBACiAKIHZvaWQga3NldF91bnJlZ2lzdGVyKHN0cnVjdCBrc2V0ICogaykKIHsKKwlpZiAoIWspCisJCXJldHVybjsKIAlrb2JqZWN0X3VucmVnaXN0ZXIoJmstPmtvYmopOwogfQogCkBAIC01ODYsNiArNjI2LDkgQEAKIHsKIAlpbnQgZXJyb3I7CiAKKwlpZiAoIXMpCisJCXJldHVybiAtRUlOVkFMOworCiAJc3Vic3lzdGVtX2luaXQocyk7CiAJcHJfZGVidWcoInN1YnN5c3RlbSAlczogcmVnaXN0ZXJpbmdcbiIscy0+a3NldC5rb2JqLm5hbWUpOwogCkBAIC01OTgsNiArNjQxLDggQEAKIAogdm9pZCBzdWJzeXN0ZW1fdW5yZWdpc3RlcihzdHJ1Y3Qgc3Vic3lzdGVtICogcykKIHsKKwlpZiAoIXMpCisJCXJldHVybjsKIAlwcl9kZWJ1Zygic3Vic3lzdGVtICVzOiB1bnJlZ2lzdGVyaW5nXG4iLHMtPmtzZXQua29iai5uYW1lKTsKIAlrc2V0X3VucmVnaXN0ZXIoJnMtPmtzZXQpOwogfQpAQCAtNjEyLDYgKzY1NywxMCBAQAogaW50IHN1YnN5c19jcmVhdGVfZmlsZShzdHJ1Y3Qgc3Vic3lzdGVtICogcywgc3RydWN0IHN1YnN5c19hdHRyaWJ1dGUgKiBhKQogewogCWludCBlcnJvciA9IDA7CisKKwlpZiAoIXMgfHwgIWEpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKHN1YnN5c19nZXQocykpIHsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfZmlsZSgmcy0+a3NldC5rb2JqLCZhLT5hdHRyKTsKIAkJc3Vic3lzX3B1dChzKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaWYuYyBiL25ldC9icmlkZ2UvYnJfaWYuYwppbmRleCA1NWJiMjYzLi4yYjdjMmM3IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lmLmMKKysrIGIvbmV0L2JyaWRnZS9icl9pZi5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAlrb2JqZWN0X2luaXQoJnAtPmtvYmopOwogCWtvYmplY3Rfc2V0X25hbWUoJnAtPmtvYmosIFNZU0ZTX0JSSURHRV9QT1JUX0FUVFIpOwogCXAtPmtvYmoua3R5cGUgPSAmYnJwb3J0X2t0eXBlOwotCXAtPmtvYmoucGFyZW50ID0gJihkZXYtPmNsYXNzX2Rldi5rb2JqKTsKKwlwLT5rb2JqLnBhcmVudCA9ICYoZGV2LT5kZXYua29iaik7CiAJcC0+a29iai5rc2V0ID0gTlVMTDsKIAogCXJldHVybiBwOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jIGIvbmV0L2JyaWRnZS9icl9zeXNmc19ici5jCmluZGV4IGRlOWQxYTkuLmNlMTA0NjQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfc3lzZnNfYnIuYworKysgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2JyLmMKQEAgLTIxLDE4ICsyMSwxNyBAQAogCiAjaW5jbHVkZSAiYnJfcHJpdmF0ZS5oIgogCi0jZGVmaW5lIHRvX2NsYXNzX2RldihvYmopIGNvbnRhaW5lcl9vZihvYmosc3RydWN0IGNsYXNzX2RldmljZSxrb2JqKQotI2RlZmluZSB0b19uZXRfZGV2KGNsYXNzKSBjb250YWluZXJfb2YoY2xhc3MsIHN0cnVjdCBuZXRfZGV2aWNlLCBjbGFzc19kZXYpCisjZGVmaW5lIHRvX2RldihvYmopCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopCiAjZGVmaW5lIHRvX2JyaWRnZShjZCkJKChzdHJ1Y3QgbmV0X2JyaWRnZSAqKSh0b19uZXRfZGV2KGNkKS0+cHJpdikpCiAKIC8qCiAgKiBDb21tb24gY29kZSBmb3Igc3RvcmluZyBicmlkZ2UgcGFyYW1ldGVycy4KICAqLwotc3RhdGljIHNzaXplX3Qgc3RvcmVfYnJpZGdlX3Bhcm0oc3RydWN0IGNsYXNzX2RldmljZSAqY2QsCitzdGF0aWMgc3NpemVfdCBzdG9yZV9icmlkZ2VfcGFybShzdHJ1Y3QgZGV2aWNlICpkLAogCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCiAJCQkJIHZvaWQgKCpzZXQpKHN0cnVjdCBuZXRfYnJpZGdlICosIHVuc2lnbmVkIGxvbmcpKQogewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShjZCk7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGQpOwogCWNoYXIgKmVuZHA7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKQEAgLTUwLDkgKzQ5LDEwIEBACiB9CiAKIAotc3RhdGljIHNzaXplX3Qgc2hvd19mb3J3YXJkX2RlbGF5KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2ZvcndhcmRfZGVsYXkoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGNkKTsKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoZCk7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBqaWZmaWVzX3RvX2Nsb2NrX3QoYnItPmZvcndhcmRfZGVsYXkpKTsKIH0KIApAQCAtNjQsMTggKzY0LDIwIEBACiAJCWJyLT5icmlkZ2VfZm9yd2FyZF9kZWxheSA9IGRlbGF5OwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9mb3J3YXJkX2RlbGF5KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsCi0JCQkJICAgc2l6ZV90IGxlbikKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2ZvcndhcmRfZGVsYXkoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7Ci0JcmV0dXJuIHN0b3JlX2JyaWRnZV9wYXJtKGNkLCBidWYsIGxlbiwgc2V0X2ZvcndhcmRfZGVsYXkpOworCXJldHVybiBzdG9yZV9icmlkZ2VfcGFybShkLCBidWYsIGxlbiwgc2V0X2ZvcndhcmRfZGVsYXkpOwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGZvcndhcmRfZGVsYXksIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJIHNob3dfZm9yd2FyZF9kZWxheSwgc3RvcmVfZm9yd2FyZF9kZWxheSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZm9yd2FyZF9kZWxheSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIHNob3dfZm9yd2FyZF9kZWxheSwgc3RvcmVfZm9yd2FyZF9kZWxheSk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfaGVsbG9fdGltZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19oZWxsb190aW1lKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNoYXIgKmJ1ZikKIHsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsCi0JCSAgICAgICBqaWZmaWVzX3RvX2Nsb2NrX3QodG9fYnJpZGdlKGNkKS0+aGVsbG9fdGltZSkpOworCQkgICAgICAgamlmZmllc190b19jbG9ja190KHRvX2JyaWRnZShkKS0+aGVsbG9fdGltZSkpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfaGVsbG9fdGltZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHVuc2lnbmVkIGxvbmcgdmFsKQpAQCAtODYsMTkgKzg4LDIwIEBACiAJCWJyLT5icmlkZ2VfaGVsbG9fdGltZSA9IHQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX2hlbGxvX3RpbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1ZiwKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2hlbGxvX3RpbWUoc3RydWN0IGRldmljZSAqZCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAogCQkJCXNpemVfdCBsZW4pCiB7Ci0JcmV0dXJuIHN0b3JlX2JyaWRnZV9wYXJtKGNkLCBidWYsIGxlbiwgc2V0X2hlbGxvX3RpbWUpOworCXJldHVybiBzdG9yZV9icmlkZ2VfcGFybShkLCBidWYsIGxlbiwgc2V0X2hlbGxvX3RpbWUpOwogfQorc3RhdGljIERFVklDRV9BVFRSKGhlbGxvX3RpbWUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2hlbGxvX3RpbWUsCisJCSAgIHN0b3JlX2hlbGxvX3RpbWUpOwogCi1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoaGVsbG9fdGltZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfaGVsbG9fdGltZSwKLQkJCSBzdG9yZV9oZWxsb190aW1lKTsKLQotc3RhdGljIHNzaXplX3Qgc2hvd19tYXhfYWdlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X21heF9hZ2Uoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQogewogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwKLQkJICAgICAgIGppZmZpZXNfdG9fY2xvY2tfdCh0b19icmlkZ2UoY2QpLT5tYXhfYWdlKSk7CisJCSAgICAgICBqaWZmaWVzX3RvX2Nsb2NrX3QodG9fYnJpZGdlKGQpLT5tYXhfYWdlKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9tYXhfYWdlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgdW5zaWduZWQgbG9uZyB2YWwpCkBAIC0xMDksMTggKzExMiwxNyBAQAogCQlici0+YnJpZGdlX21heF9hZ2UgPSB0OwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9tYXhfYWdlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsCi0JCQkJc2l6ZV90IGxlbikKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX21heF9hZ2Uoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKLQlyZXR1cm4gc3RvcmVfYnJpZGdlX3Bhcm0oY2QsIGJ1ZiwgbGVuLCBzZXRfbWF4X2FnZSk7CisJcmV0dXJuIHN0b3JlX2JyaWRnZV9wYXJtKGQsIGJ1ZiwgbGVuLCBzZXRfbWF4X2FnZSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIobWF4X2FnZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfbWF4X2FnZSwgc3RvcmVfbWF4X2FnZSk7CiAKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihtYXhfYWdlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19tYXhfYWdlLAotCQkJIHN0b3JlX21heF9hZ2UpOwotCi1zdGF0aWMgc3NpemVfdCBzaG93X2FnZWluZ190aW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2FnZWluZ190aW1lKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoY2QpOworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShkKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIGppZmZpZXNfdG9fY2xvY2tfdChici0+YWdlaW5nX3RpbWUpKTsKIH0KIApAQCAtMTI5LDE3ICsxMzEsMTkgQEAKIAlici0+YWdlaW5nX3RpbWUgPSBjbG9ja190X3RvX2ppZmZpZXModmFsKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfYWdlaW5nX3RpbWUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkgc2l6ZV90IGxlbikKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2FnZWluZ190aW1lKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7Ci0JcmV0dXJuIHN0b3JlX2JyaWRnZV9wYXJtKGNkLCBidWYsIGxlbiwgc2V0X2FnZWluZ190aW1lKTsKKwlyZXR1cm4gc3RvcmVfYnJpZGdlX3Bhcm0oZCwgYnVmLCBsZW4sIHNldF9hZ2VpbmdfdGltZSk7CiB9CitzdGF0aWMgREVWSUNFX0FUVFIoYWdlaW5nX3RpbWUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X2FnZWluZ190aW1lLAorCQkgICBzdG9yZV9hZ2VpbmdfdGltZSk7CiAKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihhZ2VpbmdfdGltZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfYWdlaW5nX3RpbWUsCi0JCQkgc3RvcmVfYWdlaW5nX3RpbWUpOwotc3RhdGljIHNzaXplX3Qgc2hvd19zdHBfc3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3RwX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShjZCk7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGQpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBici0+c3RwX2VuYWJsZWQpOwogfQogCkBAIC0xNDgsMTggKzE1MiwxOSBAQAogCWJyLT5zdHBfZW5hYmxlZCA9IHZhbDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfc3RwX3N0YXRlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3N0cF9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkgICAgICAgc2l6ZV90IGxlbikKIHsKLQlyZXR1cm4gc3RvcmVfYnJpZGdlX3Bhcm0oY2QsIGJ1ZiwgbGVuLCBzZXRfc3RwX3N0YXRlKTsKKwlyZXR1cm4gc3RvcmVfYnJpZGdlX3Bhcm0oZCwgYnVmLCBsZW4sIHNldF9zdHBfc3RhdGUpOwogfQorc3RhdGljIERFVklDRV9BVFRSKHN0cF9zdGF0ZSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfc3RwX3N0YXRlLAorCQkgICBzdG9yZV9zdHBfc3RhdGUpOwogCi1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoc3RwX3N0YXRlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19zdHBfc3RhdGUsCi0JCQkgc3RvcmVfc3RwX3N0YXRlKTsKLQotc3RhdGljIHNzaXplX3Qgc2hvd19wcmlvcml0eShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19wcmlvcml0eShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQogewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShjZCk7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGQpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAogCQkgICAgICAgKGJyLT5icmlkZ2VfaWQucHJpb1swXSA8PCA4KSB8IGJyLT5icmlkZ2VfaWQucHJpb1sxXSk7CiB9CkBAIC0xNjksOTIgKzE3NCwxMDcgQEAKIAlicl9zdHBfc2V0X2JyaWRnZV9wcmlvcml0eShiciwgKHUxNikgdmFsKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfcHJpb3JpdHkoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsCitzdGF0aWMgc3NpemVfdCBzdG9yZV9wcmlvcml0eShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7Ci0JcmV0dXJuIHN0b3JlX2JyaWRnZV9wYXJtKGNkLCBidWYsIGxlbiwgc2V0X3ByaW9yaXR5KTsKKwlyZXR1cm4gc3RvcmVfYnJpZGdlX3Bhcm0oZCwgYnVmLCBsZW4sIHNldF9wcmlvcml0eSk7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocHJpb3JpdHksIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ByaW9yaXR5LAotCQkJIHN0b3JlX3ByaW9yaXR5KTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwcmlvcml0eSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHJpb3JpdHksIHN0b3JlX3ByaW9yaXR5KTsKIAotc3RhdGljIHNzaXplX3Qgc2hvd19yb290X2lkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3Jvb3RfaWQoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQogewotCXJldHVybiBicl9zaG93X2JyaWRnZV9pZChidWYsICZ0b19icmlkZ2UoY2QpLT5kZXNpZ25hdGVkX3Jvb3QpOworCXJldHVybiBicl9zaG93X2JyaWRnZV9pZChidWYsICZ0b19icmlkZ2UoZCktPmRlc2lnbmF0ZWRfcm9vdCk7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocm9vdF9pZCwgU19JUlVHTywgc2hvd19yb290X2lkLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyb290X2lkLCBTX0lSVUdPLCBzaG93X3Jvb3RfaWQsIE5VTEwpOwogCi1zdGF0aWMgc3NpemVfdCBzaG93X2JyaWRnZV9pZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19icmlkZ2VfaWQoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCiB7Ci0JcmV0dXJuIGJyX3Nob3dfYnJpZGdlX2lkKGJ1ZiwgJnRvX2JyaWRnZShjZCktPmJyaWRnZV9pZCk7CisJcmV0dXJuIGJyX3Nob3dfYnJpZGdlX2lkKGJ1ZiwgJnRvX2JyaWRnZShkKS0+YnJpZGdlX2lkKTsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihicmlkZ2VfaWQsIFNfSVJVR08sIHNob3dfYnJpZGdlX2lkLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihicmlkZ2VfaWQsIFNfSVJVR08sIHNob3dfYnJpZGdlX2lkLCBOVUxMKTsKIAotc3RhdGljIHNzaXplX3Qgc2hvd19yb290X3BvcnQoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfcm9vdF9wb3J0KHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0b19icmlkZ2UoY2QpLT5yb290X3BvcnQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0b19icmlkZ2UoZCktPnJvb3RfcG9ydCk7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocm9vdF9wb3J0LCBTX0lSVUdPLCBzaG93X3Jvb3RfcG9ydCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIocm9vdF9wb3J0LCBTX0lSVUdPLCBzaG93X3Jvb3RfcG9ydCwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfcm9vdF9wYXRoX2Nvc3Qoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfcm9vdF9wYXRoX2Nvc3Qoc3RydWN0IGRldmljZSAqZCwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0b19icmlkZ2UoY2QpLT5yb290X3BhdGhfY29zdCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRvX2JyaWRnZShkKS0+cm9vdF9wYXRoX2Nvc3QpOwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKHJvb3RfcGF0aF9jb3N0LCBTX0lSVUdPLCBzaG93X3Jvb3RfcGF0aF9jb3N0LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyb290X3BhdGhfY29zdCwgU19JUlVHTywgc2hvd19yb290X3BhdGhfY29zdCwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfdG9wb2xvZ3lfY2hhbmdlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3RvcG9sb2d5X2NoYW5nZShzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0b19icmlkZ2UoY2QpLT50b3BvbG9neV9jaGFuZ2UpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0b19icmlkZ2UoZCktPnRvcG9sb2d5X2NoYW5nZSk7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodG9wb2xvZ3lfY2hhbmdlLCBTX0lSVUdPLCBzaG93X3RvcG9sb2d5X2NoYW5nZSwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodG9wb2xvZ3lfY2hhbmdlLCBTX0lSVUdPLCBzaG93X3RvcG9sb2d5X2NoYW5nZSwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfdG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3RvcG9sb2d5X2NoYW5nZV9kZXRlY3RlZChzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoY2QpOworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShkKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYnItPnRvcG9sb2d5X2NoYW5nZV9kZXRlY3RlZCk7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkLCBTX0lSVUdPLCBzaG93X3RvcG9sb2d5X2NoYW5nZV9kZXRlY3RlZCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkLCBTX0lSVUdPLAorCQkgICBzaG93X3RvcG9sb2d5X2NoYW5nZV9kZXRlY3RlZCwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfaGVsbG9fdGltZXIoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfaGVsbG9fdGltZXIoc3RydWN0IGRldmljZSAqZCwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShjZCk7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGQpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgYnJfdGltZXJfdmFsdWUoJmJyLT5oZWxsb190aW1lcikpOwogfQotc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGhlbGxvX3RpbWVyLCBTX0lSVUdPLCBzaG93X2hlbGxvX3RpbWVyLCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihoZWxsb190aW1lciwgU19JUlVHTywgc2hvd19oZWxsb190aW1lciwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfdGNuX3RpbWVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3Rjbl90aW1lcihzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoY2QpOworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShkKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGJyX3RpbWVyX3ZhbHVlKCZici0+dGNuX3RpbWVyKSk7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodGNuX3RpbWVyLCBTX0lSVUdPLCBzaG93X3Rjbl90aW1lciwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodGNuX3RpbWVyLCBTX0lSVUdPLCBzaG93X3Rjbl90aW1lciwgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfdG9wb2xvZ3lfY2hhbmdlX3RpbWVyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X3RvcG9sb2d5X2NoYW5nZV90aW1lcihzdHJ1Y3QgZGV2aWNlICpkLAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoY2QpOworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShkKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGJyX3RpbWVyX3ZhbHVlKCZici0+dG9wb2xvZ3lfY2hhbmdlX3RpbWVyKSk7CiB9Ci1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodG9wb2xvZ3lfY2hhbmdlX3RpbWVyLCBTX0lSVUdPLCBzaG93X3RvcG9sb2d5X2NoYW5nZV90aW1lciwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIodG9wb2xvZ3lfY2hhbmdlX3RpbWVyLCBTX0lSVUdPLCBzaG93X3RvcG9sb2d5X2NoYW5nZV90aW1lciwKKwkJICAgTlVMTCk7CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfZ2NfdGltZXIoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfZ2NfdGltZXIoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoY2QpOworCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShkKTsKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGJyX3RpbWVyX3ZhbHVlKCZici0+Z2NfdGltZXIpKTsKIH0KLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihnY190aW1lciwgU19JUlVHTywgc2hvd19nY190aW1lciwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZ2NfdGltZXIsIFNfSVJVR08sIHNob3dfZ2NfdGltZXIsIE5VTEwpOwogCi1zdGF0aWMgc3NpemVfdCBzaG93X2dyb3VwX2FkZHIoc3RydWN0IGNsYXNzX2RldmljZSAqY2QsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfZ3JvdXBfYWRkcihzdHJ1Y3QgZGV2aWNlICpkLAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGNkKTsKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoZCk7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXg6JXg6JXg6JXg6JXg6JXhcbiIsCiAJCSAgICAgICBici0+Z3JvdXBfYWRkclswXSwgYnItPmdyb3VwX2FkZHJbMV0sCiAJCSAgICAgICBici0+Z3JvdXBfYWRkclsyXSwgYnItPmdyb3VwX2FkZHJbM10sCiAJCSAgICAgICBici0+Z3JvdXBfYWRkcls0XSwgYnItPmdyb3VwX2FkZHJbNV0pOwogfQogCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9ncm91cF9hZGRyKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjb25zdCBjaGFyICpidWYsCi0JCQkJICAgIHNpemVfdCBsZW4pCitzdGF0aWMgc3NpemVfdCBzdG9yZV9ncm91cF9hZGRyKHN0cnVjdCBkZXZpY2UgKmQsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewotCXN0cnVjdCBuZXRfYnJpZGdlICpiciA9IHRvX2JyaWRnZShjZCk7CisJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGQpOwogCXVuc2lnbmVkIG5ld19hZGRyWzZdOwogCWludCBpOwogCkBAIC0yODYsMjggKzMwNiwyOCBAQAogCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihncm91cF9hZGRyLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCSBzaG93X2dyb3VwX2FkZHIsIHN0b3JlX2dyb3VwX2FkZHIpOworc3RhdGljIERFVklDRV9BVFRSKGdyb3VwX2FkZHIsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkgICBzaG93X2dyb3VwX2FkZHIsIHN0b3JlX2dyb3VwX2FkZHIpOwogCiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpicmlkZ2VfYXR0cnNbXSA9IHsKLQkmY2xhc3NfZGV2aWNlX2F0dHJfZm9yd2FyZF9kZWxheS5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9oZWxsb190aW1lLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX21heF9hZ2UuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfYWdlaW5nX3RpbWUuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfc3RwX3N0YXRlLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3ByaW9yaXR5LmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2JyaWRnZV9pZC5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9yb290X2lkLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3Jvb3RfcGF0aF9jb3N0LmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3Jvb3RfcG9ydC5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl90b3BvbG9neV9jaGFuZ2UuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfdG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2hlbGxvX3RpbWVyLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3Rjbl90aW1lci5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl90b3BvbG9neV9jaGFuZ2VfdGltZXIuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfZ2NfdGltZXIuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfZ3JvdXBfYWRkci5hdHRyLAorCSZkZXZfYXR0cl9mb3J3YXJkX2RlbGF5LmF0dHIsCisJJmRldl9hdHRyX2hlbGxvX3RpbWUuYXR0ciwKKwkmZGV2X2F0dHJfbWF4X2FnZS5hdHRyLAorCSZkZXZfYXR0cl9hZ2VpbmdfdGltZS5hdHRyLAorCSZkZXZfYXR0cl9zdHBfc3RhdGUuYXR0ciwKKwkmZGV2X2F0dHJfcHJpb3JpdHkuYXR0ciwKKwkmZGV2X2F0dHJfYnJpZGdlX2lkLmF0dHIsCisJJmRldl9hdHRyX3Jvb3RfaWQuYXR0ciwKKwkmZGV2X2F0dHJfcm9vdF9wYXRoX2Nvc3QuYXR0ciwKKwkmZGV2X2F0dHJfcm9vdF9wb3J0LmF0dHIsCisJJmRldl9hdHRyX3RvcG9sb2d5X2NoYW5nZS5hdHRyLAorCSZkZXZfYXR0cl90b3BvbG9neV9jaGFuZ2VfZGV0ZWN0ZWQuYXR0ciwKKwkmZGV2X2F0dHJfaGVsbG9fdGltZXIuYXR0ciwKKwkmZGV2X2F0dHJfdGNuX3RpbWVyLmF0dHIsCisJJmRldl9hdHRyX3RvcG9sb2d5X2NoYW5nZV90aW1lci5hdHRyLAorCSZkZXZfYXR0cl9nY190aW1lci5hdHRyLAorCSZkZXZfYXR0cl9ncm91cF9hZGRyLmF0dHIsCiAJTlVMTAogfTsKIApAQCAtMzI1LDggKzM0NSw4IEBACiBzdGF0aWMgc3NpemVfdCBicmZvcndhcmRfcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAogCQkJICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNkZXYgPSB0b19jbGFzc19kZXYoa29iaik7Ci0Jc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gdG9fYnJpZGdlKGNkZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHRvX2Rldihrb2JqKTsKKwlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSB0b19icmlkZ2UoZGV2KTsKIAlpbnQgbjsKIAogCS8qIG11c3QgcmVhZCB3aG9sZSByZWNvcmRzICovCkBAIC0zNjMsNyArMzgzLDcgQEAKICAqLwogaW50IGJyX3N5c2ZzX2FkZGJyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGtvYmplY3QgKmJyb2JqID0gJmRldi0+Y2xhc3NfZGV2LmtvYmo7CisJc3RydWN0IGtvYmplY3QgKmJyb2JqID0gJmRldi0+ZGV2LmtvYmo7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgZXJyOwogCkBAIC0zOTUsOSArNDE1LDkgQEAKIAl9CiAJcmV0dXJuIDA7CiAgb3V0MzoKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmRldi0+Y2xhc3NfZGV2LmtvYmosICZicmlkZ2VfZm9yd2FyZCk7CisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZkZXYtPmRldi5rb2JqLCAmYnJpZGdlX2ZvcndhcmQpOwogIG91dDI6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmNsYXNzX2Rldi5rb2JqLCAmYnJpZGdlX2dyb3VwKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+ZGV2LmtvYmosICZicmlkZ2VfZ3JvdXApOwogIG91dDE6CiAJcmV0dXJuIGVycjsKIApAQCAtNDA1LDcgKzQyNSw3IEBACiAKIHZvaWQgYnJfc3lzZnNfZGVsYnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qga29iamVjdCAqa29iaiA9ICZkZXYtPmNsYXNzX2Rldi5rb2JqOworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gJmRldi0+ZGV2LmtvYmo7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWtvYmplY3RfdW5yZWdpc3RlcigmYnItPmlmb2JqKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYyBiL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYwppbmRleCBjNTFjOWU0Li4wYmMyYWVmIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMKKysrIGIvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jCkBAIC0yMTEsNyArMjExLDcgQEAKIAlzdHJ1Y3QgYnJwb3J0X2F0dHJpYnV0ZSAqKmE7CiAJaW50IGVycjsKIAotCWVyciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZwLT5rb2JqLCAmYnItPmRldi0+Y2xhc3NfZGV2LmtvYmosIAorCWVyciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZwLT5rb2JqLCAmYnItPmRldi0+ZGV2LmtvYmosCiAJCQkJU1lTRlNfQlJJREdFX1BPUlRfTElOSyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQyOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCBlNjYwY2I1Li40NTVkNTg5IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtNzUxLDcgKzc1MSw3IEBACiAJZWxzZQogCQlzdHJsY3B5KGRldi0+bmFtZSwgbmV3bmFtZSwgSUZOQU1TSVopOwogCi0JZXJyID0gY2xhc3NfZGV2aWNlX3JlbmFtZSgmZGV2LT5jbGFzc19kZXYsIGRldi0+bmFtZSk7CisJZXJyID0gZGV2aWNlX3JlbmFtZSgmZGV2LT5kZXYsIGRldi0+bmFtZSk7CiAJaWYgKCFlcnIpIHsKIAkJaGxpc3RfZGVsKCZkZXYtPm5hbWVfaGxpc3QpOwogCQlobGlzdF9hZGRfaGVhZCgmZGV2LT5uYW1lX2hsaXN0LCBkZXZfbmFtZV9oYXNoKGRldi0+bmFtZSkpOwpAQCAtMzIyMSw4ICszMjIxLDggQEAKIAlCVUdfT04oZGV2LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1VOUkVHSVNURVJFRCk7CiAJZGV2LT5yZWdfc3RhdGUgPSBORVRSRUdfUkVMRUFTRUQ7CiAKLQkvKiB3aWxsIGZyZWUgdmlhIGNsYXNzIHJlbGVhc2UgKi8KLQljbGFzc19kZXZpY2VfcHV0KCZkZXYtPmNsYXNzX2Rldik7CisJLyogd2lsbCBmcmVlIHZpYSBkZXZpY2UgcmVsZWFzZSAqLworCXB1dF9kZXZpY2UoJmRldi0+ZGV2KTsKICNlbHNlCiAJa2ZyZWUoKGNoYXIgKilkZXYgLSBkZXYtPnBhZGRlZCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC1zeXNmcy5jIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKaW5kZXggZjQ3ZjMxOS4uNDRkYjA5NSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKQEAgLTE4LDkgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiAKLSNkZWZpbmUgdG9fY2xhc3NfZGV2KG9iaikgY29udGFpbmVyX29mKG9iaixzdHJ1Y3QgY2xhc3NfZGV2aWNlLGtvYmopCi0jZGVmaW5lIHRvX25ldF9kZXYoY2xhc3MpIGNvbnRhaW5lcl9vZihjbGFzcywgc3RydWN0IG5ldF9kZXZpY2UsIGNsYXNzX2RldikKLQogc3RhdGljIGNvbnN0IGNoYXIgZm10X2hleFtdID0gIiUjeFxuIjsKIHN0YXRpYyBjb25zdCBjaGFyIGZtdF9sb25nX2hleFtdID0gIiUjbHhcbiI7CiBzdGF0aWMgY29uc3QgY2hhciBmbXRfZGVjW10gPSAiJWRcbiI7CkBAIC0zMiwxMCArMjksMTEgQEAKIH0KIAogLyogdXNlIHNhbWUgbG9ja2luZyBydWxlcyBhcyBHSUYqIGlvY3RsJ3MgKi8KLXN0YXRpYyBzc2l6ZV90IG5ldGRldl9zaG93KGNvbnN0IHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYsCitzdGF0aWMgc3NpemVfdCBuZXRkZXZfc2hvdyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmLAogCQkJICAgc3NpemVfdCAoKmZvcm1hdCkoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKiwgY2hhciAqKSkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gdG9fbmV0X2RldihjZCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IHRvX25ldF9kZXYoZGV2KTsKIAlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CiAKIAlyZWFkX2xvY2soJmRldl9iYXNlX2xvY2spOwpAQCAtNTIsMTQgKzUwLDE1IEBACiB7CQkJCQkJCQkJXAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm9ybWF0X3N0cmluZywgbmV0LT5maWVsZCk7CQkJXAogfQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfIyNmaWVsZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI2ZpZWxkKHN0cnVjdCBkZXZpY2UgKmRldiwJCQkJXAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKIHsJCQkJCQkJCQlcCi0JcmV0dXJuIG5ldGRldl9zaG93KGNkLCBidWYsIGZvcm1hdF8jI2ZpZWxkKTsJCQlcCisJcmV0dXJuIG5ldGRldl9zaG93KGRldiwgYXR0ciwgYnVmLCBmb3JtYXRfIyNmaWVsZCk7CQlcCiB9CiAKIAogLyogdXNlIHNhbWUgbG9ja2luZyBhbmQgcGVybWlzc2lvbiBydWxlcyBhcyBTSUYqIGlvY3RsJ3MgKi8KLXN0YXRpYyBzc2l6ZV90IG5ldGRldl9zdG9yZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsCitzdGF0aWMgc3NpemVfdCBuZXRkZXZfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCiAJCQkgICAgaW50ICgqc2V0KShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBsb25nKSkKIHsKQEAgLTEwNCw3ICsxMDMsOCBAQAogCXJldHVybiBjcCAtIGJ1ZjsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19hZGRyZXNzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3Qgc2hvd19hZGRyZXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSB0b19uZXRfZGV2KGRldik7CiAJc3NpemVfdCByZXQgPSAtRUlOVkFMOwpAQCAtMTE2LDcgKzExNiw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19icm9hZGNhc3Qoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2Jyb2FkY2FzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ID0gdG9fbmV0X2RldihkZXYpOwogCWlmIChkZXZfaXNhbGl2ZShuZXQpKQpAQCAtMTI0LDcgKzEyNSw4IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfY2FycmllcihzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2FycmllcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gdG9fbmV0X2RldihkZXYpOwogCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKQEAgLTEzMyw3ICsxMzUsOCBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2Rvcm1hbnQoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X2Rvcm1hbnQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHRvX25ldF9kZXYoZGV2KTsKIApAQCAtMTUzLDcgKzE1Niw4IEBACiAJInVwIgogfTsKIAotc3RhdGljIHNzaXplX3Qgc2hvd19vcGVyc3RhdGUoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCBzaG93X29wZXJzdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB0b19uZXRfZGV2KGRldik7CiAJdW5zaWduZWQgY2hhciBvcGVyc3RhdGU7CkBAIC0xNzgsOSArMTgyLDEwIEBACiAJcmV0dXJuIGRldl9zZXRfbXR1KG5ldCwgKGludCkgbmV3X210dSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX210dShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX210dShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKLQlyZXR1cm4gbmV0ZGV2X3N0b3JlKGRldiwgYnVmLCBsZW4sIGNoYW5nZV9tdHUpOworCXJldHVybiBuZXRkZXZfc3RvcmUoZGV2LCBhdHRyLCBidWYsIGxlbiwgY2hhbmdlX210dSk7CiB9CiAKIE5FVERFVklDRV9TSE9XKGZsYWdzLCBmbXRfaGV4KTsKQEAgLTE5MCw5ICsxOTUsMTAgQEAKIAlyZXR1cm4gZGV2X2NoYW5nZV9mbGFncyhuZXQsICh1bnNpZ25lZCkgbmV3X2ZsYWdzKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfZmxhZ3Moc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewotCXJldHVybiBuZXRkZXZfc3RvcmUoZGV2LCBidWYsIGxlbiwgY2hhbmdlX2ZsYWdzKTsKKwlyZXR1cm4gbmV0ZGV2X3N0b3JlKGRldiwgYXR0ciwgYnVmLCBsZW4sIGNoYW5nZV9mbGFncyk7CiB9CiAKIE5FVERFVklDRV9TSE9XKHR4X3F1ZXVlX2xlbiwgZm10X3Vsb25nKTsKQEAgLTIwMyw5ICsyMDksMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfdHhfcXVldWVfbGVuKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQorc3RhdGljIHNzaXplX3Qgc3RvcmVfdHhfcXVldWVfbGVuKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewotCXJldHVybiBuZXRkZXZfc3RvcmUoZGV2LCBidWYsIGxlbiwgY2hhbmdlX3R4X3F1ZXVlX2xlbik7CisJcmV0dXJuIG5ldGRldl9zdG9yZShkZXYsIGF0dHIsIGJ1ZiwgbGVuLCBjaGFuZ2VfdHhfcXVldWVfbGVuKTsKIH0KIAogTkVUREVWSUNFX1NIT1cod2VpZ2h0LCBmbXRfZGVjKTsKQEAgLTIxNiwxMiArMjI0LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHN0b3JlX3dlaWdodChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3dlaWdodChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKLQlyZXR1cm4gbmV0ZGV2X3N0b3JlKGRldiwgYnVmLCBsZW4sIGNoYW5nZV93ZWlnaHQpOworCXJldHVybiBuZXRkZXZfc3RvcmUoZGV2LCBhdHRyLCBidWYsIGxlbiwgY2hhbmdlX3dlaWdodCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSBuZXRfY2xhc3NfYXR0cmlidXRlc1tdID0geworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIG5ldF9jbGFzc19hdHRyaWJ1dGVzW10gPSB7CiAJX19BVFRSKGFkZHJfbGVuLCBTX0lSVUdPLCBzaG93X2FkZHJfbGVuLCBOVUxMKSwKIAlfX0FUVFIoaWZsaW5rLCBTX0lSVUdPLCBzaG93X2lmbGluaywgTlVMTCksCiAJX19BVFRSKGlmaW5kZXgsIFNfSVJVR08sIHNob3dfaWZpbmRleCwgTlVMTCksCkBAIC0yNDIsMTAgKzI1MSwxMSBAQAogfTsKIAogLyogU2hvdyBhIGdpdmVuIGFuIGF0dHJpYnV0ZSBpbiB0aGUgc3RhdGlzdGljcyBncm91cCAqLwotc3RhdGljIHNzaXplX3QgbmV0c3RhdF9zaG93KGNvbnN0IHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYsIAorc3RhdGljIHNzaXplX3QgbmV0c3RhdF9zaG93KGNvbnN0IHN0cnVjdCBkZXZpY2UgKmQsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZiwKIAkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdG9fbmV0X2RldihjZCk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRvX25ldF9kZXYoZCk7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOwogCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKIApAQCAtMjY1LDEyICsyNzUsMTMgQEAKIAogLyogZ2VuZXJhdGUgYSByZWFkLW9ubHkgc3RhdGlzdGljcyBhdHRyaWJ1dGUgKi8KICNkZWZpbmUgTkVUU1RBVF9FTlRSWShuYW1lKQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfIyNuYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYpIAkJXAorc3RhdGljIHNzaXplX3Qgc2hvd18jI25hbWUoc3RydWN0IGRldmljZSAqZCwJCQkJXAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgCVwKIHsJCQkJCQkJCQlcCi0JcmV0dXJuIG5ldHN0YXRfc2hvdyhjZCwgYnVmLCAJCQkJCVwKKwlyZXR1cm4gbmV0c3RhdF9zaG93KGQsIGF0dHIsIGJ1ZiwJCQkJXAogCQkJICAgIG9mZnNldG9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzLCBuYW1lKSk7CVwKIH0JCQkJCQkJCQlcCi1zdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd18jI25hbWUsIE5VTEwpCitzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd18jI25hbWUsIE5VTEwpCiAKIE5FVFNUQVRfRU5UUlkocnhfcGFja2V0cyk7CiBORVRTVEFUX0VOVFJZKHR4X3BhY2tldHMpOwpAQCAtMjk3LDI5ICszMDgsMjkgQEAKIE5FVFNUQVRfRU5UUlkodHhfY29tcHJlc3NlZCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpuZXRzdGF0X2F0dHJzW10gPSB7Ci0JJmNsYXNzX2RldmljZV9hdHRyX3J4X3BhY2tldHMuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfdHhfcGFja2V0cy5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9yeF9ieXRlcy5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl90eF9ieXRlcy5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9yeF9lcnJvcnMuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfdHhfZXJyb3JzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3J4X2Ryb3BwZWQuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfdHhfZHJvcHBlZC5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9tdWx0aWNhc3QuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfY29sbGlzaW9ucy5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9yeF9sZW5ndGhfZXJyb3JzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3J4X292ZXJfZXJyb3JzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3J4X2NyY19lcnJvcnMuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfcnhfZnJhbWVfZXJyb3JzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3J4X2ZpZm9fZXJyb3JzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3J4X21pc3NlZF9lcnJvcnMuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfdHhfYWJvcnRlZF9lcnJvcnMuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfdHhfY2Fycmllcl9lcnJvcnMuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfdHhfZmlmb19lcnJvcnMuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfdHhfaGVhcnRiZWF0X2Vycm9ycy5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl90eF93aW5kb3dfZXJyb3JzLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX3J4X2NvbXByZXNzZWQuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfdHhfY29tcHJlc3NlZC5hdHRyLAorCSZkZXZfYXR0cl9yeF9wYWNrZXRzLmF0dHIsCisJJmRldl9hdHRyX3R4X3BhY2tldHMuYXR0ciwKKwkmZGV2X2F0dHJfcnhfYnl0ZXMuYXR0ciwKKwkmZGV2X2F0dHJfdHhfYnl0ZXMuYXR0ciwKKwkmZGV2X2F0dHJfcnhfZXJyb3JzLmF0dHIsCisJJmRldl9hdHRyX3R4X2Vycm9ycy5hdHRyLAorCSZkZXZfYXR0cl9yeF9kcm9wcGVkLmF0dHIsCisJJmRldl9hdHRyX3R4X2Ryb3BwZWQuYXR0ciwKKwkmZGV2X2F0dHJfbXVsdGljYXN0LmF0dHIsCisJJmRldl9hdHRyX2NvbGxpc2lvbnMuYXR0ciwKKwkmZGV2X2F0dHJfcnhfbGVuZ3RoX2Vycm9ycy5hdHRyLAorCSZkZXZfYXR0cl9yeF9vdmVyX2Vycm9ycy5hdHRyLAorCSZkZXZfYXR0cl9yeF9jcmNfZXJyb3JzLmF0dHIsCisJJmRldl9hdHRyX3J4X2ZyYW1lX2Vycm9ycy5hdHRyLAorCSZkZXZfYXR0cl9yeF9maWZvX2Vycm9ycy5hdHRyLAorCSZkZXZfYXR0cl9yeF9taXNzZWRfZXJyb3JzLmF0dHIsCisJJmRldl9hdHRyX3R4X2Fib3J0ZWRfZXJyb3JzLmF0dHIsCisJJmRldl9hdHRyX3R4X2NhcnJpZXJfZXJyb3JzLmF0dHIsCisJJmRldl9hdHRyX3R4X2ZpZm9fZXJyb3JzLmF0dHIsCisJJmRldl9hdHRyX3R4X2hlYXJ0YmVhdF9lcnJvcnMuYXR0ciwKKwkmZGV2X2F0dHJfdHhfd2luZG93X2Vycm9ycy5hdHRyLAorCSZkZXZfYXR0cl9yeF9jb21wcmVzc2VkLmF0dHIsCisJJmRldl9hdHRyX3R4X2NvbXByZXNzZWQuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC0zMzEsMTEgKzM0MiwxMSBAQAogCiAjaWZkZWYgV0lSRUxFU1NfRVhUCiAvKiBoZWxwZXIgZnVuY3Rpb24gdGhhdCBkb2VzIGFsbCB0aGUgbG9ja2luZyBldGMgZm9yIHdpcmVsZXNzIHN0YXRzICovCi1zdGF0aWMgc3NpemVfdCB3aXJlbGVzc19zaG93KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICpidWYsCitzdGF0aWMgc3NpemVfdCB3aXJlbGVzc19zaG93KHN0cnVjdCBkZXZpY2UgKmQsIGNoYXIgKmJ1ZiwKIAkJCSAgICAgc3NpemVfdCAoKmZvcm1hdCkoY29uc3Qgc3RydWN0IGl3X3N0YXRpc3RpY3MgKiwKIAkJCQkJICAgICAgIGNoYXIgKikpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRvX25ldF9kZXYoY2QpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0b19uZXRfZGV2KGQpOwogCWNvbnN0IHN0cnVjdCBpd19zdGF0aXN0aWNzICppdyA9IE5VTEw7CiAJc3NpemVfdCByZXQgPSAtRUlOVkFMOwogCQpAQCAtMzU4LDExICszNjksMTIgQEAKIHsJCQkJCQkJCQlcCiAJcmV0dXJuIHNwcmludGYoYnVmLCBmb3JtYXRfc3RyaW5nLCBpdy0+ZmllbGQpOwkJCVwKIH0JCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X2l3XyMjbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQlcCitzdGF0aWMgc3NpemVfdCBzaG93X2l3XyMjbmFtZShzdHJ1Y3QgZGV2aWNlICpkLAkJCQlcCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCiB7CQkJCQkJCQkJXAotCXJldHVybiB3aXJlbGVzc19zaG93KGNkLCBidWYsIGZvcm1hdF9pd18jI25hbWUpOwkJXAorCXJldHVybiB3aXJlbGVzc19zaG93KGQsIGJ1ZiwgZm9ybWF0X2l3XyMjbmFtZSk7CQkJXAogfQkJCQkJCQkJCVwKLXN0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X2l3XyMjbmFtZSwgTlVMTCkKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBzaG93X2l3XyMjbmFtZSwgTlVMTCkKIAogV0lSRUxFU1NfU0hPVyhzdGF0dXMsIHN0YXR1cywgZm10X2hleCk7CiBXSVJFTEVTU19TSE9XKGxpbmssIHF1YWwucXVhbCwgZm10X2RlYyk7CkBAIC0zNzYsMTYgKzM4OCwxNiBAQAogV0lSRUxFU1NfU0hPVyhiZWFjb24sIG1pc3MuYmVhY29uLCBmbXRfZGVjKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKndpcmVsZXNzX2F0dHJzW10gPSB7Ci0JJmNsYXNzX2RldmljZV9hdHRyX3N0YXR1cy5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9saW5rLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2xldmVsLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX25vaXNlLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX253aWQuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfY3J5cHQuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfZnJhZ21lbnQuYXR0ciwKLQkmY2xhc3NfZGV2aWNlX2F0dHJfcmV0cmllcy5hdHRyLAotCSZjbGFzc19kZXZpY2VfYXR0cl9taXNjLmF0dHIsCi0JJmNsYXNzX2RldmljZV9hdHRyX2JlYWNvbi5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKKwkmZGV2X2F0dHJfbGluay5hdHRyLAorCSZkZXZfYXR0cl9sZXZlbC5hdHRyLAorCSZkZXZfYXR0cl9ub2lzZS5hdHRyLAorCSZkZXZfYXR0cl9ud2lkLmF0dHIsCisJJmRldl9hdHRyX2NyeXB0LmF0dHIsCisJJmRldl9hdHRyX2ZyYWdtZW50LmF0dHIsCisJJmRldl9hdHRyX3JldHJpZXMuYXR0ciwKKwkmZGV2X2F0dHJfbWlzYy5hdHRyLAorCSZkZXZfYXR0cl9iZWFjb24uYXR0ciwKIAlOVUxMCiB9OwogCkBAIC0zOTYsMTAgKzQwOCwxMCBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSE9UUExVRwotc3RhdGljIGludCBuZXRkZXZfdWV2ZW50KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkLCBjaGFyICoqZW52cCwKK3N0YXRpYyBpbnQgbmV0ZGV2X3VldmVudChzdHJ1Y3QgZGV2aWNlICpkLCBjaGFyICoqZW52cCwKIAkJCSBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRvX25ldF9kZXYoY2QpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0b19uZXRfZGV2KGQpOwogCWludCBpID0gMDsKIAlpbnQgbjsKIApAQCAtNDE5LDEyICs0MzEsMTEgQEAKIAogLyoKICAqCW5ldGRldl9yZWxlYXNlIC0tIGRlc3Ryb3kgYW5kIGZyZWUgYSBkZWFkIGRldmljZS4gCi0gKglDYWxsZWQgd2hlbiBsYXN0IHJlZmVyZW5jZSB0byBjbGFzc19kZXZpY2Uga29iamVjdCBpcyBnb25lLgorICoJQ2FsbGVkIHdoZW4gbGFzdCByZWZlcmVuY2UgdG8gZGV2aWNlIGtvYmplY3QgaXMgZ29uZS4KICAqLwotc3RhdGljIHZvaWQgbmV0ZGV2X3JlbGVhc2Uoc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCitzdGF0aWMgdm9pZCBuZXRkZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgCi0JCT0gY29udGFpbmVyX29mKGNkLCBzdHJ1Y3QgbmV0X2RldmljZSwgY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdG9fbmV0X2RldihkKTsKIAogCUJVR19PTihkZXYtPnJlZ19zdGF0ZSAhPSBORVRSRUdfUkVMRUFTRUQpOwogCkBAIC00MzMsMzEgKzQ0NCwzMSBAQAogCiBzdGF0aWMgc3RydWN0IGNsYXNzIG5ldF9jbGFzcyA9IHsKIAkubmFtZSA9ICJuZXQiLAotCS5yZWxlYXNlID0gbmV0ZGV2X3JlbGVhc2UsCi0JLmNsYXNzX2Rldl9hdHRycyA9IG5ldF9jbGFzc19hdHRyaWJ1dGVzLAorCS5kZXZfcmVsZWFzZSA9IG5ldGRldl9yZWxlYXNlLAorCS5kZXZfYXR0cnMgPSBuZXRfY2xhc3NfYXR0cmlidXRlcywKICNpZmRlZiBDT05GSUdfSE9UUExVRwotCS51ZXZlbnQgPSBuZXRkZXZfdWV2ZW50LAorCS5kZXZfdWV2ZW50ID0gbmV0ZGV2X3VldmVudCwKICNlbmRpZgogfTsKIAogdm9pZCBuZXRkZXZfdW5yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqIG5ldCkKIHsKLQljbGFzc19kZXZpY2VfZGVsKCYobmV0LT5jbGFzc19kZXYpKTsKKwlkZXZpY2VfZGVsKCYobmV0LT5kZXYpKTsKIH0KIAogLyogQ3JlYXRlIHN5c2ZzIGVudHJpZXMgZm9yIG5ldHdvcmsgZGV2aWNlLiAqLwogaW50IG5ldGRldl9yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewotCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiA9ICYobmV0LT5jbGFzc19kZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICYobmV0LT5kZXYpOwogCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMgPSBuZXQtPnN5c2ZzX2dyb3VwczsKIAotCWNsYXNzX2RldmljZV9pbml0aWFsaXplKGNsYXNzX2Rldik7Ci0JY2xhc3NfZGV2LT5jbGFzcyA9ICZuZXRfY2xhc3M7Ci0JY2xhc3NfZGV2LT5jbGFzc19kYXRhID0gbmV0OwotCWNsYXNzX2Rldi0+Z3JvdXBzID0gZ3JvdXBzOworCWRldmljZV9pbml0aWFsaXplKGRldik7CisJZGV2LT5jbGFzcyA9ICZuZXRfY2xhc3M7CisJZGV2LT5wbGF0Zm9ybV9kYXRhID0gbmV0OworCWRldi0+Z3JvdXBzID0gZ3JvdXBzOwogCiAJQlVJTERfQlVHX09OKEJVU19JRF9TSVpFIDwgSUZOQU1TSVopOwotCXN0cmxjcHkoY2xhc3NfZGV2LT5jbGFzc19pZCwgbmV0LT5uYW1lLCBCVVNfSURfU0laRSk7CisJc3RybGNweShkZXYtPmJ1c19pZCwgbmV0LT5uYW1lLCBCVVNfSURfU0laRSk7CiAKIAlpZiAobmV0LT5nZXRfc3RhdHMpCiAJCSpncm91cHMrKyA9ICZuZXRzdGF0X2dyb3VwOwpAQCAtNDY3LDcgKzQ3OCw3IEBACiAJCSpncm91cHMrKyA9ICZ3aXJlbGVzc19ncm91cDsKICNlbmRpZgogCi0JcmV0dXJuIGNsYXNzX2RldmljZV9hZGQoY2xhc3NfZGV2KTsKKwlyZXR1cm4gZGV2aWNlX2FkZChkZXYpOwogfQogCiBpbnQgbmV0ZGV2X3N5c2ZzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggZGU3ODAxZC4uZjM0MDRhZSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2tidWZmLmMKKysrIGIvbmV0L2NvcmUvc2tidWZmLmMKQEAgLTI2OCw3ICsyNjgsNyBAQAogc3RydWN0IHNrX2J1ZmYgKl9fbmV0ZGV2X2FsbG9jX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQl1bnNpZ25lZCBpbnQgbGVuZ3RoLCBnZnBfdCBnZnBfbWFzaykKIHsKLQlpbnQgbm9kZSA9IGRldi0+Y2xhc3NfZGV2LmRldiA/IGRldl90b19ub2RlKGRldi0+Y2xhc3NfZGV2LmRldikgOiAtMTsKKwlpbnQgbm9kZSA9IGRldi0+ZGV2LnBhcmVudCA/IGRldl90b19ub2RlKGRldi0+ZGV2LnBhcmVudCkgOiAtMTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAgCXNrYiA9IF9fYWxsb2Nfc2tiKGxlbmd0aCArIE5FVF9TS0JfUEFELCBnZnBfbWFzaywgMCwgbm9kZSk7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY193eC5jIGIvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfd3guYwppbmRleCBmYTJmN2RhLi5mYjU4ZTAzIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY193eC5jCisrKyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX3d4LmMKQEAgLTI2NSw2ICsyNjUsMTIgQEAKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtYWMtPmxvY2ssIGZsYWdzKTsKKworCWlmICh1bmxpa2VseSghbWFjLT5ydW5uaW5nKSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCiAJc3dpdGNoIChtYWMtPnR4cmF0ZXMuZGVmYXVsdF9yYXRlKSB7CiAJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COgogCQlkYXRhLT5iaXRyYXRlLnZhbHVlID0gMTAwMDAwMDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUgYi9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCmluZGV4IDk2OTI2ZWIuLmQ2NWM0MDMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKKysrIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQpAQCAtNTcsNyArNTcsNyBAQAogIyBTZWUgZG9jdW1lbnRhdGlvbiBpbiBEb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CiAKICMgY2hlY2tlci1zaGVsbAotIyBVc2FnZTogb3B0aW9uID0gJChjYWxsIGNoZWNrZXItc2hlbGwsICQoQ0MpLi4uLW8gJCRPVVQsIG9wdGlvbi1vaywgb3RoZXJ3aXNlKQorIyBVc2FnZTogb3B0aW9uID0gJChjYWxsIGNoZWNrZXItc2hlbGwsJChDQykuLi4tbyAkJE9VVCxvcHRpb24tb2ssb3RoZXJ3aXNlKQogIyBFeGl0IGNvZGUgY2hvb3NlcyBvcHRpb24uICQkT1VUIGlzIHNhZmUgbG9jYXRpb24gZm9yIG5lZWRsZXNzIG91dHB1dC4KIGRlZmluZSBjaGVja2VyLXNoZWxsCiAgICQoc2hlbGwgc2V0IC1lOyBcCkBAIC03NCwyMyArNzQsMjMgQEAKIGVuZGVmCiAKICMgYXMtb3B0aW9uCi0jIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgYXMtb3B0aW9uLCAtV2EkKGNvbW1hKS1pc2E9Zm9vLCkKLWFzLW9wdGlvbiA9ICQoY2FsbCBjaGVja2VyLXNoZWxsLCBcCi0gICAkKENDKSAkKENGTEFHUykgJCgxKSAtYyAteGFzc2VtYmxlciAvZGV2L251bGwgLW8gJCRPVVQsICQoMSksICQoMikpCisjIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgYXMtb3B0aW9uLC1XYSQoY29tbWEpLWlzYT1mb28sKQorYXMtb3B0aW9uID0gJChjYWxsIGNoZWNrZXItc2hlbGwsXAorICAgJChDQykgJChDRkxBR1MpICQoMSkgLWMgLXhhc3NlbWJsZXIgL2Rldi9udWxsIC1vICQkT1VULCQoMSksJCgyKSkKIAogIyBhcy1pbnN0cgotIyBVc2FnZTogY2ZsYWdzLXkgKz0gJChjYWxsIGFzLWluc3RyLCBpbnN0ciwgb3B0aW9uMSwgb3B0aW9uMikKLWFzLWluc3RyID0gJChjYWxsIGNoZWNrZXItc2hlbGwsIFwKLSAgIHByaW50ZiAiJCgxKSIgfCAkKENDKSAkKEFGTEFHUykgLWMgLXhhc3NlbWJsZXIgLW8gJCRPVVQgLSwgJCgyKSwgJCgzKSkKKyMgVXNhZ2U6IGNmbGFncy15ICs9ICQoY2FsbCBhcy1pbnN0cixpbnN0cixvcHRpb24xLG9wdGlvbjIpCithcy1pbnN0ciA9ICQoY2FsbCBjaGVja2VyLXNoZWxsLFwKKyAgIHByaW50ZiAiJCgxKSIgfCAkKENDKSAkKEFGTEFHUykgLWMgLXhhc3NlbWJsZXIgLW8gJCRPVVQgLSwkKDIpLCQoMykpCiAKICMgY2Mtb3B0aW9uCi0jIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtbWFyY2g9d2luY2hpcC1jNiwgLW1hcmNoPWk1ODYpCi1jYy1vcHRpb24gPSAkKGNhbGwgY2hlY2tlci1zaGVsbCwgXAotICAgJChDQykgJChDRkxBR1MpICQoaWYgJCgzKSwkKDMpLCQoMSkpIC1TIC14YyAvZGV2L251bGwgLW8gJCRPVVQsICQoMSksICQoMikpCisjIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tYXJjaD13aW5jaGlwLWM2LC1tYXJjaD1pNTg2KQorY2Mtb3B0aW9uID0gJChjYWxsIGNoZWNrZXItc2hlbGwsXAorICAgJChDQykgJChDRkxBR1MpICQoaWYgJCgzKSwkKDMpLCQoMSkpIC1TIC14YyAvZGV2L251bGwgLW8gJCRPVVQsJCgxKSwkKDIpKQogCiAjIGNjLW9wdGlvbi15bgotIyBVc2FnZTogZmxhZyA6PSAkKGNhbGwgY2Mtb3B0aW9uLXluLCAtbWFyY2g9d2luY2hpcC1jNikKLWNjLW9wdGlvbi15biA9ICQoY2FsbCBjYy1vcHRpb24sICJ5IiwgIm4iLCAkKDEpKQorIyBVc2FnZTogZmxhZyA6PSAkKGNhbGwgY2Mtb3B0aW9uLXluLC1tYXJjaD13aW5jaGlwLWM2KQorY2Mtb3B0aW9uLXluID0gJChjYWxsIGNjLW9wdGlvbiwieSIsIm4iLCQoMSkpCiAKICMgY2Mtb3B0aW9uLWFsaWduCiAjIFByZWZpeCBhbGlnbiB3aXRoIGVpdGhlciAtZmFsaWduIG9yIC1tYWxpZ24KQEAgLTk4LDcgKzk4LDcgQEAKICAgICQoY2FsbCBjYy1vcHRpb24sLWZhbGlnbi1mdW5jdGlvbnM9MCwtbWFsaWduLWZ1bmN0aW9ucz0wKSkKIAogIyBjYy12ZXJzaW9uCi0jIFVzYWdlIGdjYy12ZXIgOj0gJChjYWxsIGNjLXZlcnNpb24sICQoQ0MpKQorIyBVc2FnZSBnY2MtdmVyIDo9ICQoY2FsbCBjYy12ZXJzaW9uLCQoQ0MpKQogY2MtdmVyc2lvbiA9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9nY2MtdmVyc2lvbi5zaCAkKENDKSkKIAogIyBjYy1pZnZlcnNpb24KQEAgLTEwNyw4ICsxMDcsOCBAQAogCiAjIGxkLW9wdGlvbgogIyBVc2FnZTogbGRmbGFncyArPSAkKGNhbGwgbGQtb3B0aW9uLCAtV2wkKGNvbW1hKS0taGFzaC1zdHlsZT1ib3RoKQotbGQtb3B0aW9uID0gJChjYWxsIGNoZWNrZXItc2hlbGwsIFwKLSAgICQoQ0MpICQoMSkgLW5vc3RkbGliIC14YyAvZGV2L251bGwgLW8gJCRPVVQsICQoMSksICQoMikpCitsZC1vcHRpb24gPSAkKGNhbGwgY2hlY2tlci1zaGVsbCxcCisgICAkKENDKSAkKDEpIC1ub3N0ZGxpYiAteGMgL2Rldi9udWxsIC1vICQkT1VULCQoMSksJCgyKSkKIAogIyMjIyMjCiAKQEAgLTEyMCwyMiArMTIwLDIyIEBACiAjIFByZWZpeCAtSSB3aXRoICQoc3JjdHJlZSkgaWYgaXQgaXMgbm90IGFuIGFic29sdXRlIHBhdGgsCiAjIGFkZCBvcmlnaW5hbCB0byB0aGUgZW5kCiBhZGR0cmVlID0gJChpZiBcCi0JJChmaWx0ZXItb3V0IC1JLyUsICQoMSkpLCAkKHBhdHN1YnN0IC1JJSwtSSQoc3JjdHJlZSkvJSwkKDEpKSkgJCgxKQorCSQoZmlsdGVyLW91dCAtSS8lLCQoMSkpLCQocGF0c3Vic3QgLUklLC1JJChzcmN0cmVlKS8lLCQoMSkpKSAkKDEpCiAKICMgRmluZCBhbGwgLUkgb3B0aW9ucyBhbmQgY2FsbCBhZGR0cmVlCi1mbGFncyA9ICQoZm9yZWFjaCBvLCQoJCgxKSksIFwKLQkkKGlmICQoZmlsdGVyIC1JJSwkKG8pKSwgJChjYWxsIGFkZHRyZWUsICQobykpLCAkKG8pKSkKK2ZsYWdzID0gJChmb3JlYWNoIG8sJCgkKDEpKSxcCisJJChpZiAkKGZpbHRlciAtSSUsJChvKSksJChjYWxsIGFkZHRyZWUsJChvKSksJChvKSkpCiAKICMgZWNobyBjb21tYW5kLgogIyBTaG9ydCB2ZXJzaW9uIGlzIHVzZWQsIGlmICQocXVpZXQpIGVxdWFscyBgcXVpZXRfJywgb3RoZXJ3aXNlIGZ1bGwgb25lLgotZWNoby1jbWQgPSAkKGlmICQoJChxdWlldCljbWRfJCgxKSksIFwKK2VjaG8tY21kID0gJChpZiAkKCQocXVpZXQpY21kXyQoMSkpLFwKIAllY2hvICcgICQoY2FsbCBlc2NzcSwkKCQocXVpZXQpY21kXyQoMSkpKSQoZWNoby13aHkpJzspCiAKICMgcHJpbnRpbmcgY29tbWFuZHMKIGNtZCA9IEAkKGVjaG8tY21kKSAkKGNtZF8kKDEpKQogCiAjIEFkZCAkKG9iaikvIGZvciBwYXRocyB0aGF0IGFyZSBub3QgYWJzb2x1dGUKLW9iamVjdGlmeSA9ICQoZm9yZWFjaCBvLCQoMSksICQoaWYgJChmaWx0ZXIgLyUsJChvKSksICQobyksICQob2JqKS8kKG8pKSkKK29iamVjdGlmeSA9ICQoZm9yZWFjaCBvLCQoMSksJChpZiAkKGZpbHRlciAvJSwkKG8pKSwkKG8pLCQob2JqKS8kKG8pKSkKIAogIyMjCiAjIGlmX2NoYW5nZWQgICAgICAtIGV4ZWN1dGUgY29tbWFuZCBpZiBhbnkgcHJlcmVxdWlzaXRlIGlzIG5ld2VyIHRoYW4K